From 0fa358ec5783042a452088096acd796b182bf2a8 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Sat, 9 Aug 2025 01:43:41 +0000 Subject: [PATCH 001/312] Fix CNCF logo visibility for light/dark modes Signed-off-by: Ayush More --- microsite/static/css/custom.css | 24 ++++++++++++++++++++++++ microsite/static/img/cncf-black.svg | 1 + 2 files changed, 25 insertions(+) create mode 100644 microsite/static/img/cncf-black.svg diff --git a/microsite/static/css/custom.css b/microsite/static/css/custom.css index a2a63e2473..8aa87cb06d 100644 --- a/microsite/static/css/custom.css +++ b/microsite/static/css/custom.css @@ -1350,3 +1350,27 @@ h3.collapsible span.arrow { text-align: center; } /* End of Utility API Styling */ + +.cncf-logo.light-mode { + display: block !important; +} + +.cncf-logo.dark-mode { + display: none !important; +} + +/* When system/browser is in dark mode */ +@media (prefers-color-scheme: dark) { + .cncf-logo.light-mode { + display: none !important; + } + .cncf-logo.dark-mode { + display: block !important; + } +} + + + + + + diff --git a/microsite/static/img/cncf-black.svg b/microsite/static/img/cncf-black.svg new file mode 100644 index 0000000000..08abd314cc --- /dev/null +++ b/microsite/static/img/cncf-black.svg @@ -0,0 +1 @@ + \ No newline at end of file From 5d7d3ea1529522eff3db6be39a30418468e62162 Mon Sep 17 00:00:00 2001 From: Antonio Ereiz Date: Mon, 15 Sep 2025 22:35:29 +0200 Subject: [PATCH 002/312] add wrapLongLines option to CodeSnippet Signed-off-by: Antonio Ereiz --- .../src/components/CodeSnippet/CodeSnippet.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/core-components/src/components/CodeSnippet/CodeSnippet.tsx b/packages/core-components/src/components/CodeSnippet/CodeSnippet.tsx index 8c31bc4e6d..e79dc07ad3 100644 --- a/packages/core-components/src/components/CodeSnippet/CodeSnippet.tsx +++ b/packages/core-components/src/components/CodeSnippet/CodeSnippet.tsx @@ -57,6 +57,14 @@ export interface CodeSnippetProps { * Array of line numbers to highlight */ highlightedNumbers?: number[]; + /** + * Whether to style the `` block with `white-space: pre-wrap` or `white-space: pre` + * + * @remarks + * + * Default: false (`white-space: pre`) + */ + wrapLongLines?: boolean; /** * Custom styles applied to code * @@ -79,6 +87,7 @@ export function CodeSnippet(props: CodeSnippetProps) { language, showLineNumbers = false, highlightedNumbers, + wrapLongLines, customStyle, showCopyCodeButton = false, } = props; @@ -94,6 +103,7 @@ export function CodeSnippet(props: CodeSnippetProps) { style={mode} showLineNumbers={showLineNumbers} wrapLines + wrapLongLines={wrapLongLines} lineNumberStyle={{ color: theme.palette.textVerySubtle }} lineProps={(lineNumber: number) => highlightedNumbers?.includes(lineNumber) From 703f8c08bd97ca588b69b3d00183c0c06e426739 Mon Sep 17 00:00:00 2001 From: Rudra Sharans Date: Wed, 8 Oct 2025 00:01:00 +0530 Subject: [PATCH 003/312] Modifying large size files upload to S3 Signed-off-by: Rudra Sharans --- .changeset/lemon-corners-hug.md | 5 + .../src/stages/publish/awsS3.test.ts | 69 ++-- .../techdocs-node/src/stages/publish/awsS3.ts | 323 ++++++++++++++++-- 3 files changed, 329 insertions(+), 68 deletions(-) create mode 100644 .changeset/lemon-corners-hug.md diff --git a/.changeset/lemon-corners-hug.md b/.changeset/lemon-corners-hug.md new file mode 100644 index 0000000000..b41c09c928 --- /dev/null +++ b/.changeset/lemon-corners-hug.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-node': patch +--- + +There was an issue in the uploading of large size files to the AWS S3. We have modified the logic by adding retry along with multipart uploading functionality. diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index 6fb855d199..c2af7febb5 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -31,7 +31,7 @@ import { AwsCredentialProviderOptions, DefaultAwsCredentialsManager, } from '@backstage/integration-aws-node'; -import { mockClient, AwsClientStub } from 'aws-sdk-client-mock'; +import { mockClient } from 'aws-sdk-client-mock'; import express from 'express'; import request from 'supertest'; import path from 'path'; @@ -44,9 +44,10 @@ import { } from '@backstage/backend-test-utils'; const env = process.env; -let s3Mock: AwsClientStub; +let s3Mock: any; -const mockDir = createMockDirectory(); +// Create a new MockDirectory for each test to avoid Windows file locking issues +let mockDir: ReturnType; function getMockCredentialProvider(): Promise { return Promise.resolve({ @@ -155,7 +156,7 @@ describe('AwsS3Publish', () => { build_timestamp: 612741599, }; - const directory = getEntityRootDir(entity); + let directory: string; const files = { 'index.html': '', @@ -176,7 +177,7 @@ describe('AwsS3Publish', () => { }, }; - beforeEach(() => { + beforeEach(async () => { process.env = { ...env }; process.env.AWS_REGION = 'us-west-2'; @@ -185,20 +186,26 @@ describe('AwsS3Publish', () => { getMockCredentialProvider(), ); + // Create a fresh mockdirectory for each test to avoid windows file locking + mockDir = createMockDirectory(); + // Calculate directory path with the new mockDir instance + directory = getEntityRootDir(entity); + + // Set up the test files mockDir.setContent({ [directory]: files, }); - s3Mock = mockClient(S3Client); + s3Mock = mockClient(S3Client as any); - s3Mock.on(HeadObjectCommand).callsFake(input => { + s3Mock.on(HeadObjectCommand).callsFake((input: any) => { if (!fs.pathExistsSync(mockDir.resolve(input.Key))) { throw new Error('File does not exist'); } return {}; }); - s3Mock.on(GetObjectCommand).callsFake(input => { + s3Mock.on(GetObjectCommand).callsFake((input: any) => { if (fs.pathExistsSync(mockDir.resolve(input.Key))) { return { Body: Readable.from(fs.readFileSync(mockDir.resolve(input.Key))), @@ -208,14 +215,14 @@ describe('AwsS3Publish', () => { throw new Error(`The file ${input.Key} does not exist!`); }); - s3Mock.on(HeadBucketCommand).callsFake(input => { + s3Mock.on(HeadBucketCommand).callsFake((input: any) => { if (input.Bucket === 'errorBucket') { throw new Error('Bucket does not exist'); } return {}; }); - s3Mock.on(ListObjectsV2Command).callsFake(input => { + s3Mock.on(ListObjectsV2Command).callsFake((input: any) => { if ( input.Bucket === 'delete_stale_files_success' || input.Bucket === 'delete_stale_files_error' @@ -227,7 +234,7 @@ describe('AwsS3Publish', () => { return {}; }); - s3Mock.on(DeleteObjectCommand).callsFake(input => { + s3Mock.on(DeleteObjectCommand).callsFake((input: any) => { if (input.Bucket === 'delete_stale_files_error') { throw new Error('Message'); } @@ -235,7 +242,7 @@ describe('AwsS3Publish', () => { }); s3Mock.on(UploadPartCommand).rejects(); - s3Mock.on(PutObjectCommand).callsFake(input => { + s3Mock.on(PutObjectCommand).callsFake((input: any) => { mockDir.addContent({ [input.Key]: input.Body }); }); }); @@ -320,7 +327,7 @@ describe('AwsS3Publish', () => { `default/component/backstage/assets/main.css`, ]), }); - }); + }, 30000); it('should publish a directory as well when legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -333,7 +340,7 @@ describe('AwsS3Publish', () => { `default/Component/backstage/assets/main.css`, ]), }); - }); + }, 30000); it('should publish a directory when root path is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -346,7 +353,7 @@ describe('AwsS3Publish', () => { `backstage-data/techdocs/default/component/backstage/assets/main.css`, ]), }); - }); + }, 30000); it('should publish a directory when root path is specified and legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -360,7 +367,7 @@ describe('AwsS3Publish', () => { `backstage-data/techdocs/default/Component/backstage/assets/main.css`, ]), }); - }); + }, 30000); it('should publish a directory when sse is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -373,7 +380,7 @@ describe('AwsS3Publish', () => { 'default/component/backstage/assets/main.css', ]), }); - }); + }, 30000); it('should fail to publish a directory', async () => { const wrongPathToGeneratedDirectory = mockDir.resolve( @@ -408,7 +415,7 @@ describe('AwsS3Publish', () => { expect(loggerInfoSpy).toHaveBeenLastCalledWith( `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: 1`, ); - }); + }, 30000); it('should log error when the stale files deletion fails', async () => { const bucketName = 'delete_stale_files_error'; @@ -419,7 +426,7 @@ describe('AwsS3Publish', () => { expect(loggerErrorSpy).toHaveBeenLastCalledWith( 'Unable to delete file(s) from AWS S3. Error: Message', ); - }); + }, 30000); }); describe('hasDocsBeenGenerated', () => { @@ -427,7 +434,7 @@ describe('AwsS3Publish', () => { const publisher = await createPublisherFromConfig(); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }); + }, 30000); it('should return true if docs has been generated even if the legacy case is enabled', async () => { const publisher = await createPublisherFromConfig({ @@ -435,7 +442,7 @@ describe('AwsS3Publish', () => { }); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }); + }, 30000); it('should return true if docs has been generated if root path is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -443,7 +450,7 @@ describe('AwsS3Publish', () => { }); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }); + }, 30000); it('should return true if docs has been generated if root path is specified and legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -452,7 +459,7 @@ describe('AwsS3Publish', () => { }); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }); + }, 30000); it('should return false if docs has not been generated', async () => { const publisher = await createPublisherFromConfig(); @@ -475,7 +482,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }); + }, 30000); it('should return tech docs metadata even if the legacy case is enabled', async () => { const publisher = await createPublisherFromConfig({ @@ -485,7 +492,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }); + }, 30000); it('should return tech docs metadata even if root path is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -495,7 +502,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }); + }, 30000); it('should return tech docs metadata if root path is specified and legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -506,7 +513,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }); + }, 30000); it('should return tech docs metadata when json encoded with single quotes', async () => { const techdocsMetadataPath = path.join( @@ -528,7 +535,7 @@ describe('AwsS3Publish', () => { ); fs.writeFileSync(techdocsMetadataPath, techdocsMetadataContent); - }); + }, 30000); it('should return an error if the techdocs_metadata.json file is not present', async () => { const publisher = await createPublisherFromConfig(); @@ -549,7 +556,7 @@ describe('AwsS3Publish', () => { }); it('should return an error if the techdocs_metadata.json file cannot be read from stream', async () => { - s3Mock.on(GetObjectCommand).callsFake(_ => { + s3Mock.on(GetObjectCommand).callsFake((_: any) => { return { Body: new ErrorReadable('No stream!'), }; @@ -582,7 +589,7 @@ describe('AwsS3Publish', () => { const publisher = await createPublisherFromConfig(); await publisher.publish({ entity, directory }); app = express().use(publisher.docsRouter()); - }); + }, 30000); it('should pass expected object path to bucket', async () => { // Ensures leading slash is trimmed and encoded path is decoded. @@ -688,7 +695,7 @@ describe('AwsS3Publish', () => { }); it('should return 404 if file cannot be read from stream', async () => { - s3Mock.on(GetObjectCommand).callsFake(_ => { + s3Mock.on(GetObjectCommand).callsFake((_: any) => { return { Body: new ErrorReadable('No stream!'), }; diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts index bd8b96ee14..9f6ce7cab5 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts @@ -26,10 +26,12 @@ import { DeleteObjectCommand, HeadBucketCommand, HeadObjectCommand, + PutObjectCommand, PutObjectCommandInput, ListObjectsV2CommandOutput, ListObjectsV2Command, S3Client, + S3ServiceException, } from '@aws-sdk/client-s3'; import { fromTemporaryCredentials } from '@aws-sdk/credential-providers'; import { NodeHttpHandler } from '@smithy/node-http-handler'; @@ -84,6 +86,7 @@ export class AwsS3Publish implements PublisherBase { private readonly logger: LoggerService; private readonly bucketRootPath: string; private readonly sse?: 'aws:kms' | 'AES256'; + private readonly maxAttempts: number; constructor(options: { storageClient: S3Client; @@ -92,6 +95,7 @@ export class AwsS3Publish implements PublisherBase { logger: LoggerService; bucketRootPath: string; sse?: 'aws:kms' | 'AES256'; + maxAttempts: number; }) { this.storageClient = options.storageClient; this.bucketName = options.bucketName; @@ -99,6 +103,7 @@ export class AwsS3Publish implements PublisherBase { this.logger = options.logger; this.bucketRootPath = options.bucketRootPath; this.sse = options.sse; + this.maxAttempts = options.maxAttempts; } static async fromConfig( @@ -175,10 +180,22 @@ export class AwsS3Publish implements PublisherBase { ...(region && { region }), ...(endpoint && { endpoint }), ...(forcePathStyle && { forcePathStyle }), - ...(maxAttempts && { maxAttempts }), + // Enhanced retry configuration for better reliability + maxAttempts: maxAttempts || 5, + retryMode: 'adaptive', ...(httpsProxy && { requestHandler: new NodeHttpHandler({ httpsAgent: new HttpsProxyAgent({ proxy: httpsProxy }), + // Enhanced connection setting for large file uploads + connectionTimeout: 60000, + socketTimeout: 120000, + }), + }), + // Add default request handler with enhanced timeouts if no proxy + ...(!httpsProxy && { + requestHandler: new NodeHttpHandler({ + connectionTimeout: 60000, + socketTimeout: 120000, }), }), }); @@ -195,6 +212,7 @@ export class AwsS3Publish implements PublisherBase { legacyPathCasing, logger, sse, + maxAttempts: maxAttempts || 5, }); } @@ -250,6 +268,126 @@ export class AwsS3Publish implements PublisherBase { return explicitCredentials; } + /** + * Custom retry wrapper for S3 operations with detailed error handling. + */ + private async retryOperation( + operation: () => Promise, + operationName: string, + maxAttempts: number = 3, + ): Promise { + let attempts = maxAttempts; + let LastError: S3ServiceException; + + while (attempts > 0) { + try { + return await operation(); + } catch (error: unknown) { + LastError = error as S3ServiceException; + attempts--; + + const httpStatusCode = LastError.$metadata?.httpStatusCode; + const errorCode = LastError.name; + + this.logger.warn(`${operationName} failed.`, { + errorCode, + httpStatusCode, + attemptsRemaining: attempts, + currentAttempt: maxAttempts - attempts, + totalAttempts: maxAttempts, + error: LastError.message, + }); + // Determine if we should retry based on error type + const shouldRetry = this.shouldRetryOperation(LastError, attempts); + if (!shouldRetry || attempts === 0) { + this.logger.error( + `${operationName} failed after all retries: ${LastError.message}`, + ); + throw LastError; + } + // Enhanced exponential backoff with jitter for upload operation + let baseDelay = 1000; + if (operationName.startsWith('Upload-')) { + // for uploads use longer base delay due to potential multipart commplexity + baseDelay = 2000; + } + const backoffDelay = Math.min( + baseDelay * Math.pow(2, maxAttempts - attempts), + 30000, + ); + const jitter = Math.random() * 1000; + const totalDelay = backoffDelay + jitter; + await new Promise(resolve => setTimeout(resolve, totalDelay)); + } + } + // Final attempt without retry wrapper + return operation(); + } + + /** + * Determines if an S3 operation should be retried based on the error details. + */ + private shouldRetryOperation( + error: S3ServiceException, + attemptsRemaining: number, + ): boolean { + const httpStatusCode = error.$metadata?.httpStatusCode; + const errorCode = error.name; + // Handle invalid part errors first - these are retriable for multipart uploads + if (errorCode === 'InvalidPart') { + return attemptsRemaining > 0; + } + // Dont retry for client errors (4xx) except specific cases + if (httpStatusCode && httpStatusCode >= 400 && httpStatusCode < 500) { + // Retry specfic 4xx errors that might be transient + const retriable4xxErrors = [ + 'RequestTimeOut', + 'RequestTimeoutException', + 'PriorRequestNotComplete', + 'ConnectionError', + 'RequestTimeToooSkewed', + 'InvalidPart', + 'NoSuchUpload', + ]; + if (!retriable4xxErrors.includes(errorCode)) { + return false; + } + } + // Always retry for server errors (5xx) + if (httpStatusCode && httpStatusCode >= 500) { + return attemptsRemaining > 0; + } + // Retry specific network/connection errors and multipart upload errors + const retriableErrors = [ + 'NetworkingError', + 'TimeoutError', + 'ConnectionError', + 'ECONNRESET', + 'ENOTFOUND', + 'ECONNREFUSED', + 'ETIMEDOUT', + 'ServiceUnavailable', + 'SlowDown', + 'Throttling', + 'ThrottlingException', + 'ProvisionedThroughputExceededException', + // Multipart upload specific errors - now handled above but kept for completeness + 'InvalidPart', + 'NoSuchUpload', + 'UploadTimeout', + 'EntityTooLarge', + 'InternalError', + 'IncompleteBody', + 'RequestTimeout', + ]; + return ( + retriableErrors.some( + retriableError => + errorCode.includes(retriableError) || + error.message.includes(retriableError), + ) && attemptsRemaining > 0 + ); + } /** * Check if the defined bucket exists. Being able to connect means the configuration is good @@ -273,13 +411,15 @@ export class AwsS3Publish implements PublisherBase { 'explicitly defining credentials and region in techdocs.publisher.awsS3 in app config or ' + 'by using environment variables. Refer to https://backstage.io/docs/features/techdocs/using-cloud-storage', ); - this.logger.error(`from AWS client library`, error); + this.logger.error( + `from AWS client library`, + error instanceof Error ? error : new Error(String(error)), + ); return { isAvailable: false, }; } } - /** * Upload all the files from the generated `directory` to the S3 bucket. * Directory structure used in the bucket is - entityNamespace/entityKind/entityName/index.html @@ -293,6 +433,9 @@ export class AwsS3Publish implements PublisherBase { const bucketRootPath = this.bucketRootPath; const sse = this.sse; + // Track timing for performance monitoring + const publishStartTime = Date.now(); + // First, try to retrieve a list of all individual files currently existing let existingFiles: string[] = []; try { @@ -302,9 +445,20 @@ export class AwsS3Publish implements PublisherBase { useLegacyPathCasing, bucketRootPath, ); - existingFiles = await this.getAllObjectsFromBucket({ - prefix: remoteFolder, - }); + const response = await this.retryOperation( + async () => { + const listCommand = new ListObjectsV2Command({ + Bucket: this.bucketName, + Prefix: remoteFolder, + }); + return this.storageClient.send(listCommand); + }, + 'ListObjects', + this.maxAttempts, + ); + existingFiles = (response.Contents || []) + .map(f => f.Key || '') + .filter(f => !!f); } catch (e) { assertError(e); this.logger.error( @@ -320,30 +474,103 @@ export class AwsS3Publish implements PublisherBase { // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] absoluteFilesToUpload = await getFileTreeRecursively(directory); + let uploadCounter = 0; + await bulkStorageOperation( async absoluteFilePath => { + uploadCounter++; const relativeFilePath = path.relative(directory, absoluteFilePath); - const fileStream = fs.createReadStream(absoluteFilePath); - + const s3Key = getCloudPathForLocalPath( + entity, + relativeFilePath, + useLegacyPathCasing, + bucketRootPath, + ); const params: PutObjectCommandInput = { Bucket: this.bucketName, - Key: getCloudPathForLocalPath( - entity, - relativeFilePath, - useLegacyPathCasing, - bucketRootPath, - ), - Body: fileStream, + Key: s3Key, + Body: absoluteFilePath, ...(sse && { ServerSideEncryption: sse }), }; objects.push(params.Key!); + // Get file stats before upload + const stats = await fs.stat(absoluteFilePath); + const fileSizeInBytes = stats.size; - const upload = new Upload({ - client: this.storageClient, - params, - }); - return upload.done(); + // Use retry wrapper for uploads with enhanced error handling + try { + const result = await this.retryOperation( + async () => { + const fiveMB = 5 * 1024 * 1024; + // For files smaller than 5MB, use simple PutObject to avoid multipart complexity + if (fileSizeInBytes < fiveMB) { + const fileContent = await fs.readFile(absoluteFilePath); + const putParams = { ...params, Body: fileContent }; + return this.storageClient.send( + new PutObjectCommand(putParams), + ); + } + // For files 5MB and larger, use multipart upload with enhanced configuration + const calaculatedPartSize = Math.max( + fiveMB, + Math.ceil(fileSizeInBytes / 10000), + ); + const upload = new Upload({ + client: this.storageClient, + params, + // Configure miltipart upload option for better reliability + partSize: calaculatedPartSize, + queueSize: 3, + leavePartsOnError: false, + }); + return upload.done(); + }, + `Upload-${params.Key}`, + this.maxAttempts, + ); + return result; + } catch (error) { + const s3Error = error as any; + const errorName = s3Error?.name || 'Unknown'; + + // Check if this is a multipart upload failure that we can handle + if ( + fileSizeInBytes >= 5 * 1024 * 1024 && + (errorName === 'InvalidPart' || errorName === 'NoSuchUpload') + ) { + this.logger.warn( + `Multipart upload failed for ${params.Key}, Attempting simple upload fallback.`, + ); + try { + // Attempt simple upload as a fallback + const fileContent = await fs.readFile(absoluteFilePath); + const simpleParams = { ...params, Body: fileContent }; + const fallbackResult = await this.storageClient.send( + new PutObjectCommand(simpleParams), + ); + this.logger.info( + `Simple upload fallback succeeded for ${params.Key}`, + ); + return fallbackResult; + } catch (fallbackError) { + this.logger.error( + `Both multipart and simple upload failed for ${params.Key}: ${ + fallbackError instanceof Error + ? fallbackError.message + : String(fallbackError) + }`, + ); + // Fall through to throw original error + } + } + this.logger.error( + `Upload failed for ${params.Key}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + throw error; + } }, absoluteFilesToUpload, { concurrencyLimit: 10 }, @@ -373,17 +600,21 @@ export class AwsS3Publish implements PublisherBase { await bulkStorageOperation( async relativeFilePath => { - return await this.storageClient.send( - new DeleteObjectCommand({ - Bucket: this.bucketName, - Key: relativeFilePath, - }), + return this.retryOperation( + async () => { + const deleteCommand = new DeleteObjectCommand({ + Bucket: this.bucketName, + Key: relativeFilePath, + }); + return this.storageClient.send(deleteCommand); + }, + 'DeleteObject', + this.maxAttempts, ); }, staleFiles, { concurrencyLimit: 10 }, ); - this.logger.info( `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: ${staleFiles.length}`, ); @@ -391,6 +622,13 @@ export class AwsS3Publish implements PublisherBase { const errorMessage = `Unable to delete file(s) from AWS S3. ${error}`; this.logger.error(errorMessage); } + const publishEndTime = Date.now(); + const publishDurationMs = publishEndTime - publishStartTime; + this.logger.info( + `Successfully published ${objects.length} files for ${ + entity.metadata.name + } in ${Math.round(publishDurationMs / 1000)}s`, + ); return { objects }; } @@ -413,11 +651,16 @@ export class AwsS3Publish implements PublisherBase { } try { - const resp = await this.storageClient.send( - new GetObjectCommand({ - Bucket: this.bucketName, - Key: `${entityRootDir}/techdocs_metadata.json`, - }), + const resp = await this.retryOperation( + async () => { + const getCommand = new GetObjectCommand({ + Bucket: this.bucketName, + Key: `${entityRootDir}/techdocs_metadata.json`, + }); + return this.storageClient.send(getCommand); + }, + 'GetTechDocsMetadata', + this.maxAttempts, ); const techdocsMetadataJson = await streamToBuffer( @@ -598,12 +841,18 @@ export class AwsS3Publish implements PublisherBase { let allObjects: ListObjectsV2CommandOutput; // Iterate through every file in the root of the publisher. do { - allObjects = await this.storageClient.send( - new ListObjectsV2Command({ - Bucket: this.bucketName, - ContinuationToken: nextContinuation, - ...(prefix ? { Prefix: prefix } : {}), - }), + const currentToken = nextContinuation; + allObjects = await this.retryOperation( + async () => { + const listCommand = new ListObjectsV2Command({ + Bucket: this.bucketName, + ContinuationToken: currentToken, + ...(prefix ? { Prefix: prefix } : {}), + }); + return this.storageClient.send(listCommand); + }, + 'GetAllObjects', + this.maxAttempts, ); objects.push( ...(allObjects.Contents || []).map(f => f.Key || '').filter(f => !!f), From c13704bf528e8ab11c943d74d4dc02da4e28770d Mon Sep 17 00:00:00 2001 From: Rudra Sharans Date: Wed, 8 Oct 2025 00:17:09 +0530 Subject: [PATCH 004/312] Fixing test cases Signed-off-by: Rudra Sharans --- plugins/techdocs-node/src/stages/publish/awsS3.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index c2af7febb5..f30cf50dfc 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -412,7 +412,7 @@ describe('AwsS3Publish', () => { bucketName: bucketName, }); await publisher.publish({ entity, directory }); - expect(loggerInfoSpy).toHaveBeenLastCalledWith( + expect(loggerInfoSpy).toHaveBeenCalledWith( `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: 1`, ); }, 30000); From 9110d7b7e465b5c9569b1bc66cc23f34d3414f06 Mon Sep 17 00:00:00 2001 From: Antonio Ereiz Date: Wed, 1 Oct 2025 20:42:46 +0200 Subject: [PATCH 005/312] update api report Signed-off-by: Antonio Ereiz --- packages/core-components/report.api.md | 1 + plugins/catalog-react/report-alpha.api.md | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/core-components/report.api.md b/packages/core-components/report.api.md index b89b61ac77..bd8363b423 100644 --- a/packages/core-components/report.api.md +++ b/packages/core-components/report.api.md @@ -188,6 +188,7 @@ export interface CodeSnippetProps { showCopyCodeButton?: boolean; showLineNumbers?: boolean; text: string; + wrapLongLines?: boolean; } // Warning: (ae-forgotten-export) The symbol "Props_12" needs to be exported by the entry point index.d.ts diff --git a/plugins/catalog-react/report-alpha.api.md b/plugins/catalog-react/report-alpha.api.md index 30cdd91704..cf28d80c11 100644 --- a/plugins/catalog-react/report-alpha.api.md +++ b/plugins/catalog-react/report-alpha.api.md @@ -92,12 +92,12 @@ export const catalogReactTranslationRef: TranslationRef< readonly 'entityTableColumnTitle.title': 'Title'; readonly 'entityTableColumnTitle.description': 'Description'; readonly 'entityTableColumnTitle.domain': 'Domain'; + readonly 'entityTableColumnTitle.system': 'System'; + readonly 'entityTableColumnTitle.tags': 'Tags'; readonly 'entityTableColumnTitle.namespace': 'Namespace'; readonly 'entityTableColumnTitle.lifecycle': 'Lifecycle'; readonly 'entityTableColumnTitle.owner': 'Owner'; - readonly 'entityTableColumnTitle.system': 'System'; readonly 'entityTableColumnTitle.targets': 'Targets'; - readonly 'entityTableColumnTitle.tags': 'Tags'; } >; @@ -533,8 +533,8 @@ export const EntityTableColumnTitle: ({ translationKey, }: EntityTableColumnTitleProps) => | 'Title' - | 'Domain' | 'System' + | 'Domain' | 'Lifecycle' | 'Namespace' | 'Owner' From f6b49ce93e2009074eb51ebcd801682f1f544ea7 Mon Sep 17 00:00:00 2001 From: Antonio Ereiz Date: Fri, 10 Oct 2025 21:50:46 +0200 Subject: [PATCH 006/312] add changeset Signed-off-by: Antonio Ereiz --- .changeset/spicy-sides-grow.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/spicy-sides-grow.md diff --git a/.changeset/spicy-sides-grow.md b/.changeset/spicy-sides-grow.md new file mode 100644 index 0000000000..3f44f35866 --- /dev/null +++ b/.changeset/spicy-sides-grow.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +added support for wrapLongLines option in CodeSnippet From 4fbde9e3f11c86a940556a72fd4bb0f98a91cbc1 Mon Sep 17 00:00:00 2001 From: Rudra Sharans Date: Wed, 22 Oct 2025 22:55:28 +0530 Subject: [PATCH 007/312] PR comments Signed-off-by: Rudra Sharans --- .../src/stages/publish/awsS3.test.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index f30cf50dfc..3dc594220b 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -196,16 +196,16 @@ describe('AwsS3Publish', () => { [directory]: files, }); - s3Mock = mockClient(S3Client as any); + s3Mock = mockClient(S3Client); - s3Mock.on(HeadObjectCommand).callsFake((input: any) => { + s3Mock.on(HeadObjectCommand).callsFake((input: { Key: string }) => { if (!fs.pathExistsSync(mockDir.resolve(input.Key))) { throw new Error('File does not exist'); } return {}; }); - s3Mock.on(GetObjectCommand).callsFake((input: any) => { + s3Mock.on(GetObjectCommand).callsFake((input: { Key: string }) => { if (fs.pathExistsSync(mockDir.resolve(input.Key))) { return { Body: Readable.from(fs.readFileSync(mockDir.resolve(input.Key))), @@ -215,14 +215,14 @@ describe('AwsS3Publish', () => { throw new Error(`The file ${input.Key} does not exist!`); }); - s3Mock.on(HeadBucketCommand).callsFake((input: any) => { + s3Mock.on(HeadBucketCommand).callsFake((input: { Bucket: string }) => { if (input.Bucket === 'errorBucket') { throw new Error('Bucket does not exist'); } return {}; }); - s3Mock.on(ListObjectsV2Command).callsFake((input: any) => { + s3Mock.on(ListObjectsV2Command).callsFake((input: { Bucket: string }) => { if ( input.Bucket === 'delete_stale_files_success' || input.Bucket === 'delete_stale_files_error' @@ -234,7 +234,7 @@ describe('AwsS3Publish', () => { return {}; }); - s3Mock.on(DeleteObjectCommand).callsFake((input: any) => { + s3Mock.on(DeleteObjectCommand).callsFake((input: { Bucket: string }) => { if (input.Bucket === 'delete_stale_files_error') { throw new Error('Message'); } @@ -242,9 +242,11 @@ describe('AwsS3Publish', () => { }); s3Mock.on(UploadPartCommand).rejects(); - s3Mock.on(PutObjectCommand).callsFake((input: any) => { - mockDir.addContent({ [input.Key]: input.Body }); - }); + s3Mock + .on(PutObjectCommand) + .callsFake((input: { Key: string; Body: any }) => { + mockDir.addContent({ [input.Key]: input.Body }); + }); }); afterEach(() => { From c49c5a3201ce1035d888dae96244d23af0d6baae Mon Sep 17 00:00:00 2001 From: Tobias Zipfel Date: Sat, 1 Nov 2025 18:34:50 +0100 Subject: [PATCH 008/312] Revise VS Code Jest setup and update paths Updated VS Code Jest configuration instructions and corrected the path for the backstage-cli program. Signed-off-by: Tobias Zipfel --- docs/tooling/cli/02-build-system.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/tooling/cli/02-build-system.md b/docs/tooling/cli/02-build-system.md index c8d9034955..e85a36e1be 100644 --- a/docs/tooling/cli/02-build-system.md +++ b/docs/tooling/cli/02-build-system.md @@ -621,20 +621,21 @@ With that in mind, here are some IDEs configurations to run backstage components #### VS Code +1. Install the [Jest extension](https://marketplace.visualstudio.com/items?itemName=Orta.vscode-jest) for VS Code. +2. Update `settings.json` in the `.vscode` folder with: + ```jsonc { "jest.jestCommandLine": "yarn test", // In a large repo like the Backstage main repo you likely want to disable // watch mode and the initial test run too, leaving just manual and perhaps // on-save test runs in place. - "jest.autoRun": { - "watch": false, - "onSave": "test-src-file" - } + "jest.runMode": "on-save" } ``` -A complete launch configuration for VS Code debugging may look like this: +3. Add a launch configuration for VS Code in `launch.json` in the `.vscode` folder. + A complete configuration for debugging may look like this: ```jsonc { @@ -653,11 +654,13 @@ A complete launch configuration for VS Code debugging may look like this: ], "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/node_modules/.bin/backstage-cli" + "program": "${workspaceFolder}/node_modules/@backstage/cli/bin/backstage-cli" } ``` +4. The configuration is not for manual runs from the "Run and Debug" view. + Instead use the Jest test explorer or the [test's gutter menu](https://github.com/jest-community/vscode-jest#how-to-trigger-a-test-run). + ## Publishing Package publishing is an optional part of the Backstage build system and not From 19931632e6817b03368e829cec7aaf6304525121 Mon Sep 17 00:00:00 2001 From: Jonas Beck Date: Mon, 3 Nov 2025 18:05:00 +0100 Subject: [PATCH 009/312] docs(events): add documentation for kafka events module Signed-off-by: Jonas Beck --- docs/integrations/bitbucketCloud/discovery.md | 4 ++ .../integrations/bitbucketServer/discovery.md | 2 + docs/integrations/github/discovery.md | 50 ++++++++++++++++++- docs/integrations/github/org.md | 2 + docs/integrations/gitlab/discovery.md | 4 ++ docs/integrations/gitlab/org.md | 4 ++ 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/docs/integrations/bitbucketCloud/discovery.md b/docs/integrations/bitbucketCloud/discovery.md index e0fab954ac..3f5920be5d 100644 --- a/docs/integrations/bitbucketCloud/discovery.md +++ b/docs/integrations/bitbucketCloud/discovery.md @@ -54,6 +54,8 @@ You need to decide how you want to receive events from external sources like - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) Further documentation: @@ -72,6 +74,8 @@ Additionally, you need to decide how you want to receive events from external so - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) Set up your provider diff --git a/docs/integrations/bitbucketServer/discovery.md b/docs/integrations/bitbucketServer/discovery.md index 350bc33aed..bbdd105af4 100644 --- a/docs/integrations/bitbucketServer/discovery.md +++ b/docs/integrations/bitbucketServer/discovery.md @@ -42,6 +42,8 @@ You need to decide how you want to receive events from external sources like - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) Further documentation: diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md index e01729dff0..3e90ca92ca 100644 --- a/docs/integrations/github/discovery.md +++ b/docs/integrations/github/discovery.md @@ -141,7 +141,7 @@ events: region: us-east-2 ``` -The [AWS SQS module `README`](https://github.com/backstage/backstage/blob/master/plugins/events-backend-module-aws-sqs/README.md#configuration) has more details on the configuration options, the example above includes on the required options. +The [AWS SQS module `README`](https://github.com/backstage/backstage/blob/master/plugins/events-backend-module-aws-sqs/README.md#configuration) has more details on the configuration options, the example above includes only the required options. ### Events Setup using Google Pub/Sub module @@ -179,7 +179,53 @@ events: targetTopic: 'github.{{ event.attributes.x-github-event }}' ``` -The [Google Pub/Sub module `README`](https://github.com/backstage/backstage/blob/master/plugins/events-backend-module-google-pubsub/README.md#configuration) has more details on the configuration options, the example above includes on the required options. +The [Google Pub/Sub module `README`](https://github.com/backstage/backstage/blob/master/plugins/events-backend-module-google-pubsub/README.md#configuration) has more details on the configuration options, the example above includes only the required options. + +### Events Setup using Kafka module + +Alternatively to using the HTTP endpoint you can use the Kafka module, here's how. + +First we need to add the package: + +```bash title="from your Backstage root directory" +yarn --cwd packages/backend add @backstage/plugin-events-backend-module-kafka +``` + +Then we need to add it to your backend: + +```ts title="in packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-events-backend')); +backend.add(import('@backstage/plugin-events-backend-module-github')); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-events-backend-module-kafka')); +/* highlight-add-end */ +``` + +Finally you will want to configure it: + +```yaml title="app-config.yaml +events: + modules: + kafka: + kafkaConsumingEventPublisher: + # Client ID used by Backstage to identify when connecting to the Kafka cluster. + clientId: your-client-id + # List of brokers in the Kafka cluster to connect to. + brokers: + - broker1 + - broker2 + topics: + # Replace with actual topic name as expected by subscribers + - topic: 'backstage.topic' + kafka: + # The Kafka topics to subscribe to. + topics: + - topic1 + # The GroupId to be used by the topic consumers. + groupId: your-group-id +``` + +The [Kafka module `README`](https://github.com/backstage/backstage/blob/master/plugins/events-backend-module-kafka/README.md#configuration) has more details on the configuration options, the example above includes only the required options. ## Configuration diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index 473d408b0b..2a6c0b74ea 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -118,6 +118,8 @@ You can decide between the following options (extensible): - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) You can check the official docs to [configure your webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks) and to [secure your request](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks). The webhook will need to be configured to forward `organization`,`team` and `membership` events. diff --git a/docs/integrations/gitlab/discovery.md b/docs/integrations/gitlab/discovery.md index 5e02c853fa..3d47edba6d 100644 --- a/docs/integrations/gitlab/discovery.md +++ b/docs/integrations/gitlab/discovery.md @@ -43,6 +43,8 @@ You need to decide how you want to receive events from external sources like - [via HTTP endpoint](https://github.com/backstage/backstage/blob/master/plugins/events-backend/README.md#configuration) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) Further documentation: @@ -92,6 +94,8 @@ Additionally, you need to decide how you want to receive events from external so - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) Set up your provider diff --git a/docs/integrations/gitlab/org.md b/docs/integrations/gitlab/org.md index 8249a97c24..2908bb7c09 100644 --- a/docs/integrations/gitlab/org.md +++ b/docs/integrations/gitlab/org.md @@ -49,6 +49,8 @@ You need to decide how you want to receive events from external sources like - [via HTTP endpoint](https://github.com/backstage/backstage/blob/master/plugins/events-backend/README.md#configuration) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) Further documentation: @@ -101,6 +103,8 @@ Additionally, you need to decide how you want to receive events from external so - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) +- [via Google Pub/Sub](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-google-pubsub/README.md) +- [via a Kafka topic](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-kafka/README.md) Set up your provider From e838d0001840b09951d289a05cbc1338db26b876 Mon Sep 17 00:00:00 2001 From: "Enderson Menezes (Mr. Enderson)" Date: Wed, 5 Nov 2025 11:52:38 -0300 Subject: [PATCH 010/312] typo: change permissionPolicyExtension to permissionsPolicyExtension There is a small spelling error that could prevent someone from following the tutorial literally. Signed-off-by: Enderson Menezes (Mr. Enderson) --- docs/permissions/custom-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/permissions/custom-rules.md b/docs/permissions/custom-rules.md index 7bfcd1220a..d90f36e59d 100644 --- a/docs/permissions/custom-rules.md +++ b/docs/permissions/custom-rules.md @@ -159,7 +159,7 @@ To install custom rules in a plugin, we need to use the [`PermissionsRegistrySer ```typescript title="packages/backend/src/modules/catalogPermissionRules.ts" import { createBackendModule } from '@backstage/backend-plugin-api'; import { catalogPermissionExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; - import { isInSystemRule } from './permissionPolicyExtension'; + import { isInSystemRule } from './permissionsPolicyExtension'; export default createBackendModule({ pluginId: 'catalog', From 53347cc2f5f0955036e988590e7cbfc7220acb15 Mon Sep 17 00:00:00 2001 From: Hellgren Heikki Date: Tue, 28 Oct 2025 10:43:41 +0200 Subject: [PATCH 011/312] fix(notifications): ui improvements - long descriptions behind show more/less button to prevent very small scrollable area - notifications count showing as `undefined` during initial loading - removed unnecessary `Filter` heading to mimick catalog filters - select all count is now more separated from the checkbox Signed-off-by: Hellgren Heikki --- .changeset/rotten-carrots-relax.md | 8 +++ .../NotificationsFilters.tsx | 8 --- .../NotificationsPage/NotificationsPage.tsx | 14 +++-- .../NotificationDescription.tsx | 61 +++++++++++++++++++ .../NotificationsTable/NotificationsTable.tsx | 18 +++--- .../NotificationsTable/SelectAll.tsx | 18 +++--- 6 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 .changeset/rotten-carrots-relax.md create mode 100644 plugins/notifications/src/components/NotificationsTable/NotificationDescription.tsx diff --git a/.changeset/rotten-carrots-relax.md b/.changeset/rotten-carrots-relax.md new file mode 100644 index 0000000000..339a5cdd6b --- /dev/null +++ b/.changeset/rotten-carrots-relax.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-notifications': patch +--- + +Move long notification descriptions behind `Show more/less` button. + +This improves readability of the notifications list by preventing long descriptions from taking up too much space +or rendering very small scrollable areas. diff --git a/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx b/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx index 7e3f519b0c..e8fa422fa1 100644 --- a/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx +++ b/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx @@ -14,14 +14,11 @@ * limitations under the License. */ import { ChangeEvent } from 'react'; - -import Divider from '@material-ui/core/Divider'; import FormControl from '@material-ui/core/FormControl'; import Grid from '@material-ui/core/Grid'; import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; -import Typography from '@material-ui/core/Typography'; import { GetNotificationsOptions } from '../../api'; import { NotificationSeverity } from '@backstage/plugin-notifications-common'; @@ -200,11 +197,6 @@ export const NotificationsFilters = ({ return ( <> - - Filters - - - View diff --git a/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx b/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx index 739e9a1535..69242ac60e 100644 --- a/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx +++ b/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { useState, useMemo, useEffect } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import throttle from 'lodash/throttle'; import { Content, @@ -156,13 +156,17 @@ export const NotificationsPage = (props?: NotificationsPageProps) => { const isUnread = !!value?.[1]?.unread; const allTopics = value?.[2]?.topics; - let tableTitle = `All notifications (${totalCount})`; + let tableTitle = `All notifications `; if (saved) { - tableTitle = `Saved notifications (${totalCount})`; + tableTitle = `Saved notifications`; } else if (unreadOnly === true) { - tableTitle = `Unread notifications (${totalCount})`; + tableTitle = `Unread notifications`; } else if (unreadOnly === false) { - tableTitle = `Read notifications (${totalCount})`; + tableTitle = `Read notifications`; + } + + if (totalCount) { + tableTitle += ` (${totalCount})`; } return ( diff --git a/plugins/notifications/src/components/NotificationsTable/NotificationDescription.tsx b/plugins/notifications/src/components/NotificationsTable/NotificationDescription.tsx new file mode 100644 index 0000000000..762900c2b9 --- /dev/null +++ b/plugins/notifications/src/components/NotificationsTable/NotificationDescription.tsx @@ -0,0 +1,61 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; +import { useState } from 'react'; + +const MAX_LENGTH = 100; + +export const NotificationDescription = (props: { description: string }) => { + const { description } = props; + const [shown, setShown] = useState(false); + const isLong = description.length > MAX_LENGTH; + + if (!isLong) { + return {description}; + } + + if (shown) { + return ( + + {description}{' '} + + + ); + } + return ( + + {description.substring(0, MAX_LENGTH)}...{' '} + + + ); +}; diff --git a/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx b/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx index 8ec237e62f..952c18f9f9 100644 --- a/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx +++ b/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { useState, useCallback, useMemo, useEffect } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import throttle from 'lodash/throttle'; // @ts-ignore import RelativeTime from 'react-relative-time'; @@ -37,14 +37,11 @@ import { notificationsApiRef } from '../../api'; import { SelectAll } from './SelectAll'; import { BulkActions } from './BulkActions'; import { NotificationIcon } from './NotificationIcon'; +import { NotificationDescription } from './NotificationDescription'; const ThrottleDelayMs = 1000; const useStyles = makeStyles(theme => ({ - description: { - maxHeight: '5rem', - overflow: 'auto', - }, severityItem: { alignContent: 'center', }, @@ -53,8 +50,10 @@ const useStyles = makeStyles(theme => ({ verticalAlign: 'text-bottom', }, notificationInfoRow: { - marginLeft: theme.spacing(0.5), marginRight: theme.spacing(0.5), + '&:not(:first-child)': { + marginLeft: theme.spacing(0.5), + }, }, })); @@ -240,9 +239,9 @@ export const NotificationsTable = ({ )} {notification.payload.description ? ( - - {notification.payload.description} - + ) : null} @@ -318,7 +317,6 @@ export const NotificationsTable = ({ onMarkAllRead, onNotificationsSelectChange, classes.severityItem, - classes.description, classes.broadcastIcon, classes.notificationInfoRow, markAsReadOnLinkOpen, diff --git a/plugins/notifications/src/components/NotificationsTable/SelectAll.tsx b/plugins/notifications/src/components/NotificationsTable/SelectAll.tsx index 9bcc497132..f6d6ff48c9 100644 --- a/plugins/notifications/src/components/NotificationsTable/SelectAll.tsx +++ b/plugins/notifications/src/components/NotificationsTable/SelectAll.tsx @@ -16,6 +16,7 @@ import Checkbox from '@material-ui/core/Checkbox'; import FormControlLabel from '@material-ui/core/FormControlLabel'; import { makeStyles } from '@material-ui/core/styles'; +import Tooltip from '@material-ui/core/Tooltip'; const useStyles = makeStyles({ label: { @@ -23,6 +24,7 @@ const useStyles = makeStyles({ maxWidth: '2rem', '& span': { paddingRight: '0px', + marginRight: '2px', }, }, }); @@ -43,13 +45,15 @@ export const SelectAll = ({ label={count > 0 ? `(${count})` : undefined} className={classes.label} control={ - 0} - indeterminate={count > 0 && totalCount !== count} - onChange={onSelectAll} - /> + + 0} + indeterminate={count > 0 && totalCount !== count} + onChange={onSelectAll} + /> + } /> ); From f2f84ad597093e583e38107f2c93f96bf1c29eb5 Mon Sep 17 00:00:00 2001 From: Vidhan Shah Date: Sat, 8 Nov 2025 07:58:34 +0530 Subject: [PATCH 012/312] Improving code as per reviews Signed-off-by: Vidhan Shah --- .../src/stages/publish/awsS3.test.ts | 137 ++++++++++++++++-- .../techdocs-node/src/stages/publish/awsS3.ts | 97 +++++-------- 2 files changed, 166 insertions(+), 68 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index f30cf50dfc..52c57a9c25 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -22,6 +22,7 @@ import { ListObjectsV2Command, PutObjectCommand, S3Client, + S3ServiceException, UploadPartCommand, } from '@aws-sdk/client-s3'; import { Entity, DEFAULT_NAMESPACE } from '@backstage/catalog-model'; @@ -196,16 +197,16 @@ describe('AwsS3Publish', () => { [directory]: files, }); - s3Mock = mockClient(S3Client as any); + s3Mock = mockClient(S3Client); - s3Mock.on(HeadObjectCommand).callsFake((input: any) => { + s3Mock.on(HeadObjectCommand).callsFake((input: { Key: string }) => { if (!fs.pathExistsSync(mockDir.resolve(input.Key))) { throw new Error('File does not exist'); } return {}; }); - s3Mock.on(GetObjectCommand).callsFake((input: any) => { + s3Mock.on(GetObjectCommand).callsFake((input: { Key: string }) => { if (fs.pathExistsSync(mockDir.resolve(input.Key))) { return { Body: Readable.from(fs.readFileSync(mockDir.resolve(input.Key))), @@ -215,14 +216,14 @@ describe('AwsS3Publish', () => { throw new Error(`The file ${input.Key} does not exist!`); }); - s3Mock.on(HeadBucketCommand).callsFake((input: any) => { + s3Mock.on(HeadBucketCommand).callsFake((input: { Bucket: string }) => { if (input.Bucket === 'errorBucket') { throw new Error('Bucket does not exist'); } return {}; }); - s3Mock.on(ListObjectsV2Command).callsFake((input: any) => { + s3Mock.on(ListObjectsV2Command).callsFake((input: { Bucket: string }) => { if ( input.Bucket === 'delete_stale_files_success' || input.Bucket === 'delete_stale_files_error' @@ -234,7 +235,7 @@ describe('AwsS3Publish', () => { return {}; }); - s3Mock.on(DeleteObjectCommand).callsFake((input: any) => { + s3Mock.on(DeleteObjectCommand).callsFake((input: { Bucket: string }) => { if (input.Bucket === 'delete_stale_files_error') { throw new Error('Message'); } @@ -242,9 +243,11 @@ describe('AwsS3Publish', () => { }); s3Mock.on(UploadPartCommand).rejects(); - s3Mock.on(PutObjectCommand).callsFake((input: any) => { - mockDir.addContent({ [input.Key]: input.Body }); - }); + s3Mock + .on(PutObjectCommand) + .callsFake((input: { Key: string; Body: any }) => { + mockDir.addContent({ [input.Key]: input.Body }); + }); }); afterEach(() => { @@ -299,6 +302,122 @@ describe('AwsS3Publish', () => { }); }); + describe('retry mechanism', () => { + it('should retry with custom retry strategy', async () => { + const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const customRetryStrategy = jest.fn((error: any) => { + return error.name === 'NetworkingError'; + }); + + s3Mock + .on(ListObjectsV2Command) + .rejectsOnce( + new S3ServiceException({ + name: 'NetworkingError', + $fault: 'client', + $metadata: {}, + }), + ) + .resolvesOnce({ Contents: [] }); + + await (publisher as any).retryOperation( + async () => { + return s3Mock.send( + new ListObjectsV2Command({ Bucket: 'bucketName' }), + ); + }, + 'TestOperation', + 3, + customRetryStrategy, + ); + + expect(customRetryStrategy).toHaveBeenCalled(); + }); + + it('should use default retry strategy when no custom strategy provided', async () => { + const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + s3Mock + .on(ListObjectsV2Command) + .rejectsOnce('RequestTimeout') + .resolvesOnce({ Contents: [] }); + + await (publisher as any).retryOperation( + async () => { + return s3Mock.send( + new ListObjectsV2Command({ Bucket: 'bucketName' }), + ); + }, + 'TestOperation', + 3, + ); + }); + + it('should retry on server errors (5xx)', async () => { + const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + s3Mock + .on(ListObjectsV2Command) + .rejectsOnce( + new S3ServiceException({ + name: 'InternalError', + $fault: 'server', + $metadata: { httpStatusCode: 500 }, + }), + ) + .resolvesOnce({ Contents: [] }); + + await (publisher as any).retryOperation( + async () => { + return s3Mock.send( + new ListObjectsV2Command({ Bucket: 'bucketName' }), + ); + }, + 'TestOperation', + 3, + ); + }); + + it('should retry on specific 4xx errors', async () => { + const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + s3Mock + .on(ListObjectsV2Command) + .rejectsOnce('RequestTimeout') + .resolvesOnce({ Contents: [] }); + + await (publisher as any).retryOperation( + async () => { + return s3Mock.send( + new ListObjectsV2Command({ Bucket: 'bucketName' }), + ); + }, + 'TestOperation', + 3, + ); + }); + + it('should not retry on non-retriable 4xx errors', async () => { + const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + s3Mock.on(ListObjectsV2Command).rejectsOnce( + new S3ServiceException({ + name: 'BadRequest', + $fault: 'client', + $metadata: { httpStatusCode: 400 }, + }), + ); + + await expect( + (publisher as any).retryOperation( + async () => { + return s3Mock.send( + new ListObjectsV2Command({ Bucket: 'bucketName' }), + ); + }, + 'TestOperation', + 3, + ), + ).rejects.toHaveProperty('name', 'BadRequest'); + }); + }); + describe('getReadiness', () => { it('should validate correct config', async () => { const publisher = await createPublisherFromConfig(); diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts index 9f6ce7cab5..79b4e73028 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts @@ -16,6 +16,10 @@ import { Entity, CompoundEntityRef } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { assertError, ForwardedError } from '@backstage/errors'; + +// Maximum size in bytes for a single upload part (5MB) +const MAX_SINGLE_UPLOAD_BYTES = 5 * 1024 * 1024; + import { AwsCredentialsManager, DefaultAwsCredentialsManager, @@ -275,67 +279,48 @@ export class AwsS3Publish implements PublisherBase { operation: () => Promise, operationName: string, maxAttempts: number = 3, + shouldRetry: (error: S3ServiceException) => boolean = this + .defaultShouldRetry, ): Promise { - let attempts = maxAttempts; - let LastError: S3ServiceException; - - while (attempts > 0) { + for (let attempt = 1; attempt < maxAttempts; attempt++) { try { return await operation(); - } catch (error: unknown) { - LastError = error as S3ServiceException; - attempts--; + } catch (error) { + const e = error as S3ServiceException; + if (!shouldRetry(e)) { + this.logger.error(`${operationName} failed: ${e.message}`); + throw e; + } - const httpStatusCode = LastError.$metadata?.httpStatusCode; - const errorCode = LastError.name; - - this.logger.warn(`${operationName} failed.`, { - errorCode, - httpStatusCode, - attemptsRemaining: attempts, - currentAttempt: maxAttempts - attempts, - totalAttempts: maxAttempts, - error: LastError.message, + this.logger.warn(`${operationName} failed, retrying...`, { + attempt, + maxAttempts, + error: e.message, + errorCode: e.name, + httpStatusCode: e.$metadata?.httpStatusCode, }); - // Determine if we should retry based on error type - const shouldRetry = this.shouldRetryOperation(LastError, attempts); - if (!shouldRetry || attempts === 0) { - this.logger.error( - `${operationName} failed after all retries: ${LastError.message}`, - ); - throw LastError; - } - // Enhanced exponential backoff with jitter for upload operation - let baseDelay = 1000; - if (operationName.startsWith('Upload-')) { - // for uploads use longer base delay due to potential multipart commplexity - baseDelay = 2000; - } - const backoffDelay = Math.min( - baseDelay * Math.pow(2, maxAttempts - attempts), - 30000, - ); + + // Enhanced exponential backoff with jitter + const baseDelay = operationName.startsWith('Upload-') ? 2000 : 1000; + const backoffDelay = Math.min(baseDelay * Math.pow(2, attempt), 30000); const jitter = Math.random() * 1000; - const totalDelay = backoffDelay + jitter; - await new Promise(resolve => setTimeout(resolve, totalDelay)); + await new Promise(resolve => + setTimeout(resolve, backoffDelay + jitter), + ); } } - // Final attempt without retry wrapper - return operation(); + return await operation(); } /** * Determines if an S3 operation should be retried based on the error details. */ - private shouldRetryOperation( - error: S3ServiceException, - attemptsRemaining: number, - ): boolean { + private defaultShouldRetry(error: S3ServiceException): boolean { const httpStatusCode = error.$metadata?.httpStatusCode; const errorCode = error.name; // Handle invalid part errors first - these are retriable for multipart uploads if (errorCode === 'InvalidPart') { - return attemptsRemaining > 0; + return true; } // Dont retry for client errors (4xx) except specific cases if (httpStatusCode && httpStatusCode >= 400 && httpStatusCode < 500) { @@ -345,7 +330,7 @@ export class AwsS3Publish implements PublisherBase { 'RequestTimeoutException', 'PriorRequestNotComplete', 'ConnectionError', - 'RequestTimeToooSkewed', + 'RequestTimeTooSkewed', 'InvalidPart', 'NoSuchUpload', ]; @@ -355,7 +340,7 @@ export class AwsS3Publish implements PublisherBase { } // Always retry for server errors (5xx) if (httpStatusCode && httpStatusCode >= 500) { - return attemptsRemaining > 0; + return true; } // Retry specific network/connection errors and multipart upload errors const retriableErrors = [ @@ -380,12 +365,10 @@ export class AwsS3Publish implements PublisherBase { 'IncompleteBody', 'RequestTimeout', ]; - return ( - retriableErrors.some( - retriableError => - errorCode.includes(retriableError) || - error.message.includes(retriableError), - ) && attemptsRemaining > 0 + return retriableErrors.some( + retriableError => + errorCode.includes(retriableError) || + error.message.includes(retriableError), ); } @@ -511,16 +494,12 @@ export class AwsS3Publish implements PublisherBase { new PutObjectCommand(putParams), ); } - // For files 5MB and larger, use multipart upload with enhanced configuration - const calaculatedPartSize = Math.max( - fiveMB, - Math.ceil(fileSizeInBytes / 10000), - ); + // For files larger than MAX_SINGLE_UPLOAD_BYTES, use multipart upload const upload = new Upload({ client: this.storageClient, params, // Configure miltipart upload option for better reliability - partSize: calaculatedPartSize, + partSize: MAX_SINGLE_UPLOAD_BYTES, queueSize: 3, leavePartsOnError: false, }); @@ -536,7 +515,7 @@ export class AwsS3Publish implements PublisherBase { // Check if this is a multipart upload failure that we can handle if ( - fileSizeInBytes >= 5 * 1024 * 1024 && + fileSizeInBytes >= MAX_SINGLE_UPLOAD_BYTES && (errorName === 'InvalidPart' || errorName === 'NoSuchUpload') ) { this.logger.warn( From 39ab1a89358c1ce5759803e55bd3bd2027b65f2f Mon Sep 17 00:00:00 2001 From: Vidhan Shah Date: Sat, 8 Nov 2025 09:04:16 +0530 Subject: [PATCH 013/312] PR comments Signed-off-by: Vidhan Shah --- .../techdocs-node/src/stages/publish/awsS3.ts | 63 +++++++------------ 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts index 79b4e73028..67e9df59c5 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts @@ -318,54 +318,35 @@ export class AwsS3Publish implements PublisherBase { private defaultShouldRetry(error: S3ServiceException): boolean { const httpStatusCode = error.$metadata?.httpStatusCode; const errorCode = error.name; - // Handle invalid part errors first - these are retriable for multipart uploads - if (errorCode === 'InvalidPart') { - return true; - } - // Dont retry for client errors (4xx) except specific cases - if (httpStatusCode && httpStatusCode >= 400 && httpStatusCode < 500) { - // Retry specfic 4xx errors that might be transient - const retriable4xxErrors = [ - 'RequestTimeOut', - 'RequestTimeoutException', - 'PriorRequestNotComplete', - 'ConnectionError', - 'RequestTimeTooSkewed', - 'InvalidPart', - 'NoSuchUpload', - ]; - if (!retriable4xxErrors.includes(errorCode)) { - return false; - } - } - // Always retry for server errors (5xx) - if (httpStatusCode && httpStatusCode >= 500) { - return true; - } - // Retry specific network/connection errors and multipart upload errors - const retriableErrors = [ + + // Truly transient errors that should always be retried + const transientErrors = [ 'NetworkingError', 'TimeoutError', 'ConnectionError', - 'ECONNRESET', - 'ENOTFOUND', - 'ECONNREFUSED', - 'ETIMEDOUT', + 'RequestTimeout', 'ServiceUnavailable', 'SlowDown', - 'Throttling', 'ThrottlingException', - 'ProvisionedThroughputExceededException', - // Multipart upload specific errors - now handled above but kept for completeness - 'InvalidPart', - 'NoSuchUpload', - 'UploadTimeout', - 'EntityTooLarge', - 'InternalError', - 'IncompleteBody', - 'RequestTimeout', ]; - return retriableErrors.some( + + // Server errors are always considered transient + if (httpStatusCode && httpStatusCode >= 500) { + return true; + } + + // Specific 4xx errors that are known to be transient + if (httpStatusCode && httpStatusCode >= 400 && httpStatusCode < 500) { + const retriable4xxErrors = [ + 'RequestTimeout', + 'RequestTimeoutException', + 'PriorRequestNotComplete', + ]; + return retriable4xxErrors.includes(errorCode); + } + + // Check against known transient errors + return transientErrors.some( retriableError => errorCode.includes(retriableError) || error.message.includes(retriableError), From 42db6a6a80be3800cf170b2d610c1c7a1c1c641e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Sun, 9 Nov 2025 14:43:59 +0200 Subject: [PATCH 014/312] Don't warn when parsing storeOptions for 'memory' cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, a fresh Backstage installation prints the following warning at app startup: "backstage warn No configuration found for cache store 'memory' at 'backend.cache.memory'. type="cacheManager"" The 'memory' cache store does not have any extra config, like 'redis' or 'infinispan'. Warning about missing configuration can cause confusion to the users. See config here: https://github.com/backstage/backstage/blob/master/packages/backend-defaults/config.d.ts#L623 This warning was introduced here: https://github.com/backstage/backstage/pull/30743/files#diff-42975462070406316e4534ce0579d1d12d54fc5cd62e239d1ae676c1e290b473R137 Signed-off-by: Valério Valério --- .changeset/short-cloths-tie.md | 5 +++++ .../backend-defaults/src/entrypoints/cache/CacheManager.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/short-cloths-tie.md diff --git a/.changeset/short-cloths-tie.md b/.changeset/short-cloths-tie.md new file mode 100644 index 0000000000..90b84af830 --- /dev/null +++ b/.changeset/short-cloths-tie.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': minor +--- + +Don't warn when parsing storeOptions for 'memory' cache diff --git a/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts b/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts index 06b2b0c57b..428a4b7592 100644 --- a/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts +++ b/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts @@ -134,7 +134,7 @@ export class CacheManager { ): CacheStoreOptions | undefined { const storeConfigPath = `backend.cache.${store}`; - if (!config.has(storeConfigPath)) { + if (store !== 'memory' && !config.has(storeConfigPath)) { logger?.warn( `No configuration found for cache store '${store}' at '${storeConfigPath}'.`, ); From d8ba100ea6d0c164cdedfd917a11b93a20c6ee43 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Tue, 4 Nov 2025 16:24:28 +0000 Subject: [PATCH 015/312] fix Signed-off-by: Ayush More --- docs/overview/what-is-backstage.md | 2 +- microsite/static/css/custom.css | 20 ------------------- ...{cncf-black.svg => cncf-stacked-color.svg} | 0 ...{cncf-white.svg => cncf-stacked-white.svg} | 0 4 files changed, 1 insertion(+), 21 deletions(-) rename microsite/static/img/{cncf-black.svg => cncf-stacked-color.svg} (100%) rename microsite/static/img/{cncf-white.svg => cncf-stacked-white.svg} (100%) diff --git a/docs/overview/what-is-backstage.md b/docs/overview/what-is-backstage.md index fa1c75de44..669e4a43ee 100644 --- a/docs/overview/what-is-backstage.md +++ b/docs/overview/what-is-backstage.md @@ -39,7 +39,7 @@ Out of the box, Backstage includes: Backstage is a CNCF Incubation project after graduating from Sandbox. Read the announcement [here](https://backstage.io/blog/2022/03/16/backstage-turns-two#out-of-the-sandbox-and-into-incubation). -CNCF logo + ## Benefits diff --git a/microsite/static/css/custom.css b/microsite/static/css/custom.css index 8aa87cb06d..198ccb2762 100644 --- a/microsite/static/css/custom.css +++ b/microsite/static/css/custom.css @@ -1351,26 +1351,6 @@ h3.collapsible span.arrow { } /* End of Utility API Styling */ -.cncf-logo.light-mode { - display: block !important; -} - -.cncf-logo.dark-mode { - display: none !important; -} - -/* When system/browser is in dark mode */ -@media (prefers-color-scheme: dark) { - .cncf-logo.light-mode { - display: none !important; - } - .cncf-logo.dark-mode { - display: block !important; - } -} - - - diff --git a/microsite/static/img/cncf-black.svg b/microsite/static/img/cncf-stacked-color.svg similarity index 100% rename from microsite/static/img/cncf-black.svg rename to microsite/static/img/cncf-stacked-color.svg diff --git a/microsite/static/img/cncf-white.svg b/microsite/static/img/cncf-stacked-white.svg similarity index 100% rename from microsite/static/img/cncf-white.svg rename to microsite/static/img/cncf-stacked-white.svg From ac98e81468ec353733fd9906a8f6ccab4b0505e4 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Mon, 10 Nov 2025 06:52:11 +0000 Subject: [PATCH 016/312] ci: re-run checks Signed-off-by: Ayush More From 9a942a417d5062f1f1c306d6678bd8f6c7bfc373 Mon Sep 17 00:00:00 2001 From: Katharina Sick Date: Mon, 10 Nov 2025 14:49:39 +0100 Subject: [PATCH 017/312] fix: fix logviewer selection behavior Signed-off-by: Katharina Sick --- .changeset/floppy-bobcats-serve.md | 12 + .../components/LogViewer/RealLogViewer.tsx | 205 ++++++----- .../src/components/LogViewer/styles.ts | 6 + .../LogViewer/useLogViewerSelection.test.tsx | 341 +++++++++++++++--- .../LogViewer/useLogViewerSelection.tsx | 217 +++++++++-- 5 files changed, 613 insertions(+), 168 deletions(-) create mode 100644 .changeset/floppy-bobcats-serve.md diff --git a/.changeset/floppy-bobcats-serve.md b/.changeset/floppy-bobcats-serve.md new file mode 100644 index 0000000000..d698e1482c --- /dev/null +++ b/.changeset/floppy-bobcats-serve.md @@ -0,0 +1,12 @@ +--- +'@backstage/core-components': patch +--- + +Fixed bug in the `LogViewer` component where shift + click always opened a new window instead of just changing the selection. + +In addition, improved the `LogViewer` component by a few usability enhancements: + +- Added support for multiple selections using cmd/ctrl + click +- Improved the generated hash that is added to the URL to also support ranges & multiple selections +- Added an hover effect & info tooltip to the "Copy to clipboard" button to indicate its functionality +- Added some color and a separator to the line numbers to improve readability diff --git a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx index e384a8e882..1936061b1c 100644 --- a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx +++ b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx @@ -21,7 +21,7 @@ import classnames from 'classnames'; import { useEffect, useMemo, useRef, useState } from 'react'; import { useLocation } from 'react-router-dom'; import AutoSizer from 'react-virtualized-auto-sizer'; -import { VariableSizeList, FixedSizeList } from 'react-window'; +import { FixedSizeList, VariableSizeList } from 'react-window'; import { AnsiLine, AnsiProcessor } from './AnsiProcessor'; import { LogLine } from './LogLine'; @@ -29,6 +29,7 @@ import { LogViewerControls } from './LogViewerControls'; import { HEADER_SIZE, useStyles } from './styles'; import { useLogViewerSearch } from './useLogViewerSearch'; import { useLogViewerSelection } from './useLogViewerSelection'; +import Snackbar from '@material-ui/core/Snackbar'; export interface RealLogViewerProps { text: string; @@ -47,6 +48,7 @@ export function RealLogViewer(props: RealLogViewerProps) { // The processor keeps state that optimizes appending to the text const processor = useMemo(() => new AnsiProcessor(), []); const lines = processor.process(props.text); + const [showCopyInfo, setShowCopyInfo] = useState(false); const search = useLogViewerSearch(lines); const selection = useLogViewerSelection(lines); @@ -69,19 +71,39 @@ export function RealLogViewer(props: RealLogViewerProps) { } }, [listInstance, search.resultLine, lines]); + useEffect(() => { + const hash = selection.getHash(); + if (hash.length > 0) { + history.replaceState(null, '', hash); + } + }, [selection]); + useEffect(() => { if (location.hash) { - // #line-6 -> 6 - const line = parseInt(location.hash.replace(/\D/g, ''), 10); - selection.setSelection(line, false); + selection.selectAll(location.hash); } }, []); // eslint-disable-line react-hooks/exhaustive-deps const handleSelectLine = ( line: number, - event: { shiftKey: boolean; preventDefault: () => void }, + event: { + shiftKey: boolean; + metaKey: boolean; + ctrlKey: boolean; + preventDefault: () => void; + }, ) => { - selection.setSelection(line, event.shiftKey); + event.preventDefault(); + selection.setSelection( + line, + event.shiftKey, + event.metaKey || event.ctrlKey, + ); + }; + + const handleCopySelection = (line: number) => { + selection.copySelection(line); + setShowCopyInfo(true); }; function setRowHeight(index: number, size: number) { @@ -97,90 +119,99 @@ export function RealLogViewer(props: RealLogViewerProps) { } return ( - - {({ height, width }: { height?: number; width?: number }) => { - const commonProps = { - ref: setListInstance, - className: classes.log, - height: (height || 480) - HEADER_SIZE, - width: width || 640, - itemData: search.lines, - itemCount: search.lines.length, - }; + <> + + {({ height, width }: { height?: number; width?: number }) => { + const commonProps = { + ref: setListInstance, + className: classes.log, + height: (height || 480) - HEADER_SIZE, + width: width || 640, + itemData: search.lines, + itemCount: search.lines.length, + }; - const renderItem = ({ - index, - style, - data, - }: { - index: number; - style: React.CSSProperties; - data: AnsiLine[]; - }) => { - const line = data[index]; - const { lineNumber } = line; - return ( - - {selection.shouldShowButton(lineNumber) && ( - selection.copySelection()} - > - - - )} - handleSelectLine(lineNumber, event)} - onKeyPress={event => handleSelectLine(lineNumber, event)} + const renderItem = ({ + index, + style, + data, + }: { + index: number; + style: React.CSSProperties; + data: AnsiLine[]; + }) => { + const line = data[index]; + const { lineNumber } = line; + return ( + - {lineNumber} - - + {selection.shouldShowCopyButton(lineNumber) && ( + handleCopySelection(lineNumber)} + > + + + )} + handleSelectLine(lineNumber, event)} + onKeyPress={event => handleSelectLine(lineNumber, event)} + > + {lineNumber} + + + + ); + }; + + return ( + + + + + {shouldTextWrap ? ( + + {...commonProps} + itemSize={getRowHeight} + > + {renderItem} + + ) : ( + {...commonProps} itemSize={20}> + {renderItem} + + )} ); - }; - - return ( - - - - - {shouldTextWrap ? ( - - {...commonProps} - itemSize={getRowHeight} - > - {renderItem} - - ) : ( - {...commonProps} itemSize={20}> - {renderItem} - - )} - - ); - }} - + }} + + setShowCopyInfo(false)} + message="Lines copied to clipboard" + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + /> + ); } diff --git a/packages/core-components/src/components/LogViewer/styles.ts b/packages/core-components/src/components/LogViewer/styles.ts index 76e045ca32..83fb3a84ad 100644 --- a/packages/core-components/src/components/LogViewer/styles.ts +++ b/packages/core-components/src/components/LogViewer/styles.ts @@ -89,14 +89,20 @@ export const useStyles = makeStyles( position: 'absolute', paddingTop: 0, paddingBottom: 0, + '&:hover': { + color: theme.palette.linkHover, + }, }, lineNumber: { display: 'inline-block', textAlign: 'end', width: 60, + paddingRight: theme.spacing(1), marginRight: theme.spacing(1), cursor: 'pointer', flexShrink: 0, + color: colors.blue[300], + borderRight: `1px solid ${colors.blue[700]}`, }, textHighlight: { background: alpha(theme.palette.info.main, 0.15), diff --git a/packages/core-components/src/components/LogViewer/useLogViewerSelection.test.tsx b/packages/core-components/src/components/LogViewer/useLogViewerSelection.test.tsx index 5314f4e7f6..13280d38a4 100644 --- a/packages/core-components/src/components/LogViewer/useLogViewerSelection.test.tsx +++ b/packages/core-components/src/components/LogViewer/useLogViewerSelection.test.tsx @@ -16,7 +16,7 @@ import { PropsWithChildren } from 'react'; import { act, renderHook } from '@testing-library/react'; -import { TestApiProvider, MockErrorApi } from '@backstage/test-utils'; +import { MockErrorApi, TestApiProvider } from '@backstage/test-utils'; import { errorApiRef } from '@backstage/core-plugin-api'; import { AnsiLine } from './AnsiProcessor'; import { useLogViewerSelection } from './useLogViewerSelection'; @@ -35,10 +35,26 @@ const lines = [ new AnsiLine(3, [{ text: '3', modifiers: {} }]), new AnsiLine(4, [{ text: '4', modifiers: {} }]), new AnsiLine(5, [{ text: '5', modifiers: {} }]), + new AnsiLine(6, [{ text: '6', modifiers: {} }]), + new AnsiLine(7, [{ text: '7', modifiers: {} }]), ]; +const expectSelectedLines = (rendered: any, selectedLines: number[]) => { + expect(rendered.result.current.isSelected(1)).toBe(selectedLines.includes(1)); + expect(rendered.result.current.isSelected(2)).toBe(selectedLines.includes(2)); + expect(rendered.result.current.isSelected(3)).toBe(selectedLines.includes(3)); + expect(rendered.result.current.isSelected(4)).toBe(selectedLines.includes(4)); + expect(rendered.result.current.isSelected(5)).toBe(selectedLines.includes(5)); + expect(rendered.result.current.isSelected(6)).toBe(selectedLines.includes(6)); + expect(rendered.result.current.isSelected(7)).toBe(selectedLines.includes(7)); +}; + describe('useLogViewerSelection', () => { - it('should manage a selection', () => { + beforeEach(() => { + (copyToClipboard as jest.Mock).mockClear(); + }); + + it('should select a new line when clicked', () => { const rendered = renderHook(() => useLogViewerSelection(lines), { wrapper: ({ children }: PropsWithChildren<{}>) => ( @@ -47,77 +63,290 @@ describe('useLogViewerSelection', () => { ), }); - expect(rendered.result.current.isSelected(1)).toBe(false); - expect(rendered.result.current.isSelected(2)).toBe(false); - expect(rendered.result.current.isSelected(3)).toBe(false); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(5, false, false)); + expectSelectedLines(rendered, [5]); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); + }); - expect(rendered.result.current.shouldShowButton(1)).toBe(false); - expect(rendered.result.current.shouldShowButton(2)).toBe(false); - expect(rendered.result.current.shouldShowButton(3)).toBe(false); + it('should deselect a selected line when clicked', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); - act(() => rendered.result.current.setSelection(2, false)); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, []); + }); - expect(rendered.result.current.isSelected(1)).toBe(false); - expect(rendered.result.current.isSelected(2)).toBe(true); - expect(rendered.result.current.isSelected(3)).toBe(false); + it('should select a new line on shift+click if nothing is selected', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); - expect(rendered.result.current.shouldShowButton(1)).toBe(false); - expect(rendered.result.current.shouldShowButton(2)).toBe(true); - expect(rendered.result.current.shouldShowButton(3)).toBe(false); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, true, false)); + expectSelectedLines(rendered, [2]); + }); - act(() => rendered.result.current.setSelection(3, false)); + it('should deselect a single line on shift+click', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); - expect(rendered.result.current.isSelected(1)).toBe(false); - expect(rendered.result.current.isSelected(2)).toBe(false); - expect(rendered.result.current.isSelected(3)).toBe(true); - expect(rendered.result.current.isSelected(4)).toBe(false); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, true, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(2, true, false)); + expectSelectedLines(rendered, []); + }); - expect(rendered.result.current.shouldShowButton(1)).toBe(false); - expect(rendered.result.current.shouldShowButton(2)).toBe(false); - expect(rendered.result.current.shouldShowButton(3)).toBe(true); - expect(rendered.result.current.shouldShowButton(4)).toBe(false); + it('should select a range below on shift+click', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); - act(() => rendered.result.current.setSelection(1, true)); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, true, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(5, true, false)); + expectSelectedLines(rendered, [2, 3, 4, 5]); + }); - expect(rendered.result.current.isSelected(1)).toBe(true); - expect(rendered.result.current.isSelected(2)).toBe(true); - expect(rendered.result.current.isSelected(3)).toBe(true); - expect(rendered.result.current.isSelected(4)).toBe(false); + it('should select a range above on shift+click', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); - expect(rendered.result.current.shouldShowButton(1)).toBe(true); - expect(rendered.result.current.shouldShowButton(2)).toBe(false); - expect(rendered.result.current.shouldShowButton(3)).toBe(true); - expect(rendered.result.current.shouldShowButton(4)).toBe(false); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(5, true, false)); + expectSelectedLines(rendered, [5]); + act(() => rendered.result.current.setSelection(2, true, false)); + expectSelectedLines(rendered, [2, 3, 4, 5]); + }); - act(() => rendered.result.current.setSelection(4, true)); + it('should reduce a selection on shift+click', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); - expect(rendered.result.current.isSelected(1)).toBe(false); - expect(rendered.result.current.isSelected(2)).toBe(false); - expect(rendered.result.current.isSelected(3)).toBe(true); - expect(rendered.result.current.isSelected(4)).toBe(true); - expect(rendered.result.current.isSelected(5)).toBe(false); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, true, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(7, true, false)); + expectSelectedLines(rendered, [2, 3, 4, 5, 6, 7]); + act(() => rendered.result.current.setSelection(4, true, false)); + expectSelectedLines(rendered, [2, 3, 4]); + act(() => rendered.result.current.setSelection(2, true, false)); + expectSelectedLines(rendered, [2]); + }); - expect(rendered.result.current.shouldShowButton(1)).toBe(false); - expect(rendered.result.current.shouldShowButton(2)).toBe(false); - expect(rendered.result.current.shouldShowButton(3)).toBe(true); - expect(rendered.result.current.shouldShowButton(4)).toBe(true); - expect(rendered.result.current.shouldShowButton(5)).toBe(false); + it('should add a new selection on cmd/ctrl+click', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, true)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(5, false, true)); + expectSelectedLines(rendered, [2, 5]); + }); + + it('should merge selections on cmd/ctrl+click', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(1, false, true)); + expectSelectedLines(rendered, [1]); + act(() => rendered.result.current.setSelection(3, true, false)); + expectSelectedLines(rendered, [1, 2, 3]); + act(() => rendered.result.current.setSelection(5, false, true)); + expectSelectedLines(rendered, [1, 2, 3, 5]); + act(() => rendered.result.current.setSelection(7, true, false)); + expectSelectedLines(rendered, [1, 2, 3, 5, 6, 7]); + act(() => rendered.result.current.setSelection(4, false, true)); + expectSelectedLines(rendered, [1, 2, 3, 4, 5, 6, 7]); + }); + + it('should split a selection on cmd/ctrl+click', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(1, false, true)); + expectSelectedLines(rendered, [1]); + act(() => rendered.result.current.setSelection(5, true, false)); + expectSelectedLines(rendered, [1, 2, 3, 4, 5]); + act(() => rendered.result.current.setSelection(3, false, true)); + expectSelectedLines(rendered, [1, 2, 4, 5]); + }); + + it('should copy a selected line', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); expect(copyToClipboard).not.toHaveBeenCalled(); - act(() => rendered.result.current.copySelection()); - expect(copyToClipboard).toHaveBeenLastCalledWith('3\n4'); + act(() => rendered.result.current.copySelection(2)); + expect(copyToClipboard).toHaveBeenLastCalledWith('2'); + }); - act(() => rendered.result.current.setSelection(2, true)); - act(() => rendered.result.current.setSelection(4, true)); + it('should copy a selected range', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + rendered.rerender(); - act(() => rendered.result.current.copySelection()); - expect(copyToClipboard).toHaveBeenCalledWith('2\n3\n4'); + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(5, true, false)); + expectSelectedLines(rendered, [2, 3, 4, 5]); - act(() => rendered.result.current.setSelection(2, false)); - act(() => rendered.result.current.setSelection(4, false)); - act(() => rendered.result.current.setSelection(4, false)); - act(() => rendered.result.current.setSelection(5, true)); - act(() => rendered.result.current.copySelection()); - expect(copyToClipboard).toHaveBeenCalledWith('5'); + expect(copyToClipboard).not.toHaveBeenCalled(); + act(() => rendered.result.current.copySelection(2)); + expect(copyToClipboard).toHaveBeenCalledWith('2\n3\n4\n5'); + }); + + it('should copy the correct selection', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + rendered.rerender(); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(5, true, false)); + expectSelectedLines(rendered, [2, 3, 4, 5]); + + act(() => rendered.result.current.setSelection(7, false, true)); + expectSelectedLines(rendered, [2, 3, 4, 5, 7]); + + expect(copyToClipboard).not.toHaveBeenCalled(); + act(() => rendered.result.current.copySelection(2)); + expect(copyToClipboard).toHaveBeenCalledWith('2\n3\n4\n5'); + act(() => rendered.result.current.copySelection(7)); + expect(copyToClipboard).toHaveBeenCalledWith('7'); + }); + + it('should add a single line selection to the hash', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + rendered.rerender(); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); + + expect(rendered.result.current.getHash()).toBe('#lines-2'); + }); + + it('should add a range selection to the hash', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + rendered.rerender(); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(2, false, false)); + expectSelectedLines(rendered, [2]); + act(() => rendered.result.current.setSelection(5, true, false)); + expectSelectedLines(rendered, [2, 3, 4, 5]); + + expect(rendered.result.current.getHash()).toBe('#lines-2-5'); + }); + + it('should add multiple selections to the hash', () => { + const rendered = renderHook(() => useLogViewerSelection(lines), { + wrapper: ({ children }: PropsWithChildren<{}>) => ( + + {children} + + ), + }); + rendered.rerender(); + + expectSelectedLines(rendered, []); + act(() => rendered.result.current.setSelection(3, false, false)); + expectSelectedLines(rendered, [3]); + act(() => rendered.result.current.setSelection(5, true, false)); + expectSelectedLines(rendered, [3, 4, 5]); + act(() => rendered.result.current.setSelection(1, false, true)); + expectSelectedLines(rendered, [1, 3, 4, 5]); + act(() => rendered.result.current.setSelection(7, false, true)); + expectSelectedLines(rendered, [1, 3, 4, 5, 7]); + + expect(rendered.result.current.getHash()).toBe('#lines-3-5,1,7'); }); }); diff --git a/packages/core-components/src/components/LogViewer/useLogViewerSelection.tsx b/packages/core-components/src/components/LogViewer/useLogViewerSelection.tsx index 97fee53c8a..d59a552777 100644 --- a/packages/core-components/src/components/LogViewer/useLogViewerSelection.tsx +++ b/packages/core-components/src/components/LogViewer/useLogViewerSelection.tsx @@ -19,11 +19,14 @@ import { useEffect, useState } from 'react'; import useCopyToClipboard from 'react-use/esm/useCopyToClipboard'; import { AnsiLine } from './AnsiProcessor'; +type Selection = { + start: number; + end: number; +}; + export function useLogViewerSelection(lines: AnsiLine[]) { const errorApi = useApi(errorApiRef); - const [sel, setSelection] = useState<{ start: number; end: number }>(); - const start = sel ? Math.min(sel.start, sel.end) : undefined; - const end = sel ? Math.max(sel.start, sel.end) : undefined; + const [selections, setSelections] = useState([]); const [{ error }, copyToClipboard] = useCopyToClipboard(); @@ -33,38 +36,202 @@ export function useLogViewerSelection(lines: AnsiLine[]) { } }, [error, errorApi]); + const findClosestSelection = ( + allSelections: Selection[], + line: number, + ): Selection | undefined => { + if (selections.length === 0) { + return undefined; + } + let minDistance = Number.MAX_SAFE_INTEGER; + let closestSelection: Selection | undefined = undefined; + + allSelections.forEach(s => { + const distance = Math.min( + Math.abs(s.start - line), + Math.abs(s.end - line), + ); + if (distance < minDistance) { + minDistance = distance; + closestSelection = s; + } + }); + + return closestSelection; + }; + + const mergeNeighbouringSelections = ( + allSelections: Selection[], + line: number, + ): Selection[] => { + // Merge selections if they're next to each other + const neighboringSelections = allSelections.filter( + s => s.start - 1 === line || s.end + 1 === line, + ); + if (neighboringSelections.length === 0) { + return allSelections; + } + const newSelection = { + start: Math.min(line, ...neighboringSelections.map(s => s.start)), + end: Math.max(line, ...neighboringSelections.map(s => s.end)), + }; + + return [ + ...allSelections.filter( + s => + !neighboringSelections.includes(s) && + !(s.start === line && s.end === line), + ), + newSelection, + ]; + }; + return { - shouldShowButton(line: number) { - return start === line || end === line; + shouldShowCopyButton(line: number) { + // show copy button at the beginning of each selection + return selections.some(s => s.start === line); }, isSelected(line: number) { - if (!sel) { + if (!selections) { return false; } - return start! <= line && line <= end!; + // check if line is in any selection range + return selections.some( + s => s.start <= line && (s.end ?? s.start) >= line, + ); }, - setSelection(line: number, add: boolean) { - if (add) { - setSelection(s => - s ? { start: s.start, end: line } : { start: line, end: line }, + setSelection(line: number, addRange: boolean, addNewSelection: boolean) { + setSelections(currentSelections => { + const clickedSelection = currentSelections.find( + s => s.start <= line && s.end >= line, ); - } else { - setSelection(s => - s?.start === line && s?.end === line - ? undefined - : { start: line, end: line }, + const otherSelections = currentSelections.filter( + s => s !== clickedSelection, ); - } + + if (!addRange && !addNewSelection) { + // Normal click -> select only this line if nothing or multiple lines are selected + if ( + !clickedSelection || + clickedSelection.start !== clickedSelection.end + ) { + return [{ start: line, end: line }]; + } + // Clear selection if single line is selected + return []; + } + + if (addRange) { + // Shift+click -> extend/reduce selection + if (currentSelections.length === 0) { + // No existing selection -> create new selection + return [{ start: line, end: line }]; + } + + if (clickedSelection) { + // Clicked inside an existing selection -> reduce selection + if (clickedSelection.start === clickedSelection.end) { + // Single line selection -> remove it + return otherSelections; + } + // Reduce selection + return [ + ...otherSelections, + { start: clickedSelection.start, end: line }, + ]; + } + + // Extend the closest selection to the new line + const closestSelection = findClosestSelection( + currentSelections, + line, + ); + if (!closestSelection) { + // Can't actually happen + return currentSelections; + } + if (closestSelection.start < line) { + // Add lines before the selection + return mergeNeighbouringSelections( + [ + ...otherSelections.filter(s => s !== closestSelection), + { start: closestSelection.start, end: line }, + ], + line, + ); + } + // Add lines after the selection + return mergeNeighbouringSelections( + [ + ...otherSelections.filter(s => s !== closestSelection), + { start: line, end: closestSelection!.end }, + ], + line, + ); + } + + if (addNewSelection) { + // Ctrl/Cmd+click -> add new selection + if (!clickedSelection) { + // Just add new selection + return mergeNeighbouringSelections( + [...currentSelections, { start: line, end: line }], + line, + ); + } + if (clickedSelection.start === clickedSelection.end) { + // Single line selection -> remove it + return otherSelections; + } + // Multi line selection -> split it + return [ + ...otherSelections, + ...(clickedSelection.start < line + ? [{ start: clickedSelection.start, end: line - 1 }] + : []), + ...(clickedSelection.end > line + ? [{ start: line + 1, end: clickedSelection.end }] + : []), + ]; + } + + return []; + }); }, - copySelection() { - if (sel) { - const copyText = lines - .slice(Math.min(sel.start, sel.end) - 1, Math.max(sel.start, sel.end)) - .map(l => l.chunks.map(c => c.text).join('')) - .join('\n'); - copyToClipboard(copyText); - setSelection(undefined); + copySelection(line: number) { + const selection = selections.find(s => s.start === line); + if (!selection) { + return; } + const copyText = lines + .slice(selection.start - 1, selection.end) + .map(l => l.chunks.map(c => c.text).join('')) + .join('\n'); + copyToClipboard(copyText); + }, + getHash() { + if (selections.length === 0) { + return ''; + } + const parts = selections.map(s => { + if (s.start === s.end) { + return `${s.start}`; + } + return `${s.start}-${s.end}`; + }); + return `#lines-${parts.join(',')}`; + }, + selectAll(hash: string) { + const match = hash.match(/#lines-([\d,-]+)/); + const s: Selection[] = []; + if (match) { + const ranges = match[1].split(','); + ranges.forEach(r => { + const [start, end] = r.split('-').map(Number); + s.push({ start, end: end ?? start }); + }); + } + setSelections(s); }, }; } From b834f86a53f0f66eae3a65d3d2801f45a7d02ad8 Mon Sep 17 00:00:00 2001 From: Katharina Sick Date: Mon, 10 Nov 2025 16:31:49 +0100 Subject: [PATCH 018/312] fix: fix logviewer selection behavior Signed-off-by: Katharina Sick --- packages/core-components/src/components/LogViewer/styles.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core-components/src/components/LogViewer/styles.ts b/packages/core-components/src/components/LogViewer/styles.ts index c093c43862..83fb3a84ad 100644 --- a/packages/core-components/src/components/LogViewer/styles.ts +++ b/packages/core-components/src/components/LogViewer/styles.ts @@ -103,7 +103,6 @@ export const useStyles = makeStyles( flexShrink: 0, color: colors.blue[300], borderRight: `1px solid ${colors.blue[700]}`, - userSelect: 'none', }, textHighlight: { background: alpha(theme.palette.info.main, 0.15), From de0f4eac21993a0e593a633cb29adfae6770b891 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Tue, 11 Nov 2025 06:08:09 +0000 Subject: [PATCH 019/312] ci: re-run checks Signed-off-by: Ayush More From 5c2b9a3653ad83afb3cf5f2597bf9092c736f39d Mon Sep 17 00:00:00 2001 From: Ayush More Date: Tue, 11 Nov 2025 16:08:23 +0000 Subject: [PATCH 020/312] fix: correct image path and format custom.css Signed-off-by: Ayush More --- docs/overview/what-is-backstage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/overview/what-is-backstage.md b/docs/overview/what-is-backstage.md index 669e4a43ee..618f08f0ce 100644 --- a/docs/overview/what-is-backstage.md +++ b/docs/overview/what-is-backstage.md @@ -39,7 +39,7 @@ Out of the box, Backstage includes: Backstage is a CNCF Incubation project after graduating from Sandbox. Read the announcement [here](https://backstage.io/blog/2022/03/16/backstage-turns-two#out-of-the-sandbox-and-into-incubation). - + ## Benefits From 82f0b156390cfb56364ec8874ce523ce3945c151 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Wed, 12 Nov 2025 10:57:29 +0530 Subject: [PATCH 021/312] Update custom.css Signed-off-by: Ayush More --- microsite/static/css/custom.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/microsite/static/css/custom.css b/microsite/static/css/custom.css index 198ccb2762..a2a63e2473 100644 --- a/microsite/static/css/custom.css +++ b/microsite/static/css/custom.css @@ -1350,7 +1350,3 @@ h3.collapsible span.arrow { text-align: center; } /* End of Utility API Styling */ - - - - From 87da464220fa7d88cf5d56ec181db160474ec864 Mon Sep 17 00:00:00 2001 From: Vidhan Shah Date: Wed, 12 Nov 2025 21:13:34 +0530 Subject: [PATCH 022/312] PR comments Signed-off-by: Vidhan Shah --- .../src/stages/publish/awsS3.test.ts | 74 +++++++++- .../techdocs-node/src/stages/publish/awsS3.ts | 134 ++++++++---------- 2 files changed, 133 insertions(+), 75 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index 52c57a9c25..98a2e7d09c 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -338,7 +338,13 @@ describe('AwsS3Publish', () => { const publisher = (await createPublisherFromConfig()) as AwsS3Publish; s3Mock .on(ListObjectsV2Command) - .rejectsOnce('RequestTimeout') + .rejectsOnce( + new S3ServiceException({ + name: 'RequestTimeout', + $fault: 'client', + $metadata: {}, + }), + ) .resolvesOnce({ Contents: [] }); await (publisher as any).retryOperation( @@ -376,11 +382,17 @@ describe('AwsS3Publish', () => { ); }); - it('should retry on specific 4xx errors', async () => { + it('should retry on specific 4xx errors that are transient', async () => { const publisher = (await createPublisherFromConfig()) as AwsS3Publish; s3Mock .on(ListObjectsV2Command) - .rejectsOnce('RequestTimeout') + .rejectsOnce( + new S3ServiceException({ + name: 'RequestTimeout', + $fault: 'client', + $metadata: { httpStatusCode: 408 }, + }), + ) .resolvesOnce({ Contents: [] }); await (publisher as any).retryOperation( @@ -416,6 +428,62 @@ describe('AwsS3Publish', () => { ), ).rejects.toHaveProperty('name', 'BadRequest'); }); + + it('should use exact error code matching for transient errors', async () => { + const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + // Test that ConnectionError (exact match) is retried, but ConnectionErrorSomething (substring) is not + s3Mock + .on(ListObjectsV2Command) + .rejectsOnce( + new S3ServiceException({ + name: 'ConnectionError', + $fault: 'client', + $metadata: {}, + }), + ) + .resolvesOnce({ Contents: [] }); + + await (publisher as any).retryOperation( + async () => { + return s3Mock.send( + new ListObjectsV2Command({ Bucket: 'bucketName' }), + ); + }, + 'TestOperation', + 3, + ); + }); + + it('should apply exponential backoff with correct calculation', async () => { + const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const startTime = Date.now(); + + s3Mock + .on(ListObjectsV2Command) + .rejectsOnce( + new S3ServiceException({ + name: 'SlowDown', + $fault: 'server', + $metadata: {}, + }), + ) + .resolvesOnce({ Contents: [] }); + + await (publisher as any).retryOperation( + async () => { + return s3Mock.send( + new ListObjectsV2Command({ Bucket: 'bucketName' }), + ); + }, + 'TestOperation', + 2, + ); + + const elapsedTime = Date.now() - startTime; + // First attempt fails, then backoff with baseDelay * 2^(attempt-1) = 1000 * 2^0 = 1000ms minimum + // Adding jitter (0-1000ms), so we expect at least 1000ms total + expect(elapsedTime).toBeGreaterThanOrEqual(900); + }); }); describe('getReadiness', () => { diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts index 67e9df59c5..76068ad935 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts @@ -187,20 +187,13 @@ export class AwsS3Publish implements PublisherBase { // Enhanced retry configuration for better reliability maxAttempts: maxAttempts || 5, retryMode: 'adaptive', - ...(httpsProxy && { - requestHandler: new NodeHttpHandler({ + // Enhanced connection settings for large file uploads + requestHandler: new NodeHttpHandler({ + ...(httpsProxy && { httpsAgent: new HttpsProxyAgent({ proxy: httpsProxy }), - // Enhanced connection setting for large file uploads - connectionTimeout: 60000, - socketTimeout: 120000, - }), - }), - // Add default request handler with enhanced timeouts if no proxy - ...(!httpsProxy && { - requestHandler: new NodeHttpHandler({ - connectionTimeout: 60000, - socketTimeout: 120000, }), + connectionTimeout: 60000, + socketTimeout: 120000, }), }); @@ -279,8 +272,9 @@ export class AwsS3Publish implements PublisherBase { operation: () => Promise, operationName: string, maxAttempts: number = 3, - shouldRetry: (error: S3ServiceException) => boolean = this - .defaultShouldRetry, + shouldRetry: ( + error: S3ServiceException, + ) => boolean = this.defaultShouldRetry.bind(this), ): Promise { for (let attempt = 1; attempt < maxAttempts; attempt++) { try { @@ -302,7 +296,10 @@ export class AwsS3Publish implements PublisherBase { // Enhanced exponential backoff with jitter const baseDelay = operationName.startsWith('Upload-') ? 2000 : 1000; - const backoffDelay = Math.min(baseDelay * Math.pow(2, attempt), 30000); + const backoffDelay = Math.min( + baseDelay * Math.pow(2, attempt - 1), + 30000, + ); const jitter = Math.random() * 1000; await new Promise(resolve => setTimeout(resolve, backoffDelay + jitter), @@ -348,8 +345,7 @@ export class AwsS3Publish implements PublisherBase { // Check against known transient errors return transientErrors.some( retriableError => - errorCode.includes(retriableError) || - error.message.includes(retriableError), + errorCode === retriableError || error.message.includes(retriableError), ); } @@ -462,68 +458,62 @@ export class AwsS3Publish implements PublisherBase { const stats = await fs.stat(absoluteFilePath); const fileSizeInBytes = stats.size; - // Use retry wrapper for uploads with enhanced error handling + // Check if this is a large file that requires multipart upload + if (fileSizeInBytes >= MAX_SINGLE_UPLOAD_BYTES) { + // Try multipart upload for large files + try { + const upload = new Upload({ + client: this.storageClient, + params, + partSize: MAX_SINGLE_UPLOAD_BYTES, + queueSize: 3, + leavePartsOnError: false, + }); + await this.retryOperation( + () => upload.done(), + `Upload-${params.Key}`, + this.maxAttempts, + ); + return; + } catch (multipartError) { + const s3Error = multipartError as any; + const errorName = s3Error?.name || 'Unknown'; + + // For specific multipart errors, attempt simple upload fallback + if (errorName === 'InvalidPart' || errorName === 'NoSuchUpload') { + this.logger.warn( + `Multipart upload failed for ${params.Key}, attempting simple upload fallback.`, + ); + } else { + // Non-recoverable multipart error, throw it + this.logger.error( + `Multipart upload failed for ${params.Key}: ${ + multipartError instanceof Error + ? multipartError.message + : String(multipartError) + }`, + ); + throw multipartError; + } + } + } + + // Use simple upload for small files or as fallback from multipart try { - const result = await this.retryOperation( - async () => { - const fiveMB = 5 * 1024 * 1024; - // For files smaller than 5MB, use simple PutObject to avoid multipart complexity - if (fileSizeInBytes < fiveMB) { - const fileContent = await fs.readFile(absoluteFilePath); - const putParams = { ...params, Body: fileContent }; - return this.storageClient.send( - new PutObjectCommand(putParams), - ); - } - // For files larger than MAX_SINGLE_UPLOAD_BYTES, use multipart upload - const upload = new Upload({ - client: this.storageClient, - params, - // Configure miltipart upload option for better reliability - partSize: MAX_SINGLE_UPLOAD_BYTES, - queueSize: 3, - leavePartsOnError: false, - }); - return upload.done(); - }, + const fileContent = await fs.readFile(absoluteFilePath); + const putParams = { ...params, Body: fileContent }; + await this.retryOperation( + () => this.storageClient.send(new PutObjectCommand(putParams)), `Upload-${params.Key}`, this.maxAttempts, ); - return result; - } catch (error) { - const s3Error = error as any; - const errorName = s3Error?.name || 'Unknown'; - // Check if this is a multipart upload failure that we can handle - if ( - fileSizeInBytes >= MAX_SINGLE_UPLOAD_BYTES && - (errorName === 'InvalidPart' || errorName === 'NoSuchUpload') - ) { - this.logger.warn( - `Multipart upload failed for ${params.Key}, Attempting simple upload fallback.`, + if (fileSizeInBytes >= MAX_SINGLE_UPLOAD_BYTES) { + this.logger.info( + `Simple upload fallback succeeded for ${params.Key}`, ); - try { - // Attempt simple upload as a fallback - const fileContent = await fs.readFile(absoluteFilePath); - const simpleParams = { ...params, Body: fileContent }; - const fallbackResult = await this.storageClient.send( - new PutObjectCommand(simpleParams), - ); - this.logger.info( - `Simple upload fallback succeeded for ${params.Key}`, - ); - return fallbackResult; - } catch (fallbackError) { - this.logger.error( - `Both multipart and simple upload failed for ${params.Key}: ${ - fallbackError instanceof Error - ? fallbackError.message - : String(fallbackError) - }`, - ); - // Fall through to throw original error - } } + } catch (error) { this.logger.error( `Upload failed for ${params.Key}: ${ error instanceof Error ? error.message : String(error) From f8957240e77deb32d2565e098fcecaad62308943 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Wed, 12 Nov 2025 22:30:34 +0530 Subject: [PATCH 023/312] Remove CNCF logo from what-is-backstage.md Removed the CNCF logo image from the Backstage overview document. Signed-off-by: Ayush More --- docs/overview/what-is-backstage.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/overview/what-is-backstage.md b/docs/overview/what-is-backstage.md index 618f08f0ce..e89aaeaa9d 100644 --- a/docs/overview/what-is-backstage.md +++ b/docs/overview/what-is-backstage.md @@ -39,7 +39,6 @@ Out of the box, Backstage includes: Backstage is a CNCF Incubation project after graduating from Sandbox. Read the announcement [here](https://backstage.io/blog/2022/03/16/backstage-turns-two#out-of-the-sandbox-and-into-incubation). - ## Benefits From 50582c17838d375d82a9faeea4760b1b110fbbcb Mon Sep 17 00:00:00 2001 From: coltMcKissick Date: Thu, 13 Nov 2025 11:53:15 -0500 Subject: [PATCH 024/312] fix: update owner picker to use lower case before filtering dropdown Signed-off-by: coltMcKissick --- .../src/components/EntityOwnerPicker/EntityOwnerPicker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx index 247a3784f4..cbfd20ad3e 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx @@ -221,7 +221,7 @@ export const EntityOwnerPicker = (props?: EntityOwnerPickerProps) => { }} name="owner-picker" onInputChange={(_e, inputValue) => { - setText(inputValue); + setText(inputValue.toLocaleLowerCase('en-US')); }} ListboxProps={{ onScroll: (e: MouseEvent) => { From 0f345fdb683b7db51947d41adcdc6ca6314abf2d Mon Sep 17 00:00:00 2001 From: coltMcKissick Date: Thu, 13 Nov 2025 16:32:54 -0500 Subject: [PATCH 025/312] test: added unit test to verify input populated drop down Signed-off-by: coltMcKissick --- .../EntityOwnerPicker.test.tsx | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx index b8c8e58d32..e89a3bcadd 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx @@ -362,6 +362,39 @@ describe('', () => { owners: new EntityOwnerFilter(['group:default/team-b']), }); }); + + it('calls fetch with lowercased input and displays results', async () => { + const updateFilters = jest.fn(); + await renderInTestApp( + + + + + , + ); + + expect(mockCatalogApi.getEntitiesByRefs).not.toHaveBeenCalled(); + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: undefined, + }); + + fireEvent.click(screen.getByTestId('owner-picker-expand')); + const input = screen.getByRole('textbox', { name: 'Owner' }); + fireEvent.change(input, { target: { value: 'Some-Owner' } }); + + await waitFor(() => + expect(screen.getByText('some-owner')).toBeInTheDocument(), + ); + + fireEvent.click(screen.getByText('some-owner')); + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: new EntityOwnerFilter(['group:default/some-owner']), + }); + }); }); describe('', () => { From 6d39141b50ca5bc2f6680f8751973dd42332cb57 Mon Sep 17 00:00:00 2001 From: coltMcKissick Date: Thu, 13 Nov 2025 16:47:48 -0500 Subject: [PATCH 026/312] chore: add changeset Signed-off-by: coltMcKissick --- .changeset/great-files-shave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/great-files-shave.md diff --git a/.changeset/great-files-shave.md b/.changeset/great-files-shave.md new file mode 100644 index 0000000000..8383f84cac --- /dev/null +++ b/.changeset/great-files-shave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Updated the entity owner picker to convert text to lower case before filtering owner options From 88bf79dc7a97513b41fdd4e2ea1381fc7214b43e Mon Sep 17 00:00:00 2001 From: Felipe Passini Date: Fri, 14 Nov 2025 14:50:43 -0300 Subject: [PATCH 027/312] Add plugin Conviso Platform Add plugin Conviso Platform Signed-off-by: Felipe Passini --- microsite/data/plugins/conviso-platform.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 microsite/data/plugins/conviso-platform.yaml diff --git a/microsite/data/plugins/conviso-platform.yaml b/microsite/data/plugins/conviso-platform.yaml new file mode 100644 index 0000000000..7017f74a3f --- /dev/null +++ b/microsite/data/plugins/conviso-platform.yaml @@ -0,0 +1,10 @@ +--- +title: Conviso Platform +author: Conviso Application Security +authorUrl: https://convisoappsec.com +category: Security +description: Import your Backstage catalog entities as security assets in Conviso Platform. +documentation: https://github.com/convisoappsec/backstage-plugin-conviso/blob/main/README.md +iconUrl: https://raw.githubusercontent.com/convisoappsec/backstage-plugin-conviso/main/assets/convisoappsec_logo.png +npmPackageName: 'backstage-plugin-conviso' +addedDate: '2025-11-14' From 00fa8dee6678c7d43dc530b5b7c82310a69b07a1 Mon Sep 17 00:00:00 2001 From: coltMcKissick Date: Fri, 14 Nov 2025 15:01:34 -0500 Subject: [PATCH 028/312] fix: set lowercase when passing to handle fetch, update unit test Signed-off-by: coltMcKissick --- .../EntityOwnerPicker.test.tsx | 42 ++++++++++++++++++- .../EntityOwnerPicker/EntityOwnerPicker.tsx | 8 +++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx index e89a3bcadd..e49d54b485 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx @@ -365,6 +365,37 @@ describe('', () => { it('calls fetch with lowercased input and displays results', async () => { const updateFilters = jest.fn(); + const someOwnerEntities: Entity[] = [ + { + apiVersion: '1', + kind: 'Group', + metadata: { + name: 'some-owner', + }, + }, + { + apiVersion: '1', + kind: 'Group', + metadata: { + name: 'some-owner-2', + }, + spec: { + profile: { + displayName: 'Some Owner 2', + }, + }, + }, + ]; + mockCatalogApi.queryEntities.mockImplementation(async _request => { + const totalItems = 2; + return { + items: someOwnerEntities, + pageInfo: { + nextCursor: '', + }, + totalItems, + }; + }); await renderInTestApp( ', () => { owners: undefined, }); - fireEvent.click(screen.getByTestId('owner-picker-expand')); - const input = screen.getByRole('textbox', { name: 'Owner' }); + // fireEvent.click(screen.getByTestId('owner-picker-expand')); + const input = screen.getByRole('textbox'); fireEvent.change(input, { target: { value: 'Some-Owner' } }); await waitFor(() => expect(screen.getByText('some-owner')).toBeInTheDocument(), ); + expect(mockCatalogApi.queryEntities).toHaveBeenLastCalledWith( + expect.objectContaining({ + fullTextFilter: expect.objectContaining({ + term: 'some-owner', + }), + }), + ); fireEvent.click(screen.getByText('some-owner')); expect(updateFilters).toHaveBeenLastCalledWith({ diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx index cbfd20ad3e..ed200c77c4 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx @@ -146,7 +146,11 @@ export const EntityOwnerPicker = (props?: EntityOwnerPickerProps) => { mode, initialSelectedOwnersRefs: selectedOwners, }); - useDebouncedEffect(() => handleFetch({ text }), [text, handleFetch], 250); + useDebouncedEffect( + () => handleFetch({ text: text.toLocaleLowerCase('en-US') }), + [text, handleFetch], + 250, + ); const availableOwners = value?.items || []; @@ -221,7 +225,7 @@ export const EntityOwnerPicker = (props?: EntityOwnerPickerProps) => { }} name="owner-picker" onInputChange={(_e, inputValue) => { - setText(inputValue.toLocaleLowerCase('en-US')); + setText(inputValue); }} ListboxProps={{ onScroll: (e: MouseEvent) => { From 3acce8c96973dfda46597cfd2209233e58b9d919 Mon Sep 17 00:00:00 2001 From: ElaineDeMattosSilvaB Date: Sat, 15 Nov 2025 07:56:41 +0100 Subject: [PATCH 029/312] fix(cli): add react-dom to peer and dev dependencies in frontend plugin template Signed-off-by: ElaineDeMattosSilvaB --- packages/cli/templates/frontend-plugin/package.json.hbs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/cli/templates/frontend-plugin/package.json.hbs b/packages/cli/templates/frontend-plugin/package.json.hbs index 1ee8231228..fe74e0e19c 100644 --- a/packages/cli/templates/frontend-plugin/package.json.hbs +++ b/packages/cli/templates/frontend-plugin/package.json.hbs @@ -31,7 +31,8 @@ "react-use": "{{versionQuery 'react-use' '17.2.4'}}" }, "peerDependencies": { - "react": "{{versionQuery 'react' '^16.13.1 || ^17.0.0 || ^18.0.0'}}" + "react": "{{versionQuery 'react' '^16.13.1 || ^17.0.0 || ^18.0.0'}}", + "react-dom": "{{versionQuery 'react-dom' '^16.13.1 || ^17.0.0 || ^18.0.0'}}" }, "devDependencies": { "@backstage/cli": "{{versionQuery '@backstage/cli'}}", @@ -42,7 +43,9 @@ "@testing-library/react": "{{versionQuery '@testing-library/react' '14.0.0'}}", "@testing-library/user-event": "{{versionQuery '@testing-library/user-event' '14.0.0'}}", "msw": "{{versionQuery 'msw' '1.0.0'}}", - "react": "{{versionQuery 'react' '^16.13.1 || ^17.0.0 || ^18.0.0'}}" + "react": "{{versionQuery 'react' '^16.13.1 || ^17.0.0 || ^18.0.0'}}", + "react-dom": "{{versionQuery 'react-dom' '^16.13.1 || ^17.0.0 || ^18.0.0'}}", + "react-router-dom": "{{versionQuery 'react-router-dom' '^6.0.0'}}" }, "files": [ "dist" From e7db2904fdeced469b245ef546eb28093d431bec Mon Sep 17 00:00:00 2001 From: ElaineDeMattosSilvaB Date: Sat, 15 Nov 2025 08:01:40 +0100 Subject: [PATCH 030/312] fix: add changeset Signed-off-by: ElaineDeMattosSilvaB --- .changeset/early-carpets-rush.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .changeset/early-carpets-rush.md diff --git a/.changeset/early-carpets-rush.md b/.changeset/early-carpets-rush.md new file mode 100644 index 0000000000..a0851aef93 --- /dev/null +++ b/.changeset/early-carpets-rush.md @@ -0,0 +1,16 @@ +--- +'@backstage/cli': patch +--- + +Add missing peer/dev dependencies to the frontend plugin template. + +`react-dom` was not declared as a peer dependency, causing module resolution +errors when generating plugins outside a Backstage monorepo. This adds +`react-dom` to `peerDependencies` (for consuming apps) and `devDependencies` +(for local development). `react-router-dom` is also added to `devDependencies` +to support routing during plugin development. + +Fixes: + +- Module not found: Can't resolve 'react-dom' +- Module not found: Can't resolve 'react-router-dom' From a907203f7e585fa55b1945c88acc02653caffdc5 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Mon, 17 Nov 2025 06:03:42 +0000 Subject: [PATCH 031/312] style: format docs with prettier Signed-off-by: Ayush More --- docs/overview/what-is-backstage.md | 1 - microsite/static/img/cncf-stacked-color.svg | 1 - 2 files changed, 2 deletions(-) delete mode 100644 microsite/static/img/cncf-stacked-color.svg diff --git a/docs/overview/what-is-backstage.md b/docs/overview/what-is-backstage.md index e89aaeaa9d..024bea8f81 100644 --- a/docs/overview/what-is-backstage.md +++ b/docs/overview/what-is-backstage.md @@ -39,7 +39,6 @@ Out of the box, Backstage includes: Backstage is a CNCF Incubation project after graduating from Sandbox. Read the announcement [here](https://backstage.io/blog/2022/03/16/backstage-turns-two#out-of-the-sandbox-and-into-incubation). - ## Benefits - For _engineering managers_, it allows you to maintain standards and best diff --git a/microsite/static/img/cncf-stacked-color.svg b/microsite/static/img/cncf-stacked-color.svg deleted file mode 100644 index 08abd314cc..0000000000 --- a/microsite/static/img/cncf-stacked-color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From f0066306faa6fc38384dc4d0bc648f5bff732576 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 09:57:01 +0000 Subject: [PATCH 032/312] chore(deps): update dependency @uiw/codemirror-themes to v4.25.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 644a9c5f60..955443849c 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -1618,8 +1618,8 @@ __metadata: linkType: hard "@uiw/codemirror-themes@npm:^4.23.7": - version: 4.25.1 - resolution: "@uiw/codemirror-themes@npm:4.25.1" + version: 4.25.3 + resolution: "@uiw/codemirror-themes@npm:4.25.3" dependencies: "@codemirror/language": "npm:^6.0.0" "@codemirror/state": "npm:^6.0.0" @@ -1628,7 +1628,7 @@ __metadata: "@codemirror/language": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: 10/337316f7c15a57bca4824498769448e38861197ab3d73b3bc58b2193028751c525a175af06f1f3984fd25b001f990e1d30ce442ddc756642698d9f8adff7f95a + checksum: 10/f808ac3c4763f623ed6ea6215cc1421bb87234e0a05e7b6d9e917ab304fc6a4977c238996ca538e22093af8136c02bb27512aeeac653cb8fe82b4917ba1668a3 languageName: node linkType: hard From 5e81a860b591cbc54dccea36de1864e1734e26a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:02:53 +0000 Subject: [PATCH 033/312] chore(deps): update dependency docusaurus-plugin-openapi-docs to v4.5.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 20c3f39fbd..ab99ddfcc3 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -5914,8 +5914,8 @@ __metadata: linkType: hard "docusaurus-plugin-openapi-docs@npm:^4.3.0": - version: 4.3.7 - resolution: "docusaurus-plugin-openapi-docs@npm:4.3.7" + version: 4.5.1 + resolution: "docusaurus-plugin-openapi-docs@npm:4.5.1" dependencies: "@apidevtools/json-schema-ref-parser": "npm:^11.5.4" "@redocly/openapi-core": "npm:^1.10.5" @@ -5937,7 +5937,7 @@ __metadata: "@docusaurus/utils": ^3.5.0 "@docusaurus/utils-validation": ^3.5.0 react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10/ad011358b13fd5e574e33ad3e1b2bb002226e2dcab72e6a8c98c4ad5436a81e28815afe6f14252a48bb52f0c088b03dfd93a5955a8a6883fbda794bebf7d1792 + checksum: 10/496ce49d494f06803a61eaa6c6810782668269574c12a1a55315742974884a7ffd6e2c75875d8fd9909611bdccaa4de42419e0debbf47def0db6974617b9e5ba languageName: node linkType: hard From 7ed0dc11588bb527a89014a7eb6033c61731f8f6 Mon Sep 17 00:00:00 2001 From: ElaineDeMattosSilvaB Date: Tue, 18 Nov 2025 20:39:33 +0100 Subject: [PATCH 034/312] feat: add dbsystel as adopter Signed-off-by: ElaineDeMattosSilvaB --- ADOPTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index 208cd370ba..e0a114d8c8 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -287,3 +287,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Syngenta Digital](https://www.syngentadigital.com) | [Bitan Mallick](https://www.linkedin.com/in/bitanmallick) | Internal developer portal, designed to empower developers and streamline workflows. We use software catalog, tech-radar, software templates, tech-docs and various custom plugins to ensure an efficient and collaborative development experience. | | [Sophotech](https://sopho.tech) | [@archy-rock3t-cloud](https://github.com/archy-rock3t-cloud), [Artem Muterko](mailto:artem@sopho.tech) | Custom Developer Platform based on Backstage, providing a service catalog, infrastructure templates, and integrated tooling to give developers a self-service experience. | | [Swiss Mobiliar Insurance Company Ltd.](https://www.mobiliar.ch/) | [Patrick Wyler](mailto:patrick.wyler@mobiliar.ch) and [Beat Winistörfer](mailto:beat.winistoerfer@mobiliar.ch) | The portal provides a unified interface for accessing all relevant DevOps information previously scattered across various locations, enhancing accessibility and clarity for all IT employees. It relies on an internal graph database that enhances the Backstage software catalog with many additional elements. Significant effort has been invested in the visual representation of information through graphs and diagrams, facilitating analysis and improving the understanding of dependencies. | +| [DB Systel](https://www.dbsystel.de/dbsystel-en/) | [DB Systel](https://github.com/dbsystel) | Deutsche Bahn's Internal Developer Portal leverages Backstage and Crossplane.io to deliver a fully GitOps-driven onboarding experience for engineering teams across the company. Our Scaffolder ecosystem accelerates platform setup (Artifactory, GitLab, OpenShift), service bootstrapping, automated testing, AI-ready backends, and modern frontend development. We also make heavy use of custom catalog modules and frontend plugins that support developers in checking their provisioned resources or security and compliance of their code. | From e7f2028de9d68d281fa41ad6367e60299110a8a4 Mon Sep 17 00:00:00 2001 From: Ayush More Date: Wed, 19 Nov 2025 19:46:11 +0530 Subject: [PATCH 035/312] Add cncf-white.svg image file Signed-off-by: Ayush More --- microsite/static/img/{cncf-stacked-white.svg => cncf-white.svg} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename microsite/static/img/{cncf-stacked-white.svg => cncf-white.svg} (99%) diff --git a/microsite/static/img/cncf-stacked-white.svg b/microsite/static/img/cncf-white.svg similarity index 99% rename from microsite/static/img/cncf-stacked-white.svg rename to microsite/static/img/cncf-white.svg index c5e3b2af9a..652249b8d8 100644 --- a/microsite/static/img/cncf-stacked-white.svg +++ b/microsite/static/img/cncf-white.svg @@ -1 +1 @@ - \ No newline at end of file + From b0ff0d25798c219c4e3e31050250d69fdddaa509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Tue, 7 Oct 2025 14:47:42 +0300 Subject: [PATCH 036/312] Introduce new option in the GH catalog plugin to exclude suspended users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce an optional setting to exclude suspended users from GitHub Enterprise instances. When it’s set to true, suspended users won’t be emitted by the default transform. If a custom transformer is used, it should check if the property `suspendedAt` from the `GithubUser` is defined, in order to exclude such users. This logic was not introduced in the `GithubMultiOrgReaderProcessor.ts`, since the usage there is marked as deprecated. To note that this setting should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, adding it will cause a schema validation error and the syncing of users will fail. Signed-off-by: Valério Valério --- .../src/module.ts | 4 ++++ plugins/catalog-backend-module-github/config.d.ts | 14 ++++++++++++++ .../src/lib/defaultTransformers.ts | 3 +++ .../src/lib/github.ts | 4 ++++ .../processors/GithubMultiOrgReaderProcessor.ts | 1 + .../src/providers/GithubMultiOrgEntityProvider.ts | 13 +++++++++++++ .../src/providers/GithubOrgEntityProvider.ts | 13 +++++++++++++ 7 files changed, 52 insertions(+) diff --git a/plugins/catalog-backend-module-github-org/src/module.ts b/plugins/catalog-backend-module-github-org/src/module.ts index 2d349cb873..e6179e07f1 100644 --- a/plugins/catalog-backend-module-github-org/src/module.ts +++ b/plugins/catalog-backend-module-github-org/src/module.ts @@ -121,6 +121,7 @@ export const catalogModuleGithubOrgEntityProvider = createBackendModule({ alwaysUseDefaultNamespace: definitions.length === 1 && definition.orgs?.length === 1, pageSizes: definition.pageSizes, + excludeSuspendedUsers: definition.excludeSuspendedUsers, }), ); } @@ -133,6 +134,7 @@ function readDefinitionsFromConfig(rootConfig: Config): Array<{ id: string; githubUrl: string; orgs?: string[]; + excludeSuspendedUsers?: boolean; schedule: SchedulerServiceTaskScheduleDefinition; pageSizes?: { teams?: number; @@ -154,6 +156,8 @@ function readDefinitionsFromConfig(rootConfig: Config): Array<{ id: c.getString('id'), githubUrl: c.getString('githubUrl'), orgs: c.getOptionalStringArray('orgs'), + excludeSuspendedUsers: + c.getOptionalBoolean('excludeSuspendedUsers') ?? false, schedule: readSchedulerServiceTaskScheduleDefinitionFromConfig( c.getConfig('schedule'), ), diff --git a/plugins/catalog-backend-module-github/config.d.ts b/plugins/catalog-backend-module-github/config.d.ts index f3cbb15e06..6277f7aa2e 100644 --- a/plugins/catalog-backend-module-github/config.d.ts +++ b/plugins/catalog-backend-module-github/config.d.ts @@ -264,6 +264,13 @@ export interface Config { */ orgs?: string[]; + /** + * (Optional) Only for GitHub Enterprise. Whether to exclude suspended users when querying organization users. + * If true, the defaultTransformer will not return suspended users. + * Default: `false`. + */ + excludeSuspendedUsers?: boolean; + /** * The refresh schedule to use. */ @@ -315,6 +322,13 @@ export interface Config { */ orgs?: string[]; + /** + * (Optional) Only for GitHub Enterprise. Whether to exclude suspended users when querying organization users. + * If true, the defaultTransformer will not return suspended users. + * Default: `false`. + */ + excludeSuspendedUsers?: boolean; + /** * The refresh schedule to use. */ diff --git a/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts index 6befd32056..02f5052ae1 100644 --- a/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts +++ b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts @@ -62,6 +62,9 @@ export const defaultUserTransformer = async ( item: GithubUser, _ctx: TransformerContext, ): Promise => { + if (item.suspendedAt) { + return undefined; + } const entity: UserEntity = { apiVersion: 'backstage.io/v1alpha1', kind: 'User', diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts index 625fb57bba..b614b4be64 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.ts @@ -117,6 +117,7 @@ export type GithubUser = { email?: string; name?: string; organizationVerifiedDomainEmails?: string[]; + suspendedAt?: string; }; /** @@ -186,9 +187,11 @@ export async function getOrganizationUsers( client: typeof graphql, org: string, tokenType: GithubCredentialType, + excludeSuspendedUsers: boolean = false, userTransformer: UserTransformer = defaultUserTransformer, pageSizes: GithubPageSizes = DEFAULT_PAGE_SIZES, ): Promise<{ users: Entity[] }> { + const suspendedAtField = excludeSuspendedUsers ? 'suspendedAt,' : ''; const query = ` query users($org: String!, $email: Boolean!, $cursor: String, $organizationMembersPageSize: Int!) { organization(login: $org) { @@ -200,6 +203,7 @@ export async function getOrganizationUsers( email @include(if: $email), login, name, + ${suspendedAtField} organizationVerifiedDomainEmails(login: $org) } } diff --git a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts index 8af528dfcf..058ce2cb6c 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts @@ -148,6 +148,7 @@ export class GithubMultiOrgReaderProcessor implements CatalogProcessor { client, orgConfig.name, tokenType, + false, async (githubUser, ctx): Promise => { const result = this.options.userTransformer ? await this.options.userTransformer(githubUser, ctx) diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts index 839ca66e40..bb0dd84c6f 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts @@ -174,6 +174,14 @@ export interface GithubMultiOrgEntityProviderOptions { * Reduce these values if hitting RESOURCE_LIMITS_EXCEEDED errors. */ pageSizes?: Partial; + + /** + * Optionally exclude suspended users when querying organization users. + * @defaultValue false + * @remarks + * Only for GitHub Enterprise instances. Will error if used against GitHub.com API. + */ + excludeSuspendedUsers?: boolean; } type CreateDeltaOperation = (entities: Entity[]) => { @@ -221,6 +229,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { events: options.events, alwaysUseDefaultNamespace: options.alwaysUseDefaultNamespace, pageSizes: options.pageSizes, + excludeSuspendedUsers: options.excludeSuspendedUsers, }); provider.schedule(options.schedule); @@ -241,6 +250,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { teamTransformer?: TeamTransformer; alwaysUseDefaultNamespace?: boolean; pageSizes?: Partial; + excludeSuspendedUsers?: boolean; }, ) {} @@ -304,6 +314,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { client, org, tokenType, + this.options.excludeSuspendedUsers, this.options.userTransformer, pageSizes, ); @@ -456,6 +467,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { client, org, tokenType, + this.options.excludeSuspendedUsers, this.options.userTransformer, pageSizes, ); @@ -690,6 +702,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { client, org, tokenType, + this.options.excludeSuspendedUsers, this.options.userTransformer, pageSizes, ); diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts index 6dfa8a07f8..31b6dc338b 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts @@ -130,6 +130,14 @@ export interface GithubOrgEntityProviderOptions { * Optionally include a team transformer for transforming from GitHub teams to Group Entities */ teamTransformer?: TeamTransformer; + + /** + * Optionally exclude suspended users when querying organization users. + * @defaultValue false + * @remarks + * Only for GitHub Enterprise instances. Will error if used against GitHub.com API. + */ + excludeSuspendedUsers?: boolean; } /** @@ -167,6 +175,7 @@ export class GithubOrgEntityProvider implements EntityProvider { userTransformer: options.userTransformer, teamTransformer: options.teamTransformer, events: options.events, + excludeSuspendedUsers: options.excludeSuspendedUsers, }); provider.schedule(options.schedule); @@ -184,6 +193,7 @@ export class GithubOrgEntityProvider implements EntityProvider { githubCredentialsProvider?: GithubCredentialsProvider; userTransformer?: UserTransformer; teamTransformer?: TeamTransformer; + excludeSuspendedUsers?: boolean; }, ) { this.credentialsProvider = @@ -235,6 +245,7 @@ export class GithubOrgEntityProvider implements EntityProvider { client, org, tokenType, + this.options.excludeSuspendedUsers, this.options.userTransformer, ); const { teams } = await getOrganizationTeams( @@ -363,6 +374,7 @@ export class GithubOrgEntityProvider implements EntityProvider { client, org, tokenType, + this.options.excludeSuspendedUsers, this.options.userTransformer, ); @@ -454,6 +466,7 @@ export class GithubOrgEntityProvider implements EntityProvider { client, org, tokenType, + this.options.excludeSuspendedUsers, this.options.userTransformer, ); From 70666ee784c0e775bc5c85a48393b02ed7028fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Tue, 7 Oct 2025 15:30:46 +0300 Subject: [PATCH 037/312] Add test cases for the GitHub getOrganizationUsers call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valério Valério --- .../src/lib/github.test.ts | 113 +++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-backend-module-github/src/lib/github.test.ts b/plugins/catalog-backend-module-github/src/lib/github.test.ts index ca9b3eb692..2af60d2bb1 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.test.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.test.ts @@ -166,6 +166,54 @@ describe('github', () => { getOrganizationUsers(graphql, 'a', 'token'), ).resolves.toEqual(output); }); + + it('reads members excluding suspended users', async () => { + const input: QueryResponse = { + organization: { + membersWithRole: { + pageInfo: { hasNextPage: false }, + nodes: [ + { + login: 'a', + name: 'b', + bio: 'c', + email: 'd', + avatarUrl: 'e', + suspendedAt: '2025-01-01', + }, + { + login: 'a', + name: 'b', + bio: 'c', + email: 'd', + avatarUrl: 'e', + suspendedAt: undefined, + }, + ], + }, + }, + }; + + const output = { + users: [ + expect.objectContaining({ + metadata: expect.objectContaining({ name: 'a', description: 'c' }), + spec: { + profile: { displayName: 'b', email: 'd', picture: 'e' }, + memberOf: [], + }, + }), + ], + }; + + server.use( + graphqlMsw.query('users', () => HttpResponse.json({ data: input })), + ); + + await expect( + getOrganizationUsers(graphql, 'a', 'token', true), + ).resolves.toEqual(output); + }); }); describe('getOrganizationUsers using custom UserTransformer', () => { @@ -226,7 +274,13 @@ describe('github', () => { ); await expect( - getOrganizationUsers(graphql, 'a', 'token', customUserTransformer), + getOrganizationUsers( + graphql, + 'a', + 'token', + false, + customUserTransformer, + ), ).resolves.toEqual(output); }); @@ -273,12 +327,69 @@ describe('github', () => { graphql, 'a', 'token', + false, customUserTransformer, ); expect(users.users).toHaveLength(1); expect(users).toEqual(output); }); + + it('reads members including suspended users', async () => { + const input: QueryResponse = { + organization: { + membersWithRole: { + pageInfo: { hasNextPage: false }, + nodes: [ + { + login: 'a', + name: 'b', + bio: 'c', + email: 'd', + avatarUrl: 'e', + }, + { + login: 'ab', + name: 'bb', + bio: 'cc', + email: 'dd', + avatarUrl: 'ee', + suspendedAt: '2025-01-01', + }, + ], + }, + }, + }; + + const output = { + users: [ + expect.objectContaining({ + metadata: expect.objectContaining({ + name: 'a-custom', + }), + }), + expect.objectContaining({ + metadata: expect.objectContaining({ + name: 'ab-custom', + }), + }), + ], + }; + + server.use( + graphqlMsw.query('users', () => HttpResponse.json({ data: input })), + ); + + await expect( + getOrganizationUsers( + graphql, + 'a', + 'token', + true, + customUserTransformer, + ), + ).resolves.toEqual(output); + }); }); describe('getOrganizationTeams using default TeamTransformer', () => { From 9d72ca9250fc6ec535d550e7fe2870678b94b8cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Tue, 7 Oct 2025 15:52:23 +0300 Subject: [PATCH 038/312] Generate API report MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valério Valério --- .../report.api.md | 5 +++++ .../src/lib/github.test.ts | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/plugins/catalog-backend-module-github/report.api.md b/plugins/catalog-backend-module-github/report.api.md index 016bb6da65..5f140a0d5e 100644 --- a/plugins/catalog-backend-module-github/report.api.md +++ b/plugins/catalog-backend-module-github/report.api.md @@ -151,6 +151,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { teamTransformer?: TeamTransformer; alwaysUseDefaultNamespace?: boolean; pageSizes?: Partial; + excludeSuspendedUsers?: boolean; }); connect(connection: EntityProviderConnection): Promise; // (undocumented) @@ -166,6 +167,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { export interface GithubMultiOrgEntityProviderOptions { alwaysUseDefaultNamespace?: boolean; events?: EventsService; + excludeSuspendedUsers?: boolean; githubCredentialsProvider?: GithubCredentialsProvider; githubUrl: string; id: string; @@ -227,6 +229,7 @@ export class GithubOrgEntityProvider implements EntityProvider { githubCredentialsProvider?: GithubCredentialsProvider; userTransformer?: UserTransformer; teamTransformer?: TeamTransformer; + excludeSuspendedUsers?: boolean; }); connect(connection: EntityProviderConnection): Promise; // (undocumented) @@ -244,6 +247,7 @@ export type GitHubOrgEntityProviderOptions = GithubOrgEntityProviderOptions; // @public export interface GithubOrgEntityProviderOptions { events?: EventsService; + excludeSuspendedUsers?: boolean; githubCredentialsProvider?: GithubCredentialsProvider; id: string; logger: LoggerService; @@ -306,6 +310,7 @@ export type GithubUser = { email?: string; name?: string; organizationVerifiedDomainEmails?: string[]; + suspendedAt?: string; }; // @public diff --git a/plugins/catalog-backend-module-github/src/lib/github.test.ts b/plugins/catalog-backend-module-github/src/lib/github.test.ts index 2af60d2bb1..fc4fdb14da 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.test.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.test.ts @@ -1044,12 +1044,19 @@ describe('github', () => { }), ); - await getOrganizationUsers(graphql as any, org, 'token', undefined, { - teams: 10, - teamMembers: 20, - organizationMembers: 30, - repositories: 10, - }); + await getOrganizationUsers( + graphql as any, + org, + 'token', + false, + undefined, + { + teams: 10, + teamMembers: 20, + organizationMembers: 30, + repositories: 10, + }, + ); }); it('uses custom page sizes for getOrganizationRepositories', async () => { From 35c23e5463e03b67b028e6cca6f05f3847ce137f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Tue, 7 Oct 2025 16:05:05 +0300 Subject: [PATCH 039/312] Update documentation to list the new option 'excludeSuspendedUsers' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valério Valério --- docs/integrations/github/org.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index 6526183f2d..cfc71d3e5a 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -90,6 +90,7 @@ catalog: initialDelay: { seconds: 30 } frequency: { hours: 1 } timeout: { minutes: 50 } + excludeSuspendedUsers: true ``` Directly under the `githubOrg` is a list of configurations, each entry is a structure with the following elements: @@ -98,6 +99,7 @@ Directly under the `githubOrg` is a list of configurations, each entry is a stru - `githubUrl`: The target that this provider should consume - `orgs` (optional): The list of the GitHub orgs to consume. If you only list a single org the generated group entities will use the `default` namespace, otherwise they will use the org name as the namespace. By default the provider will consume all accessible orgs on the given GitHub instance (support for GitHub App integration only). - `schedule`: The refresh schedule to use, matches the structure of [`SchedulerServiceTaskScheduleDefinitionConfig`](https://backstage.io/docs/reference/backend-plugin-api.schedulerservicetaskscheduledefinitionconfig/) +<<<<<<< HEAD - `pageSizes` (optional): Configure page sizes for GitHub GraphQL API queries to prevent `RESOURCE_LIMITS_EXCEEDED` errors. You can configure the following page sizes: - `teams`: Number of teams to fetch per page when querying organization teams (default: 25) @@ -105,6 +107,9 @@ Directly under the `githubOrg` is a list of configurations, each entry is a stru - `organizationMembers`: Number of organization members to fetch per page (default: 50) Reducing page sizes will result in more API calls and slightly longer sync times, but will prevent API resource limits for organizations with large number of teams and members. +======= +- `excludeSuspendedUsers` (optional): Whether to exclude suspended users when querying organization users. Only for GitHub Enterprise instances. Will error if used against GitHub.com API. +>>>>>>> 40785ff87c (Update documentation to list the new option 'excludeSuspendedUsers') ### Events Support From ed5a7a3ef38a5e7d2c05b10899958ed92768c9db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Tue, 7 Oct 2025 16:19:36 +0300 Subject: [PATCH 040/312] Add changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valério Valério --- .changeset/fuzzy-phones-own.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/fuzzy-phones-own.md diff --git a/.changeset/fuzzy-phones-own.md b/.changeset/fuzzy-phones-own.md new file mode 100644 index 0000000000..a980bcffba --- /dev/null +++ b/.changeset/fuzzy-phones-own.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-catalog-backend-module-github-org': minor +'@backstage/plugin-catalog-backend-module-github': minor +--- + +Introduce new configuration option to exclude suspended users from GitHub Enterprise instances. + +When it’s set to true, suspended users won’t be emitted by the default transform. +Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail. From bad559c1f9ae96382cd321d22b0c810e6eca4211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Tue, 21 Oct 2025 13:31:17 +0300 Subject: [PATCH 041/312] Move the suspended user logic to a transformer filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valério Valério --- .changeset/fuzzy-phones-own.md | 2 +- docs/integrations/github/org.md | 4 +--- plugins/catalog-backend-module-github/config.d.ts | 2 -- .../src/lib/defaultTransformers.ts | 3 --- .../src/lib/github.test.ts | 2 +- .../catalog-backend-module-github/src/lib/github.ts | 13 ++++++++++++- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/.changeset/fuzzy-phones-own.md b/.changeset/fuzzy-phones-own.md index a980bcffba..69a40e29b2 100644 --- a/.changeset/fuzzy-phones-own.md +++ b/.changeset/fuzzy-phones-own.md @@ -5,5 +5,5 @@ Introduce new configuration option to exclude suspended users from GitHub Enterprise instances. -When it’s set to true, suspended users won’t be emitted by the default transform. +When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances. Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail. diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index cfc71d3e5a..284451af8c 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -99,7 +99,6 @@ Directly under the `githubOrg` is a list of configurations, each entry is a stru - `githubUrl`: The target that this provider should consume - `orgs` (optional): The list of the GitHub orgs to consume. If you only list a single org the generated group entities will use the `default` namespace, otherwise they will use the org name as the namespace. By default the provider will consume all accessible orgs on the given GitHub instance (support for GitHub App integration only). - `schedule`: The refresh schedule to use, matches the structure of [`SchedulerServiceTaskScheduleDefinitionConfig`](https://backstage.io/docs/reference/backend-plugin-api.schedulerservicetaskscheduledefinitionconfig/) -<<<<<<< HEAD - `pageSizes` (optional): Configure page sizes for GitHub GraphQL API queries to prevent `RESOURCE_LIMITS_EXCEEDED` errors. You can configure the following page sizes: - `teams`: Number of teams to fetch per page when querying organization teams (default: 25) @@ -107,9 +106,8 @@ Directly under the `githubOrg` is a list of configurations, each entry is a stru - `organizationMembers`: Number of organization members to fetch per page (default: 50) Reducing page sizes will result in more API calls and slightly longer sync times, but will prevent API resource limits for organizations with large number of teams and members. -======= + - `excludeSuspendedUsers` (optional): Whether to exclude suspended users when querying organization users. Only for GitHub Enterprise instances. Will error if used against GitHub.com API. ->>>>>>> 40785ff87c (Update documentation to list the new option 'excludeSuspendedUsers') ### Events Support diff --git a/plugins/catalog-backend-module-github/config.d.ts b/plugins/catalog-backend-module-github/config.d.ts index 6277f7aa2e..5425cae9d0 100644 --- a/plugins/catalog-backend-module-github/config.d.ts +++ b/plugins/catalog-backend-module-github/config.d.ts @@ -266,7 +266,6 @@ export interface Config { /** * (Optional) Only for GitHub Enterprise. Whether to exclude suspended users when querying organization users. - * If true, the defaultTransformer will not return suspended users. * Default: `false`. */ excludeSuspendedUsers?: boolean; @@ -324,7 +323,6 @@ export interface Config { /** * (Optional) Only for GitHub Enterprise. Whether to exclude suspended users when querying organization users. - * If true, the defaultTransformer will not return suspended users. * Default: `false`. */ excludeSuspendedUsers?: boolean; diff --git a/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts index 02f5052ae1..6befd32056 100644 --- a/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts +++ b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts @@ -62,9 +62,6 @@ export const defaultUserTransformer = async ( item: GithubUser, _ctx: TransformerContext, ): Promise => { - if (item.suspendedAt) { - return undefined; - } const entity: UserEntity = { apiVersion: 'backstage.io/v1alpha1', kind: 'User', diff --git a/plugins/catalog-backend-module-github/src/lib/github.test.ts b/plugins/catalog-backend-module-github/src/lib/github.test.ts index fc4fdb14da..3cfb1b523a 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.test.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.test.ts @@ -385,7 +385,7 @@ describe('github', () => { graphql, 'a', 'token', - true, + false, customUserTransformer, ), ).resolves.toEqual(output); diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts index b614b4be64..7f2fd0e08b 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.ts @@ -210,6 +210,17 @@ export async function getOrganizationUsers( } }`; + // Transformer to filter out suspended users, only for GitHub Enterprise instances. + const suspendedUserFilteringTransformer = async ( + item: GithubUser, + ctx: TransformerContext, + ): Promise => { + if (excludeSuspendedUsers && item.suspendedAt) { + return undefined; + } + return userTransformer(item, ctx); + }; + // There is no user -> teams edge, so we leave the memberships empty for // now and let the team iteration handle it instead @@ -218,7 +229,7 @@ export async function getOrganizationUsers( query, org, r => r.organization?.membersWithRole, - userTransformer, + suspendedUserFilteringTransformer, { org, email: tokenType === 'token', From 762985b0df5a053e2952d19c6e547035c5ccf45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Wed, 19 Nov 2025 19:58:43 +0200 Subject: [PATCH 042/312] Fix Vale check failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valério Valério --- .changeset/short-cloths-tie.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/short-cloths-tie.md b/.changeset/short-cloths-tie.md index 90b84af830..409d12c480 100644 --- a/.changeset/short-cloths-tie.md +++ b/.changeset/short-cloths-tie.md @@ -2,4 +2,4 @@ '@backstage/backend-defaults': minor --- -Don't warn when parsing storeOptions for 'memory' cache +Don't warn when parsing 'storeOptions' for 'memory' cache From 7ef8c8a7d44f85a15ef1114f49ec82e6d2fb1462 Mon Sep 17 00:00:00 2001 From: Colt McKissick Date: Wed, 19 Nov 2025 19:30:49 -0500 Subject: [PATCH 043/312] Update .changeset/great-files-shave.md Co-authored-by: Vincenzo Scamporlino Signed-off-by: Colt McKissick --- .changeset/great-files-shave.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/great-files-shave.md b/.changeset/great-files-shave.md index 8383f84cac..271a8e8955 100644 --- a/.changeset/great-files-shave.md +++ b/.changeset/great-files-shave.md @@ -2,4 +2,4 @@ '@backstage/plugin-catalog-react': patch --- -Updated the entity owner picker to convert text to lower case before filtering owner options +Fixed an issue where `EntityOwnerPicker` failed to filter options when the input text contained uppercase characters. From 91aa24e19d72bfdd0ef0770452aaaa94c49adadb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:29:37 +0000 Subject: [PATCH 044/312] chore(deps): update dependency @codemirror/view to v6.38.8 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/yarn.lock | 6 +++--- yarn.lock | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index a9e9b97305..cf5837a090 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -179,14 +179,14 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.34.4, @codemirror/view@npm:^6.35.0": - version: 6.38.6 - resolution: "@codemirror/view@npm:6.38.6" + version: 6.38.8 + resolution: "@codemirror/view@npm:6.38.8" dependencies: "@codemirror/state": "npm:^6.5.0" crelt: "npm:^1.0.6" style-mod: "npm:^4.1.0" w3c-keyname: "npm:^2.2.4" - checksum: 10/5a047337a98de111817ce8c8d39e6429c90ca0b0a4d2678d6e161e9e5961b1d476a891f447ab7a05cac395d4a93530e7c68bedd93191285265f0742a308ad00b + checksum: 10/81b1508015a378e4719d0239254173f0c5cd340c2abf96eb488fe5fb474bdb37ec1f010b9890ced774accd7aeb9443e7337cb6a89544b954273e5ddabece7cea languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 820e7fbe7e..e4cfe13871 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8319,14 +8319,14 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.23.0": - version: 6.38.6 - resolution: "@codemirror/view@npm:6.38.6" + version: 6.38.8 + resolution: "@codemirror/view@npm:6.38.8" dependencies: "@codemirror/state": "npm:^6.5.0" crelt: "npm:^1.0.6" style-mod: "npm:^4.1.0" w3c-keyname: "npm:^2.2.4" - checksum: 10/5a047337a98de111817ce8c8d39e6429c90ca0b0a4d2678d6e161e9e5961b1d476a891f447ab7a05cac395d4a93530e7c68bedd93191285265f0742a308ad00b + checksum: 10/81b1508015a378e4719d0239254173f0c5cd340c2abf96eb488fe5fb474bdb37ec1f010b9890ced774accd7aeb9443e7337cb6a89544b954273e5ddabece7cea languageName: node linkType: hard From b24b5780d77fcfd483c1ab81010cf5e4613ed9b5 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Thu, 20 Nov 2025 11:31:08 +0100 Subject: [PATCH 045/312] Update warning message format in changeset Signed-off-by: Ben Lambert --- .changeset/short-cloths-tie.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/short-cloths-tie.md b/.changeset/short-cloths-tie.md index 409d12c480..1ee308c308 100644 --- a/.changeset/short-cloths-tie.md +++ b/.changeset/short-cloths-tie.md @@ -2,4 +2,4 @@ '@backstage/backend-defaults': minor --- -Don't warn when parsing 'storeOptions' for 'memory' cache +Don't warn when parsing `storeOptions` for `memory` cache From 0bc546a459966e7d6e01dece9fec0b2193d36269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Thu, 20 Nov 2025 13:05:10 +0200 Subject: [PATCH 046/312] Reorder parameters after rebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since a new paramater was introduced in the same function(getOrganizationUsers) Signed-off-by: Valério Valério --- .../src/module.ts | 6 ++-- .../src/lib/github.test.ts | 33 ++++++------------- .../src/lib/github.ts | 3 +- .../GithubMultiOrgReaderProcessor.ts | 1 - .../providers/GithubMultiOrgEntityProvider.ts | 6 ++-- .../src/providers/GithubOrgEntityProvider.ts | 10 ++++-- 6 files changed, 25 insertions(+), 34 deletions(-) diff --git a/plugins/catalog-backend-module-github-org/src/module.ts b/plugins/catalog-backend-module-github-org/src/module.ts index e6179e07f1..26abede133 100644 --- a/plugins/catalog-backend-module-github-org/src/module.ts +++ b/plugins/catalog-backend-module-github-org/src/module.ts @@ -134,13 +134,13 @@ function readDefinitionsFromConfig(rootConfig: Config): Array<{ id: string; githubUrl: string; orgs?: string[]; - excludeSuspendedUsers?: boolean; schedule: SchedulerServiceTaskScheduleDefinition; pageSizes?: { teams?: number; teamMembers?: number; organizationMembers?: number; }; + excludeSuspendedUsers?: boolean; }> { const baseKey = 'catalog.providers.githubOrg'; const baseConfig = rootConfig.getOptional(baseKey); @@ -156,8 +156,6 @@ function readDefinitionsFromConfig(rootConfig: Config): Array<{ id: c.getString('id'), githubUrl: c.getString('githubUrl'), orgs: c.getOptionalStringArray('orgs'), - excludeSuspendedUsers: - c.getOptionalBoolean('excludeSuspendedUsers') ?? false, schedule: readSchedulerServiceTaskScheduleDefinitionFromConfig( c.getConfig('schedule'), ), @@ -170,5 +168,7 @@ function readDefinitionsFromConfig(rootConfig: Config): Array<{ ), } : undefined, + excludeSuspendedUsers: + c.getOptionalBoolean('excludeSuspendedUsers') ?? false, })); } diff --git a/plugins/catalog-backend-module-github/src/lib/github.test.ts b/plugins/catalog-backend-module-github/src/lib/github.test.ts index 3cfb1b523a..6933c9a245 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.test.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.test.ts @@ -211,7 +211,7 @@ describe('github', () => { ); await expect( - getOrganizationUsers(graphql, 'a', 'token', true), + getOrganizationUsers(graphql, 'a', 'token', undefined, undefined, true), ).resolves.toEqual(output); }); }); @@ -274,13 +274,7 @@ describe('github', () => { ); await expect( - getOrganizationUsers( - graphql, - 'a', - 'token', - false, - customUserTransformer, - ), + getOrganizationUsers(graphql, 'a', 'token', customUserTransformer), ).resolves.toEqual(output); }); @@ -327,7 +321,6 @@ describe('github', () => { graphql, 'a', 'token', - false, customUserTransformer, ); @@ -385,8 +378,9 @@ describe('github', () => { graphql, 'a', 'token', - false, customUserTransformer, + undefined, + false, ), ).resolves.toEqual(output); }); @@ -1044,19 +1038,12 @@ describe('github', () => { }), ); - await getOrganizationUsers( - graphql as any, - org, - 'token', - false, - undefined, - { - teams: 10, - teamMembers: 20, - organizationMembers: 30, - repositories: 10, - }, - ); + await getOrganizationUsers(graphql as any, org, 'token', undefined, { + teams: 10, + teamMembers: 20, + organizationMembers: 30, + repositories: 10, + }); }); it('uses custom page sizes for getOrganizationRepositories', async () => { diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts index 7f2fd0e08b..030fa93fad 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.ts @@ -182,14 +182,15 @@ export type Connection = { * @param tokenType - The type of GitHub credential * @param userTransformer - Optional transformer for user entities * @param pageSizes - Optional page sizes configuration + * @param excludeSuspendedUsers - Optional flag to exclude suspended users (only for GitHub Enterprise instances) */ export async function getOrganizationUsers( client: typeof graphql, org: string, tokenType: GithubCredentialType, - excludeSuspendedUsers: boolean = false, userTransformer: UserTransformer = defaultUserTransformer, pageSizes: GithubPageSizes = DEFAULT_PAGE_SIZES, + excludeSuspendedUsers: boolean = false, ): Promise<{ users: Entity[] }> { const suspendedAtField = excludeSuspendedUsers ? 'suspendedAt,' : ''; const query = ` diff --git a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts index 058ce2cb6c..8af528dfcf 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts @@ -148,7 +148,6 @@ export class GithubMultiOrgReaderProcessor implements CatalogProcessor { client, orgConfig.name, tokenType, - false, async (githubUser, ctx): Promise => { const result = this.options.userTransformer ? await this.options.userTransformer(githubUser, ctx) diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts index bb0dd84c6f..173da84f58 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts @@ -314,9 +314,9 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { client, org, tokenType, - this.options.excludeSuspendedUsers, this.options.userTransformer, pageSizes, + this.options.excludeSuspendedUsers, ); const { teams } = await getOrganizationTeams( @@ -467,9 +467,9 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { client, org, tokenType, - this.options.excludeSuspendedUsers, this.options.userTransformer, pageSizes, + this.options.excludeSuspendedUsers, ); const { teams } = await getOrganizationTeams( @@ -702,9 +702,9 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { client, org, tokenType, - this.options.excludeSuspendedUsers, this.options.userTransformer, pageSizes, + this.options.excludeSuspendedUsers, ); const usersFromChangedGroup = isGroupEntity(team) diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts index 31b6dc338b..4758311e83 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts @@ -53,6 +53,7 @@ import { createGraphqlClient, createRemoveEntitiesOperation, createReplaceEntitiesOperation, + DEFAULT_PAGE_SIZES, DeferredEntitiesBuilder, getOrganizationTeam, getOrganizationTeams, @@ -245,8 +246,9 @@ export class GithubOrgEntityProvider implements EntityProvider { client, org, tokenType, - this.options.excludeSuspendedUsers, this.options.userTransformer, + DEFAULT_PAGE_SIZES, + this.options.excludeSuspendedUsers, ); const { teams } = await getOrganizationTeams( client, @@ -374,8 +376,9 @@ export class GithubOrgEntityProvider implements EntityProvider { client, org, tokenType, - this.options.excludeSuspendedUsers, this.options.userTransformer, + DEFAULT_PAGE_SIZES, + this.options.excludeSuspendedUsers, ); if (!isGroupEntity(team)) { @@ -466,8 +469,9 @@ export class GithubOrgEntityProvider implements EntityProvider { client, org, tokenType, - this.options.excludeSuspendedUsers, this.options.userTransformer, + DEFAULT_PAGE_SIZES, + this.options.excludeSuspendedUsers, ); const usersToRebuild = users.filter(u => u.metadata.name === userLogin); From 678a08aabfb82d75fcc12a0618e0651169884847 Mon Sep 17 00:00:00 2001 From: Colt McKissick Date: Thu, 20 Nov 2025 06:10:52 -0500 Subject: [PATCH 047/312] Remove commented code in EntityOwnerPicker.test.tsx Co-authored-by: Ben Lambert Signed-off-by: Colt McKissick --- .../src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx index e49d54b485..87c5c9a002 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx @@ -413,7 +413,6 @@ describe('', () => { owners: undefined, }); - // fireEvent.click(screen.getByTestId('owner-picker-expand')); const input = screen.getByRole('textbox'); fireEvent.change(input, { target: { value: 'Some-Owner' } }); From 7f9846fd554669da8ee3f5ce1833109abfa211d7 Mon Sep 17 00:00:00 2001 From: Ilya Savich Date: Tue, 7 Oct 2025 18:06:10 +0200 Subject: [PATCH 048/312] Add Kubernetes Router extension point, add fetcher to custom objects provider Signed-off-by: Ilya Savich --- .changeset/full-needles-drive.md | 6 +++ plugins/kubernetes-backend/src/plugin.ts | 27 ++++++++++++ .../src/service/KubernetesInitializer.ts | 1 + .../src/service/KubernetesRouter.test.ts | 36 ++++++++++++++++ .../src/service/KubernetesRouter.ts | 24 +++++++++-- plugins/kubernetes-node/src/extensions.ts | 43 ++++++++++++++++++- 6 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 .changeset/full-needles-drive.md diff --git a/.changeset/full-needles-drive.md b/.changeset/full-needles-drive.md new file mode 100644 index 0000000000..d0d7a59551 --- /dev/null +++ b/.changeset/full-needles-drive.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes-backend': minor +'@backstage/plugin-kubernetes-node': minor +--- + +Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider diff --git a/plugins/kubernetes-backend/src/plugin.ts b/plugins/kubernetes-backend/src/plugin.ts index b4283d4914..e845abf39b 100644 --- a/plugins/kubernetes-backend/src/plugin.ts +++ b/plugins/kubernetes-backend/src/plugin.ts @@ -36,6 +36,9 @@ import { kubernetesObjectsProviderExtensionPoint, type KubernetesObjectsProviderExtensionPoint, KubernetesObjectsProviderFactory, + KubernetesRouterExtensionPoint, + kubernetesRouterExtensionPoint, + KubernetesRouterFactory, type KubernetesServiceLocator, kubernetesServiceLocatorExtensionPoint, type KubernetesServiceLocatorExtensionPoint, @@ -157,6 +160,24 @@ class AuthStrategy implements KubernetesAuthStrategyExtensionPoint { } } +class CustomRouter implements KubernetesRouterExtensionPoint { + private router: KubernetesRouterFactory | undefined; + + getRouter() { + return this.router; + } + + addRouter(router: KubernetesRouterFactory) { + if (this.router) { + throw new Error( + 'Multiple Kubernetes routers is not supported at this time', + ); + } + + this.router = router; + } +} + /** * This is the backend plugin that provides the Kubernetes integration. * @public @@ -169,6 +190,7 @@ export const kubernetesPlugin = createBackendPlugin({ const extPointAuthStrategy = new AuthStrategy(); const extPointFetcher = new Fetcher(); const extPointServiceLocator = new ServiceLocator(); + const extPointRouter = new CustomRouter() env.registerExtensionPoint( kubernetesObjectsProviderExtensionPoint, @@ -190,6 +212,10 @@ export const kubernetesPlugin = createBackendPlugin({ kubernetesServiceLocatorExtensionPoint, extPointServiceLocator, ); + env.registerExtensionPoint( + kubernetesRouterExtensionPoint, + extPointRouter, + ); env.registerInit({ deps: { @@ -247,6 +273,7 @@ export const kubernetesPlugin = createBackendPlugin({ clusterSupplier, serviceLocator, objectsProvider, + customRouter: extPointRouter.getRouter(), }); http.use(await router.getRouter()); diff --git a/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts b/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts index 46ce5fa888..a12f291ba2 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts @@ -209,6 +209,7 @@ export class KubernetesInitializer { customResources, objectTypesToFetch, }), + fetcher, clusterSupplier, serviceLocator, customResources, diff --git a/plugins/kubernetes-backend/src/service/KubernetesRouter.test.ts b/plugins/kubernetes-backend/src/service/KubernetesRouter.test.ts index 4157cf9444..eb643704c0 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesRouter.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesRouter.test.ts @@ -28,6 +28,7 @@ import { KubernetesFetcher, KubernetesServiceLocator, KubernetesCredential, + kubernetesRouterExtensionPoint, } from '@backstage/plugin-kubernetes-node'; import { HEADER_KUBERNETES_CLUSTER, @@ -809,4 +810,39 @@ metadata: 'Unsupported kubernetes.serviceLocatorMethod "unsupported"', ); }); + + it('custom router', async () => { + const { server } = await startTestBackend({ + features: [ + minimalValidConfigService, + import('@backstage/plugin-kubernetes-backend'), + createBackendModule({ + pluginId: 'kubernetes', + moduleId: 'testRouter', + register(env) { + env.registerInit({ + deps: { extension: kubernetesRouterExtensionPoint }, + async init({ extension }) { + extension.addRouter(({ getDefault }) => { + const router = getDefault(); + + router.get('/test', (_req, res) => { + res.json({ status: 'ok' }); + }); + + return router; + }); + }, + }); + }, + }), + ], + }); + app = server; + + const response = await request(app).get('/api/kubernetes/test'); + + expect(response.body).toEqual({ status: 'ok' }); + expect(response.status).toEqual(200); + }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts index 589e75a172..5aa4f9cebe 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts @@ -40,7 +40,7 @@ import { AuthMetadata, KubernetesClustersSupplier, KubernetesFetcher, - KubernetesObjectsProvider, + KubernetesObjectsProvider, KubernetesRouterFactory, KubernetesServiceLocator, } from '@backstage/plugin-kubernetes-node'; import { addResourceRoutesToRouter } from '../routes/resourcesRoutes'; @@ -62,6 +62,7 @@ export interface KubernetesEnvironment { clusterSupplier: KubernetesClustersSupplier; serviceLocator: KubernetesServiceLocator; objectsProvider: KubernetesObjectsProvider; + customRouter?: KubernetesRouterFactory; } export class KubernetesRouter { @@ -86,6 +87,7 @@ export class KubernetesRouter { catalog, discovery, httpAuth, + customRouter, } = this.env; logger.info('Initializing Kubernetes backend'); @@ -108,7 +110,23 @@ export class KubernetesRouter { authStrategyMap, ); - return this.buildRouter( + return customRouter?.({ + getDefault: () => this.buildDefaultRouter( + objectsProvider, + clusterSupplier, + catalog, + proxy, + permissions, + httpAuth, + authStrategyMap, + ), + objectsProvider, + clusterSupplier, + catalog, + permissions, + httpAuth, + authStrategyMap, + }) ?? this.buildDefaultRouter( objectsProvider, clusterSupplier, catalog, @@ -138,7 +156,7 @@ export class KubernetesRouter { }); } - private buildRouter( + private buildDefaultRouter( objectsProvider: KubernetesObjectsProvider, clusterSupplier: KubernetesClustersSupplier, catalog: CatalogService, diff --git a/plugins/kubernetes-node/src/extensions.ts b/plugins/kubernetes-node/src/extensions.ts index 6f112ece23..d6b5037402 100644 --- a/plugins/kubernetes-node/src/extensions.ts +++ b/plugins/kubernetes-node/src/extensions.ts @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { + createExtensionPoint, + HttpAuthService, +} from '@backstage/backend-plugin-api'; import { AuthenticationStrategy, CustomResource, @@ -23,6 +26,9 @@ import { KubernetesObjectsProvider, KubernetesServiceLocator, } from '@backstage/plugin-kubernetes-node'; +import type express from 'express'; +import type { CatalogService } from '@backstage/plugin-catalog-node'; +import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; /** * A factory function for creating a KubernetesObjectsProvider. @@ -33,6 +39,7 @@ export type KubernetesObjectsProviderFactory = (opts: { getDefault: () => Promise; clusterSupplier: KubernetesClustersSupplier; serviceLocator: KubernetesServiceLocator; + fetcher: KubernetesFetcher; customResources: CustomResource[]; objectTypesToFetch?: ObjectToFetch[]; authStrategy: AuthenticationStrategy; @@ -168,3 +175,37 @@ export const kubernetesServiceLocatorExtensionPoint = createExtensionPoint({ id: 'kubernetes.service-locator', }); + +/** + * A factory function for creating a kubernetes router. + * + * @public + */ +export type KubernetesRouterFactory = (opts: { + getDefault: () => express.Router; + objectsProvider: KubernetesObjectsProvider; + clusterSupplier: KubernetesClustersSupplier; + catalog: CatalogService; + permissions: PermissionEvaluator; + httpAuth: HttpAuthService; + authStrategyMap: { [key: string]: AuthenticationStrategy }; +}) => express.Router; + +/** + * The interface for {@link kubernetesRouterExtensionPoint}. + * + * @public + */ +export interface KubernetesRouterExtensionPoint { + addRouter(router: KubernetesRouterFactory): void; +} + +/** + * An extension point the exposes the ability to configure a kubernetes service locator. + * + * @public + */ +export const kubernetesRouterExtensionPoint = + createExtensionPoint({ + id: 'kubernetes.router', + }); From 62355e177dd25d3a5cdacd30545ee8fcf8fb7f37 Mon Sep 17 00:00:00 2001 From: Ilya Savich Date: Tue, 7 Oct 2025 19:12:46 +0200 Subject: [PATCH 049/312] fix build Signed-off-by: Ilya Savich --- plugins/kubernetes-backend/src/plugin.ts | 9 ++-- .../src/service/KubernetesRouter.ts | 41 +++++++++++-------- plugins/kubernetes-node/report.api.md | 27 ++++++++++++ 3 files changed, 53 insertions(+), 24 deletions(-) diff --git a/plugins/kubernetes-backend/src/plugin.ts b/plugins/kubernetes-backend/src/plugin.ts index e845abf39b..5a2a22f2b5 100644 --- a/plugins/kubernetes-backend/src/plugin.ts +++ b/plugins/kubernetes-backend/src/plugin.ts @@ -168,7 +168,7 @@ class CustomRouter implements KubernetesRouterExtensionPoint { } addRouter(router: KubernetesRouterFactory) { - if (this.router) { + if (this.router) { throw new Error( 'Multiple Kubernetes routers is not supported at this time', ); @@ -190,7 +190,7 @@ export const kubernetesPlugin = createBackendPlugin({ const extPointAuthStrategy = new AuthStrategy(); const extPointFetcher = new Fetcher(); const extPointServiceLocator = new ServiceLocator(); - const extPointRouter = new CustomRouter() + const extPointRouter = new CustomRouter(); env.registerExtensionPoint( kubernetesObjectsProviderExtensionPoint, @@ -212,10 +212,7 @@ export const kubernetesPlugin = createBackendPlugin({ kubernetesServiceLocatorExtensionPoint, extPointServiceLocator, ); - env.registerExtensionPoint( - kubernetesRouterExtensionPoint, - extPointRouter, - ); + env.registerExtensionPoint(kubernetesRouterExtensionPoint, extPointRouter); env.registerInit({ deps: { diff --git a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts index 5aa4f9cebe..9ca56c502e 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts @@ -40,7 +40,8 @@ import { AuthMetadata, KubernetesClustersSupplier, KubernetesFetcher, - KubernetesObjectsProvider, KubernetesRouterFactory, + KubernetesObjectsProvider, + KubernetesRouterFactory, KubernetesServiceLocator, } from '@backstage/plugin-kubernetes-node'; import { addResourceRoutesToRouter } from '../routes/resourcesRoutes'; @@ -110,8 +111,26 @@ export class KubernetesRouter { authStrategyMap, ); - return customRouter?.({ - getDefault: () => this.buildDefaultRouter( + return ( + customRouter?.({ + getDefault: () => + this.buildDefaultRouter( + objectsProvider, + clusterSupplier, + catalog, + proxy, + permissions, + httpAuth, + authStrategyMap, + ), + objectsProvider, + clusterSupplier, + catalog, + permissions, + httpAuth, + authStrategyMap, + }) ?? + this.buildDefaultRouter( objectsProvider, clusterSupplier, catalog, @@ -119,21 +138,7 @@ export class KubernetesRouter { permissions, httpAuth, authStrategyMap, - ), - objectsProvider, - clusterSupplier, - catalog, - permissions, - httpAuth, - authStrategyMap, - }) ?? this.buildDefaultRouter( - objectsProvider, - clusterSupplier, - catalog, - proxy, - permissions, - httpAuth, - authStrategyMap, + ) ); } diff --git a/plugins/kubernetes-node/report.api.md b/plugins/kubernetes-node/report.api.md index 2e96057be8..6e8a80a041 100644 --- a/plugins/kubernetes-node/report.api.md +++ b/plugins/kubernetes-node/report.api.md @@ -5,11 +5,14 @@ ```ts import { AuthenticationStrategy as AuthenticationStrategy_2 } from '@backstage/plugin-kubernetes-node'; import { BackstageCredentials } from '@backstage/backend-plugin-api'; +import type { CatalogService } from '@backstage/plugin-catalog-node'; import { CustomResource as CustomResource_2 } from '@backstage/plugin-kubernetes-node'; import { CustomResourceMatcher } from '@backstage/plugin-kubernetes-common'; import { Entity } from '@backstage/catalog-model'; +import type express from 'express'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { FetchResponse } from '@backstage/plugin-kubernetes-common'; +import { HttpAuthService } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { KubernetesClustersSupplier as KubernetesClustersSupplier_2 } from '@backstage/plugin-kubernetes-node'; import { KubernetesFetcher as KubernetesFetcher_2 } from '@backstage/plugin-kubernetes-node'; @@ -20,6 +23,7 @@ import { KubernetesServiceLocator as KubernetesServiceLocator_2 } from '@backsta import { LoggerService } from '@backstage/backend-plugin-api'; import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; import { ObjectToFetch as ObjectToFetch_2 } from '@backstage/plugin-kubernetes-node'; +import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; // @public (undocumented) export interface AuthenticationStrategy { @@ -198,6 +202,7 @@ export type KubernetesObjectsProviderFactory = (opts: { getDefault: () => Promise; clusterSupplier: KubernetesClustersSupplier_2; serviceLocator: KubernetesServiceLocator_2; + fetcher: KubernetesFetcher_2; customResources: CustomResource_2[]; objectTypesToFetch?: ObjectToFetch_2[]; authStrategy: AuthenticationStrategy_2; @@ -221,6 +226,28 @@ export type KubernetesObjectTypes = | 'daemonsets' | 'secrets'; +// @public +export interface KubernetesRouterExtensionPoint { + // (undocumented) + addRouter(router: KubernetesRouterFactory): void; +} + +// @public +export const kubernetesRouterExtensionPoint: ExtensionPoint; + +// @public +export type KubernetesRouterFactory = (opts: { + getDefault: () => express.Router; + objectsProvider: KubernetesObjectsProvider_2; + clusterSupplier: KubernetesClustersSupplier_2; + catalog: CatalogService; + permissions: PermissionEvaluator; + httpAuth: HttpAuthService; + authStrategyMap: { + [key: string]: AuthenticationStrategy_2; + }; +}) => express.Router; + // @public export interface KubernetesServiceLocator { // (undocumented) From b0dfe347b9456911e3d4a1f698776fec939304df Mon Sep 17 00:00:00 2001 From: Ilya Savich Date: Wed, 8 Oct 2025 12:48:02 +0200 Subject: [PATCH 050/312] fix type deps Signed-off-by: Ilya Savich # Conflicts: # yarn.lock --- plugins/kubernetes-node/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index cadd27eabf..3f32b82864 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -52,6 +52,7 @@ "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@backstage/plugin-kubernetes-backend": "workspace:^", + "@types/express": "^4.17.6", "msw": "^1.3.1", "supertest": "^7.0.0" } From a393d69ea39479e6aafb80d8538f28623db410f7 Mon Sep 17 00:00:00 2001 From: Ilya Savich Date: Thu, 30 Oct 2025 10:41:47 +0100 Subject: [PATCH 051/312] fix type deps Signed-off-by: Ilya Savich --- plugins/kubernetes-node/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 3f32b82864..9ad3619456 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -43,6 +43,7 @@ "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/types": "workspace:^", "@kubernetes/client-node": "1.4.0", + "@types/express": "^4.17.6", "node-fetch": "^2.7.0", "winston": "^3.2.1" }, @@ -52,7 +53,6 @@ "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@backstage/plugin-kubernetes-backend": "workspace:^", - "@types/express": "^4.17.6", "msw": "^1.3.1", "supertest": "^7.0.0" } From 26845863b9703d449b2a7a37f05ee2f2e45cbaf9 Mon Sep 17 00:00:00 2001 From: Ilya Savich Date: Thu, 20 Nov 2025 13:32:21 +0100 Subject: [PATCH 052/312] fix rebase conflicts Signed-off-by: Ilya Savich --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index b1c15c04e8..c8020fa46e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5892,6 +5892,7 @@ __metadata: "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/types": "workspace:^" "@kubernetes/client-node": "npm:1.4.0" + "@types/express": "npm:^4.17.6" msw: "npm:^1.3.1" node-fetch: "npm:^2.7.0" supertest: "npm:^7.0.0" From 5c33821e8a4899f3435b1cd3b074fb9db619d253 Mon Sep 17 00:00:00 2001 From: Bailey Everts Date: Fri, 7 Nov 2025 13:40:13 -0700 Subject: [PATCH 053/312] fix(techdocs): use correct type for additionalAllowedUriProtocols Signed-off-by: Bailey Everts --- .changeset/gentle-results-lie.md | 5 +++++ plugins/techdocs/config.d.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/gentle-results-lie.md diff --git a/.changeset/gentle-results-lie.md b/.changeset/gentle-results-lie.md new file mode 100644 index 0000000000..0c53407db3 --- /dev/null +++ b/.changeset/gentle-results-lie.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Fixed schema type for additionalAllowedURIProtocols diff --git a/plugins/techdocs/config.d.ts b/plugins/techdocs/config.d.ts index 7294f52816..8edab64176 100644 --- a/plugins/techdocs/config.d.ts +++ b/plugins/techdocs/config.d.ts @@ -67,7 +67,7 @@ export interface Config { * @see: https://raw.githubusercontent.com/cure53/DOMPurify/master/src/regexp.ts * @visibility frontend */ - additionalAllowedURIProtocols?: string; + additionalAllowedURIProtocols?: string[]; }; }; } From e6314f25348c755ac4f21502bf4f9f577b66190c Mon Sep 17 00:00:00 2001 From: Vidhan Shah Date: Fri, 21 Nov 2025 20:54:32 +0530 Subject: [PATCH 054/312] PR comments Signed-off-by: Vidhan Shah --- .../src/stages/publish/awsS3.test.ts | 40 ++++++++++--------- .../techdocs-node/src/stages/publish/awsS3.ts | 35 ++++++++++------ 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index 98a2e7d09c..c7c859f331 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -38,6 +38,8 @@ import request from 'supertest'; import path from 'path'; import fs from 'fs-extra'; import { AwsS3Publish } from './awsS3'; + +jest.setTimeout(30_000); import { Readable } from 'stream'; import { createMockDirectory, @@ -45,7 +47,9 @@ import { } from '@backstage/backend-test-utils'; const env = process.env; -let s3Mock: any; +let s3Mock: ReturnType & { + send: (command: any) => Promise; +}; // Create a new MockDirectory for each test to avoid Windows file locking issues let mockDir: ReturnType; @@ -514,7 +518,7 @@ describe('AwsS3Publish', () => { `default/component/backstage/assets/main.css`, ]), }); - }, 30000); + }); it('should publish a directory as well when legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -527,7 +531,7 @@ describe('AwsS3Publish', () => { `default/Component/backstage/assets/main.css`, ]), }); - }, 30000); + }); it('should publish a directory when root path is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -540,7 +544,7 @@ describe('AwsS3Publish', () => { `backstage-data/techdocs/default/component/backstage/assets/main.css`, ]), }); - }, 30000); + }); it('should publish a directory when root path is specified and legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -554,7 +558,7 @@ describe('AwsS3Publish', () => { `backstage-data/techdocs/default/Component/backstage/assets/main.css`, ]), }); - }, 30000); + }); it('should publish a directory when sse is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -567,7 +571,7 @@ describe('AwsS3Publish', () => { 'default/component/backstage/assets/main.css', ]), }); - }, 30000); + }); it('should fail to publish a directory', async () => { const wrongPathToGeneratedDirectory = mockDir.resolve( @@ -602,7 +606,7 @@ describe('AwsS3Publish', () => { expect(loggerInfoSpy).toHaveBeenCalledWith( `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: 1`, ); - }, 30000); + }); it('should log error when the stale files deletion fails', async () => { const bucketName = 'delete_stale_files_error'; @@ -613,7 +617,7 @@ describe('AwsS3Publish', () => { expect(loggerErrorSpy).toHaveBeenLastCalledWith( 'Unable to delete file(s) from AWS S3. Error: Message', ); - }, 30000); + }); }); describe('hasDocsBeenGenerated', () => { @@ -621,7 +625,7 @@ describe('AwsS3Publish', () => { const publisher = await createPublisherFromConfig(); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }, 30000); + }); it('should return true if docs has been generated even if the legacy case is enabled', async () => { const publisher = await createPublisherFromConfig({ @@ -629,7 +633,7 @@ describe('AwsS3Publish', () => { }); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }, 30000); + }); it('should return true if docs has been generated if root path is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -637,7 +641,7 @@ describe('AwsS3Publish', () => { }); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }, 30000); + }); it('should return true if docs has been generated if root path is specified and legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -646,7 +650,7 @@ describe('AwsS3Publish', () => { }); await publisher.publish({ entity, directory }); expect(await publisher.hasDocsBeenGenerated(entity)).toBe(true); - }, 30000); + }); it('should return false if docs has not been generated', async () => { const publisher = await createPublisherFromConfig(); @@ -669,7 +673,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }, 30000); + }); it('should return tech docs metadata even if the legacy case is enabled', async () => { const publisher = await createPublisherFromConfig({ @@ -679,7 +683,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }, 30000); + }); it('should return tech docs metadata even if root path is specified', async () => { const publisher = await createPublisherFromConfig({ @@ -689,7 +693,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }, 30000); + }); it('should return tech docs metadata if root path is specified and legacy casing is used', async () => { const publisher = await createPublisherFromConfig({ @@ -700,7 +704,7 @@ describe('AwsS3Publish', () => { expect(await publisher.fetchTechDocsMetadata(entityName)).toStrictEqual( techdocsMetadata, ); - }, 30000); + }); it('should return tech docs metadata when json encoded with single quotes', async () => { const techdocsMetadataPath = path.join( @@ -722,7 +726,7 @@ describe('AwsS3Publish', () => { ); fs.writeFileSync(techdocsMetadataPath, techdocsMetadataContent); - }, 30000); + }); it('should return an error if the techdocs_metadata.json file is not present', async () => { const publisher = await createPublisherFromConfig(); @@ -776,7 +780,7 @@ describe('AwsS3Publish', () => { const publisher = await createPublisherFromConfig(); await publisher.publish({ entity, directory }); app = express().use(publisher.docsRouter()); - }, 30000); + }); it('should pass expected object path to bucket', async () => { // Ensures leading slash is trimmed and encoded path is decoded. diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts index 76068ad935..0e84a433f6 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts @@ -173,7 +173,7 @@ export class AwsS3Publish implements PublisherBase { 'techdocs.publisher.awsS3.s3ForcePathStyle', ); - // AWS MAX ATTEMPTS is an optional config. If missing, default value of 3 is used + // AWS MAX ATTEMPTS is an optional config. If missing, default value of 5 is used const maxAttempts = config.getOptionalNumber( 'techdocs.publisher.awsS3.maxAttempts', ); @@ -434,11 +434,8 @@ export class AwsS3Publish implements PublisherBase { // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] absoluteFilesToUpload = await getFileTreeRecursively(directory); - let uploadCounter = 0; - await bulkStorageOperation( async absoluteFilePath => { - uploadCounter++; const relativeFilePath = path.relative(directory, absoluteFilePath); const s3Key = getCloudPathForLocalPath( entity, @@ -446,10 +443,14 @@ export class AwsS3Publish implements PublisherBase { useLegacyPathCasing, bucketRootPath, ); + // Create params without the Body because the body must be the + // actual file contents (Buffer or Readable), not the path string. + // For multipart uploads we attach a Readable stream to avoid + // buffering large files in memory. For simple uploads we attach + // a Buffer read from disk. const params: PutObjectCommandInput = { Bucket: this.bucketName, Key: s3Key, - Body: absoluteFilePath, ...(sse && { ServerSideEncryption: sse }), }; @@ -462,15 +463,23 @@ export class AwsS3Publish implements PublisherBase { if (fileSizeInBytes >= MAX_SINGLE_UPLOAD_BYTES) { // Try multipart upload for large files try { - const upload = new Upload({ - client: this.storageClient, - params, - partSize: MAX_SINGLE_UPLOAD_BYTES, - queueSize: 3, - leavePartsOnError: false, - }); + // Create stream and Upload inside retry closure so stream is + // recreated on each retry attempt (streams are consumable once). await this.retryOperation( - () => upload.done(), + () => { + // Create a fresh stream on each attempt + const fileStream = fs.createReadStream(absoluteFilePath); + const uploadParams = { ...params, Body: fileStream }; + + const upload = new Upload({ + client: this.storageClient, + params: uploadParams, + partSize: MAX_SINGLE_UPLOAD_BYTES, + queueSize: 3, + leavePartsOnError: false, + }); + return upload.done(); + }, `Upload-${params.Key}`, this.maxAttempts, ); From 0f258e24fa53dd2649dd4c04efcb047a96f5e1fd Mon Sep 17 00:00:00 2001 From: Vidhan Shah Date: Fri, 21 Nov 2025 21:17:50 +0530 Subject: [PATCH 055/312] PR comments Signed-off-by: Vidhan Shah --- .../src/stages/publish/awsS3.test.ts | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index c7c859f331..35da7485b0 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -32,24 +32,22 @@ import { AwsCredentialProviderOptions, DefaultAwsCredentialsManager, } from '@backstage/integration-aws-node'; -import { mockClient } from 'aws-sdk-client-mock'; +import { mockClient, AwsClientStub } from 'aws-sdk-client-mock'; import express from 'express'; import request from 'supertest'; import path from 'path'; import fs from 'fs-extra'; import { AwsS3Publish } from './awsS3'; - -jest.setTimeout(30_000); import { Readable } from 'stream'; import { createMockDirectory, mockServices, } from '@backstage/backend-test-utils'; +jest.setTimeout(30_000); + const env = process.env; -let s3Mock: ReturnType & { - send: (command: any) => Promise; -}; +let s3Mock: AwsClientStub; // Create a new MockDirectory for each test to avoid Windows file locking issues let mockDir: ReturnType; @@ -326,7 +324,7 @@ describe('AwsS3Publish', () => { await (publisher as any).retryOperation( async () => { - return s3Mock.send( + return (s3Mock.send as any)( new ListObjectsV2Command({ Bucket: 'bucketName' }), ); }, @@ -353,7 +351,7 @@ describe('AwsS3Publish', () => { await (publisher as any).retryOperation( async () => { - return s3Mock.send( + return (s3Mock.send as any)( new ListObjectsV2Command({ Bucket: 'bucketName' }), ); }, @@ -377,7 +375,7 @@ describe('AwsS3Publish', () => { await (publisher as any).retryOperation( async () => { - return s3Mock.send( + return (s3Mock.send as any)( new ListObjectsV2Command({ Bucket: 'bucketName' }), ); }, @@ -401,7 +399,7 @@ describe('AwsS3Publish', () => { await (publisher as any).retryOperation( async () => { - return s3Mock.send( + return (s3Mock.send as any)( new ListObjectsV2Command({ Bucket: 'bucketName' }), ); }, @@ -423,7 +421,7 @@ describe('AwsS3Publish', () => { await expect( (publisher as any).retryOperation( async () => { - return s3Mock.send( + return (s3Mock.send as any)( new ListObjectsV2Command({ Bucket: 'bucketName' }), ); }, @@ -449,7 +447,7 @@ describe('AwsS3Publish', () => { await (publisher as any).retryOperation( async () => { - return s3Mock.send( + return (s3Mock.send as any)( new ListObjectsV2Command({ Bucket: 'bucketName' }), ); }, @@ -475,7 +473,7 @@ describe('AwsS3Publish', () => { await (publisher as any).retryOperation( async () => { - return s3Mock.send( + return (s3Mock.send as any)( new ListObjectsV2Command({ Bucket: 'bucketName' }), ); }, From e1152729555af6f64bb075a41c4c1122254222e6 Mon Sep 17 00:00:00 2001 From: Vidhan Shah Date: Fri, 21 Nov 2025 21:36:41 +0530 Subject: [PATCH 056/312] PR comments Signed-off-by: Vidhan Shah --- .../src/stages/publish/awsS3.test.ts | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index 35da7485b0..e33c5c2612 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -201,14 +201,14 @@ describe('AwsS3Publish', () => { s3Mock = mockClient(S3Client); - s3Mock.on(HeadObjectCommand).callsFake((input: { Key: string }) => { + s3Mock.on(HeadObjectCommand).callsFake(input => { if (!fs.pathExistsSync(mockDir.resolve(input.Key))) { throw new Error('File does not exist'); } return {}; }); - s3Mock.on(GetObjectCommand).callsFake((input: { Key: string }) => { + s3Mock.on(GetObjectCommand).callsFake(input => { if (fs.pathExistsSync(mockDir.resolve(input.Key))) { return { Body: Readable.from(fs.readFileSync(mockDir.resolve(input.Key))), @@ -218,14 +218,14 @@ describe('AwsS3Publish', () => { throw new Error(`The file ${input.Key} does not exist!`); }); - s3Mock.on(HeadBucketCommand).callsFake((input: { Bucket: string }) => { + s3Mock.on(HeadBucketCommand).callsFake(input => { if (input.Bucket === 'errorBucket') { throw new Error('Bucket does not exist'); } return {}; }); - s3Mock.on(ListObjectsV2Command).callsFake((input: { Bucket: string }) => { + s3Mock.on(ListObjectsV2Command).callsFake(input => { if ( input.Bucket === 'delete_stale_files_success' || input.Bucket === 'delete_stale_files_error' @@ -237,7 +237,7 @@ describe('AwsS3Publish', () => { return {}; }); - s3Mock.on(DeleteObjectCommand).callsFake((input: { Bucket: string }) => { + s3Mock.on(DeleteObjectCommand).callsFake(input => { if (input.Bucket === 'delete_stale_files_error') { throw new Error('Message'); } @@ -245,11 +245,9 @@ describe('AwsS3Publish', () => { }); s3Mock.on(UploadPartCommand).rejects(); - s3Mock - .on(PutObjectCommand) - .callsFake((input: { Key: string; Body: any }) => { - mockDir.addContent({ [input.Key]: input.Body }); - }); + s3Mock.on(PutObjectCommand).callsFake(input => { + mockDir.addContent({ [input.Key]: input.Body }); + }); }); afterEach(() => { @@ -306,7 +304,7 @@ describe('AwsS3Publish', () => { describe('retry mechanism', () => { it('should retry with custom retry strategy', async () => { - const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const publisher = await createPublisherFromConfig(); const customRetryStrategy = jest.fn((error: any) => { return error.name === 'NetworkingError'; }); @@ -337,7 +335,7 @@ describe('AwsS3Publish', () => { }); it('should use default retry strategy when no custom strategy provided', async () => { - const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const publisher = await createPublisherFromConfig(); s3Mock .on(ListObjectsV2Command) .rejectsOnce( @@ -361,7 +359,7 @@ describe('AwsS3Publish', () => { }); it('should retry on server errors (5xx)', async () => { - const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const publisher = await createPublisherFromConfig(); s3Mock .on(ListObjectsV2Command) .rejectsOnce( @@ -385,7 +383,7 @@ describe('AwsS3Publish', () => { }); it('should retry on specific 4xx errors that are transient', async () => { - const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const publisher = await createPublisherFromConfig(); s3Mock .on(ListObjectsV2Command) .rejectsOnce( @@ -409,7 +407,7 @@ describe('AwsS3Publish', () => { }); it('should not retry on non-retriable 4xx errors', async () => { - const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const publisher = await createPublisherFromConfig(); s3Mock.on(ListObjectsV2Command).rejectsOnce( new S3ServiceException({ name: 'BadRequest', @@ -432,7 +430,7 @@ describe('AwsS3Publish', () => { }); it('should use exact error code matching for transient errors', async () => { - const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const publisher = await createPublisherFromConfig(); // Test that ConnectionError (exact match) is retried, but ConnectionErrorSomething (substring) is not s3Mock .on(ListObjectsV2Command) @@ -457,7 +455,7 @@ describe('AwsS3Publish', () => { }); it('should apply exponential backoff with correct calculation', async () => { - const publisher = (await createPublisherFromConfig()) as AwsS3Publish; + const publisher = await createPublisherFromConfig(); const startTime = Date.now(); s3Mock From 848335461ea32f19f33b48cf1aa464204560da14 Mon Sep 17 00:00:00 2001 From: Vidhan Shah Date: Mon, 24 Nov 2025 16:42:38 +0530 Subject: [PATCH 057/312] PR comments Signed-off-by: Vidhan Shah --- .../src/stages/publish/awsS3.test.ts | 73 ++++++------------- .../techdocs-node/src/stages/publish/awsS3.ts | 4 +- 2 files changed, 24 insertions(+), 53 deletions(-) diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index e33c5c2612..8be8c05994 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -305,7 +305,7 @@ describe('AwsS3Publish', () => { describe('retry mechanism', () => { it('should retry with custom retry strategy', async () => { const publisher = await createPublisherFromConfig(); - const customRetryStrategy = jest.fn((error: any) => { + const customRetryStrategy = jest.fn(error => { return error.name === 'NetworkingError'; }); @@ -320,11 +320,10 @@ describe('AwsS3Publish', () => { ) .resolvesOnce({ Contents: [] }); - await (publisher as any).retryOperation( + await (publisher as AwsS3Publish).retryOperation( async () => { - return (s3Mock.send as any)( - new ListObjectsV2Command({ Bucket: 'bucketName' }), - ); + const command = new ListObjectsV2Command({ Bucket: 'bucketName' }); + return (publisher as AwsS3Publish).storageClient.send(command); }, 'TestOperation', 3, @@ -347,11 +346,10 @@ describe('AwsS3Publish', () => { ) .resolvesOnce({ Contents: [] }); - await (publisher as any).retryOperation( + await (publisher as AwsS3Publish).retryOperation( async () => { - return (s3Mock.send as any)( - new ListObjectsV2Command({ Bucket: 'bucketName' }), - ); + const command = new ListObjectsV2Command({ Bucket: 'bucketName' }); + return (publisher as AwsS3Publish).storageClient.send(command); }, 'TestOperation', 3, @@ -371,11 +369,10 @@ describe('AwsS3Publish', () => { ) .resolvesOnce({ Contents: [] }); - await (publisher as any).retryOperation( + await (publisher as AwsS3Publish).retryOperation( async () => { - return (s3Mock.send as any)( - new ListObjectsV2Command({ Bucket: 'bucketName' }), - ); + const command = new ListObjectsV2Command({ Bucket: 'bucketName' }); + return (publisher as AwsS3Publish).storageClient.send(command); }, 'TestOperation', 3, @@ -395,40 +392,16 @@ describe('AwsS3Publish', () => { ) .resolvesOnce({ Contents: [] }); - await (publisher as any).retryOperation( + await (publisher as AwsS3Publish).retryOperation( async () => { - return (s3Mock.send as any)( - new ListObjectsV2Command({ Bucket: 'bucketName' }), - ); + const command = new ListObjectsV2Command({ Bucket: 'bucketName' }); + return (publisher as AwsS3Publish).storageClient.send(command); }, 'TestOperation', 3, ); }); - it('should not retry on non-retriable 4xx errors', async () => { - const publisher = await createPublisherFromConfig(); - s3Mock.on(ListObjectsV2Command).rejectsOnce( - new S3ServiceException({ - name: 'BadRequest', - $fault: 'client', - $metadata: { httpStatusCode: 400 }, - }), - ); - - await expect( - (publisher as any).retryOperation( - async () => { - return (s3Mock.send as any)( - new ListObjectsV2Command({ Bucket: 'bucketName' }), - ); - }, - 'TestOperation', - 3, - ), - ).rejects.toHaveProperty('name', 'BadRequest'); - }); - it('should use exact error code matching for transient errors', async () => { const publisher = await createPublisherFromConfig(); // Test that ConnectionError (exact match) is retried, but ConnectionErrorSomething (substring) is not @@ -443,11 +416,10 @@ describe('AwsS3Publish', () => { ) .resolvesOnce({ Contents: [] }); - await (publisher as any).retryOperation( + await (publisher as AwsS3Publish).retryOperation( async () => { - return (s3Mock.send as any)( - new ListObjectsV2Command({ Bucket: 'bucketName' }), - ); + const command = new ListObjectsV2Command({ Bucket: 'bucketName' }); + return (publisher as AwsS3Publish).storageClient.send(command); }, 'TestOperation', 3, @@ -469,14 +441,13 @@ describe('AwsS3Publish', () => { ) .resolvesOnce({ Contents: [] }); - await (publisher as any).retryOperation( + await (publisher as AwsS3Publish).retryOperation( async () => { - return (s3Mock.send as any)( - new ListObjectsV2Command({ Bucket: 'bucketName' }), - ); + const command = new ListObjectsV2Command({ Bucket: 'bucketName' }); + return (publisher as AwsS3Publish).storageClient.send(command); }, 'TestOperation', - 2, + 3, ); const elapsedTime = Date.now() - startTime; @@ -743,7 +714,7 @@ describe('AwsS3Publish', () => { }); it('should return an error if the techdocs_metadata.json file cannot be read from stream', async () => { - s3Mock.on(GetObjectCommand).callsFake((_: any) => { + s3Mock.on(GetObjectCommand).callsFake(() => { return { Body: new ErrorReadable('No stream!'), }; @@ -882,7 +853,7 @@ describe('AwsS3Publish', () => { }); it('should return 404 if file cannot be read from stream', async () => { - s3Mock.on(GetObjectCommand).callsFake((_: any) => { + s3Mock.on(GetObjectCommand).callsFake(() => { return { Body: new ErrorReadable('No stream!'), }; diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts index 0e84a433f6..157c2ffdeb 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts @@ -84,7 +84,7 @@ const streamToBuffer = (stream: Readable): Promise => { }; export class AwsS3Publish implements PublisherBase { - private readonly storageClient: S3Client; + public readonly storageClient: S3Client; private readonly bucketName: string; private readonly legacyPathCasing: boolean; private readonly logger: LoggerService; @@ -268,7 +268,7 @@ export class AwsS3Publish implements PublisherBase { /** * Custom retry wrapper for S3 operations with detailed error handling. */ - private async retryOperation( + public async retryOperation( operation: () => Promise, operationName: string, maxAttempts: number = 3, From df4d64609ec5bd902509368b274999fa3ce063b3 Mon Sep 17 00:00:00 2001 From: ivangonzalezacuna Date: Wed, 5 Nov 2025 13:32:41 +0100 Subject: [PATCH 058/312] [catalog-unprocessed-entities] Move types and clients from frontend to common plugin Moved some types, as well as the API and client definitions to the common package. The original types, client and interface are now re-exported from the common package instead. This allows not only frontend plugins, but also backend ones, to use this client if needed. Until now, and since the types and all definitions were stored in the frontend plugin, the only way to implement such feature was to copy the code in the project. It would make much more sense to make this exportable from the plugin itself and let people use this plugin if needed. I made this change a patch, since all types have been initially deprecated and a mention to the new location has been added. Signed-off-by: ivangonzalezacuna --- .changeset/rotten-melons-sleep.md | 15 +++ .../package.json | 2 + .../report.api.md | 85 ++++++++++++ .../src/api/api.ts | 124 ++++++++++++++++++ .../src/api/index.ts | 16 +++ .../src/index.ts | 2 + .../src/types.ts | 66 ++++++++++ .../catalog-unprocessed-entities/package.json | 2 +- .../report.api.md | 57 +++----- .../src/api/index.ts | 72 ++-------- .../catalog-unprocessed-entities/src/types.ts | 38 ++---- yarn.lock | 4 +- 12 files changed, 355 insertions(+), 128 deletions(-) create mode 100644 .changeset/rotten-melons-sleep.md create mode 100644 plugins/catalog-unprocessed-entities-common/src/api/api.ts create mode 100644 plugins/catalog-unprocessed-entities-common/src/api/index.ts create mode 100644 plugins/catalog-unprocessed-entities-common/src/types.ts diff --git a/.changeset/rotten-melons-sleep.md b/.changeset/rotten-melons-sleep.md new file mode 100644 index 0000000000..c12e0a9669 --- /dev/null +++ b/.changeset/rotten-melons-sleep.md @@ -0,0 +1,15 @@ +--- +'@backstage/plugin-catalog-unprocessed-entities-common': patch +'@backstage/plugin-catalog-unprocessed-entities': patch +--- + +Moved types, API and client to the common package, allowing both frontend and +backend plugins to use the `CatalogUnprocessedEntitiesClient`. + +The following types, clients and interfaces have been deprecated and should be +imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead: +`CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`, +`UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`. + +All those types, clients and interfaces are re-exported temporarily in the +`@backstage/plugin-catalog-unprocessed-entities` package until cleaned up. diff --git a/plugins/catalog-unprocessed-entities-common/package.json b/plugins/catalog-unprocessed-entities-common/package.json index 49ead8da1b..68e1a23dd0 100644 --- a/plugins/catalog-unprocessed-entities-common/package.json +++ b/plugins/catalog-unprocessed-entities-common/package.json @@ -37,6 +37,8 @@ "test": "backstage-cli package test" }, "dependencies": { + "@backstage/catalog-model": "workspace:^", + "@backstage/errors": "workspace:^", "@backstage/plugin-permission-common": "workspace:^" }, "devDependencies": { diff --git a/plugins/catalog-unprocessed-entities-common/report.api.md b/plugins/catalog-unprocessed-entities-common/report.api.md index 03b316eebb..e373a3f45b 100644 --- a/plugins/catalog-unprocessed-entities-common/report.api.md +++ b/plugins/catalog-unprocessed-entities-common/report.api.md @@ -4,6 +4,53 @@ ```ts import { BasicPermission } from '@backstage/plugin-permission-common'; +import { Entity } from '@backstage/catalog-model'; + +// @public +export interface CatalogUnprocessedEntitiesApi { + delete( + entityId: string, + options?: UnprocessedEntitiesRequestOptions, + ): Promise; + failed( + options?: UnprocessedEntitiesRequestOptions, + ): Promise; + pending( + options?: UnprocessedEntitiesRequestOptions, + ): Promise; +} + +// @public +export type CatalogUnprocessedEntitiesApiResponse = { + entities: UnprocessedEntity[]; +}; + +// @public +export class CatalogUnprocessedEntitiesClient + implements CatalogUnprocessedEntitiesApi +{ + constructor( + discovery: { + getBaseUrl(pluginId: string): Promise; + }, + fetchApi?: { + fetch: typeof fetch; + }, + ); + // (undocumented) + delete( + entityId: string, + options?: UnprocessedEntitiesRequestOptions, + ): Promise; + // (undocumented) + failed( + options?: UnprocessedEntitiesRequestOptions, + ): Promise; + // (undocumented) + pending( + options?: UnprocessedEntitiesRequestOptions, + ): Promise; +} // @public export const unprocessedEntitiesDeletePermission: BasicPermission; @@ -12,4 +59,42 @@ export const unprocessedEntitiesDeletePermission: BasicPermission; export const unprocessedEntitiesPermissions: { unprocessedEntitiesDeletePermission: BasicPermission; }; + +// @public +export interface UnprocessedEntitiesRequestOptions { + // (undocumented) + token?: string; +} + +// @public +export type UnprocessedEntity = { + entity_id: string; + entity_ref: string; + unprocessed_entity: Entity; + unprocessed_hash?: string; + processed_entity?: Entity; + result_hash?: string; + cache?: UnprocessedEntityCache; + next_update_at: string | Date; + last_discovery_at: string | Date; + errors?: UnprocessedEntityError[]; + location_key?: string; +}; + +// @public +export type UnprocessedEntityCache = { + ttl: number; + cache: object; +}; + +// @public +export type UnprocessedEntityError = { + name: string; + message: string; + cause: { + name: string; + message: string; + stack: string; + }; +}; ``` diff --git a/plugins/catalog-unprocessed-entities-common/src/api/api.ts b/plugins/catalog-unprocessed-entities-common/src/api/api.ts new file mode 100644 index 0000000000..02b230aaec --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/src/api/api.ts @@ -0,0 +1,124 @@ +/* + * 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 { CatalogUnprocessedEntitiesApiResponse } from '../types'; +import { ResponseError } from '@backstage/errors'; + +/** + * Options you can pass into a catalog request for additional information. + * + * @public + */ +export interface UnprocessedEntitiesRequestOptions { + token?: string; +} + +/** + * Interface for the CatalogUnprocessedEntitiesApi. + * + * @public + */ +export interface CatalogUnprocessedEntitiesApi { + /** + * Returns a list of entities with state 'pending' + * + * @param options - Additional options + */ + pending( + options?: UnprocessedEntitiesRequestOptions, + ): Promise; + /** + * Returns a list of entities with state 'failed' + * + * @param options - Additional options + */ + failed( + options?: UnprocessedEntitiesRequestOptions, + ): Promise; + /** + * Deletes an entity from the refresh_state table + * + * @param entityId - The ID of the entity to delete + * @param options - Additional options + */ + delete( + entityId: string, + options?: UnprocessedEntitiesRequestOptions, + ): Promise; +} + +/** + * Default API implementation for the Catalog Unprocessed Entities plugin + * + * @public + */ +export class CatalogUnprocessedEntitiesClient + implements CatalogUnprocessedEntitiesApi +{ + private readonly discovery: { getBaseUrl(pluginId: string): Promise }; + private readonly fetchApi: { fetch: typeof fetch }; + + constructor( + discovery: { getBaseUrl(pluginId: string): Promise }, + fetchApi?: { fetch: typeof fetch }, + ) { + this.discovery = discovery; + this.fetchApi = fetchApi ?? { fetch }; + } + + private async fetch( + method: string, + path: string, + options?: UnprocessedEntitiesRequestOptions, + ): Promise { + const url = await this.discovery.getBaseUrl('catalog'); + const resp = await this.fetchApi.fetch(`${url}/${path}`, { + method, + headers: { + ...(options?.token ? { Authorization: `Bearer ${options.token}` } : {}), + }, + }); + + if (!resp.ok) { + throw await ResponseError.fromResponse(resp); + } + + return resp.status === 204 ? (resp as T) : await resp.json(); + } + + async pending( + options?: UnprocessedEntitiesRequestOptions, + ): Promise { + return await this.fetch('GET', 'entities/unprocessed/pending', options); + } + + async failed( + options?: UnprocessedEntitiesRequestOptions, + ): Promise { + return await this.fetch('GET', 'entities/unprocessed/failed', options); + } + + async delete( + entityId: string, + options?: UnprocessedEntitiesRequestOptions, + ): Promise { + await this.fetch( + 'DELETE', + `entities/unprocessed/delete/${entityId}`, + options, + ); + } +} diff --git a/plugins/catalog-unprocessed-entities-common/src/api/index.ts b/plugins/catalog-unprocessed-entities-common/src/api/index.ts new file mode 100644 index 0000000000..5b8bf17e1d --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/src/api/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './api'; diff --git a/plugins/catalog-unprocessed-entities-common/src/index.ts b/plugins/catalog-unprocessed-entities-common/src/index.ts index cd5a39c731..d11cb4fdb5 100644 --- a/plugins/catalog-unprocessed-entities-common/src/index.ts +++ b/plugins/catalog-unprocessed-entities-common/src/index.ts @@ -20,4 +20,6 @@ * @packageDocumentation */ +export * from './api'; export * from './permissions'; +export * from './types'; diff --git a/plugins/catalog-unprocessed-entities-common/src/types.ts b/plugins/catalog-unprocessed-entities-common/src/types.ts new file mode 100644 index 0000000000..d7af485e83 --- /dev/null +++ b/plugins/catalog-unprocessed-entities-common/src/types.ts @@ -0,0 +1,66 @@ +/* + * 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 } from '@backstage/catalog-model'; + +/** + * Unprocessed entity data stored in the database. + * @public + */ +export type UnprocessedEntity = { + entity_id: string; + entity_ref: string; + unprocessed_entity: Entity; + unprocessed_hash?: string; + processed_entity?: Entity; + result_hash?: string; + cache?: UnprocessedEntityCache; + next_update_at: string | Date; + last_discovery_at: string | Date; // remove? + errors?: UnprocessedEntityError[]; + location_key?: string; +}; + +/** + * Unprocessed entity cache stored in the database. + * @public + */ +export type UnprocessedEntityCache = { + ttl: number; + cache: object; +}; + +/** + * Unprocessed entity error information stored in the database. + * @public + */ +export type UnprocessedEntityError = { + name: string; + message: string; + cause: { + name: string; + message: string; + stack: string; + }; +}; + +/** + * Response expected by the {@link CatalogUnprocessedEntitiesApi} + * + * @public + */ +export type CatalogUnprocessedEntitiesApiResponse = { + entities: UnprocessedEntity[]; +}; diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index a6e960367e..82ea2238bc 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -50,11 +50,11 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/catalog-model": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", + "@backstage/plugin-catalog-unprocessed-entities-common": "workspace:^", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.60", diff --git a/plugins/catalog-unprocessed-entities/report.api.md b/plugins/catalog-unprocessed-entities/report.api.md index adaf7af643..28b55b9a6d 100644 --- a/plugins/catalog-unprocessed-entities/report.api.md +++ b/plugins/catalog-unprocessed-entities/report.api.md @@ -5,24 +5,24 @@ ```ts import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; -import { Entity } from '@backstage/catalog-model'; +import { CatalogUnprocessedEntitiesApi as CatalogUnprocessedEntitiesApi_2 } from '@backstage/plugin-catalog-unprocessed-entities-common'; +import { CatalogUnprocessedEntitiesApiResponse as CatalogUnprocessedEntitiesApiResponse_2 } from '@backstage/plugin-catalog-unprocessed-entities-common'; import { JSX as JSX_2 } from 'react/jsx-runtime'; import { RouteRef } from '@backstage/core-plugin-api'; +import type { UnprocessedEntity as UnprocessedEntity_2 } from '@backstage/plugin-catalog-unprocessed-entities-common'; +import type { UnprocessedEntityCache as UnprocessedEntityCache_2 } from '@backstage/plugin-catalog-unprocessed-entities-common'; +import type { UnprocessedEntityError as UnprocessedEntityError_2 } from '@backstage/plugin-catalog-unprocessed-entities-common'; -// @public -export interface CatalogUnprocessedEntitiesApi { - delete(entityId: string): Promise; - failed(): Promise; - pending(): Promise; -} +// @public @deprecated +export interface CatalogUnprocessedEntitiesApi + extends CatalogUnprocessedEntitiesApi_2 {} // @public export const catalogUnprocessedEntitiesApiRef: ApiRef; -// @public -export type CatalogUnprocessedEntitiesApiResponse = { - entities: UnprocessedEntity[]; -}; +// @public @deprecated +export type CatalogUnprocessedEntitiesApiResponse = + CatalogUnprocessedEntitiesApiResponse_2; // @public export const CatalogUnprocessedEntitiesPage: () => JSX_2.Element; @@ -38,37 +38,14 @@ export const catalogUnprocessedEntitiesPlugin: BackstagePlugin< // @public (undocumented) export const UnprocessedEntitiesContent: () => JSX_2.Element; -// @public -export type UnprocessedEntity = { - entity_id: string; - entity_ref: string; - unprocessed_entity: Entity; - unprocessed_hash?: string; - processed_entity?: Entity; - result_hash?: string; - cache?: UnprocessedEntityCache; - next_update_at: string | Date; - last_discovery_at: string | Date; - errors?: UnprocessedEntityError[]; - location_key?: string; -}; +// @public @deprecated +export type UnprocessedEntity = UnprocessedEntity_2; -// @public -export type UnprocessedEntityCache = { - ttl: number; - cache: object; -}; +// @public @deprecated +export type UnprocessedEntityCache = UnprocessedEntityCache_2; -// @public -export type UnprocessedEntityError = { - name: string; - message: string; - cause: { - name: string; - message: string; - stack: string; - }; -}; +// @public @deprecated +export type UnprocessedEntityError = UnprocessedEntityError_2; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-unprocessed-entities/src/api/index.ts b/plugins/catalog-unprocessed-entities/src/api/index.ts index 67daa81319..cec9bd29bd 100644 --- a/plugins/catalog-unprocessed-entities/src/api/index.ts +++ b/plugins/catalog-unprocessed-entities/src/api/index.ts @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { createApiRef } from '@backstage/core-plugin-api'; import { - DiscoveryApi, - createApiRef, - FetchApi, -} from '@backstage/core-plugin-api'; -import { ResponseError } from '@backstage/errors'; -import { UnprocessedEntity } from '../types'; + CatalogUnprocessedEntitiesApiResponse as CommonCatalogUnprocessedEntitiesApiResponse, + CatalogUnprocessedEntitiesApi as CommonCatalogUnprocessedEntitiesApi, + CatalogUnprocessedEntitiesClient as CommonCatalogUnprocessedEntitiesClient, +} from '@backstage/plugin-catalog-unprocessed-entities-common'; /** * {@link @backstage/core-plugin-api#ApiRef} for the {@link CatalogUnprocessedEntitiesApi} @@ -35,69 +34,24 @@ export const catalogUnprocessedEntitiesApiRef = * Response expected by the {@link CatalogUnprocessedEntitiesApi} * * @public + * @deprecated Use the type imported from `@backstage/plugin-catalog-unprocessed-entities-common` instead. */ -export type CatalogUnprocessedEntitiesApiResponse = { - entities: UnprocessedEntity[]; -}; +export type CatalogUnprocessedEntitiesApiResponse = + CommonCatalogUnprocessedEntitiesApiResponse; /** * Interface for the CatalogUnprocessedEntitiesApi. * * @public + * @deprecated Use the type imported from `@backstage/plugin-catalog-unprocessed-entities-common` instead. */ -export interface CatalogUnprocessedEntitiesApi { - /** - * Returns a list of entities with state 'pending' - */ - pending(): Promise; - /** - * Returns a list of entities with state 'failed' - */ - failed(): Promise; - /** - * Deletes an entity from the refresh_state table - */ - delete(entityId: string): Promise; -} +export interface CatalogUnprocessedEntitiesApi + extends CommonCatalogUnprocessedEntitiesApi {} /** * Default API implementation for the Catalog Unprocessed Entities plugin * * @public + * @deprecated Use the client imported from `@backstage/plugin-catalog-unprocessed-entities-common` instead. */ -export class CatalogUnprocessedEntitiesClient - implements CatalogUnprocessedEntitiesApi -{ - public discovery: DiscoveryApi; - public fetchApi: FetchApi; - - constructor(discovery: DiscoveryApi, fetchApi: FetchApi) { - this.discovery = discovery; - this.fetchApi = fetchApi; - } - - private async fetch(path: string, init?: RequestInit): Promise { - const url = await this.discovery.getBaseUrl('catalog'); - const resp = await this.fetchApi.fetch(`${url}/${path}`, init); - - if (!resp.ok) { - throw await ResponseError.fromResponse(resp); - } - - return resp.status === 204 ? (resp as T) : await resp.json(); - } - - async pending(): Promise { - return await this.fetch('entities/unprocessed/pending'); - } - - async failed(): Promise { - return await this.fetch('entities/unprocessed/failed'); - } - - async delete(entityId: string): Promise { - await this.fetch(`entities/unprocessed/delete/${entityId}`, { - method: 'DELETE', - }); - } -} +export class CatalogUnprocessedEntitiesClient extends CommonCatalogUnprocessedEntitiesClient {} diff --git a/plugins/catalog-unprocessed-entities/src/types.ts b/plugins/catalog-unprocessed-entities/src/types.ts index 65f21970f5..38b4b9dad7 100644 --- a/plugins/catalog-unprocessed-entities/src/types.ts +++ b/plugins/catalog-unprocessed-entities/src/types.ts @@ -13,45 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; +import type { + UnprocessedEntity as CommonUnprocessedEntity, + UnprocessedEntityCache as CommonUnprocessedEntityCache, + UnprocessedEntityError as CommonUnprocessedEntityError, +} from '@backstage/plugin-catalog-unprocessed-entities-common'; /** * Unprocessed entity data stored in the database. * @public + * @deprecated Use the type imported from `@backstage/plugin-catalog-unprocessed-entities-common` instead. */ -export type UnprocessedEntity = { - entity_id: string; - entity_ref: string; - unprocessed_entity: Entity; - unprocessed_hash?: string; - processed_entity?: Entity; - result_hash?: string; - cache?: UnprocessedEntityCache; - next_update_at: string | Date; - last_discovery_at: string | Date; // remove? - errors?: UnprocessedEntityError[]; - location_key?: string; -}; +export type UnprocessedEntity = CommonUnprocessedEntity; /** * Unprocessed entity cache stored in the database. * @public + * @deprecated Use the type imported from `@backstage/plugin-catalog-unprocessed-entities-common` instead. */ -export type UnprocessedEntityCache = { - ttl: number; - cache: object; -}; +export type UnprocessedEntityCache = CommonUnprocessedEntityCache; /** * Unprocessed entity error information stored in the database. * @public + * @deprecated Use the type imported from `@backstage/plugin-catalog-unprocessed-entities-common` instead. */ -export type UnprocessedEntityError = { - name: string; - message: string; - cause: { - name: string; - message: string; - stack: string; - }; -}; +export type UnprocessedEntityError = CommonUnprocessedEntityError; diff --git a/yarn.lock b/yarn.lock index 46fb5cf160..aeaa50bee5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5289,7 +5289,9 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-unprocessed-entities-common@workspace:plugins/catalog-unprocessed-entities-common" dependencies: + "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/errors": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" languageName: unknown linkType: soft @@ -5298,13 +5300,13 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-unprocessed-entities@workspace:plugins/catalog-unprocessed-entities" dependencies: - "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/frontend-plugin-api": "workspace:^" + "@backstage/plugin-catalog-unprocessed-entities-common": "workspace:^" "@material-ui/core": "npm:^4.9.13" "@material-ui/icons": "npm:^4.9.1" "@material-ui/lab": "npm:^4.0.0-alpha.60" From 96dd6074ff0267d557ac3cd8926b83f2c9ec59bc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 01:18:22 +0000 Subject: [PATCH 059/312] chore(deps): update dependency @types/lodash to v4.17.21 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 bc0a0f26b3..73f8d99aff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20849,9 +20849,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.151": - version: 4.17.20 - resolution: "@types/lodash@npm:4.17.20" - checksum: 10/8cd8ad3bd78d2e06a93ae8d6c9907981d5673655fec7cb274a4d9a59549aab5bb5b3017361280773b8990ddfccf363e14d1b37c97af8a9fe363de677f9a61524 + version: 4.17.21 + resolution: "@types/lodash@npm:4.17.21" + checksum: 10/34920830a3bc82ba619cda05e606fef00c148a69b4f19f770645d2587ccdb8e42ef3ddfc174b7884c0c709fc0a1aeb48f7326da969bad12a1464a03efbbe414c languageName: node linkType: hard From 268b0f99549f637b665943c1e8731426f7b942f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rio=20Val=C3=A9rio?= Date: Wed, 26 Nov 2025 09:46:40 +0200 Subject: [PATCH 060/312] Introduce a new optional filter in queryWithPaging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new filter will allow excluding items returned from the GitHub API, given a boolean condition, before passing them to the transformer. Signed-off-by: Valério Valério --- .../src/lib/github.ts | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts index 030fa93fad..8d8410b182 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.ts @@ -211,17 +211,6 @@ export async function getOrganizationUsers( } }`; - // Transformer to filter out suspended users, only for GitHub Enterprise instances. - const suspendedUserFilteringTransformer = async ( - item: GithubUser, - ctx: TransformerContext, - ): Promise => { - if (excludeSuspendedUsers && item.suspendedAt) { - return undefined; - } - return userTransformer(item, ctx); - }; - // There is no user -> teams edge, so we leave the memberships empty for // now and let the team iteration handle it instead @@ -230,12 +219,13 @@ export async function getOrganizationUsers( query, org, r => r.organization?.membersWithRole, - suspendedUserFilteringTransformer, + userTransformer, { org, email: tokenType === 'token', organizationMembersPageSize: pageSizes.organizationMembers, }, + u => (excludeSuspendedUsers ? !u.suspendedAt : true), ); return { users }; @@ -772,6 +762,7 @@ export async function getTeamMembers( * @param transformer - A function that, given one of the nodes in the Connection, * returns the model mapped form of it * @param variables - The variable values that the query needs, minus the cursor + * @param filter - An optional filter function to filter the nodes before transforming them */ export async function queryWithPaging< GraphqlType, @@ -788,6 +779,7 @@ export async function queryWithPaging< ctx: TransformerContext, ) => Promise, variables: Variables, + filter?: (item: GraphqlType) => boolean, ): Promise { const result: OutputType[] = []; const sleep = (ms: number) => new Promise(r => setTimeout(r, ms)); @@ -805,6 +797,9 @@ export async function queryWithPaging< } for (const node of conn.nodes) { + if (filter && !filter(node)) { + continue; + } const transformedNode = await transformer(node, { client, query, From fdfe7e5d4f9cdd1add6fcc8cec87b8e4561272e0 Mon Sep 17 00:00:00 2001 From: ElaineDeMattosSilvaB Date: Wed, 26 Nov 2025 11:53:38 +0100 Subject: [PATCH 061/312] fix: add correct name Signed-off-by: ElaineDeMattosSilvaB --- ADOPTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index e0a114d8c8..3312089f00 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -287,4 +287,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Syngenta Digital](https://www.syngentadigital.com) | [Bitan Mallick](https://www.linkedin.com/in/bitanmallick) | Internal developer portal, designed to empower developers and streamline workflows. We use software catalog, tech-radar, software templates, tech-docs and various custom plugins to ensure an efficient and collaborative development experience. | | [Sophotech](https://sopho.tech) | [@archy-rock3t-cloud](https://github.com/archy-rock3t-cloud), [Artem Muterko](mailto:artem@sopho.tech) | Custom Developer Platform based on Backstage, providing a service catalog, infrastructure templates, and integrated tooling to give developers a self-service experience. | | [Swiss Mobiliar Insurance Company Ltd.](https://www.mobiliar.ch/) | [Patrick Wyler](mailto:patrick.wyler@mobiliar.ch) and [Beat Winistörfer](mailto:beat.winistoerfer@mobiliar.ch) | The portal provides a unified interface for accessing all relevant DevOps information previously scattered across various locations, enhancing accessibility and clarity for all IT employees. It relies on an internal graph database that enhances the Backstage software catalog with many additional elements. Significant effort has been invested in the visual representation of information through graphs and diagrams, facilitating analysis and improving the understanding of dependencies. | -| [DB Systel](https://www.dbsystel.de/dbsystel-en/) | [DB Systel](https://github.com/dbsystel) | Deutsche Bahn's Internal Developer Portal leverages Backstage and Crossplane.io to deliver a fully GitOps-driven onboarding experience for engineering teams across the company. Our Scaffolder ecosystem accelerates platform setup (Artifactory, GitLab, OpenShift), service bootstrapping, automated testing, AI-ready backends, and modern frontend development. We also make heavy use of custom catalog modules and frontend plugins that support developers in checking their provisioned resources or security and compliance of their code. | +| [DB Systel GmbH](https://www.dbsystel.de/dbsystel-en/) | [DB Systel GmbH](https://github.com/dbsystel) | Deutsche Bahn's Internal Developer Portal leverages Backstage and Crossplane.io to deliver a fully GitOps-driven onboarding experience for engineering teams across the company. Our Scaffolder ecosystem accelerates platform setup (Artifactory, GitLab, OpenShift), service bootstrapping, automated testing, AI-ready backends, and modern frontend development. We also make heavy use of custom catalog modules and frontend plugins that support developers in checking their provisioned resources or security and compliance of their code. | From d629aa102158181ecca10cb8b71d934245d208bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 11:51:38 +0000 Subject: [PATCH 062/312] chore(deps): update dependency isomorphic-git to v1.35.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 14a8d6b015..e4fbe81d05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34429,8 +34429,8 @@ __metadata: linkType: hard "isomorphic-git@npm:^1.23.0": - version: 1.27.2 - resolution: "isomorphic-git@npm:1.27.2" + version: 1.35.1 + resolution: "isomorphic-git@npm:1.35.1" dependencies: async-lock: "npm:^1.4.1" clean-git-ref: "npm:^2.0.1" @@ -34439,14 +34439,13 @@ __metadata: ignore: "npm:^5.1.4" minimisted: "npm:^2.0.0" pako: "npm:^1.0.10" - path-browserify: "npm:^1.0.1" pify: "npm:^4.0.1" - readable-stream: "npm:^3.4.0" - sha.js: "npm:^2.4.9" + readable-stream: "npm:^4.0.0" + sha.js: "npm:^2.4.12" simple-get: "npm:^4.0.1" bin: isogit: cli.cjs - checksum: 10/da4fa5ae6180e4a528b84f24ad4144c1a7587d5e79ed3f323b936809dc23b133615b96d7ecbb363009a30a2c9518bdf5efd572f918ddad801edc81693ddbb175 + checksum: 10/8f9244ef09a02c2779aaf682b8db40b208860d57f1bf9deed3c35641a87221f56e490b3f94178579f95d46e6a4e1bb593590994d8138649b32d60d03f9e1f5f8 languageName: node linkType: hard @@ -45227,7 +45226,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.12, sha.js@npm:^2.4.8, sha.js@npm:^2.4.9": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.12, sha.js@npm:^2.4.8": version: 2.4.12 resolution: "sha.js@npm:2.4.12" dependencies: From 35002fb2618395b5c08b10717f1a9c7e8e47a00e Mon Sep 17 00:00:00 2001 From: ElaineDeMattosSilvaB Date: Wed, 26 Nov 2025 13:15:09 +0100 Subject: [PATCH 063/312] fix: add react-router-dom to peer deps Signed-off-by: ElaineDeMattosSilvaB --- packages/cli/templates/frontend-plugin/package.json.hbs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/cli/templates/frontend-plugin/package.json.hbs b/packages/cli/templates/frontend-plugin/package.json.hbs index fe74e0e19c..9499d11b18 100644 --- a/packages/cli/templates/frontend-plugin/package.json.hbs +++ b/packages/cli/templates/frontend-plugin/package.json.hbs @@ -32,7 +32,8 @@ }, "peerDependencies": { "react": "{{versionQuery 'react' '^16.13.1 || ^17.0.0 || ^18.0.0'}}", - "react-dom": "{{versionQuery 'react-dom' '^16.13.1 || ^17.0.0 || ^18.0.0'}}" + "react-dom": "{{versionQuery 'react-dom' '^16.13.1 || ^17.0.0 || ^18.0.0'}}", + "react-router-dom": "{{versionQuery 'react-router-dom' '^6.0.0'}}" }, "devDependencies": { "@backstage/cli": "{{versionQuery '@backstage/cli'}}", From 1733209b0dadec35290a835682e21b0b20c26623 Mon Sep 17 00:00:00 2001 From: meganide Date: Wed, 26 Nov 2025 14:26:31 +0100 Subject: [PATCH 064/312] fix: add word break style to markdown content to prevent overflow Signed-off-by: meganide --- .../core-components/src/components/WarningPanel/WarningPanel.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core-components/src/components/WarningPanel/WarningPanel.tsx b/packages/core-components/src/components/WarningPanel/WarningPanel.tsx index 7d9c4d472d..2e05784fd6 100644 --- a/packages/core-components/src/components/WarningPanel/WarningPanel.tsx +++ b/packages/core-components/src/components/WarningPanel/WarningPanel.tsx @@ -96,6 +96,7 @@ const useStyles = makeStyles( fontWeight: theme.typography.fontWeightBold, }, markdownContent: { + wordBreak: 'break-word', '& p': { display: 'inline', }, From 207c3c88b098a8953e2d21e168e4cf56875e01d7 Mon Sep 17 00:00:00 2001 From: meganide Date: Wed, 26 Nov 2025 14:42:15 +0100 Subject: [PATCH 065/312] chore: add changeset Signed-off-by: meganide --- .changeset/fuzzy-trees-live.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fuzzy-trees-live.md diff --git a/.changeset/fuzzy-trees-live.md b/.changeset/fuzzy-trees-live.md new file mode 100644 index 0000000000..84cec56fab --- /dev/null +++ b/.changeset/fuzzy-trees-live.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +long words like urls now breaks to new line on warning panels instead of overflowing the container From 7b65adeaaa744460ad9d95df7b780bd5c1f26449 Mon Sep 17 00:00:00 2001 From: Colt McKissick Date: Wed, 26 Nov 2025 11:58:17 -0500 Subject: [PATCH 066/312] fix: Update email processor ses options to match v2 Signed-off-by: Colt McKissick --- .changeset/fancy-wasps-check.md | 5 +++++ .../config.d.ts | 6 +----- .../NotificationsEmailProcessor.test.ts | 8 +++----- .../src/processor/NotificationsEmailProcessor.ts | 16 ++++++++++------ 4 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 .changeset/fancy-wasps-check.md diff --git a/.changeset/fancy-wasps-check.md b/.changeset/fancy-wasps-check.md new file mode 100644 index 0000000000..fb7fbfed73 --- /dev/null +++ b/.changeset/fancy-wasps-check.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend-module-email': minor +--- + +Changes ses configuration keys to match new configuration options in SES SDK V2 diff --git a/plugins/notifications-backend-module-email/config.d.ts b/plugins/notifications-backend-module-email/config.d.ts index 7116826c5d..f73ef1074b 100644 --- a/plugins/notifications-backend-module-email/config.d.ts +++ b/plugins/notifications-backend-module-email/config.d.ts @@ -136,14 +136,10 @@ export interface Config { * Optional SES config for mail options. Allows for delegated sender */ sesConfig?: { - /** - * ARN of the identity to use as the source of the email - */ - sourceArn?: string; /** * ARN of the identity to use for the "From"/sender address of the email */ - fromArn?: string; + fromEmailAddressIdentityArn?: string; /** * Name of the configuration set to use when sending email via ses */ diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts index ebe1b90f35..4ebc5d40a8 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts @@ -458,9 +458,7 @@ describe('NotificationsEmailProcessor', () => { sender: 'backstage@backstage.io', replyTo: 'no-reply@backstage.io', sesConfig: { - sourceArn: - 'arn:aws:ses:us-west-2:123456789012:identity/example.com', - fromArn: + fromEmailAddressIdentityArn: 'arn:aws:ses:us-west-2:123456789012:identity/example.com', }, }, @@ -497,8 +495,8 @@ describe('NotificationsEmailProcessor', () => { text: 'https://example.org/notifications', to: 'mock@backstage.io', ses: { - SourceArn: 'arn:aws:ses:us-west-2:123456789012:identity/example.com', - FromArn: 'arn:aws:ses:us-west-2:123456789012:identity/example.com', + FromEmailAddressIdentityArn: + 'arn:aws:ses:us-west-2:123456789012:identity/example.com', }, }); }); diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts index eadfe7747e..bec19e77e8 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts @@ -45,6 +45,7 @@ import { DefaultAwsCredentialsManager } from '@backstage/integration-aws-node'; import { NotificationTemplateRenderer } from '../extensions'; import Mail from 'nodemailer/lib/mailer'; import pThrottle from 'p-throttle'; +import { SendEmailCommandInput } from '@aws-sdk/client-sesv2'; export class NotificationsEmailProcessor implements NotificationProcessor { private transporter: any; @@ -307,19 +308,22 @@ export class NotificationsEmailProcessor implements NotificationProcessor { return contentParts.join('\n\n'); } - private async getSesOptions() { + private async getSesOptions(): Promise< + Partial | undefined + > { if (!this.sesConfig) { return undefined; } - const ses: Record = {}; - const sourceArn = this.sesConfig.getOptionalString('sourceArn'); - const fromArn = this.sesConfig.getOptionalString('fromArn'); + const ses: Partial = {}; + const fromEmailAddressIdentityArn = this.sesConfig.getOptionalString( + 'fromEmailAddressIdentityArn', + ); const configurationSetName = this.sesConfig.getOptionalString( 'configurationSetName', ); - if (sourceArn) ses.SourceArn = sourceArn; - if (fromArn) ses.FromArn = fromArn; + if (fromEmailAddressIdentityArn) + ses.FromEmailAddressIdentityArn = fromEmailAddressIdentityArn; if (configurationSetName) ses.ConfigurationSetName = configurationSetName; return Object.keys(ses).length > 0 ? ses : undefined; From db7612ae58ab4f6624b014543e21eb17e48352bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:46:16 +0000 Subject: [PATCH 067/312] chore(deps): update dependency node-forge to v1.3.2 [security] 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 14a8d6b015..3502df3388 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39192,9 +39192,9 @@ __metadata: linkType: hard "node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 10/05bab6868633bf9ad4c3b1dd50ec501c22ffd69f556cdf169a00998ca1d03e8107a6032ba013852f202035372021b845603aeccd7dfcb58cdb7430013b3daa8d + version: 1.3.2 + resolution: "node-forge@npm:1.3.2" + checksum: 10/dcc54aaffe0cf52367214a20c0032aa9b209d9095dd14526504f1972d1900a07e96046b3684cb0c8d0cc3d48744dd18e02b7b447ab28fac615ffb850beeabf18 languageName: node linkType: hard From 82879a3876b257d01c6ba4a0a917ac7bece7bb31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 23:29:09 +0000 Subject: [PATCH 068/312] build(deps): bump node-forge from 1.3.1 to 1.3.2 in /microsite Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2. - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2) --- updated-dependencies: - dependency-name: node-forge dependency-version: 1.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 6badb33181..f609e343c5 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -10631,9 +10631,9 @@ __metadata: linkType: hard "node-forge@npm:^1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 10/05bab6868633bf9ad4c3b1dd50ec501c22ffd69f556cdf169a00998ca1d03e8107a6032ba013852f202035372021b845603aeccd7dfcb58cdb7430013b3daa8d + version: 1.3.2 + resolution: "node-forge@npm:1.3.2" + checksum: 10/dcc54aaffe0cf52367214a20c0032aa9b209d9095dd14526504f1972d1900a07e96046b3684cb0c8d0cc3d48744dd18e02b7b447ab28fac615ffb850beeabf18 languageName: node linkType: hard From 5bacf55cd74fe2e36032a176ae827c37600b917c Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Wed, 26 Nov 2025 17:41:51 +0100 Subject: [PATCH 069/312] fix(ui): apply className only to root element in ButtonIcon Remove duplicate className application from inner elements (content and spinner). The className prop should only be applied to the root button element, matching the behavior of the Button component. Signed-off-by: Johan Persson --- .changeset/common-coins-stare.md | 7 +++++++ .patches/pr-31900.txt | 1 + packages/ui/src/components/ButtonIcon/ButtonIcon.tsx | 2 -- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .changeset/common-coins-stare.md create mode 100644 .patches/pr-31900.txt diff --git a/.changeset/common-coins-stare.md b/.changeset/common-coins-stare.md new file mode 100644 index 0000000000..0bd0078cf9 --- /dev/null +++ b/.changeset/common-coins-stare.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fixed `ButtonIcon` incorrectly applying `className` to inner elements instead of only the root element. + +Affected components: ButtonIcon diff --git a/.patches/pr-31900.txt b/.patches/pr-31900.txt new file mode 100644 index 0000000000..43616d0e98 --- /dev/null +++ b/.patches/pr-31900.txt @@ -0,0 +1 @@ +Fix incorrectly applying className to three elements internally in ButtonIcon. \ No newline at end of file diff --git a/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx b/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx index d3596da799..9bbeca9d5b 100644 --- a/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx +++ b/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx @@ -64,7 +64,6 @@ export const ButtonIcon = forwardRef( classNamesButtonIcon.content, stylesButton[classNames.content], stylesButtonIcon[classNamesButtonIcon.content], - className, )} > {icon} @@ -79,7 +78,6 @@ export const ButtonIcon = forwardRef( classNamesButtonIcon.spinner, stylesButton[classNames.spinner], stylesButtonIcon[classNamesButtonIcon.spinner], - className, )} > ) : undefined} + {groupedResponses.secrets.length > 0 ? ( + + + + ) : undefined} {groupedResponses.cronJobs.length > 0 ? ( diff --git a/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsAccordions.test.tsx b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsAccordions.test.tsx new file mode 100644 index 0000000000..1bdafa293b --- /dev/null +++ b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsAccordions.test.tsx @@ -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 { screen } from '@testing-library/react'; +import { SecretsAccordions } from './SecretsAccordions'; +import * as oneSecretsFixture from '../../__fixtures__/1-secrets.json'; +import * as twoSecretsFixture from '../../__fixtures__/2-secrets.json'; +import { renderInTestApp } from '@backstage/test-utils'; +import { kubernetesProviders } from '../../hooks/test-utils'; + +describe('SecretsAccordions', () => { + it('should render 1 secret', async () => { + const wrapper = kubernetesProviders(oneSecretsFixture, new Set()); + + await renderInTestApp(wrapper()); + + expect(screen.getByText('app-secret')).toBeInTheDocument(); + expect(screen.getByText('Secret')).toBeInTheDocument(); + expect(screen.getByText('namespace: default')).toBeInTheDocument(); + expect(screen.getByText('Data Count: 4')).toBeInTheDocument(); + }); + + it('should render 2 secrets', async () => { + const wrapper = kubernetesProviders(twoSecretsFixture, new Set()); + + await renderInTestApp(wrapper()); + + expect(screen.getByText('app-secret')).toBeInTheDocument(); + expect(screen.getByText('redis-secret')).toBeInTheDocument(); + expect(screen.getAllByText('Secret')).toHaveLength(2); + expect(screen.getAllByText('namespace: default')).toHaveLength(2); + expect(screen.getByText('Data Count: 4')).toBeInTheDocument(); + expect(screen.getByText('Data Count: 3')).toBeInTheDocument(); + }); +}); diff --git a/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsAccordions.tsx b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsAccordions.tsx new file mode 100644 index 0000000000..4271a2af8b --- /dev/null +++ b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsAccordions.tsx @@ -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 { useContext } from 'react'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import type { V1Secret } from '@kubernetes/client-node'; +import { SecretsDrawer } from './SecretsDrawer.tsx'; +import { GroupedResponsesContext } from '../../hooks'; +import { StructuredMetadataTable } from '@backstage/core-components'; + +type SecretSummaryProps = { + secret: V1Secret; +}; + +const SecretSummary = ({ secret }: SecretSummaryProps) => { + return ( + + + + + + + + Data Count: {secret.data ? Object.keys(secret.data).length : 0} + + + + ); +}; + +type SecretsCardProps = { + secret: V1Secret; +}; + +const SecretCard = ({ secret }: SecretsCardProps) => { + const metadata: any = {}; + + metadata.data = secret.data; + + return ( + + ); +}; + +export type SecretsAccordionsProps = {}; + +type SecretsAccordionProps = { + secret: V1Secret; +}; + +const SecretsAccordion = ({ secret }: SecretsAccordionProps) => { + return ( + + }> + + + + + + + ); +}; + +export const SecretsAccordions = ({}: SecretsAccordionsProps) => { + const groupedResponses = useContext(GroupedResponsesContext); + return ( + + {groupedResponses.secrets.map((secret, i) => ( + + + + ))} + + ); +}; diff --git a/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsDrawer.test.tsx b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsDrawer.test.tsx new file mode 100644 index 0000000000..6dd1230ee4 --- /dev/null +++ b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsDrawer.test.tsx @@ -0,0 +1,37 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as oneSecretsFixture from '../../__fixtures__/1-secrets.json'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { SecretsDrawer } from './SecretsDrawer'; +import { kubernetesClusterLinkFormatterApiRef } from '../../api'; + +describe('SecretsDrawer', () => { + it('should render secret drawer', async () => { + const { getByText, getAllByText } = await renderInTestApp( + + + , + ); + + expect(getAllByText('app-secret')).toHaveLength(3); + expect(getAllByText('Secret')).toHaveLength(3); + expect(getByText('YAML')).toBeInTheDocument(); + expect(getByText('namespace: default')).toBeInTheDocument(); + }); +}); diff --git a/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsDrawer.tsx b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsDrawer.tsx new file mode 100644 index 0000000000..72df6bdae9 --- /dev/null +++ b/plugins/kubernetes-react/src/components/SecretsAccordions/SecretsDrawer.tsx @@ -0,0 +1,64 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import Chip from '@material-ui/core/Chip'; +import type { V1Secret } from '@kubernetes/client-node'; + +export const SecretsDrawer = ({ + secret, + expanded, +}: { + secret: V1Secret; + expanded?: boolean; +}) => { + const namespace = secret.metadata?.namespace; + return ( + { + return secretObject || {}; + }} + > + + + + {secret.metadata?.name ?? 'unknown object'} + + + + + Secret + + + {namespace && ( + + + + )} + + + ); +}; diff --git a/plugins/kubernetes-react/src/components/SecretsAccordions/index.ts b/plugins/kubernetes-react/src/components/SecretsAccordions/index.ts new file mode 100644 index 0000000000..461537fe72 --- /dev/null +++ b/plugins/kubernetes-react/src/components/SecretsAccordions/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './SecretsAccordions.tsx'; diff --git a/plugins/kubernetes-react/src/hooks/GroupedResponses.ts b/plugins/kubernetes-react/src/hooks/GroupedResponses.ts index 1dbf16c57e..750ee58846 100644 --- a/plugins/kubernetes-react/src/hooks/GroupedResponses.ts +++ b/plugins/kubernetes-react/src/hooks/GroupedResponses.ts @@ -28,6 +28,7 @@ export const GroupedResponsesContext = createContext({ daemonSets: [], services: [], configMaps: [], + secrets: [], horizontalPodAutoscalers: [], ingresses: [], jobs: [], From a416ee3fa928f19a26a21cdeb1715233bd226568 Mon Sep 17 00:00:00 2001 From: bi003731 Date: Mon, 1 Dec 2025 21:48:51 -0300 Subject: [PATCH 100/312] API Reports Signed-off-by: bi003731 --- plugins/scaffolder-backend-module-gitlab/report.api.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/report.api.md b/plugins/scaffolder-backend-module-gitlab/report.api.md index 2646d2e356..2ff099d469 100644 --- a/plugins/scaffolder-backend-module-gitlab/report.api.md +++ b/plugins/scaffolder-backend-module-gitlab/report.api.md @@ -46,7 +46,7 @@ export const createGitlabIssueAction: (options: { discussionToResolve?: string | undefined; epicId?: number | undefined; labels?: string | undefined; - issueType?: 'issue' | 'incident' | 'test_case' | 'task' | undefined; + issueType?: 'issue' | 'task' | 'incident' | 'test_case' | undefined; mergeRequestToResolveDiscussionsOf?: number | undefined; milestoneId?: number | undefined; weight?: number | undefined; @@ -130,7 +130,7 @@ export const createGitlabRepoPushAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'auto' | 'update' | 'create' | 'delete' | undefined; + commitAction?: 'auto' | 'update' | 'delete' | 'create' | undefined; }, { projectid: string; @@ -163,7 +163,7 @@ export function createPublishGitlabAction(options: { visibility?: 'internal' | 'private' | 'public' | undefined; path?: string | undefined; description?: string | undefined; - merge_method?: 'merge' | 'ff' | 'rebase_merge' | undefined; + merge_method?: 'merge' | 'rebase_merge' | 'ff' | undefined; topics?: string[] | undefined; auto_devops_enabled?: boolean | undefined; only_allow_merge_if_pipeline_succeeds?: boolean | undefined; @@ -224,7 +224,7 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'auto' | 'update' | 'skip' | 'create' | 'delete' | undefined; + commitAction?: 'auto' | 'update' | 'delete' | 'create' | 'skip' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; @@ -275,7 +275,7 @@ export const editGitlabIssueAction: (options: { discussionLocked?: boolean | undefined; dueDate?: string | undefined; epicId?: number | undefined; - issueType?: 'issue' | 'incident' | 'test_case' | 'task' | undefined; + issueType?: 'issue' | 'task' | 'incident' | 'test_case' | undefined; labels?: string | undefined; milestoneId?: number | undefined; removeLabels?: string | undefined; From bc5810372670f0d12253fab45e40591d628dfa44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 02:04:47 +0000 Subject: [PATCH 101/312] chore(deps): update dependency nodemailer to v7.0.11 [security] 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 3502df3388..5f0b03a5e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39425,9 +39425,9 @@ __metadata: linkType: hard "nodemailer@npm:^7.0.7": - version: 7.0.10 - resolution: "nodemailer@npm:7.0.10" - checksum: 10/b9b8794ffc6c0d84440a9dd422664908e9c2003a15cb0e6bdd240a3625121de3978323c2ba4af78080fd735ef514d6caed376bd5f5dd6c17cf0d2c399d0dc354 + version: 7.0.11 + resolution: "nodemailer@npm:7.0.11" + checksum: 10/2ad4dd56a4caf84a83aa6f4378ded26d5ef8a644ca3be09c3b4fb2255d861369e620f29be6c3c97148ac4a50aa5fdff6240b9d60805362bd99ca15f2ea62e8a2 languageName: node linkType: hard From 459df27cc746f59cce381053d84850df6f51cfd3 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 2 Dec 2025 11:02:59 +0100 Subject: [PATCH 102/312] Update versioning for GitHub plugins to patch Introduce a configuration option to exclude suspended users from GitHub Enterprise instances. Signed-off-by: Ben Lambert --- .changeset/fuzzy-phones-own.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/fuzzy-phones-own.md b/.changeset/fuzzy-phones-own.md index 69a40e29b2..61725d1f1d 100644 --- a/.changeset/fuzzy-phones-own.md +++ b/.changeset/fuzzy-phones-own.md @@ -1,6 +1,6 @@ --- -'@backstage/plugin-catalog-backend-module-github-org': minor -'@backstage/plugin-catalog-backend-module-github': minor +'@backstage/plugin-catalog-backend-module-github-org': patch +'@backstage/plugin-catalog-backend-module-github': patch --- Introduce new configuration option to exclude suspended users from GitHub Enterprise instances. From 7e60fc82bb14bf54d3ef26c13c7a57fd1198b3b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 10:10:25 +0000 Subject: [PATCH 103/312] chore(deps): bump express from 4.21.0 to 4.22.1 in /microsite Bumps [express](https://github.com/expressjs/express) from 4.21.0 to 4.22.1. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.0...v4.22.1) --- updated-dependencies: - dependency-name: express dependency-version: 4.22.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- microsite/yarn.lock | 206 +++++++++++++++++++++++++------------------- 1 file changed, 119 insertions(+), 87 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 6badb33181..cb0bba7b6d 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -4358,23 +4358,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.3": - version: 1.20.3 - resolution: "body-parser@npm:1.20.3" +"body-parser@npm:~1.20.3": + version: 1.20.4 + resolution: "body-parser@npm:1.20.4" dependencies: - bytes: "npm:3.1.2" + bytes: "npm:~3.1.2" content-type: "npm:~1.0.5" debug: "npm:2.6.9" depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.13.0" - raw-body: "npm:2.5.2" + destroy: "npm:~1.2.0" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + on-finished: "npm:~2.4.1" + qs: "npm:~6.14.0" + raw-body: "npm:~2.5.3" type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10/8723e3d7a672eb50854327453bed85ac48d045f4958e81e7d470c56bf111f835b97e5b73ae9f6393d0011cc9e252771f46fd281bbabc57d33d3986edf1e6aeca + unpipe: "npm:~1.0.0" + checksum: 10/ff67e28d3f426707be8697a75fdf8d564dc50c341b41f054264d8ab6e2924e519c7ce8acc9d0de05328fdc41e1d9f3f200aec9c1cfb1867d6b676a410d97c689 languageName: node linkType: hard @@ -4591,7 +4591,7 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2": +"bytes@npm:~3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10/a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 @@ -5223,7 +5223,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4": +"content-disposition@npm:~0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -5246,17 +5246,17 @@ __metadata: languageName: node linkType: hard -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: 10/f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a +"cookie-signature@npm:~1.0.6": + version: 1.0.7 + resolution: "cookie-signature@npm:1.0.7" + checksum: 10/1a62808cd30d15fb43b70e19829b64d04b0802d8ef00275b57d152de4ae6a3208ca05c197b6668d104c4d9de389e53ccc2d3bc6bcaaffd9602461417d8c40710 languageName: node linkType: hard -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: 10/c1f8f2ea7d443b9331680598b0ae4e6af18a618c37606d1bbdc75bec8361cce09fe93e727059a673f2ba24467131a9fb5a4eec76bb1b149c1b3e1ccb268dc583 +"cookie@npm:~0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10/24b286c556420d4ba4e9bc09120c9d3db7d28ace2bd0f8ccee82422ce42322f73c8312441271e5eefafbead725980e5996cc02766dbb89a90ac7f5636ede608f languageName: node linkType: hard @@ -5772,7 +5772,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10/c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca @@ -5803,7 +5803,7 @@ __metadata: languageName: node linkType: hard -"destroy@npm:1.2.0": +"destroy@npm:1.2.0, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 10/0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 @@ -6541,41 +6541,41 @@ __metadata: linkType: hard "express@npm:^4.17.3": - version: 4.21.0 - resolution: "express@npm:4.21.0" + version: 4.22.1 + resolution: "express@npm:4.22.1" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.3" - content-disposition: "npm:0.5.4" + body-parser: "npm:~1.20.3" + content-disposition: "npm:~0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.6.0" - cookie-signature: "npm:1.0.6" + cookie: "npm:~0.7.1" + cookie-signature: "npm:~1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.3.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" + finalhandler: "npm:~1.3.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.0" merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" + on-finished: "npm:~2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.10" + path-to-regexp: "npm:~0.1.12" proxy-addr: "npm:~2.0.7" - qs: "npm:6.13.0" + qs: "npm:~6.14.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.19.0" - serve-static: "npm:1.16.2" + send: "npm:~0.19.0" + serve-static: "npm:~1.16.2" setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" + statuses: "npm:~2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/3b1ee5bc5b1bd996f688702519cebc9b63a24e506965f6e1773268238cfa2c24ffdb38cc3fcb4fde66f77de1c0bebd9ee058dad06bb9c6f084b525f3c09164d3 + checksum: 10/f33c1bd0c7d36e2a1f18de9cdc176469d32f68e20258d2941b8d296ab9a4fd9011872c246391bf87714f009fac5114c832ec5ac65cbee39421f1258801eb8470 languageName: node linkType: hard @@ -6723,18 +6723,18 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.3.1": - version: 1.3.1 - resolution: "finalhandler@npm:1.3.1" +"finalhandler@npm:~1.3.1": + version: 1.3.2 + resolution: "finalhandler@npm:1.3.2" dependencies: debug: "npm:2.6.9" encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" + on-finished: "npm:~2.4.1" parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" + statuses: "npm:~2.0.2" unpipe: "npm:~1.0.0" - checksum: 10/4babe72969b7373b5842bc9f75c3a641a4d0f8eb53af6b89fa714d4460ce03fb92b28de751d12ba415e96e7e02870c436d67412120555e2b382640535697305b + checksum: 10/6cb4f9f80eaeb5a0fac4fdbd27a65d39271f040a0034df16556d896bfd855fd42f09da886781b3102117ea8fceba97b903c1f8b08df1fb5740576d5e0f481eed languageName: node linkType: hard @@ -6872,7 +6872,7 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2": +"fresh@npm:0.5.2, fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 10/64c88e489b5d08e2f29664eb3c79c705ff9a8eb15d3e597198ef76546d4ade295897a44abb0abd2700e7ef784b2e3cbf1161e4fbf16f59129193fd1030d16da1 @@ -7751,6 +7751,19 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" + dependencies: + depd: "npm:~2.0.0" + inherits: "npm:~2.0.4" + setprototypeof: "npm:~1.2.0" + statuses: "npm:~2.0.2" + toidentifier: "npm:~1.0.1" + checksum: 10/9fe31bc0edf36566c87048aed1d3d0cbe03552564adc3541626a0613f542d753fbcb13bdfcec0a3a530dbe1714bb566c89d46244616b66bddd26ac413b06a207 + languageName: node + linkType: hard + "http-parser-js@npm:>=0.5.1": version: 0.5.8 resolution: "http-parser-js@npm:0.5.8" @@ -7865,15 +7878,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 - languageName: node - linkType: hard - "iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -7883,6 +7887,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:~0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 + languageName: node + linkType: hard + "icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": version: 5.1.0 resolution: "icss-utils@npm:5.1.0" @@ -10909,7 +10922,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -11287,13 +11300,6 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.10": - version: 0.1.10 - resolution: "path-to-regexp@npm:0.1.10" - checksum: 10/894e31f1b20e592732a87db61fff5b95c892a3fe430f9ab18455ebe69ee88ef86f8eb49912e261f9926fc53da9f93b46521523e33aefd9cb0a7b0d85d7096006 - languageName: node - linkType: hard - "path-to-regexp@npm:2.2.1": version: 2.2.1 resolution: "path-to-regexp@npm:2.2.1" @@ -11310,6 +11316,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:~0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10/2e30f6a0144679c1f95c98e166b96e6acd1e72be9417830fefc8de7ac1992147eb9a4c7acaa59119fb1b3c34eec393b2129ef27e24b2054a3906fc4fb0d1398e + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -12049,16 +12062,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.13.0": - version: 6.13.0 - resolution: "qs@npm:6.13.0" - dependencies: - side-channel: "npm:^1.0.6" - checksum: 10/f548b376e685553d12e461409f0d6e5c59ec7c7d76f308e2a888fd9db3e0c5e89902bedd0754db3a9038eda5f27da2331a6f019c8517dc5e0a16b3c9a6e9cef8 - languageName: node - linkType: hard - -"qs@npm:^6.12.3": +"qs@npm:^6.12.3, qs@npm:~6.14.0": version: 6.14.0 resolution: "qs@npm:6.14.0" dependencies: @@ -12130,15 +12134,15 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" +"raw-body@npm:~2.5.3": + version: 2.5.3 + resolution: "raw-body@npm:2.5.3" dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10/863b5171e140546a4d99f349b720abac4410338e23df5e409cfcc3752538c9caf947ce382c89129ba976f71894bd38b5806c774edac35ebf168d02aa1ac11a95 + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + unpipe: "npm:~1.0.0" + checksum: 10/f35759fe5a6548e7c529121ead1de4dd163f899749a5896c42e278479df2d9d7f98b5bb17312737c03617765e5a1433e586f717616e5cfbebc13b4738b820601 languageName: node linkType: hard @@ -13199,6 +13203,27 @@ __metadata: languageName: node linkType: hard +"send@npm:~0.19.0": + version: 0.19.1 + resolution: "send@npm:0.19.1" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10/360bf50a839c7bbc181f67c3a0f3424a7ad8016dfebcd9eb90891f4b762b4377da14414c32250d67b53872e884171c27469110626f6c22765caa7c38c207ee1d + languageName: node + linkType: hard + "serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" @@ -13239,7 +13264,7 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.16.2": +"serve-static@npm:~1.16.2": version: 1.16.2 resolution: "serve-static@npm:1.16.2" dependencies: @@ -13286,7 +13311,7 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.2.0": +"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" checksum: 10/fde1630422502fbbc19e6844346778f99d449986b2f9cdcceb8326730d2f3d9964dbcb03c02aaadaefffecd0f2c063315ebea8b3ad895914bf1afc1747fc172e @@ -13449,7 +13474,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": +"side-channel@npm:^1.1.0": version: 1.1.0 resolution: "side-channel@npm:1.1.0" dependencies: @@ -13696,6 +13721,13 @@ __metadata: languageName: node linkType: hard +"statuses@npm:~2.0.1, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10/6927feb50c2a75b2a4caab2c565491f7a93ad3d8dbad7b1398d52359e9243a20e2ebe35e33726dee945125ef7a515e9097d8a1b910ba2bbd818265a2f6c39879 + languageName: node + linkType: hard + "std-env@npm:^3.0.1": version: 3.3.1 resolution: "std-env@npm:3.3.1" @@ -14119,7 +14151,7 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.1": +"toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" checksum: 10/952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 @@ -14470,7 +14502,7 @@ __metadata: languageName: node linkType: hard -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": +"unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" checksum: 10/4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 From f6122abbf1aa8a6866ee9ac9806ae675a0321fab Mon Sep 17 00:00:00 2001 From: bi003731 Date: Tue, 2 Dec 2025 08:55:46 -0300 Subject: [PATCH 104/312] sequential calls to glab Signed-off-by: bi003731 --- .../src/actions/gitlabRepoPush.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts index b1a88de869..bdd6321911 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts @@ -148,8 +148,9 @@ export const createGitlabRepoPushAction = (options: { const actions: CommitAction[] = ( ( - await Promise.all( - fileContents.map(async file => { + await (async () => { + const results = []; + for (const file of fileContents) { const action = await getFileAction( { file, targetPath }, { repoID, branch: branchName }, @@ -158,9 +159,10 @@ export const createGitlabRepoPushAction = (options: { remoteFiles, ctx.input.commitAction, ); - return { file, action }; - }), - ) + results.push({ file, action }); + } + return results; + })() ).filter(o => o.action !== 'skip') as { file: SerializedFile; action: CommitAction['action']; From 8d6709e38ec228e359a3734d58488f3897a66dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 2 Dec 2025 13:36:05 +0100 Subject: [PATCH 105/312] techdocs-addons-test-utils: major bump to remove explicit screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/fruity-words-melt.md | 5 + .changeset/old-parks-smell.md | 20 ++ .../techdocs-addons-test-utils/package.json | 2 +- .../techdocs-addons-test-utils/report.api.md | 9 +- .../src/test-utils.tsx | 30 +- .../package.json | 3 +- .../ExpandableNavigation.test.tsx | 44 +-- .../src/LightBox/LightBox.test.tsx | 17 +- .../src/ReportIssue/ReportIssue.test.tsx | 295 +++++++++--------- .../src/TextSize/TextSize.test.tsx | 60 ++-- yarn.lock | 19 +- 11 files changed, 273 insertions(+), 231 deletions(-) create mode 100644 .changeset/fruity-words-melt.md create mode 100644 .changeset/old-parks-smell.md diff --git a/.changeset/fruity-words-melt.md b/.changeset/fruity-words-melt.md new file mode 100644 index 0000000000..0f02acee2b --- /dev/null +++ b/.changeset/fruity-words-melt.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +--- + +Updated tests to match test-utils change diff --git a/.changeset/old-parks-smell.md b/.changeset/old-parks-smell.md new file mode 100644 index 0000000000..f089c7da21 --- /dev/null +++ b/.changeset/old-parks-smell.md @@ -0,0 +1,20 @@ +--- +'@backstage/plugin-techdocs-addons-test-utils': major +--- + +**BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value. + +Newer versions of `@testing-library` recommends using the `screen` export for assertions - and removing this from the addon tester contract allows us to more freely iterate on which underlying version of the testing library is being used. + +One notable effect of this, however, is that the `@testing-library` `screen` does NOT support assertions on the shadow DOM, which techdocs relies on. You will therefore want to add a dependency on [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) in your tests, and using its `screen` and its dedicated `*Shadow*` methods. As an example, if you keep doing `getByText` you will not get matches inside the shadow DOM - switch to `getByShadowText` instead. + +```ts +import { screen } from 'shadow-dom-testing-library'; + +// ... render the addon ... +await TechDocsAddonTester.buildAddonsInTechDocs([]) + .withDom(TEST_CONTENT) + .renderWithEffects(); + +expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument(); +``` diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 4cf74ec69f..5a4929aabb 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -49,7 +49,7 @@ "@backstage/plugin-techdocs": "workspace:^", "@backstage/plugin-techdocs-react": "workspace:^", "@backstage/test-utils": "workspace:^", - "testing-library__dom": "^7.29.4-beta.1" + "shadow-dom-testing-library": "^1.13.1" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/techdocs-addons-test-utils/report.api.md b/plugins/techdocs-addons-test-utils/report.api.md index a963c239e2..a3326779d7 100644 --- a/plugins/techdocs-addons-test-utils/report.api.md +++ b/plugins/techdocs-addons-test-utils/report.api.md @@ -6,7 +6,6 @@ import { ApiRef } from '@backstage/core-plugin-api'; import { JSXElementConstructor } from 'react'; import { ReactElement } from 'react'; -import { screen as screen_2 } from 'testing-library__dom'; import { TechDocsEntityMetadata } from '@backstage/plugin-techdocs-react'; import { TechDocsMetadata } from '@backstage/plugin-techdocs-react'; @@ -16,11 +15,9 @@ export class TechDocsAddonTester { atPath(path: string): this; build(): ReactElement>; static buildAddonsInTechDocs(addons: ReactElement[]): TechDocsAddonTester; - renderWithEffects(): Promise< - typeof screen_2 & { - shadowRoot: ShadowRoot | null; - } - >; + renderWithEffects(): Promise<{ + shadowRoot: ShadowRoot | null; + }>; withApis(apis: TechdocsAddonTesterApis): this; withDom(dom: ReactElement): this; withEntity(entity: Partial): this; diff --git a/plugins/techdocs-addons-test-utils/src/test-utils.tsx b/plugins/techdocs-addons-test-utils/src/test-utils.tsx index a7cb74cb93..886a03007f 100644 --- a/plugins/techdocs-addons-test-utils/src/test-utils.tsx +++ b/plugins/techdocs-addons-test-utils/src/test-utils.tsx @@ -18,7 +18,7 @@ import { cloneElement, ReactElement } from 'react'; // Shadow DOM support for the simple and complete DOM testing utilities // https://github.com/testing-library/dom-testing-library/issues/742#issuecomment-674987855 -import { screen } from 'testing-library__dom'; +import { screen } from 'shadow-dom-testing-library'; import { Route } from 'react-router-dom'; import { act, render } from '@testing-library/react'; @@ -320,6 +320,25 @@ export class TechDocsAddonTester { * Render the Addon within a fully configured and mocked TechDocs reader. * * @remarks + * + * Note that to make assertions on the shadow dom, add a dependency on + * [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) + * and use its screen as follows: + * + * ```ts + * import { screen } from 'shadow-dom-testing-library'; + * + * // ... render the addon ... + * await TechDocsAddonTester.buildAddonsInTechDocs([]) + * .withDom(TEST_CONTENT) + * .renderWithEffects(); + * + * expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument(); + * ``` + * + * For items outside of the shadow dom, you can still use the regular screen + * from `@testing-library/react`. + * * Components using useEffect to perform an asynchronous action (such as * fetch) must be rendered within an async act call to properly get the final * state, even with mocked responses. This utility method makes the signature @@ -329,17 +348,16 @@ export class TechDocsAddonTester { * @see https://github.com/testing-library/react-testing-library/issues/281 * @see https://github.com/facebook/react/pull/14853 */ - async renderWithEffects(): Promise< - typeof screen & { shadowRoot: ShadowRoot | null } - > { + async renderWithEffects(): Promise<{ shadowRoot: ShadowRoot | null }> { await act(async () => { render(this.build()); }); - const shadowHost = await screen.findByTestId('techdocs-native-shadowroot'); + const shadowHost = await screen.findByShadowTestId( + 'techdocs-native-shadowroot', + ); return { - ...screen, shadowRoot: shadowHost?.shadowRoot || null, }; } diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 339ee31bf8..5e08d511ee 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -75,7 +75,8 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.3.0", + "shadow-dom-testing-library": "^1.13.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", diff --git a/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.test.tsx b/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.test.tsx index 90a3fa7378..c4d07df7ee 100644 --- a/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.test.tsx +++ b/plugins/techdocs-module-addons-contrib/src/ExpandableNavigation/ExpandableNavigation.test.tsx @@ -17,6 +17,7 @@ import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils'; import { fireEvent, waitFor } from '@testing-library/react'; +import { screen } from 'shadow-dom-testing-library'; import { ExpandableNavigation } from '../plugin'; import { entityPresentationApiRef } from '@backstage/plugin-catalog-react'; @@ -94,25 +95,24 @@ describe('ExpandableNavigation', () => { }); it('renders without exploding', async () => { - const { getByRole } = await TechDocsAddonTester.buildAddonsInTechDocs([ + await TechDocsAddonTester.buildAddonsInTechDocs([]) + .withDom(mockNavWithSublevels) + .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) + .renderWithEffects(); + + expect( + screen.getByShadowRole('button', { name: 'expand-nav' }), + ).toBeInTheDocument(); + }); + + it('expands and collapses navigation', async () => { + const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([ , ]) .withDom(mockNavWithSublevels) .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) .renderWithEffects(); - expect(getByRole('button', { name: 'expand-nav' })).toBeInTheDocument(); - }); - - it('expands and collapses navigation', async () => { - const { getByRole, shadowRoot } = - await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) - .withDom(mockNavWithSublevels) - .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) - .renderWithEffects(); - const toggles = shadowRoot!.querySelectorAll('.md-toggle'); @@ -121,18 +121,24 @@ describe('ExpandableNavigation', () => { expect(item).not.toBeChecked(); }); - const expandButton = getByRole('button', { name: 'expand-nav' }); + const expandButton = screen.getByShadowRole('button', { + name: 'expand-nav', + }); fireEvent.click(expandButton); await waitFor(() => { - expect(getByRole('button', { name: 'collapse-nav' })).toBeInTheDocument(); + expect( + screen.getByShadowRole('button', { name: 'collapse-nav' }), + ).toBeInTheDocument(); toggles.forEach(item => { expect(item).toBeChecked(); }); }); - const collapseButton = getByRole('button', { name: 'collapse-nav' }); + const collapseButton = screen.getByShadowRole('button', { + name: 'collapse-nav', + }); fireEvent.click(collapseButton); @@ -144,15 +150,13 @@ describe('ExpandableNavigation', () => { }); it('does not render when navigation has no sublevels', async () => { - const { queryByRole } = await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) + await TechDocsAddonTester.buildAddonsInTechDocs([]) .withDom(mockNavWithoutSublevels) .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) .renderWithEffects(); expect( - queryByRole('button', { name: 'expand-nav' }), + screen.queryByShadowRole('button', { name: 'expand-nav' }), ).not.toBeInTheDocument(); }); }); diff --git a/plugins/techdocs-module-addons-contrib/src/LightBox/LightBox.test.tsx b/plugins/techdocs-module-addons-contrib/src/LightBox/LightBox.test.tsx index 7171629d89..0f618013f1 100644 --- a/plugins/techdocs-module-addons-contrib/src/LightBox/LightBox.test.tsx +++ b/plugins/techdocs-module-addons-contrib/src/LightBox/LightBox.test.tsx @@ -15,6 +15,7 @@ */ import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils'; +import { screen } from 'shadow-dom-testing-library'; import { LightBox } from '../plugin'; import { entityPresentationApiRef } from '@backstage/plugin-catalog-react'; @@ -30,20 +31,16 @@ describe('LightBox', () => { }); it('renders without exploding', async () => { - const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) + await TechDocsAddonTester.buildAddonsInTechDocs([]) .withDom(TEST_CONTENT) .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) .renderWithEffects(); - expect(getByText('TEST_CONTENT')).toBeInTheDocument(); + expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument(); }); it('Add onclick event to images', async () => { - const { getByTestId } = await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) + await TechDocsAddonTester.buildAddonsInTechDocs([]) .withDom( { .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) .renderWithEffects(); - expect(getByTestId('fixture').onclick).not.toBeUndefined(); - expect(getByTestId('fixture').onclick).toEqual(expect.any(Function)); + expect(screen.getByShadowTestId('fixture').onclick).not.toBeUndefined(); + expect(screen.getByShadowTestId('fixture').onclick).toEqual( + expect.any(Function), + ); }); }); diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx index 1ee9e87e05..153c1c603f 100644 --- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx +++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx @@ -17,6 +17,7 @@ import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils'; import { fireEvent, waitFor } from '@testing-library/react'; +import { screen } from 'shadow-dom-testing-library'; import { scmIntegrationsApiRef } from '@backstage/integration-react'; import { ReportIssue } from '../plugin'; @@ -67,58 +68,57 @@ describe('ReportIssue', () => { it('renders github link without exploding', async () => { byUrl.mockReturnValue({ type: 'github' }); - const { shadowRoot, getByText } = - await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) - .withDom( - - - -
-
-
-
+ const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([ + , + ]) + .withDom( + + + +
+
+
+
-
- + - - , - ) - .withApis([ - [scmIntegrationsApiRef, { byUrl }], - [entityPresentationApiRef, entityPresentationApiMock], - ]) - .renderWithEffects(); +
+ + , + ) + .withApis([ + [scmIntegrationsApiRef, { byUrl }], + [entityPresentationApiRef, entityPresentationApiMock], + ]) + .renderWithEffects(); (shadowRoot as ShadowRoot & Pick).getSelection = () => selection; await waitFor(() => { - expect(getByText('Edit page')).toBeInTheDocument(); + expect(screen.getByShadowText('Edit page')).toBeInTheDocument(); }); fireSelectionChangeEvent(window); await waitFor(() => { - const link = getByText('Open new Github issue'); + const link = screen.getByShadowText('Open new Github issue'); expect(link).toHaveAttribute( 'href', 'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20his%20&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20his%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fdocs%2FREADME.md%3E', @@ -128,60 +128,61 @@ describe('ReportIssue', () => { it('renders gitlab link without exploding', async () => { byUrl.mockReturnValue({ type: 'gitlab' }); - const { shadowRoot, getByText, queryByTestId } = - await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) - .withDom( - - - -
-
-
-
+ const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([ + , + ]) + .withDom( + + + +
+
+
+
-
- + - - , - ) - .withApis([ - [scmIntegrationsApiRef, { byUrl }], - [entityPresentationApiRef, entityPresentationApiMock], - ]) - .renderWithEffects(); +
+ + , + ) + .withApis([ + [scmIntegrationsApiRef, { byUrl }], + [entityPresentationApiRef, entityPresentationApiMock], + ]) + .renderWithEffects(); (shadowRoot as ShadowRoot & Pick).getSelection = () => selection; await waitFor(() => { - expect(getByText('Edit page')).toBeInTheDocument(); + expect(screen.getByShadowText('Edit page')).toBeInTheDocument(); }); fireSelectionChangeEvent(window); await waitFor(() => { - expect(queryByTestId('report-issue-addon')).toBeInTheDocument(); + expect( + screen.getByShadowTestId('report-issue-addon'), + ).toBeInTheDocument(); - const link = getByText('Open new Gitlab issue'); + const link = screen.getByShadowText('Open new Gitlab issue'); expect(link).toHaveAttribute( 'href', 'https://gitlab.com/backstage/backstage/issues/new?issue[title]=Documentation%20feedback%3A%20his%20&issue[description]=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20his%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgitlab.com%2Fbackstage%2Fbackstage%2F-%2Fblob%2Fmaster%2Fdocs%2FREADME.md%3E', @@ -197,60 +198,61 @@ describe('ReportIssue', () => { body: options.selection.toString().trim(), }); - const { shadowRoot, getByText, queryByTestId } = - await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) - .withDom( - - - -
-
-
-
+ const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([ + , + ]) + .withDom( + + + +
+
+
+
-
- + - - , - ) - .withApis([ - [scmIntegrationsApiRef, { byUrl }], - [entityPresentationApiRef, entityPresentationApiMock], - ]) - .renderWithEffects(); +
+ + , + ) + .withApis([ + [scmIntegrationsApiRef, { byUrl }], + [entityPresentationApiRef, entityPresentationApiMock], + ]) + .renderWithEffects(); (shadowRoot as ShadowRoot & Pick).getSelection = () => selection; await waitFor(() => { - expect(getByText('Edit page')).toBeInTheDocument(); + expect(screen.getByShadowText('Edit page')).toBeInTheDocument(); }); fireSelectionChangeEvent(window); await waitFor(() => { - expect(queryByTestId('report-issue-addon')).toBeInTheDocument(); + expect( + screen.getByShadowTestId('report-issue-addon'), + ).toBeInTheDocument(); - const link = getByText('Open new Gitlab issue'); + const link = screen.getByShadowText('Open new Gitlab issue'); expect(link).toHaveAttribute( 'href', 'https://gitlab.com/backstage/backstage/issues/new?issue[title]=Custom&issue[description]=his', @@ -261,45 +263,46 @@ describe('ReportIssue', () => { it('does not render report issue link for unsupported repository type', async () => { byUrl.mockReturnValue({ type: 'gerrit', resource: 'gerrit.example.com' }); - const { shadowRoot, getByText, queryByTestId } = - await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) - .withDom( - - - -
-
- + const { shadowRoot } = await TechDocsAddonTester.buildAddonsInTechDocs([ + , + ]) + .withDom( + + + +
+ - - , - ) - .withApis([[scmIntegrationsApiRef, { byUrl }]]) - .renderWithEffects(); +
+ + , + ) + .withApis([[scmIntegrationsApiRef, { byUrl }]]) + .renderWithEffects(); (shadowRoot as ShadowRoot & Pick).getSelection = () => selection; await waitFor(() => { - expect(getByText('Edit page')).toBeInTheDocument(); + expect(screen.getByShadowText('Edit page')).toBeInTheDocument(); }); fireSelectionChangeEvent(window); await waitFor(() => { - expect(queryByTestId('report-issue-addon')).not.toBeInTheDocument(); + expect( + screen.queryByShadowTestId('report-issue-addon'), + ).not.toBeInTheDocument(); }); }); }); diff --git a/plugins/techdocs-module-addons-contrib/src/TextSize/TextSize.test.tsx b/plugins/techdocs-module-addons-contrib/src/TextSize/TextSize.test.tsx index 92cab255a7..03571c1cd1 100644 --- a/plugins/techdocs-module-addons-contrib/src/TextSize/TextSize.test.tsx +++ b/plugins/techdocs-module-addons-contrib/src/TextSize/TextSize.test.tsx @@ -16,6 +16,7 @@ import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils'; import { act, fireEvent, waitFor } from '@testing-library/react'; +import { screen } from 'shadow-dom-testing-library'; import { TextSize } from '../plugin'; import { useShadowRootElements } from '@backstage/plugin-techdocs-react'; import { entityPresentationApiRef } from '@backstage/plugin-catalog-react'; @@ -42,33 +43,30 @@ describe('TextSize', () => { }); it('renders without exploding', async () => { - const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([ - , - ]) + await TechDocsAddonTester.buildAddonsInTechDocs([]) .withDom(TEST_CONTENT) .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) .renderWithEffects(); - expect(getByText('TEST_CONTENT')).toBeInTheDocument(); + expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument(); }); it('changes content text size using slider', async () => { - const { getByTitle, getByText, getByRole, getByDisplayValue } = - await TechDocsAddonTester.buildAddonsInTechDocs([]) - .withDom(TEST_CONTENT) - .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) - .renderWithEffects(); + await TechDocsAddonTester.buildAddonsInTechDocs([]) + .withDom(TEST_CONTENT) + .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) + .renderWithEffects(); - const content = getByText('TEST_CONTENT'); + const content = screen.getByShadowText('TEST_CONTENT'); useShadowRootElementsMock.mockReturnValue([content]); - fireEvent.click(getByTitle('Settings')); + fireEvent.click(screen.getByShadowTitle('Settings')); await waitFor(() => { - expect(getByText('Text size')).toBeInTheDocument(); + expect(screen.getByShadowText('Text size')).toBeInTheDocument(); }); - const slider = getByRole('slider'); + const slider = screen.getByShadowRole('slider'); act(() => { slider.focus(); @@ -79,12 +77,12 @@ describe('TextSize', () => { }); await waitFor(() => { - expect(getByDisplayValue('115')).toBeInTheDocument(); + expect(screen.getByShadowDisplayValue('115')).toBeInTheDocument(); }); expect(slider).toHaveTextContent('115%'); - let style = window.getComputedStyle(getByText('TEST_CONTENT')); + let style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT')); await waitFor(() => { expect(style.getPropertyValue('--md-typeset-font-size')).toBe('18.4px'); @@ -95,60 +93,54 @@ describe('TextSize', () => { }); await waitFor(() => { - expect(getByDisplayValue('100')).toBeInTheDocument(); + expect(screen.getByShadowDisplayValue('100')).toBeInTheDocument(); }); expect(slider).toHaveTextContent('100%'); - style = window.getComputedStyle(getByText('TEST_CONTENT')); + style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT')); expect(style.getPropertyValue('--md-typeset-font-size')).toBe('16px'); }); it('changes content text size using buttons', async () => { - const { - getByTitle, - getByText, - getByRole, - getByLabelText, - getByDisplayValue, - } = await TechDocsAddonTester.buildAddonsInTechDocs([]) + await TechDocsAddonTester.buildAddonsInTechDocs([]) .withDom(TEST_CONTENT) .withApis([[entityPresentationApiRef, entityPresentationApiMock]]) .renderWithEffects(); - const content = getByText('TEST_CONTENT'); + const content = screen.getByShadowText('TEST_CONTENT'); useShadowRootElementsMock.mockReturnValue([content]); - fireEvent.click(getByTitle('Settings')); + fireEvent.click(screen.getByShadowTitle('Settings')); await waitFor(() => { - expect(getByText('Text size')).toBeInTheDocument(); + expect(screen.getByShadowText('Text size')).toBeInTheDocument(); }); - fireEvent.click(getByLabelText('Increase text size')); + fireEvent.click(screen.getByShadowLabelText('Increase text size')); await waitFor(() => { - expect(getByDisplayValue('115')).toBeInTheDocument(); + expect(screen.getByShadowDisplayValue('115')).toBeInTheDocument(); }); - const slider = getByRole('slider'); + const slider = screen.getByShadowRole('slider'); expect(slider).toHaveTextContent('115%'); - let style = window.getComputedStyle(getByText('TEST_CONTENT')); + let style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT')); expect(style.getPropertyValue('--md-typeset-font-size')).toBe('18.4px'); - fireEvent.click(getByLabelText('Decrease text size')); + fireEvent.click(screen.getByShadowLabelText('Decrease text size')); await waitFor(() => { - expect(getByDisplayValue('100')).toBeInTheDocument(); + expect(screen.getByShadowDisplayValue('100')).toBeInTheDocument(); }); expect(slider).toHaveTextContent('100%'); - style = window.getComputedStyle(getByText('TEST_CONTENT')); + style = window.getComputedStyle(screen.getByShadowText('TEST_CONTENT')); expect(style.getPropertyValue('--md-typeset-font-size')).toBe('16px'); }); diff --git a/yarn.lock b/yarn.lock index 3502df3388..604f87054a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7362,7 +7362,7 @@ __metadata: react: "npm:^18.0.2" react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.3.0" - testing-library__dom: "npm:^7.29.4-beta.1" + shadow-dom-testing-library: "npm:^1.13.1" peerDependencies: "@testing-library/react": ^16.0.0 "@types/react": ^17.0.0 || ^18.0.0 @@ -7437,6 +7437,7 @@ __metadata: react: "npm:^18.0.2" react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.3.0" + shadow-dom-testing-library: "npm:^1.13.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -45240,6 +45241,15 @@ __metadata: languageName: node linkType: hard +"shadow-dom-testing-library@npm:^1.13.1": + version: 1.13.1 + resolution: "shadow-dom-testing-library@npm:1.13.1" + peerDependencies: + "@testing-library/dom": ">= 8" + checksum: 10/a10f3466592691368f260c15230d9e830cc5122d20002ad9b6c2918fa245089219d1f45c026153fa6ccf8848b546da6f985c0e461458c8c1e09786a1de626287 + languageName: node + linkType: hard + "shallow-clone@npm:^3.0.0": version: 3.0.1 resolution: "shallow-clone@npm:3.0.1" @@ -47166,13 +47176,6 @@ __metadata: languageName: node linkType: hard -"testing-library__dom@npm:^7.29.4-beta.1": - version: 7.29.4-beta.1 - resolution: "testing-library__dom@npm:7.29.4-beta.1" - checksum: 10/d912418803b77df672c0894d053327a4b366cf7e5312dfb73bd2089d36272e2b38bccc1bd7284d9ed2f9f6530797778d0f72e94b8a44fe5d0327d11e7f757f2b - languageName: node - linkType: hard - "text-decoder@npm:^1.1.0": version: 1.2.3 resolution: "text-decoder@npm:1.2.3" From a5d5b3adcc04d855791f7be957b241ad1b561817 Mon Sep 17 00:00:00 2001 From: Colt McKissick Date: Tue, 2 Dec 2025 09:21:29 -0500 Subject: [PATCH 106/312] fix: mark fromArn as deprecated, update getSesOptions to read fromArn if set Signed-off-by: Colt McKissick --- .changeset/curvy-things-call.md | 22 +++++++ .../config.d.ts | 5 ++ .../NotificationsEmailProcessor.test.ts | 58 +++++++++++++++++++ .../processor/NotificationsEmailProcessor.ts | 3 + 4 files changed, 88 insertions(+) create mode 100644 .changeset/curvy-things-call.md diff --git a/.changeset/curvy-things-call.md b/.changeset/curvy-things-call.md new file mode 100644 index 0000000000..1f4d8774c7 --- /dev/null +++ b/.changeset/curvy-things-call.md @@ -0,0 +1,22 @@ +--- +'@backstage/plugin-notifications-backend-module-email': patch +--- + +SES config for the notification email processor now supports sending an ARN for the SES identity to use when sending an email after the SES SDK V2 update. + +The `sesConfig.fromArn` field is marked as deprecated in favor of `sesConfig.fromEmailAddressIdentityArn` to match the option name passed during the send email command. Currently both `sesConfig.fromArn` and `sesConfig.fromEmailAddressIdentityArn` will set the `fromEmailAddressIdentityArn` option. The `sesConfig.sourceArn` field is removed since no equivalent option is available in the send email command options. Example using `sesConfig.fromEmailAddressIdentityArn`: + +```diff +notifications: + processors: + email: + transportConfig: + transport: "ses" + region: "us-west-2" + sender: "sender@mycompany.com" + replyTo: "no-reply@mycompany.com" + sesConfig: +- sourceArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com" +- fromArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com" ++ fromEmailAddressIdentityArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com" +``` diff --git a/plugins/notifications-backend-module-email/config.d.ts b/plugins/notifications-backend-module-email/config.d.ts index f73ef1074b..350fb569c5 100644 --- a/plugins/notifications-backend-module-email/config.d.ts +++ b/plugins/notifications-backend-module-email/config.d.ts @@ -136,6 +136,11 @@ export interface Config { * Optional SES config for mail options. Allows for delegated sender */ sesConfig?: { + /** + * ARN of the identity to use for the "From"/sender address of the email + * @deprecated Use fromEmailAddressIdentityArn instead + */ + fromArn?: string; /** * ARN of the identity to use for the "From"/sender address of the email */ diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts index 4ebc5d40a8..a52b54401e 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts @@ -500,4 +500,62 @@ describe('NotificationsEmailProcessor', () => { }, }); }); + + it('should send email with deprecated ses config', async () => { + const SES_SENDMAIL_CONFIG = { + app: { + baseUrl: 'https://example.org', + }, + notifications: { + processors: { + email: { + transportConfig: { + transport: 'ses', + region: 'us-west-2', + }, + sender: 'backstage@backstage.io', + replyTo: 'no-reply@backstage.io', + sesConfig: { + fromArn: + 'arn:aws:ses:us-west-2:123456789012:identity/example.com', + }, + }, + }, + }, + }; + (createTransport as jest.Mock).mockReturnValue(mockTransport); + const processor = new NotificationsEmailProcessor( + logger, + mockServices.rootConfig({ data: SES_SENDMAIL_CONFIG }), + catalogServiceMock({ entities: [DEFAULT_ENTITIES_RESPONSE.items[0]] }), + auth, + ); + + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: 'user:default/mock', + created: new Date(), + payload: { title: 'notification' }, + }, + { + recipients: { type: 'entity', entityRef: 'user:default/mock' }, + payload: { title: 'notification' }, + }, + ); + + expect(sendmailMock).toHaveBeenCalledWith({ + from: 'backstage@backstage.io', + html: '

https://example.org/notifications

', + replyTo: 'no-reply@backstage.io', + subject: 'notification', + text: 'https://example.org/notifications', + to: 'mock@backstage.io', + ses: { + FromEmailAddressIdentityArn: + 'arn:aws:ses:us-west-2:123456789012:identity/example.com', + }, + }); + }); }); diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts index bec19e77e8..acf1fbdb4c 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts @@ -318,12 +318,15 @@ export class NotificationsEmailProcessor implements NotificationProcessor { const fromEmailAddressIdentityArn = this.sesConfig.getOptionalString( 'fromEmailAddressIdentityArn', ); + const fromArn = this.sesConfig.getOptionalString('fromArn'); const configurationSetName = this.sesConfig.getOptionalString( 'configurationSetName', ); if (fromEmailAddressIdentityArn) ses.FromEmailAddressIdentityArn = fromEmailAddressIdentityArn; + else if (fromArn) ses.FromEmailAddressIdentityArn = fromArn; + if (configurationSetName) ses.ConfigurationSetName = configurationSetName; return Object.keys(ses).length > 0 ? ses : undefined; From 625457ab4d148cf66fdfafdf312121ccaeec7ef5 Mon Sep 17 00:00:00 2001 From: Colt McKissick Date: Tue, 2 Dec 2025 09:22:43 -0500 Subject: [PATCH 107/312] chore: remove old changeset Signed-off-by: Colt McKissick --- .changeset/fancy-wasps-check.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/fancy-wasps-check.md diff --git a/.changeset/fancy-wasps-check.md b/.changeset/fancy-wasps-check.md deleted file mode 100644 index fb7fbfed73..0000000000 --- a/.changeset/fancy-wasps-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-notifications-backend-module-email': minor ---- - -Changes ses configuration keys to match new configuration options in SES SDK V2 From 97a1bcfb17b4b8f3cb38cd8682971ecbbd82fb04 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 15:27:48 +0000 Subject: [PATCH 108/312] chore(deps): update dependency @base-ui-components/react to v1.0.0-beta.7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index cf5837a090..287af854ce 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -31,11 +31,11 @@ __metadata: linkType: hard "@base-ui-components/react@npm:^1.0.0-beta.4": - version: 1.0.0-beta.6 - resolution: "@base-ui-components/react@npm:1.0.0-beta.6" + version: 1.0.0-beta.7 + resolution: "@base-ui-components/react@npm:1.0.0-beta.7" dependencies: "@babel/runtime": "npm:^7.28.4" - "@base-ui-components/utils": "npm:0.2.0" + "@base-ui-components/utils": "npm:0.2.1" "@floating-ui/react-dom": "npm:^2.1.6" "@floating-ui/utils": "npm:^0.2.10" reselect: "npm:^5.1.1" @@ -48,13 +48,13 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/b3cfa5449f596c6cb509017a33c31fad531c10ee3dc70ee98ca5a48dfc02a8333012bd29df660833f98b73ee895f34ff51037eeef35b58111492d98454881eee + checksum: 10/14a446e7ff58a8eab6bb81ee32fc8f49bea8e0e3f188aa023f24c5382d9d76b97886f1828ef8fe2532720fc6512f52b88587220a47e4009b1d8febc904d5cf1a languageName: node linkType: hard -"@base-ui-components/utils@npm:0.2.0": - version: 0.2.0 - resolution: "@base-ui-components/utils@npm:0.2.0" +"@base-ui-components/utils@npm:0.2.1": + version: 0.2.1 + resolution: "@base-ui-components/utils@npm:0.2.1" dependencies: "@babel/runtime": "npm:^7.28.4" "@floating-ui/utils": "npm:^0.2.10" @@ -67,7 +67,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/b5eae460e3f45fdb2c5116c94612c5b0c00190d4f0763836ba121e36e5c46c1caad862f4aa05827d90a8ebe924c29e42a7561c124de23ce3dc565dba2a6dff98 + checksum: 10/fcf0dbf38bb6b8318174e419b3c7d4f6e044cbafe137ec499a2daddc482b317e936519f414335a6485d1721076c8e57fdc5b206f7845a44689fcfec1d81a659e languageName: node linkType: hard From 09c498aa68c282fa7662297bd4978572d979a5e6 Mon Sep 17 00:00:00 2001 From: Colt McKissick Date: Tue, 2 Dec 2025 10:30:16 -0500 Subject: [PATCH 109/312] fix: use fromArn config, log warning for sourceArn Signed-off-by: Colt McKissick --- .changeset/curvy-things-call.md | 7 +-- .../README.md | 2 +- .../config.d.ts | 5 -- .../NotificationsEmailProcessor.test.ts | 62 ++----------------- .../processor/NotificationsEmailProcessor.ts | 13 ++-- 5 files changed, 15 insertions(+), 74 deletions(-) diff --git a/.changeset/curvy-things-call.md b/.changeset/curvy-things-call.md index 1f4d8774c7..d64f1a14fa 100644 --- a/.changeset/curvy-things-call.md +++ b/.changeset/curvy-things-call.md @@ -2,9 +2,9 @@ '@backstage/plugin-notifications-backend-module-email': patch --- -SES config for the notification email processor now supports sending an ARN for the SES identity to use when sending an email after the SES SDK V2 update. +SES config for the notification email processor now supports utilizing an ARN for the SES identity when sending an email after the SES SDK V2 update. -The `sesConfig.fromArn` field is marked as deprecated in favor of `sesConfig.fromEmailAddressIdentityArn` to match the option name passed during the send email command. Currently both `sesConfig.fromArn` and `sesConfig.fromEmailAddressIdentityArn` will set the `fromEmailAddressIdentityArn` option. The `sesConfig.sourceArn` field is removed since no equivalent option is available in the send email command options. Example using `sesConfig.fromEmailAddressIdentityArn`: +The `sesConfig.fromArn` will set the `fromEmailAddressIdentityArn` option for the SES `SendEmailCommand`. The `sesConfig.sourceArn` field is removed since no equivalent option is available in the send email command options. Setting `sesConfig.sourceArn` will have no effect and log a warning. Example changes: ```diff notifications: @@ -17,6 +17,5 @@ notifications: replyTo: "no-reply@mycompany.com" sesConfig: - sourceArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com" -- fromArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com" -+ fromEmailAddressIdentityArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com" + fromArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com" ``` diff --git a/plugins/notifications-backend-module-email/README.md b/plugins/notifications-backend-module-email/README.md index d56d277544..248bb2c501 100644 --- a/plugins/notifications-backend-module-email/README.md +++ b/plugins/notifications-backend-module-email/README.md @@ -81,7 +81,7 @@ notifications: receiver: 'users' # Optional SES config # sesConfig: - # fromEmailAddressIdentityArn: 'arn:aws:ses:us-west-2:123456789012:identity/example.com' + # fromArn: 'arn:aws:ses:us-west-2:123456789012:identity/example.com' # configurationSetName: 'custom-config' # How many emails to send concurrently, defaults to 2 concurrencyLimit: 10 diff --git a/plugins/notifications-backend-module-email/config.d.ts b/plugins/notifications-backend-module-email/config.d.ts index 350fb569c5..55a751f8fa 100644 --- a/plugins/notifications-backend-module-email/config.d.ts +++ b/plugins/notifications-backend-module-email/config.d.ts @@ -138,13 +138,8 @@ export interface Config { sesConfig?: { /** * ARN of the identity to use for the "From"/sender address of the email - * @deprecated Use fromEmailAddressIdentityArn instead */ fromArn?: string; - /** - * ARN of the identity to use for the "From"/sender address of the email - */ - fromEmailAddressIdentityArn?: string; /** * Name of the configuration set to use when sending email via ses */ diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts index a52b54401e..ad0817521f 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts @@ -458,64 +458,8 @@ describe('NotificationsEmailProcessor', () => { sender: 'backstage@backstage.io', replyTo: 'no-reply@backstage.io', sesConfig: { - fromEmailAddressIdentityArn: + sourceArn: 'arn:aws:ses:us-west-2:123456789012:identity/example.com', - }, - }, - }, - }, - }; - (createTransport as jest.Mock).mockReturnValue(mockTransport); - const processor = new NotificationsEmailProcessor( - logger, - mockServices.rootConfig({ data: SES_SENDMAIL_CONFIG }), - catalogServiceMock({ entities: [DEFAULT_ENTITIES_RESPONSE.items[0]] }), - auth, - ); - - await processor.postProcess( - { - origin: 'plugin', - id: '1234', - user: 'user:default/mock', - created: new Date(), - payload: { title: 'notification' }, - }, - { - recipients: { type: 'entity', entityRef: 'user:default/mock' }, - payload: { title: 'notification' }, - }, - ); - - expect(sendmailMock).toHaveBeenCalledWith({ - from: 'backstage@backstage.io', - html: '

https://example.org/notifications

', - replyTo: 'no-reply@backstage.io', - subject: 'notification', - text: 'https://example.org/notifications', - to: 'mock@backstage.io', - ses: { - FromEmailAddressIdentityArn: - 'arn:aws:ses:us-west-2:123456789012:identity/example.com', - }, - }); - }); - - it('should send email with deprecated ses config', async () => { - const SES_SENDMAIL_CONFIG = { - app: { - baseUrl: 'https://example.org', - }, - notifications: { - processors: { - email: { - transportConfig: { - transport: 'ses', - region: 'us-west-2', - }, - sender: 'backstage@backstage.io', - replyTo: 'no-reply@backstage.io', - sesConfig: { fromArn: 'arn:aws:ses:us-west-2:123456789012:identity/example.com', }, @@ -557,5 +501,9 @@ describe('NotificationsEmailProcessor', () => { 'arn:aws:ses:us-west-2:123456789012:identity/example.com', }, }); + + expect(logger.warn).toHaveBeenCalledWith( + 'sourceArn is not supported in SESv2 and will be ignored', + ); }); }); diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts index acf1fbdb4c..7eea12bd85 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts @@ -315,19 +315,18 @@ export class NotificationsEmailProcessor implements NotificationProcessor { return undefined; } const ses: Partial = {}; - const fromEmailAddressIdentityArn = this.sesConfig.getOptionalString( - 'fromEmailAddressIdentityArn', - ); const fromArn = this.sesConfig.getOptionalString('fromArn'); + const sourceArn = this.sesConfig.getOptionalString('sourceArn'); const configurationSetName = this.sesConfig.getOptionalString( 'configurationSetName', ); - if (fromEmailAddressIdentityArn) - ses.FromEmailAddressIdentityArn = fromEmailAddressIdentityArn; - else if (fromArn) ses.FromEmailAddressIdentityArn = fromArn; - + if (fromArn) ses.FromEmailAddressIdentityArn = fromArn; if (configurationSetName) ses.ConfigurationSetName = configurationSetName; + if (sourceArn) + this.logger.warn( + 'sourceArn is not supported in SESv2 and will be ignored', + ); return Object.keys(ses).length > 0 ? ses : undefined; } From 336db00d21f59992a2d0258751102d5a02ba4416 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 2 Dec 2025 15:37:41 +0000 Subject: [PATCH 110/312] Version Packages (next) --- .changeset/create-app-1764689798.md | 5 + .changeset/pre.json | 23 + docs/releases/v1.46.0-next.1-changelog.md | 392 ++++++++++++++++++ package.json | 2 +- packages/app-next/CHANGELOG.md | 17 + packages/app-next/package.json | 2 +- packages/app/CHANGELOG.md | 17 + packages/app/package.json | 2 +- packages/cli-common/CHANGELOG.md | 6 + packages/cli-common/package.json | 2 +- packages/cli-node/CHANGELOG.md | 8 + packages/cli-node/package.json | 2 +- packages/cli/CHANGELOG.md | 9 + packages/cli/package.json | 2 +- packages/codemods/CHANGELOG.md | 8 + packages/codemods/package.json | 2 +- packages/core-components/CHANGELOG.md | 16 + packages/core-components/package.json | 2 +- packages/create-app/CHANGELOG.md | 8 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 9 + packages/dev-utils/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 10 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 10 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 8 + packages/techdocs-cli/package.json | 2 +- packages/ui/CHANGELOG.md | 52 +++ packages/ui/package.json | 2 +- plugins/app-visualizer/CHANGELOG.md | 8 + plugins/app-visualizer/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 7 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 7 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 8 + plugins/catalog-react/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../catalog-unprocessed-entities/CHANGELOG.md | 19 + .../catalog-unprocessed-entities/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 9 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 10 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes-common/CHANGELOG.md | 6 + plugins/kubernetes-common/package.json | 2 +- plugins/kubernetes-node/CHANGELOG.md | 7 + plugins/kubernetes-node/package.json | 2 +- plugins/kubernetes-react/CHANGELOG.md | 10 + plugins/kubernetes-react/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 10 + plugins/kubernetes/package.json | 2 +- plugins/mui-to-bui/CHANGELOG.md | 7 + plugins/mui-to-bui/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 9 + plugins/scaffolder-react/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 27 ++ .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 6 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- plugins/techdocs/CHANGELOG.md | 9 + plugins/techdocs/package.json | 2 +- 72 files changed, 843 insertions(+), 35 deletions(-) create mode 100644 .changeset/create-app-1764689798.md create mode 100644 docs/releases/v1.46.0-next.1-changelog.md diff --git a/.changeset/create-app-1764689798.md b/.changeset/create-app-1764689798.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1764689798.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/pre.json b/.changeset/pre.json index e341909093..f44b869497 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -207,28 +207,51 @@ "@backstage/plugin-user-settings-common": "0.0.1" }, "changesets": [ + "afraid-items-drum", + "bumpy-planets-go", "chatty-sides-wear", + "chilly-bikes-rule", "chilly-hotels-walk", "clean-toys-reply", + "common-coins-stare", + "create-app-1764689798", "famous-jars-lose", + "fifty-coats-feel", "fine-eagles-sleep", "flat-pillows-rush", + "floppy-bobcats-serve", "four-peaches-train", "fruity-rivers-arrive", + "fruity-words-melt", + "funny-papayas-rest", + "fuzzy-phones-own", + "fuzzy-trees-live", "gentle-trains-juggle", + "great-files-shave", "happy-bottles-invite", "kind-hoops-double", "legal-cloths-spend", + "legal-otters-punch", "loose-pets-slide", "lucky-days-hug", "many-planes-join", "metal-boxes-laugh", "metal-humans-lose", + "modern-taxes-start", + "neat-pens-clean", + "nice-trams-shake", + "old-parks-smell", + "open-points-beam", "quiet-hats-sleep", + "rotten-melons-sleep", "short-groups-knock", "slick-books-sleep", + "slick-onions-wash", + "slimy-islands-play", "spicy-teeth-study", "stale-eagles-rush", + "tender-dancers-hunt", + "tough-lies-grow", "twenty-ducks-relate" ] } diff --git a/docs/releases/v1.46.0-next.1-changelog.md b/docs/releases/v1.46.0-next.1-changelog.md new file mode 100644 index 0000000000..42a188ec7f --- /dev/null +++ b/docs/releases/v1.46.0-next.1-changelog.md @@ -0,0 +1,392 @@ +# Release v1.46.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.46.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.46.0-next.1) + +## @backstage/plugin-techdocs-addons-test-utils@2.0.0-next.1 + +### Major Changes + +- 8d6709e: **BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value. + + Newer versions of `@testing-library` recommends using the `screen` export for assertions - and removing this from the addon tester contract allows us to more freely iterate on which underlying version of the testing library is being used. + + One notable effect of this, however, is that the `@testing-library` `screen` does NOT support assertions on the shadow DOM, which techdocs relies on. You will therefore want to add a dependency on [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) in your tests, and using its `screen` and its dedicated `*Shadow*` methods. As an example, if you keep doing `getByText` you will not get matches inside the shadow DOM - switch to `getByShadowText` instead. + + ```ts + import { screen } from 'shadow-dom-testing-library'; + + // ... render the addon ... + await TechDocsAddonTester.buildAddonsInTechDocs([]) + .withDom(TEST_CONTENT) + .renderWithEffects(); + + expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument(); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + +## @backstage/ui@0.10.0-next.1 + +### Minor Changes + +- 16543fa: **Breaking change** The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component. + + ### Migration Guide + + If you were using `Cell` with text-specific props (`title`, `description`, `leadingIcon`, `href`), you need to update your code to use `CellText` instead: + + **Before:** + + ```tsx + } + href="/path" + /> + ``` + + **After:** + + ```tsx + } + href="/path" + /> + ``` + + For custom cell content, use the new generic `Cell` component: + + ```tsx + {/* Your custom content */} + ``` + +### Patch Changes + +- 50b7927: Fixed Checkbox indicator showing checkmark color when unchecked. + + Affected components: Checkbox + +- 5bacf55: Fixed `ButtonIcon` incorrectly applying `className` to inner elements instead of only the root element. + + Affected components: ButtonIcon + +- a20d317: Added row selection support with visual state styling for hover, selected, and pressed states. Fixed checkbox rendering to only show for multi-select toggle mode. + + Affected components: Table, TableHeader, Row, Column + +## @backstage/cli@0.34.6-next.1 + +### Patch Changes + +- 7fbac5c: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-node@0.2.16-next.1 + - @backstage/cli-common@0.1.16-next.1 + +## @backstage/cli-common@0.1.16-next.1 + +### Patch Changes + +- 5cfb2a4: Added new `run`, `runOutput`, and `runCheck` utilities to help run child processes in a safe and portable way. + +## @backstage/cli-node@0.2.16-next.1 + +### Patch Changes + +- 4e8c726: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + +## @backstage/codemods@0.1.53-next.1 + +### Patch Changes + +- 688f070: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + +## @backstage/core-components@0.18.4-next.1 + +### Patch Changes + +- 9a942a4: Fixed bug in the `LogViewer` component where shift + click always opened a new window instead of just changing the selection. + + In addition, improved the `LogViewer` component by a few usability enhancements: + + - Added support for multiple selections using cmd/ctrl + click + - Improved the generated hash that is added to the URL to also support ranges & multiple selections + - Added an hover effect & info tooltip to the "Copy to clipboard" button to indicate its functionality + - Added some color and a separator to the line numbers to improve readability + +- 207c3c8: long words like urls now breaks to new line on warning panels instead of overflowing the container + +- 5d52dab: Add i18n support for LogViewer search control + +## @backstage/create-app@0.7.7-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + +## @backstage/dev-utils@1.1.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + +## @backstage/repo-tools@0.16.1-next.1 + +### Patch Changes + +- 688f070: Updated to use new utilities from `@backstage/cli-common`. +- d1e38a7: Properly create workspace in OS temporary directory for `generate-patch` command +- Updated dependencies + - @backstage/cli-node@0.2.16-next.1 + - @backstage/cli-common@0.1.16-next.1 + +## @techdocs/cli@1.10.3-next.1 + +### Patch Changes + +- 43629b1: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + +## @backstage/plugin-app-visualizer@0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.11.3-next.1 + +### Patch Changes + +- ed5a7a3: Introduce new configuration option to exclude suspended users from GitHub Enterprise instances. + + When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances. + Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail. + +## @backstage/plugin-catalog-backend-module-github-org@0.3.17-next.1 + +### Patch Changes + +- ed5a7a3: Introduce new configuration option to exclude suspended users from GitHub Enterprise instances. + + When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances. + Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail. + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.11.3-next.1 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + +## @backstage/plugin-catalog-react@1.21.4-next.1 + +### Patch Changes + +- 6d39141: Fixed an issue where `EntityOwnerPicker` failed to filter options when the input text contained uppercase characters. +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + +### Patch Changes + +- df4d646: Moved types, API and client to the common package, allowing both frontend and + backend plugins to use the `CatalogUnprocessedEntitiesClient`. + + The following types, clients and interfaces have been deprecated and should be + imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead: + `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`, + `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`. + + All those types, clients and interfaces are re-exported temporarily in the + `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up. + +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + +### Patch Changes + +- df4d646: Moved types, API and client to the common package, allowing both frontend and + backend plugins to use the `CatalogUnprocessedEntitiesClient`. + + The following types, clients and interfaces have been deprecated and should be + imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead: + `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`, + `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`. + + All those types, clients and interfaces are re-exported temporarily in the + `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up. + +## @backstage/plugin-kubernetes@0.12.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-react@0.5.14-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-kubernetes-backend@0.20.5-next.1 + +### Patch Changes + +- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + - @backstage/plugin-kubernetes-node@0.3.7-next.1 + +## @backstage/plugin-kubernetes-cluster@0.0.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-react@0.5.14-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-kubernetes-common@0.9.9-next.0 + +### Patch Changes + +- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas + +## @backstage/plugin-kubernetes-node@0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-kubernetes-react@0.5.14-next.1 + +### Patch Changes + +- f966a85: Enabled a pod terminal at GKE +- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-mui-to-bui@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + +## @backstage/plugin-scaffolder-react@1.19.4-next.1 + +### Patch Changes + +- 5ca461e: Fixed bug where custom `review.name` values were incorrectly formatted by `startCase`, preserving them exactly as written. +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + +## @backstage/plugin-techdocs@1.16.1-next.1 + +### Patch Changes + +- 592361e: The `techdocs` config is now marked as optional. +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + +## @backstage/plugin-techdocs-backend@2.1.3-next.1 + +### Patch Changes + +- 592361e: The `techdocs` config is now marked as optional. + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + +### Patch Changes + +- 8d6709e: Updated tests to match test-utils change +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + +## example-app@0.2.116-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/cli@0.34.6-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + - @backstage/plugin-mui-to-bui@0.2.2-next.1 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.1 + +## example-app-next@0.0.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/cli@0.34.6-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + - @backstage/plugin-app-visualizer@0.1.26-next.1 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.1 + +## techdocs-cli-embedded-app@0.2.115-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/cli@0.34.6-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 diff --git a/package.json b/package.json index 9fb5cd4a7f..763b4f7505 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.46.0-next.0", + "version": "1.46.0-next.1", "backstage": { "cli": { "new": { diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index 55ac9f8713..9e29cd2b2e 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,22 @@ # example-app-next +## 0.0.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/cli@0.34.6-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + - @backstage/plugin-app-visualizer@0.1.26-next.1 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.1 + ## 0.0.30-next.0 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 63a5b4c2dc..5d85984979 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.30-next.0", + "version": "0.0.30-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index fd258fef5d..82e800c5ef 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,22 @@ # example-app +## 0.2.116-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/cli@0.34.6-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + - @backstage/plugin-mui-to-bui@0.2.2-next.1 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.1 + ## 0.2.116-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index d2be43b03c..5515e2a9c7 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.116-next.0", + "version": "0.2.116-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index d3529161ca..d40c0629f4 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/cli-common +## 0.1.16-next.1 + +### Patch Changes + +- 5cfb2a4: Added new `run`, `runOutput`, and `runCheck` utilities to help run child processes in a safe and portable way. + ## 0.1.16-next.0 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index 8f8904a968..e7ee3e97f4 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-common", - "version": "0.1.16-next.0", + "version": "0.1.16-next.1", "description": "Common functionality used by cli, backend, and create-app", "backstage": { "role": "node-library" diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index d77cc626b6..4c4005c0c9 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-node +## 0.2.16-next.1 + +### Patch Changes + +- 4e8c726: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 92f86c533d..dcedc6b76c 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-node", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "Node.js library for Backstage CLIs", "backstage": { "role": "node-library" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index b86acf2d49..9cee8632cd 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/cli +## 0.34.6-next.1 + +### Patch Changes + +- 7fbac5c: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-node@0.2.16-next.1 + - @backstage/cli-common@0.1.16-next.1 + ## 0.34.6-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 3fcea01e9e..226742fde7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.34.6-next.0", + "version": "0.34.6-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 2a880f0520..13e6bfe7f6 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/codemods +## 0.1.53-next.1 + +### Patch Changes + +- 688f070: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + ## 0.1.53-next.0 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 534124c1bf..9b7b424e9b 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/codemods", - "version": "0.1.53-next.0", + "version": "0.1.53-next.1", "description": "A collection of codemods for Backstage projects", "backstage": { "role": "cli" diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 8014cee0a4..ea2023e845 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/core-components +## 0.18.4-next.1 + +### Patch Changes + +- 9a942a4: Fixed bug in the `LogViewer` component where shift + click always opened a new window instead of just changing the selection. + + In addition, improved the `LogViewer` component by a few usability enhancements: + + - Added support for multiple selections using cmd/ctrl + click + - Improved the generated hash that is added to the URL to also support ranges & multiple selections + - Added an hover effect & info tooltip to the "Copy to clipboard" button to indicate its functionality + - Added some color and a separator to the line numbers to improve readability + +- 207c3c8: long words like urls now breaks to new line on warning panels instead of overflowing the container +- 5d52dab: Add i18n support for LogViewer search control + ## 0.18.4-next.0 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 18d41eefb5..2c3cee0c46 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.18.4-next.0", + "version": "0.18.4-next.1", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index c921e2ad9b..8c7fd970ab 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/create-app +## 0.7.7-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + ## 0.7.7-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 2132f57b1d..fb729526eb 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.7.7-next.0", + "version": "0.7.7-next.1", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 90b69eb678..1b26653336 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/dev-utils +## 1.1.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + ## 1.1.18-next.0 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 85361d46a0..5b0c9bbee7 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.18-next.0", + "version": "1.1.18-next.1", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index db451fee15..36723eaecf 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/repo-tools +## 0.16.1-next.1 + +### Patch Changes + +- 688f070: Updated to use new utilities from `@backstage/cli-common`. +- d1e38a7: Properly create workspace in OS temporary directory for `generate-patch` command +- Updated dependencies + - @backstage/cli-node@0.2.16-next.1 + - @backstage/cli-common@0.1.16-next.1 + ## 0.16.1-next.0 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 4de9c4459d..1ca777bca2 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.16.1-next.0", + "version": "0.16.1-next.1", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index eb81d1d132..455f18d38f 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,15 @@ # techdocs-cli-embedded-app +## 0.2.115-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/cli@0.34.6-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + ## 0.2.115-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index deec921041..a8a3ba85f4 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.115-next.0", + "version": "0.2.115-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index e8d5065f9a..7ab69cbd97 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,13 @@ # @techdocs/cli +## 1.10.3-next.1 + +### Patch Changes + +- 43629b1: Updated to use new utilities from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.1 + ## 1.10.3-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 774969edb3..10253e7a93 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.10.3-next.0", + "version": "1.10.3-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index d4a1de4688..9f867ba2ed 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/ui +## 0.10.0-next.1 + +### Minor Changes + +- 16543fa: **Breaking change** The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component. + + ### Migration Guide + + If you were using `Cell` with text-specific props (`title`, `description`, `leadingIcon`, `href`), you need to update your code to use `CellText` instead: + + **Before:** + + ```tsx + } + href="/path" + /> + ``` + + **After:** + + ```tsx + } + href="/path" + /> + ``` + + For custom cell content, use the new generic `Cell` component: + + ```tsx + {/* Your custom content */} + ``` + +### Patch Changes + +- 50b7927: Fixed Checkbox indicator showing checkmark color when unchecked. + + Affected components: Checkbox + +- 5bacf55: Fixed `ButtonIcon` incorrectly applying `className` to inner elements instead of only the root element. + + Affected components: ButtonIcon + +- a20d317: Added row selection support with visual state styling for hover, selected, and pressed states. Fixed checkbox rendering to only show for multi-select toggle mode. + + Affected components: Table, TableHeader, Row, Column + ## 0.9.1-next.0 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 1d5d6f945c..3ac6e991c8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/ui", - "version": "0.9.1-next.0", + "version": "0.10.0-next.1", "backstage": { "role": "web-library" }, diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index bba37c8351..d04d2461ba 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-app-visualizer +## 0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + ## 0.1.26-next.0 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index dcc38047bb..8b580ea17b 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.1.26-next.0", + "version": "0.1.26-next.1", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index ee9bc35e33..b720e047e8 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.4.18-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 17a5abd057..61ce045f5a 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.4.18-next.0", + "version": "0.4.18-next.1", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index 75a49d4748..f660d65434 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 6e0e1fb57d..d50fa3baeb 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index b3f624781d..bcd7ad1a94 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.17-next.1 + +### Patch Changes + +- ed5a7a3: Introduce new configuration option to exclude suspended users from GitHub Enterprise instances. + + When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances. + Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail. + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.11.3-next.1 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index dcdfb2a578..1f9f085dcb 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.3.17-next.0", + "version": "0.3.17-next.1", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index ae4052af1e..8362bf651c 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-github +## 0.11.3-next.1 + +### Patch Changes + +- ed5a7a3: Introduce new configuration option to exclude suspended users from GitHub Enterprise instances. + + When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances. + Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail. + ## 0.11.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index fb58848838..8fc3f9f919 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.11.3-next.0", + "version": "0.11.3-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index 49394075cf..bb501f7c31 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.6.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + ## 0.6.7-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 50fd70e31a..fcb5d57809 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", - "version": "0.6.7-next.0", + "version": "0.6.7-next.1", "description": "Backstage Catalog module to view unprocessed entities", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 0133b16336..8d0b154915 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-catalog-react +## 1.21.4-next.1 + +### Patch Changes + +- 6d39141: Fixed an issue where `EntityOwnerPicker` failed to filter options when the input text contained uppercase characters. +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + ## 1.21.4-next.0 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 3e5cc73d28..013d1e7629 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.21.4-next.0", + "version": "1.21.4-next.1", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md index 962c3dff33..67dfa74dae 100644 --- a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-unprocessed-entities-common +## 0.0.12-next.0 + +### Patch Changes + +- df4d646: Moved types, API and client to the common package, allowing both frontend and + backend plugins to use the `CatalogUnprocessedEntitiesClient`. + + The following types, clients and interfaces have been deprecated and should be + imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead: + `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`, + `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`. + + All those types, clients and interfaces are re-exported temporarily in the + `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up. + ## 0.0.11 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities-common/package.json b/plugins/catalog-unprocessed-entities-common/package.json index 68e1a23dd0..c20e1c142a 100644 --- a/plugins/catalog-unprocessed-entities-common/package.json +++ b/plugins/catalog-unprocessed-entities-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities-common", - "version": "0.0.11", + "version": "0.0.12-next.0", "description": "Common functionalities for the catalog-unprocessed-entities plugin", "backstage": { "role": "common-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index c47881b3b9..b48f12b4dd 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.24-next.1 + +### Patch Changes + +- df4d646: Moved types, API and client to the common package, allowing both frontend and + backend plugins to use the `CatalogUnprocessedEntitiesClient`. + + The following types, clients and interfaces have been deprecated and should be + imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead: + `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`, + `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`. + + All those types, clients and interfaces are re-exported temporarily in the + `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up. + +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + ## 0.2.24-next.0 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 4ea3f6bdfa..2b6d876226 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.2.24-next.0", + "version": "0.2.24-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 414a359282..888354fa2e 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kubernetes-backend +## 0.20.5-next.1 + +### Patch Changes + +- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + - @backstage/plugin-kubernetes-node@0.3.7-next.1 + ## 0.20.5-next.0 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 2715bdc83c..f0630dd938 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.20.5-next.0", + "version": "0.20.5-next.1", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 09f2088df2..f61279e01b 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-react@0.5.14-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.0.32-next.0 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 80d7123a0b..480f6a2204 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.32-next.0", + "version": "0.0.32-next.1", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index effad6fbff..902a7e1f1d 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-kubernetes-common +## 0.9.9-next.0 + +### Patch Changes + +- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas + ## 0.9.8 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index 0a61221683..512ed1f7eb 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-common", - "version": "0.9.8", + "version": "0.9.9-next.0", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index 164849d369..d3f12c3c7d 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-kubernetes-node +## 0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.3.7-next.0 ### Patch Changes diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 9de2d8b123..0ae0bedd85 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-node", - "version": "0.3.7-next.0", + "version": "0.3.7-next.1", "description": "Node.js library for the kubernetes plugin", "backstage": { "role": "node-library", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index 42046ad3d4..b260e25475 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-react +## 0.5.14-next.1 + +### Patch Changes + +- f966a85: Enabled a pod terminal at GKE +- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.5.14-next.0 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 877fdc8ec5..da1b5f6e3e 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-react", - "version": "0.5.14-next.0", + "version": "0.5.14-next.1", "description": "Web library for the kubernetes-react plugin", "backstage": { "role": "web-library", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 7036b12165..3780dee9c6 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes +## 0.12.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-react@0.5.14-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.12.14-next.0 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 73a97fed7a..a455747640 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.14-next.0", + "version": "0.12.14-next.1", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/mui-to-bui/CHANGELOG.md b/plugins/mui-to-bui/CHANGELOG.md index 168078d0c7..81ccaeb013 100644 --- a/plugins/mui-to-bui/CHANGELOG.md +++ b/plugins/mui-to-bui/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-mui-to-bui +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + ## 0.2.2-next.0 ### Patch Changes diff --git a/plugins/mui-to-bui/package.json b/plugins/mui-to-bui/package.json index b6d3990394..f5f014a9ed 100644 --- a/plugins/mui-to-bui/package.json +++ b/plugins/mui-to-bui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mui-to-bui", - "version": "0.2.2-next.0", + "version": "0.2.2-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "mui-to-bui", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index f4b13b2f72..552035d603 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-react +## 1.19.4-next.1 + +### Patch Changes + +- 5ca461e: Fixed bug where custom `review.name` values were incorrectly formatted by `startCase`, preserving them exactly as written. +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + ## 1.19.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index a39b38f919..15b53c329c 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.19.4-next.0", + "version": "1.19.4-next.1", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index bb59996ab3..1f78d1fa4b 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-techdocs-addons-test-utils +## 2.0.0-next.1 + +### Major Changes + +- 8d6709e: **BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value. + + Newer versions of `@testing-library` recommends using the `screen` export for assertions - and removing this from the addon tester contract allows us to more freely iterate on which underlying version of the testing library is being used. + + One notable effect of this, however, is that the `@testing-library` `screen` does NOT support assertions on the shadow DOM, which techdocs relies on. You will therefore want to add a dependency on [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) in your tests, and using its `screen` and its dedicated `*Shadow*` methods. As an example, if you keep doing `getByText` you will not get matches inside the shadow DOM - switch to `getByShadowText` instead. + + ```ts + import { screen } from 'shadow-dom-testing-library'; + + // ... render the addon ... + await TechDocsAddonTester.buildAddonsInTechDocs([]) + .withDom(TEST_CONTENT) + .renderWithEffects(); + + expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument(); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + ## 1.1.3-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 5a4929aabb..9045f33b03 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.1.3-next.0", + "version": "2.0.0-next.1", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index ec8b4639ea..97fe3bdab4 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-techdocs-backend +## 2.1.3-next.1 + +### Patch Changes + +- 592361e: The `techdocs` config is now marked as optional. + ## 2.1.3-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 6ff7df1154..c84b8776be 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "2.1.3-next.0", + "version": "2.1.3-next.1", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index a9c8f06d7f..922e295257 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.31-next.1 + +### Patch Changes + +- 8d6709e: Updated tests to match test-utils change +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + ## 1.1.31-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 5e08d511ee..7d04f6268a 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.31-next.0", + "version": "1.1.31-next.1", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index de563d330c..2aaf6459f0 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-techdocs +## 1.16.1-next.1 + +### Patch Changes + +- 592361e: The `techdocs` config is now marked as optional. +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + ## 1.16.1-next.0 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index c7287e8c1b..7870dd71f3 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.16.1-next.0", + "version": "1.16.1-next.1", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", From 7c1aafca6ca6b80882e53f61cd572aa9a60549e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Mendes=20Goulart?= <34889468+joaopedromgoulart@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:55:41 -0300 Subject: [PATCH 111/312] Update .changeset/all-socks-taste.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: João Pedro Mendes Goulart <34889468+joaopedromgoulart@users.noreply.github.com> --- .changeset/all-socks-taste.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/all-socks-taste.md b/.changeset/all-socks-taste.md index 7f3fd8541c..377782c2f9 100644 --- a/.changeset/all-socks-taste.md +++ b/.changeset/all-socks-taste.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-backend-module-gitlab': minor --- -In the gitlabRepoPush action, add 'auto' possibility for commitAction input. +In the `gitlabRepoPush` action, add 'auto' possibility for `commitAction` input. From 73615f4b9f646bda7eac5bd143dece3a7fb2cca5 Mon Sep 17 00:00:00 2001 From: bi003731 Date: Tue, 2 Dec 2025 13:31:17 -0300 Subject: [PATCH 112/312] improve readablility Signed-off-by: bi003731 --- .../src/actions/gitlabRepoPush.ts | 57 +++++++++---------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts index bdd6321911..dd8e28d87a 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts @@ -146,36 +146,33 @@ export const createGitlabRepoPushAction = (options: { } } - const actions: CommitAction[] = ( - ( - await (async () => { - const results = []; - for (const file of fileContents) { - const action = await getFileAction( - { file, targetPath }, - { repoID, branch: branchName }, - api, - ctx.logger, - remoteFiles, - ctx.input.commitAction, - ); - results.push({ file, action }); - } - return results; - })() - ).filter(o => o.action !== 'skip') as { - file: SerializedFile; - action: CommitAction['action']; - }[] - ).map(({ file, action }) => ({ - action, - filePath: targetPath - ? path.posix.join(targetPath, file.path) - : file.path, - encoding: 'base64', - content: file.content.toString('base64'), - execute_filemode: file.executable, - })); + const fileActionMap: { + file: SerializedFile; + action: 'create' | 'delete' | 'update' | 'skip'; + }[] = []; + for (const file of fileContents) { + const action = await getFileAction( + { file, targetPath }, + { repoID, branch: branchName }, + api, + ctx.logger, + remoteFiles, + ctx.input.commitAction, + ); + fileActionMap.push({ file, action }); + } + + const actions: CommitAction[] = fileActionMap + .filter(o => o.action !== 'skip') + .map(({ file, action }) => ({ + action: action as CommitAction['action'], + filePath: targetPath + ? path.posix.join(targetPath, file.path) + : file.path, + encoding: 'base64', + content: file.content.toString('base64'), + execute_filemode: file.executable, + })); const branchExists = await ctx.checkpoint({ key: `branch.exists.${repoID}.${branchName}`, From 5a6aca26b17d49412fca5fe5b9a603e9230422c1 Mon Sep 17 00:00:00 2001 From: mbruhin <47482924+mbruhin@users.noreply.github.com> Date: Tue, 2 Dec 2025 11:35:26 -0700 Subject: [PATCH 113/312] Update missing target branch error message Signed-off-by: mbruhin <47482924+mbruhin@users.noreply.github.com> --- .changeset/tall-ideas-lead.md | 5 ++++ .../bitbucketServerPullRequest.test.ts | 29 +++++++++++++++++++ .../src/actions/bitbucketServerPullRequest.ts | 6 ++++ 3 files changed, 40 insertions(+) create mode 100644 .changeset/tall-ideas-lead.md diff --git a/.changeset/tall-ideas-lead.md b/.changeset/tall-ideas-lead.md new file mode 100644 index 0000000000..60bef903d8 --- /dev/null +++ b/.changeset/tall-ideas-lead.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch +--- + +Improve error message when provided target branch is missing diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.test.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.test.ts index 37df535fec..1c7b0372f3 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.test.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.test.ts @@ -399,4 +399,33 @@ describe('publish:bitbucketServer:pull-request', () => { 'https://hosted.bitbucket.com/projects/project/repos/repo/pull-requests/1', ); }); + + it('should throw an error when the target branch is not found', async () => { + server.use( + rest.get( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos/repo/branches', + (_, res, ctx) => { + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfBranches), + ); + }, + ), + ); + + await expect( + action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'hosted.bitbucket.com?project=project&repo=repo', + targetBranch: 'non-existent-branch', + sourceBranch: 'develop', + }, + }), + ).rejects.toThrow( + /Target branch 'non-existent-branch' not found in repository project\/repo/, + ); + }); }); diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index 8717a76ae1..ecafe4434c 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -380,6 +380,12 @@ export function createPublishBitbucketServerPullRequestAction(options: { apiBaseUrl, }); + if (!toRef) { + throw new InputError( + `Target branch '${finalTargetBranch}' not found in repository ${project}/${repo}. Please ensure the branch exists before creating a pull request.`, + ); + } + let fromRef = await findBranches({ project, repo, From 9f210c5ffdbe2370a06ecb8665a2143912fd1837 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 20:30:43 +0100 Subject: [PATCH 114/312] yarn.lock: bump @lezer packages Signed-off-by: Patrik Oldsberg --- yarn.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index c1a5863e5e..ff0b4bf9a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10466,28 +10466,28 @@ __metadata: languageName: node linkType: hard -"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.1.0": - version: 1.1.0 - resolution: "@lezer/common@npm:1.1.0" - checksum: 10/cabe34758bb41c6c7e38aaabdc8a6f51469b1307ed9b5760dd1fc7777d77a012e3e3f37c970a91319c10cc5e4d355db5c0e5515cc9392b9d0b833a66a8cc4120 +"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.3.0": + version: 1.4.0 + resolution: "@lezer/common@npm:1.4.0" + checksum: 10/8d0626835b8567115923772619d887c212c1e965e0ae2a230e3ae8e6734e0ded3bf4ca3a1eb4aa0af6a7f0cbb4892fa04de399916192fd98a99db8bf0f18da63 languageName: node linkType: hard "@lezer/highlight@npm:^1.0.0": - version: 1.0.0 - resolution: "@lezer/highlight@npm:1.0.0" + version: 1.2.3 + resolution: "@lezer/highlight@npm:1.2.3" dependencies: - "@lezer/common": "npm:^1.0.0" - checksum: 10/ed362dd4c27218bd941807f14ee691f1ad73613f96041538f5d2cc06521490a346a74044f32da573c1c6529bea2f5c190064c4bca92918732cb580c298880947 + "@lezer/common": "npm:^1.3.0" + checksum: 10/8f787d464f8a036f117a0b23e73ac034d224a57d72501c6559089098a28f127c9e495b90ac7d132acc86199e0b64d4c038f75f9293a37c7c61add52fa1acdb4e languageName: node linkType: hard "@lezer/lr@npm:^1.0.0": - version: 1.0.0 - resolution: "@lezer/lr@npm:1.0.0" + version: 1.4.4 + resolution: "@lezer/lr@npm:1.4.4" dependencies: "@lezer/common": "npm:^1.0.0" - checksum: 10/c1c60beef143008b5fbc64a6713be7656b51c858b83f9199cdafb439fc4028f35544990dd7b1fc3d89a518eecb10c90f5f3bdf6804f0a4429dfddb9210275add + checksum: 10/3485153107863075fc9c813977dd1a26b43114624e440e33c9e906d5afc6ec6b236b19439196b5baf7dd2d4c34f10642aa280250758ed3d60de5cad54590b1f2 languageName: node linkType: hard From 917236fc45b9e1bc60da631f573cb67bd72107c0 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 20:33:15 +0100 Subject: [PATCH 115/312] yarn.lock: bump @elastic/elasticsearch Signed-off-by: Patrik Oldsberg --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ff0b4bf9a9..2fdb68aee4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8340,14 +8340,14 @@ __metadata: linkType: hard "@elastic/elasticsearch@npm:^7.13.0": - version: 7.17.0 - resolution: "@elastic/elasticsearch@npm:7.17.0" + version: 7.17.14 + resolution: "@elastic/elasticsearch@npm:7.17.14" dependencies: debug: "npm:^4.3.1" hpagent: "npm:^0.1.1" ms: "npm:^2.1.3" secure-json-parse: "npm:^2.4.0" - checksum: 10/d54330ce50b4951b7b9db15349413b4961040fb0b73a09d3f07cef5cb2873fd22af17307e07b6c8b1b1e0844e76e9aeb78ce1e01d67a940e3190763a875648be + checksum: 10/ef26489eb8db667f0a6c2be4641e9b388bc5badd2ab7791eb82dffa138653642678f7e6ab2741b914747e95e0d43bf9daa0821bc509318c14cb40869cc9ebbc9 languageName: node linkType: hard From de96a60f7a75235fdab57ca58e1d13239221b41c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 22:08:37 +0000 Subject: [PATCH 116/312] chore(deps): bump express from 4.21.2 to 4.22.0 Bumps [express](https://github.com/expressjs/express) from 4.21.2 to 4.22.0. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.22.0/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.2...4.22.0) --- updated-dependencies: - dependency-name: express dependency-version: 4.22.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .changeset/dependabot-0d8f6de.md | 47 +++ packages/backend-defaults/package.json | 2 +- .../package.json | 2 +- packages/backend-openapi-utils/package.json | 2 +- packages/backend-test-utils/package.json | 2 +- packages/cli/package.json | 2 +- plugins/app-backend/package.json | 2 +- plugins/app-node/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- plugins/auth-backend/package.json | 2 +- plugins/auth-node/package.json | 2 +- .../package.json | 2 +- plugins/catalog-backend/package.json | 2 +- plugins/devtools-backend/package.json | 2 +- plugins/events-backend/package.json | 2 +- plugins/events-node/package.json | 2 +- .../example-todo-list-backend/package.json | 2 +- plugins/gateway-backend/package.json | 2 +- plugins/kubernetes-backend/package.json | 2 +- plugins/mcp-actions-backend/package.json | 2 +- plugins/notifications-backend/package.json | 2 +- plugins/permission-backend/package.json | 2 +- plugins/permission-node/package.json | 2 +- plugins/proxy-backend/package.json | 2 +- plugins/scaffolder-backend/package.json | 2 +- plugins/search-backend/package.json | 2 +- plugins/signals-backend/package.json | 2 +- plugins/signals-node/package.json | 2 +- plugins/techdocs-backend/package.json | 2 +- plugins/techdocs-node/package.json | 2 +- plugins/user-settings-backend/package.json | 2 +- yarn.lock | 305 +++++++++--------- 46 files changed, 246 insertions(+), 194 deletions(-) create mode 100644 .changeset/dependabot-0d8f6de.md diff --git a/.changeset/dependabot-0d8f6de.md b/.changeset/dependabot-0d8f6de.md new file mode 100644 index 0000000000..b0a3955f2d --- /dev/null +++ b/.changeset/dependabot-0d8f6de.md @@ -0,0 +1,47 @@ +--- +'@backstage/backend-defaults': patch +'@backstage/backend-dynamic-feature-service': patch +'@backstage/backend-openapi-utils': patch +'@backstage/backend-test-utils': patch +'@backstage/cli': patch +'@backstage/plugin-app-backend': patch +'@backstage/plugin-app-node': patch +'@backstage/plugin-auth-backend-module-atlassian-provider': patch +'@backstage/plugin-auth-backend-module-auth0-provider': patch +'@backstage/plugin-auth-backend-module-aws-alb-provider': patch +'@backstage/plugin-auth-backend-module-azure-easyauth-provider': patch +'@backstage/plugin-auth-backend-module-bitbucket-provider': patch +'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch +'@backstage/plugin-auth-backend-module-gcp-iap-provider': patch +'@backstage/plugin-auth-backend-module-gitlab-provider': patch +'@backstage/plugin-auth-backend-module-guest-provider': patch +'@backstage/plugin-auth-backend-module-microsoft-provider': patch +'@backstage/plugin-auth-backend-module-oidc-provider': patch +'@backstage/plugin-auth-backend-module-okta-provider': patch +'@backstage/plugin-auth-backend-module-onelogin-provider': patch +'@backstage/plugin-auth-backend-module-openshift-provider': patch +'@backstage/plugin-auth-backend-module-pinniped-provider': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-auth-node': patch +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-devtools-backend': patch +'@backstage/plugin-events-backend': patch +'@backstage/plugin-events-node': patch +'@backstage/plugin-gateway-backend': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-mcp-actions-backend': patch +'@backstage/plugin-notifications-backend': patch +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-permission-node': patch +'@backstage/plugin-proxy-backend': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-search-backend': patch +'@backstage/plugin-signals-backend': patch +'@backstage/plugin-signals-node': patch +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs-node': patch +'@backstage/plugin-user-settings-backend': patch +--- + +chore(deps): bump `express` from 4.21.2 to 4.22.0 diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 261685acc9..69ad4c8733 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -161,7 +161,7 @@ "cookie": "^0.7.0", "cors": "^2.8.5", "cron": "^3.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "express-rate-limit": "^7.5.0", "fs-extra": "^11.2.0", diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index e2d1b95978..b2f2a5902f 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -70,7 +70,7 @@ "@manypkg/get-packages": "^1.1.3", "@module-federation/sdk": "^0.9.0", "chokidar": "^3.5.3", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "lodash": "^4.17.21", diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index fb7af8b5f2..3c4908de61 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -52,7 +52,7 @@ "@types/express": "^4.17.6", "@types/express-serve-static-core": "^4.17.5", "ajv": "^8.16.0", - "express": "^4.17.1", + "express": "^4.22.0", "express-openapi-validator": "^5.5.8", "express-promise-router": "^4.1.0", "get-port": "^5.1.1", diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 70bc3e2e81..6da8ef5e2b 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -67,7 +67,7 @@ "@types/qs": "^6.9.6", "better-sqlite3": "^12.0.0", "cookie": "^0.7.0", - "express": "^4.17.1", + "express": "^4.22.0", "fs-extra": "^11.0.0", "keyv": "^5.2.1", "knex": "^3.0.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index 3fcea01e9e..978645d895 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -100,7 +100,7 @@ "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-unused-imports": "^4.1.4", "eslint-rspack-plugin": "^4.2.1", - "express": "^4.17.1", + "express": "^4.22.0", "fs-extra": "^11.2.0", "git-url-parse": "^15.0.0", "glob": "^7.1.7", diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index d15f004c81..d41dea1880 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -60,7 +60,7 @@ "@backstage/plugin-app-node": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "globby": "^11.0.0", diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 87b8e2b5d5..77049a44c4 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -39,7 +39,7 @@ "@backstage/backend-plugin-api": "workspace:^", "@backstage/config-loader": "workspace:^", "@types/express": "^4.17.6", - "express": "^4.17.1", + "express": "^4.22.0", "fs-extra": "^11.2.0" }, "devDependencies": { diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json index d1355886bd..6edf029908 100644 --- a/plugins/auth-backend-module-atlassian-provider/package.json +++ b/plugins/auth-backend-module-atlassian-provider/package.json @@ -36,7 +36,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "passport": "^0.7.0", "passport-atlassian-oauth2": "^2.1.0", "zod": "^3.22.4" diff --git a/plugins/auth-backend-module-auth0-provider/package.json b/plugins/auth-backend-module-auth0-provider/package.json index 0e65d6b255..bd1dacce32 100644 --- a/plugins/auth-backend-module-auth0-provider/package.json +++ b/plugins/auth-backend-module-auth0-provider/package.json @@ -36,7 +36,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "express": "^4.17.1", + "express": "^4.22.0", "passport-auth0": "^1.4.3", "passport-oauth2": "^1.6.1" }, diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json index 25e308ec4a..d1776aca35 100644 --- a/plugins/auth-backend-module-aws-alb-provider/package.json +++ b/plugins/auth-backend-module-aws-alb-provider/package.json @@ -50,7 +50,7 @@ "@backstage/cli": "workspace:^", "@backstage/config": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "msw": "^2.0.8" } } diff --git a/plugins/auth-backend-module-azure-easyauth-provider/package.json b/plugins/auth-backend-module-azure-easyauth-provider/package.json index 57a6482e2b..f48ac8d234 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/package.json +++ b/plugins/auth-backend-module-azure-easyauth-provider/package.json @@ -38,7 +38,7 @@ "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@types/passport": "^1.0.16", - "express": "^4.19.2", + "express": "^4.22.0", "jose": "^5.0.0", "passport": "^0.7.0", "zod": "^3.22.4" diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json index 6e8861871b..1131d0278c 100644 --- a/plugins/auth-backend-module-bitbucket-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-provider/package.json @@ -36,7 +36,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "passport": "^0.7.0", "passport-bitbucket-oauth2": "^0.1.2", "zod": "^3.22.4" diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json index e666208ac4..3b1a38f544 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/package.json +++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json @@ -38,7 +38,7 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "jose": "^5.0.0", "zod": "^3.22.4" }, diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index f93d35e684..99596dea0e 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -48,7 +48,7 @@ "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "express": "^4.18.2" + "express": "^4.22.0" }, "configSchema": "config.d.ts" } diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index 3463abe4e4..ee06982336 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -36,7 +36,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "passport": "^0.7.0", "passport-gitlab2": "^5.0.0", "zod": "^3.22.4" diff --git a/plugins/auth-backend-module-guest-provider/package.json b/plugins/auth-backend-module-guest-provider/package.json index 34565928e1..5f129b83b9 100644 --- a/plugins/auth-backend-module-guest-provider/package.json +++ b/plugins/auth-backend-module-guest-provider/package.json @@ -44,7 +44,7 @@ "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@backstage/config": "workspace:^", - "express": "^4.18.2" + "express": "^4.22.0" }, "configSchema": "config.d.ts" } diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json index e759aaa752..9b7209cc2c 100644 --- a/plugins/auth-backend-module-microsoft-provider/package.json +++ b/plugins/auth-backend-module-microsoft-provider/package.json @@ -36,7 +36,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "jose": "^5.0.0", "passport-microsoft": "^1.0.0", "zod": "^3.22.4" diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json index 4845cfffe9..5bc7a04766 100644 --- a/plugins/auth-backend-module-oidc-provider/package.json +++ b/plugins/auth-backend-module-oidc-provider/package.json @@ -39,7 +39,7 @@ "@backstage/plugin-auth-backend": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "openid-client": "^5.5.0", "passport": "^0.7.0", "zod": "^3.22.4" diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json index 0b62a7678e..048f6410e3 100644 --- a/plugins/auth-backend-module-okta-provider/package.json +++ b/plugins/auth-backend-module-okta-provider/package.json @@ -37,7 +37,7 @@ "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@davidzemon/passport-okta-oauth": "^0.0.7", - "express": "^4.18.2", + "express": "^4.22.0", "passport": "^0.7.0", "zod": "^3.22.4" }, diff --git a/plugins/auth-backend-module-onelogin-provider/package.json b/plugins/auth-backend-module-onelogin-provider/package.json index 1b7a878b21..ada908ed07 100644 --- a/plugins/auth-backend-module-onelogin-provider/package.json +++ b/plugins/auth-backend-module-onelogin-provider/package.json @@ -36,7 +36,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "passport": "^0.7.0", "passport-onelogin-oauth": "^0.0.1", "zod": "^3.22.4" diff --git a/plugins/auth-backend-module-openshift-provider/package.json b/plugins/auth-backend-module-openshift-provider/package.json index ed86940699..1c1d23639b 100644 --- a/plugins/auth-backend-module-openshift-provider/package.json +++ b/plugins/auth-backend-module-openshift-provider/package.json @@ -47,7 +47,7 @@ "@backstage/cli": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-auth-backend": "workspace:^", - "express": "^4.18.2", + "express": "^4.22.0", "msw": "^2.7.3", "supertest": "^7.1.0" }, diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json index 769cdf4bce..a855298b92 100644 --- a/plugins/auth-backend-module-pinniped-provider/package.json +++ b/plugins/auth-backend-module-pinniped-provider/package.json @@ -46,7 +46,7 @@ "@backstage/cli": "workspace:^", "@backstage/plugin-auth-backend": "workspace:^", "cookie-parser": "^1.4.6", - "express": "^4.18.2", + "express": "^4.22.0", "express-session": "^1.17.3", "jose": "^5.0.0", "msw": "^1.3.0", diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 38dc903811..c556f93de1 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -54,7 +54,7 @@ "@google-cloud/firestore": "^7.0.0", "connect-session-knex": "^4.0.0", "cookie-parser": "^1.4.5", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "express-session": "^1.17.1", "jose": "^5.0.0", diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 1bd4f1212e..a1154b7bbc 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -46,7 +46,7 @@ "@backstage/types": "workspace:^", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", - "express": "^4.17.1", + "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 963ff2f0ee..0838b89866 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -58,7 +58,7 @@ "@backstage/plugin-permission-common": "workspace:^", "@backstage/types": "workspace:^", "@opentelemetry/api": "^1.9.0", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "knex": "^3.0.0", "luxon": "^3.0.0", diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 3be629a239..508299734f 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -77,7 +77,7 @@ "@opentelemetry/api": "^1.9.0", "codeowners-utils": "^1.0.2", "core-js": "^3.6.5", - "express": "^4.17.1", + "express": "^4.22.0", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^15.0.0", diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index 5b729a06a8..ff47940175 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -51,7 +51,7 @@ "@manypkg/get-packages": "^1.1.3", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "^3.0.0", - "express": "^4.18.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "fs-extra": "^11.0.0", "lodash": "^4.17.21", diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index ee5b26314b..db9f5c9c72 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -61,7 +61,7 @@ "@backstage/types": "workspace:^", "@types/express": "^4.17.6", "content-type": "^1.0.5", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "knex": "^3.0.0" }, diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index bf8d6a29b9..156fb4b263 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -59,7 +59,7 @@ "@types/express": "^4.17.6", "content-type": "^1.0.5", "cross-fetch": "^4.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "uri-template": "^2.0.0" }, "devDependencies": { diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index de6e7509e4..4a8e2748c2 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -41,7 +41,7 @@ "@backstage/backend-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", "@types/express": "^4.17.6", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "uuid": "^11.0.0" }, diff --git a/plugins/gateway-backend/package.json b/plugins/gateway-backend/package.json index 988b21790e..7d5bd658e1 100644 --- a/plugins/gateway-backend/package.json +++ b/plugins/gateway-backend/package.json @@ -37,7 +37,7 @@ "@backstage/backend-plugin-api": "workspace:^", "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^1.29.0", - "express": "^4.17.1", + "express": "^4.22.0", "http-proxy-middleware": "^3.0.3" }, "devDependencies": { diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 2715bdc83c..7064a7a901 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -63,7 +63,7 @@ "@kubernetes/client-node": "1.4.0", "@smithy/signature-v4": "^4.1.0", "@types/http-proxy-middleware": "^1.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "http-proxy-middleware": "^2.0.6", diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index c5a7da7251..da90397438 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -41,7 +41,7 @@ "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "@modelcontextprotocol/sdk": "^1.12.3", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4" }, diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index d127faa593..5e50a6b787 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -48,7 +48,7 @@ "@backstage/plugin-notifications-node": "workspace:^", "@backstage/plugin-signals-node": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "knex": "^3.0.0", "p-throttle": "^4.1.1", diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 470ff6fc16..5e599c2d3b 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -58,7 +58,7 @@ "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", "dataloader": "^2.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "lodash": "^4.17.21", "yn": "^4.0.0", diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 691dfc455a..3384aa7524 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -62,7 +62,7 @@ "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@types/express": "^4.17.6", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 7fd9971e5a..331ea354c2 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -64,7 +64,7 @@ "@backstage/errors": "workspace:^", "@types/express": "^4.17.6", "@types/http-proxy-middleware": "^1.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "msw": "^2.0.0" }, "configSchema": "config.d.ts" diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 2d1fe38b57..cdfdafc49c 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -90,7 +90,7 @@ "@opentelemetry/api": "^1.9.0", "@types/luxon": "^3.0.0", "concat-stream": "^2.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "fs-extra": "^11.2.0", "globby": "^11.0.0", "isbinaryfile": "^5.0.0", diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index d6b93fe6ef..d8ffc4a309 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -67,7 +67,7 @@ "@backstage/plugin-search-common": "workspace:^", "@backstage/types": "workspace:^", "dataloader": "^2.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "lodash": "^4.17.21", "qs": "^6.10.1", "yn": "^4.0.0", diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index c4d13748a6..16e84637bd 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -42,7 +42,7 @@ "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-signals-node": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "uuid": "^11.0.0", "ws": "^8.18.0" diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json index 5ae18599df..3727d3de12 100644 --- a/plugins/signals-node/package.json +++ b/plugins/signals-node/package.json @@ -42,7 +42,7 @@ "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-events-node": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.17.1", + "express": "^4.22.0", "uuid": "^11.0.0", "ws": "^8.18.0" }, diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 6ff7df1154..75bdbab5b6 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -68,7 +68,7 @@ "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-techdocs-node": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "knex": "^3.0.0", diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 99e9d1ef24..4752dc65c5 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -66,7 +66,7 @@ "@trendyol-js/openstack-swift-sdk": "^0.0.7", "@types/express": "^4.17.6", "dockerode": "^4.0.0", - "express": "^4.17.1", + "express": "^4.22.0", "fs-extra": "^11.2.0", "git-url-parse": "^15.0.0", "hpagent": "^1.2.0", diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 140e24e9ee..4a744fca45 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -55,7 +55,7 @@ "@backstage/plugin-signals-node": "workspace:^", "@backstage/plugin-user-settings-common": "workspace:^", "@backstage/types": "workspace:^", - "express": "^4.17.1", + "express": "^4.22.0", "express-promise-router": "^4.1.0", "knex": "^3.0.0" }, diff --git a/yarn.lock b/yarn.lock index 3502df3388..35a9f5927c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2911,7 +2911,7 @@ __metadata: cookie: "npm:^0.7.0" cors: "npm:^2.8.5" cron: "npm:^3.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" express-rate-limit: "npm:^7.5.0" fs-extra: "npm:^11.2.0" @@ -3002,7 +3002,7 @@ __metadata: "@module-federation/sdk": "npm:^0.9.0" "@types/express": "npm:^4.17.6" chokidar: "npm:^3.5.3" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" fs-extra: "npm:^11.2.0" lodash: "npm:^4.17.21" @@ -3025,7 +3025,7 @@ __metadata: "@types/express": "npm:^4.17.6" "@types/express-serve-static-core": "npm:^4.17.5" ajv: "npm:^8.16.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-openapi-validator: "npm:^5.5.8" express-promise-router: "npm:^4.1.0" get-port: "npm:^5.1.1" @@ -3088,7 +3088,7 @@ __metadata: "@types/supertest": "npm:^2.0.8" better-sqlite3: "npm:^12.0.0" cookie: "npm:^0.7.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" fs-extra: "npm:^11.0.0" keyv: "npm:^5.2.1" knex: "npm:^3.0.0" @@ -3255,7 +3255,7 @@ __metadata: eslint-plugin-unused-imports: "npm:^4.1.4" eslint-rspack-plugin: "npm:^4.2.1" eslint-webpack-plugin: "npm:^4.2.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" fork-ts-checker-webpack-plugin: "npm:^9.0.0" fs-extra: "npm:^11.2.0" git-url-parse: "npm:^15.0.0" @@ -4015,7 +4015,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/express": "npm:^4.17.6" "@types/supertest": "npm:^2.0.8" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" fs-extra: "npm:^11.2.0" globby: "npm:^11.0.0" @@ -4036,7 +4036,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config-loader": "workspace:^" "@types/express": "npm:^4.17.6" - express: "npm:^4.17.1" + express: "npm:^4.22.0" fs-extra: "npm:^11.2.0" languageName: unknown linkType: soft @@ -4121,7 +4121,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" passport: "npm:^0.7.0" passport-atlassian-oauth2: "npm:^2.1.0" supertest: "npm:^7.0.0" @@ -4142,7 +4142,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/passport-auth0": "npm:^1.0.5" "@types/passport-oauth2": "npm:^1.4.15" - express: "npm:^4.17.1" + express: "npm:^4.22.0" passport-auth0: "npm:^1.4.3" passport-oauth2: "npm:^1.6.1" supertest: "npm:^7.0.0" @@ -4161,7 +4161,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" jose: "npm:^5.0.0" msw: "npm:^2.0.8" node-cache: "npm:^5.1.2" @@ -4181,7 +4181,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@types/passport": "npm:^1.0.16" - express: "npm:^4.19.2" + express: "npm:^4.22.0" jose: "npm:^5.0.0" passport: "npm:^0.7.0" zod: "npm:^3.22.4" @@ -4199,7 +4199,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" passport: "npm:^0.7.0" passport-bitbucket-oauth2: "npm:^0.1.2" supertest: "npm:^7.0.0" @@ -4239,7 +4239,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" jose: "npm:^5.0.0" msw: "npm:^2.0.0" node-mocks-http: "npm:^1.0.0" @@ -4258,7 +4258,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" google-auth-library: "npm:^9.0.0" zod: "npm:^3.22.4" languageName: unknown @@ -4293,7 +4293,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" passport: "npm:^0.7.0" passport-gitlab2: "npm:^5.0.0" supertest: "npm:^7.0.0" @@ -4330,7 +4330,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" passport-oauth2: "npm:^1.7.0" languageName: unknown linkType: soft @@ -4348,7 +4348,7 @@ __metadata: "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" "@types/passport-microsoft": "npm:^1.0.0" - express: "npm:^4.18.2" + express: "npm:^4.22.0" jose: "npm:^5.0.0" msw: "npm:^1.0.0" passport-microsoft: "npm:^1.0.0" @@ -4402,7 +4402,7 @@ __metadata: "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" cookie-parser: "npm:^1.4.6" - express: "npm:^4.18.2" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.1" express-session: "npm:^1.17.3" jose: "npm:^5.0.0" @@ -4426,7 +4426,7 @@ __metadata: "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" "@davidzemon/passport-okta-oauth": "npm:^0.0.7" - express: "npm:^4.18.2" + express: "npm:^4.22.0" passport: "npm:^0.7.0" supertest: "npm:^7.0.0" zod: "npm:^3.22.4" @@ -4444,7 +4444,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" passport: "npm:^0.7.0" passport-onelogin-oauth: "npm:^0.0.1" supertest: "npm:^7.0.0" @@ -4465,7 +4465,7 @@ __metadata: "@backstage/plugin-auth-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" - express: "npm:^4.18.2" + express: "npm:^4.22.0" msw: "npm:^2.7.3" passport-oauth2: "npm:^1.8.0" supertest: "npm:^7.1.0" @@ -4486,7 +4486,7 @@ __metadata: "@backstage/plugin-auth-node": "workspace:^" "@backstage/types": "workspace:^" cookie-parser: "npm:^1.4.6" - express: "npm:^4.18.2" + express: "npm:^4.22.0" express-session: "npm:^1.17.3" jose: "npm:^5.0.0" luxon: "npm:^3.4.3" @@ -4542,7 +4542,7 @@ __metadata: "@types/passport": "npm:^1.0.3" connect-session-knex: "npm:^4.0.0" cookie-parser: "npm:^1.4.5" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" express-session: "npm:^1.17.1" jose: "npm:^5.0.0" @@ -4573,7 +4573,7 @@ __metadata: "@types/express": "npm:^4.17.6" "@types/passport": "npm:^1.0.3" cookie-parser: "npm:^1.4.6" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.1" jose: "npm:^5.0.0" lodash: "npm:^4.17.21" @@ -4923,7 +4923,7 @@ __metadata: "@opentelemetry/api": "npm:^1.9.0" "@types/express": "npm:^4.17.6" "@types/luxon": "npm:^3.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" knex: "npm:^3.0.0" luxon: "npm:^3.0.0" @@ -5085,7 +5085,7 @@ __metadata: better-sqlite3: "npm:^12.0.0" codeowners-utils: "npm:^1.0.2" core-js: "npm:^3.6.5" - express: "npm:^4.17.1" + express: "npm:^4.22.0" fast-json-stable-stringify: "npm:^2.1.0" fs-extra: "npm:^11.2.0" git-url-parse: "npm:^15.0.0" @@ -5447,7 +5447,7 @@ __metadata: "@types/yarnpkg__lockfile": "npm:^1.1.4" "@yarnpkg/lockfile": "npm:^1.1.0" "@yarnpkg/parsers": "npm:^3.0.0" - express: "npm:^4.18.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" fs-extra: "npm:^11.0.0" lodash: "npm:^4.17.21" @@ -5661,7 +5661,7 @@ __metadata: "@types/content-type": "npm:^1.1.8" "@types/express": "npm:^4.17.6" content-type: "npm:^1.0.5" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" knex: "npm:^3.0.0" supertest: "npm:^7.0.0" @@ -5681,7 +5681,7 @@ __metadata: "@types/express": "npm:^4.17.6" content-type: "npm:^1.0.5" cross-fetch: "npm:^4.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" msw: "npm:^1.0.0" uri-template: "npm:^2.0.0" languageName: unknown @@ -5700,7 +5700,7 @@ __metadata: "@opentelemetry/core": "npm:^1.29.0" "@types/express": "npm:^4.17.6" eventsource: "npm:^3.0.6" - express: "npm:^4.17.1" + express: "npm:^4.22.0" http-proxy-middleware: "npm:^3.0.3" wait-for-expect: "npm:^3.0.2" languageName: unknown @@ -5814,7 +5814,7 @@ __metadata: "@types/express": "npm:^4.17.6" "@types/http-proxy-middleware": "npm:^1.0.0" "@types/luxon": "npm:^3.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" fs-extra: "npm:^11.2.0" http-proxy-middleware: "npm:^2.0.6" @@ -5994,7 +5994,7 @@ __metadata: "@backstage/types": "workspace:^" "@modelcontextprotocol/sdk": "npm:^1.12.3" "@types/express": "npm:^4.17.6" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" zod: "npm:^3.22.4" languageName: unknown @@ -6103,7 +6103,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/express": "npm:^4.17.6" "@types/supertest": "npm:^2.0.8" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" knex: "npm:^3.0.0" p-throttle: "npm:^4.1.1" @@ -6292,7 +6292,7 @@ __metadata: "@types/lodash": "npm:^4.14.151" "@types/supertest": "npm:^2.0.8" dataloader: "npm:^2.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" lodash: "npm:^4.17.21" msw: "npm:^1.0.0" @@ -6332,7 +6332,7 @@ __metadata: "@backstage/plugin-permission-common": "workspace:^" "@types/express": "npm:^4.17.6" "@types/supertest": "npm:^2.0.8" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" msw: "npm:^1.0.0" supertest: "npm:^7.0.0" @@ -6383,7 +6383,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/express": "npm:^4.17.6" "@types/http-proxy-middleware": "npm:^1.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" http-proxy-middleware: "npm:^2.0.0" msw: "npm:^2.0.0" @@ -6731,7 +6731,7 @@ __metadata: "@types/zen-observable": "npm:^0.8.0" concat-stream: "npm:^2.0.0" esbuild: "npm:^0.25.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" fs-extra: "npm:^11.2.0" globby: "npm:^11.0.0" isbinaryfile: "npm:^5.0.0" @@ -7137,7 +7137,7 @@ __metadata: "@types/express": "npm:^4.17.6" "@types/supertest": "npm:^2.0.8" dataloader: "npm:^2.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" lodash: "npm:^4.17.21" qs: "npm:^6.10.1" supertest: "npm:^7.0.0" @@ -7257,7 +7257,7 @@ __metadata: "@types/express": "npm:^4.17.6" "@types/supertest": "npm:^2.0.8" "@types/ws": "npm:^8.5.10" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" supertest: "npm:^7.0.0" uuid: "npm:^11.0.0" @@ -7276,7 +7276,7 @@ __metadata: "@backstage/plugin-events-node": "workspace:^" "@backstage/types": "workspace:^" "@types/express": "npm:^4.17.21" - express: "npm:^4.17.1" + express: "npm:^4.22.0" uuid: "npm:^11.0.0" ws: "npm:^8.18.0" languageName: unknown @@ -7392,7 +7392,7 @@ __metadata: "@backstage/plugin-techdocs-node": "workspace:^" "@backstage/types": "workspace:^" "@types/express": "npm:^4.17.6" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" fs-extra: "npm:^11.2.0" knex: "npm:^3.0.0" @@ -7479,7 +7479,7 @@ __metadata: "@types/supertest": "npm:^2.0.8" aws-sdk-client-mock: "npm:^4.0.0" dockerode: "npm:^4.0.0" - express: "npm:^4.17.1" + express: "npm:^4.22.0" fs-extra: "npm:^11.2.0" git-url-parse: "npm:^15.0.0" hpagent: "npm:^1.2.0" @@ -7601,7 +7601,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/express": "npm:^4.17.6" "@types/supertest": "npm:^2.0.8" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" knex: "npm:^3.0.0" supertest: "npm:^7.0.0" @@ -9688,7 +9688,7 @@ __metadata: "@backstage/errors": "workspace:^" "@types/express": "npm:^4.17.6" "@types/supertest": "npm:^2.0.8" - express: "npm:^4.17.1" + express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" supertest: "npm:^7.0.0" uuid: "npm:^11.0.0" @@ -25104,23 +25104,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.3, body-parser@npm:^1.15.2": - version: 1.20.3 - resolution: "body-parser@npm:1.20.3" +"body-parser@npm:^1.15.2, body-parser@npm:~1.20.3": + version: 1.20.4 + resolution: "body-parser@npm:1.20.4" dependencies: - bytes: "npm:3.1.2" + bytes: "npm:~3.1.2" content-type: "npm:~1.0.5" debug: "npm:2.6.9" depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.13.0" - raw-body: "npm:2.5.2" + destroy: "npm:~1.2.0" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + on-finished: "npm:~2.4.1" + qs: "npm:~6.14.0" + raw-body: "npm:~2.5.3" type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10/8723e3d7a672eb50854327453bed85ac48d045f4958e81e7d470c56bf111f835b97e5b73ae9f6393d0011cc9e252771f46fd281bbabc57d33d3986edf1e6aeca + unpipe: "npm:~1.0.0" + checksum: 10/ff67e28d3f426707be8697a75fdf8d564dc50c341b41f054264d8ab6e2924e519c7ce8acc9d0de05328fdc41e1d9f3f200aec9c1cfb1867d6b676a410d97c689 languageName: node linkType: hard @@ -25507,7 +25507,7 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2, bytes@npm:^3.1.2": +"bytes@npm:3.1.2, bytes@npm:^3.1.2, bytes@npm:~3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10/a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 @@ -26834,7 +26834,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4, content-disposition@npm:^0.5.3, content-disposition@npm:~0.5.2": +"content-disposition@npm:^0.5.3, content-disposition@npm:~0.5.2, content-disposition@npm:~0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -26897,7 +26897,7 @@ __metadata: languageName: node linkType: hard -"cookie-signature@npm:1.0.7": +"cookie-signature@npm:1.0.7, cookie-signature@npm:~1.0.6": version: 1.0.7 resolution: "cookie-signature@npm:1.0.7" checksum: 10/1a62808cd30d15fb43b70e19829b64d04b0802d8ef00275b57d152de4ae6a3208ca05c197b6668d104c4d9de389e53ccc2d3bc6bcaaffd9602461417d8c40710 @@ -26911,14 +26911,7 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.7.1": - version: 0.7.1 - resolution: "cookie@npm:0.7.1" - checksum: 10/aec6a6aa0781761bf55d60447d6be08861d381136a0fe94aa084fddd4f0300faa2b064df490c6798adfa1ebaef9e0af9b08a189c823e0811b8b313b3d9a03380 - languageName: node - linkType: hard - -"cookie@npm:0.7.2, cookie@npm:^0.7.0, cookie@npm:^0.7.1, cookie@npm:^0.7.2": +"cookie@npm:0.7.2, cookie@npm:^0.7.0, cookie@npm:^0.7.1, cookie@npm:^0.7.2, cookie@npm:~0.7.1": version: 0.7.2 resolution: "cookie@npm:0.7.2" checksum: 10/24b286c556420d4ba4e9bc09120c9d3db7d28ace2bd0f8ccee82422ce42322f73c8312441271e5eefafbead725980e5996cc02766dbb89a90ac7f5636ede608f @@ -28165,7 +28158,7 @@ __metadata: languageName: node linkType: hard -"destroy@npm:1.2.0, destroy@npm:^1.0.4": +"destroy@npm:1.2.0, destroy@npm:^1.0.4, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 10/0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 @@ -30407,42 +30400,42 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.18.1, express@npm:^4.18.2, express@npm:^4.19.2, express@npm:^4.21.0, express@npm:^4.21.2": - version: 4.21.2 - resolution: "express@npm:4.21.2" +"express@npm:^4.14.0, express@npm:^4.21.0, express@npm:^4.21.2, express@npm:^4.22.0": + version: 4.22.1 + resolution: "express@npm:4.22.1" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.3" - content-disposition: "npm:0.5.4" + body-parser: "npm:~1.20.3" + content-disposition: "npm:~0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.7.1" - cookie-signature: "npm:1.0.6" + cookie: "npm:~0.7.1" + cookie-signature: "npm:~1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.3.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" + finalhandler: "npm:~1.3.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.0" merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" + on-finished: "npm:~2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.12" + path-to-regexp: "npm:~0.1.12" proxy-addr: "npm:~2.0.7" - qs: "npm:6.13.0" + qs: "npm:~6.14.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.19.0" - serve-static: "npm:1.16.2" + send: "npm:~0.19.0" + serve-static: "npm:~1.16.2" setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" + statuses: "npm:~2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/34571c442fc8c9f2c4b442d2faa10ea1175cf8559237fc6a278f5ce6254a8ffdbeb9a15d99f77c1a9f2926ab183e3b7ba560e3261f1ad4149799e3412ab66bd1 + checksum: 10/f33c1bd0c7d36e2a1f18de9cdc176469d32f68e20258d2941b8d296ab9a4fd9011872c246391bf87714f009fac5114c832ec5ac65cbee39421f1258801eb8470 languageName: node linkType: hard @@ -30888,21 +30881,6 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.3.1": - version: 1.3.1 - resolution: "finalhandler@npm:1.3.1" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 10/4babe72969b7373b5842bc9f75c3a641a4d0f8eb53af6b89fa714d4460ce03fb92b28de751d12ba415e96e7e02870c436d67412120555e2b382640535697305b - languageName: node - linkType: hard - "finalhandler@npm:^2.1.0": version: 2.1.0 resolution: "finalhandler@npm:2.1.0" @@ -30917,6 +30895,21 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:~1.3.1": + version: 1.3.2 + resolution: "finalhandler@npm:1.3.2" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:~2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:~2.0.2" + unpipe: "npm:~1.0.0" + checksum: 10/6cb4f9f80eaeb5a0fac4fdbd27a65d39271f040a0034df16556d896bfd855fd42f09da886781b3102117ea8fceba97b903c1f8b08df1fb5740576d5e0f481eed + languageName: node + linkType: hard + "find-cache-dir@npm:^2.0.0": version: 2.1.0 resolution: "find-cache-dir@npm:2.1.0" @@ -32893,7 +32886,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:^2.0.0": +"http-errors@npm:^2.0.0, http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": version: 2.0.1 resolution: "http-errors@npm:2.0.1" dependencies: @@ -33125,15 +33118,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 - languageName: node - linkType: hard - "iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -33152,6 +33136,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:~0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 + languageName: node + linkType: hard + "icss-replace-symbols@npm:^1.1.0": version: 1.1.0 resolution: "icss-replace-symbols@npm:1.1.0" @@ -39912,7 +39905,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1, on-finished@npm:^2.3.0, on-finished@npm:^2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:^2.3.0, on-finished@npm:^2.4.1, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -40930,13 +40923,6 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.12": - version: 0.1.12 - resolution: "path-to-regexp@npm:0.1.12" - checksum: 10/2e30f6a0144679c1f95c98e166b96e6acd1e72be9417830fefc8de7ac1992147eb9a4c7acaa59119fb1b3c34eec393b2129ef27e24b2054a3906fc4fb0d1398e - languageName: node - linkType: hard - "path-to-regexp@npm:3.3.0": version: 3.3.0 resolution: "path-to-regexp@npm:3.3.0" @@ -40958,6 +40944,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:~0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10/2e30f6a0144679c1f95c98e166b96e6acd1e72be9417830fefc8de7ac1992147eb9a4c7acaa59119fb1b3c34eec393b2129ef27e24b2054a3906fc4fb0d1398e + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -42417,16 +42410,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.13.0": - version: 6.13.0 - resolution: "qs@npm:6.13.0" - dependencies: - side-channel: "npm:^1.0.6" - checksum: 10/f548b376e685553d12e461409f0d6e5c59ec7c7d76f308e2a888fd9db3e0c5e89902bedd0754db3a9038eda5f27da2331a6f019c8517dc5e0a16b3c9a6e9cef8 - languageName: node - linkType: hard - -"qs@npm:^6.10.1, qs@npm:^6.10.3, qs@npm:^6.11.2, qs@npm:^6.12.2, qs@npm:^6.12.3, qs@npm:^6.14.0, qs@npm:^6.7.0, qs@npm:^6.9.4": +"qs@npm:^6.10.1, qs@npm:^6.10.3, qs@npm:^6.11.2, qs@npm:^6.12.2, qs@npm:^6.12.3, qs@npm:^6.14.0, qs@npm:^6.7.0, qs@npm:^6.9.4, qs@npm:~6.14.0": version: 6.14.0 resolution: "qs@npm:6.14.0" dependencies: @@ -42603,15 +42587,15 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.2, raw-body@npm:^2.3.3, raw-body@npm:^2.4.1": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" +"raw-body@npm:^2.3.3, raw-body@npm:^2.4.1, raw-body@npm:~2.5.3": + version: 2.5.3 + resolution: "raw-body@npm:2.5.3" dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10/863b5171e140546a4d99f349b720abac4410338e23df5e409cfcc3752538c9caf947ce382c89129ba976f71894bd38b5806c774edac35ebf168d02aa1ac11a95 + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + unpipe: "npm:~1.0.0" + checksum: 10/f35759fe5a6548e7c529121ead1de4dd163f899749a5896c42e278479df2d9d7f98b5bb17312737c03617765e5a1433e586f717616e5cfbebc13b4738b820601 languageName: node linkType: hard @@ -45050,6 +45034,27 @@ __metadata: languageName: node linkType: hard +"send@npm:~0.19.0": + version: 0.19.1 + resolution: "send@npm:0.19.1" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10/360bf50a839c7bbc181f67c3a0f3424a7ad8016dfebcd9eb90891f4b762b4377da14414c32250d67b53872e884171c27469110626f6c22765caa7c38c207ee1d + languageName: node + linkType: hard + "seq-queue@npm:^0.0.5": version: 0.0.5 resolution: "seq-queue@npm:0.0.5" @@ -45114,18 +45119,6 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.16.2": - version: 1.16.2 - resolution: "serve-static@npm:1.16.2" - dependencies: - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:0.19.0" - checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737 - languageName: node - linkType: hard - "serve-static@npm:^2.2.0": version: 2.2.0 resolution: "serve-static@npm:2.2.0" @@ -45138,6 +45131,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:~1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737 + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -45373,7 +45378,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": +"side-channel@npm:^1.1.0": version: 1.1.0 resolution: "side-channel@npm:1.1.0" dependencies: @@ -46037,7 +46042,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:^2.0.1, statuses@npm:~2.0.2": +"statuses@npm:^2.0.1, statuses@npm:~2.0.1, statuses@npm:~2.0.2": version: 2.0.2 resolution: "statuses@npm:2.0.2" checksum: 10/6927feb50c2a75b2a4caab2c565491f7a93ad3d8dbad7b1398d52359e9243a20e2ebe35e33726dee945125ef7a515e9097d8a1b910ba2bbd818265a2f6c39879 From f1ab6ff467c6b0dd84ff6f122c78dad59ef095c0 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 20:35:37 +0100 Subject: [PATCH 117/312] yarn.lock: bump micromark packages Signed-off-by: Patrik Oldsberg --- yarn.lock | 180 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 94 insertions(+), 86 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2fdb68aee4..2d303fdb03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37756,8 +37756,8 @@ __metadata: linkType: hard "micromark-core-commonmark@npm:^1.0.0, micromark-core-commonmark@npm:^1.0.1": - version: 1.0.6 - resolution: "micromark-core-commonmark@npm:1.0.6" + version: 1.1.0 + resolution: "micromark-core-commonmark@npm:1.1.0" dependencies: decode-named-character-reference: "npm:^1.0.0" micromark-factory-destination: "npm:^1.0.0" @@ -37775,25 +37775,25 @@ __metadata: micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.1" uvu: "npm:^0.5.0" - checksum: 10/20daa4b78b88afea7658c2bd428c830734c72fbb2184c1f0761bb4c1e5fcf266509e7d46ad5f7b2a2aeb32cd17951788733cad458632457b52397534d930030a + checksum: 10/a73694d223ac8baad8ff00597a3c39d61f5b32bfd56fe4bcf295d75b2a4e8e67fb2edbfc7cc287b362b9d7f6d24fce08b6a7e8b5b155d79bcc1e4d9b2756ffb2 languageName: node linkType: hard "micromark-extension-gfm-autolink-literal@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-extension-gfm-autolink-literal@npm:1.0.0" + version: 1.0.5 + resolution: "micromark-extension-gfm-autolink-literal@npm:1.0.5" dependencies: micromark-util-character: "npm:^1.0.0" micromark-util-sanitize-uri: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/4bb5841980725bbbe59b311b5b5efbab74b363da00669b96e7744ea76532d972720d1ce92a024baeafbac2c92dbf90b5595a18212415a59ced7610202304ce13 + checksum: 10/1e0ccc758baef3cd0478ba84ff86fa1ec2b389042421c7cade9485b775456c1a9c3bd797393002b2c6f6abd9bdf829cb114874557bbcb8e43d16d06a464811c0 languageName: node linkType: hard "micromark-extension-gfm-footnote@npm:^1.0.0": - version: 1.0.3 - resolution: "micromark-extension-gfm-footnote@npm:1.0.3" + version: 1.1.2 + resolution: "micromark-extension-gfm-footnote@npm:1.1.2" dependencies: micromark-core-commonmark: "npm:^1.0.0" micromark-factory-space: "npm:^1.0.0" @@ -37801,60 +37801,64 @@ __metadata: micromark-util-normalize-identifier: "npm:^1.0.0" micromark-util-sanitize-uri: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" uvu: "npm:^0.5.0" - checksum: 10/1e8920582a2d365eebe48239daaeade3b88d7f6b800f1dd7e7b0d6add730105048d7d1fd68138955b397d572d410c280345560e407328c07fa334e17a965a578 + checksum: 10/8777073fb76d2fd01f6b2405106af6c349c1e25660c4d37cadcc61c187d71c8444870f73cefaaa67f12884d5e45c78ee3c5583561a0b330bd91c6d997113584a languageName: node linkType: hard "micromark-extension-gfm-strikethrough@npm:^1.0.0": - version: 1.0.1 - resolution: "micromark-extension-gfm-strikethrough@npm:1.0.1" + version: 1.0.7 + resolution: "micromark-extension-gfm-strikethrough@npm:1.0.7" dependencies: micromark-util-chunked: "npm:^1.0.0" micromark-util-classify-character: "npm:^1.0.0" micromark-util-resolve-all: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/720aa4e47ac4701faf5640be40a97a249b880d5f8f2787106a0d12bd11dd8ab9e29a513af738743be07d42a02734e024184114b719435160e012c4ba9f7464bd + uvu: "npm:^0.5.0" + checksum: 10/8411ef1aa5dc83f662e8b45b085f70ddff29deb3c4259269e8a1ff656397abb755d8ea841a14be23e8585a31d3c0a5de1bd2c05f3453b66670e499d4a0004f5e languageName: node linkType: hard "micromark-extension-gfm-table@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-extension-gfm-table@npm:1.0.0" + version: 1.0.7 + resolution: "micromark-extension-gfm-table@npm:1.0.7" dependencies: micromark-factory-space: "npm:^1.0.0" micromark-util-character: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/220e2d5c66e4dcd8565cc067d584136fc91dbf249bcee69c6a6cb5656b536144d29734d922602bdfd82242dad2a3d128b25f57e93c50091fd96d7071618eedd9 + uvu: "npm:^0.5.0" + checksum: 10/f05d86a099c941a2a309d60bf4839d16a00a93cb880cda4ab8faeb831647763fff6e03197ec15b80e1f195002afcca6afe2b95c3622b049b82d7ff8ef1c1c776 languageName: node linkType: hard "micromark-extension-gfm-tagfilter@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-extension-gfm-tagfilter@npm:1.0.0" + version: 1.0.2 + resolution: "micromark-extension-gfm-tagfilter@npm:1.0.2" dependencies: micromark-util-types: "npm:^1.0.0" - checksum: 10/2950168c4329486da0d411afebae47601dbbdb8ba51892d88ef451dd62e4d412afaba267f1e4a1d0c93b1b25723cfcdcbb013c458f652e8ab2a1046dd1b5c352 + checksum: 10/55c7d9019d6a39efaaed2c2e40b0aaa137d2c4f9c94cac82e93f509a806c3a775e4c815b5d8e986617450b68861a19776e4b886307e83db452b393f15a837b39 languageName: node linkType: hard "micromark-extension-gfm-task-list-item@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-extension-gfm-task-list-item@npm:1.0.0" + version: 1.0.5 + resolution: "micromark-extension-gfm-task-list-item@npm:1.0.5" dependencies: micromark-factory-space: "npm:^1.0.0" micromark-util-character: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/a8bc41ce4c5599cde45804737381ca5136b43c64c05034e396e476958232916d3bc23e585d3f71c59f03666c568bced41f177a76497267259b813ab4987dd3a5 + uvu: "npm:^0.5.0" + checksum: 10/46bb1baa10bfb785a2e3e2f975e5509260b9995d5c3aeddf77051957d218ce1af4ea737bcb6a56a930e62d42b05307b20632a400eff25cdb290789ff3170cad5 languageName: node linkType: hard "micromark-extension-gfm@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-extension-gfm@npm:2.0.1" + version: 2.0.3 + resolution: "micromark-extension-gfm@npm:2.0.3" dependencies: micromark-extension-gfm-autolink-literal: "npm:^1.0.0" micromark-extension-gfm-footnote: "npm:^1.0.0" @@ -37864,200 +37868,204 @@ __metadata: micromark-extension-gfm-task-list-item: "npm:^1.0.0" micromark-util-combine-extensions: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/701d065102685a338c7eb87520587575dffbc240639a379c64f83971b3ffbeaf0165aa43ce72b0255856e991b395a5fc71dc436ec76d723f462a39ec16eade5e + checksum: 10/3ffd06ced4314abd0f0c72ec227f034f38dd47facbb62439ef3216d42f32433f3901d14675cf806e8d73689802a11849958b330bb5b55dd4fd5cdc64ebaf345c languageName: node linkType: hard "micromark-factory-destination@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-factory-destination@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-factory-destination@npm:1.1.0" dependencies: micromark-util-character: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/8e733ae9c1c2342f14ff290bf09946e20f6f540117d80342377a765cac48df2ea5e748f33c8b07501ad7a43414b1a6597c8510ede2052b6bf1251fab89748e20 + checksum: 10/9e2b5fb5fedbf622b687e20d51eb3d56ae90c0e7ecc19b37bd5285ec392c1e56f6e21aa7cfcb3c01eda88df88fe528f3acb91a5f57d7f4cba310bc3cd7f824fa languageName: node linkType: hard "micromark-factory-label@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-factory-label@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-factory-label@npm:1.1.0" dependencies: micromark-util-character: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/37f34d8e42e3a606a636419ffe0f99fd7f6054778365aac56d1cc11585d1cd46000dbf938319abb2ea5e245803679d3cfa46afb5aecf2702bfd963113481f14c + uvu: "npm:^0.5.0" + checksum: 10/fcda48f1287d9b148c562c627418a2ab759cdeae9c8e017910a0cba94bb759a96611e1fc6df33182e97d28fbf191475237298983bb89ef07d5b02464b1ad28d5 languageName: node linkType: hard "micromark-factory-space@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-factory-space@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" dependencies: micromark-util-character: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/70d3aafde4e68ef4e509a3b644e9a29e4aada00801279e346577b008cbca06d78051bcd62aa7ea7425856ed73f09abd2b36607803055f726f52607ee7cb706b0 + checksum: 10/b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 languageName: node linkType: hard "micromark-factory-title@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-factory-title@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-factory-title@npm:1.1.0" dependencies: micromark-factory-space: "npm:^1.0.0" micromark-util-character: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/d9bf0779c49f013fea5fc5daadcee91e1703c81c1b5091337e806c24f1ea224d69f534d174aba2eccff7826620af71bb3db83b1caf14cbb89bea53f4e8e38bc3 + checksum: 10/4432d3dbc828c81f483c5901b0c6591a85d65a9e33f7d96ba7c3ae821617a0b3237ff5faf53a9152d00aaf9afb3a9f185b205590f40ed754f1d9232e0e9157b1 languageName: node linkType: hard "micromark-factory-whitespace@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-factory-whitespace@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-factory-whitespace@npm:1.1.0" dependencies: micromark-factory-space: "npm:^1.0.0" micromark-util-character: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/0888386e6ea2dd665a5182c570d9b3d0a172d3f11694ca5a2a84e552149c9f1429f5b975ec26e1f0fa4388c55a656c9f359ce5e0603aff6175ba3e255076f20b + checksum: 10/ef0fa682c7d593d85a514ee329809dee27d10bc2a2b65217d8ef81173e33b8e83c549049764b1ad851adfe0a204dec5450d9d20a4ca8598f6c94533a73f73fcd languageName: node linkType: hard "micromark-util-character@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-character@npm:1.1.0" + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" dependencies: micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/81a1e4ee996e89966f58620088ca1ad49a6b1474fa488992be9b6f62d783d621c33f74c01f8560a2960412a43e83c7d991c711620ff3ee49169eb77de0bb2e3a + checksum: 10/88cf80f9b4c95266f24814ef587fb4180454668dcc3be4ac829e1227188cf349c8981bfca29e3eab1682f324c2c47544c0b0b799a26fbf9df5f156c6a84c970c languageName: node linkType: hard "micromark-util-chunked@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-chunked@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-chunked@npm:1.1.0" dependencies: micromark-util-symbol: "npm:^1.0.0" - checksum: 10/c1efd56e8c4217bcf1c6f1a9fb9912b4a2a5503b00d031da902be922fb3fee60409ac53f11739991291357b2784fb0647ddfc74c94753a068646c0cb0fd71421 + checksum: 10/c435bde9110cb595e3c61b7f54c2dc28ee03e6a57fa0fc1e67e498ad8bac61ee5a7457a2b6a73022ddc585676ede4b912d28dcf57eb3bd6951e54015e14dc20b languageName: node linkType: hard "micromark-util-classify-character@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-classify-character@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-classify-character@npm:1.1.0" dependencies: micromark-util-character: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/180446e6a1dec653f625ded028f244784e1db8d10ad05c5d70f08af9de393b4a03dc6cf6fa5ed8ccc9c24bbece7837abf3bf66681c0b4adf159364b7d5236dfd + checksum: 10/8499cb0bb1f7fb946f5896285fcca65cd742f66cd3e79ba7744792bd413ec46834f932a286de650349914d02e822946df3b55d03e6a8e1d245d1ddbd5102e5b0 languageName: node linkType: hard "micromark-util-combine-extensions@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-combine-extensions@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-combine-extensions@npm:1.1.0" dependencies: micromark-util-chunked: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/5304a820ef75340e1be69d6ad167055b6ba9a3bafe8171e5945a935752f462415a9dd61eb3490220c055a8a11167209a45bfa73f278338b7d3d61fa1464d3f35 + checksum: 10/ee78464f5d4b61ccb437850cd2d7da4d690b260bca4ca7a79c4bb70291b84f83988159e373b167181b6716cb197e309bc6e6c96a68cc3ba9d50c13652774aba9 languageName: node linkType: hard "micromark-util-decode-numeric-character-reference@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-decode-numeric-character-reference@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" dependencies: micromark-util-symbol: "npm:^1.0.0" - checksum: 10/f3ae2bb582a80f1e9d3face026f585c0c472335c064bd850bde152376f0394cb2831746749b6be6e0160f7d73626f67d10716026c04c87f402c0dd45a1a28633 + checksum: 10/4733fe75146e37611243f055fc6847137b66f0cde74d080e33bd26d0408c1d6f44cabc984063eee5968b133cb46855e729d555b9ff8d744652262b7b51feec73 languageName: node linkType: hard "micromark-util-decode-string@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-decode-string@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-decode-string@npm:1.1.0" dependencies: + decode-named-character-reference: "npm:^1.0.0" micromark-util-character: "npm:^1.0.0" micromark-util-decode-numeric-character-reference: "npm:^1.0.0" - parse-entities: "npm:^3.0.0" - checksum: 10/9c7e6e3950e675f39058935e065e8774a1ef26a0d386eb45abd96fb8c0312c8a72464c672f41a3c7668974ac2a7cb2ad23b84eee3775b0bd4c47947d9fc64888 + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/f1625155db452f15aa472918499689ba086b9c49d1322a08b22bfbcabe918c61b230a3002c8bc3ea9b1f52ca7a9bb1c3dd43ccb548c7f5f8b16c24a1ae77a813 languageName: node linkType: hard "micromark-util-encode@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-encode@npm:1.0.0" - checksum: 10/16985a6b355721307553d1893da364e83144ef068f84978071a9b4b3d884b65c3138f8330fb039aac10f75766b4906e03c5e62baafb1bf5e731f959878277712 + version: 1.1.0 + resolution: "micromark-util-encode@npm:1.1.0" + checksum: 10/4ef29d02b12336918cea6782fa87c8c578c67463925221d4e42183a706bde07f4b8b5f9a5e1c7ce8c73bb5a98b261acd3238fecd152e6dd1cdfa2d1ae11b60a0 languageName: node linkType: hard "micromark-util-html-tag-name@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-html-tag-name@npm:1.0.0" - checksum: 10/ed07ce9b9bb30cc4ea57f733089b3a253a6132c0608ccfc105eadb32f1f80bbd2347bf8a74f897fe039d7805a59f602fd4dd15f6adc7926d40b3646da2888d0f + version: 1.2.0 + resolution: "micromark-util-html-tag-name@npm:1.2.0" + checksum: 10/ccf0fa99b5c58676dc5192c74665a3bfd1b536fafaf94723bd7f31f96979d589992df6fcf2862eba290ef18e6a8efb30ec8e1e910d9f3fc74f208871e9f84750 languageName: node linkType: hard "micromark-util-normalize-identifier@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-normalize-identifier@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-normalize-identifier@npm:1.1.0" dependencies: micromark-util-symbol: "npm:^1.0.0" - checksum: 10/d7c09d5e8318fb72f194af72664bd84a48a2928e3550b2b21c8fbc0ec22524f2a72e0f6663d2b95dc189a6957d3d7759b60716e888909710767cd557be821f8b + checksum: 10/8655bea41ffa4333e03fc22462cb42d631bbef9c3c07b625fd852b7eb442a110f9d2e5902a42e65188d85498279569502bf92f3434a1180fc06f7c37edfbaee2 languageName: node linkType: hard "micromark-util-resolve-all@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-resolve-all@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-resolve-all@npm:1.1.0" dependencies: micromark-util-types: "npm:^1.0.0" - checksum: 10/409667f2bd126ef8acce009270d2aecaaa5584c5807672bc657b09e50aa91bd2e552cf41e5be1e6469244a83349cbb71daf6059b746b1c44e3f35446fef63e50 + checksum: 10/1ce6c0237cd3ca061e76fae6602cf95014e764a91be1b9f10d36cb0f21ca88f9a07de8d49ab8101efd0b140a4fbfda6a1efb72027ab3f4d5b54c9543271dc52c languageName: node linkType: hard "micromark-util-sanitize-uri@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-sanitize-uri@npm:1.0.0" + version: 1.2.0 + resolution: "micromark-util-sanitize-uri@npm:1.2.0" dependencies: micromark-util-character: "npm:^1.0.0" micromark-util-encode: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" - checksum: 10/198e91b9f86d429ebc74737c0378764c8dc2e988f46a6846f59223938bc9f3a5d4ae97ce9ce801ac6f3a76cce3da1196cbb3d5ba13bb4cce53026b06891a61da + checksum: 10/0d024100d95ffb88bf75f3360e305b545c1eb745430959b8633f7aa93f37ec401fc7094c90c97298409a9e30d94d53b895bae224e1bb966bea114976cfa0fd48 languageName: node linkType: hard "micromark-util-subtokenize@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-subtokenize@npm:1.0.0" + version: 1.1.0 + resolution: "micromark-util-subtokenize@npm:1.1.0" dependencies: micromark-util-chunked: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.0" - checksum: 10/0b19352a05c958c38782be7be6ca1c5ce004f24b4d5fdb70666d2dfa4c75d859a0fc44ef3e899ad085fe3022b0cd1201748f96b5617d09e43ea455ba2e2d0f9a + uvu: "npm:^0.5.0" + checksum: 10/075a1db6ea586d65827d3eead33dbfc520c4e43659c93fcd8fd82f44a7b75cfe61dcde967a3dfcc2ffd999347440ba5aa6698e65a04f3fc627e13e9f12a1a910 languageName: node linkType: hard "micromark-util-symbol@npm:^1.0.0": - version: 1.0.0 - resolution: "micromark-util-symbol@npm:1.0.0" - checksum: 10/93945fd4863bcf9e4186ee6f234a1ef790f884e927287aed6741d41d37dae4c0783d36f3f811e94e1634ea86c6bb484b6d2691d5e87a471aee32500cb1a4c136 + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 10/a26b6b1efd77a715a4d9bbe0a5338eaf3d04ea5e85733e34fee56dfeabf64495c0afc5438fe5220316884cd3a5eae1f17768e0ff4e117827ea4a653897466f86 languageName: node linkType: hard "micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": - version: 1.0.1 - resolution: "micromark-util-types@npm:1.0.1" - checksum: 10/cc270381bb1035e610592d76a9889ec7d2d8f613bd6c2cbbfc09cae8232602af132ca4d2a5d498b0f9e30db6bc33e0320bb7386ee2abc7267d6a1c25dadcbd85 + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: 10/287ac5de4a3802bb6f6c3842197c294997a488db1c0486e03c7a8e674d9eb7720c17dda1bcb814814b8343b338c4826fcbc0555f3e75463712a60dcdb53a028e languageName: node linkType: hard "micromark@npm:^3.0.0": - version: 3.0.5 - resolution: "micromark@npm:3.0.5" + version: 3.2.0 + resolution: "micromark@npm:3.2.0" dependencies: "@types/debug": "npm:^4.0.0" debug: "npm:^4.0.0" + decode-named-character-reference: "npm:^1.0.0" micromark-core-commonmark: "npm:^1.0.1" micromark-factory-space: "npm:^1.0.0" micromark-util-character: "npm:^1.0.0" @@ -38071,8 +38079,8 @@ __metadata: micromark-util-subtokenize: "npm:^1.0.0" micromark-util-symbol: "npm:^1.0.0" micromark-util-types: "npm:^1.0.1" - parse-entities: "npm:^3.0.0" - checksum: 10/cb6c259849562f69f901150f37343ed7f952b75d01a3f0c312b5a0fe58c5f3304067c66be5dcf4a781a4da51073a631c2db095d3647f5d6d7895b44f181197b5 + uvu: "npm:^0.5.0" + checksum: 10/560a4a501efc3859d622461aaa9345fb95b99a2f34d3d3f2a775ab04de1dd857cb0f642083a6b28ab01bd817f5f0741a1be9857fd702f45e04a3752927a66719 languageName: node linkType: hard From b1e584fac01cf8e52493cecab16f1b7addf91d8c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 09:47:11 +0000 Subject: [PATCH 118/312] chore(deps): update actions/checkout digest to 34e1148 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/api-breaking-changes-comment.yml | 2 +- .github/workflows/issue.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 9b20cf80fb..61da4699cb 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -99,7 +99,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Fetch cached Manifests File id: cache diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index 2eefcfcd88..607a951e4b 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -22,7 +22,7 @@ jobs: # We need to checkout the `.github/ISSUE_TEMPLATE` for the advanced labeler action to be able to read the templates # While at it we might as well checkout all of `.github` so that the labeling actions don't need to fetch their configs - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: sparse-checkout: .github From 1cf69af08d305c56838eaf3dfb836bed2c73fd16 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 19:49:05 +0000 Subject: [PATCH 119/312] chore(deps): update dependency @changesets/cli to v2.29.8 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 80 +++++++++++++++++++++++++++---------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/yarn.lock b/yarn.lock index 12ba582d90..c3765be902 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7908,11 +7908,11 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^7.0.13": - version: 7.0.13 - resolution: "@changesets/apply-release-plan@npm:7.0.13" +"@changesets/apply-release-plan@npm:^7.0.14": + version: 7.0.14 + resolution: "@changesets/apply-release-plan@npm:7.0.14" dependencies: - "@changesets/config": "npm:^3.1.1" + "@changesets/config": "npm:^3.1.2" "@changesets/get-version-range-type": "npm:^0.4.0" "@changesets/git": "npm:^3.0.4" "@changesets/should-skip-package": "npm:^0.1.2" @@ -7925,7 +7925,7 @@ __metadata: prettier: "npm:^2.7.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" - checksum: 10/b2ef4fc9a68ffd5c0543f0a98b8ea2321ff58519d541720646692a03844a2cd8e860ebcb93846be1e062926414dc343333196bfd8806fab26f637e8db8adbb9e + checksum: 10/7735783734bddd6d628e3a18c6de253685504c18f580636979fe558dda88501c8e4bda28c34a2f9da96f80fae0d1228271857d86fff6045226ce04b18d8b98b6 languageName: node linkType: hard @@ -7953,24 +7953,24 @@ __metadata: linkType: hard "@changesets/cli@npm:^2.14.0": - version: 2.29.7 - resolution: "@changesets/cli@npm:2.29.7" + version: 2.29.8 + resolution: "@changesets/cli@npm:2.29.8" dependencies: - "@changesets/apply-release-plan": "npm:^7.0.13" + "@changesets/apply-release-plan": "npm:^7.0.14" "@changesets/assemble-release-plan": "npm:^6.0.9" "@changesets/changelog-git": "npm:^0.2.1" - "@changesets/config": "npm:^3.1.1" + "@changesets/config": "npm:^3.1.2" "@changesets/errors": "npm:^0.2.0" "@changesets/get-dependents-graph": "npm:^2.1.3" - "@changesets/get-release-plan": "npm:^4.0.13" + "@changesets/get-release-plan": "npm:^4.0.14" "@changesets/git": "npm:^3.0.4" "@changesets/logger": "npm:^0.1.1" "@changesets/pre": "npm:^2.0.2" - "@changesets/read": "npm:^0.6.5" + "@changesets/read": "npm:^0.6.6" "@changesets/should-skip-package": "npm:^0.1.2" "@changesets/types": "npm:^6.1.0" "@changesets/write": "npm:^0.4.0" - "@inquirer/external-editor": "npm:^1.0.0" + "@inquirer/external-editor": "npm:^1.0.2" "@manypkg/get-packages": "npm:^1.1.3" ansi-colors: "npm:^4.1.3" ci-info: "npm:^3.7.0" @@ -7986,13 +7986,13 @@ __metadata: term-size: "npm:^2.1.0" bin: changeset: bin.js - checksum: 10/e44ee8e9a09ffc990707ec272b03f5724890e6d8833815b80265a9e62f2784ee3fa76c858469fa95c53e1dabd9a0500a6c36b1343211fc0a38902d8fd1b1fce5 + checksum: 10/1169d97d7d0b86fdeb778aadc1ffa3e46c840345c97b4cdbe90e5fc0168d0d0870001d66f6676537716a2d22c147a84e8a120f1298156419dc6a662681861af5 languageName: node linkType: hard -"@changesets/config@npm:^3.1.1": - version: 3.1.1 - resolution: "@changesets/config@npm:3.1.1" +"@changesets/config@npm:^3.1.2": + version: 3.1.2 + resolution: "@changesets/config@npm:3.1.2" dependencies: "@changesets/errors": "npm:^0.2.0" "@changesets/get-dependents-graph": "npm:^2.1.3" @@ -8001,7 +8001,7 @@ __metadata: "@manypkg/get-packages": "npm:^1.1.3" fs-extra: "npm:^7.0.1" micromatch: "npm:^4.0.8" - checksum: 10/9500e02b68801f052478b3e10523bd3a39b9e5e989e718832832537c9da965580f496262c2bc3f6e23a4e6fb4303f730a69dcbf2041f68d2fa7bd03dd1f82db0 + checksum: 10/c35626240c0af83433808216be48cc39dd0b27d20a7d3bbb95c0da0044a08207986678dae97f081cc524abf8351e0303890794a28e8c67f17036bd88013b2576 languageName: node linkType: hard @@ -8026,17 +8026,17 @@ __metadata: languageName: node linkType: hard -"@changesets/get-release-plan@npm:^4.0.13": - version: 4.0.13 - resolution: "@changesets/get-release-plan@npm:4.0.13" +"@changesets/get-release-plan@npm:^4.0.14": + version: 4.0.14 + resolution: "@changesets/get-release-plan@npm:4.0.14" dependencies: "@changesets/assemble-release-plan": "npm:^6.0.9" - "@changesets/config": "npm:^3.1.1" + "@changesets/config": "npm:^3.1.2" "@changesets/pre": "npm:^2.0.2" - "@changesets/read": "npm:^0.6.5" + "@changesets/read": "npm:^0.6.6" "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" - checksum: 10/9983fae5a68012c4c418ddd62f2fb3d325363f21160252ff7b868503a1a2effb8fdd32e4a0289b72653afc3605ce19d163ff69205c942a0004efb571a5f78fd0 + checksum: 10/0b54f4e34dc27aa9df928488bf84f3d6a2b516701985d06b49306d45b87b48e642aef3de751f9517de4c1b88011b5826975aa85f8ba596da1f9681a5d1699093 languageName: node linkType: hard @@ -8069,13 +8069,13 @@ __metadata: languageName: node linkType: hard -"@changesets/parse@npm:^0.4.1": - version: 0.4.1 - resolution: "@changesets/parse@npm:0.4.1" +"@changesets/parse@npm:^0.4.2": + version: 0.4.2 + resolution: "@changesets/parse@npm:0.4.2" dependencies: "@changesets/types": "npm:^6.1.0" - js-yaml: "npm:^3.13.1" - checksum: 10/2973ab8f38592a80efea589e148e5bdfd6ed3af86aa9206f941b5b3955f68464bf70a5965349f642667c708ebae60e4266be538328cd27075cace3f7cc1022e3 + js-yaml: "npm:^4.1.1" + checksum: 10/d45d7f5d7a0aeede197935f16bb459479c8d0b16ebe89ceaf4bd58b307ef1be696bcc5d5fc33d5b64a80dec946b49f6107af32d57d91967e6b3f9013a0d53740 languageName: node linkType: hard @@ -8091,18 +8091,18 @@ __metadata: languageName: node linkType: hard -"@changesets/read@npm:^0.6.5": - version: 0.6.5 - resolution: "@changesets/read@npm:0.6.5" +"@changesets/read@npm:^0.6.6": + version: 0.6.6 + resolution: "@changesets/read@npm:0.6.6" dependencies: "@changesets/git": "npm:^3.0.4" "@changesets/logger": "npm:^0.1.1" - "@changesets/parse": "npm:^0.4.1" + "@changesets/parse": "npm:^0.4.2" "@changesets/types": "npm:^6.1.0" fs-extra: "npm:^7.0.1" p-filter: "npm:^2.1.0" picocolors: "npm:^1.1.0" - checksum: 10/fec0ac28801e0560fae0eb1d21250dd2a48aaff67bddd1b446a960afd761690d5873dca6eff369d43763bec61f1023d38a38876d5824e316e6de622dc52a24f3 + checksum: 10/3ac0cf24159b0e0fea4339d0a01c57459a6b7796f868dca7db65727c3dd33ead38b78f224b677cf7b50bb7b96fa3d0b155843e800a524b435a772c9ed21fa914 languageName: node linkType: hard @@ -9625,18 +9625,18 @@ __metadata: languageName: node linkType: hard -"@inquirer/external-editor@npm:^1.0.0": - version: 1.0.2 - resolution: "@inquirer/external-editor@npm:1.0.2" +"@inquirer/external-editor@npm:^1.0.0, @inquirer/external-editor@npm:^1.0.2": + version: 1.0.3 + resolution: "@inquirer/external-editor@npm:1.0.3" dependencies: - chardet: "npm:^2.1.0" + chardet: "npm:^2.1.1" iconv-lite: "npm:^0.7.0" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10/d0c5c73249b8153f4cf872c4fba01c57a7653142a4cad496f17ed03ef3769330a4b3c519b68d70af69d4bb33003d2599b66b2242be85411c0b027ff383619666 + checksum: 10/c95d7237a885b32031715089f92820525731d4d3c2bd7afdb826307dc296cc2b39e7a644b0bb265441963348cca42e7785feb29c3aaf18fd2b63131769bf6587 languageName: node linkType: hard @@ -25891,7 +25891,7 @@ __metadata: languageName: node linkType: hard -"chardet@npm:^2.1.0": +"chardet@npm:^2.1.1": version: 2.1.1 resolution: "chardet@npm:2.1.1" checksum: 10/d56913b65e45c5c86f331988e2ef6264c131bfeadaae098ee719bf6610546c77740e37221ffec802dde56b5e4466613a4c754786f4da6b5f6c5477243454d324 @@ -35267,7 +35267,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1": version: 4.1.1 resolution: "js-yaml@npm:4.1.1" dependencies: From 74dcd91682341c37a093134ffb080c245f7dee60 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 20:07:33 +0000 Subject: [PATCH 120/312] chore(deps): update dependency typedoc to v0.28.15 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 62 +++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/yarn.lock b/yarn.lock index 12ba582d90..f8081b248b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8921,16 +8921,16 @@ __metadata: languageName: node linkType: hard -"@gerrit0/mini-shiki@npm:^3.12.0": - version: 3.14.0 - resolution: "@gerrit0/mini-shiki@npm:3.14.0" +"@gerrit0/mini-shiki@npm:^3.17.0": + version: 3.17.1 + resolution: "@gerrit0/mini-shiki@npm:3.17.1" dependencies: - "@shikijs/engine-oniguruma": "npm:^3.14.0" - "@shikijs/langs": "npm:^3.14.0" - "@shikijs/themes": "npm:^3.14.0" - "@shikijs/types": "npm:^3.14.0" + "@shikijs/engine-oniguruma": "npm:^3.17.1" + "@shikijs/langs": "npm:^3.17.1" + "@shikijs/themes": "npm:^3.17.1" + "@shikijs/types": "npm:^3.17.1" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10/339fd706f2bf30193e87fe25e4d2bb676c7fd85f0abddf859c055d9ffdbfc9c5a7cd113555e990be409fb115ee24fbcb335b17e74fa71903430b4e3a619379b1 + checksum: 10/efcf8bea95911dc645c76b90aba2ed0898efa42ec068774c77f5272343aa421dbb72b08f7ce40df90f3223e56c21af185021a81b43a34bd73be248100dc3a21c languageName: node linkType: hard @@ -17048,41 +17048,41 @@ __metadata: languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:^3.14.0": - version: 3.14.0 - resolution: "@shikijs/engine-oniguruma@npm:3.14.0" +"@shikijs/engine-oniguruma@npm:^3.17.1": + version: 3.18.0 + resolution: "@shikijs/engine-oniguruma@npm:3.18.0" dependencies: - "@shikijs/types": "npm:3.14.0" + "@shikijs/types": "npm:3.18.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10/54fd65a8d4c2d85c170f324b122025b7c8f5f7d2e856e918ba8fed47efbca6ec976e92b37e463c8007527f597eec5403fcafad480b24588fc3304dcc66d06938 + checksum: 10/66fddeedd5e96b926ed06081dc678738b599c47da80e2f8809bd812398e9ba6e0fb00b7943a92e21c22c7aea2a813042bd936d28ee25901c58182e023122a176 languageName: node linkType: hard -"@shikijs/langs@npm:^3.14.0": - version: 3.14.0 - resolution: "@shikijs/langs@npm:3.14.0" +"@shikijs/langs@npm:^3.17.1": + version: 3.18.0 + resolution: "@shikijs/langs@npm:3.18.0" dependencies: - "@shikijs/types": "npm:3.14.0" - checksum: 10/fcbf350ab743dec154e0fedae40112d732930f8bf7e91829e492625c9e49067b7ee684ea276550894dcaea72ed0df63e97872cf7d2ed64fb6ab9f0cbc2431ce9 + "@shikijs/types": "npm:3.18.0" + checksum: 10/6d872ea7d700081f4c021bea0692948443cb47f5664d5977ad902da953bdfaf71a2a5fba0e6d159ad279a37ce62fdb473698922495813c5dd2de2ecd8b3683c4 languageName: node linkType: hard -"@shikijs/themes@npm:^3.14.0": - version: 3.14.0 - resolution: "@shikijs/themes@npm:3.14.0" +"@shikijs/themes@npm:^3.17.1": + version: 3.18.0 + resolution: "@shikijs/themes@npm:3.18.0" dependencies: - "@shikijs/types": "npm:3.14.0" - checksum: 10/4ab89e6eaa1de0b41ab0fb3fefa65684cae87c6efab6cd75d951f3fee81faba04f022cdc45763956cc2415d08cf56ab2c3477655570ef8ef0a4ab0c0affe9190 + "@shikijs/types": "npm:3.18.0" + checksum: 10/6b5221a23042fd4ce2af60dc36f85b04615f962990cc8a1c6e8b0ca12c6af2fb7152b5c2e89213236436a46751cc746c98fbb7ca72ef9f1a950cf3c4ec10277a languageName: node linkType: hard -"@shikijs/types@npm:3.14.0, @shikijs/types@npm:^3.14.0": - version: 3.14.0 - resolution: "@shikijs/types@npm:3.14.0" +"@shikijs/types@npm:3.18.0, @shikijs/types@npm:^3.17.1": + version: 3.18.0 + resolution: "@shikijs/types@npm:3.18.0" dependencies: "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" - checksum: 10/361e6cd13a7c32f73ee056281fca19e53214450663ddf245c87f06e22c9d21e102cc5b8ef0778f0bf85146387b45347ae2f504591f5fd192f8ef3c5e2fcfccda + checksum: 10/32a11448e716a31a6ef24483f6063fcb43243e6801fed235af25a7afc5ca23f9115616338e3cec3b64f6ec8bf6aa674571344636931331948da012269792a47d languageName: node linkType: hard @@ -48097,10 +48097,10 @@ __metadata: linkType: hard "typedoc@npm:^0.28.0": - version: 0.28.14 - resolution: "typedoc@npm:0.28.14" + version: 0.28.15 + resolution: "typedoc@npm:0.28.15" dependencies: - "@gerrit0/mini-shiki": "npm:^3.12.0" + "@gerrit0/mini-shiki": "npm:^3.17.0" lunr: "npm:^2.3.9" markdown-it: "npm:^14.1.0" minimatch: "npm:^9.0.5" @@ -48109,7 +48109,7 @@ __metadata: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x bin: typedoc: bin/typedoc - checksum: 10/6b2bb87c85de96475f60ba2a92e0cb7169fef138cce4d91c949267ca9268c4fc97c2db9702f306ad5e594aa5244cc9aa563791ec31dd1b1d5288cf1ab08aa7a0 + checksum: 10/c4bfed5435c5fbd8a63f0e058b7d845c83872c2648c5db49c2ace613013dbce55ca04b30630db2c72abbbd0850d8c110781cd5da6c508e781f7a7845a0e9c0d7 languageName: node linkType: hard From aa792518cc86f77916d40d70bb449cf0a03f2d46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:38:58 +0000 Subject: [PATCH 121/312] build(deps): bump node-forge from 1.3.1 to 1.3.2 Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2. - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2) --- updated-dependencies: - dependency-name: node-forge dependency-version: 1.3.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .changeset/dependabot-5e654fe.md | 5 +++++ packages/backend-defaults/package.json | 2 +- yarn.lock | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/dependabot-5e654fe.md diff --git a/.changeset/dependabot-5e654fe.md b/.changeset/dependabot-5e654fe.md new file mode 100644 index 0000000000..93563cffc6 --- /dev/null +++ b/.changeset/dependabot-5e654fe.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +build(deps): bump `node-forge` from 1.3.1 to 1.3.2 diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 69ad4c8733..149aa275bd 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -178,7 +178,7 @@ "minimatch": "^9.0.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", - "node-forge": "^1.3.1", + "node-forge": "^1.3.2", "p-limit": "^3.1.0", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", diff --git a/yarn.lock b/yarn.lock index c43e17d77d..07c595fb0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2930,7 +2930,7 @@ __metadata: msw: "npm:^1.0.0" mysql2: "npm:^3.0.0" node-fetch: "npm:^2.7.0" - node-forge: "npm:^1.3.1" + node-forge: "npm:^1.3.2" node-mocks-http: "npm:^1.0.0" p-limit: "npm:^3.1.0" path-to-regexp: "npm:^8.0.0" @@ -39190,7 +39190,7 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1": +"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.2": version: 1.3.2 resolution: "node-forge@npm:1.3.2" checksum: 10/dcc54aaffe0cf52367214a20c0032aa9b209d9095dd14526504f1972d1900a07e96046b3684cb0c8d0cc3d48744dd18e02b7b447ab28fac615ffb850beeabf18 From 305c2d35f0e2f0fefc1a63d2da2933fac65089c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 21:10:01 +0000 Subject: [PATCH 122/312] chore(deps): update step-security/harden-runner action to v2.13.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/api-breaking-changes-comment.yml | 2 +- .github/workflows/api-breaking-changes.yml | 2 +- .github/workflows/automate_area-labels.yml | 2 +- .github/workflows/automate_changeset_feedback.yml | 2 +- .github/workflows/automate_merge_message.yml | 2 +- .github/workflows/automate_stale.yml | 2 +- .github/workflows/ci-noop.yml | 2 +- .github/workflows/ci.yml | 4 ++-- .github/workflows/cleanup_patch-files.yml | 2 +- .github/workflows/cron.yml | 2 +- .github/workflows/deploy_docker-image.yml | 2 +- .github/workflows/deploy_microsite.yml | 6 +++--- .github/workflows/deploy_packages.yml | 2 +- .github/workflows/issue.yaml | 2 +- .github/workflows/mui-migration-tracker.yml | 2 +- .github/workflows/pr-review-comment-trigger.yaml | 2 +- .github/workflows/pr-review-comment.yaml | 2 +- .github/workflows/pr.yaml | 2 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/sync_canon.yml | 2 +- .github/workflows/sync_code-formatting.yml | 2 +- .github/workflows/sync_dependabot-changesets.yml | 2 +- .github/workflows/sync_patch-release.yml | 2 +- .github/workflows/sync_release-manifest.yml | 2 +- .github/workflows/sync_renovate-changesets.yml | 2 +- .github/workflows/sync_snyk-github-issues.yml | 2 +- .github/workflows/sync_snyk-monitor.yml | 2 +- .github/workflows/sync_version-packages.yml | 2 +- .github/workflows/verify_accessibility-noop.yml | 2 +- .github/workflows/verify_accessibility.yml | 2 +- .github/workflows/verify_chromatic-noop.yml | 2 +- .github/workflows/verify_chromatic.yml | 2 +- .github/workflows/verify_codeql.yml | 2 +- .github/workflows/verify_docs-quality.yml | 2 +- .github/workflows/verify_e2e-linux-noop.yml | 2 +- .github/workflows/verify_e2e-linux.yml | 2 +- .github/workflows/verify_e2e-techdocs.yml | 2 +- .github/workflows/verify_e2e-windows-noop.yml | 2 +- .github/workflows/verify_e2e-windows.yml | 2 +- .github/workflows/verify_fossa.yml | 2 +- .github/workflows/verify_microsite-noop.yml | 2 +- .github/workflows/verify_microsite.yml | 6 +++--- .github/workflows/verify_microsite_accessibility-noop.yml | 2 +- .github/workflows/verify_microsite_accessibility.yml | 2 +- .github/workflows/verify_windows.yml | 2 +- 45 files changed, 50 insertions(+), 50 deletions(-) diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 61da4699cb..411ff39a9b 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -23,7 +23,7 @@ jobs: comment-cache-key: ${{ steps.hash.outputs.COMMENT_FILE_HASH }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index d0230900cd..b78cf7a3f0 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -14,7 +14,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/automate_area-labels.yml b/.github/workflows/automate_area-labels.yml index b1663d1629..a4ef0d2c29 100644 --- a/.github/workflows/automate_area-labels.yml +++ b/.github/workflows/automate_area-labels.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/automate_changeset_feedback.yml b/.github/workflows/automate_changeset_feedback.yml index 703db824f1..c61608e656 100644 --- a/.github/workflows/automate_changeset_feedback.yml +++ b/.github/workflows/automate_changeset_feedback.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml index b218b98259..6d47355ad7 100644 --- a/.github/workflows/automate_merge_message.yml +++ b/.github/workflows/automate_merge_message.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/automate_stale.yml b/.github/workflows/automate_stale.yml index cbdab4414a..cdaa01fea1 100644 --- a/.github/workflows/automate_stale.yml +++ b/.github/workflows/automate_stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index d046686002..8c07880e49 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -40,7 +40,7 @@ jobs: name: Test ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ee89b62e2..7ba84c895b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: name: Install ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit @@ -64,7 +64,7 @@ jobs: name: Verify ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanup_patch-files.yml b/.github/workflows/cleanup_patch-files.yml index 895049cde9..c464b850ed 100644 --- a/.github/workflows/cleanup_patch-files.yml +++ b/.github/workflows/cleanup_patch-files.yml @@ -17,7 +17,7 @@ jobs: contents: write steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index bb759971b7..b695c88c90 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -10,7 +10,7 @@ jobs: timeout-minutes: 10 steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 0fac3ec0da..2fbad3fa6d 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index da02ae7ee2..a7cff30530 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit @@ -135,7 +135,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit @@ -240,7 +240,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index d70761066f..983bd1d1c5 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -151,7 +151,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index 607a951e4b..ac8202ad74 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -16,7 +16,7 @@ jobs: if: github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/mui-migration-tracker.yml b/.github/workflows/mui-migration-tracker.yml index 8c91e0e8a0..1f7a190404 100644 --- a/.github/workflows/mui-migration-tracker.yml +++ b/.github/workflows/mui-migration-tracker.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/pr-review-comment-trigger.yaml b/.github/workflows/pr-review-comment-trigger.yaml index 968bc4ab12..95c9c921f5 100644 --- a/.github/workflows/pr-review-comment-trigger.yaml +++ b/.github/workflows/pr-review-comment-trigger.yaml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/pr-review-comment.yaml b/.github/workflows/pr-review-comment.yaml index 122eb4fcce..3c2c34ee38 100644 --- a/.github/workflows/pr-review-comment.yaml +++ b/.github/workflows/pr-review-comment.yaml @@ -17,7 +17,7 @@ jobs: steps: # Inspired by https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 4067326890..36988f7d07 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -18,7 +18,7 @@ jobs: if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request ) steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 6ff05611ee..7b2130f471 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_canon.yml b/.github/workflows/sync_canon.yml index 712b58c19f..d66dfd846a 100644 --- a/.github/workflows/sync_canon.yml +++ b/.github/workflows/sync_canon.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index f91d354662..d9cb714dfa 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_dependabot-changesets.yml b/.github/workflows/sync_dependabot-changesets.yml index 59eb674ab2..3c5b9327d6 100644 --- a/.github/workflows/sync_dependabot-changesets.yml +++ b/.github/workflows/sync_dependabot-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'dependabot[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_patch-release.yml b/.github/workflows/sync_patch-release.yml index 1db492777e..24bc3b7556 100644 --- a/.github/workflows/sync_patch-release.yml +++ b/.github/workflows/sync_patch-release.yml @@ -25,7 +25,7 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index e4713dabbe..bf721997d5 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_renovate-changesets.yml b/.github/workflows/sync_renovate-changesets.yml index f456fdf4e1..ce6b93a133 100644 --- a/.github/workflows/sync_renovate-changesets.yml +++ b/.github/workflows/sync_renovate-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'renovate[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 9335d4e1e1..c900a94bcb 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index ab937ecf8b..bcb2c5da3d 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 19e7b28989..2c30eb9346 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility-noop.yml b/.github/workflows/verify_accessibility-noop.yml index abb3abc665..ee696ebc7f 100644 --- a/.github/workflows/verify_accessibility-noop.yml +++ b/.github/workflows/verify_accessibility-noop.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 35f9a702f4..bb87cc9822 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_chromatic-noop.yml b/.github/workflows/verify_chromatic-noop.yml index 2a2ad7d43d..35015def52 100644 --- a/.github/workflows/verify_chromatic-noop.yml +++ b/.github/workflows/verify_chromatic-noop.yml @@ -20,7 +20,7 @@ jobs: name: Chromatic steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index f515bef08a..fbf1824406 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -24,7 +24,7 @@ jobs: name: Chromatic steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index a91dd7e2a7..d35b7575a2 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -42,7 +42,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 877614e908..f5cb67c114 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index cc25b2db58..272c6816fa 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -29,7 +29,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index f0b324c96c..12c4cfb431 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -43,7 +43,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index 3698bddcc3..0a8a89f16b 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -32,7 +32,7 @@ jobs: name: Techdocs steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index f8681e8b10..fb5bcdc8c2 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -25,7 +25,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index 356555bbd5..d332879667 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -33,7 +33,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_fossa.yml b/.github/workflows/verify_fossa.yml index ee6b1681a4..f7429d6f06 100644 --- a/.github/workflows/verify_fossa.yml +++ b/.github/workflows/verify_fossa.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite-noop.yml b/.github/workflows/verify_microsite-noop.yml index a6edeb8415..70686e3bd9 100644 --- a/.github/workflows/verify_microsite-noop.yml +++ b/.github/workflows/verify_microsite-noop.yml @@ -21,7 +21,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 44e7281938..676944d573 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit @@ -137,7 +137,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit @@ -234,7 +234,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility-noop.yml b/.github/workflows/verify_microsite_accessibility-noop.yml index f4263e1398..bb13a85dfa 100644 --- a/.github/workflows/verify_microsite_accessibility-noop.yml +++ b/.github/workflows/verify_microsite_accessibility-noop.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility.yml b/.github/workflows/verify_microsite_accessibility.yml index 7d4a0e8ef8..df84f24ff0 100644 --- a/.github/workflows/verify_microsite_accessibility.yml +++ b/.github/workflows/verify_microsite_accessibility.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index f15f2b30c7..869aa3c2ed 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit From 5b2fbb5cfc39e440511c4ced84bd9b34b613add8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 21:13:02 +0000 Subject: [PATCH 123/312] chore(deps): update dependency @playwright/test to v1.57.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5bd487ddf2..8551451a6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13958,13 +13958,13 @@ __metadata: linkType: hard "@playwright/test@npm:^1.32.3": - version: 1.56.1 - resolution: "@playwright/test@npm:1.56.1" + version: 1.57.0 + resolution: "@playwright/test@npm:1.57.0" dependencies: - playwright: "npm:1.56.1" + playwright: "npm:1.57.0" bin: playwright: cli.js - checksum: 10/9933fa9f8eb9e775e792421b99c984c310b92092e65de57508ae1951a2589d87bbb5f1c4114bfdf7f69c15c0a3acb3f31259e143fa597aa28e97f4b223e37637 + checksum: 10/07f5ba4841b2db1dea70d821004c5156b692488e13523c096ce3487d30f95f34ccf30ba6467ece60c86faac27ae382213b7eacab48a695550981b2e811e5e579 languageName: node linkType: hard @@ -41319,27 +41319,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.56.1": - version: 1.56.1 - resolution: "playwright-core@npm:1.56.1" +"playwright-core@npm:1.57.0": + version: 1.57.0 + resolution: "playwright-core@npm:1.57.0" bin: playwright-core: cli.js - checksum: 10/df785eb3b3a8392b10dcde5f768e09b7fe459a7b06ed81180da69e048f2154b761f86d79572c2b62037a1f18a44e4ace72f5b6547f4f473b4ab13ab1d94007d2 + checksum: 10/ec066602f0196f036006caee14a30d0a57533a76673bb9a0c609ef56e21decf018f0e8d402ba2fb18251393be6a1c9e193c83266f1670fe50838c5340e220de0 languageName: node linkType: hard -"playwright@npm:1.56.1": - version: 1.56.1 - resolution: "playwright@npm:1.56.1" +"playwright@npm:1.57.0": + version: 1.57.0 + resolution: "playwright@npm:1.57.0" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.56.1" + playwright-core: "npm:1.57.0" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10/f1743f93b26f1d497257771428d93f3c9ed2d75b00d935f0cd1556ff2dc61d47f2df8b381d752fbd2c47082b685f0ffe4cc4b7ba440d7b4ba3a08572aec58fba + checksum: 10/241559210f98ef11b6bd6413f2d29da7ef67c7865b72053192f0d164fab9e0d3bd47913b3351d5de6433a8aff2d8424d4b8bd668df420bf4dda7ae9fcd37b942 languageName: node linkType: hard From 8be23a41048ea6d318f4fbe400af4e52c70e1729 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 20:54:05 +0100 Subject: [PATCH 124/312] backend-test-utils: switch to text-extensions Signed-off-by: Patrik Oldsberg --- .changeset/honest-bears-itch.md | 5 +++++ packages/backend-test-utils/package.json | 2 +- .../src/filesystem/MockDirectory.ts | 2 +- yarn.lock | 11 +++++++++-- 4 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 .changeset/honest-bears-itch.md diff --git a/.changeset/honest-bears-itch.md b/.changeset/honest-bears-itch.md new file mode 100644 index 0000000000..4c0cd5f47e --- /dev/null +++ b/.changeset/honest-bears-itch.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Switched `textextensions` dependency for `text-extensions`. diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 70bc3e2e81..64d07ee281 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -76,7 +76,7 @@ "pg": "^8.11.3", "pg-connection-string": "^2.3.0", "testcontainers": "^10.0.0", - "textextensions": "^5.16.0", + "text-extensions": "^2.4.0", "uuid": "^11.0.0", "yn": "^4.0.0", "zod": "^3.22.4", diff --git a/packages/backend-test-utils/src/filesystem/MockDirectory.ts b/packages/backend-test-utils/src/filesystem/MockDirectory.ts index a1d616d8e0..f940a4cd7b 100644 --- a/packages/backend-test-utils/src/filesystem/MockDirectory.ts +++ b/packages/backend-test-utils/src/filesystem/MockDirectory.ts @@ -17,7 +17,7 @@ import os from 'os'; import { isChildPath } from '@backstage/backend-plugin-api'; import fs from 'fs-extra'; -import textextensions from 'textextensions'; +import textextensions from 'text-extensions'; import { dirname, extname, diff --git a/yarn.lock b/yarn.lock index 2d303fdb03..617c9eaf7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3098,7 +3098,7 @@ __metadata: pg-connection-string: "npm:^2.3.0" supertest: "npm:^7.0.0" testcontainers: "npm:^10.0.0" - textextensions: "npm:^5.16.0" + text-extensions: "npm:^2.4.0" uuid: "npm:^11.0.0" yn: "npm:^4.0.0" zod: "npm:^3.22.4" @@ -47192,6 +47192,13 @@ __metadata: languageName: node linkType: hard +"text-extensions@npm:^2.4.0": + version: 2.4.0 + resolution: "text-extensions@npm:2.4.0" + checksum: 10/9bdbc9959e004ccc86a6ec076d6c5bb6765978263e9d0d5febb640d7675c09919ea912f3fe9d50b68c3c7c43cc865610a7cb24954343abb31f74c205fbae4e45 + languageName: node + linkType: hard + "text-hex@npm:1.0.x": version: 1.0.0 resolution: "text-hex@npm:1.0.0" @@ -47206,7 +47213,7 @@ __metadata: languageName: node linkType: hard -"textextensions@npm:^5.12.0, textextensions@npm:^5.13.0, textextensions@npm:^5.16.0": +"textextensions@npm:^5.12.0, textextensions@npm:^5.13.0": version: 5.16.0 resolution: "textextensions@npm:5.16.0" checksum: 10/d41e9265e9d74d192d4fb26fc89a2f4dbe7a6d85cc5c14f99f1df68d07bce5346f8abe0ed680a91ef805b91e9972e5787c7365a03f3a5489e16ca350d28a3879 From 419e1a06ed97404171f7570df019d4d129ce70b2 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 20:58:34 +0100 Subject: [PATCH 125/312] mcp-actions-backend: fix type import Signed-off-by: Patrik Oldsberg --- plugins/mcp-actions-backend/src/plugin.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mcp-actions-backend/src/plugin.test.ts b/plugins/mcp-actions-backend/src/plugin.test.ts index ace988cfc1..47dd89c9fc 100644 --- a/plugins/mcp-actions-backend/src/plugin.test.ts +++ b/plugins/mcp-actions-backend/src/plugin.test.ts @@ -20,7 +20,7 @@ import { createBackendPlugin } from '@backstage/backend-plugin-api'; import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'; -import { ListToolsResultSchema } from '@modelcontextprotocol/sdk/types'; +import { ListToolsResultSchema } from '@modelcontextprotocol/sdk/types.js'; describe('Mcp Backend', () => { const mockPluginWithActions = createBackendPlugin({ From fafd9e10e1fccbe032066f210f68da8f3ae14b7b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 21:00:48 +0100 Subject: [PATCH 126/312] cli: fix yargs usage Signed-off-by: Patrik Oldsberg --- .changeset/salty-camels-wash.md | 5 +++++ packages/cli/src/modules/config/index.ts | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .changeset/salty-camels-wash.md diff --git a/.changeset/salty-camels-wash.md b/.changeset/salty-camels-wash.md new file mode 100644 index 0000000000..56600db540 --- /dev/null +++ b/.changeset/salty-camels-wash.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fixed internal usage of `yargs`. diff --git a/packages/cli/src/modules/config/index.ts b/packages/cli/src/modules/config/index.ts index d62dbd4d26..3eabf5e9fc 100644 --- a/packages/cli/src/modules/config/index.ts +++ b/packages/cli/src/modules/config/index.ts @@ -62,7 +62,7 @@ export default createCliPlugin({ path: ['config:print'], description: 'Print the app configuration for the current package', execute: async ({ args, info }) => { - const argv = await yargs + const argv = await yargs() .options({ package: { type: 'string' }, lax: { type: 'boolean' }, @@ -82,7 +82,7 @@ export default createCliPlugin({ description: 'Validate that the given configuration loads and matches schema', execute: async ({ args }) => { - const argv = await yargs + const argv = await yargs() .options({ package: { type: 'string' }, lax: { type: 'boolean' }, @@ -105,7 +105,7 @@ export default createCliPlugin({ path: ['config:schema'], description: 'Print the JSON schema for the given configuration', execute: async ({ args }) => { - const argv = await yargs + const argv = await yargs() .options({ package: { type: 'string' }, format: { type: 'string' }, @@ -122,7 +122,7 @@ export default createCliPlugin({ path: ['config', 'schema'], description: 'Print the JSON schema for the given configuration', execute: async ({ args }) => { - const argv = await yargs + const argv = await yargs() .options({ package: { type: 'string' }, format: { type: 'string' }, From f8dff944fd0a4013d0190a93b97a6829ce15992e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 21:09:03 +0100 Subject: [PATCH 127/312] cli: switch tsconfig to default to bundler resolution Signed-off-by: Patrik Oldsberg --- .changeset/chilly-waves-relate.md | 11 +++++++++++ packages/cli/config/tsconfig.json | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 .changeset/chilly-waves-relate.md diff --git a/.changeset/chilly-waves-relate.md b/.changeset/chilly-waves-relate.md new file mode 100644 index 0000000000..2e78f9245e --- /dev/null +++ b/.changeset/chilly-waves-relate.md @@ -0,0 +1,11 @@ +--- +'@backstage/cli': minor +--- + +Switched the default module resolution to `bundler` and the `module` setting to `ES2020`. + +You may need to bump some dependencies as part of this change and fix imports in code. The most common source of this is that type checking will now consider the `exports` field in `package.json` when resolving imports. This in turn can break older versions of packages that had incompatible `exports` fields. Generally these issues will have already been fixed in the upstream packages. + +You might be tempted to use `--skipLibCheck` to hide issues due to this change, but it will weaken the type safety of your project. If you run into a large number of issues and want to keep the old behavior, you can reset the `moduleResolution` and `module` settings your own `tsconfig.json` file to `node` and `ESNext` respectively. But keep in mind that the `node` option will be removed in future versions of TypeScript. + +A future version of Backstage will make these new settings mandatory, as we move to rely on the `exports` field for type resolution in packages, rather than the `typesVersions` field. diff --git a/packages/cli/config/tsconfig.json b/packages/cli/config/tsconfig.json index ac5e62b52e..d2fa597cca 100644 --- a/packages/cli/config/tsconfig.json +++ b/packages/cli/config/tsconfig.json @@ -13,8 +13,8 @@ "isolatedModules": true, "jsx": "react", "lib": ["DOM", "DOM.Iterable", "ScriptHost", "ES2022"], - "module": "ESNext", - "moduleResolution": "node", + "module": "ES2020", + "moduleResolution": "bundler", "noEmit": false, "noFallthroughCasesInSwitch": true, "noImplicitAny": true, From f85dafa7f2b73cbfc906590607d9ff02cfa3ef86 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Dec 2025 21:28:42 +0100 Subject: [PATCH 128/312] update API reports for moduleResolution: bundler Signed-off-by: Patrik Oldsberg --- packages/core-app-api/report.api.md | 9 +- packages/core-components/report-alpha.api.md | 2 +- packages/frontend-plugin-api/report.api.md | 115 +++++++++--------- packages/integration-react/report.api.md | 10 +- plugins/api-docs/report.api.md | 2 +- plugins/catalog-graph/report.api.md | 2 +- plugins/catalog-import/report-alpha.api.md | 6 +- plugins/catalog-import/report.api.md | 2 +- plugins/catalog-react/report-alpha.api.md | 2 +- plugins/catalog-react/report.api.md | 7 +- .../report.api.md | 2 +- plugins/catalog/report-alpha.api.md | 2 +- plugins/config-schema/report.api.md | 2 +- plugins/home/report.api.md | 2 +- .../kubernetes-cluster/report-alpha.api.md | 2 +- plugins/kubernetes-react/report-alpha.api.md | 2 +- plugins/kubernetes-react/report.api.md | 2 +- plugins/kubernetes/report-alpha.api.md | 2 +- plugins/notifications/report.api.md | 2 +- plugins/scaffolder-react/report-alpha.api.md | 2 +- plugins/scaffolder/report-alpha.api.md | 2 +- .../report.api.md | 2 +- plugins/search-react/report-alpha.api.md | 2 +- plugins/search-react/report.api.md | 2 +- plugins/search/report-alpha.api.md | 8 +- plugins/signals-react/report.api.md | 2 +- plugins/techdocs-react/report.api.md | 2 +- plugins/techdocs/report.api.md | 2 +- plugins/user-settings/report-alpha.api.md | 2 +- plugins/user-settings/report.api.md | 2 +- 30 files changed, 105 insertions(+), 98 deletions(-) diff --git a/packages/core-app-api/report.api.md b/packages/core-app-api/report.api.md index 0cecc22f4a..e039394946 100644 --- a/packages/core-app-api/report.api.md +++ b/packages/core-app-api/report.api.md @@ -20,6 +20,7 @@ import { AuthProviderInfo } from '@backstage/core-plugin-api'; import { AuthRequestOptions } from '@backstage/core-plugin-api'; import { BackstageIdentityApi } from '@backstage/core-plugin-api'; import { BackstageIdentityResponse } from '@backstage/core-plugin-api'; +import { BackstageIdentityResponse as BackstageIdentityResponse_2 } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { bitbucketAuthApiRef } from '@backstage/core-plugin-api'; import { bitbucketServerAuthApiRef } from '@backstage/core-plugin-api'; @@ -55,6 +56,7 @@ import { OpenIdConnectApi } from '@backstage/core-plugin-api'; import { openshiftAuthApiRef } from '@backstage/core-plugin-api'; import { PendingOAuthRequest } from '@backstage/core-plugin-api'; import { ProfileInfo } from '@backstage/core-plugin-api'; +import { ProfileInfo as ProfileInfo_2 } from '@backstage/frontend-plugin-api'; import { ProfileInfoApi } from '@backstage/core-plugin-api'; import { PropsWithChildren } from 'react'; import PropTypes from 'prop-types'; @@ -62,6 +64,7 @@ import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { SessionApi } from '@backstage/core-plugin-api'; import { SessionState } from '@backstage/core-plugin-api'; +import { SessionState as SessionState_2 } from '@backstage/frontend-plugin-api'; import { StorageApi } from '@backstage/core-plugin-api'; import { StorageValueSnapshot } from '@backstage/core-plugin-api'; import { SubRouteRef } from '@backstage/core-plugin-api'; @@ -511,13 +514,13 @@ export class MicrosoftAuth { // (undocumented) getBackstageIdentity( options?: AuthRequestOptions, - ): Promise; + ): Promise; // (undocumented) getIdToken(options?: AuthRequestOptions): Promise; // (undocumented) - getProfile(options?: AuthRequestOptions): Promise; + getProfile(options?: AuthRequestOptions): Promise; // (undocumented) - sessionState$(): Observable; + sessionState$(): Observable; // (undocumented) signIn(): Promise; // (undocumented) diff --git a/packages/core-components/report-alpha.api.md b/packages/core-components/report-alpha.api.md index 7608699487..785b97ce28 100644 --- a/packages/core-components/report-alpha.api.md +++ b/packages/core-components/report-alpha.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) export const coreComponentsTranslationRef: TranslationRef< diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index d95634988c..025efabb85 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -4,12 +4,14 @@ ```ts import { AnyRouteRefParams as AnyRouteRefParams_2 } from '@backstage/frontend-plugin-api'; +import { ApiRef as ApiRef_2 } from '@backstage/frontend-plugin-api'; import { ComponentType } from 'react'; import { Config } from '@backstage/config'; import { ConfigurableExtensionDataRef as ConfigurableExtensionDataRef_2 } from '@backstage/frontend-plugin-api'; import { Expand } from '@backstage/types'; import { ExpandRecursive } from '@backstage/types'; import { ExtensionBlueprint as ExtensionBlueprint_2 } from '@backstage/frontend-plugin-api'; +import { ExtensionBlueprintParams as ExtensionBlueprintParams_2 } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef as ExtensionDataRef_2 } from '@backstage/frontend-plugin-api'; import { IconComponent as IconComponent_2 } from '@backstage/frontend-plugin-api'; import { JsonObject } from '@backstage/types'; @@ -20,6 +22,7 @@ import { Observable } from '@backstage/types'; import { PropsWithChildren } from 'react'; import { ReactNode } from 'react'; import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; +import { SwappableComponentRef as SwappableComponentRef_2 } from '@backstage/frontend-plugin-api'; import { z } from 'zod'; // @public @@ -80,12 +83,12 @@ export type AnalyticsImplementation = { }; // @public -export const AnalyticsImplementationBlueprint: ExtensionBlueprint<{ +export const AnalyticsImplementationBlueprint: ExtensionBlueprint_2<{ kind: 'analytics'; params: ( params: AnalyticsImplementationFactory, - ) => ExtensionBlueprintParams>; - output: ExtensionDataRef< + ) => ExtensionBlueprintParams_2>; + output: ExtensionDataRef_2< AnalyticsImplementationFactory<{}>, 'core.analytics.factory', {} @@ -94,7 +97,7 @@ export const AnalyticsImplementationBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - factory: ConfigurableExtensionDataRef< + factory: ConfigurableExtensionDataRef_2< AnalyticsImplementationFactory<{}>, 'core.analytics.factory', {} @@ -147,7 +150,7 @@ export type AnyRouteRefParams = | undefined; // @public -export const ApiBlueprint: ExtensionBlueprint<{ +export const ApiBlueprint: ExtensionBlueprint_2<{ kind: 'api'; params: < TApi, @@ -155,13 +158,13 @@ export const ApiBlueprint: ExtensionBlueprint<{ TDeps extends { [name in string]: unknown }, >( params: ApiFactory, - ) => ExtensionBlueprintParams; - output: ExtensionDataRef; + ) => ExtensionBlueprintParams_2; + output: ExtensionDataRef_2; inputs: {}; config: {}; configInput: {}; dataRefs: { - factory: ConfigurableExtensionDataRef< + factory: ConfigurableExtensionDataRef_2< AnyApiFactory, 'core.api.factory', {} @@ -256,12 +259,12 @@ export interface AppNodeSpec { } // @public -export const AppRootElementBlueprint: ExtensionBlueprint<{ +export const AppRootElementBlueprint: ExtensionBlueprint_2<{ kind: 'app-root-element'; params: { element: JSX.Element; }; - output: ExtensionDataRef; + output: ExtensionDataRef_2; inputs: {}; config: {}; configInput: {}; @@ -269,13 +272,13 @@ export const AppRootElementBlueprint: ExtensionBlueprint<{ }>; // @public -export const AppRootWrapperBlueprint: ExtensionBlueprint<{ +export const AppRootWrapperBlueprint: ExtensionBlueprint_2<{ kind: 'app-root-wrapper'; params: { Component?: [error: 'Use the `component` parameter instead']; component: (props: { children: ReactNode }) => JSX.Element | null; }; - output: ExtensionDataRef< + output: ExtensionDataRef_2< (props: { children: ReactNode }) => JSX.Element | null, 'app.root.wrapper', {} @@ -284,7 +287,7 @@ export const AppRootWrapperBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - component: ConfigurableExtensionDataRef< + component: ConfigurableExtensionDataRef_2< (props: { children: ReactNode }) => JSX.Element | null, 'app.root.wrapper', {} @@ -330,7 +333,7 @@ export interface AppTreeApi { } // @public -export const appTreeApiRef: ApiRef; +export const appTreeApiRef: ApiRef_2; // @public export const atlassianAuthApiRef: ApiRef< @@ -410,14 +413,14 @@ export interface ConfigurableExtensionDataRef< // @public (undocumented) export const coreExtensionData: { - title: ConfigurableExtensionDataRef; - reactElement: ConfigurableExtensionDataRef< + title: ConfigurableExtensionDataRef_2; + reactElement: ConfigurableExtensionDataRef_2< JSX_3.Element, 'core.reactElement', {} >; - routePath: ConfigurableExtensionDataRef; - routeRef: ConfigurableExtensionDataRef< + routePath: ConfigurableExtensionDataRef_2; + routeRef: ConfigurableExtensionDataRef_2< RouteRef, 'core.routing.ref', {} @@ -891,7 +894,7 @@ export interface DialogApiDialog { } // @public -export const dialogApiRef: ApiRef; +export const dialogApiRef: ApiRef_2; // @public export type DiscoveryApi = { @@ -928,7 +931,7 @@ export const errorApiRef: ApiRef; // @public (undocumented) export const ErrorDisplay: { (props: ErrorDisplayProps): JSX.Element | null; - ref: SwappableComponentRef; + ref: SwappableComponentRef_2; }; // @public (undocumented) @@ -975,7 +978,7 @@ export interface ExtensionBlueprint< // (undocumented) make< TName extends string | undefined, - TParamsInput extends AnyParamsInput>, + TParamsInput extends AnyParamsInput_2>, UParentInputs extends ExtensionDataRef, >(args: { name?: TName; @@ -1030,7 +1033,7 @@ export interface ExtensionBlueprint< }; factory( originalFactory: < - TParamsInput extends AnyParamsInput>, + TParamsInput extends AnyParamsInput_2>, >( params: TParamsInput extends ExtensionBlueprintDefineParams ? TParamsInput @@ -1449,12 +1452,12 @@ export const googleAuthApiRef: ApiRef< >; // @public (undocumented) -export const IconBundleBlueprint: ExtensionBlueprint<{ +export const IconBundleBlueprint: ExtensionBlueprint_2<{ kind: 'icon-bundle'; params: { icons: { [key in string]: IconComponent }; }; - output: ExtensionDataRef< + output: ExtensionDataRef_2< { [x: string]: IconComponent; }, @@ -1465,7 +1468,7 @@ export const IconBundleBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - icons: ConfigurableExtensionDataRef< + icons: ConfigurableExtensionDataRef_2< { [x: string]: IconComponent; }, @@ -1489,7 +1492,7 @@ export interface IconsApi { } // @public -export const iconsApiRef: ApiRef; +export const iconsApiRef: ApiRef_2; // @public export type IdentityApi = { @@ -1553,14 +1556,14 @@ export interface NavContentComponentProps { } // @public -export const NavItemBlueprint: ExtensionBlueprint<{ +export const NavItemBlueprint: ExtensionBlueprint_2<{ kind: 'nav-item'; params: { title: string; icon: IconComponent; routeRef: RouteRef; }; - output: ExtensionDataRef< + output: ExtensionDataRef_2< { title: string; icon: IconComponent; @@ -1573,7 +1576,7 @@ export const NavItemBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - target: ConfigurableExtensionDataRef< + target: ConfigurableExtensionDataRef_2< { title: string; icon: IconComponent; @@ -1588,7 +1591,7 @@ export const NavItemBlueprint: ExtensionBlueprint<{ // @public (undocumented) export const NotFoundErrorPage: { (props: NotFoundErrorPageProps): JSX.Element | null; - ref: SwappableComponentRef; + ref: SwappableComponentRef_2; }; // @public (undocumented) @@ -1676,7 +1679,7 @@ export interface OverridableExtensionDefinition< TExtraInputs extends { [inputName in string]: ExtensionInput; }, - TParamsInput extends AnyParamsInput_2>, + TParamsInput extends AnyParamsInput>, UParentInputs extends ExtensionDataRef, >( args: Expand< @@ -1702,7 +1705,7 @@ export interface OverridableExtensionDefinition< }; factory?( originalFactory: < - TFactoryParamsReturn extends AnyParamsInput_2< + TFactoryParamsReturn extends AnyParamsInput< NonNullable >, >( @@ -1799,7 +1802,7 @@ export interface OverridableFrontendPlugin< } // @public -export const PageBlueprint: ExtensionBlueprint<{ +export const PageBlueprint: ExtensionBlueprint_2<{ kind: 'page'; params: { defaultPath?: [Error: `Use the 'path' param instead`]; @@ -1808,10 +1811,10 @@ export const PageBlueprint: ExtensionBlueprint<{ routeRef?: RouteRef; }; output: - | ExtensionDataRef - | ExtensionDataRef - | ExtensionDataRef< - RouteRef, + | ExtensionDataRef_2 + | ExtensionDataRef_2 + | ExtensionDataRef_2< + RouteRef, 'core.routing.ref', { optional: true; @@ -1880,7 +1883,7 @@ export type ProfileInfoApi = { // @public (undocumented) export const Progress: { (props: ProgressProps): JSX.Element | null; - ref: SwappableComponentRef; + ref: SwappableComponentRef_2; }; // @public (undocumented) @@ -1915,13 +1918,13 @@ export type RouteFunc = ( ) => string; // @public (undocumented) -export const RouterBlueprint: ExtensionBlueprint<{ +export const RouterBlueprint: ExtensionBlueprint_2<{ kind: 'app-router-component'; params: { Component?: [error: 'Use the `component` parameter instead']; component: (props: { children: ReactNode }) => JSX.Element | null; }; - output: ExtensionDataRef< + output: ExtensionDataRef_2< (props: { children: ReactNode }) => JSX.Element | null, 'app.router.wrapper', {} @@ -1930,7 +1933,7 @@ export const RouterBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - component: ConfigurableExtensionDataRef< + component: ConfigurableExtensionDataRef_2< (props: { children: ReactNode }) => JSX.Element | null, 'app.router.wrapper', {} @@ -1963,7 +1966,7 @@ export interface RouteResolutionApi { } // @public -export const routeResolutionApiRef: ApiRef; +export const routeResolutionApiRef: ApiRef_2; // @public export type SessionApi = { @@ -1990,12 +1993,12 @@ export namespace SessionState { } // @public -export const SignInPageBlueprint: ExtensionBlueprint<{ +export const SignInPageBlueprint: ExtensionBlueprint_2<{ kind: 'sign-in-page'; params: { loader: () => Promise>; }; - output: ExtensionDataRef< + output: ExtensionDataRef_2< ComponentType, 'core.sign-in-page.component', {} @@ -2004,7 +2007,7 @@ export const SignInPageBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - component: ConfigurableExtensionDataRef< + component: ConfigurableExtensionDataRef_2< ComponentType, 'core.sign-in-page.component', {} @@ -2058,7 +2061,7 @@ export interface SubRouteRef< } // @public -export const SwappableComponentBlueprint: ExtensionBlueprint<{ +export const SwappableComponentBlueprint: ExtensionBlueprint_2<{ kind: 'component'; params: >(params: { component: Ref extends SwappableComponentRef< @@ -2074,7 +2077,7 @@ export const SwappableComponentBlueprint: ExtensionBlueprint<{ | (() => (props: IInnerComponentProps) => JSX.Element | null) | (() => Promise<(props: IInnerComponentProps) => JSX.Element | null>) : never; - }) => ExtensionBlueprintParams<{ + }) => ExtensionBlueprintParams_2<{ component: Ref extends SwappableComponentRef< any, infer IExternalComponentProps @@ -2089,7 +2092,7 @@ export const SwappableComponentBlueprint: ExtensionBlueprint<{ | (() => Promise<(props: IInnerComponentProps) => JSX.Element | null>) : never; }>; - output: ExtensionDataRef< + output: ExtensionDataRef_2< { ref: SwappableComponentRef; loader: @@ -2103,7 +2106,7 @@ export const SwappableComponentBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - component: ConfigurableExtensionDataRef< + component: ConfigurableExtensionDataRef_2< { ref: SwappableComponentRef; loader: @@ -2139,20 +2142,20 @@ export interface SwappableComponentsApi { } // @public -export const swappableComponentsApiRef: ApiRef; +export const swappableComponentsApiRef: ApiRef_2; // @public -export const ThemeBlueprint: ExtensionBlueprint<{ +export const ThemeBlueprint: ExtensionBlueprint_2<{ kind: 'theme'; params: { theme: AppTheme; }; - output: ExtensionDataRef; + output: ExtensionDataRef_2; inputs: {}; config: {}; configInput: {}; dataRefs: { - theme: ConfigurableExtensionDataRef; + theme: ConfigurableExtensionDataRef_2; }; }>; @@ -2178,12 +2181,12 @@ export type TranslationApi = { export const translationApiRef: ApiRef; // @public -export const TranslationBlueprint: ExtensionBlueprint<{ +export const TranslationBlueprint: ExtensionBlueprint_2<{ kind: 'translation'; params: { resource: TranslationResource | TranslationMessages; }; - output: ExtensionDataRef< + output: ExtensionDataRef_2< | TranslationResource | TranslationMessages< string, @@ -2199,7 +2202,7 @@ export const TranslationBlueprint: ExtensionBlueprint<{ config: {}; configInput: {}; dataRefs: { - translation: ConfigurableExtensionDataRef< + translation: ConfigurableExtensionDataRef_2< | TranslationResource | TranslationMessages< string, diff --git a/packages/integration-react/report.api.md b/packages/integration-react/report.api.md index 78da2eb5fa..0974c4821a 100644 --- a/packages/integration-react/report.api.md +++ b/packages/integration-react/report.api.md @@ -3,17 +3,17 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiFactory } from '@backstage/core-plugin-api'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; import { ApiRef } from '@backstage/core-plugin-api'; import { AuthRequestOptions } from '@backstage/core-plugin-api'; -import { BackstageIdentityApi } from '@backstage/core-plugin-api'; +import { BackstageIdentityApi } from '@backstage/frontend-plugin-api'; import { Config } from '@backstage/config'; import { JSX as JSX_2 } from 'react/jsx-runtime'; import { OAuthApi } from '@backstage/core-plugin-api'; -import { OpenIdConnectApi } from '@backstage/core-plugin-api'; -import { ProfileInfoApi } from '@backstage/core-plugin-api'; +import { OpenIdConnectApi } from '@backstage/frontend-plugin-api'; +import { ProfileInfoApi } from '@backstage/frontend-plugin-api'; import { ScmIntegrationRegistry } from '@backstage/integration'; -import { SessionApi } from '@backstage/core-plugin-api'; +import { SessionApi } from '@backstage/frontend-plugin-api'; // @public export class ScmAuth implements ScmAuthApi { diff --git a/plugins/api-docs/report.api.md b/plugins/api-docs/report.api.md index fb37b2b33b..5c84544319 100644 --- a/plugins/api-docs/report.api.md +++ b/plugins/api-docs/report.api.md @@ -4,7 +4,7 @@ ```ts import { ApiEntity } from '@backstage/catalog-model'; -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CatalogTableRow } from '@backstage/plugin-catalog'; import { ComponentEntity } from '@backstage/catalog-model'; diff --git a/plugins/catalog-graph/report.api.md b/plugins/catalog-graph/report.api.md index d9342dbf36..8d3b8f2cc8 100644 --- a/plugins/catalog-graph/report.api.md +++ b/plugins/catalog-graph/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { DependencyGraphTypes } from '@backstage/core-components'; diff --git a/plugins/catalog-import/report-alpha.api.md b/plugins/catalog-import/report-alpha.api.md index a718145b24..935c3711ab 100644 --- a/plugins/catalog-import/report-alpha.api.md +++ b/plugins/catalog-import/report-alpha.api.md @@ -3,9 +3,9 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { AnyApiFactory } from '@backstage/core-plugin-api'; +import { AnyApiFactory } from '@backstage/frontend-plugin-api'; import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; -import { ApiFactory } from '@backstage/core-plugin-api'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; import { JSX as JSX_2 } from 'react'; @@ -13,7 +13,7 @@ import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; import { RouteRef } from '@backstage/core-plugin-api'; import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) export const catalogImportTranslationRef: TranslationRef< diff --git a/plugins/catalog-import/report.api.md b/plugins/catalog-import/report.api.md index ed7d2f3347..238231e498 100644 --- a/plugins/catalog-import/report.api.md +++ b/plugins/catalog-import/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CatalogApi } from '@backstage/catalog-client'; import { catalogImportTranslationRef } from '@backstage/plugin-catalog-import/alpha'; diff --git a/plugins/catalog-react/report-alpha.api.md b/plugins/catalog-react/report-alpha.api.md index 166aa7aaaa..3f2ed575b4 100644 --- a/plugins/catalog-react/report-alpha.api.md +++ b/plugins/catalog-react/report-alpha.api.md @@ -16,7 +16,7 @@ import { JSX as JSX_2 } from 'react'; import { ReactNode } from 'react'; import { ResourcePermission } from '@backstage/plugin-permission-common'; import { RouteRef } from '@backstage/frontend-plugin-api'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha export const CatalogFilterBlueprint: ExtensionBlueprint<{ diff --git a/plugins/catalog-react/report.api.md b/plugins/catalog-react/report.api.md index d013199a00..8916fc98f9 100644 --- a/plugins/catalog-react/report.api.md +++ b/plugins/catalog-react/report.api.md @@ -3,7 +3,8 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; +import { ApiRef as ApiRef_2 } from '@backstage/core-plugin-api'; import { AutocompleteProps } from '@material-ui/lab/Autocomplete'; import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client'; import { CatalogApi } from '@backstage/catalog-client'; @@ -475,7 +476,7 @@ export interface EntityPresentationApi { } // @public -export const entityPresentationApiRef: ApiRef; +export const entityPresentationApiRef: ApiRef_2; // @public (undocumented) export const EntityProcessingStatusPicker: () => JSX_2.Element; @@ -774,7 +775,7 @@ export interface StarredEntitiesApi { } // @public -export const starredEntitiesApiRef: ApiRef; +export const starredEntitiesApiRef: ApiRef_2; // @public (undocumented) export const UnregisterEntityDialog: ( diff --git a/plugins/catalog-unprocessed-entities/report.api.md b/plugins/catalog-unprocessed-entities/report.api.md index 28b55b9a6d..deeafb8a7c 100644 --- a/plugins/catalog-unprocessed-entities/report.api.md +++ b/plugins/catalog-unprocessed-entities/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CatalogUnprocessedEntitiesApi as CatalogUnprocessedEntitiesApi_2 } from '@backstage/plugin-catalog-unprocessed-entities-common'; import { CatalogUnprocessedEntitiesApiResponse as CatalogUnprocessedEntitiesApiResponse_2 } from '@backstage/plugin-catalog-unprocessed-entities-common'; diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index e40444bd07..dff2128ef6 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -27,7 +27,7 @@ import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; import { SearchResultItemExtensionComponent } from '@backstage/plugin-search-react/alpha'; import { SearchResultItemExtensionPredicate } from '@backstage/plugin-search-react/alpha'; import { SearchResultListItemBlueprintParams } from '@backstage/plugin-search-react/alpha'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) export const catalogTranslationRef: TranslationRef< diff --git a/plugins/config-schema/report.api.md b/plugins/config-schema/report.api.md index c78e56aa0e..66c856f4d8 100644 --- a/plugins/config-schema/report.api.md +++ b/plugins/config-schema/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { JSX as JSX_2 } from 'react/jsx-runtime'; import { Observable } from '@backstage/types'; diff --git a/plugins/home/report.api.md b/plugins/home/report.api.md index 7036e9d6d2..7b15ecd8a7 100644 --- a/plugins/home/report.api.md +++ b/plugins/home/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CardConfig as CardConfig_2 } from '@backstage/plugin-home-react'; import { CardExtensionProps as CardExtensionProps_2 } from '@backstage/plugin-home-react'; diff --git a/plugins/kubernetes-cluster/report-alpha.api.md b/plugins/kubernetes-cluster/report-alpha.api.md index 13314d6c83..2ce9c33c47 100644 --- a/plugins/kubernetes-cluster/report-alpha.api.md +++ b/plugins/kubernetes-cluster/report-alpha.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) export const kubernetesClusterTranslationRef: TranslationRef< diff --git a/plugins/kubernetes-react/report-alpha.api.md b/plugins/kubernetes-react/report-alpha.api.md index 453a7a9b1b..1c8746eb8f 100644 --- a/plugins/kubernetes-react/report-alpha.api.md +++ b/plugins/kubernetes-react/report-alpha.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) export const kubernetesReactTranslationRef: TranslationRef< diff --git a/plugins/kubernetes-react/report.api.md b/plugins/kubernetes-react/report.api.md index 4bf48ecd92..497c8673c2 100644 --- a/plugins/kubernetes-react/report.api.md +++ b/plugins/kubernetes-react/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { AsyncState } from 'react-use/esm/useAsyncFn'; import { ClientContainerStatus } from '@backstage/plugin-kubernetes-common'; import { ClientPodStatus } from '@backstage/plugin-kubernetes-common'; diff --git a/plugins/kubernetes/report-alpha.api.md b/plugins/kubernetes/report-alpha.api.md index 16604bc769..9b847b862a 100644 --- a/plugins/kubernetes/report-alpha.api.md +++ b/plugins/kubernetes/report-alpha.api.md @@ -16,7 +16,7 @@ import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; import { RouteRef } from '@backstage/core-plugin-api'; import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @public (undocumented) const _default: OverridableFrontendPlugin< diff --git a/plugins/notifications/report.api.md b/plugins/notifications/report.api.md index a9aeb64cda..f42814f983 100644 --- a/plugins/notifications/report.api.md +++ b/plugins/notifications/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { FetchApi } from '@backstage/core-plugin-api'; diff --git a/plugins/scaffolder-react/report-alpha.api.md b/plugins/scaffolder-react/report-alpha.api.md index 7497902e5b..2839851521 100644 --- a/plugins/scaffolder-react/report-alpha.api.md +++ b/plugins/scaffolder-react/report-alpha.api.md @@ -42,7 +42,7 @@ import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react'; import { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react'; import { TemplatePresentationV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; import { UiSchema } from '@rjsf/utils'; import { WidgetProps } from '@rjsf/utils'; import { z } from 'zod'; diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index df46f9feb6..7c0247cae9 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -35,7 +35,7 @@ import { ScaffolderFormFieldsApi } from '@backstage/plugin-scaffolder-react/alph import { SubRouteRef } from '@backstage/core-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) const _default: OverridableFrontendPlugin< diff --git a/plugins/search-backend-module-elasticsearch/report.api.md b/plugins/search-backend-module-elasticsearch/report.api.md index c2fb23efd6..a4b4c7e356 100644 --- a/plugins/search-backend-module-elasticsearch/report.api.md +++ b/plugins/search-backend-module-elasticsearch/report.api.md @@ -18,7 +18,7 @@ import { LoggerService } from '@backstage/backend-plugin-api'; import { Readable } from 'stream'; import { SearchEngine } from '@backstage/plugin-search-backend-node'; import { SearchQuery } from '@backstage/plugin-search-common'; -import { TransportRequestPromise } from '@opensearch-project/opensearch/lib/Transport'; +import { TransportRequestPromise } from '@opensearch-project/opensearch/lib/Transport.js'; import { TransportRequestPromise as TransportRequestPromise_2 } from '@elastic/elasticsearch/lib/Transport'; // @public diff --git a/plugins/search-react/report-alpha.api.md b/plugins/search-react/report-alpha.api.md index 3ddcde9076..2f7b32ab16 100644 --- a/plugins/search-react/report-alpha.api.md +++ b/plugins/search-react/report-alpha.api.md @@ -10,7 +10,7 @@ import { JSX as JSX_2 } from 'react'; import { ListItemProps } from '@material-ui/core/ListItem'; import { SearchDocument } from '@backstage/plugin-search-common'; import { SearchResult } from '@backstage/plugin-search-common'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) export type BaseSearchResultListItemProps = T & { diff --git a/plugins/search-react/report.api.md b/plugins/search-react/report.api.md index 96b45776bc..d4b7592682 100644 --- a/plugins/search-react/report.api.md +++ b/plugins/search-react/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { AsyncState } from 'react-use/esm/useAsync'; import { AutocompleteProps } from '@material-ui/lab/Autocomplete'; import { Dispatch } from 'react'; diff --git a/plugins/search/report-alpha.api.md b/plugins/search/report-alpha.api.md index 742bf1bf3b..4f6fa8be78 100644 --- a/plugins/search/report-alpha.api.md +++ b/plugins/search/report-alpha.api.md @@ -3,14 +3,14 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { AnyApiFactory } from '@backstage/core-plugin-api'; +import { AnyApiFactory } from '@backstage/frontend-plugin-api'; import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; -import { ApiFactory } from '@backstage/core-plugin-api'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; import { ExtensionInput } from '@backstage/frontend-plugin-api'; -import { IconComponent } from '@backstage/core-plugin-api'; +import { IconComponent } from '@backstage/frontend-plugin-api'; import { JSX as JSX_2 } from 'react'; import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; @@ -19,7 +19,7 @@ import { RouteRef as RouteRef_2 } from '@backstage/core-plugin-api'; import { SearchFilterExtensionComponent } from '@backstage/plugin-search-react/alpha'; import { SearchResultItemExtensionComponent } from '@backstage/plugin-search-react/alpha'; import { SearchResultItemExtensionPredicate } from '@backstage/plugin-search-react/alpha'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) const _default: OverridableFrontendPlugin< diff --git a/plugins/signals-react/report.api.md b/plugins/signals-react/report.api.md index 87d856288b..23a81af4fc 100644 --- a/plugins/signals-react/report.api.md +++ b/plugins/signals-react/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { JsonObject } from '@backstage/types'; // @public (undocumented) diff --git a/plugins/techdocs-react/report.api.md b/plugins/techdocs-react/report.api.md index 62ac6375fa..eb6d0dccb3 100644 --- a/plugins/techdocs-react/report.api.md +++ b/plugins/techdocs-react/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { AsyncState } from 'react-use/esm/useAsync'; import { ComponentType } from 'react'; import { CompoundEntityRef } from '@backstage/catalog-model'; diff --git a/plugins/techdocs/report.api.md b/plugins/techdocs/report.api.md index 2369466674..e7e9e4b916 100644 --- a/plugins/techdocs/report.api.md +++ b/plugins/techdocs/report.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ApiRef } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; diff --git a/plugins/user-settings/report-alpha.api.md b/plugins/user-settings/report-alpha.api.md index 5d28bb85aa..73ef5cfa3d 100644 --- a/plugins/user-settings/report-alpha.api.md +++ b/plugins/user-settings/report-alpha.api.md @@ -13,7 +13,7 @@ import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; import { RouteRef } from '@backstage/frontend-plugin-api'; import { RouteRef as RouteRef_2 } from '@backstage/core-plugin-api'; -import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) const _default: OverridableFrontendPlugin< diff --git a/plugins/user-settings/report.api.md b/plugins/user-settings/report.api.md index c99765bc67..77670bb357 100644 --- a/plugins/user-settings/report.api.md +++ b/plugins/user-settings/report.api.md @@ -5,7 +5,7 @@ ```ts import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; -import { BackstageUserIdentity } from '@backstage/core-plugin-api'; +import { BackstageUserIdentity } from '@backstage/frontend-plugin-api'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { ElementType } from 'react'; import { ErrorApi } from '@backstage/core-plugin-api'; From 97c7b2f72da28d258161b66ee2158258106035be Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 22:06:33 +0000 Subject: [PATCH 129/312] chore(deps): update dependency @slack/web-api to v7.13.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 4be422bb64..97121a3537 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17355,8 +17355,8 @@ __metadata: linkType: hard "@slack/web-api@npm:^7.5.0": - version: 7.12.0 - resolution: "@slack/web-api@npm:7.12.0" + version: 7.13.0 + resolution: "@slack/web-api@npm:7.13.0" dependencies: "@slack/logger": "npm:^4.0.0" "@slack/types": "npm:^2.18.0" @@ -17370,7 +17370,7 @@ __metadata: p-queue: "npm:^6" p-retry: "npm:^4" retry: "npm:^0.13.1" - checksum: 10/c8936187e1e99a758a13cb33d9aea0b4ecf9d5c78f6d8b7dd1e1cc3e0fb30f50ed718e5270ca6d3c9ccba259f3b1a058c95fc43d35366cdc6ac8cce07742344d + checksum: 10/9e254c372f1b4c3255acd317805f9dfabd38e90d0d8e96f2f79a35957d40d88eed5ba09ec59ae0838dbec32f99bd65ff2773c3528e44cd7aea273dd5e1fd3b82 languageName: node linkType: hard From e1d922ddc0767b9443cbf5b8ad1e45efa49f9349 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 22:07:12 +0000 Subject: [PATCH 130/312] chore(deps): update dependency better-sqlite3 to v12.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 4be422bb64..92ef77e0e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24967,13 +24967,13 @@ __metadata: linkType: hard "better-sqlite3@npm:^12.0.0": - version: 12.4.6 - resolution: "better-sqlite3@npm:12.4.6" + version: 12.5.0 + resolution: "better-sqlite3@npm:12.5.0" dependencies: bindings: "npm:^1.5.0" node-gyp: "npm:latest" prebuild-install: "npm:^7.1.1" - checksum: 10/383b1acc7c9f03e0677ab2aad5d3a44b4d36565396b1d10dfa5ebcf7840799afeb180c2b7c9813d7ffd1d5c92e497d5c9c52118fe7c5839987df87370df69943 + checksum: 10/8d81cde54231430d5b7fca8d7224ccdd13708ea769765e7a284af1744376568553016ed500f55e7ff992c57f12e29044da17a950adda2a4d361a5295c237d2ea languageName: node linkType: hard From c43babde04a07ba2fe19635052dec40aad4eda10 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:12:10 +0000 Subject: [PATCH 131/312] chore(deps): update dependency keyv to v5.5.4 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6a4902b8d4..8f7b1283d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10381,12 +10381,10 @@ __metadata: languageName: node linkType: hard -"@keyv/serialize@npm:^1.0.3": - version: 1.0.3 - resolution: "@keyv/serialize@npm:1.0.3" - dependencies: - buffer: "npm:^6.0.3" - checksum: 10/d6a9194dd781bc26cc4d55f392d843810c1fdc0da81e69203e633cb289fc0a8edc8bc6466f66c4cbb55da0a5b405e89f14a68b48d6e73919ae82f8249fb5e444 +"@keyv/serialize@npm:^1.0.3, @keyv/serialize@npm:^1.1.1": + version: 1.1.1 + resolution: "@keyv/serialize@npm:1.1.1" + checksum: 10/e3b2cb1377863342acedd5ff785af3e69269bee9b44707c617d1c8bc14eeb5ac763159d6455903ffe92f143c2238e1e783c4f113f9c8910eacccf172894472da languageName: node linkType: hard @@ -35926,11 +35924,11 @@ __metadata: linkType: hard "keyv@npm:*, keyv@npm:^5.2.1": - version: 5.3.4 - resolution: "keyv@npm:5.3.4" + version: 5.5.4 + resolution: "keyv@npm:5.5.4" dependencies: - "@keyv/serialize": "npm:^1.0.3" - checksum: 10/3e294eb1168af78ad3430d0cc47b6839fd3e70593238d35226a0a1e4094abe397ea378b7bce35cfcb314e55b5d1b4fcdae3c19bee5610e78d283b3cb5b279c8b + "@keyv/serialize": "npm:^1.1.1" + checksum: 10/2ee2178657b3f220cc7130727a1f9e65d05f2115c924af82e6f53e2c8b0197795a55fe7d4e6041ba712a6748039e5a4f7f50ad708bffb8bcc407b0dd0678dfa4 languageName: node linkType: hard From b05133aa810a19a930f09e9bcec306ee0fb644d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:12:52 +0000 Subject: [PATCH 132/312] chore(deps): update dependency knip to v5.70.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 414 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 295 insertions(+), 119 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6a4902b8d4..497356dcab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8369,22 +8369,22 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.5.0": - version: 1.7.0 - resolution: "@emnapi/core@npm:1.7.0" +"@emnapi/core@npm:^1.5.0, @emnapi/core@npm:^1.7.1": + version: 1.7.1 + resolution: "@emnapi/core@npm:1.7.1" dependencies: "@emnapi/wasi-threads": "npm:1.1.0" tslib: "npm:^2.4.0" - checksum: 10/43bb6fd7419b9589fe8190a09fce84e52c04cef171bcb1c411c278fb5380c4a76081776e5094f42c220deaf49e2e41905de5569209790ffee9b8efa59c987829 + checksum: 10/260841f6dd2a7823a964d9de6da3a5e6f565dac8d21a5bd8f6215b87c45c22a4dc371b9ad877961579ee3cca8a76e55e3dd033ae29cba1998999cda6d794bdab languageName: node linkType: hard -"@emnapi/runtime@npm:^1.5.0": - version: 1.7.0 - resolution: "@emnapi/runtime@npm:1.7.0" +"@emnapi/runtime@npm:^1.5.0, @emnapi/runtime@npm:^1.7.1": + version: 1.7.1 + resolution: "@emnapi/runtime@npm:1.7.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10/4dc726eb42fe2c7777fd32090f3e5e006c630e1a732538139caa18daf586e883e81c562cd69b0622db16e76bb572a2dde30711494edcee4a34059b62f5f46267 + checksum: 10/6fc83f938e3c70e32e84c1fbe5cab6cb9340b8107cee4048384ad5b8f2998a06502b4bed342acaf6e44f473f2c14c4ab1e3fd5083bd7823fc63abfca9eff0175 languageName: node linkType: hard @@ -11421,6 +11421,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^1.1.0": + version: 1.1.0 + resolution: "@napi-rs/wasm-runtime@npm:1.1.0" + dependencies: + "@emnapi/core": "npm:^1.7.1" + "@emnapi/runtime": "npm:^1.7.1" + "@tybys/wasm-util": "npm:^0.10.1" + checksum: 10/87c7ab4685527aa4820320020e2af5879b99d88e94b42cdc3690646722536f14656667392975a9576bf411a3804a464949fadbc343a646a2c2a8b2f10d921f6c + languageName: node + linkType: hard + "@nestjs/axios@npm:4.0.1": version: 4.0.1 resolution: "@nestjs/axios@npm:4.0.1" @@ -11500,16 +11511,6 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.scandir@npm:4.0.1": - version: 4.0.1 - resolution: "@nodelib/fs.scandir@npm:4.0.1" - dependencies: - "@nodelib/fs.stat": "npm:4.0.0" - run-parallel: "npm:^1.2.0" - checksum: 10/44b2b2b34e48ca88ee004413f5033db31cd6d5ecf8c7bbef0e33b6672d603f3e23b57d5fbb1bd5f83f8992df58381be6600006d92a903f085e698a37bdfe3c89 - languageName: node - linkType: hard - "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": version: 2.0.5 resolution: "@nodelib/fs.stat@npm:2.0.5" @@ -11517,23 +11518,6 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.stat@npm:4.0.0": - version: 4.0.0 - resolution: "@nodelib/fs.stat@npm:4.0.0" - checksum: 10/1f87199fdab938d2ed6f5e10debc006f7965081e2cd147ed3d2333049a030cad1949bd76556a5f5364f062c3e1edcc3d0981189b065336fc92c503ead463f4e1 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:3.0.1": - version: 3.0.1 - resolution: "@nodelib/fs.walk@npm:3.0.1" - dependencies: - "@nodelib/fs.scandir": "npm:4.0.1" - fastq: "npm:^1.15.0" - checksum: 10/7b76a0139dec52e3f2a3a0bb4f13dbf72a6b79d8076ec4b5deea9e75bd1b79d7abda53776f93b5aefda9a5e40f0e31f49f6e35bf5460a402f0aee7bcf3b26d85 - languageName: node - linkType: hard - "@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" @@ -13941,6 +13925,148 @@ __metadata: languageName: node linkType: hard +"@oxc-resolver/binding-android-arm-eabi@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.14.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm64@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-android-arm64@npm:11.14.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-arm64@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.14.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-x64@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-darwin-x64@npm:11.14.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-freebsd-x64@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.14.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.14.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.14.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-gnu@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.14.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-musl@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.14.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.14.2" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.14.2" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-musl@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.14.2" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-s390x-gnu@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.14.2" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-gnu@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.14.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-musl@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.14.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-openharmony-arm64@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.14.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-wasm32-wasi@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.14.2" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.1.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-arm64-msvc@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.14.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-ia32-msvc@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-win32-ia32-msvc@npm:11.14.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-x64-msvc@npm:11.14.2": + version: 11.14.2 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.14.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@paralleldrive/cuid2@npm:^2.2.2": version: 2.2.2 resolution: "@paralleldrive/cuid2@npm:2.2.2" @@ -18475,19 +18601,6 @@ __metadata: languageName: node linkType: hard -"@snyk/github-codeowners@npm:1.1.0": - version: 1.1.0 - resolution: "@snyk/github-codeowners@npm:1.1.0" - dependencies: - commander: "npm:^4.1.1" - ignore: "npm:^5.1.8" - p-map: "npm:^4.0.0" - bin: - github-codeowners: dist/cli.js - checksum: 10/34120ef622616fef1ed8af12869d8c1803842aafa3fbacca263805ee7c85f58d11bdc301ef698c9b41268b275b9fd090f5d9f6d89c556abe9d52196e72d1c510 - languageName: node - linkType: hard - "@snyk/graphlib@npm:2.1.9-patch.3": version: 2.1.9-patch.3 resolution: "@snyk/graphlib@npm:2.1.9-patch.3" @@ -26564,7 +26677,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^4.0.0, commander@npm:^4.1.1": +"commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" checksum: 10/3b2dc4125f387dab73b3294dbcb0ab2a862f9c0ad748ee2b27e3544d25325b7a8cdfbcc228d103a98a716960b14478114a5206b5415bd48cdafa38797891562c @@ -28792,19 +28905,6 @@ __metadata: languageName: node linkType: hard -"easy-table@npm:1.2.0": - version: 1.2.0 - resolution: "easy-table@npm:1.2.0" - dependencies: - ansi-regex: "npm:^5.0.1" - wcwidth: "npm:^1.0.1" - dependenciesMeta: - wcwidth: - optional: true - checksum: 10/0d1be7cd9419cd1b56ca5a978646b3cff241ccd8cf95bdb2742f36854084b3aef2e9af6ec14142855aa80e4cab1f4baad0f610a99c77509f23676b8330730177 - languageName: node - linkType: hard - "ebnf@npm:^1.9.1": version: 1.9.1 resolution: "ebnf@npm:1.9.1" @@ -30665,7 +30765,7 @@ __metadata: languageName: node linkType: hard -"fastq@npm:^1.15.0, fastq@npm:^1.6.0": +"fastq@npm:^1.6.0": version: 1.18.0 resolution: "fastq@npm:1.18.0" dependencies: @@ -30732,6 +30832,15 @@ __metadata: languageName: node linkType: hard +"fd-package-json@npm:^2.0.0": + version: 2.0.0 + resolution: "fd-package-json@npm:2.0.0" + dependencies: + walk-up-path: "npm:^4.0.0" + checksum: 10/e595a1a23f8e208815cdcf26c92218240da00acce80468324408dc4a5cb6c26b6efb5076f0458a02f044562a1e60253731187a627d5416b4961468ddfc0ae426 + languageName: node + linkType: hard + "fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -31239,6 +31348,17 @@ __metadata: languageName: node linkType: hard +"formatly@npm:^0.3.0": + version: 0.3.0 + resolution: "formatly@npm:0.3.0" + dependencies: + fd-package-json: "npm:^2.0.0" + bin: + formatly: bin/index.mjs + checksum: 10/0e5a9cbb826d93171b00c283e20e6a564a16e7bc3839e695790347a1f23e3536a88d613f5cabd07403d60b7bdffe179987c88b1fc2900a9be49eea01ffbe4244 + languageName: node + linkType: hard + "formdata-node@npm:^4.3.2, formdata-node@npm:^4.3.3": version: 4.4.1 resolution: "formdata-node@npm:4.4.1" @@ -33214,7 +33334,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.4, ignore@npm:^5.1.8, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": +"ignore@npm:^5.1.4, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 @@ -35147,12 +35267,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.0.0, jiti@npm:^2.4.2": - version: 2.4.2 - resolution: "jiti@npm:2.4.2" +"jiti@npm:^2.0.0, jiti@npm:^2.6.0": + version: 2.6.1 + resolution: "jiti@npm:2.6.1" bin: jiti: lib/jiti-cli.mjs - checksum: 10/e2b07eb2e3fbb245e29ad288dddecab31804967fc84d5e01d39858997d2743b5e248946defcecf99272275a00284ecaf7ec88b8c841331324f0c946d8274414b + checksum: 10/8cd72c5fd03a0502564c3f46c49761090f6dadead21fa191b73535724f095ad86c2fa89ee6fe4bc3515337e8d406cc8fb2d37b73fa0c99a34584bac35cd4a4de languageName: node linkType: hard @@ -35256,7 +35376,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1": version: 4.1.1 resolution: "js-yaml@npm:4.1.1" dependencies: @@ -36023,32 +36143,28 @@ __metadata: linkType: hard "knip@npm:^5.42.0": - version: 5.42.2 - resolution: "knip@npm:5.42.2" + version: 5.71.0 + resolution: "knip@npm:5.71.0" dependencies: - "@nodelib/fs.walk": "npm:3.0.1" - "@snyk/github-codeowners": "npm:1.1.0" - easy-table: "npm:1.2.0" - enhanced-resolve: "npm:^5.18.0" + "@nodelib/fs.walk": "npm:^1.2.3" fast-glob: "npm:^3.3.3" - jiti: "npm:^2.4.2" - js-yaml: "npm:^4.1.0" + formatly: "npm:^0.3.0" + jiti: "npm:^2.6.0" + js-yaml: "npm:^4.1.1" minimist: "npm:^1.2.8" - picocolors: "npm:^1.1.0" + oxc-resolver: "npm:^11.13.2" + picocolors: "npm:^1.1.1" picomatch: "npm:^4.0.1" - pretty-ms: "npm:^9.0.0" - smol-toml: "npm:^1.3.1" - strip-json-comments: "npm:5.0.1" - summary: "npm:2.1.0" - zod: "npm:^3.22.4" - zod-validation-error: "npm:^3.0.3" + smol-toml: "npm:^1.5.2" + strip-json-comments: "npm:5.0.3" + zod: "npm:^4.1.11" peerDependencies: "@types/node": ">=18" - typescript: ">=5.0.4" + typescript: ">=5.0.4 <7" bin: knip: bin/knip.js knip-bun: bin/knip-bun.js - checksum: 10/1e540ad66e8e5cd2dfceb0c333ca46446300f4e40a51599ca6cd8de705bf0f928332ca108de28306ae7b54cc8fc1f66667135193baf32d4ccd30560797825935 + checksum: 10/68c1508be9db70865559f5ebc106f8a6aced8e4799949655e92a59fbb3f530c042087e50565cfdd698b619f69f584ee214cc7b315f3241d483d09e4fd200c45b languageName: node linkType: hard @@ -40241,6 +40357,75 @@ __metadata: languageName: node linkType: hard +"oxc-resolver@npm:^11.13.2": + version: 11.14.2 + resolution: "oxc-resolver@npm:11.14.2" + dependencies: + "@oxc-resolver/binding-android-arm-eabi": "npm:11.14.2" + "@oxc-resolver/binding-android-arm64": "npm:11.14.2" + "@oxc-resolver/binding-darwin-arm64": "npm:11.14.2" + "@oxc-resolver/binding-darwin-x64": "npm:11.14.2" + "@oxc-resolver/binding-freebsd-x64": "npm:11.14.2" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.14.2" + "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.14.2" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.14.2" + "@oxc-resolver/binding-linux-arm64-musl": "npm:11.14.2" + "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.14.2" + "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.14.2" + "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.14.2" + "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.14.2" + "@oxc-resolver/binding-linux-x64-gnu": "npm:11.14.2" + "@oxc-resolver/binding-linux-x64-musl": "npm:11.14.2" + "@oxc-resolver/binding-openharmony-arm64": "npm:11.14.2" + "@oxc-resolver/binding-wasm32-wasi": "npm:11.14.2" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.14.2" + "@oxc-resolver/binding-win32-ia32-msvc": "npm:11.14.2" + "@oxc-resolver/binding-win32-x64-msvc": "npm:11.14.2" + dependenciesMeta: + "@oxc-resolver/binding-android-arm-eabi": + optional: true + "@oxc-resolver/binding-android-arm64": + optional: true + "@oxc-resolver/binding-darwin-arm64": + optional: true + "@oxc-resolver/binding-darwin-x64": + optional: true + "@oxc-resolver/binding-freebsd-x64": + optional: true + "@oxc-resolver/binding-linux-arm-gnueabihf": + optional: true + "@oxc-resolver/binding-linux-arm-musleabihf": + optional: true + "@oxc-resolver/binding-linux-arm64-gnu": + optional: true + "@oxc-resolver/binding-linux-arm64-musl": + optional: true + "@oxc-resolver/binding-linux-ppc64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-musl": + optional: true + "@oxc-resolver/binding-linux-s390x-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-musl": + optional: true + "@oxc-resolver/binding-openharmony-arm64": + optional: true + "@oxc-resolver/binding-wasm32-wasi": + optional: true + "@oxc-resolver/binding-win32-arm64-msvc": + optional: true + "@oxc-resolver/binding-win32-ia32-msvc": + optional: true + "@oxc-resolver/binding-win32-x64-msvc": + optional: true + checksum: 10/f64fa5cd61700b0ba370319f87b6c5ef45b9036f2c21719a563999285493f8152d9c7922d35d07208088d3893327de91c10e65cbc4131782aeeb9f9da365ae7c + languageName: node + linkType: hard + "p-cancelable@npm:^1.0.0": version: 1.1.0 resolution: "p-cancelable@npm:1.1.0" @@ -40635,13 +40820,6 @@ __metadata: languageName: node linkType: hard -"parse-ms@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-ms@npm:4.0.0" - checksum: 10/673c801d9f957ff79962d71ed5a24850163f4181a90dd30c4e3666b3a804f53b77f1f0556792e8b2adbb5d58757907d1aa51d7d7dc75997c2a56d72937cbc8b7 - languageName: node - linkType: hard - "parse-multipart-data@npm:^1.4.0": version: 1.5.0 resolution: "parse-multipart-data@npm:1.5.0" @@ -42046,15 +42224,6 @@ __metadata: languageName: node linkType: hard -"pretty-ms@npm:^9.0.0": - version: 9.2.0 - resolution: "pretty-ms@npm:9.2.0" - dependencies: - parse-ms: "npm:^4.0.0" - checksum: 10/a65a1d81560867f4f7128862fdbf0e1c2d3c5607bf75cae7758bf8111e2c4b744be46e084704125a38ba918bb43defa7a53aaff0f48c5c2d95367d3148c980d9 - languageName: node - linkType: hard - "printj@npm:~1.1.0": version: 1.1.2 resolution: "printj@npm:1.1.2" @@ -44661,7 +44830,7 @@ __metadata: languageName: node linkType: hard -"run-parallel@npm:^1.1.9, run-parallel@npm:^1.2.0": +"run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" dependencies: @@ -45581,10 +45750,10 @@ __metadata: languageName: node linkType: hard -"smol-toml@npm:^1.3.1": - version: 1.3.1 - resolution: "smol-toml@npm:1.3.1" - checksum: 10/b999828ea46cf44ae90b6293884d6a139dfb4545ac6f86cbd1002568a943a43d8895ad82413855d095eec0c0bc21d23413c0a25a26c7fad6395c2ce42c2fdbd0 +"smol-toml@npm:^1.5.2": + version: 1.5.2 + resolution: "smol-toml@npm:1.5.2" + checksum: 10/0a7e9192d1cbd04c3122224306de33962f4f5ac7e78a48b7c3795a675683b6efeb8f73ad3fabda7635926a510948cb4654a729d17b35ec43d56d35a71cf906f4 languageName: node linkType: hard @@ -46533,10 +46702,10 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:5.0.1": - version: 5.0.1 - resolution: "strip-json-comments@npm:5.0.1" - checksum: 10/b314af70c6666a71133e309a571bdb87687fc878d9fd8b38ebed393a77b89835b92f191aa6b0bc10dfd028ba99eed6b6365985001d64c5aef32a4a82456a156b +"strip-json-comments@npm:5.0.3": + version: 5.0.3 + resolution: "strip-json-comments@npm:5.0.3" + checksum: 10/3ccbf26f278220f785e4b71f8a719a6a063d72558cc63cb450924254af258a4f4c008b8c9b055373a680dc7bd525be9e543ad742c177f8a7667e0b726258e0e4 languageName: node linkType: hard @@ -46713,13 +46882,6 @@ __metadata: languageName: node linkType: hard -"summary@npm:2.1.0": - version: 2.1.0 - resolution: "summary@npm:2.1.0" - checksum: 10/10ac12ce12c013b56ad44c37cfac206961f0993d98867b33b1b03a27b38a1cf8dd2db0b788883356c5335bbbb37d953772ef4a381d6fc8f408faf99f2bc54af5 - languageName: node - linkType: hard - "superagent@npm:^10.2.3": version: 10.2.3 resolution: "superagent@npm:10.2.3" @@ -49239,6 +49401,13 @@ __metadata: languageName: node linkType: hard +"walk-up-path@npm:^4.0.0": + version: 4.0.0 + resolution: "walk-up-path@npm:4.0.0" + checksum: 10/6a230b20e5de296895116dc12b09dafaec1f72b8060c089533d296e241aff059dfaebe0d015c77467f857e4b40c78e08f7481add76f340233a1f34fa8af9ed63 + languageName: node + linkType: hard + "walkdir@npm:^0.4.1": version: 0.4.1 resolution: "walkdir@npm:0.4.1" @@ -50230,7 +50399,7 @@ __metadata: languageName: node linkType: hard -"zod-validation-error@npm:^3.0.3, zod-validation-error@npm:^3.4.0": +"zod-validation-error@npm:^3.4.0": version: 3.4.1 resolution: "zod-validation-error@npm:3.4.1" peerDependencies: @@ -50246,6 +50415,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^4.1.11": + version: 4.1.13 + resolution: "zod@npm:4.1.13" + checksum: 10/0679190318928f69fcb07751063719de232c663b13955fcdb55db59839569d39f3f29b955cb0cba7af0b724233f88c06b3e84c550397ad4e68f8088fa6799d88 + languageName: node + linkType: hard + "zstd-codec@npm:^0.1.4, zstd-codec@npm:^0.1.5": version: 0.1.5 resolution: "zstd-codec@npm:0.1.5" From f5ff09d36644a75deb1737ce4f49bff7c757888e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:27:19 +0000 Subject: [PATCH 133/312] chore(deps): update dependency kubernetes-models to v4.5.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 e059cfba82..e5762dfdb7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10397,7 +10397,7 @@ __metadata: languageName: node linkType: hard -"@kubernetes-models/apimachinery@npm:^2.0.0, @kubernetes-models/apimachinery@npm:^2.0.2": +"@kubernetes-models/apimachinery@npm:^2.0.0, @kubernetes-models/apimachinery@npm:^2.2.0": version: 2.2.0 resolution: "@kubernetes-models/apimachinery@npm:2.2.0" dependencies: @@ -36215,14 +36215,14 @@ __metadata: linkType: hard "kubernetes-models@npm:^4.1.0, kubernetes-models@npm:^4.3.1": - version: 4.4.2 - resolution: "kubernetes-models@npm:4.4.2" + version: 4.5.1 + resolution: "kubernetes-models@npm:4.5.1" dependencies: - "@kubernetes-models/apimachinery": "npm:^2.0.2" + "@kubernetes-models/apimachinery": "npm:^2.2.0" "@kubernetes-models/base": "npm:^5.0.1" "@kubernetes-models/validate": "npm:^4.0.0" "@swc/helpers": "npm:^0.5.8" - checksum: 10/67956c3be831d02a0de3742809f1f8c89382eb11a9d66e7161f314413a1ddfce963513aa4eeba451a07a814b2f2afa959984a891f6e504e23e12825285a70a4e + checksum: 10/65a7b2064dcfbc719a80da7fd24b44775f68423170eb7abef3d4946604acdb5c8a3b2c8fded1d7212e2725b10ccf13abc94adf3091dc8005e25cd5321577ae92 languageName: node linkType: hard From 5c5dd220dd057923d4d1b908cf2c8a565454c5f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 01:22:45 +0000 Subject: [PATCH 134/312] chore(deps): update dependency mockttp to v3.17.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index dc0a3e4461..63f4f4b1c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28279,12 +28279,12 @@ __metadata: languageName: node linkType: hard -"destroyable-server@npm:^1.0.0, destroyable-server@npm:^1.0.2": - version: 1.0.2 - resolution: "destroyable-server@npm:1.0.2" +"destroyable-server@npm:^1.0.0, destroyable-server@npm:^1.1.1": + version: 1.1.1 + resolution: "destroyable-server@npm:1.1.1" dependencies: "@types/node": "npm:*" - checksum: 10/c93c7651dac530bf9dd4263eab59f5724a2453dc35658d98e3707c4c9171d8496ef404655852bef257586b31850f4f6730397bc5ff496ed799352660b0495a0a + checksum: 10/483867c0ee3adb6f265e0163ea5f204135a30cd2b14ef07f58054186f63cc12ca7c591431b30cb664216e1bdc3156d50c74b56c3e17f67a5e75b0d32f0fe84f5 languageName: node linkType: hard @@ -38736,8 +38736,8 @@ __metadata: linkType: hard "mockttp@npm:^3.13.0": - version: 3.15.5 - resolution: "mockttp@npm:3.15.5" + version: 3.17.1 + resolution: "mockttp@npm:3.17.1" dependencies: "@graphql-tools/schema": "npm:^8.5.0" "@graphql-tools/utils": "npm:^8.8.0" @@ -38755,7 +38755,7 @@ __metadata: cors: "npm:^2.8.4" cors-gate: "npm:^1.1.3" cross-fetch: "npm:^3.1.5" - destroyable-server: "npm:^1.0.2" + destroyable-server: "npm:^1.1.1" express: "npm:^4.14.0" fast-json-patch: "npm:^3.1.1" graphql: "npm:^14.0.2 || ^15.5" @@ -38774,7 +38774,7 @@ __metadata: parse-multipart-data: "npm:^1.4.0" performance-now: "npm:^2.1.0" portfinder: "npm:^1.0.32" - read-tls-client-hello: "npm:^1.0.0" + read-tls-client-hello: "npm:^1.1.0" semver: "npm:^7.5.3" socks-proxy-agent: "npm:^7.0.0" typed-error: "npm:^3.0.2" @@ -38783,7 +38783,7 @@ __metadata: ws: "npm:^8.8.0" bin: mockttp: dist/admin/admin-bin.js - checksum: 10/93eca69baa35db11ae7f541d712bfd208edf0017db3091e874f59fc64a7c036179906b4e9b66936f054ad1c258645d085452dafab58a1c2df9fd6d67330f8328 + checksum: 10/09278221361b9896636bbf9e6a6d6427afe2375c035dcc6ddd56d308a7b197ae3a5196fba7b00b9fb1bfb0b4c22daacc046bdc207e0ab9ef15bb2a79637cdfbf languageName: node linkType: hard @@ -43760,12 +43760,12 @@ __metadata: languageName: node linkType: hard -"read-tls-client-hello@npm:^1.0.0": - version: 1.0.1 - resolution: "read-tls-client-hello@npm:1.0.1" +"read-tls-client-hello@npm:^1.0.0, read-tls-client-hello@npm:^1.1.0": + version: 1.1.0 + resolution: "read-tls-client-hello@npm:1.1.0" dependencies: "@types/node": "npm:*" - checksum: 10/fefa63605eebb197b6046cb26d7efde16eb24c026edbbca789c30b7b5be7c0dd8e45fb4d32707513dfc4dd468b787b2a46ed8be846f29eac844d6d80710688c6 + checksum: 10/c3a15164065e33509b3dee05e70865e68b7b061804e70f864d6afdc55b30663ce6fed2730d9508a44672757622a454c2a38b696c262bdd0ebcbb39f28acee621 languageName: node linkType: hard From fbe8b9958cbda27a1c3473a414c05d64ba4a4302 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 02:14:08 +0000 Subject: [PATCH 135/312] chore(deps): update dependency mysql2 to v3.15.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 dc0a3e4461..bae0a175df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38985,19 +38985,19 @@ __metadata: linkType: hard "mysql2@npm:^3.0.0": - version: 3.11.5 - resolution: "mysql2@npm:3.11.5" + version: 3.15.3 + resolution: "mysql2@npm:3.15.3" dependencies: aws-ssl-profiles: "npm:^1.1.1" denque: "npm:^2.1.0" generate-function: "npm:^2.3.1" - iconv-lite: "npm:^0.6.3" + iconv-lite: "npm:^0.7.0" long: "npm:^5.2.1" lru.min: "npm:^1.0.0" named-placeholders: "npm:^1.1.3" seq-queue: "npm:^0.0.5" sqlstring: "npm:^2.3.2" - checksum: 10/912dc364f6f9684721add5474c732f5d7c2403ec17cb05b06f95adafab3cb32daa2798b283d48d0951d11af94a58558581ed22635803fc6baab651d3651c1cc9 + checksum: 10/96fbab423afb05a9ac397c272aa1097872797e224b7d1785ac05b7e46d0884c1e613ad9e2c3082ad7973f229357f9ab5824a7f90e8c582b2094ce52027fff8e3 languageName: node linkType: hard From a5624273106e0907e0e473b3b6207a418cc9a976 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 03:18:50 +0000 Subject: [PATCH 136/312] chore(deps): update dependency pg-connection-string to v2.9.1 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 63f4f4b1c6..223b81265d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41231,9 +41231,9 @@ __metadata: linkType: hard "pg-connection-string@npm:^2.3.0, pg-connection-string@npm:^2.5.0, pg-connection-string@npm:^2.7.0": - version: 2.7.0 - resolution: "pg-connection-string@npm:2.7.0" - checksum: 10/68015a8874b7ca5dad456445e4114af3d2602bac2fdb8069315ecad0ff9660ec93259b9af7186606529ac4f6f72a06831e6f20897a689b16cc7fda7ca0e247fd + version: 2.9.1 + resolution: "pg-connection-string@npm:2.9.1" + checksum: 10/40e9e9cd752121e72bff18d83e6c7ecda9056426815a84294de018569a319293c924704c8b7f0604fdc588835c7927647dea4f3c87a014e715bcbb17d794e9f0 languageName: node linkType: hard From ba1eda84a943c486188dee74b5df0e0b2be5422d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 03:35:32 +0000 Subject: [PATCH 137/312] build(deps): bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /docs-ui Bumps [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast) from 13.2.0 to 13.2.1. - [Release notes](https://github.com/syntax-tree/mdast-util-to-hast/releases) - [Commits](https://github.com/syntax-tree/mdast-util-to-hast/compare/13.2.0...13.2.1) --- updated-dependencies: - dependency-name: mdast-util-to-hast dependency-version: 13.2.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs-ui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 287af854ce..d84c41fa0b 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -4735,8 +4735,8 @@ __metadata: linkType: hard "mdast-util-to-hast@npm:^13.0.0": - version: 13.2.0 - resolution: "mdast-util-to-hast@npm:13.2.0" + version: 13.2.1 + resolution: "mdast-util-to-hast@npm:13.2.1" dependencies: "@types/hast": "npm:^3.0.0" "@types/mdast": "npm:^4.0.0" @@ -4747,7 +4747,7 @@ __metadata: unist-util-position: "npm:^5.0.0" unist-util-visit: "npm:^5.0.0" vfile: "npm:^6.0.0" - checksum: 10/b17ee338f843af31a1c7a2ebf0df6f0b41c9380b7119a63ab521d271df665456578e1234bb7617883e8d860fe878038dcf2b76ab2f21e0f7451215a096d26cce + checksum: 10/8fddf5e66ea24dc85c8fe1cc2acd8fbe36e9d4f21b06322e156431fd71385eab9d2d767646f50276ca4ce3684cb967c4e226c60c3fff3428feb687ccb598fa39 languageName: node linkType: hard From f7bc228aa9eebba2bc11e0aa63571800f54515e8 Mon Sep 17 00:00:00 2001 From: mario ma Date: Wed, 3 Dec 2025 11:59:59 +0800 Subject: [PATCH 138/312] feat: Support to set defaultLanguage and availableLanguages in new frontend system Signed-off-by: mario ma --- .changeset/gentle-singers-love.md | 5 ++++ packages/app-next/app-config.yaml | 5 ++++ plugins/app/report.api.md | 22 +++++++++++++--- plugins/app/src/extensions/AppLanguageApi.ts | 27 +++++++++++++++----- 4 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 .changeset/gentle-singers-love.md diff --git a/.changeset/gentle-singers-love.md b/.changeset/gentle-singers-love.md new file mode 100644 index 0000000000..0fb2dbc047 --- /dev/null +++ b/.changeset/gentle-singers-love.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-app': patch +--- + +Support to set defaultLanguage and availableLanguages in new frontend system diff --git a/packages/app-next/app-config.yaml b/packages/app-next/app-config.yaml index dcaddfb9bf..1121cfc0d5 100644 --- a/packages/app-next/app-config.yaml +++ b/packages/app-next/app-config.yaml @@ -21,6 +21,11 @@ app: ownerEntityRefs: [cubic-belugas] extensions: + # set availableLanguages example + - api:app/app-language: + config: + availableLanguages: ['en', 'es', 'fr', 'de', 'ja'] + defaultLanguage: 'en' - entity-card:org/members-list: config: showAggregateMembersToggle: true diff --git a/plugins/app/report.api.md b/plugins/app/report.api.md index 313d09cfee..c9aa1cf9f7 100644 --- a/plugins/app/report.api.md +++ b/plugins/app/report.api.md @@ -232,12 +232,26 @@ const appPlugin: OverridableFrontendPlugin< ) => ExtensionBlueprintParams; }>; 'api:app/app-language': OverridableExtensionDefinition<{ + config: { + defaultLanguage: string | undefined; + availableLanguages: string[] | undefined; + }; + configInput: { + defaultLanguage?: string | undefined; + availableLanguages?: string[] | undefined; + }; + output: ExtensionDataRef; + inputs: { + [x: string]: ExtensionInput< + ExtensionDataRef, + { + singleton: boolean; + optional: boolean; + } + >; + }; kind: 'api'; name: 'app-language'; - config: {}; - configInput: {}; - output: ExtensionDataRef; - inputs: {}; params: < TApi, TImpl extends TApi, diff --git a/plugins/app/src/extensions/AppLanguageApi.ts b/plugins/app/src/extensions/AppLanguageApi.ts index 325dffa2fd..4f605aa30f 100644 --- a/plugins/app/src/extensions/AppLanguageApi.ts +++ b/plugins/app/src/extensions/AppLanguageApi.ts @@ -19,12 +19,25 @@ import { AppLanguageSelector } from '../../../../packages/core-app-api/src/apis/ import { appLanguageApiRef } from '@backstage/core-plugin-api/alpha'; import { ApiBlueprint } from '@backstage/frontend-plugin-api'; -export const AppLanguageApi = ApiBlueprint.make({ +export const AppLanguageApi = ApiBlueprint.makeWithOverrides({ name: 'app-language', - params: defineParams => - defineParams({ - api: appLanguageApiRef, - deps: {}, - factory: () => AppLanguageSelector.createWithStorage(), - }), + config: { + schema: { + defaultLanguage: z => z.string().optional(), + availableLanguages: z => z.array(z.string()).optional(), + }, + }, + factory(originalFactory, { config }) { + return originalFactory(defineParams => + defineParams({ + api: appLanguageApiRef, + deps: {}, + factory: () => + AppLanguageSelector.createWithStorage({ + defaultLanguage: config.defaultLanguage, + availableLanguages: config.availableLanguages, + }), + }), + ); + }, }); From ecbb90335a0bc062236e2a23113d1d07d5f423f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 04:06:18 +0000 Subject: [PATCH 139/312] chore(deps): update dependency rate-limit-redis to v4.3.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 b3da3a787a..fb6ec6e1ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42749,11 +42749,11 @@ __metadata: linkType: hard "rate-limit-redis@npm:^4.2.0": - version: 4.2.3 - resolution: "rate-limit-redis@npm:4.2.3" + version: 4.3.1 + resolution: "rate-limit-redis@npm:4.3.1" peerDependencies: express-rate-limit: ">= 6" - checksum: 10/00c95868e48214b926272b2f01418695acd0487f766d36fec68992922037d43e67eeacc6854f38b8a511c69b9385b2de6994d08802a6aa422686dfd4c55e5ba0 + checksum: 10/6e02374832ced889a61829e327d03d021c50c0fc3ac86674d8c922cd3a50c0451091106811c308ed5553776a28b6acbc5313e2c9d37aecb198ab306f249de21b languageName: node linkType: hard From b843187c07ee7791c01c68eb9cb36212fe930a82 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 04:31:51 +0000 Subject: [PATCH 140/312] chore(deps): update dependency pg to v8.16.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 68 +++++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/yarn.lock b/yarn.lock index e2587673c6..b1f215a383 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41216,10 +41216,10 @@ __metadata: languageName: node linkType: hard -"pg-cloudflare@npm:^1.1.1": - version: 1.1.1 - resolution: "pg-cloudflare@npm:1.1.1" - checksum: 10/45ca0c7926967ec9e66a9efc73ca57e3e933671b541bc774631a02ce683e7f658d0a4e881119b3f61486f38e344ae1b008d3a20eb5e21701c5fa8ff8382c5538 +"pg-cloudflare@npm:^1.2.7": + version: 1.2.7 + resolution: "pg-cloudflare@npm:1.2.7" + checksum: 10/3d171407cbce36436c461200666ba6bd884bfe98016972760a797cec850199b8024a40055d80322c5fc02909e1533a144e9b108a99f7d7e21d0c42612f9821fb languageName: node linkType: hard @@ -41230,7 +41230,7 @@ __metadata: languageName: node linkType: hard -"pg-connection-string@npm:^2.3.0, pg-connection-string@npm:^2.5.0, pg-connection-string@npm:^2.7.0": +"pg-connection-string@npm:^2.3.0, pg-connection-string@npm:^2.5.0, pg-connection-string@npm:^2.9.1": version: 2.9.1 resolution: "pg-connection-string@npm:2.9.1" checksum: 10/40e9e9cd752121e72bff18d83e6c7ecda9056426815a84294de018569a319293c924704c8b7f0604fdc588835c7927647dea4f3c87a014e715bcbb17d794e9f0 @@ -41251,23 +41251,23 @@ __metadata: languageName: node linkType: hard -"pg-pool@npm:^3.8.0": - version: 3.8.0 - resolution: "pg-pool@npm:3.8.0" +"pg-pool@npm:^3.10.1": + version: 3.10.1 + resolution: "pg-pool@npm:3.10.1" peerDependencies: pg: ">=8.0" - checksum: 10/be6b7c6932fa177dc69ca8980d959f24b4979911465ac11656b8ff86707cba035e776416d8aac1029e8cc4d8eb8989ed2cc85a33ac6b76e266b20a81284436d8 + checksum: 10/b389a714be59ebe53ec412cbff513191cc0b7a203faa5d26416b6a038cafdfe30fbf1a5936b77bb76109c49bd7c4a116870a5a46a45796b1b34c96f016d7fbe2 languageName: node linkType: hard -"pg-protocol@npm:*, pg-protocol@npm:^1.8.0": - version: 1.8.0 - resolution: "pg-protocol@npm:1.8.0" - checksum: 10/52f67d8161ae4afb1dbf96f6ad12a2ecf478dbb0b80baa239047cd562dee378961fd446f0a1cfc1fd323e052fbb3df47e886c5d9d86a2803a000d36682b29094 +"pg-protocol@npm:*, pg-protocol@npm:^1.10.3": + version: 1.10.3 + resolution: "pg-protocol@npm:1.10.3" + checksum: 10/31da85319084c03f403efee7accce9786964df82a7feb60e6bd77b71f1e622c74a2a644a2bc434389d0ab92e5abdeedea69ebdb53b1897d9f01d2a1f51a8a2fe languageName: node linkType: hard -"pg-types@npm:^2.1.0, pg-types@npm:^2.2.0": +"pg-types@npm:2.2.0, pg-types@npm:^2.2.0": version: 2.2.0 resolution: "pg-types@npm:2.2.0" dependencies: @@ -41281,15 +41281,15 @@ __metadata: linkType: hard "pg@npm:^8.11.3, pg@npm:^8.9.0": - version: 8.14.1 - resolution: "pg@npm:8.14.1" + version: 8.16.3 + resolution: "pg@npm:8.16.3" dependencies: - pg-cloudflare: "npm:^1.1.1" - pg-connection-string: "npm:^2.7.0" - pg-pool: "npm:^3.8.0" - pg-protocol: "npm:^1.8.0" - pg-types: "npm:^2.1.0" - pgpass: "npm:1.x" + pg-cloudflare: "npm:^1.2.7" + pg-connection-string: "npm:^2.9.1" + pg-pool: "npm:^3.10.1" + pg-protocol: "npm:^1.10.3" + pg-types: "npm:2.2.0" + pgpass: "npm:1.0.5" peerDependencies: pg-native: ">=3.0.1" dependenciesMeta: @@ -41298,16 +41298,16 @@ __metadata: peerDependenciesMeta: pg-native: optional: true - checksum: 10/45f2d5719fd74a6a4784c5115c0ff482af92d1e5b101bf423160b6a983e37cc2fad4a7eea2a06f27e6f8bdb8abce23486d2d522c8c52c90f68a2bc897f0553c4 + checksum: 10/6a2885a3f581d6c6dddddf5a4bb2790ee84f402ed7d73ece8b6bc102c58c17e4c5f17894c241633aa2f1d4fedd8f2401a80a9a02ef18bb57d05cbbfd8a53ca4d languageName: node linkType: hard -"pgpass@npm:1.x": - version: 1.0.2 - resolution: "pgpass@npm:1.0.2" +"pgpass@npm:1.0.5": + version: 1.0.5 + resolution: "pgpass@npm:1.0.5" dependencies: - split: "npm:^1.0.0" - checksum: 10/4f09d81d5aa9e3e409e2a58dc71f889ca92233d66772adcb810e53e637b49013ae84b8dd831aa5e6f1413bffb4b9b1eafd1a05227c8cf05c39f5cd276d4e9492 + split2: "npm:^4.1.0" + checksum: 10/0a6f3bf76e36bdb3c20a7e8033140c732767bba7e81f845f7489fc3123a2bd6e3b8e704f08cba86b117435414b5d2422e20ba9d5f2efb6f0c75c9efca73e8e87 languageName: node linkType: hard @@ -46036,12 +46036,10 @@ __metadata: languageName: node linkType: hard -"split@npm:^1.0.0": - version: 1.0.1 - resolution: "split@npm:1.0.1" - dependencies: - through: "npm:2" - checksum: 10/12f4554a5792c7e98bb3e22b53c63bfa5ef89aa704353e1db608a55b51f5b12afaad6e4a8ecf7843c15f273f43cdadd67b3705cc43d48a75c2cf4641d51f7e7a +"split2@npm:^4.1.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 10/09bbefc11bcf03f044584c9764cd31a252d8e52cea29130950b26161287c11f519807c5e54bd9e5804c713b79c02cefe6a98f4688630993386be353e03f534ab languageName: node linkType: hard @@ -47430,7 +47428,7 @@ __metadata: languageName: node linkType: hard -"through@npm:2, through@npm:^2.3.6, through@npm:~2.3": +"through@npm:^2.3.6, through@npm:~2.3": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 10/5da78346f70139a7d213b65a0106f3c398d6bc5301f9248b5275f420abc2c4b1e77c2abc72d218dedc28c41efb2e7c312cb76a7730d04f9c2d37d247da3f4198 From d667d78e2b55e19012dda836b53cde50d0c217fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 05:07:58 +0000 Subject: [PATCH 141/312] chore(deps): update dependency react-hook-form to v7.67.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 0a3f789eb7..495185dfd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43202,11 +43202,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.12.2": - version: 7.55.0 - resolution: "react-hook-form@npm:7.55.0" + version: 7.67.0 + resolution: "react-hook-form@npm:7.67.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10/900e06064c1b4977f2e3e249a0f91742ae6bd1f2109701b80a9280b1c2b4bee8aac26aed7104371101eadad724f0bbe0215499e84623e6375007489ae850fe8e + checksum: 10/0e74a48b2da0f79166d5c6701f78a08fd5165e901e46ce5a578f0a2f25005e861023ffb35c1a96373c23701a84c3fce2111c4aced824d2ca08c9b2420a645551 languageName: node linkType: hard From d666650aa5d1454470674746bbaf055f74d993b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 05:08:40 +0000 Subject: [PATCH 142/312] chore(deps): update dependency react-use to v17.6.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 0a3f789eb7..0b6b0866ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43670,8 +43670,8 @@ __metadata: linkType: hard "react-use@npm:^17.2.4, react-use@npm:^17.3.2, react-use@npm:^17.4.0": - version: 17.5.1 - resolution: "react-use@npm:17.5.1" + version: 17.6.0 + resolution: "react-use@npm:17.6.0" dependencies: "@types/js-cookie": "npm:^2.2.6" "@xobotyi/scrollbar-width": "npm:^1.9.5" @@ -43690,7 +43690,7 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: 10/2da403a9949dbd964b9b8e20dcd354db66b7f7d5ca1f42572fbcdb06bd49ee828c295be4912cb87abc163d1b54820bb8c5fa85314a16c4579d9e30bf9cbd5759 + checksum: 10/a817b74e82b481a39d3539bfe8d3b535c08d59d44a75ea91f65e56a7ccaedb0de185159e50b44ea4a635dda0c1c7159f07530e81a1d64b57130e0a715a107795 languageName: node linkType: hard From dbde1caafbfde41f8bfa790867ee8bfc6f3e0c67 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 06:13:33 +0000 Subject: [PATCH 143/312] chore(deps): update dependency rollup to v4.53.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 188 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 104 insertions(+), 84 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0d43b087dd..dd0b2f35b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16673,142 +16673,156 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.46.2" +"@rollup/rollup-android-arm-eabi@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.53.3" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-android-arm64@npm:4.46.2" +"@rollup/rollup-android-arm64@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-android-arm64@npm:4.53.3" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.46.2" +"@rollup/rollup-darwin-arm64@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-darwin-arm64@npm:4.53.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.46.2" +"@rollup/rollup-darwin-x64@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-darwin-x64@npm:4.53.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.46.2" +"@rollup/rollup-freebsd-arm64@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.53.3" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-freebsd-x64@npm:4.46.2" +"@rollup/rollup-freebsd-x64@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-freebsd-x64@npm:4.53.3" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.46.2" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.3" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.46.2" +"@rollup/rollup-linux-arm-musleabihf@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.53.3" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.46.2" +"@rollup/rollup-linux-arm64-gnu@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.53.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.46.2" +"@rollup/rollup-linux-arm64-musl@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.53.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.46.2" +"@rollup/rollup-linux-loong64-gnu@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.53.3" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-gnu@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.46.2" +"@rollup/rollup-linux-ppc64-gnu@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.53.3" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.46.2" +"@rollup/rollup-linux-riscv64-gnu@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.53.3" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.46.2" +"@rollup/rollup-linux-riscv64-musl@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.53.3" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.46.2" +"@rollup/rollup-linux-s390x-gnu@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.53.3" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.46.2" +"@rollup/rollup-linux-x64-gnu@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.53.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.46.2" +"@rollup/rollup-linux-x64-musl@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.53.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.46.2" +"@rollup/rollup-openharmony-arm64@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.53.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.53.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.46.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.53.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.46.2": - version: 4.46.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.46.2" +"@rollup/rollup-win32-x64-gnu@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.53.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.53.3": + version: 4.53.3 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.53.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -44653,29 +44667,31 @@ __metadata: linkType: hard "rollup@npm:^4.27.3, rollup@npm:^4.43.0": - version: 4.46.2 - resolution: "rollup@npm:4.46.2" + version: 4.53.3 + resolution: "rollup@npm:4.53.3" dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.46.2" - "@rollup/rollup-android-arm64": "npm:4.46.2" - "@rollup/rollup-darwin-arm64": "npm:4.46.2" - "@rollup/rollup-darwin-x64": "npm:4.46.2" - "@rollup/rollup-freebsd-arm64": "npm:4.46.2" - "@rollup/rollup-freebsd-x64": "npm:4.46.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.46.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.46.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.46.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.46.2" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.46.2" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.46.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.46.2" - "@rollup/rollup-linux-riscv64-musl": "npm:4.46.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.46.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.46.2" - "@rollup/rollup-linux-x64-musl": "npm:4.46.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.46.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.46.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.46.2" + "@rollup/rollup-android-arm-eabi": "npm:4.53.3" + "@rollup/rollup-android-arm64": "npm:4.53.3" + "@rollup/rollup-darwin-arm64": "npm:4.53.3" + "@rollup/rollup-darwin-x64": "npm:4.53.3" + "@rollup/rollup-freebsd-arm64": "npm:4.53.3" + "@rollup/rollup-freebsd-x64": "npm:4.53.3" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.53.3" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.53.3" + "@rollup/rollup-linux-arm64-gnu": "npm:4.53.3" + "@rollup/rollup-linux-arm64-musl": "npm:4.53.3" + "@rollup/rollup-linux-loong64-gnu": "npm:4.53.3" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.53.3" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.53.3" + "@rollup/rollup-linux-riscv64-musl": "npm:4.53.3" + "@rollup/rollup-linux-s390x-gnu": "npm:4.53.3" + "@rollup/rollup-linux-x64-gnu": "npm:4.53.3" + "@rollup/rollup-linux-x64-musl": "npm:4.53.3" + "@rollup/rollup-openharmony-arm64": "npm:4.53.3" + "@rollup/rollup-win32-arm64-msvc": "npm:4.53.3" + "@rollup/rollup-win32-ia32-msvc": "npm:4.53.3" + "@rollup/rollup-win32-x64-gnu": "npm:4.53.3" + "@rollup/rollup-win32-x64-msvc": "npm:4.53.3" "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -44699,7 +44715,7 @@ __metadata: optional: true "@rollup/rollup-linux-arm64-musl": optional: true - "@rollup/rollup-linux-loongarch64-gnu": + "@rollup/rollup-linux-loong64-gnu": optional: true "@rollup/rollup-linux-ppc64-gnu": optional: true @@ -44713,17 +44729,21 @@ __metadata: optional: true "@rollup/rollup-linux-x64-musl": optional: true + "@rollup/rollup-openharmony-arm64": + optional: true "@rollup/rollup-win32-arm64-msvc": optional: true "@rollup/rollup-win32-ia32-msvc": optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true "@rollup/rollup-win32-x64-msvc": optional: true fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 10/3acc425a9828e8ba75eaec9cb506a680d3deaa09a753635140cc4a3c98445ba6e3f631b32ca1c98965b3f60672d2815cd560ea844bba497d69e65c58c02327cf + checksum: 10/e2eff82405061fa907f15dfbf742b1f5fb4b214495c00989bcdbe21da5fcb3f6dec3deabacec491300a53c99da409586cfc77bdf29b411fccb9089b72cd3728d languageName: node linkType: hard From aa467f28644d7ecf123a1099ca5e2bc146d92750 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 06:14:11 +0000 Subject: [PATCH 144/312] chore(deps): update dependency rollup-plugin-dts to v6.3.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0d43b087dd..bbeea570ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2222,7 +2222,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.8.3": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -10213,7 +10213,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15, @jridgewell/sourcemap-codec@npm:^1.5.0": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": version: 1.5.5 resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" checksum: 10/5d9d207b462c11e322d71911e55e21a4e2772f71ffe8d6f1221b8eb5ae6774458c1d242f897fb0814e8714ca9a6b498abfa74dfe4f434493342902b1a48b33a5 @@ -37261,12 +37261,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0, magic-string@npm:^0.30.10, magic-string@npm:^0.30.17, magic-string@npm:^0.30.3": - version: 0.30.17 - resolution: "magic-string@npm:0.30.17" +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17, magic-string@npm:^0.30.21, magic-string@npm:^0.30.3": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10/2f71af2b0afd78c2e9012a29b066d2c8ba45a9cd0c8070f7fd72de982fb1c403b4e3afdb1dae00691d56885ede66b772ef6bedf765e02e3a7066208fe2fec4aa + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10/57d5691f41ed40d962d8bd300148114f53db67fadbff336207db10a99f2bdf4a1be9cac3a68ee85dba575912ee1d4402e4396408196ec2d3afd043b076156221 languageName: node linkType: hard @@ -44563,18 +44563,18 @@ __metadata: linkType: hard "rollup-plugin-dts@npm:^6.1.0": - version: 6.1.1 - resolution: "rollup-plugin-dts@npm:6.1.1" + version: 6.3.0 + resolution: "rollup-plugin-dts@npm:6.3.0" dependencies: - "@babel/code-frame": "npm:^7.24.2" - magic-string: "npm:^0.30.10" + "@babel/code-frame": "npm:^7.27.1" + magic-string: "npm:^0.30.21" peerDependencies: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 dependenciesMeta: "@babel/code-frame": optional: true - checksum: 10/8a66833a5af32f77d9bbc746339097d4af2382e5160f7629d85dcecb4efad12cbfebd37c79147fa688f073c333d71f53135e08a225a3fc3e9a3b3f92c46b2381 + checksum: 10/1b2b25126eee0c4e7f59d82ee5850b0c5779a1a0bb77d677798e20a3d29dba76d1a19a73300ed5b20aab02f6888ecc4209a95b07f6cc9c1b80af14bdcbeda5b9 languageName: node linkType: hard From af3a69150f65b62a19ad076474ab3c31f65297f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 07:13:46 +0000 Subject: [PATCH 145/312] chore(deps): update dependency rollup-plugin-esbuild to v6.2.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index bbeea570ed..fcc0e04f46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16657,7 +16657,7 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.0.5, @rollup/pluginutils@npm:^5.1.0": +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.1.0": version: 5.2.0 resolution: "@rollup/pluginutils@npm:5.2.0" dependencies: @@ -29288,7 +29288,7 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.3.1": +"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.6.0": version: 1.7.0 resolution: "es-module-lexer@npm:1.7.0" checksum: 10/b6f3e576a3fed4d82b0d0ad4bbf6b3a5ad694d2e7ce8c4a069560da3db6399381eaba703616a182b16dde50ce998af64e07dcf49f2ae48153b9e07be3f107087 @@ -31894,7 +31894,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.10.1, get-tsconfig@npm:^4.7.2": +"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.10.1": version: 4.13.0 resolution: "get-tsconfig@npm:4.13.0" dependencies: @@ -41151,6 +41151,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d + languageName: node + linkType: hard + "pathval@npm:^2.0.0": version: 2.0.0 resolution: "pathval@npm:2.0.0" @@ -44579,17 +44586,17 @@ __metadata: linkType: hard "rollup-plugin-esbuild@npm:^6.1.1": - version: 6.1.1 - resolution: "rollup-plugin-esbuild@npm:6.1.1" + version: 6.2.1 + resolution: "rollup-plugin-esbuild@npm:6.2.1" dependencies: - "@rollup/pluginutils": "npm:^5.0.5" - debug: "npm:^4.3.4" - es-module-lexer: "npm:^1.3.1" - get-tsconfig: "npm:^4.7.2" + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + get-tsconfig: "npm:^4.10.0" + unplugin-utils: "npm:^0.2.4" peerDependencies: esbuild: ">=0.18.0" rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: 10/bba2d1dfb92a193823ac9dd1cdd44a8fd8cd9f25868e9a22ca077e1b7445feb4eaaf6df051148e367fc902d7d59c9f50efab49086c24c367972f05c86f3a656d + checksum: 10/e5731b86c4e01c6ccd3998a2f90794bd738fe83a3a809b9e82456e4b1d173c296ef302c2a6669b966b12c757c1787f0585ae88cd73b98f3c0ad6ad7f779940aa languageName: node linkType: hard @@ -48762,6 +48769,16 @@ __metadata: languageName: node linkType: hard +"unplugin-utils@npm:^0.2.4": + version: 0.2.5 + resolution: "unplugin-utils@npm:0.2.5" + dependencies: + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.3" + checksum: 10/f9ff443089de3159ccab001d075fa4245a741696182dbe6b9708aa01945ded163bd846a3f4099132a2195de3fcbefe404a05380e4697faa4c5917c89f97a2361 + languageName: node + linkType: hard + "unplugin@npm:^1.3.1": version: 1.16.1 resolution: "unplugin@npm:1.16.1" From 60ca5fb3bafbfb9e1bf4d11d6de445da9c4887dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 07:58:09 +0000 Subject: [PATCH 146/312] chore(deps): update dependency vite to v7.1.11 [security] 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 392049c01e..5503cd4c18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -49301,8 +49301,8 @@ __metadata: linkType: hard "vite@npm:^7.1.5": - version: 7.1.5 - resolution: "vite@npm:7.1.5" + version: 7.2.6 + resolution: "vite@npm:7.2.6" dependencies: esbuild: "npm:^0.25.0" fdir: "npm:^6.5.0" @@ -49351,7 +49351,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/59edeef7e98757a668b2ad8a1731a5657fa83e22a165a36b7359225ea98a9be39b2f486710c0cf5085edb85daee7c8b6b6b0bd85d0ef32a1aa84aef71aabd0f0 + checksum: 10/c640ed9c91957749287af2f483f5b5024a56718ba7cf32b0e2c398772fdf7fdb9fd5f97665c41712d4e9422c14009e283d0b69ac1b64b4f91474625bebe324de languageName: node linkType: hard From 18bdeebf7421e804d0435dc6bd1df4fba2233505 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:09:05 +0000 Subject: [PATCH 147/312] chore(deps): update dependency yaml to v2.8.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 2091755dc6..8dd3168360 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50205,11 +50205,11 @@ __metadata: linkType: hard "yaml@npm:^2.0.0, yaml@npm:^2.0.0-10, yaml@npm:^2.1.1, yaml@npm:^2.2.1, yaml@npm:^2.2.2, yaml@npm:^2.3.2, yaml@npm:^2.3.3, yaml@npm:^2.3.4, yaml@npm:^2.7.0, yaml@npm:^2.8.1": - version: 2.8.1 - resolution: "yaml@npm:2.8.1" + version: 2.8.2 + resolution: "yaml@npm:2.8.2" bin: yaml: bin.mjs - checksum: 10/eae07b3947d405012672ec17ce27348aea7d1fa0534143355d24a43a58f5e05652157ea2182c4fe0604f0540be71f99f1173f9d61018379404507790dff17665 + checksum: 10/4eab0074da6bc5a5bffd25b9b359cf7061b771b95d1b3b571852098380db3b1b8f96e0f1f354b56cc7216aa97cea25163377ccbc33a2e9ce00316fe8d02f4539 languageName: node linkType: hard From 4f8ace7e24b10b2cbed6f4c1b37d4492523b3a0b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:13:18 +0000 Subject: [PATCH 148/312] chore(deps): update dependency swagger-ui-react to v5.30.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 598 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 336 insertions(+), 262 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2091755dc6..384e988158 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2764,7 +2764,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.28.4, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.28.4 resolution: "@babel/runtime@npm:7.28.4" checksum: 10/6c9a70452322ea80b3c9b2a412bcf60771819213a67576c8cec41e88a95bb7bf01fc983754cda35dc19603eef52df22203ccbf7777b9d6316932f9fb77c25163 @@ -19100,331 +19100,331 @@ __metadata: languageName: node linkType: hard -"@swagger-api/apidom-ast@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ast@npm:1.0.0-beta.48" +"@swagger-api/apidom-ast@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ast@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" unraw: "npm:^3.0.0" - checksum: 10/b3f2b91df2b9116db318ce44551d3846453b7d9f17eb809c19890ecbbc17166ad6a1fa54698b79e85600960e2f1dd2ea56487d9a50537ee362a1a9dd63f91840 + checksum: 10/77be60bd4085525de506eb31a4f67de7850296534b98cb981db5a9e3ac8ebe07b92cb6ff8edacc5f199373f8dab9bc845b6695ae4a40dc15d0e05a05c8b3041f languageName: node linkType: hard -"@swagger-api/apidom-core@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-core@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-core@npm:1.0.0-beta.48" +"@swagger-api/apidom-core@npm:^1.0.0-rc.1, @swagger-api/apidom-core@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-core@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ast": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" minim: "npm:~0.23.8" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" short-unique-id: "npm:^5.3.2" ts-mixer: "npm:^6.0.3" - checksum: 10/abf7328a4d821f6083daa80fe1e719511825ff855dc4be59a4147a100c1ae34254cba4050ecc29e5147877f7e9d797681e96931da0ce432c310aaae82cd5a371 + checksum: 10/73763b2888aa1e7642dd08192fa91a6c5049575856bb6916333bf194f1798706b424e38efd39d9729ce95ec1fe545407c6ec3a9212e360d57af02f003f077643 languageName: node linkType: hard -"@swagger-api/apidom-error@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-error@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-error@npm:1.0.0-beta.48" +"@swagger-api/apidom-error@npm:^1.0.0-rc.1, @swagger-api/apidom-error@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-error@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.20.7" - checksum: 10/ce6461f5b06a6297074949d1aabd605c272c3061241e4d47f3720707ac8bc41c272deed033ae131fb5620bd6d709e0744275353ed490f7eca81f75db94abfc7e + checksum: 10/dfbc2e9d570eb15e925a4eb0dd4e59f8d5a01cfda4a78dd83320c71f3406082b73a6ea2b61229730a3830a707fdb94b17b3b0cb0ffaf45699917434b36971409 languageName: node linkType: hard -"@swagger-api/apidom-json-pointer@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-json-pointer@npm:1.0.0-beta.48" +"@swagger-api/apidom-json-pointer@npm:^1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-rc.1, @swagger-api/apidom-json-pointer@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-json-pointer@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" "@swaggerexpert/json-pointer": "npm:^2.10.1" - checksum: 10/2075f4d64813128ee80da21f16fd96bc51cf232505d920fc77af86acd2ea1db342936753b824153b232e9522d4a7f389fd870afdf3518b0af91f497119b6e1c5 + checksum: 10/cd8ea73069934422a7c48a3ca6a61201e3acfc35cd8cb8df016c4bcfb655b6ba21abee5011edbe4cc1fa83076e1d1c3031d8e9384b3e0b2e6e0b103fa3ea96cc languageName: node linkType: hard -"@swagger-api/apidom-ns-api-design-systems@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-api-design-systems@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-api-design-systems@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-api-design-systems@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/48e6a4f323572715f8990f83f6a1617af9d7ca0c6cd0e08f9b05c6f178664da233498c7c2461f636a97a525aaa60748c1da2a8d949ed43a7a14c1639d382f737 + checksum: 10/e30c5da34485eeb62be9b37ccc58bc11d2f4559799369a391157c42b2ff5bbb46e9a931b9e0dcd856912ad4078bc2631f6b272464e77709fdfd8c1725c780d3f languageName: node linkType: hard -"@swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-arazzo-1@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-rc.0, @swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-arazzo-1@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/3b9f60ec9ca9dccc5e3d46a48a6d7b30915294bdb7dc6ee481aae57de707485885f887ad9b9daec469712c087e6d74ed748ac8d748ed6d19cb1fb6219141bb12 + checksum: 10/4c56afb584d79e7be530b5aba31cf4556d5fbefeafcd8d25c03fa74d895bafb99e8c9d266c3b09f06758c7bbcff6a1367105240e238cd56312e83e1f8393430c languageName: node linkType: hard -"@swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-rc.0, @swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/99bcd30eb7c14334b2ebe3adfdb7ad8cf93d9565fc72217863a82b1ba48d4b5839b639964cf830bf9ba64c41c7a7d7eedeb53d8d28e5379bde1fafa8b424ab02 + checksum: 10/94ea647db429877c914dc6449165570ea13233d81f9b3b28f6d5d035b7cccdd53f7bf50279ad97b42a91f20d109d50a040e32fa571b1a1f5793e339e4426c6db languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-2019-09@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-json-schema-2019-09@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-json-schema-2019-09@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-json-schema-2019-09@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/bed0ed8b2ef35def9da2b8cebb31dba0d83fab88a38ab1a1af4760d370f5b3d0a1dfda7f1f1991204eab97531ddc90c70c153cb3ba9a7a5b93be93f02d873097 + checksum: 10/8760f7252a31eaed22417f3f181e1f29f25c9100044a78b4f1c3690ddc6402845ba5c90ee98297dc56f7b3d3758c4fb086c53c204b7d1c8f87faebdf57654ea5 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-2020-12@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-json-schema-2020-12@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-json-schema-2020-12@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-json-schema-2020-12@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-2019-09": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-2019-09": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/6bfad975a9db33224bc980edafab8e39218d6eb0acc384881ba14b35061d2c51b45f3e778529f5cf5875330501c892f433319dc4613a2d08ae22cf33f832d91e + checksum: 10/05d31abb732435cfbdc6cc46332f4a2d90462e11c103fefa22f669827c99916363bc569adce0fcbbe52c51061c490006f8ca20bd1420ecfea680ad35589f8390 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-4@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-json-schema-draft-4@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ast": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/860c09c46b6ef274afeaf4fb5aa0445dd9d394fb81f3d251d34c484ce31ca568e8d8e63acdfd207180dc28ac1a6fe082fe7139dbe1aadac2e5b81f42f80aefcd + checksum: 10/37223af3cf5e6feff7021e40129eacda2f89f7a176466bfdef12f2785b8963a4583ff8466215af7b2f7508515c29baa86a549ee1449a7b40afee7c84c27f5ec8 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-6@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-json-schema-draft-6@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/418d8c1cf20cc12841ee1d7e17bc57cbfa296d7833d4f656c650fcb5ade4bd646088177c9cc1c682b2ebd80fb3713de02b8dc562d155e3874c482e9d0d4edcc2 + checksum: 10/9294144d88e1bac74f26c99c3b7b1a0dacdf5e7823360d6ae18918c67a20ae42b297c00b4d641a803bd90ad6c1e42390b4d1ef1de5916becead4fee1e4c0507c languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-7@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-json-schema-draft-7@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-draft-6": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-draft-6": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/6e683458465f221c490440f94a1d1328a39db87a27c257a5d700b2effc937b8568f98f5042d74f56fdf6692da4b4027074c33c59348199fc821c45de9598e473 + checksum: 10/53111c3c6f3ba7ae21863b70afdd0eeea4db9b571602c9ec79e4525aaaa83dde32907c8a05ce658e5244b4400ff554dc7aca9c73a9a1b91cfffecf0f09bf4f48 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-openapi-2@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-openapi-2@npm:^1.0.0-rc.0, @swagger-api/apidom-ns-openapi-2@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-openapi-2@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/768fb7ec2c8506857837975529f311fe28359dd56a836c3b3cb1685bed623c489b5327e5fe58a41e70235ba525ba6401cc32fc9bd50bc5ec1cc0baf6fe144900 + checksum: 10/42dbedf81c96c2e3e851b234777772e8662cf4957f3d1cc81dac0356a33840652e61011133fd404b0465f3a238451878cdb53182f9d295d53ff6a3e97ed94265 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/a005d660c2e476a3d1bb74da9a2efa7fb0a68b1f52ddbde01514f4db9ef14051833f55b001c812da44fce3445c145ce5fd62a137477a71a6bcad220115c1e440 + checksum: 10/91211128aa583a1d155789e4e7e5a5fc7a7adc1fc69f836e5b742168d7f60e2c3a961ab449b5cbf47c803e536cf3490ff4ce44608d9834c2d06eeb9eb0b3feef languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-1@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:1.0.0-beta.48" +"@swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-rc.1, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ast": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-json-pointer": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/3423b3d642487d562376a572dac31fec760d3a64fe8bb4065ee0634a340c418656b2ea9cfc484059db5105e7389c74ac32620413243990141a7bbdc2e7cb1062 + checksum: 10/11739023a16d5aa41766aa24d094799e41b80644b4129ea3df9d606343abc6215f0350062ccb709d5361b7f2e1f516d0f2fea7c53cd1a938b1d4c2f859ac1a4b languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/ac86988052a7ad9f03c389cef02b22da36d6cbaae6c670c7642615de7f6efe921b3991f14a55793f803e5b5cb9eb0bcda30857a70a0a0d1c31d8f2d8023e78c6 + checksum: 10/edb734b20658354c865cc6b12315450be0d7ac340fce80185cab8f476ae9ec8983d13042788132f24ff9b32c4edf292d28c1e88a1652b927ec6e6c4679f7cce1 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/c0c9f35707afe05c559c8edacc0f548d3916f8f0cb0b4800b441258cbd871ba5c8ed083758b82bbe2589f022964bcd199f8d839648a78e979c94234e7ff22a08 + checksum: 10/8477220d192b17eb165096cb8fe699d48b554f2eb0ef737218f7136100a2a3cb7dfbcbf954dab4244796d48d0e82154b0788cfd9fe36226dcc85b2a6e11f65f0 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/ec8bd9268b09d3446bb922d881ceab4f52164f995409a305dfa140b9c9790c2f75bf9d59bbc1d6859e1943bc1376ee72a6b7865eaf4b2043795c8576d489ce1b + checksum: 10/545d8883a0c5eedfd99c4a85347355865c701eed114cd75df54965174f07f2f4a884efd61e836d2168bc859dddfbbd168857dd0f3721b0d397f4c424bd0312ec languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/285a55e288475bd20a960fcc90d61bb0b29c8fc586a77ac3ba254c7eacc11db95a964648ae61e8deec20d90bfe32ea5eb11ec8857c6c4b44061c98045be75d5c + checksum: 10/acec60d1874d22990b021b64458f153c080a15239c84f1ed4a710ad7480d2a7c5a8c04cb895ae874e83bf467865abc6e93d30da2f58aee0921fcab375b4565f6 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/1011a2be2fd576013ae5b725592c49f99dc42c50127d2707dc48893a33eb94a3820f62be6650f5bcbdb987034b5ef150905415eb44c7384a3376da97982bc467 + checksum: 10/16303fe4e38f993e25ad96d11f28a5b1ff42dd75ca2401b85b17f7937bbdcf7fb645c96644d3a70bf1c79d615609df4526f073c26a7719b5a4c4de50bd21f51e languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/c6f28dc27fe796ef3c8440afaa3ce78163e1290fd3c73437541eb629b028d4552537fdeaf29cfd9415774ee2909321289f5c9eb4682e6c5cbf6981ddabaf78b5 + checksum: 10/0894af80561bf688bc8fa06bf21e19e6b1ad6dbbe7c2c1d8f3e449f63d8d2d6e437647def9ef92ca6044df4d46a75b9581297cae655e1489b50418ac3e8de90b languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-json@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-json@npm:^1.0.0-rc.0, @swagger-api/apidom-parser-adapter-json@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-json@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ast": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" node-gyp: "npm:latest" ramda: "npm:~0.30.0" @@ -19432,148 +19432,147 @@ __metadata: tree-sitter: "npm:=0.21.1" tree-sitter-json: "npm:=0.24.8" web-tree-sitter: "npm:=0.24.5" - checksum: 10/ddb74c62c2a28d359584d385027db17c9630186e6f007e28220379ac27b2875c236b5a748101ff0d46edc46a222287db3ba3e0f43345ce2cf978cda691879b04 + checksum: 10/7447cdc9e19a585e3e7275ae6a560c6ab137c39b5d5548bec4a1499b178d669cd78ed27d4b5f24187e1f09d840b5735ae01b24e6cfe7b0ed9920a587a9b16109 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/c5d4ebfa13c58487626a9b2764995f690db5bbe25de80212d9f216451b20716facb67f3fccae03ed986810d5ecb832756716ba86fcd506b1a3e974aa0e3117dc + checksum: 10/85f11179c6ebd7dbd7a99cf969e6c5b67ea0b95d64d8a41b83d87ea8db2ec95e23fd0481bbb365bbfedb5f8d7cdf6c193a8120562d9f104e1395272c52feca74 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/b2e2d71cbb862ec477ebdda8f0e71353c58cef40b1d709ab8cdcea364757f7ffd2643c13a8ff60d0993ffe6a9229deaba6654fea6f3a890730a0b598183de1db + checksum: 10/fa701aa34dfb6f8088a8b896ed4ee2dfdfbe0b0bab80914e8aa85594de1babce65cd37256d70bc6b46eaae726d9dcbe0f564fd6a8711c44997729b724c85adbf languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/a9db188dee99f38e0a91644362e87c526559ddfb35019ed69738a5bebdad645beab925f47d1f0ae2430ca10bd83f329a4007bb2b3b6d23c6fe32d23865fdd672 + checksum: 10/382a36f76315862ceeb15b4e16e01f3e8aaf9b846025653c6a8a81230e8ac05a93ae1f9f1ce1fea76ca7ee2a8c5f0577f33ae8913cfb02bac23fc74850c47d05 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/ed29926c1b08108cae294bc100fd279b555731ebc23edba2461e4817f82273003cf650f1eac0d1f2382ad590d76255e23ebf08438c3017ddcec7149e7140761d + checksum: 10/8236aea1dabe5d968a0111a196e7799ad20e3957583bf6f01bb63008ff8a0aa33db457133327be0db4d872a6a844e9cfc4c1962d3b23090a3588a0498ccec3ee languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/10d28a60ec9b4197d0c75bf05832c07fc1e8f61f72875ebe1baf328671c53499b51a9c065e1f0310c7c22aa6cb8f51ab2e8ba2692eee2b52f609982e8fe316c5 + checksum: 10/5286670c5c7b1fad5e97f0da88e40870ba98e2511334eb32c99d9b8d8059e6cc77b2ca6f3e539a9db2cd75809d2695c4000288f14a00d00a38107360ee85825c languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^1.0.0-rc.0": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-rc.4" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/2f31d09f7aba46b94ad2891097c3e2b880f6f76fab298dbcd794dd42c49fc0d9194f5a73abeb4f3140c4b53deff769f3eddbf16e70a9d764c36cdb24b4998071 + checksum: 10/bdce51f49c2784217237e667ddc4c111095ed7dd11cef94b3383ddf6a4a0e886492546a301aa803fdcfc7fb9923f5cdcfaba305cc98fcfeedd02d85e749a80f8 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.48": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:1.0.0-beta.48" +"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-rc.0, @swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-rc.4": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ast": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" "@tree-sitter-grammars/tree-sitter-yaml": "npm:=0.7.1" "@types/ramda": "npm:~0.30.0" - node-gyp: "npm:latest" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" tree-sitter: "npm:=0.22.4" web-tree-sitter: "npm:=0.24.5" - checksum: 10/c032b088ffef50e119fb9cb60e7a6edfc17ec09e40c6d5ee62f5561c4da806f29ef5ba850f701763c755491f323754c23bb5a07da0cbbd3ed7d673caf5364559 + checksum: 10/c47bf36c8c2cbb8e2a0004167199d1a79df2c9c3cb97e50d7e55c2aa869546ad4376e067593b045a71d92df708b96bdadc0e7878dc60e547b9345e54384fb096 languageName: node linkType: hard -"@swagger-api/apidom-reference@npm:>=1.0.0-beta.41 <1.0.0-rc.0": - version: 1.0.0-beta.48 - resolution: "@swagger-api/apidom-reference@npm:1.0.0-beta.48" +"@swagger-api/apidom-reference@npm:^1.0.0-rc.1": + version: 1.0.0-rc.4 + resolution: "@swagger-api/apidom-reference@npm:1.0.0-rc.4" dependencies: "@babel/runtime-corejs3": "npm:^7.26.10" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" - "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-arazzo-json-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-json-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.4" + "@swagger-api/apidom-json-pointer": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-2": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "npm:^1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-rc.0" "@types/ramda": "npm:~0.30.0" - axios: "npm:^1.9.0" + axios: "npm:^1.12.2" minimatch: "npm:^7.4.3" process: "npm:^0.11.10" ramda: "npm:~0.30.0" @@ -19619,7 +19618,7 @@ __metadata: optional: true "@swagger-api/apidom-parser-adapter-yaml-1-2": optional: true - checksum: 10/fd86401690a3992123783c1b6044cdbb4a36b75d437e2519f6ec092d1b03273be45e884fc426e27a9413484047d40f819751f4f7174d9625de8a52a28d2d9e35 + checksum: 10/0efab87df6254abb4259912e6f845420b9fbd33c6a0491fdba5c166f0fcee880bdcea898e03b92b20bb5bf6251047df986797f6471000633a7dd448968e1de50 languageName: node linkType: hard @@ -20717,7 +20716,7 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^3.0.4": +"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" dependencies: @@ -21355,6 +21354,13 @@ __metadata: languageName: node linkType: hard +"@types/prismjs@npm:^1.0.0": + version: 1.26.5 + resolution: "@types/prismjs@npm:1.26.5" + checksum: 10/617099479db9550119d0f84272dc79d64b2cf3e0d7a17167fe740d55fdf0f155697d935409464392d164e62080c2c88d649cf4bc4fdd30a87127337536657277 + languageName: node + linkType: hard + "@types/promise.allsettled@npm:^1.0.3": version: 1.0.6 resolution: "@types/promise.allsettled@npm:1.0.6" @@ -24750,7 +24756,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:1.13.2, axios@npm:^1.0.0, axios@npm:^1.11.0, axios@npm:^1.13.0, axios@npm:^1.7.4, axios@npm:^1.9.0": +"axios@npm:1.13.2, axios@npm:^1.0.0, axios@npm:^1.11.0, axios@npm:^1.12.2, axios@npm:^1.13.0, axios@npm:^1.7.4": version: 1.13.2 resolution: "axios@npm:1.13.2" dependencies: @@ -25985,6 +25991,13 @@ __metadata: languageName: node linkType: hard +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 10/7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 + languageName: node + linkType: hard + "character-entities@npm:^1.0.0": version: 1.2.4 resolution: "character-entities@npm:1.2.4" @@ -28720,15 +28733,15 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:=3.2.4": - version: 3.2.4 - resolution: "dompurify@npm:3.2.4" +"dompurify@npm:=3.2.6": + version: 3.2.6 + resolution: "dompurify@npm:3.2.6" dependencies: "@types/trusted-types": "npm:^2.0.7" dependenciesMeta: "@types/trusted-types": optional: true - checksum: 10/98570c53385518a2f9b617f796926338856acfdd3369c88b5905bddf96bd7d391bf8a5433127155e0046e6faa2bfb767185fcd571b865dfabe624c099e2537f5 + checksum: 10/b91631ed0e4d17fae950ef53613cc009ed7e73adc43ac94a41dd52f35483f7538d13caebdafa7626e0da145fc8184e7ac7935f14f25b7e841b32fda777e40447 languageName: node linkType: hard @@ -32702,6 +32715,15 @@ __metadata: languageName: node linkType: hard +"hast-util-parse-selector@npm:^4.0.0": + version: 4.0.0 + resolution: "hast-util-parse-selector@npm:4.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10/76087670d3b0b50b23a6cb70bca53a6176d6608307ccdbb3ed18b650b82e7c3513bfc40348f1389dc0c5ae872b9a768851f4335f44654abd7deafd6974c52402 + languageName: node + linkType: hard + "hast-util-whitespace@npm:^2.0.0": version: 2.0.0 resolution: "hast-util-whitespace@npm:2.0.0" @@ -32722,6 +32744,19 @@ __metadata: languageName: node linkType: hard +"hastscript@npm:^9.0.0": + version: 9.0.1 + resolution: "hastscript@npm:9.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-parse-selector: "npm:^4.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + checksum: 10/9aa8135faf0307807cca4075bef4e3403ae1ce959ad4b9e6720892ba957d58ff98b2f60b5eb3ac67d88ae897dc918997299cd4249d7ac602a0066dd46442c5d4 + languageName: node + linkType: hard + "he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -35365,14 +35400,14 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:=4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" +"js-yaml@npm:=4.1.1, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1": + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 + checksum: 10/a52d0519f0f4ef5b4adc1cde466cb54c50d56e2b4a983b9d5c9c0f2f99462047007a6274d7e95617a21d3c91fde3ee6115536ed70991cd645ba8521058b78f77 languageName: node linkType: hard @@ -35388,17 +35423,6 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1": - version: 4.1.1 - resolution: "js-yaml@npm:4.1.1" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10/a52d0519f0f4ef5b4adc1cde466cb54c50d56e2b4a983b9d5c9c0f2f99462047007a6274d7e95617a21d3c91fde3ee6115536ed70991cd645ba8521058b78f77 - languageName: node - linkType: hard - "js-yaml@npm:~3.13.1": version: 3.13.1 resolution: "js-yaml@npm:3.13.1" @@ -40813,6 +40837,21 @@ __metadata: languageName: node linkType: hard +"parse-entities@npm:^4.0.0": + version: 4.0.2 + resolution: "parse-entities@npm:4.0.2" + dependencies: + "@types/unist": "npm:^2.0.0" + character-entities-legacy: "npm:^3.0.0" + character-reference-invalid: "npm:^2.0.0" + decode-named-character-reference: "npm:^1.0.0" + is-alphanumerical: "npm:^2.0.0" + is-decimal: "npm:^2.0.0" + is-hexadecimal: "npm:^2.0.0" + checksum: 10/b0ce693d0b3d7ed1cea6fe814e6e077c71532695f01178e846269e9a2bc2f7ff34ca4bb8db80b48af0451100f25bb010df6591c9bb6306e4680ccb423d1e4038 + languageName: node + linkType: hard + "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -42457,6 +42496,13 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^7.0.0": + version: 7.1.0 + resolution: "property-information@npm:7.1.0" + checksum: 10/896d38a52ad7170de73f832d277c69e76a9605d941ebb3f0d6e56271414a7fdf95ff6d2819e68036b8a0c7d2d4d88bf1d4a5765c032cb19c2343567ee3a14b15 + languageName: node + linkType: hard + "proto3-json-serializer@npm:^2.0.2": version: 2.0.2 resolution: "proto3-json-serializer@npm:2.0.2" @@ -43622,7 +43668,7 @@ __metadata: languageName: node linkType: hard -"react-syntax-highlighter@npm:^15.4.5, react-syntax-highlighter@npm:^15.6.1": +"react-syntax-highlighter@npm:^15.4.5": version: 15.6.6 resolution: "react-syntax-highlighter@npm:15.6.6" dependencies: @@ -43638,6 +43684,22 @@ __metadata: languageName: node linkType: hard +"react-syntax-highlighter@npm:^16.0.0": + version: 16.1.0 + resolution: "react-syntax-highlighter@npm:16.1.0" + dependencies: + "@babel/runtime": "npm:^7.28.4" + highlight.js: "npm:^10.4.1" + highlightjs-vue: "npm:^1.0.0" + lowlight: "npm:^1.17.0" + prismjs: "npm:^1.30.0" + refractor: "npm:^5.0.0" + peerDependencies: + react: ">= 0.14.0" + checksum: 10/d55bc96802357de2102703fb3ffe86a67d52099e93da9624a900609e4d8b6f5f95472d42423951631348fdee2679d661b17aaf41039035dc3f1bbabf0423d62e + languageName: node + linkType: hard + "react-test-renderer@npm:^16.13.1": version: 16.14.0 resolution: "react-test-renderer@npm:16.14.0" @@ -44031,6 +44093,18 @@ __metadata: languageName: node linkType: hard +"refractor@npm:^5.0.0": + version: 5.0.0 + resolution: "refractor@npm:5.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/prismjs": "npm:^1.0.0" + hastscript: "npm:^9.0.0" + parse-entities: "npm:^4.0.0" + checksum: 10/a14ceb938ed6f7f17dfa44660d3f3aff33e8896710bd76af0b411778791918bf20f923a191ff197fbc6a8e3f06c4371b83882f46ce76736f804dbe2b82b0be94 + languageName: node + linkType: hard + "regenerator-runtime@npm:^0.10.5": version: 0.10.5 resolution: "regenerator-runtime@npm:0.10.5" @@ -46992,17 +47066,17 @@ __metadata: languageName: node linkType: hard -"swagger-client@npm:^3.35.5": - version: 3.35.6 - resolution: "swagger-client@npm:3.35.6" +"swagger-client@npm:^3.36.0": + version: 3.36.0 + resolution: "swagger-client@npm:3.36.0" dependencies: "@babel/runtime-corejs3": "npm:^7.22.15" "@scarf/scarf": "npm:=1.4.0" - "@swagger-api/apidom-core": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" - "@swagger-api/apidom-error": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" - "@swagger-api/apidom-json-pointer": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-3-1": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" - "@swagger-api/apidom-reference": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-core": "npm:^1.0.0-rc.1" + "@swagger-api/apidom-error": "npm:^1.0.0-rc.1" + "@swagger-api/apidom-json-pointer": "npm:^1.0.0-rc.1" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-rc.1" + "@swagger-api/apidom-reference": "npm:^1.0.0-rc.1" "@swaggerexpert/cookie": "npm:^2.0.2" deepmerge: "npm:~4.3.0" fast-json-patch: "npm:^3.0.0-1" @@ -47014,13 +47088,13 @@ __metadata: openapi-server-url-templating: "npm:^1.3.0" ramda: "npm:^0.30.1" ramda-adjunct: "npm:^5.1.0" - checksum: 10/fb6582dc45c2ae6a26ae4cc80f0a3d97e31f3b058676951f93670828f2f30f5d44ecd7c029465f5452b251a533be329a955c92cec11be7128baa5e2e963e6f9d + checksum: 10/ea69e017cf266b44e2ef8e01a862975789bc62a537ab28baffb80b51d99640e35fac44eea5b744e98d0f6151fa290a09f840a5ad3f0103ead508e628b10dbc7b languageName: node linkType: hard "swagger-ui-react@npm:^5.27.1": - version: 5.29.0 - resolution: "swagger-ui-react@npm:5.29.0" + version: 5.30.3 + resolution: "swagger-ui-react@npm:5.30.3" dependencies: "@babel/runtime-corejs3": "npm:^7.27.1" "@scarf/scarf": "npm:=1.4.0" @@ -47029,11 +47103,11 @@ __metadata: classnames: "npm:^2.5.1" css.escape: "npm:1.5.1" deep-extend: "npm:0.6.0" - dompurify: "npm:=3.2.4" + dompurify: "npm:=3.2.6" ieee754: "npm:^1.2.1" immutable: "npm:^3.x.x" js-file-download: "npm:^0.4.12" - js-yaml: "npm:=4.1.0" + js-yaml: "npm:=4.1.1" lodash: "npm:^4.17.21" prop-types: "npm:^15.8.1" randexp: "npm:^0.5.3" @@ -47044,14 +47118,14 @@ __metadata: react-immutable-pure-component: "npm:^2.2.0" react-inspector: "npm:^6.0.1" react-redux: "npm:^9.2.0" - react-syntax-highlighter: "npm:^15.6.1" + react-syntax-highlighter: "npm:^16.0.0" redux: "npm:^5.0.1" redux-immutable: "npm:^4.0.0" remarkable: "npm:^2.0.1" reselect: "npm:^5.1.1" serialize-error: "npm:^8.1.0" sha.js: "npm:^2.4.12" - swagger-client: "npm:^3.35.5" + swagger-client: "npm:^3.36.0" url-parse: "npm:^1.5.10" xml: "npm:=1.0.1" xml-but-prettier: "npm:^1.0.1" @@ -47059,7 +47133,7 @@ __metadata: peerDependencies: react: ">=16.8.0 <20" react-dom: ">=16.8.0 <20" - checksum: 10/994a7b06b17fe12693a7a09057161723f5e2ab2c80c747879951a54f0d7a0cd4c65c139bdaf229f13d61f5dd61c2b63218881fc23081ced0cc91745b48d806d5 + checksum: 10/6f466414072806e60a3e36d58029b0679cd80cd9488e79a2142bebcd0829efa587f1b3249c2feab3ab692b3a70f5b90038f3fd14430f8ae41c6ec904f8041f79 languageName: node linkType: hard From bd8d1cd8bdf06eb45c9d196271d6968059dd4651 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 09:13:22 +0000 Subject: [PATCH 149/312] chore(deps): update dependency swr to v2.3.7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 40ad5339bb..a2cb34a805 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47150,14 +47150,14 @@ __metadata: linkType: hard "swr@npm:^2.0.0, swr@npm:^2.2.5": - version: 2.2.5 - resolution: "swr@npm:2.2.5" + version: 2.3.7 + resolution: "swr@npm:2.3.7" dependencies: - client-only: "npm:^0.0.1" - use-sync-external-store: "npm:^1.2.0" + dequal: "npm:^2.0.3" + use-sync-external-store: "npm:^1.4.0" peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: 10/f02b3bd5a198a0f62f9a53d7c0528c4a58aa61a43310bea169614b6e873dadb52599e856ef0775405b6aa7409835343da0cf328948aa892aa309bf4b7e7d6902 + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/a7a9f141ea31146f2787c36854ca0998f65d38503fe73fc3c0695ebba37821487eb43e62cece15d1739bc531e8430c15ac5f6ea695293e861fdbc2de92514d96 languageName: node linkType: hard @@ -49138,7 +49138,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:^1.4.0": +"use-sync-external-store@npm:^1.4.0": version: 1.4.0 resolution: "use-sync-external-store@npm:1.4.0" peerDependencies: From 1afb3c29c11d220fe3ea0a3ae3b2bad6f8335288 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 09:13:59 +0000 Subject: [PATCH 150/312] chore(deps): update dependency testcontainers to v10.28.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 74 +++++++++++++++++-------------------------------------- 1 file changed, 23 insertions(+), 51 deletions(-) diff --git a/yarn.lock b/yarn.lock index 40ad5339bb..768d81e332 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20514,14 +20514,14 @@ __metadata: languageName: node linkType: hard -"@types/dockerode@npm:^3.3.29": - version: 3.3.38 - resolution: "@types/dockerode@npm:3.3.38" +"@types/dockerode@npm:^3.3.35": + version: 3.3.47 + resolution: "@types/dockerode@npm:3.3.47" dependencies: "@types/docker-modem": "npm:*" "@types/node": "npm:*" "@types/ssh2": "npm:*" - checksum: 10/439a2b905c44bac063ba707f01a35594eb1e44aba8d22d4a8029fd2c5e192d70eae1efe270f85633f4b178fe4223419e14d81b1227a5a6e1ed00fca48c8495dd + checksum: 10/b840ae7872398a3b02e5789006a69d0cf5bb7ec6c0eb714c7ca04ca093add8de4cd06204ecd8f01388e347e62927cf4c599e8b7dba53e81c1350910da766d517 languageName: node linkType: hard @@ -28569,18 +28569,6 @@ __metadata: languageName: node linkType: hard -"docker-modem@npm:^3.0.0": - version: 3.0.3 - resolution: "docker-modem@npm:3.0.3" - dependencies: - debug: "npm:^4.1.1" - readable-stream: "npm:^3.5.0" - split-ca: "npm:^1.0.1" - ssh2: "npm:^1.4.0" - checksum: 10/266030d49961a82810152150b13be459490eabb00ca319786930a31ca4a0491bf1ea89ac43b7972a7dbc807e1f73b92bb482be0682247cbf1180b58b80fc08d7 - languageName: node - linkType: hard - "docker-modem@npm:^5.0.6": version: 5.0.6 resolution: "docker-modem@npm:5.0.6" @@ -28593,18 +28581,7 @@ __metadata: languageName: node linkType: hard -"dockerode@npm:^3.3.5": - version: 3.3.5 - resolution: "dockerode@npm:3.3.5" - dependencies: - "@balena/dockerignore": "npm:^1.0.2" - docker-modem: "npm:^3.0.0" - tar-fs: "npm:~2.0.1" - checksum: 10/1748e8d96f88fe71bb165a4c05726904937f5863b69eaeb4a3c1bb3bbf66940c7bef13b349ff757dc43664b4367611aab76f35c1ba468f07dcbaba567e6acd88 - languageName: node - linkType: hard - -"dockerode@npm:^4.0.0": +"dockerode@npm:^4.0.0, dockerode@npm:^4.0.5": version: 4.0.9 resolution: "dockerode@npm:4.0.9" dependencies: @@ -31851,6 +31828,13 @@ __metadata: languageName: node linkType: hard +"get-port@npm:^7.1.0": + version: 7.1.0 + resolution: "get-port@npm:7.1.0" + checksum: 10/f4d23b43026124007663a899578cc87ff37bfcf645c5c72651e9810ebafc759857784e409fb8e0ada9b90e5c5db089b0ae2f5f6b49fba1ce2e0aff86094ab17d + languageName: node + linkType: hard + "get-proto@npm:^1.0.1": version: 1.0.1 resolution: "get-proto@npm:1.0.1" @@ -47201,7 +47185,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^3.0.6, tar-fs@npm:^3.0.9": +"tar-fs@npm:^3.0.7, tar-fs@npm:^3.0.9": version: 3.1.1 resolution: "tar-fs@npm:3.1.1" dependencies: @@ -47218,19 +47202,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:~2.0.1": - version: 2.0.1 - resolution: "tar-fs@npm:2.0.1" - dependencies: - chownr: "npm:^1.1.1" - mkdirp-classic: "npm:^0.5.2" - pump: "npm:^3.0.0" - tar-stream: "npm:^2.0.0" - checksum: 10/85ceac6fce0e9175b5b67c0eca8864b7d29a940cae8b7657c60b66e8a252319d701c3df12814162a6839e6120f9e1975757293bdeaf294ad5b15721d236c4d32 - languageName: node - linkType: hard - -"tar-stream@npm:^2.0.0, tar-stream@npm:^2.0.1, tar-stream@npm:^2.1.4": +"tar-stream@npm:^2.0.1, tar-stream@npm:^2.1.4": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" dependencies: @@ -47427,25 +47399,25 @@ __metadata: linkType: hard "testcontainers@npm:^10.0.0": - version: 10.14.0 - resolution: "testcontainers@npm:10.14.0" + version: 10.28.0 + resolution: "testcontainers@npm:10.28.0" dependencies: "@balena/dockerignore": "npm:^1.0.2" - "@types/dockerode": "npm:^3.3.29" + "@types/dockerode": "npm:^3.3.35" archiver: "npm:^7.0.1" async-lock: "npm:^1.4.1" byline: "npm:^5.0.0" debug: "npm:^4.3.5" docker-compose: "npm:^0.24.8" - dockerode: "npm:^3.3.5" - get-port: "npm:^5.1.1" + dockerode: "npm:^4.0.5" + get-port: "npm:^7.1.0" proper-lockfile: "npm:^4.1.2" properties-reader: "npm:^2.3.0" ssh-remote-port-forward: "npm:^1.0.4" - tar-fs: "npm:^3.0.6" + tar-fs: "npm:^3.0.7" tmp: "npm:^0.2.3" - undici: "npm:^5.28.4" - checksum: 10/09d983b4881a6460c9167c25a0367569feefcf89f69557511c07a0d0d89be5be2e3509c0b1fe0b8c6fae80d163064eefb71d691e1a0b33465b0e8ab5c7fb5313 + undici: "npm:^5.29.0" + checksum: 10/434d3677e10a114805420f2420831a8eae4091acdaf242787fb100a8755140af0e11eab3932cdb29267f0869af22d0b572532f72ee5450d60f63f3fed30d098c languageName: node linkType: hard @@ -48618,7 +48590,7 @@ __metadata: languageName: node linkType: hard -"undici@npm:^5.28.2, undici@npm:^5.28.4": +"undici@npm:^5.28.2, undici@npm:^5.29.0": version: 5.29.0 resolution: "undici@npm:5.29.0" dependencies: From d37abcc257468981025645fece4d4a2d41b58f24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 10:07:51 +0000 Subject: [PATCH 151/312] chore(deps): update dependency ts-checker-rspack-plugin to v1.2.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 79 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/yarn.lock b/yarn.lock index a30a1db2e0..0f910f4340 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10290,12 +10290,12 @@ __metadata: languageName: node linkType: hard -"@jsonjoy.com/buffers@npm:^1.0.0": - version: 1.0.0 - resolution: "@jsonjoy.com/buffers@npm:1.0.0" +"@jsonjoy.com/buffers@npm:^1.0.0, @jsonjoy.com/buffers@npm:^1.2.0": + version: 1.2.1 + resolution: "@jsonjoy.com/buffers@npm:1.2.1" peerDependencies: tslib: 2 - checksum: 10/3347a16a555398c19265203877b8e325be5facc1d875c0e85db0cc20b53418302257ed5af15bf53b84ff8337bd024a10be25ff3a02ebc54ae8e643577ca29e63 + checksum: 10/8ef4784d05c0fb4d0f27a1f78f5b0ae1f3b537d237f978d10be0b88f59a534ae44db2a4bde28eee0eb461ede31dc194aab5927ac001ed2b764629fa43ae9b60b languageName: node linkType: hard @@ -10308,35 +10308,37 @@ __metadata: languageName: node linkType: hard -"@jsonjoy.com/json-pack@npm:^1.0.3": - version: 1.10.0 - resolution: "@jsonjoy.com/json-pack@npm:1.10.0" +"@jsonjoy.com/json-pack@npm:^1.11.0": + version: 1.21.0 + resolution: "@jsonjoy.com/json-pack@npm:1.21.0" dependencies: "@jsonjoy.com/base64": "npm:^1.1.2" - "@jsonjoy.com/buffers": "npm:^1.0.0" + "@jsonjoy.com/buffers": "npm:^1.2.0" "@jsonjoy.com/codegen": "npm:^1.0.0" - "@jsonjoy.com/json-pointer": "npm:^1.0.1" + "@jsonjoy.com/json-pointer": "npm:^1.0.2" "@jsonjoy.com/util": "npm:^1.9.0" hyperdyperid: "npm:^1.2.0" thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" peerDependencies: tslib: 2 - checksum: 10/5ad1eb008cf5f681dbc1301f5a7c33ca3a101d22773dbd2a9db4b02e5847c2f8b0c5f074c69f4ced5c24b3dc1dd85ddbc1688f0002fee9416869c579c34c4a8e + checksum: 10/138b7eb8c96e6e435b0218c8f2eb5554e4eb49198a8718673a65e81da53b4617553ffa7124b51d6ea00fdfb868d6ff8b5ad6365e8336380ca7025f04d0412ee7 languageName: node linkType: hard -"@jsonjoy.com/json-pointer@npm:^1.0.1": - version: 1.0.1 - resolution: "@jsonjoy.com/json-pointer@npm:1.0.1" +"@jsonjoy.com/json-pointer@npm:^1.0.2": + version: 1.0.2 + resolution: "@jsonjoy.com/json-pointer@npm:1.0.2" dependencies: - "@jsonjoy.com/util": "npm:^1.3.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/util": "npm:^1.9.0" peerDependencies: tslib: 2 - checksum: 10/ff15df95df38677a09fe2155cf4521844c9f0653c77a7090bb6e726d275fb78ab6c3543c4ebdc14aff07e44da08b1545631a63e42e217c18059194957e060ed9 + checksum: 10/f22baeb3abc8ace2d8902d06ec297343431d4486dcf399aaaffd26ace7e62e194fe0efb4b7880e45b3b7939224ee838d3213448ef654fc8a61c91a76fe994d94 languageName: node linkType: hard -"@jsonjoy.com/util@npm:^1.3.0, @jsonjoy.com/util@npm:^1.9.0": +"@jsonjoy.com/util@npm:^1.9.0": version: 1.9.0 resolution: "@jsonjoy.com/util@npm:1.9.0" dependencies: @@ -16969,7 +16971,7 @@ __metadata: languageName: node linkType: hard -"@rspack/lite-tapable@npm:1.1.0, @rspack/lite-tapable@npm:^1.0.1": +"@rspack/lite-tapable@npm:1.1.0, @rspack/lite-tapable@npm:^1.1.0": version: 1.1.0 resolution: "@rspack/lite-tapable@npm:1.1.0" checksum: 10/41ff73fe5e1b8dccaad746c9c1bd36dd67649e1ad35776f311b5ba94333a397704e11158579e25a6a7e677c51abe35e66987b1b000faef48d4e4ad2470fea150 @@ -32002,6 +32004,15 @@ __metadata: languageName: node linkType: hard +"glob-to-regex.js@npm:^1.0.1": + version: 1.2.0 + resolution: "glob-to-regex.js@npm:1.2.0" + peerDependencies: + tslib: 2 + checksum: 10/13034e642db479d75448bdd9f37de7451bef2879c394bfe3f8df6588e0479893e94059eaee77cdf50dce675607fb2395c132dcca0c9a559a6192e89b2ad0f134 + languageName: node + linkType: hard + "glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" @@ -37788,15 +37799,17 @@ __metadata: languageName: node linkType: hard -"memfs@npm:^4.28.0, memfs@npm:^4.6.0": - version: 4.36.0 - resolution: "memfs@npm:4.36.0" +"memfs@npm:^4.51.1, memfs@npm:^4.6.0": + version: 4.51.1 + resolution: "memfs@npm:4.51.1" dependencies: - "@jsonjoy.com/json-pack": "npm:^1.0.3" - "@jsonjoy.com/util": "npm:^1.3.0" - tree-dump: "npm:^1.0.1" + "@jsonjoy.com/json-pack": "npm:^1.11.0" + "@jsonjoy.com/util": "npm:^1.9.0" + glob-to-regex.js: "npm:^1.0.1" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.0.3" tslib: "npm:^2.0.0" - checksum: 10/4898187c3278bd127340ec3d6c51d1fa77faa50aad71a8a1e4b7c02abbccd8485dccc7f565291b386b0cc96e5ac06902e4645108fad44e458fe8c1dfee3caf42 + checksum: 10/a2f70cd1b366f910a39bb1a398c03d6f3f0db936376697eca3e176609e9f6acc0ed40fb44d6293dd15eb3f730c3fce536e5024395e3dc92f54374133c96ba1b7 languageName: node linkType: hard @@ -47787,12 +47800,12 @@ __metadata: languageName: node linkType: hard -"tree-dump@npm:^1.0.1": - version: 1.0.3 - resolution: "tree-dump@npm:1.0.3" +"tree-dump@npm:^1.0.3, tree-dump@npm:^1.1.0": + version: 1.1.0 + resolution: "tree-dump@npm:1.1.0" peerDependencies: tslib: 2 - checksum: 10/cf382e61cfb5e3ff8f03425b5bc1923e8f0e385b3a02f43d9d0a32d09da9984477e0f2a7698628662263d1d3f1af17e33486c77ff454978f0f9f07fb5d1fe9a2 + checksum: 10/2c20118d2671996aa6f1ba1310cef1404fb525bde5d989ab542013f62b23a3633c0f0b32cbd516ee6205051ec21912b2470dabca006d19c9eba0740b567e2b60 languageName: node linkType: hard @@ -47904,14 +47917,14 @@ __metadata: linkType: hard "ts-checker-rspack-plugin@npm:^1.1.5": - version: 1.1.5 - resolution: "ts-checker-rspack-plugin@npm:1.1.5" + version: 1.2.1 + resolution: "ts-checker-rspack-plugin@npm:1.2.1" dependencies: "@babel/code-frame": "npm:^7.27.1" - "@rspack/lite-tapable": "npm:^1.0.1" + "@rspack/lite-tapable": "npm:^1.1.0" chokidar: "npm:^3.6.0" is-glob: "npm:^4.0.3" - memfs: "npm:^4.28.0" + memfs: "npm:^4.51.1" minimatch: "npm:^9.0.5" picocolors: "npm:^1.1.1" peerDependencies: @@ -47920,7 +47933,7 @@ __metadata: peerDependenciesMeta: "@rspack/core": optional: true - checksum: 10/d43f87a5860f3b8f528bf8f43c78c2d958a18fa484d791a204047fc5672134fd689665021ee25b07f9f9d8c807cd291978f58b789bf531b4704a9a4e3ad84735 + checksum: 10/c2e4a4e0cfda6a358e2b3c134446359f74ed57787c23cb270ae6d72bfa1fae91e42968d04c9c5921a39c2995869a56fb8f3c8f906f24d7a94a33dca31ece2f22 languageName: node linkType: hard From 5a737e1cab7206a93bb52e50022bce630654170c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Dec 2025 10:11:54 +0100 Subject: [PATCH 152/312] Fix postgres 18 TestDatabases by pinning the data dir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/slimy-mugs-taste.md | 5 ++ .../scheduler/lib/TaskWorker.test.ts | 8 ++- packages/backend-test-utils/package.json | 2 +- .../src/database/postgres.ts | 6 +- yarn.lock | 58 +++++++++---------- 5 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 .changeset/slimy-mugs-taste.md diff --git a/.changeset/slimy-mugs-taste.md b/.changeset/slimy-mugs-taste.md new file mode 100644 index 0000000000..5773db6853 --- /dev/null +++ b/.changeset/slimy-mugs-taste.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Fix PostgreSQL 18 `TestDatabases` by pinning the data directory diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.test.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.test.ts index de1b6e4caf..5bd3fb38cb 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.test.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.test.ts @@ -46,7 +46,7 @@ describe('TaskWorker', () => { const settings: TaskSettingsV2 = { version: 2, cadence: '*/2 * * * * *', - initialDelayDuration: Duration.fromObject({ seconds: 1 }).toISO()!, + initialDelayDuration: Duration.fromObject({ seconds: 3 }).toISO()!, // over 1 second, to cover for 1-second granularity in some database timestamps timeoutAfterDuration: Duration.fromObject({ minutes: 1 }).toISO()!, }; @@ -65,7 +65,7 @@ describe('TaskWorker', () => { expect(JSON.parse(row.settings_json)).toEqual({ version: 2, cadence: '*/2 * * * * *', - initialDelayDuration: 'PT1S', + initialDelayDuration: 'PT3S', timeoutAfterDuration: 'PT1M', }); await expect(TaskWorker.taskStates(knex)).resolves.toEqual( @@ -80,6 +80,10 @@ describe('TaskWorker', () => { ]), ); + // Note that this is timing sensitive - if things take too long between + // persistTask and findReadyTask, this test will fail. We set some margin + // of initialDelayDuration to cover for this, but if this turns out to be + // flaky, we may have to revisit how this test is written. await expect(worker.findReadyTask()).resolves.toEqual({ result: 'not-ready-yet', }); diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 70e74df86b..cd4f68ead0 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -75,7 +75,7 @@ "mysql2": "^3.0.0", "pg": "^8.11.3", "pg-connection-string": "^2.3.0", - "testcontainers": "^10.0.0", + "testcontainers": "^11.9.0", "text-extensions": "^2.4.0", "uuid": "^11.0.0", "yn": "^4.0.0", diff --git a/packages/backend-test-utils/src/database/postgres.ts b/packages/backend-test-utils/src/database/postgres.ts index e6122b9ab7..d7238cb36a 100644 --- a/packages/backend-test-utils/src/database/postgres.ts +++ b/packages/backend-test-utils/src/database/postgres.ts @@ -77,7 +77,11 @@ export async function startPostgresContainer(image: string): Promise<{ const container = await new GenericContainer(image) .withExposedPorts(5432) - .withEnvironment({ POSTGRES_PASSWORD: password }) + .withEnvironment({ + // Since postgres 18, the default directory changed - so we pin it here + PGDATA: '/var/lib/postgresql/data', + POSTGRES_PASSWORD: password, + }) .withTmpFs({ '/var/lib/postgresql/data': 'rw' }) .start(); diff --git a/yarn.lock b/yarn.lock index a30a1db2e0..168fafd665 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3097,7 +3097,7 @@ __metadata: pg: "npm:^8.11.3" pg-connection-string: "npm:^2.3.0" supertest: "npm:^7.0.0" - testcontainers: "npm:^10.0.0" + testcontainers: "npm:^11.9.0" text-extensions: "npm:^2.4.0" uuid: "npm:^11.0.0" yn: "npm:^4.0.0" @@ -20514,7 +20514,7 @@ __metadata: languageName: node linkType: hard -"@types/dockerode@npm:^3.3.35": +"@types/dockerode@npm:^3.3.47": version: 3.3.47 resolution: "@types/dockerode@npm:3.3.47" dependencies: @@ -27963,7 +27963,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -28560,12 +28560,12 @@ __metadata: languageName: node linkType: hard -"docker-compose@npm:^0.24.8": - version: 0.24.8 - resolution: "docker-compose@npm:0.24.8" +"docker-compose@npm:^1.3.0": + version: 1.3.0 + resolution: "docker-compose@npm:1.3.0" dependencies: yaml: "npm:^2.2.2" - checksum: 10/2b8526f9797a55c819ff2d7dcea57085b012b3a3d77bc2e1a6b45c3fc9e82196312f5298cbe8299966462454a5ac8f68814bb407736b4385e0d226a2a39e877a + checksum: 10/7c1b395fc104031eadef08cac0c028af11fd9e3084265dca9e17bc76ad27c2bfe96d8b74df258bb64b198f9e0f1792a7f2c63123cddc0d60bb776f211d54cfb2 languageName: node linkType: hard @@ -28581,7 +28581,7 @@ __metadata: languageName: node linkType: hard -"dockerode@npm:^4.0.0, dockerode@npm:^4.0.5": +"dockerode@npm:^4.0.0, dockerode@npm:^4.0.9": version: 4.0.9 resolution: "dockerode@npm:4.0.9" dependencies: @@ -47185,7 +47185,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^3.0.7, tar-fs@npm:^3.0.9": +"tar-fs@npm:^3.0.9, tar-fs@npm:^3.1.1": version: 3.1.1 resolution: "tar-fs@npm:3.1.1" dependencies: @@ -47398,26 +47398,26 @@ __metadata: languageName: node linkType: hard -"testcontainers@npm:^10.0.0": - version: 10.28.0 - resolution: "testcontainers@npm:10.28.0" +"testcontainers@npm:^11.9.0": + version: 11.9.0 + resolution: "testcontainers@npm:11.9.0" dependencies: "@balena/dockerignore": "npm:^1.0.2" - "@types/dockerode": "npm:^3.3.35" + "@types/dockerode": "npm:^3.3.47" archiver: "npm:^7.0.1" async-lock: "npm:^1.4.1" byline: "npm:^5.0.0" - debug: "npm:^4.3.5" - docker-compose: "npm:^0.24.8" - dockerode: "npm:^4.0.5" + debug: "npm:^4.4.3" + docker-compose: "npm:^1.3.0" + dockerode: "npm:^4.0.9" get-port: "npm:^7.1.0" proper-lockfile: "npm:^4.1.2" properties-reader: "npm:^2.3.0" ssh-remote-port-forward: "npm:^1.0.4" - tar-fs: "npm:^3.0.7" - tmp: "npm:^0.2.3" - undici: "npm:^5.29.0" - checksum: 10/434d3677e10a114805420f2420831a8eae4091acdaf242787fb100a8755140af0e11eab3932cdb29267f0869af22d0b572532f72ee5450d60f63f3fed30d098c + tar-fs: "npm:^3.1.1" + tmp: "npm:^0.2.5" + undici: "npm:^7.16.0" + checksum: 10/974d729dfd2e511d8623f60629ddfb60446f6c0d0b9f41ac2db279fb94d89f6bc6bf7625734bff33c8d740886c3891cc29bda8f751edc46db6d42ca9212ba9fe languageName: node linkType: hard @@ -47639,10 +47639,10 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.3": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 10/7b13696787f159c9754793a83aa79a24f1522d47b87462ddb57c18ee93ff26c74cbb2b8d9138f571d2e0e765c728fb2739863a672b280528512c6d83d511c6fa +"tmp@npm:^0.2.5": + version: 0.2.5 + resolution: "tmp@npm:0.2.5" + checksum: 10/dd4b78b32385eab4899d3ae296007b34482b035b6d73e1201c4a9aede40860e90997a1452c65a2d21aee73d53e93cd167d741c3db4015d90e63b6d568a93d7ec languageName: node linkType: hard @@ -48590,7 +48590,7 @@ __metadata: languageName: node linkType: hard -"undici@npm:^5.28.2, undici@npm:^5.29.0": +"undici@npm:^5.28.2": version: 5.29.0 resolution: "undici@npm:5.29.0" dependencies: @@ -48599,10 +48599,10 @@ __metadata: languageName: node linkType: hard -"undici@npm:^7.2.3": - version: 7.9.0 - resolution: "undici@npm:7.9.0" - checksum: 10/fa92d3d9106612be566e79942174e00426c2e1f9a688fb86c8d1809c84a032c02fc57bd601d2051a45d94bbd312c50221644b58c8186c4f0d64f8ecc7f18b806 +"undici@npm:^7.16.0, undici@npm:^7.2.3": + version: 7.16.0 + resolution: "undici@npm:7.16.0" + checksum: 10/2bb71672b23d3dc0f56f1b7fb6c936e4487a350db46eaafc03f2f9107f99cdf8e51ecdd32e589e2381ef47a64b6369cfb31f328b2c3ea663023aa47bc5258b9e languageName: node linkType: hard From 203555047e7f4b336fef570b37199dd77513bcba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Dec 2025 11:29:14 +0100 Subject: [PATCH 153/312] remove kubecon note from readme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 545874adf9..e3e9bd77dd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -> [!NOTE] -> ✈️ From Monday November 10th through November 14rd, several maintainers and Spotify employees will be at KubeCon / BackstageCon! Expect the project to move a little slower than normal, and support to be limited. Normal service will resume after that! And do come visit our booth if you are there. ✈️ - [![headline](docs/assets/headline.png)](https://backstage.io/) # [Backstage](https://backstage.io) From b4e58d9aa334129ad5fc7d528703df140ff56ddd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 01:22:08 +0000 Subject: [PATCH 154/312] chore(deps): update dependency luxon to v3.7.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- microsite/yarn.lock | 12 ++++++------ yarn.lock | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index a3a9c92bdf..65a43f1742 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -3329,9 +3329,9 @@ __metadata: linkType: hard "@types/luxon@npm:^3.0.0": - version: 3.4.2 - resolution: "@types/luxon@npm:3.4.2" - checksum: 10/fd89566e3026559f2bc4ddcc1e70a2c16161905ed50be9473ec0cfbbbe919165041408c4f6e06c4bcf095445535052e2c099087c76b1b38e368127e618fc968d + version: 3.7.1 + resolution: "@types/luxon@npm:3.7.1" + checksum: 10/c7bc164c278393ea0be938f986c74b4cddfab9013b1aff4495b016f771ded1d5b7b7b4825b2c7f0b8799edce19c5f531c28ff434ab3dedf994ac2d99a20fd4c4 languageName: node linkType: hard @@ -8917,9 +8917,9 @@ __metadata: linkType: hard "luxon@npm:^3.0.0": - version: 3.5.0 - resolution: "luxon@npm:3.5.0" - checksum: 10/48f86e6c1c96815139f8559456a3354a276ba79bcef0ae0d4f2172f7652f3ba2be2237b0e103b8ea0b79b47715354ac9fac04eb1db3485dcc72d5110491dd47f + version: 3.7.2 + resolution: "luxon@npm:3.7.2" + checksum: 10/b24cd205ed306ce7415991687897dcc4027921ae413c9116590bc33a95f93b86ce52cf74ba72b4f5c5ab1c10090517f54ac8edfb127c049e0bf55b90dc2260be languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 1b379e92da..f58a11626b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21000,7 +21000,14 @@ __metadata: languageName: node linkType: hard -"@types/luxon@npm:^3.0.0, @types/luxon@npm:~3.4.0": +"@types/luxon@npm:^3.0.0": + version: 3.7.1 + resolution: "@types/luxon@npm:3.7.1" + checksum: 10/c7bc164c278393ea0be938f986c74b4cddfab9013b1aff4495b016f771ded1d5b7b7b4825b2c7f0b8799edce19c5f531c28ff434ab3dedf994ac2d99a20fd4c4 + languageName: node + linkType: hard + +"@types/luxon@npm:~3.4.0": version: 3.4.2 resolution: "@types/luxon@npm:3.4.2" checksum: 10/fd89566e3026559f2bc4ddcc1e70a2c16161905ed50be9473ec0cfbbbe919165041408c4f6e06c4bcf095445535052e2c099087c76b1b38e368127e618fc968d @@ -37242,7 +37249,14 @@ __metadata: languageName: node linkType: hard -"luxon@npm:^3.0.0, luxon@npm:^3.2.1, luxon@npm:^3.4.3, luxon@npm:^3.5.0, luxon@npm:~3.5.0": +"luxon@npm:^3.0.0, luxon@npm:^3.2.1, luxon@npm:^3.4.3, luxon@npm:^3.5.0": + version: 3.7.2 + resolution: "luxon@npm:3.7.2" + checksum: 10/b24cd205ed306ce7415991687897dcc4027921ae413c9116590bc33a95f93b86ce52cf74ba72b4f5c5ab1c10090517f54ac8edfb127c049e0bf55b90dc2260be + languageName: node + linkType: hard + +"luxon@npm:~3.5.0": version: 3.5.0 resolution: "luxon@npm:3.5.0" checksum: 10/48f86e6c1c96815139f8559456a3354a276ba79bcef0ae0d4f2172f7652f3ba2be2237b0e103b8ea0b79b47715354ac9fac04eb1db3485dcc72d5110491dd47f From 2b81751407b9c03206013b04c4193459dc653755 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:08:37 +0000 Subject: [PATCH 155/312] chore(deps): update dependency webpack to ~5.103.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-ea25c93.md | 5 + packages/cli/package.json | 4 +- yarn.lock | 166 ++++++++++++++------------------- 3 files changed, 77 insertions(+), 98 deletions(-) create mode 100644 .changeset/renovate-ea25c93.md diff --git a/.changeset/renovate-ea25c93.md b/.changeset/renovate-ea25c93.md new file mode 100644 index 0000000000..958e032b64 --- /dev/null +++ b/.changeset/renovate-ea25c93.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Updated dependency `webpack` to `~5.103.0`. diff --git a/packages/cli/package.json b/packages/cli/package.json index fc5e771d33..cecc05e6c2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -192,7 +192,7 @@ "msw": "^1.0.0", "nodemon": "^3.0.1", "terser-webpack-plugin": "^5.1.3", - "webpack": "~5.96.0", + "webpack": "~5.103.0", "webpack-dev-server": "^5.0.0" }, "peerDependencies": { @@ -203,7 +203,7 @@ "fork-ts-checker-webpack-plugin": "^9.0.0", "mini-css-extract-plugin": "^2.4.2", "terser-webpack-plugin": "^5.1.3", - "webpack": "~5.96.0", + "webpack": "~5.103.0", "webpack-dev-server": "^5.0.0" }, "peerDependenciesMeta": { diff --git a/yarn.lock b/yarn.lock index 1b379e92da..94191b9e59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3306,7 +3306,7 @@ __metadata: ts-morph: "npm:^24.0.0" undici: "npm:^7.2.3" util: "npm:^0.12.3" - webpack: "npm:~5.96.0" + webpack: "npm:~5.103.0" webpack-dev-server: "npm:^5.0.0" yaml: "npm:^2.0.0" yargs: "npm:^16.2.0" @@ -3322,7 +3322,7 @@ __metadata: fork-ts-checker-webpack-plugin: ^9.0.0 mini-css-extract-plugin: ^2.4.2 terser-webpack-plugin: ^5.1.3 - webpack: ~5.96.0 + webpack: ~5.103.0 webpack-dev-server: ^5.0.0 peerDependenciesMeta: "@module-federation/enhanced": @@ -20586,7 +20586,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": +"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5, @types/estree@npm:^1.0.8": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 @@ -22682,7 +22682,7 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.12.1, @webassemblyjs/ast@npm:^1.14.1": +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/ast@npm:1.14.1" dependencies: @@ -22768,7 +22768,7 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.12.1, @webassemblyjs/wasm-edit@npm:^1.14.1": +"@webassemblyjs/wasm-edit@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" dependencies: @@ -22809,7 +22809,7 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.12.1, @webassemblyjs/wasm-parser@npm:^1.14.1": +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" dependencies: @@ -25051,6 +25051,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.25": + version: 2.8.32 + resolution: "baseline-browser-mapping@npm:2.8.32" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10/d3223faeb8a5d5aa0c2aecc7ecff85e0f2452ba79f8a1ab170a828a1b0efd5eabf38a5264f8ea223cfdee526cf9df689cefbef2f4f22825fc462c37b3483c607 + languageName: node + linkType: hard + "basic-ftp@npm:^5.0.2": version: 5.0.3 resolution: "basic-ftp@npm:5.0.3" @@ -25477,17 +25486,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.16.0, browserslist@npm:^4.16.6, browserslist@npm:^4.18.1, browserslist@npm:^4.24.0": - version: 4.24.2 - resolution: "browserslist@npm:4.24.2" +"browserslist@npm:^4.0.0, browserslist@npm:^4.16.0, browserslist@npm:^4.16.6, browserslist@npm:^4.18.1, browserslist@npm:^4.24.0, browserslist@npm:^4.26.3": + version: 4.28.0 + resolution: "browserslist@npm:4.28.0" dependencies: - caniuse-lite: "npm:^1.0.30001669" - electron-to-chromium: "npm:^1.5.41" - node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.1" + baseline-browser-mapping: "npm:^2.8.25" + caniuse-lite: "npm:^1.0.30001754" + electron-to-chromium: "npm:^1.5.249" + node-releases: "npm:^2.0.27" + update-browserslist-db: "npm:^1.1.4" bin: browserslist: cli.js - checksum: 10/f8a9d78bbabe466c57ffd5c50a9e5582a5df9aa68f43078ca62a9f6d0d6c70ba72eca72d0a574dbf177cf55cdca85a46f7eb474917a47ae5398c66f8b76f7d1c + checksum: 10/59dc88f8d950e44a064361cb874f486e532a8ba932e0cf549aee8b36dd2b791da2bc11f36c1cf820ebb9c1f3250b100f8c56364dd6e86dbc90495af424100e19 languageName: node linkType: hard @@ -25907,10 +25917,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001669": - version: 1.0.30001717 - resolution: "caniuse-lite@npm:1.0.30001717" - checksum: 10/e47dfd8707ea305baa177f3d3d531df614f5a9ac6335363fc8f86f0be4caf79f5734f3f68b601fee4edd9d79f1e5ffc0931466bb894bf955ed6b1dd5a1c34b1d +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001754": + version: 1.0.30001759 + resolution: "caniuse-lite@npm:1.0.30001759" + checksum: 10/da0ec28dd993dffa99402914903426b9466d2798d41c1dc9341fcb7dd10f58fdd148122e2c65001246c030ba1c939645b7b4597f6321e3246dc792323bb11541 languageName: node linkType: hard @@ -28954,10 +28964,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.41": - version: 1.5.65 - resolution: "electron-to-chromium@npm:1.5.65" - checksum: 10/9d4e5609de75fc92aeff10976fd8fa2b9b6294edb3eb7c205e51e3e5f42c3d5f6d1e0323bb52ed4831121ee617962c9a8eafff5aee5651d33bee98677940b4be +"electron-to-chromium@npm:^1.5.249": + version: 1.5.263 + resolution: "electron-to-chromium@npm:1.5.263" + checksum: 10/c74c6fedc38a0a5d823f4ed168efb6961972a30df443caa44265c85231087936673cdfbccfa0c14ba6f1a0fd6c634ef43b046fbdd3cdfce6c73523408d86caee languageName: node linkType: hard @@ -29068,7 +29078,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.17.3, enhanced-resolve@npm:^5.18.0": +"enhanced-resolve@npm:^5.17.3, enhanced-resolve@npm:^5.18.0": version: 5.18.3 resolution: "enhanced-resolve@npm:5.18.3" dependencies: @@ -36628,10 +36638,10 @@ __metadata: languageName: node linkType: hard -"loader-runner@npm:^4.2.0": - version: 4.2.0 - resolution: "loader-runner@npm:4.2.0" - checksum: 10/89a648e0418f23edf2f310bf74a8adb0710548e8d8d47040def081e1b822bdc27b664b796ce43ceb7921fa56485e1f5046417e425714730dc6ea4242e7a176fa +"loader-runner@npm:^4.3.1": + version: 4.3.1 + resolution: "loader-runner@npm:4.3.1" + checksum: 10/d77127497c3f91fdba351e3e91156034e6e590e9f050b40df6c38ac16c54b5c903f7e2e141e09fefd046ee96b26fb50773c695ebc0aa205a4918683b124b04ba languageName: node linkType: hard @@ -39487,10 +39497,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10/241e5fa9556f1c12bafb83c6c3e94f8cf3d8f2f8f904906ecef6e10bcaa1d59aa61212d4651bec70052015fc54bd3fdcdbe7fc0f638a17e6685aa586c076ec4e +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10/f6c78ddb392ae500719644afcbe68a9ea533242c02312eb6a34e8478506eb7482a3fb709c70235b01c32fe65625b68dfa9665113f816d87f163bc3819b62b106 languageName: node linkType: hard @@ -45122,7 +45132,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -45133,15 +45143,15 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.2": - version: 4.3.2 - resolution: "schema-utils@npm:4.3.2" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": + version: 4.3.3 + resolution: "schema-utils@npm:4.3.3" dependencies: "@types/json-schema": "npm:^7.0.9" ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" ajv-keywords: "npm:^5.1.0" - checksum: 10/02c32c34aae762d48468f98465a96a167fede637772871c7c7d8923671ddb9f20b2cc6f6e8448ae6bef5363e3597493c655212c8b06a4ee73aa099d9452fbd8b + checksum: 10/dba77a46ad7ff0c906f7f09a1a61109e6cb56388f15a68070b93c47a691f516c6a3eb454f81a8cceb0a0e55b87f8b05770a02bfb1f4e0a3143b5887488b2f900 languageName: node linkType: hard @@ -47179,10 +47189,10 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a +"tapable@npm:^2.0.0, tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10/496a841039960533bb6e44816a01fffc2a1eb428bb2051ecab9e87adf07f19e1f937566cbbbb09dceff31163c0ffd81baafcad84db900b601f0155dd0b37e9f2 languageName: node linkType: hard @@ -47364,7 +47374,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.11": +"terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.11": version: 5.3.14 resolution: "terser-webpack-plugin@npm:5.3.14" dependencies: @@ -48889,17 +48899,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" +"update-browserslist-db@npm:^1.1.4": + version: 1.1.4 + resolution: "update-browserslist-db@npm:1.1.4" dependencies: escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/7678dd8609750588d01aa7460e8eddf2ff9d16c2a52fb1811190e0d056390f1fdffd94db3cf8fb209cf634ab4fa9407886338711c71cc6ccade5eeb22b093734 + checksum: 10/79b2c0a31e9b837b49dc55d5cb7b77f44a69502847c7be352a44b1d35ac2032bf0e1bb7543f992809ed427bf9d32aa3f7ad41cef96198fa959c1666870174c06 languageName: node linkType: hard @@ -49516,13 +49526,13 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.1 - resolution: "watchpack@npm:2.4.1" +"watchpack@npm:^2.4.4": + version: 2.4.4 + resolution: "watchpack@npm:2.4.4" dependencies: glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.1.2" - checksum: 10/0736ebd20b75d3931f9b6175c819a66dee29297c1b389b2e178bc53396a6f867ecc2fd5d87a713ae92dcb73e487daec4905beee20ca00a9e27f1184a7c2bca5e + checksum: 10/cfa3473fc12a1a1b88123056941e90c462a67aedc10b242229eeeccdd45ed0b763c3b591caaffb0f7d77295b539b5518bb1ad3bcd891ae6505dfeae4cf51fd15 languageName: node linkType: hard @@ -49666,7 +49676,7 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^3.2.3, webpack-sources@npm:^3.3.3": +"webpack-sources@npm:^3.3.3": version: 3.3.3 resolution: "webpack-sources@npm:3.3.3" checksum: 10/ec5d72607e8068467370abccbfff855c596c098baedbe9d198a557ccf198e8546a322836a6f74241492576adba06100286592993a62b63196832cdb53c8bae91 @@ -49680,9 +49690,9 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5": - version: 5.101.1 - resolution: "webpack@npm:5.101.1" +"webpack@npm:^5, webpack@npm:~5.103.0": + version: 5.103.0 + resolution: "webpack@npm:5.103.0" dependencies: "@types/eslint-scope": "npm:^3.7.7" "@types/estree": "npm:^1.0.8" @@ -49692,7 +49702,7 @@ __metadata: "@webassemblyjs/wasm-parser": "npm:^1.14.1" acorn: "npm:^8.15.0" acorn-import-phases: "npm:^1.0.3" - browserslist: "npm:^4.24.0" + browserslist: "npm:^4.26.3" chrome-trace-event: "npm:^1.0.2" enhanced-resolve: "npm:^5.17.3" es-module-lexer: "npm:^1.2.1" @@ -49701,56 +49711,20 @@ __metadata: glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.2.11" json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" + loader-runner: "npm:^4.3.1" mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" - schema-utils: "npm:^4.3.2" - tapable: "npm:^2.1.1" + schema-utils: "npm:^4.3.3" + tapable: "npm:^2.3.0" terser-webpack-plugin: "npm:^5.3.11" - watchpack: "npm:^2.4.1" + watchpack: "npm:^2.4.4" webpack-sources: "npm:^3.3.3" peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 10/2cbb76683a959bf7f1c11a593e45bb6a2522254eff78e58106da155d6b08da49a3aca584d57948b473a7a55178adcbd728e98cd572ab535d72694b327896a595 - languageName: node - linkType: hard - -"webpack@npm:~5.96.0": - version: 5.96.1 - resolution: "webpack@npm:5.96.1" - dependencies: - "@types/eslint-scope": "npm:^3.7.7" - "@types/estree": "npm:^1.0.6" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.14.0" - browserslist: "npm:^4.24.0" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 10/d3419ffd198252e1d0301bd0c072cee93172f3e47937c745aa8202691d2f5d529d4ba4a1965d1450ad89a1bcd3c1f70ae09e57232b0d01dd38d69c1060e964d5 + checksum: 10/0018e77d159da412aa8cc1c3ac1d7c0b44228d0f5ce3939b4f424c04feba69747d8490541bcf8143b358a64afbbd69daad95e573ec9c4a90a99bef55d51dd43e languageName: node linkType: hard From fb029b67aaee9a445f96734307053253ac7f562a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Dec 2025 09:11:47 +0100 Subject: [PATCH 156/312] clean up types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/fifty-lights-marry.md | 9 +++++++++ microsite/package.json | 1 - microsite/yarn.lock | 8 -------- .../src/entrypoints/scheduler/lib/TaskWorker.ts | 8 ++++++-- packages/integration/package.json | 1 - .../package.json | 3 +-- plugins/kubernetes-backend/package.json | 1 - plugins/scaffolder-react/package.json | 1 - yarn.lock | 4 ---- 9 files changed, 16 insertions(+), 20 deletions(-) create mode 100644 .changeset/fifty-lights-marry.md diff --git a/.changeset/fifty-lights-marry.md b/.changeset/fifty-lights-marry.md new file mode 100644 index 0000000000..423ef89721 --- /dev/null +++ b/.changeset/fifty-lights-marry.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/backend-defaults': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/integration': patch +--- + +Updated luxon types diff --git a/microsite/package.json b/microsite/package.json index 81985a0e91..e911ab5b3f 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -44,7 +44,6 @@ "devDependencies": { "@docusaurus/module-type-aliases": "^3.1.1", "@docusaurus/tsconfig": "^3.1.1", - "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.18.0", "js-yaml": "^4.1.1", "prettier": "^2.6.2", diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 65a43f1742..f1ce1d8798 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -3328,13 +3328,6 @@ __metadata: languageName: node linkType: hard -"@types/luxon@npm:^3.0.0": - version: 3.7.1 - resolution: "@types/luxon@npm:3.7.1" - checksum: 10/c7bc164c278393ea0be938f986c74b4cddfab9013b1aff4495b016f771ded1d5b7b7b4825b2c7f0b8799edce19c5f531c28ff434ab3dedf994ac2d99a20fd4c4 - languageName: node - linkType: hard - "@types/mdast@npm:^3.0.0": version: 3.0.15 resolution: "@types/mdast@npm:3.0.15" @@ -4282,7 +4275,6 @@ __metadata: "@docusaurus/types": "npm:^3.1.1" "@mdx-js/react": "npm:^3.0.0" "@swc/core": "npm:^1.3.46" - "@types/luxon": "npm:^3.0.0" "@types/webpack-env": "npm:^1.18.0" clsx: "npm:^2.0.0" docusaurus-plugin-openapi-docs: "npm:^4.3.0" diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts index eb040ef415..e47967de90 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts @@ -280,8 +280,10 @@ export class TaskWorker { .sendAt() .minus({ seconds: 1 }) // immediately, if "* * * * * *" .toUTC(); + // We make a conversion here to make typescript happy, because the luxon versions of the cron library and here may not be the same + const timeConverted = DateTime.fromJSDate(time.toJSDate()); - nextStartAt = this.nextRunAtRaw(time); + nextStartAt = this.nextRunAtRaw(timeConverted); startAt ||= nextStartAt; } else if (isManual) { nextStartAt = this.knex.raw('null'); @@ -418,8 +420,10 @@ export class TaskWorker { if (isCron) { const time = new CronTime(settings.cadence).sendAt().toUTC(); this.logger.debug(`task: ${this.taskId} will next occur around ${time}`); + // We make a conversion here to make typescript happy, because the luxon versions of the cron library and here may not be the same + const timeConverted = DateTime.fromJSDate(time.toJSDate()); - nextRun = this.nextRunAtRaw(time); + nextRun = this.nextRunAtRaw(timeConverted); } else if (isManual) { nextRun = this.knex.raw('null'); } else { diff --git a/packages/integration/package.json b/packages/integration/package.json index 3294a70dc5..41eeb67e06 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -51,7 +51,6 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/config-loader": "workspace:^", - "@types/luxon": "^3.0.0", "msw": "^1.0.0" }, "configSchema": "config.d.ts" diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 0838b89866..07559d6d01 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -67,7 +67,6 @@ "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@types/express": "^4.17.6", - "@types/luxon": "^3.0.0" + "@types/express": "^4.17.6" } } diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index e1f1a39456..a4cb8e924a 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -78,7 +78,6 @@ "@backstage/plugin-permission-backend": "workspace:^", "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", "@types/express": "^4.17.6", - "@types/luxon": "^3.0.0", "msw": "^1.0.0", "supertest": "^7.0.0", "ws": "^8.18.0" diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 15b53c329c..ddd47b982e 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -107,7 +107,6 @@ "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.0.0", "@types/humanize-duration": "^3.18.1", - "@types/luxon": "^3.0.0", "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", diff --git a/yarn.lock b/yarn.lock index f58a11626b..d0f2cd6efd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3923,7 +3923,6 @@ __metadata: "@backstage/errors": "workspace:^" "@octokit/auth-app": "npm:^4.0.0" "@octokit/rest": "npm:^19.0.3" - "@types/luxon": "npm:^3.0.0" cross-fetch: "npm:^4.0.0" git-url-parse: "npm:^15.0.0" lodash: "npm:^4.17.21" @@ -4925,7 +4924,6 @@ __metadata: "@backstage/types": "workspace:^" "@opentelemetry/api": "npm:^1.9.0" "@types/express": "npm:^4.17.6" - "@types/luxon": "npm:^3.0.0" express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" knex: "npm:^3.0.0" @@ -5818,7 +5816,6 @@ __metadata: "@smithy/signature-v4": "npm:^4.1.0" "@types/express": "npm:^4.17.6" "@types/http-proxy-middleware": "npm:^1.0.0" - "@types/luxon": "npm:^3.0.0" express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" fs-extra: "npm:^11.2.0" @@ -6878,7 +6875,6 @@ __metadata: "@testing-library/user-event": "npm:^14.0.0" "@types/humanize-duration": "npm:^3.18.1" "@types/json-schema": "npm:^7.0.9" - "@types/luxon": "npm:^3.0.0" "@types/react": "npm:^18.0.0" ajv: "npm:^8.0.1" ajv-errors: "npm:^3.0.0" From 2e09a29a409b55e56004f7c6f1bd6bc4afd99b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Dec 2025 12:32:36 +0100 Subject: [PATCH 157/312] improve auth flake MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts index a943717553..b5b4b7db2c 100644 --- a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts +++ b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts @@ -877,10 +877,10 @@ describe('createOAuthRouteHandlers', () => { const expectedExpirationDate = Date.now() + 1000 * 24 * 60 * 60 * 1000; const cookie = getRefreshTokenCookie(agent); expect(cookie.expiration_date).toBeGreaterThanOrEqual( - expectedExpirationDate - 1000, + expectedExpirationDate - 5000, ); expect(cookie.expiration_date).toBeLessThanOrEqual( - expectedExpirationDate + 1000, + expectedExpirationDate + 5000, ); }); }); From b48c224ce716a8490338d1e75b0e67891395ea23 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:38:59 +0000 Subject: [PATCH 158/312] chore(deps): update dependency jose to v5.10.0 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 1b379e92da..f612fe5b4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35340,16 +35340,16 @@ __metadata: linkType: hard "jose@npm:^5.0.0": - version: 5.8.0 - resolution: "jose@npm:5.8.0" - checksum: 10/d5a11135754aeb7e3dcfbfb33ae1087541a081002cedb533e4705a9d71237a2c22f21085a291a0847939257a7b2f2374b589d306be17c3330049aefb62719c5e + version: 5.10.0 + resolution: "jose@npm:5.10.0" + checksum: 10/03881d1dfb390dcf50926402edcfe233bf557b5a77321fcb1bdb53453bc1cdd26d2d0a9ab28c7445cbb826881f84fdf5074179700f10c2711ccb9880f51065d7 languageName: node linkType: hard "jose@npm:^6.0.10": - version: 6.0.10 - resolution: "jose@npm:6.0.10" - checksum: 10/8ba0d1aca94bdf780247c737328114fab3e394e1531e881dfe3fdd1d4a293b08cf7c0242769e72c8c8eee15c95761b542cf10730c3dfbb108084762df7d25cec + version: 6.1.3 + resolution: "jose@npm:6.1.3" + checksum: 10/9626c51e8c3792b505e954f3094698c182208617b62dfb27269230f31e57560b083985ed8128b8a9753aa92daf18d3a2341cc826d149503f14569abe87d42389 languageName: node linkType: hard From e03c40592c3198f04aa857fb0bb996d6ce347188 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:06:40 +0000 Subject: [PATCH 159/312] chore(deps): update dependency zod-to-json-schema to v3.25.0 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 1b379e92da..2ec46e8faf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50483,11 +50483,11 @@ __metadata: linkType: hard "zod-to-json-schema@npm:^3.20.4, zod-to-json-schema@npm:^3.21.4, zod-to-json-schema@npm:^3.24.1": - version: 3.24.6 - resolution: "zod-to-json-schema@npm:3.24.6" + version: 3.25.0 + resolution: "zod-to-json-schema@npm:3.25.0" peerDependencies: - zod: ^3.24.1 - checksum: 10/a2c30cf1f250aa79a7f975e65b4236d1abafafd63b43c43475057f28ce6e13f4c882391553c656fb426fd09665e6ae293c2439b4ed8600863beda43fb1a56922 + zod: ^3.25 || ^4 + checksum: 10/cb932e20b5b5e64c75b2c34a7e6dae74b727292eab9e014b93c2607378b8cb1b227f80b429053ceb77c8e0dddc338837f9e534b2a658540ff60c9e4ffdc7cc19 languageName: node linkType: hard From 847a3309b8f5e49799e26f1c797f4411a9c3e4db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Dec 2025 13:25:48 +0100 Subject: [PATCH 160/312] fixup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/large-planes-punch.md | 5 +++++ .../entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/large-planes-punch.md diff --git a/.changeset/large-planes-punch.md b/.changeset/large-planes-punch.md new file mode 100644 index 0000000000..3216653eb9 --- /dev/null +++ b/.changeset/large-planes-punch.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Fix for `jose` types diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts index e6a7bbcfc6..562086a07f 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts @@ -102,7 +102,7 @@ export class DatabasePluginKeySource implements PluginKeySource { await this.keyStore.addKey({ id: kid, - key: publicKey as InternalKey, + key: publicKey as unknown as InternalKey, expiresAt: new Date( Date.now() + this.keyDurationSeconds * From 4b8a879ed2f39e3bf4b829495181c6092aebf83c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 13:10:04 +0000 Subject: [PATCH 161/312] chore(deps): update dependency zod-validation-error to v3.5.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 99c3a99536..8af6064692 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50492,11 +50492,11 @@ __metadata: linkType: hard "zod-validation-error@npm:^3.4.0": - version: 3.4.1 - resolution: "zod-validation-error@npm:3.4.1" + version: 3.5.4 + resolution: "zod-validation-error@npm:3.5.4" peerDependencies: zod: ^3.24.4 - checksum: 10/4975aacc1a931acdbaa3eeaf92fc89a210c6fd14a260d17688ec6302ce478c268c008c61bcdeab51c76191ac627e580f319775a7862be7b9c54c94f2f7cb6ed2 + checksum: 10/eb85392e6fd7af255fb233713b1f038134e66cbaff20d1a52d46bd4210fe7b776d48d7dd2170095fbd2b375f6c41d629109bd5eac245c576083c9cf6e131a20b languageName: node linkType: hard From e3c9606d21711ffa22bd8b22044c4953a0592a0c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 13:10:11 +0000 Subject: [PATCH 162/312] chore(deps): update docker/login-action action to v3.6.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/deploy_docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 2fbad3fa6d..324af1845f 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -52,7 +52,7 @@ jobs: working-directory: ./example-app - name: Login to GitHub Container Registry - uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 with: registry: ghcr.io username: ${{ github.actor }} From e082b3997da849e4a4bad33af9d138bdb3e225ad Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:14:22 +0000 Subject: [PATCH 163/312] chore(deps): update emotion monorepo to v11.14.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4c34a5d535..c02da6c15b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8416,16 +8416,16 @@ __metadata: languageName: node linkType: hard -"@emotion/cache@npm:^11.13.5": - version: 11.13.5 - resolution: "@emotion/cache@npm:11.13.5" +"@emotion/cache@npm:^11.13.5, @emotion/cache@npm:^11.14.0": + version: 11.14.0 + resolution: "@emotion/cache@npm:11.14.0" dependencies: "@emotion/memoize": "npm:^0.9.0" "@emotion/sheet": "npm:^1.4.0" "@emotion/utils": "npm:^1.4.2" "@emotion/weak-memoize": "npm:^0.4.0" stylis: "npm:4.2.0" - checksum: 10/d91139453d279cfd6f6f38180d3af2fdcee8c0fc6d9a6faa2cdce9a1211b294a8019ef45365bf1171e0687d1744a70ff760637b88ed46f7a9fe74db9dc36f4df + checksum: 10/52336b28a27b07dde8fcdfd80851cbd1487672bbd4db1e24cca1440c95d8a6a968c57b0453c2b7c88d9b432b717f99554dbecc05b5cdef27933299827e69fd8e languageName: node linkType: hard @@ -8476,14 +8476,14 @@ __metadata: linkType: hard "@emotion/react@npm:^11.10.5": - version: 11.13.5 - resolution: "@emotion/react@npm:11.13.5" + version: 11.14.0 + resolution: "@emotion/react@npm:11.14.0" dependencies: "@babel/runtime": "npm:^7.18.3" "@emotion/babel-plugin": "npm:^11.13.5" - "@emotion/cache": "npm:^11.13.5" + "@emotion/cache": "npm:^11.14.0" "@emotion/serialize": "npm:^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" "@emotion/utils": "npm:^1.4.2" "@emotion/weak-memoize": "npm:^0.4.0" hoist-non-react-statics: "npm:^3.3.1" @@ -8492,7 +8492,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/c85bde9c6144be6f243e44d6834b16df8151b91c5136ea28d9d917155d64d1bbfba000ae98866fd9f5089546f0b0655c20b9e4280cdc5ccf39acc4a2fde37a39 + checksum: 10/3356c1d66f37f4e7abf88a2be843f6023b794b286c9c99a0aaf1cd1b2b7c50f8d80a2ef77183da737de70150f638e698ff4a2a38ab2d922f868615f1d5761c37 languageName: node linkType: hard @@ -8517,14 +8517,14 @@ __metadata: linkType: hard "@emotion/styled@npm:^11.10.5": - version: 11.13.5 - resolution: "@emotion/styled@npm:11.13.5" + version: 11.14.1 + resolution: "@emotion/styled@npm:11.14.1" dependencies: "@babel/runtime": "npm:^7.18.3" "@emotion/babel-plugin": "npm:^11.13.5" "@emotion/is-prop-valid": "npm:^1.3.0" "@emotion/serialize": "npm:^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" "@emotion/utils": "npm:^1.4.2" peerDependencies: "@emotion/react": ^11.0.0-rc.0 @@ -8532,7 +8532,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/cf6c47f9e9292b817aaec4e34cedc996727318018b621525576a1f541cfb3ecf2443729bfba503d4467d8183ca7732fe817bd7202386f4206a9d218e6e2202d8 + checksum: 10/b20ffaaac76e16538051da8d417f1da75f47f0974000edf0999f39f309b23ee0a91ba7dc1d5f60c4017d29fadfed48631ae4a8f697e3662a88318c667d072117 languageName: node linkType: hard @@ -8557,12 +8557,12 @@ __metadata: languageName: node linkType: hard -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.1.0": - version: 1.1.0 - resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.1.0" +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.2.0": + version: 1.2.0 + resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.2.0" peerDependencies: react: ">=16.8.0" - checksum: 10/33a10f44a873b3f5ccd2a1a3d13c2f34ed628f5a2be1ccf28540a86535a14d3a930afcbef209d48346a22ec60ff48f43c86ee9c846b9480d23a55a17145da66c + checksum: 10/2374999db8d53ef661d61ed1026c42a849632e4f03826f7eba0314c1d92ae342161d737f5045453aa46dd4008e13ccefeba68d3165b667dfad8e5784fcb0c643 languageName: node linkType: hard From 1602cac02474c1213154f21e79e53afa76234188 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:47:42 +0000 Subject: [PATCH 164/312] chore(deps): update dependency logform to v2.7.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 4391f774fc..401389bf55 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37087,8 +37087,8 @@ __metadata: linkType: hard "logform@npm:^2.3.2, logform@npm:^2.6.0, logform@npm:^2.6.1": - version: 2.6.1 - resolution: "logform@npm:2.6.1" + version: 2.7.0 + resolution: "logform@npm:2.7.0" dependencies: "@colors/colors": "npm:1.6.0" "@types/triple-beam": "npm:^1.3.2" @@ -37096,7 +37096,7 @@ __metadata: ms: "npm:^2.1.1" safe-stable-stringify: "npm:^2.3.1" triple-beam: "npm:^1.3.0" - checksum: 10/e67f414787fbfe1e6a997f4c84300c7e06bee3d0bd579778af667e24b36db3ea200ed195d41b61311ff738dab7faabc615a07b174b22fe69e0b2f39e985be64b + checksum: 10/4b861bfd67efe599ab41113ae3ffe92b1873bf86793fb442f58971852430d8f416f9904da69e5043071fb3725690e2499a13acbfe92a57ba7d21690004f9edc0 languageName: node linkType: hard From 7fe9daea72d32a817948a11abe2bf78f253684e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:47:57 +0000 Subject: [PATCH 165/312] chore(deps): update dependency sass to v1.94.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index c8f753d8a9..da978f94ad 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -13055,8 +13055,8 @@ __metadata: linkType: hard "sass@npm:^1.57.1, sass@npm:^1.80.4": - version: 1.83.4 - resolution: "sass@npm:1.83.4" + version: 1.94.2 + resolution: "sass@npm:1.94.2" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -13067,7 +13067,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10/9a7d1c6be1a9e711a1c561d189b9816aa7715f6d0ec0b2ec181f64163788d0caaf4741924eeadce558720b58b1de0e9b21b9dae6a0d14489c4d2a142d3f3b12e + checksum: 10/e60c214ea93677740c9ddfad55c77fd433255bbfdd9faba137acf1215bed5ba6ad9d83efea81feb87a89283931d01f0435227e3fff37c65c263e0ee05f885328 languageName: node linkType: hard From 9c93e2aa1f7f8b91f03ecae98c1dfe685034dd58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Dec 2025 16:06:28 +0100 Subject: [PATCH 166/312] Update .changeset/gentle-singers-love.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/gentle-singers-love.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/gentle-singers-love.md b/.changeset/gentle-singers-love.md index 0fb2dbc047..ed4372ee06 100644 --- a/.changeset/gentle-singers-love.md +++ b/.changeset/gentle-singers-love.md @@ -2,4 +2,4 @@ '@backstage/plugin-app': patch --- -Support to set defaultLanguage and availableLanguages in new frontend system +Support to set `defaultLanguage` and `availableLanguages` for the app language API in the new frontend system From 8dd4ce407359dd9dc8525dccff84433ff74aeabe Mon Sep 17 00:00:00 2001 From: Colt McKissick Date: Wed, 3 Dec 2025 10:13:41 -0500 Subject: [PATCH 167/312] refactor: populate ses options during constructor Signed-off-by: Colt McKissick --- .../src/processor/NotificationsEmailProcessor.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts index 7eea12bd85..e0e27232c2 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts @@ -54,6 +54,7 @@ export class NotificationsEmailProcessor implements NotificationProcessor { private readonly sender: string; private readonly replyTo?: string; private readonly sesConfig?: Config; + private readonly sesOptions?: Partial; private readonly cacheTtl: number; private readonly concurrencyLimit: number; private readonly throttleInterval: number; @@ -92,6 +93,7 @@ export class NotificationsEmailProcessor implements NotificationProcessor { this.sender = emailProcessorConfig.getString('sender'); this.replyTo = emailProcessorConfig.getOptionalString('replyTo'); this.sesConfig = emailProcessorConfig.getOptionalConfig('sesConfig'); + this.sesOptions = this.getSesOptions(); this.concurrencyLimit = emailProcessorConfig.getOptionalNumber('concurrencyLimit') ?? 2; this.throttleInterval = emailProcessorConfig.has('throttleInterval') @@ -308,9 +310,7 @@ export class NotificationsEmailProcessor implements NotificationProcessor { return contentParts.join('\n\n'); } - private async getSesOptions(): Promise< - Partial | undefined - > { + private getSesOptions(): Partial | undefined { if (!this.sesConfig) { return undefined; } @@ -338,7 +338,7 @@ export class NotificationsEmailProcessor implements NotificationProcessor { html: this.getHtmlContent(notification), text: this.getTextContent(notification), replyTo: this.replyTo, - ses: await this.getSesOptions(), + ses: this.sesOptions, }; await this.sendMails(mailOptions, emails); @@ -356,7 +356,7 @@ export class NotificationsEmailProcessor implements NotificationProcessor { html: await this.templateRenderer?.getHtml?.(notification), text: await this.templateRenderer?.getText?.(notification), replyTo: this.replyTo, - ses: await this.getSesOptions(), + ses: this.sesOptions, }; await this.sendMails(mailOptions, emails); From 87e9fe704f65644e19af9dc94e08e2e1b8b25592 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:19:02 +0000 Subject: [PATCH 168/312] chore(deps): update github/codeql-action action to v3.31.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- .github/workflows/sync_snyk-monitor.yml | 2 +- .github/workflows/verify_codeql.yml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 7b2130f471..8af38e2286 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@a4e1a019f5e24960714ff6296aee04b736cbc3cf # v3.29.6 + uses: github/codeql-action/upload-sarif@497990dfed22177a82ba1bbab381bc8f6d27058f # v3.31.6 with: sarif_file: results.sarif diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index bcb2c5da3d..67baf83f2c 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -58,6 +58,6 @@ jobs: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} NODE_OPTIONS: --max-old-space-size=7168 - name: Upload Snyk report - uses: github/codeql-action/upload-sarif@a4e1a019f5e24960714ff6296aee04b736cbc3cf # v3.29.6 + uses: github/codeql-action/upload-sarif@497990dfed22177a82ba1bbab381bc8f6d27058f # v3.31.6 with: sarif_file: snyk.sarif diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index d35b7575a2..c74a84ea76 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -55,7 +55,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@a4e1a019f5e24960714ff6296aee04b736cbc3cf # v3.29.6 + uses: github/codeql-action/init@497990dfed22177a82ba1bbab381bc8f6d27058f # v3.31.6 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -66,7 +66,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@a4e1a019f5e24960714ff6296aee04b736cbc3cf # v3.29.6 + uses: github/codeql-action/autobuild@497990dfed22177a82ba1bbab381bc8f6d27058f # v3.31.6 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -80,4 +80,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@a4e1a019f5e24960714ff6296aee04b736cbc3cf # v3.29.6 + uses: github/codeql-action/analyze@497990dfed22177a82ba1bbab381bc8f6d27058f # v3.31.6 From 8d8ccbd2c371766b3b5ccc938ed5f55d5c085cb7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:19:43 +0000 Subject: [PATCH 169/312] chore(deps): update material-ui monorepo Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 87 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/yarn.lock b/yarn.lock index 657eb08631..970df5e809 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11230,22 +11230,22 @@ __metadata: languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.16.14": - version: 5.16.14 - resolution: "@mui/core-downloads-tracker@npm:5.16.14" - checksum: 10/a25658362a69a89f35cdc12ded01b998b7f02df43648029f2523813fc7f259cc85f62bd1877059359d462e7c163e82308bd4cc74fa2d35651d302c5d8bbbc7f4 +"@mui/core-downloads-tracker@npm:^5.18.0": + version: 5.18.0 + resolution: "@mui/core-downloads-tracker@npm:5.18.0" + checksum: 10/065b46739d2bd84b880ad2f6a0a2062d60e3a296ce18ff380cad22ab5b2cb3de396755f322f4bea3a422ffffe1a9244536fc3c9623056ff3873c996e6664b1b9 languageName: node linkType: hard "@mui/material@npm:^5.12.2": - version: 5.16.14 - resolution: "@mui/material@npm:5.16.14" + version: 5.18.0 + resolution: "@mui/material@npm:5.18.0" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/core-downloads-tracker": "npm:^5.16.14" - "@mui/system": "npm:^5.16.14" - "@mui/types": "npm:^7.2.15" - "@mui/utils": "npm:^5.16.14" + "@mui/core-downloads-tracker": "npm:^5.18.0" + "@mui/system": "npm:^5.18.0" + "@mui/types": "npm:~7.2.15" + "@mui/utils": "npm:^5.17.1" "@popperjs/core": "npm:^2.11.8" "@types/react-transition-group": "npm:^4.4.10" clsx: "npm:^2.1.0" @@ -11266,16 +11266,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/4fe36ebe4d5f65e420895d114db81c0b8a5061e39bc18cdbebf6204953dae34cdc04af9827b65eb136e5a6853f4500a736ed3d52cce4ea37057a749eca5c3fad + checksum: 10/4b72e07c76c7c4b1076db82ef42a06dfab7d73d73f0d272019b2e0b200fc25c27bb295a8672577e1094168054159bed387cf9af74fec30e98aead7d97fad0a57 languageName: node linkType: hard -"@mui/private-theming@npm:^5.16.14": - version: 5.16.14 - resolution: "@mui/private-theming@npm:5.16.14" +"@mui/private-theming@npm:^5.17.1": + version: 5.17.1 + resolution: "@mui/private-theming@npm:5.17.1" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/utils": "npm:^5.16.14" + "@mui/utils": "npm:^5.17.1" prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -11283,16 +11283,17 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/19cb67ccb7f9702cc2c3de99861607cc9d4109c7df578d39e6cf662f9b0108a2f4a9bf59f6c23c4e5c30a269ad7964ebd7dc2342b7f469fb9abea762a4b00bbc + checksum: 10/f8b849f545e8ab29eac959f174f56702e5b72ffda85c3b0621750e294a3f64d15873ebdb792cf478564db1c3cf4b366eabcd4156897d811949f2df079b424c8c languageName: node linkType: hard -"@mui/styled-engine@npm:^5.16.14": - version: 5.16.14 - resolution: "@mui/styled-engine@npm:5.16.14" +"@mui/styled-engine@npm:^5.18.0": + version: 5.18.0 + resolution: "@mui/styled-engine@npm:5.18.0" dependencies: "@babel/runtime": "npm:^7.23.9" "@emotion/cache": "npm:^11.13.5" + "@emotion/serialize": "npm:^1.3.3" csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" peerDependencies: @@ -11304,19 +11305,19 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 10/d1cf2c713bab684313c6993ce63e12928f88a5033a562fa039dec4d1ce33eef3b94767470979f608b3a993dcb0ed01ef5a5a2dd9c4d4fd80419d989607ba8d75 + checksum: 10/8468a82bafb6dba40b7a3add845dd49868bcbcda3e9a0226a08f74b715dcbe2360186944ef94c44b2abe85f79335a470c0634195b9e48ccf6b5439df4bc17a90 languageName: node linkType: hard "@mui/styles@npm:^5.14.18": - version: 5.16.14 - resolution: "@mui/styles@npm:5.16.14" + version: 5.18.0 + resolution: "@mui/styles@npm:5.18.0" dependencies: "@babel/runtime": "npm:^7.23.9" "@emotion/hash": "npm:^0.9.1" - "@mui/private-theming": "npm:^5.16.14" - "@mui/types": "npm:^7.2.15" - "@mui/utils": "npm:^5.16.14" + "@mui/private-theming": "npm:^5.17.1" + "@mui/types": "npm:~7.2.15" + "@mui/utils": "npm:^5.17.1" clsx: "npm:^2.1.0" csstype: "npm:^3.1.3" hoist-non-react-statics: "npm:^3.3.2" @@ -11335,19 +11336,19 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/53036720e7cd928c32d23c771679ce155be47e4bd5595a13abe33a4e5cf1378809f9b93609ea6307479e5a02ad82c6ca71699f74fd70c7a7993471c765e2f004 + checksum: 10/b02cc02f7c8eafe0bd5b8bc1121ee0cee50bb48e876b652313aad4c61ae466c411423e8e82f603a386ecf569c537ecfa92b6c7dabd0c798d6727e935df7fa1e6 languageName: node linkType: hard -"@mui/system@npm:^5.16.14": - version: 5.16.14 - resolution: "@mui/system@npm:5.16.14" +"@mui/system@npm:^5.16.14, @mui/system@npm:^5.18.0": + version: 5.18.0 + resolution: "@mui/system@npm:5.18.0" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/private-theming": "npm:^5.16.14" - "@mui/styled-engine": "npm:^5.16.14" - "@mui/types": "npm:^7.2.15" - "@mui/utils": "npm:^5.16.14" + "@mui/private-theming": "npm:^5.17.1" + "@mui/styled-engine": "npm:^5.18.0" + "@mui/types": "npm:~7.2.15" + "@mui/utils": "npm:^5.17.1" clsx: "npm:^2.1.0" csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" @@ -11363,28 +11364,28 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/71892070ffe1d7b626b894776c395a748d0d8fb37c11bd22f79559d889c7b83fcbb095fab74b930d2a704d3b575720b6be4675473e7a50c92bd86411f6740232 + checksum: 10/4584a4d4f62ddaecc8b047f1a3b24ecde2ea4198963b5db3c006fd8109cd16085099862dbf935fad545ee146a3c06f119e0dd9bdc987cf45f900bab611a4afe7 languageName: node linkType: hard -"@mui/types@npm:^7.2.15": - version: 7.2.19 - resolution: "@mui/types@npm:7.2.19" +"@mui/types@npm:~7.2.15": + version: 7.2.24 + resolution: "@mui/types@npm:7.2.24" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/a23bc280c0722527ce5e264b0dcb44271441e4016eb2285acc1f0d236cf78c73ecc3ec7abba81876c2eadf45b905b55eb26e0e824ea6afc233efce2ef5a34f7d + checksum: 10/5ed4f90ec62c7df901e58b53011bf6b377b48e13b07de9eeb15c7a6f3f759310f0682b64685c7762f660fad6edf4c8e05595313c93810fc63c54270b899b4a75 languageName: node linkType: hard -"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.16.14": - version: 5.16.14 - resolution: "@mui/utils@npm:5.16.14" +"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.17.1": + version: 5.17.1 + resolution: "@mui/utils@npm:5.17.1" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/types": "npm:^7.2.15" + "@mui/types": "npm:~7.2.15" "@types/prop-types": "npm:^15.7.12" clsx: "npm:^2.1.1" prop-types: "npm:^15.8.1" @@ -11395,7 +11396,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/29bb7ca0a6e9be7bc5ab5505621566ace279fd7a2da149f0937984502d349f2b78dd42f475c5e22b546b1b27d063bd8eb8e92093b0530a814169a535dc250cdc + checksum: 10/26efae9a9f84a817b016a93ab3e3c3d08533947f62b19d4a5f8cd67ebf6932b1f68c4e4ae677dc0d3397ecd1bf1cc8cb47ab83a345bcaa9b4f45c401ec9d3926 languageName: node linkType: hard From f3f84f1e4b3bd0d0332462793135d27eb7e0dbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Dec 2025 14:58:44 +0100 Subject: [PATCH 170/312] make .withOverrides have a simplified result type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/crazy-hornets-spend.md | 11 +++++ .changeset/fuzzy-rivers-travel.md | 5 +++ packages/frontend-plugin-api/report.api.md | 44 ++++++++++--------- .../src/wiring/createExtensionBlueprint.ts | 42 ++++++++++-------- plugins/api-docs/report-alpha.api.md | 13 +----- plugins/app/report.api.md | 30 ++----------- plugins/catalog-graph/report-alpha.api.md | 25 +---------- plugins/catalog/report-alpha.api.md | 34 ++------------ plugins/org/report-alpha.api.md | 37 ++-------------- plugins/search/report-alpha.api.md | 4 -- plugins/techdocs/report-alpha.api.md | 24 +--------- 11 files changed, 77 insertions(+), 192 deletions(-) create mode 100644 .changeset/crazy-hornets-spend.md create mode 100644 .changeset/fuzzy-rivers-travel.md diff --git a/.changeset/crazy-hornets-spend.md b/.changeset/crazy-hornets-spend.md new file mode 100644 index 0000000000..4db99675ac --- /dev/null +++ b/.changeset/crazy-hornets-spend.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-api-docs': patch +'@backstage/plugin-techdocs': patch +'@backstage/plugin-catalog': patch +'@backstage/plugin-search': patch +'@backstage/plugin-app': patch +'@backstage/plugin-org': patch +--- + +Minor extension type updates after frontend API bump diff --git a/.changeset/fuzzy-rivers-travel.md b/.changeset/fuzzy-rivers-travel.md new file mode 100644 index 0000000000..fa2c08a671 --- /dev/null +++ b/.changeset/fuzzy-rivers-travel.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Made the return type of `.withOverrides` to be simplified. diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index 025efabb85..ca4f8a1a0c 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -1006,10 +1006,10 @@ export interface ExtensionBlueprint< }, UFactoryOutput extends ExtensionDataValue, UNewOutput extends ExtensionDataRef, + UParentInputs extends ExtensionDataRef, TExtraInputs extends { [inputName in string]: ExtensionInput; - }, - UParentInputs extends ExtensionDataRef, + } = {}, >(args: { name?: TName; attachTo?: ExtensionDefinitionAttachTo & @@ -1063,26 +1063,30 @@ export interface ExtensionBlueprint< UFactoryOutput >; }): OverridableExtensionDefinition<{ - config: (string extends keyof TExtensionConfigSchema - ? {} - : { - [key in keyof TExtensionConfigSchema]: z.infer< - ReturnType - >; - }) & - T['config']; - configInput: (string extends keyof TExtensionConfigSchema - ? {} - : z.input< - z.ZodObject<{ - [key in keyof TExtensionConfigSchema]: ReturnType< - TExtensionConfigSchema[key] + config: Expand< + (string extends keyof TExtensionConfigSchema + ? {} + : { + [key in keyof TExtensionConfigSchema]: z.infer< + ReturnType >; - }> - >) & - T['configInput']; + }) & + T['config'] + >; + configInput: Expand< + (string extends keyof TExtensionConfigSchema + ? {} + : z.input< + z.ZodObject<{ + [key in keyof TExtensionConfigSchema]: ReturnType< + TExtensionConfigSchema[key] + >; + }> + >) & + T['configInput'] + >; output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput; - inputs: T['inputs'] & TExtraInputs; + inputs: Expand; kind: T['kind']; name: string | undefined extends TName ? undefined : TName; params: T['params']; diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts index 70b6209ae3..c6723388ae 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts @@ -249,8 +249,8 @@ export interface ExtensionBlueprint< }, UFactoryOutput extends ExtensionDataValue, UNewOutput extends ExtensionDataRef, - TExtraInputs extends { [inputName in string]: ExtensionInput }, UParentInputs extends ExtensionDataRef, + TExtraInputs extends { [inputName in string]: ExtensionInput } = {}, >(args: { name?: TName; attachTo?: ExtensionDefinitionAttachTo & @@ -304,26 +304,30 @@ export interface ExtensionBlueprint< UFactoryOutput >; }): OverridableExtensionDefinition<{ - config: (string extends keyof TExtensionConfigSchema - ? {} - : { - [key in keyof TExtensionConfigSchema]: z.infer< - ReturnType - >; - }) & - T['config']; - configInput: (string extends keyof TExtensionConfigSchema - ? {} - : z.input< - z.ZodObject<{ - [key in keyof TExtensionConfigSchema]: ReturnType< - TExtensionConfigSchema[key] + config: Expand< + (string extends keyof TExtensionConfigSchema + ? {} + : { + [key in keyof TExtensionConfigSchema]: z.infer< + ReturnType >; - }> - >) & - T['configInput']; + }) & + T['config'] + >; + configInput: Expand< + (string extends keyof TExtensionConfigSchema + ? {} + : z.input< + z.ZodObject<{ + [key in keyof TExtensionConfigSchema]: ReturnType< + TExtensionConfigSchema[key] + >; + }> + >) & + T['configInput'] + >; output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput; - inputs: T['inputs'] & TExtraInputs; + inputs: Expand; kind: T['kind']; name: string | undefined extends TName ? undefined : TName; params: T['params']; diff --git a/plugins/api-docs/report-alpha.api.md b/plugins/api-docs/report-alpha.api.md index 3e8b0153d8..1a035bc706 100644 --- a/plugins/api-docs/report-alpha.api.md +++ b/plugins/api-docs/report-alpha.api.md @@ -12,7 +12,6 @@ import { EntityCardType } from '@backstage/plugin-catalog-react/alpha'; import { EntityPredicate } from '@backstage/plugin-catalog-react/alpha'; import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; -import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; import { IconComponent } from '@backstage/frontend-plugin-api'; import { JSX as JSX_2 } from 'react'; @@ -472,12 +471,10 @@ const _default: OverridableFrontendPlugin< 'page:api-docs': OverridableExtensionDefinition<{ config: { initiallySelectedFilter: 'all' | 'owned' | 'starred' | undefined; - } & { path: string | undefined; }; configInput: { initiallySelectedFilter?: 'all' | 'owned' | 'starred' | undefined; - } & { path?: string | undefined; }; output: @@ -490,15 +487,7 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'page'; name: undefined; params: { diff --git a/plugins/app/report.api.md b/plugins/app/report.api.md index c9aa1cf9f7..ea34a1731f 100644 --- a/plugins/app/report.api.md +++ b/plugins/app/report.api.md @@ -241,15 +241,7 @@ const appPlugin: OverridableFrontendPlugin< availableLanguages?: string[] | undefined; }; output: ExtensionDataRef; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'api'; name: 'app-language'; params: < @@ -726,15 +718,7 @@ const appPlugin: OverridableFrontendPlugin< transientTimeoutMs?: number | undefined; }; output: ExtensionDataRef; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'app-root-element'; name: 'alert-display'; params: { @@ -745,15 +729,7 @@ const appPlugin: OverridableFrontendPlugin< config: {}; configInput: {}; output: ExtensionDataRef; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'app-root-element'; name: 'dialog-display'; params: { diff --git a/plugins/catalog-graph/report-alpha.api.md b/plugins/catalog-graph/report-alpha.api.md index bf2087e9ec..2ce85431e8 100644 --- a/plugins/catalog-graph/report-alpha.api.md +++ b/plugins/catalog-graph/report-alpha.api.md @@ -11,7 +11,6 @@ import { EntityCardType } from '@backstage/plugin-catalog-react/alpha'; import { EntityPredicate } from '@backstage/plugin-catalog-react/alpha'; import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; -import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; import { JSX as JSX_2 } from 'react'; import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; @@ -92,7 +91,6 @@ const _default: OverridableFrontendPlugin< curve: 'curveStepBefore' | 'curveMonotoneX' | undefined; title: string | undefined; height: number | undefined; - } & { filter: EntityPredicate | undefined; type: 'content' | 'summary' | 'info' | undefined; }; @@ -108,7 +106,6 @@ const _default: OverridableFrontendPlugin< mergeRelations?: boolean | undefined; relationPairs?: [string, string][] | undefined; unidirectional?: boolean | undefined; - } & { filter?: EntityPredicate | undefined; type?: 'content' | 'summary' | 'info' | undefined; }; @@ -135,15 +132,7 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'entity-card'; name: 'relations'; params: { @@ -167,7 +156,6 @@ const _default: OverridableFrontendPlugin< relations: string[] | undefined; relationPairs: [string, string][] | undefined; zoom: 'disabled' | 'enabled' | 'enable-on-click' | undefined; - } & { path: string | undefined; }; configInput: { @@ -184,7 +172,6 @@ const _default: OverridableFrontendPlugin< selectedRelations?: string[] | undefined; selectedKinds?: string[] | undefined; showFilters?: boolean | undefined; - } & { path?: string | undefined; }; output: @@ -197,15 +184,7 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'page'; name: undefined; params: { diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index dff2128ef6..f70572e371 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -197,15 +197,7 @@ const _default: OverridableFrontendPlugin< initialFilter?: string | undefined; }; output: ExtensionDataRef; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'catalog-filter'; name: 'kind'; params: { @@ -231,15 +223,7 @@ const _default: OverridableFrontendPlugin< initialFilter?: 'all' | 'owned' | 'starred' | undefined; }; output: ExtensionDataRef; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'catalog-filter'; name: 'list'; params: { @@ -254,15 +238,7 @@ const _default: OverridableFrontendPlugin< mode?: 'all' | 'owners-only' | undefined; }; output: ExtensionDataRef; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'catalog-filter'; name: 'mode'; params: { @@ -995,7 +971,6 @@ const _default: OverridableFrontendPlugin< offset?: number | undefined; limit?: number | undefined; }; - } & { path: string | undefined; }; configInput: { @@ -1007,7 +982,6 @@ const _default: OverridableFrontendPlugin< limit?: number | undefined; } | undefined; - } & { path?: string | undefined; }; output: @@ -1048,7 +1022,6 @@ const _default: OverridableFrontendPlugin< } >[] | undefined; - } & { path: string | undefined; }; configInput: { @@ -1060,7 +1033,6 @@ const _default: OverridableFrontendPlugin< } >[] | undefined; - } & { path?: string | undefined; }; output: diff --git a/plugins/org/report-alpha.api.md b/plugins/org/report-alpha.api.md index 05f1169dfb..93e81f0851 100644 --- a/plugins/org/report-alpha.api.md +++ b/plugins/org/report-alpha.api.md @@ -7,7 +7,6 @@ import { Entity } from '@backstage/catalog-model'; import { EntityCardType } from '@backstage/plugin-catalog-react/alpha'; import { EntityPredicate } from '@backstage/plugin-catalog-react/alpha'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; -import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; import { JSX as JSX_2 } from 'react'; import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; @@ -66,14 +65,12 @@ const _default: OverridableFrontendPlugin< config: { initialRelationAggregation: 'direct' | 'aggregated' | undefined; showAggregateMembersToggle: boolean | undefined; - } & { filter: EntityPredicate | undefined; type: 'content' | 'summary' | 'info' | undefined; }; configInput: { showAggregateMembersToggle?: boolean | undefined; initialRelationAggregation?: 'direct' | 'aggregated' | undefined; - } & { filter?: EntityPredicate | undefined; type?: 'content' | 'summary' | 'info' | undefined; }; @@ -100,15 +97,7 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'entity-card'; name: 'members-list'; params: { @@ -121,14 +110,12 @@ const _default: OverridableFrontendPlugin< config: { initialRelationAggregation: 'direct' | 'aggregated' | undefined; showAggregateMembersToggle: boolean | undefined; - } & { filter: EntityPredicate | undefined; type: 'content' | 'summary' | 'info' | undefined; }; configInput: { showAggregateMembersToggle?: boolean | undefined; initialRelationAggregation?: 'direct' | 'aggregated' | undefined; - } & { filter?: EntityPredicate | undefined; type?: 'content' | 'summary' | 'info' | undefined; }; @@ -155,15 +142,7 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'entity-card'; name: 'ownership'; params: { @@ -176,14 +155,12 @@ const _default: OverridableFrontendPlugin< config: { maxRelations: number | undefined; hideIcons: boolean; - } & { filter: EntityPredicate | undefined; type: 'content' | 'summary' | 'info' | undefined; }; configInput: { hideIcons?: boolean | undefined; maxRelations?: number | undefined; - } & { filter?: EntityPredicate | undefined; type?: 'content' | 'summary' | 'info' | undefined; }; @@ -210,15 +187,7 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'entity-card'; name: 'user-profile'; params: { diff --git a/plugins/search/report-alpha.api.md b/plugins/search/report-alpha.api.md index 4f6fa8be78..5353fec09e 100644 --- a/plugins/search/report-alpha.api.md +++ b/plugins/search/report-alpha.api.md @@ -67,12 +67,10 @@ const _default: OverridableFrontendPlugin< 'page:search': OverridableExtensionDefinition<{ config: { noTrack: boolean; - } & { path: string | undefined; }; configInput: { noTrack?: boolean | undefined; - } & { path?: string | undefined; }; output: @@ -187,12 +185,10 @@ export const searchNavItem: OverridableExtensionDefinition<{ export const searchPage: OverridableExtensionDefinition<{ config: { noTrack: boolean; - } & { path: string | undefined; }; configInput: { noTrack?: boolean | undefined; - } & { path?: string | undefined; }; output: diff --git a/plugins/techdocs/report-alpha.api.md b/plugins/techdocs/report-alpha.api.md index bc3a5d6c34..96c778b09b 100644 --- a/plugins/techdocs/report-alpha.api.md +++ b/plugins/techdocs/report-alpha.api.md @@ -308,7 +308,6 @@ const _default: OverridableFrontendPlugin< lineClamp: number; asLink: boolean; asListItem: boolean; - } & { noTrack: boolean; }; configInput: { @@ -316,7 +315,6 @@ const _default: OverridableFrontendPlugin< lineClamp?: number | undefined; asListItem?: boolean | undefined; asLink?: boolean | undefined; - } & { noTrack?: boolean | undefined; }; output: ExtensionDataRef< @@ -328,15 +326,7 @@ const _default: OverridableFrontendPlugin< 'search.search-result-list-item.item', {} >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'search-result-list-item'; name: undefined; params: SearchResultListItemBlueprintParams; @@ -352,7 +342,6 @@ export const techDocsSearchResultListItemExtension: OverridableExtensionDefiniti lineClamp: number; asLink: boolean; asListItem: boolean; - } & { noTrack: boolean; }; configInput: { @@ -360,7 +349,6 @@ export const techDocsSearchResultListItemExtension: OverridableExtensionDefiniti lineClamp?: number | undefined; asListItem?: boolean | undefined; asLink?: boolean | undefined; - } & { noTrack?: boolean | undefined; }; output: ExtensionDataRef< @@ -372,15 +360,7 @@ export const techDocsSearchResultListItemExtension: OverridableExtensionDefiniti 'search.search-result-list-item.item', {} >; - inputs: { - [x: string]: ExtensionInput< - ExtensionDataRef, - { - singleton: boolean; - optional: boolean; - } - >; - }; + inputs: {}; kind: 'search-result-list-item'; name: undefined; params: SearchResultListItemBlueprintParams; From 957397ceeb95b3c07d004667da7c41ef8e490103 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 12 Dec 2024 21:54:22 -0700 Subject: [PATCH 171/312] feat: add a new system metadata service Signed-off-by: aramissennyeydd --- packages/backend-defaults/package.json | 4 + .../src/entrypoints/systemMetadata/index.ts | 17 + .../lib/DefaultSystemMetadataService.ts | 61 + .../systemMetadataServiceFactory.ts | 41 + .../backend-plugin-api/src/alpha/index.ts | 13 + .../definitions/SystemMetadataService.ts | 25 + packages/backend-split/.eslintrc.js | 1 + packages/backend-split/CHANGELOG.md | 3516 +++++++++++++++++ packages/backend-split/README.md | 8 + packages/backend-split/app-config.split.yaml | 14 + packages/backend-split/catalog-info.yaml | 9 + packages/backend-split/knip-report.md | 12 + packages/backend-split/package.json | 73 + .../src/experimental/features.http | 5 + .../src/experimental}/instanceMetadata.ts | 12 +- .../src/experimental/systemMetadata.ts | 93 + packages/backend-split/src/index.ts | 37 + packages/backend-split/src/instrumentation.js | 34 + packages/backend/app-config.split.yaml | 9 + packages/backend/package.json | 4 +- .../src/experimental/instanceMetadata.ts | 50 + .../src/experimental/systemMetadata.ts | 93 + packages/backend/src/index.ts | 5 +- yarn.lock | 52 + 24 files changed, 4184 insertions(+), 4 deletions(-) create mode 100644 packages/backend-defaults/src/entrypoints/systemMetadata/index.ts create mode 100644 packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts create mode 100644 packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts create mode 100644 packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts create mode 100644 packages/backend-split/.eslintrc.js create mode 100644 packages/backend-split/CHANGELOG.md create mode 100644 packages/backend-split/README.md create mode 100644 packages/backend-split/app-config.split.yaml create mode 100644 packages/backend-split/catalog-info.yaml create mode 100644 packages/backend-split/knip-report.md create mode 100644 packages/backend-split/package.json create mode 100644 packages/backend-split/src/experimental/features.http rename packages/{backend/src => backend-split/src/experimental}/instanceMetadata.ts (77%) create mode 100644 packages/backend-split/src/experimental/systemMetadata.ts create mode 100644 packages/backend-split/src/index.ts create mode 100644 packages/backend-split/src/instrumentation.js create mode 100644 packages/backend/app-config.split.yaml create mode 100644 packages/backend/src/experimental/instanceMetadata.ts create mode 100644 packages/backend/src/experimental/systemMetadata.ts diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 149aa275bd..27a3d0529a 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -21,6 +21,7 @@ "exports": { ".": "./src/index.ts", "./auditor": "./src/entrypoints/auditor/index.ts", + "./alpha/systemMetadata": "./src/entrypoints/systemMetadata/index.ts", "./auth": "./src/entrypoints/auth/index.ts", "./cache": "./src/entrypoints/cache/index.ts", "./database": "./src/entrypoints/database/index.ts", @@ -49,6 +50,9 @@ "auditor": [ "src/entrypoints/auditor/index.ts" ], + "alpha/systemMetadata": [ + "src/entrypoints/systemMetadata/index.ts" + ], "auth": [ "src/entrypoints/auth/index.ts" ], diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/index.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/index.ts new file mode 100644 index 0000000000..502a217e48 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { systemMetadataServiceFactory } from './systemMetadataServiceFactory'; +export { DefaultSystemMetadataService } from './lib/DefaultSystemMetadataService'; diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts new file mode 100644 index 0000000000..77030f2e43 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts @@ -0,0 +1,61 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + LoggerService, + RootConfigService, +} from '@backstage/backend-plugin-api'; +import { + BackstageInstance, + SystemMetadataService, +} from '@backstage/backend-plugin-api/alpha'; + +export class DefaultSystemMetadataService implements SystemMetadataService { + private readonly logger: LoggerService; + private readonly config: RootConfigService; + constructor(options: { logger: LoggerService; config: RootConfigService }) { + this.logger = options.logger; + this.config = options.config; + } + + public static create(pluginEnv: { + logger: LoggerService; + config: RootConfigService; + }) { + return new DefaultSystemMetadataService(pluginEnv); + } + + listInstances() { + const endpoints = + this.config.getOptionalConfigArray('discovery.instances') ?? []; + const instances: BackstageInstance[] = []; + for (const endpoint of endpoints) { + const baseUrl = endpoint.getOptionalString('baseUrl'); + if (baseUrl) { + this.logger.info(`Found instance at ${baseUrl}`); + instances.push({ url: baseUrl }); + } else { + this.logger.warn( + `Instance ${endpoint.get( + 'target', + )} is missing a 'baseUrl' property. This is required for the system metadata service.`, + ); + } + } + this.logger.info(`Found ${instances.length} instances.`); + return Promise.resolve(instances); + } +} diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts new file mode 100644 index 0000000000..59ff9f4253 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts @@ -0,0 +1,41 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + coreServices, + createServiceFactory, +} from '@backstage/backend-plugin-api'; +import { DefaultSystemMetadataService } from './lib/DefaultSystemMetadataService'; +import { systemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; + +/** + * Metadata about an entire Backstage system, a collection of Backstage instances. + * + * @alpha + */ +export const systemMetadataServiceFactory = createServiceFactory({ + service: systemMetadataServiceRef, + deps: { + logger: coreServices.logger, + config: coreServices.rootConfig, + }, + async factory({ logger, config }) { + return DefaultSystemMetadataService.create({ + logger, + config, + }); + }, +}); diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index b1edd68adc..3302b978b6 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -23,3 +23,16 @@ export type { export type { ActionsService, ActionsServiceAction } from './ActionsService'; export { actionsRegistryServiceRef, actionsServiceRef } from './refs'; + +import { createServiceRef } from '@backstage/backend-plugin-api'; + +export const systemMetadataServiceRef = createServiceRef< + import('./services/definitions/SystemMetadataService').SystemMetadataService +>({ + id: 'core.systemMetadata', +}); + +export type { + BackstageInstance, + SystemMetadataService, +} from './services/definitions/SystemMetadataService'; diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts new file mode 100644 index 0000000000..9d85412beb --- /dev/null +++ b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +type Target = string | { internal: string; external: string }; + +export interface BackstageInstance { + url: Target; +} + +export interface SystemMetadataService { + listInstances(): Promise; +} diff --git a/packages/backend-split/.eslintrc.js b/packages/backend-split/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/backend-split/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/backend-split/CHANGELOG.md b/packages/backend-split/CHANGELOG.md new file mode 100644 index 0000000000..27c2a067b7 --- /dev/null +++ b/packages/backend-split/CHANGELOG.md @@ -0,0 +1,3516 @@ +# example-backend + +## 0.0.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.28.0-next.2 + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/plugin-catalog-backend@1.29.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 + - @backstage/plugin-notifications-backend@0.5.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/plugin-app-backend@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 + - @backstage/plugin-devtools-backend@0.5.0-next.2 + - @backstage/plugin-events-backend@0.4.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.1-next.2 + - @backstage/plugin-proxy-backend@0.5.9-next.2 + - @backstage/plugin-search-backend@1.8.0-next.2 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/plugin-signals-backend@0.2.4-next.2 + - @backstage/plugin-techdocs-backend@1.11.4-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 + - @backstage/plugin-permission-backend@0.5.52-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## 0.0.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1-next.1 + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/plugin-catalog-backend@1.29.0-next.1 + - @backstage/backend-defaults@0.6.0-next.1 + - @backstage/plugin-events-backend@0.4.0-next.1 + - @backstage/plugin-search-backend@1.8.0-next.1 + - @backstage/plugin-devtools-backend@0.5.0-next.1 + - @backstage/plugin-search-backend-node@1.3.6-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.1 + - @backstage/plugin-notifications-backend@0.4.4-next.1 + - @backstage/plugin-permission-backend@0.5.52-next.1 + - @backstage/plugin-techdocs-backend@1.11.4-next.1 + - @backstage/plugin-signals-backend@0.2.4-next.1 + - @backstage/plugin-proxy-backend@0.5.9-next.1 + - @backstage/plugin-app-backend@0.4.3-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.1 + - @backstage/plugin-kubernetes-backend@0.19.1-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.1 + - @backstage/plugin-permission-node@0.8.6-next.1 + - @backstage/plugin-scaffolder-backend@1.28.0-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.1 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.1 + - @backstage/catalog-model@1.7.1 + - @backstage/plugin-permission-common@0.8.2 + +## 0.0.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.0 + - @backstage/plugin-scaffolder-backend@1.28.0-next.0 + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0 + - @backstage/plugin-search-backend-module-catalog@0.2.6-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.6-next.0 + - @backstage/plugin-app-backend@0.4.3-next.0 + - @backstage/plugin-catalog-backend@1.28.1-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/plugin-permission-backend@0.5.52-next.0 + - @backstage/plugin-devtools-backend@0.4.3-next.0 + - @backstage/plugin-signals-backend@0.2.4-next.0 + - @backstage/plugin-events-backend@0.3.17-next.0 + - @backstage/plugin-kubernetes-backend@0.19.1-next.0 + - @backstage/catalog-model@1.7.1 + - @backstage/plugin-auth-backend@0.24.1-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.0 + - @backstage/plugin-notifications-backend@0.4.4-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.0 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/plugin-permission-node@0.8.6-next.0 + - @backstage/plugin-proxy-backend@0.5.9-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.3-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.4-next.0 + - @backstage/plugin-search-backend@1.7.1-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.0 + - @backstage/plugin-techdocs-backend@1.11.4-next.0 + +## 0.0.32 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3 + - @backstage/plugin-app-backend@0.4.0 + - @backstage/plugin-search-backend-module-catalog@0.2.5 + - @backstage/plugin-scaffolder-backend@1.27.0 + - @backstage/plugin-auth-backend@0.24.0 + - @backstage/plugin-catalog-backend@1.28.0 + - @backstage/plugin-search-backend@1.7.0 + - @backstage/plugin-events-backend@0.3.16 + - @backstage/plugin-kubernetes-backend@0.19.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/plugin-search-backend-module-explore@0.2.5 + - @backstage/plugin-catalog-backend-module-openapi@0.2.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/plugin-notifications-backend@0.4.3 + - @backstage/plugin-signals-backend@0.2.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2 + - @backstage/plugin-search-backend-node@1.3.5 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/plugin-proxy-backend@0.5.8 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.2 + - @backstage/catalog-model@1.7.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2 + - @backstage/plugin-devtools-backend@0.4.2 + - @backstage/plugin-permission-backend@0.5.51 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2 + - @backstage/plugin-permission-node@0.8.5 + - @backstage/plugin-scaffolder-backend-module-github@0.5.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.2 + - @backstage/plugin-techdocs-backend@1.11.2 + +## 0.0.32-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-backend@0.3.16-next.3 + - @backstage/plugin-catalog-backend@1.28.0-next.3 + - @backstage/backend-defaults@0.5.3-next.3 + - @backstage/plugin-scaffolder-backend@1.27.0-next.3 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-app-backend@0.3.77-next.2 + - @backstage/plugin-auth-backend@0.24.0-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.2 + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.2 + - @backstage/plugin-devtools-backend@0.4.2-next.2 + - @backstage/plugin-kubernetes-backend@0.19.0-next.3 + - @backstage/plugin-notifications-backend@0.4.3-next.3 + - @backstage/plugin-permission-backend@0.5.51-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.2 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.2 + - @backstage/plugin-proxy-backend@0.5.8-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.3 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.3 + - @backstage/plugin-search-backend@1.7.0-next.3 + - @backstage/plugin-search-backend-module-catalog@0.2.5-next.3 + - @backstage/plugin-search-backend-module-explore@0.2.5-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.3 + - @backstage/plugin-search-backend-node@1.3.5-next.3 + - @backstage/plugin-signals-backend@0.2.3-next.3 + - @backstage/plugin-techdocs-backend@1.11.2-next.3 + +## 0.0.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.28.0-next.2 + - @backstage/plugin-search-backend@1.7.0-next.2 + - @backstage/plugin-kubernetes-backend@0.19.0-next.2 + - @backstage/backend-defaults@0.5.3-next.2 + - @backstage/plugin-events-backend@0.3.16-next.2 + - @backstage/plugin-auth-backend@0.24.0-next.2 + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/plugin-notifications-backend@0.4.3-next.2 + - @backstage/plugin-scaffolder-backend@1.27.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.5-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.2 + - @backstage/plugin-techdocs-backend@1.11.2-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-app-backend@0.3.77-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.2 + - @backstage/plugin-devtools-backend@0.4.2-next.2 + - @backstage/plugin-permission-backend@0.5.51-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.2 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.2 + - @backstage/plugin-proxy-backend@0.5.8-next.2 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.5-next.2 + - @backstage/plugin-search-backend-node@1.3.5-next.2 + - @backstage/plugin-signals-backend@0.2.3-next.2 + +## 0.0.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.19.0-next.1 + - @backstage/plugin-scaffolder-backend@1.27.0-next.1 + - @backstage/backend-defaults@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-app-backend@0.3.77-next.1 + - @backstage/plugin-auth-backend@0.24.0-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + - @backstage/plugin-catalog-backend@1.27.2-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.1 + - @backstage/plugin-devtools-backend@0.4.2-next.1 + - @backstage/plugin-events-backend@0.3.16-next.1 + - @backstage/plugin-notifications-backend@0.4.3-next.1 + - @backstage/plugin-permission-backend@0.5.51-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.1 + - @backstage/plugin-proxy-backend@0.5.8-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.1 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.1 + - @backstage/plugin-search-backend@1.6.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.5-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.5-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.1 + - @backstage/plugin-search-backend-node@1.3.5-next.1 + - @backstage/plugin-signals-backend@0.2.3-next.1 + - @backstage/plugin-techdocs-backend@1.11.2-next.1 + +## 0.0.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.2.5-next.0 + - @backstage/plugin-scaffolder-backend@1.26.3-next.0 + - @backstage/plugin-auth-backend@0.24.0-next.0 + - @backstage/plugin-events-backend@0.3.15-next.0 + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.5-next.0 + - @backstage/backend-defaults@0.5.3-next.0 + - @backstage/plugin-notifications-backend@0.4.3-next.0 + - @backstage/plugin-signals-backend@0.2.3-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-app-backend@0.3.77-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.0 + - @backstage/plugin-catalog-backend@1.27.2-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.0 + - @backstage/plugin-devtools-backend@0.4.2-next.0 + - @backstage/plugin-kubernetes-backend@0.18.8-next.0 + - @backstage/plugin-permission-backend@0.5.51-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.0 + - @backstage/plugin-proxy-backend@0.5.8-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.0 + - @backstage/plugin-search-backend@1.6.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.0 + - @backstage/plugin-search-backend-node@1.3.5-next.0 + - @backstage/plugin-techdocs-backend@1.11.2-next.0 + +## 0.0.31 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.2.3 + - @backstage/plugin-search-backend-module-techdocs@0.3.0 + - @backstage/plugin-scaffolder-backend@1.26.0 + - @backstage/backend-defaults@0.5.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.1 + - @backstage/plugin-search-backend@1.6.0 + - @backstage/plugin-auth-node@0.5.3 + - @backstage/plugin-app-backend@0.3.76 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.2 + - @backstage/plugin-search-backend-module-explore@0.2.3 + - @backstage/plugin-notifications-backend@0.4.1 + - @backstage/plugin-search-backend-node@1.3.3 + - @backstage/plugin-kubernetes-backend@0.18.7 + - @backstage/plugin-permission-backend@0.5.50 + - @backstage/plugin-devtools-backend@0.4.1 + - @backstage/plugin-techdocs-backend@1.11.0 + - @backstage/plugin-catalog-backend@1.27.0 + - @backstage/plugin-permission-node@0.8.4 + - @backstage/plugin-signals-backend@0.2.1 + - @backstage/plugin-events-backend@0.3.13 + - @backstage/plugin-proxy-backend@0.5.7 + - @backstage/plugin-auth-backend@0.23.1 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1 + - @backstage/plugin-permission-common@0.8.1 + +## 0.0.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.2 + - @backstage/backend-defaults@0.5.1-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend@1.26.0-next.2 + - @backstage/plugin-search-backend@1.5.18-next.2 + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/plugin-app-backend@0.3.76-next.1 + - @backstage/plugin-catalog-backend@1.26.2-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.3-next.2 + - @backstage/plugin-techdocs-backend@1.10.14-next.2 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-auth-backend@0.23.1-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.2-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.1 + - @backstage/plugin-devtools-backend@0.4.1-next.1 + - @backstage/plugin-events-backend@0.3.13-next.1 + - @backstage/plugin-kubernetes-backend@0.18.7-next.1 + - @backstage/plugin-notifications-backend@0.4.1-next.1 + - @backstage/plugin-permission-backend@0.5.50-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.1 + - @backstage/plugin-proxy-backend@0.5.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.2 + - @backstage/plugin-search-backend-node@1.3.3-next.2 + - @backstage/plugin-signals-backend@0.2.1-next.1 + +## 0.0.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.26.0-next.1 + - @backstage/plugin-catalog-backend@1.26.2-next.1 + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-app-backend@0.3.75-next.0 + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.2-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 + - @backstage/plugin-devtools-backend@0.4.1-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-kubernetes-backend@0.18.7-next.0 + - @backstage/plugin-notifications-backend@0.4.1-next.0 + - @backstage/plugin-permission-backend@0.5.50-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-proxy-backend@0.5.7-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.1 + - @backstage/plugin-search-backend@1.5.18-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.3-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-signals-backend@0.2.1-next.0 + - @backstage/plugin-techdocs-backend@1.10.14-next.1 + +## 0.0.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.26.0-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.1-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.0 + - @backstage/plugin-search-backend-module-catalog@0.2.3-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.3-next.0 + - @backstage/plugin-notifications-backend@0.4.1-next.0 + - @backstage/plugin-search-backend-node@1.3.3-next.0 + - @backstage/plugin-kubernetes-backend@0.18.7-next.0 + - @backstage/plugin-permission-backend@0.5.50-next.0 + - @backstage/backend-defaults@0.5.1-next.0 + - @backstage/plugin-devtools-backend@0.4.1-next.0 + - @backstage/plugin-techdocs-backend@1.10.14-next.0 + - @backstage/plugin-catalog-backend@1.26.1-next.0 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-signals-backend@0.2.1-next.0 + - @backstage/plugin-events-backend@0.3.13-next.0 + - @backstage/plugin-search-backend@1.5.18-next.0 + - @backstage/plugin-proxy-backend@0.5.7-next.0 + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-app-backend@0.3.75-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.0 + - @backstage/plugin-permission-common@0.8.1 + +## 0.0.30 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.0 + - @backstage/plugin-kubernetes-backend@0.18.6 + - @backstage/plugin-signals-backend@0.2.0 + - @backstage/plugin-techdocs-backend@1.10.13 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-search-backend@1.5.17 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/plugin-devtools-backend@0.4.0 + - @backstage/plugin-app-backend@0.3.74 + - @backstage/plugin-notifications-backend@0.4.0 + - @backstage/plugin-scaffolder-backend@1.25.0 + - @backstage/plugin-auth-backend@0.23.0 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-catalog-backend@1.26.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.0 + - @backstage/plugin-search-backend-module-techdocs@0.2.2 + - @backstage/plugin-search-backend-module-catalog@0.2.2 + - @backstage/plugin-search-backend-module-explore@0.2.2 + - @backstage/plugin-permission-node@0.8.3 + - @backstage/plugin-permission-backend@0.5.49 + - @backstage/plugin-proxy-backend@0.5.6 + - @backstage/plugin-scaffolder-backend-module-github@0.5.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-node@1.3.2 + +## 0.0.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.0-next.2 + - @backstage/plugin-devtools-backend@0.4.0-next.2 + - @backstage/plugin-scaffolder-backend@1.25.0-next.2 + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/plugin-auth-backend@0.23.0-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/plugin-catalog-backend@1.26.0-next.2 + - @backstage/plugin-app-backend@0.3.74-next.2 + - @backstage/plugin-notifications-backend@0.4.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.5.0-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.2.0-next.2 + - @backstage/plugin-kubernetes-backend@0.18.6-next.2 + - @backstage/plugin-permission-backend@0.5.49-next.2 + - @backstage/plugin-permission-node@0.8.3-next.2 + - @backstage/plugin-search-backend@1.5.17-next.2 + - @backstage/plugin-signals-backend@0.2.0-next.2 + - @backstage/plugin-techdocs-backend@1.10.13-next.2 + - @backstage/plugin-search-backend-module-explore@0.2.2-next.2 + - @backstage/catalog-model@1.6.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.0-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.2.0-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0-next.2 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-proxy-backend@0.5.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.2.2-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.2.2-next.2 + - @backstage/plugin-search-backend-node@1.3.2-next.2 + +## 0.0.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.0-next.1 + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/plugin-catalog-backend@1.25.3-next.1 + - @backstage/plugin-scaffolder-backend@1.25.0-next.1 + - @backstage/plugin-notifications-backend@0.4.0-next.1 + - @backstage/plugin-kubernetes-backend@0.18.6-next.1 + - @backstage/plugin-techdocs-backend@1.10.13-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/catalog-model@1.6.0 + - @backstage/plugin-app-backend@0.3.74-next.1 + - @backstage/plugin-auth-backend@0.23.0-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.2.0-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.0-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.0-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0-next.1 + - @backstage/plugin-devtools-backend@0.4.0-next.1 + - @backstage/plugin-permission-backend@0.5.49-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0-next.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.3-next.1 + - @backstage/plugin-proxy-backend@0.5.6-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.5.0-next.1 + - @backstage/plugin-search-backend@1.5.17-next.1 + - @backstage/plugin-search-backend-module-catalog@0.2.2-next.1 + - @backstage/plugin-search-backend-module-explore@0.2.2-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.2-next.1 + - @backstage/plugin-search-backend-node@1.3.2-next.1 + - @backstage/plugin-signals-backend@0.2.0-next.1 + +## 0.0.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@1.10.13-next.0 + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-search-backend@1.5.17-next.0 + - @backstage/plugin-kubernetes-backend@0.18.6-next.0 + - @backstage/plugin-scaffolder-backend@1.25.0-next.0 + - @backstage/plugin-app-backend@0.3.74-next.0 + - @backstage/plugin-signals-backend@0.2.0-next.0 + - @backstage/backend-defaults@0.5.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.2.2-next.0 + - @backstage/plugin-search-backend-module-catalog@0.2.2-next.0 + - @backstage/plugin-search-backend-module-explore@0.2.2-next.0 + - @backstage/plugin-permission-node@0.8.3-next.0 + - @backstage/plugin-auth-backend@0.23.0-next.0 + - @backstage/plugin-catalog-backend@1.25.3-next.0 + - @backstage/plugin-permission-backend@0.5.49-next.0 + - @backstage/plugin-proxy-backend@0.5.6-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.2.0-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.0-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.0-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0-next.0 + - @backstage/plugin-devtools-backend@0.4.0-next.0 + - @backstage/plugin-notifications-backend@0.4.0-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.5.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/plugin-search-backend-node@1.3.2-next.0 + - @backstage/catalog-model@1.6.0 + - @backstage/plugin-permission-common@0.8.1 + +## 0.0.29 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.4.2 + - @backstage/plugin-scaffolder-backend-module-github@0.4.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.20 + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-catalog-backend@1.25.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.41 + - @backstage/plugin-search-backend-node@1.3.0 + - @backstage/plugin-scaffolder-backend@1.24.0 + - @backstage/plugin-techdocs-backend@1.10.10 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-module-techdocs@0.2.0 + - @backstage/plugin-search-backend-module-explore@0.2.0 + - @backstage/plugin-notifications-backend@0.3.4 + - @backstage/plugin-kubernetes-backend@0.18.4 + - @backstage/plugin-permission-backend@0.5.47 + - @backstage/plugin-devtools-backend@0.3.9 + - @backstage/plugin-signals-backend@0.1.9 + - @backstage/plugin-proxy-backend@0.5.4 + - @backstage/plugin-auth-backend@0.22.10 + - @backstage/plugin-app-backend@0.3.72 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/plugin-permission-node@0.8.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.3.0 + - @backstage/plugin-search-backend-module-catalog@0.2.0 + - @backstage/plugin-search-backend@1.5.15 + - @backstage/catalog-model@1.6.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.9 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20 + +## 0.0.29-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.3 + - @backstage/plugin-notifications-backend@0.3.4-next.3 + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-techdocs-backend@1.10.10-next.3 + - @backstage/backend-defaults@0.4.2-next.3 + - @backstage/catalog-model@1.6.0-next.0 + - @backstage/plugin-scaffolder-backend@1.23.1-next.3 + - @backstage/backend-tasks@0.5.28-next.3 + - @backstage/plugin-app-backend@0.3.72-next.3 + - @backstage/plugin-auth-backend@0.22.10-next.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.3 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + - @backstage/plugin-catalog-backend@1.24.1-next.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.3 + - @backstage/plugin-devtools-backend@0.3.9-next.3 + - @backstage/plugin-kubernetes-backend@0.18.4-next.3 + - @backstage/plugin-permission-backend@0.5.47-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.3 + - @backstage/plugin-permission-common@0.8.1-next.1 + - @backstage/plugin-permission-node@0.8.1-next.3 + - @backstage/plugin-proxy-backend@0.5.4-next.3 + - @backstage/plugin-search-backend@1.5.15-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.29-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.29-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.3 + - @backstage/plugin-search-backend-node@1.2.28-next.3 + - @backstage/plugin-signals-backend@0.1.9-next.3 + +## 0.0.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.4.2-next.2 + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-scaffolder-backend@1.23.1-next.2 + - @backstage/plugin-permission-common@0.8.1-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.29-next.2 + - @backstage/plugin-notifications-backend@0.3.4-next.2 + - @backstage/plugin-kubernetes-backend@0.18.4-next.2 + - @backstage/plugin-permission-backend@0.5.47-next.2 + - @backstage/plugin-devtools-backend@0.3.9-next.2 + - @backstage/plugin-techdocs-backend@1.10.10-next.2 + - @backstage/plugin-catalog-backend@1.24.1-next.2 + - @backstage/plugin-signals-backend@0.1.9-next.2 + - @backstage/plugin-proxy-backend@0.5.4-next.2 + - @backstage/plugin-auth-backend@0.22.10-next.2 + - @backstage/plugin-app-backend@0.3.72-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/plugin-permission-node@0.8.1-next.2 + - @backstage/plugin-search-backend-node@1.2.28-next.2 + - @backstage/plugin-search-backend@1.5.15-next.2 + - @backstage/backend-tasks@0.5.28-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.29-next.2 + - @backstage/catalog-model@1.5.0 + +## 0.0.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.1 + - @backstage/plugin-techdocs-backend@1.10.10-next.1 + - @backstage/plugin-permission-common@0.8.1-next.0 + - @backstage/plugin-catalog-backend@1.24.1-next.1 + - @backstage/plugin-permission-node@0.8.1-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.29-next.1 + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-scaffolder-backend@1.23.1-next.1 + - @backstage/plugin-auth-backend@0.22.10-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.1 + - @backstage/backend-defaults@0.4.2-next.1 + - @backstage/plugin-app-backend@0.3.72-next.1 + - @backstage/plugin-devtools-backend@0.3.9-next.1 + - @backstage/plugin-proxy-backend@0.5.4-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.1 + - @backstage/plugin-kubernetes-backend@0.18.4-next.1 + - @backstage/plugin-permission-backend@0.5.47-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.1 + - @backstage/plugin-search-backend@1.5.15-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.29-next.1 + - @backstage/plugin-search-backend-node@1.2.28-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.1 + - @backstage/backend-tasks@0.5.28-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.1 + - @backstage/plugin-notifications-backend@0.3.4-next.1 + - @backstage/plugin-signals-backend@0.1.9-next.1 + +## 0.0.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.4.2-next.0 + - @backstage/plugin-catalog-backend@1.24.1-next.0 + - @backstage/plugin-devtools-backend@0.3.9-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/backend-tasks@0.5.28-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-app-backend@0.3.72-next.0 + - @backstage/plugin-auth-backend@0.22.10-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.0 + - @backstage/plugin-kubernetes-backend@0.18.4-next.0 + - @backstage/plugin-notifications-backend@0.3.4-next.0 + - @backstage/plugin-permission-backend@0.5.47-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.0 + - @backstage/plugin-permission-common@0.8.0 + - @backstage/plugin-permission-node@0.8.1-next.0 + - @backstage/plugin-proxy-backend@0.5.4-next.0 + - @backstage/plugin-scaffolder-backend@1.23.1-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.0 + - @backstage/plugin-search-backend@1.5.15-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.29-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.29-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.0 + - @backstage/plugin-search-backend-node@1.2.28-next.0 + - @backstage/plugin-signals-backend@0.1.9-next.0 + - @backstage/plugin-techdocs-backend@1.10.10-next.0 + +## 0.0.28 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-defaults@0.4.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.19 + - @backstage/backend-tasks@0.5.27 + - @backstage/plugin-scaffolder-backend@1.23.0 + - @backstage/plugin-scaffolder-backend-module-github@0.4.0 + - @backstage/plugin-permission-common@0.8.0 + - @backstage/plugin-permission-backend@0.5.46 + - @backstage/plugin-permission-node@0.8.0 + - @backstage/plugin-techdocs-backend@1.10.9 + - @backstage/plugin-notifications-backend@0.3.3 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/plugin-search-backend@1.5.14 + - @backstage/plugin-catalog-backend@1.24.0 + - @backstage/plugin-app-backend@0.3.71 + - @backstage/plugin-auth-backend@0.22.9 + - @backstage/plugin-auth-backend-module-github-provider@0.1.19 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.8 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.5 + - @backstage/plugin-catalog-backend-module-openapi@0.1.40 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.20 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.9 + - @backstage/plugin-devtools-backend@0.3.8 + - @backstage/plugin-kubernetes-backend@0.18.3 + - @backstage/plugin-proxy-backend@0.5.3 + - @backstage/plugin-search-backend-module-catalog@0.1.28 + - @backstage/plugin-search-backend-module-explore@0.1.28 + - @backstage/plugin-search-backend-module-techdocs@0.1.27 + - @backstage/plugin-search-backend-node@1.2.27 + - @backstage/plugin-signals-backend@0.1.8 + - @backstage/catalog-model@1.5.0 + +## 0.0.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.23.0-next.2 + +## 0.0.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@1.10.9-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.4.0-next.1 + - @backstage/plugin-catalog-backend@1.24.0-next.1 + - @backstage/backend-defaults@0.3.4-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.27-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/backend-tasks@0.5.27-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-app-backend@0.3.71-next.1 + - @backstage/plugin-auth-backend@0.22.9-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.19-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.8-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.5-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.40-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.20-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.9-next.1 + - @backstage/plugin-devtools-backend@0.3.8-next.1 + - @backstage/plugin-kubernetes-backend@0.18.3-next.1 + - @backstage/plugin-notifications-backend@0.3.3-next.1 + - @backstage/plugin-permission-backend@0.5.46-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.19-next.1 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/plugin-permission-node@0.7.33-next.1 + - @backstage/plugin-proxy-backend@0.5.3-next.1 + - @backstage/plugin-scaffolder-backend@1.23.0-next.1 + - @backstage/plugin-search-backend@1.5.14-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.28-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.28-next.1 + - @backstage/plugin-search-backend-node@1.2.27-next.1 + - @backstage/plugin-signals-backend@0.1.8-next.1 + +## 0.0.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-defaults@0.3.3-next.0 + - @backstage/backend-tasks@0.5.26-next.0 + - @backstage/plugin-scaffolder-backend@1.23.0-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.4.0-next.0 + - @backstage/plugin-notifications-backend@0.3.2-next.0 + - @backstage/plugin-app-backend@0.3.70-next.0 + - @backstage/plugin-auth-backend@0.22.8-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.18-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.7-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/plugin-catalog-backend@1.23.2-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.4-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.39-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.19-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.8-next.0 + - @backstage/plugin-devtools-backend@0.3.7-next.0 + - @backstage/plugin-kubernetes-backend@0.18.2-next.0 + - @backstage/plugin-permission-backend@0.5.45-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.18-next.0 + - @backstage/plugin-permission-node@0.7.32-next.0 + - @backstage/plugin-proxy-backend@0.5.2-next.0 + - @backstage/plugin-search-backend@1.5.13-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.27-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.27-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.26-next.0 + - @backstage/plugin-search-backend-node@1.2.26-next.0 + - @backstage/plugin-signals-backend@0.1.7-next.0 + - @backstage/plugin-techdocs-backend@1.10.8-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-permission-common@0.7.14 + +## 0.0.27 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/backend-tasks@0.5.24 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/plugin-auth-backend@0.22.6 + - @backstage/plugin-techdocs-backend@1.10.6 + - @backstage/plugin-scaffolder-backend-module-github@0.3.0 + - @backstage/plugin-devtools-backend@0.3.5 + - @backstage/plugin-catalog-backend@1.23.0 + - @backstage/plugin-search-backend@1.5.10 + - @backstage/plugin-proxy-backend@0.5.0 + - @backstage/plugin-app-backend@0.3.68 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.16 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.5 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6 + - @backstage/plugin-catalog-backend-module-openapi@0.1.37 + - @backstage/plugin-search-backend-module-techdocs@0.1.24 + - @backstage/plugin-search-backend-module-catalog@0.1.25 + - @backstage/plugin-search-backend-module-explore@0.1.25 + - @backstage/plugin-notifications-backend@0.3.0 + - @backstage/plugin-kubernetes-backend@0.18.0 + - @backstage/plugin-permission-backend@0.5.43 + - @backstage/plugin-scaffolder-backend@1.22.9 + - @backstage/plugin-signals-backend@0.1.5 + - @backstage/backend-defaults@0.3.0 + - @backstage/plugin-search-backend-node@1.2.24 + - @backstage/plugin-permission-node@0.7.30 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/catalog-model@1.5.0 + +## 0.0.27-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/backend-defaults@0.3.0-next.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.3 + - @backstage/plugin-scaffolder-backend-module-github@0.3.0-next.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.25-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.25-next.3 + - @backstage/plugin-notifications-backend@0.3.0-next.3 + - @backstage/plugin-search-backend-node@1.2.24-next.3 + - @backstage/plugin-kubernetes-backend@0.18.0-next.3 + - @backstage/plugin-permission-backend@0.5.43-next.3 + - @backstage/plugin-scaffolder-backend@1.22.8-next.3 + - @backstage/plugin-permission-common@0.7.14-next.0 + - @backstage/plugin-devtools-backend@0.3.5-next.3 + - @backstage/plugin-techdocs-backend@1.10.6-next.3 + - @backstage/plugin-catalog-backend@1.23.0-next.3 + - @backstage/plugin-permission-node@0.7.30-next.3 + - @backstage/plugin-signals-backend@0.1.5-next.3 + - @backstage/plugin-search-backend@1.5.10-next.3 + - @backstage/plugin-proxy-backend@0.5.0-next.3 + - @backstage/plugin-auth-backend@0.22.6-next.3 + - @backstage/plugin-app-backend@0.3.68-next.3 + - @backstage/backend-tasks@0.5.24-next.3 + - @backstage/catalog-model@1.5.0 + +## 0.0.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@1.10.6-next.2 + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-defaults@0.3.0-next.2 + - @backstage/plugin-permission-node@0.7.30-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.3.0-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.2 + - @backstage/plugin-scaffolder-backend@1.22.8-next.2 + - @backstage/backend-tasks@0.5.24-next.2 + - @backstage/plugin-app-backend@0.3.68-next.2 + - @backstage/plugin-auth-backend@0.22.6-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/plugin-catalog-backend@1.23.0-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.2 + - @backstage/plugin-devtools-backend@0.3.5-next.2 + - @backstage/plugin-kubernetes-backend@0.18.0-next.2 + - @backstage/plugin-notifications-backend@0.3.0-next.2 + - @backstage/plugin-permission-backend@0.5.43-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.1 + - @backstage/plugin-proxy-backend@0.5.0-next.2 + - @backstage/plugin-search-backend@1.5.10-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.25-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.25-next.2 + - @backstage/plugin-search-backend-node@1.2.24-next.2 + - @backstage/plugin-signals-backend@0.1.5-next.2 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-permission-common@0.7.13 + +## 0.0.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.24-next.1 + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/plugin-permission-node@0.7.30-next.1 + - @backstage/plugin-search-backend@1.5.10-next.1 + - @backstage/backend-defaults@0.3.0-next.1 + - @backstage/plugin-kubernetes-backend@0.18.0-next.1 + - @backstage/plugin-catalog-backend@1.23.0-next.1 + - @backstage/plugin-scaffolder-backend@1.22.8-next.1 + - @backstage/plugin-notifications-backend@0.3.0-next.1 + - @backstage/plugin-app-backend@0.3.68-next.1 + - @backstage/plugin-auth-backend@0.22.6-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.1 + - @backstage/plugin-auth-node@0.4.14-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.1 + - @backstage/plugin-devtools-backend@0.3.5-next.1 + - @backstage/plugin-permission-backend@0.5.43-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.0 + - @backstage/plugin-proxy-backend@0.5.0-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.2.9-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.25-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.25-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.1 + - @backstage/plugin-search-backend-node@1.2.24-next.1 + - @backstage/plugin-signals-backend@0.1.5-next.1 + - @backstage/plugin-techdocs-backend@1.10.6-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.1 + +## 0.0.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.24-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.9-next.0 + - @backstage/plugin-devtools-backend@0.3.5-next.0 + - @backstage/plugin-techdocs-backend@1.10.6-next.0 + - @backstage/plugin-catalog-backend@1.23.0-next.0 + - @backstage/plugin-search-backend@1.5.10-next.0 + - @backstage/plugin-proxy-backend@0.5.0-next.0 + - @backstage/plugin-auth-backend@0.22.6-next.0 + - @backstage/plugin-app-backend@0.3.68-next.0 + - @backstage/plugin-search-backend-node@1.2.24-next.0 + - @backstage/plugin-signals-backend@0.1.5-next.0 + - @backstage/backend-defaults@0.2.19-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-scaffolder-backend@1.22.8-next.0 + - @backstage/plugin-kubernetes-backend@0.17.2-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.25-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.25-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.0 + - @backstage/plugin-notifications-backend@0.2.2-next.0 + - @backstage/plugin-permission-backend@0.5.43-next.0 + - @backstage/plugin-permission-node@0.7.30-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-permission-common@0.7.13 + +## 0.0.26 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.22.6 + - @backstage/plugin-catalog-backend@1.22.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.8 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5 + - @backstage/plugin-search-backend-module-catalog@0.1.24 + - @backstage/plugin-notifications-backend@0.2.1 + - @backstage/catalog-model@1.5.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/backend-tasks@0.5.23 + - @backstage/plugin-auth-backend@0.22.5 + - @backstage/plugin-app-backend@0.3.66 + - @backstage/plugin-devtools-backend@0.3.4 + - @backstage/plugin-signals-backend@0.1.4 + - @backstage/plugin-search-backend-node@1.2.22 + - @backstage/plugin-search-backend@1.5.8 + - @backstage/plugin-auth-backend-module-github-provider@0.1.15 + - @backstage/plugin-techdocs-backend@1.10.5 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.4 + - @backstage/backend-defaults@0.2.18 + - @backstage/plugin-search-backend-module-explore@0.1.24 + - @backstage/plugin-auth-node@0.4.13 + - @backstage/plugin-search-backend-module-techdocs@0.1.23 + - @backstage/plugin-catalog-backend-module-openapi@0.1.36 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16 + - @backstage/plugin-kubernetes-backend@0.17.1 + - @backstage/plugin-permission-backend@0.5.42 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15 + - @backstage/plugin-permission-node@0.7.29 + - @backstage/plugin-proxy-backend@0.4.16 + +## 0.0.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.1 + - @backstage/plugin-notifications-backend@0.2.1-next.1 + - @backstage/plugin-catalog-backend@1.22.0-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.1 + - @backstage/plugin-scaffolder-backend@1.22.5-next.1 + - @backstage/plugin-search-backend@1.5.8-next.1 + - @backstage/backend-defaults@0.2.18-next.1 + - @backstage/plugin-app-backend@0.3.66-next.1 + - @backstage/plugin-kubernetes-backend@0.17.1-next.1 + - @backstage/backend-tasks@0.5.23-next.1 + - @backstage/plugin-auth-backend@0.22.5-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.1 + - @backstage/plugin-devtools-backend@0.3.4-next.1 + - @backstage/plugin-permission-backend@0.5.42-next.1 + - @backstage/plugin-permission-node@0.7.29-next.1 + - @backstage/plugin-proxy-backend@0.4.16-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.24-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.24-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.1 + - @backstage/plugin-search-backend-node@1.2.22-next.1 + - @backstage/plugin-signals-backend@0.1.4-next.1 + - @backstage/plugin-techdocs-backend@1.10.5-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.1 + +## 0.0.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.0 + - @backstage/plugin-catalog-backend@1.22.0-next.0 + - @backstage/plugin-scaffolder-backend@1.22.5-next.0 + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/plugin-search-backend-node@1.2.22-next.0 + - @backstage/plugin-search-backend@1.5.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.23-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.23-next.0 + - @backstage/plugin-auth-backend@0.22.5-next.0 + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/plugin-notifications-backend@0.2.1-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.0 + - @backstage/backend-defaults@0.2.18-next.0 + - @backstage/plugin-app-backend@0.3.66-next.0 + - @backstage/plugin-kubernetes-backend@0.17.1-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.0 + - @backstage/plugin-techdocs-backend@1.10.5-next.0 + - @backstage/backend-tasks@0.5.23-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.0 + - @backstage/plugin-devtools-backend@0.3.4-next.0 + - @backstage/plugin-permission-backend@0.5.42-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.0 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.29-next.0 + - @backstage/plugin-proxy-backend@0.4.16-next.0 + - @backstage/plugin-signals-backend@0.1.4-next.0 + +## 0.0.25 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-badges-backend@0.4.0 + - @backstage/plugin-kubernetes-backend@0.17.0 + - @backstage/plugin-azure-devops-backend@0.6.4 + - @backstage/plugin-techdocs-backend@1.10.4 + - @backstage/plugin-notifications-backend@0.2.0 + - @backstage/plugin-permission-node@0.7.28 + - @backstage/plugin-auth-backend@0.22.4 + - @backstage/plugin-catalog-backend@1.21.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.0 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-search-backend@1.5.7 + - @backstage/plugin-todo-backend@0.3.16 + - @backstage/plugin-scaffolder-backend-module-github@0.2.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.22 + - @backstage/plugin-search-backend-module-explore@0.1.21 + - @backstage/plugin-entity-feedback-backend@0.2.14 + - @backstage/plugin-search-backend-node@1.2.21 + - @backstage/plugin-lighthouse-backend@0.4.10 + - @backstage/plugin-permission-backend@0.5.41 + - @backstage/plugin-sonarqube-backend@0.2.19 + - @backstage/plugin-devtools-backend@0.3.3 + - @backstage/plugin-linguist-backend@0.5.15 + - @backstage/plugin-playlist-backend@0.3.21 + - @backstage/plugin-jenkins-backend@0.4.4 + - @backstage/backend-tasks@0.5.22 + - @backstage/plugin-nomad-backend@0.1.19 + - @backstage/plugin-adr-backend@0.4.14 + - @backstage/plugin-app-backend@0.3.65 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/plugin-signals-backend@0.1.3 + - @backstage/plugin-proxy-backend@0.4.15 + - @backstage/plugin-scaffolder-backend@1.22.4 + - @backstage/backend-defaults@0.2.17 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.35 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4 + - @backstage/plugin-search-backend-module-catalog@0.1.22 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14 + - @backstage/catalog-model@1.4.5 + - @backstage/plugin-auth-backend-module-github-provider@0.1.14 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15 + - @backstage/plugin-permission-common@0.7.13 + +## 0.0.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.17.0-next.1 + - @backstage/plugin-azure-devops-backend@0.6.4-next.1 + - @backstage/plugin-techdocs-backend@1.10.4-next.1 + - @backstage/plugin-auth-backend@0.22.4-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/plugin-proxy-backend@0.4.15-next.1 + - @backstage/plugin-scaffolder-backend@1.22.4-next.1 + - @backstage/plugin-catalog-backend@1.21.1-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.1 + - @backstage/plugin-app-backend@0.3.65-next.1 + - @backstage/plugin-notifications-backend@0.2.0-next.1 + - @backstage/backend-defaults@0.2.17-next.1 + - @backstage/backend-tasks@0.5.22-next.1 + - @backstage/plugin-adr-backend@0.4.14-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.1 + - @backstage/plugin-badges-backend@0.3.14-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.1 + - @backstage/plugin-devtools-backend@0.3.3-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.14-next.1 + - @backstage/plugin-jenkins-backend@0.4.4-next.1 + - @backstage/plugin-lighthouse-backend@0.4.10-next.1 + - @backstage/plugin-linguist-backend@0.5.15-next.1 + - @backstage/plugin-nomad-backend@0.1.19-next.1 + - @backstage/plugin-permission-backend@0.5.41-next.1 + - @backstage/plugin-permission-node@0.7.28-next.1 + - @backstage/plugin-playlist-backend@0.3.21-next.1 + - @backstage/plugin-search-backend@1.5.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.22-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.21-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.1 + - @backstage/plugin-search-backend-node@1.2.21-next.1 + - @backstage/plugin-signals-backend@0.1.3-next.1 + - @backstage/plugin-sonarqube-backend@0.2.19-next.1 + - @backstage/plugin-todo-backend@0.3.16-next.1 + - @backstage/catalog-model@1.4.5 + - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.1 + - @backstage/plugin-permission-common@0.7.13 + +## 0.0.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@1.10.4-next.0 + - @backstage/plugin-catalog-backend@1.21.1-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.0 + - @backstage/plugin-kubernetes-backend@0.16.4-next.0 + - @backstage/plugin-signals-backend@0.1.3-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.0 + - @backstage/plugin-scaffolder-backend@1.22.4-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.0 + - @backstage/backend-defaults@0.2.17-next.0 + - @backstage/plugin-app-backend@0.3.65-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/backend-tasks@0.5.22-next.0 + - @backstage/catalog-model@1.4.5 + - @backstage/plugin-adr-backend@0.4.14-next.0 + - @backstage/plugin-auth-backend@0.22.4-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + - @backstage/plugin-azure-devops-backend@0.6.4-next.0 + - @backstage/plugin-badges-backend@0.3.14-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.0 + - @backstage/plugin-devtools-backend@0.3.3-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.14-next.0 + - @backstage/plugin-jenkins-backend@0.4.4-next.0 + - @backstage/plugin-lighthouse-backend@0.4.10-next.0 + - @backstage/plugin-linguist-backend@0.5.15-next.0 + - @backstage/plugin-nomad-backend@0.1.19-next.0 + - @backstage/plugin-notifications-backend@0.1.3-next.0 + - @backstage/plugin-permission-backend@0.5.41-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.0 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.28-next.0 + - @backstage/plugin-playlist-backend@0.3.21-next.0 + - @backstage/plugin-proxy-backend@0.4.15-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.0 + - @backstage/plugin-search-backend@1.5.7-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.22-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.21-next.0 + - @backstage/plugin-search-backend-node@1.2.21-next.0 + - @backstage/plugin-sonarqube-backend@0.2.19-next.0 + - @backstage/plugin-todo-backend@0.3.16-next.0 + +## 0.0.24 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.21.0 + - @backstage/plugin-kubernetes-backend@0.16.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.3 + - @backstage/plugin-permission-backend@0.5.40 + - @backstage/plugin-proxy-backend@0.4.14 + - @backstage/plugin-scaffolder-backend@1.22.3 + - @backstage/plugin-jenkins-backend@0.4.3 + - @backstage/plugin-auth-backend@0.22.3 + - @backstage/plugin-auth-node@0.4.11 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.34 + - @backstage/plugin-azure-devops-backend@0.6.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.10 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.14 + - @backstage/plugin-lighthouse-backend@0.4.9 + - @backstage/plugin-linguist-backend@0.5.14 + - @backstage/plugin-search-backend-module-catalog@0.1.21 + - @backstage/plugin-search-backend-module-techdocs@0.1.21 + - @backstage/plugin-todo-backend@0.3.15 + - @backstage/backend-defaults@0.2.16 + - @backstage/plugin-app-backend@0.3.64 + - @backstage/plugin-adr-backend@0.4.13 + - @backstage/plugin-badges-backend@0.3.13 + - @backstage/plugin-entity-feedback-backend@0.2.13 + - @backstage/plugin-notifications-backend@0.1.2 + - @backstage/plugin-playlist-backend@0.3.20 + - @backstage/plugin-techdocs-backend@1.10.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.13 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.13 + - @backstage/plugin-permission-node@0.7.27 + - @backstage/plugin-signals-backend@0.1.2 + - @backstage/backend-tasks@0.5.21 + - @backstage/plugin-devtools-backend@0.3.2 + - @backstage/plugin-nomad-backend@0.1.18 + - @backstage/plugin-scaffolder-backend-module-github@0.2.6 + - @backstage/plugin-search-backend@1.5.6 + - @backstage/plugin-search-backend-module-explore@0.1.20 + - @backstage/plugin-search-backend-node@1.2.20 + - @backstage/plugin-sonarqube-backend@0.2.18 + - @backstage/catalog-model@1.4.5 + - @backstage/plugin-permission-common@0.7.13 + +## 0.0.23 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.20.0 + - @backstage/plugin-kubernetes-backend@0.16.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.2 + - @backstage/plugin-permission-backend@0.5.39 + - @backstage/plugin-catalog-backend-module-openapi@0.1.33 + - @backstage/plugin-auth-backend@0.22.2 + - @backstage/plugin-azure-devops-backend@0.6.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.9 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.13 + - @backstage/plugin-jenkins-backend@0.4.2 + - @backstage/plugin-lighthouse-backend@0.4.8 + - @backstage/plugin-linguist-backend@0.5.13 + - @backstage/plugin-scaffolder-backend@1.22.2 + - @backstage/plugin-search-backend-module-catalog@0.1.20 + - @backstage/plugin-search-backend-module-techdocs@0.1.20 + - @backstage/plugin-todo-backend@0.3.14 + - @backstage/backend-defaults@0.2.15 + - @backstage/plugin-app-backend@0.3.63 + - @backstage/plugin-adr-backend@0.4.12 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/plugin-badges-backend@0.3.12 + - @backstage/plugin-entity-feedback-backend@0.2.12 + - @backstage/plugin-notifications-backend@0.1.1 + - @backstage/plugin-playlist-backend@0.3.19 + - @backstage/plugin-techdocs-backend@1.10.2 + - @backstage/backend-tasks@0.5.20 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.1 + - @backstage/plugin-devtools-backend@0.3.1 + - @backstage/plugin-nomad-backend@0.1.17 + - @backstage/plugin-permission-node@0.7.26 + - @backstage/plugin-proxy-backend@0.4.13 + - @backstage/plugin-scaffolder-backend-module-github@0.2.5 + - @backstage/plugin-search-backend@1.5.5 + - @backstage/plugin-search-backend-module-explore@0.1.19 + - @backstage/plugin-search-backend-node@1.2.19 + - @backstage/plugin-signals-backend@0.1.1 + - @backstage/plugin-sonarqube-backend@0.2.17 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/catalog-model@1.4.5 + - @backstage/plugin-auth-backend-module-github-provider@0.1.12 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.12 + - @backstage/plugin-permission-common@0.7.13 + +## 0.0.22 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.19.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.1 + - @backstage/plugin-permission-backend@0.5.38 + - @backstage/plugin-catalog-backend-module-openapi@0.1.32 + - @backstage/plugin-auth-backend@0.22.1 + - @backstage/plugin-azure-devops-backend@0.6.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.8 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.12 + - @backstage/plugin-jenkins-backend@0.4.1 + - @backstage/plugin-kubernetes-backend@0.16.1 + - @backstage/plugin-lighthouse-backend@0.4.7 + - @backstage/plugin-linguist-backend@0.5.12 + - @backstage/plugin-scaffolder-backend@1.22.1 + - @backstage/plugin-search-backend-module-catalog@0.1.19 + - @backstage/plugin-search-backend-module-techdocs@0.1.19 + - @backstage/plugin-todo-backend@0.3.13 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11 + - @backstage/plugin-techdocs-backend@1.10.1 + +## 0.0.21 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-notifications-backend@0.1.0 + - @backstage/plugin-scaffolder-backend@1.22.0 + - @backstage/plugin-linguist-backend@0.5.11 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.0 + - @backstage/plugin-catalog-backend@1.18.0 + - @backstage/plugin-devtools-backend@0.3.0 + - @backstage/plugin-jenkins-backend@0.4.0 + - @backstage/plugin-search-backend@1.5.4 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/plugin-lighthouse-backend@0.4.6 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0 + - @backstage/plugin-azure-devops-backend@0.6.0 + - @backstage/plugin-permission-backend@0.5.37 + - @backstage/plugin-signals-backend@0.1.0 + - @backstage/plugin-nomad-backend@0.1.16 + - @backstage/plugin-entity-feedback-backend@0.2.11 + - @backstage/plugin-playlist-backend@0.3.18 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/plugin-auth-backend@0.22.0 + - @backstage/plugin-techdocs-backend@1.10.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.4 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-backend-module-techdocs@0.1.18 + - @backstage/plugin-search-backend-module-catalog@0.1.18 + - @backstage/plugin-search-backend-module-explore@0.1.18 + - @backstage/backend-defaults@0.2.14 + - @backstage/plugin-kubernetes-backend@0.16.0 + - @backstage/plugin-adr-backend@0.4.11 + - @backstage/plugin-proxy-backend@0.4.12 + - @backstage/backend-tasks@0.5.19 + - @backstage/plugin-search-backend-node@1.2.18 + - @backstage/plugin-app-backend@0.3.62 + - @backstage/plugin-permission-node@0.7.25 + - @backstage/plugin-todo-backend@0.3.12 + - @backstage/plugin-badges-backend@0.3.11 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11 + - @backstage/plugin-catalog-backend-module-openapi@0.1.31 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11 + - @backstage/plugin-sonarqube-backend@0.2.16 + - @backstage/catalog-model@1.4.5 + +## 0.0.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.22.0-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.2 + - @backstage/plugin-catalog-backend@1.18.0-next.2 + - @backstage/plugin-devtools-backend@0.3.0-next.2 + - @backstage/plugin-jenkins-backend@0.4.0-next.2 + - @backstage/plugin-search-backend@1.5.4-next.2 + - @backstage/plugin-techdocs-backend@1.10.0-next.2 + - @backstage/plugin-notifications-backend@0.1.0-next.2 + - @backstage/plugin-linguist-backend@0.5.11-next.2 + - @backstage/plugin-kubernetes-backend@0.16.0-next.2 + - @backstage/plugin-todo-backend@0.3.12-next.2 + - @backstage/plugin-signals-backend@0.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.2 + - @backstage/plugin-adr-backend@0.4.11-next.2 + - @backstage/plugin-azure-devops-backend@0.6.0-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.2 + - @backstage/plugin-auth-backend@0.22.0-next.2 + - @backstage/backend-defaults@0.2.14-next.2 + - @backstage/plugin-app-backend@0.3.62-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/plugin-badges-backend@0.3.11-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.11-next.2 + - @backstage/plugin-lighthouse-backend@0.4.6-next.2 + - @backstage/plugin-playlist-backend@0.3.18-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.18-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/backend-tasks@0.5.19-next.2 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.2 + - @backstage/plugin-nomad-backend@0.1.16-next.2 + - @backstage/plugin-permission-backend@0.5.37-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.2 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.2 + - @backstage/plugin-proxy-backend@0.4.12-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.18-next.2 + - @backstage/plugin-search-backend-node@1.2.18-next.2 + - @backstage/plugin-sonarqube-backend@0.2.16-next.2 + +## 0.0.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-entity-feedback-backend@0.2.11-next.1 + - @backstage/plugin-notifications-backend@0.1.0-next.1 + - @backstage/plugin-scaffolder-backend@1.22.0-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.1 + - @backstage/plugin-app-backend@0.3.62-next.1 + - @backstage/plugin-signals-backend@0.1.0-next.1 + - @backstage/plugin-azure-devops-backend@0.6.0-next.1 + - @backstage/plugin-kubernetes-backend@0.16.0-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/backend-tasks@0.5.19-next.1 + - @backstage/plugin-adr-backend@0.4.11-next.1 + - @backstage/plugin-auth-backend@0.22.0-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/plugin-badges-backend@0.3.11-next.1 + - @backstage/plugin-catalog-backend@1.18.0-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.1 + - @backstage/plugin-devtools-backend@0.3.0-next.1 + - @backstage/plugin-jenkins-backend@0.4.0-next.1 + - @backstage/plugin-lighthouse-backend@0.4.6-next.1 + - @backstage/plugin-linguist-backend@0.5.11-next.1 + - @backstage/plugin-nomad-backend@0.1.16-next.1 + - @backstage/plugin-permission-backend@0.5.37-next.1 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.1 + - @backstage/plugin-playlist-backend@0.3.18-next.1 + - @backstage/plugin-proxy-backend@0.4.12-next.1 + - @backstage/plugin-search-backend@1.5.4-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.18-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.18-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.1 + - @backstage/plugin-search-backend-node@1.2.18-next.1 + - @backstage/plugin-sonarqube-backend@0.2.16-next.1 + - @backstage/plugin-techdocs-backend@1.9.7-next.1 + - @backstage/plugin-todo-backend@0.3.12-next.1 + - @backstage/backend-defaults@0.2.14-next.1 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.1 + +## 0.0.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-linguist-backend@0.5.10-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/plugin-lighthouse-backend@0.4.5-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.0 + - @backstage/plugin-playlist-backend@0.3.17-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.10-next.0 + - @backstage/plugin-notifications-backend@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.18.0-next.0 + - @backstage/plugin-auth-backend@0.22.0-next.0 + - @backstage/plugin-jenkins-backend@0.4.0-next.0 + - @backstage/plugin-azure-devops-backend@0.6.0-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.3-next.0 + - @backstage/plugin-scaffolder-backend@1.22.0-next.0 + - @backstage/plugin-permission-common@0.7.13-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.17-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.17-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.17-next.0 + - @backstage/backend-defaults@0.2.13-next.0 + - @backstage/plugin-kubernetes-backend@0.16.0-next.0 + - @backstage/plugin-adr-backend@0.4.10-next.0 + - @backstage/plugin-proxy-backend@0.4.11-next.0 + - @backstage/backend-tasks@0.5.18-next.0 + - @backstage/plugin-search-backend-node@1.2.17-next.0 + - @backstage/plugin-signals-backend@0.0.4-next.0 + - @backstage/plugin-search-backend@1.5.3-next.0 + - @backstage/plugin-devtools-backend@0.3.0-next.0 + - @backstage/plugin-permission-node@0.7.24-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.6-next.0 + - @backstage/plugin-badges-backend@0.3.10-next.0 + - @backstage/plugin-permission-backend@0.5.36-next.0 + - @backstage/plugin-app-backend@0.3.61-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.10-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.30-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.10-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.10-next.0 + - @backstage/plugin-sonarqube-backend@0.2.15-next.0 + - @backstage/plugin-techdocs-backend@1.9.6-next.0 + - @backstage/plugin-nomad-backend@0.1.15-next.0 + - @backstage/plugin-todo-backend@0.3.11-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.10-next.0 + - @backstage/catalog-model@1.4.5-next.0 + +## 0.0.20 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7 + - @backstage/plugin-scaffolder-backend@1.21.0 + - @backstage/plugin-badges-backend@0.3.7 + - @backstage/plugin-azure-devops-backend@0.5.2 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/plugin-entity-feedback-backend@0.2.7 + - @backstage/plugin-lighthouse-backend@0.4.2 + - @backstage/plugin-devtools-backend@0.2.7 + - @backstage/plugin-linguist-backend@0.5.7 + - @backstage/plugin-adr-backend@0.4.7 + - @backstage/plugin-kubernetes-backend@0.15.0 + - @backstage/plugin-signals-backend@0.0.1 + - @backstage/plugin-notifications-backend@0.0.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27 + - @backstage/plugin-search-backend-module-techdocs@0.1.14 + - @backstage/plugin-search-backend-module-catalog@0.1.14 + - @backstage/plugin-search-backend-module-explore@0.1.14 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/backend-defaults@0.2.10 + - @backstage/plugin-sonarqube-backend@0.2.12 + - @backstage/plugin-playlist-backend@0.3.14 + - @backstage/plugin-catalog-backend@1.17.0 + - @backstage/plugin-jenkins-backend@0.3.4 + - @backstage/backend-tasks@0.5.15 + - @backstage/plugin-nomad-backend@0.1.12 + - @backstage/plugin-app-backend@0.3.58 + - @backstage/plugin-search-backend@1.5.0 + - @backstage/plugin-todo-backend@0.3.8 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3 + - @backstage/plugin-techdocs-backend@1.9.3 + - @backstage/plugin-permission-backend@0.5.33 + - @backstage/plugin-permission-node@0.7.21 + - @backstage/plugin-proxy-backend@0.4.8 + - @backstage/plugin-search-backend-node@1.2.14 + - @backstage/plugin-permission-common@0.7.12 + +## 0.0.20-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-badges-backend@0.3.7-next.3 + - @backstage/plugin-kubernetes-backend@0.15.0-next.3 + - @backstage/backend-tasks@0.5.15-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.3 + - @backstage/plugin-notifications-backend@0.0.1-next.1 + - @backstage/plugin-signals-backend@0.0.1-next.3 + - @backstage/plugin-catalog-backend@1.17.0-next.3 + - @backstage/plugin-app-backend@0.3.58-next.3 + - @backstage/backend-defaults@0.2.10-next.3 + - @backstage/plugin-adr-backend@0.4.7-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/plugin-azure-devops-backend@0.5.2-next.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.3 + - @backstage/plugin-devtools-backend@0.2.7-next.3 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.3 + - @backstage/plugin-jenkins-backend@0.3.4-next.3 + - @backstage/plugin-lighthouse-backend@0.4.2-next.3 + - @backstage/plugin-linguist-backend@0.5.7-next.3 + - @backstage/plugin-nomad-backend@0.1.12-next.3 + - @backstage/plugin-permission-backend@0.5.33-next.3 + - @backstage/plugin-permission-node@0.7.21-next.3 + - @backstage/plugin-playlist-backend@0.3.14-next.3 + - @backstage/plugin-proxy-backend@0.4.8-next.3 + - @backstage/plugin-scaffolder-backend@1.21.0-next.3 + - @backstage/plugin-search-backend@1.5.0-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.3 + - @backstage/plugin-search-backend-node@1.2.14-next.3 + - @backstage/plugin-sonarqube-backend@0.2.12-next.3 + - @backstage/plugin-techdocs-backend@1.9.3-next.3 + - @backstage/plugin-todo-backend@0.3.8-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.0.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.21.0-next.2 + - @backstage/plugin-signals-backend@0.0.1-next.2 + - @backstage/plugin-kubernetes-backend@0.15.0-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.2 + - @backstage/plugin-azure-devops-backend@0.5.2-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-lighthouse-backend@0.4.2-next.2 + - @backstage/backend-defaults@0.2.10-next.2 + - @backstage/plugin-sonarqube-backend@0.2.12-next.2 + - @backstage/plugin-devtools-backend@0.2.7-next.2 + - @backstage/plugin-linguist-backend@0.5.7-next.2 + - @backstage/plugin-playlist-backend@0.3.14-next.2 + - @backstage/plugin-catalog-backend@1.17.0-next.2 + - @backstage/plugin-jenkins-backend@0.3.4-next.2 + - @backstage/backend-tasks@0.5.15-next.2 + - @backstage/plugin-badges-backend@0.3.7-next.2 + - @backstage/plugin-nomad-backend@0.1.12-next.2 + - @backstage/plugin-adr-backend@0.4.7-next.2 + - @backstage/plugin-app-backend@0.3.58-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/plugin-notifications-backend@0.0.1-next.0 + - @backstage/plugin-todo-backend@0.3.8-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.2 + - @backstage/plugin-permission-backend@0.5.33-next.2 + - @backstage/plugin-permission-node@0.7.21-next.2 + - @backstage/plugin-proxy-backend@0.4.8-next.2 + - @backstage/plugin-search-backend@1.5.0-next.2 + - @backstage/plugin-search-backend-node@1.2.14-next.2 + - @backstage/plugin-techdocs-backend@1.9.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.2 + - @backstage/plugin-permission-common@0.7.12 + +## 0.0.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.21.0-next.1 + - @backstage/plugin-azure-devops-backend@0.5.2-next.1 + - @backstage/plugin-catalog-backend@1.17.0-next.1 + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-defaults@0.2.10-next.1 + - @backstage/backend-tasks@0.5.15-next.1 + - @backstage/plugin-adr-backend@0.4.7-next.1 + - @backstage/plugin-app-backend@0.3.58-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + - @backstage/plugin-badges-backend@0.3.7-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.1 + - @backstage/plugin-devtools-backend@0.2.7-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.1 + - @backstage/plugin-jenkins-backend@0.3.4-next.1 + - @backstage/plugin-kubernetes-backend@0.14.2-next.1 + - @backstage/plugin-lighthouse-backend@0.4.2-next.1 + - @backstage/plugin-linguist-backend@0.5.7-next.1 + - @backstage/plugin-nomad-backend@0.1.12-next.1 + - @backstage/plugin-permission-backend@0.5.33-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.21-next.1 + - @backstage/plugin-playlist-backend@0.3.14-next.1 + - @backstage/plugin-proxy-backend@0.4.8-next.1 + - @backstage/plugin-search-backend@1.5.0-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.1 + - @backstage/plugin-search-backend-node@1.2.14-next.1 + - @backstage/plugin-sonarqube-backend@0.2.12-next.1 + - @backstage/plugin-techdocs-backend@1.9.3-next.1 + - @backstage/plugin-todo-backend@0.3.8-next.1 + +## 0.0.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops-backend@0.5.2-next.0 + - @backstage/plugin-kubernetes-backend@0.14.2-next.0 + - @backstage/plugin-catalog-backend@1.17.0-next.0 + - @backstage/plugin-search-backend@1.5.0-next.0 + - @backstage/plugin-todo-backend@0.3.8-next.0 + - @backstage/plugin-scaffolder-backend@1.21.0-next.0 + - @backstage/plugin-app-backend@0.3.58-next.0 + - @backstage/backend-defaults@0.2.10-next.0 + - @backstage/backend-tasks@0.5.15-next.0 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/plugin-badges-backend@0.3.7-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.0 + - @backstage/plugin-linguist-backend@0.5.7-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.0 + - @backstage/plugin-permission-node@0.7.21-next.0 + - @backstage/plugin-playlist-backend@0.3.14-next.0 + - @backstage/plugin-proxy-backend@0.4.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.0 + - @backstage/plugin-sonarqube-backend@0.2.12-next.0 + - @backstage/plugin-techdocs-backend@1.9.3-next.0 + - @backstage/plugin-adr-backend@0.4.7-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.0 + - @backstage/plugin-devtools-backend@0.2.7-next.0 + - @backstage/plugin-jenkins-backend@0.3.4-next.0 + - @backstage/plugin-lighthouse-backend@0.4.2-next.0 + - @backstage/plugin-nomad-backend@0.1.12-next.0 + - @backstage/plugin-permission-backend@0.5.33-next.0 + - @backstage/plugin-search-backend-node@1.2.14-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.0 + - @backstage/plugin-permission-common@0.7.12 + +## 0.0.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.11 + - @backstage/plugin-scaffolder-backend@1.20.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-defaults@0.2.9 + - @backstage/plugin-azure-devops-backend@0.5.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2 + - @backstage/plugin-entity-feedback-backend@0.2.6 + - @backstage/plugin-devtools-backend@0.2.6 + - @backstage/plugin-linguist-backend@0.5.6 + - @backstage/plugin-playlist-backend@0.3.13 + - @backstage/plugin-techdocs-backend@1.9.2 + - @backstage/plugin-jenkins-backend@0.3.3 + - @backstage/plugin-badges-backend@0.3.6 + - @backstage/plugin-search-backend@1.4.9 + - @backstage/plugin-nomad-backend@0.1.11 + - @backstage/plugin-todo-backend@0.3.7 + - @backstage/plugin-adr-backend@0.4.6 + - @backstage/plugin-app-backend@0.3.57 + - @backstage/plugin-permission-backend@0.5.32 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-kubernetes-backend@0.14.1 + - @backstage/plugin-lighthouse-backend@0.4.1 + - @backstage/plugin-proxy-backend@0.4.7 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 + +## 0.0.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.11-next.2 + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-defaults@0.2.9-next.2 + - @backstage/plugin-adr-backend@0.4.6-next.2 + - @backstage/plugin-app-backend@0.3.57-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-azure-devops-backend@0.5.1-next.2 + - @backstage/plugin-badges-backend@0.3.6-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 + - @backstage/plugin-devtools-backend@0.2.6-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 + - @backstage/plugin-jenkins-backend@0.3.3-next.2 + - @backstage/plugin-kubernetes-backend@0.14.1-next.2 + - @backstage/plugin-lighthouse-backend@0.4.1-next.2 + - @backstage/plugin-linguist-backend@0.5.6-next.2 + - @backstage/plugin-nomad-backend@0.1.11-next.2 + - @backstage/plugin-permission-backend@0.5.32-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-playlist-backend@0.3.13-next.2 + - @backstage/plugin-proxy-backend@0.4.7-next.2 + - @backstage/plugin-scaffolder-backend@1.19.3-next.2 + - @backstage/plugin-search-backend@1.4.9-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-backend@1.9.2-next.2 + - @backstage/plugin-todo-backend@0.3.7-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.2 + +## 0.0.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app-backend@0.3.57-next.1 + - @backstage/plugin-devtools-backend@0.2.6-next.1 + - @backstage/plugin-proxy-backend@0.4.7-next.1 + - @backstage/backend-defaults@0.2.9-next.1 + - @backstage/plugin-kubernetes-backend@0.14.1-next.1 + - @backstage/backend-tasks@0.5.14-next.1 + - @backstage/plugin-adr-backend@0.4.6-next.1 + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/plugin-azure-devops-backend@0.5.1-next.1 + - @backstage/plugin-badges-backend@0.3.6-next.1 + - @backstage/plugin-catalog-backend@1.16.1-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.1 + - @backstage/plugin-jenkins-backend@0.3.3-next.1 + - @backstage/plugin-lighthouse-backend@0.4.1-next.1 + - @backstage/plugin-linguist-backend@0.5.6-next.1 + - @backstage/plugin-nomad-backend@0.1.11-next.1 + - @backstage/plugin-permission-backend@0.5.32-next.1 + - @backstage/plugin-permission-node@0.7.20-next.1 + - @backstage/plugin-playlist-backend@0.3.13-next.1 + - @backstage/plugin-scaffolder-backend@1.19.3-next.1 + - @backstage/plugin-search-backend@1.4.9-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.1 + - @backstage/plugin-search-backend-node@1.2.13-next.1 + - @backstage/plugin-sonarqube-backend@0.2.11-next.1 + - @backstage/plugin-techdocs-backend@1.9.2-next.1 + - @backstage/plugin-todo-backend@0.3.7-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.1 + - @backstage/plugin-permission-common@0.7.11 + +## 0.0.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.19.3-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.0 + - @backstage/plugin-azure-devops-backend@0.5.1-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.0 + - @backstage/plugin-devtools-backend@0.2.6-next.0 + - @backstage/plugin-linguist-backend@0.5.6-next.0 + - @backstage/plugin-playlist-backend@0.3.13-next.0 + - @backstage/plugin-techdocs-backend@1.9.2-next.0 + - @backstage/plugin-jenkins-backend@0.3.3-next.0 + - @backstage/plugin-badges-backend@0.3.6-next.0 + - @backstage/plugin-search-backend@1.4.9-next.0 + - @backstage/plugin-nomad-backend@0.1.11-next.0 + - @backstage/plugin-todo-backend@0.3.7-next.0 + - @backstage/plugin-adr-backend@0.4.6-next.0 + - @backstage/plugin-app-backend@0.3.57-next.0 + - @backstage/backend-defaults@0.2.9-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/backend-tasks@0.5.14-next.0 + - @backstage/plugin-auth-node@0.4.3-next.0 + - @backstage/plugin-catalog-backend@1.16.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.0 + - @backstage/plugin-kubernetes-backend@0.14.1-next.0 + - @backstage/plugin-lighthouse-backend@0.4.1-next.0 + - @backstage/plugin-permission-backend@0.5.32-next.0 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-permission-node@0.7.20-next.0 + - @backstage/plugin-proxy-backend@0.4.7-next.0 + - @backstage/plugin-search-backend-node@1.2.13-next.0 + - @backstage/plugin-sonarqube-backend@0.2.11-next.0 + +## 0.0.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1 + - @backstage/plugin-techdocs-backend@1.9.1 + - @backstage/plugin-catalog-backend@1.16.0 + - @backstage/plugin-azure-devops-backend@0.5.0 + - @backstage/plugin-scaffolder-backend@1.19.2 + - @backstage/backend-tasks@0.5.13 + - @backstage/plugin-lighthouse-backend@0.4.0 + - @backstage/plugin-kubernetes-backend@0.14.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/plugin-permission-backend@0.5.31 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-playlist-backend@0.3.12 + - @backstage/plugin-permission-node@0.7.19 + - @backstage/plugin-search-backend@1.4.8 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5 + - @backstage/plugin-search-backend-module-techdocs@0.1.12 + - @backstage/plugin-search-backend-module-catalog@0.1.12 + - @backstage/plugin-search-backend-module-explore@0.1.12 + - @backstage/backend-defaults@0.2.8 + - @backstage/plugin-adr-backend@0.4.5 + - @backstage/plugin-app-backend@0.3.56 + - @backstage/plugin-badges-backend@0.3.5 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25 + - @backstage/plugin-devtools-backend@0.2.5 + - @backstage/plugin-entity-feedback-backend@0.2.5 + - @backstage/plugin-jenkins-backend@0.3.2 + - @backstage/plugin-linguist-backend@0.5.5 + - @backstage/plugin-nomad-backend@0.1.10 + - @backstage/plugin-proxy-backend@0.4.6 + - @backstage/plugin-search-backend-node@1.2.12 + - @backstage/plugin-sonarqube-backend@0.2.10 + - @backstage/plugin-todo-backend@0.3.6 + - @backstage/backend-plugin-api@0.6.8 + +## 0.0.18-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops-backend@0.5.0-next.3 + - @backstage/plugin-scaffolder-backend@1.19.2-next.3 + - @backstage/backend-defaults@0.2.8-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/backend-tasks@0.5.13-next.3 + - @backstage/plugin-adr-backend@0.4.5-next.3 + - @backstage/plugin-app-backend@0.3.56-next.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + - @backstage/plugin-badges-backend@0.3.5-next.3 + - @backstage/plugin-catalog-backend@1.16.0-next.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.3 + - @backstage/plugin-devtools-backend@0.2.5-next.3 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.3 + - @backstage/plugin-jenkins-backend@0.3.2-next.3 + - @backstage/plugin-kubernetes-backend@0.14.0-next.3 + - @backstage/plugin-lighthouse-backend@0.4.0-next.3 + - @backstage/plugin-linguist-backend@0.5.5-next.3 + - @backstage/plugin-nomad-backend@0.1.10-next.3 + - @backstage/plugin-permission-backend@0.5.31-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.3 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.3 + - @backstage/plugin-playlist-backend@0.3.12-next.3 + - @backstage/plugin-proxy-backend@0.4.6-next.3 + - @backstage/plugin-search-backend@1.4.8-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.3 + - @backstage/plugin-search-backend-node@1.2.12-next.3 + - @backstage/plugin-sonarqube-backend@0.2.10-next.3 + - @backstage/plugin-techdocs-backend@1.9.1-next.3 + - @backstage/plugin-todo-backend@0.3.6-next.3 + +## 0.0.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.16.0-next.2 + - @backstage/plugin-lighthouse-backend@0.4.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.2 + - @backstage/backend-defaults@0.2.8-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/backend-tasks@0.5.13-next.2 + - @backstage/plugin-adr-backend@0.4.5-next.2 + - @backstage/plugin-app-backend@0.3.56-next.2 + - @backstage/plugin-azure-devops-backend@0.5.0-next.2 + - @backstage/plugin-badges-backend@0.3.5-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.2 + - @backstage/plugin-devtools-backend@0.2.5-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.2 + - @backstage/plugin-jenkins-backend@0.3.2-next.2 + - @backstage/plugin-kubernetes-backend@0.14.0-next.2 + - @backstage/plugin-linguist-backend@0.5.5-next.2 + - @backstage/plugin-nomad-backend@0.1.10-next.2 + - @backstage/plugin-permission-backend@0.5.31-next.2 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.2 + - @backstage/plugin-playlist-backend@0.3.12-next.2 + - @backstage/plugin-proxy-backend@0.4.6-next.2 + - @backstage/plugin-scaffolder-backend@1.19.2-next.2 + - @backstage/plugin-search-backend@1.4.8-next.2 + - @backstage/plugin-search-backend-node@1.2.12-next.2 + - @backstage/plugin-sonarqube-backend@0.2.10-next.2 + - @backstage/plugin-techdocs-backend@1.9.1-next.2 + - @backstage/plugin-todo-backend@0.3.6-next.2 + +## 0.0.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.1 + - @backstage/plugin-catalog-backend@1.15.1-next.1 + - @backstage/plugin-azure-devops-backend@0.5.0-next.1 + - @backstage/plugin-kubernetes-backend@0.14.0-next.1 + - @backstage/backend-defaults@0.2.8-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/backend-tasks@0.5.13-next.1 + - @backstage/plugin-adr-backend@0.4.5-next.1 + - @backstage/plugin-app-backend@0.3.56-next.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + - @backstage/plugin-badges-backend@0.3.5-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.1 + - @backstage/plugin-devtools-backend@0.2.5-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.1 + - @backstage/plugin-jenkins-backend@0.3.2-next.1 + - @backstage/plugin-lighthouse-backend@0.3.5-next.1 + - @backstage/plugin-linguist-backend@0.5.5-next.1 + - @backstage/plugin-nomad-backend@0.1.10-next.1 + - @backstage/plugin-permission-backend@0.5.31-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.1 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.1 + - @backstage/plugin-playlist-backend@0.3.12-next.1 + - @backstage/plugin-proxy-backend@0.4.6-next.1 + - @backstage/plugin-scaffolder-backend@1.19.2-next.1 + - @backstage/plugin-search-backend@1.4.8-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.1 + - @backstage/plugin-search-backend-node@1.2.12-next.1 + - @backstage/plugin-sonarqube-backend@0.2.10-next.1 + - @backstage/plugin-techdocs-backend@1.9.1-next.1 + - @backstage/plugin-todo-backend@0.3.6-next.1 + +## 0.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.13-next.0 + - @backstage/plugin-scaffolder-backend@1.19.2-next.0 + - @backstage/plugin-kubernetes-backend@0.14.0-next.0 + - @backstage/backend-defaults@0.2.8-next.0 + - @backstage/plugin-adr-backend@0.4.5-next.0 + - @backstage/plugin-app-backend@0.3.56-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/plugin-azure-devops-backend@0.4.5-next.0 + - @backstage/plugin-badges-backend@0.3.5-next.0 + - @backstage/plugin-catalog-backend@1.15.1-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.0 + - @backstage/plugin-devtools-backend@0.2.5-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.0 + - @backstage/plugin-jenkins-backend@0.3.2-next.0 + - @backstage/plugin-lighthouse-backend@0.3.5-next.0 + - @backstage/plugin-linguist-backend@0.5.5-next.0 + - @backstage/plugin-nomad-backend@0.1.10-next.0 + - @backstage/plugin-permission-backend@0.5.31-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.0 + - @backstage/plugin-permission-node@0.7.19-next.0 + - @backstage/plugin-playlist-backend@0.3.12-next.0 + - @backstage/plugin-proxy-backend@0.4.6-next.0 + - @backstage/plugin-search-backend@1.4.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.0 + - @backstage/plugin-search-backend-node@1.2.12-next.0 + - @backstage/plugin-sonarqube-backend@0.2.10-next.0 + - @backstage/plugin-techdocs-backend@1.9.1-next.0 + - @backstage/plugin-todo-backend@0.3.6-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.0 + - @backstage/plugin-permission-common@0.7.10 + +## 0.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.15.0 + - @backstage/plugin-kubernetes-backend@0.13.1 + - @backstage/plugin-search-backend-node@1.2.11 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0 + - @backstage/plugin-techdocs-backend@1.9.0 + - @backstage/plugin-scaffolder-backend@1.19.0 + - @backstage/plugin-search-backend@1.4.7 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4 + - @backstage/plugin-entity-feedback-backend@0.2.4 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/plugin-linguist-backend@0.5.4 + - @backstage/plugin-playlist-backend@0.3.11 + - @backstage/backend-tasks@0.5.12 + - @backstage/plugin-badges-backend@0.3.4 + - @backstage/plugin-app-backend@0.3.55 + - @backstage/plugin-search-backend-module-techdocs@0.1.11 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-jenkins-backend@0.3.1 + - @backstage/plugin-adr-backend@0.4.4 + - @backstage/plugin-proxy-backend@0.4.5 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4 + - @backstage/plugin-lighthouse-backend@0.3.4 + - @backstage/plugin-search-backend-module-catalog@0.1.11 + - @backstage/plugin-todo-backend@0.3.5 + - @backstage/plugin-devtools-backend@0.2.4 + - @backstage/backend-defaults@0.2.7 + - @backstage/plugin-auth-node@0.4.1 + - @backstage/plugin-azure-devops-backend@0.4.4 + - @backstage/plugin-nomad-backend@0.1.9 + - @backstage/plugin-permission-backend@0.5.30 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4 + - @backstage/plugin-permission-node@0.7.18 + - @backstage/plugin-search-backend-module-explore@0.1.11 + - @backstage/plugin-sonarqube-backend@0.2.9 + +## 0.0.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.13.1-next.2 + - @backstage/plugin-scaffolder-backend@1.19.0-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.4-next.2 + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/plugin-linguist-backend@0.5.4-next.2 + - @backstage/plugin-playlist-backend@0.3.11-next.2 + - @backstage/plugin-techdocs-backend@1.9.0-next.2 + - @backstage/plugin-catalog-backend@1.15.0-next.2 + - @backstage/backend-tasks@0.5.12-next.2 + - @backstage/plugin-badges-backend@0.3.4-next.2 + - @backstage/plugin-app-backend@0.3.55-next.2 + - @backstage/backend-defaults@0.2.7-next.2 + - @backstage/plugin-adr-backend@0.4.4-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + - @backstage/plugin-azure-devops-backend@0.4.4-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.2 + - @backstage/plugin-devtools-backend@0.2.4-next.2 + - @backstage/plugin-jenkins-backend@0.3.1-next.2 + - @backstage/plugin-lighthouse-backend@0.3.4-next.2 + - @backstage/plugin-nomad-backend@0.1.9-next.2 + - @backstage/plugin-permission-backend@0.5.30-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.2 + - @backstage/plugin-permission-node@0.7.18-next.2 + - @backstage/plugin-proxy-backend@0.4.5-next.2 + - @backstage/plugin-search-backend@1.4.7-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.11-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.11-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.2 + - @backstage/plugin-search-backend-node@1.2.11-next.2 + - @backstage/plugin-sonarqube-backend@0.2.9-next.2 + - @backstage/plugin-todo-backend@0.3.5-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.2 + +## 0.0.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.15.0-next.1 + - @backstage/plugin-techdocs-backend@1.9.0-next.1 + - @backstage/plugin-scaffolder-backend@1.19.0-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.1 + - @backstage/plugin-jenkins-backend@0.3.1-next.1 + - @backstage/plugin-kubernetes-backend@0.13.1-next.1 + - @backstage/plugin-lighthouse-backend@0.3.4-next.1 + - @backstage/plugin-linguist-backend@0.5.4-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.11-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.1 + - @backstage/plugin-todo-backend@0.3.5-next.1 + - @backstage/plugin-adr-backend@0.4.4-next.1 + - @backstage/backend-defaults@0.2.7-next.1 + - @backstage/backend-tasks@0.5.12-next.1 + - @backstage/plugin-app-backend@0.3.55-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/plugin-badges-backend@0.3.4-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.4-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.1 + - @backstage/plugin-permission-node@0.7.18-next.1 + - @backstage/plugin-playlist-backend@0.3.11-next.1 + - @backstage/plugin-proxy-backend@0.4.5-next.1 + - @backstage/plugin-search-backend@1.4.7-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.11-next.1 + - @backstage/plugin-sonarqube-backend@0.2.9-next.1 + - @backstage/plugin-azure-devops-backend@0.4.4-next.1 + - @backstage/plugin-devtools-backend@0.2.4-next.1 + - @backstage/plugin-nomad-backend@0.1.9-next.1 + - @backstage/plugin-permission-backend@0.5.30-next.1 + - @backstage/plugin-search-backend-node@1.2.11-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.1 + - @backstage/plugin-permission-common@0.7.9 + +## 0.0.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.11-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.0 + - @backstage/plugin-techdocs-backend@1.8.1-next.0 + - @backstage/plugin-scaffolder-backend@1.19.0-next.0 + - @backstage/plugin-catalog-backend@1.15.0-next.0 + - @backstage/plugin-search-backend@1.4.7-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.0 + - @backstage/plugin-proxy-backend@0.4.5-next.0 + - @backstage/plugin-app-backend@0.3.55-next.0 + - @backstage/plugin-devtools-backend@0.2.4-next.0 + - @backstage/backend-defaults@0.2.7-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/backend-tasks@0.5.12-next.0 + - @backstage/plugin-adr-backend@0.4.4-next.0 + - @backstage/plugin-auth-node@0.4.1-next.0 + - @backstage/plugin-azure-devops-backend@0.4.4-next.0 + - @backstage/plugin-badges-backend@0.3.4-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.4-next.0 + - @backstage/plugin-jenkins-backend@0.3.1-next.0 + - @backstage/plugin-kubernetes-backend@0.13.1-next.0 + - @backstage/plugin-lighthouse-backend@0.3.4-next.0 + - @backstage/plugin-linguist-backend@0.5.4-next.0 + - @backstage/plugin-nomad-backend@0.1.9-next.0 + - @backstage/plugin-permission-backend@0.5.30-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.0 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-permission-node@0.7.18-next.0 + - @backstage/plugin-playlist-backend@0.3.11-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.11-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.11-next.0 + - @backstage/plugin-sonarqube-backend@0.2.9-next.0 + - @backstage/plugin-todo-backend@0.3.5-next.0 + +## 0.0.16 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-nomad-backend@0.1.8 + - @backstage/backend-tasks@0.5.11 + - @backstage/plugin-sonarqube-backend@0.2.8 + - @backstage/plugin-scaffolder-backend@1.18.0 + - @backstage/plugin-playlist-backend@0.3.10 + - @backstage/plugin-techdocs-backend@1.8.0 + - @backstage/plugin-catalog-backend@1.14.0 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/plugin-badges-backend@0.3.3 + - @backstage/plugin-kubernetes-backend@0.13.0 + - @backstage/plugin-jenkins-backend@0.3.0 + - @backstage/plugin-search-backend@1.4.6 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/plugin-lighthouse-backend@0.3.3 + - @backstage/plugin-linguist-backend@0.5.3 + - @backstage/plugin-search-backend-module-catalog@0.1.10 + - @backstage/plugin-search-backend-module-explore@0.1.10 + - @backstage/plugin-search-backend-module-techdocs@0.1.10 + - @backstage/plugin-search-backend-node@1.2.10 + - @backstage/backend-defaults@0.2.6 + - @backstage/plugin-adr-backend@0.4.3 + - @backstage/plugin-app-backend@0.3.54 + - @backstage/plugin-azure-devops-backend@0.4.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3 + - @backstage/plugin-devtools-backend@0.2.3 + - @backstage/plugin-entity-feedback-backend@0.2.3 + - @backstage/plugin-permission-backend@0.5.29 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3 + - @backstage/plugin-permission-node@0.7.17 + - @backstage/plugin-proxy-backend@0.4.3 + - @backstage/plugin-todo-backend@0.3.4 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3 + - @backstage/plugin-permission-common@0.7.9 + +## 0.0.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-nomad-backend@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend@1.18.0-next.2 + - @backstage/plugin-techdocs-backend@1.8.0-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/plugin-catalog-backend@1.14.0-next.2 + - @backstage/plugin-kubernetes-backend@0.12.3-next.2 + - @backstage/plugin-jenkins-backend@0.2.9-next.2 + - @backstage/backend-defaults@0.2.6-next.2 + - @backstage/backend-tasks@0.5.11-next.2 + - @backstage/plugin-adr-backend@0.4.3-next.2 + - @backstage/plugin-app-backend@0.3.54-next.2 + - @backstage/plugin-azure-devops-backend@0.4.3-next.2 + - @backstage/plugin-badges-backend@0.3.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3-next.2 + - @backstage/plugin-devtools-backend@0.2.3-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.3-next.2 + - @backstage/plugin-lighthouse-backend@0.3.3-next.2 + - @backstage/plugin-linguist-backend@0.5.3-next.2 + - @backstage/plugin-permission-backend@0.5.29-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3-next.2 + - @backstage/plugin-permission-node@0.7.17-next.2 + - @backstage/plugin-playlist-backend@0.3.10-next.2 + - @backstage/plugin-proxy-backend@0.4.3-next.2 + - @backstage/plugin-search-backend@1.4.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.10-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.10-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.10-next.2 + - @backstage/plugin-search-backend-node@1.2.10-next.2 + - @backstage/plugin-sonarqube-backend@0.2.8-next.2 + - @backstage/plugin-todo-backend@0.3.4-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3-next.2 + - @backstage/plugin-permission-common@0.7.9-next.0 + +## 0.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.10-next.1 + - @backstage/plugin-catalog-backend@1.14.0-next.1 + - @backstage/plugin-scaffolder-backend@1.18.0-next.1 + - @backstage/plugin-badges-backend@0.3.2-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-lighthouse-backend@0.3.2-next.1 + - @backstage/plugin-linguist-backend@0.5.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.1 + - @backstage/plugin-search-backend-node@1.2.9-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.1 + - @backstage/plugin-kubernetes-backend@0.12.2-next.1 + - @backstage/plugin-todo-backend@0.3.3-next.1 + - @backstage/backend-defaults@0.2.5-next.1 + - @backstage/plugin-adr-backend@0.4.2-next.1 + - @backstage/plugin-app-backend@0.3.53-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/plugin-azure-devops-backend@0.4.2-next.1 + - @backstage/plugin-devtools-backend@0.2.2-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.1 + - @backstage/plugin-permission-backend@0.5.28-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.1 + - @backstage/plugin-permission-node@0.7.16-next.1 + - @backstage/plugin-playlist-backend@0.3.9-next.1 + - @backstage/plugin-proxy-backend@0.4.2-next.1 + - @backstage/plugin-search-backend@1.4.5-next.1 + - @backstage/plugin-sonarqube-backend@0.2.7-next.1 + - @backstage/plugin-techdocs-backend@1.7.2-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.1 + - @backstage/plugin-permission-common@0.7.8 + +## 0.0.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.7-next.0 + - @backstage/plugin-playlist-backend@0.3.9-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/plugin-adr-backend@0.4.2-next.0 + - @backstage/plugin-scaffolder-backend@1.17.3-next.0 + - @backstage/plugin-techdocs-backend@1.7.2-next.0 + - @backstage/plugin-todo-backend@0.3.3-next.0 + - @backstage/backend-defaults@0.2.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/plugin-app-backend@0.3.53-next.0 + - @backstage/plugin-azure-devops-backend@0.4.2-next.0 + - @backstage/plugin-badges-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 + - @backstage/plugin-devtools-backend@0.2.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 + - @backstage/plugin-kubernetes-backend@0.12.2-next.0 + - @backstage/plugin-lighthouse-backend@0.3.2-next.0 + - @backstage/plugin-linguist-backend@0.5.2-next.0 + - @backstage/plugin-permission-backend@0.5.28-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-proxy-backend@0.4.2-next.0 + - @backstage/plugin-search-backend@1.4.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + +## 0.0.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/backend-tasks@0.5.8 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/backend-defaults@0.2.3 + - @backstage/plugin-search-backend-node@1.2.7 + +## 0.0.15-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@1.7.0-next.3 + - @backstage/plugin-proxy-backend@0.4.0-next.3 + - @backstage/plugin-adr-backend@0.4.0-next.3 + - @backstage/plugin-azure-devops-backend@0.4.0-next.3 + - @backstage/plugin-badges-backend@0.3.0-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0-next.3 + - @backstage/plugin-devtools-backend@0.2.0-next.3 + - @backstage/plugin-entity-feedback-backend@0.2.0-next.3 + - @backstage/plugin-lighthouse-backend@0.3.0-next.3 + - @backstage/plugin-linguist-backend@0.5.0-next.3 + - @backstage/plugin-todo-backend@0.3.0-next.3 + - @backstage/plugin-app-backend@0.3.51-next.3 + - @backstage/plugin-catalog-backend@1.13.0-next.3 + - @backstage/plugin-kubernetes-backend@0.11.6-next.3 + - @backstage/plugin-permission-backend@0.5.26-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.1 + - @backstage/plugin-scaffolder-backend@1.17.0-next.3 + - @backstage/plugin-search-backend@1.4.3-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.7-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.3 + - @backstage/plugin-permission-common@0.7.8-next.2 + - @backstage/plugin-permission-node@0.7.14-next.3 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0-next.0 + - @backstage/backend-defaults@0.2.3-next.3 + - @backstage/backend-tasks@0.5.8-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + - @backstage/plugin-search-backend-node@1.2.7-next.3 + +## 0.0.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.16.6-next.2 + - @backstage/plugin-permission-backend@0.5.26-next.2 + - @backstage/plugin-catalog-backend@1.13.0-next.2 + - @backstage/plugin-badges-backend@0.2.6-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.0 + - @backstage/backend-tasks@0.5.8-next.2 + - @backstage/backend-defaults@0.2.3-next.2 + - @backstage/plugin-app-backend@0.3.51-next.2 + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.9-next.2 + - @backstage/plugin-kubernetes-backend@0.11.6-next.2 + - @backstage/plugin-linguist-backend@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.14-next.2 + - @backstage/plugin-proxy-backend@0.3.3-next.2 + - @backstage/plugin-search-backend@1.4.3-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.7-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.7-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.2 + - @backstage/plugin-techdocs-backend@1.7.0-next.2 + - @backstage/plugin-devtools-backend@0.1.6-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/plugin-adr-backend@0.3.9-next.2 + - @backstage/plugin-azure-devops-backend@0.3.30-next.2 + - @backstage/plugin-lighthouse-backend@0.2.7-next.2 + - @backstage/plugin-permission-common@0.7.8-next.1 + - @backstage/plugin-search-backend-node@1.2.7-next.2 + - @backstage/plugin-todo-backend@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.2 + +## 0.0.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.6-next.1 + - @backstage/plugin-catalog-backend@1.13.0-next.1 + - @backstage/plugin-devtools-backend@0.1.6-next.1 + - @backstage/backend-tasks@0.5.8-next.1 + - @backstage/plugin-techdocs-backend@1.7.0-next.1 + - @backstage/plugin-scaffolder-backend@1.16.6-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/plugin-adr-backend@0.3.9-next.1 + - @backstage/plugin-app-backend@0.3.51-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/plugin-azure-devops-backend@0.3.30-next.1 + - @backstage/plugin-badges-backend@0.2.6-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.9-next.1 + - @backstage/plugin-lighthouse-backend@0.2.7-next.1 + - @backstage/plugin-linguist-backend@0.4.3-next.1 + - @backstage/plugin-permission-backend@0.5.26-next.1 + - @backstage/plugin-permission-common@0.7.8-next.0 + - @backstage/plugin-permission-node@0.7.14-next.1 + - @backstage/plugin-proxy-backend@0.3.3-next.1 + - @backstage/plugin-search-backend@1.4.3-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.7-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.7-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.1 + - @backstage/plugin-search-backend-node@1.2.7-next.1 + - @backstage/plugin-todo-backend@0.2.3-next.1 + - @backstage/backend-defaults@0.2.3-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.1 + +## 0.0.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.12.2-next.0 + - @backstage/plugin-scaffolder-backend@1.16.3-next.0 + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/plugin-linguist-backend@0.4.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.8-next.0 + - @backstage/backend-tasks@0.5.7-next.0 + - @backstage/plugin-app-backend@0.3.50-next.0 + - @backstage/backend-defaults@0.2.2-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/plugin-adr-backend@0.3.8-next.0 + - @backstage/plugin-azure-devops-backend@0.3.29-next.0 + - @backstage/plugin-badges-backend@0.2.5-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.2-next.0 + - @backstage/plugin-devtools-backend@0.1.5-next.0 + - @backstage/plugin-kubernetes-backend@0.11.5-next.0 + - @backstage/plugin-lighthouse-backend@0.2.6-next.0 + - @backstage/plugin-permission-backend@0.5.25-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.13-next.0 + - @backstage/plugin-proxy-backend@0.3.2-next.0 + - @backstage/plugin-search-backend@1.4.2-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.6-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.6-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.6-next.0 + - @backstage/plugin-search-backend-node@1.2.6-next.0 + - @backstage/plugin-techdocs-backend@1.6.7-next.0 + - @backstage/plugin-todo-backend@0.2.2-next.0 + +## 0.0.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.4 + - @backstage/plugin-search-backend-module-catalog@0.1.4 + - @backstage/plugin-search-backend-module-explore@0.1.4 + - @backstage/plugin-azure-devops-backend@0.3.27 + - @backstage/plugin-kubernetes-backend@0.11.3 + - @backstage/plugin-lighthouse-backend@0.2.4 + - @backstage/plugin-permission-backend@0.5.23 + - @backstage/plugin-scaffolder-backend@1.16.0 + - @backstage/backend-defaults@0.2.0 + - @backstage/plugin-devtools-backend@0.1.3 + - @backstage/plugin-techdocs-backend@1.6.5 + - @backstage/plugin-catalog-backend@1.12.0 + - @backstage/plugin-badges-backend@0.2.3 + - @backstage/plugin-search-backend@1.4.0 + - @backstage/plugin-proxy-backend@0.3.0 + - @backstage/plugin-todo-backend@0.2.0 + - @backstage/plugin-app-backend@0.3.48 + - @backstage/backend-plugin-api@0.6.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.1.6 + - @backstage/plugin-search-backend-node@1.2.4 + - @backstage/plugin-linguist-backend@0.4.0 + - @backstage/plugin-auth-node@0.2.17 + - @backstage/backend-tasks@0.5.5 + - @backstage/plugin-adr-backend@0.3.6 + - @backstage/plugin-permission-node@0.7.11 + - @backstage/plugin-permission-common@0.7.7 + +## 0.0.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.4-next.2 + - @backstage/plugin-scaffolder-backend@1.15.2-next.2 + - @backstage/plugin-catalog-backend@1.12.0-next.2 + - @backstage/backend-plugin-api@0.6.0-next.2 + - @backstage/plugin-proxy-backend@0.3.0-next.2 + - @backstage/backend-tasks@0.5.5-next.2 + - @backstage/plugin-app-backend@0.3.48-next.2 + - @backstage/plugin-linguist-backend@0.4.0-next.2 + - @backstage/plugin-techdocs-backend@1.6.5-next.2 + - @backstage/backend-defaults@0.2.0-next.2 + - @backstage/plugin-adr-backend@0.3.6-next.2 + - @backstage/plugin-azure-devops-backend@0.3.27-next.2 + - @backstage/plugin-badges-backend@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.2 + - @backstage/plugin-devtools-backend@0.1.3-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.2 + - @backstage/plugin-kubernetes-backend@0.11.3-next.2 + - @backstage/plugin-lighthouse-backend@0.2.4-next.2 + - @backstage/plugin-permission-backend@0.5.23-next.2 + - @backstage/plugin-permission-node@0.7.11-next.2 + - @backstage/plugin-search-backend@1.4.0-next.2 + - @backstage/plugin-search-backend-node@1.2.4-next.2 + - @backstage/plugin-todo-backend@0.2.0-next.2 + - @backstage/plugin-auth-node@0.2.17-next.2 + +## 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 + +- Updated dependencies + - @backstage/plugin-linguist-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.0 + - @backstage/plugin-search-backend-node@1.2.4-next.0 + - @backstage/plugin-todo-backend@0.2.0-next.0 + - @backstage/plugin-catalog-backend@1.12.0-next.0 + - @backstage/plugin-search-backend@1.4.0-next.0 + - @backstage/backend-defaults@0.1.13-next.0 + - @backstage/backend-tasks@0.5.5-next.0 + - @backstage/plugin-adr-backend@0.3.6-next.0 + - @backstage/plugin-app-backend@0.3.48-next.0 + - @backstage/plugin-auth-node@0.2.17-next.0 + - @backstage/plugin-azure-devops-backend@0.3.27-next.0 + - @backstage/plugin-badges-backend@0.2.3-next.0 + - @backstage/plugin-devtools-backend@0.1.3-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.0 + - @backstage/plugin-kubernetes-backend@0.11.3-next.0 + - @backstage/plugin-lighthouse-backend@0.2.4-next.0 + - @backstage/plugin-permission-backend@0.5.23-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.11-next.0 + - @backstage/plugin-scaffolder-backend@1.15.2-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.4-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.0 + - @backstage/plugin-techdocs-backend@1.6.5-next.0 + +## 0.0.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.2 + - @backstage/plugin-badges-backend@0.2.2 + - @backstage/plugin-devtools-backend@0.1.2 + - @backstage/plugin-scaffolder-backend@1.15.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1 + - @backstage/plugin-azure-devops-backend@0.3.26 + - @backstage/plugin-linguist-backend@0.3.1 + - @backstage/plugin-adr-backend@0.3.5 + - @backstage/plugin-lighthouse-backend@0.2.3 + - @backstage/plugin-entity-feedback-backend@0.1.5 + - @backstage/plugin-catalog-backend@1.11.0 + - @backstage/backend-defaults@0.1.12 + - @backstage/backend-tasks@0.5.4 + - @backstage/plugin-app-backend@0.3.47 + - @backstage/plugin-auth-node@0.2.16 + - @backstage/plugin-permission-backend@0.5.22 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.10 + - @backstage/plugin-search-backend@1.3.3 + - @backstage/plugin-search-backend-module-catalog@0.1.3 + - @backstage/plugin-search-backend-module-explore@0.1.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.3 + - @backstage/plugin-search-backend-node@1.2.3 + - @backstage/plugin-techdocs-backend@1.6.4 + - @backstage/plugin-todo-backend@0.1.44 + +## 0.0.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-devtools-backend@0.1.2-next.2 + - @backstage/plugin-scaffolder-backend@1.15.1-next.1 + - @backstage/plugin-kubernetes-backend@0.11.2-next.2 + - @backstage/plugin-adr-backend@0.3.5-next.1 + - @backstage/backend-defaults@0.1.12-next.0 + - @backstage/backend-tasks@0.5.4-next.0 + - @backstage/plugin-app-backend@0.3.47-next.0 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-azure-devops-backend@0.3.26-next.1 + - @backstage/plugin-badges-backend@0.2.2-next.1 + - @backstage/plugin-catalog-backend@1.11.0-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 + - @backstage/plugin-linguist-backend@0.3.1-next.1 + - @backstage/plugin-permission-backend@0.5.22-next.0 + - @backstage/plugin-permission-common@0.7.7-next.0 + - @backstage/plugin-permission-node@0.7.10-next.0 + - @backstage/plugin-search-backend@1.3.3-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 + - @backstage/plugin-search-backend-node@1.2.3-next.0 + - @backstage/plugin-techdocs-backend@1.6.4-next.0 + - @backstage/plugin-todo-backend@0.1.44-next.0 + +## 0.0.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.2-next.1 + - @backstage/plugin-badges-backend@0.2.2-next.1 + - @backstage/plugin-azure-devops-backend@0.3.26-next.1 + - @backstage/plugin-devtools-backend@0.1.2-next.1 + - @backstage/plugin-linguist-backend@0.3.1-next.1 + +## 0.0.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 + - @backstage/plugin-catalog-backend@1.11.0-next.0 + - @backstage/plugin-kubernetes-backend@0.11.2-next.0 + - @backstage/backend-defaults@0.1.12-next.0 + - @backstage/plugin-app-backend@0.3.47-next.0 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-permission-backend@0.5.22-next.0 + - @backstage/plugin-permission-common@0.7.7-next.0 + - @backstage/plugin-permission-node@0.7.10-next.0 + - @backstage/plugin-scaffolder-backend@1.15.1-next.0 + - @backstage/plugin-search-backend@1.3.3-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 + - @backstage/plugin-search-backend-node@1.2.3-next.0 + - @backstage/plugin-techdocs-backend@1.6.4-next.0 + - @backstage/plugin-todo-backend@0.1.44-next.0 + +## 0.0.12 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.15.0 + - @backstage/plugin-kubernetes-backend@0.11.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0 + - @backstage/plugin-catalog-backend@1.10.0 + - @backstage/plugin-search-backend@1.3.2 + - @backstage/plugin-search-backend-module-explore@0.1.2 + - @backstage/backend-defaults@0.1.11 + - @backstage/plugin-app-backend@0.3.46 + - @backstage/plugin-auth-node@0.2.15 + - @backstage/plugin-permission-backend@0.5.21 + - @backstage/plugin-permission-node@0.7.9 + - @backstage/plugin-search-backend-module-catalog@0.1.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.2 + - @backstage/plugin-search-backend-node@1.2.2 + - @backstage/plugin-techdocs-backend@1.6.3 + - @backstage/plugin-todo-backend@0.1.43 + - @backstage/plugin-permission-common@0.7.6 + +## 0.0.12-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.15.0-next.3 + - @backstage/plugin-kubernetes-backend@0.11.1-next.3 + - @backstage/plugin-catalog-backend@1.10.0-next.2 + - @backstage/backend-defaults@0.1.11-next.2 + - @backstage/plugin-app-backend@0.3.46-next.2 + - @backstage/plugin-auth-node@0.2.15-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.1 + - @backstage/plugin-permission-backend@0.5.21-next.2 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-permission-node@0.7.9-next.2 + - @backstage/plugin-search-backend@1.3.2-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.2 + - @backstage/plugin-search-backend-node@1.2.2-next.2 + - @backstage/plugin-techdocs-backend@1.6.3-next.2 + - @backstage/plugin-todo-backend@0.1.43-next.2 + +## 0.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.1-next.2 + - @backstage/plugin-scaffolder-backend@1.15.0-next.2 + +## 0.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/backend-defaults@0.1.11-next.1 + - @backstage/plugin-app-backend@0.3.46-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-kubernetes-backend@0.11.1-next.1 + - @backstage/plugin-permission-backend@0.5.21-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend@1.3.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-techdocs-backend@1.6.3-next.1 + - @backstage/plugin-todo-backend@0.1.43-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + +## 0.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.14.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.0 + - @backstage/plugin-kubernetes-backend@0.11.1-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.0 + - @backstage/plugin-techdocs-backend@1.6.3-next.0 + - @backstage/plugin-todo-backend@0.1.43-next.0 + - @backstage/plugin-app-backend@0.3.46-next.0 + - @backstage/backend-defaults@0.1.11-next.0 + - @backstage/plugin-auth-node@0.2.15-next.0 + - @backstage/plugin-permission-backend@0.5.21-next.0 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-permission-node@0.7.9-next.0 + - @backstage/plugin-search-backend@1.3.2-next.0 + - @backstage/plugin-search-backend-node@1.2.2-next.0 + +## 0.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.14.0 + - @backstage/plugin-catalog-backend@1.9.1 + - @backstage/plugin-kubernetes-backend@0.11.0 + - @backstage/plugin-todo-backend@0.1.42 + - @backstage/plugin-permission-node@0.7.8 + - @backstage/plugin-search-backend@1.3.1 + - @backstage/backend-defaults@0.1.10 + - @backstage/plugin-app-backend@0.3.45 + - @backstage/plugin-auth-node@0.2.14 + - @backstage/plugin-search-backend-module-catalog@0.1.1 + - @backstage/plugin-search-backend-module-explore@0.1.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.1 + - @backstage/plugin-techdocs-backend@1.6.2 + - @backstage/plugin-permission-backend@0.5.20 + - @backstage/plugin-search-backend-node@1.2.1 + - @backstage/plugin-permission-common@0.7.5 + +## 0.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.9.1-next.2 + - @backstage/plugin-kubernetes-backend@0.11.0-next.2 + - @backstage/plugin-search-backend@1.3.1-next.2 + - @backstage/plugin-scaffolder-backend@1.13.2-next.2 + +## 0.0.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.0-next.1 + - @backstage/plugin-catalog-backend@1.9.1-next.1 + - @backstage/plugin-scaffolder-backend@1.13.2-next.1 + - @backstage/backend-defaults@0.1.10-next.1 + - @backstage/plugin-app-backend@0.3.45-next.1 + - @backstage/plugin-auth-node@0.2.14-next.1 + - @backstage/plugin-permission-backend@0.5.20-next.1 + - @backstage/plugin-permission-node@0.7.8-next.1 + - @backstage/plugin-search-backend@1.3.1-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.1-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.1-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.1 + - @backstage/plugin-search-backend-node@1.2.1-next.1 + - @backstage/plugin-techdocs-backend@1.6.2-next.1 + - @backstage/plugin-todo-backend@0.1.42-next.1 + +## 0.0.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.8-next.0 + - @backstage/plugin-scaffolder-backend@1.13.2-next.0 + - @backstage/plugin-kubernetes-backend@0.11.0-next.0 + - @backstage/backend-defaults@0.1.10-next.0 + - @backstage/plugin-app-backend@0.3.45-next.0 + - @backstage/plugin-auth-node@0.2.14-next.0 + - @backstage/plugin-catalog-backend@1.9.1-next.0 + - @backstage/plugin-search-backend@1.3.1-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.1-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.0 + - @backstage/plugin-techdocs-backend@1.6.2-next.0 + - @backstage/plugin-permission-backend@0.5.20-next.0 + - @backstage/plugin-search-backend-node@1.2.1-next.0 + - @backstage/plugin-todo-backend@0.1.42-next.0 + - @backstage/plugin-permission-common@0.7.5 + +## 0.0.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0 + - @backstage/plugin-scaffolder-backend@1.13.0 + - @backstage/plugin-catalog-backend@1.9.0 + - @backstage/plugin-permission-node@0.7.7 + - @backstage/plugin-permission-backend@0.5.19 + - @backstage/plugin-search-backend@1.3.0 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-techdocs-backend@1.6.1 + - @backstage/plugin-search-backend-node@1.2.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0 + - @backstage/plugin-search-backend-module-explore@0.1.0 + - @backstage/backend-defaults@0.1.9 + - @backstage/plugin-app-backend@0.3.44 + - @backstage/plugin-auth-node@0.2.13 + - @backstage/plugin-todo-backend@0.1.41 + +## 0.0.10-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.3 + - @backstage/plugin-catalog-backend@1.9.0-next.3 + - @backstage/plugin-scaffolder-backend@1.13.0-next.3 + - @backstage/backend-defaults@0.1.9-next.2 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.3 + - @backstage/plugin-todo-backend@0.1.41-next.3 + +## 0.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.2 + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/backend-defaults@0.1.9-next.2 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.2 + - @backstage/plugin-todo-backend@0.1.41-next.2 + +## 0.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@1.3.0-next.1 + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/plugin-kubernetes-backend@0.10.0-next.1 + - @backstage/plugin-techdocs-backend@1.6.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 + - @backstage/backend-defaults@0.1.9-next.1 + - @backstage/plugin-app-backend@0.3.44-next.1 + - @backstage/plugin-todo-backend@0.1.41-next.1 + +## 0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/backend-defaults@0.1.9-next.0 + - @backstage/plugin-app-backend@0.3.44-next.0 + - @backstage/plugin-techdocs-backend@1.6.1-next.0 + - @backstage/plugin-todo-backend@0.1.41-next.0 + +## 0.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-defaults@0.1.8 + - @backstage/plugin-app-backend@0.3.43 + +## 0.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/backend-defaults@0.1.8-next.2 + - @backstage/plugin-app-backend@0.3.43-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-todo-backend@0.1.40-next.2 + +## 0.0.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.1 + - @backstage/plugin-app-backend@0.3.43-next.1 + - @backstage/plugin-catalog-backend@1.8.0-next.1 + - @backstage/plugin-todo-backend@0.1.40-next.1 + - @backstage/backend-defaults@0.1.8-next.1 + +## 0.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-todo-backend@0.1.40-next.0 + - @backstage/plugin-scaffolder-backend@1.11.1-next.0 + - @backstage/plugin-catalog-backend@1.8.0-next.0 + - @backstage/backend-defaults@0.1.8-next.0 + - @backstage/plugin-app-backend@0.3.43-next.0 + +## 0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2 + - @backstage/plugin-scaffolder-backend@1.11.0 + - @backstage/plugin-app-backend@0.3.42 + - @backstage/backend-defaults@0.1.7 + +## 0.0.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-app-backend@0.3.42-next.2 + - @backstage/backend-defaults@0.1.7-next.2 + +## 0.0.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/backend-defaults@0.1.7-next.1 + - @backstage/plugin-app-backend@0.3.42-next.1 + +## 0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.11.0-next.0 + - @backstage/backend-defaults@0.1.7-next.0 + - @backstage/plugin-app-backend@0.3.42-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + +## 0.0.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0 + - @backstage/backend-defaults@0.1.5 + - @backstage/plugin-app-backend@0.3.40 + - @backstage/plugin-catalog-backend@1.7.0 + +## 0.0.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.1.5-next.1 + - @backstage/plugin-scaffolder-backend@1.10.0-next.2 + - @backstage/plugin-catalog-backend@1.7.0-next.2 + - @backstage/plugin-app-backend@0.3.40-next.1 + +## 0.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.1.5-next.0 + - @backstage/plugin-scaffolder-backend@1.10.0-next.1 + - @backstage/plugin-app-backend@0.3.40-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.1 + +## 0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.9.1-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.0 + - @backstage/backend-defaults@0.1.4 + - @backstage/plugin-app-backend@0.3.39 + +## 0.0.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.9.0 + - @backstage/plugin-catalog-backend@1.6.0 + - @backstage/plugin-app-backend@0.3.39 + - @backstage/backend-defaults@0.1.4 + +## 0.0.6-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0-next.3 + - @backstage/plugin-scaffolder-backend@1.9.0-next.3 + - @backstage/backend-defaults@0.1.4-next.3 + - @backstage/plugin-app-backend@0.3.39-next.3 + +## 0.0.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0-next.2 + - @backstage/plugin-app-backend@0.3.39-next.2 + - @backstage/plugin-scaffolder-backend@1.9.0-next.2 + - @backstage/backend-defaults@0.1.4-next.2 + +## 0.0.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0-next.1 + - @backstage/plugin-scaffolder-backend@1.8.1-next.1 + - @backstage/plugin-app-backend@0.3.39-next.1 + - @backstage/backend-defaults@0.1.4-next.1 + +## 0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.1-next.0 + - @backstage/plugin-catalog-backend@1.6.0-next.0 + - @backstage/plugin-app-backend@0.3.39-next.0 + - @backstage/backend-defaults@0.1.4-next.0 + +## 0.0.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.5.1 + - @backstage/plugin-scaffolder-backend@1.8.0 + - @backstage/plugin-app-backend@0.3.38 + - @backstage/backend-defaults@0.1.3 + +## 0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.2 + - @backstage/plugin-app-backend@0.3.38-next.1 + - @backstage/plugin-catalog-backend@1.5.1-next.1 + - @backstage/backend-defaults@0.1.3-next.1 + +## 0.0.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + +## 0.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.5.1-next.0 + - @backstage/plugin-scaffolder-backend@1.8.0-next.0 + - @backstage/plugin-app-backend@0.3.38-next.0 + - @backstage/backend-defaults@0.1.3-next.0 + +## 0.0.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.5.0 + - @backstage/plugin-scaffolder-backend@1.7.0 + - @backstage/backend-defaults@0.1.2 + - @backstage/plugin-app-backend@0.3.37 + +## 0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.5.0-next.2 + - @backstage/plugin-scaffolder-backend@1.7.0-next.2 + - @backstage/plugin-app-backend@0.3.37-next.2 + - @backstage/backend-defaults@0.1.2-next.2 + +## 0.0.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.7.0-next.1 + - @backstage/backend-defaults@0.1.2-next.1 + - @backstage/plugin-app-backend@0.3.37-next.1 + - @backstage/plugin-catalog-backend@1.4.1-next.1 + +## 0.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.7.0-next.0 + - @backstage/backend-defaults@0.1.2-next.0 + - @backstage/plugin-catalog-backend@1.4.1-next.0 + - @backstage/plugin-app-backend@0.3.37-next.0 + +## 0.0.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.6.0 + - @backstage/plugin-catalog-backend@1.4.0 + - @backstage/backend-defaults@0.1.1 + +## 0.0.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.4.0-next.1 + - @backstage/plugin-scaffolder-backend@1.6.0-next.1 + +## 0.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.6.0-next.0 + - @backstage/plugin-catalog-backend@1.3.2-next.0 + - @backstage/backend-defaults@0.1.1-next.0 + +## 0.0.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.5.0 + - @backstage/backend-defaults@0.1.0 + - @backstage/plugin-catalog-backend@1.3.1 + +## 0.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.5.0-next.0 + - @backstage/backend-app-api@0.1.1-next.0 + - @backstage/plugin-catalog-backend@1.3.1-next.0 + +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.3.0 + - @backstage/plugin-scaffolder-backend@1.4.0 + - @backstage/backend-app-api@0.1.0 + +## 0.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.3.0-next.3 + - @backstage/plugin-scaffolder-backend@1.4.0-next.3 + - @backstage/backend-app-api@0.1.0-next.0 diff --git a/packages/backend-split/README.md b/packages/backend-split/README.md new file mode 100644 index 0000000000..d5d2abe027 --- /dev/null +++ b/packages/backend-split/README.md @@ -0,0 +1,8 @@ +# example-backend + +This package is an EXAMPLE of a Backstage backend using the [new backend system](https://backstage.io/docs/backend-system/). + +The main purpose of this package is to provide a test bed for Backstage split deployment work. You can deploy both this package and the main `packages/backend` together by running the `start:split` command in both packages. This will run the following backends: + +1. `packages/backend` running on `:7007` with the default plugins installed. +2. `packages/backend-split` running on `:7008` with a subset of plugins installed for testing. diff --git a/packages/backend-split/app-config.split.yaml b/packages/backend-split/app-config.split.yaml new file mode 100644 index 0000000000..80d77aaa3d --- /dev/null +++ b/packages/backend-split/app-config.split.yaml @@ -0,0 +1,14 @@ +backend: + baseUrl: http://localhost:7008 + listen: + port: 7008 + +discovery: + endpoints: + - target: http://localhost:7007/api/{{pluginId}} + plugins: [proxy] + - target: http://localhost:7008/api/{{pluginId}} + plugins: [catalog] + instances: + - baseUrl: http://localhost:7007 + - baseUrl: http://localhost:7008 diff --git a/packages/backend-split/catalog-info.yaml b/packages/backend-split/catalog-info.yaml new file mode 100644 index 0000000000..8c81e9d5e9 --- /dev/null +++ b/packages/backend-split/catalog-info.yaml @@ -0,0 +1,9 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: example-backend-split + title: example-backend-split +spec: + lifecycle: experimental + type: backstage-backend + owner: maintainers diff --git a/packages/backend-split/knip-report.md b/packages/backend-split/knip-report.md new file mode 100644 index 0000000000..a26b412ee9 --- /dev/null +++ b/packages/backend-split/knip-report.md @@ -0,0 +1,12 @@ +# Knip report + +## Unused dependencies (5) + +| Name | Location | Severity | +| :----------------------------------------------- | :----------- | :------- | +| @backstage/plugin-catalog-backend-module-openapi | package.json | error | +| @backstage/plugin-search-backend-node | package.json | error | +| @backstage/plugin-permission-common | package.json | error | +| @backstage/plugin-permission-node | package.json | error | +| @backstage/backend-tasks | package.json | error | + diff --git a/packages/backend-split/package.json b/packages/backend-split/package.json new file mode 100644 index 0000000000..cca4f9ebd0 --- /dev/null +++ b/packages/backend-split/package.json @@ -0,0 +1,73 @@ +{ + "name": "example-backend-split", + "version": "0.0.33-next.2", + "backstage": { + "role": "backend" + }, + "private": true, + "keywords": [ + "backstage" + ], + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/backend" + }, + "license": "Apache-2.0", + "main": "dist/index.cjs.js", + "types": "src/index.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "start": "backstage-cli package start --require ./src/instrumentation.js", + "start:split": "backstage-cli package start --require ./src/instrumentation.js --config ../../app-config.yaml --config app-config.split.yaml", + "test": "backstage-cli package test" + }, + "dependencies": { + "@backstage/backend-defaults": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/plugin-app-backend": "workspace:^", + "@backstage/plugin-auth-backend": "workspace:^", + "@backstage/plugin-auth-backend-module-github-provider": "workspace:^", + "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^", + "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", + "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", + "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", + "@backstage/plugin-devtools-backend": "workspace:^", + "@backstage/plugin-events-backend": "workspace:^", + "@backstage/plugin-kubernetes-backend": "workspace:^", + "@backstage/plugin-notifications-backend": "workspace:^", + "@backstage/plugin-permission-backend": "workspace:^", + "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-node": "workspace:^", + "@backstage/plugin-proxy-backend": "workspace:^", + "@backstage/plugin-scaffolder-backend": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-github": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^", + "@backstage/plugin-search-backend": "workspace:^", + "@backstage/plugin-search-backend-module-catalog": "workspace:^", + "@backstage/plugin-search-backend-module-explore": "workspace:^", + "@backstage/plugin-search-backend-module-techdocs": "workspace:^", + "@backstage/plugin-search-backend-node": "workspace:^", + "@backstage/plugin-signals-backend": "workspace:^", + "@backstage/plugin-techdocs-backend": "workspace:^", + "@opentelemetry/auto-instrumentations-node": "^0.54.0", + "@opentelemetry/exporter-prometheus": "^0.54.0", + "@opentelemetry/sdk-node": "^0.54.0", + "example-app": "link:../app", + "express-promise-router": "^4.1.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" + } +} diff --git a/packages/backend-split/src/experimental/features.http b/packages/backend-split/src/experimental/features.http new file mode 100644 index 0000000000..41c07e99d4 --- /dev/null +++ b/packages/backend-split/src/experimental/features.http @@ -0,0 +1,5 @@ +GET http://localhost:7007/.backstage/systemInfo/features/installed + +### + +GET http://localhost:7008/.backstage/systemInfo/features/installed \ No newline at end of file diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend-split/src/experimental/instanceMetadata.ts similarity index 77% rename from packages/backend/src/instanceMetadata.ts rename to packages/backend-split/src/experimental/instanceMetadata.ts index 026fc6fd02..370ec02325 100644 --- a/packages/backend/src/instanceMetadata.ts +++ b/packages/backend-split/src/experimental/instanceMetadata.ts @@ -26,14 +26,22 @@ export default createBackendPlugin({ deps: { instanceMetadata: coreServices.rootInstanceMetadata, logger: coreServices.logger, + httpRouter: coreServices.rootHttpRouter, }, - async init({ instanceMetadata, logger }) { - const plugins = await instanceMetadata.getInstalledPlugins(); + async init({ instanceMetadata, logger, httpRouter }) { logger.info( `Installed plugins on this instance: ${plugins .map(e => e.pluginId) .join(', ')}`, ); + + const router = Router(); + + router.get('/features/installed', (_, res) => { + res.json({ items: instanceMetadata.getInstalledFeatures() }); + }); + + httpRouter.use('/.backstage/instanceInfo', router); }, }); }, diff --git a/packages/backend-split/src/experimental/systemMetadata.ts b/packages/backend-split/src/experimental/systemMetadata.ts new file mode 100644 index 0000000000..3b70059711 --- /dev/null +++ b/packages/backend-split/src/experimental/systemMetadata.ts @@ -0,0 +1,93 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { + BackendFeatureMeta, + systemMetadataServiceRef, +} from '@backstage/backend-plugin-api/alpha'; +import Router from 'express-promise-router'; + +// Example usage of the instance metadata service to log the installed features. +export default createBackendPlugin({ + pluginId: 'system-metadata-logging', + register(env) { + env.registerInit({ + deps: { + systemMetadata: systemMetadataServiceRef, + logger: coreServices.logger, + httpRouter: coreServices.rootHttpRouter, + }, + async init({ systemMetadata, logger, httpRouter }) { + logger.info( + `Instances in this system: ${JSON.stringify( + await systemMetadata.listInstances(), + )}`, + ); + + const router = Router(); + + router.get('/instances', async (_, res) => { + res.json(await systemMetadata.listInstances()); + }); + + router.get('/features/installed', async (_, res) => { + const instances = await systemMetadata.listInstances(); + const featurePromises = await Promise.allSettled( + instances.map(async instance => { + const response = await fetch( + `${instance.url}/.backstage/instanceInfo/features/installed`, + ); + if (response.ok) { + return { instance, response: await response.json() }; + } + throw new Error( + `Failed to fetch installed features from ${instance.url}`, + ); + }), + ); + const pluginByInstance: Record = {}; + for (const result of featurePromises) { + if (result.status !== 'fulfilled') { + logger.error( + `Failed to fetch installed features: ${result.reason}`, + ); + continue; + } + const instance = result.value.instance; + const installedFeatures = result.value.response + .items as BackendFeatureMeta[]; + for (const feature of installedFeatures) { + if (feature.type === 'plugin') { + if (!pluginByInstance[feature.pluginId]) { + pluginByInstance[feature.pluginId] = []; + } + pluginByInstance[feature.pluginId].push( + `${instance.url}/api/${feature.pluginId}`, + ); + } + } + } + res.json(pluginByInstance); + }); + + httpRouter.use('/.backstage/systemInfo', router); + }, + }); + }, +}); diff --git a/packages/backend-split/src/index.ts b/packages/backend-split/src/index.ts new file mode 100644 index 0000000000..ca5fcd93e8 --- /dev/null +++ b/packages/backend-split/src/index.ts @@ -0,0 +1,37 @@ +/* + * 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 { createBackend } from '@backstage/backend-defaults'; +import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha/systemMetadata'; + +const backend = createBackend(); + +backend.add(import('@backstage/plugin-catalog-backend-module-unprocessed')); +backend.add( + import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), +); +backend.add(import('@backstage/plugin-catalog-backend')); + +backend.add( + import('@backstage/plugin-permission-backend-module-allow-all-policy'), +); +backend.add(import('@backstage/plugin-permission-backend')); + +backend.add(import('./experimental/instanceMetadata')); +backend.add(import('./experimental/systemMetadata')); +backend.add(systemMetadataServiceFactory); + +backend.start(); diff --git a/packages/backend-split/src/instrumentation.js b/packages/backend-split/src/instrumentation.js new file mode 100644 index 0000000000..e3725632c1 --- /dev/null +++ b/packages/backend-split/src/instrumentation.js @@ -0,0 +1,34 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { NodeSDK } = require('@opentelemetry/sdk-node'); +const { + getNodeAutoInstrumentations, +} = require('@opentelemetry/auto-instrumentations-node'); +const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); + +// Expose opentelemetry metrics using a Prometheus exporter on +// http://localhost:9464/metrics. See packages/backend/prometheus.yml for +// more information on how to scrape it. +const prometheus = new PrometheusExporter(); + +const sdk = new NodeSDK({ + // traceExporter: ..., + metricReader: prometheus, + instrumentations: [getNodeAutoInstrumentations()], +}); + +sdk.start(); diff --git a/packages/backend/app-config.split.yaml b/packages/backend/app-config.split.yaml new file mode 100644 index 0000000000..d1a7cf76f1 --- /dev/null +++ b/packages/backend/app-config.split.yaml @@ -0,0 +1,9 @@ +discovery: + endpoints: + - target: http://localhost:7007/api/{{pluginId}} + plugins: [proxy] + - target: http://localhost:7008/api/{{pluginId}} + plugins: [catalog] + instances: + - baseUrl: http://localhost:7007 + - baseUrl: http://localhost:7008 diff --git a/packages/backend/package.json b/packages/backend/package.json index 2af36b8077..12eba46769 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -26,6 +26,7 @@ "clean": "backstage-cli package clean", "lint": "backstage-cli package lint", "start": "backstage-cli package start --require ./src/instrumentation.js", + "start:split": "backstage-cli package start --require ./src/instrumentation.js --config ../../app-config.yaml --config app-config.split.yaml", "start:prometheus": "docker run --mount type=bind,source=./prometheus.yml,destination=/etc/prometheus/prometheus.yml --publish published=9090,target=9090,protocol=tcp prom/prometheus", "test": "backstage-cli package test" }, @@ -69,7 +70,8 @@ "@opentelemetry/auto-instrumentations-node": "^0.61.0", "@opentelemetry/exporter-prometheus": "^0.54.0", "@opentelemetry/sdk-node": "^0.54.0", - "example-app": "link:../app" + "example-app": "link:../app", + "express-promise-router": "^4.1.0" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/packages/backend/src/experimental/instanceMetadata.ts b/packages/backend/src/experimental/instanceMetadata.ts new file mode 100644 index 0000000000..09e2b0cae8 --- /dev/null +++ b/packages/backend/src/experimental/instanceMetadata.ts @@ -0,0 +1,50 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; +import Router from 'express-promise-router'; + +// Example usage of the instance metadata service to log the installed features. +export default createBackendPlugin({ + pluginId: 'instance-metadata-logging', + register(env) { + env.registerInit({ + deps: { + instanceMetadata: instanceMetadataServiceRef, + logger: coreServices.logger, + httpRouter: coreServices.rootHttpRouter, + }, + async init({ instanceMetadata, logger, httpRouter }) { + logger.info( + `Installed features on this instance: ${JSON.stringify( + instanceMetadata.getInstalledFeatures(), + )}`, + ); + + const router = Router(); + + router.get('/features/installed', (_, res) => { + res.json({ items: instanceMetadata.getInstalledFeatures() }); + }); + + httpRouter.use('/.backstage/instanceInfo', router); + }, + }); + }, +}); diff --git a/packages/backend/src/experimental/systemMetadata.ts b/packages/backend/src/experimental/systemMetadata.ts new file mode 100644 index 0000000000..3b70059711 --- /dev/null +++ b/packages/backend/src/experimental/systemMetadata.ts @@ -0,0 +1,93 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { + BackendFeatureMeta, + systemMetadataServiceRef, +} from '@backstage/backend-plugin-api/alpha'; +import Router from 'express-promise-router'; + +// Example usage of the instance metadata service to log the installed features. +export default createBackendPlugin({ + pluginId: 'system-metadata-logging', + register(env) { + env.registerInit({ + deps: { + systemMetadata: systemMetadataServiceRef, + logger: coreServices.logger, + httpRouter: coreServices.rootHttpRouter, + }, + async init({ systemMetadata, logger, httpRouter }) { + logger.info( + `Instances in this system: ${JSON.stringify( + await systemMetadata.listInstances(), + )}`, + ); + + const router = Router(); + + router.get('/instances', async (_, res) => { + res.json(await systemMetadata.listInstances()); + }); + + router.get('/features/installed', async (_, res) => { + const instances = await systemMetadata.listInstances(); + const featurePromises = await Promise.allSettled( + instances.map(async instance => { + const response = await fetch( + `${instance.url}/.backstage/instanceInfo/features/installed`, + ); + if (response.ok) { + return { instance, response: await response.json() }; + } + throw new Error( + `Failed to fetch installed features from ${instance.url}`, + ); + }), + ); + const pluginByInstance: Record = {}; + for (const result of featurePromises) { + if (result.status !== 'fulfilled') { + logger.error( + `Failed to fetch installed features: ${result.reason}`, + ); + continue; + } + const instance = result.value.instance; + const installedFeatures = result.value.response + .items as BackendFeatureMeta[]; + for (const feature of installedFeatures) { + if (feature.type === 'plugin') { + if (!pluginByInstance[feature.pluginId]) { + pluginByInstance[feature.pluginId] = []; + } + pluginByInstance[feature.pluginId].push( + `${instance.url}/api/${feature.pluginId}`, + ); + } + } + } + res.json(pluginByInstance); + }); + + httpRouter.use('/.backstage/systemInfo', router); + }, + }); + }, +}); diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 541c3bd791..2728068ab5 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -19,6 +19,7 @@ import { coreServices, createBackendFeatureLoader, } from '@backstage/backend-plugin-api'; +import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha/systemMetadata'; const backend = createBackend(); @@ -69,7 +70,9 @@ backend.add(searchLoader); backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); -backend.add(import('./instanceMetadata')); +backend.add(import('./experimental/instanceMetadata')); +backend.add(import('./experimental/systemMetadata')); +backend.add(systemMetadataServiceFactory); backend.add(import('@backstage/plugin-events-backend-module-google-pubsub')); backend.add(import('@backstage/plugin-mcp-actions-backend')); diff --git a/yarn.lock b/yarn.lock index 657eb08631..fdafe26f05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30232,6 +30232,12 @@ __metadata: languageName: node linkType: soft +"example-app@link:../app::locator=example-backend-split%40workspace%3Apackages%2Fbackend-split": + version: 0.0.0-use.local + resolution: "example-app@link:../app::locator=example-backend-split%40workspace%3Apackages%2Fbackend-split" + languageName: node + linkType: soft + "example-app@workspace:packages/app": version: 0.0.0-use.local resolution: "example-app@workspace:packages/app" @@ -30300,6 +30306,51 @@ __metadata: languageName: unknown linkType: soft +"example-backend-split@workspace:packages/backend-split": + version: 0.0.0-use.local + resolution: "example-backend-split@workspace:packages/backend-split" + dependencies: + "@backstage/backend-defaults": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/plugin-app-backend": "workspace:^" + "@backstage/plugin-auth-backend": "workspace:^" + "@backstage/plugin-auth-backend-module-github-provider": "workspace:^" + "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" + "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" + "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" + "@backstage/plugin-devtools-backend": "workspace:^" + "@backstage/plugin-events-backend": "workspace:^" + "@backstage/plugin-kubernetes-backend": "workspace:^" + "@backstage/plugin-notifications-backend": "workspace:^" + "@backstage/plugin-permission-backend": "workspace:^" + "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" + "@backstage/plugin-proxy-backend": "workspace:^" + "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-backend-module-github": "workspace:^" + "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^" + "@backstage/plugin-search-backend": "workspace:^" + "@backstage/plugin-search-backend-module-catalog": "workspace:^" + "@backstage/plugin-search-backend-module-explore": "workspace:^" + "@backstage/plugin-search-backend-module-techdocs": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-signals-backend": "workspace:^" + "@backstage/plugin-techdocs-backend": "workspace:^" + "@opentelemetry/auto-instrumentations-node": "npm:^0.54.0" + "@opentelemetry/exporter-prometheus": "npm:^0.54.0" + "@opentelemetry/sdk-node": "npm:^0.54.0" + example-app: "link:../app" + express-promise-router: "npm:^4.1.0" + languageName: unknown + linkType: soft + "example-backend@workspace:packages/backend": version: 0.0.0-use.local resolution: "example-backend@workspace:packages/backend" @@ -30345,6 +30396,7 @@ __metadata: "@opentelemetry/exporter-prometheus": "npm:^0.54.0" "@opentelemetry/sdk-node": "npm:^0.54.0" example-app: "link:../app" + express-promise-router: "npm:^4.1.0" languageName: unknown linkType: soft From 2a0c4b09a6d860916d837bc778fde603e859426d Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 12 Dec 2024 21:55:38 -0700 Subject: [PATCH 172/312] add changeset Signed-off-by: aramissennyeydd --- .changeset/old-cats-shake.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/old-cats-shake.md diff --git a/.changeset/old-cats-shake.md b/.changeset/old-cats-shake.md new file mode 100644 index 0000000000..367e7f2062 --- /dev/null +++ b/.changeset/old-cats-shake.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-defaults': minor +'@backstage/backend-plugin-api': minor +--- + +Adds a new experimental `SystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. From bc7bdd7a1ce654468c8ad8e76f48d061b724959d Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 12 Dec 2024 22:01:27 -0700 Subject: [PATCH 173/312] small updates Signed-off-by: aramissennyeydd --- packages/backend-split/CHANGELOG.md | 3516 --------------------------- packages/backend-split/package.json | 2 +- 2 files changed, 1 insertion(+), 3517 deletions(-) delete mode 100644 packages/backend-split/CHANGELOG.md diff --git a/packages/backend-split/CHANGELOG.md b/packages/backend-split/CHANGELOG.md deleted file mode 100644 index 27c2a067b7..0000000000 --- a/packages/backend-split/CHANGELOG.md +++ /dev/null @@ -1,3516 +0,0 @@ -# example-backend - -## 0.0.33-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.28.0-next.2 - - @backstage/backend-defaults@0.6.0-next.2 - - @backstage/plugin-catalog-backend@1.29.0-next.2 - - @backstage/backend-plugin-api@1.1.0-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.2 - - @backstage/plugin-notifications-backend@0.5.0-next.2 - - @backstage/plugin-permission-node@0.8.6-next.2 - - @backstage/plugin-app-backend@0.4.3-next.2 - - @backstage/plugin-auth-backend@0.24.1-next.2 - - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2 - - @backstage/plugin-devtools-backend@0.5.0-next.2 - - @backstage/plugin-events-backend@0.4.0-next.2 - - @backstage/plugin-kubernetes-backend@0.19.1-next.2 - - @backstage/plugin-proxy-backend@0.5.9-next.2 - - @backstage/plugin-search-backend@1.8.0-next.2 - - @backstage/plugin-search-backend-node@1.3.6-next.2 - - @backstage/plugin-signals-backend@0.2.4-next.2 - - @backstage/plugin-techdocs-backend@1.11.4-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.2 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.2 - - @backstage/plugin-auth-node@0.5.5-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.2 - - @backstage/plugin-permission-backend@0.5.52-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.2 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.2 - - @backstage/plugin-search-backend-module-catalog@0.2.6-next.2 - - @backstage/plugin-search-backend-module-explore@0.2.6-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.2 - - @backstage/catalog-model@1.7.2-next.0 - - @backstage/plugin-permission-common@0.8.3-next.0 - -## 0.0.33-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.24.1-next.1 - - @backstage/plugin-auth-node@0.5.5-next.1 - - @backstage/plugin-catalog-backend@1.29.0-next.1 - - @backstage/backend-defaults@0.6.0-next.1 - - @backstage/plugin-events-backend@0.4.0-next.1 - - @backstage/plugin-search-backend@1.8.0-next.1 - - @backstage/plugin-devtools-backend@0.5.0-next.1 - - @backstage/plugin-search-backend-node@1.3.6-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1 - - @backstage/plugin-search-backend-module-explore@0.2.6-next.1 - - @backstage/plugin-notifications-backend@0.4.4-next.1 - - @backstage/plugin-permission-backend@0.5.52-next.1 - - @backstage/plugin-techdocs-backend@1.11.4-next.1 - - @backstage/plugin-signals-backend@0.2.4-next.1 - - @backstage/plugin-proxy-backend@0.5.9-next.1 - - @backstage/plugin-app-backend@0.4.3-next.1 - - @backstage/backend-plugin-api@1.1.0-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.1 - - @backstage/plugin-kubernetes-backend@0.19.1-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.1 - - @backstage/plugin-permission-node@0.8.6-next.1 - - @backstage/plugin-scaffolder-backend@1.28.0-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1 - - @backstage/plugin-search-backend-module-catalog@0.2.6-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.1 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.1 - - @backstage/catalog-model@1.7.1 - - @backstage/plugin-permission-common@0.8.2 - -## 0.0.33-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.6.0-next.0 - - @backstage/plugin-scaffolder-backend@1.28.0-next.0 - - @backstage/backend-plugin-api@1.0.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0 - - @backstage/plugin-search-backend-module-catalog@0.2.6-next.0 - - @backstage/plugin-search-backend-module-explore@0.2.6-next.0 - - @backstage/plugin-app-backend@0.4.3-next.0 - - @backstage/plugin-catalog-backend@1.28.1-next.0 - - @backstage/plugin-auth-node@0.5.5-next.0 - - @backstage/plugin-permission-backend@0.5.52-next.0 - - @backstage/plugin-devtools-backend@0.4.3-next.0 - - @backstage/plugin-signals-backend@0.2.4-next.0 - - @backstage/plugin-events-backend@0.3.17-next.0 - - @backstage/plugin-kubernetes-backend@0.19.1-next.0 - - @backstage/catalog-model@1.7.1 - - @backstage/plugin-auth-backend@0.24.1-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.0 - - @backstage/plugin-notifications-backend@0.4.4-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.0 - - @backstage/plugin-permission-common@0.8.2 - - @backstage/plugin-permission-node@0.8.6-next.0 - - @backstage/plugin-proxy-backend@0.5.9-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.5.3-next.0 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.4-next.0 - - @backstage/plugin-search-backend@1.7.1-next.0 - - @backstage/plugin-search-backend-node@1.3.6-next.0 - - @backstage/plugin-techdocs-backend@1.11.4-next.0 - -## 0.0.32 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.5.3 - - @backstage/plugin-app-backend@0.4.0 - - @backstage/plugin-search-backend-module-catalog@0.2.5 - - @backstage/plugin-scaffolder-backend@1.27.0 - - @backstage/plugin-auth-backend@0.24.0 - - @backstage/plugin-catalog-backend@1.28.0 - - @backstage/plugin-search-backend@1.7.0 - - @backstage/plugin-events-backend@0.3.16 - - @backstage/plugin-kubernetes-backend@0.19.0 - - @backstage/plugin-auth-node@0.5.4 - - @backstage/plugin-search-backend-module-explore@0.2.5 - - @backstage/plugin-catalog-backend-module-openapi@0.2.4 - - @backstage/backend-plugin-api@1.0.2 - - @backstage/plugin-notifications-backend@0.4.3 - - @backstage/plugin-signals-backend@0.2.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2 - - @backstage/plugin-search-backend-node@1.3.5 - - @backstage/plugin-permission-common@0.8.2 - - @backstage/plugin-proxy-backend@0.5.8 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.2 - - @backstage/catalog-model@1.7.1 - - @backstage/plugin-auth-backend-module-github-provider@0.2.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2 - - @backstage/plugin-devtools-backend@0.4.2 - - @backstage/plugin-permission-backend@0.5.51 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2 - - @backstage/plugin-permission-node@0.8.5 - - @backstage/plugin-scaffolder-backend-module-github@0.5.2 - - @backstage/plugin-search-backend-module-techdocs@0.3.2 - - @backstage/plugin-techdocs-backend@1.11.2 - -## 0.0.32-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-events-backend@0.3.16-next.3 - - @backstage/plugin-catalog-backend@1.28.0-next.3 - - @backstage/backend-defaults@0.5.3-next.3 - - @backstage/plugin-scaffolder-backend@1.27.0-next.3 - - @backstage/backend-plugin-api@1.0.2-next.2 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-app-backend@0.3.77-next.2 - - @backstage/plugin-auth-backend@0.24.0-next.2 - - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.2 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.2 - - @backstage/plugin-auth-node@0.5.4-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.2 - - @backstage/plugin-devtools-backend@0.4.2-next.2 - - @backstage/plugin-kubernetes-backend@0.19.0-next.3 - - @backstage/plugin-notifications-backend@0.4.3-next.3 - - @backstage/plugin-permission-backend@0.5.51-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.2 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-permission-node@0.8.5-next.2 - - @backstage/plugin-proxy-backend@0.5.8-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.3 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.3 - - @backstage/plugin-search-backend@1.7.0-next.3 - - @backstage/plugin-search-backend-module-catalog@0.2.5-next.3 - - @backstage/plugin-search-backend-module-explore@0.2.5-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.3 - - @backstage/plugin-search-backend-node@1.3.5-next.3 - - @backstage/plugin-signals-backend@0.2.3-next.3 - - @backstage/plugin-techdocs-backend@1.11.2-next.3 - -## 0.0.32-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.28.0-next.2 - - @backstage/plugin-search-backend@1.7.0-next.2 - - @backstage/plugin-kubernetes-backend@0.19.0-next.2 - - @backstage/backend-defaults@0.5.3-next.2 - - @backstage/plugin-events-backend@0.3.16-next.2 - - @backstage/plugin-auth-backend@0.24.0-next.2 - - @backstage/plugin-auth-node@0.5.4-next.2 - - @backstage/plugin-notifications-backend@0.4.3-next.2 - - @backstage/plugin-scaffolder-backend@1.27.0-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.2 - - @backstage/plugin-search-backend-module-catalog@0.2.5-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.2 - - @backstage/plugin-techdocs-backend@1.11.2-next.2 - - @backstage/backend-plugin-api@1.0.2-next.2 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-app-backend@0.3.77-next.2 - - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.2 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.2 - - @backstage/plugin-devtools-backend@0.4.2-next.2 - - @backstage/plugin-permission-backend@0.5.51-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.2 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-permission-node@0.8.5-next.2 - - @backstage/plugin-proxy-backend@0.5.8-next.2 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.2 - - @backstage/plugin-search-backend-module-explore@0.2.5-next.2 - - @backstage/plugin-search-backend-node@1.3.5-next.2 - - @backstage/plugin-signals-backend@0.2.3-next.2 - -## 0.0.32-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.19.0-next.1 - - @backstage/plugin-scaffolder-backend@1.27.0-next.1 - - @backstage/backend-defaults@0.5.3-next.1 - - @backstage/backend-plugin-api@1.0.2-next.1 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-app-backend@0.3.77-next.1 - - @backstage/plugin-auth-backend@0.24.0-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.1 - - @backstage/plugin-auth-node@0.5.4-next.1 - - @backstage/plugin-catalog-backend@1.27.2-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.1 - - @backstage/plugin-devtools-backend@0.4.2-next.1 - - @backstage/plugin-events-backend@0.3.16-next.1 - - @backstage/plugin-notifications-backend@0.4.3-next.1 - - @backstage/plugin-permission-backend@0.5.51-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.1 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-permission-node@0.8.5-next.1 - - @backstage/plugin-proxy-backend@0.5.8-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.1 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.1 - - @backstage/plugin-search-backend@1.6.2-next.1 - - @backstage/plugin-search-backend-module-catalog@0.2.5-next.1 - - @backstage/plugin-search-backend-module-explore@0.2.5-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.1 - - @backstage/plugin-search-backend-node@1.3.5-next.1 - - @backstage/plugin-signals-backend@0.2.3-next.1 - - @backstage/plugin-techdocs-backend@1.11.2-next.1 - -## 0.0.32-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-catalog@0.2.5-next.0 - - @backstage/plugin-scaffolder-backend@1.26.3-next.0 - - @backstage/plugin-auth-backend@0.24.0-next.0 - - @backstage/plugin-events-backend@0.3.15-next.0 - - @backstage/plugin-auth-node@0.5.4-next.0 - - @backstage/plugin-search-backend-module-explore@0.2.5-next.0 - - @backstage/backend-defaults@0.5.3-next.0 - - @backstage/plugin-notifications-backend@0.4.3-next.0 - - @backstage/plugin-signals-backend@0.2.3-next.0 - - @backstage/backend-plugin-api@1.0.2-next.0 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-app-backend@0.3.77-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.2.2-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.2-next.0 - - @backstage/plugin-catalog-backend@1.27.2-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.2.4-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2-next.0 - - @backstage/plugin-devtools-backend@0.4.2-next.0 - - @backstage/plugin-kubernetes-backend@0.18.8-next.0 - - @backstage/plugin-permission-backend@0.5.51-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2-next.0 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-permission-node@0.8.5-next.0 - - @backstage/plugin-proxy-backend@0.5.8-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.0 - - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3-next.0 - - @backstage/plugin-search-backend@1.6.2-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.3.2-next.0 - - @backstage/plugin-search-backend-node@1.3.5-next.0 - - @backstage/plugin-techdocs-backend@1.11.2-next.0 - -## 0.0.31 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-catalog@0.2.3 - - @backstage/plugin-search-backend-module-techdocs@0.3.0 - - @backstage/plugin-scaffolder-backend@1.26.0 - - @backstage/backend-defaults@0.5.1 - - @backstage/plugin-scaffolder-backend-module-github@0.5.1 - - @backstage/plugin-auth-backend-module-github-provider@0.2.1 - - @backstage/plugin-search-backend@1.6.0 - - @backstage/plugin-auth-node@0.5.3 - - @backstage/plugin-app-backend@0.3.76 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1 - - @backstage/plugin-catalog-backend-module-openapi@0.2.2 - - @backstage/plugin-search-backend-module-explore@0.2.3 - - @backstage/plugin-notifications-backend@0.4.1 - - @backstage/plugin-search-backend-node@1.3.3 - - @backstage/plugin-kubernetes-backend@0.18.7 - - @backstage/plugin-permission-backend@0.5.50 - - @backstage/plugin-devtools-backend@0.4.1 - - @backstage/plugin-techdocs-backend@1.11.0 - - @backstage/plugin-catalog-backend@1.27.0 - - @backstage/plugin-permission-node@0.8.4 - - @backstage/plugin-signals-backend@0.2.1 - - @backstage/plugin-events-backend@0.3.13 - - @backstage/plugin-proxy-backend@0.5.7 - - @backstage/plugin-auth-backend@0.23.1 - - @backstage/backend-plugin-api@1.0.1 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1 - - @backstage/plugin-permission-common@0.8.1 - -## 0.0.31-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.2 - - @backstage/backend-defaults@0.5.1-next.2 - - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.1 - - @backstage/plugin-scaffolder-backend@1.26.0-next.2 - - @backstage/plugin-search-backend@1.5.18-next.2 - - @backstage/plugin-auth-node@0.5.3-next.1 - - @backstage/plugin-app-backend@0.3.76-next.1 - - @backstage/plugin-catalog-backend@1.26.2-next.2 - - @backstage/plugin-search-backend-module-explore@0.2.3-next.2 - - @backstage/plugin-techdocs-backend@1.10.14-next.2 - - @backstage/backend-plugin-api@1.0.1-next.1 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-auth-backend@0.23.1-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.2.2-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.1 - - @backstage/plugin-devtools-backend@0.4.1-next.1 - - @backstage/plugin-events-backend@0.3.13-next.1 - - @backstage/plugin-kubernetes-backend@0.18.7-next.1 - - @backstage/plugin-notifications-backend@0.4.1-next.1 - - @backstage/plugin-permission-backend@0.5.50-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.1 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-permission-node@0.8.4-next.1 - - @backstage/plugin-proxy-backend@0.5.7-next.1 - - @backstage/plugin-search-backend-module-catalog@0.2.3-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.2 - - @backstage/plugin-search-backend-node@1.3.3-next.2 - - @backstage/plugin-signals-backend@0.2.1-next.1 - -## 0.0.31-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.26.0-next.1 - - @backstage/plugin-catalog-backend@1.26.2-next.1 - - @backstage/backend-defaults@0.5.1-next.1 - - @backstage/backend-plugin-api@1.0.1-next.0 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-app-backend@0.3.75-next.0 - - @backstage/plugin-auth-backend@0.23.1-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.0 - - @backstage/plugin-auth-node@0.5.3-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.2.2-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 - - @backstage/plugin-devtools-backend@0.4.1-next.0 - - @backstage/plugin-events-backend@0.3.13-next.0 - - @backstage/plugin-kubernetes-backend@0.18.7-next.0 - - @backstage/plugin-notifications-backend@0.4.1-next.0 - - @backstage/plugin-permission-backend@0.5.50-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.0 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-permission-node@0.8.4-next.0 - - @backstage/plugin-proxy-backend@0.5.7-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.1 - - @backstage/plugin-search-backend@1.5.18-next.1 - - @backstage/plugin-search-backend-module-catalog@0.2.3-next.1 - - @backstage/plugin-search-backend-module-explore@0.2.3-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.1 - - @backstage/plugin-search-backend-node@1.3.3-next.1 - - @backstage/plugin-signals-backend@0.2.1-next.0 - - @backstage/plugin-techdocs-backend@1.10.14-next.1 - -## 0.0.31-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.26.0-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.1-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.1-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.5.1-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.2.1-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.2.3-next.0 - - @backstage/plugin-search-backend-module-catalog@0.2.3-next.0 - - @backstage/plugin-search-backend-module-explore@0.2.3-next.0 - - @backstage/plugin-notifications-backend@0.4.1-next.0 - - @backstage/plugin-search-backend-node@1.3.3-next.0 - - @backstage/plugin-kubernetes-backend@0.18.7-next.0 - - @backstage/plugin-permission-backend@0.5.50-next.0 - - @backstage/backend-defaults@0.5.1-next.0 - - @backstage/plugin-devtools-backend@0.4.1-next.0 - - @backstage/plugin-techdocs-backend@1.10.14-next.0 - - @backstage/plugin-catalog-backend@1.26.1-next.0 - - @backstage/plugin-permission-node@0.8.4-next.0 - - @backstage/plugin-signals-backend@0.2.1-next.0 - - @backstage/plugin-events-backend@0.3.13-next.0 - - @backstage/plugin-search-backend@1.5.18-next.0 - - @backstage/plugin-proxy-backend@0.5.7-next.0 - - @backstage/plugin-auth-backend@0.23.1-next.0 - - @backstage/plugin-app-backend@0.3.75-next.0 - - @backstage/plugin-auth-node@0.5.3-next.0 - - @backstage/backend-plugin-api@1.0.1-next.0 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-auth-backend-module-github-provider@0.2.1-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.1-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.1-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.1-next.0 - - @backstage/plugin-permission-common@0.8.1 - -## 0.0.30 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.5.0 - - @backstage/plugin-kubernetes-backend@0.18.6 - - @backstage/plugin-signals-backend@0.2.0 - - @backstage/plugin-techdocs-backend@1.10.13 - - @backstage/backend-plugin-api@1.0.0 - - @backstage/plugin-search-backend@1.5.17 - - @backstage/plugin-auth-node@0.5.2 - - @backstage/plugin-devtools-backend@0.4.0 - - @backstage/plugin-app-backend@0.3.74 - - @backstage/plugin-notifications-backend@0.4.0 - - @backstage/plugin-scaffolder-backend@1.25.0 - - @backstage/plugin-auth-backend@0.23.0 - - @backstage/catalog-model@1.7.0 - - @backstage/plugin-catalog-backend@1.26.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.0 - - @backstage/plugin-search-backend-module-techdocs@0.2.2 - - @backstage/plugin-search-backend-module-catalog@0.2.2 - - @backstage/plugin-search-backend-module-explore@0.2.2 - - @backstage/plugin-permission-node@0.8.3 - - @backstage/plugin-permission-backend@0.5.49 - - @backstage/plugin-proxy-backend@0.5.6 - - @backstage/plugin-scaffolder-backend-module-github@0.5.0 - - @backstage/plugin-auth-backend-module-github-provider@0.2.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0 - - @backstage/plugin-catalog-backend-module-openapi@0.2.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-search-backend-node@1.3.2 - -## 0.0.30-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.5.0-next.2 - - @backstage/plugin-devtools-backend@0.4.0-next.2 - - @backstage/plugin-scaffolder-backend@1.25.0-next.2 - - @backstage/plugin-auth-node@0.5.2-next.2 - - @backstage/plugin-auth-backend@0.23.0-next.2 - - @backstage/backend-plugin-api@1.0.0-next.2 - - @backstage/plugin-catalog-backend@1.26.0-next.2 - - @backstage/plugin-app-backend@0.3.74-next.2 - - @backstage/plugin-notifications-backend@0.4.0-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.5.0-next.2 - - @backstage/plugin-auth-backend-module-github-provider@0.2.0-next.2 - - @backstage/plugin-kubernetes-backend@0.18.6-next.2 - - @backstage/plugin-permission-backend@0.5.49-next.2 - - @backstage/plugin-permission-node@0.8.3-next.2 - - @backstage/plugin-search-backend@1.5.17-next.2 - - @backstage/plugin-signals-backend@0.2.0-next.2 - - @backstage/plugin-techdocs-backend@1.10.13-next.2 - - @backstage/plugin-search-backend-module-explore@0.2.2-next.2 - - @backstage/catalog-model@1.6.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.0-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.2.0-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0-next.2 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-proxy-backend@0.5.6-next.2 - - @backstage/plugin-search-backend-module-catalog@0.2.2-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.2.2-next.2 - - @backstage/plugin-search-backend-node@1.3.2-next.2 - -## 0.0.30-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.5.0-next.1 - - @backstage/plugin-auth-node@0.5.2-next.1 - - @backstage/plugin-catalog-backend@1.25.3-next.1 - - @backstage/plugin-scaffolder-backend@1.25.0-next.1 - - @backstage/plugin-notifications-backend@0.4.0-next.1 - - @backstage/plugin-kubernetes-backend@0.18.6-next.1 - - @backstage/plugin-techdocs-backend@1.10.13-next.1 - - @backstage/backend-plugin-api@0.9.0-next.1 - - @backstage/catalog-model@1.6.0 - - @backstage/plugin-app-backend@0.3.74-next.1 - - @backstage/plugin-auth-backend@0.23.0-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.2.0-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.0-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.2.0-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0-next.1 - - @backstage/plugin-devtools-backend@0.4.0-next.1 - - @backstage/plugin-permission-backend@0.5.49-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0-next.1 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-permission-node@0.8.3-next.1 - - @backstage/plugin-proxy-backend@0.5.6-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.5.0-next.1 - - @backstage/plugin-search-backend@1.5.17-next.1 - - @backstage/plugin-search-backend-module-catalog@0.2.2-next.1 - - @backstage/plugin-search-backend-module-explore@0.2.2-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.2.2-next.1 - - @backstage/plugin-search-backend-node@1.3.2-next.1 - - @backstage/plugin-signals-backend@0.2.0-next.1 - -## 0.0.30-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@1.10.13-next.0 - - @backstage/backend-plugin-api@0.9.0-next.0 - - @backstage/plugin-search-backend@1.5.17-next.0 - - @backstage/plugin-kubernetes-backend@0.18.6-next.0 - - @backstage/plugin-scaffolder-backend@1.25.0-next.0 - - @backstage/plugin-app-backend@0.3.74-next.0 - - @backstage/plugin-signals-backend@0.2.0-next.0 - - @backstage/backend-defaults@0.5.0-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.2.2-next.0 - - @backstage/plugin-search-backend-module-catalog@0.2.2-next.0 - - @backstage/plugin-search-backend-module-explore@0.2.2-next.0 - - @backstage/plugin-permission-node@0.8.3-next.0 - - @backstage/plugin-auth-backend@0.23.0-next.0 - - @backstage/plugin-catalog-backend@1.25.3-next.0 - - @backstage/plugin-permission-backend@0.5.49-next.0 - - @backstage/plugin-proxy-backend@0.5.6-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.2.0-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.2.0-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.0-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.2.0-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.0-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.5.0-next.0 - - @backstage/plugin-devtools-backend@0.4.0-next.0 - - @backstage/plugin-notifications-backend@0.4.0-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.0-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.5.0-next.0 - - @backstage/plugin-auth-node@0.5.2-next.0 - - @backstage/plugin-search-backend-node@1.3.2-next.0 - - @backstage/catalog-model@1.6.0 - - @backstage/plugin-permission-common@0.8.1 - -## 0.0.29 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.4.2 - - @backstage/plugin-scaffolder-backend-module-github@0.4.1 - - @backstage/plugin-auth-backend-module-github-provider@0.1.20 - - @backstage/backend-plugin-api@0.8.0 - - @backstage/plugin-catalog-backend@1.25.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.41 - - @backstage/plugin-search-backend-node@1.3.0 - - @backstage/plugin-scaffolder-backend@1.24.0 - - @backstage/plugin-techdocs-backend@1.10.10 - - @backstage/plugin-permission-common@0.8.1 - - @backstage/plugin-search-backend-module-techdocs@0.2.0 - - @backstage/plugin-search-backend-module-explore@0.2.0 - - @backstage/plugin-notifications-backend@0.3.4 - - @backstage/plugin-kubernetes-backend@0.18.4 - - @backstage/plugin-permission-backend@0.5.47 - - @backstage/plugin-devtools-backend@0.3.9 - - @backstage/plugin-signals-backend@0.1.9 - - @backstage/plugin-proxy-backend@0.5.4 - - @backstage/plugin-auth-backend@0.22.10 - - @backstage/plugin-app-backend@0.3.72 - - @backstage/plugin-auth-node@0.5.0 - - @backstage/plugin-permission-node@0.8.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.3.0 - - @backstage/plugin-search-backend-module-catalog@0.2.0 - - @backstage/plugin-search-backend@1.5.15 - - @backstage/catalog-model@1.6.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.9 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20 - -## 0.0.29-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.3 - - @backstage/plugin-notifications-backend@0.3.4-next.3 - - @backstage/backend-plugin-api@0.8.0-next.3 - - @backstage/plugin-techdocs-backend@1.10.10-next.3 - - @backstage/backend-defaults@0.4.2-next.3 - - @backstage/catalog-model@1.6.0-next.0 - - @backstage/plugin-scaffolder-backend@1.23.1-next.3 - - @backstage/backend-tasks@0.5.28-next.3 - - @backstage/plugin-app-backend@0.3.72-next.3 - - @backstage/plugin-auth-backend@0.22.10-next.3 - - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.3 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.3 - - @backstage/plugin-auth-node@0.5.0-next.3 - - @backstage/plugin-catalog-backend@1.24.1-next.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.3 - - @backstage/plugin-devtools-backend@0.3.9-next.3 - - @backstage/plugin-kubernetes-backend@0.18.4-next.3 - - @backstage/plugin-permission-backend@0.5.47-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.3 - - @backstage/plugin-permission-common@0.8.1-next.1 - - @backstage/plugin-permission-node@0.8.1-next.3 - - @backstage/plugin-proxy-backend@0.5.4-next.3 - - @backstage/plugin-search-backend@1.5.15-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.29-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.29-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.3 - - @backstage/plugin-search-backend-node@1.2.28-next.3 - - @backstage/plugin-signals-backend@0.1.9-next.3 - -## 0.0.29-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.4.2-next.2 - - @backstage/backend-plugin-api@0.8.0-next.2 - - @backstage/plugin-scaffolder-backend@1.23.1-next.2 - - @backstage/plugin-permission-common@0.8.1-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.29-next.2 - - @backstage/plugin-notifications-backend@0.3.4-next.2 - - @backstage/plugin-kubernetes-backend@0.18.4-next.2 - - @backstage/plugin-permission-backend@0.5.47-next.2 - - @backstage/plugin-devtools-backend@0.3.9-next.2 - - @backstage/plugin-techdocs-backend@1.10.10-next.2 - - @backstage/plugin-catalog-backend@1.24.1-next.2 - - @backstage/plugin-signals-backend@0.1.9-next.2 - - @backstage/plugin-proxy-backend@0.5.4-next.2 - - @backstage/plugin-auth-backend@0.22.10-next.2 - - @backstage/plugin-app-backend@0.3.72-next.2 - - @backstage/plugin-auth-node@0.5.0-next.2 - - @backstage/plugin-permission-node@0.8.1-next.2 - - @backstage/plugin-search-backend-node@1.2.28-next.2 - - @backstage/plugin-search-backend@1.5.15-next.2 - - @backstage/backend-tasks@0.5.28-next.2 - - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.2 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.29-next.2 - - @backstage/catalog-model@1.5.0 - -## 0.0.29-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.1 - - @backstage/plugin-techdocs-backend@1.10.10-next.1 - - @backstage/plugin-permission-common@0.8.1-next.0 - - @backstage/plugin-catalog-backend@1.24.1-next.1 - - @backstage/plugin-permission-node@0.8.1-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.29-next.1 - - @backstage/backend-plugin-api@0.7.1-next.1 - - @backstage/plugin-scaffolder-backend@1.23.1-next.1 - - @backstage/plugin-auth-backend@0.22.10-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.1 - - @backstage/backend-defaults@0.4.2-next.1 - - @backstage/plugin-app-backend@0.3.72-next.1 - - @backstage/plugin-devtools-backend@0.3.9-next.1 - - @backstage/plugin-proxy-backend@0.5.4-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.1 - - @backstage/plugin-kubernetes-backend@0.18.4-next.1 - - @backstage/plugin-permission-backend@0.5.47-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.1 - - @backstage/plugin-search-backend@1.5.15-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.29-next.1 - - @backstage/plugin-search-backend-node@1.2.28-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.1 - - @backstage/backend-tasks@0.5.28-next.1 - - @backstage/catalog-model@1.5.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.1 - - @backstage/plugin-auth-node@0.4.18-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.1 - - @backstage/plugin-notifications-backend@0.3.4-next.1 - - @backstage/plugin-signals-backend@0.1.9-next.1 - -## 0.0.29-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.4.2-next.0 - - @backstage/plugin-catalog-backend@1.24.1-next.0 - - @backstage/plugin-devtools-backend@0.3.9-next.0 - - @backstage/backend-plugin-api@0.7.1-next.0 - - @backstage/backend-tasks@0.5.28-next.0 - - @backstage/catalog-model@1.5.0 - - @backstage/plugin-app-backend@0.3.72-next.0 - - @backstage/plugin-auth-backend@0.22.10-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.0 - - @backstage/plugin-auth-node@0.4.18-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.0 - - @backstage/plugin-kubernetes-backend@0.18.4-next.0 - - @backstage/plugin-notifications-backend@0.3.4-next.0 - - @backstage/plugin-permission-backend@0.5.47-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.0 - - @backstage/plugin-permission-common@0.8.0 - - @backstage/plugin-permission-node@0.8.1-next.0 - - @backstage/plugin-proxy-backend@0.5.4-next.0 - - @backstage/plugin-scaffolder-backend@1.23.1-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.0 - - @backstage/plugin-search-backend@1.5.15-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.29-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.29-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.28-next.0 - - @backstage/plugin-search-backend-node@1.2.28-next.0 - - @backstage/plugin-signals-backend@0.1.9-next.0 - - @backstage/plugin-techdocs-backend@1.10.10-next.0 - -## 0.0.28 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.7.0 - - @backstage/backend-defaults@0.4.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.19 - - @backstage/backend-tasks@0.5.27 - - @backstage/plugin-scaffolder-backend@1.23.0 - - @backstage/plugin-scaffolder-backend-module-github@0.4.0 - - @backstage/plugin-permission-common@0.8.0 - - @backstage/plugin-permission-backend@0.5.46 - - @backstage/plugin-permission-node@0.8.0 - - @backstage/plugin-techdocs-backend@1.10.9 - - @backstage/plugin-notifications-backend@0.3.3 - - @backstage/plugin-auth-node@0.4.17 - - @backstage/plugin-search-backend@1.5.14 - - @backstage/plugin-catalog-backend@1.24.0 - - @backstage/plugin-app-backend@0.3.71 - - @backstage/plugin-auth-backend@0.22.9 - - @backstage/plugin-auth-backend-module-github-provider@0.1.19 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.8 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.5 - - @backstage/plugin-catalog-backend-module-openapi@0.1.40 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.20 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.9 - - @backstage/plugin-devtools-backend@0.3.8 - - @backstage/plugin-kubernetes-backend@0.18.3 - - @backstage/plugin-proxy-backend@0.5.3 - - @backstage/plugin-search-backend-module-catalog@0.1.28 - - @backstage/plugin-search-backend-module-explore@0.1.28 - - @backstage/plugin-search-backend-module-techdocs@0.1.27 - - @backstage/plugin-search-backend-node@1.2.27 - - @backstage/plugin-signals-backend@0.1.8 - - @backstage/catalog-model@1.5.0 - -## 0.0.28-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.23.0-next.2 - -## 0.0.28-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@1.10.9-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.4.0-next.1 - - @backstage/plugin-catalog-backend@1.24.0-next.1 - - @backstage/backend-defaults@0.3.4-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.27-next.1 - - @backstage/backend-plugin-api@0.6.22-next.1 - - @backstage/backend-tasks@0.5.27-next.1 - - @backstage/catalog-model@1.5.0 - - @backstage/plugin-app-backend@0.3.71-next.1 - - @backstage/plugin-auth-backend@0.22.9-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.1.19-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.8-next.1 - - @backstage/plugin-auth-node@0.4.17-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.5-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.40-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.20-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.9-next.1 - - @backstage/plugin-devtools-backend@0.3.8-next.1 - - @backstage/plugin-kubernetes-backend@0.18.3-next.1 - - @backstage/plugin-notifications-backend@0.3.3-next.1 - - @backstage/plugin-permission-backend@0.5.46-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.19-next.1 - - @backstage/plugin-permission-common@0.7.14 - - @backstage/plugin-permission-node@0.7.33-next.1 - - @backstage/plugin-proxy-backend@0.5.3-next.1 - - @backstage/plugin-scaffolder-backend@1.23.0-next.1 - - @backstage/plugin-search-backend@1.5.14-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.28-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.28-next.1 - - @backstage/plugin-search-backend-node@1.2.27-next.1 - - @backstage/plugin-signals-backend@0.1.8-next.1 - -## 0.0.28-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.21-next.0 - - @backstage/backend-defaults@0.3.3-next.0 - - @backstage/backend-tasks@0.5.26-next.0 - - @backstage/plugin-scaffolder-backend@1.23.0-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.4.0-next.0 - - @backstage/plugin-notifications-backend@0.3.2-next.0 - - @backstage/plugin-app-backend@0.3.70-next.0 - - @backstage/plugin-auth-backend@0.22.8-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.18-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.7-next.0 - - @backstage/plugin-auth-node@0.4.16-next.0 - - @backstage/plugin-catalog-backend@1.23.2-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.4-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.39-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.19-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.8-next.0 - - @backstage/plugin-devtools-backend@0.3.7-next.0 - - @backstage/plugin-kubernetes-backend@0.18.2-next.0 - - @backstage/plugin-permission-backend@0.5.45-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.18-next.0 - - @backstage/plugin-permission-node@0.7.32-next.0 - - @backstage/plugin-proxy-backend@0.5.2-next.0 - - @backstage/plugin-search-backend@1.5.13-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.27-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.27-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.26-next.0 - - @backstage/plugin-search-backend-node@1.2.26-next.0 - - @backstage/plugin-signals-backend@0.1.7-next.0 - - @backstage/plugin-techdocs-backend@1.10.8-next.0 - - @backstage/catalog-model@1.5.0 - - @backstage/plugin-permission-common@0.7.14 - -## 0.0.27 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.19 - - @backstage/backend-tasks@0.5.24 - - @backstage/plugin-auth-node@0.4.14 - - @backstage/plugin-auth-backend@0.22.6 - - @backstage/plugin-techdocs-backend@1.10.6 - - @backstage/plugin-scaffolder-backend-module-github@0.3.0 - - @backstage/plugin-devtools-backend@0.3.5 - - @backstage/plugin-catalog-backend@1.23.0 - - @backstage/plugin-search-backend@1.5.10 - - @backstage/plugin-proxy-backend@0.5.0 - - @backstage/plugin-app-backend@0.3.68 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2 - - @backstage/plugin-auth-backend-module-github-provider@0.1.16 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.5 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6 - - @backstage/plugin-catalog-backend-module-openapi@0.1.37 - - @backstage/plugin-search-backend-module-techdocs@0.1.24 - - @backstage/plugin-search-backend-module-catalog@0.1.25 - - @backstage/plugin-search-backend-module-explore@0.1.25 - - @backstage/plugin-notifications-backend@0.3.0 - - @backstage/plugin-kubernetes-backend@0.18.0 - - @backstage/plugin-permission-backend@0.5.43 - - @backstage/plugin-scaffolder-backend@1.22.9 - - @backstage/plugin-signals-backend@0.1.5 - - @backstage/backend-defaults@0.3.0 - - @backstage/plugin-search-backend-node@1.2.24 - - @backstage/plugin-permission-node@0.7.30 - - @backstage/plugin-permission-common@0.7.14 - - @backstage/catalog-model@1.5.0 - -## 0.0.27-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-plugin-api@0.6.19-next.3 - - @backstage/plugin-auth-node@0.4.14-next.3 - - @backstage/backend-defaults@0.3.0-next.3 - - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2-next.2 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.3 - - @backstage/plugin-scaffolder-backend-module-github@0.3.0-next.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.25-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.25-next.3 - - @backstage/plugin-notifications-backend@0.3.0-next.3 - - @backstage/plugin-search-backend-node@1.2.24-next.3 - - @backstage/plugin-kubernetes-backend@0.18.0-next.3 - - @backstage/plugin-permission-backend@0.5.43-next.3 - - @backstage/plugin-scaffolder-backend@1.22.8-next.3 - - @backstage/plugin-permission-common@0.7.14-next.0 - - @backstage/plugin-devtools-backend@0.3.5-next.3 - - @backstage/plugin-techdocs-backend@1.10.6-next.3 - - @backstage/plugin-catalog-backend@1.23.0-next.3 - - @backstage/plugin-permission-node@0.7.30-next.3 - - @backstage/plugin-signals-backend@0.1.5-next.3 - - @backstage/plugin-search-backend@1.5.10-next.3 - - @backstage/plugin-proxy-backend@0.5.0-next.3 - - @backstage/plugin-auth-backend@0.22.6-next.3 - - @backstage/plugin-app-backend@0.3.68-next.3 - - @backstage/backend-tasks@0.5.24-next.3 - - @backstage/catalog-model@1.5.0 - -## 0.0.27-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@1.10.6-next.2 - - @backstage/backend-plugin-api@0.6.19-next.2 - - @backstage/backend-defaults@0.3.0-next.2 - - @backstage/plugin-permission-node@0.7.30-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.3.0-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.2 - - @backstage/plugin-scaffolder-backend@1.22.8-next.2 - - @backstage/backend-tasks@0.5.24-next.2 - - @backstage/plugin-app-backend@0.3.68-next.2 - - @backstage/plugin-auth-backend@0.22.6-next.2 - - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.2 - - @backstage/plugin-auth-node@0.4.14-next.2 - - @backstage/plugin-catalog-backend@1.23.0-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.2 - - @backstage/plugin-devtools-backend@0.3.5-next.2 - - @backstage/plugin-kubernetes-backend@0.18.0-next.2 - - @backstage/plugin-notifications-backend@0.3.0-next.2 - - @backstage/plugin-permission-backend@0.5.43-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.1 - - @backstage/plugin-proxy-backend@0.5.0-next.2 - - @backstage/plugin-search-backend@1.5.10-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.25-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.25-next.2 - - @backstage/plugin-search-backend-node@1.2.24-next.2 - - @backstage/plugin-signals-backend@0.1.5-next.2 - - @backstage/catalog-model@1.5.0 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.27-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.24-next.1 - - @backstage/backend-plugin-api@0.6.19-next.1 - - @backstage/plugin-permission-node@0.7.30-next.1 - - @backstage/plugin-search-backend@1.5.10-next.1 - - @backstage/backend-defaults@0.3.0-next.1 - - @backstage/plugin-kubernetes-backend@0.18.0-next.1 - - @backstage/plugin-catalog-backend@1.23.0-next.1 - - @backstage/plugin-scaffolder-backend@1.22.8-next.1 - - @backstage/plugin-notifications-backend@0.3.0-next.1 - - @backstage/plugin-app-backend@0.3.68-next.1 - - @backstage/plugin-auth-backend@0.22.6-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.1 - - @backstage/plugin-auth-node@0.4.14-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.1 - - @backstage/plugin-devtools-backend@0.3.5-next.1 - - @backstage/plugin-permission-backend@0.5.43-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.0 - - @backstage/plugin-proxy-backend@0.5.0-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.2.9-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.25-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.25-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.1 - - @backstage/plugin-search-backend-node@1.2.24-next.1 - - @backstage/plugin-signals-backend@0.1.5-next.1 - - @backstage/plugin-techdocs-backend@1.10.6-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.1 - -## 0.0.27-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.24-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.9-next.0 - - @backstage/plugin-devtools-backend@0.3.5-next.0 - - @backstage/plugin-techdocs-backend@1.10.6-next.0 - - @backstage/plugin-catalog-backend@1.23.0-next.0 - - @backstage/plugin-search-backend@1.5.10-next.0 - - @backstage/plugin-proxy-backend@0.5.0-next.0 - - @backstage/plugin-auth-backend@0.22.6-next.0 - - @backstage/plugin-app-backend@0.3.68-next.0 - - @backstage/plugin-search-backend-node@1.2.24-next.0 - - @backstage/plugin-signals-backend@0.1.5-next.0 - - @backstage/backend-defaults@0.2.19-next.0 - - @backstage/backend-plugin-api@0.6.19-next.0 - - @backstage/plugin-scaffolder-backend@1.22.8-next.0 - - @backstage/plugin-kubernetes-backend@0.17.2-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.2-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.25-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.25-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.24-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.5-next.0 - - @backstage/plugin-auth-node@0.4.14-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.37-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.6-next.0 - - @backstage/plugin-notifications-backend@0.2.2-next.0 - - @backstage/plugin-permission-backend@0.5.43-next.0 - - @backstage/plugin-permission-node@0.7.30-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.16-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.17-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.16-next.0 - - @backstage/catalog-model@1.5.0 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.26 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.22.6 - - @backstage/plugin-catalog-backend@1.22.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.8 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5 - - @backstage/plugin-search-backend-module-catalog@0.1.24 - - @backstage/plugin-notifications-backend@0.2.1 - - @backstage/catalog-model@1.5.0 - - @backstage/backend-plugin-api@0.6.18 - - @backstage/backend-tasks@0.5.23 - - @backstage/plugin-auth-backend@0.22.5 - - @backstage/plugin-app-backend@0.3.66 - - @backstage/plugin-devtools-backend@0.3.4 - - @backstage/plugin-signals-backend@0.1.4 - - @backstage/plugin-search-backend-node@1.2.22 - - @backstage/plugin-search-backend@1.5.8 - - @backstage/plugin-auth-backend-module-github-provider@0.1.15 - - @backstage/plugin-techdocs-backend@1.10.5 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.4 - - @backstage/backend-defaults@0.2.18 - - @backstage/plugin-search-backend-module-explore@0.1.24 - - @backstage/plugin-auth-node@0.4.13 - - @backstage/plugin-search-backend-module-techdocs@0.1.23 - - @backstage/plugin-catalog-backend-module-openapi@0.1.36 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16 - - @backstage/plugin-kubernetes-backend@0.17.1 - - @backstage/plugin-permission-backend@0.5.42 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15 - - @backstage/plugin-permission-node@0.7.29 - - @backstage/plugin-proxy-backend@0.4.16 - -## 0.0.26-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.1 - - @backstage/plugin-notifications-backend@0.2.1-next.1 - - @backstage/plugin-catalog-backend@1.22.0-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.1 - - @backstage/plugin-scaffolder-backend@1.22.5-next.1 - - @backstage/plugin-search-backend@1.5.8-next.1 - - @backstage/backend-defaults@0.2.18-next.1 - - @backstage/plugin-app-backend@0.3.66-next.1 - - @backstage/plugin-kubernetes-backend@0.17.1-next.1 - - @backstage/backend-tasks@0.5.23-next.1 - - @backstage/plugin-auth-backend@0.22.5-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.1 - - @backstage/plugin-auth-node@0.4.13-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.1 - - @backstage/plugin-devtools-backend@0.3.4-next.1 - - @backstage/plugin-permission-backend@0.5.42-next.1 - - @backstage/plugin-permission-node@0.7.29-next.1 - - @backstage/plugin-proxy-backend@0.4.16-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.24-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.24-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.1 - - @backstage/plugin-search-backend-node@1.2.22-next.1 - - @backstage/plugin-signals-backend@0.1.4-next.1 - - @backstage/plugin-techdocs-backend@1.10.5-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.1 - - @backstage/backend-plugin-api@0.6.18-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.1 - -## 0.0.26-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.0 - - @backstage/plugin-catalog-backend@1.22.0-next.0 - - @backstage/plugin-scaffolder-backend@1.22.5-next.0 - - @backstage/catalog-model@1.5.0-next.0 - - @backstage/plugin-search-backend-node@1.2.22-next.0 - - @backstage/plugin-search-backend@1.5.8-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.23-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.23-next.0 - - @backstage/plugin-auth-backend@0.22.5-next.0 - - @backstage/plugin-auth-node@0.4.13-next.0 - - @backstage/plugin-notifications-backend@0.2.1-next.0 - - @backstage/backend-plugin-api@0.6.18-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.0 - - @backstage/backend-defaults@0.2.18-next.0 - - @backstage/plugin-app-backend@0.3.66-next.0 - - @backstage/plugin-kubernetes-backend@0.17.1-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.0 - - @backstage/plugin-techdocs-backend@1.10.5-next.0 - - @backstage/backend-tasks@0.5.23-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.0 - - @backstage/plugin-devtools-backend@0.3.4-next.0 - - @backstage/plugin-permission-backend@0.5.42-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.0 - - @backstage/plugin-permission-common@0.7.13 - - @backstage/plugin-permission-node@0.7.29-next.0 - - @backstage/plugin-proxy-backend@0.4.16-next.0 - - @backstage/plugin-signals-backend@0.1.4-next.0 - -## 0.0.25 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-badges-backend@0.4.0 - - @backstage/plugin-kubernetes-backend@0.17.0 - - @backstage/plugin-azure-devops-backend@0.6.4 - - @backstage/plugin-techdocs-backend@1.10.4 - - @backstage/plugin-notifications-backend@0.2.0 - - @backstage/plugin-permission-node@0.7.28 - - @backstage/plugin-auth-backend@0.22.4 - - @backstage/plugin-catalog-backend@1.21.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.0 - - @backstage/backend-plugin-api@0.6.17 - - @backstage/plugin-search-backend@1.5.7 - - @backstage/plugin-todo-backend@0.3.16 - - @backstage/plugin-scaffolder-backend-module-github@0.2.7 - - @backstage/plugin-search-backend-module-techdocs@0.1.22 - - @backstage/plugin-search-backend-module-explore@0.1.21 - - @backstage/plugin-entity-feedback-backend@0.2.14 - - @backstage/plugin-search-backend-node@1.2.21 - - @backstage/plugin-lighthouse-backend@0.4.10 - - @backstage/plugin-permission-backend@0.5.41 - - @backstage/plugin-sonarqube-backend@0.2.19 - - @backstage/plugin-devtools-backend@0.3.3 - - @backstage/plugin-linguist-backend@0.5.15 - - @backstage/plugin-playlist-backend@0.3.21 - - @backstage/plugin-jenkins-backend@0.4.4 - - @backstage/backend-tasks@0.5.22 - - @backstage/plugin-nomad-backend@0.1.19 - - @backstage/plugin-adr-backend@0.4.14 - - @backstage/plugin-app-backend@0.3.65 - - @backstage/plugin-auth-node@0.4.12 - - @backstage/plugin-signals-backend@0.1.3 - - @backstage/plugin-proxy-backend@0.4.15 - - @backstage/plugin-scaffolder-backend@1.22.4 - - @backstage/backend-defaults@0.2.17 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.35 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4 - - @backstage/plugin-search-backend-module-catalog@0.1.22 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-auth-backend-module-github-provider@0.1.14 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.25-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.17.0-next.1 - - @backstage/plugin-azure-devops-backend@0.6.4-next.1 - - @backstage/plugin-techdocs-backend@1.10.4-next.1 - - @backstage/plugin-auth-backend@0.22.4-next.1 - - @backstage/backend-plugin-api@0.6.17-next.1 - - @backstage/plugin-auth-node@0.4.12-next.1 - - @backstage/plugin-proxy-backend@0.4.15-next.1 - - @backstage/plugin-scaffolder-backend@1.22.4-next.1 - - @backstage/plugin-catalog-backend@1.21.1-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.1 - - @backstage/plugin-app-backend@0.3.65-next.1 - - @backstage/plugin-notifications-backend@0.2.0-next.1 - - @backstage/backend-defaults@0.2.17-next.1 - - @backstage/backend-tasks@0.5.22-next.1 - - @backstage/plugin-adr-backend@0.4.14-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.1 - - @backstage/plugin-badges-backend@0.3.14-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.1 - - @backstage/plugin-devtools-backend@0.3.3-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.14-next.1 - - @backstage/plugin-jenkins-backend@0.4.4-next.1 - - @backstage/plugin-lighthouse-backend@0.4.10-next.1 - - @backstage/plugin-linguist-backend@0.5.15-next.1 - - @backstage/plugin-nomad-backend@0.1.19-next.1 - - @backstage/plugin-permission-backend@0.5.41-next.1 - - @backstage/plugin-permission-node@0.7.28-next.1 - - @backstage/plugin-playlist-backend@0.3.21-next.1 - - @backstage/plugin-search-backend@1.5.7-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.22-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.21-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.1 - - @backstage/plugin-search-backend-node@1.2.21-next.1 - - @backstage/plugin-signals-backend@0.1.3-next.1 - - @backstage/plugin-sonarqube-backend@0.2.19-next.1 - - @backstage/plugin-todo-backend@0.3.16-next.1 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.1 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.25-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@1.10.4-next.0 - - @backstage/plugin-catalog-backend@1.21.1-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.0 - - @backstage/plugin-kubernetes-backend@0.16.4-next.0 - - @backstage/plugin-signals-backend@0.1.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.0 - - @backstage/plugin-scaffolder-backend@1.22.4-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.0 - - @backstage/backend-defaults@0.2.17-next.0 - - @backstage/plugin-app-backend@0.3.65-next.0 - - @backstage/backend-plugin-api@0.6.17-next.0 - - @backstage/backend-tasks@0.5.22-next.0 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-adr-backend@0.4.14-next.0 - - @backstage/plugin-auth-backend@0.22.4-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.0 - - @backstage/plugin-auth-node@0.4.12-next.0 - - @backstage/plugin-azure-devops-backend@0.6.4-next.0 - - @backstage/plugin-badges-backend@0.3.14-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.0 - - @backstage/plugin-devtools-backend@0.3.3-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.14-next.0 - - @backstage/plugin-jenkins-backend@0.4.4-next.0 - - @backstage/plugin-lighthouse-backend@0.4.10-next.0 - - @backstage/plugin-linguist-backend@0.5.15-next.0 - - @backstage/plugin-nomad-backend@0.1.19-next.0 - - @backstage/plugin-notifications-backend@0.1.3-next.0 - - @backstage/plugin-permission-backend@0.5.41-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.0 - - @backstage/plugin-permission-common@0.7.13 - - @backstage/plugin-permission-node@0.7.28-next.0 - - @backstage/plugin-playlist-backend@0.3.21-next.0 - - @backstage/plugin-proxy-backend@0.4.15-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.0 - - @backstage/plugin-search-backend@1.5.7-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.22-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.21-next.0 - - @backstage/plugin-search-backend-node@1.2.21-next.0 - - @backstage/plugin-sonarqube-backend@0.2.19-next.0 - - @backstage/plugin-todo-backend@0.3.16-next.0 - -## 0.0.24 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.21.0 - - @backstage/plugin-kubernetes-backend@0.16.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.3 - - @backstage/plugin-permission-backend@0.5.40 - - @backstage/plugin-proxy-backend@0.4.14 - - @backstage/plugin-scaffolder-backend@1.22.3 - - @backstage/plugin-jenkins-backend@0.4.3 - - @backstage/plugin-auth-backend@0.22.3 - - @backstage/plugin-auth-node@0.4.11 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.34 - - @backstage/plugin-azure-devops-backend@0.6.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.10 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.14 - - @backstage/plugin-lighthouse-backend@0.4.9 - - @backstage/plugin-linguist-backend@0.5.14 - - @backstage/plugin-search-backend-module-catalog@0.1.21 - - @backstage/plugin-search-backend-module-techdocs@0.1.21 - - @backstage/plugin-todo-backend@0.3.15 - - @backstage/backend-defaults@0.2.16 - - @backstage/plugin-app-backend@0.3.64 - - @backstage/plugin-adr-backend@0.4.13 - - @backstage/plugin-badges-backend@0.3.13 - - @backstage/plugin-entity-feedback-backend@0.2.13 - - @backstage/plugin-notifications-backend@0.1.2 - - @backstage/plugin-playlist-backend@0.3.20 - - @backstage/plugin-techdocs-backend@1.10.3 - - @backstage/plugin-auth-backend-module-github-provider@0.1.13 - - @backstage/backend-plugin-api@0.6.16 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.13 - - @backstage/plugin-permission-node@0.7.27 - - @backstage/plugin-signals-backend@0.1.2 - - @backstage/backend-tasks@0.5.21 - - @backstage/plugin-devtools-backend@0.3.2 - - @backstage/plugin-nomad-backend@0.1.18 - - @backstage/plugin-scaffolder-backend-module-github@0.2.6 - - @backstage/plugin-search-backend@1.5.6 - - @backstage/plugin-search-backend-module-explore@0.1.20 - - @backstage/plugin-search-backend-node@1.2.20 - - @backstage/plugin-sonarqube-backend@0.2.18 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.23 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.20.0 - - @backstage/plugin-kubernetes-backend@0.16.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.2 - - @backstage/plugin-permission-backend@0.5.39 - - @backstage/plugin-catalog-backend-module-openapi@0.1.33 - - @backstage/plugin-auth-backend@0.22.2 - - @backstage/plugin-azure-devops-backend@0.6.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.9 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.13 - - @backstage/plugin-jenkins-backend@0.4.2 - - @backstage/plugin-lighthouse-backend@0.4.8 - - @backstage/plugin-linguist-backend@0.5.13 - - @backstage/plugin-scaffolder-backend@1.22.2 - - @backstage/plugin-search-backend-module-catalog@0.1.20 - - @backstage/plugin-search-backend-module-techdocs@0.1.20 - - @backstage/plugin-todo-backend@0.3.14 - - @backstage/backend-defaults@0.2.15 - - @backstage/plugin-app-backend@0.3.63 - - @backstage/plugin-adr-backend@0.4.12 - - @backstage/plugin-auth-node@0.4.10 - - @backstage/plugin-badges-backend@0.3.12 - - @backstage/plugin-entity-feedback-backend@0.2.12 - - @backstage/plugin-notifications-backend@0.1.1 - - @backstage/plugin-playlist-backend@0.3.19 - - @backstage/plugin-techdocs-backend@1.10.2 - - @backstage/backend-tasks@0.5.20 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.1 - - @backstage/plugin-devtools-backend@0.3.1 - - @backstage/plugin-nomad-backend@0.1.17 - - @backstage/plugin-permission-node@0.7.26 - - @backstage/plugin-proxy-backend@0.4.13 - - @backstage/plugin-scaffolder-backend-module-github@0.2.5 - - @backstage/plugin-search-backend@1.5.5 - - @backstage/plugin-search-backend-module-explore@0.1.19 - - @backstage/plugin-search-backend-node@1.2.19 - - @backstage/plugin-signals-backend@0.1.1 - - @backstage/plugin-sonarqube-backend@0.2.17 - - @backstage/backend-plugin-api@0.6.15 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-auth-backend-module-github-provider@0.1.12 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.12 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.22 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.19.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.1 - - @backstage/plugin-permission-backend@0.5.38 - - @backstage/plugin-catalog-backend-module-openapi@0.1.32 - - @backstage/plugin-auth-backend@0.22.1 - - @backstage/plugin-azure-devops-backend@0.6.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.8 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.12 - - @backstage/plugin-jenkins-backend@0.4.1 - - @backstage/plugin-kubernetes-backend@0.16.1 - - @backstage/plugin-lighthouse-backend@0.4.7 - - @backstage/plugin-linguist-backend@0.5.12 - - @backstage/plugin-scaffolder-backend@1.22.1 - - @backstage/plugin-search-backend-module-catalog@0.1.19 - - @backstage/plugin-search-backend-module-techdocs@0.1.19 - - @backstage/plugin-todo-backend@0.3.13 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11 - - @backstage/plugin-techdocs-backend@1.10.1 - -## 0.0.21 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-notifications-backend@0.1.0 - - @backstage/plugin-scaffolder-backend@1.22.0 - - @backstage/plugin-linguist-backend@0.5.11 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.0 - - @backstage/plugin-catalog-backend@1.18.0 - - @backstage/plugin-devtools-backend@0.3.0 - - @backstage/plugin-jenkins-backend@0.4.0 - - @backstage/plugin-search-backend@1.5.4 - - @backstage/plugin-auth-node@0.4.9 - - @backstage/plugin-lighthouse-backend@0.4.6 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0 - - @backstage/plugin-azure-devops-backend@0.6.0 - - @backstage/plugin-permission-backend@0.5.37 - - @backstage/plugin-signals-backend@0.1.0 - - @backstage/plugin-nomad-backend@0.1.16 - - @backstage/plugin-entity-feedback-backend@0.2.11 - - @backstage/plugin-playlist-backend@0.3.18 - - @backstage/backend-plugin-api@0.6.14 - - @backstage/plugin-auth-backend@0.22.0 - - @backstage/plugin-techdocs-backend@1.10.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.4 - - @backstage/plugin-permission-common@0.7.13 - - @backstage/plugin-search-backend-module-techdocs@0.1.18 - - @backstage/plugin-search-backend-module-catalog@0.1.18 - - @backstage/plugin-search-backend-module-explore@0.1.18 - - @backstage/backend-defaults@0.2.14 - - @backstage/plugin-kubernetes-backend@0.16.0 - - @backstage/plugin-adr-backend@0.4.11 - - @backstage/plugin-proxy-backend@0.4.12 - - @backstage/backend-tasks@0.5.19 - - @backstage/plugin-search-backend-node@1.2.18 - - @backstage/plugin-app-backend@0.3.62 - - @backstage/plugin-permission-node@0.7.25 - - @backstage/plugin-todo-backend@0.3.12 - - @backstage/plugin-badges-backend@0.3.11 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11 - - @backstage/plugin-catalog-backend-module-openapi@0.1.31 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11 - - @backstage/plugin-sonarqube-backend@0.2.16 - - @backstage/catalog-model@1.4.5 - -## 0.0.21-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.22.0-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.2 - - @backstage/plugin-catalog-backend@1.18.0-next.2 - - @backstage/plugin-devtools-backend@0.3.0-next.2 - - @backstage/plugin-jenkins-backend@0.4.0-next.2 - - @backstage/plugin-search-backend@1.5.4-next.2 - - @backstage/plugin-techdocs-backend@1.10.0-next.2 - - @backstage/plugin-notifications-backend@0.1.0-next.2 - - @backstage/plugin-linguist-backend@0.5.11-next.2 - - @backstage/plugin-kubernetes-backend@0.16.0-next.2 - - @backstage/plugin-todo-backend@0.3.12-next.2 - - @backstage/plugin-signals-backend@0.1.0-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.2 - - @backstage/plugin-adr-backend@0.4.11-next.2 - - @backstage/plugin-azure-devops-backend@0.6.0-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.2 - - @backstage/plugin-auth-backend@0.22.0-next.2 - - @backstage/backend-defaults@0.2.14-next.2 - - @backstage/plugin-app-backend@0.3.62-next.2 - - @backstage/plugin-auth-node@0.4.9-next.2 - - @backstage/plugin-badges-backend@0.3.11-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.11-next.2 - - @backstage/plugin-lighthouse-backend@0.4.6-next.2 - - @backstage/plugin-playlist-backend@0.3.18-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.18-next.2 - - @backstage/backend-plugin-api@0.6.14-next.2 - - @backstage/backend-tasks@0.5.19-next.2 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.2 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.2 - - @backstage/plugin-nomad-backend@0.1.16-next.2 - - @backstage/plugin-permission-backend@0.5.37-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.2 - - @backstage/plugin-permission-common@0.7.13-next.1 - - @backstage/plugin-permission-node@0.7.25-next.2 - - @backstage/plugin-proxy-backend@0.4.12-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.18-next.2 - - @backstage/plugin-search-backend-node@1.2.18-next.2 - - @backstage/plugin-sonarqube-backend@0.2.16-next.2 - -## 0.0.21-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-entity-feedback-backend@0.2.11-next.1 - - @backstage/plugin-notifications-backend@0.1.0-next.1 - - @backstage/plugin-scaffolder-backend@1.22.0-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.1 - - @backstage/plugin-app-backend@0.3.62-next.1 - - @backstage/plugin-signals-backend@0.1.0-next.1 - - @backstage/plugin-azure-devops-backend@0.6.0-next.1 - - @backstage/plugin-kubernetes-backend@0.16.0-next.1 - - @backstage/backend-plugin-api@0.6.14-next.1 - - @backstage/backend-tasks@0.5.19-next.1 - - @backstage/plugin-adr-backend@0.4.11-next.1 - - @backstage/plugin-auth-backend@0.22.0-next.1 - - @backstage/plugin-auth-node@0.4.9-next.1 - - @backstage/plugin-badges-backend@0.3.11-next.1 - - @backstage/plugin-catalog-backend@1.18.0-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.1 - - @backstage/plugin-devtools-backend@0.3.0-next.1 - - @backstage/plugin-jenkins-backend@0.4.0-next.1 - - @backstage/plugin-lighthouse-backend@0.4.6-next.1 - - @backstage/plugin-linguist-backend@0.5.11-next.1 - - @backstage/plugin-nomad-backend@0.1.16-next.1 - - @backstage/plugin-permission-backend@0.5.37-next.1 - - @backstage/plugin-permission-common@0.7.13-next.1 - - @backstage/plugin-permission-node@0.7.25-next.1 - - @backstage/plugin-playlist-backend@0.3.18-next.1 - - @backstage/plugin-proxy-backend@0.4.12-next.1 - - @backstage/plugin-search-backend@1.5.4-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.18-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.18-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.1 - - @backstage/plugin-search-backend-node@1.2.18-next.1 - - @backstage/plugin-sonarqube-backend@0.2.16-next.1 - - @backstage/plugin-techdocs-backend@1.9.7-next.1 - - @backstage/plugin-todo-backend@0.3.12-next.1 - - @backstage/backend-defaults@0.2.14-next.1 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.1 - -## 0.0.21-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-linguist-backend@0.5.10-next.0 - - @backstage/plugin-auth-node@0.4.8-next.0 - - @backstage/plugin-lighthouse-backend@0.4.5-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.0 - - @backstage/plugin-playlist-backend@0.3.17-next.0 - - @backstage/backend-plugin-api@0.6.13-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.10-next.0 - - @backstage/plugin-notifications-backend@0.1.0-next.0 - - @backstage/plugin-catalog-backend@1.18.0-next.0 - - @backstage/plugin-auth-backend@0.22.0-next.0 - - @backstage/plugin-jenkins-backend@0.4.0-next.0 - - @backstage/plugin-azure-devops-backend@0.6.0-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.3-next.0 - - @backstage/plugin-scaffolder-backend@1.22.0-next.0 - - @backstage/plugin-permission-common@0.7.13-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.17-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.17-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.17-next.0 - - @backstage/backend-defaults@0.2.13-next.0 - - @backstage/plugin-kubernetes-backend@0.16.0-next.0 - - @backstage/plugin-adr-backend@0.4.10-next.0 - - @backstage/plugin-proxy-backend@0.4.11-next.0 - - @backstage/backend-tasks@0.5.18-next.0 - - @backstage/plugin-search-backend-node@1.2.17-next.0 - - @backstage/plugin-signals-backend@0.0.4-next.0 - - @backstage/plugin-search-backend@1.5.3-next.0 - - @backstage/plugin-devtools-backend@0.3.0-next.0 - - @backstage/plugin-permission-node@0.7.24-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.6-next.0 - - @backstage/plugin-badges-backend@0.3.10-next.0 - - @backstage/plugin-permission-backend@0.5.36-next.0 - - @backstage/plugin-app-backend@0.3.61-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.10-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.30-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.10-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.10-next.0 - - @backstage/plugin-sonarqube-backend@0.2.15-next.0 - - @backstage/plugin-techdocs-backend@1.9.6-next.0 - - @backstage/plugin-nomad-backend@0.1.15-next.0 - - @backstage/plugin-todo-backend@0.3.11-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.10-next.0 - - @backstage/catalog-model@1.4.5-next.0 - -## 0.0.20 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7 - - @backstage/plugin-scaffolder-backend@1.21.0 - - @backstage/plugin-badges-backend@0.3.7 - - @backstage/plugin-azure-devops-backend@0.5.2 - - @backstage/plugin-auth-node@0.4.4 - - @backstage/plugin-entity-feedback-backend@0.2.7 - - @backstage/plugin-lighthouse-backend@0.4.2 - - @backstage/plugin-devtools-backend@0.2.7 - - @backstage/plugin-linguist-backend@0.5.7 - - @backstage/plugin-adr-backend@0.4.7 - - @backstage/plugin-kubernetes-backend@0.15.0 - - @backstage/plugin-signals-backend@0.0.1 - - @backstage/plugin-notifications-backend@0.0.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27 - - @backstage/plugin-search-backend-module-techdocs@0.1.14 - - @backstage/plugin-search-backend-module-catalog@0.1.14 - - @backstage/plugin-search-backend-module-explore@0.1.14 - - @backstage/backend-plugin-api@0.6.10 - - @backstage/backend-defaults@0.2.10 - - @backstage/plugin-sonarqube-backend@0.2.12 - - @backstage/plugin-playlist-backend@0.3.14 - - @backstage/plugin-catalog-backend@1.17.0 - - @backstage/plugin-jenkins-backend@0.3.4 - - @backstage/backend-tasks@0.5.15 - - @backstage/plugin-nomad-backend@0.1.12 - - @backstage/plugin-app-backend@0.3.58 - - @backstage/plugin-search-backend@1.5.0 - - @backstage/plugin-todo-backend@0.3.8 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3 - - @backstage/plugin-techdocs-backend@1.9.3 - - @backstage/plugin-permission-backend@0.5.33 - - @backstage/plugin-permission-node@0.7.21 - - @backstage/plugin-proxy-backend@0.4.8 - - @backstage/plugin-search-backend-node@1.2.14 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.20-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-badges-backend@0.3.7-next.3 - - @backstage/plugin-kubernetes-backend@0.15.0-next.3 - - @backstage/backend-tasks@0.5.15-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.3 - - @backstage/plugin-notifications-backend@0.0.1-next.1 - - @backstage/plugin-signals-backend@0.0.1-next.3 - - @backstage/plugin-catalog-backend@1.17.0-next.3 - - @backstage/plugin-app-backend@0.3.58-next.3 - - @backstage/backend-defaults@0.2.10-next.3 - - @backstage/plugin-adr-backend@0.4.7-next.3 - - @backstage/plugin-auth-node@0.4.4-next.3 - - @backstage/plugin-azure-devops-backend@0.5.2-next.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.3 - - @backstage/plugin-devtools-backend@0.2.7-next.3 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.3 - - @backstage/plugin-jenkins-backend@0.3.4-next.3 - - @backstage/plugin-lighthouse-backend@0.4.2-next.3 - - @backstage/plugin-linguist-backend@0.5.7-next.3 - - @backstage/plugin-nomad-backend@0.1.12-next.3 - - @backstage/plugin-permission-backend@0.5.33-next.3 - - @backstage/plugin-permission-node@0.7.21-next.3 - - @backstage/plugin-playlist-backend@0.3.14-next.3 - - @backstage/plugin-proxy-backend@0.4.8-next.3 - - @backstage/plugin-scaffolder-backend@1.21.0-next.3 - - @backstage/plugin-search-backend@1.5.0-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.3 - - @backstage/plugin-search-backend-node@1.2.14-next.3 - - @backstage/plugin-sonarqube-backend@0.2.12-next.3 - - @backstage/plugin-techdocs-backend@1.9.3-next.3 - - @backstage/plugin-todo-backend@0.3.8-next.3 - - @backstage/backend-plugin-api@0.6.10-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.3 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.20-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.21.0-next.2 - - @backstage/plugin-signals-backend@0.0.1-next.2 - - @backstage/plugin-kubernetes-backend@0.15.0-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.2 - - @backstage/plugin-azure-devops-backend@0.5.2-next.2 - - @backstage/backend-plugin-api@0.6.10-next.2 - - @backstage/plugin-lighthouse-backend@0.4.2-next.2 - - @backstage/backend-defaults@0.2.10-next.2 - - @backstage/plugin-sonarqube-backend@0.2.12-next.2 - - @backstage/plugin-devtools-backend@0.2.7-next.2 - - @backstage/plugin-linguist-backend@0.5.7-next.2 - - @backstage/plugin-playlist-backend@0.3.14-next.2 - - @backstage/plugin-catalog-backend@1.17.0-next.2 - - @backstage/plugin-jenkins-backend@0.3.4-next.2 - - @backstage/backend-tasks@0.5.15-next.2 - - @backstage/plugin-badges-backend@0.3.7-next.2 - - @backstage/plugin-nomad-backend@0.1.12-next.2 - - @backstage/plugin-adr-backend@0.4.7-next.2 - - @backstage/plugin-app-backend@0.3.58-next.2 - - @backstage/plugin-auth-node@0.4.4-next.2 - - @backstage/plugin-notifications-backend@0.0.1-next.0 - - @backstage/plugin-todo-backend@0.3.8-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.2 - - @backstage/plugin-permission-backend@0.5.33-next.2 - - @backstage/plugin-permission-node@0.7.21-next.2 - - @backstage/plugin-proxy-backend@0.4.8-next.2 - - @backstage/plugin-search-backend@1.5.0-next.2 - - @backstage/plugin-search-backend-node@1.2.14-next.2 - - @backstage/plugin-techdocs-backend@1.9.3-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.2 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.20-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.21.0-next.1 - - @backstage/plugin-azure-devops-backend@0.5.2-next.1 - - @backstage/plugin-catalog-backend@1.17.0-next.1 - - @backstage/backend-plugin-api@0.6.10-next.1 - - @backstage/backend-defaults@0.2.10-next.1 - - @backstage/backend-tasks@0.5.15-next.1 - - @backstage/plugin-adr-backend@0.4.7-next.1 - - @backstage/plugin-app-backend@0.3.58-next.1 - - @backstage/plugin-auth-node@0.4.4-next.1 - - @backstage/plugin-badges-backend@0.3.7-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.1 - - @backstage/plugin-devtools-backend@0.2.7-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.1 - - @backstage/plugin-jenkins-backend@0.3.4-next.1 - - @backstage/plugin-kubernetes-backend@0.14.2-next.1 - - @backstage/plugin-lighthouse-backend@0.4.2-next.1 - - @backstage/plugin-linguist-backend@0.5.7-next.1 - - @backstage/plugin-nomad-backend@0.1.12-next.1 - - @backstage/plugin-permission-backend@0.5.33-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.1 - - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-permission-node@0.7.21-next.1 - - @backstage/plugin-playlist-backend@0.3.14-next.1 - - @backstage/plugin-proxy-backend@0.4.8-next.1 - - @backstage/plugin-search-backend@1.5.0-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.1 - - @backstage/plugin-search-backend-node@1.2.14-next.1 - - @backstage/plugin-sonarqube-backend@0.2.12-next.1 - - @backstage/plugin-techdocs-backend@1.9.3-next.1 - - @backstage/plugin-todo-backend@0.3.8-next.1 - -## 0.0.20-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-azure-devops-backend@0.5.2-next.0 - - @backstage/plugin-kubernetes-backend@0.14.2-next.0 - - @backstage/plugin-catalog-backend@1.17.0-next.0 - - @backstage/plugin-search-backend@1.5.0-next.0 - - @backstage/plugin-todo-backend@0.3.8-next.0 - - @backstage/plugin-scaffolder-backend@1.21.0-next.0 - - @backstage/plugin-app-backend@0.3.58-next.0 - - @backstage/backend-defaults@0.2.10-next.0 - - @backstage/backend-tasks@0.5.15-next.0 - - @backstage/plugin-auth-node@0.4.4-next.0 - - @backstage/plugin-badges-backend@0.3.7-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.0 - - @backstage/plugin-linguist-backend@0.5.7-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.0 - - @backstage/plugin-permission-node@0.7.21-next.0 - - @backstage/plugin-playlist-backend@0.3.14-next.0 - - @backstage/plugin-proxy-backend@0.4.8-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.0 - - @backstage/plugin-sonarqube-backend@0.2.12-next.0 - - @backstage/plugin-techdocs-backend@1.9.3-next.0 - - @backstage/plugin-adr-backend@0.4.7-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.0 - - @backstage/plugin-devtools-backend@0.2.7-next.0 - - @backstage/plugin-jenkins-backend@0.3.4-next.0 - - @backstage/plugin-lighthouse-backend@0.4.2-next.0 - - @backstage/plugin-nomad-backend@0.1.12-next.0 - - @backstage/plugin-permission-backend@0.5.33-next.0 - - @backstage/plugin-search-backend-node@1.2.14-next.0 - - @backstage/backend-plugin-api@0.6.10-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.0 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.19 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-sonarqube-backend@0.2.11 - - @backstage/plugin-scaffolder-backend@1.20.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26 - - @backstage/plugin-search-backend-module-techdocs@0.1.13 - - @backstage/plugin-search-backend-module-catalog@0.1.13 - - @backstage/plugin-search-backend-module-explore@0.1.13 - - @backstage/backend-plugin-api@0.6.9 - - @backstage/backend-defaults@0.2.9 - - @backstage/plugin-azure-devops-backend@0.5.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2 - - @backstage/plugin-entity-feedback-backend@0.2.6 - - @backstage/plugin-devtools-backend@0.2.6 - - @backstage/plugin-linguist-backend@0.5.6 - - @backstage/plugin-playlist-backend@0.3.13 - - @backstage/plugin-techdocs-backend@1.9.2 - - @backstage/plugin-jenkins-backend@0.3.3 - - @backstage/plugin-badges-backend@0.3.6 - - @backstage/plugin-search-backend@1.4.9 - - @backstage/plugin-nomad-backend@0.1.11 - - @backstage/plugin-todo-backend@0.3.7 - - @backstage/plugin-adr-backend@0.4.6 - - @backstage/plugin-app-backend@0.3.57 - - @backstage/plugin-permission-backend@0.5.32 - - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-permission-node@0.7.20 - - @backstage/plugin-catalog-backend@1.16.1 - - @backstage/backend-tasks@0.5.14 - - @backstage/plugin-auth-node@0.4.3 - - @backstage/plugin-kubernetes-backend@0.14.1 - - @backstage/plugin-lighthouse-backend@0.4.1 - - @backstage/plugin-proxy-backend@0.4.7 - - @backstage/plugin-search-backend-node@1.2.13 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 - -## 0.0.19-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-sonarqube-backend@0.2.11-next.2 - - @backstage/backend-plugin-api@0.6.9-next.2 - - @backstage/backend-defaults@0.2.9-next.2 - - @backstage/plugin-adr-backend@0.4.6-next.2 - - @backstage/plugin-app-backend@0.3.57-next.2 - - @backstage/plugin-auth-node@0.4.3-next.2 - - @backstage/plugin-azure-devops-backend@0.5.1-next.2 - - @backstage/plugin-badges-backend@0.3.6-next.2 - - @backstage/plugin-catalog-backend@1.16.1-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 - - @backstage/plugin-devtools-backend@0.2.6-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 - - @backstage/plugin-jenkins-backend@0.3.3-next.2 - - @backstage/plugin-kubernetes-backend@0.14.1-next.2 - - @backstage/plugin-lighthouse-backend@0.4.1-next.2 - - @backstage/plugin-linguist-backend@0.5.6-next.2 - - @backstage/plugin-nomad-backend@0.1.11-next.2 - - @backstage/plugin-permission-backend@0.5.32-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.2 - - @backstage/plugin-permission-node@0.7.20-next.2 - - @backstage/plugin-playlist-backend@0.3.13-next.2 - - @backstage/plugin-proxy-backend@0.4.7-next.2 - - @backstage/plugin-scaffolder-backend@1.19.3-next.2 - - @backstage/plugin-search-backend@1.4.9-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 - - @backstage/plugin-search-backend-node@1.2.13-next.2 - - @backstage/plugin-techdocs-backend@1.9.2-next.2 - - @backstage/plugin-todo-backend@0.3.7-next.2 - - @backstage/backend-tasks@0.5.14-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.2 - -## 0.0.19-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-app-backend@0.3.57-next.1 - - @backstage/plugin-devtools-backend@0.2.6-next.1 - - @backstage/plugin-proxy-backend@0.4.7-next.1 - - @backstage/backend-defaults@0.2.9-next.1 - - @backstage/plugin-kubernetes-backend@0.14.1-next.1 - - @backstage/backend-tasks@0.5.14-next.1 - - @backstage/plugin-adr-backend@0.4.6-next.1 - - @backstage/plugin-auth-node@0.4.3-next.1 - - @backstage/plugin-azure-devops-backend@0.5.1-next.1 - - @backstage/plugin-badges-backend@0.3.6-next.1 - - @backstage/plugin-catalog-backend@1.16.1-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.6-next.1 - - @backstage/plugin-jenkins-backend@0.3.3-next.1 - - @backstage/plugin-lighthouse-backend@0.4.1-next.1 - - @backstage/plugin-linguist-backend@0.5.6-next.1 - - @backstage/plugin-nomad-backend@0.1.11-next.1 - - @backstage/plugin-permission-backend@0.5.32-next.1 - - @backstage/plugin-permission-node@0.7.20-next.1 - - @backstage/plugin-playlist-backend@0.3.13-next.1 - - @backstage/plugin-scaffolder-backend@1.19.3-next.1 - - @backstage/plugin-search-backend@1.4.9-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.13-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.13-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.1 - - @backstage/plugin-search-backend-node@1.2.13-next.1 - - @backstage/plugin-sonarqube-backend@0.2.11-next.1 - - @backstage/plugin-techdocs-backend@1.9.2-next.1 - - @backstage/plugin-todo-backend@0.3.7-next.1 - - @backstage/backend-plugin-api@0.6.9-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.1 - - @backstage/plugin-permission-common@0.7.11 - -## 0.0.19-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.19.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.13-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.13-next.0 - - @backstage/plugin-azure-devops-backend@0.5.1-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.6-next.0 - - @backstage/plugin-devtools-backend@0.2.6-next.0 - - @backstage/plugin-linguist-backend@0.5.6-next.0 - - @backstage/plugin-playlist-backend@0.3.13-next.0 - - @backstage/plugin-techdocs-backend@1.9.2-next.0 - - @backstage/plugin-jenkins-backend@0.3.3-next.0 - - @backstage/plugin-badges-backend@0.3.6-next.0 - - @backstage/plugin-search-backend@1.4.9-next.0 - - @backstage/plugin-nomad-backend@0.1.11-next.0 - - @backstage/plugin-todo-backend@0.3.7-next.0 - - @backstage/plugin-adr-backend@0.4.6-next.0 - - @backstage/plugin-app-backend@0.3.57-next.0 - - @backstage/backend-defaults@0.2.9-next.0 - - @backstage/backend-plugin-api@0.6.9-next.0 - - @backstage/backend-tasks@0.5.14-next.0 - - @backstage/plugin-auth-node@0.4.3-next.0 - - @backstage/plugin-catalog-backend@1.16.1-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.0 - - @backstage/plugin-kubernetes-backend@0.14.1-next.0 - - @backstage/plugin-lighthouse-backend@0.4.1-next.0 - - @backstage/plugin-permission-backend@0.5.32-next.0 - - @backstage/plugin-permission-common@0.7.11 - - @backstage/plugin-permission-node@0.7.20-next.0 - - @backstage/plugin-proxy-backend@0.4.7-next.0 - - @backstage/plugin-search-backend-node@1.2.13-next.0 - - @backstage/plugin-sonarqube-backend@0.2.11-next.0 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1 - - @backstage/plugin-techdocs-backend@1.9.1 - - @backstage/plugin-catalog-backend@1.16.0 - - @backstage/plugin-azure-devops-backend@0.5.0 - - @backstage/plugin-scaffolder-backend@1.19.2 - - @backstage/backend-tasks@0.5.13 - - @backstage/plugin-lighthouse-backend@0.4.0 - - @backstage/plugin-kubernetes-backend@0.14.0 - - @backstage/plugin-auth-node@0.4.2 - - @backstage/plugin-permission-backend@0.5.31 - - @backstage/plugin-permission-common@0.7.11 - - @backstage/plugin-playlist-backend@0.3.12 - - @backstage/plugin-permission-node@0.7.19 - - @backstage/plugin-search-backend@1.4.8 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5 - - @backstage/plugin-search-backend-module-techdocs@0.1.12 - - @backstage/plugin-search-backend-module-catalog@0.1.12 - - @backstage/plugin-search-backend-module-explore@0.1.12 - - @backstage/backend-defaults@0.2.8 - - @backstage/plugin-adr-backend@0.4.5 - - @backstage/plugin-app-backend@0.3.56 - - @backstage/plugin-badges-backend@0.3.5 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25 - - @backstage/plugin-devtools-backend@0.2.5 - - @backstage/plugin-entity-feedback-backend@0.2.5 - - @backstage/plugin-jenkins-backend@0.3.2 - - @backstage/plugin-linguist-backend@0.5.5 - - @backstage/plugin-nomad-backend@0.1.10 - - @backstage/plugin-proxy-backend@0.4.6 - - @backstage/plugin-search-backend-node@1.2.12 - - @backstage/plugin-sonarqube-backend@0.2.10 - - @backstage/plugin-todo-backend@0.3.6 - - @backstage/backend-plugin-api@0.6.8 - -## 0.0.18-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-azure-devops-backend@0.5.0-next.3 - - @backstage/plugin-scaffolder-backend@1.19.2-next.3 - - @backstage/backend-defaults@0.2.8-next.3 - - @backstage/backend-plugin-api@0.6.8-next.3 - - @backstage/backend-tasks@0.5.13-next.3 - - @backstage/plugin-adr-backend@0.4.5-next.3 - - @backstage/plugin-app-backend@0.3.56-next.3 - - @backstage/plugin-auth-node@0.4.2-next.3 - - @backstage/plugin-badges-backend@0.3.5-next.3 - - @backstage/plugin-catalog-backend@1.16.0-next.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.3 - - @backstage/plugin-devtools-backend@0.2.5-next.3 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.3 - - @backstage/plugin-jenkins-backend@0.3.2-next.3 - - @backstage/plugin-kubernetes-backend@0.14.0-next.3 - - @backstage/plugin-lighthouse-backend@0.4.0-next.3 - - @backstage/plugin-linguist-backend@0.5.5-next.3 - - @backstage/plugin-nomad-backend@0.1.10-next.3 - - @backstage/plugin-permission-backend@0.5.31-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.3 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-permission-node@0.7.19-next.3 - - @backstage/plugin-playlist-backend@0.3.12-next.3 - - @backstage/plugin-proxy-backend@0.4.6-next.3 - - @backstage/plugin-search-backend@1.4.8-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.3 - - @backstage/plugin-search-backend-node@1.2.12-next.3 - - @backstage/plugin-sonarqube-backend@0.2.10-next.3 - - @backstage/plugin-techdocs-backend@1.9.1-next.3 - - @backstage/plugin-todo-backend@0.3.6-next.3 - -## 0.0.18-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.16.0-next.2 - - @backstage/plugin-lighthouse-backend@0.4.0-next.2 - - @backstage/plugin-auth-node@0.4.2-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.2 - - @backstage/backend-defaults@0.2.8-next.2 - - @backstage/backend-plugin-api@0.6.8-next.2 - - @backstage/backend-tasks@0.5.13-next.2 - - @backstage/plugin-adr-backend@0.4.5-next.2 - - @backstage/plugin-app-backend@0.3.56-next.2 - - @backstage/plugin-azure-devops-backend@0.5.0-next.2 - - @backstage/plugin-badges-backend@0.3.5-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.2 - - @backstage/plugin-devtools-backend@0.2.5-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.2 - - @backstage/plugin-jenkins-backend@0.3.2-next.2 - - @backstage/plugin-kubernetes-backend@0.14.0-next.2 - - @backstage/plugin-linguist-backend@0.5.5-next.2 - - @backstage/plugin-nomad-backend@0.1.10-next.2 - - @backstage/plugin-permission-backend@0.5.31-next.2 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-permission-node@0.7.19-next.2 - - @backstage/plugin-playlist-backend@0.3.12-next.2 - - @backstage/plugin-proxy-backend@0.4.6-next.2 - - @backstage/plugin-scaffolder-backend@1.19.2-next.2 - - @backstage/plugin-search-backend@1.4.8-next.2 - - @backstage/plugin-search-backend-node@1.2.12-next.2 - - @backstage/plugin-sonarqube-backend@0.2.10-next.2 - - @backstage/plugin-techdocs-backend@1.9.1-next.2 - - @backstage/plugin-todo-backend@0.3.6-next.2 - -## 0.0.18-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.1 - - @backstage/plugin-catalog-backend@1.15.1-next.1 - - @backstage/plugin-azure-devops-backend@0.5.0-next.1 - - @backstage/plugin-kubernetes-backend@0.14.0-next.1 - - @backstage/backend-defaults@0.2.8-next.1 - - @backstage/backend-plugin-api@0.6.8-next.1 - - @backstage/backend-tasks@0.5.13-next.1 - - @backstage/plugin-adr-backend@0.4.5-next.1 - - @backstage/plugin-app-backend@0.3.56-next.1 - - @backstage/plugin-auth-node@0.4.2-next.1 - - @backstage/plugin-badges-backend@0.3.5-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.1 - - @backstage/plugin-devtools-backend@0.2.5-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.1 - - @backstage/plugin-jenkins-backend@0.3.2-next.1 - - @backstage/plugin-lighthouse-backend@0.3.5-next.1 - - @backstage/plugin-linguist-backend@0.5.5-next.1 - - @backstage/plugin-nomad-backend@0.1.10-next.1 - - @backstage/plugin-permission-backend@0.5.31-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.1 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-permission-node@0.7.19-next.1 - - @backstage/plugin-playlist-backend@0.3.12-next.1 - - @backstage/plugin-proxy-backend@0.4.6-next.1 - - @backstage/plugin-scaffolder-backend@1.19.2-next.1 - - @backstage/plugin-search-backend@1.4.8-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.1 - - @backstage/plugin-search-backend-node@1.2.12-next.1 - - @backstage/plugin-sonarqube-backend@0.2.10-next.1 - - @backstage/plugin-techdocs-backend@1.9.1-next.1 - - @backstage/plugin-todo-backend@0.3.6-next.1 - -## 0.0.18-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.13-next.0 - - @backstage/plugin-scaffolder-backend@1.19.2-next.0 - - @backstage/plugin-kubernetes-backend@0.14.0-next.0 - - @backstage/backend-defaults@0.2.8-next.0 - - @backstage/plugin-adr-backend@0.4.5-next.0 - - @backstage/plugin-app-backend@0.3.56-next.0 - - @backstage/plugin-auth-node@0.4.2-next.0 - - @backstage/plugin-azure-devops-backend@0.4.5-next.0 - - @backstage/plugin-badges-backend@0.3.5-next.0 - - @backstage/plugin-catalog-backend@1.15.1-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.0 - - @backstage/plugin-devtools-backend@0.2.5-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.0 - - @backstage/plugin-jenkins-backend@0.3.2-next.0 - - @backstage/plugin-lighthouse-backend@0.3.5-next.0 - - @backstage/plugin-linguist-backend@0.5.5-next.0 - - @backstage/plugin-nomad-backend@0.1.10-next.0 - - @backstage/plugin-permission-backend@0.5.31-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.0 - - @backstage/plugin-permission-node@0.7.19-next.0 - - @backstage/plugin-playlist-backend@0.3.12-next.0 - - @backstage/plugin-proxy-backend@0.4.6-next.0 - - @backstage/plugin-search-backend@1.4.8-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.0 - - @backstage/plugin-search-backend-node@1.2.12-next.0 - - @backstage/plugin-sonarqube-backend@0.2.10-next.0 - - @backstage/plugin-techdocs-backend@1.9.1-next.0 - - @backstage/plugin-todo-backend@0.3.6-next.0 - - @backstage/backend-plugin-api@0.6.8-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.0 - - @backstage/plugin-permission-common@0.7.10 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.15.0 - - @backstage/plugin-kubernetes-backend@0.13.1 - - @backstage/plugin-search-backend-node@1.2.11 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0 - - @backstage/plugin-techdocs-backend@1.9.0 - - @backstage/plugin-scaffolder-backend@1.19.0 - - @backstage/plugin-search-backend@1.4.7 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4 - - @backstage/plugin-entity-feedback-backend@0.2.4 - - @backstage/backend-plugin-api@0.6.7 - - @backstage/plugin-linguist-backend@0.5.4 - - @backstage/plugin-playlist-backend@0.3.11 - - @backstage/backend-tasks@0.5.12 - - @backstage/plugin-badges-backend@0.3.4 - - @backstage/plugin-app-backend@0.3.55 - - @backstage/plugin-search-backend-module-techdocs@0.1.11 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-jenkins-backend@0.3.1 - - @backstage/plugin-adr-backend@0.4.4 - - @backstage/plugin-proxy-backend@0.4.5 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4 - - @backstage/plugin-lighthouse-backend@0.3.4 - - @backstage/plugin-search-backend-module-catalog@0.1.11 - - @backstage/plugin-todo-backend@0.3.5 - - @backstage/plugin-devtools-backend@0.2.4 - - @backstage/backend-defaults@0.2.7 - - @backstage/plugin-auth-node@0.4.1 - - @backstage/plugin-azure-devops-backend@0.4.4 - - @backstage/plugin-nomad-backend@0.1.9 - - @backstage/plugin-permission-backend@0.5.30 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4 - - @backstage/plugin-permission-node@0.7.18 - - @backstage/plugin-search-backend-module-explore@0.1.11 - - @backstage/plugin-sonarqube-backend@0.2.9 - -## 0.0.17-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.13.1-next.2 - - @backstage/plugin-scaffolder-backend@1.19.0-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.4-next.2 - - @backstage/backend-plugin-api@0.6.7-next.2 - - @backstage/plugin-linguist-backend@0.5.4-next.2 - - @backstage/plugin-playlist-backend@0.3.11-next.2 - - @backstage/plugin-techdocs-backend@1.9.0-next.2 - - @backstage/plugin-catalog-backend@1.15.0-next.2 - - @backstage/backend-tasks@0.5.12-next.2 - - @backstage/plugin-badges-backend@0.3.4-next.2 - - @backstage/plugin-app-backend@0.3.55-next.2 - - @backstage/backend-defaults@0.2.7-next.2 - - @backstage/plugin-adr-backend@0.4.4-next.2 - - @backstage/plugin-auth-node@0.4.1-next.2 - - @backstage/plugin-azure-devops-backend@0.4.4-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.2 - - @backstage/plugin-devtools-backend@0.2.4-next.2 - - @backstage/plugin-jenkins-backend@0.3.1-next.2 - - @backstage/plugin-lighthouse-backend@0.3.4-next.2 - - @backstage/plugin-nomad-backend@0.1.9-next.2 - - @backstage/plugin-permission-backend@0.5.30-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.2 - - @backstage/plugin-permission-node@0.7.18-next.2 - - @backstage/plugin-proxy-backend@0.4.5-next.2 - - @backstage/plugin-search-backend@1.4.7-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.11-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.11-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.2 - - @backstage/plugin-search-backend-node@1.2.11-next.2 - - @backstage/plugin-sonarqube-backend@0.2.9-next.2 - - @backstage/plugin-todo-backend@0.3.5-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.2 - -## 0.0.17-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.15.0-next.1 - - @backstage/plugin-techdocs-backend@1.9.0-next.1 - - @backstage/plugin-scaffolder-backend@1.19.0-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.1 - - @backstage/plugin-jenkins-backend@0.3.1-next.1 - - @backstage/plugin-kubernetes-backend@0.13.1-next.1 - - @backstage/plugin-lighthouse-backend@0.3.4-next.1 - - @backstage/plugin-linguist-backend@0.5.4-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.11-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.1 - - @backstage/plugin-todo-backend@0.3.5-next.1 - - @backstage/plugin-adr-backend@0.4.4-next.1 - - @backstage/backend-defaults@0.2.7-next.1 - - @backstage/backend-tasks@0.5.12-next.1 - - @backstage/plugin-app-backend@0.3.55-next.1 - - @backstage/plugin-auth-node@0.4.1-next.1 - - @backstage/plugin-badges-backend@0.3.4-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.4-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.1 - - @backstage/plugin-permission-node@0.7.18-next.1 - - @backstage/plugin-playlist-backend@0.3.11-next.1 - - @backstage/plugin-proxy-backend@0.4.5-next.1 - - @backstage/plugin-search-backend@1.4.7-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.11-next.1 - - @backstage/plugin-sonarqube-backend@0.2.9-next.1 - - @backstage/plugin-azure-devops-backend@0.4.4-next.1 - - @backstage/plugin-devtools-backend@0.2.4-next.1 - - @backstage/plugin-nomad-backend@0.1.9-next.1 - - @backstage/plugin-permission-backend@0.5.30-next.1 - - @backstage/plugin-search-backend-node@1.2.11-next.1 - - @backstage/backend-plugin-api@0.6.7-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.1 - - @backstage/plugin-permission-common@0.7.9 - -## 0.0.17-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-node@1.2.11-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.0 - - @backstage/plugin-techdocs-backend@1.8.1-next.0 - - @backstage/plugin-scaffolder-backend@1.19.0-next.0 - - @backstage/plugin-catalog-backend@1.15.0-next.0 - - @backstage/plugin-search-backend@1.4.7-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.0 - - @backstage/plugin-proxy-backend@0.4.5-next.0 - - @backstage/plugin-app-backend@0.3.55-next.0 - - @backstage/plugin-devtools-backend@0.2.4-next.0 - - @backstage/backend-defaults@0.2.7-next.0 - - @backstage/backend-plugin-api@0.6.7-next.0 - - @backstage/backend-tasks@0.5.12-next.0 - - @backstage/plugin-adr-backend@0.4.4-next.0 - - @backstage/plugin-auth-node@0.4.1-next.0 - - @backstage/plugin-azure-devops-backend@0.4.4-next.0 - - @backstage/plugin-badges-backend@0.3.4-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.4-next.0 - - @backstage/plugin-jenkins-backend@0.3.1-next.0 - - @backstage/plugin-kubernetes-backend@0.13.1-next.0 - - @backstage/plugin-lighthouse-backend@0.3.4-next.0 - - @backstage/plugin-linguist-backend@0.5.4-next.0 - - @backstage/plugin-nomad-backend@0.1.9-next.0 - - @backstage/plugin-permission-backend@0.5.30-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.0 - - @backstage/plugin-permission-common@0.7.9 - - @backstage/plugin-permission-node@0.7.18-next.0 - - @backstage/plugin-playlist-backend@0.3.11-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.11-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.11-next.0 - - @backstage/plugin-sonarqube-backend@0.2.9-next.0 - - @backstage/plugin-todo-backend@0.3.5-next.0 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-nomad-backend@0.1.8 - - @backstage/backend-tasks@0.5.11 - - @backstage/plugin-sonarqube-backend@0.2.8 - - @backstage/plugin-scaffolder-backend@1.18.0 - - @backstage/plugin-playlist-backend@0.3.10 - - @backstage/plugin-techdocs-backend@1.8.0 - - @backstage/plugin-catalog-backend@1.14.0 - - @backstage/plugin-auth-node@0.4.0 - - @backstage/plugin-badges-backend@0.3.3 - - @backstage/plugin-kubernetes-backend@0.13.0 - - @backstage/plugin-jenkins-backend@0.3.0 - - @backstage/plugin-search-backend@1.4.6 - - @backstage/backend-plugin-api@0.6.6 - - @backstage/plugin-lighthouse-backend@0.3.3 - - @backstage/plugin-linguist-backend@0.5.3 - - @backstage/plugin-search-backend-module-catalog@0.1.10 - - @backstage/plugin-search-backend-module-explore@0.1.10 - - @backstage/plugin-search-backend-module-techdocs@0.1.10 - - @backstage/plugin-search-backend-node@1.2.10 - - @backstage/backend-defaults@0.2.6 - - @backstage/plugin-adr-backend@0.4.3 - - @backstage/plugin-app-backend@0.3.54 - - @backstage/plugin-azure-devops-backend@0.4.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3 - - @backstage/plugin-devtools-backend@0.2.3 - - @backstage/plugin-entity-feedback-backend@0.2.3 - - @backstage/plugin-permission-backend@0.5.29 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3 - - @backstage/plugin-permission-node@0.7.17 - - @backstage/plugin-proxy-backend@0.4.3 - - @backstage/plugin-todo-backend@0.3.4 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3 - - @backstage/plugin-permission-common@0.7.9 - -## 0.0.16-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-nomad-backend@0.1.8-next.2 - - @backstage/plugin-scaffolder-backend@1.18.0-next.2 - - @backstage/plugin-techdocs-backend@1.8.0-next.2 - - @backstage/plugin-auth-node@0.4.0-next.2 - - @backstage/plugin-catalog-backend@1.14.0-next.2 - - @backstage/plugin-kubernetes-backend@0.12.3-next.2 - - @backstage/plugin-jenkins-backend@0.2.9-next.2 - - @backstage/backend-defaults@0.2.6-next.2 - - @backstage/backend-tasks@0.5.11-next.2 - - @backstage/plugin-adr-backend@0.4.3-next.2 - - @backstage/plugin-app-backend@0.3.54-next.2 - - @backstage/plugin-azure-devops-backend@0.4.3-next.2 - - @backstage/plugin-badges-backend@0.3.3-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3-next.2 - - @backstage/plugin-devtools-backend@0.2.3-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.3-next.2 - - @backstage/plugin-lighthouse-backend@0.3.3-next.2 - - @backstage/plugin-linguist-backend@0.5.3-next.2 - - @backstage/plugin-permission-backend@0.5.29-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3-next.2 - - @backstage/plugin-permission-node@0.7.17-next.2 - - @backstage/plugin-playlist-backend@0.3.10-next.2 - - @backstage/plugin-proxy-backend@0.4.3-next.2 - - @backstage/plugin-search-backend@1.4.6-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.10-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.10-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.10-next.2 - - @backstage/plugin-search-backend-node@1.2.10-next.2 - - @backstage/plugin-sonarqube-backend@0.2.8-next.2 - - @backstage/plugin-todo-backend@0.3.4-next.2 - - @backstage/backend-plugin-api@0.6.6-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3-next.2 - - @backstage/plugin-permission-common@0.7.9-next.0 - -## 0.0.16-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.10-next.1 - - @backstage/plugin-catalog-backend@1.14.0-next.1 - - @backstage/plugin-scaffolder-backend@1.18.0-next.1 - - @backstage/plugin-badges-backend@0.3.2-next.1 - - @backstage/backend-plugin-api@0.6.5-next.1 - - @backstage/plugin-lighthouse-backend@0.3.2-next.1 - - @backstage/plugin-linguist-backend@0.5.2-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.9-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.9-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.1 - - @backstage/plugin-search-backend-node@1.2.9-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.1 - - @backstage/plugin-kubernetes-backend@0.12.2-next.1 - - @backstage/plugin-todo-backend@0.3.3-next.1 - - @backstage/backend-defaults@0.2.5-next.1 - - @backstage/plugin-adr-backend@0.4.2-next.1 - - @backstage/plugin-app-backend@0.3.53-next.1 - - @backstage/plugin-auth-node@0.3.2-next.1 - - @backstage/plugin-azure-devops-backend@0.4.2-next.1 - - @backstage/plugin-devtools-backend@0.2.2-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.2-next.1 - - @backstage/plugin-permission-backend@0.5.28-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.1 - - @backstage/plugin-permission-node@0.7.16-next.1 - - @backstage/plugin-playlist-backend@0.3.9-next.1 - - @backstage/plugin-proxy-backend@0.4.2-next.1 - - @backstage/plugin-search-backend@1.4.5-next.1 - - @backstage/plugin-sonarqube-backend@0.2.7-next.1 - - @backstage/plugin-techdocs-backend@1.7.2-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.1 - - @backstage/plugin-permission-common@0.7.8 - -## 0.0.16-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-sonarqube-backend@0.2.7-next.0 - - @backstage/plugin-playlist-backend@0.3.9-next.0 - - @backstage/plugin-catalog-backend@1.14.0-next.0 - - @backstage/plugin-auth-node@0.3.2-next.0 - - @backstage/plugin-adr-backend@0.4.2-next.0 - - @backstage/plugin-scaffolder-backend@1.17.3-next.0 - - @backstage/plugin-techdocs-backend@1.7.2-next.0 - - @backstage/plugin-todo-backend@0.3.3-next.0 - - @backstage/backend-defaults@0.2.5-next.0 - - @backstage/backend-plugin-api@0.6.5-next.0 - - @backstage/backend-tasks@0.5.10-next.0 - - @backstage/plugin-app-backend@0.3.53-next.0 - - @backstage/plugin-azure-devops-backend@0.4.2-next.0 - - @backstage/plugin-badges-backend@0.3.2-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 - - @backstage/plugin-devtools-backend@0.2.2-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 - - @backstage/plugin-kubernetes-backend@0.12.2-next.0 - - @backstage/plugin-lighthouse-backend@0.3.2-next.0 - - @backstage/plugin-linguist-backend@0.5.2-next.0 - - @backstage/plugin-permission-backend@0.5.28-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.0 - - @backstage/plugin-permission-common@0.7.8 - - @backstage/plugin-permission-node@0.7.16-next.0 - - @backstage/plugin-proxy-backend@0.4.2-next.0 - - @backstage/plugin-search-backend@1.4.5-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 - - @backstage/plugin-search-backend-node@1.2.9-next.0 - -## 0.0.15 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.13.0 - - @backstage/plugin-kubernetes-backend@0.12.0 - - @backstage/plugin-techdocs-backend@1.7.0 - - @backstage/plugin-proxy-backend@0.4.0 - - @backstage/plugin-adr-backend@0.4.0 - - @backstage/plugin-azure-devops-backend@0.4.0 - - @backstage/plugin-badges-backend@0.3.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 - - @backstage/plugin-devtools-backend@0.2.0 - - @backstage/plugin-entity-feedback-backend@0.2.0 - - @backstage/plugin-lighthouse-backend@0.3.0 - - @backstage/plugin-linguist-backend@0.5.0 - - @backstage/plugin-todo-backend@0.3.0 - - @backstage/plugin-app-backend@0.3.51 - - @backstage/plugin-permission-backend@0.5.26 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 - - @backstage/plugin-scaffolder-backend@1.17.0 - - @backstage/plugin-search-backend@1.4.3 - - @backstage/plugin-search-backend-module-catalog@0.1.7 - - @backstage/plugin-search-backend-module-explore@0.1.7 - - @backstage/plugin-search-backend-module-techdocs@0.1.7 - - @backstage/backend-tasks@0.5.8 - - @backstage/plugin-auth-node@0.3.0 - - @backstage/plugin-permission-common@0.7.8 - - @backstage/plugin-permission-node@0.7.14 - - @backstage/backend-plugin-api@0.6.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 - - @backstage/backend-defaults@0.2.3 - - @backstage/plugin-search-backend-node@1.2.7 - -## 0.0.15-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@1.7.0-next.3 - - @backstage/plugin-proxy-backend@0.4.0-next.3 - - @backstage/plugin-adr-backend@0.4.0-next.3 - - @backstage/plugin-azure-devops-backend@0.4.0-next.3 - - @backstage/plugin-badges-backend@0.3.0-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0-next.3 - - @backstage/plugin-devtools-backend@0.2.0-next.3 - - @backstage/plugin-entity-feedback-backend@0.2.0-next.3 - - @backstage/plugin-lighthouse-backend@0.3.0-next.3 - - @backstage/plugin-linguist-backend@0.5.0-next.3 - - @backstage/plugin-todo-backend@0.3.0-next.3 - - @backstage/plugin-app-backend@0.3.51-next.3 - - @backstage/plugin-catalog-backend@1.13.0-next.3 - - @backstage/plugin-kubernetes-backend@0.11.6-next.3 - - @backstage/plugin-permission-backend@0.5.26-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.1 - - @backstage/plugin-scaffolder-backend@1.17.0-next.3 - - @backstage/plugin-search-backend@1.4.3-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.7-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.7-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.3 - - @backstage/plugin-permission-common@0.7.8-next.2 - - @backstage/plugin-permission-node@0.7.14-next.3 - - @backstage/backend-plugin-api@0.6.3-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0-next.0 - - @backstage/backend-defaults@0.2.3-next.3 - - @backstage/backend-tasks@0.5.8-next.3 - - @backstage/plugin-auth-node@0.3.0-next.3 - - @backstage/plugin-search-backend-node@1.2.7-next.3 - -## 0.0.15-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.16.6-next.2 - - @backstage/plugin-permission-backend@0.5.26-next.2 - - @backstage/plugin-catalog-backend@1.13.0-next.2 - - @backstage/plugin-badges-backend@0.2.6-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.0 - - @backstage/backend-tasks@0.5.8-next.2 - - @backstage/backend-defaults@0.2.3-next.2 - - @backstage/plugin-app-backend@0.3.51-next.2 - - @backstage/plugin-auth-node@0.3.0-next.2 - - @backstage/plugin-entity-feedback-backend@0.1.9-next.2 - - @backstage/plugin-kubernetes-backend@0.11.6-next.2 - - @backstage/plugin-linguist-backend@0.4.3-next.2 - - @backstage/plugin-permission-node@0.7.14-next.2 - - @backstage/plugin-proxy-backend@0.3.3-next.2 - - @backstage/plugin-search-backend@1.4.3-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.7-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.7-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.2 - - @backstage/plugin-techdocs-backend@1.7.0-next.2 - - @backstage/plugin-devtools-backend@0.1.6-next.2 - - @backstage/backend-plugin-api@0.6.3-next.2 - - @backstage/plugin-adr-backend@0.3.9-next.2 - - @backstage/plugin-azure-devops-backend@0.3.30-next.2 - - @backstage/plugin-lighthouse-backend@0.2.7-next.2 - - @backstage/plugin-permission-common@0.7.8-next.1 - - @backstage/plugin-search-backend-node@1.2.7-next.2 - - @backstage/plugin-todo-backend@0.2.3-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.2 - -## 0.0.15-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.6-next.1 - - @backstage/plugin-catalog-backend@1.13.0-next.1 - - @backstage/plugin-devtools-backend@0.1.6-next.1 - - @backstage/backend-tasks@0.5.8-next.1 - - @backstage/plugin-techdocs-backend@1.7.0-next.1 - - @backstage/plugin-scaffolder-backend@1.16.6-next.1 - - @backstage/backend-plugin-api@0.6.3-next.1 - - @backstage/plugin-adr-backend@0.3.9-next.1 - - @backstage/plugin-app-backend@0.3.51-next.1 - - @backstage/plugin-auth-node@0.3.0-next.1 - - @backstage/plugin-azure-devops-backend@0.3.30-next.1 - - @backstage/plugin-badges-backend@0.2.6-next.1 - - @backstage/plugin-entity-feedback-backend@0.1.9-next.1 - - @backstage/plugin-lighthouse-backend@0.2.7-next.1 - - @backstage/plugin-linguist-backend@0.4.3-next.1 - - @backstage/plugin-permission-backend@0.5.26-next.1 - - @backstage/plugin-permission-common@0.7.8-next.0 - - @backstage/plugin-permission-node@0.7.14-next.1 - - @backstage/plugin-proxy-backend@0.3.3-next.1 - - @backstage/plugin-search-backend@1.4.3-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.7-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.7-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.1 - - @backstage/plugin-search-backend-node@1.2.7-next.1 - - @backstage/plugin-todo-backend@0.2.3-next.1 - - @backstage/backend-defaults@0.2.3-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.1 - -## 0.0.15-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.12.2-next.0 - - @backstage/plugin-scaffolder-backend@1.16.3-next.0 - - @backstage/plugin-auth-node@0.3.0-next.0 - - @backstage/plugin-linguist-backend@0.4.2-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.8-next.0 - - @backstage/backend-tasks@0.5.7-next.0 - - @backstage/plugin-app-backend@0.3.50-next.0 - - @backstage/backend-defaults@0.2.2-next.0 - - @backstage/backend-plugin-api@0.6.2-next.0 - - @backstage/plugin-adr-backend@0.3.8-next.0 - - @backstage/plugin-azure-devops-backend@0.3.29-next.0 - - @backstage/plugin-badges-backend@0.2.5-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.2-next.0 - - @backstage/plugin-devtools-backend@0.1.5-next.0 - - @backstage/plugin-kubernetes-backend@0.11.5-next.0 - - @backstage/plugin-lighthouse-backend@0.2.6-next.0 - - @backstage/plugin-permission-backend@0.5.25-next.0 - - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-permission-node@0.7.13-next.0 - - @backstage/plugin-proxy-backend@0.3.2-next.0 - - @backstage/plugin-search-backend@1.4.2-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.6-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.6-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.6-next.0 - - @backstage/plugin-search-backend-node@1.2.6-next.0 - - @backstage/plugin-techdocs-backend@1.6.7-next.0 - - @backstage/plugin-todo-backend@0.2.2-next.0 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-techdocs@0.1.4 - - @backstage/plugin-search-backend-module-catalog@0.1.4 - - @backstage/plugin-search-backend-module-explore@0.1.4 - - @backstage/plugin-azure-devops-backend@0.3.27 - - @backstage/plugin-kubernetes-backend@0.11.3 - - @backstage/plugin-lighthouse-backend@0.2.4 - - @backstage/plugin-permission-backend@0.5.23 - - @backstage/plugin-scaffolder-backend@1.16.0 - - @backstage/backend-defaults@0.2.0 - - @backstage/plugin-devtools-backend@0.1.3 - - @backstage/plugin-techdocs-backend@1.6.5 - - @backstage/plugin-catalog-backend@1.12.0 - - @backstage/plugin-badges-backend@0.2.3 - - @backstage/plugin-search-backend@1.4.0 - - @backstage/plugin-proxy-backend@0.3.0 - - @backstage/plugin-todo-backend@0.2.0 - - @backstage/plugin-app-backend@0.3.48 - - @backstage/backend-plugin-api@0.6.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0 - - @backstage/plugin-entity-feedback-backend@0.1.6 - - @backstage/plugin-search-backend-node@1.2.4 - - @backstage/plugin-linguist-backend@0.4.0 - - @backstage/plugin-auth-node@0.2.17 - - @backstage/backend-tasks@0.5.5 - - @backstage/plugin-adr-backend@0.3.6 - - @backstage/plugin-permission-node@0.7.11 - - @backstage/plugin-permission-common@0.7.7 - -## 0.0.14-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.4-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.4-next.2 - - @backstage/plugin-scaffolder-backend@1.15.2-next.2 - - @backstage/plugin-catalog-backend@1.12.0-next.2 - - @backstage/backend-plugin-api@0.6.0-next.2 - - @backstage/plugin-proxy-backend@0.3.0-next.2 - - @backstage/backend-tasks@0.5.5-next.2 - - @backstage/plugin-app-backend@0.3.48-next.2 - - @backstage/plugin-linguist-backend@0.4.0-next.2 - - @backstage/plugin-techdocs-backend@1.6.5-next.2 - - @backstage/backend-defaults@0.2.0-next.2 - - @backstage/plugin-adr-backend@0.3.6-next.2 - - @backstage/plugin-azure-devops-backend@0.3.27-next.2 - - @backstage/plugin-badges-backend@0.2.3-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.2 - - @backstage/plugin-devtools-backend@0.1.3-next.2 - - @backstage/plugin-entity-feedback-backend@0.1.6-next.2 - - @backstage/plugin-kubernetes-backend@0.11.3-next.2 - - @backstage/plugin-lighthouse-backend@0.2.4-next.2 - - @backstage/plugin-permission-backend@0.5.23-next.2 - - @backstage/plugin-permission-node@0.7.11-next.2 - - @backstage/plugin-search-backend@1.4.0-next.2 - - @backstage/plugin-search-backend-node@1.2.4-next.2 - - @backstage/plugin-todo-backend@0.2.0-next.2 - - @backstage/plugin-auth-node@0.2.17-next.2 - -## 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 - -- Updated dependencies - - @backstage/plugin-linguist-backend@0.3.2-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.0 - - @backstage/plugin-search-backend-node@1.2.4-next.0 - - @backstage/plugin-todo-backend@0.2.0-next.0 - - @backstage/plugin-catalog-backend@1.12.0-next.0 - - @backstage/plugin-search-backend@1.4.0-next.0 - - @backstage/backend-defaults@0.1.13-next.0 - - @backstage/backend-tasks@0.5.5-next.0 - - @backstage/plugin-adr-backend@0.3.6-next.0 - - @backstage/plugin-app-backend@0.3.48-next.0 - - @backstage/plugin-auth-node@0.2.17-next.0 - - @backstage/plugin-azure-devops-backend@0.3.27-next.0 - - @backstage/plugin-badges-backend@0.2.3-next.0 - - @backstage/plugin-devtools-backend@0.1.3-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.6-next.0 - - @backstage/plugin-kubernetes-backend@0.11.3-next.0 - - @backstage/plugin-lighthouse-backend@0.2.4-next.0 - - @backstage/plugin-permission-backend@0.5.23-next.0 - - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-permission-node@0.7.11-next.0 - - @backstage/plugin-scaffolder-backend@1.15.2-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.4-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.4-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.0 - - @backstage/plugin-techdocs-backend@1.6.5-next.0 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.2 - - @backstage/plugin-badges-backend@0.2.2 - - @backstage/plugin-devtools-backend@0.1.2 - - @backstage/plugin-scaffolder-backend@1.15.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1 - - @backstage/plugin-azure-devops-backend@0.3.26 - - @backstage/plugin-linguist-backend@0.3.1 - - @backstage/plugin-adr-backend@0.3.5 - - @backstage/plugin-lighthouse-backend@0.2.3 - - @backstage/plugin-entity-feedback-backend@0.1.5 - - @backstage/plugin-catalog-backend@1.11.0 - - @backstage/backend-defaults@0.1.12 - - @backstage/backend-tasks@0.5.4 - - @backstage/plugin-app-backend@0.3.47 - - @backstage/plugin-auth-node@0.2.16 - - @backstage/plugin-permission-backend@0.5.22 - - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-permission-node@0.7.10 - - @backstage/plugin-search-backend@1.3.3 - - @backstage/plugin-search-backend-module-catalog@0.1.3 - - @backstage/plugin-search-backend-module-explore@0.1.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.3 - - @backstage/plugin-search-backend-node@1.2.3 - - @backstage/plugin-techdocs-backend@1.6.4 - - @backstage/plugin-todo-backend@0.1.44 - -## 0.0.13-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-devtools-backend@0.1.2-next.2 - - @backstage/plugin-scaffolder-backend@1.15.1-next.1 - - @backstage/plugin-kubernetes-backend@0.11.2-next.2 - - @backstage/plugin-adr-backend@0.3.5-next.1 - - @backstage/backend-defaults@0.1.12-next.0 - - @backstage/backend-tasks@0.5.4-next.0 - - @backstage/plugin-app-backend@0.3.47-next.0 - - @backstage/plugin-auth-node@0.2.16-next.0 - - @backstage/plugin-azure-devops-backend@0.3.26-next.1 - - @backstage/plugin-badges-backend@0.2.2-next.1 - - @backstage/plugin-catalog-backend@1.11.0-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 - - @backstage/plugin-linguist-backend@0.3.1-next.1 - - @backstage/plugin-permission-backend@0.5.22-next.0 - - @backstage/plugin-permission-common@0.7.7-next.0 - - @backstage/plugin-permission-node@0.7.10-next.0 - - @backstage/plugin-search-backend@1.3.3-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 - - @backstage/plugin-search-backend-node@1.2.3-next.0 - - @backstage/plugin-techdocs-backend@1.6.4-next.0 - - @backstage/plugin-todo-backend@0.1.44-next.0 - -## 0.0.13-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.2-next.1 - - @backstage/plugin-badges-backend@0.2.2-next.1 - - @backstage/plugin-azure-devops-backend@0.3.26-next.1 - - @backstage/plugin-devtools-backend@0.1.2-next.1 - - @backstage/plugin-linguist-backend@0.3.1-next.1 - -## 0.0.13-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 - - @backstage/plugin-catalog-backend@1.11.0-next.0 - - @backstage/plugin-kubernetes-backend@0.11.2-next.0 - - @backstage/backend-defaults@0.1.12-next.0 - - @backstage/plugin-app-backend@0.3.47-next.0 - - @backstage/plugin-auth-node@0.2.16-next.0 - - @backstage/plugin-permission-backend@0.5.22-next.0 - - @backstage/plugin-permission-common@0.7.7-next.0 - - @backstage/plugin-permission-node@0.7.10-next.0 - - @backstage/plugin-scaffolder-backend@1.15.1-next.0 - - @backstage/plugin-search-backend@1.3.3-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 - - @backstage/plugin-search-backend-node@1.2.3-next.0 - - @backstage/plugin-techdocs-backend@1.6.4-next.0 - - @backstage/plugin-todo-backend@0.1.44-next.0 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.15.0 - - @backstage/plugin-kubernetes-backend@0.11.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0 - - @backstage/plugin-catalog-backend@1.10.0 - - @backstage/plugin-search-backend@1.3.2 - - @backstage/plugin-search-backend-module-explore@0.1.2 - - @backstage/backend-defaults@0.1.11 - - @backstage/plugin-app-backend@0.3.46 - - @backstage/plugin-auth-node@0.2.15 - - @backstage/plugin-permission-backend@0.5.21 - - @backstage/plugin-permission-node@0.7.9 - - @backstage/plugin-search-backend-module-catalog@0.1.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.2 - - @backstage/plugin-search-backend-node@1.2.2 - - @backstage/plugin-techdocs-backend@1.6.3 - - @backstage/plugin-todo-backend@0.1.43 - - @backstage/plugin-permission-common@0.7.6 - -## 0.0.12-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.15.0-next.3 - - @backstage/plugin-kubernetes-backend@0.11.1-next.3 - - @backstage/plugin-catalog-backend@1.10.0-next.2 - - @backstage/backend-defaults@0.1.11-next.2 - - @backstage/plugin-app-backend@0.3.46-next.2 - - @backstage/plugin-auth-node@0.2.15-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.1 - - @backstage/plugin-permission-backend@0.5.21-next.2 - - @backstage/plugin-permission-common@0.7.6-next.0 - - @backstage/plugin-permission-node@0.7.9-next.2 - - @backstage/plugin-search-backend@1.3.2-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.2-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.2-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.2 - - @backstage/plugin-search-backend-node@1.2.2-next.2 - - @backstage/plugin-techdocs-backend@1.6.3-next.2 - - @backstage/plugin-todo-backend@0.1.43-next.2 - -## 0.0.12-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.1-next.2 - - @backstage/plugin-scaffolder-backend@1.15.0-next.2 - -## 0.0.12-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 - - @backstage/plugin-catalog-backend@1.9.2-next.1 - - @backstage/plugin-scaffolder-backend@1.15.0-next.1 - - @backstage/backend-defaults@0.1.11-next.1 - - @backstage/plugin-app-backend@0.3.46-next.1 - - @backstage/plugin-auth-node@0.2.15-next.1 - - @backstage/plugin-kubernetes-backend@0.11.1-next.1 - - @backstage/plugin-permission-backend@0.5.21-next.1 - - @backstage/plugin-permission-node@0.7.9-next.1 - - @backstage/plugin-search-backend@1.3.2-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 - - @backstage/plugin-search-backend-node@1.2.2-next.1 - - @backstage/plugin-techdocs-backend@1.6.3-next.1 - - @backstage/plugin-todo-backend@0.1.43-next.1 - - @backstage/plugin-permission-common@0.7.6-next.0 - -## 0.0.12-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.14.1-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.2-next.0 - - @backstage/plugin-catalog-backend@1.9.2-next.0 - - @backstage/plugin-kubernetes-backend@0.11.1-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.2-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.0 - - @backstage/plugin-techdocs-backend@1.6.3-next.0 - - @backstage/plugin-todo-backend@0.1.43-next.0 - - @backstage/plugin-app-backend@0.3.46-next.0 - - @backstage/backend-defaults@0.1.11-next.0 - - @backstage/plugin-auth-node@0.2.15-next.0 - - @backstage/plugin-permission-backend@0.5.21-next.0 - - @backstage/plugin-permission-common@0.7.5 - - @backstage/plugin-permission-node@0.7.9-next.0 - - @backstage/plugin-search-backend@1.3.2-next.0 - - @backstage/plugin-search-backend-node@1.2.2-next.0 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.14.0 - - @backstage/plugin-catalog-backend@1.9.1 - - @backstage/plugin-kubernetes-backend@0.11.0 - - @backstage/plugin-todo-backend@0.1.42 - - @backstage/plugin-permission-node@0.7.8 - - @backstage/plugin-search-backend@1.3.1 - - @backstage/backend-defaults@0.1.10 - - @backstage/plugin-app-backend@0.3.45 - - @backstage/plugin-auth-node@0.2.14 - - @backstage/plugin-search-backend-module-catalog@0.1.1 - - @backstage/plugin-search-backend-module-explore@0.1.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.1 - - @backstage/plugin-techdocs-backend@1.6.2 - - @backstage/plugin-permission-backend@0.5.20 - - @backstage/plugin-search-backend-node@1.2.1 - - @backstage/plugin-permission-common@0.7.5 - -## 0.0.11-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.9.1-next.2 - - @backstage/plugin-kubernetes-backend@0.11.0-next.2 - - @backstage/plugin-search-backend@1.3.1-next.2 - - @backstage/plugin-scaffolder-backend@1.13.2-next.2 - -## 0.0.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.0-next.1 - - @backstage/plugin-catalog-backend@1.9.1-next.1 - - @backstage/plugin-scaffolder-backend@1.13.2-next.1 - - @backstage/backend-defaults@0.1.10-next.1 - - @backstage/plugin-app-backend@0.3.45-next.1 - - @backstage/plugin-auth-node@0.2.14-next.1 - - @backstage/plugin-permission-backend@0.5.20-next.1 - - @backstage/plugin-permission-node@0.7.8-next.1 - - @backstage/plugin-search-backend@1.3.1-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.1-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.1-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.1 - - @backstage/plugin-search-backend-node@1.2.1-next.1 - - @backstage/plugin-techdocs-backend@1.6.2-next.1 - - @backstage/plugin-todo-backend@0.1.42-next.1 - -## 0.0.11-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-permission-node@0.7.8-next.0 - - @backstage/plugin-scaffolder-backend@1.13.2-next.0 - - @backstage/plugin-kubernetes-backend@0.11.0-next.0 - - @backstage/backend-defaults@0.1.10-next.0 - - @backstage/plugin-app-backend@0.3.45-next.0 - - @backstage/plugin-auth-node@0.2.14-next.0 - - @backstage/plugin-catalog-backend@1.9.1-next.0 - - @backstage/plugin-search-backend@1.3.1-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.1-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.1-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.0 - - @backstage/plugin-techdocs-backend@1.6.2-next.0 - - @backstage/plugin-permission-backend@0.5.20-next.0 - - @backstage/plugin-search-backend-node@1.2.1-next.0 - - @backstage/plugin-todo-backend@0.1.42-next.0 - - @backstage/plugin-permission-common@0.7.5 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.10.0 - - @backstage/plugin-scaffolder-backend@1.13.0 - - @backstage/plugin-catalog-backend@1.9.0 - - @backstage/plugin-permission-node@0.7.7 - - @backstage/plugin-permission-backend@0.5.19 - - @backstage/plugin-search-backend@1.3.0 - - @backstage/plugin-permission-common@0.7.5 - - @backstage/plugin-techdocs-backend@1.6.1 - - @backstage/plugin-search-backend-node@1.2.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.0 - - @backstage/plugin-search-backend-module-catalog@0.1.0 - - @backstage/plugin-search-backend-module-explore@0.1.0 - - @backstage/backend-defaults@0.1.9 - - @backstage/plugin-app-backend@0.3.44 - - @backstage/plugin-auth-node@0.2.13 - - @backstage/plugin-todo-backend@0.1.41 - -## 0.0.10-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.10.0-next.3 - - @backstage/plugin-catalog-backend@1.9.0-next.3 - - @backstage/plugin-scaffolder-backend@1.13.0-next.3 - - @backstage/backend-defaults@0.1.9-next.2 - - @backstage/plugin-app-backend@0.3.44-next.2 - - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-permission-backend@0.5.19-next.2 - - @backstage/plugin-permission-common@0.7.5-next.0 - - @backstage/plugin-permission-node@0.7.7-next.2 - - @backstage/plugin-search-backend@1.3.0-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.0-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2 - - @backstage/plugin-search-backend-node@1.2.0-next.2 - - @backstage/plugin-techdocs-backend@1.6.1-next.3 - - @backstage/plugin-todo-backend@0.1.41-next.3 - -## 0.0.10-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.10.0-next.2 - - @backstage/plugin-catalog-backend@1.8.1-next.2 - - @backstage/plugin-permission-node@0.7.7-next.2 - - @backstage/plugin-permission-backend@0.5.19-next.2 - - @backstage/plugin-scaffolder-backend@1.13.0-next.2 - - @backstage/backend-defaults@0.1.9-next.2 - - @backstage/plugin-app-backend@0.3.44-next.2 - - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-permission-common@0.7.5-next.0 - - @backstage/plugin-search-backend@1.3.0-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 - - @backstage/plugin-search-backend-node@1.2.0-next.2 - - @backstage/plugin-techdocs-backend@1.6.1-next.2 - - @backstage/plugin-todo-backend@0.1.41-next.2 - -## 0.0.10-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend@1.3.0-next.1 - - @backstage/plugin-scaffolder-backend@1.13.0-next.1 - - @backstage/plugin-catalog-backend@1.8.1-next.1 - - @backstage/plugin-kubernetes-backend@0.10.0-next.1 - - @backstage/plugin-techdocs-backend@1.6.1-next.1 - - @backstage/plugin-search-backend-node@1.2.0-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 - - @backstage/backend-defaults@0.1.9-next.1 - - @backstage/plugin-app-backend@0.3.44-next.1 - - @backstage/plugin-todo-backend@0.1.41-next.1 - -## 0.0.10-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.1-next.0 - - @backstage/plugin-catalog-backend@1.8.1-next.0 - - @backstage/backend-defaults@0.1.9-next.0 - - @backstage/plugin-app-backend@0.3.44-next.0 - - @backstage/plugin-techdocs-backend@1.6.1-next.0 - - @backstage/plugin-todo-backend@0.1.41-next.0 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.0 - - @backstage/plugin-catalog-backend@1.8.0 - - @backstage/plugin-todo-backend@0.1.40 - - @backstage/plugin-techdocs-backend@1.6.0 - - @backstage/backend-defaults@0.1.8 - - @backstage/plugin-app-backend@0.3.43 - -## 0.0.9-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.0-next.2 - - @backstage/backend-defaults@0.1.8-next.2 - - @backstage/plugin-app-backend@0.3.43-next.2 - - @backstage/plugin-catalog-backend@1.8.0-next.2 - - @backstage/plugin-todo-backend@0.1.40-next.2 - -## 0.0.9-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.0-next.1 - - @backstage/plugin-app-backend@0.3.43-next.1 - - @backstage/plugin-catalog-backend@1.8.0-next.1 - - @backstage/plugin-todo-backend@0.1.40-next.1 - - @backstage/backend-defaults@0.1.8-next.1 - -## 0.0.9-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-todo-backend@0.1.40-next.0 - - @backstage/plugin-scaffolder-backend@1.11.1-next.0 - - @backstage/plugin-catalog-backend@1.8.0-next.0 - - @backstage/backend-defaults@0.1.8-next.0 - - @backstage/plugin-app-backend@0.3.43-next.0 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.7.2 - - @backstage/plugin-scaffolder-backend@1.11.0 - - @backstage/plugin-app-backend@0.3.42 - - @backstage/backend-defaults@0.1.7 - -## 0.0.8-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.7.2-next.2 - - @backstage/plugin-scaffolder-backend@1.11.0-next.2 - - @backstage/plugin-app-backend@0.3.42-next.2 - - @backstage/backend-defaults@0.1.7-next.2 - -## 0.0.8-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.7.2-next.1 - - @backstage/plugin-scaffolder-backend@1.11.0-next.1 - - @backstage/backend-defaults@0.1.7-next.1 - - @backstage/plugin-app-backend@0.3.42-next.1 - -## 0.0.8-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.11.0-next.0 - - @backstage/backend-defaults@0.1.7-next.0 - - @backstage/plugin-app-backend@0.3.42-next.0 - - @backstage/plugin-catalog-backend@1.7.2-next.0 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.10.0 - - @backstage/backend-defaults@0.1.5 - - @backstage/plugin-app-backend@0.3.40 - - @backstage/plugin-catalog-backend@1.7.0 - -## 0.0.7-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.1.5-next.1 - - @backstage/plugin-scaffolder-backend@1.10.0-next.2 - - @backstage/plugin-catalog-backend@1.7.0-next.2 - - @backstage/plugin-app-backend@0.3.40-next.1 - -## 0.0.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.1.5-next.0 - - @backstage/plugin-scaffolder-backend@1.10.0-next.1 - - @backstage/plugin-app-backend@0.3.40-next.0 - - @backstage/plugin-catalog-backend@1.7.0-next.1 - -## 0.0.7-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.9.1-next.0 - - @backstage/plugin-catalog-backend@1.7.0-next.0 - - @backstage/backend-defaults@0.1.4 - - @backstage/plugin-app-backend@0.3.39 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.9.0 - - @backstage/plugin-catalog-backend@1.6.0 - - @backstage/plugin-app-backend@0.3.39 - - @backstage/backend-defaults@0.1.4 - -## 0.0.6-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.6.0-next.3 - - @backstage/plugin-scaffolder-backend@1.9.0-next.3 - - @backstage/backend-defaults@0.1.4-next.3 - - @backstage/plugin-app-backend@0.3.39-next.3 - -## 0.0.6-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.6.0-next.2 - - @backstage/plugin-app-backend@0.3.39-next.2 - - @backstage/plugin-scaffolder-backend@1.9.0-next.2 - - @backstage/backend-defaults@0.1.4-next.2 - -## 0.0.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.6.0-next.1 - - @backstage/plugin-scaffolder-backend@1.8.1-next.1 - - @backstage/plugin-app-backend@0.3.39-next.1 - - @backstage/backend-defaults@0.1.4-next.1 - -## 0.0.6-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.8.1-next.0 - - @backstage/plugin-catalog-backend@1.6.0-next.0 - - @backstage/plugin-app-backend@0.3.39-next.0 - - @backstage/backend-defaults@0.1.4-next.0 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.1 - - @backstage/plugin-scaffolder-backend@1.8.0 - - @backstage/plugin-app-backend@0.3.38 - - @backstage/backend-defaults@0.1.3 - -## 0.0.5-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.8.0-next.2 - - @backstage/plugin-app-backend@0.3.38-next.1 - - @backstage/plugin-catalog-backend@1.5.1-next.1 - - @backstage/backend-defaults@0.1.3-next.1 - -## 0.0.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.8.0-next.1 - -## 0.0.5-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.1-next.0 - - @backstage/plugin-scaffolder-backend@1.8.0-next.0 - - @backstage/plugin-app-backend@0.3.38-next.0 - - @backstage/backend-defaults@0.1.3-next.0 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.0 - - @backstage/plugin-scaffolder-backend@1.7.0 - - @backstage/backend-defaults@0.1.2 - - @backstage/plugin-app-backend@0.3.37 - -## 0.0.4-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.0-next.2 - - @backstage/plugin-scaffolder-backend@1.7.0-next.2 - - @backstage/plugin-app-backend@0.3.37-next.2 - - @backstage/backend-defaults@0.1.2-next.2 - -## 0.0.4-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.7.0-next.1 - - @backstage/backend-defaults@0.1.2-next.1 - - @backstage/plugin-app-backend@0.3.37-next.1 - - @backstage/plugin-catalog-backend@1.4.1-next.1 - -## 0.0.4-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.7.0-next.0 - - @backstage/backend-defaults@0.1.2-next.0 - - @backstage/plugin-catalog-backend@1.4.1-next.0 - - @backstage/plugin-app-backend@0.3.37-next.0 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.6.0 - - @backstage/plugin-catalog-backend@1.4.0 - - @backstage/backend-defaults@0.1.1 - -## 0.0.3-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.4.0-next.1 - - @backstage/plugin-scaffolder-backend@1.6.0-next.1 - -## 0.0.3-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.6.0-next.0 - - @backstage/plugin-catalog-backend@1.3.2-next.0 - - @backstage/backend-defaults@0.1.1-next.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.5.0 - - @backstage/backend-defaults@0.1.0 - - @backstage/plugin-catalog-backend@1.3.1 - -## 0.0.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.5.0-next.0 - - @backstage/backend-app-api@0.1.1-next.0 - - @backstage/plugin-catalog-backend@1.3.1-next.0 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.3.0 - - @backstage/plugin-scaffolder-backend@1.4.0 - - @backstage/backend-app-api@0.1.0 - -## 0.0.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.3.0-next.3 - - @backstage/plugin-scaffolder-backend@1.4.0-next.3 - - @backstage/backend-app-api@0.1.0-next.0 diff --git a/packages/backend-split/package.json b/packages/backend-split/package.json index cca4f9ebd0..78921b51a1 100644 --- a/packages/backend-split/package.json +++ b/packages/backend-split/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-split", - "version": "0.0.33-next.2", + "version": "0.0.1", "backstage": { "role": "backend" }, From 14d26be8b51c2fc840966de10b718d18540c1ab3 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 12 Dec 2024 22:08:03 -0700 Subject: [PATCH 174/312] remove duplicate custom plugins Signed-off-by: aramissennyeydd --- .../src/experimental/features.http | 3 +- .../src/experimental/instanceMetadata.ts | 2 +- .../src/experimental/systemMetadata.ts | 4 +- packages/backend/package.json | 5 +- .../src/experimental/instanceMetadata.ts | 50 ---------- .../src/experimental/systemMetadata.ts | 93 ------------------- packages/backend/src/index.ts | 2 - 7 files changed, 7 insertions(+), 152 deletions(-) delete mode 100644 packages/backend/src/experimental/instanceMetadata.ts delete mode 100644 packages/backend/src/experimental/systemMetadata.ts diff --git a/packages/backend-split/src/experimental/features.http b/packages/backend-split/src/experimental/features.http index 41c07e99d4..34c8703bcd 100644 --- a/packages/backend-split/src/experimental/features.http +++ b/packages/backend-split/src/experimental/features.http @@ -1,4 +1,5 @@ -GET http://localhost:7007/.backstage/systemInfo/features/installed +// Not working yet, the metadata plugin HTTP APIs need to be moved to rootHttpRouter. +# GET http://localhost:7007/.backstage/systemInfo/features/installed ### diff --git a/packages/backend-split/src/experimental/instanceMetadata.ts b/packages/backend-split/src/experimental/instanceMetadata.ts index 370ec02325..abdb53dfeb 100644 --- a/packages/backend-split/src/experimental/instanceMetadata.ts +++ b/packages/backend-split/src/experimental/instanceMetadata.ts @@ -20,7 +20,7 @@ import { // Example usage of the instance metadata service to log the installed plugins. export default createBackendPlugin({ - pluginId: 'instance-metadata-logging', + pluginId: 'instance-metadata', register(env) { env.registerInit({ deps: { diff --git a/packages/backend-split/src/experimental/systemMetadata.ts b/packages/backend-split/src/experimental/systemMetadata.ts index 3b70059711..e567903356 100644 --- a/packages/backend-split/src/experimental/systemMetadata.ts +++ b/packages/backend-split/src/experimental/systemMetadata.ts @@ -23,9 +23,9 @@ import { } from '@backstage/backend-plugin-api/alpha'; import Router from 'express-promise-router'; -// Example usage of the instance metadata service to log the installed features. +// Example usage of the instance metadata service to log the list of instances and a small HTTP API. export default createBackendPlugin({ - pluginId: 'system-metadata-logging', + pluginId: 'system-metadata', register(env) { env.registerInit({ deps: { diff --git a/packages/backend/package.json b/packages/backend/package.json index 12eba46769..8fd42507dd 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -26,8 +26,8 @@ "clean": "backstage-cli package clean", "lint": "backstage-cli package lint", "start": "backstage-cli package start --require ./src/instrumentation.js", - "start:split": "backstage-cli package start --require ./src/instrumentation.js --config ../../app-config.yaml --config app-config.split.yaml", "start:prometheus": "docker run --mount type=bind,source=./prometheus.yml,destination=/etc/prometheus/prometheus.yml --publish published=9090,target=9090,protocol=tcp prom/prometheus", + "start:split": "backstage-cli package start --require ./src/instrumentation.js --config ../../app-config.yaml --config app-config.split.yaml", "test": "backstage-cli package test" }, "dependencies": { @@ -70,8 +70,7 @@ "@opentelemetry/auto-instrumentations-node": "^0.61.0", "@opentelemetry/exporter-prometheus": "^0.54.0", "@opentelemetry/sdk-node": "^0.54.0", - "example-app": "link:../app", - "express-promise-router": "^4.1.0" + "example-app": "link:../app" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/packages/backend/src/experimental/instanceMetadata.ts b/packages/backend/src/experimental/instanceMetadata.ts deleted file mode 100644 index 09e2b0cae8..0000000000 --- a/packages/backend/src/experimental/instanceMetadata.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; -import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; -import Router from 'express-promise-router'; - -// Example usage of the instance metadata service to log the installed features. -export default createBackendPlugin({ - pluginId: 'instance-metadata-logging', - register(env) { - env.registerInit({ - deps: { - instanceMetadata: instanceMetadataServiceRef, - logger: coreServices.logger, - httpRouter: coreServices.rootHttpRouter, - }, - async init({ instanceMetadata, logger, httpRouter }) { - logger.info( - `Installed features on this instance: ${JSON.stringify( - instanceMetadata.getInstalledFeatures(), - )}`, - ); - - const router = Router(); - - router.get('/features/installed', (_, res) => { - res.json({ items: instanceMetadata.getInstalledFeatures() }); - }); - - httpRouter.use('/.backstage/instanceInfo', router); - }, - }); - }, -}); diff --git a/packages/backend/src/experimental/systemMetadata.ts b/packages/backend/src/experimental/systemMetadata.ts deleted file mode 100644 index 3b70059711..0000000000 --- a/packages/backend/src/experimental/systemMetadata.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; -import { - BackendFeatureMeta, - systemMetadataServiceRef, -} from '@backstage/backend-plugin-api/alpha'; -import Router from 'express-promise-router'; - -// Example usage of the instance metadata service to log the installed features. -export default createBackendPlugin({ - pluginId: 'system-metadata-logging', - register(env) { - env.registerInit({ - deps: { - systemMetadata: systemMetadataServiceRef, - logger: coreServices.logger, - httpRouter: coreServices.rootHttpRouter, - }, - async init({ systemMetadata, logger, httpRouter }) { - logger.info( - `Instances in this system: ${JSON.stringify( - await systemMetadata.listInstances(), - )}`, - ); - - const router = Router(); - - router.get('/instances', async (_, res) => { - res.json(await systemMetadata.listInstances()); - }); - - router.get('/features/installed', async (_, res) => { - const instances = await systemMetadata.listInstances(); - const featurePromises = await Promise.allSettled( - instances.map(async instance => { - const response = await fetch( - `${instance.url}/.backstage/instanceInfo/features/installed`, - ); - if (response.ok) { - return { instance, response: await response.json() }; - } - throw new Error( - `Failed to fetch installed features from ${instance.url}`, - ); - }), - ); - const pluginByInstance: Record = {}; - for (const result of featurePromises) { - if (result.status !== 'fulfilled') { - logger.error( - `Failed to fetch installed features: ${result.reason}`, - ); - continue; - } - const instance = result.value.instance; - const installedFeatures = result.value.response - .items as BackendFeatureMeta[]; - for (const feature of installedFeatures) { - if (feature.type === 'plugin') { - if (!pluginByInstance[feature.pluginId]) { - pluginByInstance[feature.pluginId] = []; - } - pluginByInstance[feature.pluginId].push( - `${instance.url}/api/${feature.pluginId}`, - ); - } - } - } - res.json(pluginByInstance); - }); - - httpRouter.use('/.backstage/systemInfo', router); - }, - }); - }, -}); diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 2728068ab5..87abbdcc93 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -70,8 +70,6 @@ backend.add(searchLoader); backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); -backend.add(import('./experimental/instanceMetadata')); -backend.add(import('./experimental/systemMetadata')); backend.add(systemMetadataServiceFactory); backend.add(import('@backstage/plugin-events-backend-module-google-pubsub')); From f4dbb5acb0890a84e6ad32246501a65d9d8ccea8 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 12 Dec 2024 22:10:49 -0700 Subject: [PATCH 175/312] remove unused deps Signed-off-by: aramissennyeydd --- packages/backend-split/package.json | 20 -------------------- yarn.lock | 21 --------------------- 2 files changed, 41 deletions(-) diff --git a/packages/backend-split/package.json b/packages/backend-split/package.json index 78921b51a1..c791187a76 100644 --- a/packages/backend-split/package.json +++ b/packages/backend-split/package.json @@ -32,35 +32,15 @@ "@backstage/backend-defaults": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", - "@backstage/plugin-app-backend": "workspace:^", - "@backstage/plugin-auth-backend": "workspace:^", - "@backstage/plugin-auth-backend-module-github-provider": "workspace:^", - "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^", - "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", - "@backstage/plugin-devtools-backend": "workspace:^", - "@backstage/plugin-events-backend": "workspace:^", - "@backstage/plugin-kubernetes-backend": "workspace:^", - "@backstage/plugin-notifications-backend": "workspace:^", "@backstage/plugin-permission-backend": "workspace:^", "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", - "@backstage/plugin-proxy-backend": "workspace:^", - "@backstage/plugin-scaffolder-backend": "workspace:^", - "@backstage/plugin-scaffolder-backend-module-github": "workspace:^", - "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^", - "@backstage/plugin-search-backend": "workspace:^", - "@backstage/plugin-search-backend-module-catalog": "workspace:^", - "@backstage/plugin-search-backend-module-explore": "workspace:^", - "@backstage/plugin-search-backend-module-techdocs": "workspace:^", - "@backstage/plugin-search-backend-node": "workspace:^", - "@backstage/plugin-signals-backend": "workspace:^", - "@backstage/plugin-techdocs-backend": "workspace:^", "@opentelemetry/auto-instrumentations-node": "^0.54.0", "@opentelemetry/exporter-prometheus": "^0.54.0", "@opentelemetry/sdk-node": "^0.54.0", diff --git a/yarn.lock b/yarn.lock index fdafe26f05..ac53d6c016 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30314,35 +30314,15 @@ __metadata: "@backstage/backend-plugin-api": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" - "@backstage/plugin-app-backend": "workspace:^" - "@backstage/plugin-auth-backend": "workspace:^" - "@backstage/plugin-auth-backend-module-github-provider": "workspace:^" - "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" - "@backstage/plugin-devtools-backend": "workspace:^" - "@backstage/plugin-events-backend": "workspace:^" - "@backstage/plugin-kubernetes-backend": "workspace:^" - "@backstage/plugin-notifications-backend": "workspace:^" "@backstage/plugin-permission-backend": "workspace:^" "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" - "@backstage/plugin-proxy-backend": "workspace:^" - "@backstage/plugin-scaffolder-backend": "workspace:^" - "@backstage/plugin-scaffolder-backend-module-github": "workspace:^" - "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^" - "@backstage/plugin-search-backend": "workspace:^" - "@backstage/plugin-search-backend-module-catalog": "workspace:^" - "@backstage/plugin-search-backend-module-explore": "workspace:^" - "@backstage/plugin-search-backend-module-techdocs": "workspace:^" - "@backstage/plugin-search-backend-node": "workspace:^" - "@backstage/plugin-signals-backend": "workspace:^" - "@backstage/plugin-techdocs-backend": "workspace:^" "@opentelemetry/auto-instrumentations-node": "npm:^0.54.0" "@opentelemetry/exporter-prometheus": "npm:^0.54.0" "@opentelemetry/sdk-node": "npm:^0.54.0" @@ -30396,7 +30376,6 @@ __metadata: "@opentelemetry/exporter-prometheus": "npm:^0.54.0" "@opentelemetry/sdk-node": "npm:^0.54.0" example-app: "link:../app" - express-promise-router: "npm:^4.1.0" languageName: unknown linkType: soft From 8999766fc46a8267e1adee965880dbda8c3efd49 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 12 Dec 2024 22:11:55 -0700 Subject: [PATCH 176/312] remove more unused files Signed-off-by: aramissennyeydd --- packages/backend-split/knip-report.md | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 packages/backend-split/knip-report.md diff --git a/packages/backend-split/knip-report.md b/packages/backend-split/knip-report.md deleted file mode 100644 index a26b412ee9..0000000000 --- a/packages/backend-split/knip-report.md +++ /dev/null @@ -1,12 +0,0 @@ -# Knip report - -## Unused dependencies (5) - -| Name | Location | Severity | -| :----------------------------------------------- | :----------- | :------- | -| @backstage/plugin-catalog-backend-module-openapi | package.json | error | -| @backstage/plugin-search-backend-node | package.json | error | -| @backstage/plugin-permission-common | package.json | error | -| @backstage/plugin-permission-node | package.json | error | -| @backstage/backend-tasks | package.json | error | - From 54e7bd9a3570448f4c4d8fab13247d6500c5a4dc Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 12 Dec 2024 22:21:37 -0700 Subject: [PATCH 177/312] yarn fix Signed-off-by: aramissennyeydd --- packages/backend-split/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-split/package.json b/packages/backend-split/package.json index c791187a76..a517a8b49e 100644 --- a/packages/backend-split/package.json +++ b/packages/backend-split/package.json @@ -12,7 +12,7 @@ "repository": { "type": "git", "url": "https://github.com/backstage/backstage", - "directory": "packages/backend" + "directory": "packages/backend-split" }, "license": "Apache-2.0", "main": "dist/index.cjs.js", From e6b480badc05d26cd95a51e93aa682523bc6327b Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Thu, 26 Dec 2024 13:51:24 -0700 Subject: [PATCH 178/312] fix api report Signed-off-by: aramissennyeydd --- packages/backend-defaults/package.json | 6 ++--- packages/backend-defaults/report-alpha.api.md | 23 +++++++++++++++++++ .../backend-defaults/src/entrypoints/alpha.ts | 16 +++++++++++++ .../lib/DefaultSystemMetadataService.ts | 3 +++ .../definitions/SystemMetadataService.ts | 7 ++++++ packages/backend-split/src/index.ts | 2 +- packages/backend/src/index.ts | 2 +- 7 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 packages/backend-defaults/src/entrypoints/alpha.ts diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 27a3d0529a..bae8dbf04f 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -21,7 +21,7 @@ "exports": { ".": "./src/index.ts", "./auditor": "./src/entrypoints/auditor/index.ts", - "./alpha/systemMetadata": "./src/entrypoints/systemMetadata/index.ts", + "./alpha": "./src/entrypoints/alpha.ts", "./auth": "./src/entrypoints/auth/index.ts", "./cache": "./src/entrypoints/cache/index.ts", "./database": "./src/entrypoints/database/index.ts", @@ -50,8 +50,8 @@ "auditor": [ "src/entrypoints/auditor/index.ts" ], - "alpha/systemMetadata": [ - "src/entrypoints/systemMetadata/index.ts" + "alpha": [ + "src/entrypoints/alpha.ts" ], "auth": [ "src/entrypoints/auth/index.ts" diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index 58277b5e1e..e20c6c0b95 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -17,6 +17,29 @@ export const actionsRegistryServiceFactory: ServiceFactory< // @public (undocumented) export const actionsServiceFactory: ServiceFactory< ActionsService, +import { BackstageInstance } from '@backstage/backend-plugin-api/alpha'; +import { LoggerService } from '@backstage/backend-plugin-api'; +import { RootConfigService } from '@backstage/backend-plugin-api'; +import { ServiceFactory } from '@backstage/backend-plugin-api'; +import { SystemMetadataService } from '@backstage/backend-plugin-api/alpha'; + +// Warning: (ae-missing-release-tag) "DefaultSystemMetadataService" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class DefaultSystemMetadataService implements SystemMetadataService { + constructor(options: { logger: LoggerService; config: RootConfigService }); + // (undocumented) + static create(pluginEnv: { + logger: LoggerService; + config: RootConfigService; + }): DefaultSystemMetadataService; + // (undocumented) + listInstances(): Promise; +} + +// @alpha +export const systemMetadataServiceFactory: ServiceFactory< + SystemMetadataService, 'plugin', 'singleton' >; diff --git a/packages/backend-defaults/src/entrypoints/alpha.ts b/packages/backend-defaults/src/entrypoints/alpha.ts new file mode 100644 index 0000000000..a26522c228 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/alpha.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './systemMetadata'; diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts index 77030f2e43..1de37c3b42 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts @@ -23,6 +23,9 @@ import { SystemMetadataService, } from '@backstage/backend-plugin-api/alpha'; +/** + * @alpha + */ export class DefaultSystemMetadataService implements SystemMetadataService { private readonly logger: LoggerService; private readonly config: RootConfigService; diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts index 9d85412beb..0f0fe2156d 100644 --- a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts @@ -14,12 +14,19 @@ * limitations under the License. */ +/** @internal */ type Target = string | { internal: string; external: string }; +/** + * @alpha + */ export interface BackstageInstance { url: Target; } +/** + * @alpha + */ export interface SystemMetadataService { listInstances(): Promise; } diff --git a/packages/backend-split/src/index.ts b/packages/backend-split/src/index.ts index ca5fcd93e8..52b7559867 100644 --- a/packages/backend-split/src/index.ts +++ b/packages/backend-split/src/index.ts @@ -15,7 +15,7 @@ */ import { createBackend } from '@backstage/backend-defaults'; -import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha/systemMetadata'; +import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha'; const backend = createBackend(); diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 87abbdcc93..a6f9b7b3e9 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -19,7 +19,7 @@ import { coreServices, createBackendFeatureLoader, } from '@backstage/backend-plugin-api'; -import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha/systemMetadata'; +import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha'; const backend = createBackend(); From 248c391112eda508209b154231b4eeef1fb78033 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 3 Jan 2025 22:56:35 -0700 Subject: [PATCH 179/312] fix api report Signed-off-by: aramissennyeydd --- packages/backend-plugin-api/src/alpha/index.ts | 5 +++++ .../src/services/definitions/SystemMetadataService.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index 3302b978b6..14bb24ecfe 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -26,6 +26,10 @@ export { actionsRegistryServiceRef, actionsServiceRef } from './refs'; import { createServiceRef } from '@backstage/backend-plugin-api'; +/** + * EXPERIMENTAL: System metadata service. + * @alpha + */ export const systemMetadataServiceRef = createServiceRef< import('./services/definitions/SystemMetadataService').SystemMetadataService >({ @@ -35,4 +39,5 @@ export const systemMetadataServiceRef = createServiceRef< export type { BackstageInstance, SystemMetadataService, + Target, } from './services/definitions/SystemMetadataService'; diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts index 0f0fe2156d..58ab02b000 100644 --- a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -/** @internal */ -type Target = string | { internal: string; external: string }; +/** @alpha */ +export type Target = string | { internal: string; external: string }; /** * @alpha From c6f1ee8b434d4dc77d1c2ef90c23e3c85f6616b2 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 3 Jan 2025 23:15:32 -0700 Subject: [PATCH 180/312] fix api report again Signed-off-by: aramissennyeydd --- packages/backend-defaults/report-alpha.api.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index e20c6c0b95..043072da87 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -23,9 +23,7 @@ import { RootConfigService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { SystemMetadataService } from '@backstage/backend-plugin-api/alpha'; -// Warning: (ae-missing-release-tag) "DefaultSystemMetadataService" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export class DefaultSystemMetadataService implements SystemMetadataService { constructor(options: { logger: LoggerService; config: RootConfigService }); // (undocumented) From fcc38f1b01b666dcbef7faf8367b744647a27932 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 17 Jan 2025 17:43:12 -0500 Subject: [PATCH 181/312] address PR feedback Signed-off-by: aramissennyeydd --- .../lib/DefaultSystemMetadataService.ts | 23 ++--- .../lib/createSystemMetadataRouter.ts | 78 ++++++++++++++++ .../systemMetadataServiceFactory.ts | 13 ++- .../backend-plugin-api/src/alpha/index.ts | 1 + .../src/experimental/features.http | 7 +- .../src/experimental/instanceMetadata.ts | 48 ---------- .../src/experimental/systemMetadata.ts | 93 ------------------- packages/backend-split/src/index.ts | 2 - 8 files changed, 99 insertions(+), 166 deletions(-) create mode 100644 packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts delete mode 100644 packages/backend-split/src/experimental/instanceMetadata.ts delete mode 100644 packages/backend-split/src/experimental/systemMetadata.ts diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts index 1de37c3b42..96fa8b1820 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts @@ -27,12 +27,9 @@ import { * @alpha */ export class DefaultSystemMetadataService implements SystemMetadataService { - private readonly logger: LoggerService; - private readonly config: RootConfigService; - constructor(options: { logger: LoggerService; config: RootConfigService }) { - this.logger = options.logger; - this.config = options.config; - } + constructor( + private options: { logger: LoggerService; config: RootConfigService }, + ) {} public static create(pluginEnv: { logger: LoggerService; @@ -41,24 +38,16 @@ export class DefaultSystemMetadataService implements SystemMetadataService { return new DefaultSystemMetadataService(pluginEnv); } - listInstances() { + async listInstances() { const endpoints = - this.config.getOptionalConfigArray('discovery.instances') ?? []; + this.options.config.getOptionalConfigArray('discovery.instances') ?? []; const instances: BackstageInstance[] = []; for (const endpoint of endpoints) { const baseUrl = endpoint.getOptionalString('baseUrl'); if (baseUrl) { - this.logger.info(`Found instance at ${baseUrl}`); instances.push({ url: baseUrl }); - } else { - this.logger.warn( - `Instance ${endpoint.get( - 'target', - )} is missing a 'baseUrl' property. This is required for the system metadata service.`, - ); } } - this.logger.info(`Found ${instances.length} instances.`); - return Promise.resolve(instances); + return instances; } } diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts new file mode 100644 index 0000000000..4750ed07db --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts @@ -0,0 +1,78 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { LoggerService } from '@backstage/backend-plugin-api'; +import { + BackendFeatureMeta, + SystemMetadataService, +} from '@backstage/backend-plugin-api/alpha'; +import Router from 'express-promise-router'; + +export async function createSystemMetadataRouter(options: { + logger: LoggerService; + systemMetadata: SystemMetadataService; +}) { + const { logger, systemMetadata } = options; + logger.info( + `Instances in this system: ${JSON.stringify( + await systemMetadata.listInstances(), + )}`, + ); + + const router = Router(); + + router.get('/instances', async (_, res) => { + res.json(await systemMetadata.listInstances()); + }); + + router.get('/features/installed', async (_, res) => { + const instances = await systemMetadata.listInstances(); + const featurePromises = await Promise.allSettled( + instances.map(async instance => { + const response = await fetch( + `${instance.url}/.backstage/instanceMetadata/v1/features/installed`, + ); + if (response.ok) { + return { instance, response: await response.json() }; + } + throw new Error( + `Failed to fetch installed features from ${instance.url}`, + ); + }), + ); + const pluginByInstance: Record = {}; + for (const result of featurePromises) { + if (result.status !== 'fulfilled') { + logger.error(`Failed to fetch installed features: ${result.reason}`); + continue; + } + const instance = result.value.instance; + const installedFeatures = result.value.response + .items as BackendFeatureMeta[]; + for (const feature of installedFeatures) { + if (feature.type === 'plugin') { + if (!pluginByInstance[feature.pluginId]) { + pluginByInstance[feature.pluginId] = []; + } + pluginByInstance[feature.pluginId].push(instance.url); + } + } + } + res.json(pluginByInstance); + }); + + return router; +} diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts index 59ff9f4253..2eaec11caa 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts @@ -20,6 +20,7 @@ import { } from '@backstage/backend-plugin-api'; import { DefaultSystemMetadataService } from './lib/DefaultSystemMetadataService'; import { systemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; +import { createSystemMetadataRouter } from './lib/createSystemMetadataRouter'; /** * Metadata about an entire Backstage system, a collection of Backstage instances. @@ -29,13 +30,19 @@ import { systemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; export const systemMetadataServiceFactory = createServiceFactory({ service: systemMetadataServiceRef, deps: { - logger: coreServices.logger, + logger: coreServices.rootLogger, config: coreServices.rootConfig, + httpRouter: coreServices.rootHttpRouter, }, - async factory({ logger, config }) { - return DefaultSystemMetadataService.create({ + async factory({ logger, config, httpRouter }) { + const systemMetadata = DefaultSystemMetadataService.create({ logger, config, }); + + const router = await createSystemMetadataRouter({ systemMetadata, logger }); + + httpRouter.use('/.backstage/systemMetadata/v1', router); + return systemMetadata; }, }); diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index 14bb24ecfe..2262c5a3f1 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -34,6 +34,7 @@ export const systemMetadataServiceRef = createServiceRef< import('./services/definitions/SystemMetadataService').SystemMetadataService >({ id: 'core.systemMetadata', + scope: 'root', }); export type { diff --git a/packages/backend-split/src/experimental/features.http b/packages/backend-split/src/experimental/features.http index 34c8703bcd..bb9287f61c 100644 --- a/packages/backend-split/src/experimental/features.http +++ b/packages/backend-split/src/experimental/features.http @@ -1,6 +1,7 @@ -// Not working yet, the metadata plugin HTTP APIs need to be moved to rootHttpRouter. -# GET http://localhost:7007/.backstage/systemInfo/features/installed +// Test requests for the split backend to test the system metadata service :) +// The 2 below requests should return the same data. +GET http://localhost:7007/.backstage/systemMetadata/v1/features/installed ### -GET http://localhost:7008/.backstage/systemInfo/features/installed \ No newline at end of file +GET http://localhost:7008/.backstage/systemMetadata/v1/features/installed \ No newline at end of file diff --git a/packages/backend-split/src/experimental/instanceMetadata.ts b/packages/backend-split/src/experimental/instanceMetadata.ts deleted file mode 100644 index abdb53dfeb..0000000000 --- a/packages/backend-split/src/experimental/instanceMetadata.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; - -// Example usage of the instance metadata service to log the installed plugins. -export default createBackendPlugin({ - pluginId: 'instance-metadata', - register(env) { - env.registerInit({ - deps: { - instanceMetadata: coreServices.rootInstanceMetadata, - logger: coreServices.logger, - httpRouter: coreServices.rootHttpRouter, - }, - async init({ instanceMetadata, logger, httpRouter }) { - logger.info( - `Installed plugins on this instance: ${plugins - .map(e => e.pluginId) - .join(', ')}`, - ); - - const router = Router(); - - router.get('/features/installed', (_, res) => { - res.json({ items: instanceMetadata.getInstalledFeatures() }); - }); - - httpRouter.use('/.backstage/instanceInfo', router); - }, - }); - }, -}); diff --git a/packages/backend-split/src/experimental/systemMetadata.ts b/packages/backend-split/src/experimental/systemMetadata.ts deleted file mode 100644 index e567903356..0000000000 --- a/packages/backend-split/src/experimental/systemMetadata.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; -import { - BackendFeatureMeta, - systemMetadataServiceRef, -} from '@backstage/backend-plugin-api/alpha'; -import Router from 'express-promise-router'; - -// Example usage of the instance metadata service to log the list of instances and a small HTTP API. -export default createBackendPlugin({ - pluginId: 'system-metadata', - register(env) { - env.registerInit({ - deps: { - systemMetadata: systemMetadataServiceRef, - logger: coreServices.logger, - httpRouter: coreServices.rootHttpRouter, - }, - async init({ systemMetadata, logger, httpRouter }) { - logger.info( - `Instances in this system: ${JSON.stringify( - await systemMetadata.listInstances(), - )}`, - ); - - const router = Router(); - - router.get('/instances', async (_, res) => { - res.json(await systemMetadata.listInstances()); - }); - - router.get('/features/installed', async (_, res) => { - const instances = await systemMetadata.listInstances(); - const featurePromises = await Promise.allSettled( - instances.map(async instance => { - const response = await fetch( - `${instance.url}/.backstage/instanceInfo/features/installed`, - ); - if (response.ok) { - return { instance, response: await response.json() }; - } - throw new Error( - `Failed to fetch installed features from ${instance.url}`, - ); - }), - ); - const pluginByInstance: Record = {}; - for (const result of featurePromises) { - if (result.status !== 'fulfilled') { - logger.error( - `Failed to fetch installed features: ${result.reason}`, - ); - continue; - } - const instance = result.value.instance; - const installedFeatures = result.value.response - .items as BackendFeatureMeta[]; - for (const feature of installedFeatures) { - if (feature.type === 'plugin') { - if (!pluginByInstance[feature.pluginId]) { - pluginByInstance[feature.pluginId] = []; - } - pluginByInstance[feature.pluginId].push( - `${instance.url}/api/${feature.pluginId}`, - ); - } - } - } - res.json(pluginByInstance); - }); - - httpRouter.use('/.backstage/systemInfo', router); - }, - }); - }, -}); diff --git a/packages/backend-split/src/index.ts b/packages/backend-split/src/index.ts index 52b7559867..2238713ffe 100644 --- a/packages/backend-split/src/index.ts +++ b/packages/backend-split/src/index.ts @@ -30,8 +30,6 @@ backend.add( ); backend.add(import('@backstage/plugin-permission-backend')); -backend.add(import('./experimental/instanceMetadata')); -backend.add(import('./experimental/systemMetadata')); backend.add(systemMetadataServiceFactory); backend.start(); From ff2c41bff55d74fcaebc070f1b4138e411aee42c Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 17 Jan 2025 18:11:02 -0500 Subject: [PATCH 182/312] update config handling to support internal/external split and adjust types Signed-off-by: aramissennyeydd --- packages/backend-defaults/report-alpha.api.md | 2 +- .../lib/DefaultSystemMetadataService.ts | 48 ++++++++++++++----- .../lib/createSystemMetadataRouter.ts | 11 +++-- .../backend-plugin-api/src/alpha/index.ts | 1 - .../definitions/SystemMetadataService.ts | 6 +-- packages/backend/app-config.split.yaml | 4 +- 6 files changed, 50 insertions(+), 22 deletions(-) diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index 043072da87..7e7cccc007 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -38,7 +38,7 @@ export class DefaultSystemMetadataService implements SystemMetadataService { // @alpha export const systemMetadataServiceFactory: ServiceFactory< SystemMetadataService, - 'plugin', + 'root', 'singleton' >; diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts index 96fa8b1820..0d1583a113 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts @@ -22,14 +22,49 @@ import { BackstageInstance, SystemMetadataService, } from '@backstage/backend-plugin-api/alpha'; +import z from 'zod'; + +const targetObjectSchema = z.object({ + internal: z.string(), + external: z.string(), +}); /** * @alpha */ export class DefaultSystemMetadataService implements SystemMetadataService { + private instances: BackstageInstance[]; constructor( private options: { logger: LoggerService; config: RootConfigService }, - ) {} + ) { + const getInstances = () => { + const endpoints = + options.config.getOptionalConfigArray('discovery.instances') ?? []; + const instances: BackstageInstance[] = []; + for (const endpoint of endpoints) { + const baseUrl = endpoint.getOptional('baseUrl'); + if (baseUrl) { + if (typeof baseUrl === 'string') { + instances.push({ internalUrl: baseUrl, externalUrl: baseUrl }); + } else { + const parseAttempt = targetObjectSchema.safeParse(baseUrl); + if (parseAttempt.success) { + const { internal, external } = parseAttempt.data; + instances.push({ + internalUrl: internal, + externalUrl: external, + }); + } + } + } + } + return instances; + }; + this.instances = getInstances(); + this.options.config.subscribe?.(() => { + this.instances = getInstances(); + }); + } public static create(pluginEnv: { logger: LoggerService; @@ -39,15 +74,6 @@ export class DefaultSystemMetadataService implements SystemMetadataService { } async listInstances() { - const endpoints = - this.options.config.getOptionalConfigArray('discovery.instances') ?? []; - const instances: BackstageInstance[] = []; - for (const endpoint of endpoints) { - const baseUrl = endpoint.getOptionalString('baseUrl'); - if (baseUrl) { - instances.push({ url: baseUrl }); - } - } - return instances; + return this.instances; } } diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts index 4750ed07db..66e1759213 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts @@ -43,17 +43,20 @@ export async function createSystemMetadataRouter(options: { const featurePromises = await Promise.allSettled( instances.map(async instance => { const response = await fetch( - `${instance.url}/.backstage/instanceMetadata/v1/features/installed`, + `${instance.internalUrl}/.backstage/instanceMetadata/v1/features/installed`, ); if (response.ok) { return { instance, response: await response.json() }; } throw new Error( - `Failed to fetch installed features from ${instance.url}`, + `Failed to fetch installed features from ${instance.internalUrl}`, ); }), ); - const pluginByInstance: Record = {}; + const pluginByInstance: Record< + string, + { internalUrl: string; externalUrl: string }[] + > = {}; for (const result of featurePromises) { if (result.status !== 'fulfilled') { logger.error(`Failed to fetch installed features: ${result.reason}`); @@ -67,7 +70,7 @@ export async function createSystemMetadataRouter(options: { if (!pluginByInstance[feature.pluginId]) { pluginByInstance[feature.pluginId] = []; } - pluginByInstance[feature.pluginId].push(instance.url); + pluginByInstance[feature.pluginId].push(instance); } } } diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index 2262c5a3f1..be5cb882fc 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -40,5 +40,4 @@ export const systemMetadataServiceRef = createServiceRef< export type { BackstageInstance, SystemMetadataService, - Target, } from './services/definitions/SystemMetadataService'; diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts index 58ab02b000..20ce759679 100644 --- a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts @@ -14,14 +14,12 @@ * limitations under the License. */ -/** @alpha */ -export type Target = string | { internal: string; external: string }; - /** * @alpha */ export interface BackstageInstance { - url: Target; + internalUrl: string; + externalUrl: string; } /** diff --git a/packages/backend/app-config.split.yaml b/packages/backend/app-config.split.yaml index d1a7cf76f1..0eadc9f091 100644 --- a/packages/backend/app-config.split.yaml +++ b/packages/backend/app-config.split.yaml @@ -6,4 +6,6 @@ discovery: plugins: [catalog] instances: - baseUrl: http://localhost:7007 - - baseUrl: http://localhost:7008 + - baseUrl: + internal: http://localhost:7008 + external: http://127.0.0.1:7008 From 34f0025677b1502dee1f4618a723b2807b1a8fd9 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 17 Jan 2025 18:31:05 -0500 Subject: [PATCH 183/312] add to config Signed-off-by: aramissennyeydd --- packages/backend-defaults/config.d.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index f0632a37bb..d578a4c510 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -1249,5 +1249,15 @@ export interface Config { */ plugins: string[]; }>; + + /** + * A list of deployed Backstage instances that can be crawled for discovery. + */ + instances: Array<{ + /** + * The base URL of the instance. All /.backstage/ routes should be accessible. + */ + baseUrl: string | { internal: string; external: string }; + }>; }; } From 073b6ec37d56889abaa1fe83d6ac86ed4a03d38c Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 28 Jan 2025 20:14:15 -0500 Subject: [PATCH 184/312] fix test cases Signed-off-by: aramissennyeydd --- .../src/wiring/BackendInitializer.test.ts | 12 +++++++++--- .../src/manager/plugin-manager.test.ts | 7 ++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index 1c0bf5a0ef..c954fc4f8f 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -33,6 +33,9 @@ const baseFactories = [ mockServices.lifecycle.factory(), mockServices.rootLogger.factory(), mockServices.logger.factory(), + mockServices.rootConfig.factory(), + mockServices.rootHttpRouter.mock().factory, + mockServices.rootHealth.factory(), ]; function mkNoopFactory(ref: ServiceRef<{}, 'plugin'>) { @@ -808,7 +811,7 @@ describe('BackendInitializer', () => { }); it('should forward errors when modules fail to start', async () => { - const init = new BackendInitializer([]); + const init = new BackendInitializer(baseFactories); init.add(testPlugin); init.add( createBackendModule({ @@ -830,7 +833,7 @@ describe('BackendInitializer', () => { }); it('should reject duplicate plugins', async () => { - const init = new BackendInitializer([]); + const init = new BackendInitializer(baseFactories); init.add( createBackendPlugin({ pluginId: 'test', @@ -859,7 +862,7 @@ describe('BackendInitializer', () => { }); it('should reject duplicate modules', async () => { - const init = new BackendInitializer([]); + const init = new BackendInitializer(baseFactories); init.add(testPlugin); init.add( createBackendModule({ @@ -896,6 +899,9 @@ describe('BackendInitializer', () => { const init = new BackendInitializer([ mockServices.rootLifecycle.factory(), mockServices.rootLogger.factory(), + mockServices.rootHttpRouter.mock().factory, + mockServices.rootHealth.factory(), + mockServices.rootConfig.factory(), ]); init.add(testPlugin); init.add( diff --git a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts index 8d8fd13151..394762d6e5 100644 --- a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts +++ b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts @@ -39,7 +39,10 @@ import { ConfigSources } from '@backstage/config-loader'; import { Logs, MockedLogger, LogContent } from '../__testUtils__/testUtils'; import { PluginScanner } from '../scanner/plugin-scanner'; import { findPaths } from '@backstage/cli-common'; -import { createMockDirectory } from '@backstage/backend-test-utils'; +import { + createMockDirectory, + mockServices, +} from '@backstage/backend-test-utils'; import { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle'; import { BackstagePackageJson, PackageRole } from '@backstage/cli-node'; @@ -997,6 +1000,8 @@ describe('backend-dynamic-feature-service', () => { const backend = createSpecializedBackend({ defaultServiceFactories: [ + mockServices.rootHealth.factory(), + mockServices.rootHttpRouter.mock().factory, rootLifecycleServiceFactory, createServiceFactory({ service: coreServices.rootConfig, From a651e04a4e8e7cd3c228d09007d4406a4ed4b500 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 28 Jan 2025 20:42:57 -0500 Subject: [PATCH 185/312] add test case Signed-off-by: aramissennyeydd --- packages/backend-defaults/package.json | 5 +- .../SystemMetadataService.test.ts | 139 ++++++++++++++++++ yarn.lock | 1 + 3 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index bae8dbf04f..042b9497b9 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -21,7 +21,6 @@ "exports": { ".": "./src/index.ts", "./auditor": "./src/entrypoints/auditor/index.ts", - "./alpha": "./src/entrypoints/alpha.ts", "./auth": "./src/entrypoints/auth/index.ts", "./cache": "./src/entrypoints/cache/index.ts", "./database": "./src/entrypoints/database/index.ts", @@ -50,9 +49,6 @@ "auditor": [ "src/entrypoints/auditor/index.ts" ], - "alpha": [ - "src/entrypoints/alpha.ts" - ], "auth": [ "src/entrypoints/auth/index.ts" ], @@ -218,6 +214,7 @@ "@types/yauzl": "^2.10.0", "aws-sdk-client-mock": "^4.0.0", "better-sqlite3": "^12.0.0", + "get-port": "^5.1.1", "http-errors": "^2.0.0", "msw": "^1.0.0", "node-mocks-http": "^1.0.0", diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts new file mode 100644 index 0000000000..93b0d2dfb5 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts @@ -0,0 +1,139 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createSpecializedBackend } from '@backstage/backend-app-api'; +import { systemMetadataServiceFactory } from './systemMetadataServiceFactory'; +import { mockServices } from '@backstage/backend-test-utils'; +import getPort from 'get-port'; +import { createBackendPlugin } from '@backstage/backend-plugin-api'; + +const baseFactories = [ + mockServices.rootHealth.factory(), + mockServices.rootLogger.factory(), + mockServices.rootLifecycle.factory(), + mockServices.rootHttpRouter.factory(), + mockServices.lifecycle.factory(), + mockServices.logger.factory(), +]; + +describe('SystemMetadataService', () => { + it('should list plugins across instances', async () => { + const instance1HttpPort = await getPort(); + const instance2HttpPort = await getPort(); + const instance1 = createSpecializedBackend({ + defaultServiceFactories: [ + ...baseFactories, + systemMetadataServiceFactory, + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { + port: instance1HttpPort, + }, + }, + discovery: { + instances: [ + { + baseUrl: `http://localhost:${instance1HttpPort}`, + }, + { + baseUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }, + }, + }), + ], + }); + + const instance2 = createSpecializedBackend({ + defaultServiceFactories: [ + ...baseFactories, + systemMetadataServiceFactory, + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { + port: instance2HttpPort, + }, + }, + discovery: { + instances: [ + { + baseUrl: `http://localhost:${instance1HttpPort}`, + }, + { + baseUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }, + }, + }), + ], + }); + + instance1.add( + createBackendPlugin({ + pluginId: 'test', + register(reg) { + reg.registerInit({ + deps: {}, + async init() { + // do nothing + }, + }); + }, + }), + ); + + instance2.add( + createBackendPlugin({ + pluginId: 'test-other', + register(reg) { + reg.registerInit({ + deps: {}, + async init() { + // do nothing + }, + }); + }, + }), + ); + + await instance1.start(); + await instance2.start(); + + const installedFeatures = await fetch( + `http://localhost:${instance1HttpPort}/.backstage/systemMetadata/v1/features/installed`, + ); + + expect(installedFeatures.status).toBe(200); + + await expect(installedFeatures.json()).resolves.toMatchObject({ + test: [ + { + externalUrl: `http://localhost:${instance1HttpPort}`, + internalUrl: `http://localhost:${instance1HttpPort}`, + }, + ], + 'test-other': [ + { + externalUrl: `http://localhost:${instance2HttpPort}`, + internalUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index ac53d6c016..eec211526d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2915,6 +2915,7 @@ __metadata: express-promise-router: "npm:^4.1.0" express-rate-limit: "npm:^7.5.0" fs-extra: "npm:^11.2.0" + get-port: "npm:^5.1.1" git-url-parse: "npm:^15.0.0" helmet: "npm:^6.0.0" http-errors: "npm:^2.0.0" From 8154b1d111f2d5b8bb67651f655b917e98634137 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 13 May 2025 17:42:44 -0400 Subject: [PATCH 186/312] clean up PR following review Signed-off-by: aramissennyeydd --- .../lib/DefaultSystemMetadataService.ts | 6 ++- .../lib/createSystemMetadataRouter.ts | 14 +++-- .../systemMetadataServiceFactory.ts | 3 +- .../backend-plugin-api/src/alpha/index.ts | 11 ---- .../definitions/SystemMetadataService.ts | 2 +- .../src/services/definitions/coreServices.ts | 11 ++++ packages/backend-split/.eslintrc.js | 1 - packages/backend-split/README.md | 8 --- packages/backend-split/app-config.split.yaml | 14 ----- packages/backend-split/catalog-info.yaml | 9 ---- packages/backend-split/package.json | 53 ------------------- .../src/experimental/features.http | 7 --- packages/backend-split/src/index.ts | 35 ------------ packages/backend-split/src/instrumentation.js | 34 ------------ packages/backend/app-config.split.yaml | 11 ---- packages/backend/package.json | 1 - yarn.lock | 31 ----------- 17 files changed, 26 insertions(+), 225 deletions(-) delete mode 100644 packages/backend-split/.eslintrc.js delete mode 100644 packages/backend-split/README.md delete mode 100644 packages/backend-split/app-config.split.yaml delete mode 100644 packages/backend-split/catalog-info.yaml delete mode 100644 packages/backend-split/package.json delete mode 100644 packages/backend-split/src/experimental/features.http delete mode 100644 packages/backend-split/src/index.ts delete mode 100644 packages/backend-split/src/instrumentation.js delete mode 100644 packages/backend/app-config.split.yaml diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts index 0d1583a113..41fd4aa0a2 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts @@ -73,7 +73,9 @@ export class DefaultSystemMetadataService implements SystemMetadataService { return new DefaultSystemMetadataService(pluginEnv); } - async listInstances() { - return this.instances; + async introspect() { + return { + instances: this.instances, + }; } } diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts index 66e1759213..6da27958c0 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts @@ -26,20 +26,24 @@ export async function createSystemMetadataRouter(options: { systemMetadata: SystemMetadataService; }) { const { logger, systemMetadata } = options; + + async function getInstances() { + const instances = await systemMetadata.introspect(); + return instances.instances; + } + logger.info( - `Instances in this system: ${JSON.stringify( - await systemMetadata.listInstances(), - )}`, + `Instances in this system: ${JSON.stringify(await getInstances())}`, ); const router = Router(); router.get('/instances', async (_, res) => { - res.json(await systemMetadata.listInstances()); + res.json(await getInstances()); }); router.get('/features/installed', async (_, res) => { - const instances = await systemMetadata.listInstances(); + const instances = await getInstances(); const featurePromises = await Promise.allSettled( instances.map(async instance => { const response = await fetch( diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts index 2eaec11caa..929ea569d1 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts @@ -19,7 +19,6 @@ import { createServiceFactory, } from '@backstage/backend-plugin-api'; import { DefaultSystemMetadataService } from './lib/DefaultSystemMetadataService'; -import { systemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; import { createSystemMetadataRouter } from './lib/createSystemMetadataRouter'; /** @@ -28,7 +27,7 @@ import { createSystemMetadataRouter } from './lib/createSystemMetadataRouter'; * @alpha */ export const systemMetadataServiceFactory = createServiceFactory({ - service: systemMetadataServiceRef, + service: coreServices.systemMetadataServiceRef, deps: { logger: coreServices.rootLogger, config: coreServices.rootConfig, diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index be5cb882fc..815b0ac8f9 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -26,17 +26,6 @@ export { actionsRegistryServiceRef, actionsServiceRef } from './refs'; import { createServiceRef } from '@backstage/backend-plugin-api'; -/** - * EXPERIMENTAL: System metadata service. - * @alpha - */ -export const systemMetadataServiceRef = createServiceRef< - import('./services/definitions/SystemMetadataService').SystemMetadataService ->({ - id: 'core.systemMetadata', - scope: 'root', -}); - export type { BackstageInstance, SystemMetadataService, diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts index 20ce759679..ebbb07b25a 100644 --- a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts @@ -26,5 +26,5 @@ export interface BackstageInstance { * @alpha */ export interface SystemMetadataService { - listInstances(): Promise; + introspect(): Promise<{ instances: BackstageInstance[] }>; } diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index 887b05ee4e..ab3c4406d4 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -289,4 +289,15 @@ export namespace coreServices { id: 'core.rootInstanceMetadata', scope: 'root', }); + + /** + * Read information about your current Backstage deployment. + * @alpha + */ + export const systemMetadataServiceRef = createServiceRef< + import('./SystemMetadataService').SystemMetadataService + >({ + id: 'core.systemMetadata', + scope: 'root', + }); } diff --git a/packages/backend-split/.eslintrc.js b/packages/backend-split/.eslintrc.js deleted file mode 100644 index e2a53a6ad2..0000000000 --- a/packages/backend-split/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/backend-split/README.md b/packages/backend-split/README.md deleted file mode 100644 index d5d2abe027..0000000000 --- a/packages/backend-split/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# example-backend - -This package is an EXAMPLE of a Backstage backend using the [new backend system](https://backstage.io/docs/backend-system/). - -The main purpose of this package is to provide a test bed for Backstage split deployment work. You can deploy both this package and the main `packages/backend` together by running the `start:split` command in both packages. This will run the following backends: - -1. `packages/backend` running on `:7007` with the default plugins installed. -2. `packages/backend-split` running on `:7008` with a subset of plugins installed for testing. diff --git a/packages/backend-split/app-config.split.yaml b/packages/backend-split/app-config.split.yaml deleted file mode 100644 index 80d77aaa3d..0000000000 --- a/packages/backend-split/app-config.split.yaml +++ /dev/null @@ -1,14 +0,0 @@ -backend: - baseUrl: http://localhost:7008 - listen: - port: 7008 - -discovery: - endpoints: - - target: http://localhost:7007/api/{{pluginId}} - plugins: [proxy] - - target: http://localhost:7008/api/{{pluginId}} - plugins: [catalog] - instances: - - baseUrl: http://localhost:7007 - - baseUrl: http://localhost:7008 diff --git a/packages/backend-split/catalog-info.yaml b/packages/backend-split/catalog-info.yaml deleted file mode 100644 index 8c81e9d5e9..0000000000 --- a/packages/backend-split/catalog-info.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: example-backend-split - title: example-backend-split -spec: - lifecycle: experimental - type: backstage-backend - owner: maintainers diff --git a/packages/backend-split/package.json b/packages/backend-split/package.json deleted file mode 100644 index a517a8b49e..0000000000 --- a/packages/backend-split/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "example-backend-split", - "version": "0.0.1", - "backstage": { - "role": "backend" - }, - "private": true, - "keywords": [ - "backstage" - ], - "homepage": "https://backstage.io", - "repository": { - "type": "git", - "url": "https://github.com/backstage/backstage", - "directory": "packages/backend-split" - }, - "license": "Apache-2.0", - "main": "dist/index.cjs.js", - "types": "src/index.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "lint": "backstage-cli package lint", - "start": "backstage-cli package start --require ./src/instrumentation.js", - "start:split": "backstage-cli package start --require ./src/instrumentation.js --config ../../app-config.yaml --config app-config.split.yaml", - "test": "backstage-cli package test" - }, - "dependencies": { - "@backstage/backend-defaults": "workspace:^", - "@backstage/backend-plugin-api": "workspace:^", - "@backstage/catalog-model": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", - "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", - "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", - "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", - "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", - "@backstage/plugin-permission-backend": "workspace:^", - "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", - "@backstage/plugin-permission-common": "workspace:^", - "@backstage/plugin-permission-node": "workspace:^", - "@opentelemetry/auto-instrumentations-node": "^0.54.0", - "@opentelemetry/exporter-prometheus": "^0.54.0", - "@opentelemetry/sdk-node": "^0.54.0", - "example-app": "link:../app", - "express-promise-router": "^4.1.0" - }, - "devDependencies": { - "@backstage/cli": "workspace:^" - } -} diff --git a/packages/backend-split/src/experimental/features.http b/packages/backend-split/src/experimental/features.http deleted file mode 100644 index bb9287f61c..0000000000 --- a/packages/backend-split/src/experimental/features.http +++ /dev/null @@ -1,7 +0,0 @@ -// Test requests for the split backend to test the system metadata service :) -// The 2 below requests should return the same data. -GET http://localhost:7007/.backstage/systemMetadata/v1/features/installed - -### - -GET http://localhost:7008/.backstage/systemMetadata/v1/features/installed \ No newline at end of file diff --git a/packages/backend-split/src/index.ts b/packages/backend-split/src/index.ts deleted file mode 100644 index 2238713ffe..0000000000 --- a/packages/backend-split/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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 { createBackend } from '@backstage/backend-defaults'; -import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha'; - -const backend = createBackend(); - -backend.add(import('@backstage/plugin-catalog-backend-module-unprocessed')); -backend.add( - import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), -); -backend.add(import('@backstage/plugin-catalog-backend')); - -backend.add( - import('@backstage/plugin-permission-backend-module-allow-all-policy'), -); -backend.add(import('@backstage/plugin-permission-backend')); - -backend.add(systemMetadataServiceFactory); - -backend.start(); diff --git a/packages/backend-split/src/instrumentation.js b/packages/backend-split/src/instrumentation.js deleted file mode 100644 index e3725632c1..0000000000 --- a/packages/backend-split/src/instrumentation.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { NodeSDK } = require('@opentelemetry/sdk-node'); -const { - getNodeAutoInstrumentations, -} = require('@opentelemetry/auto-instrumentations-node'); -const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); - -// Expose opentelemetry metrics using a Prometheus exporter on -// http://localhost:9464/metrics. See packages/backend/prometheus.yml for -// more information on how to scrape it. -const prometheus = new PrometheusExporter(); - -const sdk = new NodeSDK({ - // traceExporter: ..., - metricReader: prometheus, - instrumentations: [getNodeAutoInstrumentations()], -}); - -sdk.start(); diff --git a/packages/backend/app-config.split.yaml b/packages/backend/app-config.split.yaml deleted file mode 100644 index 0eadc9f091..0000000000 --- a/packages/backend/app-config.split.yaml +++ /dev/null @@ -1,11 +0,0 @@ -discovery: - endpoints: - - target: http://localhost:7007/api/{{pluginId}} - plugins: [proxy] - - target: http://localhost:7008/api/{{pluginId}} - plugins: [catalog] - instances: - - baseUrl: http://localhost:7007 - - baseUrl: - internal: http://localhost:7008 - external: http://127.0.0.1:7008 diff --git a/packages/backend/package.json b/packages/backend/package.json index 8fd42507dd..2af36b8077 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -27,7 +27,6 @@ "lint": "backstage-cli package lint", "start": "backstage-cli package start --require ./src/instrumentation.js", "start:prometheus": "docker run --mount type=bind,source=./prometheus.yml,destination=/etc/prometheus/prometheus.yml --publish published=9090,target=9090,protocol=tcp prom/prometheus", - "start:split": "backstage-cli package start --require ./src/instrumentation.js --config ../../app-config.yaml --config app-config.split.yaml", "test": "backstage-cli package test" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index eec211526d..98c89bb0ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30233,12 +30233,6 @@ __metadata: languageName: node linkType: soft -"example-app@link:../app::locator=example-backend-split%40workspace%3Apackages%2Fbackend-split": - version: 0.0.0-use.local - resolution: "example-app@link:../app::locator=example-backend-split%40workspace%3Apackages%2Fbackend-split" - languageName: node - linkType: soft - "example-app@workspace:packages/app": version: 0.0.0-use.local resolution: "example-app@workspace:packages/app" @@ -30307,31 +30301,6 @@ __metadata: languageName: unknown linkType: soft -"example-backend-split@workspace:packages/backend-split": - version: 0.0.0-use.local - resolution: "example-backend-split@workspace:packages/backend-split" - dependencies: - "@backstage/backend-defaults": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" - "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" - "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" - "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" - "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" - "@backstage/plugin-permission-backend": "workspace:^" - "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-node": "workspace:^" - "@opentelemetry/auto-instrumentations-node": "npm:^0.54.0" - "@opentelemetry/exporter-prometheus": "npm:^0.54.0" - "@opentelemetry/sdk-node": "npm:^0.54.0" - example-app: "link:../app" - express-promise-router: "npm:^4.1.0" - languageName: unknown - linkType: soft - "example-backend@workspace:packages/backend": version: 0.0.0-use.local resolution: "example-backend@workspace:packages/backend" From d9e63b6450daf8e943528dba49643def099ba932 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 13 May 2025 17:46:39 -0400 Subject: [PATCH 187/312] fix api reports Signed-off-by: aramissennyeydd --- packages/backend-defaults/report-alpha.api.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index 7e7cccc007..52a9947afb 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -32,7 +32,9 @@ export class DefaultSystemMetadataService implements SystemMetadataService { config: RootConfigService; }): DefaultSystemMetadataService; // (undocumented) - listInstances(): Promise; + introspect(): Promise<{ + instances: BackstageInstance[]; + }>; } // @alpha From 3049109f4f74c5ea8ecefa845e7893c0922c54b2 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 13 May 2025 17:54:55 -0400 Subject: [PATCH 188/312] fix api reports for realz Signed-off-by: aramissennyeydd --- packages/backend-defaults/package.json | 4 ++++ .../backend-defaults/src/entrypoints/alpha.ts | 16 -------------- .../lib/DefaultSystemMetadataService.ts | 2 +- .../lib/createSystemMetadataRouter.ts | 6 ++--- packages/backend-plugin-api/report.api.md | 22 +++++++++++++++++++ .../definitions/SystemMetadataService.ts | 4 ++-- .../src/services/definitions/index.ts | 4 ++++ 7 files changed, 35 insertions(+), 23 deletions(-) delete mode 100644 packages/backend-defaults/src/entrypoints/alpha.ts diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 042b9497b9..3e9c5f57cb 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -37,6 +37,7 @@ "./rootLifecycle": "./src/entrypoints/rootLifecycle/index.ts", "./rootLogger": "./src/entrypoints/rootLogger/index.ts", "./scheduler": "./src/entrypoints/scheduler/index.ts", + "./systemMetadata": "./src/entrypoints/systemMetadata/index.ts", "./urlReader": "./src/entrypoints/urlReader/index.ts", "./userInfo": "./src/entrypoints/userInfo/index.ts", "./alpha": "./src/alpha/index.ts", @@ -97,6 +98,9 @@ "scheduler": [ "src/entrypoints/scheduler/index.ts" ], + "systemMetadata": [ + "src/entrypoints/systemMetadata/index.ts" + ], "urlReader": [ "src/entrypoints/urlReader/index.ts" ], diff --git a/packages/backend-defaults/src/entrypoints/alpha.ts b/packages/backend-defaults/src/entrypoints/alpha.ts deleted file mode 100644 index a26522c228..0000000000 --- a/packages/backend-defaults/src/entrypoints/alpha.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export * from './systemMetadata'; diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts index 41fd4aa0a2..5277e05cae 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts @@ -21,7 +21,7 @@ import { import { BackstageInstance, SystemMetadataService, -} from '@backstage/backend-plugin-api/alpha'; +} from '@backstage/backend-plugin-api'; import z from 'zod'; const targetObjectSchema = z.object({ diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts index 6da27958c0..fb7add8ed6 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts @@ -15,10 +15,8 @@ */ import { LoggerService } from '@backstage/backend-plugin-api'; -import { - BackendFeatureMeta, - SystemMetadataService, -} from '@backstage/backend-plugin-api/alpha'; +import { BackendFeatureMeta } from '@backstage/backend-plugin-api/alpha'; +import type { SystemMetadataService } from '@backstage/backend-plugin-api'; import Router from 'express-promise-router'; export async function createSystemMetadataRouter(options: { diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index c46ed254c8..17e52caf63 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -137,6 +137,14 @@ export type BackstageCredentials = { principal: TPrincipal; }; +// @public (undocumented) +export interface BackstageInstance { + // (undocumented) + externalUrl: string; + // (undocumented) + internalUrl: string; +} + // @public export type BackstageNonePrincipal = { type: 'none'; @@ -237,6 +245,12 @@ export namespace coreServices { 'root', 'singleton' >; + const // @alpha + systemMetadataServiceRef: ServiceRef< + SystemMetadataService, + 'root', + 'singleton' + >; } // @public @@ -744,6 +758,14 @@ export interface ServiceRefOptions< scope?: TScope; } +// @public (undocumented) +export interface SystemMetadataService { + // (undocumented) + introspect(): Promise<{ + instances: BackstageInstance[]; + }>; +} + // @public export interface UrlReaderService { readTree( diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts index ebbb07b25a..83066225fe 100644 --- a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts @@ -15,7 +15,7 @@ */ /** - * @alpha + * @public */ export interface BackstageInstance { internalUrl: string; @@ -23,7 +23,7 @@ export interface BackstageInstance { } /** - * @alpha + * @public */ export interface SystemMetadataService { introspect(): Promise<{ instances: BackstageInstance[] }>; diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index 6bcee4b043..4e01553a76 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -72,6 +72,10 @@ export type { SchedulerServiceTaskScheduleDefinition, SchedulerServiceTaskScheduleDefinitionConfig, } from './SchedulerService'; +export type { + BackstageInstance, + SystemMetadataService, +} from './SystemMetadataService'; export type { UrlReaderService, UrlReaderServiceReadTreeOptions, From 59c9103181bdfbc6a0109172b12762107a4f5dde Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 13 May 2025 18:12:49 -0400 Subject: [PATCH 189/312] fix CI Signed-off-by: aramissennyeydd --- packages/backend-app-api/package.json | 3 ++- .../{report-alpha.api.md => report-systemMetadata.api.md} | 2 +- yarn.lock | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) rename packages/backend-defaults/{report-alpha.api.md => report-systemMetadata.api.md} (99%) diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index ade61d87b1..9bc6abab79 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -48,7 +48,8 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", - "@backstage/errors": "workspace:^" + "@backstage/errors": "workspace:^", + "express-promise-router": "^4.1.0" }, "devDependencies": { "@backstage/backend-defaults": "workspace:^", diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-systemMetadata.api.md similarity index 99% rename from packages/backend-defaults/report-alpha.api.md rename to packages/backend-defaults/report-systemMetadata.api.md index 52a9947afb..c9231900dd 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-systemMetadata.api.md @@ -21,7 +21,7 @@ import { BackstageInstance } from '@backstage/backend-plugin-api/alpha'; import { LoggerService } from '@backstage/backend-plugin-api'; import { RootConfigService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; -import { SystemMetadataService } from '@backstage/backend-plugin-api/alpha'; +import { SystemMetadataService } from '@backstage/backend-plugin-api'; // @alpha (undocumented) export class DefaultSystemMetadataService implements SystemMetadataService { diff --git a/yarn.lock b/yarn.lock index 98c89bb0ae..d359ca5cbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2854,6 +2854,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" + express-promise-router: "npm:^4.1.0" languageName: unknown linkType: soft From 3a49851ae37d1a931dca08e2dba24e37afcb2001 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 9 Jun 2025 17:53:30 -0400 Subject: [PATCH 190/312] fix 1 test case Signed-off-by: aramissennyeydd --- .../systemMetadataServiceFactory.ts | 2 +- .../src/services/definitions/coreServices.ts | 2 +- .../src/services/mockServices.ts | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts index 929ea569d1..bc417df898 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts @@ -27,7 +27,7 @@ import { createSystemMetadataRouter } from './lib/createSystemMetadataRouter'; * @alpha */ export const systemMetadataServiceFactory = createServiceFactory({ - service: coreServices.systemMetadataServiceRef, + service: coreServices.systemMetadata, deps: { logger: coreServices.rootLogger, config: coreServices.rootConfig, diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index ab3c4406d4..d14cc9264d 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -294,7 +294,7 @@ export namespace coreServices { * Read information about your current Backstage deployment. * @alpha */ - export const systemMetadataServiceRef = createServiceRef< + export const systemMetadata = createServiceRef< import('./SystemMetadataService').SystemMetadataService >({ id: 'core.systemMetadata', diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index 9e941db3bb..6047f8ea1c 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -27,6 +27,7 @@ import { rootHealthServiceFactory } from '@backstage/backend-defaults/rootHealth import { rootHttpRouterServiceFactory } from '@backstage/backend-defaults/rootHttpRouter'; import { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle'; import { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader'; +import { systemMetadataServiceFactory } from '@backstage/backend-defaults/systemMetadata'; import { AuthService, BackstageCredentials, @@ -573,4 +574,19 @@ export namespace mockServices { rootInstanceMetadata, ); } + export namespace systemMetadata { + /** + * Creates a functional mock factory for the + * {@link @backstage/backend-plugin-api#coreServices.systemMetadata}. + */ + export const factory = () => systemMetadataServiceFactory; + /** + * Creates a mock of the + * {@link @backstage/backend-events-node#systemMetadata}, optionally + * with some given method implementations. + */ + export const mock = simpleMock(coreServices.systemMetadata, () => ({ + introspect: jest.fn(), + })); + } } From c7d652c5f25567675f457268e5ed8326b25f01e3 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 10 Jun 2025 10:53:37 -0400 Subject: [PATCH 191/312] fix API report Signed-off-by: aramissennyeydd --- packages/backend-plugin-api/report.api.md | 1 + .../src/services/definitions/coreServices.ts | 2 +- packages/backend-test-utils/report.api.md | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index 17e52caf63..5bb80fd6a7 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -251,6 +251,7 @@ export namespace coreServices { 'root', 'singleton' >; + const systemMetadata: ServiceRef; } // @public diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index d14cc9264d..0f38c0093c 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -292,7 +292,7 @@ export namespace coreServices { /** * Read information about your current Backstage deployment. - * @alpha + * @public */ export const systemMetadata = createServiceRef< import('./SystemMetadataService').SystemMetadataService diff --git a/packages/backend-test-utils/report.api.md b/packages/backend-test-utils/report.api.md index da5002275b..6892086505 100644 --- a/packages/backend-test-utils/report.api.md +++ b/packages/backend-test-utils/report.api.md @@ -41,6 +41,7 @@ import { RootLoggerService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; +import { SystemMetadataService } from '@backstage/backend-plugin-api'; import { UrlReaderService } from '@backstage/backend-plugin-api'; import { UserInfoService } from '@backstage/backend-plugin-api'; @@ -397,6 +398,17 @@ export namespace mockServices { ) => ServiceMock; } // (undocumented) + export namespace systemMetadata { + const factory: () => ServiceFactory< + SystemMetadataService, + 'root', + 'singleton' + >; + const mock: ( + partialImpl?: Partial | undefined, + ) => ServiceMock; + } + // (undocumented) export namespace urlReader { const // (undocumented) factory: () => ServiceFactory; From 59ba9274df5a9a0ca053feeed69082a153d5d07d Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 1 Jul 2025 11:38:53 -0400 Subject: [PATCH 192/312] fix api reports Signed-off-by: aramissennyeydd --- packages/backend-defaults/report-alpha.api.md | 25 +++++++++++++++++++ .../report-systemMetadata.api.md | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 packages/backend-defaults/report-alpha.api.md diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md new file mode 100644 index 0000000000..58277b5e1e --- /dev/null +++ b/packages/backend-defaults/report-alpha.api.md @@ -0,0 +1,25 @@ +## API Report File for "@backstage/backend-defaults" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; +import { ActionsService } from '@backstage/backend-plugin-api/alpha'; +import { ServiceFactory } from '@backstage/backend-plugin-api'; + +// @public (undocumented) +export const actionsRegistryServiceFactory: ServiceFactory< + ActionsRegistryService, + 'plugin', + 'singleton' +>; + +// @public (undocumented) +export const actionsServiceFactory: ServiceFactory< + ActionsService, + 'plugin', + 'singleton' +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/packages/backend-defaults/report-systemMetadata.api.md b/packages/backend-defaults/report-systemMetadata.api.md index c9231900dd..bd28437f2e 100644 --- a/packages/backend-defaults/report-systemMetadata.api.md +++ b/packages/backend-defaults/report-systemMetadata.api.md @@ -17,7 +17,7 @@ export const actionsRegistryServiceFactory: ServiceFactory< // @public (undocumented) export const actionsServiceFactory: ServiceFactory< ActionsService, -import { BackstageInstance } from '@backstage/backend-plugin-api/alpha'; +import { BackstageInstance } from '@backstage/backend-plugin-api'; import { LoggerService } from '@backstage/backend-plugin-api'; import { RootConfigService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; From a0d9373c3f04426a8727b00f69dfbc4df5aeaed6 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 19 Aug 2025 17:09:54 -0700 Subject: [PATCH 193/312] update system metadata service to be observable-first Signed-off-by: aramissennyeydd --- packages/backend-defaults/package.json | 1 + .../report-systemMetadata.api.md | 5 +- .../SystemMetadataService.test.ts | 244 +++++++++++------- .../lib/DefaultSystemMetadataService.ts | 120 ++++++++- .../lib/createSystemMetadataRouter.ts | 22 +- packages/backend-plugin-api/report.api.md | 5 +- .../definitions/SystemMetadataService.ts | 4 +- packages/backend-test-utils/package.json | 1 + packages/backend-test-utils/report.api.md | 10 +- .../src/services/MockObservable.ts | 25 ++ .../MockSystemMetadataService.test.ts | 34 +++ .../src/services/MockSystemMetadataService.ts | 44 ++++ .../src/services/mockServices.ts | 23 +- .../src/services/simpleMock.ts | 1 + yarn.lock | 2 + 15 files changed, 420 insertions(+), 121 deletions(-) create mode 100644 packages/backend-test-utils/src/services/MockObservable.ts create mode 100644 packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts create mode 100644 packages/backend-test-utils/src/services/MockSystemMetadataService.ts diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 3e9c5f57cb..5586289e5f 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -198,6 +198,7 @@ "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0", + "zen-observable": "^0.10.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" }, diff --git a/packages/backend-defaults/report-systemMetadata.api.md b/packages/backend-defaults/report-systemMetadata.api.md index bd28437f2e..6f0f106039 100644 --- a/packages/backend-defaults/report-systemMetadata.api.md +++ b/packages/backend-defaults/report-systemMetadata.api.md @@ -19,6 +19,7 @@ export const actionsServiceFactory: ServiceFactory< ActionsService, import { BackstageInstance } from '@backstage/backend-plugin-api'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { Observable } from '@backstage/types'; import { RootConfigService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { SystemMetadataService } from '@backstage/backend-plugin-api'; @@ -32,9 +33,7 @@ export class DefaultSystemMetadataService implements SystemMetadataService { config: RootConfigService; }): DefaultSystemMetadataService; // (undocumented) - introspect(): Promise<{ - instances: BackstageInstance[]; - }>; + instances(): Observable; } // @alpha diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts index 93b0d2dfb5..6bb0ab6fdc 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { createSpecializedBackend } from '@backstage/backend-app-api'; +import { Backend, createSpecializedBackend } from '@backstage/backend-app-api'; import { systemMetadataServiceFactory } from './systemMetadataServiceFactory'; import { mockServices } from '@backstage/backend-test-utils'; import getPort from 'get-port'; @@ -29,111 +29,171 @@ const baseFactories = [ ]; describe('SystemMetadataService', () => { - it('should list plugins across instances', async () => { - const instance1HttpPort = await getPort(); - const instance2HttpPort = await getPort(); - const instance1 = createSpecializedBackend({ - defaultServiceFactories: [ - ...baseFactories, - systemMetadataServiceFactory, - mockServices.rootConfig.factory({ - data: { - backend: { - listen: { - port: instance1HttpPort, - }, - }, - discovery: { - instances: [ - { - baseUrl: `http://localhost:${instance1HttpPort}`, - }, - { - baseUrl: `http://localhost:${instance2HttpPort}`, - }, - ], + describe('multiple backends testing', () => { + let instance1: Backend; + let instance2: Backend; + let instance1HttpPort: number; + let instance2HttpPort: number; + + const configFactory = (port: number) => + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { + port, }, }, - }), - ], + discovery: { + instances: [ + { + baseUrl: `http://localhost:${instance1HttpPort}`, + }, + { + baseUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }, + }, + }); + beforeEach(async () => { + instance1HttpPort = await getPort(); + instance2HttpPort = await getPort(); + // Setup code for multiple backend instances + instance1 = createSpecializedBackend({ + defaultServiceFactories: [ + ...baseFactories, + systemMetadataServiceFactory, + configFactory(instance1HttpPort), + ], + }); + + instance2 = createSpecializedBackend({ + defaultServiceFactories: [ + ...baseFactories, + systemMetadataServiceFactory, + configFactory(instance2HttpPort), + ], + }); }); - const instance2 = createSpecializedBackend({ - defaultServiceFactories: [ - ...baseFactories, - systemMetadataServiceFactory, - mockServices.rootConfig.factory({ - data: { - backend: { - listen: { - port: instance2HttpPort, + it('should list plugins across instances', async () => { + instance1.add( + createBackendPlugin({ + pluginId: 'test', + register(reg) { + reg.registerInit({ + deps: {}, + async init() { + // do nothing }, - }, - discovery: { - instances: [ - { - baseUrl: `http://localhost:${instance1HttpPort}`, - }, - { - baseUrl: `http://localhost:${instance2HttpPort}`, - }, - ], - }, + }); }, }), - ], + ); + + instance2.add( + createBackendPlugin({ + pluginId: 'test-other', + register(reg) { + reg.registerInit({ + deps: {}, + async init() { + // do nothing + }, + }); + }, + }), + ); + + await instance1.start(); + await instance2.start(); + + const instance1Response = await fetch( + `http://localhost:${instance1HttpPort}/.backstage/systemMetadata/v1/features/installed`, + ); + + expect(instance1Response.status).toBe(200); + await expect(instance1Response.json()).resolves.toMatchObject({ + test: [ + { + externalUrl: `http://localhost:${instance1HttpPort}`, + internalUrl: `http://localhost:${instance1HttpPort}`, + }, + ], + 'test-other': [ + { + externalUrl: `http://localhost:${instance2HttpPort}`, + internalUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }); + + const instance2Response = await fetch( + `http://localhost:${instance2HttpPort}/.backstage/systemMetadata/v1/features/installed`, + ); + + expect(instance2Response.status).toBe(200); + + await expect(instance2Response.json()).resolves.toMatchObject({ + test: [ + { + externalUrl: `http://localhost:${instance1HttpPort}`, + internalUrl: `http://localhost:${instance1HttpPort}`, + }, + ], + 'test-other': [ + { + externalUrl: `http://localhost:${instance2HttpPort}`, + internalUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }); }); - instance1.add( - createBackendPlugin({ - pluginId: 'test', - register(reg) { - reg.registerInit({ - deps: {}, - async init() { - // do nothing - }, - }); - }, - }), - ); + it('should list all known instances', async () => { + await instance1.start(); + await instance2.start(); - instance2.add( - createBackendPlugin({ - pluginId: 'test-other', - register(reg) { - reg.registerInit({ - deps: {}, - async init() { - // do nothing - }, - }); - }, - }), - ); + const instance1Response = await fetch( + `http://localhost:${instance1HttpPort}/.backstage/systemMetadata/v1/instances`, + ); - await instance1.start(); - await instance2.start(); + expect(instance1Response.status).toBe(200); + await expect(instance1Response.json()).resolves.toMatchObject({ + items: [ + { + externalUrl: `http://localhost:${instance1HttpPort}`, + internalUrl: `http://localhost:${instance1HttpPort}`, + }, + { + externalUrl: `http://localhost:${instance2HttpPort}`, + internalUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }); - const installedFeatures = await fetch( - `http://localhost:${instance1HttpPort}/.backstage/systemMetadata/v1/features/installed`, - ); + const instance2Response = await fetch( + `http://localhost:${instance2HttpPort}/.backstage/systemMetadata/v1/instances`, + ); - expect(installedFeatures.status).toBe(200); + expect(instance2Response.status).toBe(200); + await expect(instance2Response.json()).resolves.toMatchObject({ + items: [ + { + externalUrl: `http://localhost:${instance1HttpPort}`, + internalUrl: `http://localhost:${instance1HttpPort}`, + }, + { + externalUrl: `http://localhost:${instance2HttpPort}`, + internalUrl: `http://localhost:${instance2HttpPort}`, + }, + ], + }); + }); - await expect(installedFeatures.json()).resolves.toMatchObject({ - test: [ - { - externalUrl: `http://localhost:${instance1HttpPort}`, - internalUrl: `http://localhost:${instance1HttpPort}`, - }, - ], - 'test-other': [ - { - externalUrl: `http://localhost:${instance2HttpPort}`, - internalUrl: `http://localhost:${instance2HttpPort}`, - }, - ], + afterEach(async () => { + await instance1.stop(); + await instance2.stop(); }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts index 5277e05cae..0ce468e2be 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts @@ -22,18 +22,126 @@ import { BackstageInstance, SystemMetadataService, } from '@backstage/backend-plugin-api'; +import { Observable } from '@backstage/types'; import z from 'zod'; +import ObservableImpl from 'zen-observable'; const targetObjectSchema = z.object({ internal: z.string(), external: z.string(), }); +/** + * A basic implementation of ReactiveX behavior subjects. + * + * A subject is a convenient way to create an observable when you want + * to fan out a single value to all subscribers. + * + * The BehaviorSubject will emit the most recently emitted value or error + * whenever a new observer subscribes to the subject. + * + * See http://reactivex.io/documentation/subject.html + * + * FORKED FROM core-app-api - where should this live? + */ + +export class BehaviorSubject + implements Observable, ZenObservable.SubscriptionObserver +{ + private isClosed: boolean; + private currentValue: T; + private terminatingError: Error | undefined; + private readonly observable: Observable; + + constructor(value: T) { + this.isClosed = false; + this.currentValue = value; + this.terminatingError = undefined; + this.observable = new ObservableImpl(subscriber => { + if (this.isClosed) { + if (this.terminatingError) { + subscriber.error(this.terminatingError); + } else { + subscriber.complete(); + } + return () => {}; + } + + subscriber.next(this.currentValue); + + this.subscribers.add(subscriber); + return () => { + this.subscribers.delete(subscriber); + }; + }); + } + + private readonly subscribers = new Set< + ZenObservable.SubscriptionObserver + >(); + + [Symbol.observable]() { + return this; + } + + get closed() { + return this.isClosed; + } + + next(value: T) { + if (this.isClosed) { + throw new Error('BehaviorSubject is closed'); + } + this.currentValue = value; + this.subscribers.forEach(subscriber => subscriber.next(value)); + } + + error(error: Error) { + if (this.isClosed) { + throw new Error('BehaviorSubject is closed'); + } + this.isClosed = true; + this.terminatingError = error; + this.subscribers.forEach(subscriber => subscriber.error(error)); + } + + complete() { + if (this.isClosed) { + throw new Error('BehaviorSubject is closed'); + } + this.isClosed = true; + this.subscribers.forEach(subscriber => subscriber.complete()); + } + + subscribe(observer: ZenObservable.Observer): ZenObservable.Subscription; + subscribe( + onNext: (value: T) => void, + onError?: (error: any) => void, + onComplete?: () => void, + ): ZenObservable.Subscription; + subscribe( + onNext: ZenObservable.Observer | ((value: T) => void), + onError?: (error: any) => void, + onComplete?: () => void, + ): ZenObservable.Subscription { + const observer = + typeof onNext === 'function' + ? { + next: onNext, + error: onError, + complete: onComplete, + } + : onNext; + + return this.observable.subscribe(observer); + } +} + /** * @alpha */ export class DefaultSystemMetadataService implements SystemMetadataService { - private instances: BackstageInstance[]; + private instance$: BehaviorSubject; constructor( private options: { logger: LoggerService; config: RootConfigService }, ) { @@ -60,9 +168,9 @@ export class DefaultSystemMetadataService implements SystemMetadataService { } return instances; }; - this.instances = getInstances(); + this.instance$ = new BehaviorSubject(getInstances()); this.options.config.subscribe?.(() => { - this.instances = getInstances(); + this.instance$.next(getInstances()); }); } @@ -73,9 +181,7 @@ export class DefaultSystemMetadataService implements SystemMetadataService { return new DefaultSystemMetadataService(pluginEnv); } - async introspect() { - return { - instances: this.instances, - }; + instances(): Observable { + return this.instance$; } } diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts index fb7add8ed6..e24870f7d0 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts @@ -16,7 +16,10 @@ import { LoggerService } from '@backstage/backend-plugin-api'; import { BackendFeatureMeta } from '@backstage/backend-plugin-api/alpha'; -import type { SystemMetadataService } from '@backstage/backend-plugin-api'; +import type { + BackstageInstance, + SystemMetadataService, +} from '@backstage/backend-plugin-api'; import Router from 'express-promise-router'; export async function createSystemMetadataRouter(options: { @@ -25,23 +28,22 @@ export async function createSystemMetadataRouter(options: { }) { const { logger, systemMetadata } = options; - async function getInstances() { - const instances = await systemMetadata.introspect(); - return instances.instances; - } + let instances: BackstageInstance[] = []; + systemMetadata.instances().subscribe({ + next: value => { + instances = value; + }, + }); - logger.info( - `Instances in this system: ${JSON.stringify(await getInstances())}`, - ); + logger.info(`Instances in this system: ${JSON.stringify(instances)}`); const router = Router(); router.get('/instances', async (_, res) => { - res.json(await getInstances()); + res.json({ items: instances }); }); router.get('/features/installed', async (_, res) => { - const instances = await getInstances(); const featurePromises = await Promise.allSettled( instances.map(async instance => { const response = await fetch( diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index 5bb80fd6a7..abb20539db 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -14,6 +14,7 @@ import { isChildPath } from '@backstage/cli-common'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Knex } from 'knex'; +import { Observable } from '@backstage/types'; import { Permission } from '@backstage/plugin-permission-common'; import { PermissionAttributes } from '@backstage/plugin-permission-common'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; @@ -762,9 +763,7 @@ export interface ServiceRefOptions< // @public (undocumented) export interface SystemMetadataService { // (undocumented) - introspect(): Promise<{ - instances: BackstageInstance[]; - }>; + instances(): Observable; } // @public diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts index 83066225fe..36ab1ff0e9 100644 --- a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { Observable } from '@backstage/types'; + /** * @public */ @@ -26,5 +28,5 @@ export interface BackstageInstance { * @public */ export interface SystemMetadataService { - introspect(): Promise<{ instances: BackstageInstance[] }>; + instances(): Observable; } diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index cd4f68ead0..a771b9513f 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -79,6 +79,7 @@ "text-extensions": "^2.4.0", "uuid": "^11.0.0", "yn": "^4.0.0", + "zen-observable": "^0.10.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" }, diff --git a/packages/backend-test-utils/report.api.md b/packages/backend-test-utils/report.api.md index 6892086505..08e6979928 100644 --- a/packages/backend-test-utils/report.api.md +++ b/packages/backend-test-utils/report.api.md @@ -9,6 +9,7 @@ import { AuthService } from '@backstage/backend-plugin-api'; import { Backend } from '@backstage/backend-app-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { BackstageCredentials } from '@backstage/backend-plugin-api'; +import { BackstageInstance } from '@backstage/backend-plugin-api'; import { BackstageNonePrincipal } from '@backstage/backend-plugin-api'; import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; import { BackstageServicePrincipal } from '@backstage/backend-plugin-api'; @@ -397,12 +398,17 @@ export namespace mockServices { partialImpl?: Partial | undefined, ) => ServiceMock; } + export function systemMetadata(options: { + instances: BackstageInstance[]; + }): SystemMetadataService; // (undocumented) export namespace systemMetadata { - const factory: () => ServiceFactory< + const factory: (options: { + instances: BackstageInstance[]; + }) => ServiceFactory< SystemMetadataService, 'root', - 'singleton' + 'singleton' | 'multiton' >; const mock: ( partialImpl?: Partial | undefined, diff --git a/packages/backend-test-utils/src/services/MockObservable.ts b/packages/backend-test-utils/src/services/MockObservable.ts new file mode 100644 index 0000000000..765b6ccb53 --- /dev/null +++ b/packages/backend-test-utils/src/services/MockObservable.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Observable } from '@backstage/types'; +import ObservableImpl from 'zen-observable'; + +export function createMockObservable(value: T): Observable { + return new ObservableImpl(observer => { + observer.next(value); + observer.complete(); + }); +} diff --git a/packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts b/packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts new file mode 100644 index 0000000000..8f78ec7567 --- /dev/null +++ b/packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BackstageInstance } from '@backstage/backend-plugin-api'; +import { MockSystemMetadataService } from './MockSystemMetadataService'; + +describe('MockSystemMetadataService', () => { + it('should return the passed in instances', () => { + expect.assertions(1); + const instances: BackstageInstance[] = [ + { internalUrl: 'localhost:7007', externalUrl: 'external.url' }, + { internalUrl: 'localhost:7008', externalUrl: 'other.external.url' }, + ]; + const service = MockSystemMetadataService.create({ instances }); + service.instances().subscribe({ + next: value => { + expect(value).toEqual(instances); + }, + }); + }); +}); diff --git a/packages/backend-test-utils/src/services/MockSystemMetadataService.ts b/packages/backend-test-utils/src/services/MockSystemMetadataService.ts new file mode 100644 index 0000000000..eb8b39daf1 --- /dev/null +++ b/packages/backend-test-utils/src/services/MockSystemMetadataService.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + BackstageInstance, + SystemMetadataService, +} from '@backstage/backend-plugin-api'; +import { Observable } from '@backstage/types'; +import ObservableImpl from 'zen-observable'; + +/** + * @public + */ +export class MockSystemMetadataService implements SystemMetadataService { + #instances: BackstageInstance[]; + + constructor(instances: BackstageInstance[]) { + this.#instances = instances; + } + + public static create(options: { instances: BackstageInstance[] }) { + return new MockSystemMetadataService(options.instances); + } + + instances(): Observable { + return new ObservableImpl(subscriber => { + subscriber.next(this.#instances); + subscriber.complete(); + }); + } +} diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index 6047f8ea1c..4f89d62971 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -27,10 +27,10 @@ import { rootHealthServiceFactory } from '@backstage/backend-defaults/rootHealth import { rootHttpRouterServiceFactory } from '@backstage/backend-defaults/rootHttpRouter'; import { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle'; import { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader'; -import { systemMetadataServiceFactory } from '@backstage/backend-defaults/systemMetadata'; import { AuthService, BackstageCredentials, + BackstageInstance, BackstageUserInfo, DatabaseService, DiscoveryService, @@ -41,6 +41,7 @@ import { SchedulerService, ServiceFactory, ServiceRef, + SystemMetadataService, UserInfoService, coreServices, createServiceFactory, @@ -62,6 +63,8 @@ import { simpleMock } from './simpleMock'; import { MockSchedulerService } from './MockSchedulerService'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { ObservableConfigProxy } from '../../../config-loader/src/sources/ObservableConfigProxy'; +import { MockSystemMetadataService } from './MockSystemMetadataService'; +import { createMockObservable } from './MockObservable'; /** @internal */ function createLoggerMock() { @@ -574,19 +577,33 @@ export namespace mockServices { rootInstanceMetadata, ); } + /** + * Creates a functional mock implementation for the + * {@link @backstage/backend-plugin-api#coreServices.systemMetadata}. + */ + export function systemMetadata(options: { + instances: BackstageInstance[]; + }): SystemMetadataService { + return MockSystemMetadataService.create(options); + } export namespace systemMetadata { /** * Creates a functional mock factory for the * {@link @backstage/backend-plugin-api#coreServices.systemMetadata}. */ - export const factory = () => systemMetadataServiceFactory; + export const factory = simpleFactoryWithOptions( + coreServices.systemMetadata, + systemMetadata, + ); /** * Creates a mock of the * {@link @backstage/backend-events-node#systemMetadata}, optionally * with some given method implementations. */ export const mock = simpleMock(coreServices.systemMetadata, () => ({ - introspect: jest.fn(), + instances: jest + .fn() + .mockReturnValue(createMockObservable([])), })); } } diff --git a/packages/backend-test-utils/src/services/simpleMock.ts b/packages/backend-test-utils/src/services/simpleMock.ts index 484969f235..137c1cba66 100644 --- a/packages/backend-test-utils/src/services/simpleMock.ts +++ b/packages/backend-test-utils/src/services/simpleMock.ts @@ -39,6 +39,7 @@ export function simpleMock( const mock = mockFactory(); if (partialImpl) { for (const [key, impl] of Object.entries(partialImpl)) { + console.log(key, impl, mock); if (typeof impl === 'function') { (mock as any)[key].mockImplementation(impl); } else { diff --git a/yarn.lock b/yarn.lock index d359ca5cbb..1d7fcf655e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2951,6 +2951,7 @@ __metadata: winston-transport: "npm:^4.5.0" yauzl: "npm:^3.0.0" yn: "npm:^4.0.0" + zen-observable: "npm:^0.10.0" zod: "npm:^3.22.4" zod-to-json-schema: "npm:^3.20.4" peerDependencies: @@ -3103,6 +3104,7 @@ __metadata: text-extensions: "npm:^2.4.0" uuid: "npm:^11.0.0" yn: "npm:^4.0.0" + zen-observable: "npm:^0.10.0" zod: "npm:^3.22.4" zod-to-json-schema: "npm:^3.20.4" languageName: unknown From 979f9f66794c13b0fe7992e3ad89374e267dee8d Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 20 Aug 2025 10:55:21 -0700 Subject: [PATCH 194/312] fix tests Signed-off-by: aramissennyeydd --- .../SystemMetadataService.test.ts | 135 +++++++++++++++--- 1 file changed, 115 insertions(+), 20 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts index 6bb0ab6fdc..a273dc87ba 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts +++ b/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts @@ -17,7 +17,11 @@ import { Backend, createSpecializedBackend } from '@backstage/backend-app-api'; import { systemMetadataServiceFactory } from './systemMetadataServiceFactory'; import { mockServices } from '@backstage/backend-test-utils'; import getPort from 'get-port'; -import { createBackendPlugin } from '@backstage/backend-plugin-api'; +import { + coreServices, + createBackendPlugin, + createServiceFactory, +} from '@backstage/backend-plugin-api'; const baseFactories = [ mockServices.rootHealth.factory(), @@ -150,50 +154,141 @@ describe('SystemMetadataService', () => { }); }); + afterEach(async () => { + await instance1.stop(); + await instance2.stop(); + }); + }); + + describe('single backend test', () => { + let port: number; + let instance: Backend; + beforeEach(async () => { + port = await getPort(); + + instance = createSpecializedBackend({ + defaultServiceFactories: [ + ...baseFactories, + systemMetadataServiceFactory, + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { + port, + }, + }, + discovery: { + instances: [ + { + baseUrl: `http://localhost:${port}`, + }, + ], + }, + }, + }), + ], + }); + }); + it('should list all known instances', async () => { - await instance1.start(); - await instance2.start(); + await instance.start(); + + const instanceResponse = await fetch( + `http://localhost:${port}/.backstage/systemMetadata/v1/instances`, + ); + + expect(instanceResponse.status).toBe(200); + await expect(instanceResponse.json()).resolves.toMatchObject({ + items: [ + { + externalUrl: `http://localhost:${port}`, + internalUrl: `http://localhost:${port}`, + }, + ], + }); + }); + + it('should react to config updates', async () => { + const config = mockServices.rootConfig({ + data: { + backend: { + listen: { + port, + }, + }, + discovery: { + instances: [ + { + baseUrl: `http://localhost:${port}`, + }, + { + baseUrl: `not-a-real-host`, + }, + ], + }, + }, + }); + const configFactory = createServiceFactory({ + service: coreServices.rootConfig, + deps: {}, + factory: () => config, + }); + instance = createSpecializedBackend({ + defaultServiceFactories: [ + ...baseFactories, + systemMetadataServiceFactory, + configFactory, + ], + }); + await instance.start(); const instance1Response = await fetch( - `http://localhost:${instance1HttpPort}/.backstage/systemMetadata/v1/instances`, + `http://localhost:${port}/.backstage/systemMetadata/v1/instances`, ); expect(instance1Response.status).toBe(200); await expect(instance1Response.json()).resolves.toMatchObject({ items: [ { - externalUrl: `http://localhost:${instance1HttpPort}`, - internalUrl: `http://localhost:${instance1HttpPort}`, + externalUrl: `http://localhost:${port}`, + internalUrl: `http://localhost:${port}`, }, { - externalUrl: `http://localhost:${instance2HttpPort}`, - internalUrl: `http://localhost:${instance2HttpPort}`, + externalUrl: `not-a-real-host`, + internalUrl: `not-a-real-host`, }, ], }); - const instance2Response = await fetch( - `http://localhost:${instance2HttpPort}/.backstage/systemMetadata/v1/instances`, + config.update({ + data: { + discovery: { + instances: [ + { + baseUrl: `http://localhost:${port}`, + }, + ], + }, + }, + }); + + const responseAfterUpdate = await fetch( + `http://localhost:${port}/.backstage/systemMetadata/v1/instances`, ); - expect(instance2Response.status).toBe(200); - await expect(instance2Response.json()).resolves.toMatchObject({ + expect(responseAfterUpdate.status).toBe(200); + await expect(responseAfterUpdate.json()).resolves.toMatchObject({ items: [ { - externalUrl: `http://localhost:${instance1HttpPort}`, - internalUrl: `http://localhost:${instance1HttpPort}`, - }, - { - externalUrl: `http://localhost:${instance2HttpPort}`, - internalUrl: `http://localhost:${instance2HttpPort}`, + externalUrl: `http://localhost:${port}`, + internalUrl: `http://localhost:${port}`, }, ], }); }); afterEach(async () => { - await instance1.stop(); - await instance2.stop(); + await instance.stop(); }); }); }); From e3508b0e67a16429fbf3ff7a73e400c67f638b0a Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Sun, 9 Nov 2025 18:46:03 -0500 Subject: [PATCH 195/312] update to just config reading-based Signed-off-by: aramissennyeydd --- packages/backend-app-api/package.json | 3 +- .../src/wiring/BackendInitializer.test.ts | 12 +- packages/backend-defaults/config.d.ts | 10 - packages/backend-defaults/package.json | 9 +- packages/backend-defaults/report-alpha.api.md | 8 + .../entrypoints/discovery/HostDiscovery.ts | 63 +++++- .../RootSystemMetadataService.test.ts} | 10 +- .../index.ts | 4 +- .../lib/DefaultRootSystemMetadataService.ts | 96 +++++++++ .../lib/createSystemMetadataRouter.ts | 39 ++++ .../rootSystemMetadataServiceFactory.ts} | 12 +- .../lib/DefaultSystemMetadataService.ts | 187 ------------------ .../lib/createSystemMetadataRouter.ts | 85 -------- ...ervice.ts => RootSystemMetadataService.ts} | 26 +-- .../src/services/definitions/coreServices.ts | 8 +- .../src/services/definitions/index.ts | 6 +- .../MockSystemMetadataService.test.ts | 34 ---- .../src/services/MockSystemMetadataService.ts | 44 ----- .../src/services/mockServices.ts | 26 +-- packages/backend/src/index.ts | 4 +- 20 files changed, 250 insertions(+), 436 deletions(-) rename packages/backend-defaults/src/entrypoints/{systemMetadata/SystemMetadataService.test.ts => rootSystemMetadata/RootSystemMetadataService.test.ts} (96%) rename packages/backend-defaults/src/entrypoints/{systemMetadata => rootSystemMetadata}/index.ts (77%) create mode 100644 packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts create mode 100644 packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts rename packages/backend-defaults/src/entrypoints/{systemMetadata/systemMetadataServiceFactory.ts => rootSystemMetadata/rootSystemMetadataServiceFactory.ts} (74%) delete mode 100644 packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts delete mode 100644 packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts rename packages/backend-plugin-api/src/services/definitions/{SystemMetadataService.ts => RootSystemMetadataService.ts} (58%) delete mode 100644 packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts delete mode 100644 packages/backend-test-utils/src/services/MockSystemMetadataService.ts diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 9bc6abab79..ade61d87b1 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -48,8 +48,7 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", - "@backstage/errors": "workspace:^", - "express-promise-router": "^4.1.0" + "@backstage/errors": "workspace:^" }, "devDependencies": { "@backstage/backend-defaults": "workspace:^", diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index c954fc4f8f..1c0bf5a0ef 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -33,9 +33,6 @@ const baseFactories = [ mockServices.lifecycle.factory(), mockServices.rootLogger.factory(), mockServices.logger.factory(), - mockServices.rootConfig.factory(), - mockServices.rootHttpRouter.mock().factory, - mockServices.rootHealth.factory(), ]; function mkNoopFactory(ref: ServiceRef<{}, 'plugin'>) { @@ -811,7 +808,7 @@ describe('BackendInitializer', () => { }); it('should forward errors when modules fail to start', async () => { - const init = new BackendInitializer(baseFactories); + const init = new BackendInitializer([]); init.add(testPlugin); init.add( createBackendModule({ @@ -833,7 +830,7 @@ describe('BackendInitializer', () => { }); it('should reject duplicate plugins', async () => { - const init = new BackendInitializer(baseFactories); + const init = new BackendInitializer([]); init.add( createBackendPlugin({ pluginId: 'test', @@ -862,7 +859,7 @@ describe('BackendInitializer', () => { }); it('should reject duplicate modules', async () => { - const init = new BackendInitializer(baseFactories); + const init = new BackendInitializer([]); init.add(testPlugin); init.add( createBackendModule({ @@ -899,9 +896,6 @@ describe('BackendInitializer', () => { const init = new BackendInitializer([ mockServices.rootLifecycle.factory(), mockServices.rootLogger.factory(), - mockServices.rootHttpRouter.mock().factory, - mockServices.rootHealth.factory(), - mockServices.rootConfig.factory(), ]); init.add(testPlugin); init.add( diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index d578a4c510..f0632a37bb 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -1249,15 +1249,5 @@ export interface Config { */ plugins: string[]; }>; - - /** - * A list of deployed Backstage instances that can be crawled for discovery. - */ - instances: Array<{ - /** - * The base URL of the instance. All /.backstage/ routes should be accessible. - */ - baseUrl: string | { internal: string; external: string }; - }>; }; } diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 5586289e5f..7107b80d7e 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -33,11 +33,11 @@ "./permissions": "./src/entrypoints/permissions/index.ts", "./rootConfig": "./src/entrypoints/rootConfig/index.ts", "./rootHealth": "./src/entrypoints/rootHealth/index.ts", + "./rootSystemMetadata": "./src/entrypoints/rootSystemMetadata/index.ts", "./rootHttpRouter": "./src/entrypoints/rootHttpRouter/index.ts", "./rootLifecycle": "./src/entrypoints/rootLifecycle/index.ts", "./rootLogger": "./src/entrypoints/rootLogger/index.ts", "./scheduler": "./src/entrypoints/scheduler/index.ts", - "./systemMetadata": "./src/entrypoints/systemMetadata/index.ts", "./urlReader": "./src/entrypoints/urlReader/index.ts", "./userInfo": "./src/entrypoints/userInfo/index.ts", "./alpha": "./src/alpha/index.ts", @@ -92,15 +92,15 @@ "rootLifecycle": [ "src/entrypoints/rootLifecycle/index.ts" ], + "rootSystemMetadata": [ + "src/entrypoints/rootSystemMetadata/index.ts" + ], "rootLogger": [ "src/entrypoints/rootLogger/index.ts" ], "scheduler": [ "src/entrypoints/scheduler/index.ts" ], - "systemMetadata": [ - "src/entrypoints/systemMetadata/index.ts" - ], "urlReader": [ "src/entrypoints/urlReader/index.ts" ], @@ -198,7 +198,6 @@ "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0", - "zen-observable": "^0.10.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" }, diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index 58277b5e1e..2ca3525946 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -5,6 +5,7 @@ ```ts import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; import { ActionsService } from '@backstage/backend-plugin-api/alpha'; +import { InstanceMetadataService } from '@backstage/backend-plugin-api/alpha'; import { ServiceFactory } from '@backstage/backend-plugin-api'; // @public (undocumented) @@ -21,5 +22,12 @@ export const actionsServiceFactory: ServiceFactory< 'singleton' >; +// @alpha @deprecated (undocumented) +export const instanceMetadataServiceFactory: ServiceFactory< + InstanceMetadataService, + 'plugin', + 'singleton' +>; + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts index 5a4631283e..bb2e002b0d 100644 --- a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts +++ b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts @@ -150,6 +150,11 @@ export class HostDiscovery implements DiscoveryService { throw new Error('Not initialized'); }; + #resolutions: Map< + string, + Set<{ hash: string; target: { internal?: string; external?: string } }> + > = new Map(); + static fromConfig(config: RootConfigService, options?: HostDiscoveryOptions) { const discovery = new HostDiscovery(new SrvResolvers()); @@ -193,12 +198,23 @@ export class HostDiscovery implements DiscoveryService { return await resolver(pluginId); } - #updateResolvers(config: Config, defaultEndpoints?: HostDiscoveryEndpoint[]) { - this.#updateFallbackResolvers(config); - this.#updatePluginResolvers(config, defaultEndpoints); + async listResolutions() { + const _targets: Map = + new Map(); + for (const [pluginId, targets] of this.#resolutions.entries()) { + const currentTargets = [...targets.values()].map(({ target }) => ({ + ...target, + })); + if (_targets.has(pluginId)) { + _targets.set(pluginId, [..._targets.get(pluginId)!, ...currentTargets]); + } else { + _targets.set(pluginId, currentTargets); + } + } + return _targets; } - #updateFallbackResolvers(config: Config) { + getInstanceAddress(config: Config) { const backendBaseUrl = trimEnd(config.getString('backend.baseUrl'), '/'); const { @@ -220,12 +236,26 @@ export class HostDiscovery implements DiscoveryService { host = `[${host}]`; } + return { + internal: `${protocol}://${host}:${listenPort}`, + external: backendBaseUrl, + }; + } + + #updateResolvers(config: Config, defaultEndpoints?: HostDiscoveryEndpoint[]) { + this.#updateFallbackResolvers(config); + this.#updatePluginResolvers(config, defaultEndpoints); + } + + #updateFallbackResolvers(config: Config) { + const { internal, external } = this.getInstanceAddress(config); + this.#internalFallbackResolver = this.#makeResolver( - `${protocol}://${host}:${listenPort}/api/{{pluginId}}`, + `${internal}/api/{{pluginId}}`, false, ); this.#externalFallbackResolver = this.#makeResolver( - `${backendBaseUrl}/api/{{pluginId}}`, + `${external}/api/{{pluginId}}`, false, ); } @@ -264,6 +294,7 @@ export class HostDiscovery implements DiscoveryService { for (const { target, plugins } of endpoints) { let internalResolver: Resolver | undefined; let externalResolver: Resolver | undefined; + this.#addResolution(target, plugins); if (typeof target === 'string') { internalResolver = externalResolver = this.#makeResolver(target, false); @@ -293,6 +324,26 @@ export class HostDiscovery implements DiscoveryService { this.#externalResolvers = externalResolvers; } + #addResolution( + target: string | { internal?: string; external?: string }, + plugins: string[], + ) { + for (const pluginId of plugins) { + if (!this.#resolutions.has(pluginId)) { + this.#resolutions.set(pluginId, new Set()); + } + const standardizedTarget = + typeof target === 'string' + ? { external: target, internal: target } + : target; + const matchingResolution = this.#resolutions.get(pluginId)!; + const hash = JSON.stringify(standardizedTarget); + if (![...matchingResolution.values()].some(e => e.hash === hash)) { + matchingResolution.add({ target: standardizedTarget, hash }); + } + } + } + #makeResolver(urlPattern: string, allowSrv: boolean): Resolver { const withPluginId = (pluginId: string, url: string) => { return url.replace( diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts similarity index 96% rename from packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts rename to packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts index a273dc87ba..c6c6d6bc65 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/SystemMetadataService.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Backend, createSpecializedBackend } from '@backstage/backend-app-api'; -import { systemMetadataServiceFactory } from './systemMetadataServiceFactory'; +import { rootSystemMetadataServiceFactory } from './rootSystemMetadataServiceFactory'; import { mockServices } from '@backstage/backend-test-utils'; import getPort from 'get-port'; import { @@ -66,7 +66,7 @@ describe('SystemMetadataService', () => { instance1 = createSpecializedBackend({ defaultServiceFactories: [ ...baseFactories, - systemMetadataServiceFactory, + rootSystemMetadataServiceFactory, configFactory(instance1HttpPort), ], }); @@ -74,7 +74,7 @@ describe('SystemMetadataService', () => { instance2 = createSpecializedBackend({ defaultServiceFactories: [ ...baseFactories, - systemMetadataServiceFactory, + rootSystemMetadataServiceFactory, configFactory(instance2HttpPort), ], }); @@ -169,7 +169,7 @@ describe('SystemMetadataService', () => { instance = createSpecializedBackend({ defaultServiceFactories: [ ...baseFactories, - systemMetadataServiceFactory, + rootSystemMetadataServiceFactory, mockServices.rootConfig.factory({ data: { backend: { @@ -236,7 +236,7 @@ describe('SystemMetadataService', () => { instance = createSpecializedBackend({ defaultServiceFactories: [ ...baseFactories, - systemMetadataServiceFactory, + rootSystemMetadataServiceFactory, configFactory, ], }); diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/index.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/index.ts similarity index 77% rename from packages/backend-defaults/src/entrypoints/systemMetadata/index.ts rename to packages/backend-defaults/src/entrypoints/rootSystemMetadata/index.ts index 502a217e48..cff4eccdbe 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/index.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/index.ts @@ -13,5 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { systemMetadataServiceFactory } from './systemMetadataServiceFactory'; -export { DefaultSystemMetadataService } from './lib/DefaultSystemMetadataService'; +export { rootSystemMetadataServiceFactory } from './rootSystemMetadataServiceFactory'; +export { DefaultRootSystemMetadataService } from './lib/DefaultRootSystemMetadataService'; diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts new file mode 100644 index 0000000000..e8cdb43a08 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts @@ -0,0 +1,96 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + LoggerService, + RootConfigService, + RootInstanceMetadataService, + RootSystemMetadataService, + RootSystemMetadataServicePluginInfo, +} from '@backstage/backend-plugin-api'; +import { HostDiscovery } from '../../discovery'; +import {} from '@backstage/backend-plugin-api'; + +/** + * @alpha + */ +export class DefaultRootSystemMetadataService + implements RootSystemMetadataService +{ + #hostDiscovery: HostDiscovery; + #instanceMetadata: RootInstanceMetadataService; + #config: RootConfigService; + constructor(options: { + logger: LoggerService; + config: RootConfigService; + instanceMetadata: RootInstanceMetadataService; + }) { + this.#hostDiscovery = HostDiscovery.fromConfig(options.config, { + logger: options.logger, + }); + options.config.subscribe?.(() => { + this.#hostDiscovery = HostDiscovery.fromConfig(options.config, { + logger: options.logger, + }); + }); + this.#instanceMetadata = options.instanceMetadata; + this.#config = options.config; + } + + public static create(pluginEnv: { + logger: LoggerService; + config: RootConfigService; + instanceMetadata: RootInstanceMetadataService; + }) { + return new DefaultRootSystemMetadataService(pluginEnv); + } + + public async getInstalledPlugins(): Promise< + RootSystemMetadataServicePluginInfo[] + > { + const resolutions = await this.#hostDiscovery.listResolutions(); + const instanceAddress = this.#hostDiscovery.getInstanceAddress( + this.#config, + ); + const currentInstance = await this.#instanceMetadata.getInstalledPlugins(); + for (const plugin of currentInstance) { + if (!resolutions.has(plugin.pluginId)) { + resolutions.set(plugin.pluginId, []); + } + resolutions.get(plugin.pluginId)?.push(instanceAddress); + } + return Array.from(resolutions.entries()).map(([pluginId, targets]) => ({ + pluginId, + hosts: Array.from(targets).filter( + (target): target is { external: string; internal: string } => + Object.keys(target).length > 0, + ), + })); + } + + public async getHosts(): Promise< + ReadonlyArray + > { + const resolutions = await this.#hostDiscovery.listResolutions(); + const hosts = new Set(); + for (const [_, targets] of resolutions.entries()) { + for (const target of targets) { + hosts.add(target as string | { external: string; internal: string }); + } + } + return Array.from(hosts); + } +} diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts new file mode 100644 index 0000000000..eb8b835b16 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { LoggerService } from '@backstage/backend-plugin-api'; +import type { RootSystemMetadataService } from '@backstage/backend-plugin-api'; +import Router from 'express-promise-router'; + +export async function createSystemMetadataRouter(options: { + logger: LoggerService; + systemMetadata: RootSystemMetadataService; +}) { + const { systemMetadata } = options; + + const router = Router(); + + router.get('/hosts', async (_, res) => { + const hosts = await systemMetadata.getHosts(); + res.json({ items: hosts }); + }); + + router.get('/plugins/installed', async (_, res) => { + res.json(await systemMetadata.getInstalledPlugins()); + }); + + return router; +} diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts similarity index 74% rename from packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts rename to packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts index bc417df898..0baa41be07 100644 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/systemMetadataServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts @@ -18,7 +18,7 @@ import { coreServices, createServiceFactory, } from '@backstage/backend-plugin-api'; -import { DefaultSystemMetadataService } from './lib/DefaultSystemMetadataService'; +import { DefaultRootSystemMetadataService } from './lib/DefaultRootSystemMetadataService'; import { createSystemMetadataRouter } from './lib/createSystemMetadataRouter'; /** @@ -26,17 +26,19 @@ import { createSystemMetadataRouter } from './lib/createSystemMetadataRouter'; * * @alpha */ -export const systemMetadataServiceFactory = createServiceFactory({ - service: coreServices.systemMetadata, +export const rootSystemMetadataServiceFactory = createServiceFactory({ + service: coreServices.rootSystemMetadata, deps: { logger: coreServices.rootLogger, config: coreServices.rootConfig, httpRouter: coreServices.rootHttpRouter, + instanceMetadata: coreServices.rootInstanceMetadata, }, - async factory({ logger, config, httpRouter }) { - const systemMetadata = DefaultSystemMetadataService.create({ + async factory({ logger, config, httpRouter, instanceMetadata }) { + const systemMetadata = DefaultRootSystemMetadataService.create({ logger, config, + instanceMetadata, }); const router = await createSystemMetadataRouter({ systemMetadata, logger }); diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts deleted file mode 100644 index 0ce468e2be..0000000000 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/DefaultSystemMetadataService.ts +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - LoggerService, - RootConfigService, -} from '@backstage/backend-plugin-api'; -import { - BackstageInstance, - SystemMetadataService, -} from '@backstage/backend-plugin-api'; -import { Observable } from '@backstage/types'; -import z from 'zod'; -import ObservableImpl from 'zen-observable'; - -const targetObjectSchema = z.object({ - internal: z.string(), - external: z.string(), -}); - -/** - * A basic implementation of ReactiveX behavior subjects. - * - * A subject is a convenient way to create an observable when you want - * to fan out a single value to all subscribers. - * - * The BehaviorSubject will emit the most recently emitted value or error - * whenever a new observer subscribes to the subject. - * - * See http://reactivex.io/documentation/subject.html - * - * FORKED FROM core-app-api - where should this live? - */ - -export class BehaviorSubject - implements Observable, ZenObservable.SubscriptionObserver -{ - private isClosed: boolean; - private currentValue: T; - private terminatingError: Error | undefined; - private readonly observable: Observable; - - constructor(value: T) { - this.isClosed = false; - this.currentValue = value; - this.terminatingError = undefined; - this.observable = new ObservableImpl(subscriber => { - if (this.isClosed) { - if (this.terminatingError) { - subscriber.error(this.terminatingError); - } else { - subscriber.complete(); - } - return () => {}; - } - - subscriber.next(this.currentValue); - - this.subscribers.add(subscriber); - return () => { - this.subscribers.delete(subscriber); - }; - }); - } - - private readonly subscribers = new Set< - ZenObservable.SubscriptionObserver - >(); - - [Symbol.observable]() { - return this; - } - - get closed() { - return this.isClosed; - } - - next(value: T) { - if (this.isClosed) { - throw new Error('BehaviorSubject is closed'); - } - this.currentValue = value; - this.subscribers.forEach(subscriber => subscriber.next(value)); - } - - error(error: Error) { - if (this.isClosed) { - throw new Error('BehaviorSubject is closed'); - } - this.isClosed = true; - this.terminatingError = error; - this.subscribers.forEach(subscriber => subscriber.error(error)); - } - - complete() { - if (this.isClosed) { - throw new Error('BehaviorSubject is closed'); - } - this.isClosed = true; - this.subscribers.forEach(subscriber => subscriber.complete()); - } - - subscribe(observer: ZenObservable.Observer): ZenObservable.Subscription; - subscribe( - onNext: (value: T) => void, - onError?: (error: any) => void, - onComplete?: () => void, - ): ZenObservable.Subscription; - subscribe( - onNext: ZenObservable.Observer | ((value: T) => void), - onError?: (error: any) => void, - onComplete?: () => void, - ): ZenObservable.Subscription { - const observer = - typeof onNext === 'function' - ? { - next: onNext, - error: onError, - complete: onComplete, - } - : onNext; - - return this.observable.subscribe(observer); - } -} - -/** - * @alpha - */ -export class DefaultSystemMetadataService implements SystemMetadataService { - private instance$: BehaviorSubject; - constructor( - private options: { logger: LoggerService; config: RootConfigService }, - ) { - const getInstances = () => { - const endpoints = - options.config.getOptionalConfigArray('discovery.instances') ?? []; - const instances: BackstageInstance[] = []; - for (const endpoint of endpoints) { - const baseUrl = endpoint.getOptional('baseUrl'); - if (baseUrl) { - if (typeof baseUrl === 'string') { - instances.push({ internalUrl: baseUrl, externalUrl: baseUrl }); - } else { - const parseAttempt = targetObjectSchema.safeParse(baseUrl); - if (parseAttempt.success) { - const { internal, external } = parseAttempt.data; - instances.push({ - internalUrl: internal, - externalUrl: external, - }); - } - } - } - } - return instances; - }; - this.instance$ = new BehaviorSubject(getInstances()); - this.options.config.subscribe?.(() => { - this.instance$.next(getInstances()); - }); - } - - public static create(pluginEnv: { - logger: LoggerService; - config: RootConfigService; - }) { - return new DefaultSystemMetadataService(pluginEnv); - } - - instances(): Observable { - return this.instance$; - } -} diff --git a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts deleted file mode 100644 index e24870f7d0..0000000000 --- a/packages/backend-defaults/src/entrypoints/systemMetadata/lib/createSystemMetadataRouter.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { LoggerService } from '@backstage/backend-plugin-api'; -import { BackendFeatureMeta } from '@backstage/backend-plugin-api/alpha'; -import type { - BackstageInstance, - SystemMetadataService, -} from '@backstage/backend-plugin-api'; -import Router from 'express-promise-router'; - -export async function createSystemMetadataRouter(options: { - logger: LoggerService; - systemMetadata: SystemMetadataService; -}) { - const { logger, systemMetadata } = options; - - let instances: BackstageInstance[] = []; - systemMetadata.instances().subscribe({ - next: value => { - instances = value; - }, - }); - - logger.info(`Instances in this system: ${JSON.stringify(instances)}`); - - const router = Router(); - - router.get('/instances', async (_, res) => { - res.json({ items: instances }); - }); - - router.get('/features/installed', async (_, res) => { - const featurePromises = await Promise.allSettled( - instances.map(async instance => { - const response = await fetch( - `${instance.internalUrl}/.backstage/instanceMetadata/v1/features/installed`, - ); - if (response.ok) { - return { instance, response: await response.json() }; - } - throw new Error( - `Failed to fetch installed features from ${instance.internalUrl}`, - ); - }), - ); - const pluginByInstance: Record< - string, - { internalUrl: string; externalUrl: string }[] - > = {}; - for (const result of featurePromises) { - if (result.status !== 'fulfilled') { - logger.error(`Failed to fetch installed features: ${result.reason}`); - continue; - } - const instance = result.value.instance; - const installedFeatures = result.value.response - .items as BackendFeatureMeta[]; - for (const feature of installedFeatures) { - if (feature.type === 'plugin') { - if (!pluginByInstance[feature.pluginId]) { - pluginByInstance[feature.pluginId] = []; - } - pluginByInstance[feature.pluginId].push(instance); - } - } - } - res.json(pluginByInstance); - }); - - return router; -} diff --git a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts similarity index 58% rename from packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts rename to packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts index 36ab1ff0e9..ded76ec65a 100644 --- a/packages/backend-plugin-api/src/services/definitions/SystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import { Observable } from '@backstage/types'; - -/** - * @public - */ -export interface BackstageInstance { - internalUrl: string; - externalUrl: string; +/** @public */ +export interface RootSystemMetadataServicePluginInfo { + readonly pluginId: string; + readonly hosts: (string | { external: string; internal: string })[]; } -/** - * @public - */ -export interface SystemMetadataService { - instances(): Observable; +/** @public */ +export interface RootSystemMetadataService { + getInstalledPlugins: () => Promise< + ReadonlyArray + >; + + getHosts: () => Promise< + ReadonlyArray + >; } diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index 0f38c0093c..e5ad69e871 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -289,15 +289,15 @@ export namespace coreServices { id: 'core.rootInstanceMetadata', scope: 'root', }); - + /** * Read information about your current Backstage deployment. * @public */ - export const systemMetadata = createServiceRef< - import('./SystemMetadataService').SystemMetadataService + export const rootSystemMetadata = createServiceRef< + import('./RootSystemMetadataService').RootSystemMetadataService >({ - id: 'core.systemMetadata', + id: 'core.rootSystemMetadata', scope: 'root', }); } diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index 4e01553a76..d12395b636 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -73,9 +73,9 @@ export type { SchedulerServiceTaskScheduleDefinitionConfig, } from './SchedulerService'; export type { - BackstageInstance, - SystemMetadataService, -} from './SystemMetadataService'; + RootSystemMetadataServicePluginInfo, + RootSystemMetadataService, +} from './RootSystemMetadataService'; export type { UrlReaderService, UrlReaderServiceReadTreeOptions, diff --git a/packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts b/packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts deleted file mode 100644 index 8f78ec7567..0000000000 --- a/packages/backend-test-utils/src/services/MockSystemMetadataService.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { BackstageInstance } from '@backstage/backend-plugin-api'; -import { MockSystemMetadataService } from './MockSystemMetadataService'; - -describe('MockSystemMetadataService', () => { - it('should return the passed in instances', () => { - expect.assertions(1); - const instances: BackstageInstance[] = [ - { internalUrl: 'localhost:7007', externalUrl: 'external.url' }, - { internalUrl: 'localhost:7008', externalUrl: 'other.external.url' }, - ]; - const service = MockSystemMetadataService.create({ instances }); - service.instances().subscribe({ - next: value => { - expect(value).toEqual(instances); - }, - }); - }); -}); diff --git a/packages/backend-test-utils/src/services/MockSystemMetadataService.ts b/packages/backend-test-utils/src/services/MockSystemMetadataService.ts deleted file mode 100644 index eb8b39daf1..0000000000 --- a/packages/backend-test-utils/src/services/MockSystemMetadataService.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - BackstageInstance, - SystemMetadataService, -} from '@backstage/backend-plugin-api'; -import { Observable } from '@backstage/types'; -import ObservableImpl from 'zen-observable'; - -/** - * @public - */ -export class MockSystemMetadataService implements SystemMetadataService { - #instances: BackstageInstance[]; - - constructor(instances: BackstageInstance[]) { - this.#instances = instances; - } - - public static create(options: { instances: BackstageInstance[] }) { - return new MockSystemMetadataService(options.instances); - } - - instances(): Observable { - return new ObservableImpl(subscriber => { - subscriber.next(this.#instances); - subscriber.complete(); - }); - } -} diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index 4f89d62971..de034aae07 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -30,7 +30,6 @@ import { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader'; import { AuthService, BackstageCredentials, - BackstageInstance, BackstageUserInfo, DatabaseService, DiscoveryService, @@ -41,7 +40,6 @@ import { SchedulerService, ServiceFactory, ServiceRef, - SystemMetadataService, UserInfoService, coreServices, createServiceFactory, @@ -63,8 +61,6 @@ import { simpleMock } from './simpleMock'; import { MockSchedulerService } from './MockSchedulerService'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { ObservableConfigProxy } from '../../../config-loader/src/sources/ObservableConfigProxy'; -import { MockSystemMetadataService } from './MockSystemMetadataService'; -import { createMockObservable } from './MockObservable'; /** @internal */ function createLoggerMock() { @@ -577,33 +573,23 @@ export namespace mockServices { rootInstanceMetadata, ); } - /** - * Creates a functional mock implementation for the - * {@link @backstage/backend-plugin-api#coreServices.systemMetadata}. - */ - export function systemMetadata(options: { - instances: BackstageInstance[]; - }): SystemMetadataService { - return MockSystemMetadataService.create(options); - } - export namespace systemMetadata { + export namespace rootSystemMetadata { /** * Creates a functional mock factory for the * {@link @backstage/backend-plugin-api#coreServices.systemMetadata}. */ export const factory = simpleFactoryWithOptions( - coreServices.systemMetadata, - systemMetadata, + coreServices.rootSystemMetadata, + rootSystemMetadata, ); /** * Creates a mock of the * {@link @backstage/backend-events-node#systemMetadata}, optionally * with some given method implementations. */ - export const mock = simpleMock(coreServices.systemMetadata, () => ({ - instances: jest - .fn() - .mockReturnValue(createMockObservable([])), + export const mock = simpleMock(coreServices.rootSystemMetadata, () => ({ + getInstalledPlugins: jest.fn(), + getHosts: jest.fn(), })); } } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index a6f9b7b3e9..f5a14e150a 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -19,7 +19,7 @@ import { coreServices, createBackendFeatureLoader, } from '@backstage/backend-plugin-api'; -import { systemMetadataServiceFactory } from '@backstage/backend-defaults/alpha'; +import { rootSystemMetadataServiceFactory } from '@backstage/backend-defaults/rootSystemMetadata'; const backend = createBackend(); @@ -70,7 +70,7 @@ backend.add(searchLoader); backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); -backend.add(systemMetadataServiceFactory); +backend.add(rootSystemMetadataServiceFactory); backend.add(import('@backstage/plugin-events-backend-module-google-pubsub')); backend.add(import('@backstage/plugin-mcp-actions-backend')); From bc862fea964ca6f17cf8f501c90b8ffc78b1a2ec Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 09:42:42 -0500 Subject: [PATCH 196/312] more cleanup Signed-off-by: aramissennyeydd --- .../backend-defaults/src/CreateBackend.ts | 2 + .../RootSystemMetadataService.test.ts | 302 +++++------------- .../lib/DefaultRootSystemMetadataService.ts | 14 - .../lib/createSystemMetadataRouter.ts | 5 - .../src/manager/plugin-manager.test.ts | 7 +- .../definitions/RootSystemMetadataService.ts | 4 - packages/backend-test-utils/package.json | 1 - .../src/services/MockObservable.ts | 25 -- .../src/services/simpleMock.ts | 1 - packages/backend/src/index.ts | 2 - yarn.lock | 3 - 11 files changed, 88 insertions(+), 278 deletions(-) delete mode 100644 packages/backend-test-utils/src/services/MockObservable.ts diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 9f8116a996..4b85464640 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -40,6 +40,7 @@ import { actionsServiceFactory, } from '@backstage/backend-defaults/alpha'; import { instanceMetadataServiceFactory } from './alpha/entrypoints/instanceMetadata/instanceMetadataServiceFactory'; +import { rootSystemMetadataServiceFactory } from './entrypoints/rootSystemMetadata'; export const defaultServiceFactories = [ auditorServiceFactory, @@ -62,6 +63,7 @@ export const defaultServiceFactories = [ userInfoServiceFactory, urlReaderServiceFactory, eventsServiceFactory, + rootSystemMetadataServiceFactory, // alpha services actionsRegistryServiceFactory, diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts index c6c6d6bc65..12f1cc586a 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts @@ -13,199 +13,66 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Backend, createSpecializedBackend } from '@backstage/backend-app-api'; -import { rootSystemMetadataServiceFactory } from './rootSystemMetadataServiceFactory'; + import { mockServices } from '@backstage/backend-test-utils'; -import getPort from 'get-port'; +import { default as getPort } from 'get-port'; import { coreServices, createBackendPlugin, createServiceFactory, } from '@backstage/backend-plugin-api'; - -const baseFactories = [ - mockServices.rootHealth.factory(), - mockServices.rootLogger.factory(), - mockServices.rootLifecycle.factory(), - mockServices.rootHttpRouter.factory(), - mockServices.lifecycle.factory(), - mockServices.logger.factory(), -]; +import { createBackend } from '../../CreateBackend'; describe('SystemMetadataService', () => { - describe('multiple backends testing', () => { - let instance1: Backend; - let instance2: Backend; - let instance1HttpPort: number; - let instance2HttpPort: number; - - const configFactory = (port: number) => - mockServices.rootConfig.factory({ - data: { - backend: { - listen: { - port, - }, - }, - discovery: { - instances: [ - { - baseUrl: `http://localhost:${instance1HttpPort}`, - }, - { - baseUrl: `http://localhost:${instance2HttpPort}`, - }, - ], - }, - }, - }); - beforeEach(async () => { - instance1HttpPort = await getPort(); - instance2HttpPort = await getPort(); - // Setup code for multiple backend instances - instance1 = createSpecializedBackend({ - defaultServiceFactories: [ - ...baseFactories, - rootSystemMetadataServiceFactory, - configFactory(instance1HttpPort), - ], - }); - - instance2 = createSpecializedBackend({ - defaultServiceFactories: [ - ...baseFactories, - rootSystemMetadataServiceFactory, - configFactory(instance2HttpPort), - ], - }); - }); - - it('should list plugins across instances', async () => { - instance1.add( - createBackendPlugin({ - pluginId: 'test', - register(reg) { - reg.registerInit({ - deps: {}, - async init() { - // do nothing - }, - }); - }, - }), - ); - - instance2.add( - createBackendPlugin({ - pluginId: 'test-other', - register(reg) { - reg.registerInit({ - deps: {}, - async init() { - // do nothing - }, - }); - }, - }), - ); - - await instance1.start(); - await instance2.start(); - - const instance1Response = await fetch( - `http://localhost:${instance1HttpPort}/.backstage/systemMetadata/v1/features/installed`, - ); - - expect(instance1Response.status).toBe(200); - await expect(instance1Response.json()).resolves.toMatchObject({ - test: [ - { - externalUrl: `http://localhost:${instance1HttpPort}`, - internalUrl: `http://localhost:${instance1HttpPort}`, - }, - ], - 'test-other': [ - { - externalUrl: `http://localhost:${instance2HttpPort}`, - internalUrl: `http://localhost:${instance2HttpPort}`, - }, - ], - }); - - const instance2Response = await fetch( - `http://localhost:${instance2HttpPort}/.backstage/systemMetadata/v1/features/installed`, - ); - - expect(instance2Response.status).toBe(200); - - await expect(instance2Response.json()).resolves.toMatchObject({ - test: [ - { - externalUrl: `http://localhost:${instance1HttpPort}`, - internalUrl: `http://localhost:${instance1HttpPort}`, - }, - ], - 'test-other': [ - { - externalUrl: `http://localhost:${instance2HttpPort}`, - internalUrl: `http://localhost:${instance2HttpPort}`, - }, - ], - }); - }); - - afterEach(async () => { - await instance1.stop(); - await instance2.stop(); - }); - }); - - describe('single backend test', () => { + describe('returns plugins from config', () => { let port: number; - let instance: Backend; + let testPlugin: ReturnType; beforeEach(async () => { port = await getPort(); - - instance = createSpecializedBackend({ - defaultServiceFactories: [ - ...baseFactories, - rootSystemMetadataServiceFactory, - mockServices.rootConfig.factory({ - data: { - backend: { - listen: { - port, - }, - }, - discovery: { - instances: [ - { - baseUrl: `http://localhost:${port}`, - }, - ], - }, - }, - }), - ], + testPlugin = createBackendPlugin({ + pluginId: 'test-plugin', + register(reg) { + reg.registerInit({ + deps: {}, + init: async () => {}, + }); + }, }); }); it('should list all known instances', async () => { + const instance = createBackend(); + instance.add( + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { + port, + }, + baseUrl: `http://localhost:${port}`, + }, + }, + }), + ); + instance.add(testPlugin); await instance.start(); const instanceResponse = await fetch( - `http://localhost:${port}/.backstage/systemMetadata/v1/instances`, + `http://localhost:${port}/.backstage/systemMetadata/v1/plugins/installed`, ); expect(instanceResponse.status).toBe(200); - await expect(instanceResponse.json()).resolves.toMatchObject({ - items: [ - { - externalUrl: `http://localhost:${port}`, - internalUrl: `http://localhost:${port}`, - }, - ], - }); + await expect(instanceResponse.json()).resolves.toMatchObject([ + { + hosts: [ + { + external: `http://localhost:${port}`, + internal: `http://localhost:${port}`, + }, + ], + pluginId: 'test-plugin', + }, + ]); }); it('should react to config updates', async () => { @@ -215,16 +82,7 @@ describe('SystemMetadataService', () => { listen: { port, }, - }, - discovery: { - instances: [ - { - baseUrl: `http://localhost:${port}`, - }, - { - baseUrl: `not-a-real-host`, - }, - ], + baseUrl: `http://localhost:${port}`, }, }, }); @@ -233,39 +91,41 @@ describe('SystemMetadataService', () => { deps: {}, factory: () => config, }); - instance = createSpecializedBackend({ - defaultServiceFactories: [ - ...baseFactories, - rootSystemMetadataServiceFactory, - configFactory, - ], - }); + const instance = createBackend(); + instance.add(configFactory); + instance.add(testPlugin); await instance.start(); const instance1Response = await fetch( - `http://localhost:${port}/.backstage/systemMetadata/v1/instances`, + `http://localhost:${port}/.backstage/systemMetadata/v1/plugins/installed`, ); expect(instance1Response.status).toBe(200); - await expect(instance1Response.json()).resolves.toMatchObject({ - items: [ - { - externalUrl: `http://localhost:${port}`, - internalUrl: `http://localhost:${port}`, - }, - { - externalUrl: `not-a-real-host`, - internalUrl: `not-a-real-host`, - }, - ], - }); + await expect(instance1Response.json()).resolves.toMatchObject([ + { + hosts: [ + { + external: `http://localhost:${port}`, + internal: `http://localhost:${port}`, + }, + ], + pluginId: 'test-plugin', + }, + ]); config.update({ data: { + backend: { + listen: { + port, + }, + baseUrl: `http://localhost:${port}`, + }, discovery: { - instances: [ + endpoints: [ { - baseUrl: `http://localhost:${port}`, + target: `http://test.internal`, + plugins: ['your-new-plugin'], }, ], }, @@ -273,22 +133,30 @@ describe('SystemMetadataService', () => { }); const responseAfterUpdate = await fetch( - `http://localhost:${port}/.backstage/systemMetadata/v1/instances`, + `http://localhost:${port}/.backstage/systemMetadata/v1/plugins/installed`, ); expect(responseAfterUpdate.status).toBe(200); - await expect(responseAfterUpdate.json()).resolves.toMatchObject({ - items: [ - { - externalUrl: `http://localhost:${port}`, - internalUrl: `http://localhost:${port}`, - }, - ], - }); - }); - - afterEach(async () => { - await instance.stop(); + await expect(responseAfterUpdate.json()).resolves.toMatchObject([ + { + hosts: [ + { + external: 'http://test.internal', + internal: 'http://test.internal', + }, + ], + pluginId: 'your-new-plugin', + }, + { + hosts: [ + { + external: `http://localhost:${port}`, + internal: `http://localhost:${port}`, + }, + ], + pluginId: 'test-plugin', + }, + ]); }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts index e8cdb43a08..4300cc94d3 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts @@ -22,7 +22,6 @@ import { RootSystemMetadataServicePluginInfo, } from '@backstage/backend-plugin-api'; import { HostDiscovery } from '../../discovery'; -import {} from '@backstage/backend-plugin-api'; /** * @alpha @@ -80,17 +79,4 @@ export class DefaultRootSystemMetadataService ), })); } - - public async getHosts(): Promise< - ReadonlyArray - > { - const resolutions = await this.#hostDiscovery.listResolutions(); - const hosts = new Set(); - for (const [_, targets] of resolutions.entries()) { - for (const target of targets) { - hosts.add(target as string | { external: string; internal: string }); - } - } - return Array.from(hosts); - } } diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts index eb8b835b16..6ef87309f7 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts @@ -26,11 +26,6 @@ export async function createSystemMetadataRouter(options: { const router = Router(); - router.get('/hosts', async (_, res) => { - const hosts = await systemMetadata.getHosts(); - res.json({ items: hosts }); - }); - router.get('/plugins/installed', async (_, res) => { res.json(await systemMetadata.getInstalledPlugins()); }); diff --git a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts index 394762d6e5..8d8fd13151 100644 --- a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts +++ b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts @@ -39,10 +39,7 @@ import { ConfigSources } from '@backstage/config-loader'; import { Logs, MockedLogger, LogContent } from '../__testUtils__/testUtils'; import { PluginScanner } from '../scanner/plugin-scanner'; import { findPaths } from '@backstage/cli-common'; -import { - createMockDirectory, - mockServices, -} from '@backstage/backend-test-utils'; +import { createMockDirectory } from '@backstage/backend-test-utils'; import { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle'; import { BackstagePackageJson, PackageRole } from '@backstage/cli-node'; @@ -1000,8 +997,6 @@ describe('backend-dynamic-feature-service', () => { const backend = createSpecializedBackend({ defaultServiceFactories: [ - mockServices.rootHealth.factory(), - mockServices.rootHttpRouter.mock().factory, rootLifecycleServiceFactory, createServiceFactory({ service: coreServices.rootConfig, diff --git a/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts index ded76ec65a..4e174a2c59 100644 --- a/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts @@ -25,8 +25,4 @@ export interface RootSystemMetadataService { getInstalledPlugins: () => Promise< ReadonlyArray >; - - getHosts: () => Promise< - ReadonlyArray - >; } diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index a771b9513f..cd4f68ead0 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -79,7 +79,6 @@ "text-extensions": "^2.4.0", "uuid": "^11.0.0", "yn": "^4.0.0", - "zen-observable": "^0.10.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" }, diff --git a/packages/backend-test-utils/src/services/MockObservable.ts b/packages/backend-test-utils/src/services/MockObservable.ts deleted file mode 100644 index 765b6ccb53..0000000000 --- a/packages/backend-test-utils/src/services/MockObservable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Observable } from '@backstage/types'; -import ObservableImpl from 'zen-observable'; - -export function createMockObservable(value: T): Observable { - return new ObservableImpl(observer => { - observer.next(value); - observer.complete(); - }); -} diff --git a/packages/backend-test-utils/src/services/simpleMock.ts b/packages/backend-test-utils/src/services/simpleMock.ts index 137c1cba66..484969f235 100644 --- a/packages/backend-test-utils/src/services/simpleMock.ts +++ b/packages/backend-test-utils/src/services/simpleMock.ts @@ -39,7 +39,6 @@ export function simpleMock( const mock = mockFactory(); if (partialImpl) { for (const [key, impl] of Object.entries(partialImpl)) { - console.log(key, impl, mock); if (typeof impl === 'function') { (mock as any)[key].mockImplementation(impl); } else { diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index f5a14e150a..9282c51f22 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -19,7 +19,6 @@ import { coreServices, createBackendFeatureLoader, } from '@backstage/backend-plugin-api'; -import { rootSystemMetadataServiceFactory } from '@backstage/backend-defaults/rootSystemMetadata'; const backend = createBackend(); @@ -70,7 +69,6 @@ backend.add(searchLoader); backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); -backend.add(rootSystemMetadataServiceFactory); backend.add(import('@backstage/plugin-events-backend-module-google-pubsub')); backend.add(import('@backstage/plugin-mcp-actions-backend')); diff --git a/yarn.lock b/yarn.lock index 1d7fcf655e..98c89bb0ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2854,7 +2854,6 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" - express-promise-router: "npm:^4.1.0" languageName: unknown linkType: soft @@ -2951,7 +2950,6 @@ __metadata: winston-transport: "npm:^4.5.0" yauzl: "npm:^3.0.0" yn: "npm:^4.0.0" - zen-observable: "npm:^0.10.0" zod: "npm:^3.22.4" zod-to-json-schema: "npm:^3.20.4" peerDependencies: @@ -3104,7 +3102,6 @@ __metadata: text-extensions: "npm:^2.4.0" uuid: "npm:^11.0.0" yn: "npm:^4.0.0" - zen-observable: "npm:^0.10.0" zod: "npm:^3.22.4" zod-to-json-schema: "npm:^3.20.4" languageName: unknown From 95fc28931dcd7dbc60690cd0fe2a0830c21280f7 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 09:50:07 -0500 Subject: [PATCH 197/312] remove http interface Signed-off-by: aramissennyeydd --- .../RootSystemMetadataService.test.ts | 48 ++++++++++++------- .../lib/createSystemMetadataRouter.ts | 34 ------------- .../rootSystemMetadataServiceFactory.ts | 11 +---- 3 files changed, 33 insertions(+), 60 deletions(-) delete mode 100644 packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts index 12f1cc586a..b2d7b52083 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts @@ -22,26 +22,39 @@ import { createServiceFactory, } from '@backstage/backend-plugin-api'; import { createBackend } from '../../CreateBackend'; +import { Backend } from '@backstage/backend-app-api'; +import Router from 'express-promise-router'; describe('SystemMetadataService', () => { describe('returns plugins from config', () => { let port: number; - let testPlugin: ReturnType; + let instance: Backend; beforeEach(async () => { port = await getPort(); - testPlugin = createBackendPlugin({ - pluginId: 'test-plugin', - register(reg) { - reg.registerInit({ - deps: {}, - init: async () => {}, - }); - }, - }); + instance = createBackend(); + instance.add( + createBackendPlugin({ + pluginId: 'test-plugin', + register(reg) { + reg.registerInit({ + deps: { + systemMetadata: coreServices.rootSystemMetadata, + rootHttpRouter: coreServices.rootHttpRouter, + }, + init: async ({ systemMetadata, rootHttpRouter }) => { + const router = Router(); + router.use('/plugins', async (_, res) => { + res.json(await systemMetadata.getInstalledPlugins()); + }); + rootHttpRouter.use('/systemMetadata', router); + }, + }); + }, + }), + ); }); it('should list all known instances', async () => { - const instance = createBackend(); instance.add( mockServices.rootConfig.factory({ data: { @@ -54,11 +67,10 @@ describe('SystemMetadataService', () => { }, }), ); - instance.add(testPlugin); await instance.start(); const instanceResponse = await fetch( - `http://localhost:${port}/.backstage/systemMetadata/v1/plugins/installed`, + `http://localhost:${port}/systemMetadata/plugins`, ); expect(instanceResponse.status).toBe(200); @@ -91,13 +103,11 @@ describe('SystemMetadataService', () => { deps: {}, factory: () => config, }); - const instance = createBackend(); instance.add(configFactory); - instance.add(testPlugin); await instance.start(); const instance1Response = await fetch( - `http://localhost:${port}/.backstage/systemMetadata/v1/plugins/installed`, + `http://localhost:${port}/systemMetadata/plugins`, ); expect(instance1Response.status).toBe(200); @@ -133,7 +143,7 @@ describe('SystemMetadataService', () => { }); const responseAfterUpdate = await fetch( - `http://localhost:${port}/.backstage/systemMetadata/v1/plugins/installed`, + `http://localhost:${port}/systemMetadata/plugins`, ); expect(responseAfterUpdate.status).toBe(200); @@ -158,5 +168,9 @@ describe('SystemMetadataService', () => { }, ]); }); + + afterEach(async () => { + await instance.stop(); + }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts deleted file mode 100644 index 6ef87309f7..0000000000 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/createSystemMetadataRouter.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { LoggerService } from '@backstage/backend-plugin-api'; -import type { RootSystemMetadataService } from '@backstage/backend-plugin-api'; -import Router from 'express-promise-router'; - -export async function createSystemMetadataRouter(options: { - logger: LoggerService; - systemMetadata: RootSystemMetadataService; -}) { - const { systemMetadata } = options; - - const router = Router(); - - router.get('/plugins/installed', async (_, res) => { - res.json(await systemMetadata.getInstalledPlugins()); - }); - - return router; -} diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts index 0baa41be07..62cd8bf3bc 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts @@ -19,7 +19,6 @@ import { createServiceFactory, } from '@backstage/backend-plugin-api'; import { DefaultRootSystemMetadataService } from './lib/DefaultRootSystemMetadataService'; -import { createSystemMetadataRouter } from './lib/createSystemMetadataRouter'; /** * Metadata about an entire Backstage system, a collection of Backstage instances. @@ -31,19 +30,13 @@ export const rootSystemMetadataServiceFactory = createServiceFactory({ deps: { logger: coreServices.rootLogger, config: coreServices.rootConfig, - httpRouter: coreServices.rootHttpRouter, instanceMetadata: coreServices.rootInstanceMetadata, }, - async factory({ logger, config, httpRouter, instanceMetadata }) { - const systemMetadata = DefaultRootSystemMetadataService.create({ + async factory({ logger, config, instanceMetadata }) { + return DefaultRootSystemMetadataService.create({ logger, config, instanceMetadata, }); - - const router = await createSystemMetadataRouter({ systemMetadata, logger }); - - httpRouter.use('/.backstage/systemMetadata/v1', router); - return systemMetadata; }, }); From 9a5833c99ad06d6e07b0585f5071156fbed8a278 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 09:58:06 -0500 Subject: [PATCH 198/312] fixes Signed-off-by: aramissennyeydd --- packages/backend-defaults/package.json | 6 +-- packages/backend-defaults/report-alpha.api.md | 2 +- .../backend-defaults/report-discovery.api.md | 16 ++++++ .../report-rootSystemMetadata.api.md | 40 +++++++++++++++ .../report-systemMetadata.api.md | 47 ------------------ packages/backend-plugin-api/report.api.md | 49 ++++++++++--------- packages/backend-test-utils/report.api.md | 34 ++++++------- .../src/services/mockServices.ts | 8 ++- 8 files changed, 109 insertions(+), 93 deletions(-) create mode 100644 packages/backend-defaults/report-rootSystemMetadata.api.md delete mode 100644 packages/backend-defaults/report-systemMetadata.api.md diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 7107b80d7e..1ebd5de801 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -86,15 +86,15 @@ "rootHealth": [ "src/entrypoints/rootHealth/index.ts" ], + "rootSystemMetadata": [ + "src/entrypoints/rootSystemMetadata/index.ts" + ], "rootHttpRouter": [ "src/entrypoints/rootHttpRouter/index.ts" ], "rootLifecycle": [ "src/entrypoints/rootLifecycle/index.ts" ], - "rootSystemMetadata": [ - "src/entrypoints/rootSystemMetadata/index.ts" - ], "rootLogger": [ "src/entrypoints/rootLogger/index.ts" ], diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index 2ca3525946..34f2d1066b 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -25,7 +25,7 @@ export const actionsServiceFactory: ServiceFactory< // @alpha @deprecated (undocumented) export const instanceMetadataServiceFactory: ServiceFactory< InstanceMetadataService, - 'plugin', + 'root', 'singleton' >; diff --git a/packages/backend-defaults/report-discovery.api.md b/packages/backend-defaults/report-discovery.api.md index ddbbd9d025..260e04a8a3 100644 --- a/packages/backend-defaults/report-discovery.api.md +++ b/packages/backend-defaults/report-discovery.api.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { Config } from '@backstage/config'; import { DiscoveryService } from '@backstage/backend-plugin-api'; import { LoggerService } from '@backstage/backend-plugin-api'; import { RootConfigService } from '@backstage/backend-plugin-api'; @@ -26,6 +27,21 @@ export class HostDiscovery implements DiscoveryService { getBaseUrl(pluginId: string): Promise; // (undocumented) getExternalBaseUrl(pluginId: string): Promise; + // (undocumented) + getInstanceAddress(config: Config): { + internal: string; + external: string; + }; + // (undocumented) + listResolutions(): Promise< + Map< + string, + { + internal?: string; + external?: string; + }[] + > + >; } // @public diff --git a/packages/backend-defaults/report-rootSystemMetadata.api.md b/packages/backend-defaults/report-rootSystemMetadata.api.md new file mode 100644 index 0000000000..f871282826 --- /dev/null +++ b/packages/backend-defaults/report-rootSystemMetadata.api.md @@ -0,0 +1,40 @@ +## API Report File for "@backstage/backend-defaults" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { LoggerService } from '@backstage/backend-plugin-api'; +import { RootConfigService } from '@backstage/backend-plugin-api'; +import { RootInstanceMetadataService } from '@backstage/backend-plugin-api'; +import { RootSystemMetadataService } from '@backstage/backend-plugin-api'; +import { RootSystemMetadataServicePluginInfo } from '@backstage/backend-plugin-api'; +import { ServiceFactory } from '@backstage/backend-plugin-api'; + +// @alpha (undocumented) +export class DefaultRootSystemMetadataService + implements RootSystemMetadataService +{ + constructor(options: { + logger: LoggerService; + config: RootConfigService; + instanceMetadata: RootInstanceMetadataService; + }); + // (undocumented) + static create(pluginEnv: { + logger: LoggerService; + config: RootConfigService; + instanceMetadata: RootInstanceMetadataService; + }): DefaultRootSystemMetadataService; + // (undocumented) + getInstalledPlugins(): Promise; +} + +// @alpha +export const rootSystemMetadataServiceFactory: ServiceFactory< + RootSystemMetadataService, + 'root', + 'singleton' +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/packages/backend-defaults/report-systemMetadata.api.md b/packages/backend-defaults/report-systemMetadata.api.md deleted file mode 100644 index 6f0f106039..0000000000 --- a/packages/backend-defaults/report-systemMetadata.api.md +++ /dev/null @@ -1,47 +0,0 @@ -## API Report File for "@backstage/backend-defaults" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; -import { ActionsService } from '@backstage/backend-plugin-api/alpha'; -import { ServiceFactory } from '@backstage/backend-plugin-api'; - -// @public (undocumented) -export const actionsRegistryServiceFactory: ServiceFactory< - ActionsRegistryService, - 'plugin', - 'singleton' ->; - -// @public (undocumented) -export const actionsServiceFactory: ServiceFactory< - ActionsService, -import { BackstageInstance } from '@backstage/backend-plugin-api'; -import { LoggerService } from '@backstage/backend-plugin-api'; -import { Observable } from '@backstage/types'; -import { RootConfigService } from '@backstage/backend-plugin-api'; -import { ServiceFactory } from '@backstage/backend-plugin-api'; -import { SystemMetadataService } from '@backstage/backend-plugin-api'; - -// @alpha (undocumented) -export class DefaultSystemMetadataService implements SystemMetadataService { - constructor(options: { logger: LoggerService; config: RootConfigService }); - // (undocumented) - static create(pluginEnv: { - logger: LoggerService; - config: RootConfigService; - }): DefaultSystemMetadataService; - // (undocumented) - instances(): Observable; -} - -// @alpha -export const systemMetadataServiceFactory: ServiceFactory< - SystemMetadataService, - 'root', - 'singleton' ->; - -// (No @packageDocumentation comment for this package) -``` diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index abb20539db..fdca63ec6b 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -14,7 +14,6 @@ import { isChildPath } from '@backstage/cli-common'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Knex } from 'knex'; -import { Observable } from '@backstage/types'; import { Permission } from '@backstage/plugin-permission-common'; import { PermissionAttributes } from '@backstage/plugin-permission-common'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; @@ -138,14 +137,6 @@ export type BackstageCredentials = { principal: TPrincipal; }; -// @public (undocumented) -export interface BackstageInstance { - // (undocumented) - externalUrl: string; - // (undocumented) - internalUrl: string; -} - // @public export type BackstageNonePrincipal = { type: 'none'; @@ -246,13 +237,11 @@ export namespace coreServices { 'root', 'singleton' >; - const // @alpha - systemMetadataServiceRef: ServiceRef< - SystemMetadataService, - 'root', - 'singleton' - >; - const systemMetadata: ServiceRef; + const rootSystemMetadata: ServiceRef< + RootSystemMetadataService, + 'root', + 'singleton' + >; } // @public @@ -644,6 +633,28 @@ export interface RootServiceFactoryOptions< service: ServiceRef; } +// @public (undocumented) +export interface RootSystemMetadataService { + // (undocumented) + getInstalledPlugins: () => Promise< + ReadonlyArray + >; +} + +// @public (undocumented) +export interface RootSystemMetadataServicePluginInfo { + // (undocumented) + readonly hosts: ( + | string + | { + external: string; + internal: string; + } + )[]; + // (undocumented) + readonly pluginId: string; +} + // @public export interface SchedulerService { createScheduledTaskRunner( @@ -760,12 +771,6 @@ export interface ServiceRefOptions< scope?: TScope; } -// @public (undocumented) -export interface SystemMetadataService { - // (undocumented) - instances(): Observable; -} - // @public export interface UrlReaderService { readTree( diff --git a/packages/backend-test-utils/report.api.md b/packages/backend-test-utils/report.api.md index 08e6979928..bfa46a3725 100644 --- a/packages/backend-test-utils/report.api.md +++ b/packages/backend-test-utils/report.api.md @@ -9,7 +9,6 @@ import { AuthService } from '@backstage/backend-plugin-api'; import { Backend } from '@backstage/backend-app-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { BackstageCredentials } from '@backstage/backend-plugin-api'; -import { BackstageInstance } from '@backstage/backend-plugin-api'; import { BackstageNonePrincipal } from '@backstage/backend-plugin-api'; import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; import { BackstageServicePrincipal } from '@backstage/backend-plugin-api'; @@ -39,10 +38,10 @@ import { RootHttpRouterService } from '@backstage/backend-plugin-api'; import { RootInstanceMetadataService } from '@backstage/backend-plugin-api'; import { RootLifecycleService } from '@backstage/backend-plugin-api'; import { RootLoggerService } from '@backstage/backend-plugin-api'; +import { RootSystemMetadataService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; -import { SystemMetadataService } from '@backstage/backend-plugin-api'; import { UrlReaderService } from '@backstage/backend-plugin-api'; import { UserInfoService } from '@backstage/backend-plugin-api'; @@ -354,7 +353,7 @@ export namespace mockServices { factory: () => ServiceFactory< RootInstanceMetadataService, 'root', - 'singleton' + 'singleton' | 'multiton' >; } // (undocumented) @@ -384,6 +383,19 @@ export namespace mockServices { ) => ServiceMock; } // (undocumented) + export function rootSystemMetadata(): RootSystemMetadataService; + // (undocumented) + export namespace rootSystemMetadata { + const factory: () => ServiceFactory< + RootSystemMetadataService, + 'root', + 'singleton' | 'multiton' + >; + const mock: ( + partialImpl?: Partial | undefined, + ) => ServiceMock; + } + // (undocumented) export function scheduler(): SchedulerService; // (undocumented) export namespace scheduler { @@ -398,22 +410,6 @@ export namespace mockServices { partialImpl?: Partial | undefined, ) => ServiceMock; } - export function systemMetadata(options: { - instances: BackstageInstance[]; - }): SystemMetadataService; - // (undocumented) - export namespace systemMetadata { - const factory: (options: { - instances: BackstageInstance[]; - }) => ServiceFactory< - SystemMetadataService, - 'root', - 'singleton' | 'multiton' - >; - const mock: ( - partialImpl?: Partial | undefined, - ) => ServiceMock; - } // (undocumented) export namespace urlReader { const // (undocumented) diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index de034aae07..0c19bf40ca 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -44,6 +44,7 @@ import { coreServices, createServiceFactory, RootLoggerService, + RootSystemMetadataService, } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { EventsService, eventsServiceRef } from '@backstage/plugin-events-node'; @@ -573,6 +574,12 @@ export namespace mockServices { rootInstanceMetadata, ); } + + export function rootSystemMetadata(): RootSystemMetadataService { + return { + getInstalledPlugins: () => Promise.resolve([]), + }; + } export namespace rootSystemMetadata { /** * Creates a functional mock factory for the @@ -589,7 +596,6 @@ export namespace mockServices { */ export const mock = simpleMock(coreServices.rootSystemMetadata, () => ({ getInstalledPlugins: jest.fn(), - getHosts: jest.fn(), })); } } From 1d124c34352889b12494fc7c1b93715bf94c079b Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 10:08:41 -0500 Subject: [PATCH 199/312] add example router Signed-off-by: aramissennyeydd --- packages/backend/package.json | 3 +- packages/backend/src/index.ts | 1 + packages/backend/src/systemMetadataPlugin.ts | 48 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/systemMetadataPlugin.ts diff --git a/packages/backend/package.json b/packages/backend/package.json index 2af36b8077..3ea09f7540 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -69,7 +69,8 @@ "@opentelemetry/auto-instrumentations-node": "^0.61.0", "@opentelemetry/exporter-prometheus": "^0.54.0", "@opentelemetry/sdk-node": "^0.54.0", - "example-app": "link:../app" + "example-app": "link:../app", + "express-promise-router": "^4.1.0" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 9282c51f22..8f8fd106d6 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -69,6 +69,7 @@ backend.add(searchLoader); backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); +backend.add(import('./systemMetadataPlugin')); backend.add(import('@backstage/plugin-events-backend-module-google-pubsub')); backend.add(import('@backstage/plugin-mcp-actions-backend')); diff --git a/packages/backend/src/systemMetadataPlugin.ts b/packages/backend/src/systemMetadataPlugin.ts new file mode 100644 index 0000000000..434e708073 --- /dev/null +++ b/packages/backend/src/systemMetadataPlugin.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import Router from 'express-promise-router'; + +/** + * Example plugin that shows how to reveal all installed plugins with the + * system metadata API. + */ +export default createBackendPlugin({ + pluginId: 'system-metadata-router', + register: reg => { + reg.registerInit({ + deps: { + systemMetadata: coreServices.rootSystemMetadata, + rootHttpRouter: coreServices.rootHttpRouter, + }, + async init({ systemMetadata, rootHttpRouter }) { + const router = Router(); + router.get('/plugins', async (_, res) => { + const plugins = (await systemMetadata.getInstalledPlugins()).toSorted( + (a, b) => a.pluginId.localeCompare(b.pluginId), + ); + res.json(plugins); + }); + + rootHttpRouter.use('/.backstage/systemMetadata', router); + }, + }); + }, +}); From 757203bfbe0a7c9bc15a241568abf110cd4e2e1f Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 10:15:07 -0500 Subject: [PATCH 200/312] fix lockfile Signed-off-by: aramissennyeydd --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index 98c89bb0ae..0b696ed0b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30346,6 +30346,7 @@ __metadata: "@opentelemetry/exporter-prometheus": "npm:^0.54.0" "@opentelemetry/sdk-node": "npm:^0.54.0" example-app: "link:../app" + express-promise-router: "npm:^4.1.0" languageName: unknown linkType: soft From 77fb3f37de90f6ec7412760e8c7e52e0839694b9 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 11:41:48 -0500 Subject: [PATCH 201/312] rework to use test backend Signed-off-by: aramissennyeydd --- .../RootSystemMetadataService.test.ts | 121 ++++++++---------- .../src/services/mockServices.ts | 7 +- .../src/wiring/TestBackend.ts | 1 + 3 files changed, 62 insertions(+), 67 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts index b2d7b52083..036840d103 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts @@ -14,72 +14,66 @@ * limitations under the License. */ -import { mockServices } from '@backstage/backend-test-utils'; -import { default as getPort } from 'get-port'; +import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; import { coreServices, createBackendPlugin, createServiceFactory, } from '@backstage/backend-plugin-api'; -import { createBackend } from '../../CreateBackend'; -import { Backend } from '@backstage/backend-app-api'; import Router from 'express-promise-router'; +import request from 'supertest'; +import { rootSystemMetadataServiceFactory } from './rootSystemMetadataServiceFactory'; describe('SystemMetadataService', () => { describe('returns plugins from config', () => { - let port: number; - let instance: Backend; - beforeEach(async () => { - port = await getPort(); - instance = createBackend(); - instance.add( - createBackendPlugin({ - pluginId: 'test-plugin', - register(reg) { - reg.registerInit({ - deps: { - systemMetadata: coreServices.rootSystemMetadata, - rootHttpRouter: coreServices.rootHttpRouter, - }, - init: async ({ systemMetadata, rootHttpRouter }) => { - const router = Router(); - router.use('/plugins', async (_, res) => { - res.json(await systemMetadata.getInstalledPlugins()); - }); - rootHttpRouter.use('/systemMetadata', router); - }, - }); + const testPlugin = createBackendPlugin({ + pluginId: 'test-plugin', + register(reg) { + reg.registerInit({ + deps: { + systemMetadata: coreServices.rootSystemMetadata, + rootHttpRouter: coreServices.rootHttpRouter, }, - }), - ); + init: async ({ systemMetadata, rootHttpRouter }) => { + const router = Router(); + router.use('/plugins', async (_, res) => { + res.json(await systemMetadata.getInstalledPlugins()); + }); + rootHttpRouter.use('/systemMetadata', router); + }, + }); + }, }); it('should list all known instances', async () => { - instance.add( - mockServices.rootConfig.factory({ - data: { - backend: { - listen: { - port, + const { server } = await startTestBackend({ + features: [ + testPlugin, + rootSystemMetadataServiceFactory, + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { + port: 0, + }, + baseUrl: `http://localhost:0`, }, - baseUrl: `http://localhost:${port}`, }, - }, - }), - ); - await instance.start(); + }), + ], + }); - const instanceResponse = await fetch( - `http://localhost:${port}/systemMetadata/plugins`, + const instanceResponse = await request(server).get( + `/systemMetadata/plugins`, ); expect(instanceResponse.status).toBe(200); - await expect(instanceResponse.json()).resolves.toMatchObject([ + expect(instanceResponse.body).toMatchObject([ { hosts: [ { - external: `http://localhost:${port}`, - internal: `http://localhost:${port}`, + external: `http://localhost:0`, + internal: `http://localhost:0`, }, ], pluginId: 'test-plugin', @@ -92,9 +86,9 @@ describe('SystemMetadataService', () => { data: { backend: { listen: { - port, + port: 0, }, - baseUrl: `http://localhost:${port}`, + baseUrl: `http://localhost:0`, }, }, }); @@ -103,20 +97,21 @@ describe('SystemMetadataService', () => { deps: {}, factory: () => config, }); - instance.add(configFactory); - await instance.start(); + const { server } = await startTestBackend({ + features: [testPlugin, configFactory, rootSystemMetadataServiceFactory], + }); - const instance1Response = await fetch( - `http://localhost:${port}/systemMetadata/plugins`, + const initialResponse = await request(server).get( + `/systemMetadata/plugins`, ); - expect(instance1Response.status).toBe(200); - await expect(instance1Response.json()).resolves.toMatchObject([ + expect(initialResponse.status).toBe(200); + expect(initialResponse.body).toMatchObject([ { hosts: [ { - external: `http://localhost:${port}`, - internal: `http://localhost:${port}`, + external: `http://localhost:0`, + internal: `http://localhost:0`, }, ], pluginId: 'test-plugin', @@ -127,9 +122,9 @@ describe('SystemMetadataService', () => { data: { backend: { listen: { - port, + port: 0, }, - baseUrl: `http://localhost:${port}`, + baseUrl: `http://localhost:0`, }, discovery: { endpoints: [ @@ -142,12 +137,12 @@ describe('SystemMetadataService', () => { }, }); - const responseAfterUpdate = await fetch( - `http://localhost:${port}/systemMetadata/plugins`, + const responseAfterUpdate = await request(server).get( + `/systemMetadata/plugins`, ); expect(responseAfterUpdate.status).toBe(200); - await expect(responseAfterUpdate.json()).resolves.toMatchObject([ + expect(responseAfterUpdate.body).toMatchObject([ { hosts: [ { @@ -160,17 +155,13 @@ describe('SystemMetadataService', () => { { hosts: [ { - external: `http://localhost:${port}`, - internal: `http://localhost:${port}`, + external: `http://localhost:0`, + internal: `http://localhost:0`, }, ], pluginId: 'test-plugin', }, ]); }); - - afterEach(async () => { - await instance.stop(); - }); }); }); diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index 0c19bf40ca..803641453c 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -45,6 +45,7 @@ import { createServiceFactory, RootLoggerService, RootSystemMetadataService, + RootInstanceMetadataServicePluginInfo, } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { EventsService, eventsServiceRef } from '@backstage/plugin-events-node'; @@ -560,9 +561,11 @@ export namespace mockServices { })); } - export function rootInstanceMetadata(): RootInstanceMetadataService { + export function rootInstanceMetadata(options?: { + plugins: RootInstanceMetadataServicePluginInfo[]; + }): RootInstanceMetadataService { return { - getInstalledPlugins: () => Promise.resolve([]), + getInstalledPlugins: () => Promise.resolve(options?.plugins ?? []), }; } export namespace rootInstanceMetadata { diff --git a/packages/backend-test-utils/src/wiring/TestBackend.ts b/packages/backend-test-utils/src/wiring/TestBackend.ts index cdfa1fc695..3dc1472fba 100644 --- a/packages/backend-test-utils/src/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/wiring/TestBackend.ts @@ -88,6 +88,7 @@ export const defaultServiceFactories = [ mockServices.userInfo.factory(), mockServices.urlReader.factory(), mockServices.events.factory(), + mockServices.rootSystemMetadata.factory(), // Alpha services actionsRegistryServiceMock.factory(), From dbf5eae24dcb088147e429b4d99011a81ec59aab Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 13:32:05 -0500 Subject: [PATCH 202/312] remove idea of hosts Signed-off-by: aramissennyeydd --- .../RootSystemMetadataService.test.ts | 24 ----------------- .../lib/DefaultRootSystemMetadataService.ts | 27 +++++++------------ .../definitions/RootSystemMetadataService.ts | 1 - 3 files changed, 9 insertions(+), 43 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts index 036840d103..a440828362 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts @@ -70,12 +70,6 @@ describe('SystemMetadataService', () => { expect(instanceResponse.status).toBe(200); expect(instanceResponse.body).toMatchObject([ { - hosts: [ - { - external: `http://localhost:0`, - internal: `http://localhost:0`, - }, - ], pluginId: 'test-plugin', }, ]); @@ -108,12 +102,6 @@ describe('SystemMetadataService', () => { expect(initialResponse.status).toBe(200); expect(initialResponse.body).toMatchObject([ { - hosts: [ - { - external: `http://localhost:0`, - internal: `http://localhost:0`, - }, - ], pluginId: 'test-plugin', }, ]); @@ -144,21 +132,9 @@ describe('SystemMetadataService', () => { expect(responseAfterUpdate.status).toBe(200); expect(responseAfterUpdate.body).toMatchObject([ { - hosts: [ - { - external: 'http://test.internal', - internal: 'http://test.internal', - }, - ], pluginId: 'your-new-plugin', }, { - hosts: [ - { - external: `http://localhost:0`, - internal: `http://localhost:0`, - }, - ], pluginId: 'test-plugin', }, ]); diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts index 4300cc94d3..be1ab6b818 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts +++ b/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts @@ -31,7 +31,6 @@ export class DefaultRootSystemMetadataService { #hostDiscovery: HostDiscovery; #instanceMetadata: RootInstanceMetadataService; - #config: RootConfigService; constructor(options: { logger: LoggerService; config: RootConfigService; @@ -46,7 +45,6 @@ export class DefaultRootSystemMetadataService }); }); this.#instanceMetadata = options.instanceMetadata; - this.#config = options.config; } public static create(pluginEnv: { @@ -61,22 +59,15 @@ export class DefaultRootSystemMetadataService RootSystemMetadataServicePluginInfo[] > { const resolutions = await this.#hostDiscovery.listResolutions(); - const instanceAddress = this.#hostDiscovery.getInstanceAddress( - this.#config, - ); - const currentInstance = await this.#instanceMetadata.getInstalledPlugins(); - for (const plugin of currentInstance) { - if (!resolutions.has(plugin.pluginId)) { - resolutions.set(plugin.pluginId, []); - } - resolutions.get(plugin.pluginId)?.push(instanceAddress); + const plugins = []; + for (const pluginId of resolutions.keys()) { + plugins.push({ pluginId }); } - return Array.from(resolutions.entries()).map(([pluginId, targets]) => ({ - pluginId, - hosts: Array.from(targets).filter( - (target): target is { external: string; internal: string } => - Object.keys(target).length > 0, - ), - })); + + for (const plugin of await this.#instanceMetadata.getInstalledPlugins()) { + plugins.push({ pluginId: plugin.pluginId }); + } + + return plugins; } } diff --git a/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts index 4e174a2c59..67cc43f8af 100644 --- a/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts +++ b/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts @@ -17,7 +17,6 @@ /** @public */ export interface RootSystemMetadataServicePluginInfo { readonly pluginId: string; - readonly hosts: (string | { external: string; internal: string })[]; } /** @public */ From 2b6279edb3dd19d9f7887ce3eac1941332546c8a Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 14:04:40 -0500 Subject: [PATCH 203/312] fix api reports Signed-off-by: aramissennyeydd --- packages/backend-plugin-api/report.api.md | 8 -------- packages/backend-test-utils/src/services/mockServices.ts | 7 ++----- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index fdca63ec6b..17a407a4eb 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -643,14 +643,6 @@ export interface RootSystemMetadataService { // @public (undocumented) export interface RootSystemMetadataServicePluginInfo { - // (undocumented) - readonly hosts: ( - | string - | { - external: string; - internal: string; - } - )[]; // (undocumented) readonly pluginId: string; } diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index 803641453c..0c19bf40ca 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -45,7 +45,6 @@ import { createServiceFactory, RootLoggerService, RootSystemMetadataService, - RootInstanceMetadataServicePluginInfo, } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { EventsService, eventsServiceRef } from '@backstage/plugin-events-node'; @@ -561,11 +560,9 @@ export namespace mockServices { })); } - export function rootInstanceMetadata(options?: { - plugins: RootInstanceMetadataServicePluginInfo[]; - }): RootInstanceMetadataService { + export function rootInstanceMetadata(): RootInstanceMetadataService { return { - getInstalledPlugins: () => Promise.resolve(options?.plugins ?? []), + getInstalledPlugins: () => Promise.resolve([]), }; } export namespace rootInstanceMetadata { From db45906aa1196d6044df4b1556357f4f61375f04 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 10 Nov 2025 14:36:49 -0500 Subject: [PATCH 204/312] move to alpha Signed-off-by: aramissennyeydd --- .changeset/old-cats-shake.md | 2 +- packages/backend-defaults/package.json | 4 -- packages/backend-defaults/report-alpha.api.md | 8 ++++ .../backend-defaults/report-discovery.api.md | 6 --- .../report-rootSystemMetadata.api.md | 40 ------------------- .../backend-defaults/src/CreateBackend.ts | 6 --- .../RootSystemMetadataService.test.ts | 3 +- .../entrypoints/rootSystemMetadata/index.ts | 0 .../lib/DefaultRootSystemMetadataService.ts | 6 ++- .../rootSystemMetadataServiceFactory.ts | 3 +- packages/backend-defaults/src/alpha/index.ts | 1 + .../entrypoints/discovery/HostDiscovery.ts | 4 +- packages/backend-plugin-api/report.api.md | 19 --------- .../RootSystemMetadataService.ts | 0 .../backend-plugin-api/src/alpha/index.ts | 14 +++++-- packages/backend-plugin-api/src/alpha/refs.ts | 11 +++++ .../src/services/definitions/coreServices.ts | 11 ----- .../src/services/definitions/index.ts | 4 -- packages/backend-test-utils/report.api.md | 14 ------- .../src/services/mockServices.ts | 26 ------------ .../src/wiring/TestBackend.ts | 1 - packages/backend/src/index.ts | 2 + packages/backend/src/systemMetadataPlugin.ts | 3 +- 23 files changed, 45 insertions(+), 143 deletions(-) delete mode 100644 packages/backend-defaults/report-rootSystemMetadata.api.md rename packages/backend-defaults/src/{ => alpha}/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts (96%) rename packages/backend-defaults/src/{ => alpha}/entrypoints/rootSystemMetadata/index.ts (100%) rename packages/backend-defaults/src/{ => alpha}/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts (94%) rename packages/backend-defaults/src/{ => alpha}/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts (91%) rename packages/backend-plugin-api/src/{services/definitions => alpha}/RootSystemMetadataService.ts (100%) diff --git a/.changeset/old-cats-shake.md b/.changeset/old-cats-shake.md index 367e7f2062..5738f6cf86 100644 --- a/.changeset/old-cats-shake.md +++ b/.changeset/old-cats-shake.md @@ -3,4 +3,4 @@ '@backstage/backend-plugin-api': minor --- -Adds a new experimental `SystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. +Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins. diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 1ebd5de801..042b9497b9 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -33,7 +33,6 @@ "./permissions": "./src/entrypoints/permissions/index.ts", "./rootConfig": "./src/entrypoints/rootConfig/index.ts", "./rootHealth": "./src/entrypoints/rootHealth/index.ts", - "./rootSystemMetadata": "./src/entrypoints/rootSystemMetadata/index.ts", "./rootHttpRouter": "./src/entrypoints/rootHttpRouter/index.ts", "./rootLifecycle": "./src/entrypoints/rootLifecycle/index.ts", "./rootLogger": "./src/entrypoints/rootLogger/index.ts", @@ -86,9 +85,6 @@ "rootHealth": [ "src/entrypoints/rootHealth/index.ts" ], - "rootSystemMetadata": [ - "src/entrypoints/rootSystemMetadata/index.ts" - ], "rootHttpRouter": [ "src/entrypoints/rootHttpRouter/index.ts" ], diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index 34f2d1066b..c6316780e5 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -6,6 +6,7 @@ import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; import { ActionsService } from '@backstage/backend-plugin-api/alpha'; import { InstanceMetadataService } from '@backstage/backend-plugin-api/alpha'; +import { RootSystemMetadataService } from '@backstage/backend-plugin-api/alpha'; import { ServiceFactory } from '@backstage/backend-plugin-api'; // @public (undocumented) @@ -29,5 +30,12 @@ export const instanceMetadataServiceFactory: ServiceFactory< 'singleton' >; +// @alpha +export const rootSystemMetadataServiceFactory: ServiceFactory< + RootSystemMetadataService, + 'root', + 'singleton' +>; + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/backend-defaults/report-discovery.api.md b/packages/backend-defaults/report-discovery.api.md index 260e04a8a3..8617d7d212 100644 --- a/packages/backend-defaults/report-discovery.api.md +++ b/packages/backend-defaults/report-discovery.api.md @@ -3,7 +3,6 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { Config } from '@backstage/config'; import { DiscoveryService } from '@backstage/backend-plugin-api'; import { LoggerService } from '@backstage/backend-plugin-api'; import { RootConfigService } from '@backstage/backend-plugin-api'; @@ -28,11 +27,6 @@ export class HostDiscovery implements DiscoveryService { // (undocumented) getExternalBaseUrl(pluginId: string): Promise; // (undocumented) - getInstanceAddress(config: Config): { - internal: string; - external: string; - }; - // (undocumented) listResolutions(): Promise< Map< string, diff --git a/packages/backend-defaults/report-rootSystemMetadata.api.md b/packages/backend-defaults/report-rootSystemMetadata.api.md deleted file mode 100644 index f871282826..0000000000 --- a/packages/backend-defaults/report-rootSystemMetadata.api.md +++ /dev/null @@ -1,40 +0,0 @@ -## API Report File for "@backstage/backend-defaults" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts -import { LoggerService } from '@backstage/backend-plugin-api'; -import { RootConfigService } from '@backstage/backend-plugin-api'; -import { RootInstanceMetadataService } from '@backstage/backend-plugin-api'; -import { RootSystemMetadataService } from '@backstage/backend-plugin-api'; -import { RootSystemMetadataServicePluginInfo } from '@backstage/backend-plugin-api'; -import { ServiceFactory } from '@backstage/backend-plugin-api'; - -// @alpha (undocumented) -export class DefaultRootSystemMetadataService - implements RootSystemMetadataService -{ - constructor(options: { - logger: LoggerService; - config: RootConfigService; - instanceMetadata: RootInstanceMetadataService; - }); - // (undocumented) - static create(pluginEnv: { - logger: LoggerService; - config: RootConfigService; - instanceMetadata: RootInstanceMetadataService; - }): DefaultRootSystemMetadataService; - // (undocumented) - getInstalledPlugins(): Promise; -} - -// @alpha -export const rootSystemMetadataServiceFactory: ServiceFactory< - RootSystemMetadataService, - 'root', - 'singleton' ->; - -// (No @packageDocumentation comment for this package) -``` diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 4b85464640..4b201fded3 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -39,8 +39,6 @@ import { actionsRegistryServiceFactory, actionsServiceFactory, } from '@backstage/backend-defaults/alpha'; -import { instanceMetadataServiceFactory } from './alpha/entrypoints/instanceMetadata/instanceMetadataServiceFactory'; -import { rootSystemMetadataServiceFactory } from './entrypoints/rootSystemMetadata'; export const defaultServiceFactories = [ auditorServiceFactory, @@ -63,14 +61,10 @@ export const defaultServiceFactories = [ userInfoServiceFactory, urlReaderServiceFactory, eventsServiceFactory, - rootSystemMetadataServiceFactory, // alpha services actionsRegistryServiceFactory, actionsServiceFactory, - - // Unexported alpha services kept around for compatibility reasons - instanceMetadataServiceFactory, ]; /** diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts similarity index 96% rename from packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts rename to packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts index a440828362..13da5ae3c0 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/RootSystemMetadataService.test.ts @@ -23,6 +23,7 @@ import { import Router from 'express-promise-router'; import request from 'supertest'; import { rootSystemMetadataServiceFactory } from './rootSystemMetadataServiceFactory'; +import { rootSystemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; describe('SystemMetadataService', () => { describe('returns plugins from config', () => { @@ -31,7 +32,7 @@ describe('SystemMetadataService', () => { register(reg) { reg.registerInit({ deps: { - systemMetadata: coreServices.rootSystemMetadata, + systemMetadata: rootSystemMetadataServiceRef, rootHttpRouter: coreServices.rootHttpRouter, }, init: async ({ systemMetadata, rootHttpRouter }) => { diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/index.ts b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/index.ts similarity index 100% rename from packages/backend-defaults/src/entrypoints/rootSystemMetadata/index.ts rename to packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/index.ts diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts similarity index 94% rename from packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts rename to packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts index be1ab6b818..69bd676fe7 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts @@ -18,10 +18,12 @@ import { LoggerService, RootConfigService, RootInstanceMetadataService, +} from '@backstage/backend-plugin-api'; +import { HostDiscovery } from '../../../../entrypoints/discovery'; +import { RootSystemMetadataService, RootSystemMetadataServicePluginInfo, -} from '@backstage/backend-plugin-api'; -import { HostDiscovery } from '../../discovery'; +} from '@backstage/backend-plugin-api/alpha'; /** * @alpha diff --git a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts similarity index 91% rename from packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts rename to packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts index 62cd8bf3bc..5ee93d03d5 100644 --- a/packages/backend-defaults/src/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/rootSystemMetadataServiceFactory.ts @@ -19,6 +19,7 @@ import { createServiceFactory, } from '@backstage/backend-plugin-api'; import { DefaultRootSystemMetadataService } from './lib/DefaultRootSystemMetadataService'; +import { rootSystemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; /** * Metadata about an entire Backstage system, a collection of Backstage instances. @@ -26,7 +27,7 @@ import { DefaultRootSystemMetadataService } from './lib/DefaultRootSystemMetadat * @alpha */ export const rootSystemMetadataServiceFactory = createServiceFactory({ - service: coreServices.rootSystemMetadata, + service: rootSystemMetadataServiceRef, deps: { logger: coreServices.rootLogger, config: coreServices.rootConfig, diff --git a/packages/backend-defaults/src/alpha/index.ts b/packages/backend-defaults/src/alpha/index.ts index da63aef9de..c17e0e71cb 100644 --- a/packages/backend-defaults/src/alpha/index.ts +++ b/packages/backend-defaults/src/alpha/index.ts @@ -16,3 +16,4 @@ export { actionsRegistryServiceFactory } from './entrypoints/actionsRegistry'; export { actionsServiceFactory } from './entrypoints/actions'; +export { rootSystemMetadataServiceFactory } from './entrypoints/rootSystemMetadata'; diff --git a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts index bb2e002b0d..34b521b310 100644 --- a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts +++ b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts @@ -214,7 +214,7 @@ export class HostDiscovery implements DiscoveryService { return _targets; } - getInstanceAddress(config: Config) { + #getInstanceAddress(config: Config) { const backendBaseUrl = trimEnd(config.getString('backend.baseUrl'), '/'); const { @@ -248,7 +248,7 @@ export class HostDiscovery implements DiscoveryService { } #updateFallbackResolvers(config: Config) { - const { internal, external } = this.getInstanceAddress(config); + const { internal, external } = this.#getInstanceAddress(config); this.#internalFallbackResolver = this.#makeResolver( `${internal}/api/{{pluginId}}`, diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md index 17a407a4eb..c46ed254c8 100644 --- a/packages/backend-plugin-api/report.api.md +++ b/packages/backend-plugin-api/report.api.md @@ -237,11 +237,6 @@ export namespace coreServices { 'root', 'singleton' >; - const rootSystemMetadata: ServiceRef< - RootSystemMetadataService, - 'root', - 'singleton' - >; } // @public @@ -633,20 +628,6 @@ export interface RootServiceFactoryOptions< service: ServiceRef; } -// @public (undocumented) -export interface RootSystemMetadataService { - // (undocumented) - getInstalledPlugins: () => Promise< - ReadonlyArray - >; -} - -// @public (undocumented) -export interface RootSystemMetadataServicePluginInfo { - // (undocumented) - readonly pluginId: string; -} - // @public export interface SchedulerService { createScheduledTaskRunner( diff --git a/packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts b/packages/backend-plugin-api/src/alpha/RootSystemMetadataService.ts similarity index 100% rename from packages/backend-plugin-api/src/services/definitions/RootSystemMetadataService.ts rename to packages/backend-plugin-api/src/alpha/RootSystemMetadataService.ts diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index 815b0ac8f9..f61e2bbaf1 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +export type { + RootSystemMetadataServicePluginInfo, + RootSystemMetadataService, +} from './RootSystemMetadataService'; + export type { ActionsRegistryService, ActionsRegistryActionOptions, @@ -22,11 +27,12 @@ export type { export type { ActionsService, ActionsServiceAction } from './ActionsService'; -export { actionsRegistryServiceRef, actionsServiceRef } from './refs'; - -import { createServiceRef } from '@backstage/backend-plugin-api'; - export type { BackstageInstance, SystemMetadataService, } from './services/definitions/SystemMetadataService'; +export { + actionsRegistryServiceRef, + actionsServiceRef, + rootSystemMetadataServiceRef, +} from './refs'; diff --git a/packages/backend-plugin-api/src/alpha/refs.ts b/packages/backend-plugin-api/src/alpha/refs.ts index cfbb215615..a890271364 100644 --- a/packages/backend-plugin-api/src/alpha/refs.ts +++ b/packages/backend-plugin-api/src/alpha/refs.ts @@ -45,3 +45,14 @@ export const actionsRegistryServiceRef = createServiceRef< >({ id: 'alpha.core.actionsRegistry', }); + +/** + * Read information about your current Backstage deployment. + * @alpha + */ +export const rootSystemMetadataServiceRef = createServiceRef< + import('./RootSystemMetadataService').RootSystemMetadataService +>({ + id: 'alpha.core.rootSystemMetadata', + scope: 'root', +}); diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index e5ad69e871..887b05ee4e 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -289,15 +289,4 @@ export namespace coreServices { id: 'core.rootInstanceMetadata', scope: 'root', }); - - /** - * Read information about your current Backstage deployment. - * @public - */ - export const rootSystemMetadata = createServiceRef< - import('./RootSystemMetadataService').RootSystemMetadataService - >({ - id: 'core.rootSystemMetadata', - scope: 'root', - }); } diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index d12395b636..6bcee4b043 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -72,10 +72,6 @@ export type { SchedulerServiceTaskScheduleDefinition, SchedulerServiceTaskScheduleDefinitionConfig, } from './SchedulerService'; -export type { - RootSystemMetadataServicePluginInfo, - RootSystemMetadataService, -} from './RootSystemMetadataService'; export type { UrlReaderService, UrlReaderServiceReadTreeOptions, diff --git a/packages/backend-test-utils/report.api.md b/packages/backend-test-utils/report.api.md index bfa46a3725..0dd46c30ac 100644 --- a/packages/backend-test-utils/report.api.md +++ b/packages/backend-test-utils/report.api.md @@ -38,7 +38,6 @@ import { RootHttpRouterService } from '@backstage/backend-plugin-api'; import { RootInstanceMetadataService } from '@backstage/backend-plugin-api'; import { RootLifecycleService } from '@backstage/backend-plugin-api'; import { RootLoggerService } from '@backstage/backend-plugin-api'; -import { RootSystemMetadataService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; @@ -383,19 +382,6 @@ export namespace mockServices { ) => ServiceMock; } // (undocumented) - export function rootSystemMetadata(): RootSystemMetadataService; - // (undocumented) - export namespace rootSystemMetadata { - const factory: () => ServiceFactory< - RootSystemMetadataService, - 'root', - 'singleton' | 'multiton' - >; - const mock: ( - partialImpl?: Partial | undefined, - ) => ServiceMock; - } - // (undocumented) export function scheduler(): SchedulerService; // (undocumented) export namespace scheduler { diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index 0c19bf40ca..d37c82fa6c 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -43,8 +43,6 @@ import { UserInfoService, coreServices, createServiceFactory, - RootLoggerService, - RootSystemMetadataService, } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { EventsService, eventsServiceRef } from '@backstage/plugin-events-node'; @@ -574,28 +572,4 @@ export namespace mockServices { rootInstanceMetadata, ); } - - export function rootSystemMetadata(): RootSystemMetadataService { - return { - getInstalledPlugins: () => Promise.resolve([]), - }; - } - export namespace rootSystemMetadata { - /** - * Creates a functional mock factory for the - * {@link @backstage/backend-plugin-api#coreServices.systemMetadata}. - */ - export const factory = simpleFactoryWithOptions( - coreServices.rootSystemMetadata, - rootSystemMetadata, - ); - /** - * Creates a mock of the - * {@link @backstage/backend-events-node#systemMetadata}, optionally - * with some given method implementations. - */ - export const mock = simpleMock(coreServices.rootSystemMetadata, () => ({ - getInstalledPlugins: jest.fn(), - })); - } } diff --git a/packages/backend-test-utils/src/wiring/TestBackend.ts b/packages/backend-test-utils/src/wiring/TestBackend.ts index 3dc1472fba..cdfa1fc695 100644 --- a/packages/backend-test-utils/src/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/wiring/TestBackend.ts @@ -88,7 +88,6 @@ export const defaultServiceFactories = [ mockServices.userInfo.factory(), mockServices.urlReader.factory(), mockServices.events.factory(), - mockServices.rootSystemMetadata.factory(), // Alpha services actionsRegistryServiceMock.factory(), diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 8f8fd106d6..b4d2862d6f 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -15,6 +15,7 @@ */ import { createBackend } from '@backstage/backend-defaults'; +import { rootSystemMetadataServiceFactory } from '@backstage/backend-defaults/alpha'; import { coreServices, createBackendFeatureLoader, @@ -70,6 +71,7 @@ backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); backend.add(import('./systemMetadataPlugin')); +backend.add(rootSystemMetadataServiceFactory); backend.add(import('@backstage/plugin-events-backend-module-google-pubsub')); backend.add(import('@backstage/plugin-mcp-actions-backend')); diff --git a/packages/backend/src/systemMetadataPlugin.ts b/packages/backend/src/systemMetadataPlugin.ts index 434e708073..df74962d6f 100644 --- a/packages/backend/src/systemMetadataPlugin.ts +++ b/packages/backend/src/systemMetadataPlugin.ts @@ -18,6 +18,7 @@ import { coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; +import { rootSystemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; import Router from 'express-promise-router'; /** @@ -29,7 +30,7 @@ export default createBackendPlugin({ register: reg => { reg.registerInit({ deps: { - systemMetadata: coreServices.rootSystemMetadata, + systemMetadata: rootSystemMetadataServiceRef, rootHttpRouter: coreServices.rootHttpRouter, }, async init({ systemMetadata, rootHttpRouter }) { From d924a5cd4f346e5e380641b4458123d3f8501994 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 11 Nov 2025 17:11:26 -0500 Subject: [PATCH 205/312] fix rebase issues Signed-off-by: aramissennyeydd --- packages/backend-test-utils/report.api.md | 2 +- packages/backend-test-utils/src/services/mockServices.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend-test-utils/report.api.md b/packages/backend-test-utils/report.api.md index 0dd46c30ac..da5002275b 100644 --- a/packages/backend-test-utils/report.api.md +++ b/packages/backend-test-utils/report.api.md @@ -352,7 +352,7 @@ export namespace mockServices { factory: () => ServiceFactory< RootInstanceMetadataService, 'root', - 'singleton' | 'multiton' + 'singleton' >; } // (undocumented) diff --git a/packages/backend-test-utils/src/services/mockServices.ts b/packages/backend-test-utils/src/services/mockServices.ts index d37c82fa6c..9e941db3bb 100644 --- a/packages/backend-test-utils/src/services/mockServices.ts +++ b/packages/backend-test-utils/src/services/mockServices.ts @@ -43,6 +43,7 @@ import { UserInfoService, coreServices, createServiceFactory, + RootLoggerService, } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { EventsService, eventsServiceRef } from '@backstage/plugin-events-node'; From 5ea6957a6d3da413805ebb098e28e71466e46780 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 12 Nov 2025 15:14:50 -0500 Subject: [PATCH 206/312] simplify implementation Signed-off-by: aramissennyeydd --- .../lib/DefaultRootSystemMetadataService.ts | 27 +++--- .../entrypoints/discovery/HostDiscovery.ts | 84 ++----------------- .../src/entrypoints/discovery/parsing.ts | 41 +++++++++ 3 files changed, 62 insertions(+), 90 deletions(-) create mode 100644 packages/backend-defaults/src/entrypoints/discovery/parsing.ts diff --git a/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts index 69bd676fe7..edbffdfb0e 100644 --- a/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/rootSystemMetadata/lib/DefaultRootSystemMetadataService.ts @@ -19,11 +19,17 @@ import { RootConfigService, RootInstanceMetadataService, } from '@backstage/backend-plugin-api'; -import { HostDiscovery } from '../../../../entrypoints/discovery'; import { RootSystemMetadataService, RootSystemMetadataServicePluginInfo, } from '@backstage/backend-plugin-api/alpha'; +import { getEndpoints } from '../../../../entrypoints/discovery/parsing'; +import { Config } from '@backstage/config'; + +function getPlugins(config: Config): string[] { + const endpoints = getEndpoints(config); + return Array.from(new Set(endpoints.flatMap(endpoint => endpoint.plugins))); +} /** * @alpha @@ -31,20 +37,17 @@ import { export class DefaultRootSystemMetadataService implements RootSystemMetadataService { - #hostDiscovery: HostDiscovery; + #plugins: string[]; #instanceMetadata: RootInstanceMetadataService; constructor(options: { logger: LoggerService; config: RootConfigService; instanceMetadata: RootInstanceMetadataService; }) { - this.#hostDiscovery = HostDiscovery.fromConfig(options.config, { - logger: options.logger, - }); - options.config.subscribe?.(() => { - this.#hostDiscovery = HostDiscovery.fromConfig(options.config, { - logger: options.logger, - }); + const { config } = options; + this.#plugins = getPlugins(config); + config.subscribe?.(() => { + this.#plugins = getPlugins(config); }); this.#instanceMetadata = options.instanceMetadata; } @@ -60,11 +63,7 @@ export class DefaultRootSystemMetadataService public async getInstalledPlugins(): Promise< RootSystemMetadataServicePluginInfo[] > { - const resolutions = await this.#hostDiscovery.listResolutions(); - const plugins = []; - for (const pluginId of resolutions.keys()) { - plugins.push({ pluginId }); - } + const plugins = this.#plugins.map(pluginId => ({ pluginId })); for (const plugin of await this.#instanceMetadata.getInstalledPlugins()) { plugins.push({ pluginId: plugin.pluginId }); diff --git a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts index 34b521b310..18ed72a085 100644 --- a/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts +++ b/packages/backend-defaults/src/entrypoints/discovery/HostDiscovery.ts @@ -23,6 +23,7 @@ import { import { readHttpServerOptions } from '../rootHttpRouter/http/config'; import { SrvResolvers } from './SrvResolvers'; import { trimEnd } from 'lodash'; +import { getEndpoints } from './parsing'; type Resolver = (pluginId: string) => Promise; @@ -150,11 +151,6 @@ export class HostDiscovery implements DiscoveryService { throw new Error('Not initialized'); }; - #resolutions: Map< - string, - Set<{ hash: string; target: { internal?: string; external?: string } }> - > = new Map(); - static fromConfig(config: RootConfigService, options?: HostDiscoveryOptions) { const discovery = new HostDiscovery(new SrvResolvers()); @@ -198,23 +194,12 @@ export class HostDiscovery implements DiscoveryService { return await resolver(pluginId); } - async listResolutions() { - const _targets: Map = - new Map(); - for (const [pluginId, targets] of this.#resolutions.entries()) { - const currentTargets = [...targets.values()].map(({ target }) => ({ - ...target, - })); - if (_targets.has(pluginId)) { - _targets.set(pluginId, [..._targets.get(pluginId)!, ...currentTargets]); - } else { - _targets.set(pluginId, currentTargets); - } - } - return _targets; + #updateResolvers(config: Config, defaultEndpoints?: HostDiscoveryEndpoint[]) { + this.#updateFallbackResolvers(config); + this.#updatePluginResolvers(config, defaultEndpoints); } - #getInstanceAddress(config: Config) { + #updateFallbackResolvers(config: Config) { const backendBaseUrl = trimEnd(config.getString('backend.baseUrl'), '/'); const { @@ -236,26 +221,12 @@ export class HostDiscovery implements DiscoveryService { host = `[${host}]`; } - return { - internal: `${protocol}://${host}:${listenPort}`, - external: backendBaseUrl, - }; - } - - #updateResolvers(config: Config, defaultEndpoints?: HostDiscoveryEndpoint[]) { - this.#updateFallbackResolvers(config); - this.#updatePluginResolvers(config, defaultEndpoints); - } - - #updateFallbackResolvers(config: Config) { - const { internal, external } = this.#getInstanceAddress(config); - this.#internalFallbackResolver = this.#makeResolver( - `${internal}/api/{{pluginId}}`, + `${protocol}://${host}:${listenPort}/api/{{pluginId}}`, false, ); this.#externalFallbackResolver = this.#makeResolver( - `${external}/api/{{pluginId}}`, + `${backendBaseUrl}/api/{{pluginId}}`, false, ); } @@ -268,25 +239,7 @@ export class HostDiscovery implements DiscoveryService { const endpoints = defaultEndpoints?.slice() ?? []; // Allow config to override the default endpoints - const endpointConfigs = config.getOptionalConfigArray( - 'discovery.endpoints', - ); - for (const endpointConfig of endpointConfigs ?? []) { - if (typeof endpointConfig.get('target') === 'string') { - endpoints.push({ - target: endpointConfig.getString('target'), - plugins: endpointConfig.getStringArray('plugins'), - }); - } else { - endpoints.push({ - target: { - internal: endpointConfig.getOptionalString('target.internal'), - external: endpointConfig.getOptionalString('target.external'), - }, - plugins: endpointConfig.getStringArray('plugins'), - }); - } - } + endpoints.push(...getEndpoints(config)); // Build up a new set of resolvers const internalResolvers: Map = new Map(); @@ -294,7 +247,6 @@ export class HostDiscovery implements DiscoveryService { for (const { target, plugins } of endpoints) { let internalResolver: Resolver | undefined; let externalResolver: Resolver | undefined; - this.#addResolution(target, plugins); if (typeof target === 'string') { internalResolver = externalResolver = this.#makeResolver(target, false); @@ -324,26 +276,6 @@ export class HostDiscovery implements DiscoveryService { this.#externalResolvers = externalResolvers; } - #addResolution( - target: string | { internal?: string; external?: string }, - plugins: string[], - ) { - for (const pluginId of plugins) { - if (!this.#resolutions.has(pluginId)) { - this.#resolutions.set(pluginId, new Set()); - } - const standardizedTarget = - typeof target === 'string' - ? { external: target, internal: target } - : target; - const matchingResolution = this.#resolutions.get(pluginId)!; - const hash = JSON.stringify(standardizedTarget); - if (![...matchingResolution.values()].some(e => e.hash === hash)) { - matchingResolution.add({ target: standardizedTarget, hash }); - } - } - } - #makeResolver(urlPattern: string, allowSrv: boolean): Resolver { const withPluginId = (pluginId: string, url: string) => { return url.replace( diff --git a/packages/backend-defaults/src/entrypoints/discovery/parsing.ts b/packages/backend-defaults/src/entrypoints/discovery/parsing.ts new file mode 100644 index 0000000000..3a02fc4f51 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/discovery/parsing.ts @@ -0,0 +1,41 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Config } from '@backstage/config'; +import type { HostDiscoveryEndpoint } from './HostDiscovery'; + +export function getEndpoints(config: Config): HostDiscoveryEndpoint[] { + const endpoints: HostDiscoveryEndpoint[] = []; + // Allow config to override the default endpoints + const endpointConfigs = config.getOptionalConfigArray('discovery.endpoints'); + for (const endpointConfig of endpointConfigs ?? []) { + if (typeof endpointConfig.get('target') === 'string') { + endpoints.push({ + target: endpointConfig.getString('target'), + plugins: endpointConfig.getStringArray('plugins'), + }); + } else { + endpoints.push({ + target: { + internal: endpointConfig.getOptionalString('target.internal'), + external: endpointConfig.getOptionalString('target.external'), + }, + plugins: endpointConfig.getStringArray('plugins'), + }); + } + } + return endpoints; +} From 3c6161d3ae3416122ff9612427155222e4c125d1 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 12 Nov 2025 15:17:35 -0500 Subject: [PATCH 207/312] delete system metadata custom plugin Signed-off-by: aramissennyeydd --- packages/backend/src/index.ts | 1 - packages/backend/src/systemMetadataPlugin.ts | 49 -------------------- 2 files changed, 50 deletions(-) delete mode 100644 packages/backend/src/systemMetadataPlugin.ts diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index b4d2862d6f..14eb36a3a6 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -70,7 +70,6 @@ backend.add(searchLoader); backend.add(import('@backstage/plugin-techdocs-backend')); backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); -backend.add(import('./systemMetadataPlugin')); backend.add(rootSystemMetadataServiceFactory); backend.add(import('@backstage/plugin-events-backend-module-google-pubsub')); diff --git a/packages/backend/src/systemMetadataPlugin.ts b/packages/backend/src/systemMetadataPlugin.ts deleted file mode 100644 index df74962d6f..0000000000 --- a/packages/backend/src/systemMetadataPlugin.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; -import { rootSystemMetadataServiceRef } from '@backstage/backend-plugin-api/alpha'; -import Router from 'express-promise-router'; - -/** - * Example plugin that shows how to reveal all installed plugins with the - * system metadata API. - */ -export default createBackendPlugin({ - pluginId: 'system-metadata-router', - register: reg => { - reg.registerInit({ - deps: { - systemMetadata: rootSystemMetadataServiceRef, - rootHttpRouter: coreServices.rootHttpRouter, - }, - async init({ systemMetadata, rootHttpRouter }) { - const router = Router(); - router.get('/plugins', async (_, res) => { - const plugins = (await systemMetadata.getInstalledPlugins()).toSorted( - (a, b) => a.pluginId.localeCompare(b.pluginId), - ); - res.json(plugins); - }); - - rootHttpRouter.use('/.backstage/systemMetadata', router); - }, - }); - }, -}); From 570b6ed13942aca8efc802f24a0407ca8f80b044 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 12 Nov 2025 15:43:12 -0500 Subject: [PATCH 208/312] fix report Signed-off-by: aramissennyeydd --- packages/backend-defaults/report-discovery.api.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/backend-defaults/report-discovery.api.md b/packages/backend-defaults/report-discovery.api.md index 8617d7d212..ddbbd9d025 100644 --- a/packages/backend-defaults/report-discovery.api.md +++ b/packages/backend-defaults/report-discovery.api.md @@ -26,16 +26,6 @@ export class HostDiscovery implements DiscoveryService { getBaseUrl(pluginId: string): Promise; // (undocumented) getExternalBaseUrl(pluginId: string): Promise; - // (undocumented) - listResolutions(): Promise< - Map< - string, - { - internal?: string; - external?: string; - }[] - > - >; } // @public From b8f6484ccda25a20a8ebdd1bddd1cde8ebe1b8dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 16:09:09 +0000 Subject: [PATCH 209/312] chore(deps): update postgres docker tag to v17.7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker-compose.deps.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.deps.yml b/docker-compose.deps.yml index 2ad65d6085..fa7937fdf1 100644 --- a/docker-compose.deps.yml +++ b/docker-compose.deps.yml @@ -2,7 +2,7 @@ name: backstage services: psql: - image: postgres:17.6 + image: postgres:17.7 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres From a16d8266b9143ec73ed663d261c2e011b6dc3334 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:09:47 +0000 Subject: [PATCH 210/312] chore(deps): update shiki monorepo to v3.17.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/yarn.lock | 96 +++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index e525cab8a2..51f0c36643 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -1153,74 +1153,74 @@ __metadata: languageName: node linkType: hard -"@shikijs/core@npm:3.13.0": - version: 3.13.0 - resolution: "@shikijs/core@npm:3.13.0" +"@shikijs/core@npm:3.19.0": + version: 3.19.0 + resolution: "@shikijs/core@npm:3.19.0" dependencies: - "@shikijs/types": "npm:3.13.0" + "@shikijs/types": "npm:3.19.0" "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" hast-util-to-html: "npm:^9.0.5" - checksum: 10/c9b301a170cd76fa2ce446adee26b539b19204107a2e60207f3f5e7d96773df322367f6035e2d689d43f97a3e9f741793e976c366015d8e3a9709dcac1399af2 + checksum: 10/78fc5f849636459e267cd77f3e60b492c8260a8be9449d3b1b3a463eab22153354ca6c961e021f936cb8251695298d85913b2cb3b31aafa343fdddadebbfed1c languageName: node linkType: hard -"@shikijs/engine-javascript@npm:3.13.0": - version: 3.13.0 - resolution: "@shikijs/engine-javascript@npm:3.13.0" +"@shikijs/engine-javascript@npm:3.19.0": + version: 3.19.0 + resolution: "@shikijs/engine-javascript@npm:3.19.0" dependencies: - "@shikijs/types": "npm:3.13.0" + "@shikijs/types": "npm:3.19.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - oniguruma-to-es: "npm:^4.3.3" - checksum: 10/acd4e78fdc732738c6a3a9f254011b7d8995a2149f2f72f7396d5e4514f3b0c3fdc767d52bf8852d65066e613dd8d1157bc4900442ab42684db7ef7396a44871 + oniguruma-to-es: "npm:^4.3.4" + checksum: 10/7b493cfce620976efd1d7cb3df946370897cac0c16fb71b089be9e197fde43ee60a3d1317db45820c61bcae47ae8e4ac4df91555454e733cd239dc064ef6cc03 languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:3.13.0": - version: 3.13.0 - resolution: "@shikijs/engine-oniguruma@npm:3.13.0" +"@shikijs/engine-oniguruma@npm:3.19.0": + version: 3.19.0 + resolution: "@shikijs/engine-oniguruma@npm:3.19.0" dependencies: - "@shikijs/types": "npm:3.13.0" + "@shikijs/types": "npm:3.19.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10/bc7f1c69640ccece9a3ac3f3adc9cebde9c24bcd722747cc464c338a32725af2b9087a42646cd0f56fbea98d99414918c558f2ca0beadc13db0a740183e7707f + checksum: 10/6bf6e35aa61f62b1a532071d11e1937a67fb68469c1886ab3c06c6d384b8feee589973ee101cbebefad9ff9405040ee640ced429e83b9dddd906f07d994a1939 languageName: node linkType: hard -"@shikijs/langs@npm:3.13.0": - version: 3.13.0 - resolution: "@shikijs/langs@npm:3.13.0" +"@shikijs/langs@npm:3.19.0": + version: 3.19.0 + resolution: "@shikijs/langs@npm:3.19.0" dependencies: - "@shikijs/types": "npm:3.13.0" - checksum: 10/2a0478246ce61745d9012cf5051c9790ef5afad6c89fe5716be4a81d04d7dfd9ffc90af0bad0be0061111bfc001a3bc0c55ffd4fc0b82bc1c09a4c33d7b593ca + "@shikijs/types": "npm:3.19.0" + checksum: 10/679d61b89132c858bd1e96fc7a46fbae56dc8e9be176586cabb57cd9504bb7ea45bbd22879f63d822957060fe322302ad9824b9a6f18415a86b54e22347c0c2d languageName: node linkType: hard -"@shikijs/themes@npm:3.13.0": - version: 3.13.0 - resolution: "@shikijs/themes@npm:3.13.0" +"@shikijs/themes@npm:3.19.0": + version: 3.19.0 + resolution: "@shikijs/themes@npm:3.19.0" dependencies: - "@shikijs/types": "npm:3.13.0" - checksum: 10/4ab0ecf1ddb35e387cef22e267cdf3ed7548a84f24ad58885d19401f75cc01a5a10152ee0196222e01cead8202f20012615aa0076f798599f7dfc2bb7beaa617 + "@shikijs/types": "npm:3.19.0" + checksum: 10/7eb53912fe8b877e6fc498c937188ae55b960c681f65cd4201f2c3a919b0f5951f9ce090819ded5dc4eb0aabe7a811ba705a19b5c003e0dbfebad08d1ba535d5 languageName: node linkType: hard "@shikijs/transformers@npm:^3.13.0": - version: 3.13.0 - resolution: "@shikijs/transformers@npm:3.13.0" + version: 3.19.0 + resolution: "@shikijs/transformers@npm:3.19.0" dependencies: - "@shikijs/core": "npm:3.13.0" - "@shikijs/types": "npm:3.13.0" - checksum: 10/30f3e66334b60320dc976b9f645f823ba13b312aead4c891ae6db23d076f1570dad488443f603fb5eecd5937973ba7c2907da6678ccae2363a66e0c5b173bb02 + "@shikijs/core": "npm:3.19.0" + "@shikijs/types": "npm:3.19.0" + checksum: 10/813c2e4053007a8516ebae8c06f4fa2e7b42c6570ea4cae88ecd8bb749695be023ca3b271f8152559dbb74ed36404a77f76c14f63632dc44f225d963a446b1d1 languageName: node linkType: hard -"@shikijs/types@npm:3.13.0": - version: 3.13.0 - resolution: "@shikijs/types@npm:3.13.0" +"@shikijs/types@npm:3.19.0": + version: 3.19.0 + resolution: "@shikijs/types@npm:3.19.0" dependencies: "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" - checksum: 10/a57cc95847edd84134166de1f11a044e356581834b2dfd75dcd67f2221aef6f20f505839c090a76b7c8e0a79d7d5cee829de50d261f363a633ae9afca29546c4 + checksum: 10/3f0e79f2ecbb0754ad08626e14313701a15dd1dbda1a1295d1e35a172b4555339a135118fabcc3ebdbf5017ceb64dbe3e5096268c3034c0c91ba3b0848e4b162 languageName: node linkType: hard @@ -5537,14 +5537,14 @@ __metadata: languageName: node linkType: hard -"oniguruma-to-es@npm:^4.3.3": - version: 4.3.3 - resolution: "oniguruma-to-es@npm:4.3.3" +"oniguruma-to-es@npm:^4.3.4": + version: 4.3.4 + resolution: "oniguruma-to-es@npm:4.3.4" dependencies: oniguruma-parser: "npm:^0.12.1" regex: "npm:^6.0.1" regex-recursion: "npm:^6.0.2" - checksum: 10/49b372569d335077c32bda066ac1da4a3f15dd25b717025cf43417fabd71d56e1152debcd8a832596e180d721b808822c88e65eb12abb26665ab8fe017f3c861 + checksum: 10/29be3f677cd948da7ea77c5ad62d0405daec58b015b4e4706c97d9f3dcd3a82a68a7314b90ec5dcd261a934aca9aa0bd8100180e2cbd252bc8a20e32fc9ab851 languageName: node linkType: hard @@ -6312,18 +6312,18 @@ __metadata: linkType: hard "shiki@npm:^3.13.0": - version: 3.13.0 - resolution: "shiki@npm:3.13.0" + version: 3.19.0 + resolution: "shiki@npm:3.19.0" dependencies: - "@shikijs/core": "npm:3.13.0" - "@shikijs/engine-javascript": "npm:3.13.0" - "@shikijs/engine-oniguruma": "npm:3.13.0" - "@shikijs/langs": "npm:3.13.0" - "@shikijs/themes": "npm:3.13.0" - "@shikijs/types": "npm:3.13.0" + "@shikijs/core": "npm:3.19.0" + "@shikijs/engine-javascript": "npm:3.19.0" + "@shikijs/engine-oniguruma": "npm:3.19.0" + "@shikijs/langs": "npm:3.19.0" + "@shikijs/themes": "npm:3.19.0" + "@shikijs/types": "npm:3.19.0" "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" - checksum: 10/8d7cd039ac8df548f724047b4ba81cd84c09e8b96f411eb7c781d3d105c96ff2ec6f64e1bac724fd6fc56ac2926322bc2466124ea279d04c5ef668d5a04219bb + checksum: 10/004dabc26a9db25c69f1aa6ed0555c8a5a34153084a1aa5f42fa03edf800ca13dd468ad6d7ba4cbf8f36dc8d316a7de29cecec228ea8d2d252f4c4c95eb162e6 languageName: node linkType: hard From a2f8df6b342d4392fa3de21851e93e92892287e1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:10:34 +0000 Subject: [PATCH 211/312] chore(deps): update swc monorepo Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- microsite/yarn.lock | 96 +++++++++++------------ yarn.lock | 186 ++++++++++++++++++++++++++++---------------- 2 files changed, 165 insertions(+), 117 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index c8f753d8a9..e15b1a6b93 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2961,92 +2961,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-darwin-arm64@npm:1.11.24" +"@swc/core-darwin-arm64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-darwin-arm64@npm:1.15.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-darwin-x64@npm:1.11.24" +"@swc/core-darwin-x64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-darwin-x64@npm:1.15.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.11.24" +"@swc/core-linux-arm-gnueabihf@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.3" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-arm64-gnu@npm:1.11.24" +"@swc/core-linux-arm64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm64-gnu@npm:1.15.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-arm64-musl@npm:1.11.24" +"@swc/core-linux-arm64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm64-musl@npm:1.15.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-x64-gnu@npm:1.11.24" +"@swc/core-linux-x64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-x64-gnu@npm:1.15.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-x64-musl@npm:1.11.24" +"@swc/core-linux-x64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-x64-musl@npm:1.15.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-win32-arm64-msvc@npm:1.11.24" +"@swc/core-win32-arm64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-arm64-msvc@npm:1.15.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-win32-ia32-msvc@npm:1.11.24" +"@swc/core-win32-ia32-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-ia32-msvc@npm:1.15.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-win32-x64-msvc@npm:1.11.24" +"@swc/core-win32-x64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-x64-msvc@npm:1.15.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.11.24 - resolution: "@swc/core@npm:1.11.24" + version: 1.15.3 + resolution: "@swc/core@npm:1.15.3" dependencies: - "@swc/core-darwin-arm64": "npm:1.11.24" - "@swc/core-darwin-x64": "npm:1.11.24" - "@swc/core-linux-arm-gnueabihf": "npm:1.11.24" - "@swc/core-linux-arm64-gnu": "npm:1.11.24" - "@swc/core-linux-arm64-musl": "npm:1.11.24" - "@swc/core-linux-x64-gnu": "npm:1.11.24" - "@swc/core-linux-x64-musl": "npm:1.11.24" - "@swc/core-win32-arm64-msvc": "npm:1.11.24" - "@swc/core-win32-ia32-msvc": "npm:1.11.24" - "@swc/core-win32-x64-msvc": "npm:1.11.24" + "@swc/core-darwin-arm64": "npm:1.15.3" + "@swc/core-darwin-x64": "npm:1.15.3" + "@swc/core-linux-arm-gnueabihf": "npm:1.15.3" + "@swc/core-linux-arm64-gnu": "npm:1.15.3" + "@swc/core-linux-arm64-musl": "npm:1.15.3" + "@swc/core-linux-x64-gnu": "npm:1.15.3" + "@swc/core-linux-x64-musl": "npm:1.15.3" + "@swc/core-win32-arm64-msvc": "npm:1.15.3" + "@swc/core-win32-ia32-msvc": "npm:1.15.3" + "@swc/core-win32-x64-msvc": "npm:1.15.3" "@swc/counter": "npm:^0.1.3" - "@swc/types": "npm:^0.1.21" + "@swc/types": "npm:^0.1.25" peerDependencies: "@swc/helpers": ">=0.5.17" dependenciesMeta: @@ -3073,7 +3073,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/0b3e883f8a5652a7ab221a777386ccc8a65fc5b53d533bad15b703b22984eb3b449efd907b1872263f1a9990a9a50612f3c6deb619894a43f03cd974ec9bd1b7 + checksum: 10/280330d82328818138ed64fdcf9ea9abde6b6f16eca65a9d4db27dde06a8dfffd2649f3447d2243387277513c7430fa4142cafcfd64e943d682ce6a713cb8c2d languageName: node linkType: hard @@ -3084,12 +3084,12 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:^0.1.21": - version: 0.1.21 - resolution: "@swc/types@npm:0.1.21" +"@swc/types@npm:^0.1.25": + version: 0.1.25 + resolution: "@swc/types@npm:0.1.25" dependencies: "@swc/counter": "npm:^0.1.3" - checksum: 10/6554bf5c78519f49099a2ba448d170191a14b1c7a35df848f10ee4d6c03ecd681e5213884905187de1d1d221589ec8b5cb77f477d099dc1627c3ec9d7f2fcdb0 + checksum: 10/f6741450224892d12df43e5ca7f3cc0287df644dcd672626eb0cc2a3a8e3e875f4b29eb11336f37c7240cf6e010ba59eb3a79f4fb8bee5cbd168dfc1326ff369 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 970df5e809..0a047009da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9971,12 +9971,12 @@ __metadata: languageName: node linkType: hard -"@jest/create-cache-key-function@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/create-cache-key-function@npm:29.7.0" +"@jest/create-cache-key-function@npm:^30.0.0": + version: 30.2.0 + resolution: "@jest/create-cache-key-function@npm:30.2.0" dependencies: - "@jest/types": "npm:^29.6.3" - checksum: 10/061ef63b13ec8c8e5d08e4456f03b5cf8c7f9c1cab4fed8402e1479153cafce6eea80420e308ef62027abb7e29b825fcfa06551856bd021d98e92e381bf91723 + "@jest/types": "npm:30.2.0" + checksum: 10/7a2dd0efe747c1b2e61825e51ace11e42f278203fae37a3b9462c8d2132394978682ed7094f5ce3d9f5a9e5f2855e6d1d933e5f3ac5165b127c36591f3d98d85 languageName: node linkType: hard @@ -10037,6 +10037,16 @@ __metadata: languageName: node linkType: hard +"@jest/pattern@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/pattern@npm:30.0.1" + dependencies: + "@types/node": "npm:*" + jest-regex-util: "npm:30.0.1" + checksum: 10/afd03b4d3eadc9c9970cf924955dee47984a7e767901fe6fa463b17b246f0ddeec07b3e82c09715c54bde3c8abb92074160c0d79967bd23778724f184e7f5b7b + languageName: node + linkType: hard + "@jest/reporters@npm:^29.7.0": version: 29.7.0 resolution: "@jest/reporters@npm:29.7.0" @@ -10074,6 +10084,15 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/schemas@npm:30.0.5" + dependencies: + "@sinclair/typebox": "npm:^0.34.0" + checksum: 10/40df4db55d4aeed09d1c7e19caf23788309cea34490a1c5d584c913494195e698b9967e996afc27226cac6d76e7512fe73ae6b9584480695c60dd18a5459cdba + languageName: node + linkType: hard + "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -10141,6 +10160,21 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:30.2.0": + version: 30.2.0 + resolution: "@jest/types@npm:30.2.0" + dependencies: + "@jest/pattern": "npm:30.0.1" + "@jest/schemas": "npm:30.0.5" + "@types/istanbul-lib-coverage": "npm:^2.0.6" + "@types/istanbul-reports": "npm:^3.0.4" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.33" + chalk: "npm:^4.1.2" + checksum: 10/f50fcaea56f873a51d19254ab16762f2ea8ca88e3e08da2e496af5da2b67c322915a4fcd0153803cc05063ffe87ebef2ab4330e0a1b06ab984a26c916cbfc26b + languageName: node + linkType: hard + "@jest/types@npm:^29.6.3": version: 29.6.3 resolution: "@jest/types@npm:29.6.3" @@ -17312,6 +17346,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.34.0": + version: 0.34.41 + resolution: "@sinclair/typebox@npm:0.34.41" + checksum: 10/5c04a7f42156a7813a159947a0c3fe7e9f11aa722141ac3ff32242faf031b443ef71763d8791ce8d01bd5856770de51fd6fcda94b3a51558ba1f6d5112fa33f4 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^0.14.0": version: 0.14.0 resolution: "@sindresorhus/is@npm:0.14.0" @@ -19639,92 +19680,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-darwin-arm64@npm:1.11.24" +"@swc/core-darwin-arm64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-darwin-arm64@npm:1.15.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-darwin-x64@npm:1.11.24" +"@swc/core-darwin-x64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-darwin-x64@npm:1.15.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.11.24" +"@swc/core-linux-arm-gnueabihf@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.3" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-arm64-gnu@npm:1.11.24" +"@swc/core-linux-arm64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm64-gnu@npm:1.15.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-arm64-musl@npm:1.11.24" +"@swc/core-linux-arm64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-arm64-musl@npm:1.15.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-x64-gnu@npm:1.11.24" +"@swc/core-linux-x64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-x64-gnu@npm:1.15.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-linux-x64-musl@npm:1.11.24" +"@swc/core-linux-x64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-linux-x64-musl@npm:1.15.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-win32-arm64-msvc@npm:1.11.24" +"@swc/core-win32-arm64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-arm64-msvc@npm:1.15.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-win32-ia32-msvc@npm:1.11.24" +"@swc/core-win32-ia32-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-ia32-msvc@npm:1.15.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.11.24": - version: 1.11.24 - resolution: "@swc/core-win32-x64-msvc@npm:1.11.24" +"@swc/core-win32-x64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/core-win32-x64-msvc@npm:1.15.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.11.24 - resolution: "@swc/core@npm:1.11.24" + version: 1.15.3 + resolution: "@swc/core@npm:1.15.3" dependencies: - "@swc/core-darwin-arm64": "npm:1.11.24" - "@swc/core-darwin-x64": "npm:1.11.24" - "@swc/core-linux-arm-gnueabihf": "npm:1.11.24" - "@swc/core-linux-arm64-gnu": "npm:1.11.24" - "@swc/core-linux-arm64-musl": "npm:1.11.24" - "@swc/core-linux-x64-gnu": "npm:1.11.24" - "@swc/core-linux-x64-musl": "npm:1.11.24" - "@swc/core-win32-arm64-msvc": "npm:1.11.24" - "@swc/core-win32-ia32-msvc": "npm:1.11.24" - "@swc/core-win32-x64-msvc": "npm:1.11.24" + "@swc/core-darwin-arm64": "npm:1.15.3" + "@swc/core-darwin-x64": "npm:1.15.3" + "@swc/core-linux-arm-gnueabihf": "npm:1.15.3" + "@swc/core-linux-arm64-gnu": "npm:1.15.3" + "@swc/core-linux-arm64-musl": "npm:1.15.3" + "@swc/core-linux-x64-gnu": "npm:1.15.3" + "@swc/core-linux-x64-musl": "npm:1.15.3" + "@swc/core-win32-arm64-msvc": "npm:1.15.3" + "@swc/core-win32-ia32-msvc": "npm:1.15.3" + "@swc/core-win32-x64-msvc": "npm:1.15.3" "@swc/counter": "npm:^0.1.3" - "@swc/types": "npm:^0.1.21" + "@swc/types": "npm:^0.1.25" peerDependencies: "@swc/helpers": ">=0.5.17" dependenciesMeta: @@ -19751,7 +19792,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/0b3e883f8a5652a7ab221a777386ccc8a65fc5b53d533bad15b703b22984eb3b449efd907b1872263f1a9990a9a50612f3c6deb619894a43f03cd974ec9bd1b7 + checksum: 10/280330d82328818138ed64fdcf9ea9abde6b6f16eca65a9d4db27dde06a8dfffd2649f3447d2243387277513c7430fa4142cafcfd64e943d682ce6a713cb8c2d languageName: node linkType: hard @@ -19772,24 +19813,24 @@ __metadata: linkType: hard "@swc/jest@npm:^0.2.22": - version: 0.2.38 - resolution: "@swc/jest@npm:0.2.38" + version: 0.2.39 + resolution: "@swc/jest@npm:0.2.39" dependencies: - "@jest/create-cache-key-function": "npm:^29.7.0" + "@jest/create-cache-key-function": "npm:^30.0.0" "@swc/counter": "npm:^0.1.3" jsonc-parser: "npm:^3.2.0" peerDependencies: "@swc/core": "*" - checksum: 10/3aaf557425e806890ebefea35334b7795e9f8ddf6f82d634d865ef917333cca4208190af1a9610c134c0e3b7a6a1aea4ec77a659e3ca5965be7aace65ce80c97 + checksum: 10/a2b7ed6fbb908867e673d1bbff9efde7eee225a57ad75735216ce2005e40c5cfb92285bd807d2058f1c0317e3d48ed71f5577fe85b28bebc80c1bc2c3a03306e languageName: node linkType: hard -"@swc/types@npm:^0.1.21": - version: 0.1.21 - resolution: "@swc/types@npm:0.1.21" +"@swc/types@npm:^0.1.25": + version: 0.1.25 + resolution: "@swc/types@npm:0.1.25" dependencies: "@swc/counter": "npm:^0.1.3" - checksum: 10/6554bf5c78519f49099a2ba448d170191a14b1c7a35df848f10ee4d6c03ecd681e5213884905187de1d1d221589ec8b5cb77f477d099dc1627c3ec9d7f2fcdb0 + checksum: 10/f6741450224892d12df43e5ca7f3cc0287df644dcd672626eb0cc2a3a8e3e875f4b29eb11336f37c7240cf6e010ba59eb3a79f4fb8bee5cbd168dfc1326ff369 languageName: node linkType: hard @@ -20815,10 +20856,10 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.1 - resolution: "@types/istanbul-lib-coverage@npm:2.0.1" - checksum: 10/7de11cd954a764985722baddbc11da59109647d800455a7593d696b7763a867c9f1aa2777724cfa493058769617fe09bba90a813086dc322dd540f55fb8207d9 +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.6": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10/3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 languageName: node linkType: hard @@ -20831,12 +20872,12 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/istanbul-reports@npm:3.0.0" +"@types/istanbul-reports@npm:^3.0.0, @types/istanbul-reports@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" dependencies: "@types/istanbul-lib-report": "npm:*" - checksum: 10/286a18cff19c4dac4321b9ea406a3560faf577fb2a4df5abf9d577fa81ba831c9baa7d40d03f1daf7fe613d468546b731c00b844b72fad9834c583311a35bb7b + checksum: 10/93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 languageName: node linkType: hard @@ -21970,12 +22011,12 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^17.0.8": - version: 17.0.12 - resolution: "@types/yargs@npm:17.0.12" +"@types/yargs@npm:^17.0.33, @types/yargs@npm:^17.0.8": + version: 17.0.35 + resolution: "@types/yargs@npm:17.0.35" dependencies: "@types/yargs-parser": "npm:*" - checksum: 10/ffbbfad0c75cc058e0518f202e3651b9fb60c7c1325240cc72ac0a022da746a759ba3c6e0099152076fed5012fb694eb4685e4520c04dc8399c22bb81221bff5 + checksum: 10/47bcd4476a4194ea11617ea71cba8a1eddf5505fc39c44336c1a08d452a0de4486aedbc13f47a017c8efbcb5a8aa358d976880663732ebcbc6dbcbbecadb0581 languageName: node linkType: hard @@ -35097,6 +35138,13 @@ __metadata: languageName: node linkType: hard +"jest-regex-util@npm:30.0.1": + version: 30.0.1 + resolution: "jest-regex-util@npm:30.0.1" + checksum: 10/fa8dac80c3e94db20d5e1e51d1bdf101cf5ede8f4e0b8f395ba8b8ea81e71804ffd747452a6bb6413032865de98ac656ef8ae43eddd18d980b6442a2764ed562 + languageName: node + linkType: hard + "jest-regex-util@npm:^29.6.3": version: 29.6.3 resolution: "jest-regex-util@npm:29.6.3" From bea0f00ccf86e8d34892de4e4ef648a12ca9fc90 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:05:21 +0000 Subject: [PATCH 212/312] chore(deps): update stefanbuck/github-issue-parser digest to 25f1485 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/issue.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index ac8202ad74..f733f85485 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -38,7 +38,7 @@ jobs: # These two steps add labels based on user input in the issue form - name: Parse issue form - uses: stefanbuck/github-issue-parser@2ea9b35a8c584529ed00891a8f7e41dc46d0441e # v3 + uses: stefanbuck/github-issue-parser@25f1485edffc1fee3ea68eb9f59a72e58720ffc4 # v3 id: issue-parser with: template-path: .github/ISSUE_TEMPLATE/.common.yaml From feb70c3395b52ffbb5c58c000eea5563e8702c3f Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 3 Dec 2025 14:57:50 -0500 Subject: [PATCH 213/312] fix api reports Signed-off-by: aramissennyeydd --- packages/backend-defaults/report-alpha.api.md | 8 ------- .../backend-plugin-api/report-alpha.api.md | 21 +++++++++++++++++++ .../backend-plugin-api/src/alpha/index.ts | 4 ---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index c6316780e5..c40517863a 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -5,7 +5,6 @@ ```ts import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; import { ActionsService } from '@backstage/backend-plugin-api/alpha'; -import { InstanceMetadataService } from '@backstage/backend-plugin-api/alpha'; import { RootSystemMetadataService } from '@backstage/backend-plugin-api/alpha'; import { ServiceFactory } from '@backstage/backend-plugin-api'; @@ -23,13 +22,6 @@ export const actionsServiceFactory: ServiceFactory< 'singleton' >; -// @alpha @deprecated (undocumented) -export const instanceMetadataServiceFactory: ServiceFactory< - InstanceMetadataService, - 'root', - 'singleton' ->; - // @alpha export const rootSystemMetadataServiceFactory: ServiceFactory< RootSystemMetadataService, diff --git a/packages/backend-plugin-api/report-alpha.api.md b/packages/backend-plugin-api/report-alpha.api.md index cefed593c0..e06e0c45d2 100644 --- a/packages/backend-plugin-api/report-alpha.api.md +++ b/packages/backend-plugin-api/report-alpha.api.md @@ -103,5 +103,26 @@ export const actionsServiceRef: ServiceRef< 'singleton' >; +// @public (undocumented) +export interface RootSystemMetadataService { + // (undocumented) + getInstalledPlugins: () => Promise< + ReadonlyArray + >; +} + +// @public (undocumented) +export interface RootSystemMetadataServicePluginInfo { + // (undocumented) + readonly pluginId: string; +} + +// @alpha +export const rootSystemMetadataServiceRef: ServiceRef< + RootSystemMetadataService, + 'root', + 'singleton' +>; + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index f61e2bbaf1..56f02f5275 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -27,10 +27,6 @@ export type { export type { ActionsService, ActionsServiceAction } from './ActionsService'; -export type { - BackstageInstance, - SystemMetadataService, -} from './services/definitions/SystemMetadataService'; export { actionsRegistryServiceRef, actionsServiceRef, From defc7cd33ec73eea35f596bebbd40df941fbea53 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 3 Dec 2025 15:04:19 -0500 Subject: [PATCH 214/312] fix rebase issues Signed-off-by: aramissennyeydd --- packages/backend-defaults/src/CreateBackend.ts | 4 ++++ packages/backend/package.json | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 4b201fded3..9f8116a996 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -39,6 +39,7 @@ import { actionsRegistryServiceFactory, actionsServiceFactory, } from '@backstage/backend-defaults/alpha'; +import { instanceMetadataServiceFactory } from './alpha/entrypoints/instanceMetadata/instanceMetadataServiceFactory'; export const defaultServiceFactories = [ auditorServiceFactory, @@ -65,6 +66,9 @@ export const defaultServiceFactories = [ // alpha services actionsRegistryServiceFactory, actionsServiceFactory, + + // Unexported alpha services kept around for compatibility reasons + instanceMetadataServiceFactory, ]; /** diff --git a/packages/backend/package.json b/packages/backend/package.json index 3ea09f7540..2af36b8077 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -69,8 +69,7 @@ "@opentelemetry/auto-instrumentations-node": "^0.61.0", "@opentelemetry/exporter-prometheus": "^0.54.0", "@opentelemetry/sdk-node": "^0.54.0", - "example-app": "link:../app", - "express-promise-router": "^4.1.0" + "example-app": "link:../app" }, "devDependencies": { "@backstage/cli": "workspace:^" From 7dbb73dea0fa86e11804ca921b111d32969d4911 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 20:43:22 +0000 Subject: [PATCH 215/312] build(deps): bump next from 15.4.7 to 15.4.8 in /docs-ui Bumps [next](https://github.com/vercel/next.js) from 15.4.7 to 15.4.8. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.7...v15.4.8) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.8 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- docs-ui/package.json | 2 +- docs-ui/yarn.lock | 84 ++++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/docs-ui/package.json b/docs-ui/package.json index 319c0e130f..ac751efd04 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -32,7 +32,7 @@ "clsx": "^2.1.1", "html-react-parser": "^5.2.5", "motion": "^12.4.1", - "next": "15.4.7", + "next": "15.4.8", "next-mdx-remote-client": "^2.1.2", "prop-types": "^15.8.1", "react": "19.1.1", diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 51f0c36643..635b187871 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -854,10 +854,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.7": - version: 15.4.7 - resolution: "@next/env@npm:15.4.7" - checksum: 10/8341fa6f1b5aebb6f99d8abad2f3ee2685281aaa51785f8ceff3c9a7f03186645f372003ee833715c0ce05e4e7d960defa4252018977f19564001b872b24714e +"@next/env@npm:15.4.8": + version: 15.4.8 + resolution: "@next/env@npm:15.4.8" + checksum: 10/1e809a53745626a2806657b31b10c8b28da47a6c6efa99cb68dd5f501664e9a2a79fa64287435e338d86b00e59b74cd96e9fb6ed55b918972b61008d3ac3d789 languageName: node linkType: hard @@ -887,58 +887,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-darwin-arm64@npm:15.4.7" +"@next/swc-darwin-arm64@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-darwin-arm64@npm:15.4.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-darwin-x64@npm:15.4.7" +"@next/swc-darwin-x64@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-darwin-x64@npm:15.4.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.7" +"@next/swc-linux-arm64-gnu@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-arm64-gnu@npm:15.4.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.7" +"@next/swc-linux-arm64-musl@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-arm64-musl@npm:15.4.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.7" +"@next/swc-linux-x64-gnu@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-x64-gnu@npm:15.4.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-linux-x64-musl@npm:15.4.7" +"@next/swc-linux-x64-musl@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-linux-x64-musl@npm:15.4.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.7" +"@next/swc-win32-arm64-msvc@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-win32-arm64-msvc@npm:15.4.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.7": - version: 15.4.7 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.7" +"@next/swc-win32-x64-msvc@npm:15.4.8": + version: 15.4.8 + resolution: "@next/swc-win32-x64-msvc@npm:15.4.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2533,7 +2533,7 @@ __metadata: html-react-parser: "npm:^5.2.5" lightningcss: "npm:^1.28.2" motion: "npm:^12.4.1" - next: "npm:15.4.7" + next: "npm:15.4.8" next-mdx-remote-client: "npm:^2.1.2" prop-types: "npm:^15.8.1" react: "npm:19.1.1" @@ -5342,19 +5342,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.7": - version: 15.4.7 - resolution: "next@npm:15.4.7" +"next@npm:15.4.8": + version: 15.4.8 + resolution: "next@npm:15.4.8" dependencies: - "@next/env": "npm:15.4.7" - "@next/swc-darwin-arm64": "npm:15.4.7" - "@next/swc-darwin-x64": "npm:15.4.7" - "@next/swc-linux-arm64-gnu": "npm:15.4.7" - "@next/swc-linux-arm64-musl": "npm:15.4.7" - "@next/swc-linux-x64-gnu": "npm:15.4.7" - "@next/swc-linux-x64-musl": "npm:15.4.7" - "@next/swc-win32-arm64-msvc": "npm:15.4.7" - "@next/swc-win32-x64-msvc": "npm:15.4.7" + "@next/env": "npm:15.4.8" + "@next/swc-darwin-arm64": "npm:15.4.8" + "@next/swc-darwin-x64": "npm:15.4.8" + "@next/swc-linux-arm64-gnu": "npm:15.4.8" + "@next/swc-linux-arm64-musl": "npm:15.4.8" + "@next/swc-linux-x64-gnu": "npm:15.4.8" + "@next/swc-linux-x64-musl": "npm:15.4.8" + "@next/swc-win32-arm64-msvc": "npm:15.4.8" + "@next/swc-win32-x64-msvc": "npm:15.4.8" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -5397,7 +5397,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/e611751247d5cfff9337a84979918bcd61919d7b66a411c982569336c3dba7e7a8704eead7e082e579807200fa8bc80602a3e2ce4423a8b5387aab3353400918 + checksum: 10/3fc5d3d79c20af819efcf34342b55ee64025a7f6353ced4f17da303750107a8eb40c484b83d8f2352109f2dd7d137ff1f1228956b53dbf4f1f2fce0a3349eb18 languageName: node linkType: hard From 20101adc5fc3ba7b2589da9a57fe7a02703f94c4 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 3 Dec 2025 16:24:59 -0500 Subject: [PATCH 216/312] fix lockfile Signed-off-by: aramissennyeydd --- yarn.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 0b696ed0b1..98c89bb0ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30346,7 +30346,6 @@ __metadata: "@opentelemetry/exporter-prometheus": "npm:^0.54.0" "@opentelemetry/sdk-node": "npm:^0.54.0" example-app: "link:../app" - express-promise-router: "npm:^4.1.0" languageName: unknown linkType: soft From 863734d63396713750a0e77e204b861e35360990 Mon Sep 17 00:00:00 2001 From: vandr0iy <5510334+vandr0iy@users.noreply.github.com> Date: Thu, 6 Nov 2025 15:10:02 +0100 Subject: [PATCH 217/312] feat(frontend): allow configuration of the referrerPolicy Signed-off-by: vandr0iy<5510334+vandr0iy@users.noreply.github.com> Signed-off-by: vandr0iy <5510334+vandr0iy@users.noreply.github.com> --- .../http/readHelmetOptions.test.ts | 9 ++++++ .../rootHttpRouter/http/readHelmetOptions.ts | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.test.ts index 97daef359a..38cdf75396 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.test.ts @@ -39,6 +39,9 @@ describe('readHelmetOptions', () => { crossOriginOpenerPolicy: false, crossOriginResourcePolicy: false, originAgentCluster: false, + referrerPolicy: { + policy: ['no-referrer'], + }, }); }); @@ -50,6 +53,9 @@ describe('readHelmetOptions', () => { scriptSrcAttr: ['custom'], 'object-src': ['asd'], }, + referrer: { + policy: ['foo', 'bar'], + }, }); expect(readHelmetOptions(config)).toEqual({ contentSecurityPolicy: { @@ -71,6 +77,9 @@ describe('readHelmetOptions', () => { crossOriginOpenerPolicy: false, crossOriginResourcePolicy: false, originAgentCluster: false, + referrerPolicy: { + policy: ['foo', 'bar'], + }, }); }); diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts index fc1fc59bcb..040da63e5f 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/readHelmetOptions.ts @@ -46,6 +46,7 @@ export function readHelmetOptions(config?: Config): HelmetOptions { crossOriginOpenerPolicy: false, crossOriginResourcePolicy: false, originAgentCluster: false, + referrerPolicy: readReferrerPolicy(config), }; } @@ -113,3 +114,30 @@ export function applyCspDirectives( return result; } + +type ReferrerPolicy = Record | undefined; + +/** + * Attempts to read the ReferrerPolicy from the backend configuration object. + * + * @example + * ```yaml + * backend: + * referrer: + * policy: ["strict-origin-when-cross-origin"] + * ``` + */ +function readReferrerPolicy(config?: Config): ReferrerPolicy { + const cc = config?.getOptionalConfig('referrer'); + const result: Record = {}; + + if (!cc) { + result.policy = ['no-referrer']; + } else { + for (const key of cc.keys()) { + result[key] = cc.getStringArray(key); + } + } + + return result; +} From a98c71a435851a35eaba3c8e768cd3d080e35e4e Mon Sep 17 00:00:00 2001 From: vandr0iy <5510334+vandr0iy@users.noreply.github.com> Date: Thu, 4 Dec 2025 11:50:45 +0100 Subject: [PATCH 218/312] feat(frontend): adding the referrer options to config.d.ts Signed-off-by: vandr0iy <5510334+vandr0iy@users.noreply.github.com> --- packages/backend-defaults/config.d.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index f0632a37bb..6131169d6b 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -993,6 +993,13 @@ export interface Config { */ csp?: { [policyId: string]: string[] | false }; + /** + * Referrer Policy options + */ + referrer?: { + policy: string[]; + }; + /** * Options for the health check service and endpoint. */ From f96edfffa6a5539d25c3ace897faf80658d7abc4 Mon Sep 17 00:00:00 2001 From: vandr0iy <5510334+vandr0iy@users.noreply.github.com> Date: Thu, 4 Dec 2025 11:53:32 +0100 Subject: [PATCH 219/312] chore: adding changeset Signed-off-by: vandr0iy <5510334+vandr0iy@users.noreply.github.com> --- .changeset/early-doors-visit.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/early-doors-visit.md diff --git a/.changeset/early-doors-visit.md b/.changeset/early-doors-visit.md new file mode 100644 index 0000000000..828c8f26eb --- /dev/null +++ b/.changeset/early-doors-visit.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +allow configuration of the referrerPolicy From 5e965b0a72b70df161f3c86193f0610a39880c1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 17:05:05 +0000 Subject: [PATCH 220/312] build(deps): bump jws from 3.2.2 to 3.2.3 Bumps [jws](https://github.com/brianloveswords/node-jws) from 3.2.2 to 3.2.3. - [Release notes](https://github.com/brianloveswords/node-jws/releases) - [Changelog](https://github.com/auth0/node-jws/blob/master/CHANGELOG.md) - [Commits](https://github.com/brianloveswords/node-jws/compare/v3.2.2...v3.2.3) --- updated-dependencies: - dependency-name: jws dependency-version: 3.2.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 970df5e809..36f4729234 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25544,7 +25544,7 @@ __metadata: languageName: node linkType: hard -"buffer-equal-constant-time@npm:1.0.1": +"buffer-equal-constant-time@npm:1.0.1, buffer-equal-constant-time@npm:^1.0.1": version: 1.0.1 resolution: "buffer-equal-constant-time@npm:1.0.1" checksum: 10/80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab @@ -36025,14 +36025,14 @@ __metadata: languageName: node linkType: hard -"jwa@npm:^1.4.1": - version: 1.4.1 - resolution: "jwa@npm:1.4.1" +"jwa@npm:^1.4.2": + version: 1.4.2 + resolution: "jwa@npm:1.4.2" dependencies: - buffer-equal-constant-time: "npm:1.0.1" + buffer-equal-constant-time: "npm:^1.0.1" ecdsa-sig-formatter: "npm:1.0.11" safe-buffer: "npm:^5.0.1" - checksum: 10/0bc002b71dd70480fedc7d442a4d2b9185a9947352a027dcb4935864ad2323c57b5d391adf968a3622b61e940cef4f3484d5813b95864539272d41cac145d6f3 + checksum: 10/a46c9ddbcc226d9e85e13ef96328c7d331abddd66b5a55ec44bcf4350464a6125385ac9c1e64faa0fae8d586d90a14d6b5e96c73f0388970a3918d5252efb0f3 languageName: node linkType: hard @@ -36048,12 +36048,12 @@ __metadata: linkType: hard "jws@npm:^3.2.2": - version: 3.2.2 - resolution: "jws@npm:3.2.2" + version: 3.2.3 + resolution: "jws@npm:3.2.3" dependencies: - jwa: "npm:^1.4.1" + jwa: "npm:^1.4.2" safe-buffer: "npm:^5.0.1" - checksum: 10/70b016974af8a76d25030c80a0097b24ed5b17a9cf10f43b163c11cb4eb248d5d04a3fe48c0d724d2884c32879d878ccad7be0663720f46b464f662f7ed778fe + checksum: 10/707387dd1cabcc3d9c2818f773cfaac7ede66e79ca11bbd159285a88cf5d8e8f355afcb8ee373e7bb0fcf9b7a2df015b22c50f27842f2c77453f04cd9f8f4009 languageName: node linkType: hard From 87b8cae5b618bcd9770170c048ef9f510d82dc36 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 09:33:48 +0000 Subject: [PATCH 221/312] chore(deps): update dependency @rspack/core to v1.6.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 164 +++++++++++++++++++++++++++--------------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/yarn.lock b/yarn.lock index 970df5e809..56cbfd7370 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10947,10 +10947,10 @@ __metadata: languageName: node linkType: hard -"@module-federation/error-codes@npm:0.21.4": - version: 0.21.4 - resolution: "@module-federation/error-codes@npm:0.21.4" - checksum: 10/18b0ecdba0de4cd5b202f1f5e5aa76273de0e4513ba91b8e39a2a5b00ff6471f694c88d591624b0913a0c3b4c9a6112da29dc7eebbdc562e5455b591f1d70b31 +"@module-federation/error-codes@npm:0.21.6": + version: 0.21.6 + resolution: "@module-federation/error-codes@npm:0.21.6" + checksum: 10/6ded1ecab780f1f9ec46a59adb200e75cdf11580d70aa79dd75d71fbbf276615690da277ea67aa1ceb5bc88386f5708cc1d2ba5526be5c9ff02397a6123e36bf languageName: node linkType: hard @@ -11018,13 +11018,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime-core@npm:0.21.4": - version: 0.21.4 - resolution: "@module-federation/runtime-core@npm:0.21.4" +"@module-federation/runtime-core@npm:0.21.6": + version: 0.21.6 + resolution: "@module-federation/runtime-core@npm:0.21.6" dependencies: - "@module-federation/error-codes": "npm:0.21.4" - "@module-federation/sdk": "npm:0.21.4" - checksum: 10/b90fe4147cd3302ea6b02098ff2bed7437425609ba0eb4d7b649b3643837810239f06f532af092a53f9b47e8fae1aeef84cfd964431fa4ab2fd4a800ad796d23 + "@module-federation/error-codes": "npm:0.21.6" + "@module-federation/sdk": "npm:0.21.6" + checksum: 10/85efa2042d6f3a7cf0e4971b991472d4339d88f6f15684afb6d451f19ed934e225b2510c86b7bb4d2c5f64253ed7b0175f08c17f95bfc2b9929930a8a03fff1e languageName: node linkType: hard @@ -11038,13 +11038,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime-tools@npm:0.21.4": - version: 0.21.4 - resolution: "@module-federation/runtime-tools@npm:0.21.4" +"@module-federation/runtime-tools@npm:0.21.6": + version: 0.21.6 + resolution: "@module-federation/runtime-tools@npm:0.21.6" dependencies: - "@module-federation/runtime": "npm:0.21.4" - "@module-federation/webpack-bundler-runtime": "npm:0.21.4" - checksum: 10/1e453268122070e5512c1d74cb8b4efb87cd2c1b46daba1736dfee16b2e8332a779f8168dcb3f84e17eade31f965168df63dae487ccfb74b0469c32af1895675 + "@module-federation/runtime": "npm:0.21.6" + "@module-federation/webpack-bundler-runtime": "npm:0.21.6" + checksum: 10/36e7ccab948e11f310e87397a1a2185b56064e5691e553b34173686e2bc7372ec710e5ad48c026eb28c85b168765788b743aa2111513f3b57118b47636312dd1 languageName: node linkType: hard @@ -11058,14 +11058,14 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime@npm:0.21.4": - version: 0.21.4 - resolution: "@module-federation/runtime@npm:0.21.4" +"@module-federation/runtime@npm:0.21.6": + version: 0.21.6 + resolution: "@module-federation/runtime@npm:0.21.6" dependencies: - "@module-federation/error-codes": "npm:0.21.4" - "@module-federation/runtime-core": "npm:0.21.4" - "@module-federation/sdk": "npm:0.21.4" - checksum: 10/ae262bfe1643a381e571d7dff459108da3046eea04cc3dae85dce745dd294ef8a30f70098ffa602c266b8c5878c859dd2fcde787773303dac35f77fa6ed32ae4 + "@module-federation/error-codes": "npm:0.21.6" + "@module-federation/runtime-core": "npm:0.21.6" + "@module-federation/sdk": "npm:0.21.6" + checksum: 10/93fd9bb284630933cab7e4bc070d648b56272f3636038c05eec7d1e3eeb189be3ccebe5f8ecc450197ee992d2616ed282d54e673ec0acd63adee4faddf80b144 languageName: node linkType: hard @@ -11080,10 +11080,10 @@ __metadata: languageName: node linkType: hard -"@module-federation/sdk@npm:0.21.4": - version: 0.21.4 - resolution: "@module-federation/sdk@npm:0.21.4" - checksum: 10/74c9ee2a057babf4f2638f8644a6eee6bd2c76441440dcc3855fb01a0e527e88518b8cc9c2d6d8f6b28858e34e40a3a966c03bb5d42897b9ea9163985edfa159 +"@module-federation/sdk@npm:0.21.6": + version: 0.21.6 + resolution: "@module-federation/sdk@npm:0.21.6" + checksum: 10/effc4aa932e2f06742bda8f02aaec84e138f5512b50f18c38b051490020b20d3d8edf7ece853fccffc1f78a0b43dec78e69bf02150e7e2801d5ce03c3ee367b9 languageName: node linkType: hard @@ -11105,13 +11105,13 @@ __metadata: languageName: node linkType: hard -"@module-federation/webpack-bundler-runtime@npm:0.21.4": - version: 0.21.4 - resolution: "@module-federation/webpack-bundler-runtime@npm:0.21.4" +"@module-federation/webpack-bundler-runtime@npm:0.21.6": + version: 0.21.6 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.21.6" dependencies: - "@module-federation/runtime": "npm:0.21.4" - "@module-federation/sdk": "npm:0.21.4" - checksum: 10/a4f2a7ca7765651023af88f38ded9580b553cd8c6a88bc9056ec4dc58656a3d438f0498750462f424bf3aeaa5a3c7b6fd8189b7c7c76d084736474455838cb55 + "@module-federation/runtime": "npm:0.21.6" + "@module-federation/sdk": "npm:0.21.6" + checksum: 10/a5ceb72ee3867acad5d7d3c654eb568068b1d5288f60ce9301bdc9f56effa5a4c26a732a2cec7176a81b87139566cd51dd8dfbc6112da05d47b870fa3ad3ba1f languageName: node linkType: hard @@ -16826,92 +16826,92 @@ __metadata: languageName: node linkType: hard -"@rspack/binding-darwin-arm64@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-darwin-arm64@npm:1.6.5" +"@rspack/binding-darwin-arm64@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-darwin-arm64@npm:1.6.6" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-darwin-x64@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-darwin-x64@npm:1.6.5" +"@rspack/binding-darwin-x64@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-darwin-x64@npm:1.6.6" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rspack/binding-linux-arm64-gnu@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-linux-arm64-gnu@npm:1.6.5" +"@rspack/binding-linux-arm64-gnu@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.6.6" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-arm64-musl@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-linux-arm64-musl@npm:1.6.5" +"@rspack/binding-linux-arm64-musl@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.6.6" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rspack/binding-linux-x64-gnu@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-linux-x64-gnu@npm:1.6.5" +"@rspack/binding-linux-x64-gnu@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.6.6" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-x64-musl@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-linux-x64-musl@npm:1.6.5" +"@rspack/binding-linux-x64-musl@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-linux-x64-musl@npm:1.6.6" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rspack/binding-wasm32-wasi@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-wasm32-wasi@npm:1.6.5" +"@rspack/binding-wasm32-wasi@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-wasm32-wasi@npm:1.6.6" dependencies: "@napi-rs/wasm-runtime": "npm:1.0.7" conditions: cpu=wasm32 languageName: node linkType: hard -"@rspack/binding-win32-arm64-msvc@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-win32-arm64-msvc@npm:1.6.5" +"@rspack/binding-win32-arm64-msvc@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.6.6" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-win32-ia32-msvc@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-win32-ia32-msvc@npm:1.6.5" +"@rspack/binding-win32-ia32-msvc@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.6.6" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rspack/binding-win32-x64-msvc@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding-win32-x64-msvc@npm:1.6.5" +"@rspack/binding-win32-x64-msvc@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.6.6" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rspack/binding@npm:1.6.5": - version: 1.6.5 - resolution: "@rspack/binding@npm:1.6.5" +"@rspack/binding@npm:1.6.6": + version: 1.6.6 + resolution: "@rspack/binding@npm:1.6.6" dependencies: - "@rspack/binding-darwin-arm64": "npm:1.6.5" - "@rspack/binding-darwin-x64": "npm:1.6.5" - "@rspack/binding-linux-arm64-gnu": "npm:1.6.5" - "@rspack/binding-linux-arm64-musl": "npm:1.6.5" - "@rspack/binding-linux-x64-gnu": "npm:1.6.5" - "@rspack/binding-linux-x64-musl": "npm:1.6.5" - "@rspack/binding-wasm32-wasi": "npm:1.6.5" - "@rspack/binding-win32-arm64-msvc": "npm:1.6.5" - "@rspack/binding-win32-ia32-msvc": "npm:1.6.5" - "@rspack/binding-win32-x64-msvc": "npm:1.6.5" + "@rspack/binding-darwin-arm64": "npm:1.6.6" + "@rspack/binding-darwin-x64": "npm:1.6.6" + "@rspack/binding-linux-arm64-gnu": "npm:1.6.6" + "@rspack/binding-linux-arm64-musl": "npm:1.6.6" + "@rspack/binding-linux-x64-gnu": "npm:1.6.6" + "@rspack/binding-linux-x64-musl": "npm:1.6.6" + "@rspack/binding-wasm32-wasi": "npm:1.6.6" + "@rspack/binding-win32-arm64-msvc": "npm:1.6.6" + "@rspack/binding-win32-ia32-msvc": "npm:1.6.6" + "@rspack/binding-win32-x64-msvc": "npm:1.6.6" dependenciesMeta: "@rspack/binding-darwin-arm64": optional: true @@ -16933,23 +16933,23 @@ __metadata: optional: true "@rspack/binding-win32-x64-msvc": optional: true - checksum: 10/1a2c9ef1865e92f36615ff997b336c42dca84584e487d43b739a2485108463db860f798e4a7a400a5b6a6e3ce1d7ba7c0fe01fcb55e11c153be6b521264c284e + checksum: 10/37b69398a0679c25e0479b6eb11ea2c110a8b57367af2c808a473d19d58c9dd09e7763b3dfbec06284d6863e7a301d71509128fe22da2b0c57c06b718f67e66a languageName: node linkType: hard "@rspack/core@npm:^1.4.11": - version: 1.6.5 - resolution: "@rspack/core@npm:1.6.5" + version: 1.6.6 + resolution: "@rspack/core@npm:1.6.6" dependencies: - "@module-federation/runtime-tools": "npm:0.21.4" - "@rspack/binding": "npm:1.6.5" + "@module-federation/runtime-tools": "npm:0.21.6" + "@rspack/binding": "npm:1.6.6" "@rspack/lite-tapable": "npm:1.1.0" peerDependencies: "@swc/helpers": ">=0.5.1" peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/4dc7b25b8b0535ce0dad8e7dfc8d8d4b031c3b626d93110e927a012f9564644f771b22838bc0b94f2e30a6408c6ddaf183e0c159e2bfa997b823688ad21c3a5c + checksum: 10/e706c19085729f52f3e80c6945edc32def2091270fc9a15d6aea336754719d0bdce93e62dae3a675c412b5e433cc2fc093591d74e731722196d0de2ff269b198 languageName: node linkType: hard From edd027c97d058cf1f2078ddafba89be0c058f479 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 09:37:40 +0000 Subject: [PATCH 222/312] chore(deps): update typescript-eslint monorepo to v8.48.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 206 +++++++++++++++++++++++------------------------------- 1 file changed, 89 insertions(+), 117 deletions(-) diff --git a/yarn.lock b/yarn.lock index 970df5e809..a3531cfab0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8758,14 +8758,14 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0": + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/8d70bcdcd8cd279049183aca747d6c2ed7092a5cf0cf5916faac1ef37ffa74f0c245c2a3a3d3b9979d9dfdd4ca59257b4c5621db699d637b847a2c5e02f491c2 + checksum: 10/89b1eb3137e14c379865e60573f524fcc0ee5c4b0c7cd21090673e75e5a720f14b92f05ab2d02704c2314b67e67b6f96f3bb209ded6b890ced7b667aa4bf1fa2 languageName: node linkType: hard @@ -22010,52 +22010,52 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^8.17.0": - version: 8.29.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.29.1" + version: 8.48.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.48.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.29.1" - "@typescript-eslint/type-utils": "npm:8.29.1" - "@typescript-eslint/utils": "npm:8.29.1" - "@typescript-eslint/visitor-keys": "npm:8.29.1" + "@typescript-eslint/scope-manager": "npm:8.48.1" + "@typescript-eslint/type-utils": "npm:8.48.1" + "@typescript-eslint/utils": "npm:8.48.1" + "@typescript-eslint/visitor-keys": "npm:8.48.1" graphemer: "npm:^1.4.0" - ignore: "npm:^5.3.1" + ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.0.1" + ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + "@typescript-eslint/parser": ^8.48.1 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/0568894f0ea50e67622605eb347d4e26a41571ad06234478ac695a097e9b3ff6252d6d60034853d7a6b8ec644b5c1d354be21075d691173dd7f2fbecb1102674 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/3ccf420805fb8adb2f3059fa26eb9c6211c0624966d8c8654a1bd586bf87f30be0c62524dfd785185ef573bedd91c42ec3c98c23aed5d60cb9ac583dd9334bc8 languageName: node linkType: hard "@typescript-eslint/parser@npm:^8.16.0": - version: 8.29.1 - resolution: "@typescript-eslint/parser@npm:8.29.1" + version: 8.48.1 + resolution: "@typescript-eslint/parser@npm:8.48.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.29.1" - "@typescript-eslint/types": "npm:8.29.1" - "@typescript-eslint/typescript-estree": "npm:8.29.1" - "@typescript-eslint/visitor-keys": "npm:8.29.1" + "@typescript-eslint/scope-manager": "npm:8.48.1" + "@typescript-eslint/types": "npm:8.48.1" + "@typescript-eslint/typescript-estree": "npm:8.48.1" + "@typescript-eslint/visitor-keys": "npm:8.48.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/effb4cc24e375e4229e711b3ea8611a205bf81964cb487f518dd4a7d6cecde7324201ce4e2c3cd420e0ce7649899294307da2cd77f145af4efef3a0292189f20 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/d8409c9ede4b1cd2ad0e10e94bb00c54f79352f7d54c97bf24419cb983c19b9f6097e6c31b217ce7ec5cfc9a48117e732d9f88ce0cb8c0ccf7fc3faecdf854a3 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.35.0": - version: 8.35.0 - resolution: "@typescript-eslint/project-service@npm:8.35.0" +"@typescript-eslint/project-service@npm:8.48.1": + version: 8.48.1 + resolution: "@typescript-eslint/project-service@npm:8.48.1" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.35.0" - "@typescript-eslint/types": "npm:^8.35.0" + "@typescript-eslint/tsconfig-utils": "npm:^8.48.1" + "@typescript-eslint/types": "npm:^8.48.1" debug: "npm:^4.3.4" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10/a9419da92231aa27f75078fcffab1d02398b50fdb7d5399775a414ba02570682b4b60cdfafb544a021b0dc2372f029c4195f5ae17c50deb11c25661b2ac18a74 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/66ecc7ef9572748860517cde7fbfc335d05ca8c99dcf13ac6d728ac93388d90cdc3ebe2ff33a85c0a03487b3c1c4e36c6e3fe413ee16d8fb003621cb58e65e52 languageName: node linkType: hard @@ -22079,37 +22079,38 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.29.1": - version: 8.29.1 - resolution: "@typescript-eslint/scope-manager@npm:8.29.1" +"@typescript-eslint/scope-manager@npm:8.48.1": + version: 8.48.1 + resolution: "@typescript-eslint/scope-manager@npm:8.48.1" dependencies: - "@typescript-eslint/types": "npm:8.29.1" - "@typescript-eslint/visitor-keys": "npm:8.29.1" - checksum: 10/33a02f490b53436729f5ca2e6e0c5b8db72adb455274e5de43bdaada21033e7941aed1d92653321991e186af77f7794dc0ac35d2fce891cdf65a6d3fb192249e + "@typescript-eslint/types": "npm:8.48.1" + "@typescript-eslint/visitor-keys": "npm:8.48.1" + checksum: 10/5040246220f9872ec47633297b7896ed5587af3163e06ddcb7ca0dcf1e171f359bd4f1c82f794a6adfecbccfb5ef437d51b522321034603c93ba1993c407bdf2 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.35.0, @typescript-eslint/tsconfig-utils@npm:^8.35.0": - version: 8.35.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.35.0" +"@typescript-eslint/tsconfig-utils@npm:8.48.1, @typescript-eslint/tsconfig-utils@npm:^8.48.1": + version: 8.48.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.48.1" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10/4160928313ccbe8b169a009b9c1220826c7df7aab427f960c31f3b838931bc7a121ebee8040118481e4528e2e3cf1b26da047c6ac1d802ecff2ef7206026ea6b + typescript: ">=4.8.4 <6.0.0" + checksum: 10/830bcd0e7628441f91899e8e24aaed66d32a239babcc205aba1d08c08ff5a636d8c04f96d9873578df59d7468fc4c5df032667764b3b2ee0a733af36fca21c4a languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.29.1": - version: 8.29.1 - resolution: "@typescript-eslint/type-utils@npm:8.29.1" +"@typescript-eslint/type-utils@npm:8.48.1": + version: 8.48.1 + resolution: "@typescript-eslint/type-utils@npm:8.48.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.29.1" - "@typescript-eslint/utils": "npm:8.29.1" + "@typescript-eslint/types": "npm:8.48.1" + "@typescript-eslint/typescript-estree": "npm:8.48.1" + "@typescript-eslint/utils": "npm:8.48.1" debug: "npm:^4.3.4" - ts-api-utils: "npm:^2.0.1" + ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/3774d6fb32c058b3fa607480e5603fdd2919e07d8babbc00aa703f31c6fd6f7fbc25c25ff246e7e6ac6b77ad0e0b66838a7136aebc31503a58fbe509f68ab2f4 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/6cf9370ac5437e2d64c71964646aed9e6c1ea3c7bb473258b50ae422106461d290f4215b9435b892a2dd563e3c31feb3169532375513b56b7e48f4a425283091 languageName: node linkType: hard @@ -22127,17 +22128,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.29.1": - version: 8.29.1 - resolution: "@typescript-eslint/types@npm:8.29.1" - checksum: 10/99ff59e7af3728858af9b7fdc0165955bcf5cd2eefeaafabfbdd7951fbc8ad869cbb7bed7bcbed6c3c50a8661333b33364dc1de0a0c8f3c64d5882339a5d30dd - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.35.0, @typescript-eslint/types@npm:^8.35.0": - version: 8.35.0 - resolution: "@typescript-eslint/types@npm:8.35.0" - checksum: 10/34b5e6da2c59ea84cd528608fff0cc14b102fd23f5517dfee4ef38c9372861d80b5bf92445c9679674f0a4f8dc4ded5066c1bca2bc5569c47515f94568984f35 +"@typescript-eslint/types@npm:8.48.1, @typescript-eslint/types@npm:^8.48.1": + version: 8.48.1 + resolution: "@typescript-eslint/types@npm:8.48.1" + checksum: 10/1aa1e3f25b429bcebd9eb45b5252d950f1b24dbc6014a47dff8d00547e2e1ac47f351846fb996b6ebd49da37a85394051d36191cbbbf2c431b8db9d95afd198d languageName: node linkType: hard @@ -22178,56 +22172,37 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.29.1": - version: 8.29.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.29.1" +"@typescript-eslint/typescript-estree@npm:8.48.1, @typescript-eslint/typescript-estree@npm:^8.23.0": + version: 8.48.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.48.1" dependencies: - "@typescript-eslint/types": "npm:8.29.1" - "@typescript-eslint/visitor-keys": "npm:8.29.1" + "@typescript-eslint/project-service": "npm:8.48.1" + "@typescript-eslint/tsconfig-utils": "npm:8.48.1" + "@typescript-eslint/types": "npm:8.48.1" + "@typescript-eslint/visitor-keys": "npm:8.48.1" debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.0.1" - peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10/dded2ebe4c3287443000e3b825e673d0eddb7c48eb2d373c5b7059ea7dbbeba488d7f1de2e42ed7a9299ccff926a65821f2b5594022b49564026ba01c0cc07ab - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:^8.23.0": - version: 8.35.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.35.0" - dependencies: - "@typescript-eslint/project-service": "npm:8.35.0" - "@typescript-eslint/tsconfig-utils": "npm:8.35.0" - "@typescript-eslint/types": "npm:8.35.0" - "@typescript-eslint/visitor-keys": "npm:8.35.0" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.4" semver: "npm:^7.6.0" + tinyglobby: "npm:^0.2.15" ts-api-utils: "npm:^2.1.0" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10/4dff7c5a8853c8f4e30d35565c62d3ad5bf8445309bd465d94e9bca725853012bb9f58896a04207c30e10b6669511caac8c0f080ed781c93a3db81d5808195aa + typescript: ">=4.8.4 <6.0.0" + checksum: 10/485aa44d22453396dbe61c560c6f583bf876f971d9e70773093cd729279f88184cf5793bf706033bbd8465cce6f9d045b63574727d58d5996519c29e1adbbfe5 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.29.1, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.8.1": - version: 8.29.1 - resolution: "@typescript-eslint/utils@npm:8.29.1" +"@typescript-eslint/utils@npm:8.48.1, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.8.1": + version: 8.48.1 + resolution: "@typescript-eslint/utils@npm:8.48.1" dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.29.1" - "@typescript-eslint/types": "npm:8.29.1" - "@typescript-eslint/typescript-estree": "npm:8.29.1" + "@eslint-community/eslint-utils": "npm:^4.7.0" + "@typescript-eslint/scope-manager": "npm:8.48.1" + "@typescript-eslint/types": "npm:8.48.1" + "@typescript-eslint/typescript-estree": "npm:8.48.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/1d2c85c97a39e063fe490c0cdb6513716e4735bda0bc937475b44d9224074a5070f888dfed1e75f4a91c8f4d825b44fce90b685e07bda391dfeb2553b9b39a5a + typescript: ">=4.8.4 <6.0.0" + checksum: 10/34afe5cf78020b682473e6529d6268eb8015bdb020a3c5303c4abb230d4d7c39e6fc8b9df58d1f0f35a1ceeb5d6182e71e42fe7a28dde8ffc31f8560f2dacc7c languageName: node linkType: hard @@ -22283,23 +22258,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.29.1": - version: 8.29.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.29.1" +"@typescript-eslint/visitor-keys@npm:8.48.1": + version: 8.48.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.48.1" dependencies: - "@typescript-eslint/types": "npm:8.29.1" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10/788290c369c13403692d857e0a464b5c2223e1fef28c717b7dbc61140d33697ce43c7d1a7cb7ac585f2012fc702ce2ec489363d34bf566303d3c48fa494803c5 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.35.0": - version: 8.35.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.35.0" - dependencies: - "@typescript-eslint/types": "npm:8.35.0" + "@typescript-eslint/types": "npm:8.48.1" eslint-visitor-keys: "npm:^4.2.1" - checksum: 10/c0acb13aac3a2be5e82844f7d2e86137347efdd04661dbf9fa69ef04a19dd2f1eb2f1eb6bfbfbaada78a46884308d2c0e0b5d0d1a094c84f2dfb670b67ac2b3b + checksum: 10/63aa165c57e6b38700adf84da2e90537577cdeb69d05031e3e70785fa412d96d539dc4c1696a0b7bc93284613f8b92fb1bb40f6068bb75347a942120b246ac60 languageName: node linkType: hard @@ -29878,7 +29843,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.2.0, eslint-visitor-keys@npm:^4.2.1": +"eslint-visitor-keys@npm:^4.2.1": version: 4.2.1 resolution: "eslint-visitor-keys@npm:4.2.1" checksum: 10/3ee00fc6a7002d4b0ffd9dc99e13a6a7882c557329e6c25ab254220d71e5c9c4f89dca4695352949ea678eb1f3ba912a18ef8aac0a7fe094196fd92f441bfce2 @@ -33390,13 +33355,20 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.4, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": +"ignore@npm:^5.1.4, ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 languageName: node linkType: hard +"ignore@npm:^7.0.0": + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: 10/f134b96a4de0af419196f52c529d5c6120c4456ff8a6b5a14ceaaa399f883e15d58d2ce651c9b69b9388491d4669dda47285d307e827de9304a53a1824801bc6 + languageName: node + linkType: hard + "immediate@npm:~3.0.5": version: 3.0.6 resolution: "immediate@npm:3.0.6" @@ -47928,7 +47900,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.0.1, ts-api-utils@npm:^2.1.0": +"ts-api-utils@npm:^2.1.0": version: 2.1.0 resolution: "ts-api-utils@npm:2.1.0" peerDependencies: From fb1f6c405e7645520e4021f134fe4733d4224085 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 09:46:09 +0000 Subject: [PATCH 223/312] chore(deps): update dependency motion to v12.23.25 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 635b187871..007019c4a5 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -3451,9 +3451,9 @@ __metadata: languageName: node linkType: hard -"framer-motion@npm:^12.23.24": - version: 12.23.24 - resolution: "framer-motion@npm:12.23.24" +"framer-motion@npm:^12.23.25": + version: 12.23.25 + resolution: "framer-motion@npm:12.23.25" dependencies: motion-dom: "npm:^12.23.23" motion-utils: "npm:^12.23.6" @@ -3469,7 +3469,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/c46015626d140557f3f225ffeaea14146988a42a99b33e46e3efbab88814343867a63014544169283b9518e1a3abed231ccefd890e601cf66b6c43425b0465e2 + checksum: 10/0b55dc0a5319cd923cdddcb42726352f0d74a8160f5222a3f090af53bbb2ed0d93c8482da41c9ffa875a3f7f666586e43be7594dca3612e70a1dea6bfbefebb4 languageName: node linkType: hard @@ -5265,10 +5265,10 @@ __metadata: linkType: hard "motion@npm:^12.4.1": - version: 12.23.24 - resolution: "motion@npm:12.23.24" + version: 12.23.25 + resolution: "motion@npm:12.23.25" dependencies: - framer-motion: "npm:^12.23.24" + framer-motion: "npm:^12.23.25" tslib: "npm:^2.4.0" peerDependencies: "@emotion/is-prop-valid": "*" @@ -5281,7 +5281,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/d63d951676058001c6f234a6bdf8ed5a8fd222a38c1871ef209ed1fd87f2a288ec0e267fa616d80ac8837d0836a5f93ae85a80d773314517f19f304f25b81c3d + checksum: 10/67e86dd3c695362812fd86d06e82bb53173900212a78802c94adbcff947e70316141ec6e2908fb3ebf70d3686578bb7fbe7a820a359ce553cd2d79ff77fc1428 languageName: node linkType: hard From 68a65f4bf7dd42bcbde21bc4a69464f262eacda9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 10:06:50 +0000 Subject: [PATCH 224/312] chore(deps): update alpine docker tag to v3.23 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile index d3b56cdacb..c6bf22ce29 100644 --- a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile +++ b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.22 +FROM alpine:3.23 RUN apk add --update \ git \ From 7c6530b036e7f036172c7fb05429f771b1ecf1c6 Mon Sep 17 00:00:00 2001 From: Ilya Savich Date: Fri, 5 Dec 2025 11:13:10 +0100 Subject: [PATCH 225/312] Remove trivial deps Signed-off-by: Ilya Savich --- .../kubernetes-backend/src/service/KubernetesRouter.ts | 3 --- plugins/kubernetes-node/report.api.md | 6 ------ plugins/kubernetes-node/src/extensions.ts | 10 +--------- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts index 9ca56c502e..48842f562c 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts @@ -125,9 +125,6 @@ export class KubernetesRouter { ), objectsProvider, clusterSupplier, - catalog, - permissions, - httpAuth, authStrategyMap, }) ?? this.buildDefaultRouter( diff --git a/plugins/kubernetes-node/report.api.md b/plugins/kubernetes-node/report.api.md index 6e8a80a041..c23a0b5bb8 100644 --- a/plugins/kubernetes-node/report.api.md +++ b/plugins/kubernetes-node/report.api.md @@ -5,14 +5,12 @@ ```ts import { AuthenticationStrategy as AuthenticationStrategy_2 } from '@backstage/plugin-kubernetes-node'; import { BackstageCredentials } from '@backstage/backend-plugin-api'; -import type { CatalogService } from '@backstage/plugin-catalog-node'; import { CustomResource as CustomResource_2 } from '@backstage/plugin-kubernetes-node'; import { CustomResourceMatcher } from '@backstage/plugin-kubernetes-common'; import { Entity } from '@backstage/catalog-model'; import type express from 'express'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { FetchResponse } from '@backstage/plugin-kubernetes-common'; -import { HttpAuthService } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { KubernetesClustersSupplier as KubernetesClustersSupplier_2 } from '@backstage/plugin-kubernetes-node'; import { KubernetesFetcher as KubernetesFetcher_2 } from '@backstage/plugin-kubernetes-node'; @@ -23,7 +21,6 @@ import { KubernetesServiceLocator as KubernetesServiceLocator_2 } from '@backsta import { LoggerService } from '@backstage/backend-plugin-api'; import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; import { ObjectToFetch as ObjectToFetch_2 } from '@backstage/plugin-kubernetes-node'; -import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; // @public (undocumented) export interface AuthenticationStrategy { @@ -240,9 +237,6 @@ export type KubernetesRouterFactory = (opts: { getDefault: () => express.Router; objectsProvider: KubernetesObjectsProvider_2; clusterSupplier: KubernetesClustersSupplier_2; - catalog: CatalogService; - permissions: PermissionEvaluator; - httpAuth: HttpAuthService; authStrategyMap: { [key: string]: AuthenticationStrategy_2; }; diff --git a/plugins/kubernetes-node/src/extensions.ts b/plugins/kubernetes-node/src/extensions.ts index d6b5037402..50b529d05b 100644 --- a/plugins/kubernetes-node/src/extensions.ts +++ b/plugins/kubernetes-node/src/extensions.ts @@ -13,10 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - createExtensionPoint, - HttpAuthService, -} from '@backstage/backend-plugin-api'; +import { createExtensionPoint } from '@backstage/backend-plugin-api'; import { AuthenticationStrategy, CustomResource, @@ -27,8 +24,6 @@ import { KubernetesServiceLocator, } from '@backstage/plugin-kubernetes-node'; import type express from 'express'; -import type { CatalogService } from '@backstage/plugin-catalog-node'; -import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; /** * A factory function for creating a KubernetesObjectsProvider. @@ -185,9 +180,6 @@ export type KubernetesRouterFactory = (opts: { getDefault: () => express.Router; objectsProvider: KubernetesObjectsProvider; clusterSupplier: KubernetesClustersSupplier; - catalog: CatalogService; - permissions: PermissionEvaluator; - httpAuth: HttpAuthService; authStrategyMap: { [key: string]: AuthenticationStrategy }; }) => express.Router; From 122664749ca7a66cd1d99c948ae2ee314bb55624 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 11:06:59 +0000 Subject: [PATCH 226/312] fix(deps): update dependency esbuild to ^0.27.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-7b76d6d.md | 6 + packages/cli/package.json | 2 +- plugins/scaffolder-backend/package.json | 2 +- yarn.lock | 275 +++++++++++++++++++++++- 4 files changed, 281 insertions(+), 4 deletions(-) create mode 100644 .changeset/renovate-7b76d6d.md diff --git a/.changeset/renovate-7b76d6d.md b/.changeset/renovate-7b76d6d.md new file mode 100644 index 0000000000..9ccb2dd94b --- /dev/null +++ b/.changeset/renovate-7b76d6d.md @@ -0,0 +1,6 @@ +--- +'@backstage/cli': patch +'@backstage/plugin-scaffolder-backend': patch +--- + +Updated dependency `esbuild` to `^0.27.0`. diff --git a/packages/cli/package.json b/packages/cli/package.json index cecc05e6c2..40ab7b2823 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -88,7 +88,7 @@ "cross-spawn": "^7.0.3", "css-loader": "^6.5.1", "ctrlc-windows": "^2.1.0", - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "eslint": "^8.6.0", "eslint-config-prettier": "^9.0.0", "eslint-formatter-friendly": "^7.0.0", diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index cdfdafc49c..9cbb3172e3 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -126,7 +126,7 @@ "@types/nunjucks": "^3.1.4", "@types/supertest": "^2.0.8", "@types/zen-observable": "^0.8.0", - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "strip-ansi": "^7.1.0", "supertest": "^7.0.0", "wait-for-expect": "^3.0.2" diff --git a/yarn.lock b/yarn.lock index 679574902a..03911f9351 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3244,7 +3244,7 @@ __metadata: css-loader: "npm:^6.5.1" ctrlc-windows: "npm:^2.1.0" del: "npm:^8.0.0" - esbuild: "npm:^0.25.0" + esbuild: "npm:^0.27.0" esbuild-loader: "npm:^4.0.0" eslint: "npm:^8.6.0" eslint-config-prettier: "npm:^9.0.0" @@ -6732,7 +6732,7 @@ __metadata: "@types/supertest": "npm:^2.0.8" "@types/zen-observable": "npm:^0.8.0" concat-stream: "npm:^2.0.0" - esbuild: "npm:^0.25.0" + esbuild: "npm:^0.27.0" express: "npm:^4.22.0" fs-extra: "npm:^11.2.0" globby: "npm:^11.0.0" @@ -8583,6 +8583,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/aix-ppc64@npm:0.27.1" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/android-arm64@npm:0.25.8" @@ -8590,6 +8597,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/android-arm64@npm:0.27.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/android-arm@npm:0.25.8" @@ -8597,6 +8611,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/android-arm@npm:0.27.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/android-x64@npm:0.25.8" @@ -8604,6 +8625,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/android-x64@npm:0.27.1" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/darwin-arm64@npm:0.25.8" @@ -8611,6 +8639,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/darwin-arm64@npm:0.27.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/darwin-x64@npm:0.25.8" @@ -8618,6 +8653,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/darwin-x64@npm:0.27.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/freebsd-arm64@npm:0.25.8" @@ -8625,6 +8667,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/freebsd-arm64@npm:0.27.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/freebsd-x64@npm:0.25.8" @@ -8632,6 +8681,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/freebsd-x64@npm:0.27.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-arm64@npm:0.25.8" @@ -8639,6 +8695,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-arm64@npm:0.27.1" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-arm@npm:0.25.8" @@ -8646,6 +8709,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-arm@npm:0.27.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-ia32@npm:0.25.8" @@ -8653,6 +8723,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-ia32@npm:0.27.1" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-loong64@npm:0.25.8" @@ -8660,6 +8737,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-loong64@npm:0.27.1" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-mips64el@npm:0.25.8" @@ -8667,6 +8751,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-mips64el@npm:0.27.1" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-ppc64@npm:0.25.8" @@ -8674,6 +8765,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-ppc64@npm:0.27.1" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-riscv64@npm:0.25.8" @@ -8681,6 +8779,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-riscv64@npm:0.27.1" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-s390x@npm:0.25.8" @@ -8688,6 +8793,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-s390x@npm:0.27.1" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/linux-x64@npm:0.25.8" @@ -8695,6 +8807,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/linux-x64@npm:0.27.1" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/netbsd-arm64@npm:0.25.8" @@ -8702,6 +8821,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/netbsd-arm64@npm:0.27.1" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/netbsd-x64@npm:0.25.8" @@ -8709,6 +8835,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/netbsd-x64@npm:0.27.1" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/openbsd-arm64@npm:0.25.8" @@ -8716,6 +8849,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/openbsd-arm64@npm:0.27.1" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/openbsd-x64@npm:0.25.8" @@ -8723,6 +8863,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/openbsd-x64@npm:0.27.1" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openharmony-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/openharmony-arm64@npm:0.25.8" @@ -8730,6 +8877,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openharmony-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/openharmony-arm64@npm:0.27.1" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/sunos-x64@npm:0.25.8" @@ -8737,6 +8891,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/sunos-x64@npm:0.27.1" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/win32-arm64@npm:0.25.8" @@ -8744,6 +8905,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/win32-arm64@npm:0.27.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/win32-ia32@npm:0.25.8" @@ -8751,6 +8919,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/win32-ia32@npm:0.27.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.25.8": version: 0.25.8 resolution: "@esbuild/win32-x64@npm:0.25.8" @@ -8758,6 +8933,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.27.1": + version: 0.27.1 + resolution: "@esbuild/win32-x64@npm:0.27.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0": version: 4.9.0 resolution: "@eslint-community/eslint-utils@npm:4.9.0" @@ -29528,6 +29710,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.27.0": + version: 0.27.1 + resolution: "esbuild@npm:0.27.1" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.1" + "@esbuild/android-arm": "npm:0.27.1" + "@esbuild/android-arm64": "npm:0.27.1" + "@esbuild/android-x64": "npm:0.27.1" + "@esbuild/darwin-arm64": "npm:0.27.1" + "@esbuild/darwin-x64": "npm:0.27.1" + "@esbuild/freebsd-arm64": "npm:0.27.1" + "@esbuild/freebsd-x64": "npm:0.27.1" + "@esbuild/linux-arm": "npm:0.27.1" + "@esbuild/linux-arm64": "npm:0.27.1" + "@esbuild/linux-ia32": "npm:0.27.1" + "@esbuild/linux-loong64": "npm:0.27.1" + "@esbuild/linux-mips64el": "npm:0.27.1" + "@esbuild/linux-ppc64": "npm:0.27.1" + "@esbuild/linux-riscv64": "npm:0.27.1" + "@esbuild/linux-s390x": "npm:0.27.1" + "@esbuild/linux-x64": "npm:0.27.1" + "@esbuild/netbsd-arm64": "npm:0.27.1" + "@esbuild/netbsd-x64": "npm:0.27.1" + "@esbuild/openbsd-arm64": "npm:0.27.1" + "@esbuild/openbsd-x64": "npm:0.27.1" + "@esbuild/openharmony-arm64": "npm:0.27.1" + "@esbuild/sunos-x64": "npm:0.27.1" + "@esbuild/win32-arm64": "npm:0.27.1" + "@esbuild/win32-ia32": "npm:0.27.1" + "@esbuild/win32-x64": "npm:0.27.1" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10/534148f01e85ca93ec3a4ae8bef133680f5659e639915cd3a453d6ec9ead94c9a2e9bfd61380301471447e182beb62841cb72e0fa18251cdce3454a2511d7cf4 + languageName: node + linkType: hard + "esbuild@npm:esbuild-wasm@^0.23.0": version: 0.23.1 resolution: "esbuild-wasm@npm:0.23.1" From 741c47a38b70aab0ac93e0c90859aaf54bbe4e89 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 12:30:20 +0000 Subject: [PATCH 227/312] fix(deps): update dependency typescript-json-schema to ^0.67.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-97eef4b.md | 5 +++++ packages/config-loader/package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/renovate-97eef4b.md diff --git a/.changeset/renovate-97eef4b.md b/.changeset/renovate-97eef4b.md new file mode 100644 index 0000000000..9b3692bc1c --- /dev/null +++ b/.changeset/renovate-97eef4b.md @@ -0,0 +1,5 @@ +--- +'@backstage/config-loader': patch +--- + +Updated dependency `typescript-json-schema` to `^0.67.0`. diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 69ac2fed6f..24b71ce824 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -49,7 +49,7 @@ "json-schema-traverse": "^1.0.0", "lodash": "^4.17.21", "minimist": "^1.2.5", - "typescript-json-schema": "^0.65.0", + "typescript-json-schema": "^0.67.0", "yaml": "^2.0.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 679574902a..c83e2967e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3387,7 +3387,7 @@ __metadata: lodash: "npm:^4.17.21" minimist: "npm:^1.2.5" msw: "npm:^1.0.0" - typescript-json-schema: "npm:^0.65.0" + typescript-json-schema: "npm:^0.67.0" yaml: "npm:^2.0.0" zen-observable: "npm:^0.10.0" languageName: unknown @@ -48423,9 +48423,9 @@ __metadata: languageName: node linkType: hard -"typescript-json-schema@npm:^0.65.0": - version: 0.65.1 - resolution: "typescript-json-schema@npm:0.65.1" +"typescript-json-schema@npm:^0.67.0": + version: 0.67.0 + resolution: "typescript-json-schema@npm:0.67.0" dependencies: "@types/json-schema": "npm:^7.0.9" "@types/node": "npm:^18.11.9" @@ -48437,7 +48437,7 @@ __metadata: yargs: "npm:^17.1.1" bin: typescript-json-schema: bin/typescript-json-schema - checksum: 10/50a1935378639d5d47e452702766a3fdab22e1d06192f26f81b79e0da504e71af987ff21cb13909479a202aad8d1216a654f16ebda2ee2056b5f859584b4c7d2 + checksum: 10/23769ab7701558aa4decb9dad832d12b9c2c619d102088023d277ce8f4abcd21453a9b095bc82de32cfca68efd1520f75124878f96dd95d8ccf91f35e1b7744f languageName: node linkType: hard From 9b38f22800820e0841fc6e19641284203c957be6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 13:18:40 +0000 Subject: [PATCH 228/312] fix(deps): update dependency use-immer to ^0.11.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-a3c2cbd.md | 5 +++++ plugins/scaffolder-react/package.json | 2 +- yarn.lock | 12 ++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 .changeset/renovate-a3c2cbd.md diff --git a/.changeset/renovate-a3c2cbd.md b/.changeset/renovate-a3c2cbd.md new file mode 100644 index 0000000000..2fde85d39e --- /dev/null +++ b/.changeset/renovate-a3c2cbd.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': patch +--- + +Updated dependency `use-immer` to `^0.11.0`. diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index ddd47b982e..dcb9f5a7a0 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -90,7 +90,7 @@ "luxon": "^3.0.0", "qs": "^6.9.4", "react-use": "^17.2.4", - "use-immer": "^0.10.0", + "use-immer": "^0.11.0", "zen-observable": "^0.10.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" diff --git a/yarn.lock b/yarn.lock index 5bca6fc9de..85038d5aad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6892,7 +6892,7 @@ __metadata: react-router-dom: "npm:^6.3.0" react-use: "npm:^17.2.4" swr: "npm:^2.0.0" - use-immer: "npm:^0.10.0" + use-immer: "npm:^0.11.0" zen-observable: "npm:^0.10.0" zod: "npm:^3.22.4" zod-to-json-schema: "npm:^3.20.4" @@ -49362,13 +49362,13 @@ __metadata: languageName: node linkType: hard -"use-immer@npm:^0.10.0": - version: 0.10.0 - resolution: "use-immer@npm:0.10.0" +"use-immer@npm:^0.11.0": + version: 0.11.0 + resolution: "use-immer@npm:0.11.0" peerDependencies: immer: ">=8.0.0" - react: ^16.8.0 || ^17.0.1 || ^18.0.0 - checksum: 10/372b0eea0a05e9435f5dc57a877ec619ea9a479fc82423f502b4a498d5697f8b06b85d089058db5a056bc8bbdb8e6f9ea8c9850b51a6b05d5c63ab0c8eeb2b7e + react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 + checksum: 10/09ddbddec5bd5a939dc462de4c9d1ce47989bc60daa712c5235664650b132e246b8e61b6bd3dc8179649445b7cf389065373c75f23829a676dbda6b5d2428928 languageName: node linkType: hard From 25b560e8c0b92194b6dd387d1ff1e936aa52e21c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 5 Dec 2025 14:44:45 +0100 Subject: [PATCH 229/312] fixup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/nice-humans-cry.md | 6 ++++++ .../src/entrypoints/rootLogger/WinstonLogger.ts | 11 ++++++++--- .../src/scaffolder/tasks/logger.ts | 16 +++++++++++----- 3 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 .changeset/nice-humans-cry.md diff --git a/.changeset/nice-humans-cry.md b/.changeset/nice-humans-cry.md new file mode 100644 index 0000000000..c6119702b4 --- /dev/null +++ b/.changeset/nice-humans-cry.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +'@backstage/backend-defaults': patch +--- + +Internal change to support new versions of the `logform` library diff --git a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts index c48cef2f1f..0455912ca9 100644 --- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts +++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts @@ -102,7 +102,9 @@ export class WinstonLogger implements RootLoggerService { return obj; } - obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '***'); + if (typeof obj[MESSAGE] === 'string') { + obj[MESSAGE] = obj[MESSAGE].replace(redactionPattern, '***'); + } return obj; })(), @@ -157,8 +159,11 @@ export class WinstonLogger implements RootLoggerService { format.printf((info: TransformableInfo) => { const { timestamp, level, message, plugin, service, ...fields } = info; const prefix = plugin || service; - const timestampColor = colorizer.colorize('timestamp', timestamp); - const prefixColor = colorizer.colorize('prefix', prefix); + const timestampColor = colorizer.colorize( + 'timestamp', + String(timestamp), + ); + const prefixColor = colorizer.colorize('prefix', String(prefix)); const extraFields = Object.entries(fields) .map(([key, value]) => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts index 6ca24663b6..5958aacf41 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts @@ -84,9 +84,10 @@ export class BackstageLoggerTransport extends Transport { break; default: this.backstageLogger.info(String(message)); + break; } - this.taskContext.emitLog(message, { stepId: this.stepId }); + this.taskContext.emitLog(String(message), { stepId: this.stepId }); callback(); } } @@ -131,7 +132,9 @@ export class WinstonLogger implements RootLoggerService { return obj; } - obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '***'); + if (typeof obj[MESSAGE] === 'string') { + obj[MESSAGE] = obj[MESSAGE].replace(redactionPattern, '***'); + } return obj; })(), @@ -189,10 +192,13 @@ export class WinstonLogger implements RootLoggerService { const level = info[LEVEL]; const fields = info[SPLAT]; const prefix = plugin || service; - const timestampColor = colorizer.colorize('timestamp', timestamp); - const prefixColor = colorizer.colorize('prefix', prefix); + const timestampColor = colorizer.colorize( + 'timestamp', + String(timestamp), + ); + const prefixColor = colorizer.colorize('prefix', String(prefix)); - const extraFields = Object.entries(fields) + const extraFields = Object.entries(fields as any) .map( ([key, value]) => `${colorizer.colorize('field', `${key}`)}=${value}`, From 451d02dfb120fab042180d334d8525842994afc7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 14:12:34 +0000 Subject: [PATCH 230/312] fix(deps): update nextjs monorepo to v15.5.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/package.json | 4 ++-- docs-ui/yarn.lock | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs-ui/package.json b/docs-ui/package.json index ac751efd04..9f3f7808c5 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -24,7 +24,7 @@ "@lezer/highlight": "^1.2.1", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", - "@next/mdx": "15.3.4", + "@next/mdx": "15.5.6", "@remixicon/react": "^4.6.0", "@storybook/react": "^8.6.12", "@uiw/codemirror-themes": "^4.23.7", @@ -49,7 +49,7 @@ "@types/react-dom": "19.1.7", "chokidar": "^3.6.0", "eslint": "^8", - "eslint-config-next": "15.3.4", + "eslint-config-next": "15.5.6", "lightningcss": "^1.28.2", "typescript": "^5", "unified": "^11.0.4" diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 007019c4a5..ecb67f4ded 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -861,18 +861,18 @@ __metadata: languageName: node linkType: hard -"@next/eslint-plugin-next@npm:15.3.4": - version: 15.3.4 - resolution: "@next/eslint-plugin-next@npm:15.3.4" +"@next/eslint-plugin-next@npm:15.5.6": + version: 15.5.6 + resolution: "@next/eslint-plugin-next@npm:15.5.6" dependencies: fast-glob: "npm:3.3.1" - checksum: 10/8a473bd32a06f62c16f60f9c40b7b8149cf91170ce4c1546cda57e9c85ac8481c7ad3aa4a77e8c3c7000e80d3de809d2db7df6cb79e13fd258fff382729abf60 + checksum: 10/67faf90bcf5735deff9cb9c18dc521af397209976db7bf39217f0f417134da55320dd61e2a6c9094193405ebf72203b9364fef6cf600b7d8fc84a5e5f7bd4edc languageName: node linkType: hard -"@next/mdx@npm:15.3.4": - version: 15.3.4 - resolution: "@next/mdx@npm:15.3.4" +"@next/mdx@npm:15.5.6": + version: 15.5.6 + resolution: "@next/mdx@npm:15.5.6" dependencies: source-map: "npm:^0.7.0" peerDependencies: @@ -883,7 +883,7 @@ __metadata: optional: true "@mdx-js/react": optional: true - checksum: 10/07904beda049317e43857f9dfe659adb6e57c4417475de1d21a7605f8ace5d9aa992a06465d1a94fe4b62331901765b15659555e8aadedbd410f86df1bebd1bd + checksum: 10/a0b7ca6cb9e06e0be27f8581580921185767ff50ec3c03414a77e8a90dbb696317efe4da4fc9f3ad900b866ae53aa04ee726d7abac55fba03aabd5ed834aa030 languageName: node linkType: hard @@ -2515,7 +2515,7 @@ __metadata: "@lezer/highlight": "npm:^1.2.1" "@mdx-js/loader": "npm:^3.1.0" "@mdx-js/react": "npm:^3.1.0" - "@next/mdx": "npm:15.3.4" + "@next/mdx": "npm:15.5.6" "@octokit/rest": "npm:^22.0.1" "@remixicon/react": "npm:^4.6.0" "@shikijs/transformers": "npm:^3.13.0" @@ -2529,7 +2529,7 @@ __metadata: chokidar: "npm:^3.6.0" clsx: "npm:^2.1.1" eslint: "npm:^8" - eslint-config-next: "npm:15.3.4" + eslint-config-next: "npm:15.5.6" html-react-parser: "npm:^5.2.5" lightningcss: "npm:^1.28.2" motion: "npm:^12.4.1" @@ -2942,11 +2942,11 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:15.3.4": - version: 15.3.4 - resolution: "eslint-config-next@npm:15.3.4" +"eslint-config-next@npm:15.5.6": + version: 15.5.6 + resolution: "eslint-config-next@npm:15.5.6" dependencies: - "@next/eslint-plugin-next": "npm:15.3.4" + "@next/eslint-plugin-next": "npm:15.5.6" "@rushstack/eslint-patch": "npm:^1.10.3" "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -2962,7 +2962,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/6c21254d3383b9158ff5f3b2881cc702bee3d2635b4326757965945691f6e65e25fdfef4f2964382fb4b2f52d9f03b929cb71d267709727df7365e7da80c8c3a + checksum: 10/6efc0a3444ca51adbc0b82e945a1988e1bd42bc153bd64fbbe10ae0e34d8473256e516f2afb138ecbba401802691fedea18d9f7fe798fbd79b4ccf8705c83554 languageName: node linkType: hard From 91e04e66a9ddc0169fad95af76b394193c7369f3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 14:13:05 +0000 Subject: [PATCH 231/312] fix(deps): update opentelemetry-js monorepo to ^0.208.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/backend/package.json | 4 +- yarn.lock | 536 +++++++++++++++++++--------------- 2 files changed, 296 insertions(+), 244 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 2af36b8077..1dbb0eda1c 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -67,8 +67,8 @@ "@backstage/plugin-signals-backend": "workspace:^", "@backstage/plugin-techdocs-backend": "workspace:^", "@opentelemetry/auto-instrumentations-node": "^0.61.0", - "@opentelemetry/exporter-prometheus": "^0.54.0", - "@opentelemetry/sdk-node": "^0.54.0", + "@opentelemetry/exporter-prometheus": "^0.208.0", + "@opentelemetry/sdk-node": "^0.208.0", "example-app": "link:../app" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 5bca6fc9de..e661a43616 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12753,12 +12753,12 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/api-logs@npm:0.54.2" +"@opentelemetry/api-logs@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/api-logs@npm:0.208.0" dependencies: "@opentelemetry/api": "npm:^1.3.0" - checksum: 10/97d887be03ca4a2e69574cc9160464bda00f2a167cc850656ade44b6690a75855d9334983b73827dc44c3672958bc478197f261eae11c2ac68a6df9260c9c3df + checksum: 10/ae339416a244e90b1718af1ed5430348188be60871f3799c847bab409bba1513337cac7da40b4883bf7f280680754319b44a9dc95fa2879d15c0413c9955b145 languageName: node linkType: hard @@ -12828,15 +12828,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/context-async-hooks@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/context-async-hooks@npm:1.27.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/a72fdf5754f6e6d829b81031afe1a8e48a66bb02b13014e05c3fbb9c31fc736f7d303b0bb3491d200ce951582fe04a2d1c6246359683e8fe1b544929d5fd16c5 - languageName: node - linkType: hard - "@opentelemetry/context-async-hooks@npm:2.0.1": version: 2.0.1 resolution: "@opentelemetry/context-async-hooks@npm:2.0.1" @@ -12846,18 +12837,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/core@npm:1.27.0" - dependencies: - "@opentelemetry/semantic-conventions": "npm:1.27.0" +"@opentelemetry/context-async-hooks@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/context-async-hooks@npm:2.2.0" peerDependencies: "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/2e64f35f7f8a53c035eb7e2335c73a6bca0f12a0d45cd8171646492d5efb73f82fb29aae77f34b2d6e93498b38172dee8e5cf769727c44ac08be0d5b21da7512 + checksum: 10/00ee1a35ce9f96632955830d54672025db6d4dc77d440c183cd9751efd5bdfeb8a078094d3d1caaf8b3c250def098990a98bfd8254b1ec04b759f1e3f2fc224e languageName: node linkType: hard -"@opentelemetry/core@npm:2.0.1, @opentelemetry/core@npm:^2.0.0": +"@opentelemetry/core@npm:2.0.1": version: 2.0.1 resolution: "@opentelemetry/core@npm:2.0.1" dependencies: @@ -12868,6 +12857,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/core@npm:2.2.0, @opentelemetry/core@npm:^2.0.0": + version: 2.2.0 + resolution: "@opentelemetry/core@npm:2.2.0" + dependencies: + "@opentelemetry/semantic-conventions": "npm:^1.29.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/f25193ba8b1fadb7bd8ed0d86ac39dd0f3fd3eec47c2fb2745bd22442b2d5e3ca88e5cab6d97111349d3182bf8e4356f8b7c7213ebea8f7719de944ce13a19cb + languageName: node + linkType: hard + "@opentelemetry/core@npm:^1.29.0": version: 1.30.1 resolution: "@opentelemetry/core@npm:1.30.1" @@ -12895,18 +12895,19 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-logs-otlp-grpc@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.54.2" +"@opentelemetry/exporter-logs-otlp-grpc@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.208.0" dependencies: "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-grpc-exporter-base": "npm:0.54.2" - "@opentelemetry/otlp-transformer": "npm:0.54.2" - "@opentelemetry/sdk-logs": "npm:0.54.2" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-grpc-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/sdk-logs": "npm:0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/eacb27329ad5a8154f0f075e20de146cd18b673dfc3db88596678f95afa8939bc853e98e397a817dcf4e5cc024ff7e53320041576b2ce7c0dffd1067e7229b9e + checksum: 10/ed1d00184b8d03aed376a39363c1561eb4d26155147b53dda36f9c9c29e1e144a783c8d5dbeb1f91a157243777d7261b5e24c38202c5cec6d85dc6c45643d96c languageName: node linkType: hard @@ -12925,18 +12926,18 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-logs-otlp-http@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.54.2" +"@opentelemetry/exporter-logs-otlp-http@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.208.0" dependencies: - "@opentelemetry/api-logs": "npm:0.54.2" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-exporter-base": "npm:0.54.2" - "@opentelemetry/otlp-transformer": "npm:0.54.2" - "@opentelemetry/sdk-logs": "npm:0.54.2" + "@opentelemetry/api-logs": "npm:0.208.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/sdk-logs": "npm:0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/88e99302310cef38002c5cc2c682197b8bc5bee5a1dd139d7a9fb5b2645464071e86a4f55607dbf1afae5a4d91c41ddfc982e7230c7ed6e4667e5709b7a9e3c0 + checksum: 10/b200e95bc71bc3c6591ef1f38a37ae27de5d2164a0e0df2b319369f026aaa6df080ed5d5fab02906b35f4c6e02a829ba0b09e041b506ade4b5c3240caafc420d languageName: node linkType: hard @@ -12957,20 +12958,20 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-logs-otlp-proto@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.54.2" +"@opentelemetry/exporter-logs-otlp-proto@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.208.0" dependencies: - "@opentelemetry/api-logs": "npm:0.54.2" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-exporter-base": "npm:0.54.2" - "@opentelemetry/otlp-transformer": "npm:0.54.2" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-logs": "npm:0.54.2" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" + "@opentelemetry/api-logs": "npm:0.208.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-logs": "npm:0.208.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/2b2d6bfe1d0799d0f96fac5a15712c8dd3ef132380ee1856d03672c54802fa9f7664a0897310de708cd42942f916d0fdf20916cf4c5459ef7148db836cd5b1f2 + checksum: 10/71e11a3cb0fdca976ce644443846e4aaaad915848c99a212369e6b2b0cba664bf0cfbccc270f1d4210c6fc925b08a2dfb58f263d219fac39c5243993dcba7aa1 languageName: node linkType: hard @@ -12992,6 +12993,24 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-metrics-otlp-grpc@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-metrics-otlp-grpc@npm:0.208.0" + dependencies: + "@grpc/grpc-js": "npm:^1.7.1" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/exporter-metrics-otlp-http": "npm:0.208.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-grpc-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-metrics": "npm:2.2.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/495ac28c27781750ae19d1e6405e5dd9ff277547e4ab1015e4b3fd2a1d8c26b0977a62dd20ac4e263a980bbace6a2fbe8fed91ae289dddfed6a5a55db0df861e + languageName: node + linkType: hard + "@opentelemetry/exporter-metrics-otlp-http@npm:0.202.0": version: 0.202.0 resolution: "@opentelemetry/exporter-metrics-otlp-http@npm:0.202.0" @@ -13007,6 +13026,21 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-metrics-otlp-http@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-metrics-otlp-http@npm:0.208.0" + dependencies: + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-metrics": "npm:2.2.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/ea4e14481e3a7cd08574f811bf62527305a735972818cc4bb4b2232d19c65732200266de16ae0a59dafd8aa27b7acff77af6e3e300df457841b7e2f5f97ee43b + languageName: node + linkType: hard + "@opentelemetry/exporter-metrics-otlp-proto@npm:0.202.0": version: 0.202.0 resolution: "@opentelemetry/exporter-metrics-otlp-proto@npm:0.202.0" @@ -13023,6 +13057,22 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-metrics-otlp-proto@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-metrics-otlp-proto@npm:0.208.0" + dependencies: + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/exporter-metrics-otlp-http": "npm:0.208.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-metrics": "npm:2.2.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/06d96d582294e3f792508f49a2138b926bde85545057260a97bb7aaed7b935f424e41c25c9b94f5781a1902bc77bcf9c0308d4a8d9e9e1539eb89567adb8b28f + languageName: node + linkType: hard + "@opentelemetry/exporter-prometheus@npm:0.202.0": version: 0.202.0 resolution: "@opentelemetry/exporter-prometheus@npm:0.202.0" @@ -13036,16 +13086,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-prometheus@npm:^0.54.0": - version: 0.54.2 - resolution: "@opentelemetry/exporter-prometheus@npm:0.54.2" +"@opentelemetry/exporter-prometheus@npm:0.208.0, @opentelemetry/exporter-prometheus@npm:^0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-prometheus@npm:0.208.0" dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-metrics": "npm:1.27.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-metrics": "npm:2.2.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/1e2e549ad0b0659c92e5ba7b4fff58754f0199f01d968e5031f4bb6b6ef83c4791f7c74527408ed4661e68908ee728c27ab041c03d62bf2ed16398a7e646afb0 + checksum: 10/3aae6be7f694e8e7add17c76f7c37660003026fc1feb3f5e2d4b6ff171426a96fd595384b7ecca19a5b2a58d887a3fc87906d4524dd8fb8424a1022d595dabb6 languageName: node linkType: hard @@ -13066,19 +13116,20 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-grpc@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.54.2" +"@opentelemetry/exporter-trace-otlp-grpc@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.208.0" dependencies: "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-grpc-exporter-base": "npm:0.54.2" - "@opentelemetry/otlp-transformer": "npm:0.54.2" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-grpc-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/4fd0f50f1faca2ddc8167420517b0f03760fe113e3240fcfc1324d2e0779065b92f2f08775cae020e7a51bf80d202328e44159e89830b160f41e7c1b507debaf + checksum: 10/5405fb3ecf2ab9fcb8279e13ed89eb490ea645cfd9662a064d9bbd7e97c8ff838cd52908d14e27509aa9d00dbded22a9bc707436c54220c114d29c51abddb31f languageName: node linkType: hard @@ -13097,18 +13148,18 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-http@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.54.2" +"@opentelemetry/exporter-trace-otlp-http@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.208.0" dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-exporter-base": "npm:0.54.2" - "@opentelemetry/otlp-transformer": "npm:0.54.2" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/0826980f3509795b48b694bc5c1035e1800ddc0697e29662dd02a6ec09ebe40a57f3c977482cf91b90a6eb5ed99b6a9b1401a144c868c6f4196c6c50da84600a + checksum: 10/69cbd8a223ddd774db97fe3b8e55063ac02e78502a7378596c14101dc98256cef3a5ef0092808ab73d42d09393e000a9eb2041c0d3c087efeb3864bb57f49907 languageName: node linkType: hard @@ -13127,32 +13178,18 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-proto@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.54.2" +"@opentelemetry/exporter-trace-otlp-proto@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.208.0" dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-exporter-base": "npm:0.54.2" - "@opentelemetry/otlp-transformer": "npm:0.54.2" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/3f128e60833c6cc896209ee787234be930ea326d9006973f1f0bc61903715c4ae8d60e46ab4b66cd9baa008c8682b9f8ddef6b99ea8b2929aa4745075a593630 - languageName: node - linkType: hard - -"@opentelemetry/exporter-zipkin@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/exporter-zipkin@npm:1.27.0" - dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" - "@opentelemetry/semantic-conventions": "npm:1.27.0" - peerDependencies: - "@opentelemetry/api": ^1.0.0 - checksum: 10/c1cf75eae527b9159b9e52b9b073d3a62a8e407812832a10bb1c110aad2764692239cb99e46f56b2d4d72fe548494dd829bbf2c25611827fc1b031d8af69e8ef + checksum: 10/af948730fd917471c220fcb9ad5c05bb3ab365e1cd8429fb69f50e855aa76d516a64307c52bb7e756fdd768c02806940d5fe060506191d231903e7db158dfb12 languageName: node linkType: hard @@ -13170,6 +13207,20 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-zipkin@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/exporter-zipkin@npm:2.2.0" + dependencies: + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" + "@opentelemetry/semantic-conventions": "npm:^1.29.0" + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 10/5e7b1464810ab2de77cee437dfc4436ade5c5391a9b80cdd5c1495f3aa32cf8e4cf458cae327dc477260876a8a9ef01bdb5bb3a41d37aaaaf392f2a00185d238 + languageName: node + linkType: hard + "@opentelemetry/instrumentation-amqplib@npm:^0.49.0": version: 0.49.0 resolution: "@opentelemetry/instrumentation-amqplib@npm:0.49.0" @@ -13684,19 +13735,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/instrumentation@npm:0.54.2" +"@opentelemetry/instrumentation@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/instrumentation@npm:0.208.0" dependencies: - "@opentelemetry/api-logs": "npm:0.54.2" - "@types/shimmer": "npm:^1.2.0" - import-in-the-middle: "npm:^1.8.1" - require-in-the-middle: "npm:^7.1.1" - semver: "npm:^7.5.2" - shimmer: "npm:^1.2.1" + "@opentelemetry/api-logs": "npm:0.208.0" + import-in-the-middle: "npm:^2.0.0" + require-in-the-middle: "npm:^8.0.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/1c570fb2e55d2ea7dcc45103afb53ffc331efb675dc404783639c0ed4c93e4e0fa04751672f75ca2a633ca03943e520cf802ee0291e79fa33be54a097af46fc6 + checksum: 10/0591121c1bab29b8246ba879b1ed91f2db17680cfce56a635bf2e81390a9140f029b094ff4498ff154132379192bf424d7d234d2114883735603e4a6581a4a79 languageName: node linkType: hard @@ -13712,15 +13760,15 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-exporter-base@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/otlp-exporter-base@npm:0.54.2" +"@opentelemetry/otlp-exporter-base@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.208.0" dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-transformer": "npm:0.54.2" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/f4eb3009ab87c072b52d33106b60a507b6debbc40ad6762275f6bb48144e1dc401d1100ea87540df08dbdb542f4ea6779aa805313d0b3966eae34ca3dded1436 + checksum: 10/d24e1e766a8059861232fd338be7d65bded5167176b4c7c1be9a1833167f73fd352392a1df28ca002734bdbe00a70d06d1e7daeb97d9d7f71f85dc310a831a42 languageName: node linkType: hard @@ -13738,17 +13786,17 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-grpc-exporter-base@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.54.2" +"@opentelemetry/otlp-grpc-exporter-base@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.208.0" dependencies: "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/otlp-exporter-base": "npm:0.54.2" - "@opentelemetry/otlp-transformer": "npm:0.54.2" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/otlp-exporter-base": "npm:0.208.0" + "@opentelemetry/otlp-transformer": "npm:0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/d7647ff72fab06ed410f3782c0199a24a98da61bcc5fbc19aa8afcd2fac2b376aad48f9206504d40bee6070de3a7e4bf03423d438a3daaa3f71c3a95f261f48b + checksum: 10/f88ee3d2377a27ee41077b5cb79b122ee8f8fa95cab9457ca53f8ef9b92b688b3c455b05c80b55ff3bf23d254eb596c361089fdf4a84b4f0317fc7e059fb4790 languageName: node linkType: hard @@ -13769,20 +13817,20 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-transformer@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/otlp-transformer@npm:0.54.2" +"@opentelemetry/otlp-transformer@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/otlp-transformer@npm:0.208.0" dependencies: - "@opentelemetry/api-logs": "npm:0.54.2" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-logs": "npm:0.54.2" - "@opentelemetry/sdk-metrics": "npm:1.27.0" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" + "@opentelemetry/api-logs": "npm:0.208.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-logs": "npm:0.208.0" + "@opentelemetry/sdk-metrics": "npm:2.2.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" protobufjs: "npm:^7.3.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/316fcdeca02666dfb2919746a83b1523f729875efac45075d513789fc534a3aa4a467c9c519c7fd8a16db78274534373bee0f56f95c89ba09dc4868e2fb42c10 + checksum: 10/867a16a7a723a3df7a7ea8fa9f3c976139e32954efd1146812486cbee20c5eea73ba03841c64312b049e998a7e678589ddef80f7a04aaf95f649753eebe79e3d languageName: node linkType: hard @@ -13795,17 +13843,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/propagator-b3@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/propagator-b3@npm:1.27.0" - dependencies: - "@opentelemetry/core": "npm:1.27.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/21af4d3416155071d49351087f16ba66d255fba33f7bf6ffded538646e5a2efc53228733466c4419761a8f83aa200a940d6e30a27cdcb45ebd2665351ef4175e - languageName: node - linkType: hard - "@opentelemetry/propagator-b3@npm:2.0.1": version: 2.0.1 resolution: "@opentelemetry/propagator-b3@npm:2.0.1" @@ -13817,14 +13854,14 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/propagator-jaeger@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/propagator-jaeger@npm:1.27.0" +"@opentelemetry/propagator-b3@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/propagator-b3@npm:2.2.0" dependencies: - "@opentelemetry/core": "npm:1.27.0" + "@opentelemetry/core": "npm:2.2.0" peerDependencies: "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/896cf18c3278083caec05b63a622b0e3da9abf658670f9170c4c47fcc3a121d878f7c6708b012490bd466e39f361a58773631fbc4784b4c03ad680002c1df50d + checksum: 10/567a1bdd74cd81008fc5e4289c5a870daf5c46326a7c21e9dfd7e462e42c033dd51e7acd8c7b206926b5e78d1a4e3d72d3b13c1ce290ecec984730e847d4e122 languageName: node linkType: hard @@ -13839,6 +13876,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/propagator-jaeger@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/propagator-jaeger@npm:2.2.0" + dependencies: + "@opentelemetry/core": "npm:2.2.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/7da76cab4387cd52723865ccee055dafeed1763c784ea6e13152f1264ad3ccd5b0cace442dac00755eeb17d9af216d0e235aeb6c739a9703e1b1d14b3bf1f5f8 + languageName: node + linkType: hard + "@opentelemetry/redis-common@npm:^0.38.0": version: 0.38.0 resolution: "@opentelemetry/redis-common@npm:0.38.0" @@ -13912,19 +13960,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/resources@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/resources@npm:1.27.0" - dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/semantic-conventions": "npm:1.27.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/654141ea65854bba84c22eeecc5af0054f14462f2664f36ac1ad8a170404e3218fccb98cafaaff4ec45e85523230e58eafbf222c25d00de8a60141ce77a34bbf - languageName: node - linkType: hard - -"@opentelemetry/resources@npm:2.0.1, @opentelemetry/resources@npm:^2.0.0": +"@opentelemetry/resources@npm:2.0.1": version: 2.0.1 resolution: "@opentelemetry/resources@npm:2.0.1" dependencies: @@ -13936,6 +13972,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/resources@npm:2.2.0, @opentelemetry/resources@npm:^2.0.0": + version: 2.2.0 + resolution: "@opentelemetry/resources@npm:2.2.0" + dependencies: + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/semantic-conventions": "npm:^1.29.0" + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: 10/65ccdb1de957dc89aef252cf84b73cd0257ec44feec2b513fcf08e8c4d03e97275661d3f60c4b6134cee33ca4359a5ab6ef5d3a97339a3585aa997a381ef9098 + languageName: node + linkType: hard + "@opentelemetry/sdk-logs@npm:0.202.0": version: 0.202.0 resolution: "@opentelemetry/sdk-logs@npm:0.202.0" @@ -13949,28 +13997,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-logs@npm:0.54.2": - version: 0.54.2 - resolution: "@opentelemetry/sdk-logs@npm:0.54.2" +"@opentelemetry/sdk-logs@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/sdk-logs@npm:0.208.0" dependencies: - "@opentelemetry/api-logs": "npm:0.54.2" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/resources": "npm:1.27.0" + "@opentelemetry/api-logs": "npm:0.208.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/resources": "npm:2.2.0" peerDependencies: "@opentelemetry/api": ">=1.4.0 <1.10.0" - checksum: 10/c00a01de156d529674ed9b607fbabffd3306aa51b7b1897a670214cab7ba7d07da1f2bc5e8d957b0f441448b8ec22ac0526b1b368e36a61edf2bd54bfe571d2d - languageName: node - linkType: hard - -"@opentelemetry/sdk-metrics@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/sdk-metrics@npm:1.27.0" - dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/resources": "npm:1.27.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10/0d6061f42879170e4b4cf4847aa658520a7574f287b33562299ddeb97b0145a4ec91abec63d2292af0d632fce3e63b42f6e6e9a0e9698dc01950b6063363bf98 + checksum: 10/8413cdbf3a072d79a569ca7bcf3c8b333dfb1cb11a7a8841a9bb5482d6ee58d5a3a26efa0b9f02bf410b3f9fa99995ee5aa58aab505de560a2b2ac0b114ce70d languageName: node linkType: hard @@ -13986,6 +14022,18 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-metrics@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/sdk-metrics@npm:2.2.0" + dependencies: + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/resources": "npm:2.2.0" + peerDependencies: + "@opentelemetry/api": ">=1.9.0 <1.10.0" + checksum: 10/d6dacce73319e038d55a67f5b1a7a153531a703ef881b03df52f2d76685a4d53d0d840e02a0e0b24eddae4bd7d11c694e3c146f8db78e19d353316372d04c065 + languageName: node + linkType: hard + "@opentelemetry/sdk-node@npm:^0.202.0": version: 0.202.0 resolution: "@opentelemetry/sdk-node@npm:0.202.0" @@ -14018,42 +14066,35 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-node@npm:^0.54.0": - version: 0.54.2 - resolution: "@opentelemetry/sdk-node@npm:0.54.2" +"@opentelemetry/sdk-node@npm:^0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/sdk-node@npm:0.208.0" dependencies: - "@opentelemetry/api-logs": "npm:0.54.2" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/exporter-logs-otlp-grpc": "npm:0.54.2" - "@opentelemetry/exporter-logs-otlp-http": "npm:0.54.2" - "@opentelemetry/exporter-logs-otlp-proto": "npm:0.54.2" - "@opentelemetry/exporter-trace-otlp-grpc": "npm:0.54.2" - "@opentelemetry/exporter-trace-otlp-http": "npm:0.54.2" - "@opentelemetry/exporter-trace-otlp-proto": "npm:0.54.2" - "@opentelemetry/exporter-zipkin": "npm:1.27.0" - "@opentelemetry/instrumentation": "npm:0.54.2" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/sdk-logs": "npm:0.54.2" - "@opentelemetry/sdk-metrics": "npm:1.27.0" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" - "@opentelemetry/sdk-trace-node": "npm:1.27.0" - "@opentelemetry/semantic-conventions": "npm:1.27.0" + "@opentelemetry/api-logs": "npm:0.208.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/exporter-logs-otlp-grpc": "npm:0.208.0" + "@opentelemetry/exporter-logs-otlp-http": "npm:0.208.0" + "@opentelemetry/exporter-logs-otlp-proto": "npm:0.208.0" + "@opentelemetry/exporter-metrics-otlp-grpc": "npm:0.208.0" + "@opentelemetry/exporter-metrics-otlp-http": "npm:0.208.0" + "@opentelemetry/exporter-metrics-otlp-proto": "npm:0.208.0" + "@opentelemetry/exporter-prometheus": "npm:0.208.0" + "@opentelemetry/exporter-trace-otlp-grpc": "npm:0.208.0" + "@opentelemetry/exporter-trace-otlp-http": "npm:0.208.0" + "@opentelemetry/exporter-trace-otlp-proto": "npm:0.208.0" + "@opentelemetry/exporter-zipkin": "npm:2.2.0" + "@opentelemetry/instrumentation": "npm:0.208.0" + "@opentelemetry/propagator-b3": "npm:2.2.0" + "@opentelemetry/propagator-jaeger": "npm:2.2.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/sdk-logs": "npm:0.208.0" + "@opentelemetry/sdk-metrics": "npm:2.2.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" + "@opentelemetry/sdk-trace-node": "npm:2.2.0" + "@opentelemetry/semantic-conventions": "npm:^1.29.0" peerDependencies: "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10/36de50763eb13ce720ab50670870562f9d12583d9b18d0d7c9dce8b8d5fa08bee1d0c12e8a3b17b5208e934e65091ab2f21f1828a593ed431d6dde51429b28a3 - languageName: node - linkType: hard - -"@opentelemetry/sdk-trace-base@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/sdk-trace-base@npm:1.27.0" - dependencies: - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/resources": "npm:1.27.0" - "@opentelemetry/semantic-conventions": "npm:1.27.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/e0023dedbf5a50265729dd5467be0504f04f6b43d4cc4b914a9a8c082cca1aec9250a1f31c615f3d4ad03124af6e0ba1e14b39fe745d14291198f2a0990edc9c + checksum: 10/929be561500feb30329314ee0f42adc064f0d9def9bf112b11c0f27ed3848366f172a13b178adf56fe96037f9e886c80a46122f105c2756a1fd1f4fdb0f831c2 languageName: node linkType: hard @@ -14070,19 +14111,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-node@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/sdk-trace-node@npm:1.27.0" +"@opentelemetry/sdk-trace-base@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/sdk-trace-base@npm:2.2.0" dependencies: - "@opentelemetry/context-async-hooks": "npm:1.27.0" - "@opentelemetry/core": "npm:1.27.0" - "@opentelemetry/propagator-b3": "npm:1.27.0" - "@opentelemetry/propagator-jaeger": "npm:1.27.0" - "@opentelemetry/sdk-trace-base": "npm:1.27.0" - semver: "npm:^7.5.2" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/resources": "npm:2.2.0" + "@opentelemetry/semantic-conventions": "npm:^1.29.0" peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/53cff496312f0dedd819d2998219596a0d700348bf8ad315ff1d48a9a5e9be070623ed850633436f4ad006263b9cb55ffb6681d4174de99547d4edaa4125c98d + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: 10/0838128f965055b5f8d37026a2f4736ebb77a772a94b9f5b7accb0447a44cfa279da4da959a82565e958e1676ad2a02c17f6fd0e688b205bdde0c846e310c643 languageName: node linkType: hard @@ -14099,10 +14137,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.27.0": - version: 1.27.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.27.0" - checksum: 10/98166522f299e2fe3d43376adbdeb92679b75ebb172e2a3c4c71f2942bd91585e9537618efbbae6dc08177699e5719368edf66d7e69e8636f360b85217bbdbe1 +"@opentelemetry/sdk-trace-node@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/sdk-trace-node@npm:2.2.0" + dependencies: + "@opentelemetry/context-async-hooks": "npm:2.2.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/sdk-trace-base": "npm:2.2.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/4918bc6a66649203d7165a8beca5a3ebaf05d91a2b4910aa195f582a6b50658e86303e00a4fc53172e48cac3cc79b50906d70a3b989895b423dc90dad5e9b5da languageName: node linkType: hard @@ -21893,13 +21937,6 @@ __metadata: languageName: node linkType: hard -"@types/shimmer@npm:^1.2.0": - version: 1.2.0 - resolution: "@types/shimmer@npm:1.2.0" - checksum: 10/f081a31d826ce7bfe8cc7ba8129d2b1dffae44fd580eba4fcf741237646c4c2494ae6de2cada4b7713d138f35f4bc512dbf01311d813dee82020f97d7d8c491c - languageName: node - linkType: hard - "@types/sinon@npm:^17.0.3": version: 17.0.3 resolution: "@types/sinon@npm:17.0.3" @@ -30620,8 +30657,8 @@ __metadata: "@backstage/plugin-signals-backend": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" "@opentelemetry/auto-instrumentations-node": "npm:^0.61.0" - "@opentelemetry/exporter-prometheus": "npm:^0.54.0" - "@opentelemetry/sdk-node": "npm:^0.54.0" + "@opentelemetry/exporter-prometheus": "npm:^0.208.0" + "@opentelemetry/sdk-node": "npm:^0.208.0" example-app: "link:../app" languageName: unknown linkType: soft @@ -33742,6 +33779,18 @@ __metadata: languageName: node linkType: hard +"import-in-the-middle@npm:^2.0.0": + version: 2.0.0 + resolution: "import-in-the-middle@npm:2.0.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-import-attributes: "npm:^1.9.5" + cjs-module-lexer: "npm:^1.2.2" + module-details-from-path: "npm:^1.0.3" + checksum: 10/badb8359552f1e9fedc8569299dd1937e802256ce0fe6aa9cb348bca6f217f06e16a3ca46f889bfcb66028a096a1956674d257de9e809db4271ca0e508521c30 + languageName: node + linkType: hard + "import-lazy@npm:^2.1.0": version: 2.1.0 resolution: "import-lazy@npm:2.1.0" @@ -44586,6 +44635,16 @@ __metadata: languageName: node linkType: hard +"require-in-the-middle@npm:^8.0.0": + version: 8.0.1 + resolution: "require-in-the-middle@npm:8.0.1" + dependencies: + debug: "npm:^4.3.5" + module-details-from-path: "npm:^1.0.3" + checksum: 10/4ce98c681489d383a0ffccb79b06df7a1dffbb31c13f3b713ae2c5a1967597a259e67612507ef69748d83d531bba7c9bb0477211771fe78c685e1d52b1a44b64 + languageName: node + linkType: hard + "requirejs-config-file@npm:^4.0.0": version: 4.0.0 resolution: "requirejs-config-file@npm:4.0.0" @@ -45572,7 +45631,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, 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.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2": +"semver@npm:^7.0.0, 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.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -45910,13 +45969,6 @@ __metadata: languageName: node linkType: hard -"shimmer@npm:^1.2.1": - version: 1.2.1 - resolution: "shimmer@npm:1.2.1" - checksum: 10/aa0d6252ad1c682a4fdfda69e541be987f7a265ac7b00b1208e5e48cc68dc55f293955346ea4c71a169b7324b82c70f8400b3d3d2d60b2a7519f0a3522423250 - languageName: node - linkType: hard - "short-unique-id@npm:^5.3.2": version: 5.3.2 resolution: "short-unique-id@npm:5.3.2" From e9dd634664ff80a225566ad39a881502d1d39a9f Mon Sep 17 00:00:00 2001 From: Jessica He Date: Thu, 4 Dec 2025 15:14:02 -0500 Subject: [PATCH 232/312] fix(auth): update cookie deletion logic for chunked cookies Signed-off-by: Jessica He --- .changeset/sour-bats-press.md | 5 + .../auth-node/src/oauth/OAuthCookieManager.ts | 43 +++-- .../oauth/createOAuthRouteHandlers.test.ts | 172 ++++++++++++++++++ 3 files changed, 207 insertions(+), 13 deletions(-) create mode 100644 .changeset/sour-bats-press.md diff --git a/.changeset/sour-bats-press.md b/.changeset/sour-bats-press.md new file mode 100644 index 0000000000..bfcf3985e6 --- /dev/null +++ b/.changeset/sour-bats-press.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-node': patch +--- + +fix flawed cookie removal logic with chunked tokens diff --git a/plugins/auth-node/src/oauth/OAuthCookieManager.ts b/plugins/auth-node/src/oauth/OAuthCookieManager.ts index 49cb188880..afbedd4dba 100644 --- a/plugins/auth-node/src/oauth/OAuthCookieManager.ts +++ b/plugins/auth-node/src/oauth/OAuthCookieManager.ts @@ -152,6 +152,36 @@ export class OAuthCookieManager { }; const req = res.req; let output = res; + + const chunkedFormatExists = OAuthCookieManager.chunkedCookieExists( + req, + name, + ); + + // If using the default cookieConfigurer, delete old cookie with domain + // explicitly set to the callbackUrl's domain (legacy behavior) + if (this.cookieConfigurer === defaultCookieConfigurer) { + const { hostname: domain } = new URL(this.options.callbackUrl); + output = output.cookie(name, '', { + ...this.getRemoveCookieOptions(), + domain: domain, + }); + + if (chunkedFormatExists) { + for (let chunkNumber = 0; ; chunkNumber++) { + const key = OAuthCookieManager.getCookieChunkName(name, chunkNumber); + const exists = !!req.cookies[key]; + if (!exists) { + break; + } + output = output.cookie(key, '', { + ...this.getRemoveCookieOptions(), + domain: domain, + }); + } + } + } + if (val.length > MAX_COOKIE_SIZE_CHARACTERS) { const nonChunkedFormatExists = !!req.cookies[name]; if (nonChunkedFormatExists) { @@ -169,10 +199,6 @@ export class OAuthCookieManager { return output; } - const chunkedFormatExists = OAuthCookieManager.chunkedCookieExists( - req, - name, - ); if (chunkedFormatExists) { for (let chunkNumber = 0; ; chunkNumber++) { const key = OAuthCookieManager.getCookieChunkName(name, chunkNumber); @@ -184,15 +210,6 @@ export class OAuthCookieManager { } } - // If using the default cookieConfigurer, delete old cookie with domain set to the callbackUrl's domain (legacy behavior) - if (this.cookieConfigurer === defaultCookieConfigurer) { - const { hostname: domain } = new URL(this.options.callbackUrl); - output = output.cookie(name, '', { - ...this.getRemoveCookieOptions(), - domain: domain, - }); - } - return output.cookie(name, val, options); } diff --git a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts index b5b4b7db2c..df012bcff1 100644 --- a/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts +++ b/plugins/auth-node/src/oauth/createOAuthRouteHandlers.test.ts @@ -337,6 +337,178 @@ describe('createOAuthRouteHandlers', () => { expect(getGrantedScopesCookie(agent)).toBeUndefined(); }); + it('should clean up old cookies (non-chunked) with domain attribute during migration', async () => { + const agent = request.agent( + wrapInApp(createOAuthRouteHandlers(baseConfig)), + ); + + agent.jar.setCookie( + 'my-provider-nonce=123', + '127.0.0.1', + '/my-provider/handler', + ); + + agent.jar.setCookie( + 'my-provider-refresh-token=old-refresh-token; Domain=127.0.0.1', + '127.0.0.1', + '/my-provider', + ); + + mockAuthenticator.authenticate.mockResolvedValue({ + fullProfile: { id: 'id' } as PassportProfile, + session: mockSession, + }); + + const res = await agent.get('/my-provider/handler/frame').query({ + state: encodeOAuthState({ + env: 'development', + nonce: '123', + } as OAuthState), + }); + + expect(res.status).toBe(200); + + const setCookieHeaders = [res.get('Set-Cookie') ?? []].flat(); + const hasDeleteWithDomain = setCookieHeaders.some( + cookie => + cookie.includes('my-provider-refresh-token=;') && + cookie.includes('Max-Age=0') && + cookie.includes('Domain=127.0.0.1'), + ); + expect(hasDeleteWithDomain).toBe(true); + + expect(getRefreshTokenCookie(agent).value).toBe('refresh-token'); + }); + + it('should clean up old chunked cookies with domain attribute during migration', async () => { + const agent = request.agent( + wrapInApp(createOAuthRouteHandlers(baseConfig)), + ); + + agent.jar.setCookie( + 'my-provider-nonce=123', + '127.0.0.1', + '/my-provider/handler', + ); + + // Simulate old chunked cookies with domain attribute (legacy format) + agent.jar.setCookie( + `my-provider-refresh-token-0=${fiveKilobyteRefreshToken.slice( + 0, + 4000, + )}; Domain=127.0.0.1`, + '/my-provider', + ); + agent.jar.setCookie( + `my-provider-refresh-token-1=${fiveKilobyteRefreshToken.slice( + 4000, + )}; Domain=127.0.0.1`, + '/my-provider', + ); + + mockAuthenticator.authenticate.mockResolvedValue({ + fullProfile: { id: 'id' } as PassportProfile, + session: { + ...mockSession, + refreshToken: fiveKilobyteRefreshToken, + }, + }); + + const res = await agent.get('/my-provider/handler/frame').query({ + state: encodeOAuthState({ + env: 'development', + nonce: '123', + } as OAuthState), + }); + + expect(res.status).toBe(200); + + const setCookieHeaders = [res.get('Set-Cookie') ?? []].flat(); + const hasChunk0DeleteWithDomain = setCookieHeaders.some( + cookie => + cookie.includes('my-provider-refresh-token-0=') && + cookie.includes('Max-Age=0') && + cookie.includes('Domain=127.0.0.1'), + ); + const hasChunk1DeleteWithDomain = setCookieHeaders.some( + cookie => + cookie.includes('my-provider-refresh-token-1=') && + cookie.includes('Max-Age=0') && + cookie.includes('Domain=127.0.0.1'), + ); + + expect(hasChunk0DeleteWithDomain).toBe(true); + expect(hasChunk1DeleteWithDomain).toBe(true); + + expect(getRefreshTokenCookie(agent, 0).value).toBe( + fiveKilobyteRefreshToken.slice(0, 4000), + ); + expect(getRefreshTokenCookie(agent, 1).value).toBe( + fiveKilobyteRefreshToken.slice(4000), + ); + }); + + it('should clean up old chunked cookies with domain when migrating to non-chunked', async () => { + const agent = request.agent( + wrapInApp(createOAuthRouteHandlers(baseConfig)), + ); + + agent.jar.setCookie( + 'my-provider-nonce=123', + '127.0.0.1', + '/my-provider/handler', + ); + + agent.jar.setCookie( + `my-provider-refresh-token-0=${fiveKilobyteRefreshToken.slice( + 0, + 4000, + )}; Domain=127.0.0.1`, + '/my-provider', + ); + agent.jar.setCookie( + `my-provider-refresh-token-1=${fiveKilobyteRefreshToken.slice( + 4000, + )}; Domain=127.0.0.1`, + '/my-provider', + ); + + mockAuthenticator.authenticate.mockResolvedValue({ + fullProfile: { id: 'id' } as PassportProfile, + session: mockSession, + }); + + const res = await agent.get('/my-provider/handler/frame').query({ + state: encodeOAuthState({ + env: 'development', + nonce: '123', + } as OAuthState), + }); + + expect(res.status).toBe(200); + + const setCookieHeaders = [res.get('Set-Cookie') ?? []].flat(); + const hasChunk0DeleteWithDomain = setCookieHeaders.some( + cookie => + cookie.includes('my-provider-refresh-token-0=;') && + cookie.includes('Max-Age=0') && + cookie.includes('Domain=127.0.0.1'), + ); + const hasChunk1DeleteWithDomain = setCookieHeaders.some( + cookie => + cookie.includes('my-provider-refresh-token-1=;') && + cookie.includes('Max-Age=0') && + cookie.includes('Domain=127.0.0.1'), + ); + + expect(hasChunk0DeleteWithDomain).toBe(true); + expect(hasChunk1DeleteWithDomain).toBe(true); + + expect(getRefreshTokenCookie(agent).value).toBe('refresh-token'); + expect(getRefreshTokenCookie(agent, 0)).toBeUndefined(); + expect(getRefreshTokenCookie(agent, 1)).toBeUndefined(); + }); + it('should authenticate with sign-in, profile transform, and persisted scopes', async () => { const agent = request.agent( wrapInApp( From f08ef4c73cee47746838a043f5a01bd0ce50f0f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:06:16 +0000 Subject: [PATCH 233/312] chore(deps): update actions/checkout action to v6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/api-breaking-changes-comment.yml | 2 +- .github/workflows/api-breaking-changes.yml | 2 +- .github/workflows/automate_changeset_feedback.yml | 2 +- .github/workflows/automate_merge_message.yml | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/cleanup_patch-files.yml | 4 ++-- .github/workflows/deploy_docker-image.yml | 2 +- .github/workflows/deploy_microsite.yml | 8 ++++---- .github/workflows/deploy_packages.yml | 2 +- .github/workflows/issue.yaml | 2 +- .github/workflows/mui-migration-tracker.yml | 2 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/sync_canon.yml | 4 ++-- .github/workflows/sync_code-formatting.yml | 2 +- .github/workflows/sync_dependabot-changesets.yml | 2 +- .github/workflows/sync_patch-release.yml | 2 +- .github/workflows/sync_release-manifest.yml | 4 ++-- .github/workflows/sync_renovate-changesets.yml | 2 +- .github/workflows/sync_snyk-github-issues.yml | 2 +- .github/workflows/sync_snyk-monitor.yml | 2 +- .github/workflows/sync_version-packages.yml | 2 +- .github/workflows/verify_accessibility.yml | 2 +- .github/workflows/verify_chromatic.yml | 2 +- .github/workflows/verify_codeql.yml | 2 +- .github/workflows/verify_docs-quality.yml | 2 +- .github/workflows/verify_e2e-linux.yml | 2 +- .github/workflows/verify_e2e-techdocs.yml | 2 +- .github/workflows/verify_e2e-windows.yml | 2 +- .github/workflows/verify_fossa.yml | 2 +- .github/workflows/verify_microsite.yml | 8 ++++---- .github/workflows/verify_microsite_accessibility.yml | 2 +- .github/workflows/verify_windows.yml | 2 +- 32 files changed, 43 insertions(+), 43 deletions(-) diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 411ff39a9b..92823ad2be 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -99,7 +99,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - name: Fetch cached Manifests File id: cache diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index b78cf7a3f0..d3d7e44c73 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -18,7 +18,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: # Fetch the commit that's merged into the base rather than the target ref # This will let us diff only the contents of the PR, without fetching more history diff --git a/.github/workflows/automate_changeset_feedback.yml b/.github/workflows/automate_changeset_feedback.yml index c61608e656..257db3929a 100644 --- a/.github/workflows/automate_changeset_feedback.yml +++ b/.github/workflows/automate_changeset_feedback.yml @@ -27,7 +27,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: # Fetch the commit that's merged into the base rather than the target ref # This will let us diff only the contents of the PR, without fetching more history diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml index 6d47355ad7..138ba97b1c 100644 --- a/.github/workflows/automate_merge_message.yml +++ b/.github/workflows/automate_merge_message.yml @@ -28,7 +28,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: ref: '${{ github.event.pull_request.merge_commit_sha }}' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ba84c895b..a3c90b6b49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -68,7 +68,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -210,7 +210,7 @@ jobs: INTEGRATION_TEST_AZURE_TOKEN: ${{ secrets.INTEGRATION_TEST_AZURE_TOKEN }} steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: fetch master branch run: git fetch origin master diff --git a/.github/workflows/cleanup_patch-files.yml b/.github/workflows/cleanup_patch-files.yml index c464b850ed..5fdb5d09df 100644 --- a/.github/workflows/cleanup_patch-files.yml +++ b/.github/workflows/cleanup_patch-files.yml @@ -22,7 +22,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: fetch-depth: 0 token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} @@ -89,7 +89,7 @@ jobs: - name: Checkout master if: steps.extract-pr-numbers.outputs.has_pr_numbers == 'true' - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: ref: master token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 324af1845f..3b45b7502a 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -25,7 +25,7 @@ jobs: egress-policy: audit - name: checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: path: backstage ref: ${{ github.event.client_payload.version && env.RELEASE_VERSION || github.ref }} diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index a7cff30530..39e3a3c5b3 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -54,7 +54,7 @@ jobs: result-encoding: string - name: checkout latest release - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: ref: refs/tags/${{ steps.find-release.outputs.result }} @@ -140,7 +140,7 @@ jobs: egress-policy: audit - name: checkout master - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Use Node.js 20.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -252,7 +252,7 @@ jobs: # Stable docs - name: checkout latest release - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: ref: refs/tags/${{ needs.stable.outputs.release }} @@ -286,7 +286,7 @@ jobs: # Next docs - name: checkout master - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: clean: false diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index 983bd1d1c5..f324a0d0d7 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -68,7 +68,7 @@ jobs: INTEGRATION_TEST_AZURE_TOKEN: ${{ secrets.INTEGRATION_TEST_AZURE_TOKEN }} steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index f733f85485..470ba954c1 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -22,7 +22,7 @@ jobs: # We need to checkout the `.github/ISSUE_TEMPLATE` for the advanced labeler action to be able to read the templates # While at it we might as well checkout all of `.github` so that the labeling actions don't need to fetch their configs - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 with: sparse-checkout: .github diff --git a/.github/workflows/mui-migration-tracker.yml b/.github/workflows/mui-migration-tracker.yml index 1f7a190404..842f967fed 100644 --- a/.github/workflows/mui-migration-tracker.yml +++ b/.github/workflows/mui-migration-tracker.yml @@ -23,7 +23,7 @@ jobs: egress-policy: audit - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 8af38e2286..96cb3368be 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -34,7 +34,7 @@ jobs: egress-policy: audit - name: 'Checkout code' - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/sync_canon.yml b/.github/workflows/sync_canon.yml index d66dfd846a..b2a0f3c5fc 100644 --- a/.github/workflows/sync_canon.yml +++ b/.github/workflows/sync_canon.yml @@ -13,7 +13,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Use Node.js 20.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -27,7 +27,7 @@ jobs: cache-prefix: ${{ runner.os }}-v20.x - name: Checkout backstage/docs-ui - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: repository: backstage/docs-ui path: bui-external-docs diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index d9cb714dfa..9719a34886 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -14,7 +14,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: # Fetch changes to previous commit - required for 'only_changed' in Prettier action fetch-depth: 0 diff --git a/.github/workflows/sync_dependabot-changesets.yml b/.github/workflows/sync_dependabot-changesets.yml index 3c5b9327d6..b4672960ed 100644 --- a/.github/workflows/sync_dependabot-changesets.yml +++ b/.github/workflows/sync_dependabot-changesets.yml @@ -16,7 +16,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: fetch-depth: 2 ref: ${{ github.head_ref }} diff --git a/.github/workflows/sync_patch-release.yml b/.github/workflows/sync_patch-release.yml index 24bc3b7556..b4e5cd3c6e 100644 --- a/.github/workflows/sync_patch-release.yml +++ b/.github/workflows/sync_patch-release.yml @@ -30,7 +30,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: fetch-depth: 20000 fetch-tags: true diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index bf721997d5..b57bf09d24 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -13,7 +13,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: # 'v' prefix is added here for the tag, we keep it out of the manifest logic ref: v${{ github.event.client_payload.version }} @@ -35,7 +35,7 @@ jobs: # Checkout backstage/versions into /backstage/versions, which is where store the output - name: Checkout versions - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: repository: backstage/versions path: versions diff --git a/.github/workflows/sync_renovate-changesets.yml b/.github/workflows/sync_renovate-changesets.yml index ce6b93a133..99644e41fe 100644 --- a/.github/workflows/sync_renovate-changesets.yml +++ b/.github/workflows/sync_renovate-changesets.yml @@ -16,7 +16,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: fetch-depth: 2 ref: ${{ github.head_ref }} diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index c900a94bcb..61026bbb8d 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -16,7 +16,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Use Node.js 20.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index 67baf83f2c..8b76338645 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -29,7 +29,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Monitor and Synchronize Snyk Policies uses: snyk/actions/node@9adf32b1121593767fc3c057af55b55db032dc04 # master with: diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 2c30eb9346..a5a035d3a3 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -18,7 +18,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: fetch-depth: 20000 fetch-tags: true diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index bb87cc9822..47241884a8 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -24,7 +24,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Use Node.js 20.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index fbf1824406..e71e58579c 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -29,7 +29,7 @@ jobs: egress-policy: audit - name: Checkout code - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: fetch-depth: 10000 # Required to retrieve git history diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index c74a84ea76..d06c8ea270 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -47,7 +47,7 @@ jobs: egress-policy: audit - name: Checkout repository - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index f5cb67c114..8810f05a16 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -16,7 +16,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Vale does not support file excludes, so we use the script to generate a list of files instead # The action also does not allow args or a local config file to be passed in, so the files array diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 12c4cfb431..805b798cd2 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -47,7 +47,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Configure Git run: | diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index 0a8a89f16b..94c1257823 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -36,7 +36,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: '3.9' diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index d332879667..a1618799df 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -44,7 +44,7 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Configure Git run: | diff --git a/.github/workflows/verify_fossa.yml b/.github/workflows/verify_fossa.yml index f7429d6f06..681ac2c07a 100644 --- a/.github/workflows/verify_fossa.yml +++ b/.github/workflows/verify_fossa.yml @@ -19,7 +19,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Install Fossa run: "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | bash" diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 676944d573..ef70b71f82 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -59,7 +59,7 @@ jobs: result-encoding: string - name: checkout latest release - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: ref: refs/tags/${{ steps.find-release.outputs.result }} @@ -142,7 +142,7 @@ jobs: egress-policy: audit - name: checkout master - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Use Node.js 20.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -238,7 +238,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Use Node.js 20.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 @@ -295,7 +295,7 @@ jobs: run: yarn build:api-docs - name: checkout master - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: clean: false diff --git a/.github/workflows/verify_microsite_accessibility.yml b/.github/workflows/verify_microsite_accessibility.yml index df84f24ff0..b53b2d513f 100644 --- a/.github/workflows/verify_microsite_accessibility.yml +++ b/.github/workflows/verify_microsite_accessibility.yml @@ -19,7 +19,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Use Node.js 20.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index 869aa3c2ed..c5196e395b 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -33,7 +33,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 From 53b731098b21e6286eff7d7cce602215a768a4fc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:48:43 +0000 Subject: [PATCH 234/312] chore(deps): update dependency winston to v3.18.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 119 +++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/yarn.lock b/yarn.lock index c8eb0f3c7f..40f623db7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8261,14 +8261,14 @@ __metadata: languageName: node linkType: hard -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.2 - resolution: "@dabh/diagnostics@npm:2.0.2" +"@dabh/diagnostics@npm:^2.0.8": + version: 2.0.8 + resolution: "@dabh/diagnostics@npm:2.0.8" dependencies: - colorspace: "npm:1.1.x" + "@so-ric/colorspace": "npm:^1.1.6" enabled: "npm:2.0.x" kuler: "npm:^2.0.0" - checksum: 10/d0c7ae32da9fc6061272ef56cf2c5af9c255e034783b68cfe3b0d47e806145d0723e6f5743e4c9fc0abae73658ca309498572688da2fbcfc56c16a8671dbe707 + checksum: 10/ac2267a4ee1874f608493f21d386ea29f0acac6716124e26e3e48e01ce5706b095585a14adce1bee14b6567d3b8fdd0c5a0bbb7ab0e15c9a743d55eb02f093ce languageName: node linkType: hard @@ -18858,6 +18858,16 @@ __metadata: languageName: node linkType: hard +"@so-ric/colorspace@npm:^1.1.6": + version: 1.1.6 + resolution: "@so-ric/colorspace@npm:1.1.6" + dependencies: + color: "npm:^5.0.2" + text-hex: "npm:1.0.x" + checksum: 10/fc3285e5cb9a458d255aa678d9453174ca40689a4c692f1617907996ab8eb78839542439604ced484c4f674a5297f7ba8b0e63fcfe901174f43c3d9c3c881b52 + languageName: node + linkType: hard + "@spotify/eslint-config-base@npm:^15.0.0": version: 15.0.0 resolution: "@spotify/eslint-config-base@npm:15.0.0" @@ -26721,7 +26731,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.1": +"color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -26739,6 +26749,15 @@ __metadata: languageName: node linkType: hard +"color-convert@npm:^3.1.3": + version: 3.1.3 + resolution: "color-convert@npm:3.1.3" + dependencies: + color-name: "npm:^2.0.0" + checksum: 10/36b9b99c138f90eb11a28d1ad911054a9facd6cffde4f00dc49a34ebde7cae28454b2285ede64f273b6a8df9c3228b80e4352f4471978fa8b5005fe91341a67b + languageName: node + linkType: hard + "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" @@ -26746,20 +26765,26 @@ __metadata: languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:^1.1.4, color-name@npm:~1.1.4": +"color-name@npm:^1.1.4, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: 10/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard -"color-string@npm:^1.5.2": - version: 1.9.0 - resolution: "color-string@npm:1.9.0" +"color-name@npm:^2.0.0": + version: 2.1.0 + resolution: "color-name@npm:2.1.0" + checksum: 10/eb014f71d87408e318e95d3f554f188370d354ba8e0ffa4341d0fd19de391bfe2bc96e563d4f6614644d676bc24f475560dffee3fe310c2d6865d007410a9a2b + languageName: node + linkType: hard + +"color-string@npm:^2.1.3": + version: 2.1.4 + resolution: "color-string@npm:2.1.4" dependencies: - color-name: "npm:^1.0.0" - simple-swizzle: "npm:^0.2.2" - checksum: 10/6e347b463aa8e40eb193d6ee21ef501c88dad9c20c4607f5394f3b3c4ce40d828c87a35ac4acdc94696d8dae00a04cb30f0bc73f001ccc812f1d58dccaf26591 + color-name: "npm:^2.0.0" + checksum: 10/689a8688ac3cd55247792c83a9db9bfe675343c7412fedba1eb748ac6a8867dd2bb3d406e309ebfe90336809ee5067c7f2cccfbd10133c5cc9ef1dba5aad58f2 languageName: node linkType: hard @@ -26772,13 +26797,13 @@ __metadata: languageName: node linkType: hard -"color@npm:3.0.x": - version: 3.0.0 - resolution: "color@npm:3.0.0" +"color@npm:^5.0.2": + version: 5.0.3 + resolution: "color@npm:5.0.3" dependencies: - color-convert: "npm:^1.9.1" - color-string: "npm:^1.5.2" - checksum: 10/17ca34cc7d1aa1b41cb414c388ed0376e70401b42e9ca0320ee095f664373bc76f5934d81cb8e118ab6795994ca8abe396261da6ad308d5151b4dcf03cfc9cf9 + color-convert: "npm:^3.1.3" + color-string: "npm:^2.1.3" + checksum: 10/88063ee058b995e5738092b5aa58888666275d1e967333f3814ff4fa334ce9a9e71de78a16fb1838f17c80793ea87f4878c20192037662809fe14eab2d474fd9 languageName: node linkType: hard @@ -26810,16 +26835,6 @@ __metadata: languageName: node linkType: hard -"colorspace@npm:1.1.x": - version: 1.1.2 - resolution: "colorspace@npm:1.1.2" - dependencies: - color: "npm:3.0.x" - text-hex: "npm:1.0.x" - checksum: 10/a959ec1669176aa72185067b7d04dae1cef2698456e1a452a035ce8adcac95673fbb1547e3240903355bcbaa67e031cca0b8b4f7d42c256b3dd94dcead8e1405 - languageName: node - linkType: hard - "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -34111,13 +34126,6 @@ __metadata: languageName: node linkType: hard -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 10/81a78d518ebd8b834523e25d102684ee0f7e98637136d3bdc93fd09636350fa06f1d8ca997ea28143d4d13cb1b69c0824f082db0ac13e1ab3311c10ffea60ade - languageName: node - linkType: hard - "is-async-function@npm:^2.0.0": version: 2.0.0 resolution: "is-async-function@npm:2.0.0" @@ -37378,7 +37386,7 @@ __metadata: languageName: node linkType: hard -"logform@npm:^2.3.2, logform@npm:^2.6.0, logform@npm:^2.6.1": +"logform@npm:^2.3.2, logform@npm:^2.7.0": version: 2.7.0 resolution: "logform@npm:2.7.0" dependencies: @@ -44173,7 +44181,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -44199,7 +44207,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.0.0, readable-stream@npm:^4.3.0, readable-stream@npm:^4.5.2": +"readable-stream@npm:^4.0.0, readable-stream@npm:^4.3.0": version: 4.5.2 resolution: "readable-stream@npm:4.5.2" dependencies: @@ -46042,15 +46050,6 @@ __metadata: languageName: node linkType: hard -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: "npm:^0.3.1" - checksum: 10/c6dffff17aaa383dae7e5c056fbf10cf9855a9f79949f20ee225c04f06ddde56323600e0f3d6797e82d08d006e93761122527438ee9531620031c08c9e0d73cc - languageName: node - linkType: hard - "simple-update-notifier@npm:^2.0.0": version: 2.0.0 resolution: "simple-update-notifier@npm:2.0.0" @@ -50252,33 +50251,33 @@ __metadata: languageName: node linkType: hard -"winston-transport@npm:^4.5.0, winston-transport@npm:^4.7.0": - version: 4.8.0 - resolution: "winston-transport@npm:4.8.0" +"winston-transport@npm:^4.5.0, winston-transport@npm:^4.7.0, winston-transport@npm:^4.9.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" dependencies: - logform: "npm:^2.6.1" - readable-stream: "npm:^4.5.2" + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" triple-beam: "npm:^1.3.0" - checksum: 10/930bdc0ec689d5c4f07a262721da80440336f64739d0ce33db801c7142b4fca5be8ef71b725b670bac609de8b6bce405e5c5f84d355f5176a611209b476cee18 + checksum: 10/5946918720baadd7447823929e94cf0935f92c4cff6d9451c6fcb009bd9d20a3b3df9ad606109e79d1e9f4d2ff678477bf09f81cfefce2025baaf27a617129bb languageName: node linkType: hard "winston@npm:^3.13.0, winston@npm:^3.2.1": - version: 3.16.0 - resolution: "winston@npm:3.16.0" + version: 3.18.3 + resolution: "winston@npm:3.18.3" dependencies: "@colors/colors": "npm:^1.6.0" - "@dabh/diagnostics": "npm:^2.0.2" + "@dabh/diagnostics": "npm:^2.0.8" async: "npm:^3.2.3" is-stream: "npm:^2.0.0" - logform: "npm:^2.6.0" + logform: "npm:^2.7.0" one-time: "npm:^1.0.0" readable-stream: "npm:^3.4.0" safe-stable-stringify: "npm:^2.3.1" stack-trace: "npm:0.0.x" triple-beam: "npm:^1.3.0" - winston-transport: "npm:^4.7.0" - checksum: 10/cacec5268a965dcd3752bfe223d36eb003ac86b0cabc3d794521dfa6f937f78c86c8da84a53956c0f32169a55b438f6db0ee2aa028d57a2bcd69e1895a2e9d97 + winston-transport: "npm:^4.9.0" + checksum: 10/0d94690e051c625ff5a2731b3057ddaa709445cc791c707c56f99ad7b5bf3eebe634656f707c01c9409dc21dbc118903464f80e29c0cb438b1cc2739c0135e51 languageName: node linkType: hard From b72cec522f57b8e78750688493609635e410cd7f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:05:57 +0000 Subject: [PATCH 235/312] chore(deps): update actions/github-script action to v8 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/api-breaking-changes-comment.yml | 2 +- .github/workflows/automate_merge_message.yml | 2 +- .github/workflows/cleanup_patch-files.yml | 4 ++-- .github/workflows/deploy_microsite.yml | 2 +- .github/workflows/mui-migration-tracker.yml | 2 +- .github/workflows/pr-review-comment.yaml | 2 +- .github/workflows/sync_dependabot-changesets.yml | 2 +- .github/workflows/sync_patch-release.yml | 8 ++++---- .github/workflows/sync_release-manifest.yml | 2 +- .github/workflows/sync_renovate-changesets.yml | 2 +- .github/workflows/verify_microsite.yml | 2 +- .github/workflows/welcome.yml | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 411ff39a9b..3f8f7bbeef 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -32,7 +32,7 @@ jobs: - name: 'Download artifacts' # Fetch output (zip archive) from the workflow run that triggered this workflow. - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml index 6d47355ad7..e638937014 100644 --- a/.github/workflows/automate_merge_message.yml +++ b/.github/workflows/automate_merge_message.yml @@ -44,7 +44,7 @@ jobs: node generate.js ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} > message.txt - name: Post Message - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: ISSUE_NUMBER: ${{ github.event.pull_request.number }} with: diff --git a/.github/workflows/cleanup_patch-files.yml b/.github/workflows/cleanup_patch-files.yml index c464b850ed..99193b6e57 100644 --- a/.github/workflows/cleanup_patch-files.yml +++ b/.github/workflows/cleanup_patch-files.yml @@ -34,7 +34,7 @@ jobs: - name: Extract PR numbers from commit messages id: extract-pr-numbers - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | @@ -96,7 +96,7 @@ jobs: - name: Delete patch files if: steps.extract-pr-numbers.outputs.has_pr_numbers == 'true' - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: PR_NUMBERS: ${{ steps.extract-pr-numbers.outputs.pr_numbers }} REF_NAME: ${{ github.ref_name }} diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index a7cff30530..6dc06dda59 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -28,7 +28,7 @@ jobs: egress-policy: audit - name: find latest release - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 id: find-release with: script: | diff --git a/.github/workflows/mui-migration-tracker.yml b/.github/workflows/mui-migration-tracker.yml index 1f7a190404..86befba369 100644 --- a/.github/workflows/mui-migration-tracker.yml +++ b/.github/workflows/mui-migration-tracker.yml @@ -48,7 +48,7 @@ jobs: echo "EOF" >> $GITHUB_ENV - name: Update GitHub Issue - uses: actions/github-script@v7 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | diff --git a/.github/workflows/pr-review-comment.yaml b/.github/workflows/pr-review-comment.yaml index 3c2c34ee38..bb7bd26c53 100644 --- a/.github/workflows/pr-review-comment.yaml +++ b/.github/workflows/pr-review-comment.yaml @@ -23,7 +23,7 @@ jobs: - name: Read PR Number id: pr-number - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | diff --git a/.github/workflows/sync_dependabot-changesets.yml b/.github/workflows/sync_dependabot-changesets.yml index 3c5b9327d6..155edfe6be 100644 --- a/.github/workflows/sync_dependabot-changesets.yml +++ b/.github/workflows/sync_dependabot-changesets.yml @@ -26,7 +26,7 @@ jobs: git config --global user.email noreply@backstage.io git config --global user.name 'Github changeset workflow' - name: Generate changeset - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const { promises: fs } = require('fs'); diff --git a/.github/workflows/sync_patch-release.yml b/.github/workflows/sync_patch-release.yml index 24bc3b7556..5f7d178a9b 100644 --- a/.github/workflows/sync_patch-release.yml +++ b/.github/workflows/sync_patch-release.yml @@ -55,7 +55,7 @@ jobs: - name: Find existing PR id: find-pr if: steps.check-patches.outputs.has_patches == 'true' - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | @@ -82,7 +82,7 @@ jobs: - name: Close PR and delete branch if no patches if: steps.check-patches.outputs.has_patches == 'false' - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | @@ -131,7 +131,7 @@ jobs: - name: Read patch files for PR metadata if: steps.check-patches.outputs.has_patches == 'true' id: read-patches - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | @@ -203,7 +203,7 @@ jobs: - name: Create or update PR if: steps.check-patches.outputs.has_patches == 'true' - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 env: PR_EXISTS: ${{ steps.find-pr.outputs.pr_exists }} PR_NUMBER: ${{ steps.find-pr.outputs.pr_number }} diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index bf721997d5..480e91d88e 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -71,7 +71,7 @@ jobs: git push - name: Dispatch update-helper update - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} # TODO(Rugvip): Remove the create-app dispatch once we've been on the release version for a while diff --git a/.github/workflows/sync_renovate-changesets.yml b/.github/workflows/sync_renovate-changesets.yml index ce6b93a133..4a3f13413a 100644 --- a/.github/workflows/sync_renovate-changesets.yml +++ b/.github/workflows/sync_renovate-changesets.yml @@ -26,7 +26,7 @@ jobs: git config --global user.email noreply@backstage.io git config --global user.name 'Github changeset workflow' - name: Generate changeset - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const { promises: fs } = require("fs"); diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 676944d573..5ccd1ca459 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -33,7 +33,7 @@ jobs: egress-policy: audit - name: find latest release - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 id: find-release with: script: | diff --git a/.github/workflows/welcome.yml b/.github/workflows/welcome.yml index 5d47ba77da..9061b70d79 100644 --- a/.github/workflows/welcome.yml +++ b/.github/workflows/welcome.yml @@ -15,7 +15,7 @@ jobs: if: github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' steps: - name: Add a welcome comment - uses: actions/github-script@v7 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | From 98884553e000f28a92487757d3e4a7e6b3126159 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:06:05 +0000 Subject: [PATCH 236/312] chore(deps): update actions/labeler action to v6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/automate_area-labels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automate_area-labels.yml b/.github/workflows/automate_area-labels.yml index a4ef0d2c29..e85a9cf11f 100644 --- a/.github/workflows/automate_area-labels.yml +++ b/.github/workflows/automate_area-labels.yml @@ -17,7 +17,7 @@ jobs: with: egress-policy: audit - - uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5.0.0 + - uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1 with: repo-token: '${{ secrets.GITHUB_TOKEN }}' sync-labels: true From be6b8aa2af36d1207bd0c9a3919ba1dd6365b7ac Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Fri, 5 Dec 2025 19:42:16 -0600 Subject: [PATCH 237/312] docs - New Frontend System - Add missing `--next` flag (#32041) Signed-off-by: Andre Wanlin --- docs/frontend-system/building-apps/01-index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/frontend-system/building-apps/01-index.md b/docs/frontend-system/building-apps/01-index.md index 0c96bdf15d..ed84aeafb2 100644 --- a/docs/frontend-system/building-apps/01-index.md +++ b/docs/frontend-system/building-apps/01-index.md @@ -14,16 +14,16 @@ A Backstage App is a monorepo setup that includes everything you need to run Bac To create a new Backstage app we recommend using the `@backstage/create-app` command line, and the easiest way to run this package is with `npx`: :::note -The create-app CLI requires Node.js Active LTS Release. +The create-app CLI requires Node.js Active LTS Release, see the [prerequisites documentation](../../getting-started/index.md) for all the details. ::: ```sh # The command bellow creates a Backstage App inside the current folder. # The name of the app-folder is the name that was provided when prompted. -npx @backstage/create-app@latest +npx @backstage/create-app@latest --next ``` -The created-app is currently templated for legacy frontend system applications, so the app wiring code it creates needs to be migrated, see [the app instance](#the-app-instance) section for an example. +Using the `--next` flag will result in a Backstage app using the New Frontend System which will be further explained in the sections below. ## The app instance From 34220166378c12df0f08a6a29116fdeb4ccf7240 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 10:03:47 +0000 Subject: [PATCH 238/312] chore(deps): update dependency node-forge to v1.3.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 2446e0b32e..ee5f5fccb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39713,9 +39713,9 @@ __metadata: linkType: hard "node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.2": - version: 1.3.2 - resolution: "node-forge@npm:1.3.2" - checksum: 10/dcc54aaffe0cf52367214a20c0032aa9b209d9095dd14526504f1972d1900a07e96046b3684cb0c8d0cc3d48744dd18e02b7b447ab28fac615ffb850beeabf18 + version: 1.3.3 + resolution: "node-forge@npm:1.3.3" + checksum: 10/f41c31b9296771a4b8c955d58417471712f54f324603a35f8e6cbac19d5e6eaaf5fd5fd14584dfedecbf46a05438ded6eee60a5f2f0822fc5061aaa073cfc75d languageName: node linkType: hard From 3426e2474d99b3e65880a9f6f135e4369259e188 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 10:06:31 +0000 Subject: [PATCH 239/312] chore(deps): update dependency @google-cloud/storage to v7.18.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 2446e0b32e..fc2eb50cb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9266,8 +9266,8 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^7.0.0": - version: 7.17.3 - resolution: "@google-cloud/storage@npm:7.17.3" + version: 7.18.0 + resolution: "@google-cloud/storage@npm:7.18.0" dependencies: "@google-cloud/paginator": "npm:^5.0.0" "@google-cloud/projectify": "npm:^4.0.0" @@ -9284,7 +9284,7 @@ __metadata: retry-request: "npm:^7.0.0" teeny-request: "npm:^9.0.0" uuid: "npm:^8.0.0" - checksum: 10/e38069a08541757781d7f5ae3f7633e78b4e9b5be1937a7f8f3a4df09c0f6b6b2746ade419ec0e4ffe751ddcc6eb9069cadfc14bbc869edcc4cbc0b1bf6adb4a + checksum: 10/29ca208cf88770dd60ac7868ec69bffa43e3cba03cbb49dd7064593f777e66181a8cba6f1993f36193f009be07bc02129d0ecac9f9f09f8a8b6a8d90a9e5ba86 languageName: node linkType: hard From c132997b5eee2f937f2d1a3f6f6a8e00350f4f85 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 10:06:58 +0000 Subject: [PATCH 240/312] fix(deps): update dependency @opentelemetry/auto-instrumentations-node to ^0.67.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/backend/package.json | 2 +- yarn.lock | 1097 +++++++++++---------------------- 2 files changed, 348 insertions(+), 751 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 1dbb0eda1c..1d0040389c 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -66,7 +66,7 @@ "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", "@backstage/plugin-techdocs-backend": "workspace:^", - "@opentelemetry/auto-instrumentations-node": "^0.61.0", + "@opentelemetry/auto-instrumentations-node": "^0.67.0", "@opentelemetry/exporter-prometheus": "^0.208.0", "@opentelemetry/sdk-node": "^0.208.0", "example-app": "link:../app" diff --git a/yarn.lock b/yarn.lock index 2446e0b32e..73a00ec071 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12744,16 +12744,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.202.0, @opentelemetry/api-logs@npm:^0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/api-logs@npm:0.202.0" - dependencies: - "@opentelemetry/api": "npm:^1.3.0" - checksum: 10/22171137ad1d876a79a6f046b4adcc44a13941a07f2172948e4c8dbb6cacfe276b1fa5087f15e4acdd567f748010d531321c93ebf93a6c09586351c9048bf6c7 - languageName: node - linkType: hard - -"@opentelemetry/api-logs@npm:0.208.0": +"@opentelemetry/api-logs@npm:0.208.0, @opentelemetry/api-logs@npm:^0.208.0": version: 0.208.0 resolution: "@opentelemetry/api-logs@npm:0.208.0" dependencies: @@ -12769,71 +12760,63 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/auto-instrumentations-node@npm:^0.61.0": - version: 0.61.0 - resolution: "@opentelemetry/auto-instrumentations-node@npm:0.61.0" +"@opentelemetry/auto-instrumentations-node@npm:^0.67.0": + version: 0.67.2 + resolution: "@opentelemetry/auto-instrumentations-node@npm:0.67.2" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/instrumentation-amqplib": "npm:^0.49.0" - "@opentelemetry/instrumentation-aws-lambda": "npm:^0.53.1" - "@opentelemetry/instrumentation-aws-sdk": "npm:^0.55.0" - "@opentelemetry/instrumentation-bunyan": "npm:^0.48.0" - "@opentelemetry/instrumentation-cassandra-driver": "npm:^0.48.0" - "@opentelemetry/instrumentation-connect": "npm:^0.46.0" - "@opentelemetry/instrumentation-cucumber": "npm:^0.17.1" - "@opentelemetry/instrumentation-dataloader": "npm:^0.20.0" - "@opentelemetry/instrumentation-dns": "npm:^0.46.0" - "@opentelemetry/instrumentation-express": "npm:^0.51.1" - "@opentelemetry/instrumentation-fastify": "npm:^0.47.1" - "@opentelemetry/instrumentation-fs": "npm:^0.22.0" - "@opentelemetry/instrumentation-generic-pool": "npm:^0.46.1" - "@opentelemetry/instrumentation-graphql": "npm:^0.50.0" - "@opentelemetry/instrumentation-grpc": "npm:^0.202.0" - "@opentelemetry/instrumentation-hapi": "npm:^0.49.0" - "@opentelemetry/instrumentation-http": "npm:^0.202.0" - "@opentelemetry/instrumentation-ioredis": "npm:^0.50.1" - "@opentelemetry/instrumentation-kafkajs": "npm:^0.11.0" - "@opentelemetry/instrumentation-knex": "npm:^0.47.0" - "@opentelemetry/instrumentation-koa": "npm:^0.50.2" - "@opentelemetry/instrumentation-lru-memoizer": "npm:^0.47.0" - "@opentelemetry/instrumentation-memcached": "npm:^0.46.0" - "@opentelemetry/instrumentation-mongodb": "npm:^0.55.1" - "@opentelemetry/instrumentation-mongoose": "npm:^0.49.0" - "@opentelemetry/instrumentation-mysql": "npm:^0.48.1" - "@opentelemetry/instrumentation-mysql2": "npm:^0.48.1" - "@opentelemetry/instrumentation-nestjs-core": "npm:^0.48.1" - "@opentelemetry/instrumentation-net": "npm:^0.46.1" - "@opentelemetry/instrumentation-oracledb": "npm:^0.28.0" - "@opentelemetry/instrumentation-pg": "npm:^0.54.1" - "@opentelemetry/instrumentation-pino": "npm:^0.49.1" - "@opentelemetry/instrumentation-redis": "npm:^0.50.0" - "@opentelemetry/instrumentation-restify": "npm:^0.48.2" - "@opentelemetry/instrumentation-router": "npm:^0.47.0" - "@opentelemetry/instrumentation-runtime-node": "npm:^0.16.0" - "@opentelemetry/instrumentation-socket.io": "npm:^0.49.0" - "@opentelemetry/instrumentation-tedious": "npm:^0.21.1" - "@opentelemetry/instrumentation-undici": "npm:^0.13.2" - "@opentelemetry/instrumentation-winston": "npm:^0.47.0" - "@opentelemetry/resource-detector-alibaba-cloud": "npm:^0.31.2" - "@opentelemetry/resource-detector-aws": "npm:^2.2.0" - "@opentelemetry/resource-detector-azure": "npm:^0.9.0" - "@opentelemetry/resource-detector-container": "npm:^0.7.2" - "@opentelemetry/resource-detector-gcp": "npm:^0.36.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/instrumentation-amqplib": "npm:^0.55.0" + "@opentelemetry/instrumentation-aws-lambda": "npm:^0.61.0" + "@opentelemetry/instrumentation-aws-sdk": "npm:^0.64.0" + "@opentelemetry/instrumentation-bunyan": "npm:^0.54.0" + "@opentelemetry/instrumentation-cassandra-driver": "npm:^0.54.0" + "@opentelemetry/instrumentation-connect": "npm:^0.52.0" + "@opentelemetry/instrumentation-cucumber": "npm:^0.24.0" + "@opentelemetry/instrumentation-dataloader": "npm:^0.26.0" + "@opentelemetry/instrumentation-dns": "npm:^0.52.0" + "@opentelemetry/instrumentation-express": "npm:^0.57.0" + "@opentelemetry/instrumentation-fastify": "npm:^0.53.0" + "@opentelemetry/instrumentation-fs": "npm:^0.28.0" + "@opentelemetry/instrumentation-generic-pool": "npm:^0.52.0" + "@opentelemetry/instrumentation-graphql": "npm:^0.56.0" + "@opentelemetry/instrumentation-grpc": "npm:^0.208.0" + "@opentelemetry/instrumentation-hapi": "npm:^0.55.0" + "@opentelemetry/instrumentation-http": "npm:^0.208.0" + "@opentelemetry/instrumentation-ioredis": "npm:^0.56.0" + "@opentelemetry/instrumentation-kafkajs": "npm:^0.18.0" + "@opentelemetry/instrumentation-knex": "npm:^0.53.1" + "@opentelemetry/instrumentation-koa": "npm:^0.57.0" + "@opentelemetry/instrumentation-lru-memoizer": "npm:^0.53.0" + "@opentelemetry/instrumentation-memcached": "npm:^0.52.0" + "@opentelemetry/instrumentation-mongodb": "npm:^0.61.0" + "@opentelemetry/instrumentation-mongoose": "npm:^0.55.0" + "@opentelemetry/instrumentation-mysql": "npm:^0.54.0" + "@opentelemetry/instrumentation-mysql2": "npm:^0.55.0" + "@opentelemetry/instrumentation-nestjs-core": "npm:^0.55.0" + "@opentelemetry/instrumentation-net": "npm:^0.52.0" + "@opentelemetry/instrumentation-openai": "npm:^0.7.0" + "@opentelemetry/instrumentation-oracledb": "npm:^0.34.0" + "@opentelemetry/instrumentation-pg": "npm:^0.61.1" + "@opentelemetry/instrumentation-pino": "npm:^0.55.0" + "@opentelemetry/instrumentation-redis": "npm:^0.57.1" + "@opentelemetry/instrumentation-restify": "npm:^0.54.0" + "@opentelemetry/instrumentation-router": "npm:^0.53.0" + "@opentelemetry/instrumentation-runtime-node": "npm:^0.22.0" + "@opentelemetry/instrumentation-socket.io": "npm:^0.55.0" + "@opentelemetry/instrumentation-tedious": "npm:^0.27.0" + "@opentelemetry/instrumentation-undici": "npm:^0.19.0" + "@opentelemetry/instrumentation-winston": "npm:^0.53.0" + "@opentelemetry/resource-detector-alibaba-cloud": "npm:^0.31.11" + "@opentelemetry/resource-detector-aws": "npm:^2.8.0" + "@opentelemetry/resource-detector-azure": "npm:^0.16.0" + "@opentelemetry/resource-detector-container": "npm:^0.7.11" + "@opentelemetry/resource-detector-gcp": "npm:^0.43.0" "@opentelemetry/resources": "npm:^2.0.0" - "@opentelemetry/sdk-node": "npm:^0.202.0" + "@opentelemetry/sdk-node": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.4.1 "@opentelemetry/core": ^2.0.0 - checksum: 10/845728e050aa40f501ca3c67ad10ef64859413cb3af6926c6e64dbec206dc4ee7c8cff4d93df95345cebf8970427a03665032f97941a6a1153699f0fbbac1a6f - languageName: node - linkType: hard - -"@opentelemetry/context-async-hooks@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/context-async-hooks@npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/198dacdce36377f6ded7062eb9fc77f86c9fcc8c86dd395e9cb276e14a01c7906ea2f0271999cae21bf251dbec44641286b8bd34a39c67c88c08ed925a986f4b + checksum: 10/b45d91919ccd0bf4ac9a83bb82a9620fa323cf66f5ab95de56a627ae1b05330791104a8c0d317fd8a1a29e956a6b663e6908396476e7ad37d59811136976b167 languageName: node linkType: hard @@ -12846,17 +12829,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/core@npm:2.0.1" - dependencies: - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/dd891afd427067a9e6c610c36ab5638b0b9e5303ccca7c75ad744f5db53c6162a4b5d9cd2f5a77cdc3e4bda2eae850a4e29983ea244c929b7b872b7e086fc61c - languageName: node - linkType: hard - "@opentelemetry/core@npm:2.2.0, @opentelemetry/core@npm:^2.0.0": version: 2.2.0 resolution: "@opentelemetry/core@npm:2.2.0" @@ -12879,22 +12851,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-logs-otlp-grpc@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.202.0" - dependencies: - "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-grpc-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/sdk-logs": "npm:0.202.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/b293a3778b6d5b1fe07b9203fe83d0dde3ea57e48efec8d4ccfc27d007fdb5cdafe7446ff10ea3eca69eb2fba8bdb97546a7dfcfc21b73d303e94e15f917b253 - languageName: node - linkType: hard - "@opentelemetry/exporter-logs-otlp-grpc@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-logs-otlp-grpc@npm:0.208.0" @@ -12911,21 +12867,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-logs-otlp-http@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.202.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.202.0" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/sdk-logs": "npm:0.202.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/850be5f7a2b0468887357845ffb7f8ca53dfedcd8fc79fbd4d8825cabbdc9a27be107e7aecb6b21ba544cead796e13f116396fcc66ba58954e47ac8fc1eaf270 - languageName: node - linkType: hard - "@opentelemetry/exporter-logs-otlp-http@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.208.0" @@ -12941,23 +12882,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-logs-otlp-proto@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.202.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.202.0" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-logs": "npm:0.202.0" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/b69e19a035ae7d2d3f99f5ef40760e9f874685de9679b09a143ae9c120a248d9b5995eeec869ebeed6df1a4ebb4e312b5a569f4189410ad02e6ec4438f8fd63f - languageName: node - linkType: hard - "@opentelemetry/exporter-logs-otlp-proto@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-logs-otlp-proto@npm:0.208.0" @@ -12975,24 +12899,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-metrics-otlp-grpc@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-metrics-otlp-grpc@npm:0.202.0" - dependencies: - "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/exporter-metrics-otlp-http": "npm:0.202.0" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-grpc-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-metrics": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/383e6eee1016dbdfe78ed8c96fb6e8e314e0103a11353373f794637594b2b935efc5707eee33712a4ed242b12c808a09584105db1b2e2deab477d80e3d2d06ed - languageName: node - linkType: hard - "@opentelemetry/exporter-metrics-otlp-grpc@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-metrics-otlp-grpc@npm:0.208.0" @@ -13011,21 +12917,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-metrics-otlp-http@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-metrics-otlp-http@npm:0.202.0" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-metrics": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/ed694b8369bb2f979f0aa3552716b267060e5d8d7853fd645e0ae776888091a08c079e9f1e88d8f7eb93d9fe31f0fbb887ebb9469177c2ec2af16c247f8faf5d - languageName: node - linkType: hard - "@opentelemetry/exporter-metrics-otlp-http@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-metrics-otlp-http@npm:0.208.0" @@ -13041,22 +12932,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-metrics-otlp-proto@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-metrics-otlp-proto@npm:0.202.0" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/exporter-metrics-otlp-http": "npm:0.202.0" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-metrics": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/22ecc54c4a19a36d5f6ba8cc061e25fba6ff9f2bbaff9a84f8c1e7e5253b2b0dc07ac18e21884eafcb31e6693ce59912baeb19c722a07ad4da9f22e2a6f94549 - languageName: node - linkType: hard - "@opentelemetry/exporter-metrics-otlp-proto@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-metrics-otlp-proto@npm:0.208.0" @@ -13073,19 +12948,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-prometheus@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-prometheus@npm:0.202.0" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-metrics": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/e6cf4dfdc3bd6ccd402a00e0cb1bd2fa5cc4c813a86b23d27bf851e38a22788dac234c10d643a1506acf10415b1cba9bd68da7554358ba32a0ad8b978bc2d467 - languageName: node - linkType: hard - "@opentelemetry/exporter-prometheus@npm:0.208.0, @opentelemetry/exporter-prometheus@npm:^0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-prometheus@npm:0.208.0" @@ -13099,23 +12961,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-grpc@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.202.0" - dependencies: - "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-grpc-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/28cd0d2a0d3ef08cd7830b044690c5e6d86eb36f0d1298d9cd921f89c382cfbd3f80272c9fb8c12ece7eb417a48f852f6b3c299c21b0eba5d340d244cd41e6e2 - languageName: node - linkType: hard - "@opentelemetry/exporter-trace-otlp-grpc@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.208.0" @@ -13133,21 +12978,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-http@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.202.0" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/f9e60e51b5dcca3d4d32f2091f04faa2bcaf677b9f8a88990c8cdc7c6345e4244e46c4e8df1c336fc6f741aea092407032ade1236089eb729196e6fcdc055ad0 - languageName: node - linkType: hard - "@opentelemetry/exporter-trace-otlp-http@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.208.0" @@ -13163,21 +12993,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-trace-otlp-proto@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.202.0" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/884d1d097f3defee57dbb64281815a062603f64ce81e2f4460477925f4fb23c1d42aac2bb9d3b188e00cacaa9d231ef11e2e0f36e4b26863d009e795953191d8 - languageName: node - linkType: hard - "@opentelemetry/exporter-trace-otlp-proto@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.208.0" @@ -13193,20 +13008,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/exporter-zipkin@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/exporter-zipkin@npm:2.0.1" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ^1.0.0 - checksum: 10/67fa9c4e33276218fd8a4c6fb04bab55aaf35383e396056034ab1f826f3d00c672b91ec890a9859df13c9f2890d3dc3d9f1a2b2904f0855272fc0cb48157e874 - languageName: node - linkType: hard - "@opentelemetry/exporter-zipkin@npm:2.2.0": version: 2.2.0 resolution: "@opentelemetry/exporter-zipkin@npm:2.2.0" @@ -13221,521 +13022,512 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-amqplib@npm:^0.49.0": - version: 0.49.0 - resolution: "@opentelemetry/instrumentation-amqplib@npm:0.49.0" - dependencies: - "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/891f201f476d77b960b6f3dc0186b3af52f7c249b69da365da184b01cf2056052fa93f85196e8811156908b2f532adf6a13773f102b4a78626046275827df2b1 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-aws-lambda@npm:^0.53.1": - version: 0.53.1 - resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.53.1" - dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - "@types/aws-lambda": "npm:8.10.150" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/a305988e8332e416c5fd81ffbdad71ffd68eeb623c55ea26fa25212f3c0c254ce30022461067981e4a7c5cfb1e25d1f1ed306d09f09d68c17fbbe693ec2ed4a1 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-aws-sdk@npm:^0.55.0": +"@opentelemetry/instrumentation-amqplib@npm:^0.55.0": version: 0.55.0 - resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.55.0" + resolution: "@opentelemetry/instrumentation-amqplib@npm:0.55.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/propagation-utils": "npm:^0.31.2" + "@opentelemetry/instrumentation": "npm:^0.208.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/03e028c4dfe9a8a9372f6ef6d4c4520343a3ec571e2e04dcd29e684cf25d212f6331be268656006220b476f6b46748aba2d142b7b4c62efd24baebf6a3f1b77b + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-aws-lambda@npm:^0.61.0": + version: 0.61.0 + resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.61.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@types/aws-lambda": "npm:^8.10.155" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/5d664e1ea663bd68a769eeaf58d23c3a74efe09e5f95d523fa758455f670909a835445f4c6816de70c6c481a3d080ccdd94fb7d8f4eadf5062314f12903ffd81 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-aws-sdk@npm:^0.64.0": + version: 0.64.0 + resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.64.0" + dependencies: + "@opentelemetry/core": "npm:^2.0.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.34.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/c2ce4063f4761baa6e12d1830270952d67d9bd0fdba3d15b97ec107df54d2a21c01be6960e0c2e3dcb2358bc57ba977b694e02c78a01c0f193377d0e4557dd7e + checksum: 10/7d53e9dee6058f940af1661392876a4be9ac4d4ca5d3b5fe60163672e4043fb1f848a677a7dbf39abdda887dfb31568061f57cb36795ef54ba10ee5260728f78 languageName: node linkType: hard -"@opentelemetry/instrumentation-bunyan@npm:^0.48.0": - version: 0.48.0 - resolution: "@opentelemetry/instrumentation-bunyan@npm:0.48.0" +"@opentelemetry/instrumentation-bunyan@npm:^0.54.0": + version: 0.54.0 + resolution: "@opentelemetry/instrumentation-bunyan@npm:0.54.0" dependencies: - "@opentelemetry/api-logs": "npm:^0.202.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/api-logs": "npm:^0.208.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@types/bunyan": "npm:1.8.11" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/c0147693e5e6202198448b0ca8b2550ca972d9a72a78b3c95edb1942b6e0a1b295351c205dbfc7562e11a50b815a64b3b920ceb474d6a59daa4cfbea01d8f621 + checksum: 10/563eeb0788c551e03947730586ee75a32f9fac28512fb97f109eccd582fe3c049d8642c9f1a638ca028215899d83c8cc6f0b3f0c36467c5e69e7160dd81c0bc4 languageName: node linkType: hard -"@opentelemetry/instrumentation-cassandra-driver@npm:^0.48.0": - version: 0.48.0 - resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.48.0" +"@opentelemetry/instrumentation-cassandra-driver@npm:^0.54.0": + version: 0.54.0 + resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.54.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/7a3b2ba1b472108f0b1e1e799d7f8f8d0eb10034378b4b06fbec0e1fc59e095f3e374dd7739047856d27f00d8706603db08cfb90aa37b427fce18b43b0731932 + checksum: 10/0e9f2ccb4682c9c5244cca26e17f6c553ea8dc73ecdbadbe9564911e137103e33fd3e653c75825325fa51d44b125eb6ba7e89ac49508dfaa14c02553ae3e8848 languageName: node linkType: hard -"@opentelemetry/instrumentation-connect@npm:^0.46.0": - version: 0.46.0 - resolution: "@opentelemetry/instrumentation-connect@npm:0.46.0" +"@opentelemetry/instrumentation-connect@npm:^0.52.0": + version: 0.52.0 + resolution: "@opentelemetry/instrumentation-connect@npm:0.52.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" "@types/connect": "npm:3.4.38" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/e5b96bde0b8fbcf2edc22ed3a5ac655758440e9a3f8c4f39ae3dcf88edda8be6dd0bb121b3cffcf8df8b53fb0aef3c5bc62549cf5c24439fb9ba15a03f93280c + checksum: 10/c526768a10a4f6c76b791e382edeae2217a7b3c448b1a3458ef34ca46a645b6cf67eeec79bae119e2005f5d766c8eabc03b16058da6e94300110d029157e7e95 languageName: node linkType: hard -"@opentelemetry/instrumentation-cucumber@npm:^0.17.1": - version: 0.17.1 - resolution: "@opentelemetry/instrumentation-cucumber@npm:0.17.1" +"@opentelemetry/instrumentation-cucumber@npm:^0.24.0": + version: 0.24.0 + resolution: "@opentelemetry/instrumentation-cucumber@npm:0.24.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 10/ef65ef03f4aa79a3b4ae223aebf714b62b7d96261680932df02ba4590685253d4e7bf44ac58109e39a951bb0217ffef11f12224ede62ce65ac93a46f2b65e517 + checksum: 10/fc9542beb91284eb42cd72fb5d18b8a183ccdc7b40ca1c5f04013aded6517a336544d6e83fadfff51dfffb2abf748f0dc546eddb67330bed773d7275038697df languageName: node linkType: hard -"@opentelemetry/instrumentation-dataloader@npm:^0.20.0": - version: 0.20.0 - resolution: "@opentelemetry/instrumentation-dataloader@npm:0.20.0" +"@opentelemetry/instrumentation-dataloader@npm:^0.26.0": + version: 0.26.0 + resolution: "@opentelemetry/instrumentation-dataloader@npm:0.26.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/4d9e5600644e5d941860d492be9bd1b3966acd69e281f491f151347d482464e1481f7ce8c6898e744e235d052c16868774b6353d606a58a3538b9e32d43c2b92 + checksum: 10/e3efde5515698fc25437d4e347cc829da1f82df95c0523149913030b53e4a359577ee988b66d5b0a3bd8230697cd785e983176c0b4bb14d001c64c8948d46c10 languageName: node linkType: hard -"@opentelemetry/instrumentation-dns@npm:^0.46.0": - version: 0.46.0 - resolution: "@opentelemetry/instrumentation-dns@npm:0.46.0" +"@opentelemetry/instrumentation-dns@npm:^0.52.0": + version: 0.52.0 + resolution: "@opentelemetry/instrumentation-dns@npm:0.52.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/68c72e76a5c53d7d49632fb0126c097aa717c173fc0a2502f4b03be382844fbcdcc385f49dab502853006e3e64555879e5c26a24d126a87d7825ad01be1a9f01 + checksum: 10/a6ff78cacbcc50ff3d4f805144223a0fc2fa7df2bea5c198511c2e1a546550dddef75f8b85b5ed78bf5ffa50d006e166ae1f19ab6a4125edbdab7cc92cb49bad languageName: node linkType: hard -"@opentelemetry/instrumentation-express@npm:^0.51.1": - version: 0.51.1 - resolution: "@opentelemetry/instrumentation-express@npm:0.51.1" +"@opentelemetry/instrumentation-express@npm:^0.57.0": + version: 0.57.0 + resolution: "@opentelemetry/instrumentation-express@npm:0.57.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/a0ecb32a8599d826a032df0c5558d43bf5024b131b93e6e57c659f208e265d40bafbad15c46a5621c698e7b6383ef2a02f4600633d52ba2f4b6fb75c08eed631 + checksum: 10/66c10e878433d0e90bbf88dfbf28b23ecdbc3777326f46548c16c5062118b37c623011cef390a5ed3de2855f67f91587703581846f4e1e702ff3a068404f3e89 languageName: node linkType: hard -"@opentelemetry/instrumentation-fastify@npm:^0.47.1": - version: 0.47.1 - resolution: "@opentelemetry/instrumentation-fastify@npm:0.47.1" +"@opentelemetry/instrumentation-fastify@npm:^0.53.0": + version: 0.53.0 + resolution: "@opentelemetry/instrumentation-fastify@npm:0.53.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/89ffbe54deaa90a33deb873db24967f7e0380c4dc448703ed6b7abbadd345687902e3511e23c1af622ce55e9b70a12e724d3773ad61d7007e4d3d8a47615591d + checksum: 10/fdcedc2aeb316f7fd6af490280b766d95939bd70e1edad415b6b5f228378e1ee10828bfa0222bbe3bab04527a48567a98593445046aea584cdecb4e632c3d1cd languageName: node linkType: hard -"@opentelemetry/instrumentation-fs@npm:^0.22.0": - version: 0.22.0 - resolution: "@opentelemetry/instrumentation-fs@npm:0.22.0" +"@opentelemetry/instrumentation-fs@npm:^0.28.0": + version: 0.28.0 + resolution: "@opentelemetry/instrumentation-fs@npm:0.28.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/56090810d8c31949ddbd9f1e2c9f91ca38e7214ada60bc9abc72cfac94fb303e5cc905a63e0c1ab2b524aaf80e7a152a3ab286d792fe82bb4e814cd5eb1d2f16 + checksum: 10/f62c1256e3c47d958b296b57f8ab1d0b8b8851e9c3d6ad8691af514a33a2341ec1a9345d57a705a420a7a5757a297e03cc04c497a5701ac027a98b63b1a90ab1 languageName: node linkType: hard -"@opentelemetry/instrumentation-generic-pool@npm:^0.46.1": - version: 0.46.1 - resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.46.1" +"@opentelemetry/instrumentation-generic-pool@npm:^0.52.0": + version: 0.52.0 + resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.52.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/10f8cbf5d052c3cb895857390f6a53ec292a1d0e8ec82df94bfb6cd49a0d0a0db0ba66cbb4127298418be4b68444d048f70833257d37cad404edf17578d477e5 + checksum: 10/f94b27d84a4172f95f7a33fa967f2ad562d4dba3182b1e8b6658b4eceb8a26a678b407a232858378a034dd8ffdb4e66bd98b4a8861fe042be59af3e4b400244f languageName: node linkType: hard -"@opentelemetry/instrumentation-graphql@npm:^0.50.0": - version: 0.50.0 - resolution: "@opentelemetry/instrumentation-graphql@npm:0.50.0" +"@opentelemetry/instrumentation-graphql@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation-graphql@npm:0.56.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/a359e0839381d74dacf0b3acc8c951686cf73d6201fd305583e1c58ed6f4dcf1421efa322075808ed9c9298af3e579cbe4ac275960ceb7aceb8639b7346b5990 + checksum: 10/7895e702484367ef9c26f7c79f0039ac9677133342253f3935e7203156cbc396dfd799ef84e4758e83c008ed8c6b6893a05fc1df2566cfaae65e3770485ad8c9 languageName: node linkType: hard -"@opentelemetry/instrumentation-grpc@npm:^0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/instrumentation-grpc@npm:0.202.0" +"@opentelemetry/instrumentation-grpc@npm:^0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/instrumentation-grpc@npm:0.208.0" dependencies: - "@opentelemetry/instrumentation": "npm:0.202.0" + "@opentelemetry/instrumentation": "npm:0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.29.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/4b59bb35de3b900e9fc5e9ba44d1828b6b4eea15f1ce65a63ad9e047cff5989a9d1d23180e8c221c7bd375c104ecd23f2e7650405e37cf8d8a46edda53d447ee + checksum: 10/8f5a75c1cac44c2e15963b0c14259de7a3f0320391d24f4bbda2830e9471481af84be7f8b978c679d6dd94d5dfbb96bbe94c4dd601f70fb7ed2df10de89c195a languageName: node linkType: hard -"@opentelemetry/instrumentation-hapi@npm:^0.49.0": - version: 0.49.0 - resolution: "@opentelemetry/instrumentation-hapi@npm:0.49.0" +"@opentelemetry/instrumentation-hapi@npm:^0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-hapi@npm:0.55.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/2e2640e26ae193000b63fb62aea5dc03eff2c4896442361ebc7e3e482713166bad49616a5d3c157fb8dd0fab908d0c4412e24f4d806b071435890436ccf8fd9f + checksum: 10/575c059a2dbcd77256acfca897d2cc08968b4e7e9e41449dfd5de2ca761fa2a544aaa6f2a8213f7374a42026e1f0b7e612ce01337e43108631e20e19fec01c81 languageName: node linkType: hard -"@opentelemetry/instrumentation-http@npm:^0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/instrumentation-http@npm:0.202.0" +"@opentelemetry/instrumentation-http@npm:^0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/instrumentation-http@npm:0.208.0" dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/instrumentation": "npm:0.202.0" + "@opentelemetry/core": "npm:2.2.0" + "@opentelemetry/instrumentation": "npm:0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.29.0" forwarded-parse: "npm:2.1.2" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/fb36be7a08a33d07bb51e8c8dc64be937117f03d93a1425bc9ddb041464da1f01914adc1bc8173a145b61a7fd8b6151db8e284db1bcce12135d6b27b01c2ad0a + checksum: 10/f5e11eb7054d6701ea44ecb90321558e524b253a7945d1539f9971f83c5dfc1d294a6ac632eb35d2f19309837f16f6c405958c0bd9c50a8751dd07ee0704ca4e languageName: node linkType: hard -"@opentelemetry/instrumentation-ioredis@npm:^0.50.1": - version: 0.50.1 - resolution: "@opentelemetry/instrumentation-ioredis@npm:0.50.1" +"@opentelemetry/instrumentation-ioredis@npm:^0.56.0": + version: 0.56.0 + resolution: "@opentelemetry/instrumentation-ioredis@npm:0.56.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/redis-common": "npm:^0.38.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/redis-common": "npm:^0.38.2" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/08e6aed4aa6d0ad0d1dd4a6d02b260f46d1ce5168b8dd1f6b2d3f8c71f0204378e1b52f175817e53cdb6f98841a6ddfc5ca2005592ea678f046316dc4edff281 + checksum: 10/8fd316eb94323fca62b71b51df4ef1dc0cf7879315f3006633d07cd9ea87bb9ff1315e216e6e61013f6ab84142593935d2920812794736ce4f0ca97da522ff09 languageName: node linkType: hard -"@opentelemetry/instrumentation-kafkajs@npm:^0.11.0": - version: 0.11.0 - resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.11.0" +"@opentelemetry/instrumentation-kafkajs@npm:^0.18.0": + version: 0.18.0 + resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.18.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.30.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/6998633cda7260fde928f8691482bdbf5478d7f4c7c0be4c199c366345525733ec87e94b0a38b5b65a719489998f377ad52a065ebe0eeafc010e237533f1ce55 + checksum: 10/e3b998d905dc6c87b542e6b7004e12eeac19903872fe3e7d4c17771f69843b721dd73d0b136b2f21207d4dec7e53fd17d5042cf27a0028ec3c3074c0861654fe languageName: node linkType: hard -"@opentelemetry/instrumentation-knex@npm:^0.47.0": - version: 0.47.0 - resolution: "@opentelemetry/instrumentation-knex@npm:0.47.0" +"@opentelemetry/instrumentation-knex@npm:^0.53.1": + version: 0.53.1 + resolution: "@opentelemetry/instrumentation-knex@npm:0.53.1" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.33.1" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/f3a753505fd6499d05022fbddb0977b781ad41a857df9cde7410273ca3ad9f2343afc6136138bbdde16e5358d77bba66e2ddf7f93d4dab878b6e5b85d72fc6d8 + checksum: 10/a9acaaefcf1f4523b47b33f8e5bd99dfc9f803aa7c8c3fc79e3cc497a022edeefa890905708eccbecd0dff37b8cce5543a6d17c61e565d87bfa9bd1de43e1526 languageName: node linkType: hard -"@opentelemetry/instrumentation-koa@npm:^0.50.2": - version: 0.50.2 - resolution: "@opentelemetry/instrumentation-koa@npm:0.50.2" +"@opentelemetry/instrumentation-koa@npm:^0.57.0": + version: 0.57.0 + resolution: "@opentelemetry/instrumentation-koa@npm:0.57.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.36.0" peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/3598afe454d6df1861dd0b7f4a8b617f4d3b89789961577912151df9a2d159523490f25c3e8d03234b5faa62d5f8f8985e8a52b65122cae4c58016debf109edb + "@opentelemetry/api": ^1.9.0 + checksum: 10/7df972b4a5c6c8cad6e1fe6ab3a6ea391d4db09f0d3e2b0b46f0ffa0289df88fe2446e06c08744d65293aeaff2f28628d51f8dea5d97404907a49f9e567f50f6 languageName: node linkType: hard -"@opentelemetry/instrumentation-lru-memoizer@npm:^0.47.0": - version: 0.47.0 - resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.47.0" +"@opentelemetry/instrumentation-lru-memoizer@npm:^0.53.0": + version: 0.53.0 + resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.53.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/91fd11ce2f012b715a1bffb5c81ca5d681e5c2d9f638a2e459f2d4bead587ed755e438c234132484d6d030f0b3104a0747596708f51df109449cd970e965e6ae + checksum: 10/6f83abdb58e83fe87ce926236c54fbaaf49f64f8149e455b1dc1f33d735faf575e6f6d4df36b8eadf176a74d01cd05c6f3a3babff56a5a7448744e0cba39df5e languageName: node linkType: hard -"@opentelemetry/instrumentation-memcached@npm:^0.46.0": - version: 0.46.0 - resolution: "@opentelemetry/instrumentation-memcached@npm:0.46.0" +"@opentelemetry/instrumentation-memcached@npm:^0.52.0": + version: 0.52.0 + resolution: "@opentelemetry/instrumentation-memcached@npm:0.52.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.33.0" "@types/memcached": "npm:^2.2.6" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/12bbcc4b9dcc62b0b48ba83f555112881cc9723f174335bbf7695374ae17582fb12cb2f72295656c84608b73ef5a88afcf551d5c392afebddbf97d7a64230080 + checksum: 10/2288ebc16ab06313e18d5d3e12cae91c73515a17da6108c034506fe68dcadd96117c30cbcd89133131a02ea28aae33269c73b509db17cddb30f42697e482e1dc languageName: node linkType: hard -"@opentelemetry/instrumentation-mongodb@npm:^0.55.1": - version: 0.55.1 - resolution: "@opentelemetry/instrumentation-mongodb@npm:0.55.1" +"@opentelemetry/instrumentation-mongodb@npm:^0.61.0": + version: 0.61.0 + resolution: "@opentelemetry/instrumentation-mongodb@npm:0.61.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/233822b1886b5693923430fb126363005424bcabd03681bf2cf4c035a52dbc6475718417b2a284d38f2fdcac1423625f5a25b767018a3686e9da54f4313f4da9 + checksum: 10/fe5eb79c8924aa268c863af4a5878c47ba5730622cb861899802144a4dfe7431e7af6e9b568dd205fdedfd77fbbfe95539cdcf35e6b326ba695eeaadd61240ed languageName: node linkType: hard -"@opentelemetry/instrumentation-mongoose@npm:^0.49.0": - version: 0.49.0 - resolution: "@opentelemetry/instrumentation-mongoose@npm:0.49.0" +"@opentelemetry/instrumentation-mongoose@npm:^0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-mongoose@npm:0.55.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/4b2b320346a0d00a56438c041ddda6cbd8b34d37de613daab618892fcba380b0cbd5396886028e9e2ac81c497f25e66f7668ccbf57c3f870678d30fc16e4ae24 + checksum: 10/5ee25946b7a6a50178ff6b50d5a88b8a189f0ba6effc45ee07e6026c353b1cad605f51cb9c61f9200e066833a7f3b588ede02582dc7dbbce4a9d715ec312cea6 languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql2@npm:^0.48.1": - version: 0.48.1 - resolution: "@opentelemetry/instrumentation-mysql2@npm:0.48.1" +"@opentelemetry/instrumentation-mysql2@npm:^0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-mysql2@npm:0.55.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - "@opentelemetry/sql-common": "npm:^0.41.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.33.0" + "@opentelemetry/sql-common": "npm:^0.41.2" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/d52d0950201adb3c4ce8f82edc544eee489de0971045f1e907832d6e7424d372da3a1e62143f6fcde698d883dfbe7adbea243cef9653f467c96d011d98225676 + checksum: 10/ca5bb6c99bd8fd3590341955aeece3c69982e07b2df520998ea282ac9135311f8fc37ba55fb66adf07a80adcf98d42892b698422c9817667231064cc251e626d languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql@npm:^0.48.1": - version: 0.48.1 - resolution: "@opentelemetry/instrumentation-mysql@npm:0.48.1" +"@opentelemetry/instrumentation-mysql@npm:^0.54.0": + version: 0.54.0 + resolution: "@opentelemetry/instrumentation-mysql@npm:0.54.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@types/mysql": "npm:2.15.27" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/8e4493e5a685d98f0b7797b6f3996f7949cdae758e68c12e2edb57d8388be47a67e668c12340f1a2e18c692c8db990a765913120e402215c8d473695c9a281b8 + checksum: 10/d4756b4d72c0232f92fc00fd8fb03d02fe27d9108c8c74ae1d8aa50800207f7e6dc10aa8f5a636d9b6c8865b10e10a79741242c08af4d4f0599977182b7508ae languageName: node linkType: hard -"@opentelemetry/instrumentation-nestjs-core@npm:^0.48.1": - version: 0.48.1 - resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.48.1" +"@opentelemetry/instrumentation-nestjs-core@npm:^0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.55.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.30.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/fbbd5dd411b79371725e9075bca0c492a524ebd90d5e17434c3608bae6ec1cbbd5cca4dc0385c423e59963bfc1b945efdff5cd02f09a3f2a06391fc176d52c50 + checksum: 10/6c930d4b670f3a1764d11539867656594fa1a74d47597ca0b4fdf0425403db14552cf41a28ae4169d2034680f9d968a1c90cb5bfe2a6504bf101eaef026cc2fe languageName: node linkType: hard -"@opentelemetry/instrumentation-net@npm:^0.46.1": - version: 0.46.1 - resolution: "@opentelemetry/instrumentation-net@npm:0.46.1" +"@opentelemetry/instrumentation-net@npm:^0.52.0": + version: 0.52.0 + resolution: "@opentelemetry/instrumentation-net@npm:0.52.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/3372ac7b8643c4adea2d8ffd762a2c872e02d000d5cc5afca922f422033eea251adeeac1c5d1bd49014d76c9167a0dfa98cd41dda7b3950395c179a8a8c6de81 + checksum: 10/af37496c50f9cd893e3552e060528cd5433a87fb25f55dbc7eca298e68c249b7eafe04bc614bd9bc03e75580713ac1b80b4889c595f5951735fd7e00b6f985fe languageName: node linkType: hard -"@opentelemetry/instrumentation-oracledb@npm:^0.28.0": - version: 0.28.0 - resolution: "@opentelemetry/instrumentation-oracledb@npm:0.28.0" +"@opentelemetry/instrumentation-openai@npm:^0.7.0": + version: 0.7.0 + resolution: "@opentelemetry/instrumentation-openai@npm:0.7.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/api-logs": "npm:^0.208.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.36.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/d480956b11f8b437c538b42bd57d4ae3ec8201ac88d7b706c7503c34d27d1af2084672fcad8e576bfe07c817adc13f07cba4ee2c7bbef5af7b628a4c80081beb + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-oracledb@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-oracledb@npm:0.34.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.34.0" "@types/oracledb": "npm:6.5.2" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/820a6e760d2137ad00b27ff78014316fc37e92f2be94ad4c6082e92ace8fcd89a6d2bcc744e6330358ebd0f127d7993b65843b167b0c1ea0f8d5cb0fe201c634 + checksum: 10/181937a78f28f79a378d427624a1cbc6d02127a88310147ca741d47d8856312d2802b608058238330f2876b0a817f548255c71c1d1b816c9ba3cf52d1b9a2e67 languageName: node linkType: hard -"@opentelemetry/instrumentation-pg@npm:^0.54.1": - version: 0.54.1 - resolution: "@opentelemetry/instrumentation-pg@npm:0.54.1" +"@opentelemetry/instrumentation-pg@npm:^0.61.1": + version: 0.61.1 + resolution: "@opentelemetry/instrumentation-pg@npm:0.61.1" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - "@opentelemetry/sql-common": "npm:^0.41.0" - "@types/pg": "npm:8.15.4" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.34.0" + "@opentelemetry/sql-common": "npm:^0.41.2" + "@types/pg": "npm:8.15.6" "@types/pg-pool": "npm:2.0.6" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/eb88b8bd4417db8188af44e62659a7bc35b3f6a4b155d12c69357fc88185f3d719b3dd93e5562896088d07041c882a71a06d9672c14332846ae4f5abd26ec99a + checksum: 10/de9c4e08d8754ee2cbb964c76d2bde981706fae6ece7ef9688f66ff23308b185c7a6b55d79c25fedf377ba1deb95818b165d6296e920122c5f7ec00fa344c0b0 languageName: node linkType: hard -"@opentelemetry/instrumentation-pino@npm:^0.49.1": - version: 0.49.1 - resolution: "@opentelemetry/instrumentation-pino@npm:0.49.1" +"@opentelemetry/instrumentation-pino@npm:^0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-pino@npm:0.55.0" dependencies: - "@opentelemetry/api-logs": "npm:^0.202.0" + "@opentelemetry/api-logs": "npm:^0.208.0" "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/2e2bff24bef74f68da8f4b4655d198c3fba7f7425f2f6317077385bd34dfbfb44c3747165859fec7a9f90aa0c77f830148e112e3d8257f6ac35dc28bbe157041 + checksum: 10/238447b943125d4ff44b7aa340818e7f7366f2a927651576c0dcfe48bfb9b7b6578462b887fbc59e4083e8d0f1d63e3c9c9e394acd78b385547d3ebc368d9c3f languageName: node linkType: hard -"@opentelemetry/instrumentation-redis@npm:^0.50.0": - version: 0.50.0 - resolution: "@opentelemetry/instrumentation-redis@npm:0.50.0" +"@opentelemetry/instrumentation-redis@npm:^0.57.1": + version: 0.57.1 + resolution: "@opentelemetry/instrumentation-redis@npm:0.57.1" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/redis-common": "npm:^0.38.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/redis-common": "npm:^0.38.2" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/94a05b1401fa071c2483d241a0cffb3fc79492c44ee7a2d2e320118cbc948eb7972c70e93f128bae29febd4958fc95904afff56b5c49da8b5407666e8f26e748 + checksum: 10/66e15fbc41edcf21500dd1fab6a5fddd3d59e7ef5a4f12ac8403bec3cdd51b5b8b3ab7555041b50c42463827fae8a0a77e5fdcc3bb0e155de75278ec3379fdc1 languageName: node linkType: hard -"@opentelemetry/instrumentation-restify@npm:^0.48.2": - version: 0.48.2 - resolution: "@opentelemetry/instrumentation-restify@npm:0.48.2" +"@opentelemetry/instrumentation-restify@npm:^0.54.0": + version: 0.54.0 + resolution: "@opentelemetry/instrumentation-restify@npm:0.54.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/b2a0917248ae9defaff8dd9d5c650fb627241b56355474a776a54fd9541a29b3bbb487b54dba7042ac2f7e15cb0a79f738360fe8a3322e4066ff06728e027292 + checksum: 10/5488aaf97dcc5e1ec8f9c055258c587553f20f825b8d7c5dcd2a7398adf85554f1d8b5d1c35235c98280ab6662917b12d148215c4d3882e205314883c9bed0b8 languageName: node linkType: hard -"@opentelemetry/instrumentation-router@npm:^0.47.0": - version: 0.47.0 - resolution: "@opentelemetry/instrumentation-router@npm:0.47.0" +"@opentelemetry/instrumentation-router@npm:^0.53.0": + version: 0.53.0 + resolution: "@opentelemetry/instrumentation-router@npm:0.53.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/620a54e97e311692c197e86f12bf43bf1a04f2b3009f71dfdf6e0972b5c282606cc649739ba0041f60aea3fae9b027b315378e71a5f764c85952ece2e5b28078 + checksum: 10/3a24e2cd25b0bff9e96c1956fe9bb2fbda8aa807125cb58535fb16e4e10a65ac391a2db748bc50a1ca7e35fcfbc26e078a3fc96e0f105f813b06f57079f84062 languageName: node linkType: hard -"@opentelemetry/instrumentation-runtime-node@npm:^0.16.0": - version: 0.16.0 - resolution: "@opentelemetry/instrumentation-runtime-node@npm:0.16.0" +"@opentelemetry/instrumentation-runtime-node@npm:^0.22.0": + version: 0.22.0 + resolution: "@opentelemetry/instrumentation-runtime-node@npm:0.22.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/85d5a1302558fc99d5ec411ef4ea7306bb2c5295807ef3e75f61272b46be1752a19de145d22dbe530803ddfef65a4811ecccb5944183302ff60b8762005de70d + checksum: 10/20a45189e0bffb08e9ef111fc4be33e98309948aaa10b448979bd900b0c53a752606366b44fa2351ba2fdc2cf775ba4eaf03cb038ba31798c679180ea987dba8 languageName: node linkType: hard -"@opentelemetry/instrumentation-socket.io@npm:^0.49.0": - version: 0.49.0 - resolution: "@opentelemetry/instrumentation-socket.io@npm:0.49.0" +"@opentelemetry/instrumentation-socket.io@npm:^0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-socket.io@npm:0.55.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/16ab1664c3692267a6b9d0fdaf9256d66d9b705c056c019fb15d261d1f09296d325ddbbc9402b60b0d3b5722b55cdb6c7d0980c8ee965ef4346461742cdf87a1 + checksum: 10/7d2b5283d055283f49a9c90ae0f8a473bac2fbbe0088d252932099e3962859dda31230c79563a46cab030bf25f5384761b3de987f4cf6979b40d66ca0e0bdf26 languageName: node linkType: hard -"@opentelemetry/instrumentation-tedious@npm:^0.21.1": - version: 0.21.1 - resolution: "@opentelemetry/instrumentation-tedious@npm:0.21.1" +"@opentelemetry/instrumentation-tedious@npm:^0.27.0": + version: 0.27.0 + resolution: "@opentelemetry/instrumentation-tedious@npm:0.27.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.202.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@types/tedious": "npm:^4.0.14" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/5347d20e2cb4e07a1d25275edb25c47dcf87700a19de630fb33b7fc06bda0eb5934fb058fcb15b33be2eeb49a7430720c011f8540405b5ee10d22e689c93b94a + checksum: 10/453492b72cf16b855da1a4ba38b9619261ef77ed4afe8ae551c0abc529c81c8640d816934aae197fa719e8e79591613d2398a8a7f3b77c82de41bf51db3eebfc languageName: node linkType: hard -"@opentelemetry/instrumentation-undici@npm:^0.13.2": - version: 0.13.2 - resolution: "@opentelemetry/instrumentation-undici@npm:0.13.2" +"@opentelemetry/instrumentation-undici@npm:^0.19.0": + version: 0.19.0 + resolution: "@opentelemetry/instrumentation-undici@npm:0.19.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.24.0" peerDependencies: "@opentelemetry/api": ^1.7.0 - checksum: 10/9f806706096d629796d1205a0f2a9f18cf3542f61dfb60f20199ca5ba269044145a593f5ee0ad495b046eb01b8a14448a61a8bbe6a18611f6967f3473923d97e + checksum: 10/862ea5e49c2cf38c7a135f5ea6a95f1b8ca009620f9b0e4d6c7ffb69e8e1d4e7d4169e4cf0cd2af4ce574864b37ea3f7c039b0e6600d3e490f3c263a8647325e languageName: node linkType: hard -"@opentelemetry/instrumentation-winston@npm:^0.47.0": - version: 0.47.0 - resolution: "@opentelemetry/instrumentation-winston@npm:0.47.0" +"@opentelemetry/instrumentation-winston@npm:^0.53.0": + version: 0.53.0 + resolution: "@opentelemetry/instrumentation-winston@npm:0.53.0" dependencies: - "@opentelemetry/api-logs": "npm:^0.202.0" - "@opentelemetry/instrumentation": "npm:^0.202.0" + "@opentelemetry/api-logs": "npm:^0.208.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/1a046490c1509f77ae70552ef6cdbf6c21baba4f5d6f45e0c473ffa102156b009acd20036dafbf5d29e92132df88c4aad078b62606af3bda0fbdd4ab90073937 + checksum: 10/5c3efd7c9cb074718cf4de99c27acf69bbb35bdf16d74f92dbdd8fd4efba2c637e3b234155e335b473d5caa060a6f40a49136d808017547d3a4d5eab66eed9b7 languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:0.202.0, @opentelemetry/instrumentation@npm:^0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/instrumentation@npm:0.202.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.202.0" - import-in-the-middle: "npm:^1.8.1" - require-in-the-middle: "npm:^7.1.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/da1db1ebc4ca847cc68d894b2e3a6c6552851d93af8ea793d42474e920f710664575c8991dc269e1a83fcf8f5abdda2cc724fa24e9cc4ae19fa6f70eb68ffc0e - languageName: node - linkType: hard - -"@opentelemetry/instrumentation@npm:0.208.0": +"@opentelemetry/instrumentation@npm:0.208.0, @opentelemetry/instrumentation@npm:^0.208.0": version: 0.208.0 resolution: "@opentelemetry/instrumentation@npm:0.208.0" dependencies: @@ -13748,18 +13540,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-exporter-base@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/otlp-exporter-base@npm:0.202.0" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/229778895ba1971451a8b1ec8a4787b0cdba337c87f3ca6aaf6d649f5e2b26439ba1befa36d31824fffa3cef62382792680ec70194f57aac6ebe98e95acecc69 - languageName: node - linkType: hard - "@opentelemetry/otlp-exporter-base@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/otlp-exporter-base@npm:0.208.0" @@ -13772,20 +13552,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-grpc-exporter-base@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.202.0" - dependencies: - "@grpc/grpc-js": "npm:^1.7.1" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/otlp-exporter-base": "npm:0.202.0" - "@opentelemetry/otlp-transformer": "npm:0.202.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/ba52acee1d46c3bca38d6eba8fea41d5c7389c26a34dd7ed4f4fbc46da5fcbf109ae139c5149c9730cd076ba51d4933d9bc06c223470ee8a463a31fed75b4ed6 - languageName: node - linkType: hard - "@opentelemetry/otlp-grpc-exporter-base@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.208.0" @@ -13800,23 +13566,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-transformer@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/otlp-transformer@npm:0.202.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.202.0" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-logs": "npm:0.202.0" - "@opentelemetry/sdk-metrics": "npm:2.0.1" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - protobufjs: "npm:^7.3.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/67e189af60bf8308a5b93deb85bef9709a5604b8c7915d0d42a7a2bff932b7257dfdfc071812c77913e136955a985ffe838c72b5f10059021087ea0bc52d84cd - languageName: node - linkType: hard - "@opentelemetry/otlp-transformer@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/otlp-transformer@npm:0.208.0" @@ -13834,26 +13583,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/propagation-utils@npm:^0.31.2": - version: 0.31.2 - resolution: "@opentelemetry/propagation-utils@npm:0.31.2" - peerDependencies: - "@opentelemetry/api": ^1.0.0 - checksum: 10/13828caae31651a1c4fa736f254b49a46b62348ff9ece945b19253fb52562db08bd268b5b0944ef3d2cb951f20cd4118ba14158b34a192e63868f0f3aa9c7cc9 - languageName: node - linkType: hard - -"@opentelemetry/propagator-b3@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/propagator-b3@npm:2.0.1" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/9871854b3d7516273c1f867c7a6a8eac5791f77954edf7509cc320ee6c109de8ef44778076edd4a64421b84f31632e4d283cb685f9220c5e7f1fe823c0e81a06 - languageName: node - linkType: hard - "@opentelemetry/propagator-b3@npm:2.2.0": version: 2.2.0 resolution: "@opentelemetry/propagator-b3@npm:2.2.0" @@ -13865,17 +13594,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/propagator-jaeger@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/propagator-jaeger@npm:2.0.1" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/d6a51e7dd58dde7ada4c0fe510a14f9a33f1972f0db11b64fccb867be23652d4d8a55012dd5a295753ad27c456b21d502eb3a24dfbce6a0a3304e1fa6e1f4896 - languageName: node - linkType: hard - "@opentelemetry/propagator-jaeger@npm:2.2.0": version: 2.2.0 resolution: "@opentelemetry/propagator-jaeger@npm:2.2.0" @@ -13887,88 +13605,73 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/redis-common@npm:^0.38.0": - version: 0.38.0 - resolution: "@opentelemetry/redis-common@npm:0.38.0" - checksum: 10/c7caa450ed27ad02aeefa3e4d643e7d065d76e5f1cd275c8c3d0c7d324bf7d06434666dbd836d219f6b2e1057285f30ccaa89b949438b38118a70786ec31fa52 +"@opentelemetry/redis-common@npm:^0.38.2": + version: 0.38.2 + resolution: "@opentelemetry/redis-common@npm:0.38.2" + checksum: 10/2a4f992572b1990a407ac92c7db941aecb6e8d71f034f4ea0b00b2b1739ad07c22767198a6759ab634cbbe9eebfbea062e2b79a25484289c226c665558041503 languageName: node linkType: hard -"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.31.2": - version: 0.31.2 - resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.31.2" +"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.31.11": + version: 0.31.11 + resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.31.11" + dependencies: + "@opentelemetry/core": "npm:^2.0.0" + "@opentelemetry/resources": "npm:^2.0.0" + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 10/63aedc54a9250aa249749d629ac3be42c99cf9a64c0735b78cd2d85d3d2ae5c9db7371909673f494cd70ddd3dae174a89e065e220845bf79e8937049ced24c44 + languageName: node + linkType: hard + +"@opentelemetry/resource-detector-aws@npm:^2.8.0": + version: 2.8.0 + resolution: "@opentelemetry/resource-detector-aws@npm:2.8.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" "@opentelemetry/resources": "npm:^2.0.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 10/1e2498d5dc970addaeb88c9a1c4be85248438fe69876f2223ee526535ccb50d1ffaca366bfc5c03d0c84933050fd5d821726d8ce92ac5829da18f4a91025ce2f + checksum: 10/7249d3a39f1039b6c6998f7e2f7792566fbff1b6604e9c538cbadc6dac8a769c35ece8fa0d1fcd92721288b81b3e8ac241101f35057f635c765cda7e5f468b38 languageName: node linkType: hard -"@opentelemetry/resource-detector-aws@npm:^2.2.0": - version: 2.2.0 - resolution: "@opentelemetry/resource-detector-aws@npm:2.2.0" +"@opentelemetry/resource-detector-azure@npm:^0.16.0": + version: 0.16.0 + resolution: "@opentelemetry/resource-detector-azure@npm:0.16.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" "@opentelemetry/resources": "npm:^2.0.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/semantic-conventions": "npm:^1.37.0" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 10/91e6b67936d6846ba98b31438a9f32e5486f27153cfcd57978c8b6c5df9cc400c821ea63b06fff158c6a7e97b3ded3396f91f02410f28d4113d6b5bdf75f2bec + checksum: 10/06fc137149d2f2fe231665f25af31542ae21f74b4682a615034439e84d06ae855172a4c21a980278ceda867faa0785140c2d90e59441ac92e36344da5f70cee1 languageName: node linkType: hard -"@opentelemetry/resource-detector-azure@npm:^0.9.0": - version: 0.9.0 - resolution: "@opentelemetry/resource-detector-azure@npm:0.9.0" +"@opentelemetry/resource-detector-container@npm:^0.7.11": + version: 0.7.11 + resolution: "@opentelemetry/resource-detector-container@npm:0.7.11" dependencies: "@opentelemetry/core": "npm:^2.0.0" "@opentelemetry/resources": "npm:^2.0.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 10/93d85781e73f37ab186b8d39ad144c944d80e69d19361ef4f846499e2bf0ba27df2cd00e334b1408415c80488f1633764696e1d29b639ed7829631ec29c92286 + checksum: 10/3372f6f6df98467181fb2f794493eb35d7067d330273ec4f19b16fbeae55d897360e1ce44dc0459112f1b4a65c97411d5f3f53530cb882b3031d1195dfd4ac41 languageName: node linkType: hard -"@opentelemetry/resource-detector-container@npm:^0.7.2": - version: 0.7.2 - resolution: "@opentelemetry/resource-detector-container@npm:0.7.2" +"@opentelemetry/resource-detector-gcp@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/resource-detector-gcp@npm:0.43.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" "@opentelemetry/resources": "npm:^2.0.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - peerDependencies: - "@opentelemetry/api": ^1.0.0 - checksum: 10/d556c4f64737726e31f211c6163ea359e403b4b0c65bca9fff565ec6a579a18340f4c6dc68d78ac707413c44bcb5f2a362eab2794fbd99524faf161517793e0e - languageName: node - linkType: hard - -"@opentelemetry/resource-detector-gcp@npm:^0.36.0": - version: 0.36.0 - resolution: "@opentelemetry/resource-detector-gcp@npm:0.36.0" - dependencies: - "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/resources": "npm:^2.0.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" gcp-metadata: "npm:^6.0.0" peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 10/9bfffd5d21a90509bc8d4dd3ae27554dd56719ca1607fcc20900034cc5776ff4c0025a3d4fddbd7c12e7962dd747516bdca9a9da6ccc59223c8d485609aea732 - languageName: node - linkType: hard - -"@opentelemetry/resources@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/resources@npm:2.0.1" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10/282f3831de2755d0fda2d8b6e37f9587ea248066d50c7d2f14c803ac9d5262a0f1db98a4185bcdc5acaeeece0b61f4fce43bc3896a79f1da79045ae4928618bf + checksum: 10/6fe63ac24b454ec2bb337aeceaba732f74796d36e6a08e9613982bc6d982f7627a910bb953e949dd4cef054fbd4d9b3261dc1a98d75070060a90cfce388ab985 languageName: node linkType: hard @@ -13984,19 +13687,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-logs@npm:0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/sdk-logs@npm:0.202.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.202.0" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ">=1.4.0 <1.10.0" - checksum: 10/e1b76647282a41ad7004c86c0058b0e9be70fdcf34aa2761929401e274af79bc5e3c6610a63e14fde4d51d96d8c96adaf3247c10b9a64cb70086d2ede2e421ca - languageName: node - linkType: hard - "@opentelemetry/sdk-logs@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/sdk-logs@npm:0.208.0" @@ -14010,18 +13700,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-metrics@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/sdk-metrics@npm:2.0.1" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ">=1.9.0 <1.10.0" - checksum: 10/eb23d0657ce7ef0784f6c89af650de83530099782758fce574316a8e82ff2bca0eb3adffa88c5fdd04eaced6150deb53ea0ea05aae06d2783795691734e85473 - languageName: node - linkType: hard - "@opentelemetry/sdk-metrics@npm:2.2.0": version: 2.2.0 resolution: "@opentelemetry/sdk-metrics@npm:2.2.0" @@ -14034,38 +13712,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-node@npm:^0.202.0": - version: 0.202.0 - resolution: "@opentelemetry/sdk-node@npm:0.202.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.202.0" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/exporter-logs-otlp-grpc": "npm:0.202.0" - "@opentelemetry/exporter-logs-otlp-http": "npm:0.202.0" - "@opentelemetry/exporter-logs-otlp-proto": "npm:0.202.0" - "@opentelemetry/exporter-metrics-otlp-grpc": "npm:0.202.0" - "@opentelemetry/exporter-metrics-otlp-http": "npm:0.202.0" - "@opentelemetry/exporter-metrics-otlp-proto": "npm:0.202.0" - "@opentelemetry/exporter-prometheus": "npm:0.202.0" - "@opentelemetry/exporter-trace-otlp-grpc": "npm:0.202.0" - "@opentelemetry/exporter-trace-otlp-http": "npm:0.202.0" - "@opentelemetry/exporter-trace-otlp-proto": "npm:0.202.0" - "@opentelemetry/exporter-zipkin": "npm:2.0.1" - "@opentelemetry/instrumentation": "npm:0.202.0" - "@opentelemetry/propagator-b3": "npm:2.0.1" - "@opentelemetry/propagator-jaeger": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/sdk-logs": "npm:0.202.0" - "@opentelemetry/sdk-metrics": "npm:2.0.1" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - "@opentelemetry/sdk-trace-node": "npm:2.0.1" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10/80e3c6493bb5d87e5ce9c8b25dc5e2614c879b2ebe4f79f1a373d8237085b6e0bcaaff06acf01528e45849fb27e38cc0961fde6c87d7d2addf90cbcfbea43af7 - languageName: node - linkType: hard - "@opentelemetry/sdk-node@npm:^0.208.0": version: 0.208.0 resolution: "@opentelemetry/sdk-node@npm:0.208.0" @@ -14098,19 +13744,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/sdk-trace-base@npm:2.0.1" - dependencies: - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10/9de1e36bbce9bd7c0563e6395765fffc0f8c78806cb33cc95267e98dffd82de33857a51288073a104c10418b934e51560bcb5dcaf4e63e5c9e096f65cadd42cd - languageName: node - linkType: hard - "@opentelemetry/sdk-trace-base@npm:2.2.0": version: 2.2.0 resolution: "@opentelemetry/sdk-trace-base@npm:2.2.0" @@ -14124,19 +13757,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-node@npm:2.0.1": - version: 2.0.1 - resolution: "@opentelemetry/sdk-trace-node@npm:2.0.1" - dependencies: - "@opentelemetry/context-async-hooks": "npm:2.0.1" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/sdk-trace-base": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/7c5b4a902ba88ef03f02da83f6900080d81bb3264752419981dc44faabfe2bf4dbe91d25fec4a671afd5212151eee535a5205137772a8fd2c8d247950eb6556f - languageName: node - linkType: hard - "@opentelemetry/sdk-trace-node@npm:2.2.0": version: 2.2.0 resolution: "@opentelemetry/sdk-trace-node@npm:2.2.0" @@ -14157,10 +13777,10 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:^1.27.0, @opentelemetry/semantic-conventions@npm:^1.29.0, @opentelemetry/semantic-conventions@npm:^1.30.0, @opentelemetry/semantic-conventions@npm:^1.33.1, @opentelemetry/semantic-conventions@npm:^1.34.0": - version: 1.34.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.34.0" - checksum: 10/1892b4cc69c9e00456c809604a980e32696563e96463ff5f9d07e72d5aca73836a7378090509f28f54445ac6e072d2343a888c9d64d9ce287198e899082ff7aa +"@opentelemetry/semantic-conventions@npm:^1.24.0, @opentelemetry/semantic-conventions@npm:^1.27.0, @opentelemetry/semantic-conventions@npm:^1.29.0, @opentelemetry/semantic-conventions@npm:^1.30.0, @opentelemetry/semantic-conventions@npm:^1.33.0, @opentelemetry/semantic-conventions@npm:^1.33.1, @opentelemetry/semantic-conventions@npm:^1.34.0, @opentelemetry/semantic-conventions@npm:^1.36.0, @opentelemetry/semantic-conventions@npm:^1.37.0": + version: 1.38.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.38.0" + checksum: 10/9d549f4896e900f644d5e70dd7142505daff88ed83c1cb7bcd976ac55e9496d4ddd686bb2815dd68655c739950514394c3b73ff51e53b2e4ff2d54a7f6d22521 languageName: node linkType: hard @@ -14171,14 +13791,14 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sql-common@npm:^0.41.0": - version: 0.41.0 - resolution: "@opentelemetry/sql-common@npm:0.41.0" +"@opentelemetry/sql-common@npm:^0.41.2": + version: 0.41.2 + resolution: "@opentelemetry/sql-common@npm:0.41.2" dependencies: "@opentelemetry/core": "npm:^2.0.0" peerDependencies: "@opentelemetry/api": ^1.1.0 - checksum: 10/182915f050b8b685f5499e9fa4ed9a9730fcd404889e5066cfc7d94e9961b1f2780216d776070a4a5c1b94323c287ab426b06f5a8828d5fea3daf664bfd397bb + checksum: 10/3d57d5162c69c29484cb166e99ac733fff1dcefa26aea401e40035d5daa3aef21af78936af7943d0dfdab385ff053b879117c2fa3bd980412dd378222b10bea3 languageName: node linkType: hard @@ -20434,10 +20054,10 @@ __metadata: languageName: node linkType: hard -"@types/aws-lambda@npm:8.10.150, @types/aws-lambda@npm:^8.10.83": - version: 8.10.150 - resolution: "@types/aws-lambda@npm:8.10.150" - checksum: 10/d837ae0b94fb16c7cfec3711126f0e7fb109fc3e6d14d994d083d2039c4f2bc52a75f256ee31a8010f023ce78ddcf3746ad43d552592a0f56720167f6d3111be +"@types/aws-lambda@npm:^8.10.155, @types/aws-lambda@npm:^8.10.83": + version: 8.10.159 + resolution: "@types/aws-lambda@npm:8.10.159" + checksum: 10/3fb4d2f5613e3526725676787770442df2cace0d4d4c528c17e791ccee3cc8626447529ed86d937aa709c82db53670835dcf6e0c704d6e3ae92832dcc886eac0 languageName: node linkType: hard @@ -21605,14 +21225,14 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:*, @types/pg@npm:8.15.4": - version: 8.15.4 - resolution: "@types/pg@npm:8.15.4" +"@types/pg@npm:*, @types/pg@npm:8.15.6": + version: 8.15.6 + resolution: "@types/pg@npm:8.15.6" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^2.2.0" - checksum: 10/dd9203ae6732acad4892513fc99eb2bc699935a95b62e9fdbdcc6d1a90f63881b5fd89d4cac1729790ab3d0bb7c64130b144c65abef34e6bbed063ff43a739a6 + checksum: 10/4bc1bb274e0fc105be93e3a9cc8c9aa57fc50b78ed78a56348468157332daaecd71fcab762ee620c766510ffbc7018b56ca394787d6d41ff1726b152770aa532 languageName: node linkType: hard @@ -30671,7 +30291,7 @@ __metadata: "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-signals-backend": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" - "@opentelemetry/auto-instrumentations-node": "npm:^0.61.0" + "@opentelemetry/auto-instrumentations-node": "npm:^0.67.0" "@opentelemetry/exporter-prometheus": "npm:^0.208.0" "@opentelemetry/sdk-node": "npm:^0.208.0" example-app: "link:../app" @@ -33782,18 +33402,6 @@ __metadata: languageName: node linkType: hard -"import-in-the-middle@npm:^1.8.1": - version: 1.11.0 - resolution: "import-in-the-middle@npm:1.11.0" - dependencies: - acorn: "npm:^8.8.2" - acorn-import-attributes: "npm:^1.9.5" - cjs-module-lexer: "npm:^1.2.2" - module-details-from-path: "npm:^1.0.3" - checksum: 10/e6f79c9de3f1c1907856fb48b99cd2273c5f9d78eb72124ddd142382e41b6bdf1f64c028ced9e5dbfd015f282e6e3b48bd1f53dd0452e2f0a26436ee42b005d8 - languageName: node - linkType: hard - "import-in-the-middle@npm:^2.0.0": version: 2.0.0 resolution: "import-in-the-middle@npm:2.0.0" @@ -44632,17 +44240,6 @@ __metadata: languageName: node linkType: hard -"require-in-the-middle@npm:^7.1.1": - version: 7.3.0 - resolution: "require-in-the-middle@npm:7.3.0" - dependencies: - debug: "npm:^4.1.1" - module-details-from-path: "npm:^1.0.3" - resolve: "npm:^1.22.1" - checksum: 10/883343b9ba15d42dd443b20fba5f9135cc4b7c2c2af3ae87f0105c28c499f98438a414e49bbfafd3f607dbe60a91c0da3610d31c9c3f61d222e565a8e8dd161e - languageName: node - linkType: hard - "require-in-the-middle@npm:^8.0.0": version: 8.0.1 resolution: "require-in-the-middle@npm:8.0.1" From ae8d79cd30707c811df5088dc7dc5740cf317568 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 11:15:29 +0000 Subject: [PATCH 241/312] chore(deps): update actions/stale action to v10 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/automate_stale.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automate_stale.yml b/.github/workflows/automate_stale.yml index cdaa01fea1..a7eef4fae4 100644 --- a/.github/workflows/automate_stale.yml +++ b/.github/workflows/automate_stale.yml @@ -20,7 +20,7 @@ jobs: egress-policy: audit - name: Stale check - base - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 + uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1 with: stale-issue-message: > This issue has been automatically marked as stale because it has not had @@ -42,7 +42,7 @@ jobs: operations-per-run: 100 - name: Stale check - bugs without repro - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 + uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1 with: stale-issue-message: > This bug report has been automatically marked as stale because it has not had From 9b2c9a9b9ec54c3f2b0171864c1e40ffd754477b Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 5 Dec 2025 14:19:27 -0600 Subject: [PATCH 242/312] initial script Signed-off-by: Andre Wanlin Plugins - Added plugin directory audit script Signed-off-by: Andre Wanlin Remove comments Signed-off-by: Andre Wanlin Updated log statement Signed-off-by: Andre Wanlin --- microsite/data/plugins/airbrake.yaml | 2 +- .../data/plugins/analytics-module-ga.yaml | 2 +- microsite/data/plugins/apollo-explorer.yaml | 2 +- microsite/data/plugins/aws-amazon-ecs.yaml | 2 +- microsite/data/plugins/aws-codebuild.yaml | 2 +- microsite/data/plugins/aws-codepipeline.yaml | 2 +- microsite/data/plugins/azure-pipelines.yaml | 2 +- microsite/data/plugins/badges.yaml | 2 +- microsite/data/plugins/bazaar.yaml | 2 +- microsite/data/plugins/bitrise.yaml | 2 +- microsite/data/plugins/digital.ai-deploy.yaml | 2 +- microsite/data/plugins/firehydrant.yaml | 2 +- microsite/data/plugins/fossa.yaml | 2 +- .../data/plugins/kubernetes-provider.yaml | 2 +- microsite/data/plugins/linguist.yaml | 2 +- microsite/data/plugins/octopus-deploy.yaml | 2 +- microsite/data/plugins/opencost.yaml | 2 +- microsite/data/plugins/puppetdb.yaml | 2 +- microsite/data/plugins/renovate-hoster.yaml | 2 +- microsite/data/plugins/shortcuts.yaml | 2 +- microsite/data/plugins/sonarqube.yaml | 2 +- microsite/data/plugins/stack-overflow.yaml | 2 +- microsite/data/plugins/template-designer.yaml | 3 +- microsite/data/plugins/torque.yaml | 2 +- microsite/data/plugins/xcmetrics.yaml | 2 +- package.json | 1 + scripts/plugin-directory-audit.js | 74 +++++++++++++++++++ yarn.lock | 1 + 28 files changed, 102 insertions(+), 25 deletions(-) create mode 100644 scripts/plugin-directory-audit.js diff --git a/microsite/data/plugins/airbrake.yaml b/microsite/data/plugins/airbrake.yaml index 8facf13185..59910df629 100644 --- a/microsite/data/plugins/airbrake.yaml +++ b/microsite/data/plugins/airbrake.yaml @@ -6,5 +6,5 @@ category: Monitoring description: Access Airbrake error monitoring and other integrations from within Backstage documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/airbrake/plugins/airbrake iconUrl: https://wp-assets.airbrake.io/wp-content/uploads/2020/10/05222904/Square-white-A-on-Orange.png -npmPackageName: '@backstage/plugin-airbrake' +npmPackageName: '@backstage-community/plugin-airbrake' addedDate: '2022-01-10' diff --git a/microsite/data/plugins/analytics-module-ga.yaml b/microsite/data/plugins/analytics-module-ga.yaml index 3dcb27bcd5..537a360c8c 100644 --- a/microsite/data/plugins/analytics-module-ga.yaml +++ b/microsite/data/plugins/analytics-module-ga.yaml @@ -6,5 +6,5 @@ category: Monitoring description: Track usage of your Backstage instance using Google Analytics 4. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/analytics/plugins/analytics-module-ga4#readme iconUrl: /img/ga-icon.png -npmPackageName: '@backstage/plugin-analytics-module-ga4' +npmPackageName: '@backstage-community/plugin-analytics-module-ga4' addedDate: '2021-10-07' diff --git a/microsite/data/plugins/apollo-explorer.yaml b/microsite/data/plugins/apollo-explorer.yaml index 2b0f834f92..83d121e055 100644 --- a/microsite/data/plugins/apollo-explorer.yaml +++ b/microsite/data/plugins/apollo-explorer.yaml @@ -6,5 +6,5 @@ category: Debugging description: Integrates Apollo Explorer graphs as a tool to browse GraphQL API endpoints inside Backstage. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/apollo-explorer/plugins/apollo-explorer/README.md iconUrl: /img/apollo-explorer.png -npmPackageName: '@backstage/plugin-apollo-explorer' +npmPackageName: '@backstage-community/plugin-apollo-explorer' addedDate: '2022-07-20' diff --git a/microsite/data/plugins/aws-amazon-ecs.yaml b/microsite/data/plugins/aws-amazon-ecs.yaml index a94779babd..e16028d802 100644 --- a/microsite/data/plugins/aws-amazon-ecs.yaml +++ b/microsite/data/plugins/aws-amazon-ecs.yaml @@ -6,5 +6,5 @@ category: Infrastructure description: View resources related to Amazon Elastic Container Service for your components in Backstage. documentation: https://github.com/awslabs/backstage-plugins-for-aws/tree/main/plugins/ecs#readme iconUrl: https://raw.githubusercontent.com/awslabs/backstage-plugins-for-aws/main/docs/images/logos/amazon-ecs-logo.png -npmPackageName: 'https://www.npmjs.com/package/@aws/amazon-ecs-plugin-for-backstage' +npmPackageName: '@aws/amazon-ecs-plugin-for-backstage' addedDate: '2024-04-22' diff --git a/microsite/data/plugins/aws-codebuild.yaml b/microsite/data/plugins/aws-codebuild.yaml index 2c12f92dce..504730402f 100644 --- a/microsite/data/plugins/aws-codebuild.yaml +++ b/microsite/data/plugins/aws-codebuild.yaml @@ -6,5 +6,5 @@ category: CI/CD description: View resources related to AWS CodeBuild for your components in Backstage. documentation: https://github.com/awslabs/backstage-plugins-for-aws/tree/main/plugins/codebuild#readme iconUrl: https://raw.githubusercontent.com/awslabs/backstage-plugins-for-aws/main/docs/images/logos/aws-codebuild-logo.png -npmPackageName: 'https://www.npmjs.com/package/@aws/aws-codebuild-plugin-for-backstage' +npmPackageName: '@aws/aws-codebuild-plugin-for-backstage' addedDate: '2024-04-22' diff --git a/microsite/data/plugins/aws-codepipeline.yaml b/microsite/data/plugins/aws-codepipeline.yaml index 16986b6718..a2eb8de230 100644 --- a/microsite/data/plugins/aws-codepipeline.yaml +++ b/microsite/data/plugins/aws-codepipeline.yaml @@ -6,5 +6,5 @@ category: CI/CD description: View resources related to AWS CodePipeline for your components in Backstage. documentation: https://github.com/awslabs/backstage-plugins-for-aws/tree/main/plugins/codepipeline#readme iconUrl: https://raw.githubusercontent.com/awslabs/backstage-plugins-for-aws/main/docs/images/logos/aws-codepipeline-logo.png -npmPackageName: 'https://www.npmjs.com/package/@aws/aws-codepipeline-plugin-for-backstage' +npmPackageName: '@aws/aws-codepipeline-plugin-for-backstage' addedDate: '2024-04-22' diff --git a/microsite/data/plugins/azure-pipelines.yaml b/microsite/data/plugins/azure-pipelines.yaml index e0e3534fdb..f9536eb192 100644 --- a/microsite/data/plugins/azure-pipelines.yaml +++ b/microsite/data/plugins/azure-pipelines.yaml @@ -6,5 +6,5 @@ category: CI/CD description: Easily view your Azure Pipelines within the Software Catalog documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/azure-devops/plugins/azure-devops/README.md iconUrl: /img/azure-pipelines.svg -npmPackageName: '@backstage/plugin-azure-devops' +npmPackageName: '@backstage-community/plugin-azure-devops' addedDate: '2021-12-22' diff --git a/microsite/data/plugins/badges.yaml b/microsite/data/plugins/badges.yaml index 789aaf155d..9452054810 100644 --- a/microsite/data/plugins/badges.yaml +++ b/microsite/data/plugins/badges.yaml @@ -6,5 +6,5 @@ category: Discovery description: The badges plugin offers a set of badges that can be used outside of Backstage, showing information related to data from the catalog. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/badges/plugins/badges/README.md iconUrl: /img/badges.svg -npmPackageName: '@backstage/plugin-badges' +npmPackageName: '@backstage-community/plugin-badges' addedDate: '2021-09-29' diff --git a/microsite/data/plugins/bazaar.yaml b/microsite/data/plugins/bazaar.yaml index 1130822e77..d14aaaecd8 100644 --- a/microsite/data/plugins/bazaar.yaml +++ b/microsite/data/plugins/bazaar.yaml @@ -5,5 +5,5 @@ category: Discovery description: A marketplace where engineers can propose projects suitable for inner sourcing documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/bazaar/plugins/bazaar/README.md iconUrl: /img/bazaar.svg -npmPackageName: '@backstage/plugin-bazaar' +npmPackageName: '@backstage-community/plugin-bazaar' addedDate: '2022-01-11' diff --git a/microsite/data/plugins/bitrise.yaml b/microsite/data/plugins/bitrise.yaml index 5cbfe5aabf..31f50a007c 100644 --- a/microsite/data/plugins/bitrise.yaml +++ b/microsite/data/plugins/bitrise.yaml @@ -6,5 +6,5 @@ category: CI/CD description: View Bitrise builds and download the build artifacts within Backstage. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/bitrise/plugins/bitrise/README.md iconUrl: https://avatars.githubusercontent.com/u/7174390?s=400&v=4 -npmPackageName: '@backstage/plugin-bitrise' +npmPackageName: '@backstage-community/plugin-bitrise' addedDate: '2021-03-01' diff --git a/microsite/data/plugins/digital.ai-deploy.yaml b/microsite/data/plugins/digital.ai-deploy.yaml index a36dd08ffb..62203a99ea 100644 --- a/microsite/data/plugins/digital.ai-deploy.yaml +++ b/microsite/data/plugins/digital.ai-deploy.yaml @@ -6,7 +6,7 @@ category: CI/CD description: The plugin offers integration with Digital.ai Deploy and backstage components and services. It provide access to deployments and reports. documentation: https://docs.digital.ai/deploy/docs/concept/xl-deploy-backstage-overview iconUrl: /img/digital.ai-deploy.svg -npmPackageName: '@digital.ai/plugin-dai-deploy' +npmPackageName: '@digital-ai/plugin-dai-deploy' tags: - ci - cd diff --git a/microsite/data/plugins/firehydrant.yaml b/microsite/data/plugins/firehydrant.yaml index 7aa00675b4..f5ccd3629d 100644 --- a/microsite/data/plugins/firehydrant.yaml +++ b/microsite/data/plugins/firehydrant.yaml @@ -6,5 +6,5 @@ category: Monitoring description: View service incidents information from FireHydrant, such as active incidents and incident metrics, directly within Backstage. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/firehydrant/plugins/firehydrant/README.md iconUrl: https://github.com/backstage/community-plugins/blob/main/workspaces/firehydrant/plugins/firehydrant/doc/firehydrant_logo.png -npmPackageName: '@backstage/plugin-firehydrant' +npmPackageName: '@backstage-community/plugin-firehydrant' addedDate: '2021-08-18' diff --git a/microsite/data/plugins/fossa.yaml b/microsite/data/plugins/fossa.yaml index a1a66eb7d6..34610c64e4 100644 --- a/microsite/data/plugins/fossa.yaml +++ b/microsite/data/plugins/fossa.yaml @@ -6,5 +6,5 @@ category: Quality description: View FOSSA license compliance of your components in Backstage. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/fossa/plugins/fossa/README.md iconUrl: https://avatars0.githubusercontent.com/u/9543448?s=400&v=4 -npmPackageName: '@backstage/plugin-fossa' +npmPackageName: '@backstage-community/plugin-fossa' addedDate: '2020-12-10' diff --git a/microsite/data/plugins/kubernetes-provider.yaml b/microsite/data/plugins/kubernetes-provider.yaml index e0971d55be..b23ab03caa 100644 --- a/microsite/data/plugins/kubernetes-provider.yaml +++ b/microsite/data/plugins/kubernetes-provider.yaml @@ -6,5 +6,5 @@ category: Kubernetes description: Import Kubernetes resources into Backstage Components documentation: https://github.com/AntoineDao/backstage-provider-kubernetes#readme iconUrl: https://avatars.githubusercontent.com/u/13629408 -npmPackageName: https://www.npmjs.com/package/@antoinedao/backstage-provider-kubernetes +npmPackageName: '@antoinedao/backstage-provider-kubernetes' addedDate: '2023-04-10' diff --git a/microsite/data/plugins/linguist.yaml b/microsite/data/plugins/linguist.yaml index fb8e88b747..15b79b3682 100644 --- a/microsite/data/plugins/linguist.yaml +++ b/microsite/data/plugins/linguist.yaml @@ -6,5 +6,5 @@ category: Metadata description: View the programming language break down for your entities within the Software Catalog documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/linguist/plugins/linguist/README.md iconUrl: /img/linguist.svg -npmPackageName: '@backstage/plugin-linguist' +npmPackageName: '@backstage-community/plugin-linguist' addedDate: '2023-06-17' diff --git a/microsite/data/plugins/octopus-deploy.yaml b/microsite/data/plugins/octopus-deploy.yaml index cfc5e2c9e5..eb19f60e72 100644 --- a/microsite/data/plugins/octopus-deploy.yaml +++ b/microsite/data/plugins/octopus-deploy.yaml @@ -6,5 +6,5 @@ category: CI/CD description: Easily view your Octopus Deploy releases within the Software Catalog documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/octopus-deploy/plugins/octopus-deploy/README.md iconUrl: /img/octopus-deploy.svg -npmPackageName: '@backstage/plugin-octopus-deploy' +npmPackageName: '@backstage-community/plugin-octopus-deploy' addedDate: '2023-02-24' diff --git a/microsite/data/plugins/opencost.yaml b/microsite/data/plugins/opencost.yaml index 95973e3b0c..9e98c85bcb 100644 --- a/microsite/data/plugins/opencost.yaml +++ b/microsite/data/plugins/opencost.yaml @@ -6,5 +6,5 @@ category: Monitoring description: OpenCost provides cloud cost monitoring for your cloud native environments. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/opencost/plugins/opencost/README.md iconUrl: /img/opencost.png -npmPackageName: '@backstage/plugin-opencost' +npmPackageName: '@backstage-community/plugin-opencost' addedDate: '2023-10-26' diff --git a/microsite/data/plugins/puppetdb.yaml b/microsite/data/plugins/puppetdb.yaml index 650d8318d3..26e8bbd3ef 100644 --- a/microsite/data/plugins/puppetdb.yaml +++ b/microsite/data/plugins/puppetdb.yaml @@ -6,7 +6,7 @@ category: Configuration Management description: Visualize resource information and Puppet facts from PuppetDB. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/puppetdb/plugins/puppetdb/README.md iconUrl: /img/puppet.png -npmPackageName: '@backstage/plugin-puppetdb' +npmPackageName: '@backstage-community/plugin-puppetdb' tags: - puppet - puppetdb diff --git a/microsite/data/plugins/renovate-hoster.yaml b/microsite/data/plugins/renovate-hoster.yaml index 4cf4f65956..06187581bf 100644 --- a/microsite/data/plugins/renovate-hoster.yaml +++ b/microsite/data/plugins/renovate-hoster.yaml @@ -5,5 +5,5 @@ authorUrl: https://github.com/secustor category: Quality description: This plugin enables you to host Renovate CLI yourself inside of Backstage and extract data from it. documentation: https://github.com/secustor/backstage-plugins/tree/main/plugins/renovate -npmPackageName: '@backstage/backstage-plugin-renovate' +npmPackageName: '@secustor/backstage-plugin-renovate' addedDate: '2025-03-31' diff --git a/microsite/data/plugins/shortcuts.yaml b/microsite/data/plugins/shortcuts.yaml index b420e28e2f..7d4e050df0 100644 --- a/microsite/data/plugins/shortcuts.yaml +++ b/microsite/data/plugins/shortcuts.yaml @@ -6,5 +6,5 @@ category: Utility description: The shortcuts plugin allows a user to have easy access to pages within a Backstage app by storing them as "shortcuts" in the Sidebar. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/shortcuts/plugins/shortcuts/README.md iconUrl: /img/shortcuts.svg -npmPackageName: '@backstage/plugin-shortcuts' +npmPackageName: '@backstage-community/plugin-shortcuts' addedDate: '2021-10-06' diff --git a/microsite/data/plugins/sonarqube.yaml b/microsite/data/plugins/sonarqube.yaml index 72c662e2fa..48793adea9 100644 --- a/microsite/data/plugins/sonarqube.yaml +++ b/microsite/data/plugins/sonarqube.yaml @@ -6,5 +6,5 @@ category: Quality description: Components to display code quality metrics from SonarCloud and SonarQube. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/sonarqube/plugins/sonarqube/README.md iconUrl: /img/sonarqube-icon.svg -npmPackageName: '@backstage/plugin-sonarqube' +npmPackageName: '@backstage-community/plugin-sonarqube' addedDate: '2020-11-03' diff --git a/microsite/data/plugins/stack-overflow.yaml b/microsite/data/plugins/stack-overflow.yaml index b058ce90fe..373c08de8f 100644 --- a/microsite/data/plugins/stack-overflow.yaml +++ b/microsite/data/plugins/stack-overflow.yaml @@ -6,5 +6,5 @@ category: Discovery description: Provides Stack Overflow specific functionality that can be used in different ways (e.g. for homepage and search) to compose your Backstage App. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/stack-overflow/plugins/stack-overflow/README.md iconUrl: /img/stack-overflow-logo.svg -npmPackageName: '@backstage/plugin-stack-overflow' +npmPackageName: '@backstage-community/plugin-stack-overflow' addedDate: '2022-06-14' diff --git a/microsite/data/plugins/template-designer.yaml b/microsite/data/plugins/template-designer.yaml index 7994a05430..fd93efd79d 100644 --- a/microsite/data/plugins/template-designer.yaml +++ b/microsite/data/plugins/template-designer.yaml @@ -6,4 +6,5 @@ category: Productivity description: Template Designer turns blank Backstage YAML into a storyboard-like canvas, guiding anyone through drag-and-drop scaffolder authoring before ever touching code. Rally non-experts, broadcast best practices, and accelerate template launches directly inside Backstage. documentation: https://github.com/tduniec/template-designer-plugin/blob/main/README.md iconUrl: https://raw.githubusercontent.com/tduniec/template-designer-plugin/main/img/logo/templateDesignerLogo.png -addedDate: 2025-11-19 +npmPackageName: '@tduniec/plugin-template-designer' +addedDate: 2025-11-19 \ No newline at end of file diff --git a/microsite/data/plugins/torque.yaml b/microsite/data/plugins/torque.yaml index 1480c3bad9..a469c455fc 100644 --- a/microsite/data/plugins/torque.yaml +++ b/microsite/data/plugins/torque.yaml @@ -8,5 +8,5 @@ description: | Plugin includes an Entity ComponentCard, Backend API route and scaffolder actions. documentation: https://github.com/QualiTorque/torque-backstage-plugin/tree/main/packages/torque#readme iconUrl: https://user-images.githubusercontent.com/8643801/214640977-751bc338-6b77-40a0-a897-cba41b6f006a.png -npmPackageName: '@qtorque/backstage-plugin-torque' +npmPackageName: '@qtorque/backstage-torque-plugin' addedDate: '2023-01-25' diff --git a/microsite/data/plugins/xcmetrics.yaml b/microsite/data/plugins/xcmetrics.yaml index f02b195eb5..09a8b1547f 100644 --- a/microsite/data/plugins/xcmetrics.yaml +++ b/microsite/data/plugins/xcmetrics.yaml @@ -6,5 +6,5 @@ category: Monitoring description: Discover valuable insights hiding inside Xcode’s build logs. documentation: https://xcmetrics.io/ iconUrl: /img/xcmetrics-icon.png -npmPackageName: '@backstage/plugin-xcmetrics' +npmPackageName: '@backstage-community/plugin-xcmetrics' addedDate: '2021-08-06' diff --git a/package.json b/package.json index 763b4f7505..aec15232ce 100644 --- a/package.json +++ b/package.json @@ -158,6 +158,7 @@ "eslint-plugin-testing-library": "^6.0.0", "fs-extra": "^11.2.0", "husky": "^9.0.0", + "js-yaml": "^4.1.1", "lint-staged": "^15.0.0", "madge": "^8.0.0", "minimist": "^1.2.5", diff --git a/scripts/plugin-directory-audit.js b/scripts/plugin-directory-audit.js new file mode 100644 index 0000000000..7e28ae2b57 --- /dev/null +++ b/scripts/plugin-directory-audit.js @@ -0,0 +1,74 @@ +#!/usr/bin/env node +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable @backstage/no-undeclared-imports */ + +// This script is used to audit the list of plugins in the Plugin Directory: https://backstage.io/plugins + +const { resolve } = require('path'); +const fs = require('fs-extra'); +const yaml = require('js-yaml'); + +async function getNpmPackage(npmPackageName) { + const response = await fetch(`https://registry.npmjs.com/${npmPackageName}`); + const json = await response.json(); + return json; +} + +function getAge(npmModified) { + const ageDif = Date.now() - new Date(npmModified).getTime(); + return Math.round(ageDif / (1000 * 60 * 60 * 24)); +} + +async function main() { + const rootPath = resolve(__dirname, '..'); + const pluginDataPath = resolve(rootPath, 'microsite/data/plugins'); + + console.log(__dirname, rootPath, pluginDataPath); + + const pluginDataFiles = fs.readdirSync(pluginDataPath); + + const pluginsData = []; + for (const pluginDataFile of pluginDataFiles) { + const pluginDataFilePath = resolve(pluginDataPath, pluginDataFile); + const pluginDataYaml = yaml.load( + fs.readFileSync(pluginDataFilePath, { encoding: 'utf-8' }), + ); + + console.log( + `Auditing - ${pluginDataYaml.title} by ${pluginDataYaml.author} - ${pluginDataYaml.npmPackageName}`, + ); + + const npmPackage = await getNpmPackage(pluginDataYaml.npmPackageName); + + const pluginData = { + npmPackageName: pluginDataYaml.npmPackageName, + npmCreated: npmPackage.time?.created, + npmModified: npmPackage.time?.modified, + age: getAge(npmPackage.time?.modified), + }; + + pluginsData.push(pluginData); + } + + console.table(pluginsData); +} + +main(process.argv.slice(2)).catch(error => { + console.error(error.stack || error); + process.exit(1); +}); diff --git a/yarn.lock b/yarn.lock index 12503df3d9..af06152e27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45242,6 +45242,7 @@ __metadata: eslint-plugin-testing-library: "npm:^6.0.0" fs-extra: "npm:^11.2.0" husky: "npm:^9.0.0" + js-yaml: "npm:^4.1.1" lint-staged: "npm:^15.0.0" madge: "npm:^8.0.0" minimist: "npm:^1.2.5" From 145733b2a24e765fb4ac9bc78bdb2404b305d51f Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Sat, 6 Dec 2025 10:41:35 -0600 Subject: [PATCH 243/312] Added line break Signed-off-by: Andre Wanlin --- microsite/data/plugins/template-designer.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/template-designer.yaml b/microsite/data/plugins/template-designer.yaml index fd93efd79d..86aa8a97f0 100644 --- a/microsite/data/plugins/template-designer.yaml +++ b/microsite/data/plugins/template-designer.yaml @@ -7,4 +7,4 @@ description: Template Designer turns blank Backstage YAML into a storyboard-like documentation: https://github.com/tduniec/template-designer-plugin/blob/main/README.md iconUrl: https://raw.githubusercontent.com/tduniec/template-designer-plugin/main/img/logo/templateDesignerLogo.png npmPackageName: '@tduniec/plugin-template-designer' -addedDate: 2025-11-19 \ No newline at end of file +addedDate: 2025-11-19 From 291bf9df139b17c59dce91e5e6af014271249a4d Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Wed, 5 Nov 2025 10:19:18 -0800 Subject: [PATCH 244/312] feat: add scheduled tasks UI to devtools plugin Signed-off-by: williamwu-mongodb remove circular dependency Signed-off-by: williamwu-mongodb remove another unused backend defaults dependency Signed-off-by: williamwu-mongodb revert package.json Signed-off-by: williamwu-mongodb revert the other package.json Signed-off-by: williamwu-mongodb modify yarn lock file Signed-off-by: williamwu-mongodb fix api report for type Signed-off-by: williamwu-mongodb fix bulid api reports Signed-off-by: williamwu-mongodb address feedback and fixes Signed-off-by: williamwu-mongodb address feedback and fixes Signed-off-by: williamwu-mongodb add changeset Signed-off-by: williamwu-mongodb rebase yarn.lock Signed-off-by: williamwu-mongodb fix import for task response type Signed-off-by: williamwu-mongodb fix lint Signed-off-by: williamwu-mongodb fix debounce import Signed-off-by: williamwu-mongodb add lodash Signed-off-by: williamwu-mongodb remove debounce logic Signed-off-by: williamwu-mongodb remove unused auth Signed-off-by: williamwu-mongodb readd back changeset Signed-off-by: williamwu-mongodb remove example app from changeset Signed-off-by: williamwu-mongodb Update plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx Co-authored-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Signed-off-by: williamwu-mongodb Update .changeset/short-lizards-find.md Co-authored-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Signed-off-by: williamwu-mongodb address feedback Signed-off-by: williamwu-mongodb address feedback Signed-off-by: williamwu-mongodb address feedback Signed-off-by: williamwu-mongodb address feedback Signed-off-by: williamwu-mongodb address feedback Signed-off-by: williamwu-mongodb address feedback Signed-off-by: williamwu-mongodb address feedback Signed-off-by: williamwu-mongodb --- .changeset/short-lizards-find.md | 8 + app-config.yaml | 5 + .../devtools/CustomDevToolsPage.tsx | 4 + plugins/devtools-common/report.api.md | 60 ++++ plugins/devtools-common/src/permissions.ts | 18 ++ plugins/devtools-common/src/types.ts | 53 +++- plugins/devtools/README.md | 17 ++ plugins/devtools/config.d.ts | 30 ++ .../docs/devtools-scheduled-tasks-tab.png | Bin 0 -> 413253 bytes plugins/devtools/package.json | 9 +- plugins/devtools/report.api.md | 11 + plugins/devtools/src/api/DevToolsApi.ts | 7 + plugins/devtools/src/api/DevToolsClient.ts | 41 +++ .../ScheduledTaskDetailedPanel.tsx | 104 +++++++ .../ScheduledTasksContent.tsx | 285 ++++++++++++++++++ .../fixtures/scheduledTasksErrors.json | 205 +++++++++++++ .../Content/ScheduledTasksContent/index.ts | 17 ++ .../devtools/src/components/Content/index.ts | 1 + .../DefaultDevToolsPage.tsx | 7 + plugins/devtools/src/hooks/index.ts | 2 + .../devtools/src/hooks/useScheduledTasks.ts | 44 +++ .../src/hooks/useTriggerScheduledTask.ts | 46 +++ yarn.lock | 3 + 23 files changed, 974 insertions(+), 3 deletions(-) create mode 100644 .changeset/short-lizards-find.md create mode 100644 plugins/devtools/config.d.ts create mode 100644 plugins/devtools/docs/devtools-scheduled-tasks-tab.png create mode 100644 plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx create mode 100644 plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx create mode 100644 plugins/devtools/src/components/Content/ScheduledTasksContent/fixtures/scheduledTasksErrors.json create mode 100644 plugins/devtools/src/components/Content/ScheduledTasksContent/index.ts create mode 100644 plugins/devtools/src/hooks/useScheduledTasks.ts create mode 100644 plugins/devtools/src/hooks/useTriggerScheduledTask.ts diff --git a/.changeset/short-lizards-find.md b/.changeset/short-lizards-find.md new file mode 100644 index 0000000000..f5659b13c8 --- /dev/null +++ b/.changeset/short-lizards-find.md @@ -0,0 +1,8 @@ +--- +'@backstage/backend-defaults': minor +'@backstage/plugin-devtools-backend': minor +'@backstage/plugin-devtools-common': minor +'@backstage/plugin-devtools': minor +--- + +Added scheduled tasks UI feature for the DevTools plugin diff --git a/app-config.yaml b/app-config.yaml index c1a894dcc7..08c97c1172 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -311,3 +311,8 @@ auth: permission: enabled: true + +devTools: + scheduledTasks: + plugins: + - catalog diff --git a/packages/app/src/components/devtools/CustomDevToolsPage.tsx b/packages/app/src/components/devtools/CustomDevToolsPage.tsx index d1c68d9884..0fe17b14c3 100644 --- a/packages/app/src/components/devtools/CustomDevToolsPage.tsx +++ b/packages/app/src/components/devtools/CustomDevToolsPage.tsx @@ -18,6 +18,7 @@ import { ConfigContent, ExternalDependenciesContent, InfoContent, + ScheduledTasksContent, } from '@backstage/plugin-devtools'; import { DevToolsLayout } from '@backstage/plugin-devtools'; import { UnprocessedEntitiesContent } from '@backstage/plugin-catalog-unprocessed-entities'; @@ -31,6 +32,9 @@ const DevToolsPage = () => { + + + 6 z3lk97GrV^XzlJ3YHWLsyaNXU+#KzpjMBc^^_R#&YtAN0@m=t@VJ9eECS&p_RcI`Da zvRJV?`1Y`o#a^|@t&=Y;uI+q&*yXZKSx)T!VrSFRPhaI<9Y0uh&t9T+(?LR5MRomt zQ*r&i9RcI^Xf3Q(FqhT$9@(oCygZ{P&_B6t>n>WjqmSVDZGPdY96*U7-0njgh3 z3J5;^`+h zQ-uU>><^_BgxV@XM9Sh1=6n> zXVaF6`8?Dr1FNWIcK%$n=C`%?-`^Z_{dEoo{;m|QT&CLsIOTrm?Lkk$$oc#CPz{GQ zG>)Dise}(-mB;&8xsi9&6($&5Ev@lx;T4{PJPS8*tcE8Or56{GxpK}Q9CUC*v%eY9Ox_`<^B6Q3{3 zz5!aljJzW_zc)1K@g0nnh4E>v`;AvWzr4|Qe@EH%Q~PN4t1fw~-#@-Xurh1NPsYl` z-`|Irg3#${Qj(v#j?zpU2^2uv)4>WO`2w;hw_Ml#8{$(;>1)}DPT zP|Z40`uRzxyzooMy0yC5%tEET#3u(H2psZRaocnC6peaqR#W0gBKo%#J5CoF~7pEg4YNHyTS+0@(<#ko_ixmI10B&G!{GDDBkgsH+Kkddq>;}q1&!J z3{Gf_a6st794GGnUsomIjfuyu9gvSY`0VA6>K&WU!sq6QYeHW&dfN>4%rm^fAr_Am z^iNL7SBP(3KP=f56`~_iVZ!;yW#@9<0jBnQ)XsCOwQfdtX^U$Kh*k?{L_cHweD8ds z8&7w9fAsf3Jmw0qS$wT3NBf3N*SS}K)`u(CMD#>PjgPt(BY!1yjaD>8_zQ(c_4aX2 zur7~9iBz^o+!HGGA2Z+B`TO~ZphS?YXQM-Dj)i{peAZS`^^@`YOm=6KuF2>xy3*HQ zxl;vg1w*T`g+TB{HE@koO;X;F>wMfVeF-7NdDF95rnA~lmo^qR_D7OgIbjVAF`KMn z`CqAoDK>To(QsyRGJH`_GE6oSzDZ2+Vd%LvN1-G%1$qGzXC7>;h}uK;5_^oJ>%f3x zg8qLAF8J>8ZWLxbF*>;aq_OO^o#NT__dc23jW^GU{}R0Nao1TPPa~bNT|b_xl*()f zQ9tg>*yYxw=(BrDAb4(VRRCzD6(VG)u=n!iM|%Ya%&s4_Y?1T5I`&fR@XO~4=dT@3 zeDy&7u<4UurppS79TvH=<4d*Y_m>qtzDl_JM(L4Qz zqW)6;Aj)aV(7Bv@8TUTji;W%;t<&9TnDH?H8N7v*&B!&#grTtBQ;D#@CRHDxE=G>e0+Z6{Dn*VFC|JBY3RBR zyZ*XJ)9Aeb@rw9WJ@owEyvxZ;cfI_k7R6H4W1G9~rIcBh*IJ2KnOr~m+3~ug73jm= z53L`LrsL1o!K^jiKIDHWxdgjJ_;If6nCJPSPi^yBmah~iFAVt=E$MXAZ~wj>b6dD* zttiWJ{VwI3@HfwIgz^5z5ni9iZcaE=DNcO%D)-VFgOr)zo$wd%DjVvPIW%wDeU=E# zOJT2q{?%(&Z^lz_;KCox%GL$Q?%&`d+h_7uS*(DtcBo z&){!l=j=Drj1R*<#+~&k_CXt_U($WFl`$Za1FadWd+Btkb}GoVIzG^OWnzOl(lc$f ze0%-(s`p&h8hVB!;TV0q74p-NU`!;^-z^L*k_Lu)H2VB8I4DFEG7iye$Vw=aQ;;tA z`sD)CfT8IUgdjjFxUlabDhO%^MZ@w43Lt+_HZ}<3ChKS|;UU z=%xY^2W4$!`=!4eKL)rX$B^$hdq&~Q=`VU?nju$-F$XVSyVLRNjibIoR-}E;x@e$S z=Fu?S>jq~pebe8#QSDrPw%+%w?xlc@!ZP~FvkIpUQQyiZO4g{55y^qW$zK!(T2{WS zyjsaWpL73VTSlyFi}kB%DVBOK$ouZpbjXL0D-r%X4NfR#>(0UN8_jpM(0mozd!&Pv zJLSzYhTmMbu)a2vHKk$b!%in1S1wk*qO7HK2mJ2R+)vYIF*@Q2)}O%hVBI$s*Q~Bj zzh}Mxbe1gAb4i20^8AISYf+$c3Kba%A_11#NCq0e2;#g_ulz_ zakUd$MfH@Y-EY=L$HwvT2Avq4aKFx)f|_W>iNwd9tDS90`BvUZ6PB^Lcsu?4Z|?`y zgp<6|6v+F?QToRjIoMC7H`uu$?+8iIx4e5EKZgZ}Dn6TkuDo9L0Ug3DfBNw$^x>?= zE{$}z^xh0D%G}xBZ))Xl$KA_6;NJD!J(us|O`IwW9S$9*Ak+d>obED$5cBM|-B*Q| z)kD~JM6l)+=_}tqISMyOcso1?9tL_i>xYqQTd}WRv`SiLSXfx1&mKBk!=QXYbt5*N z)6o@y?%?vCkJ?1mK+oo`gydb&1swSR3ZE_Cd1aIR6Yw>LG8vd>ey44hIZk2dd8cq72Wr~WM4||a$SB~W-UUO8L-hY!3N}yOt>H}rb9q2pAPQ0yitY>#N)EQ|oy!P86c%0+cd^ADzwU^68 zyfd{SjO@@@Sw0#%3Y>mfJrJb9UB){qS53f#VIWMBKW+rJje(=}=yG!q61<0%Cw2gE zlk3f5Wd&8ya>NAXe(1k~2hhuANwG>~C8(~1ex89E{2}=pvxY+X-21Ut6&c6NS$MJ4 ziYxvEs^mKH2A7wbFl?^Js@&)_$%0l$rzUDKVL|nQp_5bMBa~U^&AL89ENBJ!h1tOk z*|eL_cSGePPQaB}9;`}|<5*RALrp`2EjkWMSB>1UG;sQOcrvUQcXCb|3KK?XEiaOd$cLO6HpvuUzk#KeVzEP~n&N z3hde;EwGzk+QB~zcgXxt`Ra}{0)l_n?-US-b{E+7pFY<7{LkkN|M)ZJpIk68NoETa`MC4n-XdWi1^+GY8RoYM7~7ecoAYx!7e7~5Z~sTIfZYZwiu{UwKG*L03kXQ? z%Myw^%xzB*`SXvt-@FrW$LhMS3(QOX-UHZuSM?AtpFi^m=!fX?i(ak)_vAyo9(()i zh8UduyN52n{HGdtQvUBQ0iFgY?^xN$o51{Bu zSAQ2jcb@=vn790&dGFna1qK+LJo)ED|MU6hf4YXa|L>W+{r_`W{0jvBX#t*BKL`Au zx%or&|J3T*xQDntzH934#lL6#a~Pi2x~Q%H_kjPe>3>i8UqkQw?@*14n&+W>pw z`3ouQZVJB1&-stppO2si|Le>@IlnAOd%W-}-9kXXNWk3G_-4qCjRwyTQ`LUB_bQdc zg^9z{?Q(s+T4N-s$#NFsLi-GSiNL!TlyLKwZA#(ALjnkam!~w|Uw?Y-^fOMyr>DkK zT;HY_*Jpc>TpW@+HSW6i*v_cP6MyY}yz2>wyMPMP(t-tppwM8LxA$%HVA#w?5D3}E z?CTkAys~a-P-TIAIfHnp-PmUwtefut@I=tuMl)qfONBVKms{cy{q%KWBW~-~{Lk01 z!fQ}ikYdRy1vgg)V|acxVNBOIj5nYkIZ?F%3!&ETF#vX|vhTZ)eb8s#Qf|Z|%b519 zXGBG{CA-i;XZ6r2+F@pjy90P;KIO;PX%cmTeccuxNtRu&6OrK}Djf1Kp8NlEW| z`ley=U940svK-6p6KS`k;BP5+Y{WhTqMZM2$V_{ua7||Y%Otu57tT4@$I)5s8j@C9nCvNnK{BLH1^N%=Pc3J=TYo;WX}qX ziG@bihLf0Pw`BC7q|SXIp+{GqbyFSYou7>o_Jt6Nuu`(~q2AVA^aIgn5LtHY3Ltmg zAJ;{R@SJeOvZ892s7T--wPceyn6aF-kiM>gftGV7U<7J=FQhGjWnBP8A*8g7qRHWJ zG#lDs35OFt_gVHT^D_Kg^!wVLw3HGJ4Us)iCWC&(u*FOmoE9Hmb(Fs}#rr4cF&ypwrfXIB$XsD?9B# z@y3N+2X>e=9vnNc6G`E5v1LUUGX0way^p~{R%$gy3uyA)DG$MsN?SMCpY;i+b+Ugc zul5blCAzywy*CZE!I?(BUZUVk`N@$3PkP2b$Y<8$YZoZb*kkL)68QEXqiTy68{Hmr zhRuIL(yE|C2@YA9U);4x?0Rau$^D1Ru#gX};jvnH_FR6*r#Yl74>N-$a8*F;!ET~% zd|GR8EJ5C`=F61O*Vy1~jEWx~x_WuJZMCFYAC<>QPC zj#WDdd5`SiZZCoNpf!lfl?>>2_HBYNq+9~vL6C{r6TRs1A;0S=J}3kQ!P-q~F(NFn zy$1o`pnEU+cT;oLA2PH4Litx>-1U1Ndll1mQM6YGg*e6TAzf$FP^p>OEuu5_IPxn5 z^MgC$4VUcru!8z2GlrF5^_4B8NRvJmAkB@u?qheJY6waqJ2KOfy%vs!orfW5CMD0K zIsXyw(jB|Fj0B!C$aFNbCMwwB-t$yMHn4G}Q7z-9#_e8z&ukO?0#|4Fb>oA@eVatb zPmd!a4frzNbfbNIldhmU@0yD=uK0%K%UFKDOz`Ej&3^fyGmOTB>@ob;77@4{de0RY zW0K$OKakDz;mJzlwOU+5ayk>5B;h~#^GJn9VJ=!pqy}wMGh;tjt;}(4Ux$JN=P)wVKy>;hE~-k(=ht6zR%FKsX=r} zPgY93?pZ?%_B&OH{t3MwtYc8|>E|R%GDK`Bom2tLvR4Dfl}KsP2fnIf`s!8N2-cvx zTOUXqOJ8IO(!hjExnj)@RmIYee@aB6j@y7%7AW-T=7p-H-;}mR$B~(qrY^)MkI>hw z^HK0LmVGX$Txk$h(+<9;N4KQ=w-MPM*NU_nrTivi_)^9ff z18o%^W2<@cgJhrT$!> z@(VarvuCC@>E7#zJ}(%4tCIN5nNYb*fINNFU+Q^&*YD-g*d6}&jf;FDlBdVfU8|6y zt}4GY8E}ziG1Rf4N>{G-l7U0`W5f>{*D@SX?oz&xx547l~gWQ6ulBe(L z;Biuz4rK_k!yOVN^{)`B9Sq@ZPH&DvXYhuuO7I>7!~TTFj;~=$;oT3{Yc?0=B`i`d zOh^B)kf}g^r99eQw{OOZ^L3iFaXX}rapqlBopjq!6c%`9MvZMrZD^$*`3*xY&n48} zdld9@G}-s2rJmKdWh}U&{3#sGj)U`$GpZAUt74fa``|10bQC-W*B?y4lL5-Dsr0!LFt;r; z<1{1C+U6OsV0JyoL7C7Tyfn+AjC3n--_onCQ3`Z{~~ z8Llq|)*{9f>Wf7_XMp&cA(uWKR-nc3WtzZP0U(YIrv{ssPX#24^^O7Q^i>4MVZq;g zX}uE?_H)$Go4S#6g_YEB5W3PA10+T-EheqF(>@HIpQ+B+TG`FpVl(H(@E^IB?I2aG z$jj!&-g&|?mW!FuywAKz#H)q5gQ%0(l%!2*_d8h!>4Vh0t;Q3Zv)ZqfGH)cH=Kj)d zIj+)*$}lLkVCp^B~M0&yJ%3;i|#93d3*lX9BQ6_!)fj5q)& zd(y_Gu-d_ToDKv=?jhkH~DLzDvt^f#FOrJILC)QvI9++;{9p;Q{&;}J8 zp7cq}rNrCX00YHG#1{*kw604qIIPl)+s@cTdM5elMVYGgR1UQbyN__#Z9-&5v3H1Q z#U!r!JKcqzaW7$ZtzBOXO{f6xruD{H+ZvgPQ97ns_@8JTgR3w%F|xkC9{X<8kq(*0 zL`Q=wytla=5OpD3V51*Hun(ti#z9^_ivfYvQ6sV=1bq(d?8}{ktyvx{dwbsO0d7|? zK0Pcnq6v&SF6}1 zXiG!!xUv{lNO7ulCYDeafm8|FWZwF6+h+dy2CPQxxDs!hd{QZ>0pHo4AM8grNFrY0 zWruy7G2v>SLcRfnxieYO(fyDK5i8oLT3T2f1#DBl|Kwo1R#46J+`?oZpGUIiC+ZKxwwu%q-gO4C_|de z-&+`%7hYvWvF%BF>{o1;>JmOFKfYJ^a%d*eHids}HGWjDhK`b4+%mFYwG#3^95}(f z&CN`U%}N^-3$arVcuQ8LPS)Q2!Wu}s_>`7hk%wH}2Xb<4nDy+eT)D|SXLzei59c+uZvu=;f-v4y-T58jAJ#0sZtay)~UG>JE6Jzj;{20{81Crhx+PlW>t$bk{* zRpA!f{I#uc9sYBlXIuUAmt0U`^th9wt&UhSu){H=w^-bY-0c zOh|^h=WjBa;x$xm*N@*=JGLar)i*;=VRLj3rm*Ro-5pbS{qG+$-rk!awLCN7ya|5P zSQ7j|awF$DnCo8wlmHMXzM4fCasO(0Kct$hr_}~^|1nWn;rOe-5}f=DxGeyn)6a<6 zpb{ZZBI4lw7mg$3wr8<#+X-d3NU>Gg%2QJILe;Q;8=2H+t>d-~=n>X0>E}AhbO$w= z2`nb)Z@QAt)9T!U6{vt%Ew&H|@D=3zZB!hs8x|)Zwr&qFMz-KOqPO0P1s&SH+{?Mv zx7BAU4S1qTY9|eHPw z$N33JqR3W6WU=}+J6*ZNB`$)_X{T(mhV0_Nq9-SA*b-F<%^#)|1pZO8S3Xt=o1?~y6rkDI3aI?wt|8?Kt@s5_`1Zi4BmZbmXr>@CLH6}iTTa+~ zb1Cn;2Hd9CMg`3^es@81y-~^JS6?!y@Tz9`Y-I$T6#RJ#zfw#n$kRt2ewFp>e4{_| zY8PwEpioJt1F7~KDLdo8YCn9GnjfS{F$q2#Q+OU%Q$jHt(XxMQD7|dDEuU4$`)L2Y z*w|%z@Zi>m1%Gc=*VZAz0qkL3`cmu;p(}uonvtTRSL-!6x(0e57qj2vRhP}S=Qw{w zl$h2ZuK6ld|5Jfvg=*&JcTnMV6xB|s79zg>!8-VzgCGGTOrz&i~hhXFyf@7@2Xg2sb)#CL`bj`FqTsFKdA=hyY;g(VLc#5w)nM@D>{ z?||jqHGwv+RsF%1yor-Dy=Vufy(%WvFEFn%6ItnqOTlJ8E}r&UuyCw*ta*nvLpnA7fc5}b>Fl<=ssS6caY8=Zh?@JKhg}mFO3hO$2G^FV2 zp4-KIh{9(nM&i2=JUTKFEBXNQ@%NL~>+GH$EBz)5WHx+%iAk5%ck0{Ciae^jR*Tbv z!b=74SAF2=rzZ~Vp2K~ty>_y(j;#q|sND#9XD3@RP4u_%3DBE}K{cW*67qmcCi?X3 zVL|ln*QCqD0rFhCP0({6lESQ|Q!Mj<@((8lT&9L`DK~n?7 zyBjV3qA2!_g*ORiY4_ct*P7zhOsD`=TusJIeF~{5Hco73FVW=;>H5$*g{XFhF;H@S z$y_UymO`h_-OE>s$Oh&hWFKgM6OSGSozJ3DWVUqpd&ALdcg-IwXs{A^qy3xYtxBO#*lA$zqGhLG z^7ddE?sNwdjqYHw9q&T>9)-XR+QU8Iyi8nkr_&T+Au!YO^bzmN@rdQ+&Z>mpPJnJ~ z0uhq?8UBQF!olBo-KJ*j$_TAH?0~k|0AKE1_SG{vMpsp($CN_=&B#~!RWP*Rv7ZfX z@Og9VyILj2%K5HLJYnnrKwKaWTDzcx{-H`|N_x^&5WC%Dkt$L)Ja9uigE+M>{bMi%k3x=C6a#v`;f zq^yK~6{G6^*#Y3? zKPrX!ma%nGai+;-eW-LKmJ)XIfIUjze26@so)!G8)Mn1}F*a|to!F+AN=myqabans zLd(mthn=vEIZL>t#=FBQwwn2b@pOmwP;ros2z>lc{GhijLn#*w&!CrV$%&L)|=VSW9I<=6Mlr8H~Dp`l8wkwoN3>>VHY1> z*&n(nu&Y=U4N$8p|cj8QSzk0|@^H9|^=h@joq3}y8=%RIWlv&FO06&g&a!* zFPXayv-{_5UN(O}u^fL~?4mlqD)@CW*TQ#@X2oy4NJB11zc)~OAPJRQYKL49WqE!a z$dXjSc8Oj}|iV$IFO zgEC_>Y00!FnMV2DAY{Eifn$hd9~*7xqJFi%3q}vn?+=QtF~NY6xwo;Ke%@ITDYuVf z)|fTLC4f&y+bw4!UOx2_nXvb^s;4~5&=$ze<;zac^yp^w%w55iH@Iv+m+ht*58_(i zY!M=hGKEU>2t5pTs^L^@SBKw&+gB0L^j>%INJW-n z^?#T2%Ja5QDz!AE5Z?QRotl{yGTEA2Wo>S6htk<(7g$7)1-tl3_&V2rnAvfw)lLer zw&OWj?*7Z){Th^~G};d=(%y@(Bcln!H*VUZkKzP#=G|M#tTy*Rk|BEPP9-~wTe~6Y zk(z)KyTQt~Z|!aQe(4`bTCKkektW`-EQ@<2jQa&%o=!#mb?*5y^);!PX2yZJpkBB& ztwv%huxw6NzqhGrBY2$gkQAy@U!rE6v4G=SQZ}*|WYh52trus~vNoym`QfhzpkAy} zw&agzf(yN#KZLGqr%$>e9v~jj8m6>;3NbbEre=@-?67GEJHX8JHMi7WrpdZkA3+QR zub!Un;w^*!BpfSg`z=2W=(1OaGC_0eEN_n&Y9fN~DqF;A%dE+)wG^h~6q88Tx@a)`6rJmGMstuOA-JQ`}JDT30+O@`?q@CslY};@m^xCRWLAd0%x*_`y?tghx(xQCUG7L`E+I*ln z{nOO<;C#@@!z^KX-Ay9MShN@fg(GJBIPhB02)pol_^Fvu5Q*jY;x6a7lUS?J{LUj9 zR{C6l){HsJ+6-CDCteI~X-aK-Qvx4T;_TqNUi7+4f9?bcwerTBl;$!v za)y!Xq>(W)3JM9LlU;xq1sVL^(`ZGO2+3?`G*gHXpF)|^9DLOGH1=U^pCO8cpXyZ&js z2sjV&>vRL^LB?7^ZeUu=`pk>Z^6|nVOa3P+8CrznAAPybE)lAP@WmHCLH8viuB!H8 z+kXL9xXf(?GoeQlxPt#fR0z!tqZy}II-5%M?h-+_2QA2q2GgHu1f`E= ztWg&ZVaGN&G>x^4pBzK#K~Q4MR?$*=OE~BB%(?=J!vrpMfjXq8ISbF;-C`g-@3F|F zn_G28Je`Puqak_RGSAtkC3R5;kQw@|c1%t7-9h_ffYV58hWa=%k2c>|Fug_5WPvvf z<^*O|WNKx(w-&16BpWL&#krc@X*=${OGv)y^V>JQ>uZ~&JEo;CH@NF-4)z#7!sZ1I zS&%8j1V#r>(}qA#+70nQEMi5mdhA~p#_?TSra*PAP07!>l}ip;5Z4+a#KVtxX0?Ek ztdyIP&YdEA=8ZOG#Ube%UxHWxO_xjfhE-)Z)|RX5E@;1!I)SNxKP$2&sw?*;)90#A zkJ6UIY$0U=35kVHC4BCamM*JrF%b=xQ(`XWA-3LMfQDES4jr3#+e0Mn{R^n*^&;Ww ziAw+C?-1f?`rb%0^S^n`8T`(fjfI!+MdQ7taeq6EZ1(LiSheK!nTU~Ub8lwXi^2R7 z1VWOB`MVtMW&);+^!A-Gx;PT`4*3pwX6KlRd5_^QekvXUZRM6E_;tCea=P52Nh%AX z`eKb~0fkfW2($SY1+0(IuBkx=iaJxXWoGzA6rHOQj1k`(Lhq!$=l}bzt*5|(G|}!` zqqtm9D(^&1*0rWvzh%&=PO;W`VheV8>`0wZpk*C4)aFu1T7Y#ZHs*-`atZU>U7qr` zi_0HU^8-p+{#2j%JCR~=qloQp2IWq`0ExJ;4NGKvL;>Ohy)%@%9K>gDrCsH3V{`0G*GB}8!81{5N_-7M3Nz zRl1x5zq9o~ztYHWgEzY=@n-4@j#W9k=z_0D0G;b$Ci${tAfdU$W)n<2T)*p%d(`8X z#H*J~_tsCHS<>N}g!mz2hY5Fbt}%rXq83>jHpB003hq}|gyesD3dzpMba4u=thtYI zcS|`abYI`5P7WvpB?}sE5(bDy5r!)#$Vy%2k_FaI;4jGQT4fygs!POPz41c;*%amp z!c-bLrTwgP#6YI~V${X3 zBA=N>M8@r}-Laj)6+|=k5q*&fWC7-x)$8Ots5i((6Yg8kNt}+s`1%}6%R`APJ#S;4 z*ThVk((H(l>6Obp9-k&*%ljMU2o?;h>hJxTHoPeJlaYa(D zp*hWO)1(_$Bj%hmC9-R$wFB>*q2G}#no*MwI+y=ACs#Mh7=CDsCha3Bk&Su(GAGa6 z>dUf#7c%W3gO$19zP`=pC4B6E@3La$34}*0k)CL~`Y$oHZFbXOMASD-PjgfN!K zc|VzI=w#m=a?fWiJ;*&R3D#4MqStw!kyix5&#ZQBEO7XwXa*Br#mdcxWck)CnXf_> zWXWdRh>vTG+cQ{(c#laFQKx8(NAD?#OxnI?j(g)-qxIb%sXuOReWCiTf^jmi+rR$N zOX`CEA`|he0Vuq_{#I<8MRyzg`PV_&4$}_`$j=!OCq>rm(GS^%xv&XsrPoWx`=M66 zwdPTjzQVaW@kcvnF6yov<(TQ-jlZv90Xgd4VlY<2WeD&JJfQQ?2(A9?VUq=iccb!V zyxx+&WIf(Uh)*?OhgIk}_(89^&(-k2~BDMfXnS!e_DB zWAib7GcH%d*9VXzBlt7_saYv$z5Q{`A4qT0G7N!_=112?z&A%jRA8=;tT zHq(IPQPtzwE7^X$CE2=#cZI|-`-=6mh}4CILYi8LZiYsLUiCArgJ)zcw(Q`V!%#o6fE9`O8>E13NkVw>VFS zgjY+#zYu68Dqs!!H5D8_poPzrf)3j;?H5D;NTiWBXlv)O|Dr+Qtu-09At>Zz4@S7Y zg_#+fFFlipuMN`g8)=_f4cq}U=kz-BDwo_sz_CiT*HR`6=CnoH3%K`v`CHRK>Vv|p zAMZBTt6+8fn1f7)jj&MVQ+?49m3FdoFZMc$L(n>q*4^5=JKO5p{yPeMzCD|G$OkB$ z_w+Y3jsQd(8fw?0qms~%>)mKBT#Xqdlf7hZtvVoXd7z!*bCG=jW5~NucaEQ`i+#J? zw(nIiscw9@n87Wgr07r_W2b8p3Mxq=#kVP?Y|~eH)ZDATyLy?{HysK&6Kg?u?@_TI zTP1tcGmnnjVwomYOPo0Dy^2x_IsBR8B=%DA*%I6rC}+v&t11hu2>7 z#80X}HLnbNfQRJjy9+N>NNZKJ)Olg1Psi((q$2xSgB2;6H9w!|9VJ|4Eo7V59FA}~RoqwVP zan|S|4F<_AG`+7DM(%fQ-QzR|j9Kf1)SkmWc3n?CnsrpwTu+344AJGbIsU?d1xU3NGBwdPh_!d$j`Jq1k>|= z!_XZG4Hq}zHN3SmT#t(~(8r~qa~#xX9)`sMFN2nqE@k~7RkZGi6_gONjuS*Jnhn-& zQq2+UJY?xi_{-awB^0i1zDZC|I7MTTAHbBW!)@RPbcd=EqD4ER2Qz(8bU^fq@;WVg z>vx*il4zb?O;)a*=QJqG=*0S~j4`_*blbOQ+R|AecY*%|gpQWEw4S8H8w`Y#VVDRz%Dvb(PYm{Th&#?ix3r52(|x{}5fv z5)*15U}u+x+Qx?qVk3k*9Hs8&I(;h)W8@Jht7?xL@i#oLI#nIB#5&x{Cp?hLp+(f! zMQT=#YacXA^Qa}q+%_A&G-%;5-wDR4-WYGYUzOEpM_T5^uu~0b!Chilxrb%o^oENw z#rpfxf`HEGF!~^^XlY>a4_R6@w{@~i!v@r!?19uaBuA$-0bhaIPQTz2B|Es*BOv34 zbcqdDhvv%HlLr5*CujNbLw3?929hAEBbj9Zim|k&KI1?{_O=K2Xz;8b<=7f>F8Q@& zqYR%6`LAh1DKfPd+kA49b{*ET32EgvN^+0w260F`SC4{&vUX1LgR-23k9z?5jE7O? zNDSC-*SLh7@7QxjZ>Zm!p>sz2yWk=AV8vOa3blGRgD;pGse_pgQu&p4AXRzP@No$A-3wvP0n$`-YM(#gm45y$ydwtFPtOs0G(tA`)i`PSH5EIwnb)mK zDse!#)GyEAE+!f1+mXo-F&uamycuJ1$I*@?GIYliW5^y&L?CM|gW&-%Cl&N6-kB1>4tt zE)nCS!Or#5r7M5kDR4l5kD zei0L`T_xuUMvBIdO4v_XKmL9W>4pDJb6R0o9d$|j+dCn`f194li&$4uuRtA~{szx* zr$T>Y&|T(GED9A2?gKB6E`uaMmwB}Hy5Kr22!2Wb8>XuIk?+8KCEJSra>uJFNQWY5{hCnQrBZ_vsyRSlDGrdN>LM&IS&gSQ3j=o&r16UZCR`QP%rt#`Q z1|GjJysrj~h>CRMX=4M5Ju1 zI74F+*jdtKn1nHZX2FhUppg1`F40H8o$=Z>gUx=%qs|*0-$A!xz#Ra%33EM3910IV zikV~V_ip(Be`WZx9g?80bp#c?I0dfwfUE_Be7DImG2$iC2`0QC1z#Of*oBc&C(=-+ zRR{vxcW!bKl+VQGwF5Bav0GXvit7*6kG%!r?Df)#9=m=q)mtjfZt#>#!3#34B!Fp3$ind>Cs-@AzkEi6BALN~a+vo36{T__`( z*l;P-Lo7%*(;H(+2RJu4a72(&$6iW}F^tZYQYDY?rO%ea0H{sFTHIDUboEt~=~E+) zxcl*^+q;tQ$CxQ9*6{-&u7yURdcr-wEH<<7Z}Eiri^c4VC}{|CU;MSGC;NTVhADB> z*M{uyav7E77FJyTpt0IVa|=NMkH!^ejdRk;Z|IklPvd zJv92361w3&NMU}VfJrDX*{r^XcUthxB*!SM)`=>Y#DR}?D{)WN1|p+i6; z->=`D81K7akFog^ZefTlT0UF9n6DF>M*bzgc=^(C@doQ#Wd{tWs~rbZlD~EF9dGo# zrush@HOM>U8Hv&eXZGjW9QUpOViaMU;UPMEH%s6lqc;|)tr{46c*iUoeSQ6t;Ztq$ zwtub5K6?c6F*8{=#eTUwiXC{P?3)%_daWcd7p>S(!R)@^=U|rOr&`E67C~JYizZ-$ zz@RJ_;qCyUz5sO4s)J&5`Po0Hqf~z9X6y6hs!CGAWha^*u~7{Ae*%Ig+yL9X*>Li0 zk~!arnp%d30ybU3)e8_h>a&ljl)qUNio{syJc;s#c}2*-xo7qew197)xBD(r4gmF? zO4DWRYACfv@(x&4H0$sNX=d7BBDD&F2nR<(jQy z2dgy1RM$n272LTUS-@4BFiyuE(z41>)1O!*KZCwZ5H$*7!JV~g_-Hv?0-KH~AeWu* zQgt7pX%X>4+u5VRp(X6Ip1u{%lXrf|penSJ98+j9``2DI|l zUwYA%*?~Hv_quA@zD@D#J>HPOgN^0Y$}jsp5Y?j z<*x`PRx;$d>Lkt0=L)n{9|;zIDjIY$ff0oh!5(p2#cHBYBkAOh*l*xs-zbLP8N+TD zp#{1VnbqDt-JG=1_*wN1Q&{WF?#8sOBQ>6nQZeK(oyeVvpfBM@+$X>SemI+=Ix(v6 zG*Ov_=@81*|dxJ)d=GKwcDI+Z6KC z-K5}s>jn5hW{aYBOiJR_M(3-ng;Plcbl2GJ_5`RLK?G2aI+wkl>-U07x`CLb-Y`^G zLRX(o4U5M7q=}mqan9JEVX7-9@Sjhs%|m={D{UB+aMEUCcl~(uc(gom^;yQI;(A6g zwC(f->CtDc-cz;bZf5y*e;%_l@64$e1Kn0%XOS8Lw-L7~@|eW<9?W$iz#zSc&{4bR z^^$q>JLGxbdcTF=jM$1;I+-3#LWg5dmI_<<$~~B#MxDLYFSRt&zst+b=gCe(rpoHI z(3TIO;bMwkr2|UY*D;wvL)I#S(80Il0KZ8z*Ga+^O;n(OHc^T9lu94%pccOjj)Jw9 zWZZLG;z!kyuZ02-Muy9r{2{s#^CiwSbj#5k%vPTZW?v`kdmn(K&Mk3Z!wQ60OKCQP zdd0dceA55E^XXBtLh%c3|7eXLIp$(=NyIJQ?~Te(sUmmiYWNqMk3WEfDtCe@>vh<% zYuIR*JG26-b(q7H_w)(HoE*8b`6?2)YP9|T=z8;LsQ>=|zfx(Xv`ChzB$b$uWSgl} zlA=hm&bw5SG9l}1X;X>GI%S)(q!Lphgc-6-5n~@&W-!Ls$BZ%i@_XsJu5(?V^F6=w z`lrssnKRAv`FuR?kK6tJ)PA!x%g>-~T)B7C#rs#K2jP<3jnCc6RTe-+BC!wp64Dl( z?1XUmepwmRe^1v;4{1q$JH4~i2Nl;f zf2#v?bHLqjbO&ytUrZ0+^b?b+eiK`Wga%@vHg1rVhCU1Jp=-^;ABq_If5jofP z7L0r5d#`~Bj2D>Toh=@9sZ$qjnH7$(+QLg5y6k3dKMNL1-!ZFTnu8w)Z?R^I!o-1( z!GXC^OD7LY=oxC*sSb@k-=zBlJy{8#E?uz&J8FIRS4=Fe+y--@-@6S99FdM?t*J z%f-q${uy_d#p519P)Ef<5_E~L6@)034So;-B&XsxL{n+-;I^`Wfa*T}OWHMb+?iW@SXmwcjT7Dqj zU5ms&GRJYVK+QWkO41Nj#$%`(4M9I%i7cjkgNUA0P^g`J{|rmk7gt679XU&}H^Ugl z2=1bg=BhXa=lD~w zJv90JZpW?JqL8^r>0XBYFN%hnN<)$fZCqk2PTXI(@~0%)Q0EHx3|<3cFyqEf>$7g`u!hP}a%_i=ZF2e(f*7!I922{uH3 z8uVe4Y-V+czhXWwS~qGgEI*_YRF1$@bB$_ybw@ z7|*hJc~o2sVqO(M8R}j?l=vBPxK4OXe|1vQ@g8T`21psvyyI%ITU&`-=7spm+o~|k zx@^5PT5qIwaHh~;mJ!pxM+Pjn$l09ZH9jxD-Y9#7ZjQ+QOYac3W}bnCRkd+ZaZt>) zKm3pJuB0gL8fu3)(8K4Ok)s5cUC1ls9B>h2bG(}GfJ#Ed~s}NyMrn1NH5wGJRR`+ar8{3G{Y|Qphg!#G+@3=*}c!Zro1C zZRf;?y^NZTc-LM!1)KadbX)MmTr$h_egf4KqEBF z&pFpd!Y2inc0$xDsqnBC?JqnMud_+{di|xD?XKt+ewodNyzl|{^|yaToQnuKxSkJ9 zWm()bN6o=G2DD9?>Ib`^X6JdGLfMIz0&W__Yupduh$MT3U2lxhHzFQdm7J>hT`cJW zNIRt&uiWawW_HlSv)Ujgdv(EPjqt;(#pWd{>DmkpX8uN!VA&-1-$FR z;3iV@@HybcX{$!+253MkrTj`^7kb?FZBp@pe`Ebd>d_R8C?<)#V)~x@m4RuU#Gu36MN%JfcLR}u3j$Sni=Y3gDu^j5<=@*_ec!)%zdKWJQS zs`9WFby6AkVm@cODh!^Fuzyr7Z?0bQ@WepDzpeHKsn+I&FLldp3H1_vHFk{0Gj>x2=|+^U{^jb))fc(GEAEi@RgDNveOtb>I-4<{ zU`RUuPfV1w28Azz`2b^b(LT>ph>sEbTIcj^4*0!08s$BZx^Bg(y`SrFyfveNej5gz zjY>SH-PWBC({kQFbCOm8bvF8yS&;~<-=gLBgYX;5Rbs0CssK&Ao?+Kwfzq4G-n=W! zK=`%OBl{{TP&r|Tx-_HOK{ha7^HXN?+=KD37B=LBv$G1~nDv6)K(l zc(=fsvn1-WQDKO>tlg}U+ID;=$|bUaOm-XHiV;X+zA8>v#h7tu=uPyLDOq}YnHn0l zJbZ?=4O&$%`I+*yGZDfTnZ)M`IYOTIRtD%ek?ZvnBnw-xBvqAwD60L`ml?>Hpki2( z!LqC2O7c6xPaym@Cq7TBM6;3Hdn}4*z=Cu+gdRC-y?3ANW+X@+JgPQVveQ@|=~MMU zekV5r`J@BK^<}6h#inE$%T1+5fabez+=AmA9_sK~f5MveDubn#0(@?+c*tN344YA2 z+nQiZeDp8nsRdevL8f3Y@a$lK40OWEVeq;I;gNv<%zM@)DIFClnG_F3NJLQi7`)-r zHgL*CvOy=++`a6x)WORJoEAde0HN-|)##r)!@u~AGWrDjC+3AMqoxM2inDW25N0w8 zov4^PjqkIqe7kX}2uN@l)ltP#$f}?)5L0<@=#}_-WYamsIBQd(C7O*OZRvr2XKd@* zFSfRgS4_L~c?x7vB-(PB((L7E_eLX@B|cKUo0CH}2@_l{5k=mmS2-Wjj+OVq0uh2YS*S;F7K=jyt6h zM)h)6o(nsR@KxyQkUC3Cesr}ytsgd04Sc8I_@4s*9`qM; z6lvOgOA0b0XLXP|67U&HMw$UfSmCzIup$q%m+FtK=5mjI(gf+dxPhp)MOIPn(YIde z&y|%Y&Iuxtz`PQvOLgUhWV%2K$-W_)KvbHkWw0Bb;MSZ#MS zDD>gcC9k6=m#uIEyp6!_8>fF+W6-X~@cyqm(`%ZN=Jd=e?B3L`AgY3@!%r9aVC=b7 zkgm0TRH9Ur7R0eAKadtOhyJiI+=}ZwDkKupn&vqR(b?Up_u=e4ZkVA4UM2Iu^5tFm zxdEwD?DgeMVYSr6g3Rj;c8Gkhn{nLvq$9UR@%=%sNr%NRGs0|}c>^(7yZwx#PsDZ{ zmbaK62Hx@x0IJ06QjfHrMC(%`X&mptJUuAvDVh3pVpm3Kk|YOqC>6rG;eUd@dh1}^SLu& zoz}ub-<0rKWuF*su3JU=&k5xw%b|Oq{fNlX3f1)!xR<8O_*NB%}3?~F?5qm-Py(n&HFE^h6bJ$D{+O=XTcrbCfb%ulO+~;+MMO*OI@Bp zzngBA;X2ikFX>S0X&oYF?YM?9U<syiq0rMr`W*2 zO5ZMM8n7%ntbXf7vLMKdPk*fkeOWraEJ}~Rk&3vfeyD_yY$rcq0T^wA2g==h;-szb zR#fk>;L|_&T_QQpM%2dece2|IzTj<0d#C-Hxdd(wA)n=EF)<~&#UQ6HOnGfXfcOZok_Sd5*I;=eMo2i)(B1KNcqx<@QUtI@EtB*w29q0`=mvrl6`MmYlFXVx3$mxCCHE!IW~`n#)ms(k z_{u{Svi7$aFjQ!{@SJmE|0%`51TORVS1*6KePk}6RP6v2%Tb?Xte=uTHaCaX7A>|z zW$mSR&O6IbV%(km^%*&7GuVhupPM%@X3gvccA88beb#E&G%8-EQw-hLGvzuR@*eZa z12Xfw59Ue|2G~3CC{GPUUN@s8Z`Ge0|JSO(J3$~uZj*(sjnXwss~kYaJaY(u&xpHf zLIP!84(Pzt&(D6g6BE$2htK}ZwJeq0OqGW2iM&GHALJEFjE(v@>GwsqnYAN+d(3*4 zOrRMFEr3S`6YC4C{}d!sM?lx9r3j0`f=lvL_La(m$aQ$zpeuor^Ch?g@L91ZdJKGn zGzFsG+F)W+1jACdVHa`<2oZg{bGrB)3R6|xk4gkZzRrA|*G8)M{ln=TQqq@SI9o|NVKZ7ea)a$Y zKzQ-dvg7U;TK8)hzvnoeOcMYu7*Xa47ps8ivXMWBiw>2rQ)T?0^7&&lQ%nj7(c&*C z6jR;>RrxFOpydI+tUiD9SOe$af-sWC1k7x*tUIFb>!2C0w+TKS<5TB*HR<1hI$k@M z;pH=!pX>35e;KARNN9 zsLDHTx|4vG(L{WzuTa0Yg1`1L=;R80b+^;X^!ryq^%cNt?>gRcD==&F@Y&F4fb}7E zU}{v`$!vP~_idE?j)jWwfDR{+2uAh%az zYBSJ%YS_>N!C{af|M~Q_1Xacso&~Vi1c+se1_|bMz&ZwLDR>RjtR4uxzgDnm0V`kw zc`Lk$;+C?@ZHM=NYnx13XF%<-a)hxDBFsp}q}Oyf1TFkrnFNY9jn_F>EZ9_)-8hC`DvYqI*;!Fk_7TLR^Bthm zfnIfg^R@-q)KbeKXz3i`56yTAdq`c8mPBE!Mzoh$-?7WAq%V7Z|4QAJXJB; zlB5c2!g6w_a&Xyjp0)l8mTk!m$)G@!DcEi%nOchYwEzi6ut}JZ^u7Mp-|HiQzs*bg z%F3XSuCDNWnXYX}k_f00jjd?u)Xf)sRB0B_lVD@atKhY3cnzFz9=38j~`Z zRm$>%@)GsD|0C*sdsveXhF3zbKR`T@3ZNyi3vzTBj zqxQ`_+{9k35dg<_)1?cqNVH%3U{QlI@fE)O*u2dp^cIUvHwtTh;Ls6Gr6r1eeIIz& zS^a&}dHoKN|EQ35%cDltQahLd?H_nyLNHDKo4gmH(bqxhcm^&B-G``aOx+KL&?x?f=a&Ii?;Qz!n~?Pd&cDhP%?_I{sU$z!51Te-SOu3e;-u6%Yh|)4n5wmYNlzg z=K6Ms(Bgf1J50l8DB0!kt?X(Gg4K%Z@7l)ouJ?9r7HW!4>R9Q&_Yx(h1`Exc=dQAH zD1eS)X~kGt!tN{Rkq7c?rHif#>!3Hq##UhE&k}AjSbAC{7#Jzjj$FN8;HhI z@c`yPTRO{?F4Roy0MCTqut(JT)^!ahl!5?k`9*uEX$!@up%%NTW*HF+v2Ic&USpLy zR5r=){au~)7@p-Kr^9)0z)?e|zd;v|{h$r_Im6>NEB>KDftT86#OV#*?bY!xTSZ+2 z(<=*El(5EQ_BjLp40*c8A!}3_Mgc>mG5cSm+hQ+7x7>Y(_Ux;}LuB71u8urs1;di+ zV~A2n!={8+)!WomXKe}Ij#hE+1gEG+R1V70(1c$_(80l(Kzg$(@!sIhPXX);k)#^L z)18*g>hnl;og~)fW<$`>HdzP0`%O+0;g3A)Vdky)O1sjsm2EpI7ntA|=2Kqh=LmKB zWHL!r`4LZ=%o>plZMZpPbqG;=I2Uww*`lvhyf=dS2BrVJdvA*x%uM=Af4P7hTtfe*$Ejq(=IeBhaS!0739~ zYAUamR2HJ=J~JP17urDcOKfOu0f2x2A^zRck0N~Id`aj?3F z_j=aGC^fqRVeTp89-}d|qm$6Tdp4CB=t>vY6>P;7Z7AsoZ(ewIBgiXdz$7aWI6NoI z9ujffJ2rz;K8}KH=&dbI%0 zfGNufAAyIDR0hxLH#u$@49nal(7%w!GdDL6Ht8lC^l`|cFQr&%^+czmjx&X( zeP+2&S?BVIcdRNMM;x_{PV_!cXNWJr3Gv8yi z3;FqtoYkTn_?aLL?pOIU!Gc3oZ)u4x$Gd{YZj3R}xfjWO#(DFU^wXv4OwdpA#5^Ot z>>-e@kqi~*VCJf%2GEW+@n4ii>49CROCaC~3T3mYFlPO}xwAp{BV3(7x&n03vWk9t zhq8Y*E4t9$VzY_fWv)K6c0dM$ZtzB{GJTYm`O}(|@D)OB4MoIde=vW|iZEf~%8DVu zDPH18G{&(lL|yQVw5Vs{$A5B9!ez3C;E69zh2+lp&e{IXq&C)h!ZlL;(rJT6{pm{E zQu$7F=xh$Smi-ic&S=|=sB}0+=KTJg2xpz(i`L4;cL=XBI9PB#xxr8v!4*Z})s{fr|4cptr{@+YF>_EcR}r7f#9(b|-G zE|{SSziG!DwT)_z-+x*juJrc7$Ftxhmxg zt;Bwn?SaD4hm_H5T6KRlLee9`M9jE>$Wg)%^}?}&}#Ou-0<3oMa+kKUWxq6E(J8^`ohIp z=hp0?V66+_KzJ2;k_JZjz&fjg=s7#s&igQ_3$BK+MiA%P8WcTSV=dYd1Gq8dUXias zqBWr_u${0=7xv#fi0Uv$yY^-F*s|KM+1WS%sLb6|E+gve=$2+(dgS(wovv`AL^ zUo5Pqip?7kI!G6Y4hd3KtLXP!XRpq=__+ANR3X8d{vY*t)%y3fSSD`N4@$M5UVS ziEx^+dg6`Hd{N19u{L0AAi^SlI$;?Oh1oQC|{4lbxG+`*v7whFkiH!JjsQ4WH{FB z@|=;sp>)vh$u;7^Q0SYNCjOOMVc#^fKGx!R7b{XfG7~8uChV1gX~~^?G=N^fPo)RH zE#)u_m6<6eH$-BDN)Z4yd2qwzgRLa7AB+TGkauLOD^ko2M?}>0sqHoe8Ow$Z&Hb7#2x&pL&EqU9PZjz;L^sWqkMqJKFYrG(0pIVo)sgnPG zTKYgsn*3dRU|E)<)8wk*{gJaU1H=BcQ02H+*X8Z*ONXKZQVTLC(zlDZlqtQOn^pfF z1^qcMneIAy{|R`XFo;yYF%sZ3j3V73)}lHWBji37gm+nj7@gk0djB(1+X0;^nR6z( ztgY&D>OS`EqB+;^XFF76mBsZv_CdPSLbM}%!;J|_iVM_EZyp33$2y~A9}1ZA{l@ks zYrD1>DgFm#i5=3dTVkHo;HV3l!y?<97Regj6kzy!(8p-v`Dp$6v8DCueKA$GEok*G zu<0=Dc6mV!UbI;pi);e|exO$d)ViCGj6L6X=Q_<87=h(Hsma?p$74ha4lq~*Rn@_u zkh%HGFkvG1Xe5X>s_UXxJ!`s09~^;DB2vzPFu8U zeORPx{=|svG}MRe8e=M9&~grQkWe-lH1?B+;Q0R*R~lu6T%ad9CYypFCw?u$G;0o4 zk**IKv^v>JST9N61*#(}zoNI1Fss;f__d`*xMGO;m<)-8Unp|;5lg&>a+=Q{$VjB6 zfK^X<{jgl#ixUh3&RB?pSC@IdBYm?^pPBT8=+y!vjhV0RRlDT;Jx71f72AVmIbiAS zR=#SMaMSc|CA0$kH-eN{qp^L< zntSi~c2y1;rjjEKq*)M%`3UT8$~X?vThHC*G(mmCt(rFw(5e!OCR0Yn=T(*^MVVZRn=g}uTiM~wD_-0{2dJ8<;E^y%V#MA+!btF1; zt7>DDYqM`qj~{ugGLJQiDz0O4B<5v|zRT7#7RC97qF-M8qShPbaoGNl;Xu)=!PoRq zSrOdNcYYJ_Bo*Ob)ILliCZjQE9UHJQ#xtKJ69aLLz!2ZuroXDMasH~(R&tL9`7Hch znK47NIH~z_5*7rR4ulT$JS!77_!Uh3Ai7;{qIG`+*gaCr%?s#ewu{dSP9D!QHK!>s zx~#xXS8-`AIH-3SJs5SaF2cYnpl|kxY!wOPA6+RiyOKlfmkrIHKp=$t@#%T=&?AB| z=dHg&uN3~)uOY7xWA?(}fpA;p`)pil(8;F2?!fi?T<5eB;0{*s$AaxmrGO2~?SE`o zv+@Nt^BnG8yXB6gLRIv4!;Rk;LpIh`0Ah>sVnY|%y$Y%vn&c;o-X0N)ZlBj{|B41= z5$2)H&!aQj(d(|~uXMcn0Di1p-AWyxS`0PL9XD zNcRbKI0%I#6&l$Mop)hcW1jYOmnr1T ze?(?8)z*I+Wg~CMs(zZFDan2m>E8WIUaA(4LM&jdGl4&8j@9`7g_nvp6^=_Bkx{FP$J3>M|=c16|I0^9_vK0VnKbA>DF~EBqtvHLgaW~26qcd*&RvMrt(az1)P1HzWr>PZ*1J{QrQ@2E9d~^ zn*cK?!Z!2TeL(h_TS32d%6ze+R%WENSS&0@phaI0O^)Iw<{0?Rm-q-yJ{?W3RxmRQ zN<@M%sppnJ@nMu_m5*E1Vbp8l(V@PPvaGp0K1x3yIZ^tYe|7;agFy z8jzZ^mERtWI%Q|zFciC*CEPz|L7;e9(Ydl~o(k@zp5r9$A7oXk5o`e{Vn&tMb#S*b zU2Y_CSC3tono=+dGN$tss>Ak4F{3-q+ZO2`4etI4WfJMok_CcHe4rbh-Q>&+<;8ya z)soi?|HxiBvjQgjQs^@mZ!F)%`3#D>lKDUQ?jT8S5qEyuhviN2U|#QBNZYylh}?vs zpT2YX=fj%zg@*;rTea&7upDb;Lp)2KHXbKcn|2NVoQNGSr7bG4DC>yP*uo2a zfG^VRu>1ktq(SA20RYGtD`TGE(^Ex2Adb1dVfc}UAlnb*^U{-$Cl4&57Dd{9mKR~O zcv}tv7!e)nh8?cd-gdI?`?uv#jWJ+n`O`vMre zbmL?Wy%8ZmL~>3ov>ShE9QuwV;$7my{x07wC4&tSfc$E?SZ56ZjO~3guqYP;zX%B( z^akN3@r+9(x8hP1SaYv604_QO_u=9K>Xj}XCQ23uFudWw&;=jO)=MzX`qzTbM%ItW zJ)_qVaq6b+VAKSh;)OYAO;B>;tumZ>C}}Hg_9v%K%t%x#u|NzZ``P-CPw?U*@AF}E zeuI@bYTWb>OP%?2K;D|k`CWRejmF&{A3*+uXHWp^6XG@N*rHJj#iZW!E1@VU`)`Cl zX@a`?K-iJmt3E1nlj5I50LUGO_3#i9^gx~xyf884CE7p>8DPiaGmuJ|Ia<>Nx#AYY zdBKiC4`O|I-)isg)=iIrm~mqoFTHS_qHb|zvM^&6&P4QR!wk^AIM6Y`G){ z@KA4HnVRt+o3UJpSyKZ=a<|YktLD$_(Vs%uwRkwqXT4m2=KH3OcYZ1Py&z;BZ<$wFAA*ZHoR|-q@f%DC(6q0MGRd(l*D?yB*rM z4OP0awox6p5$Qq`nMxhW2aGDSkg1riY}0wHSbpV5dgg2VYrMPG=Oh0F{e#phPwA|N z$S0k|&I4cR(MFKKc0o&FQ7RjE(X(*mQuD&}7rMGvIu!0qUyrIZq|Nl$9ZLNcYp}lG zhFh686>D&ZH~5ttLXS1j?Xuo?c{VvAMFYs-yPabH$Sk*!W+1iB zqC=801B95?i6l`ORLF~sQhvTOXEl5k!liJbIY<7(U?tCLE%D0ec8>NOR2qn1X2n0> z(Tr1_5i%K%d&~NNHIP9gj@dpsjAKt-ej1a3)u(4!B;_I9Da{T}$Q3Zm*FiLLHc55( zm(0)^1nOefQ!^y~Rr<48r=AgV^`n9@clX1=J=_Y7>T7e!10?`Lh7<6{8 zlSN=O{+JP?2mowN2Id&4z@-W{?Dvh2cK|67tjB)&`*1Xl$!r4a`u(l%OWeqDO{PUB zW+VI+AA-3%tLLq-Q|A@J-LbP+r{M3nw#(Q}9c-3Eqz`6~@*?vN(ZZG2P#&ssmRX&x zqCh#sfxi;Xy(hw5=v1z5;4xe?UY>A-6}evd3VN%!#dqYE53&TJcfLUHX^ zmdAm1)A}(Z)v(=v-*a<=vXtn+GQbBZix7}lXrOgAQ`-l+3)BH_C$$l#U4Hio4E6xE zmkLBcCq9!*#W!Z9p(dk5%yGp$*=d&H-!tq^*C-}_d$(X1fPdk~uzb%0>-IQx&UYw& zBCR>8w7H~%TW5Yv*GcO}Y`My@STjZraH`0|B(v2pr!m>yspc1iU7$vKf+_DVgC&ERi!y8%rAF+d?Bo~>4!Xscmk z-RH4_BU1jtvV*`Fs!1@Da_=#!0l4)5mDNeE6JL8t7F*GpB}4*8mi+ykK$31L!}S&; zoGv>%1F+x zH}bCV4xF7Ibk^&u!aEj4LI?r{WhB|`#U(U7Gg-v{1}opPT%LdAdZ1$AR#3jmJev|X5(r3)9yozxkqX4F~$gTZ$a9e%^0joneD zH(|u0&(}n^Mv~n+CdGFq`d>fB%{(D=qo+SzlE+Mfp>9vbffvxG3N=q9^>ODJJ37Fx zWJ|T+e~+=Z@P~r8d{ksI2>ENmCo0;`UNz6ntAcwkQj49$62J0vto%S35G8>RQDA)S zKXt}9*32xB!c!#;44IYwBIFjKY=R!MZk7Gb(3zR4z9E?x)O6kFp81;uyjH3=3>2it zHUFn9njuLmFm>A6=N+78RNhbazw~=Bz&@Bu%Eck|WO1A4_UnevhQGJI?}eu>sL6JC z;lry2I-GEWI}W|rD|Or>{^y_Zo5FYNOi}S*s2(5N1af4FkQ2Rq_@VWL}M{f zXCuACk)g!3`^*N|2%l7tXfeY^whQ*N0;AHPs8vU=({tSDbcpzS3#n$1eQ*=+?Fn8s z6UY_I$XN<4Q?X7$$4ruCDmEKIldD@V;w6Y=?#jn}%(@GFpdup8> zY(Xp0F5<^L&^0|z>i=?H`Pywx$ z-i7j`wr&THT(FOP1AImQW-{^4%_Hfs_*cI(nn0^b85ByK~*VD%$kM#%&thKR&bX^#sW@ z&<=KSB{5f*iHJHzd5yl6%7*L?esVOr?`4!*y;WUVNx^ry9=cFJ;SF41lbm%{ZFUpo z{+liXDd1QNuxGzZ(U{gY`@NeYE1%bXdT}=j)N@B+jC4#O5vyhcX-$%`b#&|MrWCrS zzB1B2{4XKHgLRU!iKaF{(tBnfq0V&kDtxDggyjrI2`y26Vtj}E-Ve9CFa7}`m^p46 z+c0k3@SY+^s}C_Fvs&6Q5HCeyFv z8j=&!K@L9E=Z1uI6;Mb4ec|rtQT-lz2k0BYSJp|3!qK5oB z&MzQH?0}<3M#+)8qM)Ii4DP~k&1x7~+ABMf%ilGBR2~osJy-@R@ltNX8Hbel-9{Ty zuatKCPFb)*3^|t+x57(nC6}uT45<;8`LYaW`fdDR1FPa(eHnn-)Hioxr^BP*KTOQ-kn7qIa@32L${-f3H}UdX2*6+g#f{ z>WLiLB(^{{l4NKL7l1R*PTVJ8{y9g zU!ducNbzn^CIo^C2jSI7;_)wB2hj!!>gFE^&`qU^fgr=y@eIO&14iD(HXFgtm{FEn zK6f-EF1cJslK;6iXulKW6t%+VT2wj={yTppVoxhY8Z`n;ynqDN*;o01*i#nvQGaq0 zOXNNB&I^E3^m<@U+$e=SbDdHZXuFw~QM+S{(c;4b;a^)65h2&CAsMYPX1B5^nA zd9;9UBnqt{mCB$ve8ZuCja!cO10&xSX-Vz&f8%IxRt?Cf@VXmJ2Jg}-Avs$J^E%ZY zDQpJ-ZncQMVK8&&y3_ZA@2Ic1p~_o|j4Ao~WG0Ev8q76ba!uG3OTG2=3ET$R{RnI! zpVYY%(5}#Qb19~#iL+I6;NQ23fecg|AV@T-yPm?uKOw}$WcYu_{Dw^N$xjHwR)?S- zoe@u;Ug6*7TVJCb)_Hwcr((Ia`>yX>73i0$FrIVNYT@^$pU{8?!Tcb3Fu%XQy9YBP z^aS?qfCW$|e!^+vLEvt~;yAmfPjFMJ;lV#}KH=s=G#fEpRh;GGKF5S5Z*J@*KI{LjR(`A*)P@69fPR9t`V#e>YR#chiV zU`?JpFz&n&lfY z9v66LM1aU~EQSl1nGW^&)ocOeRT5UHT*;L0OMay$d#tJXZb%t$u~(r_~j%{t47!bUDPucpo;u0dvx!URE94!0YT)Rx;8zq)W2y{BL}K3 zeEE^ms{4tSUAbl+I%YrguXvlge#AqIWK3AlY4Y%M1?o+2b$bwpIbSIKIpqjJenaP; zu|DiY{_}SD+7WkXUlGXrp+Y-dap#=RH>$9cCO{{H%BCc_R&Ti{^QUw5m43b6r+@V& z7#Y(fHkO;0&_X^++ve4-fAqFpps=Yg=6%NsT$@20$Qz)_42loYP`y=xaI9(;MYz+^ z6~e-KkZksZ6ecsDb7+ePg)DPq2#)CmhHz2(Pou5wwQ`^Oo|m0#F;yt?Co}d1kR#1NVp?{M85WdQBdig)=RC{!amjNTdkK4!2bq20T+$f0%zsN zBePz&k=b$OPr|&!5f?7#JS?6)Ycf{h0Ef4TgR-&1o9VH?b-?$ww9ggBfaPy@z;?CH z+C=ldcg=T9Yixjvq5!tVE$+xWEBo%Bg3Xm>+^PQR z35E%I={sDm`ogk0-Qg=h2u-%Ajw^q2?B`vWj-a%@l6?1vx<0Bfk5)J-O1Jto)jFnO z;KBYP^y3g*t3C(ckzV1DM<`~E(W)Rw{U+j8f4uza+it*C%VngpMV_r7&mtDM8cmjb z&1-IvePbfLM5W#al&zcK0@~^RL8GFQDO~zD&x4d1;ug6>YC&u1wMcEGrZ~*sZx+~O zm<2A-+IK5~#in+>3?N}RP3ftek}F>ROnM%sdoJfv*lng`Y%DOYSvd8756AEcW9H4R znRDfZuDuVA?YOI}D@;tK5H7b~d~Wz;nGV|TepiwCl^D?6ex@8k!3m?)H(Ma>sbIm~ zcVVI79;Jv!63w@3OkQTas6`z+kl`@{=zPx`tP|AU4@`Kg(EBRF&U^h!n_= zRJ>ssar^OUWc^VraoU1wXte%g;)r4(27YWcod)Wb zuP|V(+>U9S&((B@X#%!@iylKpa|2jkfVa_IfKi}X;i_~JI}0OSrFvRo8rhT&t^QTp z42>!7~!OTumAQ#I<3tW=VO3O7Dx49W-Z6WwdO`RPfS!>X(g=T1x zw6Y7Z0QDaA66~G1rpd33SgEDP?#D-9o&GXJ`vdcv&un4|{Qdl&t*y2yGQvTF9!70| z-J~z(*U+RCsVb>IzyB#zZN~%MO_*VS5(|&VhedH`UEUlfDTA>6tp3VDKhaxU{QOgJ zemwp%>M<}>s`j>!e>A?iK|KT4nr(Ien zWjIrDkSYvVA36Bzmyd~2q97>YjAC{S#+3bRRx)9~ppYg0NLOEZ>fN)P2Djujwt4c| z2jGb#7E_Fv_wf8tR!`?xo^OxxHfZR+g_mLYFGSqjJJ>^`$55u;WPb=+@|0o$SkRc)n7qwqlqjCqX!4*o%XY5m7a?wz_8S|~M9 z)Q3;m%f!>wA2D%4V&M&uzjZ_nB(u6@6X}f9#oF^UX}0>4LM2zz&RP1Ctp0&GUji*v zuY6(zgu-N@CFYUO)=I6#cug1(0Y2XFU+eSYT?y-31cVDkN%#5??@`~AHmFl@_ojj~ zspGCA%h-8~LR)-8OlIl3ci_%iEHEbk_>2j7{hRI?f0kYe#qiacliVn8XW3@mNu?EJ zhZ+I_-4)WZ5b`EwWm{HaQ3c9fQ0WINDGrlJU*DJTt1pU5`@?~IL9MRF*%P)saI+`p zQvHCO8M6+0^Muc0i=fvFi{mq8PnqnEHCbnF3BC3}EVl!nfF&*tyA`TNyZPpY=G-3A zZ=o>`%`1Bll>oD^?iyXplc;mC8c1>rb($i;Hbxd zscI2th{pl}!iWBq!VKJKyDVB&A*BzhXrcAaeLtPKnKyesXb5sTArNTk^TyAk097Jy z{YIyX1nkl5s&aykPbigr zXEYY{*Z#`M!S@&t^eN@f&cC$sQG1b)6o`GoLkL127%<1xQpYf>gFig+w76lXMs7Bo z1i%ebiwR3!JwGz;X2gQ92B?qp7we;6rX#2ooZ=EEY9o+Wz3bi}uHLT0a3jXodd-@r z$oFpl=0HAR@@YIJ^&M1@i5k3=CVxb@n}`#NUV8QCsB@^CA{&U0B}!!HHE_Z|v~@dxMlg zt=;BHt#fINo@2{E3s#F)2&#Y7XcG3ZVCS_0msZ46LI=hgC*FD-!rq#`pfe;&EIJ_< zT|$qB>g!+n&-DH8O*;2?w#C-W5I|w#9704210pkVciMhs;3F~u)BEbVDL>90=0?Z~;HbDa1q`Eg4R?$xVI69Vd4{ zXrwUO|3}rk$20xE;p3&G@{SHl&P76E2{~^$7dfSp(^e#>B66JBD#@A3sf6Ve5-W$C zhva;i^PDowY|NatVVli&z2Bej@AvpV_TTHV7keF^_w&B5>$-7%C_GapBZY+u^-HGGaNTb7j7c@{8upboPhM4@%ZQm;G|>6d`pQ0Tj3twsK%kCOXaR%R$+<3SF4dL>}3Z{RDE!h^Gt>ccHW_$l@ zj$7co{(SfJMNAl^OK#3l>BNe z-)=&p*z^vzCu*moaIK!z5p~vTas9wblWfA4@chExYG@SwQv_ zq$mM4w4 z5}pMoo?>Ggai5Ubwb-5PqWu4wdHPrh=k>;(GzFaVcS$Fy7W##kndpj*sY1EEL53mZ zizbN1JqNeU_q%f8+iCM{yP6%FCNN)zQ)`LNsX>RDRKiMPwsSP=ULzg`n^ZG^yh-nC$YCTwzzdYlxwp~`#O=WzKF`p zQBRD@ylR1bjBz>exGAI+ig!FK@KNuR-Y1Y;@HNE!ajCk-n_mvIDvt07Zsx>qt$9l| zkp&xQQQ&KPBGNpKFIe$jJWa#kPrLiXn@3#OV}0SeHdp*Ve@SuQx>k6g z4n8vE{1z-;D%NVc$wd1#?uSH&S!klp`NIvf)wiC*I2vKt{SS=aRk9A(o10kwj?O;1 z7`@TE)N8LoRE<~?l8t^Py}080EAz^Oe(2(}i~oH7aB4Zm>~Zi*=iL(M;wNr-J|Cv) z3nq;ffGw;FQD42G&@W$JnCA#l#R)CgtC7xuvq||v|LX;CWV+cjXTWx#c41}I$PzLeQ6ytkj)Q@7bh|~&?tKW}=lw|Har+X$cbuPO z$US&hCX&;0havX)QsAHAUhA-yX7hR9@}Cu&QkB|-mD-zv~# zT}9~g8#5iwiGCvG9ZTe-Hi1X0OHS$42j(SaJUV{m@Y#d^@EqD7@j}1(+}ndZ661q$ zV-XUQw)ucbz?n*j(?4xgrnuMI0Xc@QtjC_cuiTN$-R0<^BsJ_5m=#?7({#H+8?C(- zb(fnio$y^zef1@#sS5cbJc8!gue%inks~uKuH;vNW>4E(wqSHqa*zM`GKrQD8StL= z`JFd3pAe*PE78;ubYW6PJ$+cP!IHn*uB^I$=VXn5X=CEvsM(3eN&kZ?ls?I_IelJZ#zNs|)1eL;N-;YB9+{ajwv*6k z@f0%p1E3!y{Z+y%L&K`KKz_gH(#v9va6S1gsB3p2qOo{1w7I>Tls<@Z7)7YAZhqLi z2e>`iq%tacuzTPBZ+ON50fJYs=p;5q(z!nM>0b9~jbYS6naq$@^*@UxORu<3>A}Ab zZRq-E!|+BY_t9j$-4HqIGP1fyxa7$9%Uh{6qn9V$7#m@%n>{LC;g{Dgw`a-D*vAWR zKKQQcjl|_+F1zKqkL^lFnTiIVsZpJ_ulz)>QEkRR{Zh_AcwJZega% z_=xqvOds~m?WXaKLT5>?p+%xA#E<j+1asZ{MHhoyiOLEHHAgtj3@N5# z`a1m5U9t?fWwIeA8098Ej;<$2RKW$%o@HgOgIJ!bD!c*yWB(wi)#woq$~GB!4aj6` zIC~V`?0gB(8RNiKHQxQo(ke4y&JBX;k@#=|kdhWT-aaE__ z787+QIVB#4HKxj0&@?Jh%lEp?2q)WcmSk{N;gOBUAW7d*J=8-A((8H z0wXi7;0iaXE^to&Rzj#SA}$K}>dXfWoeCFR=0jPBhDV|Y{o<<9QeYi(ZyN8G^T7PPq?+6T=&BS2tOl=SNh9flkwwyDETCgLKO!(sjq#rFe^x^yet=JI( z9`Ql`t~K}!2x*>TyUEEt20e>_jd4tty3@t7&xW41sVg3)@5>ubiqK%3;b}H3)aK$| z2Gs`y`l0aq3^NR|MNS1id*6E}^)@Fh&EYVa@=9YzI7-l0=s8cec9oX~LtA+^Z?^R~ z9%enBBTrz6rwn^4rELEa)HD)7$QW;X<&wZ(|0LO>$2K(Zs2N5FCOaNhVuwx(=-YX) z7U;G9>v^8xbs^E9yM(+_ zL)e%;fRA>RBwSa_X@IqS(*8Ps?<>c!XCT{h_;(Up{Vgr1r7#r$aWEmseu)pA#8XR< z9i_`6ZxX428IREEj&ASiCHP;O-8r0Zi`xbSCa-Ql#u=a!>T07zIDl(YSfhe|KPbJ3 zz3ji0VQ2~YDw&7V_L&`p{Ve1Lti=-g#VpK_Wd)pOSLhFWT?-e7P2!2QeMcxuYJFQ1 z+0sjtS5`7eidhD|1e#*9XTdH*-#dwJALJjpI`Y2@_u|=~NQyjd*DrkCgSKfd+1(An zr0-Kulw2_H=GTITjcv!BJkQuCMWC+k%RE(+M=PWmZr=TXq`I9Jy;6U<7V_--#-XzF z3<2FO#;kY7=G4sVsN`ljgW`L|+>H_&^_$YgY~Az&)2+w(y?67Q`i1i^YaQG~?@VZF zGn((_-F*ufHJM=aGQNw9yat`khm-z+-9R5m3WqC=+j+w$q0%vK5Wj|#6hN6^qON+F zl)4mAOKpMaq8EJ_4Xirf7SMEV5pHt}ZXb_67zu-U-YOvRr4#Y9{5j2sHkDFLYj4{$ zappr*gk1M!S849a9(p8~#XwEkNUEUJ2A zKgyO5=!6MamXRvVzS92zlIF6Yu4;w@DKS(L8DdTBvi%yNEN`7qV38 zwVw0RxNh$ie4MC*Hw{fN*vMqnoAnpA+}`#>E=~%Qfqhw^qieIR1Z!{(_nhnVUuSt{ zW^GUHkXWAte0y+nPaB_wC`ollc;Sdzx)i(%$av^zcNF{j-b2I!+ajLrITEpX(x6u( zYjWpTe8jbD!;{%7AM;^}V1Wj!P~z@chPl$1VpG;x!t?elgS}g9N$7(G*Yo?rhl^V} zW?K)Fp!;V?QGQ~jKWed8IT<6X5h$QkJQ6M)-$8yg`IVjZu?yFBY$&M2VpKS1t-7EMEl zog%JsA^wRGNgu5GYNlfIO$Cy?Z2Pyfup{rT<@04Gg-3~holSl&P85EJ`~ufu>F;No zSA}<~UPp8P?tLUdIE9j!Uy2*x%eu59tcuuOMQYXwn=<@Y6w16mzdf+wS-Ex#5pP>4 zTkf0Ka6Y(mYUx2a9z|ym)H!PO9;?0c;AG@CxK0SqgL0YF3lKbsw?)M3e@U?V%j;|? zTNgD9$F3E1FjoI~@5y;F3@}rEd40c`im0@jmBrhYZ~M!pU6_+WUAZto`ZKw z*%DTba@a~`nRR)YJ8yfw{*o1@$R^IXVVZ$`A5=}9*aLbmiNE`MZzRPH^Y0N2{g(Uu zpmE2X;QMROTSirU=l5%OE@mgQ>=fpve&j@GK5a6jMmo%%m>I}6{A8m_>_1UK@@=1< zn4dxxMz0}QvW8)zK;Qdeig!UZIK6r$=|o&Oga~hRT5Qt;=qjOEfw3#XzTZpOE;{*} zsqu)Dcn{pq(zCDuo0rhekLlB4^&d?-BTPAHszS%>jsjg zL;Z{Z$^Tz9@n4==ZhAdwJ(Wfs(vYikJVxi6f7}rC;$(tcCOrh z3f$|xhpCv_>+_nnuj--pU~uxCoQrO2q0{ySYN)AQ__3s0N$b4R<#llT&Bvx2@mt4K zVMwEdM|YPuDiYIOfJ^x9p|VFR;PBly7?ZVzXBvs%C%m_={#W3<%+SA{KuZ17{b@Gw zyL4;1?SR$#B|Z4|ewTEMYk-fta5gn~gQkOu6UK!(J{x}&I(!50)wE!Tho>LF4K5do zMfG{#+2#&4k!+c!7|QdoS#t~e zR*Rgz%EK3OI~lngD%v`5FolaSMs0}e{K3HyT?{MEfhqj{_QFGrXITnqrh0AGO=R9g)}UJ${R}os zTkVLAtV4&EE9x|NQunJx-#Mz{k@~Mwwpjo^mV+sPqo=l6ZoRuL=J&=UZLpx>r|x0* z@xExGom}x91NnuOS?``kYe_{E zIx_CwTdi5i%@eh(#Fh*N{kj=TQ@MYHPtYloQ!MMQ@#G6k0v7Uox>qa@@;F;m=fTR0 z9|zh6Mq(vAJUos|jEjKUpCg(Wb5)20_Lf=^Y%r54VZ@dcJoo;t3S$@k0>{yu0j>8~ z&1=qB4Jd4p-S$?t504PV-y+i+b{bqZhu^9O-TEes}4ndfAI15zpFpTdoYxmNHx?gx!HtTPDPZR`2saV88p8gO02e>Z5*06;L%- zjeCq|-iEyw(kxNq4%*^>ER++s^7OdHY~4SMl<6X=$KxAWWjq;a(lJ6#*|&1$pV zw~1(XDeR2AJ4rvGOXn`T90@wO6q-RHGarXMhj4c_5mVF)Z2Q>R?@{-|n^#@tYdU@x z;w6u14nGq4uR_0GaIX18<6F|k>uG`RSHw>#7bZdQr2Q_$1dWd4W+n`BnJ;WJ=j(*$v_MjSA>Np=Lon3gol75KmWXe}a)CFw!$<=vBW^E&n!$?_94>0IZYY3A9Q!)3 z89D!O(skk69ZP1j-c_~=HHSvEeL9$Z_RYW8#mke@=O7`w8L#%&ifW^1{ zM2^C>O!w(uI@44`@IK)yOqr*vE6;4g{yz65k2Gpe!g|EUnb%TBPbD}=UQL1mGj7c9 zep?JqV>#Q;C;YU3bF&j*89sEAx7*gGdvozHM0H}W$Fe{a^v$ezvPT5zVrBjZ*rSsO zzc2yv(dc5H9hRrNxnXj*0E(d>IL5=sN`k9+z~x@9)Lc%Aca^!;3ZqKFm^ z=2v)cE+*?@P%Hyo8sd8Vq)#L2L-2UP@TNPF0Afn4OJw5KuaHb4%+It%qg(h@O+!QL zLl@J@{SbLdJ(W1d=;s6XUB!`5Ufsg8f_DgH|WK{?OZ&4hR^g z$z@&d7i#sb9aBZk3(WT@ku-OV)iixsySU}l*JD`B6=5;PBBgdb7%PEVaLhxx!48iMG-4oa*yA@ zf%Ti#q&zQQzi%UIU-N`bXfKkeaShix62h-+wT$z*@_oe#1bCc_LTxRqw_#eA7{SMn#iq;}9s037^#kPWWp>hB z$#`PhYS`!Y^^;Jmh_tDr7FBwaIR0da*8|(OsyEeDNHePSYRTg5V1&%JCTML-yXh?+ zP8Fl~z>*lpB-WGdelWZmi&V^r! zSUWxltFDBqkDdEYu7q$Pr9$t@l}v>y%Bb0}X4bP0!uN&GbmxiN&XP^tH8f)FpKJaS zh8!mW4&9}^!3AEn4ELMj>wl@%9y0$EHNQf#%b>J^g;$&P-AKFRIlZeGML?eDL4HR6fGheNVJ&$ zg8|+Q*lo}fqM|PkF`kCx#T=TAbgvbMc#8PbVvloQMgFLCg68FbyGl1X!F^g#&*R+* zQCG2e|BqIFtie=i=pWUF$`g%h8?km58|2F1J3ywv)~oVrJN=zYEV!(csjLyrY+n2K z*0mVutA!7D*>s^na?88)rD2&QQzMibbE%qhNgce)TddZeKBlQzXE)psDvR9qOz0SK zoFPA!LEi3)dUvhs-)iYm)C<^gt3I)M$fbJU$>Mx^aBXi~?e2bojKb$#`~TTduSA{F zQ+S{LUq18~kSo$WNOE~Y{+RPv0<26fz04eZmm4;U)ezE<8rPRCNf}}tvRV0MP#2Nl z4;J+&d?NmfnmMcmzpmLbS2Lz|FWTIzaW5fGlv zF>TE$qNV`!rArE(UFKSSny}&rA8`Lgkypoy9IFA172d|bItwb-Kc9ZFCoDbpw=@EjDex<3JitWv_8dBKo~m>gKmQ#bg0-H z6B={92h*k{q{l~fP}Mvw;pk#&f}*(XwB}`c6Wc9lY8y>$e`!>9wVsNmIsVUd?RTr#30o$8V>L z#QF<&t^lqpVDQY@{=9BXHQFe8<2~>_pU6t&0e-zM>m)$MeP2Jer=e;x64EN}ww~vU zK1@N3@4W9N-pF|(^%CNY7|_OL$( zB(CYq<8nWO<&A2c%nA#1K?W4>6IkJY%1=@hb)f3kFy<0_l>|pgI^Oo%_lVgX+$^_b zmMnq;6C>{3M!O-Vt*}=yJ68xBMtvQj@>YSGWY5|CM|WGuBMa#ryMqLtnNGP_*m@hd z_dt5}`twkJyZ>Qvf7;1{Xu&~G!a^(hf%qA#$EIa=&a6{h4!{~13pf;3WT)=eIQ68O>6T#`6()X%QLlc9-f{#i67~w zX@byCR!6QVn0~Vh@Y*~E%s+722WPQI4?TwFS=0z8LExb?TpRBCGFsEvW~kI1w7o9` zN8=)U5mu>7d^&4Xpr)<<_6F^G%a=!d`RMxXCeLZEgO4t9lX{rNC?vj0dy;-@1S7q< zA$}nmdT$N;q!$m~R`M)EIcGYxGRcX>tP%NLdH)H(2Ho z!n&}}Ywm=f>~Pj`X*DM+^d#1*jWQ@Jt#!=EaPxtHDbspo-m(zOtP21n!d!2j_~+?2 z;@o>;&j&Vax*wAo(FFTOm0mpH+c_~u*{sQSai*;QL~Ava;<$jF6hYjKo;uI8py;En zCy$^e5}vnxYd0aHe^<$Uu&Q%zf$~!AtHoydd$)gSxc^D!V;`3DNUkA%9t*I+CCu1MR!XW zax1k><8JsqKY3eba}OqF3K`nFbbwi6oB3Ia50c1$QEj?8bS3FrJFR))FWjj$*D-m6 z4oRfb$7HuJKe<(F+6w?3tn)KMJ#XJ}OQ-Ev*&q+GTDO2dN7HVd||6Z6#xtK4g4&iWm(RG=4^#OyZ`69*O6c@H|K(_}I?I z*(;J+7gf+|%kFXwwF|V!{B5y@uIl6aB(>FdF2o2rTK`vVUJp9l$@h7r!7Cx4UQn{} zAQyA?J^vZcgn=2_K$*IsbDE6Hq+-Ec*)ez}EG`cA${2l(uyMpnX*Fm+*Qjpg{YUC!%P3 zsvr#nV$J4P^Gn`%f%Q~jtk^~8WBJjOoA#KHar=0T;=FnBIzhh#ue`LA%DNF>eMfDI zL9o0sTWUM|_x5@K)1NyA(s53qahiXpUG{s4Ia>94e$3` zcYxyxxY^ui`4f$A979Y=Qpi_ZD#}sSJvt3~g5uzw4!zb~~YiOlk#cCffWApWXD^v`Nap25;6&N;`)`?fGYR@2ISbi@skA zz>OVPPc`f58jMqc;fIg7^y*a)9em8b5LrnqG~8dw#YWo}$oPuT!aW~&zcB6D*{$|3 z1hGM~b}UK#X6z(rISdcHxlAaVKBO!2cR+nSvcZ?Q6Ei9IN=8dgqWpS;&TDhtu zjYsIfe$?=Lf^DnT*63o^R^B3BH$|>Hc7A+~3lQdX&OOlGXF8`xwds$@Ju3EPb5w9y z{@5_hsJ)`b_=P;pdQCQyU2x^h0Ub8g;Guu= z{TKxE=-3p&h4-dUcd3badfYdDpKgHHx&lA!%3e+f7iH|2d&%Nj{HEx{yEnGT7w%c~@GFj5*mSo7)3KsXPMYrFU(x%q(b zy5@fFk}Hd7Zk^=NR%}4?@9}3+~-ScC7FsWn?`NX z{UwI3Cqn!ocWXgbuIxB^zHpn+&1C4$9#-Uy4=8P=D>yQ@p^hrzKJ^g`+TytNhmJ_G z88#`qkr%8KhZ4*;c6mBl(qnnL)r!(#gqqGPc*e2yz8q4#a`5^IszhkAc~ zIq&8CE|=xsfLpHtzlQ%KpRM~3kJuOi!jL7GJVv6yc=^dOTi?b@SexBxak64okO%2p zUGS>(8AyKN_>x9*i)EvnGsV(zm{*690U3p*<;(mWG}l_L1#! zB?oF8FBH_gY^@5~U4HJ@uY?_I03PZ|Rd2s=`ejifxM9EMQoZj;u2$1jwYOYd(6SLC z%UG_wv@PEe2{npGutCNXsSotlo0L<+v<|iPtSbGyA?UY^j{5y3{Kslsr}u;VEnMs~ z7Q)%pTd8c={c)iORk(ZqT2Pl@lmFYW>1Z$*`j)PFU#I5>#C~q*24usR%jDQsLBc7U z(f@5nrH30IUUHZfM|1@1D1PYA!a{q*YIC)>qWeohr{a&T

&v{@EO#CZgMZ#eW@mVJDb zSYNL580zvGtNhoLXmAi#W+~r#S?g)FyOzhJLf@)l;>2tp^zpj#hOS(1iC&*irsCuG zt?6~y^w{4;i-ljKOfcr!n2Jip;^h+-PPT{`itI!1Rh<+1X!SMH>CrCp#!g->*hdoh z((T3Se_1nm(7{Pm#YyLwrQ5gSmYUuj7>4i*Uo;>*<{OP;HWyl0O}p+hrcFuP9Mw?J3A6i`D zS*!3@F0LkUrxb-73jduNafr_a7|2xf8z<%5nT}OEZS-TFFPodn`83WPn#ZxEB%=qT zAaLb3fBX{~@GZj8-%s)(54P!c2pcwIud>C${Z|0YgZARf{fH9rkm>SV^c6|sX|wvE z75P;OKfljDev7-j{J+7imI-Q>@XjjcreZXQeNR}d^ye3nvE>cF+ltO5oWPC4DuK*^ zlE!OKyZV3D?X=Ib*IPF-KJQ$}=7OE$V}+YrfBYS}<^!C;%=6W9IOyH!^&LY?trQd? zbj=AvGQayoFc4VQSc*c$ofs^c@D!x9=hU&4xqz#h!kAt2DVUH$k@JFo^QoXlYqTc^ zHaJv%9sS#LF;2(oMPbfZct%T0n|>2Wk$Zwy{($f_j;pfC%qioD=r~UWiIPP~`u~EJ zfxdFzIR*8+_r%=w#1l;Q-Z+Gah+h(pQkKw;?U&FQ)RpgtUmNZ?e_znS!QnU0B&%qF zZJvioE#czGH-gjzj|m*&%j0`2d6o-IUKi47K7kfp?wU}X*S^vX49pOg)&&UW+O#{9 zcID}8mF((eA@(eOeA`Z8VMz|05KQ zcb=WLyNevbdnQ8Kv{pH{&J!J}9Z*QenwIlGn67@1yqQ+7cN6r{-cIWba7zTkAKPcD z2Ub%IEzDVjYnF5jivt>8n4YM+k*%+GH_T+~P8jBD-^SM(laGSS4Dku?v1zSbEX>Qy>8Celo3R`^t&t02k&;&e{23!d~14S zG6VZ>MVun`ml8gLDZcbENpz4rRw#8^uyM0t+BaTjMz*ty9Q!hY*R=MCIabfVDP);~ zUGN-z0Z?knywklw!$*S;U;-w$m@SFmD2Qfn*Cn^Tn!#^V+~YZkV4*>8O=H@nD9+;q zyW14UAD$QT@3O48G4UBKmfxuU=hL>bh0pbSKXuw;Y4nwP-&pSs9N?3=S$6r=8SCON zMxQ*}W-HdxrrzaYeR868Z({4jB*Uz;?QVrR=@+CHZr|f~u-Z3LgfHcqrGj)f{e`Fn ztc0Cvj|?jS&!mDEn*fE24IK`=caIse%fuNCHi|CsS}H;$R4%v{{kO6uc(_w$)e9YD zK&(jcM_5Gqpm6V-ZbwWSdDqSHcd-+TFXj`6+XwBoSNAr;&fTA8CZj&J9R|a>(=a4t zI!Ax)-%OJEa^k_*sdmY;VGmaHuWfxk5KeoW2fKSWmsRlt+@iO zVe7$&_*2C{g3dD)^1p=lQV$BcP0M;(MXC>z-LEm*Pk`Q;B~*K2rhV%s?L^rqds6^N z4wc?td*fD?rpUE(DTlORBJL>bo!%q=K?DnjD_PPfV3I`4u&+!nTh1;SkyHD3v)HEy6>V4}`kOzMKJG zE_(4`dVP+6+K-F1m7Vl#DoD?Z2G4O{i3G{T*@LhKdD?N!2-G7{jokDyz7N})0>C2< zWi>7{d5FLN&uF9V((Do7(NwYU{LY7v&%Z)%-X4qckaPIJtbJPyRoB#gF?AooQKz9^b=iQFZb*Z8)=p^-vI-t|KP~* z-*u&bX%nR^xFPCTX)l>?<;cQccyjc{L#z1kt3kZf-vf_Uve2OW+=E$S+Of)6n(ytd zviZNdxBNOYXtsUgiB!f)Cq$pvnt0Z0C3-NKMlAg3{y6(%=;OtYe_4}efzHE_W5;N- z$TQKq(@2FaM9g-)wLZpf;klyG(ftrjMl;GL=9?6t2ev8g9y zprNVTLu>sK+R;Hzr;L{|G_4AmtPV90$3C#Fn2+ z(<4ok){j4;SMid0XytrKskG$NFX{dQk^9{LEZ`tk44Vdx(A=H5YKROzhGU#VQJCyA zDfxE(np2>~p!bOqt3NjnB?!s7O@0%ZPx`3(I|>532;K{L^}*t~aT^Nl95(n;vix9` zYJKs|$|3$8uiDSl#(u|gcfgN9FYnm9%-yUju8kx!=#cR`_QPI2=LdKf_`EJ;n;PTt zD;*hkPXGaaaJ#ADbTx9B;j93iYou*NeSc(3(=L#Qg=EJAw}gH?F>*(B;6jY2X}=90 zI`j8Ia)~a*-H|E_-cPMFtf;7WSvoFXwkVU4CI*fJL(+@aG>psafe&&kYCBlJqe+1> z#K^<_|+I{-yhloWD-K4bpK-l=Cg@X-O2V6|GJCB)Q4{F=(EbPWY1k1r+%wJ#sGX z@dcE;V&0j_>Ulx@x)j1l`diaQkc8fq8d0adK%CQdg2a`e=JEZmd<`r6Ot+VKO#g{5n}Z&V}G=;c6DQCfuG3E z3VtXBQaMekT+`K+p~bAJ#J)Fd^2y!1Id4@VYqYQ zRlXX$*5LE8p(cqcHrL(M& zrQzQX^P(o1vwsjHm`$CvPP}oL|LPI*U|m*C&0c}~jlPj+eQTZVIL8vDrrdF8*0JA@ zy-Vfl0#?r6duqusVBQ&JEo5#_*ZbZyl}{wKFe&s%+0~9x_XMHFu*(^?rayX53(m-9 z7jBjMEhY)#iBZSJlAmL@*cvCjOUJFUrK%~oFMBufnHRt;Qn<=SJ&K@tVj_0xA^Q=l z<;1r;*_8dOoev-%hyYospLib^Zbg{ScY&Vs=OM8e3*uaN+UwNxKkAu6@q3N7-PXDA zedX<^GHLf?L0+GS^Vu;bQ&padK{Jn@|G>Zb6ze7ok^X*6Jvr+>STF;n@=%RN{vS>H%Cp~xS1Hu3Y$9T8Oa+C= z-%|EY{FB*3D^UPN+oEcXv=$0IG~2pC&!!~WUQSWsBeH3n^z75YdfPQCa+cPtj-!;# zF_BsBZoV!NY^nlb{&qwiT_Uv!<}T2`jJ8ECHbeMh(nso6YjhJGQwTMew7Lbxmytv5 zmEKch)fRdY#H|bE3WDfO9xXF?`4r#iVSnh% zlTwaLNg&glZ=|8yKwwutu^52fgD}HPcav69bS}?+v#msNwViM@FW=v>#p&fF4N0dW^f6CM-wM1 z@##tU)Ei2AuNq(e2`J89>%eOkK@o4rIXT}Q-xyeVeRM(aQFFQJi&L!Ifj-x|q-RMH zs7%;5?<)e|d>1J1T=rTwZ3Md=p;6>WOBE0uKZ_>>=On!k$PsLug-@oMuA=o7sE#CX zLnM&%YrALn#0Q7$s1JxY2B>4|)RzG-db3(uW*^X+dk?ts%}?wP)?0Q~HUlC?N)MDu zEa}UKizH^dYO-FY0bLrS*+k_ETx2!(e8H?k*0)RU7W^RtyjhiPtH^ZwbHlbGf1sbO)*c04 zR&zir`g&ObF`b3kt$hC&-$t-r%`M}3q@Kc*!SZ}wsliCQVrHABoNdz#T&N*XYafEG zx$_;C*^z?7{+Pit;)=TQnsev2^PG15Bzg6(sy0E%N)TB2DTuvm9aVJ*P09 z`wvZ>GrU;&zI9weKuNP4`Pd`WY`sP#GuknnblQO z`aNKzjTnnW>{(=gNh1b*Opo*b=)DnV^CFxPpA^f5Pc#bDKl_kZ z?G-+KaA&mZy!XhUTnuw7&|@+^G2E*mWM@>^4cJXik(fCo74qmZpCs;(LPS=W4|MnZ z#!;=dhr2NJqHDw~+&ZmhqV7A5=-f|W$Pq5e zEJm6!oI)e|QaE?SKi~rT0zLXy05aVt#1z>ou5~pev}2dbg4hq|JNRB~SWq@Y^S zHovZ^gX^^BZOfeEP!7zGrJ58ghl48#%5kUG1!Ne(tN%iFlbj#*t1>}T0g6I``Et&o zIXfJzf|mb&0r?$`Vy)TBjasm%KgMghgv}2ju?xSnMN`J#tuKTN9Mv{nlz_Hai>NEm zj0mqwtbpdb;avr(G7OMa%`VS|jPa1-1xo$s*8F#gAbzE8X0a*F;C!cHArv?@+*({p zmp8lj!*ggGH_#Az3&v>;4h=fMzAiQ!_;s;jIM5|r=94R(;yCeon)C&tPpNqGLjtb( zDi4cZAjxJ$tn4SzuVOw$@FhpgfUr2#HkAB~D?yN|>xlUfo!l^K=YDIF(XduF z`LxnbnQe#&h~=mcJH*J?a{G;=!;z?$9^A53-vXi>j z3c2)Y*vk`fWxn7&VA9W|XyUYv^rX-zd+}3o-;rYu|J;mGM^5B z8v(xFkPu#`7E7_uR&Kv^DNMN5YM-4V8`c;!%*Yi8Rw&M9(gWkfF?-GH_ z6@7e3@izhly`SYsFX74N?^@c$!^|$27Klk9taUdh5i5YHh? z!jJ*b-M;j;V@Y~OqeE~0Q7?jjkZp_x`#LgXTgDGKLkHX1z8mhzGHKwGS}{Z1!8@0g z8~1_+$91jf;Q{RwlI)9WM_h0ZrR{_c#pVuVJZ5>Jq&+&7by-R;SJ=S_5n#rkO#VDo z_|_FOCX@;&rY&heVg`e8m$UXqthj$*8zX3px!IM>>mU#9K=SxUX=o%Oza@rLkQ%(q zYk6W*cxmYFw0b~ggXL@h2ueLA7-x#xN%A&*COv8EQ6EIfZyg;Y`@E=#{ld*E{cFi* zRN^w#?3Hi4JwVOU2@nbvY`QX%v&b}EO}7!8P&r1R%I}Ze1;^2jS7+%RwSe9ZT6Zx8 z6iOB}jL0}8=~wNJpJ=SyEO++5^d6##Cj*JYa;GG+rwVqJu&V&K;p|5#cji4}T#+y% z-L3W>ukxFexLObE?aq!uQX5_w7(ohb7`p55|c{jPUa*U$~PYC5{Z+@pGX! zq0TzkO`p>Ih3(YwIf>)ww$)|JQ?1IXt#i2V^C3ol;wqn5vDC?Hlf`{n0>BHnC3HBj zI80ff|H!0Yrtn)#f0)J3)^wjHi5ca!^`J%p6aimj_>k{A80*PPFb{VP9jtrX!N+c; zt9k+Z4MUHdUnm&f$N0FpFRCa}EF_Z$T=-Wz-@yxuS%2C1LYzy9;pQmt|0u1}b1a_v z_lBvQR-bcHRNT1KZ5~pIrFnkSmvEj8U%RhDh>SP>5>XpmP97rQn}qw9OOt<4K@Lug z0OY|sHHg=)FCnwn#^to5Itb}jS`26e)$L2yn!&rp`hewync!2Ov$v<*LST}Ozgstb z3s^*6+HEV#CQpNhd*_Lo?GHCgM5WxJhBKn2Rj_TQOP_D}?nUJBoWMg{QpbR2cmyQ3 z0*B|Gz7R(nY~~Q*o7``?H{2I~sl9J7=@J<6X+us9_lBv>xb?$%>gPaqE*AG4pg;2T zG6RC9yq|v%{&8{lbHP&*2RMld6}V14i{Xpyf^@Q$@0`FtFmCn>6$hwWfV+JX5*to4 zmhs6UxrbK@Ecttb7bx6jFO`X{LF;{O_iuj|n3-fw`;*FP%I?$6BH>(aGMdp3_i3i) zaXWz`vX}rs{ShJ+wixh6hg2dpk% zh&SbOayt0C?dhsM@zu>t6^!-t9ED@}t^XOxv>$!xs`dVmtTP|h)H&jf20FZBYw_3= zF2|qE<@oPh0N!0A5r`qY;k*_@6XX{g)j1AP7r9Bj>!oWJS(>%umoAkzBs!PQTfh6I znsx2)h1b{X1Mh7*$t{yJigZ!X#;wx4G{9Dafi$#@vUXHRixB(LJ+>~WrC(3@PgqGv z=&!JM>-P)SF1d`@$i@7mm4{_46$tJrD(8{FHhw-%ie`UrKm5v@`rHG zw2UP`av3a~vsNQk8Akq4T*Tbj6Hy~@+KSE2(;8@s~ z9z}IiKvFa~E{LpLCaQU#Mw+x(1Ly8;H*qfapL6zj;?*sN0>T%!XJC$gBg$d2LwrH6 zLpMw9+K!yJVZNCTNFCr}MH5NNG~WNi)_aE~`Ty_xuQIbTHFHlYD`(Qs+?bh~T5dB< zp=?;1xfdej%8gl$%0cd#d!|C}mEzuep&||h2Z;Xe-k;<9-|ufkj>ALl`|*5S=XKtM zxeyWQC+RCLy4giYnnsexK%A{;w*Uae&`j5TY$8He%paj-6_;O?44?ZjsH-kB!#Fg( zMcx&N+tc{Pt-qZg+%x^O(TnCc-ieYNilJ+qxYEXva)Ur4zGIdYL2kD)vDjs<-6gXP#+Q17tsJZ97d( z)ayp(826aNY1E2h`oXoO$Bs6lyhs15J_mUx zyIfll?BV#M{=TlRn1WtbhmwUGTnzivI}D53qg*V27;>C4c!N43Cq{+{Y7gcv-o zL5~$?|EE)=PLHo&f5P!q#sy*o@A^uGbp5_)d@DpAs=D9FN@hK__v_)~qJUqGB4#pa zp_fBMZ@~AS$`yx!I|LR69l*RdZv3i&jc?_6t+x0^8xCJQQ`8vbs!ygCAtx{loO zfa1o>9mRMnW!=$0u-yC7#EsnOJ&jQf6Ba5=2e*Cc-^Lt;ou8-Q7|^knUyA(HI50iCPWmQ{#8}6wf1bpwS?<~6JPDQuG!j^ zxxMXiK6PW(MCP?h=Poz(quqEg)av)~q`oU{w&hY?rZsim_#K%Z}MGXtZKcKQ6q4Yj$;B)M7I8tzQ_vZ4j~A)ZCM^TNJ|Q5MaQ z4OJg%1yotBjgM$WtjHg_haV1JZ429ejyRrt&UNc^+Lx^4>wbGt{D_6PK~=}#WyHm@ zNblLGqifyi(`gdJT7SCd6Wcdjf{Lnlx|29m*{(6g{5V<}$^Tz)vGzlVc2UA+6JWi2 zjDF{FMxJH~3>;wy%*@nX7DaP zd5kEF+@~f?Ryn5nNu=x*M{julI>TJi_%i9IvZx|E0EzL3q{h8Sh)jx1`b+y;fR7Z( zL8$Z^!N7tmmiKxQt?)acSvAH1)W;VdyJ4~h>A^I*#H@KIKKbVH;o?OF^>su=vinjp z-8yQ5t>2JRYb2-z+^s;XHBZ9N6?U5YrR0hlx*ZyCMeiWZpZcw-n#>p)MZW||OaG9a zK14ndGEqs$nn>Z5>|9_}a1SN^4X8j}crYNWUVlL|Ca)a|BpMh@jq9h$ThnshDLUU2 zzQK^HXrjBPshHOO51Y?Z7F5B70m)X(X=;C&+;{_3mbje;`t;<8aqkD*>ITiY0uBAG z$pKxr1wyw^u&akaS2C5|2uYo;8sW_O{q{#jI-jzsG`rz%gp}jtBud^780q8WalqNz z|I8WZ2jHvYz@xZvv0oA*xM~}&j{l2cOB7(7U|_sm@vcD$_l1ho4ijtho)*pIeQZkr z>Talc3Q?BlFqqW}qTJzx&}4^Ly~hs2dwh`U%O)A=z|tomP3hX!@~M=J9X7%ZRLnZ!!RiO%+?U9#AqQG3!+%oWIE+L6%q zCK24ViXUwtgk6)f)5Ol9zwEymmM#gL*x~MD4RZkYiQO%_myHYe5l5Yy`Jj67=@d%X zV7EY-T?9HKVoKR7#_f}cH7^l+CT};htbJ_lGwY`_o}PW%EO_8Z<2CMF@&NzbPQN~; z)u%fxPFSGU{e1LFRs!>;BE0Veg~eyqaGG#w8_#y+-xRZQew_b>cv;TvMLiIb%6w}# zS0{61OvAU4r3f6lq{dxdOgyYQahA%PJw1 z?N|d@aQHI}vY87Q22ZqLD%lvQx@?_Yf%nc=4iVob!pg!6?8^}LQf#H;INV$; z+9jiot4Nq+39UE?!fV3{9lI$6dEEJF z-jmuhUj`Jk2WKr)ylwrQ7EM#gw{}NI7p#ggs@i3uCGPdSi;jf~@mTP9MeX5ewDiIF z{?Pci6t7Xx9Pc>m`?I4sCP8gjq@Uaf%iq&(>aW-ROIZHJ=Kr0FR11B>At=#kp&51s zp>bEYUuG{~@e8*}E;TCA6F8GoVc1>+CVZNoG}`Q4Ti5M32V}4E&w4jDA5HA|5SX53 z=$3s^z$F!i)@Ith(Lj_7}-3E7h`IP1M_Bxl%`dH8JJ z{j1UNk7sqytTYK826NnP_{N@w^G5sNX9Oz{f1tJf#F~&Yzz-a>2!uDuSwa z2g|ftU?e2OD_fYN~ceN{|ZKV4~QDLKysw7(OrtV@CURQz!% z*%{~In0%ZVK{4m&RhdgemAnm%vq)fn`J(4swzXf$zHR58fe%G9^I1`qzv9c|CMG)N zves!Kc$a*sx|D&vnqm*{)d(E@~BtDlZWL)t?8^{%)u&<)sA$$cmrg%5g;U8OBuc$7$YxnW%R@G z==}o2{We`Y(+6O5){XhP_r&PjEXC`!TuJ+TNyp~m#Pe?dV1|&K5sBX3Y%xg}@tI4+3QUKS`FPEcQMHjuB(fzgk z2=<8bj^O2(JF~a=Fgn!k44-vI%S}iTlhV@E?fuD6zr=S`$HrRQ@pa2mXyMBkS(}%8 zq)~nC@EIS*J+9t-6!jIZ6@y~70DS{UJduwSIPFGlQgu?A-095agPlybZ7%!Fdj{zHR2*xdp9WbK9z)oU1UK^GXRl z3*KM2IbS@ykl}rZ43nR^?A9*+PLv8ao=rR*<%&wtu6-KqO)|_H7sYKZZ%=;?*EFx% zG$^{7&6cIFNd1F>4!iAn?fXHNJ@i5{ttkt$fWM~A2P)S<)za18nWvfAftG7fIOB{`iLkbg4yOX$J$XG0 zpw*HUUsy5Mqdb0g+Mj&yUlGiE=5r^FCFWfnO+-G;qJPD${O1G)X{LHKoL@)h@tI`# z+|>DEaga0iC`n0E7QrUY_Vi!i+a@hU-ylewh-mAdVK>Z!N>;gvrKOdT?r-&heajVHA0UF;65~# z&bvL_9F5ri5Bt-L10*Jvc zWR=PuI8y|*(NKFjuxZW*;{vLKgjoVFI#H6hQ3qNP}1-dCRjrp?DG zicNbCirtqW1|#&V@ja~08G9nVvq}J@Dab}ltf37Cvji#|L)g(B7JQmDQOi` zx4mEGn9iwiQ`h@ls=5-$Lr52~S-#5z9?$WGw>lcDfnas6CP`cNPM-S{5+qvOCSb(c z5aR6ab1-zJkn_biT)J|XIxn3`s`KZrSQGMm)YocSU_D5?#D}JE$3n~&(_lq+ZC;8r z?8-}Yzq99Ni4vBuu~Bd-0RNC@P6sq`>?n7*@# z3%jfUJSXF)L#i^n1FzLX*9`2xXjWR5XX6oV@mWzg0NdSscq$d^UggtkLHy_qGPw zbulT(VXL$$TXPuIC+;*prrul4YR&Vp?*>(ct!7vd>#~u4e)@peXEnfg2l^7#U(8hZ zN;e&vUUb?b-D1dPYTmarg}bBcD(cjQ?FjX}mc5`>0Lrslhk1;ui|L5zyu?STDR^Fb zrqWw!qhhRszf1(?h*`vEx#pR0vW?-G)XFI{#(T!_M{@Io&Bf2G8B?tCyA!ez%ELH)gen)@M zGu1UY_rbo@1E*48>L@XKh+=Kgy^*lw@r*!6$$>>&dcsC?Agku*uY5f( z)+|H`Iqc@9;s(6ymnuJzgonF4e>T?qG)`)E{$Q4;0_RyPDDTc`xWDNo$cR!dG)c$51jYc{4c|Mt|NaO-!g07`Fn1VB$0YCn`} zb!c_Q)NR0z&W1mf5Bu=xj2KP5Q>5_%d=3>+L1)?ZI&=Vs2_0lo&PdO^<|W=p|9tAn z!|yuQijxW_2j`d3IIwK?AUiui!C6*TiSBvNo%eAd9d1Q~~84pUQ8~4H;3zy)S=g(Bplk zTeOrC+ZV+94KbB3!TZv+XjetARMd*}b=jjS0myb1RVD7Jvv`#E;8L2HRuHTH?eTF7*eG1nZerIpB68@+6*6JD^GfXzDaArHM2_FE!5E+PmAov@D)+G08s_*dZ^QE{E3GgLC4 zgp-Ox>~rzPpA<2rt`xrob6dbnqD0m>z6@SgF$pS;(ZNVOS>4(DDV6zkC+4O0LxRj; zdOzIt`ES2==D{ihf2#A$XorKc77J@4ELqu|n;_zIKL}e9D%O^y8Pl+@oP(dhtz7<) z?7evCOlb3KuL&1}FYOY+E?c{`XFP9m=)G5W@?AE@@BX6YlsjUg#~fiL^sHyh=HjEP z2idu}KIf;X35nhR5VBgY71dGqmF<3t3H}N|yt^0o>kT5n#AJmT2J0}lpvOw+ARR47 zuke0W8(u2v0!x5)_~9#L-bq;}YTJ_Aj!T_ju06^d@o&zMSY>Z`>wHu3`P3OdU;q#j{|%K~I@LZm;~mkbd=S(I8Qf9#yxC%K%B6t3$~*e_uOKvv3cQ<`=n#@vq= zN5!z9uXXZ}J%j^dc1LofwtyU$#8Ep}g}Vs6+5871H=DknVpD5Ub$~s+cdNP(sFkgf zOFol{m=vdNgx{i{(B2W#5(A(t$nQ=YrTNU&eCBdT^-EbjvwD4Z^XrqmLpM5`O2~`A zk=zc25uFs#-_VZ=v==}rC*(V*m_=FsUvV8p@9o7J$jQm|RyyZfCoJQ|^ijpo8+Sp} zYNA#i?0Ww*3>9|yVB?5w7=JKWriA;@th%uQ8^~F#RH-OZ(a5)wAf0qtwEM;MF~p#LI~OQdPx*&@k~Y2Ea}(*2 z+LOa=U}_E0nY1MoU;VPS-bCeDD9BLp9asgLjdLu?UbysFwYB%+b(Ur!oWK>Va zimi^R2x8z<5LtN%F|AtTu=2LSxH6zW^jQ(#Ch|yfV<7p6`mci_t(0kvIDBVYGp&DG z{@SSIQk}|&3+so?x|<5#W+$;a35E01ZnBLpVDJ_uuQ0;2Z&!zoPcr!|OMk>(g!_iA zVmxK}%n_nzGS4vP&UXh_NG5^Vr zP2WtaGc4X24SePF!H>q74XLObIh4JM6H;0zb~AZ8uapU(5(4!$TQ3e2k|5SHLbhTx zXjVz786pPpErdyhE4X9HnWN?u)ro$_^@W{4JnO}^m+;mTI-xg4EJ2njlx<)qrvNcv z$9kG{m06FFYQylU*S?RmupK&4+jiJSD6OdM$eq zs86+z5T{(49&3u|^7Ti&S^rF>N51oM)$)Tgl2=X;L^QP{*r^R@_dV=>c{PyA7^!9- ziP-K&NoxR*#p!)-mbHmwPP!+U+U;;O{55c9ALxATtTHRBq{8a7ZPx?)xvhlG|6aR) zD_SIYJ%~K4!0%#abgJTYOC>|Wox}SO7+I^Dy>LhCF)!JdF5M$u<+CH+5+(y6S0Gub zG{Jp0{i`$9Ah6SS6(fnEd&`|yNAkDmwy`0e`uyu3)&c#)Tl+Up{_mnQx5lDo(9_g0 zyD;ArF9>J)zn1_8O^^{<1X|;ROAFv+%ST3Aj*P+pyrWDIgU~%0WpO6C>Nz&a?(xnI z`weyL1`UjR_#NPw^B5ca-&XJcuidOXiKMCK$6c6`guSi1>-N0-*TQK?6hi)snIJWv zehSVw?7c1lS~xw_wV?PmbCHN==#Qb03;zK$hvVToiSd41XMz8fZZ0*2<;S243&tH= zXs0_8jSP&}XH0So6~>mL`ctLScgqmSR{GMzKhLt?E!owe(mPdFx4W}epod47oCk?` zd!(DXy$f=6UsLwy|0_kBD(#yE0|QRmL$VAwd*3ay;byG zMbkRyzIy!dlMw=hF;3OLbguwR(u zBvD}>0args75H}7qz}o&*Xw-!Jqo+?(>Y*=Nz!r|SXi7*Utz(%zed+26uXVwr`_j3 z`GnzmZ#!d{T4aTsHYUV-ste7d9hQ2?~o$W0O004T=Vz-(Egg;Dd@hRktf0U{$eGd+=2LuKZGE`XI+a zDo6^cid+=?lAvlR8SOejnR%Gx^JmVVVVhl zn#&cR?|g)ESoNaI1`NJ2i3-=h;?eUFB`^`7f`W5vXgd(!UOgpph$*vf8r7ZF0I(E`bz7E1*N#ROmzkm{dL}3b6m57;bhOd}N! z73CImQHe*{iU^7`i#n0j^L;|Ws^`U3V$bE>*sf!U+mDwzBEFAAOsE*@f1VG{q2U?J zn^i;VEpsZ`&XlxJ=<(jDqL*r~cyhl$6T6!B`%>EYMvW+LI#D%jo#GKgVx@df78}#O zE%EqhTg7Euo?ExC>4-yZ5ti!bi=lb;j1ph@lt&Qb1_~h`=2<$hj`K@9VD)2J}Zad5zmR2UQkRS`23*N(>=auKOK(82GG&$P^7qQ?;aio8PIG zQS!VhiYp#FC1znT{!SA7IkcD=$o2tL7nHjD$fP^Zz3OG?Hh zgrVelkI$kR@t0T!k0tZN*fSB|bEc9OW=ZQe0kTId+7>IhPblXqIl4cdK)Py%o5lv- zc|Nej%cWkA4A~>9FLaD}xu2@jvn=`C3;KtFw2x_GGgDywa}K-fX_S$M2^P?wB%QPB ze`kd2wbhvCiIg_k&DqCfX6zUEEM_1&Xxxhy=;Hr_cHxBQM|=7!)!ux})S?G5>Xlho|GhLW9Q{X<{Po45 z35EL)iUi!=L;!tin}Tt|W{O{H!<%r|+ey$~%s$D&hm_+wpXd^2LGR+Mhr5$LNinU; z(BK^d$9|d!$`XOne^_OELP`5zi0EbAVoVBwAKfK>co-AF&avJVG8mGo028V8s}RBM zHlfSDg7Em_Q##;!>_2Isg7K-kpM(A5QtW9SlaFZjkx)qJ=3q&Bwbv-Wu}+_Bz!!@L z;6ksW8VFXB^cKPA12I?y{ z57|LphkS<)MsK+lPagq*$yM<>u-n$_8etv{+4aGTRWO-^C{5wGr?NBN?ZF}~8$vEI z&+R&Yy7%*>w^ZQ_VzP4>FMXZcKC_+_yNc9(sT}NXaD$KuGbZmvt*uap^XEV5v;}u2 z($zO6^%o;tH5Tj$^;OrA+*TM!A+k#rEUUg6`7@7MhgAqjJp{HN-oOhT?io{*kzrto zC@k^K_I2uwb4YtezR`@V+V+fwc^6j1dE>h+yVi+8Vzf}7J{WZE%a3s-Pj+NrVF$+O zYSVGdPAU|ph`0L|d+uZ>P3jSQH}_P87$P{CkN_$dHK9%v)hR(IJ$h&Dw(jiw{TM_r&zfv+82=zjk`4R#~5kYk?6B zE!NTY1o*4v+V7ihu!#qvuUN(_9HsZcQD3D$20@9qBua>r=A9*4_K(do6DzldGRKc#WyZ zRBa}@&BbVtX*!E(ZxXgni@u@Byx$Gfen8nrf~!4+HnpB<7JH&;UU)4n1y}FTuPJc4 zyvtD2o}Td0r_l3)%p2_qs!@2FZPX2pE&i%TFd#iBnSu+2sokBha^IZ1X0nGCc0+$7 zx0&g0d{*!KH8OTD$)h*M-vgnAW)+9J_~$F=`Q+-H-QG9hAsXXe(?T5#AS%T$<2$H> z1uqw2r979bQV1oWT7TqHOOoE5L?q@sRwi_3-&Gg0E5c)swf|Arwq%Z(aLdJ5?kc~c zovKybWuX1m_^yk{f-6@K60WaS#oi21x%p3$r;$x#Up!wHKWf)Sx-aIFitFzql16qY z4qYC)3LNK$AEQmYC@qBLRe4&vDZ(W<8s@z&naZwZH|3nUA9@9zDjExV-1CsQYs0MB zo?c+519fNDx|b+^;roryD;K*Ohl6eDYb3@*to(EISB`2Y%&qft?-{?zA|RcH> z7q^av`25;3$1Ms$b$nA^`TxM()5J^B3tZUXv2j*L6zoy4K%QG*PNlpi(_z#NhHK&04Wcr0L9vYPXfQ2fYf; zpGChPC+>zkw_ER+8K@v;ZvvS@X_*2e8&x8uG0m#}A=<_AArTTO9ogpdhMq@_Wd+m$&d%s^3il*YZQaJpz{#f);tad?6D7grj@)BL61|z-6 z!VnYDOldJO2R%B{$p^t)RhlQcXIfCEtl;bqdNAJn*-O^Ika`V$S_ z01Bpl2^mqA?T(t4pa;L(XgaM{)r%3&!E*$3wkSnoU^#fNI&UoQBO?g$W!V@!;Jze+ z#4Tnf@H>^rg-`as$9yn51C7tV52y{y3z2)d@6Zb8rd^ixCuui<(;R$XahGZyPN+fd z=6*YL-(Du9HtgY6D>ot8yI&o`*9?{~AFF+mYa`apJcM7Jnb=7?ThBp|XP;DmrA75w zYRTW})Q2Rge}(jasAu7GN?td|@ENo~6^tO~dfoxX9)3YX!}HM7;FJU&;!38<`s|d9 zy3WN#K0ObDl%i8ZUl8%N9hc&dpCU;tkh6Jv*U)8Orm<+Tg}wf*2+9E2Tamo7(5+&u zbb&9T+VMdy4CKVUUJZf|-Vu$5joqh_2$LCIR{jG!b{9^&&|BC}4H1U?6&-(m5P=Er z<-ydl5=?g}GseWhE&;4E=WHnSVL6-RCQSN&;)M9@)(93D60++(Hs|nXSS1woWk<^w zJ_?GrT5a77z17s>G%)#)UxJHe6W9VqT!T}%>sN}rqP1GSP)^cIBldW^fF01v)0vM_ zVgq7e!OO_&+5A>VN?~-jzaQwK^$Ih?O3Ty*K+Vc!5se$Efwd{Qv^KqdTPt1USFb)x zzfo(w(zUmu!%f?A0EZ`nP!g_m>uhCg3*V|P`dnZ~NufjR@=5%G%i3`>{i}Ew$I2#G z`0du7=ShRRXH2xg*9k?*Dc(l z5AqnXN5sc#miXN_I<6ZR@>vW^JMPRsFb7A^?C%H8mncBvamJ`YEZfz#MhRL3`%mOD zUS&S07dzGLC)TEPHI|SQ7@dT=#!m0|`-HjvLjr#7V&@&af$uuv+57pGZx|!)`n?YS zeN7rYPPpOo;O_oYv+2@;oNFST@e=l^-atLYnfn52yVT6c3wSgp&Q0sAGS2$)cJmjLz@w|G5$x28G=3cGbPT#EK*6EXPkcrg95|(dltw(~s7v6LH zV`YEudK5OA{Q+YQwWKN#0*|Yx{XJk&&)l|%-H%H9Ci8gCfzNtV5Cu|YipbG55bkzc zujf0!mn&UM@b4`#Au3e0fpj&bJm@s~CBR^szx&bqI!T)RX;NQ1*D*4Af+Bc)K76Bv z6MIN*>hxV&_-5hT4p;@od}tvPU9QO2x2DUt<*1sqb%f{!aehp=2gO!Ax&CK zVvk_qsVErPbkt_+ahVU$H2Yk3Hc5Z9rX3&CmjA2x;Qjc_}-@@N$~wDRF6J%;E3t zJ^i}0*?~%%X8_90XqNJe=aUB4)~!^nyT*ul1hY><=Gt$G0ZkgGVT1VFvYy=I@xq@1 z`bF>%*$p56w7(Kdiz3#Ist5k<9JicR81a_qD{y8V%d=}`DQ$@f|15oxg)JoR{^O+t zYdvcK=t*-6LBpxcJL?iVW)6sb{SruGPl#m!D>}3eS4-Ev*&HR8 zhT<#m`pZ;S7}OTt&R!cHST&(k{M+uBo>fgwtz`|r=?1Xu=RDt@)eBw8+>O9lQx?BD zu!eu;8hnzZ>RHb3*(F~>xz=+S1?r1{!)EL5E49WQ`z{7ZU#YjQ;8UuUyDMKaa!2a8 zIe6ri6d(Gh!u$1#6xVn9BNM(M(VRA#X%9qQ8!iA^4*?}_C~D29;h21FcdjmWPJ@Dd7 zg+t!P!h34UKDfXZ^^uvYIe^VXA0Jwq;(H|G3)Bf3i0f13X;q{u+e1ips@7U)UmllV!dP~%} z%nb_)JOqTxeW2NM*mwyQX}9L8tOM?;{4+`#kWc-Qz0N^4f42Wm8dC3{Ec1_O*`Z#b z*-5-GorR}e>{=bE`oC9eY;BDHjR%7Cm+J+u?OuQnw|aLN-oh+eezOBv9^5BV9kLC$ z&-z0nf29&xoOjdvHOyou-}?-ljN6oUMw%StWMAk6J#%>XE{1-;dq>f=w#4vrbZY#x zpzwM2R$2bqxBqPH6>nGo>Cs%oaFxMTek)vu2k(`pkND6p+F9{w1>ysPEb_%%C)F~? zQ|cicf?ogN7Y!2GkBN}2jJ)XbS$JPx4e$?_50cW=>KRwPiwMMB_pkWwA%w7DEP2N- zWn_9lA5ulwyXr@cm{E9i1wirpxc5}*cBd|F+OGUnTHG3X$PODUv-H%1w;WUwW4=Nv>5jRQ=xi^;8F3P~IpE`Qp0KD^g$00JgICy_I_Z_`F_g?l6F0 z63zOPQFX#WY2{17Hc!>-JDs1YF6VOL+TT@1$OyTBcgq&H_n*KE{vQe2f`zUZ&t=&bbysl;E6H?c{M%6AIp5rU>O=jL z1xC#pYy(E6I5Q`jtUekV_{EJff5IR&^i3Pg6Z`ZYXL&ijqg{267?92qE-RwKY|E?Q zcA4}a?g6-KhS6xs&9)K!kP&vVkNA&J(UhEz8}a6Rp*zHq)Rq{OSctu=}f49f4CmL`)~^+z*^K>^ua}l_o!&V9(imtvwTo&HUw* zb+m>nlm`yQ=*8D2)JuPS$q2u1hMYLwe$4l_A@%5P_@4rnzp4s5lmF}>ks|FCOjO|F zlUfKti8MPsv5U(g6)ZN#WR#Y2sjmEO{iQn6V}EE_{w$vykMy$EP*=}i7_K2ic zIMr>RlJI*cv%noF%}AhAT0m9(-OYQ{LL=Lz>p?LdQBN88`tApcN&p^ri%ZD1uOXjj4R5YmR9G{*j zoOB#MRI$-`m#eFwSrglO!{R5Pxs1JmGit)LmvpMYg1*24N^$NQuz|m7><~qe*O?<& z#`ea{J-7>U1od7(O0KO>+G%oQzp)j60OSgf3aSThr;^x?aMH~|MdH$mgk99g@(m%9`$JQQ*To-8u>D}XF|)ee^kC>$%l=4Ut1R&&^>MS$*R91#0Cv6S>bbFJ$A%eE$Umk*E?c-n`))R zP~-l70`|wY!;E67OWy|E-M)$78kZ-YVg1Y8iDw@u!1C^MWoKH3Wp~aTy<)nkk2VymHCL z>c7=`F`E<2oTtowoXNR#MJn{nNt06=?t7&@%$0_E3r+kzjT`*hNogq{jf^Ws#jgdqt$q@}GUpt>h(?K`Y?6Y1U{>q~23z@>B0@sYhYasQWZ`VXQD^gs3 z>!M^BM7bLGdwA2`riG@X*Kv15c7X6kxC%Zl$jB{Hs6+lf>fk>mdyywh%V5PL6`NIiyad`om?nic;nq^!Y;n@6bdVF}*pvP6hYiFR_u%{M2E=1%a zsL?^>3Znjxq=Wn85F*P+l+}-VKWl|=7-GmXRR2gcr|U;9_L}ct7VwQrI@l1itr5Dd zN(utFz6!C?XVY>b_|~lUb#1&HMWRAB|T76`%0$l&}=0!xJ0wN<0r7x>bnZZ>07_* zo#v40LP%}R8_&~r?DA$dQO?JyJ}ZGR&*OhfNZ7=(QC0hq@I7-`ykVR!g z_Z6ps_vD=Ii1k8l*aJj0`k@Q0;v!wZWUa^oGX*BU=kQ6??kZEo*fM-Do3DHza!&uz zHoCJl0+;--4R^2)!w(`iPb>Bqt5Rg@pgs$|5_m+$oOj3qan(cdr~=;Y5(#{AJzk>i z&e>IUTp(-iAd}(q&k4%7YHV;U%{(00#VC#1lvBEdS_=W~Z!<4AOkoJ$VXrCbRmi6# zuY;~3ju0oig^9jTP}h!}JGb!3KdH9w@sybK4EpG+x zD$8{=3nZ7FdLH;3ZfJ{@aV&Rf|DrP@?)~0%p0hwtXu3rJJLd69{!QslYN~6U;_U(!jcVVc4rWvGtp}4Z- z{?H)d=4`?$e8g-dos8_OwVWtU^lN+||VJ8M!=S7wV914Fyey@2~^cK%?%WKVCjE1t}$j#~OV? z;Ax6(0?bv?1H00E#rE&;+i#L7_eD{2N*+55l-aZJkpg_UU2(>i*e%L$&APE-kw>hC zUb?4cAMTCr;KOeX`^YQaQtv90T%tRcY39YO#MnCTeB+<~w(#G3q+frHOx8tOBe5ut z(W73GWwS0W^k6#6a?$5}ePyXC{Iw+L-MXj0I)NV23Fn5UKaGD3t|eXf$mfq6M0W+O zS%^PTm34YziGWnljXZo6s&v{)ksTo)VvB4?fQlOMdPoC&!x+g^Id*X=KHBIQBTjMt? z58~}ZqQ2I@X-FRlp6~1Wi!*Jlococ&qh5w6-+3l5;Tbb?_l~+Md@8A-mza2y0{kt{ z--Rqn!hBX=x73c%?5Bo?jihBN&Zj44S%h7t79Aai{N64hiaVL!{eu<H599iz-} zp)sAx;kf&_pQAwYyeEV_CDnEZ*zoms1;bBKSd1=;*z3Hc4fPxl+8g-Z!f=R3!AyfW zn|H4%1OE)-dlxQ=-X*ysC?TKv&(^{gRq9cN4AGOqhKb4uVaUBd!>nWj^(3VG4kxqKvJdqXDh!&p-bKOyUl0U(rmj3}6mipPfI-KTTW(l6?yLcEy za4#q_=N|cRYIh{-eTax5B!6;uD;NRohMtwdXIXYt?ZiZP!j`BJq$^SOnA{M9jm!7y z-mh(~iXfDydm}pS1w%$Zi9FJ@&w6bw93|Z)!*p8WjDBIo?^3qzzwRy`i&0f<&g5l< zfu@yf-L+f;6Hi~=TGoJ0+!OEVZIuQ2l<|`rSkkdMLY$cpY7 zz7N{naTG?sIq4q0`d`AMI{> zMZQsvanQWB(4p0>D_VMxU3Wc2oS4xbxW=G(co}J&lzVVQCrus`Rl-VI`6QzP#nju;a85mkn^I#2^H6om30W@ z@)F;W^w(*VqWYamIB?Ayl-|Vtnnv!~90x@okU94czMrrE43kL)ezX>SygQxyNztM+ zWI`cSTt?*EOjh+lldhPj>Om5DyDLnmD6rI*5+GhcZx-u(f|)2jjgvV2bi-{|mwX>} zNm1##Vn;BEM^9~7Joll76-i>RHsXWE&8G%0EZu_RhT0%kS~uo79in)i*snDlpkRKM zByftqb7@rJH<4{(Ak>i@W|%Kl3Vh+(oqEJV+amdMk>$sn_UkLR9wk3~A-4xy5OVou z5Rcv6zIb2ueO7;kcJO<}PTk;$(;D6N6E>cn!2kS`(c@lRH-suc4J3K#zh`oXoE>-DhsyqiZ9qTF{0jwu)lFpCvW~TLb{SU zDZlon%`G}aZO&V>YPrsH0qz$sD>5t6$W=3_B2R1J<_Up< z_Qu|*SZ3d~4U3^r9E!|P$V1MG_O0MSaJ0H<5jf`THS&BSD)+C<(YGwXZ<%-sY;Rc;*S|D)-=!;)^__y3fom8-HGImj%v z+*+EG%GAu2D|12SqvpgdE^y>tm8rQ)&8_5KC~nP}d*i^33ltR;`0;#x$M-*u1NetG z_kCaYdA_dmB3_)O$D4XAEi>{h|2zF}fJ33@o04BrF5euV(>HYY_71zfhY4|9;!$ZM zO~sJf2tj_=5B%IC{Z6s3(=xVbU&b;{Ef$iW&r&A78A`lknPN=_2>D=R%)w6~+l4^X z_DTcaNn{50vfC9Xih5xmbMqiM19!m-o3K-W416$EaA#J4q}E)Vd;0_cLRJe&Na05? zmjWk*w78YJ6a02QMjEE9TucCy$z+mmr-jsc`_@XE-(>KKj|IFQQv7q=j<&I7D!oHF zx_X>K_cb$MPss--axSn>!>pm$uyk5|S4})`mAk4+&&@xJQC477u<>^J{>P8GuG+@98 z4g^z%o~-j5zSugcma=&i!{I|)*x)zSS2*VTE&F3_dve5!XW;GAN?IoSZ?Z1}{M^q3 zzN^xkf3Iy?9H3s zMl;?6P3PWE#UX8HmM|CbX>CU=cHI~scAh~cVQ#+x$*n(jGFU5iRfO=sQ@M9`H{;sH zu6Zb08l~m=-R+ODH1pL(H(Y7W<=Eqfl3kLwo93@Af2`3!lmSr{vp(2eL;v#vI9WCG zI7Y;ARP1p;J*i8opx}-T|5)yd+Ge=_zCi+Y-&fwU8t8^}QQ1O{OY0G-;l$)_70cQC)y>xL@HL}3_H83#OoTYe7WccYO2ie#ixkc1JDx!KG#xc^ z-Rl9=UU$s+rzDk}Nsa_C+gp$^->oREJ)R37KMJ`WZtb>cgpA_NvfX^p&89&<)kr1z zuA>=B5~A!Xs}CAEz1kAz7qbJj1D`tPzd)?GD#(WZOxYcYAvJW@Cyf&s#`l_YW^2#v zdkW<`52A>bZvr|!cBKl6x;k6=AHMWGdO@7x^$(Yg)#_^sh1#Ssajbq7X2}-CL0i8+ zu&g3{C*nrNn0vC5#+Aj=WqisjmHkrJR_#w7F3tca4p@?O+4X#yvfRI^c+H4YIeN0P zHpLi;K1$06?=4)(4%N-Qc3DS>H9VZ3vYHmHKE8H3t>P@p5}!(lo9yDDdOIm_n(w)f zz9h7~|5`&4-Kw4A6UD<3Zo%7(^+^@`+H$&%byz&qwXX*V z?KgmnDXnbt&hE-Gb9K+VYXiZvw(I>N0%O_VembXU&AEK3t*|IB@m2Pdg3EZ0=LoFM z)#EiB7WlL|#1eSCj~C?^(~1zonYsys0{gF|OIv-(EzaiyyI7%A%^r^~EhwVM7U z!!xCs<>iCOG@peW4z)7Xg^&nrMEd@M(&C&c3a4+RSU0?-<}s`m-459)94SVGp_z94 zAN2UJTqMsfX|Y^M6vWJ=n1kmD&4pgQNn?CdbaE^%JoAlvlLU|@LwJl2;>AgavL7Ja zxVqTu<&I3q$*ZzS%%lCLHR14UXO_!ehU@S4!yavzg!u{5SuQjhSfNCa@sXA;HrUrC zQ~PP8M`k9~&x?L;7*aJ$CM-sHU~LMd%Mz65$jN~NwMClx${_5?SD<);GQB?iyI#kW zlGx*E=jEp}xQ}{h((bXG0X_cy<*N9nJc;;?FR5PqfC}mU-){XeTz!?yeK~!?xmksj z?|~kuCXV3e*ium+(aMPqdX*4-Cwm|FTB-zVm>ZMs;Ofy{P`>%Hup>w@~1Wp3Ue}9|+-_Su7d!N1jc%6HqzNc$?lYt}CIFuVJl(ni89nlrB zU)`i~RjAmav-xO}JBx!&3(zAW5f0)~^3zE>Z;{3O(V_cZX7|vVGD#!BY&9%h6H!pk zS05425XkRbcJbEF)Zj0zI?h)GHX|={7-98Jzt6gK435`7NYQmLyL&cBJ}K;XX_gXQ zOhcqc^4T8Kf@>Y)*+^C6n_c5iG_r4w^PXTNR(@@Nb40v3Tn&x*hoQvMRw-6OrKbB+ z{feg&?cRVpIcvrT2^}OJv!o=hxyTbjjOZG$lv71Ql_Dg`!R>1f5cL3lf4`^W)!y%0 z0`iadu1MVt*df~el85=KDBCTn*5E(}J)b$~(=CRhb2?MjY}Oj$rNKADeopBKWn|J8 zbVrXkRnCo?pRLs1G0`%Y$Ne{F6x-E%V24WdPl*&_H|<%g*vN_-$llO2SpB1+bU`GT z<&M%TOJ&^Z%VFQKt{``Rsas0!1}*ivpq7ApIK(hC028nJP#G~Bm=+w_X!^!t_6 z)F<6v6vL{bPz$)ebdKNz2`F--PKv_VXvT%7oW&Hgbqt|os91`zXDI1GkWIkD^?~R0Sj9=3V zY{1mzHizzkR4-zbwIuZy`6CDM@wMTwl0RNvY*Gs6#ZX|s!*Aqn1@H}EDC35OP(9kU zdHb`~9&J(BJze_}AQb%Bd zW;*N(JK^3i{9uqAc+O0&74b;rxS(N@*OMEbWcFLiX>nf3(-KKE= z>^WK4@aEcy;c59lTh~@M`s;4B1*Rc;^j69H7ekI79H0pzAe6ky1sFaX>akJ-FP!-tL*NsqrYBtZy$C99%A;;^uc^PwkO!15Jl@N&*?a(j6@}sNFqHJqz zsvOJ>Z&;Wh*EhHNN~^S05vBAZA4M)AWB9ctm6W%x5DoKi*SBNv(d;G>&hL!w+wNq` z3r5m;w+dW~DXs5L8ic;tWPVWvTF{PNaUH+?1>S%Or8gj3Ej+I{Xvc_9GOOwA(gnfAnp>^7J=t!uozMa`v4xP@uD z?M12wN*<9GLg7&ZaH3UD(QN}J3_4T6bk`lPPg)1|LzgbB+>YQyBwK!PvPcYpLXSc! z*h6Mema=DQv&IymFfB*}O%xFYBNMQtLEOWDs}6(LBf z+H-Ie=DgJY{N%Jzxmebg!=BBKp*xHj>uE!LN7ra3+>H z@$)u%IK)5<0RU31g4PM#lrmjU~5` zsr>ho?D~aDtBVyJvsFD?>Vb6l>t1shmfN9~rV3a4HRfEN?hTCBX7W2X4MWl`;Wx8u zoaZ#>Y)_qK`mu?Q0kjen(*9SA$&+&$b&r^oVhQ4{T&NqT^{(`Pu-;}`DiV_tyrQ+!VuYi1R^`?;)u!Je9YdA!0U{M~;LV7kLqI*~u0R2>iI zFSPyl5tVwJJ865pBptEm8`a{u1$0q4LI<=qMYM&|m+*6;2gA|~MkE^a${kvA){EC8 zsL&r@NgEaJT==&qfU1g0TynJe!eTLY3~*-hq(&qYoRw@G3{Toul|oMpBDNC&Qmh%KpUN!aomx&;2x&fW4$cv060MmZ2A^#WD5` znDa>m1;1fW_^40+TG%>~E#ZC2wI@#*uO$I^6uWBV>+0&mc50qDJGYc_ynOfHFHJu_s}C}$oE0s zwY&0LHhj9$UwLUVjT+9Eb~YarG=+vnJhDd*bSm?YLKz)k|CAGQ+ZKqY(70~o|^ zGX*~L6KGV@8!@W6Jb;B2Qx1kvQ>y}e`kqNP$tJ>bVmq*H)~?*C`+@E({cTZdp`VC^ zKO041T^J*Spq~3s-IXZO&f#?~*2a^`xncy|YAo-=1Q)9Q^}-<{Vw;rSmCM02>@9Eq z0m`s~LH532e8{;P2l9ORVc|LjpVc&OjB08qhgAU%UdwtPeV?xU%MzPjuMk}FTl;8W zpSM)y_{MOIgGHO9q{7PRArhbWE}nZ!F#FWASVIDOF0ZYmb(w5+_AYC?AzvCOuKImZlpy0oI0#TJ;BpaYuI zD(dQ{?J@SmVb;brK!L`CX(E6nbDXBqS$0_bJE%UbsCfH<(mqW=n5K`j2W^;2u zbhJZNPx)v3ZG^TPxwAeaU0NJ&|H0zzlkUs(FG&1Jz?P+Kf5Po2O>kW#Umr3EWWCUG z`d&&``w9f9s3}$jMM~XMxjT#dB(VA^m(>~<+3`?J1*IXe^(s0GP=oau=TK<`y+}xs zEzUT##(~0!f=>szgCbNOPA@IrV8#iC;YLynl$=!vqm0|1V}>TzE@MN0d~7~w8S^=D z)Lm(mW!4`+BgVyHj4-LUBR6{-sx?&9q>`Iq75ITRhQ_Wm-6(QnL@Rc>Fd<}4K?ITi z8~q^6k?I;js)N?k4cRv7WRWfsXG;R^PZY8ceggHHPhb4yt1U5nIHgldD_$PAa`Sho*jm(_aG1MzoW@%ca6;=xAju7iCevYymwxTwfaOY%Mw}c@Bvf#DU?bLM zydP_tY$aL)qXwGXWHFu^cB3VWo;`=jacU4SjMN5`WZXlAz*MLPEaB~n2jYJ73Y2|f zu?WA=KhC-~$B_#xD_ty2Ih@mPc*luZrqx+SMXbD#&93GYd!7&6@pt1MG60h3ao#~v z%*@EU)+$X(oI`*A{&~z(IX1H<*Un*OVLj={J@T*A-52m&q*v-%H#z=McD=No(Vf1u zpWe#$HczBsapS?>|4NahdsHOUd1S_IwuMhc`THdMoLKulc8(>-ncQ0URyLhYPZliB zs#elP^U^d66RtDK3?+k?4bSBD3eem z#TRl@WRGs@S?gP2ynto#^S%kf`Z_$I7JzHp);0>!V!;NHE(q{}6aGvHeb;}2!u@vO z#^p;JD#fN^G9SBu&vrN_DB#74e4g~+3-eqbp0S(g(#~dtwx3qu$pFT1?ulEW z*&50E@t)bWsWrvO;NjM1@N##n*GWc*sIy2OnmCbB4_|lJr@p|qe_X&h{%Ndf2w66o zl)PIY0654Un_#?(73g^|=rPXE9N+)oDh3}M+aE8)m+EU#e$#sVzH0en3%N8$B6mv$c+S z&Ql$q&G6IY(5WHqa8M6V9!wkjrD1qS+Mhnx|MUyQaC$HLMNua?C8NwLf} zZJ8D`IzDeU$zD8Kg_=CAE9si^hnRPrcbl21HLsHl)X2u=A_00}O;icbe)PHz*VL~4 z7|_UY6`satQex~87oCoEmWcE3x#Ks}%|Ff4>WXpR71KmMCWf1^)h=Gkx%=Jz z`X5j2e-exiYCpMOUqO0~{J2ci(K8Zd_!fS@R3L^wAr-h+=X`Y2CWtLX?vY9{tDDU| zXLdRXPJaHsuZEmFz6F0(&eFHfnaz?LDvu!Q17@#TE1TP`{Co*0SjUvoB6H*2`^=;@ z%`X<)6(fkBqkv|*-!vM(;5;Zc90Y8zWNNO~kZ7P~R$)e|X0M;NpDus+{5zf#+9qsA zu9>_Mp?X>^r`-B+^K2t);9}sTaF9?ww_m0wVeML0P-X1!dnpUzR%hY_ZA3=atT6P* zZ+D?ipf3|KX<>ictL=hDeljkhAp1>^rEf*Xt4Fqht$MMRM_0jVArTC+xaxc7tXf#g8)Gf?V(D6mg*% zPXlrP%79g_yl;}djrkZXlnSnJ;Bc{|psW7%EiJLTevR!0 z{U2E^z&BMBpO}0jNN5CU)M$XAZ;vdctpY#oX*K+%(rz(k#dg1G_LSwWKl)+!)t1iw zd=ODGR!Juo^OfnxdnccnGC4EMQk~wcaZ`EXu#g5V@4jQa`X5Y*NS6TUopU`b4U7G* zrcvysC06#oVQ1K;!QVl%rO2g|j1P zghW%%kGY-8kEh$`dT67vYZ>+oITrE#uCU0)ih%UvsJ77wjm*;SSk6?VJU=YiXTmBa zqeM{07g#g@h4D|o4Z0oUWK;2q0aK6l!UbJrGacd*ohcBjY{Ja@_@!lFY_-nO3#6A%jP z_IXy}J=~!VxY~RifsBCk`gepAwJanN^4T4UTS)TlsoQ;HlZ!d49yY)ciEf;X?GV#! zs!c$L*Q@eu3epOwtTK)$bARcYhG8vGLgM^H=r}s%H0wcdfQVR0|~UZ8STmB z+Zzxx5uBcYwZ!&qG`4xWl9vc#G-~JjVi{1Hp`B6ZH!XBo5;todSm+l}53y2wf$k7m zB@?uc9`=(>3%!@g#=C)>6BXn&3zKQs5CAfF3*b4$Nm`g~?H z(=lnV9mcEI;<1{u^)51$;;VE77;d(qX6g@l4oGl4xWq_%ira4PORax-RLJg7HWif) zQsl-Cv_+84u9a^HE|G;CM?{1obu#Cd1r)A>gaey%vYwJ%Ny|qagRJEYvR>Fwa{!WX zVPD{PcKj^d6>JGi$RR{*`7Uzc=Y2d-kBDB^n~&(*bF#*#g>Ak@5ZvLc%_*gB6OXw7 zDhw$k2ehhY4YaIOtl{^fs-kw^-ZXBt>QC+gVJ~zVzT)g-)Hl@@FO;p5RRlvVB7qo+ zTs_?W#a=TQho<7l(Q+*Olp0LC+atXpN>WwJQeezUbBGD6Z|HV(RUG)dGja$JU-uLI z#4l41j@?jmrkoPH++OL(SU81LFp z|IAf$5|wa9%CA}srR|RbJ_N3fO~(2>Z3z(9Fxx&~KY3N}(o1*=&oFQKk{hsjf(>NBKyS^AH|u1a#6WQZRP#4(Uog)<2sfv(DyqK)s3UB zu@31AfV}6*S0r6jBk#y4g1=>@?mm~-x4)i!Ye!0IgXK`ICalu-qY*0o;qcln(nt|}5V=0&^4a&9UNTSI62=mY5wzKqGqUu-Yr$EhX1WQX&VF69 z(|!!qpy2#mh(xzqSlw|JUbKK}teF+;lDy`t*L-}>+WVK-Y;MHaLmW$O0k35TO3o`<;hKqDziyphNuqmg<`udw%BB9Ju|x`5xc) zvBFvBbcNg;E>6OwxTS8b*4AhTvO9v^Kk4b4Vz=)1==><5*Q!HRG!%41$ixjy^^2$JVmj_Qd`~aGN7Rpeg4og;T zB+zsJTDfGcyd%GIp!o=FlJy2&&_~M`%%R*^)ZJXvmRd@Gz&d3v-vYf7OX7@7q3tuO zt=(bBj-KWJ5lCL7FQouzYQlSrI=X*%wX-9i1;BcNn*+}Rh+w_`LuL9K>B4LunPaYv zL|d*4s~u}WUmmE(Syk~k|8s$SA$`^3Z2!8F`Tif7%f9LBNpo4KrOQlh;wb@Wd}_k@ z+W$}`uhXXiK|y64tC_H)TG%tz>ooF-kf-Z{d4XQW@IO;>niW57ZQ@|r7g0VP4veD1 z3P8s0tsPXD*%CERAk$7le|EjUNK{gd$H8ldPlgN1Bktm=?M+YJk^PUd$-n!j08=uR zUAG{f)8YoQG{!0B>tW!{e!%^G<)8aZv32%0+z(-mvG@`7CJX$IfNwhc2&$e$;1`5l z_HJJ7FV4nTz9nkz_VD_Dowu-yaRDbCrU%;J?vitPDp}V@>}qjGI&ZJ?U6d7H{U6iy zEbzBIA9?egssv}mU)5x1;TQkVWbOLL+KjI;9OtskO|3G&wI=~KKVC|_{q~D%|MyO5 z^%cyWCh;ci<1uZ!g6F7d6B)~Khz#TwUuU#$?&zCIrW(TCV!kG^LWye$wsXPf`s!eP z=MR?lPo;T_7Qmf$yISAelAJk{9x%_{)Yz5InYAmh@BATJ4&zw#r^#UPoPIMVx(7__ zyb-D8I%}rNeicL;nl|Hax(lb+hcf_*MtV-_A^QU1rT{(X_69kN+`WK<;8{1k$1-*gO=H84?V$ z=jnroNZBoCuOVg=M)Bb(;7@{#xXOob3R_JFOw|Df`VQex+nME09W@c`f%oFWSarqC zAcQA1KUF_GZ@EtYBC$ZnFmX+tQ$1vpkqNK|+k`ZtPNDEcXYW^H+pMfq%S^GrBVE44 z)eu&Kxg9%9QR*gfXsRWP_B*uBp>w_+c0Su|$6vAsi zT)fYjvUoK=feRz8*L@ifUUnB#*=6^y#bmFnI7eUokH9t(22qs(sArmX=gcX;n>B|`n1m?lz5l8QZQhoXXnAcPY$r2 z*Xs(F0S!u1MuaX5Lk+%QpP>t?YzN=UtVeRl(`)g?<|g`Ic^a@iDYRWcUpR>G^YrOLjSPXIZ8NebhaYz#4d6>Fxx`7ybr3GO}q!*TvM zSfM!)x)?Z03DNFRio|kHY3N+;tUqrSM6{_*K5U}u?kV?_wzd7uPJ>2dj{!{Ih4d>E z+VXYbA%v+xKwV3(&4Rhyt2s~D68WK0z;b3K%P2_ii`ceiTv%(O#%_OVHPapAY_vxI zwVI&wP$j*y(6G2Toh=m7J$d8oVyKS%5REqsS#3MJL~Xv{>&eZ}0?;#y&#*~(9!lZF z^q&bDD5Fc2Y|cY)wPRhYtljcf=Y6GM`f;;Ye-H34g6hV#0?ZXr?I(5tl+uTD)=033 zD&K$*Dl6y&%aDLoBt&*}+_*}61Q*eI*AE`L=hKN9qAHQ7&27?Ua5MPOise9XFR$$% znV)J^eQI!}VN3S4AXS%54nk}fgVLN@-=)>(Yvd{l`sy10D~*kqp4#{5$c@^d6jBX? zyrDR;YEvVN$Tc7Yhs~^cz;uWQszkIZi>w_S$@fVKqe(j*gP_yn%b0@;7i&SEA%_3k z=kFlDtMl8di+vV&$u;E~@KrcY>*JM65|*dUt7aurzVtH8h6A#KN!iBTEi%e;YArX? z-sZ@omfls7iFZTa_M6omY@v#I(H%fy~<@PpN*mF0H9^8_^5EZd8gL|t z4K#~;2mK=2b;+Iub)-a?_R!O)jUoN+=uR(D_Tb$7aUj|){aoN20Oj=j3`O~oeo?z> z8OX?kACFZLC*wmxI@;qKKR>*4?YbdU_>04Q-bJ04x{{743LI8ei#=L>(D*8fakKox z;}ELp#qK>CD4C<&qJ0x#AgRl#=od>GFvCWU^v*g+0-}X(d7mv(O5f8aIJ~uR;38l; z;!qhnOEhIRw`110 zH~9IoeEd+$Gmg4&)J{4n6jlL`pWGAp&xrR<-CtK&JsRDzY1;hdsBwN)?UGS2o#<_i z%HT6mEYDr#dYHxCuylR%@}+}-ODE_nl9V(K9M4=?l}q+Uxz+?Ig@?iduVZQQs!yK` zZV937_CAnG_*M<^#+rPoG3mnZl6G!BnAwD06W>u|Bg~|lauwaonWGdjLwdswUi0vt zXHK3#RJ)7p`uxJa_QKj5W4X%bk}el17B5z94Cu>j4C#-pp8XN_O`|CIvTnPDVSkO) ztq{sE%+2+MY4oDC`d3E3yWg?1d2%X!Sm`9gvX-m;sitnRxSRWXrmm0!KEauDtd!P2 zF*RU2qyBbBZftcc#S)egY*3}HYC8L|K(l?wMbDxs_^Ma*DN+nQ`-n;+ecqn<0anq<2!W9T#3 zlUP~HZ$bpEJKvW~EPu)d6;tq?xs{1u&G`Z^X+Bn_%=yP?eD%_D=40|NZ^W!OdLLZ6 zTMh9dE>Utq6J9&@%&lnJY_QRcMcq4Xae++aqcq17!xsN%A53q7{7)bg6F!S?BgWpO zifjN}^UR!yx4&0EzNTm6pBz!!GT^pqrF$!Lp-~!#KfGKgwN0C@p(VO~pfzlq zpiC{z(8iR(^*yE9sH3X!`ng&eQy&kdOf2rJ^XrWdrsolzwzaZ61#HS1w>mv;Ry;I6 z&4;=voPYHgpZg&Cu-sww6Tkd52?pL!H~G^|e2*Ga)E!>hOmXuUWX~1Nh98~wLvws* zbU5VwEKh?;4@15>74-`kT~y`_1H>cWJKr(gFU^kD_3eDP{;R(i1j z-^8J>3|N^?e?IKKngizlGe$)m*zxm<@^>Lp;r>)$ zv%@#LmdY&)`2ZHf8-yk66`1_z&?#k|9>wC<0Eda9S-?$PX)*ZJ9s`Z~i&k6Zn5 zG*XXcpL;R|xj#h6iIi}V9({T~c)AoAN^O4jMd{cy03IBe^GBvdyN`T-F*GP`SO^Mu z8CY!(k{=TqaqnrOv~=$v7ErdnY*Y1aqE!?>6IV~7?VCrQS0CGF_`mBZ#-0t zrBFHDs7v3mXp?koN?_nUw9Vhb6Fr;p4qvV?gz|7B*S^wX-71++P>V#wJO8!*(KONDhn+5?9;uJhe>W4ZUOU2e1~AUz zwMzj+#8_%rC^QA&y_NNy2fl`{&2+0p))6A?55M&*2@Wdc+crK9*pdD9OKy&B;zU@f zDqp5w7M@PF3gGGXo-I879V_gxQRk)fC?N)``yWmeylCSiy~x7XoZlODL$V!uoWw!E z^xjtzij3fbGI5E@>8OP@;PJA9ir17{=gA4E{8|J8p{Fx%uP1d(g6a>JJlwFwNw zyrM~}^J7T>mEJ8vTKk-3kKiW+*;SU+Px}}R-|1(}V&bK*M+;+hZv>HNo;x9I`f5&fA=;?2W#qoE;PE1UA0TG&=pGgnMD{2pss!|@1|3_d^B|-xc zBU8HZG1QVO*HT|ZiidvYxzBpge?^Y6<>EE5@AAdY1T8#G5W=n1?VfDg`JnIdNvSeN zIqHEDK%JxFtbDY&y>uFM;dgbY*l^fq>d|d8kh!ubY>In}51Kp-ho;hcocet0cba*-;!?{QUQWLLGpIL;>tYi|m*<;u?Dfnd@ve^`9f=Mz{c(SQ2=(5g7# zY+~o+rLC_o)@Q54Jp0ZFha4yq2>K7c3k&=5=c{8`xzn&k{?AC~osfVluM)ekH@793 zk>5|ExLropUUD@~+k3WOq)yX|_%eeA@?S1nuk=*c-grByklU9a^EA3$x>(F9Q8RZt zN_w?o>=&U!H$fp6Kkb}=&7HBO)E?ebDc+5g>rp9VX_~J-63%YpgLG;TxN-XSnAwCQ zCjIFb>~b`}+?QlMb=!ntZvCT=0PPrky&R<)y8M$ds~NAK@jF=Y^_x{W-~CJcZGTgQ zaBaGoipBJs!Hd(TN`B7o{`_F>-D0nc(qMxIk=~PH|1mkcbTgg0t`0UhbE>iAccu(x zQws%Sq&l-6qD`tf#E6@gz^kv?xONwI`^}3jW#@7}%jR5vf0`h7n&3_aBb< zRNiv_dS%4%!v}Jf1|lkz<@&pTPGPT!PPPe}pedAml|L4FthjG90fhWukqCI{e$IDR zm>^pB!a?4bO*`38Bc6>ez5q-CzmeE03TEsXT)(i+Ket=lQc0orEisflYCLR1^*xu6 zPFTAtxe3MPd7~*2CH(HiT2;$94oZnj{f4+#ALtKyJj-wEve(jOyMMEQf3pcw78=}9 zt)GRof+!2r|4FBdKk{`sF#K&^ReJEZytN&5Y*heQ5vQN>Nww~)q^TX1eL}^G!%_mufP%f{XV&C3Dp&cBH|C6T8plz3{yn#zr z=C*DJgc!=S@TWYtH?8Y7(ykla=T!y#%TNV4CUtrx;#OmRl%@!Ee%XIub}3#KCJTtL zqt3&c;b~G@NS40F>nY+8q$Qko;(7@@K=b^MvZ;Pb9xT}xZ+;J6B8`Y<%>#aC(9UbD zdLM3ulCPgdkTgU3(cRbI`H?F=sPAHq7vRR-${wl5o?8{(SdH43<_7kliza}MEf7k0haK6-2 z>Z@>JzZ&;Zcdt3S3=Vm&{P}VOE83y(Zs`fbgWf6@5ZzWWVE-wy&%4|7z~`hEKF;0aM@pk9Y7}3HDuBh3rL+!77V4+&wRdqQlf!N@cd1 z{z}Hnn4SGnd5>{X`Dxp220Zh-DDtCg02AFmB=GUM`J)Ny*N}wk+qC1iaj(OgPiJf!^wfD(ak~eYmV8=%eLesppnmPN_wF^wu}pOPUu+EE z?30;)(!@B;!`_sYPzrb+#yYS_1Av=xXvOU|A!->PbVdI%1Y}F3p3F!*Dg|g-?R)4N zP}w?wGT^@~Ij zOXQc!lfG#?r;PzkoPFl4p743#mp;9&%v%(Xpb?KBo#-PTbV0p^q#jX5g;d7AUAPIl zc5b@PG`VZC=&NW59C4w|HI(3Y4sG+e;oK3>?X~7*Z*CE&kL$2WaCM|tl_>ow)0u8C zds<%6{@P)VS#GSmGL%trvrECBU|ClLjO1u3JT9nVz~^lE=k9KH2TTKuCJ?DP2{K(x zCdLFGgXZ6_ck_;IQ>V&-Gv#$GLJ@{d0|j~H&trxK1-m%~<-E8PF-sXeLW=miFJC(% z!#MN>)=-Qr!QL;Q!G8-gW2=2{H;OBUlRXz0d&f{05Uy85YRx!yGQY)f|aa@c=^|9l1d#Q1ibP+BPoq08-K`;D16}D*5c!W44 zCpRZgy#Z%{{t+-VNh^xz z&ejZkP4ji!s+(?n2U@8$jP{kW$sRm0B9-kI?m+SP*!2L1Yc_zxiLCKXHsI2-<7ZtH zt;Dr?x7>i${@E5fR7E26Xtwa+dAg9s{bog*Xum@m9bvxjOU0elXhMqYII9}vo9;YLK&aHh8@uTo1yn*u>yOtjP3xT->9)^O@pDK> zSs2$-LQ*!1F%z_A;1JUMr-ZGsegj6?o2{W7Oct;}Dqtc8g3MB&I+2%^@+f7$X<6Qz z_Nr0=cj{J0)pbUI!<4m&91YgfL(@^tLzEtqb?tRk8caB&RMo~2%L+fEF*oL2{R{q* z?>ZRPa~M*1++)pjx@8__xDV_K403d%8`=z(bV@+}dTh{WsqMhfDvN#+C_IC}?n-vE)M;1t#Lg*gtPGt4a z{wRO&jQ=HWRIKzBaZ-($*!50lY|w-+1T68MsVO}1kim}@irs90e3?`69m^3D?BH4% z5X5k%<3PwhW6kHljmAin*B&x|X6KfFbemD|`}y)?!oe6-UvA;Ve^|IOh%$Hh@0Qf4 zY{Odws(bd4$=pj5KA8IKv5@^-o?Nrr;am@4B-f%GNzj9H3T{1%h^cUTn*fq@r2)pz zH4q!PTYOhg)o9Y}d*7J{-8YA{Z=K~9fJxb;v0T=YCJN5viHXwFUlS&^88iok4=>n7 z;GWv8XX{*9wE$x9zy4tGHP!(NyQPB!#gH@?Y$pZ!uoXCJiu3itjzZ~m&Cmcb65M*Roo zz%WED^3w()w;a4D-c*~Jd$eF5xZWQ~yXNy$XW{++lHJjfHy9Fn2!NABci`RyuBBT- zc8#U(58s6hSfkF(ioIM5H@XWnV0!iL%2ksH^*8W(HsLJW)Jc=gbKFq6PK zcvq-(0YDe%>bvY`W%%E#44BaqVECW2H{>|g#KS5Wc$i!oTgK8B_U!55IR=rACeLQty=7y+k0bu8qVP&0e_brn9V*pe3oWr z7MrmT-`)!Fg;WQr?6d|TZp3SxpF+1{68$k^rz!aJXWdhV)t?x=0I~-W_&*B zE6|Vt6-*`75h?br^qM)47qrvvJ+d9Pt}% zmG{P+qDpnN@64U~NOGe!Ik`TN?hH3>658|0W1uPp%67cDIvt>xHFS5heTJWW_t z`mRFm1Y`D>616~zz4^V&1RpzMq-wXc%f@V*KVfWII%x01v;<07RD~LK0|RbuoT+MC}oC3loXPJ*)9s>Y2f{xoD{8(`!;`vAE?vx zD+KWKIn911Hkg2E(970k=YNCooRM`pb84`0@kM>^va^S>1@S8#M`8){C>LJq7qsL8 zXZiILTKm||jvUjpV&MN}0jy036O~`D4_@I)VYM4F`p*stX}kCTxO(?MCja+;Jf&2M zN`)MjB$cwtF^8>^gt8*3uyv9o=bUFF$*UZ5NI5M@PT6uk%|_106>?_I!!R@3?C5)Y zy+7~I@B97zX>QxS+w;1f*Y&s_kH=F8izAa-3^0bi>JjdmYFnF_@9*m>YG;keC29RV z-QH3$SK1*XjW!rNP=C))qM@SWgU7DYY5^9(%@Ea3O41I-M5+1Ty}4=Lv(g*x?Ks%j zoOfHdz`n_GV!O0uk7MT@E4uq~z2x7N$pYF3O8Q-J4JV*e?_(D7Tj8)V;oWT}T*-i)ZT3%9-TJVOV3KLVg>Hp zC;9){>8yQ4?fDQYO^3*q{HU#QI5* zKaKPR&sA-gyIm%`d@83?&O*;a0fXO<-S9NT-x?@(l~XAg!>e$YsKweViDXj-W~uO0 z_8Y)C=Vr9t{!e4y(@XsPt;jJyZ!4IU)+NyRD#)`X~u@rZ_j9`!wfs(v+TZm|EE^Vno~Pht>En#s-_vLguBSOs<>q? z-gMI9y6Fe8MjnT{{PVTwYN-B>__BAYsy06bBD8Ywc#!-y#nCv)m;PUOP0pXcY~}B< z8+On@BrE!X=SR8U2l>pXf?m+K^5()?zC3gxW>z4~6zW#K{rwvXY&o`Ft6DBaf~uDs zBcv`tWG}#RumTT`smD@X3!yS6-tD_**yb8v?)2UuxS3>PC%u0vdjI1a`$aztuUlZ2 zWYKe)`&V@Z75tSaf7{H#(g$5O{5SlMKOh^Ae!mj$N3>bWJ z*A2zJd2EUneec>J>=Geb`y%>5C82k`$$QUIxGL!4?bESSPfx9$^4u%gX96{(i$CA; zlRwwZ!KqdiLIPFS+TYZgvg~#q6?3z)?ecGURTB*2wxGmkxUEdn{HXn~%I|mbBRz{1 zKjM_M7jS>9&i-&gD0@n1P$m6{{9yL*{(sF<4*A28cqth{yiC?nnYSK6C8zpTo02Mp z`)#mB$tD}$f^u~J%Rn8LCQn^U7Dk>CE3-BAb(a25^#gLUU@XO+)1^SdF6EQ3S_In z*28Dk)GVSk8#=$oDgjJX!`yf&$&@l#i1OiI6QGC|muw=~McFK84JFIylJp0}P`ygO zTX)vZi7VFb+cC}gEF7JsnvZ(F-uAFO1u56!kM5!>(@2$2-&G{ZCSW^s6b6Sz2@dhd z&a25NaYdhvG=oXQ!VD-tXM=S!7>_(J8DV6QbiGDuJmJl1z(UU%ULZW6{mW%Rky7oS zW)WCWvoM{V{XF=uFxYX*vuz^SM*rRwElXIfMtaFn|8-$~zRtK{weAV14z)k#OCUtO zv+cg?K?i$a(!pILnCdmq`=?xDl;xfPWY?21N5~hLYJP6{Oqr<#$r95+)`9220OmZvW(k2Bw$*JkrZboFsbD&cIo%#EDPeDy2(y>08 z!IKR{@6$xIMGZmAu1Gw=odO}p3v?P1HJ=CbYyHlr_qG~}{uBPcZe^UfwattYY?4|S z?)3YE%HG1LueW!Y05n8h+r=U~+*ZE5*<$p=K;+Z02LG!O8Wr!4L}(i2msI_Z zuHYUm-qsvXU+cXFc{k+$LHiW?4jN!JmW*~p6g^6PF4hzKCm~}A@bwCq{G?PfiphaI z{j*WwVT8^N?A5Q1)=WFcGnQ{MBTruW$ZDGLrjNecVh~`wWaVGuk}!Gdj_i!~P`YcI zG^O(EbG(N}-_44_^^)Bt)nl%ddDDVOlxxu#cj2Ej_I10+2`xulu|-R%@P|I?rZ<-@ zVRnWc(!7yn0dxVCZD#|7bJ@Ii1&dc6g-~z7Ci{0My7%+C`@$~t_k8Wowm1!@F^R)$ zBY$ka!y?TQ@Bo>g994tq>zR`6h?5v8;r^k3pZ z((+pm9s4;wcRtVUIU?+=yS2Wk{MOE+U!sT&Q_}Up$O*lNE0MmvO5^)BhY0dpB|?_3 zY-xfA88wdQ|G70D_{*YdquC0VHxxnR9%O6>|(UPAq7x{ zHXYT3Jo4B4^6rA-qsnusm%kM5X0VQ_9KOHO65rR<-I0=|u8&T{kFxTH-O5xWBs79P zmiT*=QD{sA+0bpjp5bsyheJuCgZ|Lq&W@CyUy;SKK^Jc4PgaIL3-Z9T9)?NT@L59! zQ^mJ}ydJHkAi=kn{#;w>ZIbl#GAHae8=0j_dHj;nmm!NMR2&LX^*FAA(k886%e99C z_-vx-d9uwtPbY7HT=Gr5YEz-YWs7h8RlT4Dg1!H>>*fj4y10a{WkKa++q;?cfTcqV zVM^P+d1n@3KXkR`s=f!Ie0bfx=3(^m6k!WC@)(koz!f5vmFU{j#g_Dv!@Fpho2f5Hj?84P%=#r=o?3Psknj?IX1u4J z@ANQ@8=iN8VC5UU1SdnU6*x{*SqlUI$)R5Q%uRcv(F_<{RsJ|W;W7o^?Pjn+f$Slh ziqhuy`tJwWHivx-A4GGj$Ni}Z^PuCp6`NJouI|!%OC+UW&eON5 zt`&_>rO?A(`@K3l^RKp~{@k)Tf!FU_d9&-(z2zM*)8`);FL7I?FZ(;@gO1Ki9r;EY zX=Uy#h3P6GME9;RVdsvKT@qAVej-jt%2W1^zk%L9*`bO7Y09V)>OzxM#bREaD4m(s z|KJJFAU;PI^RX!#7%pqp_B$5U^X!HVw3>0(oBTvFKNp0|p`Sp7POs$wEVFBZhrH3= z7wx#%2YrC1-`JkrO!oKHvoC_oIlyp??t&9eUp7z|rvu+L&Ff4tZcSbbQo$q*aW<1f z)YhHi>7=!3XnQ1d{aPl}1kyofk+w&Wr{;hg z`x|_qKl?uuF2Qd0Hh_mh$+1O`ROR>EkAdm`Qcp&&``b?nJdQwpI%Kqvb3exjSnn2o z5e5e&76jN5k{TIEd$g%R$Hkx8Q|oR9y|RH95!j_s-(_w!3;!X9O}lW{6|}VWx6?*P zGT@cM9F=OdvT~@L=45TaI^Ym?hBtTtx6OV0s)>d6*Z93ZEGk^)$DBR)78Yq1kT#rs^_8_m^ap zc9W_h?$lRgSElX}X8MngfOu{@MPJ(?aB=;bA5TB;B;kXn+`KgP(MH>s+f(iA?r#pg za&xvH*-G0xGQU9XL(G<7O{>|+qdO2ijpJ%h0+O(XO`TCjZZSsvvH`8`3lHUDj~-}( z@6^1S5z;oWYwGVn>D~Sd!jQUMTleBuhR^h9%7=Dr55I&v_OsR0q_+cOpjg>)aXWtm zzhHg#g$t2VQ1e)SF~y3F7#Q`P5L|gdwDka8hFMFHAJc}bWC0q{n~X!;*Ws}~h7sx& zv0Omi*_&g0xU=LQOL9-nrlV$!hC@-ZmSgl09iLNLuDMx~eXLMWciYSzDP-=e)gM`% z`skxjisNbQl|%red&t?B%|2NZi_@+nsbhzUC~Ixp2x@22Q=pcS2-&^=H|UaeP#ZI*Cla4D|EED&8%gal9Y9H>KeGO!l|JF525tkCjYVt;6CYEzs zc-aQLOGqL{HR!`qL$0gwM;mMCYOgrV#lKtnon)KC@;v1IwZw_Y+h1cnJ!;+uyUZneqXsy^2u0;Wc;hg$+Fx|Gp!78h z31kuL^cE}8#!h*N#mue?O6hQe8KuO+9^YTBt3UB`tHo`fu{ZRd$NGJblg?>~M=B?% z=6o@j#>99!pM;%=v%N2Kcc(BR5P!A(ooP!FPzZEj9FV{0CC%rD*H6qi@&<7ajAHX0?n`={F@xTBHFP0tn6AgjRhQ`Tc;PvX*CJn__TM-;QR8IQyD8;_qo`4rh`~B^ zarzk)Kb}kCQav2?+ZsX4CqwfbEPY>4{67x~M?4MD=b;)c^~`rYeeKds@ou2Xa`;dC zZ;yB{E1R3!YnWE*?c9cPcf*+~v&!Nt1b$NAf zL2Oj@My&sOl6=GOdhXP!W1@!rC9g7Qi;2N11^3tJGf61S z(jFrc%;^C_^O^_CI9w|2%{JthjX0%g*);nuPlIF+WF$AGQ&M?JD6D*;{`2EA$L^S| zRJSsLIsXuyShjZTa@9H$) z82k^)d^?*<#l{rxD~ISJtL&k_1UcDkCE7f?MYa92`nOX&NzQ>Y9_Vg>Y|k4pp>yk5 zz-=oqs+n2d)b^HthjI@w9M6NCt=t^1O{RZ8EtsV0SgAB4D6v7vzzBiU!Z6FJ_ox6o zKau*fC6l-+uYI}8^Alos+&;U1X37Zm&>FT8jQNx4wB^?0e$B0;qqbowH*7+fw?ll0imqa|jthO#zl_ zxaL3c{j^~!o93`g{6(ST5jojf!;eEUuBVf4_gdv%3ydrBP$l^Q-L$s!T`@pqrTWS+9*Q`t`3L7F_E890ipUR)me!fSuqia%;Q$<-Jh? zSt9s)8*Ls;Xif&9FyllUiZ6W3OFI`lFK~EA5*tKG`U1w!WBdtxe)gZ$91mCK`Vbkt zzO7Y+>GXv89A=aa7q=rbNiK{hOtpV9X3qT7H$Uc?i`j6cj1A z4zq^S^Ymm9sXyv31r<8UdX5qw|gF{xlGWos5Pu~zO($E54L7Gd|0>dYRzjq~ehkkHuYJEkUrfE~v-2mA6BY4A zHvfBx0;F;3Nx&APdBM=pJ-*HA|F)d}Q~$jXHDfNTkWxF?vjroFjAwn0R*zpc$J3rx zmKCz~YXLMiQutXhvF#+eSGgKFa!94MeG$5%UJQVoKf(q5*G`D^41sF&iRX^N$NdIM z&RlHU>x}EyFUyPsMyTXxH4ZFNs$)ZpUoqUWt#x=4Yj|nb;@IezClh${Fb&>elB@;o z8Sb3{<|i-hTJ@2EV&wF5YhSOZ$|BF-JP<~Iud!-&rKL6CP)JE-SmhHrpU?L$Dubo= zva4TirtYt)9Y;$)`AQ6koChF~>Pr$QDK~0}FoRBZ*Dn2481FdE;+n=gCJeT3*L&dD0{mo*)!kn8{9>E`{xWEqd3W$2%mI zdw3iNYoWv1l%jiWQogtBf+=7X-jWACJn6kZIp|!e@^MeqorV}Fp8*`D>7tX{+Vh>G zD#fXgaui2Qwn(90Ywv@laCg04BN&W(wS5MExyyUK{)r{6#5TAU#@!WqEA?ah`jOL1 z8Z*BZLajbQg4Nb1T0f}Up{I+C;U^b^02$2Tm1}yl{riUL(?R@;Snm>1e>=ZqSgp{l|C!kVj7@3C=MK`BDG#u zl+nQ{O?kEyAG^aW1ap;pUh+vL6Rt2|l>jb&Jt1hbo zhgeu2riF4lQq|=V2QMrFB}*g!XTG?%&=A+cTd!t{Uus8BUK!fHzDH^bTbOw*FyLy? z@};(n-;B#cq~B*qp7P!Ru<{_ZHaOKi+V{vF!KBDbMf?%>Q5A=+tJ>axX6yeFxc1JQ zFt{IB$lBIoL*k53pTR=Cczbin1 zUs|dRJ6n}C0qXhN>5UU{6prazDV)nwwanb!(22dkGk%sJM)Ud%d;XctF7%U|g3Yx7 zIOBz%EcSUV_WY03DW{&u)iYC8R$yxDJyaFSa{qyo)YBn5fJ^gf`Fr{P7<(h}xG8vW z`j6{O-Yp`|o3zBIc)j_0+yA#4gr@PllF^Qk{#-JO%@?SG;NA1`Vd;gJ{lLr*qnO?5Ki7PjGf zPMxn@HdjQE@=@mx)#&H(g51dDYKtTNrs6UCBhKVqQ^#NT8C5@(CH!L2=EFE~1u+`* z%Jc!{{nAy@l|QNmA&=~{#m<$xUi~5WI;OsHVv+@QRjlx?E!Y-?-B$m0kF}B0N}^Z& z?|dHjG*PO~nE0L}k=by1Aq>twHWt-I`MT<)+?z_he7iN?ARHKVRe0w8Wh`KySTn2h z0;ZaX*7Q$m)&<#Vmb9nzWi9K-8ojI2W#w?fr+b zx9~Y_=Ki9wsUu$)a(K$0OJy?a<58;mD|5S29Ff_U)lh&!>8h$8aGI+Ua7Xkn_j!T| zVe}-g-A8K^R0@^)2Pxm;m|>^t_jNz#bPnX=jsPWUUtaqeT-nG&BW7hO6nm|;`HIsc zS2QtzAGVPfo*rOlxZW$Z08nmPM}vv*tXtUl8!*DoBa!7q#dw;EnS6UgdG^X0#XmTk zq*{<&$7l81r%(c}$OC4sz8W)CrUs0a23*o}wOJjUNzEHIO1Zq&Nw*^&2`AWO2x9fKJ-iN!E1ho0rHGKE!)3r$~e6PGsH11}EjLkC1B{^4kfd`YkwyWd@U)jED zyPP{dDI-D~FZm)J0|k$$g3mqwc@R^}V~qBNAM@|hu#&uipQpbgA(FGskiNaC-jnQL zsKFb4xv|K>1(QQxg}4!4WG4S6Kd+Yo_-e;Sm0gNv{|J{0j(f z#Dc8CPjIsO3xIGReS%6T@l&>I_FI`fw=0*E$~V*=U;>AJw+m$sE56&8N>P`SZPph( zViL@FuTsG=J}zId8%Pb0$Ehu5{`h{ko-b^TYr{iZaq7=wDDB6PcFpP+ku}ZHQInS? zA4bj6Uh%`(OrYOv%28=P1DKaviSL#B{=MxcyJWscOK=GVOV+#JnXU}_$NU^GAM|GK zdP6{6f^ri*imIvzzsNt*47S)XxXBdiAtUOfs~%X_>NWh%ow~1rYQR!+Y@y0H5Wwy0 zzd>IP`<=@Os~Wnyq|>KVM!NkUZ0v<-h3boZ=Iu-FOQ)U@Zw7h#u@0yIPXp|}uCSR< z^dzt<;Pu;NASaAJse(FRJG%E1$Et*tbf2kFSHNpj(q;;{pn{$Qicwmf z;I2HXpP~`fkUp)Bhn{=q_xt|%Zap6%6yE2KEO05ZPe#rCY%&lHNwM)Jw)-CZD)z*+ z9o{JLM7?_yw^sI-A?HpN+2z zn8$wWkEQi1p=l6BtRT%0b3_5^IM?{M`9EI}Q2Xr?-O=|zY0mM3s>xjS<-yhkx#JJ6 zdpHiO-I1vH<7>7E2J}wLy0;{j@v#`Br0pi8D6KjQmXZOZhW z+W|?w`vnR317$=1)P#Eaf={x~gm!%4*7>&!{yqEx;NV{XSY9jLOH*{ZBHZ*8ysGn|~)= ziM&(AHC1vt@O>M8&0vAcGhW@120hwO-K=c9k1%w@9ILjNKoR@MC-^t$D_Z7(>wv52 z9iHg5QN&~)5aZFTX@PjZmPtL&CNRh~!4YDKg-z>!wnX?TyaawSF%o2^>z@8pLA4z9 zZXJu+M80$^7xvP8k4%`Tm;7_2G{^6u&NAhe1SWfsKAndT)D+A8CT5YTJ4Z(h5y8Cn630xu>e2#+B@m-44?s^ zVKSFN70}}r04yhM>~PRb`~x%5&#>WRXms-A^Unx$L&3Bw4MonKi4^4UD~p1nYo=wk^K7RP%L#2*xe`EjK+< zvPb6%rIpupc~uxcwMB78v|kL3d_Q|1aqz4)x#$M&Ky!*N>sZ?Agr?R^sN@=+24K&* z{Sq)*z@+>2raIXGj+}xCfC+8(4_|cl1!p9o&h^QSx;TNEUb}PujOuJ>cZMw*iS7Do z$T!eWf^3=IP{4N1JB;A_ez#$C{cqEM!j{YY|75cI zW@41JEz}Q2T#|$*?cnnMj)aJ4nHwNKQ$IPLeQ*Yk)%-U!W5q=Zx##+`T!%rG!UQ7D zhuagxK2(sdbFVnBJM+<`cTg_?d_S7(Y~Mt_kIIS&l)fI%eL<)S$S01CpVN{-o&PO$ zFCQm|h3H6*2HX+^jL&AIgu5yRFx=;2GxFS8_Q8+XnyVqxrP%4jLjfV3&(#*3vb`nJ z>+@bn{>JWhOP#X0PxLUeFc$g8W{{TGRNWSEzSp`ph8=3%D=x_MvCrK>%bT^fW?CGg z!Q-L)FGb96d8q1uQQ&k(dxx5?-}ztnCgk`14^)#J{6x-hZabuntlmUL~Q!U+oBfr$49 z84@qzj21f4$b(y8FCXEPptVWV&=}>OLC>b}5}%-5Q;bp^1mVvSYjr|1rt8sIjBe|x zX^$c+pNlJnfcM?>pXDCd0*Kcv)F6DE?UC$qUf9Nrp)*SubmqrQ_t89iaAoSQ=(t$w z!|U-g4Kefizeres7e^QOmkj?8gRxc6>^YmZQY zXy*_D?rf)O0;Qmb#cu=l`&o7wGXph~=!Mb%4O9Lg1=+&=VhgIkQ}JK~&Zb^`(YJX2 zjtu6o4TPSXh2=j3e4hCk1P;~wCmCQ%2E#rUrvmT00lY6Cmu6FtWaTy}5tHO}jIH(D z_g`m-{ZlqXb$3HAM*D=C-tP%EdW7^7q(sBPx}l4R?&%I`OAA{t8o-!>rtNepV2tMj z5Zf-MitC2Fs^i6kYL3+sU$*ieKl%Y>+>l3WIU$^6E})ig;6L-)0fMD+DFfhbrkYd` zV}k-my_T0hv~Rh5`!y=S;B99hVRQP}0S;U6be?jM_YQh6H+`o;Z()VL?+am|M29Z> zN$1P>_SYi(Ev)O_yyK=B*`+O!0^?6ztqPE@+q?sef;=`Y$L7ORKz5QZA1rZy>)hKz zc>BK2ri-aI(%eiVw~t`@$l2R$Iy5HlpP31a4mkaHfd*UjQ28HF>Ywr;(4k4#7C($J zpD~8MI)hQ=DK|+TIZi`wQ>2AY3*2j)%VRjsP6NUrzmHO2HtWgYN_zpB5Pl5#y^+pL zXP5=9G2qcpE;8Gt?i9a8ity-(YcbXZ^eRcY%h?m4X;wPQ-7_V6kKVro-65^W0U{ zWMc*4m_Y_%aMK)Ozrs%GsvC@E*??Wo{)?wvq8;4=_<4Dd;uoeXw!O-57hQ`gO?VNr zO|59EmHoz!#kn6ErOen5PSL9j4~`P|pOm7QMtOcO&y8=M%6D503Vu1#qR*eCYb0%- z+`ikcRXPgfs(#z;{!Fo5_t#;Pr)g#zSPI%_e#9DGJ{dtMB7dvtMSIyrEI{E$*PgEQ zE3wl2hBWVvJ*nti1!1Km{~ZF(?yqfsDjGPdL^{&)U;ITM&SK2Z>(-K)4)kiVM1$5+g^vwxWXSHJNN**J~5)6-)8?VuyG;DCtB@Km1FB z@RsYDI<|*o{k2O^f%AojGN3=vv+Y_Be)a=;-L1TM@2cd1+F&scfb77*mw-(rkYC6h zF#gu}qC30Yum~;SG*w&pG=COk_L#G+ zZF(C&ycX_Q8~HM~zj2-0k+|=m5f7&+o{XP}y_!)t)C!pFV&3EX{aJtoNOo z347a*QTj5ef{)Ia*n4%4)k&1;&@Pu*g!%k?{*!W3*o*`tiTvB(`jq*S zvmB0*067=A*E)2!?6DPqH&ODy z)_nu8t*gFyqqnM7qq@}%{!$peq^{TCyM|qh9M5|Po0ut7-%lr#9qwf9+0MH+eN1ts zb=N;8rzf_7RAYz2*3uWJ2F5brdKX*m%IF9>_c>$bm9XG6^AxpBeC95el;`^+hWAMS zmB3=EKMU6s&X#*bQ4a(?rhQlwwn$%UU@IFV3EL79sZ~rXzw~jr={@o|*4Y;Mx;~aw zGvdCa(i8tgp*7L$txukNRQMgANRYo#!TX7pVEm(cg%7?C1~yCRx%G8k#M{++n*Pg? zvz)rE@5aJ48^K}i7IABBs%C$)S9uYSnrtRi^G5C0akq^B>Lgxxr)d{pgtX_ajTw6m z&>i}tRv-k9;P00iIm~!c6zmh$9Hv4KY@~4a+O9A!+OCu~5#E9Klt1Fvi$U`FYT`AT z?y>uVw}>7+C%%>NTWw_DJ!i4_zlgq$*Dt)3>qECk^dV8oyPBW6Tap!V_?HZBh3GS;3f*wsWC zt>J3W^2f=!?B+aHSozMeM`EavlF=G`8euMC+t!fU8x*7bCf+{O=hX`JM>d@dJ+|?R z(`@L5?hT&bTo&6=a%`h^?Sx#1+=|V!zw24`Yvyai3n&ICvu{bX?0t$p$C}>ZHXa)E zL(z97L=sg5g8KjQVORBf`{F)#(Sp{Z9--lLGBZ^~=62U7oY6u*%F?o9YSdr1wDwY= zB2C5-8RbTqilkKv#~iRritRDJXW18r2iwW!Jd^ACJdNdQlWLUjl5h9YazO1B9Q~Po z!XA;Gm$qzG-dDkEgbgSVZffyG!h@12@bzi)8Z4tJ?k3Y}{e-2JxEn4z9-?{*9?+m% zBRS8S_Bp^gT=gsaSP$#$oX|l!(DcY+`!IOa$F4~Ay?B5w$@lRp!+FwMc)9Ht(T`^& zDF2&C(zf*NHimZ4yB;9+QH@?0P{r?eQ;r9Xyx_a4HQwZ0hs}Ja&vUx1ay`3O>=#U$ zn+Gd{obK6Wm4C>~?hXu0h?xbaESUM8EXobqO}^F!nLR$E`gfzd`npF-74gQf&EHYs zFX_GB8@J~knY2At{02Vu{X(>xJ}!XpYq(9?ZM4IJHZtGoR(`fT0A7+k$^Bz(qxTfG zv0F^{jv#8-$i{yD`$;W}R|?cTHHA2jY)#cLe20PK63<6@3G1Dqd9k8EQ7#L%HXt}_J6tO7jI0cbsm8XAp3dtodxk-$#gTCQC@MqIN`H;>_X_1X^QW_Gm~7!u~gTG2q!MKs(b0q zLOY;@sdKGmHYRCbV5lB1qbCvMm22+4&vv^(nXg(fD+d?l8UkT;m?i6PhWXIzmsE3| zc1#PaMfe7)x-ndA#`Y)xtNT}HQO$4Ue`~7DCi&(Jb|6j)WG)QBCTQHg;q~^C(IWjY zb4>if@)GDlLe#eGJezNSs>X}vN?nCOio|~!Q)9T4}QsC^yNDTI4kv^*6IZ ztHGC2tFS(10f9k$PKJj}!WHsy_u8;vtsb+aNY{0Z+3JdkLc9f01 zwb+j2d$zF3{2^M;IkSW{`Ral@LCIYRX~a!c9@fmT|A={>(5R)5XN%hEv<+2DeI`YA z#GoP7!q;b6FFv97K`e;1f^(I{zwMDHh=5JGL884VJ;m?w`tz-&@6MgdZ?gXxdQ=Y)HCDO&03I%Tg6Rf#Kuy++z+;e33m9y^|1hI3s0d@kQgt6e3acW7 zEd4C|1fz|5S$*mT>ZRFK8~PxTw&XwHvl0+%kC#{!k^7r=EM#Td)md-{xnl=QQ1zjY zBrTh6jrC=})H#O%`Rg*i)l*3&=s%U@NAeoc&1>6|!1i6yF?>^@Ys`6y!?JgijPK^= z80~}@8#_GNB2DBo}6 ztHt``tfiylOT>p5f`{Q^&Ve-pNWY*xDW#cQ3>)#Qa>xY_E~D{_SC(45b)?C;ZP3v> zt7^mZ`WJL@8WCf7!I9lYN?NjK}ML!M97yHgGSF^BWTEP5S}ClUF-F+ z(BRp}9WFP;J4jWTa;_s(dl=OVX3{fnnKAPXPZ(>`FY#msSX9i3bLZyEQp|&LvN6lwekxEqOnhHUjHd<-!LLc!WiCz`7=F2#WPZJ*6MVOp*qXIz^$swlQj$Xw~EYClvySEo@8 zpOCCGfF#s2NS^6M8}pqR)fr7bvsKlcNsfEF-%L*eB&z(1QDwx0_QtN6uK?NbuSi<)+{O*qsUGYO8oRXOFN8kUO6lueInFN8Znf@ zH75ENt)1l?wc0Whf56Bc)zi4yS;08xK3x45uVra%C9uMs>C51%+Obn zt|q5+=2t!+104?dZ11%hdBL^Fo$JwXz4yGvEdRBGlR?mkQ{^Py^GH@$%0tT*^0DPFZM8toU_9FojHLGpS6mYoFxrxrrghS6j;YOG&q zEtrO8x*nS47LPLfan#95ngAy7+`53fV-XTle##|jEo0cX2PnH8ssnTJcO>i~9Ezyr za`!|}I&9S0W4)AOlV@n~Y9V7c;pkBUS4Qy2=pMSkFX)Bob>^m0-wi zX}3OfTr@ysAL`b#i+2UTAcI7myG+xpOW!8C-;w_B*6jpu1q9ewJ=8;*{Hzw%TZ`v# z_cvz$|E_wqxQ#d9%hRoV9#NwXPsnAR4qDc`%VX4l8MDs~zFS7!tj_{Hz#~SQs|Yq2 z=fz}9dDYOe{YTmf?5gF(3c;OOzthf&o_Mm(oh7>;J*cEHNB$=o82O>YZ>s(98`+k^ zHa6rNUogIrdUmbqnK+>r6ci0!bRO)QNRf)I$y$wF|M}azChQH+Yi$X+zpsKZ?ffg; z@|9SIWKKg*tZ*`c@yrbXaKF>Rd0~W(yqIwM>r6~|HTt+I|8NO;d zBRZvp-R9hcF#%@GDA>tQQb zYy@2qYh5OsH^L&84ijO8=iaA_WGoscZbvZNU(E9fzp@_T*3Y&yLmUr-d2Bh8GcDkX&&8@{vgOW@4Y`7&d1 zZnsC^-;(UZoxYsD>x3BgOOt+D2OCK`PQNHZw@^Vot21FpMFD>*05N|-zNR;*8JKxp zPllecvk6SySUip994a*u8qer7id~(rh=Z?4u~kfw7MJjry8sT(pQM^I)t-;5{SLA3 z7r~&H8OTAKUUAfI@cK329x9&hS76wz%V*saMUP7rP7d6$(K{}B)Llk&ns#Rxs7{TY zBm(0p5$Drp?Zslp$V;5Z=M*SH&p#uM1N(1;%zGpBHt+Jf3UYi()UrA@I_M!N@Hq$t z@_I=-KdBUW)4}6cw>R#>MzsIhy2%;0Z`6F0WG1=%YE8v*^)j*fPX?LVB6+n&S7~88 z8CaFR9b5tFS5P+h)ZJQP&RCMG49MRZZl!G9yRWE_Z?@sq0|6fYnIoCPdvRTVBg`mrA2s?P2Mr@Ekfe*Wx<4NmpGKTMriA2jNf^YYPtMThP=C}$U*Rj9J*W-`aE(hoGjV5EC!ZT1<-3!*x7D;K$R*nPYMMEB z8MN^yKPLOt`A^hHji&o#mNszAL^IFp1z0%g&JUw4dei+rjn+IEJ^sqD6=eWh(rD0Z}yH8A%+Q4mr+JO02)$t%52a)9_j{Q zm$6xb*5z2nTKlT>O#!A!XMT6m9aOjE{WioM0m-PWwtXYYcj_f;h1l$aNBjlK! zfyv!ElN-hAjBza5(i7eNA*)jqL#y?JATECCqXmD%HwA=1@; zm10wyw|wisihqIx)-BvONG%YD;e1B#X^PR<5FwiO^P36Qqf>%gNNh%ZD7}a6cO2?3 z%{Q0Zm}Kh<>#U&NjQW^d^HhC-^ACy^2maCD%1Y6QilWOq^P?LBf3N~11JPZjL=%PK zutZ72^o3Ot6n?I29h*;5Uqm=W-WJOHQ~FAgh68 zX>!}eZr`)aM~aEVz-qoZ{h^?Qfjjj+drjNYXKr4AoHuG2*m%ZHM*}bdH||J(8!P~1 z3At*JMKWd8onK|>H+<&61|1Rzw^KJRptj|Lcbu~C6;I!twDF=>=Zwy5ar69|iV}U~ zy6^uX>%4=SOxw4;uDgqhg1aiHl&Gi(D6xVFBq}ORK`EjFiHeAT66q~v)rBZX6Co-k zDosEMJ=8=&h}0-Wq(%rK5)wiP>Fs-P-}jyQ&G!e)5N1f>xu5$wkLx_I+k8gZO}?3h z_^z$E!X`X|4Glt)xNaT*D;46BBjczi&d5yIXJWLCV2*TeI@NX~C;=|wnO$@~uS_=CH`;FoV;VIxU&ZA2(dBln z1V zv@Ufr^~wW`x9Ii;xRO-LRtCh%a>>SI_sT2ibokD(Gu!z+PW%c_A@55T@HGeib{{+w z`t48pp5&EUF#?Om?ckpR|6453H7E_z|87nRpX}CYr0Q@;xM*V1LlTGeDP*k1TZ&7T z22q|#q6v>LE6ZdELxyC7aWZ=KW*2sKh+eQwQ1m})g%PH5V|nfLJsO*qo7{aqati;B z%XI1e%#T(b93PN7Xj>w`=$GS19ti8dZQ`(Ls&jXAIhEF~OE!(ul&G6lK8R7OdeJl% z79t4|ZflIHY3iCeyh;}WK#|jdfACk#tn5~62dR+`JyY3v(RpKNBaR}3Sn0Z1aTpCP z#-xhRwbR4e>1~O%-{!t)#U=$mdzD_Yszj$}t%~s&waQYGmk4Y*tlf_qp?W zsgW&xk|_@dU>ar3S{z!;lQ>-sNEvQz!68B*J@A{C^+25d+)FVe*J)g1(i-x0r0nQg zq5GDUF8Yls9ua9$IiZ^NyQHXHK$H+W!Gay47R~!hTyQd=>`Pju40Vb6n*o>v|oh_8nd8T7ZKXJRdD>_jR0wF1*h_}OmA=sv@1i3t$oe75!I>BjOKV}EUG(s~ z>d2}EGctbjqO?DrJa4JxI}A;n>{56n4auT|!2+wCIW$RQ(D`piYiQm8U&BZ+$TNmB zJ$!pd`!w$=z_QUw;>`xg4b_zu#(UC?iE`BaoU2Kh*O+n#K#*~!O1(-W&NHAlWR4Rz z36rRnpaL}Zb<9()W2o#ewQF2Qa8cFPq5|Eoq&vDYSwvN!HFPl4y<>Y9m|$)}bHOz` z{ssL9V-gM0pv{4;@ZMye*A!N>NNFRbRzi;i?VLQ+#%nzZt_sxndE0uXxq|k^(NHG+d1kCy$XzdEg(D@mGMd-=lV6SxAWQ@2|wY+$)2Icb@jM?)p1Tj1hgXjZRCpdbKRmS!wQQ~LoK4Cl* z>xF3>>?lcL;`fx*pY&ZGp~8roBAa6_Wqpshy~O-RxNt79QNQLiOn3d!8^0>O?6Gop zW8kUtz4Cz$uhVg1sso#Tm)#oq2VYq_|Jw}oqOcW{Un--PtW6W*t7!!r@Eg{rxB(@P z)3zG**>99X*6}bF?O(7EvErBEt5Sy1ZkHm5>=m?nkj9l1m z7h8Y#1|IoE`$XpS3vmDmrrI7}alr!U9?ltOb$W=+LMA&L{WTJuZK(cLcAkf8`05{mP-grz~y$<^5zzu=>;a3*ruV#c@@?aFCUEFZ6eo}UMN~mu0Z*~59+f^=fuY<+F*vHZ-G7H#G%$sr03A;4hO`N z($7a?*`RC}Niu|*7D~BDcMeTHa7zNTYcQ_Ev4$Q8A1l0PX>oJ$YRz#o&59jCPeNOj4&iK=N!-ZK+0v6IQJ5 zzcRbY;+EtHhidYA%_bMUn}Qt^oAY(Qr*E*Uw*x(-3UtgX=fGp<=eraK?@GRCxUI~< zIZTEAYNS28F#8c32Ro<>z@Fv)@O_{^>@Lzj&VTgkhM-G?dddawl78}gBh<)1&~&jS z%t9$qr|$TWid|5zl##4m}&X zOt#}RG#ewjncpV@27R1Dx|JI0WoP)S=}V$#R1ZaLaW}4=j|g2faV@V3tZf|<=umqW z8}`R3eVW4gqP-{`W`YVV6uTSzttfUr&bf11fSbS$>`P~I zCH6q))%IL*eq>rD;Zs#Xa{&`*iw2!7*26W}p;mia((EIPgG<3rmLG-ty2>_^9z7Ob zLcX#EZUyZXQcpk&p5-cSc3c0P4J}4HcHpQM zbhhdV>3V$#s(hbYD1cxM&*iGlUOY3`^*APPTeIfy4cw$!ZiZx8s0i%?^mn5BM(t4c zUzj$z6A}q-leHC$YBrD&bSpYW+=Q}FW*%qIqgvST=$7HP zR^`ZpdC?7m&1`36@FNl!G z73TlEHF1tGu(;9a!PCNI&@K)|Kk<)=WA-uCNIn-yp_x!nCgg?g=l7y|vfAz1AZO0O z>s%fi1#|C&#HZewFn{A^Jp?ZTq|_21rIwu__qu6N&>E~CRCF?eQ}5S<51}1kO6Ibq z_&AtwZTw20Ir7VIGdACsIw(Fqf(DlrK64{!*Wj!}W+{+P&Gd#}Z-FF|MjgG-9x69o z{>(+zddw=Yzf3x`#pw|Z@@=KE%1<_UT-3|>fjvHHX zZxl&pqc7dgrP}t&vEyy8qGp#=)l$4NAF3%(E`5v;9;=V4kVx+Gy3ddTJzPRpgAqgY zu6NOIm16>~b_uc#In+ckMU*M5XF}6ht44iQjY-_fCYE@Stk|3<4>3FDB=M2-S48zs zTxCr{ZH8sxKz;CnGk?TQ8L&cfhzyFgs`~7h_vh-L!lr85UFjLm9|c>!-LpqYY?c?8 z8xyND(wXAE39{*VEuqBH7ImO=)MT8jTfi@YXZC3qumG>qb_YQXJHXRha@(MFgPRUv z$_Uk2DK2+i^5~PLPR(#PTSI4EGb_ml6n@pT>*vFPWr)w0zdGuOFc?f8P{q_~Fh+rE z2fJgC1OXOgoddo)3_9anc!ZEXfekyfgtS)K2yy-j^Un{w-K}oHoa7N>!fx4WQC`falIw@%QJ~+vBdhZN;g0@xlC08A@jOGBh zlj*cA&`ZWv&t;U+?Bw$abLV1Ez#g`Y86M4mfvs&cu8BJxBK$m9I-HU2D6tCDWadmg z@{+e4vC_a|b5pvw%WosWMfjF^eR(I;?-hTpJFZ225D}(VYx(!x!@)GBc;UCEI)p`4 z&WAJ(I1a#qA>qlusWN|GVcgO?(qs?@dEsGX4RWb_4PER zRd95Y{^BidytFq zw~a5Z_5+PfMh?r)YvQxRiz)Tv6_NHsHBAj+w#o*H* zWy|-n7mnPp@UQkf*(C_#%#m4!z3%r zf##N7{fnDm4ki=11sM(2x2}9UaZM(cI~oY@zx?C@&+aZDoeBwp@3dHB33o3bbx*;k zc}u-i5O8LOw#JEuc{r?k-_90rd6(Er^t~-AXUGgfZmlqiO;f$@1_rg4_R=7bcNkZh zb}LRY(B{c$*`C`)oaU{S7OXlo&3wiB@(^Mq6}ZKvN9uX=X_CTU8-18sZzn zXx!sLDNv0q#$H9?-ZI6__zyL%V- zID#SiVAPp|Allcf%~MHeq69hxw=Bk=)!(oHgsJgarVr z*_z@2xEiD`R6bbH_S0!0hM6lxMx<=ow9;f~9XZJaf%wTC>b(mUyPLgL#k9;_vy*{l z<PL9Pg145V^dS#2icy1tN+B3(vpXBpEhClL7LnrcsF-o?`D@z}RH!>0cK%HR)PoJ{-4GSV0v|{sd_Smj}d-TA~`vKbT8`YUh);n=+p(g~*6aPG7#MpWp7*r8W(#h;hgQdNi6wnPA9<1V5Lq*_da}jw2EPEtG2sA{5-|?or z4-@LWUnbPO<&pc;1i+CZFZ@h9Te@HCebV3gP8D%gRiIbmW#5S<55Kn)Ml0eu^MWQ| zH+7LPs!!9mXFS$yr_9hF#KGDh|F=|mAGy@`=X~H>ceP4IpkqygNl$%Y`mbUihRRF-~1BAAS~9SeYWXPB{#po&Krvdo!rpy)jKGedu(O zxq|s1I}iTrrhFFHt>pb-FX?&S#SLBy3{4_qKu}0B=~_8!*lH0e!P|`hItY;8(k~n==&oTmPiA9#i*v6@?^= z#V{YY9m>#W+HN(qPT2*s0=nhd$2(8Qct8vRcXJz{7mmFDQ|szwQi13>7B$4#xvL5A zp$Io|%S);6+@0VO6S7;3a!^^8C<^VnJFCycE&+11hbM8bw?KPK?@YD6p4;)DdZLfm zfk9B5ePOSJoReP_y=NH-k;bwF(dk`zN#MX!Bc`*c8fQtt6ZyZoYzsDpj3M1@j2*8| zNs+!%+WEpPr(8|@CexQe%KQ^e_2yGL|E+~SSLb)M)e$bM}K}NawFfNXK?S2l`9-0%PY$oEIsk7XODi5Quzl(*~7ZoTBJAEk8dQe z4~o}bI>P(YIheF$VIS<8RRCxe>ca7ghO5_;6m9%O{%e?;3;^d4 z`Jt-2LCQY9k)r5cszO_N=!ZVLqZ?z^ruI*uxRjQ8!|t|f_?q;NJTLT3Vag!51vm01 z;09SkQV;o+x0n(z)KX`*EdjoY_8GIL|CNJ8eGro|pWO*Y%EVpasNvfuUYyW>enKkI zFGIR|Ps;YTor$P?SB9)jD|t}Y6O6Ve}2s zF4}avB#ryh{l}4ILb`HlpsYY!PCx2W_tTL9cpU(CA&+BQ{U3JWsCurtx{a)YFLW(B zT6V+HHiA^uXL&u)#B`PZy+bW(}7Q)ovp_po$YMdeB#ex7`*CCxxqh z2WZ8&w~&`69GZMZFEqoup~<57rHf}#kyjKCES>u85yL=vyaD|A(LV@)E@pOGPlYOe z2Lyoy;2LO??;4Tm4`N7X!21EFf?9gCRv_hgYe5kfn+e@qdJ^gM} z`RBmw=YJFcI1F&_+5HyOJn3$hM=W;W6oC`=-2&7JB!Ao?4tdA%{(_O#EI&=+rAEjN#l>Xt zGVK6cA4~)2M_n>9P!X99hj!nUoE|36ZKW;h+!1`D<}Mfmu3KX;bEmh`g#!Z=HqHn- z8~S7`Wy+{o)4~w?TuO1{wzx(dt;L+}0yx9?nZC%^RngAVhRt!^W6uBRJ=@!y14gYc zmZ^(OHmRl=hk-jx#H9KM;HY{o>PY zz(aE51#Hrek5`BC&R}hw&DZOUWRO+?M++^pka69Dd3CyzM%!Jkr-y~z*j#+jOMmeO zNV(@%q=&-2D0Wkmf&9z!nPJmbYF(n}q!M+lDVvKSHUe~L=ewE_DiT`2I}lR z$`Q{W;XPVNcgnpH>{yT0U%lfNRiC@?o9_N=^}M}mEQU_6co#F4_sfzzc&N~-CG?Qv zZ{#4k%Y( zAM#?3O8W|H78Ukk#9e4kn_`!3%5Q6#we;}H*;1!Hr(p+LZGu$A`-Ba?iKLQq*3-f$ z^9z_6sB0zDs0X_lFE*6((K06P+q}2th$&3eb5)zLU;_$uaBYC?CuxwOtttEE*E?3+ zv)=JH`G&Gxz*r!FQQeV9^L0?U?bIOPYg#;|3SaNno_w3#eODs%8fHML9wuOA*W>1Wv6{d-I63)bgXRpU_NI zx}nJ89G`FGnPV{Qflg2$@(WBFYZohOgALvJqAlFVjc;D(k3dNdX~kp+JK_IAmX*H} zCl**C@vlw7^Qu>2jQ^qoOYINyX}Tmj23UO83=YYDc^u^ce>xJ}?xe0${H~wR|Ja{9 zq&-_`(#HLCF(G@jYYlG{uy?;^n6Q)oCFvT+G zEfk_R)CxX(Ctv*e%feW z^F^?z{xrgy`!bRC)Hh@3q~!y6SAE<Swv?a%$;<+d~=`FPEm8Fke&yuE7zx$ML%e*DDrrUma-7oA8l%h)Y^#d z==SRJE}JI}@C&McxrL%wmJO^(P9Bn-hVuj0hwK_t>moS3@Wle!Ow$^2M^nlI!&;el z#kXTsqh`&$mZywjlP&wS`JJTjj0aZPyhCj=BQ^mlOQfneihH4Y4jv@z9);}`BzX*< zn)F+9TOBpV>?ngKd02H#D$Ap%G*Pbno?tTbZ20?^v);P<`sT z1JAj&fQvyY+qMz$WAot6pJUCOLjAM%dcjlOqlyX1#IIPJ*-YPDv<0$4Zu1Z^g~MFv zkYD>C_#~gMm-WA7!msWPud&1#ky~C}E+6)&^G)&F*wC^|6ABX=p%X(6$sW-g%efDO zO;kaTMMsNfklly@%&s5SBz3I-3u;4!Y^N_-%KR)JB6rq6wa;KA|nd!?d6poJ!u zcU&Do^oR}LZ1DBM^Q-|~T;6%yoo%y$p5 z0TD6V)#s$C1VdG+bcV;_lz#EWpShI+3iLbZ@VrYjt)OeT)q`-;!^x@JtAt;vXhge` zc~Zk>m5Bg}_F&bIKV3#XM6e6LzfkH%=gUr6gF`hUCKtQ1?44;I02EQe;#p}9DSU%< zxLitY3h~gsM>GOc@uJXB9}-%wIUJp?AS60dQsjw!N7_uhTo@+JfKmxVUYXb&1EKaP z-r<%@{`|`x^Sv5Q4b99yzPl68xaDe!@d4+LQo;RdBTg*uFn+g;+t-%9pezhvnoYj_ zR&ORf+h^nr~D2Sm)w0C9W&^6c}Dc7KB*HjIPd$M z2!w~2F9V(`a`^iMl`8CB@*uY;U>!PAjzyCG;xsPm8!>Z4c&Sf4sIkoiaC>P*1}J}g zAm7s6&OoHvB;fzk&MiAIS!GmHRiWOU?>|Ejm5)*)ehEzQ zfSltg7kW77vAxa!(jYPnom?4J{xV}S%{wY+6+ZiKfLuIEk^8zfEm|x^MQ^V$%*d*B z9(zhHoXv0wnV&6%T5VLnVf*V%w@MRx#!l-D6h)>12j}Lt$1LTjJ_|qxRiTX`>z-r6 zCkP?m|Bu7LwK|1`i!b^{DgouAELIGM8k;lts~V$LZ~5z2HK2cazCQrMWQHz2U>*N& zPg?^dKDuJq#+VrdLP0VAaHkgkuHej#Aqv?G=;Bxs9lCWWcpiGmJWiJ02Y-03^Yp)# zdqyqNR3F}Lst+>Bn()136OvVUA}-&Lc7osw5?Tp59d)F$*pNy>?0yLN2=YFu*H_tinD%L z1AoedzwMxRg_rYMWX_~Fh%0h@M-FBo$F?1k*-(XT~7zHkdKyJsgowAq^ zb^+XHi#pfTo7mT@jW^?n!Xz3;=AA>(r1cbd-yY4{w%7+~|NG812Se{X!jt+bf zH5_iIeasA-Cm(H}Yue^1OkrQQ|C;ZiFuOxL*>K;v8}elnM9s)FpcJU97QI+Q>nPmq z1@MKHahT8IOxi=~izuFJ!>-{Es)0d-5nRI8n*o#4zB((NCl^yr5TymYW7GnT8bn9( z)M}xvpdm=2!60jO4xf-L(rW0#f8YKKRBCB}0SdRqr#O{%u<)_44xc5do0<;`k z@w6uscrv3b(Lcz1Vk$%9YUV_5N)r;zqFZNt%|&7fp1#q>L%wawBc|@)BurAuPkYzO zlah2dEu@d-L-(1+5Mp7=FMa{4#wD{ z`s_E`Md_HY4`VU?=7YQNQ2va-tr)rMB?e1K2!9uI9{P^2N%ir0aA9bH7vN{w% z85;MpNJwdebrO7)yqJq)k!#=KEalVGin%bd(~t8g>DN*!A>8|kZU_*n1$mYyu9G3g z#eb6BU2bDjlNc9gY#-FZxjwG`*#fyU^>^**zj-zz9+K7_M_!)M`10j+ZUxyyQ5w9< z;)YBhYrd4iO6XvPpIN(>nkpm)A^+0Eu&KAVZNU!R{xEdJb0H(%HiwtB!LIH@(SqU1 zVKw#U-?aYA=*mNE!Ld;Thc#y{t;TAo_r+yfX9>YCn8PR$ZGa#8Y=J$L+n00sg*c|z zl}Iq<1a=V~nM@`M+3J1`ODlD?EfQ?Qty|pc%&a5l8&O^eY2(C{;T)x?eYU-FaYv*_ z)vyt61MJe3mF6t9$fNsG`bUd~6NQL8`94H1H+pPyKZ&qm8k>`B;S_lU)Y4nQKfpnr zmBn^2x`u6P6NgYZQ)1Ip=+@sNY_`d_btP;KMRpH@KL@dsgU#{LX`Yq}YrL|Z%msi6 zU(;+8Ker+HviGS7>P5iKv4vQP+Z}z~GFA`Xw3$;f+mtaW%*y$atfz$S(Q^*Bw0}2! zBUPFp`jGS0&qG=dUNDh=&Yr#mw1WA)<*RPzf5-v9)ur?{k2h|0e%g@lw zAS{@DT^G70vg%6_9z8-a{&$MOa%V4yq&(0l9p3mJwEo=L0POx6N5C1;gtR?Kb(WGk zs?pv8tMLjHgT1#p@`6WHY_W3^Q=+FsUP`xa9Pm|5q`-mz_5b3As}cxqI3eVjit|)g zOU10!EXpp)2X)O(`jqjzY-c9RcERs(M{er$20U z9$x2V*u_HySzehzN9x30MBCU6r?G~JWk~b1b3^KYIXwXefxS zYFedQhX}SGqR1hV^#xH!dK~-2fS%fp!&h}*gPbLUVC1 zp-5F>K&J@%IHlD0<|ipdc6ZD3#9XzV1n=wQ{AE*B7U04BrJjgUhL~AkfW&+pm>_?My@6}zoA7fvoYIasD~P#ji}~%Y{lDrG86G_ z76~SB&VV9@1_XUk(B0%>kzXI>NdR|$<&5N8>L0mB^W7EJr(#Ewz-0(~^I#PIhX9qV zKysFuV7(vRDsmO{5MFe|Y=0C6p{&qR(~619a#XJT=@kgwewV+FkZ^7=@Z|68s(J9c zqtcz{=YJ{m64k4KvshqI&MkvnbUIT+I3{dX`V4^?<`F23W+dnK0|n!^T8=a4mxzZ} zt?HXf#g~+y2(-~fL)0(^qIci6qm?pkW;J$f z#v{Y}4xCbEuyNAZ?!}pJv^*uu*2$~A*2ZF5T+)k~dy!vh9dtIf2r2f#C?MQAG`*f( zC3IFp${6ZYfz{<71z)iL3!6$}mMs}AAM;78@`M0Bh=;%50!CHb0Q?rZnbkRa67+g5 zI-(xIn3hL%U_zU(R^G)-6T!Z+hwuTwwK2=7jel|JHUS8FW!iqC@cChVMJAlq^EaWs zG9WtAM&*m-`P?io5AtD>y+>U>u^;mi6Xaam#{YD2qJH8`yjtt&7${u2*@fOUN@oDL z!|7m;^W>8RuFZ?z<89>m&X*IiM)m+!s9@dbDKP!$P!#P{f}e4z@+0Lmux^C*otg>h z%Q+N7l`&?t2=fFq;!zy@R%*}P!7%vfE`3^Xv^c46w6oum2r$L|C~G(9S^G}-C-8qb z#XjiQ<)S_5)0S?-A51faZcx6laCtV(>dwVqZ)U$m9cu}Fye_Q3^6IR5qki;ft*Bv- z@gW!mWq1jryf`*w+OY$66bPw?^BUl$f9)-Bp2{HH04C$?GEZ`*+JbZaHXffmpsCOD z>j<+l@(OWp!d#|N`K<+{YJ%)dEe}m1eZo5o0+NGtr)hDEL!khel9Q9qGSRb`54|pK zg`)}JV$rTn#2#;n(*;)jKe?q5fH7pgk2?y;M!yIJcp}eXMkHXM3RPldIU08ry|;;I zbvrsF92IRAr|APb1& zUeOpF%H=|YL@C0&a;fwyFOk~#$1k*a5fC>A`o1FT5|29afOd|a?Ie-G{j3m~YqUT1 z(G}!hdzXT2RD=7~* z4n2$3-w;&7?0;9i^vf!7?sm%d%fZjg7RV!chb>W(n7i)PO#rchX4dG&Bhu+ zwx)|VbCR;ppn4DI=Cld3igYuej8@w1t3g8XV-7pKN7?gkygJeg({+-7My&g^?&nJs zX1`~Wetd}s9|&M(@{#J%jT?ku$B*E!jSZx4`wIth?nkhIXp?ukn-XQ$bGNMrRQ3_v z^bffC+2lW#pMkFKB!#Jq>e?Cjrbcz2bYAyH5TeI2ZeM#MzE>L_2kvTR5^sYBovS*W z6805mLcD8CVaTTtYfOI>!{GT$(cKOn-BH$EZ#G;6c~m6!GOyC;=oEfJObg4RY7S*g zWyL$vRN^K@38B68#xOeg^3z1#R&oJ(OeF-TP{*jns-ZR}d?Z9>B+pwRzy)aEKb))u z17a;+dWfZ#S4&+fFQ&E#ZR^(W3V}}b14A@mWEXSG>WHTeJ_1Si^BzQU;0*}ZKLJd( z%PjIB6?pZ)XS?`=h$o5y4;3TAN4QaX2tme?fo0|Wv~-RzS2aT5c{{k5E`heH)mzD< zwF7y@M|tm>x1nawKVAE>rI;M3ZLy|sz*Q2oXn+PXn94|Sa9^?HCW%!rxb766>;uKh4! z$tF{Ra;T>d0-@2<(op>*@U$*xd$0ah_V@Es4ABj0pF0MKg%&ZLFN>JkkaeQq?@bLX zNY4;o^W5B*9=XKL0&T2jFQT#a{aP-3QO5J~KxJc&$a9+s9pU`HCnfFI zfdPeq$9UH&aEjfpJ5L}xg@wATQTT+~Etp%hvSLBk#$$6=RXa{_Q zym|D(*oh-n*xs{Xg4$MQLG?w^lH3x7COOLX$vj2lEN+BC+ccY%`uk-(X)mFgu%yI% z5)x<0+q*QW8y-yFvPvM%eR#R1{)GJGu`a?BvaD5IsEoNRwW35KiBXnhHf~JgI(L%@ zFs0$><8yNx3~N040`_lEos-RC*l;@RAV@Wo8*3UnBVjIRiYe2_4s;9d#ladD|Cc#H z+Jf~aNnKCfoGg@MhL_rcZ5z_L3+=7L0uGm@qCTfpr1A)c8f7M;~Zm70Rz~@c8K9N{o;-ILcRCEw{$0@ zHQbvz=}Il?MI#|QgTi^(X}s{2QWk;=RtLNT`hDVsi@G5SQGk4)n~K{`S!zW8q%P20PBlW5S9Sh%puW(IjKR^MmuSWAV=ZA zSiPqC#<0uhPAxYSzr8pvewD*$k=LJk4)e<l@d9jq9NKJ0g}O892SQOIl71^K#JM zK3hD-jKVm*u@MMQs}BbM;LXYgSsFh6F${xxO&+E8S!<;5#nQDLHxAKzQS`(eX541= zbC1(MU_^Ec%2Jgq4bq?m37d+frf80FUZUx(GL?AH0>kXdJ>peP=gTAaQgq<~ zB~e9B#LNDUW6P5YZfF*deT5+Xz_dw|9uH})1el+oy5@*BTIX<|y>zPndi!RP}s?xZ zaTT=nqGJ8USJZp(TRv^3TBInyG}82T=?RIW{h?}i-c%7V{jk%p^9X~fiEbPsr!3jt zyfm4Jx%mc$K=HtKhnfnbxN1-@vLc=r-hipW<(rR}|&)D9_z{+IDz-28t{I zIcTiDw|Ya}b@e9wdg)ayttiReN$C|H;df1e>Z9b=L~*nm06uJ+zpodpqh|yqyA*C@ zQck}wY*;)2T*m#|wqf3U4I9ibbqM{@pvuHwPTi0&BrhmN`6EBCs}nEd4F{0)_7s0* zk9y{f!{2@hspS{#GObh-PcN?nxTcK}7VSW(&`^4v= ziK!sIUv;>U;eP+a_W#WSct_GCSQFl0yrpHzuE-ztVaNky`0eMICVlsj0wE{S%{4wX ziKD6Kvn$3=BTA*mskn~ymSJAy-p?2yS2SlRJ^Hra*h_oQlEMQ0R<;#!5iQ)Ii*oeK zG7K<1R1%g%kmBOdu9(%NCAZpS;y*FHBReyOemN+NY$Kh-aBm^kS))5>k8d7Vt%8d? zNoB*mKr2N9ega2uP`nNU0wYst4&s4D0Qs$5`CqKDFf|A2w^H}F&h5p0okgd6M}n$N z^?2(E1jB) z3Pm@M7h3-Pp*Yvo({#kBf+NWu>W*axlX^8ddH7NFkE&C&N@xL zirY6cC_Jd|wD0I7vwTC)awH?xQ_8(7OW}1R@9}`ci^2`BaIj%T2a@{l<`UKx>(1ZX1kX@zs&XV%;r2;O z;yt?jb@a7L-8;t^c%R-mN)u@~l36=XtW{*?G8N-(PJKuXdk|mYxOvFz&6&vzak_Uh z=Ky7BjGZM+K1^!gIt0wf4lM%0z_CN};Z2svq$y{^UX&^NpEy`!&g%19f5vYfpZy*R zUwYH?6gUvfJYL5EReX9D5I%xaC*f;>i5Ih$UXtYPq}GQKAtM((Ag)hhp1jukkPp%u zP2T6HG}@(e^Z8ZZ(6hF-l(a+&;&mePY5wk`m4{|W zUO7$9h2=0^=x*8hRQpa<8*hv!{VsW!Rc6qqd3vG}%LR@wIL~TESs#Iav0C0Tv<0_ui%W5+qY{obGHledHi$Xwrl_f5XH^LM^`kViY zH|}FBpf|fObRupkk3B6zrpX7cJBcQ-x4AsUg(k=d|INYyi!98jRUQ!eI%Hcs`(i={ z{EeSl@zd9Sn=v;?_vHS+u#3?icZodf+6nq{ITre~f%cjI$?e}TStd0w9A2y0hb`9~ z?r5X4zfC;I-o%A2>7QC;chj=I$=hkP(b(A7wCnvjowEEXMNGfq^+>5WyrDM~uy0iK z$OAq}PUxr(O^b^|oVbzL?=X+t&hfa%<sFC)$dVX)TiPo#IpOUcX2&7(;F{9B6BGT^bqo%a?w@J zHyJ4@5`>y#b2}L(!v?j9IPlWcGw{87D`zir{fA)6dy?c3s}&jGK(Fc%L_2VN1*T?_m9Z|d*yhrcLFa~>%V8!a5Pe7{cJ}BsAGi0Tn|MFEk=c+#p z7En1j<&!`I|_< z3J1j@c4V<_fb(xc{xS35nZH3DJ!A1P70;X-Is^tLT<9fO)c_-h#w)x@wQq^-uNG(j z4WY!f2LkXUbt}~_sZrvNTx2p1x0#^ z7DwA-8^l&rDX4k+TIPBUo_}AstR!k_EV;1VMq&KC7N9*?eL_U{g$C79Fqr(J^YFhp zv>4D{)iA(jIu1kQ4CXM{UvNG3x}!nffYa(R+2->O9mx`@0L?9T2teyY9!%*VhvQEL zE49(osSQWf)%kVTvF`m;4rUFZGu7FO_GA;Eyn8q@t5otXK(t=yIe#l76xiS+t2?7F z))#|n)9&PY-cDCFNRz#l4N`#~**>=a|FQR;VNIp&+OQoF6-Nh95wHQ$6;wc)U_tsw z@38?QO}Yd^L_}vqLFpX}MWh6&Qj(ykNJm;g2oWI!l8`_`2uVot-N9!+-?5K(_Otgh zv;V#CKaP;Ka<8?ncAnRH-HTJNAHtRXM0&w2>(Cq$OXz~9tIO}K;>bnj0)dJ2(hv4L zCb)^eH>vFu*bN#K5a7=Zq~lE#*7HIQ4)y!1Uiv_`DaVtrUdf2t*CW4(R47*n5D%!wtFzEASX0sb%e(XEKOy)uruE=&ZZ$)NpRdNG&l5ixAyk(x{bZblEWR%-og73r ze(Bs;bIB|owX^Y=t@QuoS^QVOww!fW{7!^ytt0uvfRzC(0O4bS|Hot1+x-s437dbZ zs5cW|&vRwy#^{7o?w>Bwf!aw{Y<5o? z(&9b%^TYp#pN7cpk_dHsSDCUI>|XJ7*G~(zk-N>LVEc3-9}D5P)I^%jZ}?ee{tt}! z&wjS);PW_$ySNB4%rHlN?QUHO*qW1@8@JhgXd8>-u1tHg`yUth7fo$MY(0b=8WQr+ z2;sKA_`uqI9}xwc)tDI%{HQ3py*76K7gsMhtnScn*mg5k<*W2d2mfRDf;S?_H#_{B z-j&Wr3^lVP|BhA77(e$v;UKj+x6KG~=FEM=HMhSZoRgpbu@pDH)=*8e7U{Ml{) zkLx{fbiFuK>PG!#@3s3fYkF1$*}tT`YWm0XwE*+4j{O&rt3`Ed2O(b(_i%CwZp0pwWs-?_cZf2cvDR(JGxcAPuPCtYo!pW^1%z`BNDBB?MxD}wIdO7H)?V97lh-A0IT6g}7M zc8yEA+D!k3%0?_|wK*Kk!J5qp|L5iW)f?6)6yv141f^%=4usKnABVid$2ZmVnN23m zv81Dq=|t+SF0_uG6V*%6TlpS4Iy&kUHud?*0+r1m-I4}x+xh#87}3~}44F+;{r2s~ z`{6MhZ~5IoIy0L}9IDas?TSX;o-|s1pxJzg^9I3wLl#5ax!`A~PtWYV0bi7WKZC8b z%Ip+rxn-4Q_&pps?>D*!5n`a#Xtu1ns4)lSxmNr<4HF)QMT^+7Ror)xu6sHkG zqNDRzhbtSWWcZ6R)eu%Hq@99oa*)uQJ1!2jXpHneu$Gz#M>Po?e@K`tN@AUszpC>yhJgaqa=;w<$wE#zbxDjcVUF&#N|}?;SC@?;jj5!B%pQ@HyO2kKG{)hN*7|a1JQ+=ltdl!j08SLu8$_wSD`sg==iJItCR61d0?-J zxC;(LO8~EQ@)kt-$2kJWyLEe&gGOOQ(&Pk%^I%o~$W$TZLt6viDZ@yl^Ib0LKn+fQVj+p-Cg4!hn3CEkq zd7{DBlC>qI=8V)Jx-;?3D3Huti_bebVD`4l{1?9SFRb|gC?RH_wfKrd{i^pkKy+dm zBLRm>9gsx3QD#&xQ`v*FO7HbTHKkL(F%Wz(E8LM;7ggrq ztaNxLH=j?3i+_N{tfj`dO7I$q2X3`d4wYu!mB1mxkJQebmBD&37JTjWx7Ofmy^uO}d z9|@j1>%$Sq-DzV?oV%6o;`te!*tt8*CY%&4NxyE%tvoM^*8cg{icz5zjA-+sM~3yq zxT-gLxw@8sVw4AT=Rt`jdkIbVxC{tCG>kseT{)GSzSy6RI{BIZL2cE@@zTtCR4j(S zn$OpuOT7AB`UAxLsjQ3t|swA|{Dm5M9y1tIvZ!H^f}n1)8BktdRx_jm&a+<~j% z6@ugFAMTxmbm8M$n=4RT$!6#!GYKNC37F#OL;a-}zuALZxe*3l)!-hv_(`JmWi?{u z5n?NWXs{L*4R})qX^+lt8MVrHZn7s%2bEw7EUd;$@HRt*SOqTo)m>^ah~8-p1kJB%v~!>9P__Q z1^cE&YZ2-}Vx0`&_ZAy)=g5R;3gIOM9`#-#%5XUs$I3lX*0`YBJ!VCddbj3h%HPlE z={=c4E&HHPa~ctx#@BH2b(ziy&IHpFrDgt5ZIJyrVD(~2rrIWY@aiQAs2e(3k5iJ* zE~z|dAuRA)awjMS3qAS3YoBsE5UZyDJ6RmICu7M-?IFG?kY#jKDx3TzRh34p`pq1_ zQw8>R&;d5&;2{WMGGTqrc6n+vD5hybOd=AAR|ydIPW>F-!|w9ZKXR&L&86H~9S#?{ z^3gx!t9&pO7m#y_A`+@MPl7I{lxFostDSETiG@3+5^ zq=6-|4<2X5xzAO&?=0`Wh6s6;dJL+vxr?GUzQ9apN{&E06 zjoa0`YQ8cS{*5M8A9BYv^r3Q`!9vT%Q8NhJx@1(1+pp#!!<{vLMS-szE_G=BAvW3x z;nB$Ng=Dtl4Fp*LBp>wci8pcXUS3|KqTp$I)d%3*FHLpu*$}=G{WN=02garHx#(7$ zA3s@jiCqif)RL(@3ROG_P4-ahvb+e} z5OsAVdt#|5&aFi^v52ncpP%?p8hT7nH+@KOYiny0vEzP~;eI6t=W|?_alA2jXVfp4 zqP76;aDWG#i-AiexgnvaZVQqvhH`91*j{Dnma`*1bg7ZJLiRGq<_=nMQwHtT-DdGR z*%5AU9;*GuQRCy$AD6Gnc4vGtQuDH{A2B2I@DQHt>Rfzt)=q;qiA?~B zP<_sL6i=c^gMwV$rcT8+rE|f94V$T=+#$bhtDhPD0F-TSx{92ZRTGZjY*3IwDPfBB86{m3Ca@Wed|{Ce6vG8=_f<)d zo?||3T7H;LH{iALe>d#a=lCv9fdF?ofNtE_M*{Q;rY}fWpLYHOfJ|uJhv8=d zuJ`vwC>J8Rcl!Ca?w%@LwLJ zoiL7q>6l4aap7syVr3k0anQ!fBLGHnx&9l-#@znZ^B25w4#!w~BGa1%1^6IKC z`6<2$=7x&Wp2i2F7evszXur*X(Crrx>7q*zpvIZ_g4LBgDl4x`B4%#o6J+%h$Y7j| zLGq7J@uT5zX86O+j@!tSj8vf@o!Re>_W zV22{u3TE@)BFfha$V#hCp2$9*frOFzPwuGSNmA51#>;~ZCrtYML~`_cqF$Qb3cosB{(F^eTyBfVsYhGy9X=Sp zKkU8i?}s;B6#wM*YwYu_Ta2Ft?vpwpGLw9MaM!6<``S*uvfNd_)&Jm+ii6ws{^DVL ze)EM3_J-@z_Y!zYIhI)Z8%`JwkL6IfxztERW2q0s29i|%2QMD;u4{WE;>Vawjq zw5JcZ>+|ty@X=L(mtB%64MOcx{Yj3_znYCk(YwbOH*w}%<|`TQ zYwg94dpgJL8aeazkm~umv7K!BvNVrw^?_T|vS?arM2QGF4M@sQP*bE?-jI8q~eBflMz z+W{@F?m5$)oVW6E29;~ybf$WL^Xhy6d@KqO82%Maltx1XL&W+xiNCOPaGhqC&i46; zOI|ODLsD)()Hyj8fQD6fsy3aJ^sBi{-7ot+^y>wQQv%pGX6isaYoj-Ccz7a`inWxV zMEJ876XD}gfB?!F-tEYWs_s7R)7Av2EH`K^wnlOJNkG&qDe6M2XaFUwzG;U(Ul2p; z%A+mzFDdT1vk)sYuKVMc#GAt|0m%N+c~7@q1ODnvS#{4XeH+aH-VDC&lnZJ|V75;hO()P;bZ$9tbYO56;#WoPHR0=x0O_cloXw-e5*IhA$b% zetO3kcFE?iB=Yw*_r`|~I~6yyN>TcjIiMcu8xQJK8PKPq8pg1c;WFU*eh4_A2?C}mGKeXagsSYR+78B5)b-9+PJuKC3TO!r#b1xc|G<7jS zrf{$=;eZegmQ!#8YgW=m)yYe_+Jx2b&Gv6B3H`EY=9IZ%R81Q26`C%-Z!ZKRBC)01 z1h?SsQ{A%ZuKliXE@RIt-^RJ3?z%DmvDHNxeqd7occsn1UlqMd+t;hZsvzVzchq9s z$8O*#O4+_u?cc|)KMJd={B!AO*3KyzSlo6f}BaP`c9w7_wy<**9Lu|q9- zG5!T%p$W&O3?%%5aSL~&gTE^tf2)WL=LYFLyFU8PLxKI+dHI0ab#?FdQ`R}8q$$=# zNxze`*!p=PnVk{OVAmf?h25+|<06O|e0m9N0RT8$JM*Aq(szW6Gj9(hj$DE5H7T@ zG!mD@YfT7^{RQeiJz|qEz^FCp{a(66Y)YS-a4A>+Ft5k{Op>hADW|ZPcjyejoN-#U zE(zLBb(agn_A~eU51u6THj>=n;tyTZ6Cx?Zu{NUjFtv$uQ@<3`Ag$lIyD76`o)k%k zo`F$Ge%1&pWEs}GD?~5Wn5jGpzhF8-v|DF(u8sd3yYI>vDb4 zcs4%zB{gbHs(wP0z08GjLfT}Op@XNpv>K>mS7LW$g<{<5xzV2d-ctkSojShJY=m?S z<%D+I1K)a-HPr#eiGq<|Q@fi6x~ZE-MQzwUl8n{HskFe)+Idf!5SX?~XmslYfrI5r zdFV$Ak$Gvm2~kW9?A5U%WtVvfJCT^+O!bW&7b>rxfX<&#ZmUo}N9k0bc;`{q_TX|G z_bR;t(e0_eua?(3bK(u(oKBLgcYgrgU(J=qvUO6*3(T!yhO(1->d(TOk{QTf9)1BnWNFxnt~}}06GQ~W#Ft%h<`LKIX~rcQK+ca_q&FhI|c2d?o6*d?RmQGBffx| z@#bDcHW1&GW+9@$#tpI4iLFiKDl?a_D8vs>#dA@dF`PdNWH?3wLO$lxuNmHaiwl|5 zD1uJ6n1kyH`wK(1QE-r#C+yQ+W0b_+RiN0!WscUHBx^3$T$U}MmymR;FS2ck)&kzt zN~EFS+U*3PsWjW!m4$}}x_g_Y`2aaw4hGxZis~aEUDKJ55*E!58ap{{umWq(77(|7 zj)m@Y+wVH_H3L~wi3X^4mZz;rT$7jX)V}WOd@i}}u%DiZM{v_MD(<8CV6>7o+BV zf)3@~j6SoWwhUnPjxt*?iS`mN}2jlnM8_9M=ce`CW6=3jm!Xq-~S!P{AA`% zOY-D%nKDbzNfF3M&#R@^80uq;y9NQAGk~hLrmR1?gL~{h{awGj?$-nIWo2|{hTlupCh_cd-|yyX;9)|4~v#! zW9hBG@?NyZ@t1lXH-tmtS(x969@k)Q-r1|BigzjXxaa}tU!P4GRwNRu#{8R3jrmr0 zKW9b|axq)h4;C$U!o$inwnzx)=K`>~NRwXbGFn9Y~?hQ#I z;h@g2wJ3qWGz8@A-oG;18$EmjM=tGh#bq-siYd&@-l(FvylfJ6+_i$BfhhFPeY#>I zpF1cSed+F*PKarA_LqQPTTK;nsQ^XJGaQ!rjnkYvlm>z&owC!0Dg@(1BVmnGqLFUY z0FQS9(yu#zwLQN^Y{m@juh|*-ezU~MQ9??g{8P>&+OC34kE&#tshckDJTv?Jy)g{^ zY^W_EUJdn5FMRt&V)GYjAP65pI~adhMZJW%@k*If{pc|%!kyC;R31)oHx0eiZ#EVg z(=21>*+|Xrrry=yrh)9#Bikwswc{i@^Jq>mvMQIZ)45T4;qC-3ba#I{%qdNl(^aXC zx!!8t#)YCrWdJ7%29NZTO-3og{T}f7ytX2Xn_Ze3-G~5n#_89^C&s9krBfCwAL^9_ zq#fbl>q*tU`jN-Yk-AtMDHy>ikk|7*PJX9Gyx#pfBE`F>jrY_W&r=hf9|7sNNbhz< zmple};!8v+XI%!ZLG@3g%{f7|@%8dC`5A2=5Cft(3QcHdA;FK3)bD1Y#G9q{MIS6Z{w%9uZNnSpsl0jnagaSr3 zz^7LP%UT88yC2xq1CAW?NyS7ovR#0=*5RA%^vj?HMg)OPya^cSs>vs~GTt}<| z3NM=Pe{C#8X;Pz4lSADuBLiTbk$U+N6~e>9`caHhh+Evvq~{oW7r&tgiNO<@B?X70 zajiFq+~)x}>X<$-BYio~l_&!yfH#IDL~GHr>sO?6lKV=kYBq_h&!)~t1A=e4?tzYs zA);csa%$9fnXzj5?BVV0O3CBQM7qxRqv*nEHVv?TA9YpW0<;bJ6wYL`3aJ8`I(PHML z4iZ7-b?M0;Vd4G>*-zb7guFm{qd9mgu zalrTWFIq#*5zqarf2(|mmf zrPA!gtX-Pgp_lAAK1&%RqNF{0D%pzFjL^w9M374XdBH{7c_u$~_~8D^RBD%5pVs;} zImSWbxZqyB>>B0E9bb)Qkfx;aSIhMK&F+hj98Ox@`LL(sXpv&R{B-CI@ahIpgVlw) z3n=y5iZMkS77%bQ$rB*QfOE$reJc%F@BF;Uxghs{M@q!2t(mbx&zOY%gPNt>vuR2Ua|#QRp#CO(xpGh%^P31WF@k_!KzdV*+YOiXFANy z=sM+dXim<3rRfcilPOwP(vpXU zlj(SRnX*jmn=0~8pY6>Kyysqx%P(x_&xO;G8LS}{k0H)`qs_>m#Ps3i4n51XQ<%3by`vmw3j8!SWT5Ju-|ZiQ zj&VS#S8PnPQ#nP=QHR&M&E>& z@$3DyMZ*!W0jRI@GrK=yavUQ7tW*lfcDeo&R$jS(miv$#80!ubJEoCs66?-t^;4YR zsZ^3;?QqjvcFH#Bn5QSa1 zg|nf_?||ax#sOfE?Syn_iOFh^&GVf2w$_%L7p<+G=0EPSa`oVL5*j@6_k12hDo*wuvW>5K61@~WvrNGT&HaoDb2P31~??$*-(aU3n>*5<&pg8W}z=2 zRJw6sI=J?IazAwl5zSEKtiE1nz7G)s79jhP-iSd~Jf0Zq4o5|svIE=c9p@FPPi+WujQxh(Q#wL6BveTG7zLOu|$cjT#15p|Ci+bYhqy#817T-$H%^7&Cg z^tAfs!l?1EV11UL%V>zsG2_kU^Sl@I)h^Bx)S@Ou#(X}h8!5JXt=v!Mm>Q+Yjwg3i zs6oHR7tOZ{JEKT$)LZ>TchjCzqnfFOM*yDd3YiBRXS{t=k&(CX!6uKE;t8^`w}Wba zac$Cp>fi(LzF6s#j&t|-sJ;7s?>(paOL$p@xx4dum5oJ(3G8>nZfWdqH*$QkQIVPc zn~Ao^3?}dI={Q`2RraEI^k>;?I%YD;(-Au5>d%yeA!e!?*y7a10Sk}CO}};4-egv1 zD&mGMgG=6Fa|4*6;mBaObkcOn2;MQRV*ymt*CWeaKTC>-WhKHwazZWd1^_M~tIk{) z8tSsAoZ4M2wP#`<;4E)GD8&>%*2yNZ9ybk^cd}(?FV~;Zx9n3QOca9(wMOXE^dU*@ z2Om$%;$nsL7h(pSzqN<8uQqz*aGy`;S8L17xSwF2Ei5=y?Thm-NsMn0ZTj&@sWJ8r z^2-Jhsih7gL+|^I{^t(36Hz%+PDq4&PVUpN`f1l>`?5M*G{=y-n)b|omZ&}egFnch z4sQvJHZxhc0Vr3Wx{+(~?|+2E&J+@&4m8o9CegAj67(WoU)209jg--5?k3@@E;g+! zOF-37>^h>PBp*mIJEPc*4DOd>$*!Gv-CR!BncpTPzRhPtumOXs#H*bg_NtTBtL>U| z%ww3tqwd%wA={9|u?Bk!A3D|=qA}b#07mcwqyhH=ADkeide79;2HuF%F^H%=RZY+D|lhRQ8oMdKl#Z~#r(42 z74Np|MH26F{gRnxYLLw#b@(w=kD_h&r)-yx4G>8)bAud86ZQKm+s9_4^H_sj>7q96 zYGOuan?Jb}=N*jdw=KjsCPnUZPj4|2F|Xo-2|4h6QSlOL`*339_*B*t&51k5yDHNf z)z5O>s6Io_dC@!NbQwPcsL8fe$v|o;>*VZ^gQ4&7w|Np%wkbIuHQqPa9#t%?aCBjl zRAplPJI@Py$nPN^Vii$CUe|@CtQ$YEAZq+15t}3`s00P7P!HVWQ=;mZgu=DZZ3} z#;M|dF5u=C>KrK50v2Gq(R=S_c+i}2q;efDW~dcYXoH9*l3v&Gw$@GDrqnONU8W25 zE;H9>Yy~Yduv2N(bp+%5$g)?;l ztdusFTaU19p(-_KcIr7R2wyvT#lAy}V~B(iVb9HdZ0r5^$r2bfX@e?GX}V?4Q_R$m zH7p>$vzs8Qu8$e|Wr-;AuE)4fDM~}C_cIn#jgWK9`EF`jG1EcXF#Feo#Le> z1)J0l^+gd#X-^1KBe}!=^mVZ*sE7i%d6Q_R$rp_mbn6+?$nl;)bXTxrxNGwLs$e~P z(_y_acn;~Ex@F^34?@S1+n9He6?Gc-O5J}>PB{Z7Z93Zc_}AL^>RXO-0u+BOe0i>9`?E(2>5ypFm1o39_XWhE%iDP)JVngg3xqY!Av3Gwm)jPkNMSOuY~S7K3n(v_)1H>$C2AhUybWkyi&wWeJ(MQ zzjk`HHhNp&1Wa7}=imQ12e9`U^)9uhFB#j+Dk2R}>q4;+zOu+rdmK1L;+w|7d$5=b@K;Xw; zVtbp^`nR>L^~j-x_(VqXOD~S8uA5RNw8RM5CF3a!WgcqM8gLL(9 zGg95(`S&l30O1YGc6s?AO^t_IuAB6>iu`t^miXIcB)r$QB=Y!+o_Hv%k@Kkl1LTC( z^^^*T(I2e56#Kr#&Tx&i4)9|pm#;O zqTQe6;Jk%Y$J1Epi4V(C8nTY2Y^S0_hCS#TIY&h1evrfBy zuzc50+vf(}PDi+d7h6R(W>R;Alm3~A>*tv7 zw1@|EZZ&*9)lRjEIE!JE5C$2pkUOCZlTRh4dIG-8`cWw-XV`jg2-Qik?r&$MsX_C3 zK7&yhj`TPCv4}r~T^+jt>~b0#`}U6xj>gsy{?lATj^fb}{uc;umrLH`JcGWxkbaXZ zr?2X+TX%My$$3NDSks-!b+f7VaRP|2)2)N8P=PI`6n%LAhkTwE%>=^~DM zvn#_Z#)OHxT%F&I!sfzJO#+cxQTNM=$Eo6?yH6fVy{^{0@IlT>+A`CkPsu7r+MY;- zy0P9Ml5U5?K5I*F&#vcn+I%;$f?5YpKQp#;X|PQ(`_#PJiONaSBf=0m9|T}^=IObe z`<6_7+znPIMTMyHu**VMcI%_&in5{d$)?LJ>4K%WH~rUadSVI-#NtJP_5nYyh%F-s zY}SsQIPlV8-y8rvT*RYKHUp7AQUdGMLn&=Fk{k z&=F*Eq1x78)z`Q7XPsrO0@}WP5JeA|51#>o#Qe9lWl#evkM3ft%_>DnpXZO-1ghi8 zYj&NqG3ir}>GU`GU0rO7F4cq1{BR8$h;-*}VANia-gQFxU`k=<30bjdjtNZw&R^gg(2ep%$~u0cI;(31!*_TyuZhCHuwB+^(LucUPq`4tcPgnQ^EB1 zIHca&)s%8yY0s~h;+62tgW+!W4?tyGv0Z1(KOAYi&y($Kctots=12OJYkeF6P!Mfy zgz~y?x14>HL*tPQWJE%!u-6VHZRuf^y~898@D`-5@Ddk7WIiV;$b7cWQ`4qTX??Pn z9?2=xs{ za0rKAtr&LL?WsTeJa&r=o=s7LusXiO+(Qzj8hU$~FD18-x4deMd5KyeX>kH)v6r23rd4t@7}b8SB`ulFap!tsOv zpn2N3T>b|@I}k&WsnUqT$>5sc(^i{5*#2sTM#*oo+P}2F_HoHlN^w+}S>94)deeB} zeCi|fh+F*EN%oHgJgexIx$K$m=hU_;SGE*zsINbbMsw!J#L*qcf!HkFtL!8iRA-u? z_Z+&f(8Npul(l2uVQ%|K0%}<4y6*S&qBkGT>C2)kez!FUZKybSI>V$l9`(qNu>uoQ z^P+W~Y_xhn={X}7Wo&npx|77nQh3^d016Md=2qlV`2{2Ul9s#dWA8!)}_zDn^X|CiNM5rBIDwe^|!L0FDc6JJp8fa~abP5&5A|(8w6}ts8~czWhxzW!pVL6ChjA zVJO`sO}vVP2t4YOx!Kc>JmL2ViY3pv8Ev|r&R-4@mTGLzyx9<<*9}lPac+njj9mi4 z!%B*tidHh|neOi|U3NQ~#C_jQ>+lkG$^%*l?E7yRdPKgx+(c+Q4gW65-#M$B;bl6k z(v}2(aHkgLHbW~JMXg|(8zLw{UizV(H|cK^he0SH-@4Ngq!98+qAtzA3n2KY zyut}U@cE3KSOncxxIo{qT?)DBeE)vPhQl5GdmO(!ci8YT5xzPlG|7!Jrnx|tK&8{ZVkLszvZj7`X8WDiQk|*)WA(E`y`?6AMaWPuw$$y@=)ytzEGj?odN{>R zhVk0?lrRdoKMq{2kmKMXoO(~x0m;TTt~&NI))g*G9{LaGIYUkt-xf^HDj1|^dyk{& zUg7(Nq22gM+g^CXCM1zTjKtL&Ooy+^>rM(=IBz&$zgw3JE&x||!$C;s;geSef5uUF zS^ulb;R!=3QKyx@zrRkz)JBT(%%?JGAgeP~JN? zQ$@V|xcZxE1+0)v)WVggwp)4zu8M6ab-8jHxQ_?f{zLcel3l3_Q?IK4@uDePlR7CF zr!g1N8A^R?ed46p@7C+9qD^_H$9xC$wVS&FLWPi@7tLR*OxB^2imwvx6e|bBkmUtZ zoH0dAWgldd^;Is=h+L<~sYPAgf9b<!<^Z9M5s)1-Xl_0K zwBtts=k0v<&_Bq&-gW+65&+Ze_Js>Lj|_Hj9zDnK?g>tKkEDV&ukeGfB4;@@N5p;M zo`kuN@XLUAn@~KO8o#O}AEn@GZ1pYBQ=_AoF% z`_eyDcYTvGTp?8C7SIK-YVJBZM_JsxR#*6sws6-;#O1a+WjKYp+fmYvR++6^R!rTi zeoHrBrL4th3zD`g{(c<&>7$?u^J6F59s|RlI<_R$>sgKPGAQ3@J~ht7bZQMy?=o2M z9Go>VA_UhfV75E8wU~LL(F?IcqVI@3#mzn8+HKV}mRN@wsPC*alT!p?l0=pV2re^3GJPPJGv$%1kHhWFhVcoWx<#iq zEPj^c=np6UiFhN%Llp=!x-=_?j{Fp6$nBZs9n!hJ%w0rsjCs44Og*0IJ_&B!q3P?D zAs;aF$25nEh9_^cREXH^#Wb0jb8uMxGBEkj?qtsjV^1xCV}f#$i)$h7&IsX4)w)(k zY-9L3FPY*WHSWIQ?X3oSwVvCcg;l|dO3YN-8B;vbe_!#-Y4f~$?rvXGxo5;S@u#hL z1tz!U#IBiL_+DYE*oCB}B67rCp`huYSAL;Vplcj(eosm;=pmh17yNmjSDAI@TXT68 zo0Lb(Q=5<#4KrDFG|zo#%8U*Wl&mC%QazKzk-HBQ>ylXG1pRv0o2bm2|17DB1Dk-& z^H}-(29vFt_%n!5_arr4rX zRI8{#)aUQP;Rg^B_RmqvR-GEH5$U9WHt_DkzmdXRw$BfUQ#OD2~~*`N6tXa zyBe|dJf<(Y320)xBmK#xXCX%VpNzs6H;bQ{O+7`uPO`;mZ#2f6QAUlCZP5P` ziwM%wE9+WbtERpkA!J>aZToiSxkG+0JK9HepbVi`CF2@4>Vcnn+sIh;tlrT$aLf?V zCBWv;7wKkzWapg2963Z@{hR?GMF)44m{owiogYW$J0?=~{wx*vQ~(WBR@1z)_Rs%T zuG@e$xZy>E!K0|WXK34lU6my#pAK6zT5Yx5JVi791_+FZM-h2E9sh{&DQQf>k3du2 zLi7h=`NvV}p^7?sGba-FnWJnsNiHqiYq|9+a2Sh&vZ)8Htrr!WQ{T6;caoW`~MVL2SG(?TfK~m7lCSp~{*zJ&Qr}7q|p|Et~mVs=+KD@F}6rvXnFH=&J++w8@2O6iqPW6iX#(0Vwc! zw|RDr`R=7h-KtGwT7GrL8`qVUl7-*ulc3H!w193vC>~6aEQne-uacF7?}sWu>gRTFlUVa%{7QEq^uuR$`?mixzi{RIq z-nlav5>;0zsKg2|JVyUed2*OR@8U70`Y7SE0`^hUzGwk?TidQhpPz8?$TW+0+NYV? z6kMKW+DihOoGU@;u0bY|<(jjBoOnvj3^YH@L~c4YB0VYC_QU$Zf*%py_*2|Q%p;GC zz>3L^%If(rOk~k>jG&L9ty_+}mm%l=D>Bp1(@zY(Jso#USnc`VA z1mbaUz=WoIJp`$b^*cGoh$;d^brX}>utn0f*jyztK@)5Lh4kD372tiMdDE*#+=~kD zh}?D2^`Y-JDF+=mCP+~UzW_dfbmDDSQ%JCWmtHTBn`o)*%ALAK!K4%(x!tl}XnV8{ zNyIf()n_MHhxn?e6Q26&2`3USG3;mu zsmHqU5+H(Fa$LFu{LXv*B5 zE}sd}^N+yges)D0dt?$>B^!YX5wFKx8Ys4_c%#i* zvf|fpV*}?5vbSyYaCO@dES7PDZ{hJ$05W2oX8!mbQ5C2Vy16X#o|&+g9$vv}-zE*v zcK9YIMs6yscsx|TH>=}9$x(a7f#PdH5xL&V7lCM?SNZyeZOnIVdbFzYo7q#jRl1vL z1#JJgFQQT3Hx3x7d6e7y!2{Cy@6T!1o$a&$ChchRBc1bRy-pE;35yRdFj*X!=A1ra z(Wsyekvlf561vXQVjEOeiv?s<0lzg=szs%(yQo=12ZNKZSR-xv!?Jsu^=C4!^OWwK z44q$?E}62aw_bIPbq<%zyy|sb&O|UXzmkh^*lKL>>1cs5~QjR00L`lr#96 zBvP-dR}pC63xxRrou^CoX5DsB@Q#@U%!W!psDzV%Z!>#+h~s5M!XMfr+*5FPA#BV~ z)3LKzM*O(c_7F}ypcwbtUp;NezrU^{TvjZBBYpcsKGR$H?dm8PnRxyIHb2DFf6s5+ zJj32!tCrHIS#H7(#YARYElT%juf%87stq2O;mk&r2gCfv!UOb^ZGHlrX3)aboVBYz zxUWJ%BBnp#dA{r7^3aRhL^uj_mD()-xS1I8jXLaNfs%6qW z_6#{vzE@L_7BE}nYOnc6KGn~>n)H`$I zyF&v%*HZE^2n=K~d4>&-UzuGwv{`Nx-efi2t6sQ!HPyjg+i$T^<=5$0-R_35!BSIh6QK=R5X%BrRAQxwOf^R}UV{c!U-n9K?Mx zrvlQ|nJyTN+G~D>kS&->iDgCrif%aNxx>9J#xk&w`lQd6*nvJl9>h-NRA1IYitzpF#+cUl4 zhYUOYOVBo%6c!;LCshEG;#ZfvbEM-1ty%N^w~m?R&ga-~Y~n;X zU+sz>@GC#s3WhvJEu42|mMG(&JEZAdO%SL`EBCKeTf+`p^orcO2(WKEb;!rJI)o8U z5JMFki<2VihY%olU9lX9^h>XlmMwA>HBq~FMazGCsYu`42NI^Y!z$TeHi?*LQx_-*PotJX=LS3jr=*abd zHdC)|@y09Q2@Vh}cqfnJhy(G8GYmbfnGjuSbr2Kbom-QldtVmwG1TM|YE0b?2a95k zTo$rbMthtraCEleugn z&V_O5C~El7l8ikuA_uT2NKErSgY`X|u2~c3H6d*e0uwm%8y>F&xF)l|9Z`{;d9foo zEs&sjs}abD8Gt|Vk`+P{uRBtPXia8rL3!N)8yaS;<~Z3#dI`)w8x&DCSZ|2H*IShT z^0QJrF0{tGWumqT1JVFvhT2r{7X9b8WLi5NFF%u-H0(wJFa9_U2+>vB{BTi$ z*ff;<)3iLxH!`pnTX$c8(G*Oq-hL!|UQa@*z- zB$uGmM`X19&=ybITc!hcRS^QTTZ;I%#xZS-9ZPi{ z$()Ft+&xaLyQw}9o#(v@B(uTE!Ila*UYJn~{1n)@HJ?fl?2iKELHB%6@u3HmQ)3~t zr1b3%I0AL;NqJBn2~1X+;>Vk@UV$vhU>?VWZ5e=%3>~v-f7vm1sPPHOyZ}w zGO2)Qi|y@qHtAVk4{E395L`SU1N)&P0?n}IoFRJC^F|c{K9+(Us(fnwz--;Ywis)+ z(K@VmH$%UCjON`VRGb^;oXM#1|KQbNuYw2q{Gep}b!H`q$|s!a6{%15K(^1M>njB_<12ui^4nyI%m>Tk%7`z9LyL#YF7FM zhAZ##0bsFg>?nF;0^P;*L3?Oegw}<$S8B({8NJ6rCJm-$krt|8LAaF4fm0aQOUSXFO|ItT$kVXuy8%nr6=uAb>QN|GESAHg0ETc+0R&cWT0S9vv~>Fdm3 zRsZDTBUIC$JHWc_5MB{DtV|V7e^S`$n9Qk$88cE7qc)m*rQ~wkrccVEssk5kzvFZPL6z_eB~Nat2i5#g?+#gRx++0q^(>FTOwYO)oUqnsegOEAe)Dd3i8BmEh2gTQcnxzZV9%DXONL*39M8fOg<@1W=lB z@&nHBdw;zsNEI()3LP;!a5EVF#ZvQ0YD*Cpm{K!)vyC?GA@n1A&+ zd7V+2&DGjSp5-UbrZ{3T6k}NKz2^W;&WfrQQ#JY+4On|+XaE)H%D_AgY0K58t|En1 z8XCvOZHpLgGY^AuK;My>ipmRFYUO~HF3N)AJ zPoS0t++1T0_%va}r<5(+0=3&l@B4Sw8bj9Ui%n7m0!z7kQjzUpDZ3faNI5l6bAr5k z=@J9A?JM0`iH9ENMAwHD0~tj}<JZ|w{m&UwO)YpqQvwIv%pzgcP4F&$~q>=9|< zJz`}zWb@FGmM>a8whun~rhc}!+kY030XK{WUl^jfUuaV&E%@RsB!r9DgFc;29bk6r zNta^Tzv_;IKhK-^t!`Ch*UP78XZ<|vCi4~UpXxYP<)vm9HTvxhzNz$W_^mpUs`FEa zLY2b@n{q7n@eHxtQlEd#(<9VTyye|YMQ#%3{_;m(3LXySSeMS@Wqb;UC!Gd%OU|#x z>?pLA;8_Y*tl{1Cm}g^daK%ZB!DEAk-dS)Hp_AP7qGer2_lZJdi+~sI9brAg^Gy}f z!=9eQRaDaxBOQb_Ew4vC`(z&w>maF zZQYBryZ*hQ9O6hT=5x#x=F5JO46^#LJ?PPrSX0K_2H}M(yDvYs`k?Nxto%Zx^rYX9 zs+|NxLrcrb&io@|G~JAthh~d zhHNoL`VM7WHm8ag_v!3QVOd+!;hkRHYcT99@51S`Tz54cMwneq zzU6gYFf6Y5Erh$(EV3g_8$zTv;*k<;;oi%0%DORUzbVy_^QVKyh7JTuIp`Ko$5H!ZcW4f&bOhm@^2KJIC%4$}rP=KEQZSuuJ;I^r|8Z!ik#p>nRL0nN@ zWc?@4U2i1;iPzegS^f)Sc>xHu*aVV^ohi1Mz8?37j!N0}ZAF}ihBi7wWk>{S`u)+k znOo-sn*xck>UO&OlqyaO5j5X<6!YR!6_wnC0{SNXSYJ^1OP=b9)j#l*Ed6L3Ju_9O zYNzKiq(Y{w{?=j^)!_kVVrZl2$h7(W595MU3VO+U9Y| zID}Z=sJlXbBVZDKz607ST<;zjcjq(}Jr7RzXzVysN5S_IcTbfc3v`r@`kc3*{V@=8 z??MOMvSV?CC(^U+j;&oAncYmH*B+i}_MElg|3#H^ZbppJ)x>+y{nt|Qg;)B4cTAqv z)((zpRJ3h~3925nohi+j*SMuI__+XDc8o3YesNOKCUK8yJa;$O+K43h*DV>?Y0Ggf zD0Up51zdJdHq}E+eSUTA$a;;H0LRX#3*2+NF1L58Pb|pmrVP73Inh+aH*~I}&~ZMe zu56wt(pTu7HYYB6&Y@j!NM|KjYBcZCV*8rd>9|p8xu>H!9SXg;IGsNZI%e{42PAKI z<(IV{xKGL)1Ngm<@DdicZ0Gw~OQJXup7Chh+t@+_2_-PE#!yxi?E z@3itx7GnC(wWJf6bHQm3pcs096@0FD5J(C~HS$XN^}B?VxFW(;XF9!CdQqat>7Nw;aELq{g;2F^4riC< zau!@Mi&RI9(bF*v9!Awg&}rz5R~D-XSFF*g%DAi;ZC6#D!qD8r~++mN6x=l;`Y)N&BeaBOR;O?>r(- z32+Pua!<*)p{|HA_Xe3Io6g1yA;;do81;buoK(fMINgbzqAR(h&!5^-tDeu) zU8s1tJWZW@aiPM@>D08FXRibBHLlF29;>c3U}}5=)~p0#TX$XN{m*^zJ7k)!N(dk> zDtT?BV^wuwP;jb)-3MGr%cjARI zgiT3n(|w;N&TnPyA1z`$ANxoNBk?}#i$W8lLaeVNraJafxgw@mh`_I5Z{BWHu6RuM z&QNHhQLXOD~ z86G9Qy`{CvqAjsYRbLh!$CJz!dJ2vuJ{v!gd>%6s$JNBAk(c|iqVNh}KHm?7=RT;g zZbgY_iYZg9AF*AvNB@a?x_%#jNv_>aDqpwTP*T&)^ljf1ukEkMuN_@gnyOp==F4$z z`9lM9I}jcbJXV<%00c?dxxA~PUtC~FrFLjgx^~dGW=91v5v?!u~=buat_~T z7;M$v)qEs5=(AS5+N{ z*8J)QvGNaKEk6pY{|}ERluAgAucJ2JGS?4 zyLPtI&?CE`uT1!%-~CZ6@UNR-3~LaeY$EqJZ94=P{t#Te&I!f*?T;t{jx$GC`L&;U z-5>sp_IAiL{p>}sfBPf+`9Zfyl(35K6ZMa+PdNf19&@)P>4z`)Goj0NJ=jWX%$mQe z86{_Q0mwLPB@LQ?`y-BI!B#eFt~>anDC%cU*vr=tDe?Q06aM~3Si@GPCj9pI@08yb zxZ>M!8b5+z{A0KN- zA>kqmn@vh5|8o0(Y&-e3!NW|__9emFS!KYLF|91`4;(bVJ<`en*Re=y7pf$(7(KA$|G1W zt%=6$QTSDDAGlh)m!IpI&}*p^SHW*uy*!hbhPMwPU22>`cjW_6aN=6%DZ5&?;(c+3kB=2DLQ8fK6y*sYW2*1gDfmiPgT8-_n;TsPBuo?Ov zFRKsNLAXXYL~ou#jB_79cJMJS#*Y89kw5z%K4owl4v7gNyYp+}EA&xcOVa!4{-_f8 z%?g)pT@mzA+E_3+*lnKlZ`C-w4VyQo_G;Q=0^p(KEp3VPKj)vFc7;5=jfC~7q5tS) zf8_LfxM7VKvl2v54G&oRzW4)|J^tXj{K(+_n?G>x5In|w%JdxC(R=&gAKM3e|B!W} z<1s>T{3{QBailGc7FushN8KIhUq8FqXpi|gku6W>N%|H2%O3&*k^7G>(Dw{_x^`oBsWc6@hdhjS-rSk%y^J!YO;xC@U>PGjp@U5 z9-+py(PpZ_nTN*3)@Aky9_C_ki9fj5hEHFeE5?^sL4 zgMzeb*b0)jd?-&rN{^tZ2A$TV=q6!#VApDo!Xj6AGV96yr#1WYANzix6Q8c;J=ULz z__45%ZQ)tX>c6@JGtpuj$J1YYSTV4UC&UUGkbU@%`|&T&ez}!h+g_eB_p2+xCa?K| zpgbjw>k4@MBZY7?ziHj1JE8Px;7)l4A>NJ&Oqlu6H+T?~E(nn+&}@5ei8JwfsYYo@nN0r0WcL zNXuJ-(nXUIW56x$7;Ck#0hRGeG*97>{5>+IFfaGZBc)Ko1i{}g{X+`?n8+j1Pid4% znz*hb2*o_#b!bu?&;V`Y6;tzhPi>cN(#j51f?z?XzWYe#$OKJ(Hw5}-OR&dJVUKwo z^YyIg-D5r{AJ#2X$NzD!ne+JB4h&~Pi~UCGZcug+;{@$twd~1i*&+$x7=!_OFuU$% znF|dHxP&A@O{=A6tr2-bzG$LLtY}Vo5`g}(b4dRflt`=1x6Y6%Ky9OO8j~~RBGIlIVRKrB2;9W%;-XHB-j!u*fK(PWztc4P82$Rjca{O_Dt#S+DA!? zsdKAm4`hb=;R4*lfgT8INcKXgv90=$#&Ny+dpp{$vw8J$3@^YPhXdH z>5W8II=5Pj@-l6M8mn9Tc%o(vY_S{ zL9WjU8Y&VXD1U$$JFx)DovpDwkAggAfbv37sL%%>G4HC>436OPAs&m&FR&hAjpa?~ zKJ*&GFqYN_xSI<1jy^2~sq3I@8vsGe)ae6PZe)l*tNED(kZf#MVl4!~n0#loRNsS* zDsY9FDiZy(&l4Ur-O;!p==X~c0aYvWN1}dF^OfVVpbi01)J88}*N!?J3itBr<|+g^ z3Y!H@fb=j0v&3QmEY&Zfi7z%4x@ZE1q>{+I321jrmmLoe2K@paC9)3Bj$Sl8;_(ru zyV1CcPjq?~UR@)db=3JRb6-QoYy7_}MDxB%ZZKfm-%q&Q0CMM2+Jv<^wH!Eu8Gu~@ zMaA`9^elVPx8mM{$ttT(0HHfpNyH;-wEj(RF$iJj^!fk~DY}ye^+zLwKnG(O9CPJK zxU2F-=n7RL09T=R{qx-o!{DN?S8qM2G<3;{c6R~1aH&S}LK;}Q3tvAn!x@Z(Gx()V zY84TNlH_d|jCAR`gVdpO%YR2My;q{zRfV&D>C<{yar0t(!m85Y)I;m3UZ5*2>b;Qd z-IgB*xR<5S>zib9q?_nV3q&St3m$ok611cj6pjn(`V-xGC zv6NjY+9r%O?;=vT(eAI=9+0Irr;pX0()Op2IM#@pUgoU#`uK{0N!!nC+6H zLdqv3y48s!neC9JpE&=xe8OTEQNY3?E+g_$HPWyaL#i=DuL`*3j2KXeUzoZrPxSEpmOulm1;AYa{xEn3r$72Wk36nGG&|ye7`0cOD zVSl=*FJGes?D`1k<-#XMSpu0eEyilP|BP&&0-2Y1=gW~t z?gdHZ8Jc9{8D(8pg@o&PP$Y{F10k*}N38MnNlru&O2%LVf1u0T1EC;oZCpbJZ2l`| ze9ghPA{KKXk@*_}_oYmb5fGt`0zj`_ncElHwg|$hR;3CRCOU=To6u-XQJTvE(b}x2 zp7z$J*Cq>}M^>caNp_LbiDn|tb*IXs8MT1@K(Pzq;a83Xgy%^>%}4SzAzDT+1RP^k z$)39^5;YpB8;_OpBt1Q}ojTVWmL1cdSPGP=mU$X)`g*fir-!3t67Y5MY#1i*@+Oow_tljN&HV3a)-9 zr1auiri4GHU5Q4hR04$iBO*|_>~#6$12QS%kq>mr2Y+>w?vtpt;2jKMcqiI#^?~ex z&r9%^!TgFt%u6GLqEarj*|vEZxDu0B-)6(eKN~r#+Ju8UgS1|4)g>ua?O|NJT9Fcs zE0LY5IT;4>J|sz(g?V3Q0rRbD%b>R>JCY81emN50&O(*NI!52iD@+l-fr)-5L+D5FN;ve_v@FIy&P~A{6-{E7lbpn+W1jNPYtawK^$a zbXv$bO_WvYYE&%2Q*zIl)+k>)-o*Uo#MSGoPzpki$uWvW%P;l(wJxJ@(v4``;rrrU zw@o4BwZW>NUqpiU75ZEh{Vn8o_6 z#3zmwXzE0y&{jpovpg4w>hq9pQm9ua(Oj(&hl5v~z)^@Xa>ZlG-xX43^T49T`voB~ zoY+&X5@qI#5;(LN7J9GTU}RS-ZC(%xN(%;*?JU<^l*o=fMG3E{eb&SiA6_d^I}09q zN3~G*I%=Lz8q7P&QWy%=sY2jOcvY{uolf=V{bDvm!T=k^2g5Ln$aTm8@NL5AAhtC& z*ZSggE8a^;4TWnplt9E)oPzLiWiv{=5iMSlV+D?F6Q--J(9D6h#t-Y5M;Yi0b+xM!+4H6$o->hAK^pWXm6O^$DOWU9*(#G>2T`Pc0ew>wbn&84ukcnL_+wWmAKHH zF>sKNHse+K^*J`kQJK=6d8IWyYhO$2P2`|<{$tQQJvq^LM+@BgNf4#%eC`(^S+cq`N{r1zV z>)jxZR_*<~R`3=mu#OzH`&h7;34yin-By!>H{|6GN?6>Xg$BzgBlVe*G)ZD6I-RSFKvj4@_C|=tAU)6Fe_6AQvzp zq&Tqdbvz(|FAyhx6Ly{W!dDQKylK~Q;VP-g_bz=A&Rs~m(;-{yo78Ad_kO?FL+74s zPB?MNl5ic*6EqE(-jSjFPrl4)MYHLT9b_Hk$xxg)#LSgx*C|s7ZtM){^7LfXiWH&* zIykRP9>KCIu_miylQKr@2RWxOyu5m5o)$|M(z(IQ3!$qm(oHMN1z3;uPlIeR7qdke7YL_@9BaFjNM}t&%^8wS?-oY4r3Ixc zfUqvPz2(3JyLxf3gk$g9M_fw#{o?bk3_KcBTF>)qu$PZ)6UTvmLa(Cy^=gk^pEQ#F{LzPcFKLQ8+sq$5a@H(Ha=*osfSvJ!0Kc zt~-=p0^si=Is;7KTcQ&V99EVkbU0Z;7-q&}a*tObW#0V}x5}RT|A0 zY)m;rMs0DqJVi5R+{$o4cgA_~?VWApo!m>*sAbNeWy#Ah9rn!VQx=lq=akm0d7$D+ z@eE^glk{_sF{{L{uo0Oq?(zC|VL2GIev)&#?hfZaIAJ?b)QQbRcCy7eE=!&=;jZCT zz_MAkFWfP$+!j^jDx4c!786uGNhMwpKlIT5)}vVRrdT$R_$JegUiqFalGHC(t{F1S z=kA{#qu9r*M08zSv+q;lCNm@7ER9S23%Rqcoa!m_xO<0a?7cxD^w(&*EHH^w` zkFT#@*u99kd%mWZz&8itscsDx>`Y6}7nz>!0(+DSuEul-4Q=UyOt3n6 z1V&zD>UK{J)OCaMrgyqK?|Q0wj&pmCeI^GtL(mHNA6{}jxJvFbOso1xJ`JYVVA0f% z%s;y)K&sT7b7ulA6Ko@jB(2-gB$9`(O|Y3?>WaKqba7LP4OI|v$tDQ}MK>KkDDbCX z^shXuaLmiaxk=;R_fM5`eCL(<`=l-a7c91gMB9_SlM8r zb=Z<;fydm0@0fL4mQ6P>bt_Ah<)cEkjt-1{(p2EZHY#GXM}ddTCtd)PHZR3cU^I7f z$uz$~o-p3!v)^zeoVCwyZk0mny=BGj!?Tcn+4x|GnsT%p*4QABaE*f+YqWxpKVlQ_tE_N z;!NOfo#cbkQA}d*pB#NIa8hJW2n=SculjFpB8}PHSc`#NeD00h@ZjPeR>X4*tHJt55IdsdDUuVnZlmK$+jZhI37ax#LF` z7N%ir%sqJX1dpcUr99f1Q2Q(a$Hj(5`dqAkao)b`4)C2^mv zTMkdd3w8h-i?1$H#?$Tkt%BO$yGsJ@!8!;qZ!m!BW5Z2Pjmw7_ZmV;>gUZ%XG;_JX zfs8|Qk?yl7<}XfEkQ0Bs3W7nullDI)T~m&fl5o$4^K|7XyLdj_&@`qCEdf1Vv6vvF zBG3gaodC$sWLh&U9#^)&2QIpmcSP<&E8vd?z8*Cx56XdBUAk2<%hYiwrl;?1U9$&w zG#`#EhEJ9u{ISiv_nyOhrshH7XOHA?%1J3GGCn=&cS}a547*CHiGhk45~r&HcG$#+ zWrjn>!)1mE24A=lii-5#kAd-`bZnWz^imQs!Pi7zUX6%c*vU{yXWRFoBIL_QMErx) zM-XEu*60IBI?R59dc;;3)SUeFcbIzL_3l8Rf5g>R9<3x@Rx~@QkkoawbmulOF-mMK zN~=;#DuR2WIxNXaUBEu8er=qvwc**RdufFvUwrPM5lkPyr)gk4Gu$#~ub#t)9aCI6 zk`J*`7ZfMT=8*{BrOy;iuW6vNJ29kBZORdLW_qzS5mMw2isJ{|4`EXakehajyWG;6 zX*D@nf91i)CAh2=ic~x#u_7ILDu%i%#1MQaLszZ)msT@KI-9+rE_62()zD1C=GAYH zpuhxknK(HiPbu_VC_(D4<{f!X?JzAs$1smOljRqsS9w!a7`LUmx2p7%D1CalYAA+9 z{dMuG3R=^aN98F{=ekJk%ww4$ksA71NF|N|$g+m2M1!{Rfiw60XGYr27-J{PN9v&v z{lxEyx_CcSY|1f~M29%5#>6|L9rwf;KYndfRuI<+ ziX$w)EI`p_+ko^V8@HlMk;Cdv*+9=ab~X7FcgEiwPK}OwyJs3<$}3*9*_qKUMpAOUU5xth3V8`P^Aej?uG_iydb#Z=%KuE#z`J#i|MX`N(K*s6@ zXI*7bE<#;q%FYc&u$?t)?r5!>p&Q0{Rv?I?22BD7LW42i|KKqfa?t>sh$%OzY5uB_`@cOdfgCUwCC zg2}3Ei0?(zr;{~f$PU{49pYE|Ynt81sOb;%=1VP^dWqgI;?z3eHtYa3!uy(Be7GGW zFP`5o$K2=uZs0f^T{FjkU6P_`e$^8xSBJ#`Rqyg-!pg%Eafo=jfMj+L$=Ubh??heQ zzjEXM>+{Wz`NS(acr~PlU8+sgF&~S}=c;HM4l>OPzaR=qpM2Bn|+TrIH zic3(9ROFoW3|HnoT|j$T>)TLXxM`l7&BBlcnFuYS*xLl&AOibK1@%mk*HT)cX2US# zSb;nmabNO0=tEwai$YFSY068b!6}5zAlmOO$p6UCm|@#-Tt)ozjk5%5d3kvk)Xn`* z-D5iyCFA+bdu3T?CBveQ*2+pW$Y^&{f;`1wtrjbT-mKEyL6@JOgNqA?#CZUGn4cb+P3)O3mIsp zC3-D1trU$O^F5^NG{Fx~Z-y9RedHNh2Sv^p%CREB8Lsra1T4jUUb+-J4xoca17(7#U$xESMb9ex{$ZW_yv5Ipl8|(=H-{)PyVkF`nii3eH&0* zcU>I$z8{h=u-y(@W$0{s?X8i5r-b$uy78i&F*k(|th7E!-AL~@Vc?ixSKEJwKHohL zAGqDQIF#N)qb3eZ`dWwM4(-eeKY@L^{(<8Oy(jn-pueyzZAM$Z-vm>5XsG8DeI^HX zyB?NC(Q|!L6#DzRH{fONHJb|3i9wKK2AYHAtFW;Kv^CLJ(5*D1BnHv@O-_JsC*2D* zqb;f20kHWZ$8rYfUEmr-Ne%eT_BibxsU$oTqPN!L2A6+mQ z4R_0w>3$gj29r5|FP$w-MGxx01_d_xD@53Esx-lPldOf(v<))nS+J(AHG0rox$y zTlC%OR011`>^ertrU6b(_rvO*6HVJE1r4gH1c6Sq_Hs`YPBqu^Wu?1E>aer}q)>0ooJvDAG3^Ok0mfS}I*hGT*9 zbS~^+;Hcp)>R4gw!XD!i{~bfSykVI8?duzl9~SNO znCx%Mwi7+w`uwSoSxKzI-K-kTi4JCX+c?1I{25B& zfkM?%LTr564-BLSVjp*fJ67>Hm*(BFr~>4ZWao!Gry=WIsF8>=6mRN;Jd-Ce)ew5q zOa_^ZZd|uAsS|yi}@WgvOzYs`xX()1} zUM#+Q)_55D0uNVfB}l`JbDi6mU3;L{^6)i2ftaEVNm+WgrUIW>X|?zAB-5*SP+{5Y zE|5Roy~nO->8fbca7%i6IX>Z-HYt?QdTWo@cGS7#y;0Z5J~ap>wMA5G)2!sp6tQZ2 z3m6g>O2LGpRt%qkDr>dF2praX0Hl<4A8XH?f{{h+c$W(ZtmzWm`DcJM011SjWhEv^{rj`N{)dvxM44 zbXA7up?skAIRX|-aUICpddyfe1p=6`Q#T&d46o1)jhDN&9eF0ROMu(C3-u;`$*LuB z5P{zBm!%#iWTxWL!)thFpf0{IFTGlmz=!3ts*6)zc4Mkl4i)C{9;MH3$teMt%5tFd zmoZvK#f75(SsTUA&%ne>ulsHL18lV-ArlV}E6jR?7wm$e+@~8uV4gRexVZ%{uvccU zk~HTq3^~DqhLK~u-d{)Tyd^inu;Ag^9Q*FBo)ANU&IpDo_+HE&j3g+DUmUDYU@dtU zfo5Rq5Yw(iVtfs}m!@-*6GI!Jav2&CFNbB)>S<-uvwrwA)>1!#Lr2$+$pYJ;ZbD(X zX4OE##*Tdk93h8NFkhLiGND#|domO(Qr)HpX;!W=Q3tzW8#Ea%c}#|NzMlo9FP@$B zWr**#H)a;xa2*tNz4B705PNl4EB@hMZjI% z1H9foNfp*IFX+mcmI7QBhg9xb?6I<~*>-yXOygX5F*F*7RZOO}X4b(+0OBv(Q9$a5VOx z{n$%j`px4AyR$Vz(60*saIB2`C=6NCe;+BGU&3=HfP=6po0!sA%x)OoVJK4{?0Y#- zcG)GMTmSMa277=Fnask{pC!_T4~#}M!_1e;v*k47=>~?tsWTlwZtkgLg$t%@c6u+4 zAN8D{%G)$U;cm;cVn;P}dNtiiDTt*`O$|n`z04uKa3)0imTGqSo37 z|JxJa8hsZ(+v)8+HQXXZ)(w7bVPay!T0-)u&37KlfueAFg<#>gi{TyqzIc}-sV(Fj(x;NM9LUQi}?n)}oM9Z7a* z_mJz1c-jdd5DEoL_hnR{=8kmPkD3-PvmMSTTzcq>M?<^1!K;^zCRo*w!5)l5K~ctS zs{diY$p&FGdaEKhVWqrhJd|bCU+_ym zCfy^F3=-UMmgqM7bBJIhWdP*9|7m?a5~(}ut-fuFq@eh{aQt&sr+=xzMWeFQV4(?` zNWT->`z^m9ow@=DVnj9uuU4~Z%c>mJNxgUq>aU{nGb5Y;-;YYWt2NMy8u_JwSJvne z2eD#x>UBHWMB?05#P%l88suc%TM7rKus^z2FGxYeD zAEb$Sb~;SX5w5*YTYixR7;QHMgo*YkC`KBG9>j5GE#ya;<k?Yx*QR%$IZ;aCgaeT1;F z8_6ka@$*S0^qygIB&y*o%LFCjf=MCBeYM!n4Yl|w%Bo{i?rh^e-IQ#QzFVH6D5pYK zs-#^sBZ42~3gUqgm3*cM*-QQ0YaDo{RbP!MVG73(C^YRd!2N7_-;FJl;9 zs3VqC7vR$pj|~$rPM!e8FB@I>yvcj}wnOLM-3JT*?HdS~hVC*1r$4t>>*{AiS@n0k z46oG*WPM5KKwT^k;>oQW7Gg+L-;2pyvq|cR3;?-?#b=FyRCE{S67fhT@!SxBtDSfZ z7b=!XGlA~JNtPNnNM`CToP#ikS<8fb&&t_qqzw76S8)Vk8Gv-;w(BvpOG^>LbMK1Ua)iR_lg8E z)YEOTF(+@8K#L`uA-wkNV{X;^DD6NfV{;VGECWM=t9<3nVQex&0f~+S!i_!QqL$@= zF4HMux#2xF{<~gF^Tido9kdA1r&ktD#@|mAyqoSKyrwA0cYJbCJ|D}({PK7zkYg!qU=)C=7t-> zbg2_m!BKXogG~wrQQ`^6wT>p|4U&eJ>RjDq{667bdkEG`U{{p226%B1e16&Y0TON< zFtDtzL@2b)?FsIOB;cyW{M5iWbowu4h1q23#NM^!kqRNjqI4q_{Gb_%%GP?)S9$st zFE`g|CcyPr%eeGDKQEC%kJggd{2~x;py$-`+%Vjq-N>9y0qUgWm1%WkgkK>B*ZMti z8qK#0s74?$9b5ol7LjTyV)efpbNMp1{4LDJ3M_ZOq5?%b?*A| z(t;UlzC%pPglBFyi>1cfS4h_S}nCcM@ny>)^ix2GY~pXh-2-d2}AZ>`N$jp6#!S?(PfhJMR>;mss ztHa2?jMv1`-7`MCO$xb+91>2z<5j&{g(+2Hmc8$1mcaSS; z(eHse0(X>scgZP;hX5H^3Wk5@fcrwbW3`F#;#{@&{WTlK_aYL{@CTH0Hmobf1dfE$ zRfU#Q0?TX3m_NJ=S?}mCkn=GW`BB|x?_YRxvp7`5YCpC#6tbt-2aWT(Ou`#>iXRc} zxKgJLC9Hzw`Jsoe^$Bh0dI5@~;`O-%63#%E#1!m{=h@r{^%U!5*U8=_AG6?cKyrp znX`jG83g_D{XYl~9<`;hrGJ8XbqEa-K^;Sg>74mNvT{uSqmY!+EtI$$C zm`c_Su9SQ^a2tJBir)Zk5z%{10c~Pv5b8}SSZmzV|ALSfxT1M1fF-%zSD+VO9K@s1 z1()GA!uUX`4jIc2a2gUEoA8v)K)dgTd{$iq@5IPa{ zr~tj@e)1vq{w9hcqSG9;tbgGVO`dpWS{cfUh>~fWwR>dxe%1;7aln3uviftoR|ruF z12J9CJvkDygG#{BG&!IF(BrPgw0db_HV}#*r7+W#jp{ai7tXrLswtSX!i_MH+F&Mm z3T}$fXROV)!f8EpL2xma=SwEgzfIS~M~9H`eqy3X+d5Po)`4fb^1J-X&lbiYzPgFZ z6)xSUpMHkf*wxjKPvA*zJrXFrkJdpQgnKqqTj^Y(%`Z@iQ8%=9;ILsOZ}uP*Wu)TH zJ$)oOO}j%}sJGU|X+B5qW3|C8HMw28OLYf+({03}D>sQF;S=&gP9q~g6olu_yZ6&A z7o+wVPOS2At{NOxgwmd-@s8Jzs+cf6(k2EW(Uu5F=lf8TD0%J2Z2ZcX0ag3d-8NW3 zd0y@nvWY5|bnDi!5a17rn`P{U`wE zpGdo3^&28yO#{$=F#yve3}+x&*+waxw_I)q=>1v}bk;~JCG@sDe-%c}ovj~B5f597 zTm)=cD~ z-fCw12fla|zj(cXAWW}@m+~17RwyK6mbD+~N^#(d`P9OJ#C(uWREE7EOGEI8V4Cd~ zA3SD;ngmhc-(R0lw=QV_0?j}e4|Vx^WI|;n`VW+^c@IH!wZ*Pr{Pc3c=JmdKKQ-ag z8jRM!lz+I)(%s3eY*PDVlF3aZE-Uxv@5p!mQu7Vs&Hy|7*bcFSUkG8=uWvApLwMAy z61JG`G}MSPj{cT(Gr!FD5t3pE`-_VAsQ5iUJGN&)sTFz$OtT21>%p4F=*FsEr(Jn| zuU`R5whlLbHFp#iTv74G_lVF55`%j>2i0xDr^vYIQ%w5SXO;F*SY|N6qG0Sao*dHt zhZX>WzWenQ0EJ11m<$OGQ&Yav5L@X^$8%Q(YPq~UKNh&6n(d`0Xpe2e?;t&asWZ@XLx(uc{F^QqMf=QIu4tKOyA!I z;t4MlCLbHvLF$KYP0Kjy{opA07W?^e$d)cu$99JpdPxKe7=&(|v^m*ZCY^yU5GtWb z2B2&K#afH5bJyjsuR8^xuxF}KG9OR?vM-S3av0n>D8;TE_O>FFqM(OAyZzWB1E#Xd zxlh+!#<~?P1gTT%Gm+4WtdyOdDLs@fJKFSX{XsREe!?hkaFK?kuA}4Nwkb=M`~d@c zk6H?vteSV|lxGjvWJ=R~G6a}z(uTKhX+#eKzv0D^dMG4q-;>B~o&lLg-*vr#&opj~ zZO=N?FW3oFT0TI-rk#k9)leIRIP$%(9?z8-pp@m7FO(Y=48(<{UBl*Sg}6ExHyrBE zgho;+RAVFjG90S0%i$7^rie9&UDr`dg>t!#=;<&~8;ooy%;5ofx~Ep?;)C$0sPo`s zIl^k7>kJ&aK*1z%e0c^4nG_DXTg9gkfJ0a>b=j{z9?r=W%h#tzE}R(6P>`7genB&o zQ6?R$0ptjp5jPiI4K}J5lQhS9{bI|r^@}N*TgV;|9M5)vVGP)?!L7k5vb}u>PVVLw z1?~vVm{y(9mhvc|l${5PG5^EG^6V+uK^7Kr0`cWpl1nfY4J8<(L>M)Jl`+fg-Vm#m z12w(>LH*ECO)NePU*VsxUKy(X?%8I3KWb>&E+|4BwQf#X+zOYU4fyb?%LM}KLEXX_ zvD)U&z+8o;9B}0q$GeJKU{2C}F%+40!PXp?PT#>s*$p$-s~0 zLzp^%Q?wYrueL{-vSdK{stjSsa0(udsji=nh=(b%D6)h*Us0WH{^51t zNqw=>yR5tuO|4lrVGNC^Mz@%`ez(hB8slWKE^7IT|FU>WuochOU`z-K=sOh|^?M{v)|tDdgZ0R9nBP*9AzSkr)Q zQEaHG)pZ;J!GQ`=2yqfMu5WJI6FGEuWua*09%#f!dq+yXSWIrHB;5P4( z9>Bf?LKfC9b%=9{R3Rn8Kt*ic?ZW12UIB<{X1u&OH#gZXzc4e>jrutern9l`8cKvb zsAoLh6~6~fZ{Y)yAbd_Up#6gPr*KbLevs zU_O|%h=KY94Qqgla~6<*_*4QwT#|?F+uK`cl@p)%39&@oObj|KXIBMWY1igw@K>)n z+@$_#7+9%Q5n2mRBU_+2KDlI9IAtPg?EP!8sgQ_eCR1fT-@pA^+!jsurVkJnUx{ajzLYjjuTgD1XiahSerZ0)ZsF%VvEu`P!Pspu7X9&ts0{b1Oa%hIb5 z6B(*Y`gR2vydt`O6qX=G_tg%S{TrpezTDt;hs8e+ z@(8j1r+FVy!we?Q4WIu!j%p9gI|&4Adn@$DixFMOAn!_9XA#gUzjcgxg+$Dbb;_bb zq(>(ZT)Lo&QNbF-&_)!~pr=SRLXwCXVah|(#7VtJD&^Y3NFt6NDY2|q*xbVro0i)Vjg>f(v zS~kOBxSw|EsT@>N{x{e`#NRNo?8K@kaDJO z1y!c42`6-bj&>1f$M-Y`NN|-{M-{L|>eCecHYjTu12wHIqE}Yq(;zadq>ByCk*Fa4 zx|}t)HWTdfX{MLcgAG;@Uq6Dm?uIV7Qg)9XsW%H^T*_qO9H)$oOJDbqj%$Hy9CE>L zKK=?p3V3Z@CVjv;I3^FF&cRxCI>_*}=XJcEZLSGhG)C6cCeRQZ z0sv{&Te`bb$A)T&N^FXXpC3+VYElP*40H!td}odebe7!T#R=FB&p9R5`x@F-Q0V^v z4svl?lOI|z4oL{H1>#VeJ03u!~iW33*l1qf5IBGSyXF_Sp zY5uVpNv$zKBc92#Yy{%+%4B46=DC+yMX31>hxeUAmL!VTMp-;t_is743lGrE%c}ORXCi%>#Z9QDrnn(D@O` z389Wsfm>sOEpTY6>q8y!O)}q%P(MEv$X;La@owYAIb+KU=u$(nr-P*+wTjo%`ZeUj z$$HqmLn_#J>Ms)QIty8S&C2%gSOk>IJxJ=vuQ_<5GHlvJC(n&hL5IdfKJ!wlbxRuG zS=9LN*`x58!m_gtV6u3qU37JD^3uoph3(!4g$bq@?N3KRB|vdsOn0Dcp$ge;alF(R z`eaUSS(`Tz_hJ$2?wSTkhHyd|F_TCnEv$$kT-s-lV5Xvc3629|+N1&(nq-?auFIrA zwAALgkp;03^80=Z%p$6O@?>#^nCveot3-A2UerX!+V{x{5=G)M7P-ME49a30BoUGj zEWlg^>gT<_GRM3TKJPeu-m|u?%yhd0c~q1t*Lm^^eI8jH;B5#H$ypGMkaR;yESaya zyG4Iki>eZ6`lweS%S0a3>v?ZyV@l11R5Xow-lkV>A+Ip7t9TLhBLMgssGdfBDzq$vB z%&BbKj*B2db9cA2+n0qs?!&21Ae^R^yo#ZTgAHG}h^70Dg5Zr}4l;|Yz#AomHUXmQ z8Dv|T_!dz33PDYWq%mh>d!|?t9`K^tvE>FsRtRn<1szk8Ytkk~S)cvT7s2={r+jZm z{&NcOy-@UT{}?%I5-R{t;4i;ixL`A0|(D=&F#G{k|y)LIZlWfq?`>rodqokle*v~VhJ^Dh+7d}0%vvrw_t!5ZSK_QIXx11*Pmycd(ihK_X~0Hf zjZU*7^1a)NK9+(?+2F4Dhq0Z4etmQSGr%gj`mjuJKmY`dv6zEoSKChA~zh*Fh?6&v}J45wk zqv1n2F*WT#Mx0+BrE|lfQr-nj988sGDh62r^S$6O*7=ISZT$H)rnL_1VO9hg@3EVP z7gI-6qs(3DczU0b@f-a8;MD4mkI+MxVXSZu`QKW?f4hu-6wxlym^gpt4$$+k7q`ID zN`IB2F#w6kd%3xr7Sp*do6V7IKmUag>H)N-r~wY?`On||KQs-T2dz;gU685{b23?3)bOz*-U{NiVdrqSlFh|1{Dlf28*U)=}L!)53C)+ga zXgoI&gq^zf{N5jZ@ti`!CPD84|Eh^f^c(yu z(BJhZt)6J3p-&5C{qH;RL?RT%wMwVm*R#i^UL=%a+7 zIE57sAI44mJG%^SSHpX;<{^5|aP;r+6vZpud|~Jl22nLiOiY#Dr=Thh)G87wA87su z!R7B-pX9qm&$7@$uVVm|Go(eP=I4?1vdpK_?Gb3`^h;UgCur}o86E>|RNAzVe`~jY zwErxKSzhz3gtorVkii-pNfoEp)MTJh25kA$c!XY}iOiXd=4aE(jr_AN1&d~M?s}xr zz%*!bgx(ioA7OEDlxyBG^f8U5lVGz{XUxf?h64p}(w|*s62n7@gnbK>} z`>1bpYhY<6B~WgE7J+76kzhfYW zq=i8<0Z3P?MbMuy&st5~K1ITOAtVF0jt7AF&DOK!_vpR1Mkm*T^vV`g>n8acU=7+H zq;huSlK zamvRDE4WdV&on)PP^uiydaA=dK|(?3Qd2!Mot=8MO+NZ26ye|JF5~99-G1vd3IvG6 z_9P$L{ol@@2(d8p)t;Sou23sQ*>bKD-O>(n(M&$Y_t;ATH;94c*QR*q%+@K=#RDL| z2a#+quNq07qTjD1Lg`)Tm@@s5Ir$HZ#-b9ZK(eiRc|`en+RM+^?_})ZnDU z&Q@j6`R1Ds^ZPI`vwb;1byNh@}m7wYJ4>A=*Z1X^uu!3k!XW>DkD8t7JZx=3;2UmsTDD1z4#Zgtkkx z)vjMn1Z`Y|Z`nF!IcWD_4joWBDh`KPeORUxeUe#b6q9I6l3EZLjY}QA;Y3@K=Lqk{ zl&(PUlGJ>GB~dP9VEg_qB=*C_uq0my3(ue7rvE?I-a9DDtlJ(|M@DH>3?L>%MG+bS z1&K;jL~`n;$w7jWGZF*@Yy(IzAd*3H6B>{V4FW1jvOoip1SAKc$?3NrocsOt-FIHC zTT^9~Q+7JfIs5Fr_F8MZrT+FMK1^i?ew-xsrHdWJcQ}QLUyFHfJKiF?H~89z?DjVND7o-yp4je?^cyT4d$a!Ct z!zophU=5k$+;4u~K9}UhBEu?as-!FLdE9rXtZc%i-J_kfn7imOLxTTAIwsmW-E_=7 zVA_wF4p!rLKtN_y`@nsI&tf#)vH6`OeWsJz zGx*JClvv@D@Gnh-_nvu({QdX-5c`Az_M`gN^Nx&%I6yV)X;glhSoIIa4ioL^a@BQuxo9{4Q-Uo_L-fdU#Jt=K-{Jh8 zmp#Az%(kDh3cOrqCq^y~^phjldEYJ;DiYoDyR*njU{1qV4<1p^zWBQ->W$Mt`93hgez z8Lo=y|!rj8YWO1ed$V#m8?U>%po5zeLhipM2@hwqg~s759bJe}}|4BbTkG~EjSD|Oo1X*h*k)dI?-C%u zowdR2mY;m-^K1qr!og|uLBv)fG+msa5w_;jJ5fn1Y5~@X=Aj~gBWvP&5Z2_-c-oOa zI{mCAaQZ94FQ#QRi4*S-#uH-NHSR_R>x198b2zuLjD%Ss}z)3+r;-2`kbB0DX<|n4V;1GxN0^qK%r6MOz3}C$0 z1r5;f%o#$(0<^p@QubT}ims_gB&G5C{PPsMw4x|IfC@B`Z~^aZ*%1HHdCK z=mulf2n*)NwE4i9xmK0JbBY2!Fj@6*SBq?bX5RpKC6T<=z2EYHBI{h%`<(GwyT}Gb zl?b`Z@e}ZLVyfXR(|7JPu>W;_esgWSuEXJ|Jz~M)*8}M$NJHMkxV*D3WyCL0WxvxD z809tmyw7cGW9bMBQ8Ski32YZNV9PEGL@q-UdHylA>n9CopB=j-Ss^6srA385`u!LV zuNV@CM{`<(^LnQ2DnTbm~h6U?dB#+1E@cmo(yT`CEWGIS+`E-CSkscSJWRuj<438`qMC zTaYcS4fjTE0!!VWopN6seBVQ-!sV}w=C-M6bpqMS8VkJCfQJ>@pmEOwm)LH^>rxaA zM!!Yd5A)Q6SI}gDYNQ>=x&4!T_nOXd$-Pl%l5IsO*rg=nqm;70Q0^cRmQAFk-w!9P zIvBY%rL#}{QK*P1pn`o-{ zv+^wBMBw{WB8>Fq$%zhPJ~ZQ8D^t96L5TK#?AS`|)p`mnziaSkXmT4P?aK#+1PMM1 z@?|Y3wMzo|k$c4j_F}M9pv!jB@VoobtK|@cnMYLwonoiBwt7DYGR*}3Kynn;5cmOhKd z(C`D4AZRwF-oz%$W2()Es$aP1>44{c8Zdo+ESwF zq68TLjdkUcbC9VC!rl!&a_gu!^2C2HhlN+rk>L596TKPCG1``GEDI#@!P;a`;N4JT zvtYm-gDUG6YtTJp0=uq{iK1Hx&i)haov>uuCMU3cnz?of=}$LWT^%Z(Xc1yU68nH~ zl@1Re59V_{x*JH#etQuV?TD-K-IIJ4PnZ7BHubvt!c1RTjFvO-c846@!9U?8uW8Hq zLC19%@w5nfW%6hLlY{e*eRMM}t3UXD-ns>DRwt^)6Z}>d#nVNp$c}OX_Vy3q6S-g`5wL*+@S82ZEd>!6X5b- zb7cn`Zl{XBoeaeQK;%mQ^QTI+tN~FX2PBc5pjw$PB5W-6^&u3(Wuf*A9dmFOc}DxB zFL|y5xk6^5L_JG^q-y?iKw>uuMy1JK1NWlu6WS2Z+#y~2X+TO*N$`cyA60Zl^WDIW zw*W%+<{2UqkK2*2n`n6J&u)19Z1Z@-SH=AVHg}{d(4Q}OLA*}jnBnTLBKpt%_WP)sl-@Qnn29epmpED%Xrdy_u zzH`OBMFbY@z%k+O0S!WYy2krNIXxS(wj9o)(R0K*Z~C@?=1c}^cuBbg6$yl9N?-%! zUq+qS^a;5gu#;V&2)2X?yje(kUDXJg1VWW#`mrAg@JNw1+-#`(2j3JDI0s~z%d@&* zl%Lco+ee7|jO`Q>zoURIyKM6n8DLxvk>)5<`Vl8`ra`YwthX+KoG?WOt<+%mp#>9o z;ENy@s!9!zl$R2PZxoaP@x&qF?SVg8yo0QkNReW*4ry=-Iz$r^J)T}4-{jFYph2kO zIm`S{@;4+ZMo-h;DxHSZ*$Ehqua6UBLKMEi+U3~cNq{mj(xgrq=bBmSnYdk@h5M=t zEWZtatCrT;wrq8U_pU9m)8Sks;M4Scb% z?T|1?28EC%lGa3ftkwXx%@T}@q#D}Gy^+lY=tc-vIs2bP?lVe-zw)elunvJJc+<*u zYjcCSic0Dr1!XpS8o7L}U^zdzKOhVJ(f&AtgF|e0K_g%|{v<`^0ueD+$&d~v<)mT! zV{quRpOF~(i5ViEa{!grpWQ!0s&HOJ99y-Wio}Uf8|M%pl}_1ZXlljxY8!{36N7)S zGe`re#(zH~D?v|^ z%L3O+VTe)yhY^^u%%N!nK2&m^m2VFt2OvfQ9ubyRlwInNf(eQR)>i*(3hrx$&Nb_I zI!>LR1Z{CAMV_Zj)quLdta`T8TnyeGUs764l~L*QT~xnxDgx@0=`;IE`46j)vT}RDJdg^cw0@Mn3b}yg#_9s~hQojVRm7}d zYYn%*O4vRnXM$AW3keQ?F*5)Xbuc4HF+ruuld4x%%6qTr1EiIPP$gzTF4;vZx~>n6 zL;ek^Hjo`yzyvA82G%$?L*mQVcmYRSf~_P9vytu33dZ%kS!?0flFy83=xYM zM0IwSxY(z{HD(_S!h{?U6ZQyZycPoW&0Vk#jk14*z&C4Dy7~Q6FI;@8|z^aPqtGfB*FUsq{6@|9VLwpwz+aHD5yF zE`J5ZrV(P{SW(|l^Cr=d&y{lTB(K@)bm-!C#?y08!x)VxP{lSEPD4-3(vCl;_{=5@ z+^U0Q`9KG&+vdv16#U-%0qjOed5Ya*NDKKr5FU$e1!MGpMK}p#66~$!5xcK$aH5ES zbwMl`Ct=#N%-xmqrx+d>1MfphbyB63jmbAi@Aj@wBSIn}#myS?mICCgS9HZ0E_Bp5b7c>Cz67Id8!WbMwnIAL;Ymm@jI1IXch0zl_*FxvGZE9JyPH6 z3b&U#%ZRnF%JTCe>zTL^kO=Z?fz0s;3qqZ?g!-6zBe>8f1~Z4 zL8oR(h6|Kdum65o3z6FLq|}>Vce|J_vQhADg-y(X*IP2c2V$f^e*|&W0kdAnc6gE4 zVF_`ry!pk@vtrr3Mc{4_w{0m4^RfkR=x|TH2mKu`D1M%`b*g&xS z*6$f+0G!9;#+zROU#u7TJ^p!Ly!ril-fn>aOfyo*v6ixD4`kTJK)?6p0D&mkvM5yN zY*vO&v5@uS#f$Con@JINzOXaOX9z(!_%)sXzrSV<>|sry$d^7QXx@Hl4NMH9n)Eua zK{^n?{GjGS2$}j~L{KKrOvy&x{(`mXM;=1|vU$j_sUTD`SucSSyDY4CtrCGjR{>pA z1+7IRpYgdx#((x+3mrT)7P?>g(;1~hu+va+QI~RJIF1R}#E?LZD9wM1KUWkC0TE&3 zO@;fF`}xV>EO@Sp;m&Sx;@8@mh9^)E^`3@Q^(#%yJRKwm3>3ubCJp4>Y=JKci~B(! zU?&twgLqyHIeR|Z6$Rk-{2tlOTsZvrTOMF$odz^|>Qw9&gr}hY@28glJk|}^YE&i< z+!Lv|6f5N78{F>S{D%e5SEUmGo#Z4m6XXgfP_FwKgJ@oFEJM<#u)|HZ2e(kteaXsk)nfW!!-?46 zvJd^B`&0y<`N@EF=@te6Jxnu(IFPslK|UC!O^*HNsNf|pBZe)eo106$pHMtcm`nJ8 z%gTWR6}oBMS_<$)t7vW+6uIs1BxztR?v`r4m5zCLUONAE`yX;^pljd?r&`5z%B(RgRSmeXrT19k-ZtTr=7*kmTpGNtuD@(93Si(tP3gmor2}-R6wuarX z)8*)|=S%~mgbb*;mPujf0gIzFpK4^!3St!r%5jg`wDawTWwd~kzZ5o=T{&;c*u{Xq z4_4&t*2190%m(D}&6P{|gR&X$rZ$LKb2kh@y9YN7329fn*UP$tua6e(1J~z}%Xix= z0Z-3|aih)?EfVXFFm)>a3-=mj%n+Fz9V+74U$#|D@zLe(2z)EVw4gXr_6@u`CN^5{ z%8!_EqJNAQDHC;tXUJy42)wzZu_$T|i2i*0*jl11$K%GQ=rz%bYtK!tC7O7*zX643Lk&990UG>u6E+PX_RbxUh=j;DX{j9xgo zWgmxgw_b;?POo5kV_<1CWMhLfcWQAuYnZ~;Ht;-^F9wTQow%2ard#0RY1&<-YyNpN zg%G_Nt}v3g`5|_uRhw@k_G4Mbco}uhY4;~Tz89~8Wcxkhux4PNBp+^q({aQ~h$8ju ze+uXpGP^)7DNokHPN}E{O~4d^)TLhRlx(XGEN1Vr?Jm{oL zb;+`Sxt>{s9>!qZH*ms0d@$!9i>?g4au)a!E#|p}+>HFmWsYwu-0e5><`Lk;qIMV3 zGP>WVz`2hi9OEWr`lIJ$+8VWEVER_${brl2+w zKYmW>-O9Heyv23u^#CWXdWip({`UM<>n#Y-1K- zP(qI&=eLycpyRr zpQ5={7*-+ZS`=jE-IzF56$(lVJg%4UIf3pPOwln34N^YFb!Z{W$wM1f(Oe3Pa15?8^9B&iB6lEAFq}HLojXf zhtZ=64=cgAcCzOqG4oMsjS*P*ECMLd349uzSMignNPFuvjU}VYS7qJgM&3$rS(w6B zA>v0;b1?5{!fX|QTBccBdWO(Xa8UlZW<+GVL4UZ-<+Zf4q`_yMx?j;@-}^@q9NfDe1lrXf9uL$C*z9NIUZF?+vC7m_pe|3AO4g zC0T;sW4YwTl4zd00VMd}iAj$(0N9}(v~NS?xK*AO2RP>;M}7a~v@0t)nBrcVv6d11 zWA!@bn4oid7eo@~GEq7^6?H*!DLCK8({s^J3xUG0q%mNZhqTsY@n9-BYe|$p1x-K} z#9ai;`%6USa-LFY8eS~4=UG@;g^weNnt@eCgP^=nq-JzQCUjODh8(e?50Ku}B3N-a z`+Z$>oc<y`wd>f<5RXqpkeGf@*+}P~tlNHP zu>mT&FD<0&uE{IlpkJ4}vxq1cn*}VxBa6P$D$S|dNk@2op~pdbUUHj?_8$4?UB`-= zJFGpbWr+!NlyS(?8O-LEn3o9~1u(2}5>(A7r;!B``ZO|*G!JoE%Q;QOOZh8E??4Z) zJpk*QK3e<}>~b#@R3A#jK9@s_AjZ#t&xg2R@huup5|#IkB7Qr`LeH$caWU~==4_gN zi$1|24SV*sI2wnPDDv2D@9nnbzS$lyfa$GYFCWvHS)gO4vahgoNo!HLFZDF7M4Suz zQ<>@=v=QB~@f8#PC)$6i*+`B^7s*H2^}rcw2{VRb(g_-zt~(#sVwz>Qo~XsDU~B3U z*(gbk#0uGzFv83?@IPSlQOX!jJ{*LmMcdG~W$)j1zva{au%jFB%t${qvQ%4_cI+kW zP-}^6eGc2@q{|5sdWBY~2@?2$HGJxYJ!(qiiSF3w|2#Z#9gyWaiTS|88$JaJ0ZS?E+ zOL`}ZLd2*JZb6Er!x1}BoIE3=QyjO;uZYF8^Xk8#Cw#nKHuuvVAXuMz#3 zdq4Pp@yV|x&iYzCS8U74K)iR=YDS4EEF3(#XBmWbQa~KXBo8fg1O+d1LG=(<#RqvXOoK76J1ARHYuLwU%Ba)07QC%F@@^Mf$5+89kfOg~56 z@D-%n#jt@(4jN>Nwl1MAu}#K*(7~t%Uw2o?Cc$(>SD}y$X64vs3qX>WB_dFY(SpYquXnz1=I-femm>0;Z)AyV3UCe1H|Y;5`DN7mtljbp3j7K91I z6YnYDD#0_@6jxzIC=E7kl09pLf1x8Ed^y_rJ9P)^>VHT>k?Jn_D{`Uw&qPn#Dyg&g zBnE|4=z7#SczBj-m;L~s4U6!-t`}MjPC*b-3fndCP>s)ksC_B!>cUHFUUA}($aBf< z8gUyMq<`!Q79CfqoLf?kzRT`M=wsmC5bjM4cyVLrEp$XP*bUopDf0WXD-DN8(sEvg zXDoV(D*6~*1Xr7zmDNjQ}zlf{#TR5dM9zAE&`jYX93d*%c z{45t<&8`_^tb}#Z7B2=fYq#K;?EMkD^A$S|F&a_{R&r<*)GQn~{hIuOVGim*HD~4C zS+MPxgdQB%{CO@<3G5@)y|-eE?ef*h6Ak1n#OJ+^#Ok?I*ljTfu#^=aV_oc2BfU0_ z0_N#NX?w`b{N)aDu3!V4WR3-UKb8N+5&<NxHt$%Vf-f(G|^cb!k zu>!-ZCu|mjW&~8yAd?kgHolg9&fm=S-D9*V8*99c0(@W`ORi~aVkZ`-LocWsoCIDB zM+9}59TXtwhGf}WXmK?ia{N+B!8Ym0i0xW+lSOvpJm8K%nle}fb0F8VSFl1|%!@9)*A^)}_+D-Kj!>|X?BhkJ zieS}L=yPpax0;=>3Md6!GVG_&nR%rS8mi|Ti4*lvZqsA5Z(Q1PwW`jNVOl+0W{c`2 z6VQ-(5$D1W zAt>vkPowIi*OdBF{`In<_tL-3-fgBmK+x@c^vP~4GBqY-`ff`fy3HZ*)#lMLew-u` zoNT&^t)*H=XG)8z#4N$hEzwQ=tApq#5dD@c4Qw^vFwE5^jh|-N=)rovY9}26|7V9y zj`v{p@pDapl8^04jbCGRf>|Roz4Sd76P|cB0&l-W=U4zV}7vH zcTw+T+s5H*0Z31^ky7DLNOgURK5g9XQ2Bl{a1#Jj3&h#2R)%xaHD?;E*IH<-SKP~S zRMvmfp4Mi$oj7g?!TFKS!Q$h(!HU{b@HiKL&;-arte#>Lc~G##{EW~%y5|6ulY>v8 zhyF7&g4tk^xI3Vnd21NEUfcJD1V5-nbaa)No#P5TmJ1K>foB6I zuP_`}&?33!vOSDv>Y|%dc~u5)D#f#L?^Rl`UDE_OO=QAYg6=}M=m&Gpkl`nJz=Gl) zq#u1DyAA%V{iPiIjUuR0aFH-pRRR0Ya5jy?ITOeFnSj~J_x!iR4@$L65;@pS;D>t*R$4Z)Al)!Cb_FTyT*t&GfXZhZSmVdE*i4eA4c4w%Ksxc4V6-vh=r-%1n zoWBO7n<*gd*ffNgjsU9Czb|Wy#}TFz+~mv%>e!Hoda`*S)iu1-N4wr}^Y0{8dNKSy zosON6m3EOpcC>l3>_){%@9e<45kuTzylfvN-z3|eSgV1nnuNo{tUm>eD#)WNS z*O*lp%&|K0FUfbf?*~$rn?B{fIpCTqi0N<`-`(l1>$*G*WGgw^(S3Y9ufVqFB2jjbH}bL1(&y1$ zHvETs+qwT3jnUz6wMJc({1`iVpupKNDlQ_VD&S26^$nD!<_-14FgkLwK1>MjTKMZ$f$7OjWY~Z;cgHfEX)J?EW`*M` z7dTLpS!4m6ex2Up$7e_CEFM?vgYgIjI7Y&kr{sr(h|$OHmPx5&i4K;suhfI1Y*Ynq z8~ED{6O0U4Hl7gC`C}=f8HxJd68iGte2)H$t1?jZG1Xz}>#&8Bx#|M9V+A{|bSO+n z%OU_ZPMULHoPP8!kAcJ{BaGw)Y*{h*sMKB0WfLfqU?8Z!NqecCvYSNrRi(eW4Pzi3 zou8a&n8@@`8EIU(?bvP-B_|EwrN$Fi z$$|pr>l=_=FsbsUVXy}sJa`k?yukZSCzE}^9kZ-(q}Cl$5#t{~(7tR$KCnzQYjpBZ^#r_^y7lEShFKMB@w}qzf!oymdb2xMz{#**m_618bqeTV#|D zR*t}qv>rK+Vk3-4^dU*mBN@9*fsF$23dZcHh*pRe6;4MJf@PXy4bqYu6Dusr8%><` z5L+`<^=kU>4%jXkHA#8JBo*?-<@mJzRl3blxL7mUH+7>!0cHI7WPt_SB)gMu;|wGA z>Ki%r z^JtiYK^zznec`Pw?q!%O(yN|t>KmAYBM{omR~)wME8shM=9m)2ax6YyyB=H5(F#>~ z(`CD%+o>uEG8Jfw2Eyh>bWsM{narJzDjmig%*%baqSK>mZMhBPM@}Y_Wm<18X&ly; ztXMM|$iavcD-T@zk^#B*BV)piJ}_zzbP9<37iPOxE$hL3_W&}%Mhy>D2tb|b6Rz5$ zH%L@n;-k_^6esqV09!p1NUN?oMMN=LCMRC3>O4Ckr7MJBO~u5Wy7mMT4^iNjCh!+e zXDJPHmQnfW7BNY9u66X?1^J*QUqky7Otz|; zy+eDaaNo{+;F1l=Vjp5=gkVgfFgzq39Jm0zvDp}-sgo~%g$Y|DsRyPcF zE2CUkzC~V6yT~96H9CBPQond`$9m!iB_NNlmva+Q_eLXbw}IX10JgX#H5K+?UGCJ_ zVv1ehVr!eWIG4tlz(fr;18F;jiO8Z95>T-PKWG;((73Wizyt|)RVpzYfci_5fVbq# z29h#N+d?ko#KpX=;1b%SN_8jhjb7BI(LmAJ8;{Ae1C^0}TolK?!b7G`Ca$Mf{Wuhx z>hx~$5qopdPEk_Ws4tSRjV0WZio+UaAV2KkMaL?Ne@Jeu0nGL8s?Vc7jHyc76&-m4 zDfj#&vl{PbK#N9L)G$?U%P!+wXW?{&m%_gQ7c$ysob{w#(6++_ZgoxpA914Go20da z-n1_D_W|(ooCXB#zV)N&BTBg$$>9HXQ8if>F@T*%dyKhX9!)S1PE#+>re{~X7xWlG znuGq@iHni-!wyT9jd}3lEld%XkrjjMuTCZ_3jRj#dCcK`QPj~mv)ka~eg#`vlbG`I zg~Um?DbYN|-ZF?UF9OseFu}1Q(u}l^1wOwv zX_6h8g63z$nmuwKK$Z|WSP_Z(wk-OPs>&S@F$6#RRP0cK$*pU<8kwk=G&cV(=vgZE zM+^?6uaiLWpWiG*Z`4%MQ&hJ4%YEd7y!aVCog&Bo+I)gfP+YpGXZcCNyQ{^Y{L2oUY3!-ddXE zqjNdv?I2a(s9Vc9ZVfbNzM2*RVorP*^s+$rhEk}t=e(=zsSQt3q$Wlo(=7tHUWN@ zB)TVQFdxPOe_PpM>iM8lPxiuS!Wz93j2;XeMEYcHsW_K1*-mT5IHn4j- zB7o8{WOr=4sT>q3CNN2_jXFz=dAuep&XrF?`US$$Au_yo0{edYE7?fXYtu!T_7vr& z7&)`Fl{#Ekyf$@Jm0WJEOi#Sp>v*F`R4wV;2A}gxLi5y#<1>xC0svZqoFS0_0QlfI&}N}E71x#L zlRaVRLnc&u-Ow2u$E(oEHPb#j5rDc+6~X}9qG`AYCL-?BqzXCofEe`pI#yE2fDLjX(?)kytI#gN93v4OWyG-FuutJK@K_Le%6A<^oduS$RZo1Zxv5Kg;YN1) zuyfDuyGy-EDAzGp`m}Gyv_C*XJqca6y-q*3o2dUglfg@dCx{0oUhl&&+%(T9R3sjR!N^F^|8n zQ-}p*Ne#p!U}ko@JvA?7Iv;L!?KndFz^LuSk^O>ju2SJ(Af_OP-)?b<;Ss&#!NnXL zvV5xaY*aXAShMZGlQ{`aoclMU8$WS)D!=zUjweyPqr?O%pJb zH5>fn&g;l$hm$II1{ej$zsxxA^8&g71W6=+Y$yaKg}I)`N`k$1fjw}x`8M{Bn1R|J zT45mzlbx-(*90eM{w~0z$PYx=v<6zBKF4=s($is3VM7fMHJ<=OkjY(6=wb@Q&#Rsl za1Wr%uE~=Ga%u?>2)YtNbi=0Jk;Zj}8W)CA^;vlfK0wNm69Kk|pJ{@rLP94=-U0*} z99*zQuOtInJ(9ooLrEKAyO3Rt|9mUC1Dkslh#))&e zDBz1jV2d&k*$t{~Kg_;0a2aoEouc#|{a2{s!cO7KDqdV=#wst^PtDb`u>K(O zY_flMnWgVEO{xOz+MO9ksLR7|Yc3ylnUt-)Q25VP<9T5d349b0Y5< z{fo^uBn8mgVg@kC^9}#G-R3xfVK?(pP^%m^?_DSqN*x1wh8WrB=?k@kcXsUW_HcuI z!2-}!3TQus7ClyGo$ns#JrCFRK?)@07j$GnX9PL@kBuKQ;O*B2@_-S`_Y!*0uFJGv z!|pc*^-Y8AfCAN7WHOXZKEJjv5K?yvj3}5ir!ciZH-5OD?b`9j-AF4Kn?kcBwLjmw zub1wPZ7yJ?V|#Aky}*L|4g|^jQvvT4MP<~Qb3fV&OG5@;L6?mw;98E$w!a`PwBXWQ z77sb$l_{UR7Z;ZE>yb}(%{jtdw76o}*a$b< ze*1yv9>R;z+8+Y7h_q)v8G7##0m_lEbD!jwW&DI2g9Poj2GpHU59_;kUQY^nAY2om zKo4~FJQBf2VTZ4LQ=uYZ#4RDy8t5z;02xvk8sGdcpf~yT?g}g^XJ+gXsp2eGJ+2v; zy89F0Fv4urTT7Am%Dm-0fo$kOg5+{lD|LGKmxy>s_XGXhT!#dfOYhuja11VIzu~VB zO16P4VMTN|;d8>_o(w+g-s|BYHZaE+MSCp6y?aegl(V1+bOp#+D7 zZn`<8h2uE(gqRL!EQK!K)rfY}VFpXZF>DMp;hscb(_ld#@Lv|Jr5huJ5QueL@+x3XZS!4;8d zU?skXO7SCH3ftKaTaY7M3g_j*(4%daoHm?+!gKhCY84P&CPAX$@L!ZFm-I>( zDDm>%aA*lJB>CzVitIrhr*v87_gKJ`uLk$l`ehIsCfaMWM51F$P3lirzxgK;k4NYP z$0AC#Qw-A>=bLBu^S2#HOHP9YZ9tSAvecdWBX}){UR6PLKlK_BU-FTa9=8AA` z@oMWx8~Zi;=rETQ5!E~Tt=F7LvOpkC0GmE?t2ejp*>G97nQHTaIWndLlCepwiytcK z-pa6W09ZsPAO^_2BBo_Io&ccC^9#>mN7f}7bm#;{dJYLS`WQs?KR}SDG1mbzeCagq zqlgqHX=nu^ohVDiw>=Lx_WA*gUMwJN{L!?C`05T?`OQJ;cZxWBQMsxlnrsNZ_Z%ti6jnD59XxZ;FUf)FJ|a3seZVG#1V&j1Wl-T?@|do#eArF1ge_1 z%@zK4PKuZ@gAJav?%v*awXI@+)3ZdE*MCz|_&m3OrAS{0KmxQzP*vxRSw|q_m(|Xf z`|1KzE8RsK&|qf#1yT80c<%zd6K)sbXGVj3;)M8Oxh8ftTIOE`NV2+@_LB#5S^VWn z-o0yEd{*D?!JJ=J5w*}(WAu)%rS5Jc+zg<-7nZLQ}Yw9Z^SMc?!O)Z$8{?Os;qUlQI4Juo*b2vK&hQ!?SN35Ik?Ef!r;)1!=`) zv|=l54+vQU?P1RL^QY_D468+YheixsymfI^XcxxgsiVVY1Z_vinplMIzQkVtA}L8k z2Aj{Vt315iGn+Kgk9yFBWp%=w;`>@ zU!@w=mM{O5JmcCyq5R?{|F1hrsdM*BJV|?Pd{41Aed*Wxz!58E;kvB{ASg)N^vzr1 zpWS`u#tD#he!NK0%#9_^Q4udFXPsLQQ)Fa5-$npo?OkKL3tK`HwNENbo3M;xr4O7h z-Y#jB1Q9CnRss4$4C++FQJRc}(au(gH9t-3n2u;tZKoZ8j6tL6!&}6e6K9$ zhmM5Vkbh747|ew+2jJ2i0j_q&1B`K1M7ugBM2&!E@;|}rOYHM}f3Nx6H2^9$$|Fh; zVK(=d1Vb{9(25$67F8HuKS2=&$M0ZZK20595M6VLa4fSic&e zGi&rK(8s+a*knH7ci7Hgp5rnWKWwrt?fxq0+92$v7g zg>MJNOjAVrzh!F;)o)Ma`KNLEZ_wrmDEej4&f+~@0}G?H5Br1nly?*DK}F!Ig_^GK zWZZ%rCDi+9O&4@zjineJF%{>*TH`&#omN%Tb+yqL941J?iybQxdhLEjndu86w;jF$ z^Xa@ghdErfO9U=9{eI}AA>!DMWans!LtG`Z-aMD%o@t8{!AZX!dUL1rZq3$1#fAX4 z(tnxMSd}&cEY%%nFBdS72fR(9S)|pRVjJdo8W10-U-?6u6q!CSqj=Oqd2|#;jpSlF z@?b_i85s|zXR<8Mwwv^lY6la56X|n(nFW>E*q0N<{W8YkO=` zBqNxzXDI6y%)#yI5Fne+qwy&ps4Ak_yHw5+*C0Q3FE$eA!UYR>mLe39TPd|M%*T=^ z?qeJ!JUyt^VDvHl-3!;{U-`v!0E{>3-ncfguQYLu1UZV18=u-jeQtEo>1Y56sQWf* zO3QGN{7259l%Ire-ixhu$!L5jY6voCyzx-h_x6Ac%inprA zJX2HJ8C(IqEIIWUSWboU@(5qjumnaRpXcWKep_Wl&Y@DlpY;{LsD4&@ zX2X+EkPXv;=qp)Rdj9U&k**(TMGiDuEg$yUbNVus-%H*ea>mIlAJO(lNo50%PnIw- zdv73p0?<(≠8gNy2Ew!i(Ij@n(XA>LJ41Psjw%W5Q&d;+%o{tTJsl|D%2irVIF6 z>&^P3U6Zq=GTCMqVM_>F7vT`Galas41a8K$brURL43L@i&aZLDW$52|PyLgA?k@g5 zI&mZs+*8Ss!qqs;)T+JLY17s8Jud2)QABF3j?&r-+EL(N67-9Bd0U* zC67xZNU9DqdjjLpv66^Uo4`K(*jCYo(rHbuec{pX z$V=s1w)~x@Bl-EN!+K>j4TnB-SeyWPl;TWPf`)B0G;A-@xQ>-sQoiQs@9m6M6iuGc zw#@~j_^^g~qp7FN0kavj%B_$kBp9dq#z{D2B%&QxbpuwdT2%)zmYm~d^bVGLAHUsj z9Hl)7e1^B8Z)XXaA(NE8OMVPoeApFa01Bx|{cGMTjWj*Q7iDSgfo}n+_XL+O?q6Wz zgVjng$0~F`L6HY{^LptMV3anOg0`zwm}d3l`)T%BEdVknXDex!_E>_tq_^+(0>A2p zu-YJk*%xiyw1kQp8DhNLX9H#}W7`b4p_?(+z0&8tgun9V`i_St?028a#9#M2v=%Op zJhW12m*0}sy7ZCHbk0cCSw?inXdgg4KYIF!OgoVKbgDc5e(&rI7j8b8JJ{pVUcQYF zG2un2*wmww0c8j=5Rqaj?ll|zY>6FLrblmA&+_yiz0;e-xze@7&rIc~*1x^dbNa#T z*}EU)g0tzq-h(e%k%khBgrPFj;yZiDn?UdlB~%o2!F0Dt7#1n-JRbN1@W+Xlk4ti{ z;~-bQ(nBWVaH__<_+2n!_ApbrDXkx#$muuL2axvh8QQWM=ug#QhlQ}2H2nBOx=_<` z1u>Lr=><~U@ z$5wyQf^Hve*9hypgw7I;`{~sKsIk&R#ThpvD}mV&;D1`Ui*lowaAjPm0Nk6na?UQ81iJr#Pg1DRLX+5i;#@uaj^CeMWcel)SF1~yrMG~rYmVTFXxYe- zv${*YBu2ODyv@fm{NB2yySIG{R;cU_eXae(U0ZhXQ~qvHPv4g#pZj%EzJreDJDrPr z+{swSBkwB?tXQB9%Lm{;X>({?K+6;Ly(`YH;;yNAlt{NGCZ54yRNKzu4KTKBWHcOK zCM=zi>eH$=Iwxe}4k>9OdHhXnD!>0!^yXh81Yzim!Q@odkx?GQotN=DAuf-KLZ+m; zR~FlhNlB9lM%S49{9Nd*d*TpQo~_^mf@i}>(tdmsoxXCxS!|tglkCI;_^s#uGVKz< zyJ85s9jApmZyP*H9y}_WNfyjP%XMAE(QNGvy)19BxzhJw5F6czI1506<4aZYZRECd zugYFmwt{ybWWKs2FrAHd`Ei^$_loInm1QZfbk$-IUhy)fBK_Mh=Q{yi zefUa2s0L7>@7#5$1NYV_j|#!Qr&}1Bjxhh z{+x`ZIddSURU|{-Ho4Yub&@Sd_TOa8UUM{$X5KFYW;F>9nQP0tRbAo=e1p){Yh}}Y zEu}H5XD5kE!A+nWgg4s8oICQTng_h^jS+^l-Y9x_2Vj3Eu{1k{bB2Dym{^W}X|S8@PJ=p%+rC zK0iC4#{9TuaT8y+PE9|qx`Su^Mv`c+XC$xr8-_dD04VkilT40KTArh92(@aMYUPpQ z3LjMDvOM(P0y|d^@oTj55j5{$n(Cu*^zoQj1+UNAIYwmJz;cdwV1^brtuuL}*cn=)=(+6H>~I$yE&g2>Xu;Y4FMwCIc?x zj6H|NUV4=nlk|=5^1gh?EZrA%p?NWTsW+40KkoKoyDj>k^1s4E$<>)StHqc*Z{9ue z9=8s6J(D+G-sBU#@nl-<%h4<~h%oxC2b(tXP)%UGUR1bXQ08I2S8vmjl=nHP-#2Oq8D>4I=MTI8f+1DFD^C- zfDh`yIB(ss+3Dgv>J#nLwKu3~P!88&%qaL+2qQwWU8JpfK49!p$+|ksSP3@@FmqeH z$~+Vh@K5`j(XiHuZPF1ck#G^MP-GBtJ?OTKK=WtcpoSJF0^sRZo`@M>?ob%tBZW-? z2d+GG#4gbGXRUTQHPX>g{lJ1HvkL@HkO-4Hj&0ZmN28OJ7FRk6;o;Y++NqS)TY;yi zsD`|cOcqUK=#o>fcO2kQ>`M_!I?AbiO#4A$FZ(?T@R6^HDvmwU2l6=a>AX_%Hl6eE z+WN&*{o%nqJ|JI4N4!ZhOAw8oz>3=4#K%w=1#G{6#W3yL5)>RSry^{VorR5gu ztUdJJG^+v_2fJUlhm-wh4Z+_j6?K#|B~uqP)GWK46(BBZ(T)ZSH2_!r*0N$XQ8RN1M-QlUYV9ZH|=?c#Sou2nyo6~e*r zU9V9S@vS)ru%4|WQf<-N=@@U_u0?>ho2&|lkKR34oohX=`Y9dSGQ3AmSy&=+E_-f# zA>9LqT!ly>7cUm!EOaP@C)BMl0Jsy=#vb{m5xBvCT*bD7@hNU5jJQ;z2}Fl6 zP__)}oK(fy(Qv8`+}4SP!E-Y@_TGc*O9V6ej8X(kEz_pD#8o)-^7)PQ)fckCw1~^4 zr?P1oVOKvuvlH$kqw6%dSnc;F{z#cj7qt%P0BJZ1+z}egeWUK(2PK(6M^Bs-?L<%U z{fYv_Obc-z81VI^KGL#{IQ^$Ma-3#&B{D2BoR zplilXimO#ico6}f;F{Xs?Ej<4Ku0`Q`W1^y@YR+m!OO9PM-iTzE4sl4as8~9Q=k&9 zE4I}cc#cVb=cBv1$R>CHRvG~Vl9mn5kyNYmh$R>@jkjhzg|_IYj`;DO52ue`dY0}| z?oFked=Ez0^*R|rd3rwvYAPpa#c6^LW+UTK2S_`+Kz(5b8A}Sk!pLSnPMm9nEh0Yi zqp}oZ@YUG_{l^l=p-ak5f+$DA9g?rx%P&9Q??d~zc(4*BgjPzKHv<^;`H~c=`R%!I=7hznXf$v-(O^g2+>g&UxGKc^10${rbDrpW?0m&_|q6aH>Ab}0V z;cu1>TNVxI88Be8yI>|W>EztPN=yAL;y-7EZOYcT4^0nC5UWxUmd+)+5XE6YC3WKv-CTl1*vw zo^#I_tk5hW+SYyzBp`UWtr45*p({+<5$A2W3VP*QZDNa7RE8e-t{b^E$6{IL_lJyT`y+ag6 z`f9=Jel=d0Yh^KXgWGC>TYUIQ%p2}M_ZV%U;+lQ@j058=6)#%Y91CFyW zAcy8;VCG|`OnUX&L3UN1#zar(qLm`8+z0NPeRur+&k1*)3PO;5I_}1=mHa@IzGEu7 ztm~KhJGxfutZM6$pWn6eFvJJ)NW)bGWatpBL%AICiOmEf=>Z<3`G_j+rnOO{M+nXc zYXXIN6$Zju^9aC6(NuMnnC2=%#vrN%lSScMzxwxqb!yxHQvmU=8srN^o4&9|ck}w6 zI3I+UEUHI`I;~KkR^1Asm(~D5Gx_)j5VKr|a7z(QlHXvx1gSBTfbj!TnqkN34ygEi z-?|fBap4e;uK)o+GmQ6jm_@r;gYR^#iGvWiun~=FKA1oZjE1fgr8`#8V1?nGYT=EM z(A-2^9G?T@*Pr1jJ?ysgHIrBC@BN2C45YxbKc1`Ufzz+x(ccu&s3zSB5-Yk1(TKCL z6>M(=jmM|vwsSS=Mm7cjTd_XI=`~jq!YMI=EWBwG9PUvtRiybFJZSds>j(eChuR@} ze8*s(9hCp^jMxQL{L`Gf))@ki*=~kTa60O#Ut56NAccOj62sZ;n-A|q3&K2n3%3B@ zr_+_HtI+vv1;RyJxOUCjXfj>_a=HUhFcEbGXEbyFpD958;@OWm!pX2R`|@nv-Iu>Z z{4vinW!ByQB-bg3*sd_Jw<20c6iuB;hKcsUM72O?Ev;*OS6dEj}QkE`n&)AR{6{SmS@09j@-`_TmKU~AjISj3FFzd zzIDsHIF2+J>}Os*$pn=g!=Q3fBa~F zS=U{eC(zR3s^3y(N^$bmj9```e!W!~L`}Q#PoyG>ZC^Jg4rACqdDmO5{|SHg7u);G zP8{<>=i~90*!BM|&w=-D;FEdgpPR~GJ}gEIg+v3lui@7}?I&#iZPveT!+(0#hxGF; z#jBe0L79Itq9)z)go_|eHqSFg`{87k-TK0wfor)q_DN?0%RI&cPdfRk;*VeWYa}@l z${dHdHm1!?vrY-GzlL~jcH?!*esNlk1ci{y$a3 z{ybNI*-WreuJd5cTR&v!tv@DW-wyIW(72He{nsMn`QgE)1CF~;4DQkscvYG`_bb!Z zBZ!S!;U?IOurFKVRBh$K4`)M1I$rd)c{1V=?kV-D)Y!r{ zLMv;GBw9EG;1^Fgyl*x5pCvAi603HmW_f;4FdjO2TU(Hr?qm)3nFV z0JPJlGr>6d?@KUmR7+~{JnV45w+?X|!F!n7*4GHR4|qXcS7zn`A1My{ zhyfUry*L0KhYcMvMxaQd1j7|7P%y4oJqkT`A(z<^W8x0jmE9t+mJbePhWs1cmitKh zyL8Mo>pteTbLxRv@0b>WvLlV06OP@0*9R2GAYjhV14}!(sYv7`XrIY|$T%alW4-W( zWs{J`tiK-)>k|cx8(XtwTk+fwig-Y}Hh6Cr-+2VfDJtiN^>2H4H>M@#Z8aZ7H28n) z(*L3!1yiJ@t2EOZb=-VejI&`dRvRX8U4gKpX%`N0)W|zo!91fHcS^b}qkyqor#J{3 zTpxs90HL5p7VV-2EYTBZW=OxmU8J%^inWr9u4(MBkGK2MwYjN?X>WVHg@9s?aSqBs z34S8&9DsUsuy}GJI7!zL){%$;Khw~|=!tc#`%l0eg{cZ*H-wQ#bcts8^`!XeR#L}4Cc zlokSh@yUK{BAbqg`|`XHBxfW1{xky-f@Z2X7*l8fx%1&M`duNqrlHvYMo18D)?ov8 z!&6Fa3gIYD#JCM=)=@pwhsgf!-IdgW6W2rENJ> z=%Rt$yfW+|5c^%Ei{auwBH>`&4#?^TZ|*c5jDaAk6eU99c!D_7tS?+S6$%VduYryC zL~8oSoeQyHEdZ6|N3h{RC_yVh=gFZupW4f9@_Do}OpoYPPfjX7DB>&p`SH+N;uTnS zT@tvMxXZa4R+n5uGHDr0>|{-sa|-@PLJ?a<*h4_WyW_^*4S1VC8y6EMWO14Cj~nMR zQc|CQen5Oyjkr}{Of#%3oH>pdqvc)&(^r2WE-21>M(SEX7n=>hL(+pn3=o24U;S_o zhI^C3aKwqvOl=EB&V514w=m$j>e67%1!uH2sPQOs^*zYj<+P?An%0|s;2ONovV66AQF?VEV9>F6 z$uPt1h=hLzye!&E)~cEJTlT$Pm>Ni=_9TwGjVmef=4fOT8F&S_{$Lw~AyAKuF-WVxy5tk1JnF28D(Mg>PcQJmK#WAQKA<&OU0xW38UtT0w^|C|HV4PoR>yth!G4s0 zKDQg56b`1ax$3+ia21b{~P_qVrwgp2mQ5$0u2Je7* zCp8Xx{>GLK8y7XjxcsX3nhGyDb$%bZSZ4(cD1)GDk#c(UAwA}0lrBRA<7vAa;v?yw zys-k$w0+5%1dwPFahuJG=G8*OuarvJs6P_OW2h zM%VaoV6qKhzc2hw&Z3dlcagMk5;#D}Fi2Q=qjHQ_zrh3Nv=VLjUxIv-FCR(7UzY$( zQ75o7FK7H)>N8=cC%4tuCmSZAn~p331WXAE$aZ>`Z{i!EeWIV@Q=jR+P-#Rr)%PTM z7{=ZSELQkb@Vlk6FEs|sPG?y!B+({*A_5r%q9RE9hvb#*I&lKsjZ=9Y8@F;Axg*MV4Tq?Ew(99q3K2SE_R_h+z1(t4Iv@Gqh zl;;s13|E}Bx^E2@9Cm_}4PGwYCKB6x0UdfqNt}H~8Nm*T|z5SFS4EjcZbG^#B z(SYdcEsE=PqnlprX3G4`Xm#U53b2_re|<&mEZ@q_4*{N{$UQA7gqlhOUJde9wkhqKQ?J?+h;dPMMju13@ zjoks6Hwf&qJPNCNj-6Q4Vb@BDmiBNLvD7(Qq6dA-%(^x}66;#u0XlRY`#B+a_=YR^5WaCb~)_!UIm5KOQQ) zCrZy7fDhnkE|sJDfP%0v6R4(Lgz-WC;8FqOrZnp7AgYn3bMzohz8HWy8la9D$P0b? z(MCYB=~^Eg2CC6uzgAk$9H0Z|@jEP-ptAHPiK;KU$-%nnngpB*bnX4>kC-Og$&ew4(G=xdIIEb)n`&Q7hIhR_o znLJk!xd4p@j;C z244_Q?P8NrN;l{>-XY}2n6u0}%+@*sZH;(v1_fhDH+)8}Zh{9`RB5!IR2KSqaWQ396A{h!U}%xh@ceN->IXJaG?5 zXE%Bi*4ZJ0cT`%hE<`h;8o=` zuUulHyq8O`37Vg-J=)OghF{*IB~xehzDti@0qx$Fv+&cguktM$w42{N{lNysMKZTi zP8C@YUYJyzqwz*fW;z)RmtZGxc>QA{;HQB?Yn6?@SaiZkM&l7U6n?#rLG_SBd2R9= zJXbQucHkBi*LOls2VCt#TmNL54GEWn^*jM1P${wJpln5*wdd;5X>q^;hpF^9ZS)*4 zJlzaYshXa3Mri|xg?Se*%U;*T2OWo8;gd_M7Uv8^2k;UlPr%b($@Ev+=(aV3DO#p3 zy;^teF$yuo+lk1Bg$)b9`Q4zuoY}g%RJ_*l7&BwRvu@jN{IIUMIhj2hPC%Go4~efv zj!-r%#s_{fe2}%_Ld;?)n3HtDwPec1+*blqztw50y}@mI|BV*R31&Nkka5XKgK-UQ z7rj8cVedc%XXNBDag;(+?D!y|KT zn#do@NP{^KC5o!%Y}kM=z=o>cYm1<~+vx3HCV zUBszl$Ye`w>}e?9HWb^S@!eMjPxrL*RtUw@t$^Rddvx;W zY&hW1MvuW|2D&?N7V37v+K6{Y4sG1BWcRKKHB%;DF zt(MMl7&PG`0xhEjq?Hyx;5i6nr(i0Wy^H$EV(mf6xS;-#oym6 zo@Ckv;O#&@K*)xf*i@J7TY;<$yZF;fIzqvhLESM6#^r@j!BP#T)mmAHQLTTvc5S&< zxUv>_RHvb$+r(38CemS@H62>(dJ@UZ7`*@-ZnP>4@lS(90DWb9nE4M^qxp~Y4P5w? zhUVj$ef88o`8^htX6e&FpUKwIh5K*LAjWoUFcA7o2L`zQ?)Gg9%XuYO9&6AO77ZwU zb)l5fRC;r;=zM!iQ7{zMbum!B0o_Qc&Rd`M2rnU2xdo*Bsk*b_-ODEtb-r+A7DoSyYbu} zXf~P*7V|*f=%(mPi)pun{*w4mEthT{&D56>P`+QR^ODl2$`hsW3+!BGHljcI_0EMIEvDg^hUie~Ypbg|v zc#%p-=`5*Mx72&vNz}ryhw?P&th93?5o}=>G`BVgY%6KH!L@RUd290lYdTW~gMf&w zk-{UkiUm_c+$i~unR}f=`yW3#KHrG|)h5$Xp^pU2{W)`&48Xe%6uidST=Wj|h@Ahv z&qF7R49Ia+R7c84(JP}CT>il>{l;ar)#6Qj@Wt+h8b|My>#Xfh6J{ZpL;ZPdum~M!DB{p3P9vlQ7S(=G>s&Z z=YYpAglJT!4W$v`n}&*Kg< zE84KDF*`M+r*nI-pS?N@OYB$aS-Rrt{bXZ!J)y*s*m0I{MNKlN|0m43d9>R%s#pb= zZpj*VpDW-jx|*XMtL+PjXmO@eJaKdqJMr@;G|DQ?fMXFO|LLLKX$X>sw-H6Y-uh%; z=ea$hly3HYUV(t;8Eff6IR-BWuFIb6+D77-E7D68n zXSY&#iWCZ}Vt+i;#sDP-v}gLWu)_?@v895exfMXlu@Dy15^5I3NhZ++_x-Zj;{C{G zq4cLBy;vX6zI)0QI&LY0#|HL!%%4-K!{ej3ZW)2jZ#iRgSvku@n-x?pA70Pycyj47 z@zF38Je?S&-CZ+mvhgp^INP;fy}zdcYHGSX;}vp>(GpYF9pZVOKuN#Tc-o2f9Pi4<0)0~ndJrbs*vO{j18F2}8%4keeX^y|l zScB$LP%M2)q0oUsZ=2q-NoWaVCpe~%9}2tg55VX!@%lv&y6%@L__MsqA{)*?%f$A^ zosPeS7Bc+QC6B8oR&s6zgzhRX4wg9h1%FUFao~;nk;sSHO5C~gAQg4?T^YyrhCWjCscW*$6H4|ajiCpa>!8H! z*2d>XGd*NUjJq>!ZpKh-`$9>-)+T>S`3GuAf)6KFBz{TgCE9>;L7NfQq;M_*x=Ea} z{T1)&A+nvHYo%R}Y*BfqOjL~|ai|qI&l;gum{;zAPs_LTKAJssfT-TIOIn^^rGCqK z43ZH&^y&8&?im~nzpeI4{Zi*czuvUBlNHl|d=`-Z#>wcC3UX_0`t_07^} z(V{@a_+hQf_5lwHo$ zlGSjLJ053L9(V11@k&QAZA;6gcx$=8;UG>K|jZe^}O*XBY}Ca*Fm#L9g+$kX^EN zGV^Pp;jfZV*=x@7#O)1+?Bi-Wb(7U}duNQcS(jOIP3n9Rh^tE(*_=9bc5sMe)5LDa z)STvuD9w;){xX5p=|t)HZs6};_dBuXp2Ngq8&v9%x;mhN#ra&RD%w&_TuEJE5bZ%zlM6hNpQ)R6EK$d_{${pOf!Z(k&anfXpe3W9vl3JJSX`q%`Hlta7A zwd=)!yIAUim3(#R_Dmi671*q2?qnBF5I!5W0BuZp`PlDOFnDYLU20NSNUtKv)_p3R z6Vt&(Vxa|?$>Jf8(IE39(|!-76||Vze=Nx^vgCWcl6nd1v;>K zR}mK?P*gNP)!*BMco^2w%v360hkwg_l6t@SCeN|#c%LB_r*EDX(7)hJ`@Owe-brkA zNuL+Uo34qQf1mB^-Z_+`&OJ^)`ZIa_M4y9GpUu>uLR7SULKls(6twxWPU*S(I{{}+ z$-%6e?^7nEss75|9PU~q2g% zvl!#1Y}BXgU+nR@;p)8S3JN6Gk3agyqUte)VQ=;L%0BR(x0`)ToOPAU%9}E5-o-t; zqI&uS&_~4OTL^TwrE8ApjM4}xEP2ypRI)u<8Sq#&YtAye9V>n?Qqob4iWoLy9aGb% z3(nE=EF0xoyNBs?j{*g(oG!Wl@!FA@HN|E7edz%?6w2Yj+=TZyheu_uEB5?~0 zwZc4!QHuBMBT7tfCR4ie;1;N+SiSGOOi#H^wp@Upj&-WEG$hGr-@`!PvVt+BZ{RHi zTA48|(4q|CuV5^a-|`mM2Z*7XN5(ZR)lrfXkr0Bn2~3*!73Kov$+dX4A2~3>O7GK0GF@!x0V}~s@k5YSdNaGPmcXF1P`SoXE97dv7?7!aqu{1@fYrelqo76(i z0r=b)2!umCo2jEL)5%?9EP}nAR<7W&!bLy?CbNZUM4z5f zsKYNF7Tdg!#~a4!}? z4EFdhjc}noi;3QuJ##!Sh>sojq)JJ7z(Zi?CFcjPU6}|};s?mqbqE|;%lH5=eJNto zKfXNAqDhK1dkx@4y2_3rc~=-hKaZ&TG7P0?;_j`0w6ZE3Y@Oz%c@VUj)WjMMZzc4+ z>OvO~0uLHT&&$%WIZJ}iDa}k%ZjvxM^LSLXj+;@&bp~&gx+C7uV`YYO^}pQ&`kvtY z&mf>t!hwn1{fI0E7+r78f-B%}PO-I5$hwAyxR6)AceGHB|MSGB0qFXN`il=Gx!(4U z;)rAKoh`cJIQwTH((_RT9{lS5of=HUZD+ObW2&8^E#l{@{Z~)J@z%VrPg;?ld7~B& zlI4ed@OzY9*vMD}AOPU2D3bsyp`5f!F@4_9f@&AcCwxZWROALPQ6)z^11s`^HPsAs zi}T->kY5gH7cXiGtbI{){{v|(moBrc{`9hkIZXN~QtiD7>w)gIm2RII8wtNCyz{b^+klk=}LX=jTX*qE4cDF;9^Fa2GXG*3WC6bTT4PvLdIqqQ&-(Nc} z6BDpCtUj2p>l|v-_gqY7Goa z{qoIc#nC?o{H9PTVh~8As@rLc;G`~a5$<1tlfS>qK13NEgcSr7So_K?Y!fA8b{|99 z{)VQ;8*?sBBS3Sso|Ax`PR9aQY4d}ON$i5vZkJ`CpE7wxfaG3uc$CX1q_}w(Mn1rh z#BVZ@&VQ7{!AyuCW=5RCijrx|kN{BQHYV%+&voAco7`pJp?J!ry#5{_aqHeG7dJ<( z9wZ_BrkP{2HqCOFlp9V&{7xKE+CjuxbLE<#?dwB(Y>Q@d2=Rceq0_{>Yx8O?V`Kj- zT+kp?pMj6t_FQI0*T%r*uO`B*LCC|@ad%zs4HIcMkDIO!a2Jw~iz$>l*JFMuBBYBN zC(lM8bMP{%_r;5&AeHYgcLAxkkY;+Zl;1s&lA`+tYwkUc6(N(7NC-}cWF|yJ0|wYp zp^VOguwUZEa7+KDi`LHAgo!sVp5R}bh&P#9YHLs-vw)G~WQ#LR&7rK*Sdhwo&CnMY*ASYnIZe$- z)D89^^9IBk+Pps$=O=&eW$s0@8s;*z4@dG2*KX?(L!gswc$u8z>SA(R!kzd!LK~{) zLbaT_t$(!R_dJTtN;famx89{rJ zYcEXJ*iG6%ZDgvCndoq6+It1h_Th8pfN9nFwRhfc?aB7gQhd_{xXHW8BVr!T?x@7tQ+5qxw0=l4OVlbTl3 zMz}8ys_bJFmLQWNab1=RK{RZX)~3E+Jp9vo+Zd z^XV0gDwr16PR}fvvaKD3@PM(6J<3aQOADxdTn(&t5hT;rzQMEU{HT4il}PtanC_RG zS}}-O3>DpnD>Y#Tp<;{W`H526{>b!M%{r^5B=x}u2UW`zLba$3NT9^{mQQwA49HS9!fhzk5+@NOk*r z;q8J53$vGs;_#)B+apDADiB>DIA**5yk2j zoO^m2U~5O);tM>p3;BK>vS0T@%);h+ms_s3evjlponDm@pj4gDOB}z?tA5oQRBjyt zU(50~^iG(*agwucztEb4!970(2eV{^%HI`7f-;yY5Eun9W9BK z%Hn0EaOPpnJkf3sxHlHZiC6BRsEL6J>JIn6oh&GkrxHIn?cJ5wB4d!gjI-JeBq>JONXnMR271?y_7 zxB+N$9OYYsbdVF4E-|D&eK2}nZjme-Qdlzgb6z03zJZ+OsSsc$f${`7Ps_NLx1Vda z5pg|k3B1EyaJvkDCH0ZEotub|h?)tme5S+~3PeefkT4g74dl_xh86xieCG_lrg8~V z0W<;92eqsR>2Vpi_4~+i0jgH1Ia(QuP!GRwB|(|9ACKh`we& z+163*b&Z>=EtP=wpv+`#rFwX&pnHW6X<{r`hZE{|C@<$p@Mjnu4Xz03BY>@z-Y(D^ zC(H4R<2gen1yhThP97NNpLoY6rTxOg>WMhQ;aY&=NZ(M{(YvVj^)n&=cZx-dp`QjY z`OiLYWrUu|r^0!=<{&#zCwdJzwQvU(1|L+yturs&ei?$namuH^NzGjO$WrgvWfBrb zLYGG7(TkAtKnZD;8z~}{&ekXKFopzG0{KCtJL)@9zrrSfn}TXNir5xE(idH7yh>O+ zl_iMH=KV8>rR0)AipPr7f+hMO?cLsfgoaJ_0w`bHs!l@ea2HX)A0A{OWUV<$lU==~ zSr`1n1PdpljHVJ;;+)STF_bS_iC=~k+5LI!*-QE-7z-5R<_gcC`8I&@SDJ<|SRa!v z(ni*(fUNNphp4wj$!pzl!PLp3wsPSz5irJ4;W1|DGA&Mq6h{QZbVtumfu2v03Tam% zN#enzIDfAG>pc?P3#tV~Ne{^4RM040hMN7Vrn?p<^|~;bHu_5Jace4atXvY(uuHP| zW+F$p*Rl>nI##E)6%r>H@E}hME6i|7e{u#PtIMZ%H#MFmsK+V9o0E&1E-TSiK%2NW zDlP@?i_*-OKxX0$2S4hNqWg7Hm#{?x@};|7IwA7N({BOTxYgCK zirV$3J%{KM$(>xXmq?Ru)ZDmKUY>fD|Mt~_9e)q1!7sw<^+)LU=_0ocY2*{Kx(H)T zkkXkWzWn-rRD_;NJ*uV(;>*t&$)4$x6CGhUf4Gvi2aHM{@#B9w(YvM>kJ0b-nkSbg zw+p)HV>8#WG=JVVIE9!+NwIqvQlM0YnLo`NC{1-6tIv3SF)lS?XWXOj2FQUbg@bPZ zKj z>%wNF8o9>9{Z<8&L>MgjA)QO{*ZK)FGOvwRhO|ouV~^h!;@}Mdes*@$w(pZKwHH!Y z>4(M#oqp@7)BI+USgpmW=(UJiz5@y{*J%7Hz-{Dun^DFU6WKcaX5(PW!P!rCM4pWV zp6$|uH&S!&YIB@zBtgwXMuRGDauO&g;(<8B4C3uqeIJ%}Sp3F43UApX{YAmOIvk#?z%kap{!wkb7S+GS!`nRWJqL^PM43<8EW6{_xcVPHTCS$CthBWW!QHnj;~(A0@_Vt z{jC|-8!27gsIu!q1TwQFWD_&0`i{D619&MXYy9^P7`=Siqx2nuckMfAX;gKVd$0Z- z9UR8GKTciV_JuR5>otC1k2Y|8kkV?}@cM!U*!CAuN?FJIGlxx(!bdHulne!N@KrwN zAUZRTI7FDK01=S}$owy*c-LqeYm8VDqWvNY#LA7>ftqve5Zmp(6O6o(b`_jh$z;ED z83_b$!q+vdQtEVH7USS~5R##4l%v_ACL%g}PakQpW`d=TS`{ zEs?Q`-{`v9Hsa9MOvJD^vY^uRN_@fe`D{-Q?4BA>AN{Py$&&D7UHrAD*+0=`qAmq1`od?M)@$4|(K2`%!{-?*IalLbe za^L1k4yvU%yElxOv65MO^wvPdfg7e;WXJ?pGYC!EC>)gO^nnm3(B>U6> z#(AL&5((oPi%>ypxMr)npb8!B#cu+*AKom}QwR1j^|r@3KAU`6mmziZhC(gZcl@7@ z46-yzC8%UB7dZai)2o$)npQi<-9suOqe~nM$s;$QqE{_iiIG_RP6$jVK^;CS7kY&~ zZ=w0()O@v2=Thinade%f>go|Z9oYubPM3cSB`5s=g6|~VWdQ2j=pq0X6$H#_z}!)%+?_1`%}y{Xn;B>c<9?+)clSqr zQz+Xpp~r^;Z!}a>;d42MC=d2La%nuv(ft@yP(Q*#B{}Oxa_!YyKwve|W7*3i>F^*| zur!*^h7sEualwFDdx7L@_HVE7P3)FZ@J(rHQ!X-uq+C3C4)szc_vu3H+n~T?qtRIJ z+Qb{B-Z!4=Y=|Exb-JC*ETz+bZO*34H^D=O+2X3MfKR-#cYyU0N7v8=c(Kax1OT(G zDc@$Ucn|%1#@4wO5<1#4($L!<8W6oSQ}8=j_AmnF)E_*LiA{WpW|N{*ml!vt0#Q_& z4!zOiNlZ!aF3j|KgaV`=o_gZ+?XaX@2vbAfa1R4b71TP~&;R7=7A^8+cBvAu`1+Cm zMxPyAu4a-KgF0WtM#cCG<7gd-3uw*>?)i0lJJ6>o*EzJ~gD zl^wx}f7Z5N&w+HF1E zJ~g`D0+Bx#?G#Y0WZz6Xp4fN5&k40Fvn#mpFX$b`R$zy3c#@ajIToGE@wXAS^d6l9 z<)Ul=F7_AD5rB~7;V=9eG#-ALWu=e5*(}T?%BO)QYYVGHcGfo#ZoEj3ak`c(pTjJl zedqD)Zkk(MAqXtVoRyv``%bQGQ~fb%S<@NRL5U?QW-paj0usJD2!G@Sinl%}WR*=U$xTPt|s?Rt^>O%pzw=g5IjnhjKK1Z9oU1 z-yS;iO&!&ln@)n)e19{k62as>Jx^R(p-H7B@Qu%~4+RJG(-IV>ElUeX(nC$^b=KoBd)cH}|GbO#TgaG9J~4#kajqpDA^M`$moQO3C@)o2v3xk<;n^fRH9ZLT zD$1Twj zyMN`0nrm#o%WW6oCy#n2;w-0Q+AxD0);Uo0PlSQQJTbZDx_R)LqLdb}mMyCSoe#^s zsRN$bbLjbHpkWq^dkNb3mE4ubC* zK+i1#TG5m_uvD}CoQt7`yIp@H?4s3gZ_24|DdV>9 zGZ(mx`Rzb}S^hi^)K`J@pA^hTF!gn%9bG_xR#$aMR+~p4P&zL#WULsEm_aDlvcy{y zH6Q-MUHm8ta@EKZ7E~4o`raC~#_z+xKo<>~?_cHbePJFmzwgcoKrw#X@QVmM`2H#y z;^T2_#|CeO{$%OCDM~+1i7GAjnr;repYi>M678bNplm>)&?zMoAD2DG)E}G&xbAaf z^FiE+qNkttwF=1H$q~gX+|wpqzge8#@+MM=s9L%xrZ^ou157B|qJ&UeN*W=&eSWwK z#)2=Ox$9rd(CoZ8Jvbwhg<3lTv6)T%x=TcGrtpzmw&T|X~{$=B=HYN zup4zXTPa?{nj!vylHd}2eV*_Kh}4nzX6+a6`F3ItJE6`J#7Z@^zcE#+VSs?^GxR3S4cKb5AE@ay*5@RHJc$4?Navm>crP2G&lR>oufY18ZObLCac{%hplK>4dz)o4K|$Xy1e0TCKt+K5f2s%@VT#%O|;q>T_@OlsvHjzQ~lcn*QFy z>Qvv2o5JnbTl)O)qrC0AaHZ~~S-uSAI_^Wz6NU7Fy`!OT#(&PwoIqcDlQo9+TEE?s z7>x%7#;@NfNYITB#%MPY;&6%`h34G!#mr4E(q9M}i(eB$YvoX-I2*Y55~+pqG>z@E zooaD#Q@6L5Om2b+2;tvsla(mbfu1ndCwyxxo_o+}^Ta2|Y1spNe(Mp&F+~$k?WXli zn!nf5e6DB}8)W(SDW(;}V~oiqjxF;(GMdYG8M_VR6nhmslt;(6^(~eKQ?4tEbAW+qM-|z`!es-9d~B#D8pKf;retR zGV`?^B~y_MgD2N^BYtKxHpf!4Z)6P}ig&HqwVPR72$7F)D$oS@yC4#Zkv3Vpv^GbJ z3&8nxy~qNY&iEG$PySdVvb%RbHWQxcP*|4VE?MynCWaVY=f2XSvm_&pMk5tPl{Ehb zC!myK|K&RW7GwVDfA+wP!Od@N>y@?XY#2>Z+a)3O*K_f|f53XZR}W2(3yl0f&>jP7n-9Fs zK%UIjfAS!I{hc~)cnsplk>4pkBE|}SGQ5+u@v)t7*i?^#>qG0qbTBDnb*b|v{ol>- zUvB8HEBMPpzCVUyyb{swc*+YO2GWe2Rmsce{^G#?&0qfg6$qg>b=cb$_JkQPH7q-$InkBqQ8_`Ly_p( zTpjJd{hWXE+%Yup1{GfD-3X_4K!qe~C#*&)NEMlee}%#svyG)Bva4*wZRFF%Ktc{+ zBZemP9IE+YyW0uvWWBtLeB51eL!uU)-EXnL`skAq+Cgv)HmAHzQ)0lgjT zLxfyaL`o8-Nwd=mFZZpIjIkNiQH6M_`49~8R4>J9{hJ5>x6fgo3(uM*AMR8L=^8hH zJ!nP{57XsBt#g=#H`k+G52d^6t}-qm29#(7Zr-$+7a4w!==qs{WEg*WMRmW!Hk>>w zvUG|);?_r2uaSz!1~z`wBF>XPfVUUqXhVw9H!$g3b=O>KaSG?X$m)Ci2jBArkQ8bo70oilU* zkiHrNr)|%)#K_`Cck*X3I1S!u{#T48mN$MUKo^MEztcE+_9FHMg$>Yu)?(br(2$F7SMk(C+|lXq5S?Zs|J9TwA9U}zO6@e2(K?Z_fAIbB_vF-K26gE?lL*iczp!? zpPyZ-ZRq9g>TI;Evzq+zg}FKH$XCnX8R)j30py-{uSmXH#<_zhwcvZQq4g4P60DnW zMG=T0mKyemeyw}srf1O`q@~Bn457Vz5W2GLL8_I03h|o6haDUi?sDG2GAZWVcE($u;D5v*->4?=mMA;Gpx#NP*Uo_3{+@LDB^@ZT1IUcZR21>S+5K(6eAJt!I+ z>L@7zXhCK%nlz+-QMyJ0njfJ6lnw-@J;N*;tSQ8$D!02Bu+{*@ut3v=NKg+kjAX3< zpZ7$pdxmY(i5fxc*7R&BW*qWz0rsCppjFRYcpH_T6g<|Hh2xn5x2uNSu5))2>Pm0u zXh))v+!URC*2R!&nR%uz*FgvI%jRqxPx&ZGk90Z5ISUbQoE2HXd5!VU;_*FXij|hy|(mg7iv;&$O6ShaC zt`DjlK-~vHg9h+cFvyXCdR0DDpC+Eq9C(P8Rl5A&HumH|QuaHz_x)FDZ#G5N=i~$Gn|o-8 z!`P72Y8r0SfF}2h=TNH;K~zg!wNECWB_Jjtc?P_}B$Q=2a)Ee<I24Ci(tGBsm4g58t)JmW)e za3`9BltzpQ${-gUsQ$6yc!rJ#l;c}Eax5xAjpYT%Ya1OIheC%c^t7-7-9b+Pv8>Qo zq1b^#ReLC$g`up*`b8RLq%iZ#$x;i%n}^I@2oy21VTLx5;WilSwbDfxXgDPa@SQf- zBU8|#u2G<>6nzWCPK~Hq18Qhb5igi^cBYsr2J!nLh}df&6-=bIMR(ZX`0CjBB*_BN zfdY43Rev{JC@;KD=U=Jq`35hY;nd~@4<@~Zd&WZR@RBtZy6Fm&LNtuCks}b}1_x)> z4QFBl{Sj&tY@(b~3gc$(?NG?C%D+>DTSCuf@sL)FLyJOx3JoOQ{(?W$p+PKQ{4(Dv z?cGV2>VVV0w}SlEK-L>fxpfXnOKHO6ap9SQQ$MgDKBjBGpl+fJS0+ybY&8MOmU%A& zp5(M(Bt~IMtu!-v@FI8Wi@j%lzBhIw(o`e6{`H6}l4MQh(Od7oGSJIz=&>M9I=QPv zMpi&aT`El5`4C~!{<&I5-={t0G(_>82J+=eiT5!?f!G%4n^MMTzb+%whF*xxFH2{L z97cq10%6+ktO3Bfj?W>(jAHVRdwtxf872hAh{rk3Z{nC3PCwta-b}5D{A?SEU zDJss^fEa;sQ6MBlEm=vvQ2kra&pqf@`i5GjP758EyfOKiOB|tspoEC?|@`-{QV!C2+9~wZ4Ex$trgkF0W8Hx4!7y zrlQ9nV!0q5-H^NWR7H>BjW-kF+fMA+4T{b;=jHm+wW!{KE@i{dA_x{`Gi(6SmmH^w z$RZH~qdaqa*yF&rAcvrx;{T0A@%@%{!*D2+1EdzsGi;=8m(VD_roN5MH9&KX03)h$ z0PsxTWvVfRQ_Y4+cSolr;PMMouieXS3iO7HL1_K?hFlxWpnmh@gD?&on&vF=Imv*g zwLAMWo!=&7pOs-Uk!N5tlMEKFN>yd(gryRxNwVK!z|xxfZD970`5R> zv7mUVz!eK5i{M9jRBzt;fV&Qf0swf}=yg-n z%tezp8OsP9hbYGcy6a0&(M@Xp!#=w3(j;RvNg4)hbr}>_foOKX*TR<%>qdM9Y{V7? zNO0eOy}0o+?*K7Qd*2{2$Z(G}7F(RQtumkcz_mBjDnXTCHw_4C4451u6fUPz;L?`x zV-SedIT~k%4soe#+*!hqbFV8JDfjOEagZ{+SYI=Fprd5%Lh`^uH8dxR3+IiCbZ7OL zGg6>nU+8?N5n_CN*me87D8wPC2TgiQ|HEN zTfzJZslJd=Qae0|T;dG{-!shib!UaI#kQ`*hhQ!u2nY^l94|izqM)o0op60IE47G8 z#fw9mk_$Dq=-Bv?a}Xja?g?*B)8)1_ltShI{J5*pCqBIyIRzlx4xF?xzL745c~R@y zFUTo-)%hL5Pa?EWZ36Nm@*KSWfgzA00EVb4P11;kfO=*ko7;d-sR40Df~SY&h%!l@JAc!i6SCSQvfCQL3JPi;%nAkBJp5aBl(YQ2)P z+GjI4$S^nr2SWv@{;WiXG>gt)04?CHo`vvt)~^9+KBUqO{lY=GuDP`kTL?@vx{p3; zMBK50mvtWqs=^R%4}(AkTb6!f0SesY zk06m^G#(=Qom7o@3HpGSBGN<8rbL}_Q2(x~EEi*ePtCo^WSxFi5Au~ph%hi&j=uJ^ zA95fW;e>Rzz|>HxF*HWINDV?(C+!iWrB+cg;QRzCHmWI5*QJKW2$sQxY07 zGS1Fu9S5NwM4qw+{dvaf-3&&2Xr8$ORBz-v11+q5P&*xgw7jhif5Kx|{LTEso@y_>*{5yYp@H{X$ zm2gI2$r6_(ZjJ5t#r%MFYt$>COpA9ei{G`}GM_5ClpmHH>u~JnApxIWxkDgh*59*2 z@bF)<0>_8PC+{h;MvT>@*-z{zDBi5qFi|0JUN%iR4v(%vL8h43um85>RRXQFyL&YJ?w>AvkfX%ep72l)T~BigK0sZuy>&->&*u&g$DCW7YL<^TDc|LxQN_HUY%449Zlv4!(OgW(ZA;s-OUQqIcxqlpQn<8vUj=I^_g9uG#X2L4*l_FvcVUv~Uoe=q7f zm{@ytmeq~pWpZBx%hV9hjC%P;%fxbln%&i~)<)Bp6pB3HnUYr3eIC_?9HV+>~Y>_cZ$JrIU3E)q&B%F2m3MwNL-sx7g4V zfT=xt`Qs`Nv@$+(JSr5;uOgrJi+_1O{~XaKo;Ypc&8KU1<;U_UWCh(j^p=OypA04+ z5(IW_$)vaMWY2}pfT?|a@YCdfI642pKMl@cQwwwU&yJv!63BPiwN%pM1FaeXm&M%0Vq(+iU-#oL-Ib7bAdzU> z$@Pl2kQ!?>BuZNlyO_}#Zukd-;SrvJG^~xH!^t{Z7r@l$vtD`{|IuI^>OifjkI@T6 zooHBga0VJIhoyg{he6maw2^hOPZRpPi8{!7%>2+5;)f~F^Hu2y*->6-yDgUEg zi$Z`CP;Mb5I$n}cC!{*ozq*h9C6)N^XCCq$Y?_$#4NSrDmbdmpG663Y`LmnGp%11O zF~KL0bh2x_;Hr7({G~hpANqjiF*v^{JE_K$~1g*t?{N`U-_yS}mFtue` z9)CK-9UP~awrk6cKN`$b0$h5U-YK^e5y~|JV;i$_{@FTjD}qm_k3?5IJeKtr(9Fs$ zzHaLO`%(R+sm_yvk59jEIoXpmE=WV(@vIX%k%_+y-+)&yf;8qckW`J>Tv*?^^YK3eb}_7E``TkD zhn>(286g?HWPf%92JAq-4P6CjjgJqs8nTZ@YU`H&$X|(qB(l9>&dTlhT`7g$6`pH} zq<^GuNzU9vP>j!f67gSi%tIate{OQG63hfIB{3t&9RPT1!kagyo;mBAMF|qs&$wh=?Z$v z1)F0nv`!sg5oI<&8n=IQ2EC~h+<+PG+1T-cs5L;XaG4~h7*sN+js}HUdc>Y9_P_`lHcurNGo0JU#v)Kr~7~1PE_#-}p24 zq#D}v`yMU2$7=~$fpqm$7x$kH<^(wu&)#NtA4emEHlQbJpW{B^e~uOsPb$4t9ji6n zHVe@%W8HpOFVX(Lo@e9Y0VoOPtyy6xoQ z!Ss>LK}O-Gm(_p%?*BbR8#qDUFV>W6V?qlBF_f`24qgV1XBY2}-JQpXl4wRk>iHGB z<%N?&;{i9nOn#01zZ_wRd59zI>BoTpMJklX`JDg7jA@l1klp`I*0-Eik+JIHJjBu& z6&&k7G24)yHN+)k1iivv<~?p6Zy!wtm_U?kRAcjhS_<+<_*&-+v7tDSN^Lqy-&6lD zv--cw%sm^T_HpSu8?Tmm^6%t6v{GgAr+}MhAdM9Abb;si5PB-Wm%VOuwGtt`tp#{^ zuW>;Lb6ZgT!nXoAsb>J|guroMIM9c0_QlJx<@^&bp@(Q<8L`b{Y#q31i(8*-hf+!D zW`ZV4;M+~3@wM`O!&Qy0J2qkR|2H#5NHe6UcM*Az-6YZ|-3eImfQMByq!R|_G*p#r zsRFGoM41P~ykdQvfUW#BL8A-FX_ytM=BDpbkW-~{6>;aERS_kM-5h0432 zWHnr@QxA3G0SeZ-za?;^d!_qVSOLJlp{{rJY@QSDxUOB!Z~A`TjcY`XvpxW{2K;qrt?t?_tDWsa!NAfw z0BCI3ohZ;5zR$O0k3*X|WX((;{+b?Cg(wHg0hjkqEJC)~5vpi)CFN-m2Lw4YpaNP) zV=!p68(|DlFdEqZ&csM_T18d$LxckE5aR61dSey1HLX$G0hy3@f7{8qLE!i@ig1Fn=yBCI zDN+0e5fwy1GQG$c`W4y<6HT$q)MFk+Q`a|NA_3FFo1Gp9SrJfW({Gvm`ynSaV9Inc z&j+BPS1gj{6;Q=>yPhheku>%>*~^SuQ_B;#pn{pspsCAIJF$T9v2f&8qSibCMB6%J zwTeVfOwanRrv~Fv+adlEtPzxhtp+tqeS7AVFo+u8uky{o+Do@U-d~qZth|lJ3!3Gw z&?)Rk}VZ>)q>yki=wuc@)6^?$_*tBb2F)maRcE`7z zf@lJO=L8Qy4P#T~t`hu}spn@g15R$O?TLw42yGxx0T`-6TO$x8SvGn{^0<)>S!2Ld zem1yL$2N*(TW$Qf%7ZLu;I^jCKRjDX?(icgDkM$`JiO+MARXorP%xxLqN zyt|Vs`L}Gw&ksh>w-iELbvu9td(Lqxe?qtS#JvuYC1{#Qo&D@Q< z$auS1ryCWYz}J;7Ly(hs{&DO5c5CVzDSYZJ<@@LH$&ORKpr@YBa&il1W0aZ>v$mPF z8sO08{zP#Q4H5HDE{Sp?13?WXpM*eCcOW2Uq^47uCGLpk%GsO1M1pRbe21A`9kq6P zg1q*5CXF-^6J-7)?*|`7PjxuGgoLa0%&$+`SBUk^uA> z>Vgo3iWNjd?IgVT{AQE)3rMU1Q1`wdG)td!?)oNs&5qh--7$K+X(Sdo8`W2$b zTOx+4p=co9p&{CPKV6p?o-CFKPJv9Teiqes3$R?R)>K z@C!BFC%<(-^wHbYN1j#(KswZd$bqQH$I?HpETTZlSmetks)tJWn-E7Z-~rzai%)=H zoy7#zP@)`>M>h>+#%W{ydh8-qWtQ{^x3R;x<7Nd={cVA#l{m3-PwIwvma?){E2JAK zyP+bxuRn4WQoTu38UXhk)?U7R@*+o@=c1kQD*Z5S z6yS&d@WGonbdy(1+X2Ne zbVFPZe&w5hj|e^~ckg_UztOLzfNyUq16>s+IafWkwD*+-!~Ji-U4Kl)Ij=y}C8&T2 zr;Bvu@vb}IX+H;7ab|&px9j46*^xe8BzPobhvx#>Oi>}sk4g5kNE5+wvsZOLE>Hou+bV_Ew2(% z)5XfaRY&lBW_emNYnE|wT2aUo%n2%qt*n#-28;0?w^>Gk;7%nT_u*MUwYqbse611rSz1@~GmcWUixtzXPid&6GekE4#@f~CcY zCdCeKJ~%7Q!tOy)Vqy{mp7o1v$e|4V2Z%}0ro(6GrXte@FDG;6ue>D0T$y$y8Bg>P zv@6}FsSR)=*=@l5?v8k8;Ku~LTjsqDN(Bn3b`Uw5H&68ityq_gChaPxvD)qXzhIod zrp>ky8gkxoFkHN^8l{!hbCK-R7bJ3bpe7^Y>I2I`2&w$WX%^ok0*)n%WfJwDu-C73 z3@=i?C)(`^_Mbbzr1duBOsGFtEsmQ|miM=4dkUW`t9=lBhzS-zfU_$y6QU>hb-{bj zOggpZYvK>vzRXaE=F%V%puU4O!^s>ekjvwE&UDO2U01QPCYM*f> z@S%T~I53V*ZghscQDb{<2Qf`E|7f>TWwonqi(@pfh@Vo7SDv`BxhB8}L0>3Wl9e^C=J>cU=bk;*0wRsxC)pCBEL8wV-5J zETpDY(YxXv)8fQX>|;xLjiV4eJjsHBD8GRR%nFi~$S>uQ_T4FSi8}#j2s!wHfAhp& z3u`;Mb4~^&1GI}ydE^mb-wn+%2o7iz9Mk4tmkpq8;q=*j?t0rjxt_c z?OdkV&?!T-5{Ao5MM=>t`@tJfk5BDYr}R!ROHa6qEuSIrmf`~e?|cF_VUn*9d-@D$ zaD0DOZ4*W*LjPV>c0GRPI`gisxmHRlCYoG%otW4GMk>rR3aog(tSXuz`?r zV>$r!nj(rk#YPcls&h|(_~~3s%lcfYKT`x^Uwb{?Kq{law?FKwCS<P3tw=QQYSg zDXuOm)J}Gh_Q$dmwu(hxx3q{yM$>c7CrW#m7>nfpCbk-&Ug>92v-a5}{RpjSy)me8 zCgNfZzx&IcK;mt)?o>g+I%}4BJAh!=3m)-GQRu-Tl(LFyNGh0rNpb}k`5V5q8TYs!Ss4KaW%i6cFY#P-Qu#H&fpHsa4&$a zd(A#hi6V;j1ueR>Y3k6CY$_KdL33yQegctPg>;Roc2hc;IafD-3v+KKVlF>mESN~I zMd)Z&${gYP1nI1tDK+FG5PaLfxl5-1?H2^gL-mM+X-E zvYbwj<)taBi3+0Lm2ANhb)l;L8GufYd^^vi-p}eDZX*LX{Vr8b(y2V`s*g$c@laxf zD9m#x2TjQmYP!OIJX2%M%Z^ie-BcBGgv&WHvr$*P%=S206^;a5i4nS$z01SwhrmPY zbBJG>Ib#*Wcz@&yJ7c^fc1C+j;JKBeH8TU}O;!|)x8dJxzsq+YWQL89kZmWt$v;b;? ziW)be1crP+y%KR&3SmK*^i^9Pg~p%$P_vJr!)H1}Thf%M7{IyV7lFWG>WcCc>wvK& z#co?&`MO81D*|DCw2L-SbZDB!s)gFi+5&~6W!_wTZ2pmi1XU0=&2K(?n-l1MrP9v~ zQGv;ZTw~y*+cg9UOgHwoDMiEfKrw+V!uNJ}a)|uIdLjhaXGxd+#Lj;|OAL<#@$?Z`Y%ODUElvwpiPuvYol!FZkv4 zeMygqeZ!6%I8_H)mR)Q)+^obPFW5_XBF~ILW-GW>)uKOwK!5iPbS^15sz6{7`%eA& zKt>nGyt17iH9g^C;44eVs$j@KK-Lw+2SY)MyMQHl1`sI*l|9Vk%q~+T%YjTKgX`QO z=aSA}8_D$ry)V*I(sK`qJ{7B)^DJ-?T$b*VvI1biIy<0aC&9)pH1m@f6Y{aX?+~ zboHkrOJ5kZV?Z&jQA#ok34InZ$#Ys01|koZ^bif<1XiM}3q>~ags`XGJy8h1(HL4Q zFFo_(rVz=T>D)bpY~{WmK}P>6tv=T^Iy^zq8i>LNr#dfFyvCw(U~9cUnA&UzHI!;-KSu&LjN@PhXGKN+ZuQahO(uE8IU&^ARkE0i zE`l*mSiY>Y@x%NkEqf9nY7ERHCe8bEg2ha6pxMHB{p>R2Le(%}Eqh)i`BN`%?{o!q zR3}ffclTbi$+17&|7b>|(%2nKmg&QGDM7WDG-*g%>g6%j#|EfE5qEVyw4s;1{#V}Y&tP0L;F-e|1g2~#(Y>-VyHPZG zXYO@{JbXcxQ`k?%Ds#uPc^sgVhpOWPBXeaFZf_{|P5iWbaT+ZNAj-=V`x|x!0gpZw zK%m8gUbfu0x#w4&yu(Ny>F$mO@1kyNSdZXh?eJt0Jl;Q#Qo*B+&v!m{958 z0-?O=XJuC9mh@sZ&=*AoJT!l8!Ff_TRY6R_W{_}w_vzh~FG`gcHH3Gs4{^~=`ofQc z=JIdkVFvCxI-$fztbUO?y2b5Jw){G!uHO8SQ`gs3{2d1sPcD(vo3K2H*(>&VE*rmh zc4e|;gY`1crs4}~K#5rui-cza zi8uGed;Qc;GP5CPnIzu&4j*_}GjApsc|V)T@LWxg{di40tTE@Fn>ORc>Gn@9xRTok zKQXS|?d!Tnz1t|j^_z+2)@^nf&Swh54lJ^-Y?h+CNkeLX=F|}0%dvWMq)$e{NS7e` z>C-7x(p^ea8uKrSco%h52V99;bxz0jtCpdnHZ=;@a3!sT`Mjj%_8D*H6V*nSEH8(~ zM{M-!{EmQ}zvb=0@aFl#tVjNM@XHd5RhtQ=s-^i~M7qj+j_Qeo)Pw2H)qQ7R*$eJkoQFM~%Rs?{H8aD}dJ;(=P|nF#S4@U|hN@GctqeqwSi zTKaTidQQiXZ-k*^P5}j1qZNh3D)rV++0%34CMZ-H;(2-o2?~#(5?*R)ZE}Tra;#3M zESjM82#10|YUpzTS;K0j4J6$lJa8+xos zJt>G!Gm(Ck(-NEA1XnlqwvP+U{Gf-QB~iiPJ*?++S^1qhZck0ZUal*wdRMY}J%a=9 z5uzc3q)mh1nUYW!u**g-vENm$9QV%YK5ek>*?zb2mvP)DQ-QD*py95cJ`*DLlL|I( zcrhWKDDK@=LD6BXNFFV5w)=${A8nm+J)|VrTDk%s>+dMsy+d}jmlahNd?M;H1oQ4M z>@L4$j7no}^JNf(>T(-Ki@yofDljbWx!0 zTPT)-(r1w|15wL%Gf7+`yF-#H5fr=&X<1)nP$gT9-`6@tjUlG*UbjO|38^TG?jd0j z#g|eKX9K##G^d1=PWM9ulF!z&<ewIY z_B%^U*|}WnJOp~;`RqX$387N_xidp|Q#|SE;q?OF4@2I`+_WrDMaMo|eFT!Fm>!THDRudPL1C=DNyvRAo#EJ2nSO!GV0|yMQ`f!u%_`UBows&EghD zuCX%a*iTywI_j@mo$83LK{m{9kNOtoXa!jJYC2tHq_=} zo$*`jRH(S><7iQ|L2eGD%}l&vXvaI9r{YS2Ef<^-wv=>j$<8;%4wsf#HcKZv19C~6cMc#}*8lTNC`;+h$08fatbk*l1d)5zu)Jb(? z-O!V#un9knl7F<@0`GeE<0p<)_JOD=NvBhm%>jOQlsNC@Xk0;-6yQfFp60?EfXeW8 zGrsMqS+caIM{=n={6y6_BEH`0&tv4+R8$>@qv%ndmFsi52OAALWqZgGQZB8p$Helv zS%J`$>0SU}A}>Zbn6*mFr=Qw_atlsbM3goML_(Z((cf0NRs%3n2DU2upV^+)1<<0> z^wlVBm0&4ZkF@Ds)qUC0vK8(1B!cY%#C-xQtl0DBRHP(eP z0zu$Z6=>@AHO$6edLjJc9#NVD6Si058_{^4B~eo_$XI0}IOtXZU${E4l_(#T4dv4V zm|8zqj0pmm>Ootm0K}R!*#hSScAaKc_upoHNaJTo2M->^mI0gnyP^j}$kD#Q$kdCo zDyGU;&qq+h)|Covd*1Tb+r}wX66JnxBoZ2NYdM$!Roi$M4YySAVJ!+OZC9R04OEs0 z6@JfFd_abG)+pbV!dG2iiQ%;EbjPDeTa~RYUauIxReub-_8jQl*hVnPfu#8Kp2(ZQ zSq%hp_842*MmVsyKQ3I=R4wFdlWO`H)LZ{(nlId&g*bFtq5fP$tZE)@awi{c$EDiS z-QBOMdZOu-D7nM+-0AGOc)t0|H0xJu*=k}-dhX9P()q>MNunC!iD)`*geHJ}%@aKD zK%J6o#}xjdU+oOrTJ%F@4U0Uq&{j*p^i4C#+W6KFpA<4he$Q;HUq6STBKbN{ZiRfl z!Mr@KlSex~kIFhof9EELd_22~=)DdInE<15nm4R2dTPfuql(Y3(|<(@w8=AwV_XF~ zl4xq)l3wPEUV3}b`@{Fb4{)|x-%Xj--x)<9V2p{G?W^gE?=BHXN5ATj-f`L2#!b4v zn3tv~%v@-1pqxmhl~%i2giTmbj>QrP#~nC!bZ>DE&U0l4DsvE0#`oU5>{{M`;{b4mscZ&`M<5uEB;DK* zytKWp6aM7;lg@b{^OWgaCl|e!6mV$CYd1YitSpP_1GY^_J6G$$rOj73Z-0wClegLo zd!?#3rzV_Dk|k69+!Hi0p}Q#sk7pf?*nNV~81fKeUU4ps<>r*!TxZNrqY>{ZA%%T^-0f9gP~HA5)8Xe06}= zD9PY+9ZC0&{3Fl5I>J1m;D$}OY?JY}t+uO4P6N&YOL_TEqb@D|6PB#=t~ zA-4akjiFHs%c`5MGT|1yH_ojlyXutqgP+o_q(4`;P2swIJ-LleY#G6!{v|^rB2&)q zPa-c;zM>Oj)A{&aWP%|f>AJjJxAJLw*)A;tH7XWu#rL2cu(ePm&C_S1byP1thfA=N z>E1@bBnBk3-rYbD9dg)YDB51f!s&;E5{NoYsS^@RWfN4_6>X`+2Vrjgc0(dU%8W7nx85W-SO^T5x}2m_%=RRrCeM@mhgNSGa^ zxlXs7nYzENVRN>Kpj!2&HEUhw2j0*_$*EU@^D<{tAqkdgPL)^KQrIUZFBpL9Jj(6x zrA*<{lG&P%Kse3x2E)RuW2&v!;LA^#@r0;rCEG6fCD>Vbw6jDYqJOWKHmc@zsYc#3 z+hKf#!Ud5KI~wZFclWtHewapANFaUkR`+%Wc|W3DB#vixNUHA`*nA7pM+Li%52$?>mg{;Q;i>)xjgm3btWv4EGlm)TI>R7bv*{vJM zgd%b;3bw97+Lgn~j9K2c8w@^N@xEzCXMD2?;ukuf&B|af9^Xwr3CF)XjOYCRp+*ZF z@7U3L;Mwb2T3_P>r37Jh)o$@G-tE3(#*Al7->C#5`c?uRN3H%{N}VQV@Ry&XDb3GH z*of{k{D}2m3F2EdKp_psu*fDn*vX=Ll0-X&nIP}DI90BJ?W!bHAHF?>tIo-V2Q|hg z^@z!1`9LAGk|4dcMDx9X;bKd!d%mJEw)irvBj7(a!pq?A!-iER-kJX72`KLYy6rY>8H#4foje4k- z9Vx7MCt9)d%{A1B$Li-m@vJ6kD4xFUV<{Ma%1V~m<1o6_wO81$vr?qKgH=?tha#vFJ=v5v?Q+9HAu_{f% zFhnai>Vs#pA8Na*F?wzOF|^4-p6r z=47VQCD&El%b||2876%-fl4Zxvys({y)KBISkX3341$S})tY0ezvT36 zLu|vXvGXHxTG+1SfMc*#l`j7KI-1|leCA$a#8z)vZB#UcuPm~J`V&-qae7aGJN=>a zHv}chu{^3b#wiS{T*gSOD+$h6)alG2k|dHn02HwGXICw^dToG|lSkY!myZ+qn@L^H@X>LAxHR%Z zvBx3@MaZKMAdJ9HsQp@JSj>sh)HgTl z3#tk;tB722e5xofm29u)=sVRs6vlZ`L3*&x%xJxUjy~uT1-pg;ur~DKGb!1kK46f3 zFz#7E^{vKyQ#4;qdzO&i$xexe-f8ra5ix^i_owTI5B2B<9wMCCO0qTX(KnQ0*(e@F zRy52mu4Fxk352r+>k*OffL;w5*&Eg{=iWNtB3P_C z`kEXdMczcoCM_)UbQh*q^_h4Dvu*IU??(g|^G@rYl#D=5Qu9@vua}JTXj|lhIF0Zq zacKj(bZ{gz@wz~pPk_Sz@6xM|jKL@F^+ zRHzp4BX%erst8@^Orqwwe;?HS`?X0;WD-HOk7NmM9_*fo0exik@TRjVteJPG{u0#912!4uu*F~wdVnftaZ!KBvR zrH|@$nk@5Te9PkZXB6k`3iuKEN-UTAx;qpRQSZFT(TuQs&y~Eh8xmVrwFJRy)7P+^ zrcjwKp%drzh=O>{2z{6DbiSd-i{kz?Wku_x{WSO|Z^NFxmd{z!@^#8P?DrLWGJ)Ag!WuWqTAMe)Qwo9f%X zm!tEFIegC$E;YlH=_$+jBwivJ{T?0IA+)s-Fy+-twa10N!bi(yUez?brk`q6VfSQL z2;p!mylm^qPE3GTw8x~Gror}zYaZ?P#?MvD#$+IO15pLtbl#PVNHMs^>|6CbR#$dV zzu?OL4-4vTs}PiZu<|SS`@Cmedb%mu9_epyif)>7vu`O5%vzQin{f)eT%frmb`PA{ z2N8(6DxnQuzyVDnH1fW%wi+H}B1m$vo$_+Bn26V8gqJ4`EAw6G+M%$!=enG0X2 zA4@uQudG9X0AMpMrMTChVAmFihS@nZDYd8KK5Xo$vT@3oYu_m)jVx>E6zX)Yv8V=b z9sMuX{PT1KT?vk5Lx z$`TP&^7uWt+SW^;g}$gFWCl|B$c)?|q}EeKof)wLk$6~LrldNaF)_?{pq zt&+}Lzk8?7F92xZnq@9S1TD-4Yp|}d;-Tw9U@2ssa=N2PQAkeVAW7Oiv~_>sa}vo_ zN`obm<&WF?>Y9STv7yxLIzseb({|Yq(8l1jR3Gu}N)ojzy2ALA%arQf5s10$;PhYw z(FABC*&L@rWh-~f`f2>VX9>J%9l!<}8C>XFjqt<|NeqySaKZL>Efc8sFB=-=X}>s) zhevQPZbFG1vz4XvQO*35|3*iu-pmq7+ok>6+}I?BP7OcG&MJ^kq|Y-MEu+LEZbA>A z7Q^Tw(~FW$Gdy||i-|xO5+#b78JW_gB)fk6bS662RKT^v1m9lbkzPsv-6eba7LY3V z?qr?-xAQNig&&+fs6ZFgQ{k9aaravwB?O78V{F{tG)-1m2d(+DfFv$5z) z2n;O@82)}TkOLB96rvw68x-wj^Qz=V*t*oCBCuC5-*_Rk8%V^Cpw)TGm)xc3{Uw5i zhVD-`fAsi)HqP9}y;NNk8z^6a-=;%r{v3h@8q_^zSxctqDI>x7_wvGU!h>c>H?36L z_XD8fq$1_q3hn%ixyrKbg?Z1}XGPotyl}TC-=-S&p46E*q&KQ#XOPh>Khy-~4=c-l zC@_Y3JAJxpZg9)ybYVAS;;aZOE6e~J!zm@ zqFP^vFqPgM@0?vR^wOr{N4PjF4Me&XG2HNuoso2?VEdV)GLRNc*huD^()BGrqs zf~yYd53z{jIwECW$yvMnkthTAMwL&B%{%cNoww&2a%eVp&(Cja7^jcPpY{HE!z!Q_z6-XyR0h8;sd-&fzXapn>vOlR06&6aw-(Dq5W0NtvUILS*|A$Q!r?( zUMLaek#ScxP`r}wnlqj%ibcoLbN9^Hr}YjH~)D<<~N$|HajL$T_aqFs9&DRP*d79 z4cP>X=2cO4li#BXK&I1fwmh#A5DqnAQX+r4?v(fFXuY60;HWz__R)cwjdR);4L1Lx}&F^*6f?Q|Yr58%CacK%m}_b+8RYwQ^D}Jk#JKP4>jf8Vk5b zbHxrDW>+k_Ra_<-ymE=NtBMNssQzefPuuU|JJUno9#!S;Sd*qc_bWP}nPH906o{*F zuSMvwcNb=C^b7It97;z-dR|nJ^NV1@NT_-q_NX>F!)fN06)AnjH{E5|jU)$n6IzK# z91whf7Q?}dGK9D(>eg$IJQLY5u-2uiZYoq4+ry6zL?vva39|}A3;x0f5Jz0E0GFoz4KpqAV-(RxPHs}LNdRgw6fmd@p~Dh`~^lr|J`A-8GR_U!Hh zXJlw9|1qxQ7k(H4>gqGLO))R(HlpvtlP2ue)zo@E8gW!L9!hnL4ExH+N4URi$UvP^|^&W?=m9j2B(uDXG0@)irY=gsud>C*SH0~p(}l4;}jtIE^pkl z+W5FVX#7!zXru77T7^Yp{q2}Ow2U^e6|zCtdk%v9)*F434R26ZxnAUXdZlmSXNt26 zoWA#lB(UFj;DbMqEj-OEW71BS3)#-DgagM&IZ)OKG8D#W-2HAVfGnBWNMuDAh>PX6 z_K?&NzS4ddiNSj%9UD9pw-C;Zr)#93D@tcjrlPV`=+h%gb>vL_>2f8=o2gOqh$H4j zVpZ;My$=FuH1^Hb(`1^jVGpuZhKdy53!aZoA`4u&-VWicu+n52mCJ!wwMKA)WV!;e z4HQEk>58{}MeP3GMGXqT$hq?v* zN4p~-P_axOD8!xIPIF^0QCs+=YQil@mKD6e1G$hm+MRc+SpVaAuBGs$6%xZ`4iIef5QsAkT|Y)oYVpiME{yPxVg`oi}4J z*|_=>q$#1C)lf=J>JifzfM1%uny|A-i_87ssIza^VhZB-O=7FnCn{kbuob%qnBf4V zKJ&(hr-W<|Vy4oG&qNl?`BpBPQsYgEMtW^X0ekT?M&*Eq6Hs-A#Y;fVns;``R6$eP zM3-1K7}$&k8S5`W3Ye$BdPUR|oAc66u%4ngOaFO{B*cxnS2FW$KK9vykq@KD3+JMz za5Oi;@LC$wmy~_;$tPS`;5>kjI~{IKZ0zq}d$C+npS}lGvZUFDG&IDR7B+=t_`2#d zEmNZE-0Zx}G-UC;zj$C2HLbT-{dh=TUW5( zt)Dl`RM+Iad+MGI<#js3#tPlO4^PJC;HpKOrI8IpBy8_G+~rWZyMhT?3v`bu%2xs2 zp`M#)#ts3|_EiIB+Cq${+coLuLkub+`J&!iZ=lHBm(<#)K`B13yflkXS0`SElSe5p z-z-^`a`6Q!<5b@C??HbH%XQVIuaeUSJ__G> zTnPv&zD}lobO2%3*$vlN)5H(TG9uesuy5`1;#jwKLwbY0~HfZ+3t z>#!Mz-M8-H=0LKaIm*z*1JT!LfiBqF>mRP}mb4Z?b#03lpXQE>2~CHACV1+w@s?12 z?#9golM3NX3`kQAw3^fI_YR(WwxImrUj1A2UGzGDLuM@FM98Y#Zjg7KPRdBQZW>do zBpCWL{n3L5WfYrqMvKR#2Ty=ETMJdM^cayRpT^|9d(t;>+QDd+Z}rVZB&TeG7WpxQ2aXQ+aL$EyVBxb@bhctENg;QA=yv{k90ojX%47xs zDO1LadMOD<_iz!4op6^=ab)v&DJ zw$ycy`b*xav*f|4-Jlb6whE&q=*K){@m?EC|Mjrr-FfHfwkym7QFiW31qRoa=2wqR z^C$MKX)!EZ6*nc%e30}{)Vh{_nLRO=4>{F)*!tvK;;_T~-7c=p057tvJUtqYX#o%b#DJ^GqhaHJgt_ z1B1W#|JwGc}UBPqC94{xqbI432D(UGKs?1-D(V|LN@E*Sl z)H1?&EPn0{j*e*;rG~%B^DJ*j@Zq_Ry1eP8RhT;G_)G^Uv*cUq&!FPKHRsnc4a;`F z>u@<6Vw(ox)-7M>Td}ZogR|RlkEIKs4&8F%4aSqS06&iYT)ybNr2vm*ZLQ6$QS)Hg zMpLU86!Yg+{BS*AGths(-xciI`Yk?L9V_zb8(G9zqr-#;#_UMF*xn$`1D`3gOD%4- zQj9^29-pqXgF3Qg8nLA&^^f_z1IG#o*g7OwPauDl=q8-3)OmE1W#xd=cR)j_+h5Ac zxIg$vdg)a^x^)gHb}^w}4HIuYvNXqk04mUKjf66#O7}32vTYmrVVnaS;_Uc8F9k-QS}eNy0@%=vG4Q35`VYiBv9<)~zJ@8$ z(K~}i8nM0bW&wVE@PPWU$hXL(8mx6ZfyK8f3{6t;!)MO} z&z@2m6 z=TP}I)CGe_Sqow>4r1*ue{B}&QmQP1%;ev>KNJRW3;qMkS3|^M50X`TUP#fnPt`$` zrK_lM&-cKK78k#BGkYOiWKVj!UHA?Esk`m;lN(3GoSAX>J0RLS-w`CE2JTHA$2T86 zf!Kf_Y^2ROin)eCE1H7W_EpKS1ga{F>;vUaN0+{e8Sv4@y08VAU|V(Wv7MiV?aj>r zl%6$7O%(c(H{->P4LwNoI6@XKCGMW9DCHWq_)%C|kuQD6<*+_H0098)aoz-*#_Tbv zsp)$gXJr-?N{cNkHu9Bhk+Nf?+m`Ou%HO=i)whR7+n;0zyPe>v$_SC?k#n*SzOleP zY-_Al)}Bx0mVUs6?Vd@H>teeS{5y=951@(5MM+g$Zhy#cNSF?D?^8Ktm9!9DGEu71 zWF7Q_VI#(;iEVP#Yv?8wrlQ2|cKXI%{d&_S*XRbZt{aH;gt3S8Q>)&RJDP99r!b4* zp!hIH+2!-7jMdMplKH388v49n=a4zq z=S?*8%bW_3xy-ZDJ>krYvXx+?(Qu99_!{;6loH`aP>{$ww>!9%nwa3XqGq zXMjM7VB9$f8o_8PZMphT@x zh+L4{|J@u`3v!y%Lan?P8cv-Od#J9YV0gY&i`|WH#Rp_tf{BFk6QUoPrJ$tEHTd2` zI3<%j+K`RtW@R0H(J>JoTJ=k)q^9RMs4;u;g8{DY05F_9X@WFBmsfloO+2M&PsdI+ zUyLbnWZ=LR^OF~>+{k+sw|(}~059^5y=?R&6@7Dy=O$xBvfO9ifXGuczS28{#Z7wp zK5oOqc1LmV&Wpk=LEv4C4@VfQf6V)FF&ledQ^%S*h!?6SMNVOv*?MH=xOLPMe}ZyO z?tu_FA}s7%;$;gJ1>0#Co)?067d2@kI8dck z#c$n_=Dk#Uk}7UB11fJ&cf}c_W?mCSy5DsqrDI!Qw9^Q>`^_zM2?}~b_0-xS3Qb>~ zfpCI$Zj}X(QV^JUog7Z2`(1W5(2OAdGtmwkUHSCj4dC4$Le^^0<~LtdAm>Ol6V^^t zKV~{}oUNpC+)i*haof1p`^cwxBde%#TLwIJHhF|gOM**F0!u}L)(+b5G*okCyWgSk zx6e`clE$Axyv=rc*BcD=D<|o~z{@izQ0uF(5>Sd<5n+ZqaoY$&5TS@mYumsCnPBMFGv(*z(3WA+l-azO>Z;^Q-(uz&SPTT%R(D)ep&L(@VULuW$D82$QeD|V<$di zg~^uuE_Fulfv)9cyk2?A`kEGb+H&1(D7JhDcQRv>V5;uTU35!xZu4Eke4c8ZOuzYb zrzB35+idO?FYldKu)3m-Ajq4~a;!!GWS_D56f*!~J$-G6ISB=9ENsE$otgx#Y`ZH?f4Up`PZ6{qJXQ)vC`UHa;@xQ4ihweB%{G)+vuzd8sd; zr-6ST$*}b7ZpxP8iXcEaz8cm})PVyGRK7MgGUhx0>(veib;`idn>A#VwDPJwdYV`g zVrEV~7Pn#toXY5-?h4(Tm!EAYQI;Hp4G@XlW%lBKq|ibj*^~<~`kg3#I)Cy4^hVm- zVm}>#zTsuQ04_aVw+{8;Xp38<4n0j5@#yM`Ql(@6kH+!PGwbp3$V&rJeyWuU(hjhs zFf!S+Vk=rCOCBdeupqhl9c$`hr=qu>31ti5+U*8Tf8UQ!t; zGeWW=n<7zW*?Y?#Sy|bfR#q}Ava_>SgltkM%3cvF*(;p(x{tT6>-v5kzu$e|pIndo zACL2_^Zk0i)-hhM<9R%f&NTu|{lZOYqUZa=kn^uRF315@4JRDv9*TWCRkV>XT?Q<* z9btlEPtwt)ZE~90AKjlHK&Fv;&9{>ru{)AU(@o|q5Wi%T3wUNQ9TqFvu!}&-(KXVx@F4(siL-TuRM6Z@|ah3u-jd50#MR6IFeG{y}J@(lSm4JZ|?-P9}t>7--PdRO)&PV&_T6QDmj>!CKV3=^zMr0gI;>1B?cQIgYTRQ$xA zeTh6K@v@#u_arA_E!xCLmv1>}@BhRylU+p&jtam@)Pdmliu#BAlGv=zQ*)Ql*vOoHH_@5+rCMaEbu zTCBqIxbkZXR>e>Fd)` z)60T?eGt{OqouF<;`cZN zYL(8gFnQubN6S|iwJ^bpV?=8=M!ps`o1xrZsyv4ZmqJdvqN3|?DjL|d`-JUJuk=_n z@%qKGJE?jP7epe6I}(Pz8#yuwRs*h|B=owT#?bm|`9$y@`=yV$i`8i@2SB%<>e~N0 ziO2Tptmw2=AOR5>UQw>1#%wo+tGv-j?$scrjs{lET=UsnH@+8vhv&_v~iFgm>#9MIR z2Ro{)gu8FC4%lu@xAoZL-I~3_F|@{+F%o*#r_!b2(OK$>b02R?hL4@4Q|O6%Ddr47eBN2&U=(>`crVy%@ zz9P9BkXv+R_`<>+GQ0gyBx1S}GcI>2WMETId?}SCT2z@*#LX>$xCjgw%BP}lI~ z6>&B?gG3WUFU%b!vhP97`k7m!8+E+A5o#kflCyM!evg*Tgm%7Ic*#;6r@gfVDH6|` zB(JCUo{WFVD|28d%b|HoS(4L8_X^+AGZmX=m_j_S0Qm_80n+g^f&0VxFmlwQ0p66IL>=bXOuAxC6eG)tp{} zJ1@NPc&1Bgg>0SnG3{6MPJi`;)Tb)$E*5Lk0}x;_21T1I1zMi7S1X*^c~k81WQyX| zOq6GZRvK0S$-iNFdTiu7mdItygXlx90N;lW7%!NRTcQy-B0Lx0rGDtU(?)hYb|dZQ zz~$bHeEj!5Y$Ar28`qHtE!~KH+?sN3=DFVvmH5g`<^yj+Y|Y-e-Zj<^KL0HTZ)uEk zbm1{=NO88=q3lSO)9n*ZR`dp4#o}s){Ox%!A}f;b)#fe+yQYy0xUkq3-q(SX**WHNVJQa7xoaV|YVYg&4`UQf{0;3ix&g z>FUX%TY3J%w{&8RAUDVE9qKFb8&n}u^^;*|qbe??urcz>*O}qXCO>PqBXDueGjyo6 zR!J{&g50$?NG}$DRe1iyMWF`;3bGx`Etisa?XMk@@+hPUSK_5nj$aEkVSn>XR(iOZ zv;VW(6-6L0%47X8_B%IJ_NlOn@5h&{rlS=t5LxycC}lty$~2q}NI2eRezF<%<2%OM z7u~B2QaWk@1cK9i(JR20!E-rWbuC`nj~TD_Ow9h?lD80^%B58b7vv`5UYh5kJVUPK zZdP%kKPO5%SeYty23x_kQRmySQ&~x<`?CBSv5ft{XtD2b{}|x0CnC0kqQj&LsP4$g zNfBR4ywV9I6Hkwinjh!HPNTPwQzICFF`ifi~{OLMwg(FUX!C+3iU^2 zdO5KR;%TIh4%sJIH=wvlY0>-LVXC_=X1B&KSd`Rs)d5a*U&`Qg?M5`N2>y-ctItpD zCqOh=0}j=g%F4&3o(ey&`pM!e9Dd`+W9|#}66;MK@8dRiA**}3)SE!_?Yi;7XLo!C zYQLYi2}u#Ak<8Zbkb1=^D7YbMfVabpt^6tLg~xep1x!LD>r|f!JLnOqIJOpQzZ`BXl4Nxwf6sP^sFsr=T5Pdn?Gkni`a!$bTgh;4@y?svwRbe4 zGK~qQIKnds@;`GWuG&_1;)|b93Ec-T=njWh8~rV!d1t78l|}V7FFeuX`dG)xs!0)C zaqmby&wTpy1*0zD*)-@`l(0mr5wO?liZ|sBpF&9zCC8Qyee4wQONi34OwzA)@7zky z6GL!0s}$&X>=>+ums2i<^)Vd!R3ZFJT&UGaF<-cH1HhA;Q$Ydeypp_9x7S zr|9^sXy!!Y;Vzl|ar@nhLdIW-t8`Q6+E>43U8B`-wDDEhs=F$Fa-54WJ&s*yfRI?8 z_QJ;Y*ExHyj1#^<0YIHNa3LsS)wxfAVYTG7aXc|%6 zt>bw)4j01LFfZGmla3(W@I>lj=c@eB3*pC#cw4b#Ow2J`d1F!{RWJx8Cr(T|lat0{|rs^G@bt8ho>_j|ljEnU$B z$rE;DZN&q6?#{E38jh2W`&(04?u$VG!{do3?uZt}AQO4qJMcYftcNS&{O}|9Znza= z)UPQ_ZV|Y&<`v5umaUe=wDF?2W?~~-=JMTe(Tk_nJm?*Y1qMl}mLE$H+j`Dvt4OHT zH1h}#3x4_R)xN>QMmoSpVOwK2#CVrsRt@qu83d#G%iMktCC5ew@VgA1%gJLMz48Rip=a3Z3qwt4Y1ZCkB4#9PpA9?&S^bX6=!?!nxn^QERr|`$k3c@$`!|9ty^A zUZa|JkEB(Ue@|{&Lh3|4fqIHuRYsP~vIk<^CWRF5>6h()(XahYy31XOF%G&fQk_gU z$lyMCkkpxvk(H7-v~T@IZ!^(#;Xjl;cD%L`v0zN6HED7{fd)U`IiULyl^arX@lHiBNonFm4p6DH;>wGs?_$6VOrzujA3C3R22p~Laj!lu(^!y!mXrb6 z7gK`_#DrJ*Vhr2Muy@YRHI;|GH)|gV%_JO7hg*i#mb15U@Q#HyMqJrd0AP%43Y${i zeW!}W@A}W}=`3sXyh1zP8*l9??TtL2ZgR0-ko4^b&$gTPf#8%^$ebkMXQoj5w_Co{ z5jJ1|C^rHz_gXwE3aK9lP>)w|eAkM;vzV)75F024cZ`Y#CO+jU8W{HRvl8k_#?NLy zrH!(Q`(=4O-3iPTJuOE6>rNs~;=Us39mdN_X03ZzPUj}vHTj!qJD>4?f^5G0703g4 z)`~67q0CVNamD9)x?C$f7ZVL6QrjaYkZ4B;(1LK(Hg88rHdp58JSwK_1=fuyH-7cju4z@g$r6m&(d0*^spK1y%yPFSrYRjrE0fgK zD5SDS(-(!XS7oo|4X>~EUvOkdNs0=Wm*jln%WF;QXh0fZd1;m?TcUuOe%r2IUO+;J z#ZE|0fH8?UVnfn3WM?jStGD)g_?;r%n`@FgW3^+QABn6nCQJaSWP`hP$QRroidCu$ z?$8{MZJ!t4$AOyCF8oXQ8&Ya*`d(q>)`hR#nR*`J-3q_M@oD->j66Tnd(I}w+L?gr zgOKZkD_Ff-+=3dwN0%E>+`2%#$2y)pIowgQdEsO;!nRxSa*yiwIcXb7+&{-Hbkzyb zN6b&eNi@;n(u5ks;^)#dRDElPaKg5^7pF|%gyO;5CPJ&ILeubqAWzaih@K5&z^JqU zbdAwICN(ENF^TO6aRkTunD@cZGwE0fxHji(m}W!Y?^iYdmcbQI|1?+h!6uR{?Iz%@ zE*E%QiVkyY%A^yb$)nDrZd2Sc7+>f%=?}s)r!a}}@kJVFCv+3(E3fg_o`o|Gy%3ic zi3o$-1f)qZWuvPB;xsAOAFb16sfcxraoYdehuqP}s~n7XeHSDYROJE;FuhbT&DAf5 zeJ^dHI_Q<6MX5>STg8)#V1<5)WUS^A$lPV$To@qnrNPoN(6Qz|{~u+|;; z;<8I#nqkni29cy(+AOeZ4_e6FA1#r)o%n6SbcO3 zGD_2sM2-$2QYpiC3OJcu$Qztkv5jlbPrlv-jV#pLtORW=YcT^b=SG5Y>*LFjH-~Ays1OR7+h_m%~o~7Wkvkc4ey!Dw&>n=TzL$;cPw)|!Xv=v{t2I`3U zl`_&N?70q)4w1}?eP_8OO9oy|@#fgD$6%NMOHnKB{_pZG4VVa#tO&(Bu?ukx2<6?@ z<70*>n+!8sj5a0+wrSoacSB-oZnZ8g?(|d-h_s?U5#r74KDux>J?9LIa2!>X`7zVp z>{|~KPZ?m0VLN9XkEx&8d-2E!r#7N_6%hWLtaS8UbUl%9@UHAqaTVY|UqM(b&$mFa z;Tol$6^kEkNz-L;&ytZMAg+`uF;esN!R-fh>D8R~@2b4L99>KqDolMc-HQNIlZ2Q{ zGL4iZnfuP_W4@2FYGYlc^EEL~&@1mQ?Q@1bh+;%_<*`ZOS#4y<#GHpa+5WGrTY9MV zJz%DI9ud*{QBHOcL@;`~3Gea_-*6nkt7tauXpCDZY(iHkK&Uqlwbqy{g2v2=34cj$ zrZztM=2PD2RRT4%GxsiwuLgDeqM$zZ*pnb8*Y{%3B}}28*u?0cZTrnv^z%t;N0c?$ zJ<=R^w5j?Z>n+#%%_G7&JGm)MO;T^+Yrb;qGC2oU3jg|`aSxWRl@P{5BX5SB%om$d zgqH=J9Vmm1_27K-o%h2&FALl*yn5{R^GWD)k|58}Z_Sc&P8kcD#L0A$LF2SR_uSIB zM5Hkd2&`J_J`^VcQB#xq{1eQ_*L=;;rl04C!z~yS9hJ9lt+vaIzT$y9Sk1G(1X8y~ z9DC$6_z$jDk+v{~tEshA!$n2Y)iw9e@24z2OrS#C9)z=ymY)u?q#uetu~Q|mezgOO z@Mk3*DixsRJ{Ba|_dBh$Nl{_p-5pa~R(yu6lW#hoSQgbflYfqAFk2)ERI6b8hVpr) z63annindR_mOt@8@Gs~Yy@6d(&+~_BJfyRMISNLq_aXvv0)KcYt4UVy0r6kAcJFG} z@xBV24Jp>Cszm;$6gSsYp^Bdgxt+bv*rhQ)(v40_m*}ZS)kLYY?X|2NPF=*a2RR7| zKO5bW_a1H=izgIn7ugk^kkWHR-{~fDdKWt1XK6TQLbWTN&0;EO?KE5K75H~W45+43 zGkLL=YYa%1Twf&AHCcXRxHzT)%>1)Mv?!^~T=FK|04eLD*h03S-SU3N7L@7lsJM_E z7*%e$cemE^*RpF!OvnvIRQ*-W>I?$qqM_!;J^6@Qxbp^H8s^h32j1g)^pbK$G&9EU z@OWiEoZ5+jHEp>7i?1(JG82@+?96_{m__^AgNX7Tr6rrD-K*&g3Mw~P>UUR_8 z1Y(&QxJjKc>}4ag-DW~J*L^Wf$oR=pPV@Fh4_UT`JevRK)7z6b1{JXHyzEN0)-GF^ zVn}+$Xf+0baN@awH+nd^h7?ZKOF#1(@z__XY5Y@8ibu{}cJ=Wm^140Wfw?J*qL!{( z>?wH?*}L2sD99bA-m>(Ro`aBMwbA)!MWdkXLpilHBf-6tj=-`5yei7bUt1Q%-!xme zo=|5%3F6G6aWU6ORmpB*sX$8i8v`2-yFpuFbI-=G&%*t6d+|IbBm2DzKjVYeXxt*l zIgXp_v^)@aYvbb#RPCKZKTb)PdoV(5MBa1{@3 zGhTYG#6aBjkx(E@MdAI1X8cJ6ciqcJvN7j4Z}>YZfk1Yr_2DqIzaYK^lvxrvb2TK2 z2Inz{hOU}dr*!T&2;n5BKK(}0(S!TNyIkWQnP8$D!WHX9RPB4XJ$n$+d~RET7^oYB zBFUCP&pHXd7W4#`i2S1JxkDzSzX{M;FlSNkK6$p{B{|jVPbM=7nNe|9h~Ku{@;vyf z@C40CXSdPS;1g$WJ@|>O8F z;fpz>Ks8W8inLt0{+b1f2DkvqsBfeYlG9z}<^QARR)Z0K_FP|t69=Q&8sN*Q@T|C8 ztHOVe|MCN~U#9mV95m@yZ#fDYzq#OxGuD^w4##jkndwgEYE#-`A6d0LCK3 zM5a3F@TDq9of%b|>!eU;W*gY@@@|6d`5zAP-+2@j5-Bl{R4L?^>{jCrZQwmz575)> z{aTg9DHQ7zkvvr)3E` zD`Gls_M5Eb@FqT16Nn8MoqH+_AVvBl2EB(;+6XO`MS2PlA_mn%_0y~dT7*!Lz{XMI z?&0wRg}_&mtS2IvQyRVjkj%-<{QtY)4>49xnzM$TQlYY-4|~+@`r-il;J=aWgVcd9 zU}IMg2Pi}cso*uU$J?Ypo@P%XAP1v9H4Qf87;W^W#6+cDFkQ;u8QAPjdlYuMr z1+Sx<@2~o2j-ZJi$99`| zQjz1wV0&T4;i#V@QC2mf&RkT|~p+1&lgOWq9eoZNUHO&wqY8FAoMb z;Ppnr?^!ZO3Uow$!2WmRjDrKDCByY}mczDeP{V#k1Me&jmK*x}4;QX@ac8ZG)a)i92qY(^|& z?Ax8KDm|i_)-k21UnEj`vH*p=`>7r=;2)9dCidk4GQSaghw^fSKcPqsE~VMChNJXu zwZ8&5@)LWI*z^WfPd`Z}-S?0dpxU32L+7fjIwAA+9aMzYru8?%LqR<9pK)a2DO)|g zB=~4pOd}bsn=H5JlGA}G?)p~S3|}%Eqkr6V8DS&`(lQaE>)%`9kRs^nKbOeAe@vDG zT7qt3!Fy6oO3xZwZ^D)?HN;yDTYsx`TpEpPI6?ufzq?9O)JXVL+j z@xTj?q^x-mCbMv=`t+&q9L$ew*{X?MYFRF#PIyQiRg$gQs>Lks=ld}2?G<(sTwe<6 z5E-J44`Zo8LH&=?jPT4^sA+?>#gw#NaJ24`5*%kz#K4Hh5ZwDT{>fqSdpYs61IMEc z`ib^Wan~Fc=Sp|iKfb9YAtv@0*jN}gdu`Tn)|embr52RS&28d4cN`O6_}EeZNIp3x zQiQJHMddc$1?E|^#`xA&>AdW0$ym!->bvHwC|hQr4>A4pn94dMBclZmwS{9+r6f|6 zmX_u(Kt|p90^=gT;|+#sH65L=FC<=(VldJRch31&Xoeocz@mP5)IYnHC$Uh8kBa1J zI09-tZbm(gS(iLdx#~U_nWCZUw;#t2jmsY3-Po%W5-I9gO8j-_U%Z6+VZ*`ghbaRG zx7Uc*Lp8>>K^GL{=jXq@ShnAY%i*Y29HF+$ulGTQf(U*8X$-De3e3^9Um3}h`f(`( z7W=-gxBksk3#Y_kVxf45?m1XrbC~?(UqHN~JeZd{ndi+zj1{sJV|B?_@1tt$O%-Gc za%}g}d!v}O@?$RVB5961kI2k_W`g?9d^`$vMXqZFu&OfZ87wGSV-XH-wkpB92V<1z z){h^H5e`I;0^7Q+=63!$Rtj$OrwHSDbX=T;_wI7w!f5SqfBs$L`h$IU%{=**@QWi_ zLY1C7&ch`pAtoj!cb7(M3nZRUscUGM#gCO+Cs+@ae&mqbq~v$ZzNrz(UsP2!q*ZQZ zQCV5pU!*VOBJbwrCTgxQaQY0Hfo`?46XLvvySKx~O0&*5Ig5S1HQk#oi}USc)hpm?ZC5_YX=l^BNDyP^NIXU zCGqj(8}n8AOV!1hQ+*qYUtVXu9(!%}#JwJ6TcA}|;_K`CUhWCFkIX%h<(coM0vc?)$yjoTLl+`t_qwxn#CcziSK5Gt8K^&hvwYxTNf*%i}HD z8;c|FO5j8~I8%y4>3H@gPZ-G=ifg8!xU!e43;6n0 zwd(hr)XZaD^Iu+DAMEeh1m${(`RUi-{ z{`_Du4cX*|o)wci3r=JG!=yu8{|4>C`33o-kMc`n#qt!av(Um zIS@YP(~ElK_D&d%k!c1#rem`CRHBE#gAU%!d zihzW!Zem{hS{p}wMT$ykd>>R+F92OZd_}n|$MD^w%c|Aez|b)tsUV1Lmg4|Ww7akz z?_Mw~<@oj$#*zjZQ~J~JgQzEM>rOCE24BwP9NYgnBxC+kn)k>AT5 zoVaa(TEF|+G!EnLeF!KQtUmDD_HJ!!yB$^9U!YyhY}{q0qIOkZS0;MAIc)XKP&|+2 zJV*|YfM3$wN*jmE&d$jarNK5{HIcT@pVw|{zp+VttwM4=F)lJP5}#H@j4N&@Q(E`x zy4-Q{J;5tASz{eg0AoH@+7+|5=6v!DA@y_=yIZ^1kqtAlcFHWmoh)UeVM*7)UOcER zDd`5`Z>&f?D^e8HpC>r@Q`_3QpmwE|rLgLGGKB!D6c>N17(>Ulb}gEM0T;!DnfXhh zlbDi%ViHn#l_96{|ZsfnBAI6c9}v_bgtX~l=S}iBb7(@ zanaU~5RQ3RQAfzG=n&`!|K!0zf^A)#qLWNtGx3L&sM>PdF&m()aG5KroFu2)tE7N^tWkocjm5r>xg4F#dSpQ1+ldY;W=Q_9a{o+TRB%DoHsMJ%;cx&rYD*m&NbTc6DVe86qDl1S=Fvg>cRIxMDL#aN~}(Pb{Kc%l=Q|I6B8@M z(5OhQOFz~PC7qrtT3EKf;G^*%Ifu&OkH(N*&O8<)s#(X>P-Z#6E_5b&`N5FHCC_^- z8ikGnlWSgbECD@3F=XWjg5`|DRJzjmILiL zI5;{{Y+>gpZ+z3~y>!z#KW{UmE?)FrE`Pa24}*pr8@blbQt-iEUa;=AO`V1H+7qE6 zg|*ZQ>*4Y^UtPR1rF8KxQ5t#|*khhQ*Oc=-`Pwz%mRpI_TtAyEM48*l%{r2dnV&IL zFhshlm~g7eu7;(=#C*G^izwa89hLu1>E1__Zhv)GkB1Ya-5BIC9cK+Fe{}8=)w;Fx zfRm_-Sv%^rW33XEZ{GId!z-{30Zaj2#QRDir)#}(ijMIdB;zQ4f8@=d zs~nY(K#@txrge{k*T!+&wbSyg@5yqv)yY@t7XzB8ym#$X`mU6Lv9Ej@Me%-rX829f z2!PNG%fUW^0vK`qT45KRn0T>}hu9Sdm-eE-JL4w;reN^xU*o7>#*Lpz`?|{?mh8EH zm-KzGP(tBW=7FMf@9CNA12+r7l&WsA4yi847``dD9v08iJ(%uFXTMTz(srJd8~{OM zg#DqHgho*tix(%I7r$CmF^=*(&zmm{zd6@~^OeapCOO&Ga~qAly1gTPK2-I?!uP;S zXXmg`Cvo^K5S_u`8vZYJ1}o@{rf*>vU9O67ERf>aZ0%9tdL+*Cc`ZfmseYJxd-{@W z#anR0%L{>%mushWFuGX&u11)pob0*T88W1kdZ8meY@p)Q3^bsLPhQ6&bDCbsr_w z?}JINcUt`VMc>|#E1)^P`$tFTbNAi&A3uyD>$T+N!*d$d1J7REoiG+uE09Ub6+d6l zn{i(o;hh&Xd2MV{n5@_-v(y-p+Z|Nb zvALvk?}9F-GVQm6Q_A*(QdEQmKeOr%l*nGg&StD+dGqhwXtQY0Dm~Ml5+^iK`3MWR ze-b;@rg9l=KoV$U!u2>l2U9ZM^H{hc@j2=Dl@$cHUY416(au-g`$(u=?QBifa?`ju zv=~XTmTh6NY4X#9T;nQStN@DHo68SWz#msj)v9r|L$7z%!+nI+ho>}#`Nw)%qgY06 zke}(kQ{pm^DM#TBb!Oh}d+-d8s~M%LnZ2}8jDJTpl6lSOm~xh2^hLB z`+Ga@DvHCIEd*9R&>05ppBU8B_sL_DBWb#CY5A@j0%=<6>e0F$%T1Y60tdUR@5;>0 zKF9N{0}kd+mQFngf1zm1qS`CDou=W@+A?+JmE69*zKcY?-AgVd!FtOA>IGU8xixYx zINzfBgz{{`Hk4hw>AY#UsoGS=nB+fcpeoM*T~8^l;%_9`ZTYy{YIDB z%3PLQg6V||7re~X)YLMMDc!biea?g(m8_nxX$a9uJI&FrB1Q4>@!JMUQiDQ6A3HkU z2zqY&=WMM`CHR`%2NTHr1(>I=8S0j*C@SLT8eHVFf1d==PXGHFUJKve`swzu2!+?R z)YROf;52wx|C8DCa$azMy|?#VSGt5|mSTLPNtc=8~gfLO>a~y>2;I6Y5;*z4i#B*)(4@T(=#y0*3ZHJjxrKItkaz!r^#zGxW(o<@ZMv z^W8EWcx@gTMV!kD5M<>L`=4m-*C-+6PyxVyu?dI!gk9XmMi`!x6V z@7k>MBPU~Z`znRL1)Rh^&y9bDy@~1kmC>|-AL=z3nqA*&#e!eD+EozS+g=Z6=d;{*MxNl#wK-+Iu$Qj>2X40PsG7pg87VFRJe?juT(DSc5qVviJjY7DAnKx<=64{yepqdx!PBAA0 zOfwLYn~5s0qO5r2+*dZHAm~sE(43fIqwgRx^2r`6QhilSnX$AB5IVMqkYZpOIN0z$ za3SZjzqg3g2((BGVrXrHGn70M?5WhBXaxLD5+tEqipsMAR2mw*!I(WGL!^!iU{uYz zpcbB^3JSb?dv7QrCd*P(V_&%tFqN#}T|FLNatRkQo9}KzZKVXGuU+8%20E^PG0QrD zVqh|5#^$qLh80Dd` ziskG`wM(U7&AUB-+TV>gjkj3YCWFp=RbEtK-GyvbNnEy4#V)y~7e%icab^(qfy#Z@ z(NaL;DEo!uyeU{R=ITMl!m?gvnT)c2t-L|Drop0`mDUn{*7rO=w8SX5jP6tc*FdmM zNV19?k6JL7YB}5qF@mafiOTDSjE;oHTyt>J6p&G9JFZSa4GAq&Q!v~fnC36J^d0BN zV^Z9yoet-{a4^E6#Y!r)JeH&fb(Ru52&si19y^YKiG}}%AE3S|?E(H>zYp2OLQRWe zHW||{fgM5Q0@G>~?@^!(Rjf7hYKgkyrfe2sX`hpP&u>M{(bTVg04u!kQz5{g9VpV* zvMO$B{iQm80M6nBzPi6|aQ_97A}lvuV5XRX%!Brrpw3<-F*)}k1V(D39-X1OvHeqQ&rwux6XWftpLKZi)5^u}Ds$^H9zig*z#<7%FfAx-V$! z&rEv;sTdhG;08u&#mT4%+~7puqIhkujhTd$6eefaTooO+0dX|H;j&2z+^t{2tdr+yYAU=;Qi=*hiiY^Yi8LNz9C&6tUxy=*l^PnxF^Wd_D3Ffq zUP!GHJAe13j)t4igfuQ52laH{FO~UI*nhg7e=YvglbE$t-$_$Tay8Br<#5Vs2VU$; zO_NqNnVY?@*Ho6C+XFDHyN=p>7vAP#X{wdCW1*V1=u}CLXJe&`Ic2s!P_#l^)Sg#{ z?~J(K^q;CVnu4M%)EaHu8_y03%hmk9(q^lw)-ab#;IsN_MOh;yOpQgK!1e{x9e>-9 z;Aid`<|ctVgE{s!NJfJeTz0jMj|*WU2kJr(lCh{XLd|)6kpie5!Ko1$ypNQkioRFZ^or5~3$wEvlzMfuNheh6f&#W-l=LC{yQ>|^w;h_wD{Lq!j6>dAgyz`m5KQvJ z-Il#1Yj{pUE6Mj_G8g~i?ezt1b!wJ&A=h8ui2F)|)hW_K)*w&LBx&w~X)MiW?jBjS z?~Q}((1p`_@~>2az_)JV?KpM_~=>wId%P<9L4@k)%D<2v4+cnA=d?`SlYWr zJF=gaL9v{PR^BMh)l}~X z3-?!OeceD(0h1u-z1TSU#ibu5-w&CfB2E1D?Y3G(}i4VzIgA zO2w9tM`N=*I4IPpPjEFazfoQLZs85vg{f?%bbFGLR?8MokepdHk=H}x!TWI3jACgb z+1m^)mdGdp-B@Ao)CW4Z{>4;gwj|szH>F=Yj)_^zaI8w^sM^E;0}Bf!cMRRHQv!R= zz47ivr=+9<4a zmpNCKgiTatW7OSNEg;)STiaK!i3_4d=D}NWkb4!Pwsj3d4-OkpUDZKh8+Jrqd7m@X zfC|_7VmTRSMwLgXrdopf=5t!ve<0pchPC*P7F>?BCS@jjJsSGVH@F7AK?dSkfnn4zwtkYLraBe8JWyV70GDk70zfy8n9JOe z7dv~~Yi%NLG8b>o|EL0o4cGuO3jeXu;Vm~K7MW94HH;Fx$B zIJrH8nWYKxgA8u(-r3B&ri~ef)QngmBtTa|qOiR;*kUO_Qd`dU5upkd}RGYd+x1XzIp;CnInuo+a&nt+_B1Q_D3B`sTc$g*tCdT$JR0H zRF}y&USgxdhFjDzFd1qfbmE_Ug6DPNqYKC8T zobKGcaB!y~uSDPGmEvV;5cSmC4~2O_1I|8*G?M&tr{VXzrZJC;6v+!awQdu{0!N`r zkzQ@InvTzfTf~U|*!^aP1NGT4y9!Q`E|QwF|Pm)9V<%dLv%JXP*8u<$w6$A}ze1 zCRASZ(AMz7zRGjZNsRi#r~euIh#Wjv{rU0o@43N&A>y0~`RBj?@PoMlJa;Nd=Z!eh zn>BDW)D9e`&;GIF_*btx$)TD4D_;T+zspj?H*CzMl0WRkKYM%H2p(iV<-&I;K%M8| zTe@6L^A!faD0gr^ex)7d}! zka7Zc4L^QQ&f$~_OW?wWF3ny&ax?BY@L-1<7xUpL5Xa7g;K-|V4VjAOTh%g1BiSl2 zz5Izc-XT(P6m=*}0dF6|GCh<7>dq(-1l^nkt)nh>>;rg^sC_i*(5n>=fp2VtUwn?# z75Fh84Tuwd&ol!v8!1ZAHF77@5z?a!2zg~LJeVth{=G_X2tgUD_ZV^>bxhOTFsJhA zPDY2T#JLY+8n>N3bJS+CPeU`P*vrQBh{B?R?c8UaH5x|rXIt*?)$DwSEcc*)HC!db za&thN+wmOfmyf#K?#ObpOx-vfQ|C!!xgX9G9(7F9r{KX61Hv=ESD2d-2K6Fz?WoO| zv%)Z%;}u+PBg4dFfL08MW}S~L3ZdXUT;o(foKl}fYG~%7>07cRH?swUO0=EFIUGjH z2z*<}bf7-!=9`rU?NXT8W`Kx7N*0*8wbBbN^+%i=v?@$Z694LA0gB_#f_NpJ?ce7GX&uGBa4R!q5!%hSxtIxO1A zef~3#jyk49L}OZ%%F7;3O|w3Xa2GG}$X0g^G^X0Q*Y`q^A$A(W+N0)stL=`u+_5mG za|sXL$RNF0Lk=VQt0tvKUhX1j#(jcP;`ee3!#d$U)%88<)QlhxQpoz!9Imj>BrIEe zWO33_n+bzq^l7fn*dRMUoLhiXaH|tix#N;rmgKp=;;j%-raFd2!zFx8^-K52ri1 zqj}V@X*=*?Ocz$?*$-Vcd1Rg(f1Ek=xQ?>q)^Oc&pDuRf(98;JAcwn*a?7Kh3Jn@T zEah&vYy3XKu|YFslJ`y@Q43>n`@_uKmQ7DM^d!XL7VCa*oRj{auk`O-nhi6WyWUB6 zC`}`XORFsx`1WYh1RApkR2_da=hpYWZmhNI02Dzo+2p%Fr+=vbKlgl3dtp)#l(S@&p!u;Hz`8#G(eQVh8eKRfBUT`VXs#UDeJNbX;u}+qoII-j)Pm03m-^s*xc4}Z!$dJq*U21t^Wh?9 z0Dm~+wfm-YOsgHts8>o9Aj$#MU?K=?4g zWX9hsjyRkE$8)fGmlFa-{7z*wo!8F4^$|!NV@{o=)Lah(1Mj?%(ZZ}nILlYGmW>vH z>_}sM&YH$o7oh@=2c|1+9&}z&T~+=WCAS6uG{&fF8V1;_sXlStp2=$Sl3;V}bK<{W z(|&jz1p}S7f@yC*@9gzocXUb?X!Et_an8xe{3ynNHXY}+20XJB|5D9rYvdiZY%G&7 zGOjcoQrw%16}N}nmppU(J>j($K)ITuMVg3^iCF`+)WkMm^?5Hkc8ZwPvz#YqnkG@} zMM}VzHeld}it$210{54Dkzr+m>M!h?FBk``%HLXkUkc&C=$#fFfnN6Q~-^X*Dq!U8D=uTAz{%87_(QXY5p>0fFZ#u!s}pX zEXE27bL;Xi^s4lHe)BZ~;@ElINM+2*Ah)^UH@21fs*2jyWqsYeV;(AnbGgUVHFUFT zxc-(IA9>=(W|P1VtFeXSGUn-m0;ENAmDVi<1dqeS{Jpv3Wu$z(9wh3b-_-B1LD2^X z3lCpCf_X$Wth$lvxqe4~WK4dE&S%l8c}Z^giYe`Tyfj$3l{@Dk%q@j58GHm0i^%{A-VT#`%~(K5^*9+%8Ue71Sv>Oz7ceF&e2$XSH(^nYk+4#slugn;ivxn?Xd9&|4oCsopY>r<_UpRZmrF~6VS^pC{< zA3ykrBOdVkyG{zoPdYh~-7ggN_dahW5`c|jF`(MjRj*{{UnlV? zZhbm<`jW@f>qF-0t+$m`={L7JypzuBJa~(2`Imq_eEDX~>t-$FxFb49furV^Xy3k= z*~iNbRP-KmB@7r0_EsN9}azOsPqJSxf(VI{6SnqHOO}bH@XK z12KE80a!C?b(kIyehsb6vMf=UC-o`*#XMB-W;A{w-5V)c55|Br!QNn=QD{p_3#wE0 zP&#~i1{yN6#`^tZf*DY1QjpDIunj5tNk0tvhKN;Uy9(#t7cXNtKYi(^4xR!qh? z!_k3TQDHtC6kwci@nP6rmv5>&zK6Pz21d3R+y;kI% z2*8XdMh@GcFI4=k(wcCyqWUtOLHyAPW4oDOT>!B=gRqDC`T*mSYp;@fu?2vK34VfzHI0X`^lBXe*)SAHR+a%oT6|MQ@OT~g1C*N8bA{Ep zg%>y$fm+F1mTNI{=)*I*9)NAXIH4akJbbmkbv#~65aD8B&dXP}AqRvdLNL+|1TX4^ z6a$9_^S0gi5M%iQQuU|%4y%M(aI7CNqBB-~E(gL!CNZ^;O{&r<{_pi5lM_oCn8yOc!2HaIbI*T1}+*Z$jic6{DY;j4Gz^x03|@2Qg#$1Ay+zpIyH zWlHe$rwwUXvY^DG`Vq`j(}lbU|u&B%>1osWv>CuGm0@JMjX<6w!R91O6;+3V~dFq+MZ6=kxD7~ zF#rVv;*lh=nmxcO${=>jEeTRFxJka}U_BAz$)(j%TkL(`h=4NkZhOLZpXeX@rK)-% z#I9MUP|Q-U(-OcypT{3d>vsLf_zLuItY9WQEA@AY`rfqzT9_M|17X?$w=>(Efj0H9+N!T~)*tR^#l?!ujnubEn^Jz=?3Wl_!v zLj(N()$BhMrUSdr)5uzNcuqIh1knhO8zPdwK?B50S`#1B;(Ib;^x{!#vr#7$moF>; zS!^3@T5l3IJ>go&S?NKH)gt7GUL_;xtNihTpgrz>ZcaC#s2xrg{-_w-Kx!1cdxR$w z!cpgX)>^E|FAd2In*p2-Ta~dII{2Zw(n)5$*f441Ll91`*svhI{A70}bBiYj=3m`?3%PWiEuSG1`0%leL)V`@(5rHH^Ki^8NY~5+8WBi$v ztVO8SeM8<4a>2};3M#x*QLa$YVTBUBD6@$Rbeg0bG!lT8-0KD(Ti@m;tZxsbIwtNA z^zQ%)sYP{th-RU7LvTWnpd^@D=aWilHnSa&k;bem;jv9_0fN+~$LapmG^pc_=Ul?4lwx>HyWw+?y<+GXwZC*Jam4+4fC1w)dQ5N6F>Mjs}qpnFs_O@odNdw>lYImV!0_#=`Df7Xu0c*a zO<);qs7h&!z89Z0aEMfDQ?v##>jyrm)WggUzTQIV@DhZJRqonnZZ|cnkQg(h3hUP* zJcXv#*aJYK@$Uh3vBGkvdg&0plB!|_ls0jQ3P=;xP?aEqBZXl3jl#|RT6F?bmhu*} z1wjI@YA8gr%3d~XWa41_`E=a{z5DQ3=VXLu~yr&#k#x06x0u{>bu zwmrh(yfcYoL%_{4gg|TSEt@tBe|~tzCrj#6VqP|ubE5^^J7vnnzm|-;(-7nH$=V<1 zPFa=psq@WW^2RjKVPozRH^?g^sbvQQS}Aw|nc12;OM>59?hZ;0w zMP|axP_xydyWQ3huya~O1Jqu6y8dPAK*KjTzk&F8A%dQ~A$Rrx;% z-JpZbx-A!wby(L(-=hEz1+B`cCal!oQCK#z&VRC`sVb3uCZlN^ zfv1juwyoUOK!cI(DTQS5_eKfL@#oB&gp}ee0Us{|2H6b(TzB6glH+bqr}9L1QQpft z<6cJGKt6?i@S3ZRMMKv~E#4@YsTI+y8_aFdg|CsMfKFXIUln=2%NmL-+f7sZJ4?ww z0w&V%{_;HSd2`>Zh0`#H^u6;w7wo?L*PUjKldd z5lQm83EnubQ?BVi)2j8Y6aQu{*6`=a1W=AMlxi#% zTfx%0Vkvo7KL8h``%g|4VCbi?eQ{e%jK@dw(hh7_A|?!J#9?A)wjiM?`7zkqfw&f8 z(^=+_#URK3-Ji(*&GqRuz>8*Ohjyyw;h}iSI*>yh6>2)Q_#$RLVQjcYHGVz!Nza%Y*AY_K;ZUDa(U(i#32our9;1Z z!78b!?jlgkX&#TwU!{;fA5OxVd(l>9%GPE?oWlCK;N~~K>tSV;4rR`sfS<6c0(cSS`8(NvP#mu zc63g=Xi%r6tu2|S#ieqiAyPVRm3CIcNo1UMqM2( zJ2to|8_=CSq+;k3Kll1{trvJj1E)#Xov#$rz9A~54V`=wPN`TLC3yFQOm@4g`|xa} zBVFk5Oqoa%U$M^IehjwBD0IgaCq``UK^^AB(WR2=DHXm%qT zlaB?C8OL$MG`Z|%?orlM9A^^7GxEP(8Z=3JB?H~@Bk<_;2x<7W_#3yf2NP2x>?)|B1pG&OzmL`p+Hf*g{G#LVQ`=E)U-uOq%%U$o&WE%kBUR>Owi>$5@r| z{yw*upA;)}>^%d2Evi`>zV36fv~-~3D34f9?h(@p%on_H9V&74WeAVkpClJc%sO)B z1kmuy3riGlqDm0%epi(qIZJKcT(M`H(RxtAZ_R7R2Kfsv*aS#1HNW-3FW$RFleFZF zNWY}Det#YgSV_iUDdClHY_O6QrY3WD(SOm&NZI)4*Nb&l4?XVVZm6aK2C>ZkxV)8Y zG!4B{F3?5y_r+TIYX3Zy)0_pqf5DMe+d@)9R5q^BLbGUu#`5vgM|gf#!%M~_J&1AY zF+w5cE&VpX!Miz4$*8w^Wboc8rqy1VrW;L>jF=txLUz-t^49$MBay-gaV7&8KBxZi}^UqtuwXpufJjd2}BVzSa(D9UHSTfbq z1v$B23oTD$uBEW8r;s7Z(N&xm$t00|s;Hjm6V}THjHm^fWpw05?na-q3jk(}x{9?B zW5>g^2wmP5x;>)1LPU(joMbYAMa%_rn%JY_C^fSI5N=zV2$vDwszj_f3Wphwi?ytuDbx>>!2%hCrUI9EaX{sV^6#qe2)#&w@A!z%|D1NEIM*|D*}kva4x=_G+(OvN|JcuFIV8F2a(ph3ptgW z@jNE|U4XDWkMQYf^8<9WMTK0GmTr`c2`TYh^W?Jo{*D^cXY3iP300~k*{&nj7`ouS z^5VnOEx{aIbI!MmQVGN;ecbxtOvOtB+ic<^ta+mG-1Zhd-g@$7=#FjA*zNZUOxm^V zpQFHvP6?MR(OiS-|CLeXt(zG8A!(d0Em|Ht+!Y?#tUoh!1G4vi<;fn&tqBFx!Y1-^ zQZI|e%$AE`Qs;Kjnq)d^td1$XW*92Yw^2^(dwa#hEGs;M>rVb+k2)J2*CCs7vMOtQ zGZ2LrI04Su-mdpUk3CD(H2N%lDH=1jcCy3nwa>QoNlOJ8=t-BKow$jPtk~^UcxoRuXNo$qZI)EijvVsrgBwW=opK7o__u%x&?LZSg9y(x$B%x z3cgXC+j6F4D|pZjDn(!8+?8Yyl_MQ6aP>%#y=6B8aQ@*at;OOzVpH-8vXVsaThA=_ zpc^Pmc`--B)Z;@d_U}rI@UW7EDlirKN9Z5a$Gu<+g4%EQI4E@sN4oMvhqYt?5lpqL zM8Nf1_NV?IHE~@S{HvclM`@`k#+X*=_<7F{rRU&4YP}O~r0iGy1b@h=9mK>&&2vnh z(xy2n*i_c^tq*#kji#&%NZ4kTJDUdIKd9jD5_*!!x_qQ0I`8De8va|H7jxJHl*Cb~ z$$P`Qi2fy0ax6A~p@hEqJlMJ8?Cs_tl5au|p`nwp6~eSElbyuH!g-HWqbsmn!D!?Q zCbR%%pj8)8CSq;HO)_so&8nqF8%jQ(N7|y)lu+lHOHT zuUpT{Py2oErfy}HnUb8aHb)GX3eSdCU`;E>s!p75y)WhlH7a&!5QYW`lL)o1Effu-w&taH{2GtTogL=1YqKd8Ld!3S~T)8?7Kdc>8mk(<*tFH-}5APnsjLm29oIFQT!=uJd&R~x?Rge;(aYx^2b z39?#&vgnF#EjCd45}$ZbOsETnB8B!-=H^*1KAA*{4ra){)-~WOx^M?>UW6My0)k`G znfe{dN-HA`vBl3U4b7{E8S4meyi$8oWD|~uLOBU{oEs4vsbyGa{vr{D)eZOpM_bys z*!Lo0KlZ&DI*Ve^(ioz0H662AgtXdQ;d$$=II4N7c8sPVhH>daYNTVLPuAa^gbCJ7 z8o5I%$&2v}SM;FLP6UT`yV@3JYb(QDkEfltF)=1kEZ=SNf zRQSFLTy*T?Wn8Dtmsv}Iq$ZS!^IHa%H&PVBK9fYBVZLvkNK~?oGfB;<8&JiTN4;dA z=FEJexdSzlO#nuKE$gEQ0&*r@NLb3|&W0;Mjh~ar$itTponC8F8pplp28tHjKJn`U zDktm6IP%~J6q#Y91nxWX@%?|!%oM%vG;bhv?&K$iLi;xQiVTG9QaAn zJ|rB`x4X;y_yCzwax)_pPjqz}vbvFCABHAkS>Vz8 zlbQgKK4GB6eAzM0VN+L;ys!TX{{htc@aOp>IGC_kU0~cURS5AdZtVV8>!T9Gl#6|P z;t*wnchk0gqVKL7c6h=u#PH+yEABL+3TNEV8f_>Onu0@oI!R$6)D&%T52o!_kAiN?2%^cyi(+ru&LNr%qECQa zMp|y14zc?o>x2px<$6>=ifCQd{%8s?jl<2=*{;h{$YM~4xhgM8S8gEX^x6>FnO(#Q zLk5z>+_VR;G9AOwJBktz-3T=B(~8=WTPfg?!jAdB$<&&VxnuHYSq{6R|JS%G z%SWaH7A5awPX)Lo6LCMqq;+TsTQBOFdF_+x_8)~4@0Vy24SI*b$A#DX}a#P#lyC_CU8 z4cf}$YS6>IfEs3lmCV)A`3CD-xK(u8b$nLY`q=qTrN(h^`h0 zJrR`uP0oqD(R+h8H^EVB$4pM+osPI|F9_n91@b(3Uh$%V$qtfF*FW1fJB;88(2&#z zLXzTX-I3$J*7dmPXlwUmeEF;{`iNErl$6hj`xL|8G~v;*!dIpm?%GPLO*DPiXw1da zFT<%gFg|bE#`kxv0Rc;H$SvJ>vZN;U9Uj51xh8RPv$_P9|LOIuI5{e4z!8yMj%g2@ zSy3<8qINfLOri+5=G;7?4H@GO56VRZfk3jhuVcaSHEXZRD*K+LPrtZJ;`gjOc<3^L zfDb9XeME0C)ajocrOwA%BnYQ8V)b@YEbHUqGj|E{4u_UCls3E1{1{D3#d>^ZZgd6- zil9tZwR2mg!qO<27Wzyf9>=qsk^CBUjHOq6U)dMr^; zN00Dbeg!5q1@D~*4cAwovmaoU)xj3f&tk&oDM5EE`v7+4m&{pfxX(q(V@7s}O4xaW z?}}+c7y#?ic9h$&yL8zN_+7ah)#|qca>6hrte*n<{RX`5qBLQVhf_t> zHcPF4p4t$k@s9gY7Lq{pXW>@2NKr8a+m$7%dS3J1L%VHY@M6aqu$4kSqJ9m39tqNv z6X`dd1YS4h!;=kS6K|J5q0$A(5np&zzvtvAyj{snH?Q0zkxa#yrz=wT`DZ=uH>=X| zX}=+gdW2|=O3D)zL!`K$2U%J7te&}JCEFD);YdcQ^fe8|@tHNJo-a=PK%}fh-U-Q> ze&2+mWA^}A9@)M8>d~#hoWq$FUbMY9Fb@4t#9dwdads`hNxtW}lm1A3=XizbIa8vA zy(W!_WIdeKq`0MD$pOYw@J!0QL=r}5q+G^H^~BPi*Y4Bbnt2*PEhHut#)gc7g;WNQ z93l=-fZudd`=QX=No&0DUVIm z0~;3|fT(&;8sJ1QIx{|`LT`2h4>?8EH&mhoK%`dB6%9zHr##0u30#*q1kdCE3PmLJ z#J0*K&j?4INK(MfDBa*&Hv@#Kjy{;WQs@*<8=M672>tD0*2iD%aa0pUhGo(@;(X{e zPg(-j+#89*x5ZB`36fwhSNR=cFHH%Qg2v>@u%LD8>$Z zx55YkX1C-rk6a-0u2Q^?({}OYk#vQkuv@%xK@q&%V$X_`IaOf`Xw($yu}Wwig~M{O z_-wiBp*fO-#R}DM$^9ra?hw&`PSf(;;Hjo+6z2PUrsBK{;}m>bJnA_w!#3DOT3eKuOO*V zWKe1_oflu`>s8Y*&^@<$OxlhIe%kw2?U^Gcj5s`0UwQH#2oEijJu`Qt!ydE1MdYEA z7HAAg3vC18py=^Xe(Zbb%p)4(NVw2_%JDI`o<=BJz`5)uwkg;~70#UI*{(I-k5)k( z+uU_mS1T|EwRu{~2gupj{;|C&Jow3&M>oe_QyL@sZi$f5%Vf@Z+ZUQ*kz`EOrGc4J zUcbCqoj30yNo?^wM(w>ad$?=0^)DzeTeg*oxCCEUXnc3=j3BchXUj;p&In7tD53O| zAj_K14UT^`(za9pNO_)@S0e$qL-aM5JNwH zV7wB7u%D%t$hP`$_h~W_G%eExhzWPEd9q$FHBI9Dfw>Vz=0(CnJVbI(FBzcm5qa)8 zUXMU+i25!4%dz65Rp|ce`aL{T@T{DnB=>rb7f(4}s{R8RfuXbnv|P1+%ijc6>ycZA zcpx+q1zNTBuOiebWs5_Sq2~2v&}$2L3PrY^N`~R^jY^_fZg{N|zgUPK2 zpIM2ESgk>eeM8_n1)I3H>KTUf-y}16eH#g_8aWVMshv8H@-B3%qCvj7Q&x$^JItgw&W#HwOS%B zi9u#(EB2Q9Yf22gU6=hk#95C9_(qgDENSB;+YsnJ#-=q#c5be9JVut>AN3I0vHC3; z#z=8;z#H?NEn`4|68{Fb>5*93=@OC+goPeXxuf9GtnNGJ7F!++HLbzYq*5^x;@J5T zgpy_%4Vo;GX;0lEIUj-4*J!fK9?(ML6v#Bi9kX$9yQ8`KFe*>86*~L9?dguRNC)Nm z)$tjisT(Hi<@A>e@g~V-u5W;{Q>FD)%+m-iJJcioc`itwO^~ygPAgI9j^rFt;JG8+ zaP@ZO@)ITsHn$@7&8)saCPyj-t35C^6HWw|Oe>=O|4>j-KTVHUC>xz%&qt>_#@YTB zft(w1rE48|#@s&ECv#s%f#LKgwBE zd%R;vJ5QSElL!s=P}i(uvD2X0w%J`wu3=K3xXJLG9oemocfS%|_SUP1_CA69SP;`uJ;zq?yM??+RVpcdOrb*$}rF$Tpj47A2#T#ipox zY2&DC(xrI1XopKIZIs8BBiI(W7!)y7?coL=ju^1Sd9WidCzAWnpD6XNw=RIjWaZWs zzR|Y9oC;bfXzcyVO_fg3Vl#VobljyTa>_y^$mx;O&y?L`8gg@!Tr4w$deQ=Zu2;IC z7vYo751z@SH&YZm;gCQ6CWWo&MPgizs*R`AT`$c>8QUx(5(4JwfDU*OVoV(9Ocl)SD>edMh^ z7x9kAN+S_``X+XkS#*opj#~b9bah*KyMbnJ<8_}W)m6G&GY@9qj4~o^DAZSH&)1^y z)@}{beYLoVm*)+gcYydaE3BgouTpUltN4)VeX*Fj-J?U$;^E9b2bfr6oz6myVX@87zzDnP}D*v6!JF7pA)CCRv z*;l#O;dD^n6Zj*z#lwb2Qp(0_bbwhMzhmvVd*O_aSBMI=u^j1lyL2koL4)ov6KOk) ziI^#|7|D9r+*1oi+0&^}l1OF*$-|6yLTJxHp3oL)(BaR0B)-#m14bn0DxZs-TK94y zOK(vq9HP?}0mXkp?QR+tArwU%2KC|J$LxX}i?KV3MxOA=&z8Z*`5tg}F zUQF~_8wk8|7kh~8cQ$Bqf6U6gFr|A@a(Oky*tMcNy8y+yR53C`vs_E(#smqq9#M_q z4F#^|WzDfm9+>mrV3_hBe>~&R=D0vnMsOf{e+9|g#ltaH8BtICMuwSwltBr7f6u^M6>KyH;G2yMX}{Y4#rO{wsJbuXBxa}sdqNZQeD_?e!JdT zKdbT$lEAqr?kg1S+mjr4xQ4%Pp_2=#X34P=y-A~$r!*>(LL~v`;M^11XfO`Lm7j07 z;N>?L%4h6%R)~!{-vxMU-Fg?8fO})UEbiFxwRT*n;o+bf&Ed@SMF|kz>|f#X;Y#&3 z>NZT64$lM_r1h)~C&3$9s#|hNp`9P2_Sm49^JSQ-KNEJR@i(v3keSLaaYHkD^O~3Y z=L$ODhkDQy%dTy1^c@q5u&t8!_C8*4jZ+DhL+Jd@;m&O2(?ieVB^>iH`(P=gV*5_o z(E|$yg%|95(yVS!aK``kSk+{l$r#Ra^_CnK5{4yL>D*;ogpHzsjHRk3_7^ErSwikx z$`-XjN!>jnbLU=lpW_qh01R&ELLs;!(x0?b7p9AsB%>1A{P^mjIFr6~Vv@_4_@}YY zqt`3|iOQx}M`zkm5i{MPKKoud-K^e!xL(Zl98r&Hir#nUU;MaQgCnVPOq&V+um-ew z3>Q6hLyu}3mpq9Ak=dA=Jk)KIG$x03ogFe37EPNVV_75|zC`#OIkq`N{bMH1+xK{% z{oeIZ%X9P&!#(Z&#MVpS%LuX)$y~hb#ispi!A>n;ktCNrbEh~+@@^EUTF080N&Ll? zPUsSGawX)K*XQ1R>=|o6tDv)N7mfy?9R7wqK>@ z8yVI{FkzuZbr#)nu_*IIi4QY}{Ndl4hyim_v{WNyfqsFI7Fnaqx+6VBx?L^xnsG^t z0$HPzcr2w?CA*(ei6g_BK>*mUmXcWY1uyPns7HXzGO|P&=M753O-Rpr6{9irw3!hE z7o;=yvvRldO0=qQR9V^uwWB*#?S5=u$UMmZoEBwp9G1?00|g-^nB$qxe@R%wbV917 zMqesM3i$GTTk6{*ld{>V`_YY`oU)+rv4i;tAA z+Nv=aW0j8rL@XwIxS!UAIweVtl1e-C=~+D)FXK>Tj2hbm0}vq*%K~_0jzHWLs&2UF z#o;TayvTmql6oh!c}|V~gTEpBe<4<%e{palMxMMTTI-DJjsl3Gq2{fd14%YT!s8@` zqvEzI@!#svXvuCs4)uuQD!%GRxg^2$0f6GeUoY<3Kd%$bS}yK>#rEm3(`Wm-U2WA| z(AD3YJu)9+?%?hG%iRxPtvxjXgaJ2AGY8Q;m zAr}4a@``+2%;Oc4mS5f1{ZzITQ=&T2>+BY}??T`ba`3+ zR)mQDqSq*zsmiL1OGBfCeRfG7SM@5Uf4vw9_snOT%qtiE52y!6iP*>BdPE5&r|eFG5qRDAhDYPv`CuW z=7Uan{=6;F6^lGcul&=>UoHmnPyZ|QiI)btnhr$!%f(h61&EagY@57R+A<*$Sld3V0{$xyx zu=`ZOjVbrCb82=DeX?%4CaZ|Bdr4pNS=9LeU%3xKn?^P)YHv%pZ)`fdE0PsAnl}GS zo#aWTZY@OL4UB@LQvi;tA7^bVK{Q~>KH4E1tsMA>s$ojm_?x=v$Ldp2s=k!*2?ho? zC9aa;-!QrLB8;i{f|4VSFGrm9&kK*!GJvLq7M2V3iOgHUy+ce zYFcsV%&V!9R-|sdz;lP`SMtZ0Fw8++E4}n4o$D8aIl>hvmuEn0ZxLTvnN6_tnzVvp zLhOyk(2hUHq;cu7lB3=wqYTd_h+ew%O$=h>)6K}Tkfb53BoK<}1x6q$ltE~&XV`eD z>q?~;G%NG3k20+v_o$xaLho#xPyclK!q)`hjrO0??UpcF0h!M1iX71*!zMZHDH}%y zH8Fm**ma^oLF5tsK^oGY_n*_xG|1N&6u720T@lUJ!x)>e9Z#@W_Mm0m#?hImgIoC; zx#VIq_CDFCVlQ@?$LK@W#&&;W4SOBm-h0^tRqZr8wI8sF@wCCCjo;Hch5cynios~B zzuva~LM>{jLxJTXN~ayCt$%$S@>?za3g^v#;YRFQw zwvnq77Qe**Qcq$f^DZ2MH&WHeu_ zEuk*nS+FsdOU6J0VtWrOA>oMnh#=&Yr@$`ZMKh`^mW4_seCPZVsdL4oP;)7gS>d8HJfwlFT<{*AhcVQb; z9^h$pkt0VFxHb&8zYBF8-oBPiV~AgyVvSh*MDEoRGEJCcT{mS6t-XaQJ*!J-=?`pd zsRdbT>=ZGuhy7_qyKn#wZ}qxak;3IrZ}d{79-ZsyOA?7m;BXXz_LgNKvoBuz$F*P+ z{_zEql>oUMEengN>_QF1>vn@{T_IMbu(B+#Nu9q~(aaF5PmU5IL_{7Q?tK22k>-fj zTv7UAq2=vNI)_+h*M6mY#st8MG_7CHzpVnu6k}1v;zr+wV?aLEu0NCL1eln9@PM|W zsUy(K8o>YFTt`{STnDtkBPLy;*N+S~Y?&&w#_RdDb5jB3?WMShrf-B&UZFH1YXD^F z9K>Ah$AEpi)3>Jw)f(hPl+(3H)PB5WWRPXiUZUR_awJFt(Wh`;&Cu! zmbtq~nMPXuyBY8%u3Y5NLc zYyC4|CgM2zd?_#05r|i}jF{p@udm7jiO;sP4&kLD`z4;Bx8u0xANe8w6y}Qb9)ALv<-_$!|rDoL@0i(5$95Q)Iy$vnT_}7+}X@gd5DY^+^yF zw(CYg%UQ>I_xRuej;q^CNWSH;qKsU*Y~ZI>gZJGN6G9=+4oR%=y_Xi9Tpn4jvt_%n zONA*<7t`vu>w{iCG4&l>DqjV@=g)5Ud3 zyOT&;(TTSdlbxz~Kdx|{_8ki7--x*eJsk6B+g|L%jkruTjnMd5Xzp@A*^fCxhkpj6 ztrK7kFY6AOS1m7`>bIuU-z^QiV(Pt~s6?XF$RWlQj}=otfc{(&nd95iC!NE6fZHng z%?!$D{}4J$i+Ynx$S~TxhGHxm#QIF{P>L8EQ@frnRM8vBBKx;eFlvqDk+mXy z-N(VO?3ToA5SENz3^+azhM8s}7fZkY6AI+_#P!Q%(bWf|`6`7_*L+O9-VG9^Yp@hg z5vYnDj6E*+`b((3xa!C9=q!y|+>Kb3i?)O^FZmwFTyBaNb9KPvx;hK~J&z`DR^~mj!b;?w`aFyb?`NkNOe^DpryI|pT8N7X=>p)-6J)QYN1HhBs4UrOPq{;e zc!=K^f+#UIQ3YyIdjj;Dn^sOannuXF0 zWXW=7uc%zsAASvi+2^8)dysx|!7`QBtnM68|4?D}sLwmb{Pak|4zf>*pWm!ti)f!# za-Cf!(h4u-BlCli$UL=oA3jZBe4Ez&TV?lgDR7JIZH24ZRs6wu=y$!AG}`t^7EX0Y zx?MoK{i5)=CdYlk@u*s!TdI4f%1-QrY(1a8K~$7UaeytV+ilcbCZS}vpMI3+EqWAZ zOyTrkf&nE3q|Un2Q|D5n27bmKxri56WO~hzYc#bHckSF+CL0z|i;TNwr`(?`{16GE z#4wylcCeMRsxiyYL=&bRdUubH$yo#rNzViT079HjqCTf{#f7`DX5j^#Wp9&9R%sE* z1}p9RedQO?ova2r%%oGHt49x*DgXk3opEhWs&cW<_8x>B07c=dgn$wp>Gl0%0#bV+ z_M(%){YGb8MIKH|(c>jH#^z(s%(MIrbscYx(R2)OfFZwVIDKTG^3~Nqv2OyEUoK-b z<~O$D?gS3;z3wLg>EH=o!|8G-pma%v9h8-q}8JDKMNbIT)fFr{q7oZcWed80B~d3?IU%CNyYKwJ6-cgIRv4`Zi_=i*rcDo zcQmO`Rc(C;l^Hjw?+3A$ zOi$EF5;OLBu%@C|5dWeJV-%zHCS7jumJE*hY-smiFu>@2+C>HyXLq))Uq=p4V;8ws z!^?m9=S}>toJuH%J!Fl_@5{;!hy+D;fVfEoe|Q`9J?!XHR{rZUi}s_C@}oD6PJ!p* zW|XXd*hBfTJNf19o#TVAQ9H9*h3$vvwwk=6zvqA71nwW-+L{>Ld$0D1VVhUWMBvd( z3{>?WZ3+Jt5x#eGWbiREGZ>@sVk=&Tfb)kRq<*>F@BI5uC;eb6`5K!vmW+NWDh6bd z0*csfzJJ}nANYkKAMQmR=Z?aX3Z4hoPLZ1Imy-uGV>TWzL$)$R1N#l&mzaStlJO2C8(Y+M^IAs5I4CYKE z=lGX074~0p(}8tp_s-AG>OXM+dx!~o*4u(I_QP6E3{drFzq9=PsnLm4S=3vP|$((c6qsOs!FELds z8#v6)$Ul6F$8&lT!$yl+ZRzYADoYAAb%_m~5*a4bhj6<4Tsjeq`|jW-?!AWkOz5)>?%S8`N`@Dtx? z8ELU6S!rM8VSoGzyi$WRzP{RjCX@fY?M2e~XEJ#k(|3^PVi-;$p>@qwsjsj2`&Xq- z>@Bv6kNSn*O+mI3@GsB$nUaltZC{@f@$LAAt7kR+?`8k@pSVpU!EVvbXA1v&o_`|N zEG*iGQ*!N$B>TvU%OQg8-uL2-{?FcH@nTYb3PiiHql;_{Il<6x`(S5RQ;DiOideU*gxzAeD*g zAomHMz?Xe-vJ-joWr@*_2V=wQek(Mi#Y88zqxt81BQ|n!I0q+kd;R zBC?{%^td7C=mSZ{Z7ttpOUO_#e#>E+d`1--OM&?xp%d{TDEoN$VTWWsF?}{-lIZ4y9EZtt5J>~?k*YK z0Kh(UM@SHjTGO8P-IU@MkJBnCrR+7@a+MRgtm#7H-cSn7*LMC^n2vbHXr+56Y+6Se za0~dI!F_XyK$ZEDzumH#C$wEA{P#B^ud!P)vI}j)&LyL&eJPT8HZ^@_Hr(CJ0L;x< zfAk>4(8~z|t%`@F2f3jS)Mbwuk)EF_Aum&Q4E#hHjk^_Q%7SYcW z^sIw4b;Eal2mZ5!QBUNb9qqj!QsP|%oLDa ztAzVmtkeIVz=mK<1!2MB4O61DR&^(--ZX)E`ltT&ynl5Mi+13=P{+z#W&c&r-S}N` z3vqR^fZH^6Tqd>;$D^%PX{o;t+d~0jzZ!>Bx_~Nc>{%v&!c5mL})r^#c#@zU8VC0j2s22*mchaN6f#jb-{2Y?B)8n8ue~4#tz?69h!!XcqIJDj0 zIz^P55TzmzDPLfXA@FW!`sf=UT8iBY9v&!4#1=*{B32bBT}E!nXk2$!rX6 z=3E5>_o(wlstPBtTX`wLw!OM>C?2BQ;|Dp?nIBJGDfBB*I#><>0+~w`NrTY;Qbuxl z6KcxPD+}0fvfrb&`wch|;bHym)4ASHTLR%N7x^Y()>gG=*UAn5DxgEEIO~R9Lq5RW z*Xa)KLxNbVKE%OU0O-Wo;^~#%0REfJ@CmnWD^Dr|DLBIxns6RU>Z~R0S|0?vaRI_Y zj`f*sFeBf$UJGZ?0;(Y?abb6D{@2X*VW2{b+Z#S;uN$YYW-l^MpMRJ+&;&d!Iwd$} zeqF?MZ+bOWedjp0!M^Rlyend^`FGW|dtuwDVg1yqAWo$WcIuNp+adq$1^?eN9mYhneW3zaLQNB?*;l*V3oMA^?~9AL$tJN5grKW{`FjswyorM`RN^ny6$ z%_{~V3iXlLamTERK5?I8@4M=KMNOZ*0OsRG>{u~iB~RsU!~*rf7M&4V+(=3Gu#G09 zDXe5dT-7~@(eZXFvJIwbwB1LPU$VfY@V$z2LHnL7PM0MY6q`m7dp`?Uz$m^FFHQzA zv6vT;pY{T1xBv|9V~a)qiX@2(+%m)lE2@X7C*xtk5xDrFZ}0UaQw$5ONcOJ?(0C@S z6Bh>zmgfxFC~N^_|B^g+F#oRw18<>TkO93M9%>#WUk0u(=13_rK#xHEgmGk8Kq+3> zU4wryQKc0;@DNvhHT%d65qW+7Wejr&X^xrz7|q%AfiU`EL@LdJW_QbHnxyop$2vA*yhp zi7(q3IwK(W^?=lh#U>1F=_(?PLcE_g{uwZQ2KcmI|NPZ@)-wrf|F0T;sm` zZW#*-i?8A%UlTHXiO!|-JjS=5o9UTi%)$!>UrReraS|~YQC&8}yNDTAhD%ayV`ve^ zK9Z&h4#Y|+P^!0K$m~_`Vc&9+eFX;E8BxtP#AoS&L47RV& z+91bw=P-D1`&pKTNxZ^5%lt*GEU3YfIbG@>#F3oPF&|vNQ_>c9Rl>JZq)jSJ?|2RM zR%e%Q0pgr;O#f(W(~+Q+V>O7pq6^@5dGMRtMCh~`IZRi>xrotv3|iMbR8*=bQ#%h8 zN4@l=OaToXOc7ufGgM-UxPr+df2S5&N{^@@IOqs(dlw8DSLBdd-$LPqm*8x3>9e!V z48xJJ;eod5`b!xZ6IU_JC2cA8!48mR@uUaL?kY#M7I{?V)r(?kbL4^%Se%Q#b94oF zo&TEBS3Sp|sD%_BQ4tl&1^bF&(@q~5PJy_fhHc6B)`M5V&@Vb`hpAbCVA*q=W9+R)3!9L3j&k`DDzKXze*D$;lYa%8yhh!F6VG0Nz`V;Rk1? z`$X+{k4Q<)Yq(E_Plyw4lBoL;G7k~|O0}p3g0s0{x@CSEW@;Pb)TebqagjGN_;h63 z>Gn<;!T?-`y%D`C)g0-GxQzQ&EqU5O^h5n`bGdGq0==cM)_?_Ier5qes-|dSlrU%K zl=d1-rBilXfwYu^}o7hyF@8-)uPM>?Kgf zq*o=QGiq-UOe7U=^*KwdU_r7?#zAsbO+^;0!T^I7As=%1^uwa?&R_3OfW4?l=a`ay zze5StgKyWd-XgASAk$B(keSp13XM(P0$X8=BDsl_minz6_a*cxR6)YF>yl_-TQV^- zA+!`=ZuP<&zVmNe-a{(pN9%Av+C={&d>CKRDO9zkPcUvqbEF^_^8b{|2kWVTinhFI;`gAi zv1Z113Le|#d*3nxBH~qK1B9k0kw2%nKB)(D-y7SP;PxzuFs3QfpZbf`74R~pF!;>N zlP)1ko!iVD>T~rZ^6z+}DXYSis^kx($&UnT*Xhg}T}!i;H2(a*WrysfMyVe<#Y5jh znDWOUEWNxtQF?MyI4zHC79oa*)S*3?InHmMSZE5{f4x?WG*Nnq=MyRaXqmQeaD2T_ z@v29ZUwRV{TX&&mclNlD`)bCx?W@oit$v2MKs$gz!X*o8s-PcPvfy!5czF;{W`Zsf zBvS{fs|cwE_oSpT@t=sM({F`Vl3xf!fzD+yTJBQb{AGj^KywR7(#<8cBpQIF} z`N@ym6yITvPjYd4?Cp9Fei93HQ@I?pEFUc;uGD-L0sX=QB2ZCw1dj|ZCl2+Y8d)I+ zp_tDZa-r50(lYjL?$gfz;g~}Oa`YIQd#+01!xAAYM! zC-ZWP3e7$zX*b(t=NE6~>j2hzVZh^$0knJ)=k0GJR1Qu!?WD85y$JdxKDOn+3 zmo&w}>%Q*yowvn8k$9bFCNyzDW+D*{f$h|K~D z2FX%em=ZojRIhpJI&6iIH@G*cos^AEmlIRlj*pvmme`#(Z%(Tf!`cZ|Ja$GFvbF)y z%wHd$iP-NJpIeT2xq!_7C$*rP@+2;_%}>evgbzk(Lz_!p-X{ewpXO1y1L>xJt-S~S z^O;{#SSYNs>piYf%3&$-HPe@@G%1|qKy1=1m@C7%ht?b=Yk{~6yoSieh1^*?MU8g*p$tX+_8Z{s3BB{9yzbvvXt= zrF=if4XJ9U52R~iv=Id4`n_;u&-DrAa%CiB5({`;P)O&vynIC;Xc9q@3ghXyWdSP^ z_N!2rS7ycc-Fc6QZ}R8y7b^ zxrkm{wt<`MAE|+1r6(EXj0hpRYo2Sd>R#|~%S_3B?8qYbbhpH#Uvr!fztSK&ybHZ= z$hcQqTuvv)T$6p2*D{FbwavycxB4$ZJs}Q?emy2dBc1EF2HCwDILwNhx8;Glj!U0G z`~VW^*<0a3X(=&LCK}ZVuwiRFgfu5&Tfb=lRqj5Ky@>IY3Dr(&_emY&n)3Y`_qgm8 z!m3E$8Z!!BRR9D_dX>=grf8n1yAHo~KbmVr{tWaD3f(cQw9=FZNV-3Ud3D8GH@ivF zh89;&moP49y=zvp#LhmUR~UOF~Q-e=(pW? z<@3nY)<%;6-?6LU3a*Ob%E)U(Q@tL!mEP_2+6Gg8bh6)pxnrW5(m~un@6OXL@O(W7 zyV+2g%?m=vsBUCjDJB#JF-hRkA!}N8ODEff#7Z89*Mv;sE0Isrs(%oJ7fDU&*})th z6_GP%GhR9UBBc?e5v0iRlxh2Tb>2e~xMOnBIL{!wuuZhlCAoMEh4DH+U$wwfwBl1s zD5m1fu8BzVo4Cd;0Iz<8%fY>&y?KWbHbLCXWt;EF*=vdP1me z>9yW`@e)CW%fi$1M{@fBAI&8i3dvyaJbCIi849{IS5Cm_N9M_3;uCwcgM$jN=p3KR$ z)?)d8_6Gega5(XrY+t3t=JtKVE6<1pyR9f$e)8$L?VDvc(fYh5y?K0fG^xy)g1RtT zk#xAVsMy#g#{72Wa$7*9jQDA!pk`rA+;262_luWo5mGW`IK5A7 zb%oT1XZi!b7Q8Hn;KJ#ha)6p3-6X}wlHBb!(gPJ$$3KiR_N#APbNr~ z8db>0Q|D~->cHE~cLd<5oIVZ6aDsqI@|M9j(2|93 zCgcZ!@rleK^fu^>=@7v%Qnu(|XIA7uX~vPKI}Wa^JStBL`1(UrH-9)a0Tr)f-A*26 z50E|H-n_nq6B*NEoTayA=`YerF1p$xl=mYN7DH0PB>%B?bo(*;&YQZ+K)H~E6rq}t znk~KLt$Q$A3cZi&JOVS)9H`zkm4At-R!I+<9(Gv4t-tv8k*75uiF(OJ#l0KvN7k{| zYZ*M35X8EnB+{!EKy57mQLO7PGT!{&0iHdc9Wn_H_mvdq^GH*_f_>b) zSDrU_4InMf4()oLw;r=Q!zPqbvF|HCGFH@7ZRtAU#={fJ$gDllUieL$X}@3-5h{5T zQ4%jtTJGB4dJ6dj9z%Stu(T58U3f&fhGQiPoC6u>7d>V4yt3xI6=GWnpT?iIn*1m5oW$T(E`S#p+k{;J>nNXo+$yezT<|cGpU*uIZBak znSe(XeiIR%y_Q8*Kau?{x|rhfE~j&pZDB0aKi`Z#WI_Fy7yTh61n&b`p)=3E?t()7 zsRRL4s#N|Nl{IzUsDveL1ajPC__xGHA(+H ztq+qS!HPll)Y~+nx|es%tC3nx-v-1HXloa^=kov77XSQ{BC?^i{DFwHBDqa$s#otw z^BO}*WH3Hg2}57X?ahGWKca?Hw7)&l_#`CixAW#BBQUaF@<0i4n!d(qMsZ?3!5D2@ z>@$Lzs0Ib_S%N^z1(*9`#0y2~$~5biVo~DZbQ$w#wKysB+SVuOy|q+(a}WrasL+}l z50JWN@XvYiS7eb%mgUGKQofqSAC~^oi*jKF-&L_41OcGa;$VHC)}iaJBvbb7eDa0Q zE27~Apw1Q;t?@lK;dk*zDg+e;wTc* zxf-yPt<|PIm;QNj{`bZg3F7CJ*G5SnVV|Y7i12}jBd^%N1gKE=`4`&g`=5kwkWP?# z{}*p>kdiFqHsR;}{xo}KV~a6{n{b7W{P6zGgIWYg#^0dTZ{PmE&J})91PUp$yuDJ| zihZ5q$#ow5Lu>K31H`{y@pe=wef;d7={5<>neo`5dEr0c>i^|nl1BJnC<$Yw+RxeM z@7Mjmcl^tr9K4VF6(HV_qc&PSZIvx5nEriu=BrB?GxjURfSWB@S-WTX6QiGAFMA5N zRCN4{K=yt6THEmNxAI@VruZ;vE`u}8N6)Js>57(InD*WN=^sC$aR#ntzOI1Qc=CX) zmGSm_%iNCnY1;lPrO9lvrER?A{5?M|x%+fD^>*W=L_HH24bF*VRY3RY?f-ZX-~EoV zjwDGnfWEIILOqLlcdhs}Ogzb2f34 zY@~niD*pN@hIoq@ljdAucZGLPE(C+U=lcbeD`L29qQetkys_Syx4$*KiNFI z9L;k+Gz$G|T=~Zp{Qd8IVgt%P2~ml->)69y*3aIXIcE@ZYG+iaj0R&r(#k6D`sw}J ziFZg zX*tj(%*G7xSyG?600w_D;WdpNq`r>sU%w+`#uk#C!STl`_HjPwgs|u(W?%g!euRAB ztOUrh8pDWud`?7xLpG1)dQ{UG(KUC+O&94Wg(4Xk@a(zV`XbwPM7I@_I8x-n z)mT+Tx{z7`pmR6q7%G2>p0nfb0;8B`RVb-qahmMLBBKKx_#@9APdLK12sI|*zh0{w zZGaO##7aLts0Cb!%E-$*6Bcw2A=uGsO9w|l0Q{&QswZXA@G>d}A1Yy6W45UyQMBDO z|E$vLeDjQOCePfkTcevWOL{Q5y|C_g^@8yUJLCbpN4h5nJc!Q|)QG-geF!jyms83e zm>00F5i35z)BkPo!mW79OU&vf0;5Zc$dXLEpfRh9$tPN8r++p|C03gh=-bacX)olH zAT)=9|Wx$i>`U~-1z~KZV}l&D^u>7CP?mR<393QuL&frFWCe}sQ1HDKN6h^ zSpqZ%7On2XeML>MFVr+GD0&9%3^m%v=M<=5LSN{Rnf+Xha#5mv3Ql2dUWi;#3z0X$ z+*HGh%X+@``+L_lw?ZdXOPm-C9NSJ$dKA`^A@aGzT(->(Ei&8(=Mgf4D1mkdne9BG ztrjM%lXCQvK1yJ|6}BLsBfEDy)9-))NWnTH`d!youGO#v^b*wjyJYMeu{-2CsR|PL zZ8nj=P;?D9q5QDS*Mc;YeWH=c55SDfBZEusv~g^p36GR=2lK39$2gP9#RYkrAM7Lc zQe>-p?VDYT%Vl5%kOXAq*d^msNDpcWzWT3URHBh|{5-yiWHAU4GA(|f*)6tZ#nbFm zxmc)Je#Ks(cauY4g^LV_x%OV{x>G2q>6%oUJ@`{na5lRKff+ zS_Lp0-m!ML%ug;BlZFe4?br6~MrbouZ8fl8QlUJ%i?$=z_S2=@jTj5aiy-%0EJDL6 zgg?u~5;eJ4?Am2S&&5DWZ)-~EdO8OAg&^&1~jz=nGOdu*BsCheDLMdCt6a<2tIQe*^;U|1bLVp#`iz4vNSJaZH{iCWQpgzPSm?zMlw$ zE}DW=TOZ@A}FY7N`aIa>aUQ+(y(P3)^6I};mA zxxS$h?~EtebVuw+A}c--#kY!a_o^3rUUEw!v|Z^iaae=OY_8S@5Q?>(1+fun5HSi_ zyi`);xpteTS9pJ}d4`gz!Hnp5Ketpo>-7?6Db++)$ju?`Qs!b*Wb7qbd=^O~Y2HoF z(6AREcZJ-Yep@eZP5h-LKryqId|2sP&tciqn{V#w`DFDGVp_Jgjj&LwUJ z`v_5X!Ih?AbwZn%%hV8ySIti<#9~2hQ8Jx<;o7i?8cR~=^uA=mLlLQkE?N3_j)1iP z?`}9aiQq?3$0R{ODsl8<|CKI`-xUm^poSI#$(63ue`&7ztgZmV&~rqGl_Q?9iu~Jz^Nd>8FhpTz^Xj^CayfD* zz0GU>0kgSy{q?)gBn&+dDFIU;NVI&?yRIVsDI6Ep!bD~tZ2m+9C>R2)*J z2i+s0=TW^^!vsK)8dF&GBa3Sr$|tS!TxJ{Ndhn*eS1a>1OEUkg}nz;4Ta5XzeI6z1ZmQs*TBP}}ZBoE#_j?=}bizMTXxp8rV;nO_9 z8Lc8K(P*1uH_2;|5zHjf=uWrSQ73#$t~P7}d#gNP^~QgECRwYUg0paar~j%PRq1ua ze6G$tyYKjW7~3j2D^eF0O!PF?&^ETxQtpcM{ba4iX?@rYF5&j(escXd;mIj>j~yRI zRbDaOB^L{^r|6UQwVnw3%XNJ=^%!1S*Ito8GtLrOn7w@5aCdZ1kSXq!4`Dd6JU*wK z&pF^%itV>j_JH$i-1Ijqu;5Eee_+lG604o<3Y8{2HWfLb_}KMnPO2i+M8mdeZ7?l4T2 zB6cA8SMHQ2v-~u2prh&2Xm`GzxUBX8bK4hS3LL_VnLaJq;o}YLSyH8Eg6B-a% zo5W{f+E|kFqCvhe!v(kEGQ!l7>~yRfC-$zTNVbd*`KkE}HIpHAU-k|!4+qb)&jdVU zxPGgZW^=EuR4WDT!)ad(5-~E$L7F(0K%<4DkB(I*3$rOr)bjuL? z(nnT!-x^`qwnB;}+&P?GPf4pnGYt6cA%^gQQobUeb{p=?`!J1Y@KbZ7}{(_QzjM<*21R>7}8*NOWX{Xt&Q#@tz zqhs7CffKpkc2N1{l2+*>LQfEoU_xV{CcFZ;tKa2-41uRze3+1(gi@?&!l2MJph0^& zlO(boU?wjLqyqldPr6s>Xm*NinGbS zg@ikS%D=7n?7=n_fW@n7GcP@59rh#oj37eZgx5`uUXK_7+L8nE`;ejOZS_eo%mSZ* za>Upm5}X!oV_|82o0^4?i5=G_jg1<|z!=k=C9Cs|pdcbcR28e5*6h=u@Q*k378(~g z8PMI&@}sij&npgmh#8p^0ogjI&0ddW$l92hB5AC@I`94r;0>~s^UfwV;cFnY%Yq7` zPLlx+ByX2mu$c_V#dPb}VqcCTT-6L*k?r?m+W|jH;hv$#@3P=RXA5^6ktottFs)a}fMwSeQ-;g4R>p!cEIWB!kjas-&vt#|tCacn6lf zww4gLQ9(qnqD0tO>jvQ~hPR`8QrA3o!Z_%+hidHFjj*RXI*>pYvNR{IYPh8VVTg73 zmJ4Pj%>~ZQIV7QoG^Qw{>WbU3XjtGQrMsvjn95z+;14PG$HcyL`~=n0*$2_UoAg^3 zQ2izP7}3B#TOj55yYR|*$ZyuLWTVzg{D-V=KYJ}y{3P(`aVOeObEAw7B;ByUDE>|4 zx%^NA((2@_30USPVD#K7;HgzCnnKwXRb(vBJJIVHDa`e*Nuc0VRjaZX4Z0K!a;Tmd z2OC``z_6{}GrH1f4DprPbTDmHic+;|NADD*BXJ%Vtztz2AeG`rSF40i*6#zzi2U9f z$t1+{c|o^Q@(@lmD@q-fp*V^U*a^LsO|a%D15iQBSGT^_ePZuZSzIu%^2YN345iAAsak;2hK#8Hdj(vzXLta^RQ0O3+rIa9wXuUvNKo)uZwD|%QQez$nO?c8~mI zWC<qnwKF|fxzIjhQ`k;gw{yEM|4$b(wq6cw zge&FbJcYRpMgsu6^HO3 zMil1XmUEWe0;{JLiv)rI&Jjc}k2E(fJ&LQ2P*LKmdZ2(;SiKmpxxthK>k~n7*Ha-0T+?dt>pCOeI%?P6ajolJEr~oh zSA%+R4i!BB+fnR6{l-oJBgQR!&l#{c@J%*Z_)uV;_j^)wiOldyBlDCE=W-EToQh}k z;1`LrG-CkaVVOJ^e}H>Gq9}fXDjtYJ5GjtJ(z;7vwLH>?KMvnoFB!5gEH$!;R_iCE zSRz8vK2P6!FBkhR-lIq>(o3OJ?b{4gy4GPWRUx|gU9H&(%YH<$fLq&2u+oc4>ZVhE z&%nGFv0%iDM9(p%?9YiwkP!qz%+)@PY@KqJl*D%n&qz4V0f1(22}?I?uy zp+ra0jd+f<=j{;1H4=x;<29ven%Y4r)dvUBN1W_N#)nS5@b7p9Rse5BtgGr$k9~wk zO*5`WDt1)M{-Gl~gLU^wJEWTRJqO>GRN;4l zJG0xaD1Qm5H69&nAI{3BWzqCS?(yfWzllZe>Ad`3F0uELgFn z*%W~il39mLJ>;#d{jK1x)-u$ehkf`=z2T|$Hl+~uj2Z_Ga?NpHxBUIUX-1TaH2Eug}10w&sBKlLqk`O5a(d~Lo zf&E(%2>rz37iQ+UqaB%aZMaXj0Kx9X7wDqR!??)*{CVmddQgl?12p|I$2|pHPx_lA zoX&%KfQFJq_{?BPQqoij5eRo4Zo}xnl{n0a^B9g&#d)M~D~+hwtMEy;FsuX!X-2X$ zXV|Is?2&ViLQkVW-<}=lH;xP?#z(u7>oZ~t_;1`bni5>ZPH6x1z5n||#zez&2w8@1 z%jV1@I_l#;p|^e#5Fq*jhVI-SMU76PADrJ;wJ7Z^l zde3ctGRqlwza=ioV`ya>m*LfWi%6*b#Le)RFXsFOAtMOIhqnK#B_!@~hkx_3`-LwQ z@d4I?(nOSN+d}dsKnnbffA32E>^h6yh1|?TAj=kuncEHDjH#Gz^d}0qziuObq=T~e zxFYr~6%W881#8SE{V~=4>!1Gn9RoPLLZoG(Zl=6_z1% z2gq3owS?TRwqwDye|ZuAW3k^JA0E8EeL^XbCWrH$OMgIP|LGC_<1-sQVUrX*8BxGK zLqs+#wyk>W%1{37AK`(nF%a!FK327Djxzwp*l2%U*5wh3abD>d>=}3g{YdVSVxwOc z;K@Y-JmTzaSgeDnCVb37RF?6tg>cXUoP{$eBW$O<-9~pfajEEcEdcmP%gb+nc@OS` zJ*fCZyLB%Lc#LuIuvafB75(Z`%cH0{qV0_hmt24_RK7s?xZ-Dz(~lqdKo`F?-n+y4?Q2K$ae;>uAhz)%mBQC7p2+Y%u^{gs@LAR(62ogFvO zmoY?X>32%D#BH|V&z~*P`|#s)nTL3{A88Lfpu>alLqGok+iPRE1AaapIj+q1Q8Y!N z_=j5CFPu&fP#{xGm}xzVec6HVnm*tu-2c^=-H49FQFb2et?w*>B8BT!5dZnbhicV? z*R)xYwEfa@;rebf<=^uY^YOoY--uWU=)t#gxUkSdHGrtbw@GL?{RF1y&tKP25!P3U z+GYbCEa!LVkvz1UFaPQz&7+7{=_ey@?pry{Z-jpInksW0vEO8$4Hp$HCK)Ixg; z9bq=(TIgW-BH`+J=-X!XZgMMZR=_L_F%7!(6CNVI|oM35`v=fu$z3 zhUgy_z!QG?Q;;kVR(Lt{#O)&JO&fDPwFlm&5ewQ-VWDw{`iu?^R zS0kH|`G{J!{AqS*6}&?Q8k$XU9lc=V4Wj~jM1dFqUG&R`Pf9cPwsF*=raK$X4u zA$|FAP2k>fm@~$z_WnekEQ(-S9z1VWvHTG?l%90mK_XQ`2W%&xIcx;}uVKfbDeICf zWNb4>BLs+{GXvZp^I+NO4s;GSY9QB*K#OxK<@SB%vhhO~9v@(#b_66u)H8-l{_S~r zcK~t`4gCMSzG>?nd^8s)4YSgq=8S?lR;+XM%psr#xPq~l3CP^s4fblB(bpbbs3bOT|g>U2$h zV#q;)!jU0E9JTQ&BvaMeT_y(%HaC|>JeZTmo9~7u z<}ZL*EHMlt;~asiDSh^^vXQ|lGJR-JSU`XJCJ~J?t@-fl$NK4hie_w@$p_p~PXO^F z2Ni$Eqpd2?5n=tNwz4Wwu=MvX%Fo8FMVZ>_M%nHjf_>2XGvm%bkygvR1!G{>=pSKR^= z-ylTS&46)EG?Ky)XFtORyk^tIgEP?I@;4jJ3}1l6UZhpybK|gCZD$*Xc>b1LrSNv} z(=x{&5KBg5{u_Y2MB-{6gPSmy3)jOK^{-NkINH~}t2`5PcWVxSZSSC|o2(y7VGzOr zEmhN4Ky{tguczj|rNCo%i;7GShMAX9bGc6UX8@xlK!}gO92v`oqNY4A?1xo?5vR=| zC#70JZorIYz;M1}NQdQ4JHj16e6%F}_8yRZj1xc?8i8J7_(d%k7|2vo-IMm{qMkjJ ze(B=I7gl)I@?8zYM`~+ePiyW=LgBp2U<}}YwfE&_uQwVWI&^gV(scfKMxJIKHQte3 zeKX8ZpVt-ggT&4}O#GyqOX~3okReV643eXH&2T^7@`Di>eR*vRv}Y|n8atuY_WT_* zFD;NyBEGZu8Zs1Bd))mK+#yDk6~2CS-2i=)2tx?e3lvRBcm+B<2t|DNxk9)~!^)4k5|{Da@G&L-aqJ zXOBGnH1^4t^RYn-*Is#K=&9p;WX5P*ynp*#Y8Sw@n$M)yKKEC<73+~|2Uv;b-p$4A zgiV+P1qb;Zm@F#+lu*9~(B%AY6~Z|0bP`4XvjE`daw0>Um0OGVpuZ-AT3uO4gwG)S zX?_WyghOV#Y7sPP9{Tlf;j)dV=Oqh&n&X4T4Z;?Sc`OPJS(BQ8n;9K<-sccEP}feiuaZBPG2l;Oy{2gFJl!V!wc$HFqzCSZJUP zoxZ8Z9XU()JvaJSIU+wGW1#{8^&)`3fFDq(!o6Om_=M-X-{KvhQn}}ZTL&y~{|fJ; z=RR(BqPdG)T7mrq*K(v2WOBr9c4C6%F%mJ6QluX~@;Y&`8Z^iKN^T($e#JaMT%~m} z%o4&(>`pMSI@8+%Pc!4(ZHwY(_itD{_z3mvEEhZ$((6|*$5P^CR>xkr#UDw+JbxZ>UAU(Riewq#52f7MJkoB8Y1B!+Lv=}v?pliAnt&A{al!Ftk zY19iS)^OzBVX}d|I45bP1pW|b`{(R(AJm?T#bRwIQ21l?fn(@UkrpPF3|(n~I_PF2 ztpHP=O}Jqj^jB}Cmy}TxBTxmZ ztZgvBdD9oa_w*0JZhi5_(V&{EMfwFAjbEc<_K9^A%}$&HT>@bvKy^obM&9h=2NRnf zV&EKFda$e2lK2PUkCg}ZLb756Gm@Hf2FDT+2R?&!Sn*BDZx=RKglJ-fGS?i8=A=co zRvKEso+-3$6mhBj)q1ZsGUKe-q&PuBP&XMQxhH_7i~z%NVG?r65M<=%5mY*RkARYk zvAi~cnDX~`fi~!mgy28^MI1=gOtZtISg;sZ0a~y}DX?IMGr;J6p(7EC1fEy`$EP}M z0Okk@!_u|#q?}}B1ZpmOw%EaKwUG;uTGv8HRZ~%ju>gI-DEy=1?hO_2m;nd@jnd+1 zgy2fdXqJrXuk@mL0rmy~&8u+G!jRIBiO_irI`1A`MQ_Sn(vcUUN7u*ML!3_H({Yh$ zFtj(AU`i(Alq)Atp!Nf}Ivq7+R8hB((uf++@~>sENy5R{O0-EbX z@O@+%F8S29ivVmJBz$Q77A-SUV2l!VU6wCOVFGZW(nyyk3$qb~fKchGpJ%IQe9cwF z-Gkby4NeIF5};+cDKgyw8DQ?)!)dEWwfUQy^ZYYWb+Kd=N%NAC-F5m}eNK_rS|=m* z?t;F;NytU3CPx;5vJfofzLtrCY#z~VW2K(iwKwRNu~QYRd(rh1eL=L2-~hmiILwm^=M%Uvj=$d;h8zf%|-^w{CPBo!IanV~^+ITJ^C zJ{PG9ner^k<6sc4b-a25xe}4|hX$x|M)-*|QY}FA-^u@@l#wTL&U%Qso0wzfwKl{! zxRiokLKyEP2S^7tnk=@A<0@{Q7P0v9FRcoTY#j!j8L<&Ga}0$h?;>?ucG$UZEN}IRt&xxLPm}xJ8c-p z%GSR0ZCK@kBtHsnaW)x_a+0o1gd(3$F&=r~zJG?!R8am^0K{`4H17N8lLy!0_1ZGu z0Q>{qAVn9Ty$g#w5wG zy8t0`On6cdM&DR{o)gC&)qhzuoQZDtR}xJ2$Pol0ihS4R?3TsJVQw_@LSRRWPK1P> zu{k~QBN!bV-tD{yE4vCf@FgQS+I9Lg2nCeBRtf(Zfw|DEH*GB-M>B!c@#$OzK_=wv z8fUEH%1jc74|tN%GXAlU{}h9q=~3~1S78AQ{n*C<%N_nY!JyF?CUQm~eHUkF?dpV( zHO*NF7N(;gV_ylvf7kZi6Zd5d|6mN#FqgqR#R$XVO)DZ?ZW$+q`vHZO=I;o{4g-AI zE@YnS3y{^k=E7MwxC_~Z04Oj5@c8P7SFk1H=gC>P?ZN(- z)garW6j<1PH|r-Fr@^T9>XMMQ!*&6qpavb~{Ioz|TW+Gj!K`TG-W8-Hk(6JSQ{jba z8=N|9(7_bW!9-*$Zq0c9;tdvrbLxhPU3zKXhfc_XPL&f7404JqhI8uEqf5J`>KQ}) z{Wgu{Fw-+kuniqYAO}lOEwV>;*kOHg7zBVBcm8Hy@a!Q56^v?kKJ1=*rze&bNSc^m zwyP0k8AjJ@OGr6oFR~}+|9K2SDHahKp`0;8c6jP8(JNkclb6U+E-zXTv^mli@TZ5C z1ZQTQw}6Nsg9teQ5n2|EO>_vvdTUIhsU9Sh;sOy zBk*5#pg0uhOwER)*ya;IOw7)lhLL;}bZwN!5!NKV zs|>L-G60kC4x(hbj#HsIIELNiJTovhv5^n{_052HRE#r+WF|V$=yk!N59!uBa@KPY z{|@pc?Wodf7tA1Mh#!-*MyG9jV)K(Uo*_O>G3N7%2cg8(AeoHY1>)$VOya?(iKr zJE5p6Ks?GerJw)lD`1o)0o_%r?>8ZRXAD6J)j(G#T}vguHlm#%d$8jt95W9ZB1L?C zDsEG38_^%2%yA9!=hPdGp{0eQ8r~H z)J;J|8W4bRE(nnpB?Dz4H86FIfLy_NBa(SPvf*=+p<*6xBNemUZjd?`9vqf#WbWob z#|@<^;6NCSBv34pm1yR%qj$%}^zbMsB?Vu(#Vf7BR$j1JEfckWi7J>8h#&Eai8|^U z3>b-nC-ft{MfUy2Eaz`hENt;7e)Q@FdRxxtq1oAH!2612m^5AUGhn8>c4Z!$MHP(< zPuKBsZw(vwAY#Xr8cqMv0;tqR0O@=g36dQds2;0u$-i4Tdln^ANboDeXnlF+G|jsS zX$p2N(IXdMf%2_X8$jPmNjNz#9*wI3w$|L40Y#cVTaa>V0ZfU zc*Vxt1K55vQa;N_jEv|&O*Y7iHRF1lN>ExWWKHEzD^)9qa+tw*QW1kd?ME4q?w@m zm~_bn^2&Q2b^!owGkd<)wjP0RBi=a%X>-japYF+SA4%7mzNj5{i%8RLzzY0$`F=c- zKl-@;be2V*p}ree@G7<(bVKy?245caMrINyFTy=2vih_?0rN3&etI0JP63aIXfecR zJ-U+UskjUqBgUP3H0FSB_OV`hQ)?V}4*p1;EMM{nE^-Nw9HVAI;)`7ggo6vhu>RwM zx?%Qb3s&0Ijh=}gxdKo;3v_;3ko$Zb<;0UckK!+A2WXgIS^X&IcrA{M)4qIM+osrb z%su^)H}CS-=1mnSjZERJlBS1yQw#85V=C0R(tzWV0)ar8@|iZ~LC#BMh1Q0A`Z0!6 z+5@0Xc?`%`8d29bK=8G`f~nWH!TecrC4niz1g=8fmoD=y^|xZ|Sn~5P!Nbbbbj%YO zKlbGCYfVJ!LnEzs) z4hutvqkwcCyMZ3VIq3~V;=W5jbzks(BH$eTpO z`p9DGeibkpp=_cF$xsV;v0kg4Y)jTG${#Ho%ch<8plCvo_1Xr0J@id%L(@>JNSu!C zJcf9&x(2vBL3N{uH8J=qEgX#Fsg(XHd;YsChy^)HT`NsYM;ofq1d7Hw9vz3CFZfqk z00Q4tE040h~N`z4^@KWGb+KSg>~z zfH$XRZRi8DigEVe{FViqgWvd`vfQC#$@rDxDw97@UfKFAW22Tm@x4%#pRph_^`xlg z-&dG%=TC+g zFmF%E55ULpAHVj4rSxBJi@*Ms8^RWqv5#UEphy(q0b>~AHGg$^W8jhE=2N!2^pukD zDX$-0(EZg%l0OG8DYuEA1N-iV5m2>(F!YxnsSebL+6W@wdSg#w8tfPrfqDM_t!Mq0 za3|`CAP}7o#;~YiE+qeS&pV*~m(c@x@Z&%G-J{xmq+RfU!lG7KEX<$J${&}_U$^a# zKf{GOQo9Hqp2U7fXRPzl^VDq-vA=xn|NcScsPt;L9wkISg#-!hY3+&=_|=zfh>ii_ zZ`x0y3<%v=!f5!*D4J0=XgWCQDsMmIXK0Cz^8Ds{_}`!6FWTZ0mdYD+}q zn_CP?MSuA-f8Fta_gfhVmlW@l?}!eQ=ymi+GUD(= zPV52w`}g{{?=Ax6)s#kD8QZC!0&GM@XO&+D28lsL*vFreiv_2ZqhnsdJGzZQ{jsh7 z_Q(JAk@(R#{qk>4q3jg!nI{h&f%1@C1cEQ%A` zDssjkB`M2mr+#8+|Cd!4y#S3k?tv7;Z8yMWKv4(C{d+S(1o-!6`pZW7JtqEpGyOF} z{VB`%_h$NYp!;)l{r6`2yK5f~Sj4|K)1MB|pA&B%5#_!?x-<#ld4EpI{*>SU+s*r@GVtG<>ED~_ z@4HI>aFqU?GyTJcf%W?LX8QML`qQoRGw166$2U`5%z5u0S^)p_)S~~+oc{hu{C_-i z$_Ob2{mg&`K1bojPTj6>{|k-U|4?{fGX)tmF~@az>yBP*V=hco69pD+|IfsH*j>~$ z7f~QyKF;scKu(~G(Wizi|5>jkLI7vwKG{m@%6;;g=edk44a>rjoF@wRjF^0`50RtB z@kUBWj0~@-u^TD^(f$cZUj5&Q+f7ncbiA&JiY1wGSTRZa2dnu1WI4n8odLz4+*fW9 z`dO1^?68ZFF#6EM)Y~)|vzp ziq9hN8PFg9`@YVNgH@#}H+XM8kITf-92_E@4|c76go8-oS_dt$umulhm~nqfZR7mU z)fY9}n{m!l+0k1~)Ajq>`ae$%=iiCiu|)%_r&?2AnP%2w4pcZ4uW#rh1%XFbo3Wf( zLsghz79L&AS$TShNa!@~C`%&%faZrpw)paD5sW(uxYX~z1Xyg+;1dA669`20T@*+b zkxRcekS3(=_4{JP7C8V&R+9xVw2(${(ZZS^+IT28$fY}YEO|LCBl1wXO*z@?e@5X( zU~ncJ%$_;PJrjuzO0MLXIVHJy#vpM~d?O!IsM*LIFr9uGHkdf2i~|;)TY|=@b-w;Z z-#+vtu2tk;O-=)$@MzkN;Y+G>NU&}mFyL)bv4A8swFQ=38dfaO2)r~c-}}5+^eO%g z>FOV90&0S?h;%mKAO2DJKEjE8R_L3fobYNG2fl4@;@Et}P^>zc)xqtF4!ipUyDv`9 z<|~9e;Qwv1GFu6j@|zaPYk*Ublz7`BM`-hQ-PxKmBS6@eLA=_>3yLu4SlW&31+K_a z?o71i;Uuz>x%T?jg%!?F#k`ZM3mcWkkMod-!U@^o5`$Hklh=SvwffXFQ4`;_V07wB zj506aQ=5T^62Q%NUK1D`F;dre7mSvuWxv>G+xA$gFRZk@HNmUce21ZcYpVhxtI&ZSEED=>ABPAq>)a&46Oo;I9ORO;Ewt6Z&095>BcI z%RLlz!0kI$q6xmUMzK-;)vO1%de*=#BEu#%CL8gvoYu0Pq+m&%g2DK>xieL_<*=OK zGo(y954^xE8stdrEt|X1)qvl>-bYq+88P630mGkeiV(oIpuTrq z(3NE8DB`^I1*$P4?ZQ>?4)NVx)(+GHj|deFT_CSZaYSx_K5GyHPR;|P?i~W;0bj_e zVY4WS)AoLrIxYqs z1qkEg3gUc^hHLivWWZVH0s>t$qI3&^Mac*pj)qN(D4ERBdT>VSdQ}THx}_xjhfdV? z-*W_*c62>njqR#UTw7MB74Y<<5XY&9I(%yO(1bnc%cT`Po>|IHd~DKh7j*2xqnqC{ z0f^3W1Ee$uqet%WRm_6SL-ppD$_w(y2Ig^P%yy)-l`0lWw)>Lg=>KU>mT3_dkbUh2 z`(#bO+^3~N;M8{&tN;}%0090)GPd$<{>vMu90Q*8mLo)@iJ5D8pW{4oH9#Qxc%R`< zqX_JNfPXk51L29;daZ%}#(ZEM;jepX`|dY%cC_!OK$@>4TZzIixi!8|w2{?gSk`?k=-^KnN~F}SeR>Al_vqew5R4d9ef zkqlFr!)L}7oz^7s!Oeuhr+UB)P_qsda6*bB*9CzUHCyM1m3gAZ1=aB|3wXZh@b!UHQR$V^>ZU>(WXE2@ z=H=L5UAA*(S{=7w_RzO@5IfH(-Lp=A=g@~2_%F+Ly&UAUtOE+YsxLE5t8sij1WQEu z_(;=e94~9K1rqC_NUJ|Vq$xT7;@9JwBKjbWP<2kGIRI!MbYoJkMcqsYEG+&tw!0s& z+8?{S+SMoRx_v&l?1{$bw|rODi3~|XW4pCO6Hf^T^6BXG=3S$ow*t2d%Rvy%Ap1~? z-;}9H1I!N#q@)P$<{A2a2(K$1BdD)lBelT0FrW7hDV%I{IBh8N92HA6zUX@kqI3O2 zy_HQh5j)s$mi6}Pu6cbsmwY67CxPB%R2#_gLIDw2T0nZ&&-CfnZeYxGYgZ+$A1~^( zpR?#Rb9`ayQM6_=osjRd?OZHRv~wwc(k5^2y?KLr?2(;u_!C6r>=EXdy43QkPEQu} zJLW05YpLLdS37Mb6rK~&?c3NQJ*_8X6G5Ud7FxQm~s5Xa9ecgxQ+u77`)WT zx=mBf1u|V5b!HMR!+4uz`Wu>Kh{-siS_B$n-#glYnr!;9^N-Xj;vNpi*kuFHhz^k` zKya?PUwsNUl+a-iW+6)YhRJ4x^I1w8+9cAPc& z=`T22;5zZvo2Q!*@$gB9ST)`0?$(N0fd#}nV1AwJA)W9Z3_QkEa*~+WGey2uG7HpY zv9uWw_0d=Tytr9plV_SOvuAyaBCT&ZknaqRA;&J&THhmuSCc@?H8}nDf`q{AV+w|l zdmy2y-(fr^($q0oU!v+zZ(X_}$(*QAVDo$df2RbmArc_y(6}eFs5N}tueJ>3mTx$K#nH*mnzTTaOf&qx~FIf-aPW{121a@<9V-{puKrF zth!Dh9fvOM&khl$NTC5K)MKyX6xCWQTR_q4IT6uUk)-b<03)Zh{E8y&B4GHp)z!A6 zjcL=I=55o+y!qv2!&^$ex-J9Sz#}SJ&ht}Sn^UTH=HRAj*gR0_WiS{8#F`$4gNq>I z;je6TpRcIWQ?h_U&}8Y2750qR?9UmpZ0Px1gga@ob%Km-ofiUfdhc#stIx}yk<+vE z-ClAw<8FJM2$8Lghyt>6J5J3Mf_7=1Zkp_8kuPnJhOv>`^0kdu^Iu^$J;@XqtgO7)I z=hZbD!5+ADTb>Xzq|wRFGn`jzJ3(`%_QFNrn0|byKWO>pDKeAaSHo*oOQj@atXzx9 zgiOMqCmZfrWM||bP7m9*9pccqbB%SCd5`;tbO~nS3jTgC&a}tekwu_)aVyq+rf~s` ztX=}iFH{y(zpt$Ky{^Hp-2nTHsuG7b$GdN4oeulVRlZuOkqWt=nAt9g2*FlKfo^g6 zFB=%A5huG}5f&eEye%ZDh%`#RC8a4*taOb#=Qgq=v0%b!Rk1sx$sT%nd=k^-{@v?^9p2NSykl zHkTj!gIa^o4G>Zx)ojnQ9JMYrw*R<+%{iLc>xrEL`VwPj^uv~M3fE~L>wN03X=R+@ zETr-_hb$r*IsT|4fsYo5cL6K`Tc>E)m&@54pA}pIj+$7P!t6|YHIeW#ot;ZP_5DxJ z9GcV}rO#Bl?3f{9yNdYH<273*Q58;o`x^~)^EXa?S*0|)^Io$}Sw9v1$OiDZO1MUE#D(cHnm+^0LxHZJHVZvaO|V)-AVi?Pt$XBF0FN z^8BeySE)p!@%}Upo|)ZuULrOA0$}iUm6C|8bu~0UI(j>>;Ph#lvM1*#+!WU@sJ%qV znZSLOip)~FFPrl~b%_FxA08ploIYL1>%;cI*l(6?0dnD~S|LGjOhJlei{Cqz(}XMf z5NX~jNp0wKZ+lyVk)sI}*;d5S6Ete>=SEq9Up3NuYO`P^+uiJmcj1P};v}wg{hQ(~ zYiIJ?CB!~Ej(wuLN_LQar=QeLG2(+e#qo#UJY?LTm$crd7a&f8&sgFy=0aCR$|lds zH*oer%qOiJGyG$s{zn<6!_CAB+VgGJ0)r;ue`Z2*&7YCaV?p>*XwanXm~#0_M?mgd z)1@W4D15|x zXej1w)#>XN<;`%v-u#}3ep9q}_q9L|twW(>%K;_VO}rcTnLf99%^(|0?AetYS8_GM z2?|O)oSR-AvU#-M0?c3UqMazp7;N0@vtyqd9f4^WNRuD9|LN|f5YyPvg@l^1Yp2ea za1Z*Dj=lA9ttF_)O)glZ^t>?ow#u%NI61EIwgY&n zz1|Ik(?g|Nt|i0LfdNXbE?GL~jauHxcsjqeU%TKC&ZEzNtNDmz&jzxdQgEl}G9yB_F6g!4^|wNT;ogaz#RB&Y<=(RRF6roJ*(-74IOa5t%+H7IpnqK)S2DAP6w|}$ zeJd?}6uzu|S*qxm4U`qIP#Nq#&qSqLqMjk7MBSf3^X=oV1H5!$(cmjnsxc(RTpvA; z$-Mn)ukB1XBq1^QnvPR;y<^<_HR23xiRzt_4A|AxBG2F9tTV67#Veq6U&%)+TP(VJ zy>`uty|N*Hm(YvRBFE$Q-v>EYkiCb(;pbsCwkSoav=B!<<+vvr6OfTwtumV??ct;Tp#kJ}e^?k15Jb>`ViK7Z@5 zNoXDAVw_9M_h@p`m!3%)#}k>jZr{=NlL#OwuI^ySnSnx4J30ZX#I}dvCOYKN(bJM*T?Q-SC$+k~ik?b6^hKi4UxO7O_ z-Z^{u9*Lw%>^OW!@`R;NM9ZE~5k`}zY{IpjN@MGN`MmRu7lv{V){o6akX5?cvU?aO z_MgAxJ!L;6;M{+mbwfz5#cDS9&P?!~HjocIEI|6!a<<3T@?*!?lmn$S#WNdV>&3j^ zi(_w*#rV{#N4n7%7?Mv#=1zZ7S~yt*u7|qRx40in0;^j{q+j!Z#eA%yHH*j|T*(@@ zgLI+JDT2^qC;`(wazp$iCfD&o_!|vv+V1@qhYm~HaE;7b%@P|r%}3IbiUcHdRL|wE z7YZwhV%Hx2G0f^bySqjIRxcqLKgB2Kpwo=@m2%;cHEWfk97h*%ceRfM*|>?REc-ZJ zmowPxU9{*kxI=~)N)8f@U_UWu0 zp%{wd??-!=C7OgwM6VFkUyR*n%fWoe^fn15oT!@9kJ=v42JJ+qQu{L zyDu5F#3>rO=o~!TeO+WR_346IBI&~Awabr7TI;*VWFAfL93n`+a95D8m;4|TTP=M6 zo&`gSzeocC6>bV6%5?`tO^wtwp3+gN9B}1`IXp3|aVkP6w|(d=9-jcz!~NfRF$6q* z`+De##Z|m`#PLXL3`n&iPIn(W?TS~^LEdb|+l%koq$IO;axE-CDMW5%F>dnQ(fPhi z@<#t!mXon>Bgi264gsNi739lgTtp-mkj^gVCXN?yz z-IxLgsw%s-o}`A;>@RWf3LahSUE1Cq5zY@l-B#4pwmU`nm6oxIKVATm@5v#T=_hnP z$S+?P%*|}osl!7{$;Zgmyxvo^p`Luz+Av>xo?2r1?ZFgnE1Iki;zE?hIqZ_f9wh{P zT!Hd|{-G5r`#5i;vh3r;L_KrNi3r{kzS+CA<}_n@w>)eMiNGymyjVZ(R^vZ#aQJm2 zhx7gk8{WjLjh>$C8jRm{PP#o}(GTsTWq95^!y;5US9_q0YjIGE`1MH%0=+C|N%L=S z*e$hq=uH^8P7>3<&R`f84>hu{z5z-AS=J%`a4CuA=s|7&WU7HrwAgL`u+0_fvnmxc zk-C@p?pzpt(p5MsN+4{}+^^C9hHt9oat?X35k2)ieI0&aKKIS7tbPB+#5!pPjQE*P z#m^p4ISVg7CBAa~n1a8=cbOVI^RRcO1D4;09)<7b-!-4fYGk+Tz1}0H{5w(8bCN=V zGG5`kD5XcA26lWddl10l6l62(t<9C15vDlp)v)80~I zR_WJ*qg7M8^%HazH1!WkhYEMfDjGzR%=a0%_7YPW)H6uziLX=8=2Tkcl+jz7S&|C^RD1+DG#TerMc0`;qoPV{=&H%F&cq` zgDIs4JVT4tDChg^c1`TEAdjUy?mD%zle0TX9EFPrwFjymhRk&aCvTC=$9-x3B(?Hc z#AbFN$CO`4$#4GLbE{Y2_!F<BArU4q4=q{F;$T^(OsA>LE)=MoB zb;>nl-^AmL3v=ft!3fOTRCnb4>;&}OX!qpk@M)jw9$39L+U7FxmS@_$Dwb`k$;a|; zsaJg%u01}f|9;M02Sak9BsYGPQk{HS2sq?vk_$9c=62o z?@@Q~RCfq98|R$JS@BD@KjA1G$r3cS3;eQ=O)+DS=><5Z-il)m?NkX3jIC)HA?q&< z`4`rL0(2XtwY8MH*OsO8RU01A*z~?y=e!@;Fky7EGw#FL(Y8o7F}79iC^7FKqo64t z6cBnj$x|K_64-A=I>{EC7dg6$Vdvza-V9>t1XBo(@S{x5ttVf633s$NI$4mB(A6`W z6>JjzD}B4Yf_ zmx$a=Q4iH-PT(_9qcd;Pl`)1P$79NOOYPGXopX32_UsXvq+%)IT8Z#g{HGj84}E)? zFYlyJ$v`5ZjoShj0ANAZ1(V#T<~J*i7P3;f1dU9lgGQg z-@QMoee7LIrN^2^@fYZD+O?e{vgPPIwUfVu%WF~A`f0zI@8jot3ao1vhb^8-JTjor zLun^N=%MA;DTESxWRHpX4}N2!X*uS)8u0XrBkN%jX@=5SN=fGWmVDOn!$W&QDe#jA zqpseVwOqRw9{v$226H^PB2?JHncl5BwXX4YV&>i*Xe&N$4ZJpK-NZQT$6q@=SDhO9 z;l+}q8-F9Yl-9HJrG~=SM24t`IGkBoCpq(IsPU`a=0fY)U&cLp2gk9X>m z&96eT{3CD4scs5bT+}-LS)rSFUZs8ewHwjNSA> z6leWNShc@Wbw61?DmMMd>IBY(430wsdJ(kUDYI7L8QvB(y@By|cntmii%O#{0nf90 zh}n_ojb}iM(enI#eVlm8%W*2HL-kNhso;Jvq<#Cv;q=1j2dia)D@VB^8xJ4XDdxfx z&`Dw46h7;FXxELwi7yT|TboHWCbwN}42uRi#rWvjdMCaoMP)9~vNJ-CKX-_V|L+S6Q=K_obtaaK<5agWpd_*h1_DlJNp zckWg@11WQPgu|y0?PTGH3%Zu9jhsTOId}VYw45KgkF-Q9-*%_Nb0(0?r3+UYcr&Ii z#IV$eU&2B*8z-5YQhkqWnf-ziW>)q_CRoO*41uiNK4c_W=-#&p;x^OJThKOw@t=ezz;oPymGqkjux}n+dy?xctc>zKZ4N({o zh)^4(GBG{-{Q4MUcyM8x7@NfBn@T74aVFjknWIxw^25B2L%L*lk1x#I)6DBo5Sn>? zQV{kLR6YQypgP|`xh+Zk1la0H6&Cu(aTg%MX_evqr ziE;ZEC@vqP3X~9e$HDDJThsG)*NKL^KFBEQE>8v*j&VVR@@UG3MRIpPVz2mWm?crU zD0`_$^`Bx`cz2JPNU!;Fb!se=*K9a{$xEl~6vutGcZ-+;KblJlA0`XEG$$K5vCo!p zAm1^seG_|>P{3zw^v2mJX#8k`u~3*CxMn87#&6a5F?@>5Uh}3eiGEXkO_Gr5p2v&! zasvV!QC$&a)UhM-bz1xEMf7=w@~1xsPm$OgL|+i7EPjLiv=C8d{sP&sd;__m0vFvp zBGY>yyw$5=R$n!OoAMn*`lj2G9W%)dJxTYvObe_Vh^(nM)8`)T zP)^h$`o^yR{tcnWqDXgsFbe^{xE=4r)xoZSPKhs=c0(>(9A%5;$d>{KE8HwMjTMM6 zl3%@Kb25T-Wvi0nUS5h#R*P1wSzfEBlLqx%bCaSd>iZFHbmz21szF|kW{>$B)8}(; zLEnbCg0p9M)*M5Y2qepg{E-u4YF$xRM;eW3mp!Y_1Ge+>3zES>51hwxlAcw=&02?7 zQ1O(Ow!ulddPs(5p58S`|6Bahie+D!``u|4N2QT6nLNP{7hNzT1k*|=tI%Rcg(=a5 zL^$`JF;2-yTX|iPxdRghUz|d?&3e^AhT3z=D5G2^ko_3@3y$!vk+qTsL@UK9`5sfZ z=S8$_B7^SCsXhxjF%FG8Hs#l|cQqekTQ>so}%RTWj)=~LmWAsvH*$i|c`N_7#M zVjP%^hH$f!!{Yr!&Ik7G3^0#Q%Mg+{Clk5%?zix!o7ZE><|PR^6VwYkgD~N}?>uwP z=)P2wh>yA>wuEf>me`=Jbq7T2%hnXPI9AU@roE$RQKO!x&++HS;aa7adrZ)7Kq4zC z9B0ZmTwWO6oWAnOwJE0G7PW z#p%M4X3CVvE2pj)pb)+Ji4`;&QyF$sGcOCcSqiB;DnXNQV_8YVP>%4O4TIx*PRU!X z_RuluU%bwn5Lbv>j~{k*nc`HS`0EecZcTv>URO8c_Z127CawEuS0sb{eo@CQ2+a~L z(3Q{Wm>bzCa%r6=G7=|pD_V=GA)5i^r~GX_>f1pMH3KFO51Tc53YpG_n#6FA?k*TU zUI3GeiYZ!)?}@=~uU6+a0>tPT>u?K}3FM;f_-W@pJ5RAFo|tO=5OJn{R55DcEZS1H zot>?0KO07Rm0p$cI)?jH|W} zn-S8qz9`alpg55iWIMfS^!)@LLnO6t(KFoe7=iRlO-gy@a$h|jGVgkxnRlEvY5&&_ zkD~GwgQp5xAp3L{ldUBmvq_?VG@^w)+Z#_fKGT6ety!Xehaxl&?ds?3!NO>x<$;Oa5a_&{Re6^`FGWT|ex7ZG7gT&`7j z)Lebk7){TH8$})y+0Jc?=cMHyudiQHXCVI0A+xK?z2&~lXeJCHT#*cDvd-P`Eb+oU z)1T*Jqr*HFBprfPVyWhJ=nRC%uHWxIOVP>CHXr&PB;s^MXu1VPmR_tL-uOo3^ki4a zz?hw;^Xns3F5a!>6j_f}pDb^diap4>(miNMdu6NHaVDq5gA+PN#HqsAtjUy=eYj2O z%R8R1$0D<2^MfTuoBUHtM=q1msjg-wJD4UBr`sh9rCg$2ZG4R5P3u*CWyGv8K1hun zXE?iXA(6N5K22bS>I1TquZemn1S<9#Z#sQ{6!pMkRE*h{mPszO%}{9{q3 zL*L?T)0I<&B(BqUUL29?*RmIDaPqEi`H&zLcYTG&Y{!Y0mkeq)U#f|*)sxm!)Q8$~ z8b&Q?fGLGeICrD6U=8OEor8Tq0;%9|h zfM<(|&b5h0cggnkVe&9Bfed|S|mO25)!1?Uj=1RIvg>~NL;rOKKFKK zOQ+`f2c69l_MkFdo`szeI9>U?R?Aa7qm@U{S{AeBVB^qjJ!(-aYLM})gW29u8;^IN zSV?P=5c$yIsUXL~VUy|xV&KA2ocMr;Sx6Z{%~pm~y$87lsNBi`$(@pL|!cMACgEh%o2_!Lnn8 zSFuUa|HIx}$7Q)K@52fRNQ%-Wh>C&|lG5k~3qg@?3_@B$8flfXKsrRar9^lDL1asZ zfOJVnNVmW{>tXM+zvrC2&)N9<^F9Cg;TE3zS!>qJtXZ?JnM>>d^62+D@a^<;*8(qg z8|s7_hpN}jzrRoFIC8FUh9CB&D7#7*6L`)}*B$RMEC=v%em!?lj->IF^Qn zBP`{yEQ7h~ce?j4h~MHV%(pB?>p0wgxXwYp1D)=;uY>4 zOox)VD(85WQASEUX+W&aLnEc}0cm|o1J{ByBARXEl7w4(CDZWE&?);h>`D1d?AUyu z7?IT|b6ODaq3!0~Jp!%de;5zXDZEuKMefS&(P7pnN9f#Z2?Ay&Qih%Q zq`3_&^?j&nP~h{9kGi!pbcPxljG5^@p!(flw(J}e0)pl3fAqOb>sYK>-G9U@h!w8*LgY`4= z%v~eM?NuyTQmzX1^1psJ11OI{2+`|>S|=skU&H0oQ7+NJ)!|BYakySh=yc@Kq-7#J ziLSQp21Y9+KMG5tl}qV$W7z+xS-&ti*Fo8#*}S&j34h^LMvQ!djUWQkrK!y1`**a= zJy*{U-5<~pl`p$7vsCez0B=8F3F_ZXM}50ve4r3GNzPi5CA55BIEhgpa!jbsH!o_J zE|wgVD^l8rd0YB^OrqblEvEnmBgn!Wz8 zLV8Y%RMKndSB+u|b*ti@cknUSvTah!5wC+Vt#+y|yRPp=+eH<3 zc^cR&zFqir9ee5IZ-hd)`>Ui5q=DjWdI}IqmUdo{TyIXqVamVzQAXjMpjHW^z}?SU zX}kjKbzywC0X#3<@i4UB&wLJ7NR8~F>mK#sXe~J;_llok@m1Vo;vq^dM!uRmeBMvb z&`tYFkpxn5m1p%HvWw>-reHcW5iC~HS`*uGL1O;t&D-4uhHf>Y%i0bj!Bz!A6VU{i zFJ&_>Gfo2cPm((}uW=Q%!$xr^<+{HuLTgz9@6N}z1xw}lr%{j{#CMD?c*A8iwmx?_ ze&Nhzjyo)TbD*drV{*D_D-g(f0Ub%cJzf0lnR_&Byh%K2bGI9r=pD0wcf#Jh**!t0 z$?s{=xaGAh5`!j_*fCqo=Iq)36K&BLQ7$9CY>|8H3p1W;{yJ-?it3#Wukr~B9a`+d z7!HJ;U#IP=A<+1C@gipen2pU7DK`;J%cCImr?dwis%IEI597ThTaT&1Ra0h*OX__3 zWlwj_1wC$y7kfV`h8Fg$1r?Zf_>m-**A%|Am3>In*HvN3$ai8IVrdBqkvAtikh3b^}WZQ<5Bxp)nR2X3?=JkmCRrM zQ8a9r65*kPE1t!h^MCT>S$oWAC`)TM0b25CCCpundu^q}`Rs}VDcfB;jTEZISI=!H zK6KX^>X#<*T)YC?gou07rO=9%6=$UZ4T-$Ygs_Kj3wRH!D~0>kyS~{1ydhBk1b&Vq zz)yz9r&Dq@Pq!|vcupSj60hO=kkmwy6(ekQQ!j5tfX;j^CTBXNK(32_l4{E?p+ImVva2Xnr_%IRN-w`fZMsHb)>3kpY{ngbiN+I) zUv6E=PHOWe3)0R|U7dxj_#riDxE9)=ur27Kxc(8HFqg zFGC-+CCTu4J9+JJzy-f6(k_R}0KeA&JXq2>$um^a$ zk&rl$W}aoUNTfJUC+;Pvz2&$bzwwui)QF4z^n8WUvS|`{ zsP-d}aXK!|7?8pW>`7?WR?mSn&*YhkMqt0G=q<04^}03@jCjx^0Tpc(j36hB_kLxa zbG`d|Xm8X8;oHxgHo{-v3TlWWgT#^IVKF4EhV2&oa+W44{N?;huIRUO(dV6TXqx;I zOuQ!yotKn}XZpZU=zga0tnizq#R| zV?)38{eBt4j3x~TzyFASG1 z*VY#LYbX#VUT3e``s^vFZP0k6L?*%z%GMr$IwkN=z%3PZIEmiigf(}3BilH2QV z?+jX2t-KI;Fmh!q>b_3Sevvm#gC1e?sMzYJLmLylNNe2#|M^IfJBdw4nH0xquXBEt zF(jnF@J(35HZwbjpQj(l<79keQysJYDe}jaq~i}pnJIq44Z|BA&sIu%-E87e3b@VG z%n`G8(X86Zbv2Yh!3sE56z{Hgf#S4@wphl}I}K1;(q%K|cfgeJnT@ohV#P{iZb7{) z)f7Oo?&@VIVMVQB6lV$Ox#}6bx~X6TGER$#u)H<-U&l-(HWuiAKTH^iVp;^xGf+(5 zv$2df8v)dr*$;eilh=FNxn1Y{W}{}D4Kq8^A-Z$FMp#x06$|6DwYppPGHqKt_#aTa z84|iAJUOsb3=PU}iL&QjNqC>pGC8m5aW`+fsonnlKAI0?zWH0`aI@k%@%Dlyhna>l zuKRVGf-6QTViiuMn5}lUZ6`UWuZ!PW7wVVaHIm3P4jXjMIbyOu5g1?NF{nB6WD_a~ zI$Vy8<}D@c9j-C!%@b|ik|VhOy`z}yrNQ$dQpu$h1#d(Sk-2jGt8CJZKyKDN=)rH9 zX`4!In%68lXHC>Nr_mL(5H>!ZUGu<>adLji+u3Ptj5*V#2LSPFt*6Cf9L`e>X z>)D#F3J7}}-Un7k1bj+$;F@4{4tIG9rLsh^P_OE`j`D2mhqj)0s=?G9gKXPcxkDGl^6hpufZ9LwuSH7c%f7f%%($>p zGA3?iqmL8rygvbs-3hYV?Ix6&@e7SFPTo+7s>(BHA~Tb>JDnX+9gy{4gTU214; zmFv7WxbbD4n^Lem-PhwYYC2?&bC{5smy{xkt(}EhtI_9t7x-`3L1b1ihr-QzLqgic21 z3q^(zI8Y4BsVM-tlU9VG&HXMny2Yd(t3bP2;DZn?_1Qy>OQuZKK0L$W_MEov;bx8K zs50ibt{{}eeaZB@lu@9B&$7|gQA(|=k~VD`yTl@QUVHX+23HyNi-{}6^zTIirTK7+ z5;_E&YWLj1%MNQx>Fg}|vaIjRL_L10w$3asX2h+-Sm<_)(eP~^P67>4+RTKN7#g@mPi zi*bHCi*g1E-%j^i+;8I4E<>EBl|XxN2saen4C?8XmC!EM2<%)b^L&9+*AkzFTVv7F zA7KzZb_BQ>XQwS;e8y;%g5L)eh3G6{9;iDTcgG)az3gH&(chze&SHvvGaT_`twynCB}r##Rc=I`xK@ha9C$!wjs8-SR`>XaVg0Cg zy5+H|D~Hdo>{vQ2G3_FKq-O-z!QlRSZk#($m&FY7BKh;zKd0QNg!7D0$G#hVYj9_> zUrRWVvD~aq|2r@>RXwk|RN@{yg)ih>A8#}W5Bncs`8W)Bq7#?dsAz^xYRQfIS*{&9BYjym z@aobC&KPWy^t#WtuxQQ;tAo63#q-WYov&>Pv#xiDg?3KF(n#}j-OKIwe^Il%zwrez z8zqz5k2zk-57s>jQSA0&PaxyAbaqskN!Tbf9+x!=@Hz3ngi}3UF_U?lsyt@QIZ+`& zns-3ztKs8w>^KHGX?IDk#s}pvOS1>Ma4dP~MDlr^H2yNG*2JPobzIYa(EHXfH)&L) zrvDo`o+mNl=Uy=02x(nQOm)Re9d80cjVmAS&RN%&jwAp|px|Y}dBcRL`+aBY0L|qV zp*Ds~F2=K^b4h_8dlM=@Gl<3IViRUkD}TvsJ+<%AVIFVTiUg1PA9iIWE8K=V@Kf3T5GcIFM2Zm#2 zUU~a~R(9Gw?3IxxT-)%_4$>LSy^3clTez_{WhlwetvX4{@nJwSZ!EDO5!L8q+V$p% zo3Dx9pfZYQwvqU1QNIFZN|7!NXJthBH-4=P&Kv6k&Rt&TNQ>ti8OhaOKRGSuZ8I?n zT@_`JK8{Zrua}1|q4v;59SEBv=H5DVh&itm_Xn^F zO~}w@>bz&Qu$G@}Ph*d92yK4xeugKJIVIpl2L;~70D&ZJBPo6X=Y6{?GrUa;C(V-D z&5AvBN-V+?Slir9n6wUk^26E^)?s>{9x&_^GI_QUR(SlX^Uc?8qX`)nz$FyWU%RR$ z|6~%K*ab;SXXD6SPPmd8@Q|%HHD6$NIWGTZO)oXQau18MY{IO1xXG;W4Ogfasczh! zlYYKUD%<2&dZuoo>cIiZb>Sw%lpj$aV^yCM)VKL4#s28c3)at?H`SRM2Z{=w*Bg@& zoK5m@?3(^;+r8t(Nv;7^L^#TK8 zIexneh!{T_NnS12sV~_&jsADFo)|{(+gM!>Z2^<-mSa0$6;tsrTZ^#_^1(PuUxn{! z(datQt%_|_oR~m+-teuhNsA_8YY~YiY0oAmCSg<@I9`1MgXd&K`L4 zMd6?|Ct1T#=g*xmH^Ikj(JxeW9FEyND+02u3b645ZkhW}-rGv-%&OrV+nn{4^q0I+ z5>3X3E^(#~NcXO(k2ojcQUtX&a*h#}S*&8DSp1&hX#D7z)xw;MeHO#+YB;-bl>3L4 zmHZ9iZQ7C0z<3+~!4;Oqs{jR_wGJ0age*SkVoAf~sLSs$Gu-YTNN)4Fp0zx(9564_ zu90Fl zcJ~>dDuk)GJ19S7dwXbr^~068O<%ikL@sG0l&JmCE=ufc)jPN;FlFgE|LZD*UpJez zyyZRfgakE>o?rHi9m$H@3@tc4bs{h2x`Kf@qM#f)v;2~U&Ml%QfoduCYL?gu3O5?# zv0GAki-k|^gbY+T$lurilAEBycI16bjcvwK=(0xF-Tn32P&dT;S;?fglq-v#_B)Kh zkLmKi^^FH{F62XP4u41&(S=vrr^4m*M(jRDJgZ9q8Wqv^e=qI1w&`+9xe#)=f ztkdlN*jU2q4?!sz$9tA5DYH?YTYGOgt>?Wyw{h6BvPCE0)P+v2+HbbMWa{E<>GQr=A#~>P z;E2keppw0N%;+4@|iI-lTSL1+0j3G%RY+^YQ?&Puubnm7lwA6B16vZmIgjQfuE%n3ciWMzi z-(@;y=4FHEvR7@|j6#*OCTq{sL5g7I%UKrh>ARR{zrN5hR67h=<60?(kJ(M z+{JLmd$j2DkiX0^PpeSgflp}QyQs_GI=S)7!#6sEWB&N9_k179N^_ScqY?vN=P*|T z6AXFW71=Wl7d|KD;k8Ll|<_;6gSfT zVBK!0yMGb?*;y!}#))DjbXz(GcJxiEVuc2OQqN~VX*K%ShZWA%v1S!J*rXDvc=;@c z2;E%GdQY7cKCN7R7T1o}@0T?#i+H3cbB|J_))1TBfQuoADgKKLl&p!V=bRMd3*P*& z%@@JEAv3#J*Yb;#4UuwAnmo3~Rb7+ysbsvJ8Z z@D9US)c~Tt=E!g57O|cvDbw)&*Ge7SHAPl!scKB z1WpfgZ}Hx^-UZBnH^sTkTgO$%$aoz&XbS11pNkx-S*uYkRm7{c7js!(^x<<%csC$* zo-%5d@X=Rq;%=`FqoyIu1eG(bRU{8F6X|&RN5Zta(hq{P-XYBmLBc~1--e<39s|qt zz775b#`s}o=h^o;%%5I%H1j?nqx5gNTrC!;T=X?cB2auZ)Uxk$%82sgYT#?H_Peh0 z&H4S5>5p{lsd>L;{!>t|xyd^&tCpOa_j?LIrK@r4)U6OvtwNyd`@(vL{5J1F>L_{P z3uz)zV7dwGP2YTG59wF&FK9Rhc4Ca0^cOQyt$nPc$#_QsMZFrw-&z9)SoQTXqsRo$ zYh7FW#U(2Zm%I+2%mBO30GN*m&t3k2+M+gK!9HZT_f`mZ>FZoc%H;rx&>O}h4p9Z) z{!egwf4`D;lW877-HT_J-Et#LLe)*OiFIZmCa8QPzT~hT#iEo^hWY$**`A1xyIHpX zlXuxhB!O3_5ocz;?)f5eug&9fp$80w60U|=FTvH<#KPEf`Li)TEiJ!SZZH7GM^yMi zePfB|u-1$=p+g2BTdiW*@kPx)(y)|pCwTUWk&56+tlywje&|y$+>O-s&G$ zwPi5E1QF9yEuY40MKL`Ezr$@}%O&w>3B8D4*N4o@w3apye%!Ec&Qmw*xPeZow5IOL zD(c6`=BqXe_^y4}bIU(co`G!URtk4E)S&u8{R~IJG|E0@mc41jmi_D~5Y;T7g?2Qn zQwx+5$j&fu#!9^;^x41~UcCp*%uMBeuetpj6_!MX z33Dc@vF^Q#p=5WBhh0~+Q~lg)f%lxCgHhf0y^jm@>0 z)U-?@MEL8bBQnrI`!MBr51{6T{ngqU1$7)DMOHL8f?J>< zpN@wx+Yh)8LVqFSn^#qheIJ10EA=M+W3XrN*6*>l`6aRqM_O_NHr9QR#j@e-m>2T1 zk(L$v2jO!5ZY>ue@&yr*u2nZ+$5rj2tfG5fqS81X-R-IY`Di7oF41vWY8%Wm`HoF{ zqlxj1BT?AQC-yZpmR#j6dWI%@C6>G6WD7CV6Ru14q6gu^JK#h7cL}T(+5`YbH}kBL zijsRE<-pB#xJ_pi6}|SpGuO};F_1!I6t+{)&_X}Tw*67AXg%xzIa`ujb3wOg)7kDP z1_hrv(0YMKb%tnf<7B3=oQmS_nf-C$z4)8SLJO*?*?Y5&{v-QA@{1nap9XNd0SzU= z8#>)T@OQCN)kLddg}2B9sBTEPa~)urmATY$y5)4oi4$JMC%#!Z54aKeOMw?~mzx}KGH&%CD{16__RVO#Ts_79~$lsY5?547g{ zHaza2m@Ucl9KP{K5JTe%Me90tCEed67r8oG8vncgV!?5L_aDIaK`G?9-jy9k z5PJ!RcJ*9Q_)op8X#^SVk3AaLld${XX>eushjmxvf7iLcBdmYO?jpSGnb&WHL^iQ7 zX)>`BDwlrhT}GbpalzPkmv)Zm8t5dZ{LCB+6#mB-{@u}yn}U#{pz=2gNvWI=EkK3B zp8L8#Gc;L$7#W3ia_@Dl`!|QX{I-A#^&&fZ`*)Y|_rG&NaIpJ)x^Y;ADvyPVb9(-} z{TF{`WR$duFwgTfGZ8yuxrVaTE{9`w?xS`qH6K5i=it4gz2w+=>YoJNP-9lPfBC0| z7J3EJYg$LSc9tyG8WjmP-9U&F$6Jy3NHINMe%2%Lb%62N3^#>;ET7If5scm>y)?(L)g^XH>nwM8+Av8wc?F zViVY4fQwxAzT79WRV5_QA4GC_6HpZleM8ri@9iTiQz zp#u9y?(WEv#2Z#H?%Im@Pfh(_{nS+u#NF^3s-JsVCN=1Jn{Q(cRy9fPgQ8Y$5*EAd zV%7hUczHK?8nHt=0vOkWcQH9zrvIc1JO>{?{lVt9-78N67C23&H~Q!NX&4MlWZ|tE z=Z?C(g3DM1yq%x_eYyUlA?e*F1Xn;;-HE|E`f+61+KvP1e}wyg$m75N)N}zp?t*7+ zyE7L28(@ukcQa@$GJdmCy#bgfzWF%y&%MkX zu<&i97e0w#j~f1JFi^JTrsCnBnI}&L2rVER_xpG3%WPhPp???AX~&kW{TCA}~)?cE){^|8UQL9-01yb>*SmbtAxqVCQY? z5Id#y+mv4WclrK}FlC$r)Ir|33#oR=KtK#9wJvk(OtNM zd5g`0$90a;^`9HreIi)EhGByYtjuK}g0)iIi|xI-qj~cbf9)x82-{$$B6!3qW z=byO0|7K+W+dTibdH%Ig{crR9iEv2j|3{nWyC0OaLgrebP(q1P$d$K(#HqJ!*SOSo za%gf875WTn|IFTeO%DMHC+0n!#^ZdKyF5?cNL+NB!bPug|BlYjz159fKbK~zhY;ef zN-AzgH?+haHq~)xOO%hANY^?05Wz3pxlk5rgrI5S=iYu5z5QV7A=NY@N4S)|<(~Z# z+m=hu9-U#CtD7-@BLx1FKcPqA#nI31jX?}TTn%5V%#@1;eHey@Q2u$sc&BZr%~J@6 zxJ1-clz%GlrhNb(-#b8Bb>)8NotM`*2b42|a-Dv=kGF||Uw#)gX#WFUzZ=&%9t0oX zN+xYKSwA>`S$XPpb_WjesRN~p3ET;(Ro$X9C45={+`@#6kfSnZ=y4`W>1R+MPKBVI zLvwn4=u)f#dc)r+8G-)NjF8pV5tF~)u68RR8=Cm~KqbnVQ_##+A2QwOii3z;eDPW+ zlxlr}MQ%;ihXS}k)OUaGEyH&?s4O*wZnHAVsI8GD^t7i5!ax!$1GO&DP$-0J*8jF| z{)u0(Nrf58i=RnwTw?zkEZBTfAKCyzUwXY%6)V8GjQIfC{*`@XKkIltK%A)kqT%+X z01qSBYtzaD_~RiLS3sNjRv&gNv9Du-<|vVhtR>21j;I^?AnxH+DUF1;n}ES!_zq|{ z9^;nRMIJf`0-V!#tzX@FuBsARv*{`gcN)e7u;$;CZe$|KzBmH^Co~?+Q=%M83gKwi zgNfrm7mkvlaMYb3LF<^ogCi{bPwoK<&kHraW{IGkH8I(TAw0x;r2|S%&UQE<$c5!0 zKC6U#(1OGlHRc!hFAVU|fzln*)gNP$&;<3HbRiz*qd(oD;|kG{sZ4M?LDvAK!b80G zNgS7kX5DejkPX`1?B9)s{b4iXgm8RevZ9?(9fBSk8D;05H_C^dN%$ntovV=%OEY5! z$Y^gMtuW3M`VRfwSd*a^CNG(dH5ni?MfN4lvJBqjZmX45w+!%#q0>V}T2?9jc~gs$ zIa$4r>BmCUUa5_(jm41X8a8qf;oynHt0|)qwdzNl9j`Qc6t+WCtl$#5%DV68@&}a3 z=#XD<^@14GP}4yDmd<%)=meA83Vi?=UDs-Lms541$IpyoM{$LQNd}c+#LbT>-qac= z8u$gEymc0+2z-*F9aB3B`ZvGd_l3(%NiL^Gr@liW8h2BM)&N>6Dh3@r=jNbvno0*` zE2RziAOzETyGiak>uH4n7(5@kJggE#&8lbX_!>V{BXXZmXe6ixz`u&eoSACrmFc<) zVspRD376&8aHM(V+^YU)cIFVRt=@7L+${@zS12`Klh}CEATo*Pp;=ch0AwlN07X5G ziY*3FZ54FL){8Vgg)tuqRwYA9tOnriN|549>gp9aeSy9Rmzxo383h_SWPA}h^{E~- z-J>BQn633m_hI*1DA9?()HWH)WCr&BNFk@65qILFRfXl^c(Z$FQ|KlCbqrJiDM#!l z=6b8A26wTQz#KrS+j#cZcc#yWt0m9*Q125_N6DGPOp`z7nDXS|eQYt)cOLB*3mn^MX+Uhy0D))6RMcXFDbC% zfv0vkDXzV+oSxf2#Ai_VuseoF|6EQV7!PITWnX4Tqnz~iDBuS=Rsw~S`p`*A|M^wH zlPVE{W*Tpy2fbf)4{K}z;47;2)U(*%5O}pC1|(X$8tQ7P4yf>=LHq#Db6P9=MK_`4 z^2u`s0Ghp{23Y?w4Q^ej&`H&@b>;FslS-BtczN>Lv2c zioK^Hw~AV`q-{SHUAhSWp(A$-xT0tmkBsNGsc2FaOBs#jwaWYPN#YmgS0q(mve%d>Fuw=tH04 zaVkeg=ul9B?%Pjm&@B$pR6~cdPGJW1R8>qjXXe`@Js@$63iNNNE3Fa?Yfe+qx649w zEmf^`>)tZV^GDP^O7MwlY}E#YH3+kZPS?GXVn?Z$5AipnelkCT?o2SoR|>y?zo3dZ zbLaAv$&Qx+r?bm(2BAg5)Y3D=592&>BZg?WI*2=@A53fz*pU2#81`Xg1L&!i0ZxnR znJBZ|fGev4`2|CNdQm&mRRG<8nOuV!WA4F;w5&k=7}WNp!wg-LC!~|9YTGKa&|Y9= z6f|sz3!9k+FL~8`R0d|nD3J5ltWzmy z*D&#hCTQ&9OonP~Jr`m*gT=;!Ls07|_gj9$&22sTNa~fWs4tr>(5}WNPJ&8(NvNoZ z9lx9A)(i4}eGvknd>Q@q#c$vANysrE&eO~Qx33yRJ^JTDMGvvdli*b-hW+L3RwqC#D4R30kVq%(mVfxBd*cP224^+lCL zc2vn?T^$X8l`uCc0__tO$s8$qilH94wH25R#8*g8-mb=}a6ns(b0A$6LWJ1IY%9i| zKCL&(A7~ifISIYBh)@}WW0&T>|L5CLSc+~V&D=p)ikk)L_x3zK^!!0Hl(HYR>#?fF zc|L+X!d&Pcn!zL`LQB-;S^SiF?fX~18+X-0)PY3~-*!S{2r#e8FtswJ6J{lxQ#%zy z%6Xc*|Da7bRB;a1>3%zF&~;=gxJC+Gfl&d3-LLDtp@}H>59EWHlSJ_<$b<(TASd}z z2DM^Xg|=X!(PYr?MW5Hh&4HE2SB66^K~Hnd{@}w~$At{k*la=w_O?!95NZZ4wkMwE z{M^l&lnDaCwC9d!GMt3|J_|Q}5+TTc!&5REZc+h^7OH&XRi<)??kUuwbZy84ft6+@ zw-+RK*Jjm4HK27vm!E^tma^jbjF_6YgGT$1(fyU^(d&xF6mo zZ}vDI^RU6Y5D;MmJ0@Z~WEspTCBQY%%((NmD=q!Yv>2cFP?Zq{4C$Y4oC5up|xL>B@&`iXn&iFnukCmeeb#9>JGK|l_3=Zj0AwMe8B}J z*&hOtt7N6VfxeN|k^&5R_uq)S~uH!u$?^^X1AE>eJY5z)EwKE0#+Fi(!W zJ^z56%D`R&P;{-8!j)8f+SgHYPRk}~0;)z{zE-eE4Y7t92zt1tfCjSa6^i+O05{ud z=KJTGOn|rRyFh#=&>wC4K-o`D@~wDLyb;7PRz78vQUWpDU`ljnS}5H##M)$6PUZZ9 zj+Blfc_QNovxuVBvM*bx3xcOomB$oWoWw+A4GPPnVKZ6fA$J5~ovqd3*1J_^@lYyz zGY4Y5>H&taa`2;%JI3xKY!=tM@mJ1ISE$Bm(W%AyMEb*@IengJQh|?~jWDf#yr9wK zca6q9NvtQBbCl09=f?wFvJ(cT*nr>?dlY4=fq`THMjs7;jni)47R*uZ;BQQ=j$2i8>CajMl)1OFwr?`Rx#Px_jax zvEyDzccn{V{%W1AGc+WY=EE^eQNl!zg?{p* z!zk(>=Qdcpe1`@6ontq|5v_?8KyOO7wOTDn9aO{zPS^*v>m=O&W(pfB##r@3Tn3q; ziP!P^+COJe%P6rFV|JxL?4YMkIR(xU5+$yY*beMY1CZOB`KTm~=TJMq3?JWt&6Wr> zz-lhEGs_hK(#zp%*kDO7FMGP(^QjBqQ{mI zL>V3BLJgxGhU{vkOQ0E%2oMHnW`$LST1~-e?}T6x&|K~FxDQbYSBQ4|A*14W_Aend zQXV>{w;*UHo#OVk_86`=SZyO zRck1l^@ZZwJn``=r!1gl)b~4GFs@8$P<$k^0DKJ%pIuG`tQQ3Wm#YaeD@2Q(^{3!jE*t)H?Qq zvkKdb3OUTi-WxMzl3L)dzr__2*}MRm1&T1LU=ahItX}PGd`SVzF!tj3$}yYZfmt#3aA&E6?G1TKld}o;M|`sP3*|a zM$LK*M>hc5LC_L@L!HLUM#uNOjT7%YO#LB5n`)iJN*{^?fS&(0YdUGC1n< zDKkz#mtXc|2NcL`dW36|ollA4F`pw-0C}g;XEI2s@w}ugot3A6>X?y@sv%n1SN2!R z{WcMQ>)~h!(RCUjzY6DU;WQdP`H?$3(BRoc6_O>iFEk*6{L>}pB&bnmlnD2V5SkG~!-Tb12OZ<5~3ncN1=C%e^eKb0Ah zI6yzFHtM~O+8Gf+EOI4M;Iv!d1};>Ck@h_=@7d_zE{(P}+E2a2fme*812u93#@rK4 zDUhNRS^8Ct`={;;V)N03`{dbyi~!i|4=mFApMf(O?E`xM75cgrmSjW+jdXUOfyt2` zhzTtOwD;kht2-!LK4Iaup=l4iE8(tYX{xWeZiQ%Yoa#EHbE}=xLp`f(%dxl6p`*Bu zDrCZ;9w>H)-%V}%ahIyC2q-JO+4fqPJ$mW_&*Sb=>Vosy$%kxXAiEVCagh3`eF5l0 zwa5Yf$^^-c){f2lF8lB~VC`Z(N_TJ-yUo#$lc4~?E|SpkD)g+pcGng%A0)N09kByz z2s&EM0*;*is8RpV858YIq?XQmoSk;WKLKw`O&YfTspLobEYw4^B~-uZtJ7`x+?GJl zc9(N@yR&#j*Q{njuN+rdTDpN7;+!g+gXu;xx?Orzlqnfs4*C@cj2pJb8@mn8uzVxW z7v$|X)HHkbke)%{M7x??EPmbt3NiN+8c$9Pa6Tp~an8KZ(VAZ!hFPiW+c>N9yxc`+ zMXaM|qm$wJ2vEJVvNWgR%FyiaO8*7RIhKR(p9#=au1US>I4JoU^;ctL_?Y~AFMx&b zz^6CS;2MQKlkJRi5Zai872Wz*^7DUCaR0>*{uEEf1!T>n+qEEzSiiNoA=GoVq<-=v zgGEnMk~A7hEhh_fG>VB5W&itw#?s1{AK3dy=X@TurTI~(DqG-@;D7qn79w1(0qu9k z&^T$)o6{q0|76zK7yQML52$g$i))ukdQKx@riVTFB}>3*K!R(RqBTKZZ*~|%j%A3g zWq~KU=x0uU%@6LuUKC#coHrf?(~3uSlp0+@m}S{A?1b2}62rG}^OS3}sRU1*;k zFG%BK)`6{j-Xgo&>$Sa^%o|G~+*+aP~n^5tSj{^#kbpvs2O2(x-K;-HztV3Hbha zUux{A)lPuBAYKygA^C5U_}39F%YkU3n~CJGYGTI)FCFtavP=0&>CxfAYFFO47lfTu z0ZgiWxp`w?my`NuKX>XSnB<6~&i9bNT-d*`j$5$80l~R}*w58T!3;^BnC;p>>^lIe zzlZ$&X{`LUw8iJqq1*M)Z}ngipoi?!j#M_}i4$^%3r zV^8$meYc`<;)WHT37FoIoGkIhMf$6Tth?2kkjo%bMR6{nD@bi7kHb5Aqu(}SpZ@;D z%HJV_?qHv>#(F(PzoRgXr_nx6tXSck zhL@f`aCNtvTzWEmJ(Wwg1lBUsec-9hK2T!cZbe*h5VSA&i52$yc`m?UtUnYA?Dj1N z$V>QqDL^#MdvVT#U64}o#q3sTYLTxy8xv7{9A4ut0GgP8oV=@gmtln7G<HH^AYu8P zSm0lMeUTj8l~H7ps?a{R>(R)<_cMs+?JUzdSTv2~ z>Oq75Ak07g)jvm@*=U(Wg(!FJ_x>sNbsA7phD=x$siW7Z3Bfxjmp{1Z>{7(-%JB8?BphO}+iu7?cv2KQE_7+PB4#2! zrTwY{`q9p_-~W-aZ^yx0IfBxar+-92_Ii8kZlL3q_3XfVgZ@$%Vz+JcC%bjhe&}>Z z5$)l$^LB9%fTNxb+F5t=CcP@W5U%D)NYiiicle}#shqXKnx&NH03?xIi%kZ*`o{Au zgFcY%@2kjtY~_CohNH1IT~ z(6qVhwQ~Xy7mVHBITM8Xfjt&wcfZ)p@}rUS!S@ST-($cE!+jd9%+j37k3>u$8`ZB7QA+{QhZa!@RwCjf)V z_-MU&@=pWy{}69v2ZQ6y@bbrQZ0={_^dHVvnz7s1j^{kgiSI)J6?RIrXwOX!UE8%} zQ@&u+XxGR=MsPa%u% zi_CVr>5`z#_<=eb?B{sUX*Bn9!LBcdM%h8YuFG~P^{^L56LhBQ*{?hCz<P2ycyH;U*q{6c=df2d&%797byDUlw?^5|pQ2MT(`E3w3eOG%7o{FMh79aap8UB}S zM!6b{=GI91PCkbZB5DEL+nWF7L;n_m>Fq@kb@_QqVyrY`!7fx|{9Sjed+8w{j5fz; z2~w?@&gikp26@F1>knCNl4(Pa8d0^QJ`RJ;YmdX}2PtLN`o-`^OFq01U_o zQ7$ypTfF<0I0_f5Q;e) zOTmX9(l<9&wiUPSM2_g6dRE-k0e$s)zlUGi0M2k@1R5HJau{Rlp-1d?-{}Yzfc4E8 zA!OwbmW!~TzBmS`uI`fcwyfwrz_!hLj{+lWOo1}m!O%HPv^jUz*GRQ&AgTA!ZBK;k zrWf1C=2WuIlZ)p$^iJw@L|T2M>wdQhsO>BVs0-^CgR;}^@Uq@ZbJRJgU`b@tseeOf zp*hIarmLX_Dg=8G0ISpVJ5)c8LLVvW{g>Ln;+dmc}0B<84Q9mZJQZ(8cv$dGVLbcRNUGlpV(r4^=O%=ajTN>LBx`<5VV;FBdpWYWBa=PXor03`A4W z{R4_ijH2gXB=MuB`-jMqqU^eS91gFR6NIDg<>&k5>5Ie0ZGo#$aASEoqOZXnmmu8! zd?-Q^6eBo*5M|Y0#cO}%w9ALUMQc1U+=ZR%{JYr zh7Ew&_BsQKHzp5gN-gA+C7!;JqeN)x`W?t3v)KQF6TyoVcEQK>rq&ZbY1`U{B6-F7=;Bh4AoS= zW>pT#V3xlI80#atCLy5C2?}5Rp$nuz$F~smUek1k!_;4>hHBbeB-Q!t_z~O!364 z56Yb(l&P=o&HO71_^W*+G#@q^bw7)oewF*KMV^@4!r(U#~({BJ4 z>zR&aXW0+tA=hqd7eYYB_+{YwAtVQWZs%7K#vBh)RT~$?svXB z%=y;3=dLp=td+u>yn8=;KhJ*Z?@<~wiwAB%dnN*x1W6({B)25l<79WFu2zT2;ET;(R;>(#WEhbGimUuTh4p>T=w3J; zD@Nxr5<12l;lka&dfj6vYQwLfB>qRs{~rm`QsA@Ja+~p(3Issz{_WczJuSN*fqZDN zsTuh&x-1>E`kcCM1UlYn&2V4WK+=b{)+^|kb}EperTm^IBW({8#lef5Mx9#kJ{~bs zF&HoHbIW0FG(Y?-7;It#4+KcvCRT$=SI((GV> z!l2Z>+0GAK42HK7QIb)VXAs4v#!@Bx@UWl`A*!QAYqWnDk6)30vObp#@{h?5KFx|{ zZpX50Yfc>;e3e9ovKKdU?;8M=d`YkHm*3w0yNK%lMzQ)cV?EA> znC7}HNRRGdq_`D6sbOBPekK_D@zfT|6!I9&cy~9nubL^ZcJtjzRUXxVGIE|-JRYh{ zY3_447oSxEZ_&Yzn-M|zh$a(MbPsmbr&bT8*n)u{oCKf*!jS^xXL+H$;-gRR_hO;) zY$BN;;hbW7NoZb5Ub~`B)VyP4O2#u&VB#?oUH`LC6P@@g#V5D5=GAsEKxK|whEznS z|H_6cFCV?x4AyOAv$x}lRjMz+*c-ysrWU>BOAw~jkZOrD4%`pQ(7PWT$AU8FqFw?9 zLsx*<-fQBu1^PN0EFcc*yP-4+T9YLolW!3;7Jv-*8eQ?+=bT~n01yKMD-P8Ur$T&{ zYG#%JW=)1lKAKa@U+Qq8THJu}U+bkS{9t1ADGb!Td&(e0(=-pSP>Ns3UOb+i&PpqH z%VwV4h=(u^X#Utx$8@6tli6M|BJ>v75E07gT{tqo-h*Ytz6OT}20A=2-%l-Jg%|mv z6f$$yjD8!M1}V-X`TMF1fl`f&xPoOmq$-9q2zH%vqV#&{(6;-wsS|;UsvqoRD>OsR zDCI#iorn@Opfn%WYt2EGlqry0iFan3&P{}d6NJ?S%ECb!{^HD>9?&mSAyxger1p66 z{#4LB^}7UcwCP0 zp-YGT905Ber$GJg9ghjX`A`hzz4aDlF$Zi3d)OD6xAHuQup50^VXIH&|f4arp^z)C~v@*z>`SqqA4J;w54g5s@fIu2liT04PY?iLNQ#7L-I z#3iuQI&HlEtbNjPY{lq}HG~=olPW2wluCr9y8C6p-fd28->t5SEj*6h-g>Az9T*qH z)5zIJG|=?2ZR*reKM-UHO`wAGys^0R%}qXZg2h!kF4ds?*$r&-(#@=1FIOL%+hC7Y z48=GU8x;bx%YqRf>mhP0eNpV8O64X%HJx6udK0h4Ma02v97z4+=Me;XGyv|A-i`q! zho8gf`qXRCk)uW6Tp(yMrJ(e)OT+`6dx1&}RldusUT%k4w>RI=?_dBr^~rh3RD)_3WhUK#u1j3di+VolgfzSl zxJjGqg z95Donkpfk&_SpbC%Lv$6v|&%%rTRSDpmc=%2Ay8`;QPeY7gEnqx}Mo91~-_Yz^Ot6 z#|!SOgayhgXh6-&*n6Xa@_Z=93hEb{8l_g{T1TmYI>zaMgIr(9DC8*fmg1lZ}5(L69$ zorgC%Yj^jK9fJveWdl;6^*YVpM(Tp%S`_4apg|%g7IgO=?|)S13cVYM(g2WA5cJLKG@@5zurWXAYl*&)BHZ2`aFY0Gu?>y0Cd5%3lIka z-&;y1K7Gj?xab8RY(&Z-gD#a~q!N#|etrUE5wp0!?s6ZTzN>SFs+K55JJ+bIY{-Qy zinZs43N8@D6as!%@U^qh6pCVtknb6TO3-8BDSv2Xw(e|Dt9J z39`8gFQHegYJ=Q+(eFH#oLQj@(PpFQDg_C8S`akDKski=Oe0p^cCVkmVjOYS1Iej{ z{6{nZYH}S3gf?Wv=N?yd z+lkqeLy=_*rVc2bch|Gph|gj}OoE(=v_13a#n2!-#Xrk-G87n#7K1gLyrx=kj|VVP zF%c-`-8EDGST{&3sKL`f&uIGh)hD@;SBikgs3udfPeDIDIq~FV6+nwpy86(7w)@CM zb;uvx=zBx%&+6TOq!j=8njT2nh8{H79bVg|vLSKzDV3HQA5}_fB2y=zq3>jL1SQ981p(tvj&|EIgD`)7I>bS$kA zwrdZVmyome`Y1F6O39jdeE!)1_>l! zC8q-0Ds)zxHPuTqapUmL*VbGp|9seUP34T*N+ra_3{|BWg>XbkRAm z$MiR))d`?m0yGBS3XKa>*>3^jMla-WBm%kJUr7XQEkA}0ZOn89UMrSgEMxDHi@HD_ zAEf*GlK;GA|H`&rjJNju-bMhmcBw#h2plw9@T8BPH@gY=rZ57N!EbZXhMdK0puU+u zs+QS)xF`kIle4>s1}M}m`euH9iFeJ90oq(yaHr8e$cv`>9K3T5yFRt#6z@7P>$N(i zzb`1mZBXe$+bfU7nClW8*OgG!|)3C&(-{0O|hWIm@{zYwJlN`wbv@zeDzEld^=>iI?@J^z4LesEQ1n=_ZG|`)v zI;lC}sh+^8FJ>9ipo*QTxVLMUVB#zc{34WCclEvd#)aGe3`KDc>*W1)E?9JD7r8@A z!;GjzEzC&;%*l;Yfwo)XoVp>IyA2TrONTgfGYY&LLhK1#@)0xu<#EbKUS1%^O+zSN zYEtxmi2>3h7vDil)U(`Me}Pg@!6we#HnHU8c7zsK=#Dr%#h+e>UUKS!I~3c| zesE?nAA8X(4;C(YPEbwORfdPo;&MZ=g`H~gOFnPjK+DbTs9Y#Zv0Dk|#F$P%pIG8@ zuhNV;4$oN>n5sp9o4yM_?73tQMKx60BBy?5QDXj^@2O$Q~j24net}@SQmCFPGeD& zp9O23bX;l40zwgRK|#IK+%D+;7pC^wcAbs;d~eBR7+63j6_RXX>42Uf89w|xuwVC#CI zgDX@~WvTV`D>k17`|z@%Y~W%Fm^Rp5eQ%#Fxzscfsz)k`>t4A~0ALLXlOHTPT>iXs z{~*Bsmzw#u8!UIZ_Muw~7q^*#vGtF6EIBdb2_$#+t~ zT>aPPms4Vh)6HZ<-9O$)82$zyF=?LUoexM{-%wx@eW(lbzLM8?wZ52~t zwbI5l^Afh0E+p}&^Ii|q3+BYb!X{oED>EG(6^&vpyoON`!-S&&<)6Uk;B_q~fP3&z zc-i9XFln^(``%tt=<_h?yrj1m_hG(^Es<=+&~1R8a*+>M_MlW_ZZ%l9qMw#INycEM zFJ+z1{gi3+SWA2W_W66ycl?grxBnG6Sg|=Vs#rhiOP;+|4Qn5pka8$ z(=gCJP?CnAlSrAYOb{>Wm!D17yW$y6@BYNYvQSh)Ee0(WNQl%m$HH@de3CljHqMKq zBEqHf;$i3oKlIWER>Ce{jqrnF$&9dx1tVZY;Ds^<{v$vA&=t={Z1$fn50{Rx?(8C* zyW2*bFPmGuoF)|Jg!7t8$AnJ`5x7wMOr9i^-&?PA;D%%HvJB|p{}E_i zNniI@ngE3*|NartvmLfVY4bDIu!lCL4JJ-)aHAe;XI4`S#npoA{n3@_q)cDg?T3Fo zrh3JYrRAyiC*^>pOJBlz&=9(vA|+Rojn~N#|`*ZA2B4 zm2FL0ymNa@09jOsuM!+WCTuNLL8jZ%PvG6c$)KyYR-qUzolDONG0)0y$@U5-+cPHe zyfvMiPj*?t8Ilr{>XHBP9fhh)SuH;!R4{3ff*CJ5g{3gwR}gH0`U99$By*M_Nb8d zn2^Q!Tt*|I`Ls75qMxW%b?s^Wu8R|b4;w#GuO8|O_Wxt-w!?i?5{4R_OW!*YY$Kor zrk54gZqsoJNT=(;CvhY$hl^p##P%IJ?y{6e%(PR_&y(4T#RTrXRsKy^sax6J;n{_ zvuOJ3jQCe{`|(t&e|HtMiF*Ar7y$qFj|GBv(-XmbM$=S%J>M)YM)FKn8(55q8ofWp zp6AVE(FrVrF5e9t0~Iv8x*cq#m{j%ZcHeY4PTC&})F7xi1m^R<-CSZ3?=Nqz>y^Et z0&cE%Nv(ZN+HlLf#6QWfZrMVKSQ#!Ea$xfC#4pb4s&_O*WZiT z`_ft5`wF37W|S_9GKGG_kZg={5b^0xK9pp{galkSq+jjbk;gobWj~)1>0*MFN}|~t zY}5Y3eC6en=5`-gX;fmzV3@z6OfxdO5fUQ-pyGF%i}xpv@iPlx$K zmc#6sD_iM`YS7DxK$8NxeRGMS4W$f8HyMD85rd8PjlmJE&`ZI9B_r6T#67Mnpn%M` zSZ@2wBBy& z^S>_Ri6}0+`y6eB(G6(^F3`=qtDv3fc#gp|ysXN*7Uzr!MLTZv7wSuy8ta*bdFaN= z<{712J1+U~g7oM`%tYy9+DBZ5(@g~uuMqoT%Sgc!?Cx%WyD`gG%myzt+ znti*$@VDhG$Q!M)!NEO^KAB)VI5Jtw5=UTDjW%{nRrR^3(nfUM!0=-}Lu@;dvOu9q z3osrEgOT!zLgjm9Mz{t#GBq~)&ZdO$_;DBa+8FnrXoA0(mvS8@hQ{;wdXbcRl7tq2M1V)&X$)xE1O$BnyDNsqU5L-GI% z>}qCN5fn_d+j)~HIpPuLtlv7nr3{I%nQPjF3F8qXX12Hbl-6!(Rgu2JGJI59#^Un4 zqz+^?Co>c(dbA6Nag_JvU51SC5sx!0|Gwg=M3HLhoypXV;$UM#sV*oTDfOb(j-%-U zRVTCV(ze=Yxlsc#lSJhU`O-aB;;k{6QSK&B5X!we^|S?(IM?V9tmX#MhA*atC@@nK=y)R*I?n~6Hh{E{o7ju5_I80AM*t8adjg|m#vv( z(c$gCWMmr1^~N45JgnTC?3>kA8_=tjgtnxO0@>xgc~&%1`5_>|TNe{9nLRVIHR6!4 z&zWq;HGYx|IWzv}1$@bjINoJ9>E!?Xc}Q|als=#HxEJ~%|6Mwn|@ReAk-7!D} ztCc7?J3!u$ktZKCHaK(3S__LOqYl9#={BS~!f*C{$lNy!i7OzvG9KGADC^g*|=Pnntj8$nErqmf6nNRt$T($E44h^<4W3_ z{dEVmYzMqbu!$~I$<$9By4bNR5=K1=f4>CgNB!26Eqn~vNmQ2*z zd$C}=C$?leTU2OxIquxmn#UIyXg8cjj#mLxH#-THU73GZ0HWS+H>{2p*J+TQx59$; zIWL+kEgKW1yB-dMx{^@O_GT@96S_Um?YbfFIyNq#v86ZwMGhkO6Q`VU+&G<(F4B3H zlPlUit)RP$w2dRmQ3|pCe4a%5Re0U7$?eIoWur9<&amuO0m?=JJ+04{p^I$Y9(Sm) zzqFf4!uT8xpTQbvbmVi=&i(5fqav{g^G*KdaEVA{77kq@dJ=K<&)-%<09NgDc?Ypu zAuD>Ul@+&Z*wL5bqDC7De8{GY{L`O|`2q!3YM@)6<5rl7z)0&WKd}1G^TZ4xj-kIt z5C$A33Ig#*|D**^Nc$ZsLc+Vp4Se^Jl`PPI-Ob>ccl*}hT@0hRJf1~H@;-Lk8-}h+ z-b|V;SsxQFZ3vzgl2`<8;7!PL;wNr@ML^t*4kUVHRz8lW8nas)A14|7Vf>-oJUb4DQwbbEUs{_Fr zrNGJ!Y#2|;fzWCGRL%BQZB4ZJR#9Odr;w62Y#HZPjX6&5t19f?V-spVH)<{Y*zT{M zBzEMC0mVO^e3envJt9)A9=d``P=^;5+I66Y=enGbNT8DkV1WEO4l>k(z1C|Ky1JmN z8NQOoWtEsIg;U55Tk2RM?_s7sbXjRWFA-gq?=1j&J)?h%7tYsguE`qV6l-ix=5$rl z$d$~)OnyhXv{5>v6qD9hDJrzT5Y+Eh_~@Zw#tV zcgsSkL2RyJ*&5>c@5Tj5_+X{$_9QbDuw<$3N? z*%ohl9BH)d?6+P&-MYK%^3Qu8JhoCT=w9*h?5$5Ru0I8TIQD3Ene8jrGoGC%j&9Ig z@olif({azI<4wBscCSKCCYw-e*a&J`E4hPiOtyRxkGF;D6fND3Eenk;9V#KO)#?A} zG&bL2^lC2a(|5#~V{#21r+r)!CQB^JX9QoKKahUPz!+dM2;Hl5YHe;CwU+qf*|~uz ztgO)w!*Mg@wYTS5n@p{o?P-O9NX`_4^UmawNL^BO^FcV@E+SX8wV%_TH;Bd?&F_mw zG@^9YeS*VOEEAodR1XGsRbxT;_RdVxJmdRc1fx!hxh1N;WPNN1j|1-fvt$cq;K)fr zSpISAB{ecZ0> zS2=b=h2ns)wxN*uEGJ+rjw!0nY9tI^Bc2Gs9h|u&hdA(PI4c?RoNP3NHBvZX!JgO8 zr{+GFCKp6wzCPMNES*LSUa4tp0jrhCLX>&eiJT-2JzF$vt~2uD@!J#{hrWHmonOE2~(u+A3q)NEZ$?< zQnW6W(bySybTWD9RHE~^MnP}aTrbL}oK!M-=#STNQOKKaW7fAz{c-~jT+z&@Am zE?XM!@oR6>ox(4pa+=|@Iw5yRRYTtIwOh5MDUN0c?RGop*+Oz?*;cG-GJazCN^In&+C8a@XsFjKeY$a=dyZ9qeT%}ye*EKS)6w&o)IVT$@f!-PjdC> zb(r)?-7iOh3_Y^yM#t%sN1&G%E!IyTd&=%ef8hIC;iNNTC23N{UVZP%MDtEY_sqGl z>*_i6DMP*vd@q8SySyhCZ~olSgd;MH^Etd}^R{D0hm|qUlP3>Zi}EvfTSRCzD~HyWL6 zlR_VVD?POATv6K4x%T$?%-=_Uf=&PHg6RK(7t|t#sX~Y0E)%S5`jwn#Wc`QlOge-Q z)?Ay>53?%4&!v9!sPEYeD+jV#cnch00dw{Ppu;)wT&AE?$yE(%x06!^TGRP%I<)Gy zw;8*?+|#1VGR%8kkGNwpuK-z-`U&Y!*&1x{~bP9rUXTh4V~4da$(4nQ5O-Izar^XgDPj1o1>GSj2 z*e{i1qxaw4`UX1d{>I;Sxn&_Fb^3)Io}ex$PM&qkd zHO4B0mpj2j8+5{Em`Hum&THFN>c^OwWe2cII6<~|+eZM^wOCxm(4;L`1AgTb`3WP>=Ub*S{dH|Vl)$^5 zE&q01h2Q!w02>Jrsus$eU!E1b^Vg#n+uo^Awkw&WN6JKK*@svn_L(ZDIGvImP*}m` zWZ6dd&fCD%LYVD#S&BV+o;mA#{k8a}09fyxwci1neKP(n z3K=>**@WbV{IS@fANQoJT9&isrvJTM2e`eJ>q(hy#w&GZjyeyAbsIbW#Dh1duO|fT z_!f*zv?uH4-yT`cikp=zY83`(G>)iuBYO1HoE^`vsKCHFyd6IR4QzHhG_Xl0ShccY z){~t#1nZ}7SxsB|U1Sfonrlv6f$J*>j%QO7+BsBB7?%yvH|)oVKW6?n26k@!M#_tOEf%dcPzNF~N$p&0V!JYNX z*Bw5zqH+6U(Kqy!a6T<0*|$#oTi|0y?y*7mii)u^6e+6v_rJCC!S-^{TQ!D8a^`>T zr79$$!|zpGiT6;{x86>M_-RrZQXIe1xkj2rtLtoCVg0%6!^Y>+L=Z&6feD0cU z4OCbF(!WHu7hQiZW7)EuH>#jDS&cwB&P84Yv??P}Cpf>YGsIF0$(ZWhxPy~9Uy_Xde0DRB9i(`{F9!y8YP!Vbj4X5_{;far zmCHh8?eNV$V~+G1@*Sf{LZIq}F8}XE%Yan$2gfaA1#BFE{Pgq#KrWSohbK$Ok541l ztJZd?)b_fOO&#V!06rAXvUF&O3%nG^T*XfJnrYpn16k_#$NAmaQb^w^JE2yJFf!)gf)Eb;Gz<*!fQ+clnc;@s(bMMe9&{98uhJl{c&FK`90|NX}e+(Ld> z`r)<6%SF;voq!z$swN~yxv-z`&-+*Jxzc+StS5IPw76e<^S}mE;yYu_)PnD@j2!1e zSfNx31bPsCRmaxB+n8;PnlmOI+cEpVyqz#O6C0=r5Bs{NRM0aDdQ;a{`z38eLHJk( z=inGo6Q&<@c2+2yn9meeX1YNj910&{Ilp_&ZHo&q+TQ#b?s3OFz}$I_Vfv~u`%spt z9+sLw&$3l0-q5Y+X!yP+Q-p2~7SSLNB|%W~jtAA;(~Jzjf-_1}B)X=aHb^UpDCN z@)R%M{+@sMuNmSo;uMCrQ)lb)!8Q5oz zp3N`TQwv#pvg-!mY1#EO@3IQ;X|VlD*7^Q?((JlRJ8Yv;IrbUJ{?mmG|6KA9UH&U= zh6|rbt#^6a>prmLPs^Bo3z%#GIxKHzdO6IsP?u@pP6@+1PK%|V;Nnj-MR@S3jnstf zS%9-p!7pS9)FMFF zA|gp^f?F>PeyRaw;SQA_tvp6{SdT1sOX}J*ZhQ<@6Df0UQB5ES;H%SC?2s7j!6ebk zU;jk%Z&$&LU-*_@?nIGvcqV?~_$J*9u^JXk}Qm2TnKH zomOub*uj8_Zeczed|hp^FPka5#yesvQxuOmTeH*Fuiq(K=Gf8a^+ykwb_ceclblBH z_-xi289SrfrZjZCc|JL;--fTT7STJprNy$e<5Ja$(=#tes64MZy}&7lmBy=cwv|7l zZW6h9sB)Szz2<}W_nL?c;|S;FPm7;P<*L0eguGO&x!!ZvXwtf|aXDt1eE4(E`ozI& zor#S$V_Pw8ge@yAO`YnS9%A)B!42+FKj{}V$e?>(KfqL+grC`NG7alSf8CvSJUeik ze|GUELD9MWy+PZjS4s_bXa*ej#W&hsbH5WeaSPs?FvLInBLc1{d@_0 zG@iU>pf0)Vf8%EVboFi9wUmz<(#M!>hHZ#;!nQS8*__*)WRC6dFT=;JLUJr^&tLcj z7H~jOK5lr}JcJ)<%F>)LEk3sR(J{%T{xx!!ln>xPzf!p*|Nq}ejHK69?_&B? zV%EfLv>Z=A;dsqsHK0O*yFqN6{`jcM!c7+l13qdm9E}UeBi<`JCyvKcLekk2dBPw( zyJQom>U27J{*$kdffZeECN`U$dk>hZlQIi-rAsk03fYltMm^((y6g6l1X?x#PReSWhW>|sc zikyEhXF55igJJ9FKsH3kz@;8fAAr3-}LV{D=9Tw8q1eS!4i1H$vM= z3ObRgq0O!s2>{)p3&Zp+w$uQWFZ*}JfqIJ3u-}1o`?Ya=|M=91=c=glzn#VVWzG8Q z1|@EjSi)gAS-kLM0OeKkc1|zC5800lzsLW8RNos_Wi)>_A1yrr2c`pvCuKd0+TfFL zR$3i73gosQ;%4Ue_!ZvD~-?{M8bGT;mMZD^S;LAIhNK47oYFO#>Bag8w zIUx(zfpFjF$NMZ}QqP<&e-@uUp$P5}1cG`NPFcsbJP#f0y=xwjn+$z@D<&Ed6S1MI zqWR4gdA;7($dXr#TaeV#{BQB2ahFBG4xYR95d7Hl{OZq7V*&3XuTrn=Px0@&-X*FmDYY|+*%VPPOX zFSxrjqpR74l;IIRY8#%7FzELuI}&l>44gJ^Fx1NnCYN8!bt9A~4^wJ}-k*CNjUVFx zq`{Kl@zbb2x`%}dF)y4+PN4$b*aHIUq(Lap>~tzWo%lq$kBEf zgk4{1QB#nTGJug*Fn?ws{71Od%wsfp{PAJWJs5IV5N=cEH6re1GNxdV((9tj zu!d<)Sk1*go7C_R#iI^TKcBgC>~$PcF08=8G^p$6BeKhcx1ng#$TbMt-z=<}tle7Z z$W009U~IxxWb=QA2L;IjKw@^vRF>7gaNw)T=eJ_`9gYKhHa#^5As%0;c3IpLC$Q15z0VnvBUH2w zd&Ag|n=}DZbySG;na&E)CUkU3%$72s1h8}fEEjP!88tXsMb8LLneWylxX=2dc>W7I zYN3&~WC5M_0#(p$K1fFKZ)_2NSefxCM!;C9IL>{NB;z-T;Sl|Yo_qed!^u6N=~^@P zg>NRBhMrp|m5{f@9`cry%ww-0nAAxvP8OLYnIvgL z0K$V#90=-?ND{S?G|3LWX6%>TU(Qyy`uR)w2q~SGDK5oyQz9a~Mk2jvXM-t}!R}U! z&`Zjst;9^PwC-}Wi)=+%)&dy2TE3ig2sP(Vm|jEpC>nxGF2h}}0!z#di!YaImrN6w z<&>(^R#k6D)rV7CYA0K3^KHi|_2ujL{NAk=((qCtc^sI1RYtr8U`K0gh&7uk6=J-M zL|53`I3+l5%&MMI!ko{#G&KA%QwMV^C);J>c*avk!CZ?O>7Tli5Ab2g!7Hi>mY zjU63Q1OOLWsWhYU?%aJ7gREpKJAtml)=ZjGy>ggP> zrtxRl;$ORvO%rEi>Jz*id>m#Ovw23#zQ@AULKFl)y;||@IuLUG8-K3rd%A@=kS=!faH*{`7&P3s z#q&n%L7XNCZWl)O z5+@mp(}p?$475UE^HfosbOw=v5|*LdhIZQ}AjF>$9<}t)+8o?|btkouQEdXZ4C?{# zY?Bk-YgvTP#-~DP-RJ?RA1ZAVHmKodxJAVJqq5awn^Hv(a6Ih-z?4nR!`4=L9s9X9 zf(rDrfr>~kVITdhUQrODi-n$i&Z`S%ot`4J4h`&(1g)R;nwzD6g(>~Qy2o}WJ5EeY zc_`F;qeMAd(|@k_?jUpcm*iO!$DRgRIsCG!xu<)<#bFtAP&KCaf*O*m=Pd`-f~HX2AU#6yb>gHu>7~H7I3tuUm^TmLLq2da`Au zUlCTx`ho?u(Zp!>Aq~J@GHh$ts?-u05WsDu$Ega?q#;!fU_hg-Yr{6lJ(VypVk{BT zdb!$C2@nOeWDGw!w6Z?Bax9S|0)0Fx`7B#Ot93=rJH0dl_h z2qCBb{?mJob7wyREZ9PRAC{j&%j=7}ffx zYH6$gpwu--#?7A4imvGF3lK7KfsS04(czDr_a``6pjqqzw7jD*{UVdTfjC;%c#}Rp zT)w)YmAoGapW{#eMtFAdE6R6%8}$DvCSV23m}U4qHl*v0TBLhPxMekk&_x@&C6GIq zWE9l(odx8Y3x*{6Ea{@n8t!-r88|(5%spM{Pu=Vf`m+$4#$=__vZ)Z>>EuXQ@dN;S z3}t7@;a}ktT91n$FmNIOdG4sJk&0O?;8_Enkg;Q7;@fmY3XrL*=jhvVmF=&wx zC+qN`wN`mQSqAnDn;7<>xg3d#^4=c8N@YLP$Lad%B_vK{Wt4=j8p}$?3)E{p zOJhmFni;>qlB=_B$3`I;4_<%-h`$xtJo2RiI5H6jyv$gfq4dV;M_;R>vO9C~;~ggI z)Oa3pGcV0{7MTGemYHcP@SD!j+kCfgo!&~{<#q9Z1CsQ z!A>YvkS>~u!_-8qu?N-@wptVNWA5NpG;snzlLAbiC|Np-vT>J;5=6;FGJ1f_snVaS zcpl+Z8aWG&Q>l9`5HmPzo;rV-P0zSbQrP8J1mzn0j7=&M7PpkCRiW6wsp)S(R>!0Sh4)Yp&ZL(%Z0o(_VPCk+p@G;PtT`MQ<} zH4l)KkhRDTpTnp;G>UzYI(zWYwTyqs?bdhoIxY=5u8A!RdJIr#2p_>9>re2e92of^BWA!J| z4U^Pi#^9P_;21f|2EG}rG%3Tieh=_))1a;tLawNtB{FAQNXHS(QOB!(MH^zuBLl1Q z(7(!e88sh0?L2U_VC0r34oXGvG?YER{O?AJLBat@cTq`KJH^+p`NY&aa6JcS*q0_u z67CY_n|u!>!Zt`EXjWvL>~thdT33x}ZGHvy?IFgAKE&la{IG@!oiO}6sQEiIHbTl4 z{yIZMLJq7m3+Y{nwxHk)&v0a22cX<8oRY^C7r80qnwQd-2gfP$M~FDNTJJop&ecg{ ztScLGsWuV{CZVnuL+{CG-T>KP!ZPmq6h-9y1^ zxl^-UPzwR<*!A~4QOK__>itbrb1uZ9WjE4|)C$C7K>57swUcrpx(*!EbI)WwF01mt ztNQdz%@68B&?U;laIm=~`bU`^PT74h%}AMDWlEqVo3D^KNWtEU7i6UkUZqR~DQJdy5wPAQ=uHA0hQR+A}zD94}dka3uqy^V(i& zC$;J3CYIG)_$Ws(4H-XfFLg36L*!$kp8d*q=*pGb;w`x%b_S1v{EY*8H! z6}8Y{{_9M^Yg!jJyeuzQq$G#meKKsg2g8`w2|F2ffh4B}V_6gAkvK07g|mTlQZYzeZ;bV&x4+KKdGCBiTDN~PD=5Rf zSd<;KOYL%bThg>`+tU$PhVPeW%Op|BH z41!ZZg!(39r~HkRa?t0E-!Cp3&Q8r}O)vHPH&?FX9oiB%7mOC$2#TUM1-`y2c9xFc zjqUC+FG8sdUv0%;qBPede&B2E(LXFeeIfBpe4op&iE4f?fVr&~q6p^qJ3@-Ls7y-r z##SZ2jbO{t5zKORwXB5hM<21#^6iMI@p_E(!d5wTb1O}x-Zs~RD^un!H3>e~z2|3g za#Hp334IUWJW?HNsd^`=lWeT}U7Re|>0V|eEmTV?c)^){lR?=08N-h&X<&QF#t-~# zx8nd_TC#RqNVBt%yI%Y(wkIQrqdxW1bN8Ci^Ita{JV)U@gHc>@ywCiBP}4W77UQH$ zQfc3-?COwSx98?(G-FSHhZ1C?`qFfLU-ChVioUS1W3cN`*N2FX*e2#=Zz&NqzXtQH zQZ(CI9pwqM@g{9^psi%Tutf$t^N3FCr4k+i<4f_tY0a29-DDX3g!uWsY)TZ&%4gtI zYc}^pY5>4TzgpK^tUyTQrP|1dGoE2J_icZq@GNKk$F0-G2cyg){|ayK_;XTF`PLA z^L2W>(dgXw;f{D!aBa^1P`DeVfQTA$)y7iKZrg&{(T0qNGkFpJF*7{WWyf!PD1_8=f#9 z&su#DGH1T{Q<>JPv7KXAKSi8yoUXR(Jdsn~(|$g+(-WHvQinH( z-KcwKw72Ex3J@!?9hb+;a5t>|+a7?z-Ro=%%f++;)Q-sT)0@8!VOd!T(9b$DT|*Q4 zagO81JfAxqMEcqGozXw?=&jUqX9WU2)6vK3xjWDFs$w z4!iP`%HOn14ii^JqrKi-l@oC9bWJ&S1$p^fsxgp`9Nu}iu%6I?LvM@MbMhEXhw=ow z22Pb*90}6zs(p1%{uUxX{a)7{ILIZx=nGkix>rN##m&xGsL@j>8L{ohW#LC|7(G~B zY2)|v>n_;6K}ufv)GyVYyh8LYRjKvOsgIi<$hgoI8}nAWaE!g5eunHHzsc#p?f&Z7 zxZ*^(#&3hAYkl$5ZExa}!5n-8U-QruF}}b2rgHD#*;G^3w}Gs6ti!d{bNScStZF+7 z7R2`>We-(784oHI3`3r3mPH<6UfhM3+0*q+lT~pPv*TOUJ|&|sV|^(yr0U;?)eQ?b znrVOx-C4E4u>he)V7U8lp3$l?x5%VBYvfXZ_>Wn8OX2VCCr}J{{0Mc*zv!y<=UP^- z3MvG4)~{>&$_tUCV32GrZ*1|>KhM6)rcC|1uh1bNTx-Jypl`hdSx9c@>bX6VqE@8C zY~S$8&!Qkr||fpuEJq=laXz+fuCBk3t!$T!oU1HUV|RbAbacZ zAGPO1AqUteWq)xBQCRy;ol?uRNRDkRDEtJ1**lU5r4f9bNKWa!c6h~@;@sbN;55bj zHi&Ht&JIlRh&^jFn08F?RN2x1!y9y^tSVEyf+aD}p}Y5h)OPn+z|-1I?pQ<9WPHU) z896SY5x)MFf{fpX!~36h7WT_1_{HKJy^CEA&v*3&)OhIe-3J=9>qaXsyit=fanwOr z^mC8k$&)gOMt-SEx9f0UNaR^4zov~Y^cGDzM9I=YY^Mmkl92sW6iatM)HvMyv?p>QPG zxJz<Cc$M{&4L{l0)-#E5)^`jtt~&TnB@+nO_*5RA}Dt&f>M8zASK zm72DU7z>B8$d-v7hSISp)9FVbgxo1Hak!NDnr?-%adrDy4l{cTvm@})R?M0ex0}9g z5jlzN%{O#Q{pm4W+4g{)-Ze69dF4J`0lQ#D&;j!pqp-{<^Ot9pCAV{S%CfD?pIoIn zuwbV@Aik`YL?eia2KT-X-U2Tn`V~1#FYx=T4PZr*H%_j)C+#rz_&+^xRU6gS{BR5J zuA$)m1SrrAh;?PZAJaeb7!zgxUZ9b$eDi+yqwn+-gNu?qUiRvcOQq^kJIv zeq{${z$OXMBg%2;Fqax|j-h>!c#LV0lhXK2)E%Ww)VQ-<#rKudsrs+WPb%xaYEjg> z+Iel?s_p7fw#?<<0<}a7g#e&xs=Cjh@4IF4yS}Wv{l(hv@q@4pbM<{rD?K@(a?`(F zka;dKknQ0s^PICOys!yOV4A~@19I9k_sZwboSh&3;Pc}_nP=YDuJJGRy6-9Ti7>^v z+rX;#nw(3zRyENd`|AN{e?MENe|q`y#4n0X#@JF9Qh@b@)2h@t>5Ca%+HJYfo` z!3A9@C3Y%uZYABjx)QH+XU+&^!8zX~y0HB`AeZ#0ZnxE?T?ZUL?#n0SQKK0_MbaW^ zeQj=5@vd!xFBcN3ND=u2g`MJ*jq|Pp>l4*ne`-3^x}b4jQtb$zufF3yryS|Q^kPiX5SxXK@9IDRWtfuW6 z%fi1|6;6)o3*GKvt=4qBYWM>yxS?s|w%FuPJ6>FO5$-QR{J0XUoL~2JvT@Gjo~fmC zqAJLvI_r3fZlq;YyCHb&l%LmpTtiv-hZE|o3MT|S#8^6H0@X%Lq`nf2y|J?WRA~`I z{a&&@Rg?$+AMJf-R8w2qt@WTs1yK-`5|o3Yl!$bYL{#7?3Zhb!5g zj|fp(6hu0qhaMFJLLdQ=8X?q#7DA{AX?I88@80jn{pFuKzA-Lq48~4KVXv|FdY)%K zbIz?cutW@5LPG@rYYhra6nZ%LD5g%ml3&3m8X+ry$^JEFzz3RJ+jYq_Tp|oM05KR*_1 ztu~5Z^^&RdG;-?Vv6}|GlLDU~j|^0Cn}-D97b~=BV$_H6z z9bKGb>e4nKhEP^Zmr(lWC;kQW+noa~0Q#}jUOjOuQ3balsP#1{&4SK5_H$ZGpNeeV zFP#L$?$*0eNBZlk#X-c5Rc|lLbi%ML%oca$*j!@$DjP+)e29H0*cSKD*`B@x znchHRQzpywa=D|T%p@Lx}%VZEb)I zKEE*JM~_a?&Xm1H_j7q~ZkRgR^386(h5i-k!~V4LFr)DhSGYT%#e0K=*C~{fc=%E= zPB`wmb%e+W8J_)=F36SgpL<0y#lF?)_1Y zxtd=AZ2`9?IdNwn2Mi3xr{KsB@#hx6KE#;pCe!8fLvwT<#R7|m<#OW;-Q$YfJ$nz` z2;kiWB^~3}*H9q?!v{8#Jt+0-H^jCz#C{wF6jt;T6r4kZ)C=DpFWcxt^lgz{;!9T@ z!tS?_{Qqqi`!n4g^5X*gUaroi(IeI7oQ^kscr$LF3Zl0nkU3d4%*UmA-JY6UyG}Op zx|A0ZJ`*Uz%yyPBn_E0hc{0L`vW#^GnTU{DTmqlb!P7GyTLnk^C(g+P`1F{E;CF{8 zAdBW(&E{`Zz*rYUqXU#J28-aC-YxthwOA=%u0!p^clrR)IKLrVR!(k6@X%qF@Q<<3ZPgvxU z8Q%HtqhB@&z-Xwamhp@EYS)9x_%*dln;dYUuXSs;GAx$O@UpX^e`ZMgJNBmS^3 z0<{R<&1E+@J%)d8t zWIImQt1XDmqkQFdT02>h#_Pw-UF~^bys5~xyseQ<4Kr)?Wd6cL)Zod~s5qzd+y2~^ zC$<$nVeEw$+pe8nx2ZvYovz3!B9Z6Nn{Us?g7s%6F4TJk`~!VXLiPr8IXQuA4GuSJ=;faGdpkNel?<;{Ou3sDAl-KUKTf=Ja;tCvn2Q$t1RJd~_A6#f#CYcx{ZV8C7; zfft#$c4<9?33uK5Xy0tsoa)UY#y%8#Gswy3OW4#+%CVH;{RYg+v^#bx7AF^VmV+JE z+Wk9_H^2J@M*yAS(Zn=BSZO?V{o);(Hx=YXmLNbMO_NVuh9rA8(KX4vb!{sS@~csS3D3d{#Mo?i zeQrJUt(SkA!kOUV9LoV572c?>bSw;=F6pDY7F0^GwqDbVb z=Xk~jxDxSo#4G*ZySFArK3jnCyL+#vV@FySGl`<^Nc*5#hZ?nA-=*@%u|~%eX(Kw% z?k?ZmzAbOJP&n}+?-K0X*eiu=!#^&d%pv=yHsKw)T)zpkz|_F>SSb|sODdy=TwI%e z&4_R$!7iCR6uw1IPhICe1u~deKjZ&dj_EGlC=d#FK%%q1c_w$Ff#$hj4&a!FOEe|V z1e_S+mde4mFEkGqQ;Sy#Fy$;s|Gryx^*RsLW=GuY8<&;ypuJy@@@kgFMRr)o{ERkh zXl`ZP#*l8sQi4++{O@mQbMeR)9WVI8XS|qhorMnhy?*pELNR(X)9=djrY<{jCr&RP zk4Kw)hfnC{W^!g)OfcbLo>hl`H;$j%^$6ynk6^`BN1fN^N|+~c>i6XWBJU^v2+vSMHlVPYIIqS_oYrCaR1!sP zkz=TH8aRdB$9|pyw?NFPasD%#Z^cY-GLks0P&Tm3WBb5yP^QnQp>1zN*9Y!#w(fH| z*gZ*_A-H3@zM#hs?q-$;t>5n|oh#2u$r60%0>scCV)m_*KO$pl^v(EB=P6WW zi;XSFB@&0R+EZ0`0&o{=W0Au~9}u1bRoGoV+)D>8AN}hPf~cAP^b?+~(N5P%5_(i= z2z1c8sG)3d{OC$?oBsZ0$eGerrL3^@XEC6IKFeKrH7Cb2`^ zf5-Y__5fm(IUW}{8fuC39nT)fh5R!sfE+DrH_gxul5@D&$51tgqNrTI$tXdMOGrle zoIvMv#zDo0dm39MhW?zF#68;WEsimA!y>I;WO9uFEp!nI-fhTe?ClD8nG{gC0|OG6 zV!C&Oh78t1n8rE9tfi43 z5<^@G4M{=kNFr3@icRZ2ju5h3ZAW;- zn(_5-eRHk^8c?scN{@5#>>`+o9@2+D!R-^i5QqT-WtMZ?si*JX7xfWRSAf7Ot(bw+ zL#}!41dL>1s8zPgp)V0S@orUli2)w_$Tu9*JrJ5m?QT=!x9C{75aT- zQpYb*EDW~|cds0m=dC9|?_niDn{{}xee$+!S}O|Img;@*lmK31u8||B@13f9e_oZ$ z*BUX^aDvl^CF%6SXy|#9@b4zG?CD5{W=B^}(I8g+t?C~#Nr$UVD7oq64)rLx1NYPq zcR)K6H?jw+EHx5+mNuWqIRW~It|lX8&^Kh;XSVELbJ-WYhjPn?Twf%=qQ6(jCR z^*!?nDgB-GDfm-4(A@m;_Z=X>_WTe3o8Hy=q@>xIbW+rd zrrMH)i!BywpF~WZVgsBf8LLq(*8?b%Q+*aaHO6M&-ixZt3uYkd0~*zsIL+bUrgv?9 zdN4+HT@-CMB0*}P!Fy$I(BqG}kw0_hc{(zJ=_du&3dBM++UsWg@9(`C5)5!w&1o5EHM?YEpLh)Ca>4ix zT6_?Ipf%dSq2`@C{4C3nL`sW90=vAH(Wv%G*nz|5f{dAkk2v%cbZNZnN8)Pyp)9cMTy-Pl)fcZUa4Lns>F5xFk%vJ3h3`n~j9^s+nRZ4`D@;a%rGF{FTHcOZGkj`h8f;Q#~8Z_`*T5$lb8H*uQIAS}Z4e)b?Z7M?hxq;YZJKpl4@EkZuJ@_Y`%BkKw@O-L>De-7XorGHjD^yFUiA@jMg7v!dC` zEALuR*~S3~)g3CB2lDG>(b}lYx{2603@cNR7d&Xo1$EJefdm^3#bH>z-ur8( z_IGbJ(b}?~v6}ywDQoc8Ki=L$Hu2w_-L8;dAq$Zw%|0G*zvFyJC#!Axr9gd-OaA7| zvDrLKdD_2*^yywLKQ_uUq_AG?r!8NI^?fz`uKppTIU4>32?9_{*s9<9!jQc9nolyH zkk^vCY+O*Oe~jA>4b$^i-Hbjmshzcl1#0I8c4mqQwr>4d9@9LCpk}Hbv=h>g{12vx z&S7zBUZpF=xb541p%%j5EopWWRmi0c>~zR|h281b*c6!UDwkKz%Kq~w1R;bWFmUCa zHle$LBLvoISh{C$mn1D|gw0^6kfH$pcW9Gz7EN8iOBe7*$$$ z6GViD2JufW#6_1xHC#hcP+h(o!2xV}>W}qPHN6EIime}%`qRCg)C{$ip3zn#zWhiy zqx+!^8czxaNOI2b9MK&CyCcH^;tI9%4fRKzUmRl9^TY-|8p7R^X4}jW06M;h@7M*5 z2)Cc2drtog$8D)K0Oh;b>|DB^-CXyJCeO_Wx+d$~8$AE9*ODs4zv*@GUTJ3xw}&4k z`{*)4bi=CjDmf_VdzTmLnt!5aa`r`B!wQ1%D4;|^rrLh;(#_^3*{yp&%2QmIwljyf zhz5f4_Q*#2VB}iag(Ghn1}~NwD<+sdbO>Fl={uq){3Fh5ayJCI+@^K=%3|_sZ$I8e9QSJlJ{cU& zzr)`dzkmdWU;(-SZ4R80Yn>lNo-t^FG{pA4br--j;+g_(ZObby6SOLfueckEhAmDV zrur8{4`(`O-ooGS{skTj5p4DSzshI#xGlm;H;g~_t2VB45OINZqEFjGZK=cKepKL_ zX)CnmaQ*|qaaY6^mY*beI6;bMgfYCX%1=GG>8REd0N!MPO4C2@NtQ)kQDr})O9+S< zUan=`jk^~!9BK|1N!YVQtgS5iqDF%O2OwbyJOB=Hj9^c9ZI@qq{F7SkhvST3c%~Q? zFfM4kc~6&aIC(OS*1VA0)kWHTM-{p%0o!QcN*7Qs@A^Orjed;y*nG>(%%vrj$c6{_ zrZXoW7a;+>`Z|{h_s-etp33wt$@P7f%<5VJU8(D`6Ujk*m@S)yfJFt78)Z*3H(^Jh zN{%Jk>4T@9ar7{oSMxa(Kp&D`n-x>?Flp-3{0Z3V5wadbAb~!~&vK8&ar78IZOb>f zBW>(*{Soi~|HS{FkN@|}AyY6X*&HsT*CD5`+@A#zw&A34#&4K(4Crn+2v~M6pqKQY-Az^c!YGpJe%aD&P8Ii0WzPhAD|rpE=Mz?+c9F>WR8`2w^#!@ z8u-{t?9~+W;EQ=wtHzW3Tz*oLChy5>-yI7+ZVB7HxJa@IuL!>uG9EOzqE}p+I;k}S z#sfr{@wy(7-%4r#oWE(8D#Eg4_D&<`unFV2n;%m5J0Ml%-1luNxv>(|kaIO$wkgA~ z;+=e6lE!E3O63Mpm$|l-%jHL4$QIK^W{Kneb1gM1w2ZF`Wn#M)=1ee}?nJE(91z7s zjAo2SlrTvVt2tdliR60rfVS=$;>+y3*6R(PTE4*#Xd`(a z0@KY?0BrF7N6B;hTcZkXBz0Moe|ix*@@5gMM?u z0OHltkM)73fUq?d_j!hU^P&Wd-=P?Mu+YvzmnlZBW9xQdi4hi|{rJQXXC-nDG4JfP z{evfV1kkf>J9|}1YqRx3*B|(;_1OlZ8Ue{uk`^MAOulUg_EK*+r5;kPbZC~ds84a` z+44JJ_vLvrX1dJtY@r7VHPLX<0|LlzbO0MchLa8>p0yLO9GuwoUH$z(eC4?1Skuxv z{X7<_9kk1_e?m*7K%d=q7UcX=?9QUSKv(?7pQGZnlSD(Qbf=e%UH)mcivdJ>yAS`i_1?#uJ68FVHw79I zx2gRppiAeJFp{2vnlkFk^J?r$^rZysr2ZxQ%AcfY(r$;bIi85c6q6$ z#rpZu#8E$z(FlQx>bQ`LRwyIv^3Y7wY5jvs&LJEg2hao0RX@YU>XE3+c@M#;0%a4OF* zYnFWi#dJxps2TnKbT9p8=rT)%9l(nT089@W>=36xySB6^zXL>{T zh#TL5itEkBIr+SqFDxqcgfLbh7)~99w>aRq^rx1f7rANK)duA=sj-^2Is-;y#$Aqq zl)<_Y`e30gB}ab9OF zXt&X2RZr#xVf*sPjzrCg zgGAoUIQpc<)qliU02}Ku9vna38FE%%P&M|DKTnmQQ34cH`^8I?%4@3PIwI?O2Si!` zvU2ODVZ3BXIpOG|JA3`TH0HtcV2-7(uAZRP>3~c}wral!Kue)GTR#8y6Ag|3tH=E? z5$NUgRkXAH>;QOhc>|3P8)HDZyl@}y?yQ39cZP^%VMk~LbaLWh9cw`x*HHeMf@5(& zNWntC2+WYf7T=2$&`}Ba;0rW$D>r6NZMdCO6QU|HDW~8)F7{3Vd zF6sJ$AiGdN*J<*NmR@TlHgC=?wt)k8 z+6jGOH?BHK4TI<7k~jIx}9sYRBy-CBl{is;*D4LZ&VWjA(PAY*d4HCCD^yH zHCv>=uv9GFI-c`fy--ix5Xf=we~HPCGULaprL7&M84Nu*55Tq>P8Ocr+2!}kanGC@ zliWco#D=R019lrBv%czho2Ib$Vz(M^4E1@ObQ+{`=Ws46SyOK(tWO--cp%_6dTNphM3Z?JUIBp)UV8s(&jX;g%e_v<0U_ zB-lbJfToc#6yR@My>!v|=9G5;>lDg11o>V}Rg3@rpxRK;;_2I;aR^I}!^EHdVa+j( zOzq4L#lpe=IuqZtEWvTKprsmH% z{O1|r?LAh?bIO$p4N#f3yboF~7lk(n30v@Z@Vt=d3aCj=CP)kK(g6h-9jV(NdFT)%GI_FwwSar#D0KX=6e}dO`s=XtJTvF^1Eh{(e@mb{hh4o^@~lu z{t*PzzfrskX#d!w;Wht4Xg1A&i6?PoO7`e{_Ol83R7ROj6q*)jKP_pUs2XbTTDg0T zyBznLDPOobtN)6^d!H;g{(Z6*?GpQc=1rFKLegIAkrlvhwQ689V#K4kHOkdNyX<>J z|LTp-n7>!KTWuT(BuM@w#jNKMXWb%foUkWh^B1OSdF$kcJx(C*m@*OR1l zAYld60=+vg;UxU7&|GDXUS79CuPJ5f8f#Rd$uTJSS0xT`rWVX6r`%3vk?Y_~KOYk( zU*a0C8JJE)S$}PKjLRy?N0fTrrGLJ(c%uM1WEy76(G3nXdrMbv4(;_VeTcIBBE@jdy}^&NjK_Sk zU9Z?TMCWWO@hes`hy+MJxxV=eL1!+OZ68+AymFs&03>nQM5B@t3zyM_?pbT&g>l=F zj@;|vfTZ2 z_PUUY66E4iefK~=x~0sTFOA(3v3BeY?FD?sx3kod?)r?N4htuaAM|$&mwojTIicG`t%&fv9I;WAA#7BeJ-dOm(cO~^BYC} zGlz!Op9VIJ)i}-=T6vx}_}ygx|ArOUzS?i+aHyg9x%nNT(=uoJwr#akojL+=!5UpZ zGdM!m4I05dR)j$s=F(KiGWI^xMI|sN*4$!nHTS$k!shsA+lz5B@cP_CTHN~6+3?2} zpvY{<%uCzS7|j}1RMkt%DcBclmCH6WI>rir^x$i!u#+ZOm7F&ai}Q?%dU0J4IH@R+ zknN*-3&LYrNA=WR4K7o5(>>DQLlNBAT2PpNjTdkAKGzD-5MP;*^UfyyyJ>J~j$>d6 zNo8Gp@VX>hGCEfQ*B{us{_68P6~!$zt`6P5tlGbee|1l?+KLxV+#?~-1! zqXL-rIs_=A4cY5SIM({vg&7*;Z6)QZ?a86E4GT<0@$RcE1pLB6SrT-hjS}ISx6Vd0 z*RamZV7|<~u^Qzu@L$qG^TR#G(A&n_`P|#yqj;`;v7H=*P_D`5b^%#erR)Xc zehf4%JZ`8~`uQgm;AOzSbykqel)B+CS)T*v&2d3!+;g1Z4UWdJ|Iv?mbzwQWVE7P( zi1~7@GdFS=tZGxJqRP}GR?~6NtkXNp{{vw#(+_nv zK<^eze?T=PL+Z^R-aSb#P~me9_xx`KO1X;X_W745!&O=%B=?Cm)FvO?uvB-@qx3}i ha~kOBw3mE=h;%&Co(j5^y#@HWWMXl#^!%MC{|m_*TK)h4 literal 0 HcmV?d00001 diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 235c639602..d79a4a4bff 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -39,7 +39,8 @@ } }, "files": [ - "dist" + "dist", + "config.d.ts" ], "scripts": { "build": "backstage-cli package build", @@ -51,6 +52,7 @@ "test": "backstage-cli package test" }, "dependencies": { + "@backstage/core-compat-api": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", @@ -60,6 +62,7 @@ "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.57", + "lodash": "^4.17.21", "react-json-view": "^1.21.3", "react-use": "^17.2.4" }, @@ -67,6 +70,7 @@ "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", + "@types/lodash": "^4.14.151", "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", @@ -82,5 +86,6 @@ "@types/react": { "optional": true } - } + }, + "configSchema": "config.d.ts" } diff --git a/plugins/devtools/report.api.md b/plugins/devtools/report.api.md index e7a42f4377..e4cfe7ddde 100644 --- a/plugins/devtools/report.api.md +++ b/plugins/devtools/report.api.md @@ -9,6 +9,7 @@ import { JSX as JSX_2 } from 'react/jsx-runtime'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { TabProps } from '@material-ui/core/Tab'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; // @public (undocumented) export const ConfigContent: () => JSX_2.Element; @@ -43,6 +44,16 @@ export const ExternalDependenciesContent: () => JSX_2.Element; // @public (undocumented) export const InfoContent: () => JSX_2.Element; +// @public (undocumented) +export const ScheduledTaskDetailPanel: ({ + rowData, +}: { + rowData: TaskApiTasksResponse; +}) => JSX_2.Element; + +// @public (undocumented) +export const ScheduledTasksContent: () => JSX_2.Element; + // @public (undocumented) export type SubRoute = { path: string; diff --git a/plugins/devtools/src/api/DevToolsApi.ts b/plugins/devtools/src/api/DevToolsApi.ts index ff58a4ea16..4f58f013d4 100644 --- a/plugins/devtools/src/api/DevToolsApi.ts +++ b/plugins/devtools/src/api/DevToolsApi.ts @@ -19,6 +19,8 @@ import { ConfigInfo, DevToolsInfo, ExternalDependency, + ScheduledTasks, + TriggerScheduledTask, } from '@backstage/plugin-devtools-common'; export const devToolsApiRef = createApiRef({ @@ -29,4 +31,9 @@ export interface DevToolsApi { getConfig(): Promise; getExternalDependencies(): Promise; getInfo(): Promise; + getScheduledTasksByPlugin(plugin: string): Promise; + triggerScheduledTask( + plugin: string, + taskId: string, + ): Promise; } diff --git a/plugins/devtools/src/api/DevToolsClient.ts b/plugins/devtools/src/api/DevToolsClient.ts index e0b387a6ca..5e13202099 100644 --- a/plugins/devtools/src/api/DevToolsClient.ts +++ b/plugins/devtools/src/api/DevToolsClient.ts @@ -19,6 +19,8 @@ import { ConfigInfo, DevToolsInfo, ExternalDependency, + ScheduledTasks, + TriggerScheduledTask, } from '@backstage/plugin-devtools-common'; import { ResponseError } from '@backstage/errors'; import { DevToolsApi } from './DevToolsApi'; @@ -42,6 +44,45 @@ export class DevToolsClient implements DevToolsApi { return configInfo; } + public async getScheduledTasksByPlugin( + plugin: string, + ): Promise { + const baseUrl = `${await this.discoveryApi.getBaseUrl(plugin)}/`; + const url = new URL('.backstage/scheduler/v1/tasks', baseUrl); + + const response = await this.fetchApi.fetch(url.toString()); + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + const scheduledTasks = await response.json(); + return { + scheduledTasks: scheduledTasks.tasks, + }; + } + + public async triggerScheduledTask( + plugin: string, + taskId: string, + ): Promise { + const baseUrl = `${await this.discoveryApi.getBaseUrl(plugin)}/`; + const url = new URL( + `.backstage/scheduler/v1/tasks/${taskId}/trigger`, + baseUrl, + ); + + const response = await this.fetchApi.fetch(url.toString(), { + method: 'POST', + }); + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + return response.json() as Promise; + } + public async getExternalDependencies(): Promise< ExternalDependency[] | undefined > { diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx new file mode 100644 index 0000000000..b26abca221 --- /dev/null +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx @@ -0,0 +1,104 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import Box from '@material-ui/core/Box'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; +import Alert from '@material-ui/lab/Alert'; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + detailPanel: { + padding: theme.spacing(2), + backgroundColor: theme.palette.background.default, + }, + detailLabel: { + fontWeight: 'bold', + marginRight: theme.spacing(1), + }, + errorIcon: { + color: theme.palette.error.main, + marginRight: theme.spacing(1), + fontSize: '1.2rem', + }, + detailPanelAlert: { + marginBottom: theme.spacing(2), + }, + }), +); + +/** @public */ +export const ScheduledTaskDetailPanel = ({ + rowData, +}: { + rowData: TaskApiTasksResponse; +}) => { + const classes = useStyles(); + const lastRunError = rowData.taskState?.lastRunError; + + const DetailItem = ({ title, value }: { title: string; value: any }) => ( + <> + + + {title}: + + + + + {value || 'N/A'} + + + + ); + + return ( + + {lastRunError && ( + + Last Run Error: {lastRunError} + + )} + + + + + + + + + + ); +}; diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx new file mode 100644 index 0000000000..29822b90f9 --- /dev/null +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx @@ -0,0 +1,285 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useState } from 'react'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; +import IconButton from '@material-ui/core/IconButton'; +import Tooltip from '@material-ui/core/Tooltip'; +import Autocomplete from '@material-ui/lab/Autocomplete'; +import TextField from '@material-ui/core/TextField'; +import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; +import { Progress, Table, TableColumn } from '@backstage/core-components'; +import Alert from '@material-ui/lab/Alert'; +import { useScheduledTasks, useTriggerScheduledTask } from '../../../hooks'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api'; +import RefreshIcon from '@material-ui/icons/Refresh'; +import NightsStay from '@material-ui/icons/NightsStay'; +import Error from '@material-ui/icons/Error'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import { ScheduledTaskDetailPanel } from './ScheduledTaskDetailedPanel'; +import { RequirePermission } from '@backstage/plugin-permission-react'; +import { devToolsTaskSchedulerCreatePermission } from '@backstage/plugin-devtools-common'; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + paperStyle: { + display: 'flex', + marginBottom: theme.spacing(2), + }, + flexContainer: { + display: 'flex', + flexDirection: 'row', + padding: 0, + }, + formControl: { + minWidth: 240, + marginBottom: theme.spacing(2), + }, + detailPanel: { + padding: theme.spacing(2), + backgroundColor: theme.palette.background.default, + }, + detailLabel: { + fontWeight: 'bold', + marginRight: theme.spacing(1), + }, + errorIcon: { + color: theme.palette.error.main, + marginRight: theme.spacing(1), + fontSize: '1.2rem', + }, + detailPanelAlert: { + marginBottom: theme.spacing(2), + }, + }), +); + +const StatusDisplay = ({ + icon, + text, +}: { + icon: React.ReactNode; + text: string; +}) => ( + + {icon} + + {text} + + +); + +/** @public */ +export const ScheduledTasksContent = () => { + const classes = useStyles(); + const configApi = useApi(configApiRef); + const alertApi = useApi(alertApiRef); + const plugins = + configApi.getOptionalStringArray('devTools.scheduledTasks.plugins') || []; + const [selectedPlugin, setSelectedPlugin] = useState(plugins[0] || ''); + const { scheduledTasks, loading, error } = useScheduledTasks(selectedPlugin); + const { triggerTask, isTriggering, triggerError } = useTriggerScheduledTask(); + + const [inputValue, setInputValue] = useState(''); + + const handleAutocompleteChange = (_event: any, newValue: string | null) => { + setSelectedPlugin(newValue || ''); + }; + + const handleCommitChange = () => { + if (inputValue !== selectedPlugin) { + setSelectedPlugin(inputValue); + } + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + if (event.key === 'Enter') { + handleCommitChange(); + // Prevent Autocomplete's default behavior (which might select a filtered item) + event.preventDefault(); + event.stopPropagation(); + } + }; + + if (!plugins || plugins.length === 0) { + return ( + + No plugins configured for scheduled tasks. Please configure + `devTools.scheduledTasks.plugins` in app-config.yaml. + + ); + } + + const columns: TableColumn[] = [ + { + title: 'Task ID', + field: 'taskId', + width: '35%', + render: (rowData: TaskApiTasksResponse) => { + const errorIconStyle: React.CSSProperties = { + color: '#f44336', + marginRight: '8px', + fontSize: '1.2rem', + verticalAlign: 'middle', + }; + + return ( + + {rowData.taskState?.lastRunError && ( + + )} + {rowData.taskId} + + ); + }, + }, + { + title: 'Status', + field: 'taskState.status', + width: '15%', + render: (rowData: TaskApiTasksResponse) => { + const status = rowData.taskState?.status; + + if (status === 'idle') { + return ( + } text="Idle" /> + ); + } + + if (status === 'running') { + return ( + } + text="Running" + /> + ); + } + + return {status || 'N/A'}; + }, + }, + { + title: 'Last Run', + field: 'taskState.lastRunEndedAt', + width: '25%', + render: (rowData: TaskApiTasksResponse) => + rowData.taskState?.lastRunEndedAt + ? new Date(rowData.taskState.lastRunEndedAt).toLocaleString() + : 'N/A', + }, + { + title: 'Next Run', + width: '15%', + render: (rowData: TaskApiTasksResponse) => + rowData.taskState?.status === 'idle' && rowData.taskState.startsAt + ? new Date(rowData.taskState.startsAt).toLocaleString() + : 'N/A', + }, + { + title: 'Actions', + render: (rowData: TaskApiTasksResponse) => ( + + + { + triggerTask(selectedPlugin, rowData.taskId); + if (isTriggering) { + ; + } + if (triggerError) { + alertApi.post({ + message: `Error triggering task ${rowData.taskId}: ${error}`, + severity: 'error', + }); + } else { + alertApi.post({ + message: `Successfully triggered task ${rowData.taskId}`, + severity: 'success', + }); + } + }} + > + + + + + ), + sorting: false, + width: '10%', + }, + ]; + + return ( + + { + setInputValue(newInputValue); + }} + renderInput={params => ( + + )} + /> + + {loading && } + + {error && ( + + The plugin ID "{selectedPlugin}" doesn't have any scheduled tasks or + may contain a typo. Please verify the plugin ID is correct and that + the plugin has registered scheduled tasks. + + )} + + {!loading && !error && ( + + No scheduled tasks found for {selectedPlugin}. + + } + detailPanel={({ rowData }) => { + return ; + }} + /> + )} + + ); +}; diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/fixtures/scheduledTasksErrors.json b/plugins/devtools/src/components/Content/ScheduledTasksContent/fixtures/scheduledTasksErrors.json new file mode 100644 index 0000000000..89f81b740d --- /dev/null +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/fixtures/scheduledTasksErrors.json @@ -0,0 +1,205 @@ +{ + "tasks": [ + { + "taskId": "cool-provider", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT60M" + }, + "taskState": { + "status": "running", + "startedAt": "2025-10-31T21:02:36.461+00:00", + "timesOutAt": "2025-10-31T22:02:36.461+00:00", + "lastRunEndedAt": "2025-10-31T19:57:15.674+00:00", + "lastRunError": "{\"name\":\"error\",\"message\":\"insert into \\\"refresh_state\\\" (\\\"entity_id\\\", \\\"entity_ref\\\", \\\"errors\\\", \\\"last_discovery_at\\\", \\\"location_key\\\", \\\"next_update_at\\\", \\\"unprocessed_entity\\\", \\\"unprocessed_hash\\\") values ($1, $2, $3, CURRENT_TIMESTAMP, $4, CURRENT_TIMESTAMP, $5, $6), ($7, $8, $9, CURRENT_TIMESTAMP, $10, CURRENT_TIMESTAMP, $11, $12), ($13, $14, $15, CURRENT_TIMESTAMP, $16, CURRENT_TIMESTAMP, $17, $18), ($19, $20, $21, CURRENT_TIMESTAMP, $22, CURRENT_TIMESTAMP, $23, $24), ($25, $26, $27, CURRENT_TIMESTAMP, $28, CURRENT_TIMESTAMP, $29, $30), ($31, $32, $33, CURRENT_TIMESTAMP, $34, CURRENT_TIMESTAMP, $35, $36), ($37, $38, $39, CURRENT_TIMESTAMP, $40, CURRENT_TIMESTAMP, $41, $42), ($43, $44, $45, CURRENT_TIMESTAMP, $46, CURRENT_TIMESTAMP, $47, $48), ($49, $50, $51, CURRENT_TIMESTAMP, $52, CURRENT_TIMESTAMP, $53, $54), ($55, $56, $57, CURRENT_TIMESTAMP, $58, CURRENT_TIMESTAMP, $59, $60), ($61, $62, $63, CURRENT_TIMESTAMP, $64, CURRENT_TIMESTAMP, $65, $66), ($67, $68, $69, CURRENT_TIMESTAMP, $70, CURRENT_TIMESTAMP, $71, $72), ($73, $74, $75, CURRENT_TIMESTAMP, $76, CURRENT_TIMESTAMP, $77, $78), ($79, $80, $81, CURRENT_TIMESTAMP, $82, CURRENT_TIMESTAMP, $83, $84), ($85, $86, $87, CURRENT_TIMESTAMP, $88, CURRENT_TIMESTAMP, $89, $90), ($91, $92, $93, CURRENT_TIMESTAMP, $94, CURRENT_TIMESTAMP, $95, $96), ($97, $98, $99, CURRENT_TIMESTAMP, $100, CURRENT_TIMESTAMP, $101, $102), ($103, $104, $105, CURRENT_TIMESTAMP, $106, CURRENT_TIMESTAMP, $107, $108), ($109, $110, $111, CURRENT_TIMESTAMP, $112, CURRENT_TIMESTAMP, $113, $114), ($115, $116, $117, CURRENT_TIMESTAMP, $118, CURRENT_TIMESTAMP, $119, $120), ($121, $122, $123, CURRENT_TIMESTAMP, $124, CURRENT_TIMESTAMP, $125, $126), ($127, $128, $129, CURRENT_TIMESTAMP, $130, CURRENT_TIMESTAMP, $131, $132), ($133, $134, $135, CURRENT_TIMESTAMP, $136, CURRENT_TIMESTAMP, $137, $138), ($139, $140, $141, CURRENT_TIMESTAMP, $142, CURRENT_TIMESTAMP, $143, $144), ($145, $146, $147, CURRENT_TIMESTAMP, $148, CURRENT_TIMESTAMP, $149, $150), ($151, $152, $153, CURRENT_TIMESTAMP, $154, CURRENT_TIMESTAMP, $155, $156), ($157, $158, $159, CURRENT_TIMESTAMP, $160, CURRENT_TIMESTAMP, $161, $162), ($163, $164, $165, CURRENT_TIMESTAMP, $166, CURRENT_TIMESTAMP, $167, $168), ($169, $170, $171, CURRENT_TIMESTAMP, $172, CURRENT_TIMESTAMP, $173, $174), ($175, $176, $177, CURRENT_TIMESTAMP, $178, CURRENT_TIMESTAMP, $179, $180), ($181, $182, $183, CURRENT_TIMESTAMP, $184, CURRENT_TIMESTAMP, $185, $186), ($187, $188, $189, CURRENT_TIMESTAMP, $190, CURRENT_TIMESTAMP, $191, $192), ($193, $194, $195, CURRENT_TIMESTAMP, $196, CURRENT_TIMESTAMP, $197, $198), ($199, $200, $201, CURRENT_TIMESTAMP, $202, CURRENT_TIMESTAMP, $203, $204), ($205, $206, $207, CURRENT_TIMESTAMP, $208, CURRENT_TIMESTAMP, $209, $210), ($211, $212, $213, CURRENT_TIMESTAMP, $214, CURRENT_TIMESTAMP, $215, $216), ($217, $218, $219, CURRENT_TIMESTAMP, $220, CURRENT_TIMESTAMP, $221, $222), ($223, $224, $225, CURRENT_TIMESTAMP, $226, CURRENT_TIMESTAMP, $227, $228), ($229, $230, $231, CURRENT_TIMESTAMP, $232, CURRENT_TIMESTAMP, $233, $234), ($235, $236, $237, CURRENT_TIMESTAMP, $238, CURRENT_TIMESTAMP, $239, $240), ($241, $242, $243, CURRENT_TIMESTAMP, $244, CURRENT_TIMESTAMP, $245, $246), ($247, $248, $249, CURRENT_TIMESTAMP, $250, CURRENT_TIMESTAMP, $251, $252), ($253, $254, $255, CURRENT_TIMESTAMP, $256, CURRENT_TIMESTAMP, $257, $258), ($259, $260, $261, CURRENT_TIMESTAMP, $262, CURRENT_TIMESTAMP, $263, $264), ($265, $266, $267, CURRENT_TIMESTAMP, $268, CURRENT_TIMESTAMP, $269, $270), ($271, $272, $273, CURRENT_TIMESTAMP, $274, CURRENT_TIMESTAMP, $275, $276), ($277, $278, $279, CURRENT_TIMESTAMP, $280, CURRENT_TIMESTAMP, $281, $282), ($283, $284, $285, CURRENT_TIMESTAMP, $286, CURRENT_TIMESTAMP, $287, $288), ($289, $290, $291, CURRENT_TIMESTAMP, $292, CURRENT_TIMESTAMP, $293, $294), ($295, $296, $297, CURRENT_TIMESTAMP, $298, CURRENT_TIMESTAMP, $299, $300) - value too long for type character varying(255)\",\"length\":99,\"severity\":\"ERROR\",\"code\":\"22001\",\"file\":\"varchar.c\",\"line\":\"637\",\"routine\":\"varchar\"}" + }, + "workerState": { + "status": "running" + } + }, + { + "taskId": "some-provider", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT24H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-11-01T21:02:34.850+00:00", + "lastRunEndedAt": "2025-10-31T21:02:35.556+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "three-provider", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT30M", + "timeoutAfterDuration": "PT2M" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-10-31T21:16:04.145+00:00", + "lastRunEndedAt": "2025-10-31T20:46:09.184+00:00", + "lastRunError": "{\"name\":\"TypeError\",\"message\":\"String.prototype.replaceAll called with a non-global RegExp argument\"}" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "a-provider", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT60M", + "timeoutAfterDuration": "PT24H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-10-31T21:16:04.152+00:00", + "lastRunEndedAt": "2025-10-31T20:16:08.713+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "github-provider:provider123:refresh", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT1H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-11-01T18:16:04.153+00:00", + "lastRunEndedAt": "2025-10-31T18:18:56.176+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "github-provider:provider123:refresh", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT1H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-11-01T18:16:04.156+00:00", + "lastRunEndedAt": "2025-10-31T18:16:04.264+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "github-provider:provider234:refresh", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT1H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-11-01T18:16:04.157+00:00", + "lastRunEndedAt": "2025-10-31T18:16:08.564+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "github-provider:provider567:refresh", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT1H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-11-01T18:16:04.154+00:00", + "lastRunEndedAt": "2025-10-31T18:16:06.978+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "github-provider:provider910:refresh", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT1H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-11-01T18:16:04.160+00:00", + "lastRunEndedAt": "2025-10-31T18:16:08.573+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "github-provider:provider000:refresh", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT24H", + "timeoutAfterDuration": "PT1H" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-11-01T18:16:04.161+00:00", + "lastRunEndedAt": "2025-10-31T18:18:54.339+00:00" + }, + "workerState": { + "status": "idle" + } + }, + { + "taskId": "catalog_orphan_cleanup", + "pluginId": "catalog", + "scope": "global", + "settings": { + "version": 2, + "cadence": "PT30S", + "timeoutAfterDuration": "PT24S" + }, + "taskState": { + "status": "idle", + "startsAt": "2025-10-31T21:06:35.672+00:00", + "lastRunEndedAt": "2025-10-31T21:06:09.106+00:00" + }, + "workerState": { + "status": "idle" + } + } + ] +} diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/index.ts b/plugins/devtools/src/components/Content/ScheduledTasksContent/index.ts new file mode 100644 index 0000000000..dff8bcf653 --- /dev/null +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { ScheduledTasksContent } from './ScheduledTasksContent'; +export { ScheduledTaskDetailPanel } from './ScheduledTaskDetailedPanel'; diff --git a/plugins/devtools/src/components/Content/index.ts b/plugins/devtools/src/components/Content/index.ts index f5bd64f7c0..964e7116d9 100644 --- a/plugins/devtools/src/components/Content/index.ts +++ b/plugins/devtools/src/components/Content/index.ts @@ -17,3 +17,4 @@ export * from './ConfigContent'; export * from './InfoContent'; export * from './ExternalDependenciesContent'; +export * from './ScheduledTasksContent'; diff --git a/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx b/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx index b4e5d3db5b..11cba0213b 100644 --- a/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx +++ b/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx @@ -17,12 +17,14 @@ import { devToolsConfigReadPermission, devToolsInfoReadPermission, + devToolsTaskSchedulerReadPermission, } from '@backstage/plugin-devtools-common'; import { ConfigContent } from '../Content/ConfigContent'; import { DevToolsLayout } from '../DevToolsLayout'; import { InfoContent } from '../Content/InfoContent'; import { RequirePermission } from '@backstage/plugin-permission-react'; +import { ScheduledTasksContent } from '../Content/ScheduledTasksContent'; /** @public */ export const DefaultDevToolsPage = () => ( @@ -37,5 +39,10 @@ export const DefaultDevToolsPage = () => ( + + + + + ); diff --git a/plugins/devtools/src/hooks/index.ts b/plugins/devtools/src/hooks/index.ts index bb2e83d06f..105d03fb68 100644 --- a/plugins/devtools/src/hooks/index.ts +++ b/plugins/devtools/src/hooks/index.ts @@ -17,3 +17,5 @@ export { useConfig } from './useConfig'; export { useExternalDependencies } from './useExternalDependencies'; export { useInfo } from './useInfo'; +export { useScheduledTasks } from './useScheduledTasks'; +export { useTriggerScheduledTask } from './useTriggerScheduledTask'; diff --git a/plugins/devtools/src/hooks/useScheduledTasks.ts b/plugins/devtools/src/hooks/useScheduledTasks.ts new file mode 100644 index 0000000000..2797526dec --- /dev/null +++ b/plugins/devtools/src/hooks/useScheduledTasks.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { devToolsApiRef } from '../api'; +import { useApi } from '@backstage/core-plugin-api'; +import useAsync from 'react-use/esm/useAsync'; + +export const useScheduledTasks = (plugin: string) => { + const api = useApi(devToolsApiRef); + + const { + value, + loading, + error: asyncError, + } = useAsync(async () => { + return api.getScheduledTasksByPlugin(plugin); + }, [api, plugin]); + + if (asyncError) { + return { + scheduledTasks: undefined, + loading: false, + error: asyncError.message, + }; + } + + return { + scheduledTasks: value?.scheduledTasks, + loading, + error: value?.error, + }; +}; diff --git a/plugins/devtools/src/hooks/useTriggerScheduledTask.ts b/plugins/devtools/src/hooks/useTriggerScheduledTask.ts new file mode 100644 index 0000000000..d26b7a8025 --- /dev/null +++ b/plugins/devtools/src/hooks/useTriggerScheduledTask.ts @@ -0,0 +1,46 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useState, useCallback } from 'react'; +import { devToolsApiRef } from '../api'; +import { useApi } from '@backstage/core-plugin-api'; + +export const useTriggerScheduledTask = () => { + const api = useApi(devToolsApiRef); + const [isTriggering, setIsTriggering] = useState(false); + const [error, setError] = useState(); + + const triggerTask = useCallback( + async (plugin: string, taskId: string) => { + setIsTriggering(true); + setError(undefined); + + try { + await api.triggerScheduledTask(plugin, taskId); + } catch (e) { + setError(e); + } finally { + setIsTriggering(false); + } + }, + [api], + ); + + return { + triggerTask, + isTriggering, + triggerError: error?.message, + }; +}; diff --git a/yarn.lock b/yarn.lock index 3502df3388..ba24848237 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5473,6 +5473,7 @@ __metadata: resolution: "@backstage/plugin-devtools@workspace:plugins/devtools" dependencies: "@backstage/cli": "workspace:^" + "@backstage/core-compat-api": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" @@ -5484,7 +5485,9 @@ __metadata: "@material-ui/icons": "npm:^4.9.1" "@material-ui/lab": "npm:^4.0.0-alpha.57" "@testing-library/jest-dom": "npm:^6.0.0" + "@types/lodash": "npm:^4.14.151" "@types/react": "npm:^18.0.0" + lodash: "npm:^4.17.21" react: "npm:^18.0.2" react-dom: "npm:^18.0.2" react-json-view: "npm:^1.21.3" From dd00a797e85299976de2ffac71fc248748135894 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 08:59:06 +0000 Subject: [PATCH 245/312] chore(deps): update dependency @base-ui-components/react to v1.0.0-rc.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index ecb67f4ded..fbcbbe3fef 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -31,11 +31,11 @@ __metadata: linkType: hard "@base-ui-components/react@npm:^1.0.0-beta.4": - version: 1.0.0-beta.7 - resolution: "@base-ui-components/react@npm:1.0.0-beta.7" + version: 1.0.0-rc.0 + resolution: "@base-ui-components/react@npm:1.0.0-rc.0" dependencies: "@babel/runtime": "npm:^7.28.4" - "@base-ui-components/utils": "npm:0.2.1" + "@base-ui-components/utils": "npm:0.2.2" "@floating-ui/react-dom": "npm:^2.1.6" "@floating-ui/utils": "npm:^0.2.10" reselect: "npm:^5.1.1" @@ -48,13 +48,13 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/14a446e7ff58a8eab6bb81ee32fc8f49bea8e0e3f188aa023f24c5382d9d76b97886f1828ef8fe2532720fc6512f52b88587220a47e4009b1d8febc904d5cf1a + checksum: 10/ea22dd8206962a1b74fea30f4b20f8b5995bd20155466a5ee7fc7a59cc1632e2ba9615094eac9983dbf8387e50daa8b078024da85b3a8d60cdbc43fb1cfc3b50 languageName: node linkType: hard -"@base-ui-components/utils@npm:0.2.1": - version: 0.2.1 - resolution: "@base-ui-components/utils@npm:0.2.1" +"@base-ui-components/utils@npm:0.2.2": + version: 0.2.2 + resolution: "@base-ui-components/utils@npm:0.2.2" dependencies: "@babel/runtime": "npm:^7.28.4" "@floating-ui/utils": "npm:^0.2.10" @@ -67,7 +67,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/fcf0dbf38bb6b8318174e419b3c7d4f6e044cbafe137ec499a2daddc482b317e936519f414335a6485d1721076c8e57fdc5b206f7845a44689fcfec1d81a659e + checksum: 10/a67803b5637cfce1071963f958306f90784f7934ae0b072b450dbf7f2e3423ea9b40e420672849cfcf2965c94ac5960d2c6a5e04e359f1f76166b929dda932a2 languageName: node linkType: hard From 38eec04d9e867d5c5e733fc08d91bb570b285c80 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:19:11 +0000 Subject: [PATCH 246/312] chore(deps): update dependency keyv to v5.5.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 9d955a13ec..04df44aca6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36047,11 +36047,11 @@ __metadata: linkType: hard "keyv@npm:*, keyv@npm:^5.2.1": - version: 5.5.4 - resolution: "keyv@npm:5.5.4" + version: 5.5.5 + resolution: "keyv@npm:5.5.5" dependencies: "@keyv/serialize": "npm:^1.1.1" - checksum: 10/2ee2178657b3f220cc7130727a1f9e65d05f2115c924af82e6f53e2c8b0197795a55fe7d4e6041ba712a6748039e5a4f7f50ad708bffb8bcc407b0dd0678dfa4 + checksum: 10/4bbc2119151d67bfc04d3a08fc98f4efac5e171e8c99519fc7bc9ae9e05df4d1c6c835a5d133d563ed109a20db4688f3f9738400cbd3674f6303cdfc4490d429 languageName: node linkType: hard From 6c3a7f1a843c11ef2ce59198ba1e11f716cf54dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:40:50 +0000 Subject: [PATCH 247/312] chore(deps): update dependency ldapts to v8.0.12 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 81 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9d955a13ec..02e96cb25c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27839,7 +27839,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": +"debug@npm:4, debug@npm:4.4.3, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -27863,18 +27863,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.4.1": - version: 4.4.1 - resolution: "debug@npm:4.4.1" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10/8e2709b2144f03c7950f8804d01ccb3786373df01e406a0f66928e47001cf2d336cbed9ee137261d4f90d68d8679468c755e3548ed83ddacdc82b194d2468afe - languageName: node - linkType: hard - "debug@npm:^3.1.1, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -36281,16 +36269,15 @@ __metadata: linkType: hard "ldapts@npm:^8.0.6": - version: 8.0.9 - resolution: "ldapts@npm:8.0.9" + version: 8.0.16 + resolution: "ldapts@npm:8.0.16" dependencies: "@types/asn1": "npm:>=0.2.4" asn1: "npm:0.2.6" - debug: "npm:4.4.1" + debug: "npm:4.4.3" strict-event-emitter-types: "npm:2.0.0" - uuid: "npm:11.1.0" - whatwg-url: "npm:14.2.0" - checksum: 10/512bfec21e2c5d8a257ffda0c426221023043718b235dcc21d5ea81ba43d1999a2f14c1e9d6f7db7af1af2c467b46ee7016cac8da74ebae900fe208c54435b0e + whatwg-url: "npm:15.1.0" + checksum: 10/06f4780f9fccdcfbb1610bb1cd119e3ac6bf6355c364ac0f8f287d43b9dc0ee82ad7347383864136a1c211d60b5a594787acae9fcf01fb4c9214879962b882a6 languageName: node linkType: hard @@ -47753,6 +47740,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^6.0.0": + version: 6.0.0 + resolution: "tr46@npm:6.0.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10/e6d402eb2b780a40042f327f77b4ae316da1d2b18a29c16e48c239f5267c6005bbf780f854179cfae62b02dfaa70b0e9aad8f0078ccc4225f5b3b3b131928e8f + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -49133,15 +49129,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:11.1.0, uuid@npm:^11.0.0, uuid@npm:^11.0.2, uuid@npm:^11.0.3": - version: 11.1.0 - resolution: "uuid@npm:11.1.0" - bin: - uuid: dist/esm/bin/uuid - checksum: 10/d2da43b49b154d154574891ced66d0c83fc70caaad87e043400cf644423b067542d6f3eb641b7c819224a7cd3b4c2f21906acbedd6ec9c6a05887aa9115a9cf5 - languageName: node - linkType: hard - "uuid@npm:8.3.2, uuid@npm:^8.0.0, uuid@npm:^8.3.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" @@ -49160,6 +49147,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^11.0.0, uuid@npm:^11.0.2, uuid@npm:^11.0.3": + version: 11.1.0 + resolution: "uuid@npm:11.1.0" + bin: + uuid: dist/esm/bin/uuid + checksum: 10/d2da43b49b154d154574891ced66d0c83fc70caaad87e043400cf644423b067542d6f3eb641b7c819224a7cd3b4c2f21906acbedd6ec9c6a05887aa9115a9cf5 + languageName: node + linkType: hard + "uuid@npm:^3.4.0": version: 3.4.0 resolution: "uuid@npm:3.4.0" @@ -49552,6 +49548,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^8.0.0": + version: 8.0.0 + resolution: "webidl-conversions@npm:8.0.0" + checksum: 10/8138d1b291c8f311d93de680653b13b04560aa35d83f9606642e746fca39d7dab9cddd9282ade21774115ea332b8b11f008106b82d4a0125e98a49479381aeee + languageName: node + linkType: hard + "webpack-dev-middleware@npm:^7.4.2": version: 7.4.2 resolution: "webpack-dev-middleware@npm:7.4.2" @@ -49728,13 +49731,13 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:14.2.0, whatwg-url@npm:^14.0.0": - version: 14.2.0 - resolution: "whatwg-url@npm:14.2.0" +"whatwg-url@npm:15.1.0": + version: 15.1.0 + resolution: "whatwg-url@npm:15.1.0" dependencies: - tr46: "npm:^5.1.0" - webidl-conversions: "npm:^7.0.0" - checksum: 10/f0a95b0601c64f417c471536a2d828b4c16fe37c13662483a32f02f183ed0f441616609b0663fb791e524e8cd56d9a86dd7366b1fc5356048ccb09b576495e7c + tr46: "npm:^6.0.0" + webidl-conversions: "npm:^8.0.0" + checksum: 10/9ae5ce70060f2a9ea73799062af6e796ec2477f44bf1a886953b405700e3ab11d15aa0fe7088c4215f839e56a845d5d1c44584ed292a832837a8c8549c566886 languageName: node linkType: hard @@ -49748,6 +49751,16 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^14.0.0": + version: 14.2.0 + resolution: "whatwg-url@npm:14.2.0" + dependencies: + tr46: "npm:^5.1.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10/f0a95b0601c64f417c471536a2d828b4c16fe37c13662483a32f02f183ed0f441616609b0663fb791e524e8cd56d9a86dd7366b1fc5356048ccb09b576495e7c + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" From 2bae83ab2efab59e302a47ea251c75a5553e9c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 8 Dec 2025 10:47:33 +0100 Subject: [PATCH 248/312] Version Policy Update - Node 22 to 24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/funny-hornets-peel.md | 5 + .changeset/happy-streets-dress.md | 5 + .changeset/loud-yaks-watch.md | 5 + .changeset/seven-games-rest.md | 5 + .changeset/stupid-cases-fold.md | 5 + .changeset/tame-mirrors-sit.md | 5 + .changeset/tired-dogs-remain.md | 12 + .github/workflows/api-breaking-changes.yml | 4 +- .github/workflows/ci-noop.yml | 4 +- .github/workflows/ci.yml | 6 +- .github/workflows/deploy_docker-image.yml | 2 +- .github/workflows/deploy_microsite.yml | 16 +- .github/workflows/deploy_packages.yml | 4 +- .github/workflows/mui-migration-tracker.yml | 6 +- .github/workflows/sync_canon.yml | 6 +- .github/workflows/sync_release-manifest.yml | 6 +- .github/workflows/sync_snyk-github-issues.yml | 6 +- .github/workflows/verify_accessibility.yml | 6 +- .github/workflows/verify_chromatic.yml | 2 +- .github/workflows/verify_e2e-linux-noop.yml | 2 +- .github/workflows/verify_e2e-linux.yml | 2 +- .github/workflows/verify_e2e-techdocs.yml | 2 +- .github/workflows/verify_e2e-windows-noop.yml | 2 +- .github/workflows/verify_e2e-windows.yml | 2 +- .github/workflows/verify_microsite.yml | 16 +- .../verify_microsite_accessibility.yml | 4 +- .github/workflows/verify_windows.yml | 2 +- docs-ui/package.json | 2 +- docs/overview/versioning-policy.md | 2 +- microsite/package.json | 2 +- microsite/yarn.lock | 18 +- package.json | 4 +- packages/backend-dev-utils/src/ipcClient.ts | 2 +- packages/cli-common/package.json | 2 +- packages/cli/config/nodeTransform.cjs | 2 +- packages/cli/config/nodeTransformHooks.mjs | 2 +- packages/cli/config/tsconfig.json | 4 +- packages/cli/package.json | 2 +- .../src/modules/build/lib/builder/config.ts | 2 +- .../modules/build/lib/bundler/optimization.ts | 4 +- .../modules/build/lib/bundler/transforms.ts | 4 +- .../src/tests/transforms/transforms.test.ts | 8 +- packages/codemods/package.json | 2 +- packages/create-app/package.json | 2 +- .../templates/default-app/package.json.hbs | 2 +- .../templates/next-app/package.json.hbs | 2 +- packages/e2e-test/package.json | 2 +- packages/repo-tools/package.json | 6 +- packages/techdocs-cli/package.json | 2 +- plugins/kubernetes-cluster/package.json | 2 +- .../package.json | 2 +- plugins/scaffolder-backend/package.json | 2 +- .../src/cache/cacheMiddleware.ts | 2 +- yarn.lock | 261 +++++++++--------- 54 files changed, 270 insertions(+), 219 deletions(-) create mode 100644 .changeset/funny-hornets-peel.md create mode 100644 .changeset/happy-streets-dress.md create mode 100644 .changeset/loud-yaks-watch.md create mode 100644 .changeset/seven-games-rest.md create mode 100644 .changeset/stupid-cases-fold.md create mode 100644 .changeset/tame-mirrors-sit.md create mode 100644 .changeset/tired-dogs-remain.md diff --git a/.changeset/funny-hornets-peel.md b/.changeset/funny-hornets-peel.md new file mode 100644 index 0000000000..2af6702295 --- /dev/null +++ b/.changeset/funny-hornets-peel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Updated `isolated-vm` to `6.0.1` diff --git a/.changeset/happy-streets-dress.md b/.changeset/happy-streets-dress.md new file mode 100644 index 0000000000..46f4d798ed --- /dev/null +++ b/.changeset/happy-streets-dress.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Updated engines to support Node 22 or 24 diff --git a/.changeset/loud-yaks-watch.md b/.changeset/loud-yaks-watch.md new file mode 100644 index 0000000000..b7ad65b9eb --- /dev/null +++ b/.changeset/loud-yaks-watch.md @@ -0,0 +1,5 @@ +--- +'@backstage/repo-tools': patch +--- + +Bump `@microsoft/api-documenter` and `@microsoft/api-extractor` to latest versions. diff --git a/.changeset/seven-games-rest.md b/.changeset/seven-games-rest.md new file mode 100644 index 0000000000..b498c3b138 --- /dev/null +++ b/.changeset/seven-games-rest.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-backend': patch +--- + +Corrected `ErrorCallback` type to work with Node 22 types diff --git a/.changeset/stupid-cases-fold.md b/.changeset/stupid-cases-fold.md new file mode 100644 index 0000000000..5cf0f0f72a --- /dev/null +++ b/.changeset/stupid-cases-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Switched ECMAScript version to ES2023. diff --git a/.changeset/tame-mirrors-sit.md b/.changeset/tame-mirrors-sit.md new file mode 100644 index 0000000000..f317185ea2 --- /dev/null +++ b/.changeset/tame-mirrors-sit.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-dev-utils': patch +--- + +Internal update for Node.js v24 support. diff --git a/.changeset/tired-dogs-remain.md b/.changeset/tired-dogs-remain.md new file mode 100644 index 0000000000..06c193068b --- /dev/null +++ b/.changeset/tired-dogs-remain.md @@ -0,0 +1,12 @@ +--- +'@backstage/plugin-scaffolder-backend-module-rails': patch +'@backstage/plugin-kubernetes-cluster': patch +'@techdocs/cli': patch +'@backstage/cli-common': patch +'@backstage/create-app': patch +'@backstage/repo-tools': patch +'@backstage/codemods': patch +'@backstage/cli': patch +--- + +Bumped dev dependencies `@types/node` diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index d3d7e44c73..934add0716 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -29,13 +29,13 @@ jobs: - name: setup-node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: linux-v20 + cache-prefix: linux-v22 - name: breaking changes check run: | diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index 8c07880e49..12aafe18ee 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] name: Verify ${{ matrix.node-version }} steps: @@ -35,7 +35,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] name: Test ${{ matrix.node-version }} steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a3c90b6b49..7552898bd0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] env: CI: true @@ -55,7 +55,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] env: CI: true @@ -154,7 +154,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] name: Test ${{ matrix.node-version }} services: diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 3b45b7502a..0cf49b4b8a 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x] + node-version: [22.x] steps: - name: Harden Runner diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index 39e3a3c5b3..3bd4e2d124 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -58,16 +58,16 @@ jobs: with: ref: refs/tags/${{ steps.find-release.outputs.result }} - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: build API reference run: yarn build:api-docs @@ -142,16 +142,16 @@ jobs: - name: checkout master uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: build API reference run: yarn build:api-docs @@ -244,10 +244,10 @@ jobs: with: egress-policy: audit - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth # Stable docs diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index f324a0d0d7..b8bc3fd120 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] services: postgres18: @@ -147,7 +147,7 @@ jobs: strategy: matrix: - node-version: [20.x] + node-version: [22.x] steps: - name: Harden Runner diff --git a/.github/workflows/mui-migration-tracker.yml b/.github/workflows/mui-migration-tracker.yml index 842f967fed..7be3c2c1b9 100644 --- a/.github/workflows/mui-migration-tracker.yml +++ b/.github/workflows/mui-migration-tracker.yml @@ -28,13 +28,13 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: Run migration analysis id: analysis @@ -62,7 +62,7 @@ jobs: issue_number: issueNumber, body: reportBody }); - + console.log(`✅ Successfully updated issue #${issueNumber}`); } catch (error) { console.error(`❌ Error updating issue: ${error.message}`); diff --git a/.github/workflows/sync_canon.yml b/.github/workflows/sync_canon.yml index b2a0f3c5fc..9da6c80b98 100644 --- a/.github/workflows/sync_canon.yml +++ b/.github/workflows/sync_canon.yml @@ -15,16 +15,16 @@ jobs: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: Checkout backstage/docs-ui uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index b57bf09d24..ce7ff266c0 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -18,16 +18,16 @@ jobs: # 'v' prefix is added here for the tag, we keep it out of the manifest logic ref: v${{ github.event.client_payload.version }} - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: Build yarn plugin working-directory: packages/yarn-plugin diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 61026bbb8d..97f7e8ed14 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -18,15 +18,15 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: Create Snyk report uses: snyk/actions/node@9adf32b1121593767fc3c057af55b55db032dc04 # master diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 47241884a8..82d26ca510 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -25,14 +25,14 @@ jobs: egress-policy: audit - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: run Lighthouse CI run: | yarn dlx @lhci/cli@0.11.x autorun diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index e71e58579c..a9d83b01e3 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node-version: [20.x] + node-version: [22.x] name: Chromatic steps: diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index 272c6816fa..152f4cc2c0 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] name: E2E Linux ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 805b798cd2..436995ddc2 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -34,7 +34,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] env: CI: true diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index 94c1257823..07c751e098 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -23,7 +23,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] env: CI: true diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index fb5bcdc8c2..f04748a950 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] name: E2E Windows ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index a1618799df..933bbb0840 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] env: CI: true diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index ef70b71f82..7b735877bc 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -63,16 +63,16 @@ jobs: with: ref: refs/tags/${{ steps.find-release.outputs.result }} - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: build API reference run: yarn build:api-docs @@ -144,16 +144,16 @@ jobs: - name: checkout master uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 with: - cache-prefix: ${{ runner.os }}-v20.x + cache-prefix: ${{ runner.os }}-v22.x - name: build API reference run: yarn build:api-docs @@ -240,10 +240,10 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: python-version: '3.9' diff --git a/.github/workflows/verify_microsite_accessibility.yml b/.github/workflows/verify_microsite_accessibility.yml index b53b2d513f..0c428ae359 100644 --- a/.github/workflows/verify_microsite_accessibility.yml +++ b/.github/workflows/verify_microsite_accessibility.yml @@ -21,10 +21,10 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: 20.x + node-version: 22.x - name: top-level install run: yarn install --immutable diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index c5196e395b..ae2ec477d3 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] env: CI: true diff --git a/docs-ui/package.json b/docs-ui/package.json index 9f3f7808c5..086cfb479e 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -44,7 +44,7 @@ "@octokit/rest": "^22.0.1", "@shikijs/transformers": "^3.13.0", "@types/mdx": "^2.0.13", - "@types/node": "^20", + "@types/node": "^22.13.14", "@types/react": "19.1.9", "@types/react-dom": "19.1.7", "chokidar": "^3.6.0", diff --git a/docs/overview/versioning-policy.md b/docs/overview/versioning-policy.md index 669a982e1a..420b6489ae 100644 --- a/docs/overview/versioning-policy.md +++ b/docs/overview/versioning-policy.md @@ -177,7 +177,7 @@ When we say _Supporting_ a Node.js release, that means the following: - New Backstage projects created with `@backstage/create-app` will have their `engines.node` version set accordingly. - Dropping compatibility with unsupported releases is not considered a breaking change. This includes using new syntax or APIs, as well as bumping dependencies that drop support for these versions. -Based on the above Backstage supports Node.js 20 and 22 as of the `1.33.0` release. +Based on the above Backstage supports Node.js 22 and 24 as of the `1.46.0` release. ## TypeScript Releases diff --git a/microsite/package.json b/microsite/package.json index e911ab5b3f..a3430545f4 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -47,7 +47,7 @@ "@types/webpack-env": "^1.18.0", "js-yaml": "^4.1.1", "prettier": "^2.6.2", - "typescript": "~5.2.0", + "typescript": "~5.7.0", "yaml-loader": "^0.8.0" } } diff --git a/microsite/yarn.lock b/microsite/yarn.lock index fb1693893f..2f6e723889 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -4289,7 +4289,7 @@ __metadata: react-dom: "npm:^18.0.2" sass: "npm:^1.57.1" swc-loader: "npm:^0.2.3" - typescript: "npm:~5.2.0" + typescript: "npm:~5.7.0" yaml-loader: "npm:^0.8.0" languageName: unknown linkType: soft @@ -14250,23 +14250,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~5.2.0": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" +"typescript@npm:~5.7.0": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/d65e50eb849bd21ff8677e5b9447f9c6e74777e346afd67754934264dcbf4bd59e7d2473f6062d9a015d66bd573311166357e3eb07fea0b52859cf9bb2b58555 + checksum: 10/6a7e556de91db3d34dc51cd2600e8e91f4c312acd8e52792f243c7818dfadb27bae677175fad6947f9c81efb6c57eb6b2d0c736f196a6ee2f1f7d57b74fc92fa languageName: node linkType: hard -"typescript@patch:typescript@npm%3A~5.2.0#optional!builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin::version=5.2.2&hash=f3b441" +"typescript@patch:typescript@npm%3A~5.7.0#optional!builtin": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/f79cc2ba802c94c2b78dbb00d767a10adb67368ae764709737dc277273ec148aa4558033a03ce901406b35fddf4eac46dabc94a1e1d12d2587e2b9cfe5707b4a + checksum: 10/dc58d777eb4c01973f7fbf1fd808aad49a0efdf545528dab9b07d94fdcb65b8751742804c3057e9619a4627f2d9cc85547fdd49d9f4326992ad0181b49e61d81 languageName: node linkType: hard diff --git a/package.json b/package.json index 763b4f7505..a7ef0c8056 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "@techdocs/cli": "workspace:*", "@types/cacheable-request": "^8.3.6", "@types/memjs": "^1.3.3", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "@types/webpack": "^5.28.0", "array-to-table": "^1.0.1", "command-exists": "^1.2.9", @@ -175,7 +175,7 @@ }, "packageManager": "yarn@4.8.1", "engines": { - "node": "20 || 22" + "node": "22 || 24" }, "madge": { "fileExtensions": [ diff --git a/packages/backend-dev-utils/src/ipcClient.ts b/packages/backend-dev-utils/src/ipcClient.ts index 6e1d3d181e..814767347e 100644 --- a/packages/backend-dev-utils/src/ipcClient.ts +++ b/packages/backend-dev-utils/src/ipcClient.ts @@ -126,7 +126,7 @@ export class BackstageIpcClient { timeout.unref(); this.#handlers.set(id, responseHandler); - this.#sendMessage(request, (e: Error) => { + this.#sendMessage(request, undefined, undefined, (e: Error | null) => { if (e) { reject(e); } diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index e7ee3e97f4..ea26ee09e6 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -43,6 +43,6 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/cross-spawn": "^6.0.2", - "@types/node": "^20.16.0" + "@types/node": "^22.13.14" } } diff --git a/packages/cli/config/nodeTransform.cjs b/packages/cli/config/nodeTransform.cjs index f54527b4a7..54984b74a4 100644 --- a/packages/cli/config/nodeTransform.cjs +++ b/packages/cli/config/nodeTransform.cjs @@ -61,7 +61,7 @@ addHook( ignoreDynamic: true, }, jsc: { - target: 'es2022', + target: 'es2023', parser: { syntax: 'typescript', }, diff --git a/packages/cli/config/nodeTransformHooks.mjs b/packages/cli/config/nodeTransformHooks.mjs index 7bf0473bb8..7e00eff9f6 100644 --- a/packages/cli/config/nodeTransformHooks.mjs +++ b/packages/cli/config/nodeTransformHooks.mjs @@ -277,7 +277,7 @@ export async function load(url, context, nextLoad) { exportInteropAnnotation: true, }, jsc: { - target: 'es2022', + target: 'es2023', parser: { syntax: 'typescript', }, diff --git a/packages/cli/config/tsconfig.json b/packages/cli/config/tsconfig.json index d2fa597cca..7648e0238a 100644 --- a/packages/cli/config/tsconfig.json +++ b/packages/cli/config/tsconfig.json @@ -12,7 +12,7 @@ "incremental": true, "isolatedModules": true, "jsx": "react", - "lib": ["DOM", "DOM.Iterable", "ScriptHost", "ES2022"], + "lib": ["DOM", "DOM.Iterable", "ScriptHost", "ES2023"], "module": "ES2020", "moduleResolution": "bundler", "noEmit": false, @@ -33,7 +33,7 @@ "strictNullChecks": true, "strictPropertyInitialization": true, "stripInternal": true, - "target": "ES2022", + "target": "ES2023", "types": ["node", "jest", "webpack-env"], "useDefineForClassFields": true } diff --git a/packages/cli/package.json b/packages/cli/package.json index 40ab7b2823..be94e4e817 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -174,7 +174,7 @@ "@types/fs-extra": "^11.0.0", "@types/http-proxy": "^1.17.4", "@types/inquirer": "^8.1.3", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "@types/npm-packlist": "^3.0.0", "@types/recursive-readdir": "^2.2.0", "@types/rollup-plugin-peer-deps-external": "^2.2.0", diff --git a/packages/cli/src/modules/build/lib/builder/config.ts b/packages/cli/src/modules/build/lib/builder/config.ts index 8add3559f4..3e360b645c 100644 --- a/packages/cli/src/modules/build/lib/builder/config.ts +++ b/packages/cli/src/modules/build/lib/builder/config.ts @@ -259,7 +259,7 @@ export async function makeRollupConfigs( json(), yaml(), esbuild({ - target: 'ES2022', + target: 'ES2023', minify: options.minify, }), ], diff --git a/packages/cli/src/modules/build/lib/bundler/optimization.ts b/packages/cli/src/modules/build/lib/bundler/optimization.ts index 63319ebec6..8d0eea5b88 100644 --- a/packages/cli/src/modules/build/lib/bundler/optimization.ts +++ b/packages/cli/src/modules/build/lib/bundler/optimization.ts @@ -34,13 +34,13 @@ export const optimization = ( minimize: !isDev, minimizer: [ new MinifyPlugin({ - target: 'ES2022', + target: 'ES2023', format: 'iife', exclude: 'remoteEntry.js', }), // Avoid iife wrapping of module federation remote entry as it breaks the variable assignment new MinifyPlugin({ - target: 'ES2022', + target: 'ES2023', format: undefined, include: 'remoteEntry.js', }), diff --git a/packages/cli/src/modules/build/lib/bundler/transforms.ts b/packages/cli/src/modules/build/lib/bundler/transforms.ts index 64e33b220e..ecf6e20751 100644 --- a/packages/cli/src/modules/build/lib/bundler/transforms.ts +++ b/packages/cli/src/modules/build/lib/bundler/transforms.ts @@ -67,7 +67,7 @@ export const transforms = (options: TransformOptions): Transforms => { : 'builtin:swc-loader', options: { jsc: { - target: 'es2022', + target: 'es2023', externalHelpers: !isBackend, parser: { syntax: 'typescript', @@ -97,7 +97,7 @@ export const transforms = (options: TransformOptions): Transforms => { : 'builtin:swc-loader', options: { jsc: { - target: 'es2022', + target: 'es2023', externalHelpers: !isBackend, parser: { syntax: 'ecmascript', diff --git a/packages/cli/src/tests/transforms/transforms.test.ts b/packages/cli/src/tests/transforms/transforms.test.ts index 7fb76bd741..0f51242206 100644 --- a/packages/cli/src/tests/transforms/transforms.test.ts +++ b/packages/cli/src/tests/transforms/transforms.test.ts @@ -36,18 +36,18 @@ const exportValues = { }; const expectedExports = { - commonJs: { + commonJs: expect.objectContaining({ ...exportValues.commonJs, dyn: exportValues.all, default: { ...exportValues.commonJs, dyn: exportValues.all, }, - }, - module: { + }), + module: expect.objectContaining({ ...exportValues.all, dyn: exportValues.all, - }, + }), }; function loadFixture(fixture: string) { diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 9b7b424e9b..f78579f714 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -52,6 +52,6 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/jscodeshift": "^0.12.0", - "@types/node": "^20.16.0" + "@types/node": "^22.13.14" } } diff --git a/packages/create-app/package.json b/packages/create-app/package.json index fb729526eb..af82d507d2 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -58,7 +58,7 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^11.0.0", "@types/inquirer": "^8.1.3", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "@types/recursive-readdir": "^2.2.0", "msw": "^2.0.0", "nodemon": "^3.0.1" diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 8399c6505a..d0a088a7d1 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "engines": { - "node": "20 || 22" + "node": "22 || 24" }, "scripts": { "start": "backstage-cli repo start", diff --git a/packages/create-app/templates/next-app/package.json.hbs b/packages/create-app/templates/next-app/package.json.hbs index 33e76aba3b..55a591067b 100644 --- a/packages/create-app/templates/next-app/package.json.hbs +++ b/packages/create-app/templates/next-app/package.json.hbs @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "engines": { - "node": "20 || 22" + "node": "22 || 24" }, "scripts": { "start": "backstage-cli repo start", diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 65fe932620..e70f2f8105 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@types/fs-extra": "^11.0.0", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "nodemon": "^3.0.1" } } diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 1ca777bca2..8fb56a229a 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -51,8 +51,8 @@ "@backstage/errors": "workspace:^", "@electric-sql/pglite": "^0.3.0", "@manypkg/get-packages": "^1.1.3", - "@microsoft/api-documenter": "^7.25.7", - "@microsoft/api-extractor": "^7.47.2", + "@microsoft/api-documenter": "^7.28.1", + "@microsoft/api-extractor": "^7.55.1", "@openapitools/openapi-generator-cli": "^2.7.0", "@stoplight/spectral-core": "^1.18.0", "@stoplight/spectral-formatters": "^1.1.0", @@ -90,7 +90,7 @@ "@backstage/cli": "workspace:^", "@backstage/types": "workspace:^", "@types/is-glob": "^4.0.2", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "@types/prettier": "^2.0.0", "typedoc": "^0.28.0" }, diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 10253e7a93..d8aff1bc89 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -62,7 +62,7 @@ "@types/commander": "^2.12.2", "@types/fs-extra": "^11.0.0", "@types/http-proxy": "^1.17.4", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "@types/serve-handler": "^6.1.0", "@types/webpack-env": "^1.15.3", "find-process": "^1.4.5", diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 480f6a2204..f5f67971f9 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -72,7 +72,7 @@ "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 43d7e84581..2ae26dd016 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -59,7 +59,7 @@ "@backstage/plugin-scaffolder-node-test-utils": "workspace:^", "@types/command-exists": "^1.2.0", "@types/fs-extra": "^11.0.0", - "@types/node": "^20.16.0", + "@types/node": "^22.13.14", "jest-when": "^3.1.0" } } diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 9cbb3172e3..c3876a7926 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -94,7 +94,7 @@ "fs-extra": "^11.2.0", "globby": "^11.0.0", "isbinaryfile": "^5.0.0", - "isolated-vm": "^5.0.1", + "isolated-vm": "^6.0.1", "jsonschema": "^1.5.0", "knex": "^3.0.0", "lodash": "^4.17.21", diff --git a/plugins/techdocs-backend/src/cache/cacheMiddleware.ts b/plugins/techdocs-backend/src/cache/cacheMiddleware.ts index 78660d3c39..72f910a10a 100644 --- a/plugins/techdocs-backend/src/cache/cacheMiddleware.ts +++ b/plugins/techdocs-backend/src/cache/cacheMiddleware.ts @@ -23,7 +23,7 @@ type CacheMiddlewareOptions = { logger: LoggerService; }; -type ErrorCallback = (err?: Error) => void; +type ErrorCallback = (err?: Error | null) => void; export const createCacheMiddleware = ({ cache, diff --git a/yarn.lock b/yarn.lock index 9d955a13ec..57429a8c45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3142,7 +3142,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/errors": "workspace:^" "@types/cross-spawn": "npm:^6.0.2" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" cross-spawn: "npm:^7.0.3" global-agent: "npm:^3.0.0" undici: "npm:^7.2.3" @@ -3219,7 +3219,7 @@ __metadata: "@types/http-proxy": "npm:^1.17.4" "@types/inquirer": "npm:^8.1.3" "@types/jest": "npm:^29.5.11" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" "@types/npm-packlist": "npm:^3.0.0" "@types/recursive-readdir": "npm:^2.2.0" "@types/rollup-plugin-peer-deps-external": "npm:^2.2.0" @@ -3355,7 +3355,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/cli-common": "workspace:^" "@types/jscodeshift": "npm:^0.12.0" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" chalk: "npm:^4.0.0" commander: "npm:^12.0.0" jscodeshift: "npm:^0.16.0" @@ -3606,7 +3606,7 @@ __metadata: "@types/command-exists": "npm:^1.2.0" "@types/fs-extra": "npm:^11.0.0" "@types/inquirer": "npm:^8.1.3" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" "@types/recursive-readdir": "npm:^2.2.0" chalk: "npm:^4.0.0" commander: "npm:^12.0.0" @@ -5847,7 +5847,7 @@ __metadata: "@material-ui/lab": "npm:4.0.0-alpha.61" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^16.0.0" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" "@types/react": "npm:^18.0.0" kubernetes-models: "npm:^4.1.0" react: "npm:^18.0.2" @@ -6650,7 +6650,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/command-exists": "npm:^1.2.0" "@types/fs-extra": "npm:^11.0.0" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" command-exists: "npm:^1.2.9" fs-extra: "npm:^11.0.0" jest-when: "npm:^3.1.0" @@ -6737,7 +6737,7 @@ __metadata: fs-extra: "npm:^11.2.0" globby: "npm:^11.0.0" isbinaryfile: "npm:^5.0.0" - isolated-vm: "npm:^5.0.1" + isolated-vm: "npm:^6.0.1" jsonschema: "npm:^1.5.0" knex: "npm:^3.0.0" lodash: "npm:^4.17.21" @@ -7689,8 +7689,8 @@ __metadata: "@backstage/types": "workspace:^" "@electric-sql/pglite": "npm:^0.3.0" "@manypkg/get-packages": "npm:^1.1.3" - "@microsoft/api-documenter": "npm:^7.25.7" - "@microsoft/api-extractor": "npm:^7.47.2" + "@microsoft/api-documenter": "npm:^7.28.1" + "@microsoft/api-extractor": "npm:^7.55.1" "@openapitools/openapi-generator-cli": "npm:^2.7.0" "@stoplight/spectral-core": "npm:^1.18.0" "@stoplight/spectral-formatters": "npm:^1.1.0" @@ -7700,7 +7700,7 @@ __metadata: "@stoplight/spectral-runtime": "npm:^1.1.2" "@stoplight/types": "npm:^14.0.0" "@types/is-glob": "npm:^4.0.2" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" "@types/prettier": "npm:^2.0.0" "@useoptic/openapi-utilities": "npm:^0.55.0" chalk: "npm:^4.0.0" @@ -10974,54 +10974,55 @@ __metadata: languageName: node linkType: hard -"@microsoft/api-documenter@npm:^7.25.7": - version: 7.25.14 - resolution: "@microsoft/api-documenter@npm:7.25.14" +"@microsoft/api-documenter@npm:^7.28.1": + version: 7.28.2 + resolution: "@microsoft/api-documenter@npm:7.28.2" dependencies: - "@microsoft/api-extractor-model": "npm:7.29.8" - "@microsoft/tsdoc": "npm:~0.15.0" - "@rushstack/node-core-library": "npm:5.9.0" - "@rushstack/terminal": "npm:0.14.2" - "@rushstack/ts-command-line": "npm:4.22.8" - js-yaml: "npm:~3.13.1" + "@microsoft/api-extractor-model": "npm:7.32.2" + "@microsoft/tsdoc": "npm:~0.16.0" + "@rushstack/node-core-library": "npm:5.19.1" + "@rushstack/terminal": "npm:0.19.5" + "@rushstack/ts-command-line": "npm:5.1.5" + js-yaml: "npm:~4.1.0" resolve: "npm:~1.22.1" bin: api-documenter: bin/api-documenter - checksum: 10/7ab46b4e8f1d84220d599339e87a518fcd95cc87fa402e39667dd2fe73a3b6f8814f22bb7f374ccb7b0a87982a6a77b96f4061c4d338ef7eee3112dd7a89700a + checksum: 10/32d40e048894d1b96dc8a8855afdd55fdd0e3c599d624c73daf616c50c965dfd0e174d380222ec9de5a5bab105029944d82c50c0b1488920233876d7077a148a languageName: node linkType: hard -"@microsoft/api-extractor-model@npm:7.29.8": - version: 7.29.8 - resolution: "@microsoft/api-extractor-model@npm:7.29.8" +"@microsoft/api-extractor-model@npm:7.32.2": + version: 7.32.2 + resolution: "@microsoft/api-extractor-model@npm:7.32.2" dependencies: - "@microsoft/tsdoc": "npm:~0.15.0" - "@microsoft/tsdoc-config": "npm:~0.17.0" - "@rushstack/node-core-library": "npm:5.9.0" - checksum: 10/06932e61f0a1979dbacc716e143f9d34d856338504cd8d016d98a3d3c83d60e7c25bfdc64d011c6ddf94de2351b52872e8722d970fce44c49bd630aeca32c987 + "@microsoft/tsdoc": "npm:~0.16.0" + "@microsoft/tsdoc-config": "npm:~0.18.0" + "@rushstack/node-core-library": "npm:5.19.1" + checksum: 10/89760055c7d3074cd903e3694c411eafa8704f048781bb2db0f0ba6e6a9a1bb12a722419ddd99141562cc8d13c98e2deee6eba118853eed630918705b223107b languageName: node linkType: hard -"@microsoft/api-extractor@npm:^7.47.2": - version: 7.47.9 - resolution: "@microsoft/api-extractor@npm:7.47.9" +"@microsoft/api-extractor@npm:^7.55.1": + version: 7.55.2 + resolution: "@microsoft/api-extractor@npm:7.55.2" dependencies: - "@microsoft/api-extractor-model": "npm:7.29.8" - "@microsoft/tsdoc": "npm:~0.15.0" - "@microsoft/tsdoc-config": "npm:~0.17.0" - "@rushstack/node-core-library": "npm:5.9.0" - "@rushstack/rig-package": "npm:0.5.3" - "@rushstack/terminal": "npm:0.14.2" - "@rushstack/ts-command-line": "npm:4.22.8" + "@microsoft/api-extractor-model": "npm:7.32.2" + "@microsoft/tsdoc": "npm:~0.16.0" + "@microsoft/tsdoc-config": "npm:~0.18.0" + "@rushstack/node-core-library": "npm:5.19.1" + "@rushstack/rig-package": "npm:0.6.0" + "@rushstack/terminal": "npm:0.19.5" + "@rushstack/ts-command-line": "npm:5.1.5" + diff: "npm:~8.0.2" lodash: "npm:~4.17.15" - minimatch: "npm:~3.0.3" + minimatch: "npm:10.0.3" resolve: "npm:~1.22.1" semver: "npm:~7.5.4" source-map: "npm:~0.6.1" - typescript: "npm:5.4.2" + typescript: "npm:5.8.2" bin: api-extractor: bin/api-extractor - checksum: 10/1814708284ed95a45969060f794b24b21a5a5e17aa88ec95099a8fc052d5c435523f465f60c4128288e210a39ff056a564fb2b8f291959ef0fc3d7423759f837 + checksum: 10/56b7e9338ad18cf3dc6aaefd679b90117c9d5498dee5c621e868a5fe5002656e62d08267525eb880221d4588afcf6d680604249a9c2fb5faaba8f9c87be16b3e languageName: node linkType: hard @@ -11039,22 +11040,22 @@ __metadata: languageName: node linkType: hard -"@microsoft/tsdoc-config@npm:~0.17.0": - version: 0.17.0 - resolution: "@microsoft/tsdoc-config@npm:0.17.0" +"@microsoft/tsdoc-config@npm:~0.18.0": + version: 0.18.0 + resolution: "@microsoft/tsdoc-config@npm:0.18.0" dependencies: - "@microsoft/tsdoc": "npm:0.15.0" + "@microsoft/tsdoc": "npm:0.16.0" ajv: "npm:~8.12.0" jju: "npm:~1.4.0" resolve: "npm:~1.22.2" - checksum: 10/6e20f9b917d20e517b6752cbb46c84ccc4c8be7ce82d7424e413bd7111a2f1497714a72e61ac1a96df97d0050cb98b3a53006316eeb0cfea9bb6d7131432c7a8 + checksum: 10/0470df5326181d876faba51617d011a632b2e3b420953e521bb865715d0db2fb0b8bfb3ccbcaef267356a1a7150d2ffba40022db5930db6b15fcb348bf846a4b languageName: node linkType: hard -"@microsoft/tsdoc@npm:0.15.0, @microsoft/tsdoc@npm:~0.15.0": - version: 0.15.0 - resolution: "@microsoft/tsdoc@npm:0.15.0" - checksum: 10/fd025e5e3966248cd5477b9ddad4e9aa0dd69291f372a207f18a686b3097dcf5ecf38325caf0f4ad2697f1f39fd45b536e4ada6756008b8bcc5eccbc3201313d +"@microsoft/tsdoc@npm:0.16.0, @microsoft/tsdoc@npm:~0.16.0": + version: 0.16.0 + resolution: "@microsoft/tsdoc@npm:0.16.0" + checksum: 10/1eaad3605234dc7e44898c15d1ba3c97fb968af1117025400cba572ce268da05afc36634d1fb9e779457af3ff7f13330aee07a962510a4d9c6612c13f71ee41e languageName: node linkType: hard @@ -16878,14 +16879,14 @@ __metadata: languageName: node linkType: hard -"@rushstack/node-core-library@npm:5.9.0": - version: 5.9.0 - resolution: "@rushstack/node-core-library@npm:5.9.0" +"@rushstack/node-core-library@npm:5.19.1": + version: 5.19.1 + resolution: "@rushstack/node-core-library@npm:5.19.1" dependencies: ajv: "npm:~8.13.0" ajv-draft-04: "npm:~1.0.0" ajv-formats: "npm:~3.0.1" - fs-extra: "npm:~7.0.1" + fs-extra: "npm:~11.3.0" import-lazy: "npm:~4.0.0" jju: "npm:~1.4.0" resolve: "npm:~1.22.1" @@ -16895,44 +16896,57 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true - checksum: 10/19d6c6fc6addfb27295d1d78e1027f5896ea43702c2e5168e8b235ee739f2e59a4dc3bb3996b083722fab4feae5f2c15c340900c6c1d517d56cc1ba945f532f1 + checksum: 10/a674c4ed4cf3c863ab6bfff0e3615e7f791d0312fa5942027b6e8070b4453464c0e77741a1ed13bc01fab66ddc89e8c068c6c58ce7d81c014966628b75223bd6 languageName: node linkType: hard -"@rushstack/rig-package@npm:0.5.3": - version: 0.5.3 - resolution: "@rushstack/rig-package@npm:0.5.3" +"@rushstack/problem-matcher@npm:0.1.1": + version: 0.1.1 + resolution: "@rushstack/problem-matcher@npm:0.1.1" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/a47c2d5fd0e3bbe7336f06c29ef91061e36ab8dafd04c861392806e60a3366fd8c3921be217adc71d039c8749f6b70a06c874ff314501eed5b7f8fb7b42c7a39 + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.6.0": + version: 0.6.0 + resolution: "@rushstack/rig-package@npm:0.6.0" dependencies: resolve: "npm:~1.22.1" strip-json-comments: "npm:~3.1.1" - checksum: 10/b58a3925a41d7a0e79f4fde7c400a379683cc7b0073c447aba6d36231529a37e7d2f4559f459be785ad862ecb01b618b2d0ff60661046e5223437356155ccb14 + checksum: 10/6ca5d6615365dfe4d78fdc52a1a145bec92bba79d8692db91d05c774b4ec4d9dc6c41b31949708d0312896b9c1c205a0f0eaa32f51ac7b1780415ac51c76af71 languageName: node linkType: hard -"@rushstack/terminal@npm:0.14.2": - version: 0.14.2 - resolution: "@rushstack/terminal@npm:0.14.2" +"@rushstack/terminal@npm:0.19.5": + version: 0.19.5 + resolution: "@rushstack/terminal@npm:0.19.5" dependencies: - "@rushstack/node-core-library": "npm:5.9.0" + "@rushstack/node-core-library": "npm:5.19.1" + "@rushstack/problem-matcher": "npm:0.1.1" supports-color: "npm:~8.1.1" peerDependencies: "@types/node": "*" peerDependenciesMeta: "@types/node": optional: true - checksum: 10/4016499f3ed1eff7d870ff029bc51925f1435c0ed73d454385d6fdfe8f10e7e5fc2dba698a9aa671f2537603d2d08449782a0f329f321a7dcb87827c19385bca + checksum: 10/c5118df78045153aaf430de66e1d79befc729fd1f5df5dc8eef3dff1eb8f75a277f0dc8bad344b313d0485ace69400b1aaf69ad061c601a7bd8291ae5784b6a3 languageName: node linkType: hard -"@rushstack/ts-command-line@npm:4.22.8": - version: 4.22.8 - resolution: "@rushstack/ts-command-line@npm:4.22.8" +"@rushstack/ts-command-line@npm:5.1.5": + version: 5.1.5 + resolution: "@rushstack/ts-command-line@npm:5.1.5" dependencies: - "@rushstack/terminal": "npm:0.14.2" + "@rushstack/terminal": "npm:0.19.5" "@types/argparse": "npm:1.0.38" argparse: "npm:~1.0.9" string-argv: "npm:~0.3.1" - checksum: 10/f4d57a50b320f382929471258aaab6f38251a4febac981a503ae5217faec6fff68374d0126af59554d2f4a99e0ac67596649109fcc57608ef144b132de83cb63 + checksum: 10/4e3bc090b9c40ec89729aa96d45b08aeac725ce3fda9951d3b87b485fe48299db2dfa7a338acf7e89f380a5b98d44df8b4a18067962fecfb8ba64a8919e6dd2b languageName: node linkType: hard @@ -19740,7 +19754,7 @@ __metadata: "@types/commander": "npm:^2.12.2" "@types/fs-extra": "npm:^11.0.0" "@types/http-proxy": "npm:^1.17.4" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" "@types/serve-handler": "npm:^6.1.0" "@types/webpack-env": "npm:^1.15.3" commander: "npm:^12.0.0" @@ -21091,12 +21105,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.16.0": - version: 20.17.30 - resolution: "@types/node@npm:20.17.30" +"@types/node@npm:^22.13.14": + version: 22.19.1 + resolution: "@types/node@npm:22.19.1" dependencies: - undici-types: "npm:~6.19.2" - checksum: 10/69fd3b177417be77b459e8f1dd4e78c85c686167086920fbf35a9fda301709bbeee6a87ad2591fb1ddd96c65e725ec6bb527a06496626a1c94367d1361048f8d + undici-types: "npm:~6.21.0" + checksum: 10/40d5368faa6d9be6c27ebca2362734bc9e035a742e0b5cafee40ba3b355d7cfcaedbc93618c76465451e53f1af0c811b4b85ee9b85e2e942f34a4c5310fa047b languageName: node linkType: hard @@ -28393,6 +28407,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:~8.0.2": + version: 8.0.2 + resolution: "diff@npm:8.0.2" + checksum: 10/82a2120d3418f97822e17a6044ccd4b99a91e26e145e8698353673d7146bd2d092bbebb79c112aae7badc7b9c526f9098cbe342f96174feb6beabdd2587b3c42 + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.3": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -28749,7 +28770,7 @@ __metadata: "@backstage/create-app": "workspace:^" "@backstage/errors": "workspace:^" "@types/fs-extra": "npm:^11.0.0" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" chalk: "npm:^4.0.0" commander: "npm:^12.0.0" cross-fetch: "npm:^4.0.0" @@ -31443,7 +31464,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:11.3.2, fs-extra@npm:^11.0.0, fs-extra@npm:^11.1.0, fs-extra@npm:^11.2.0": +"fs-extra@npm:11.3.2, fs-extra@npm:^11.0.0, fs-extra@npm:^11.1.0, fs-extra@npm:^11.2.0, fs-extra@npm:~11.3.0": version: 11.3.2 resolution: "fs-extra@npm:11.3.2" dependencies: @@ -31477,7 +31498,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^7.0.1, fs-extra@npm:~7.0.1": +"fs-extra@npm:^7.0.1": version: 7.0.1 resolution: "fs-extra@npm:7.0.1" dependencies: @@ -34528,13 +34549,13 @@ __metadata: languageName: node linkType: hard -"isolated-vm@npm:^5.0.1": - version: 5.0.4 - resolution: "isolated-vm@npm:5.0.4" +"isolated-vm@npm:^6.0.1": + version: 6.0.2 + resolution: "isolated-vm@npm:6.0.2" dependencies: node-gyp: "npm:latest" - prebuild-install: "npm:^7.1.2" - checksum: 10/f48e69ecf907645711d0a372cb6adb28cf72499e34b6e008ed597994bfd90d41dd11dc478a41fc21a25aaef424ab5a95a372286e4daf7f61e231d028c0fd64ec + prebuild-install: "npm:^7.1.3" + checksum: 10/74e97f13678023bf81141a6fb5c91bc179073a024e7f0a568af60d876b781b15b11e02d4012558e7d583e38a553ccccff70fd02645ed5d7bed2150dc3921fa64 languageName: node linkType: hard @@ -35365,7 +35386,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:=4.1.1, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1": +"js-yaml@npm:=4.1.1, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0, js-yaml@npm:^4.1.1, js-yaml@npm:~4.1.0": version: 4.1.1 resolution: "js-yaml@npm:4.1.1" dependencies: @@ -35388,18 +35409,6 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:~3.13.1": - version: 3.13.1 - resolution: "js-yaml@npm:3.13.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10/cec89175b065743875fce53e63adc8b89aded77e18d00e54ff80c57ab730f22ccfddaf2fe3e6adab1d6dff59a3d55dd9ae6fc711d46335b7e94c32d3583a5627 - languageName: node - linkType: hard - "jsbn@npm:1.1.0, jsbn@npm:^1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -38400,6 +38409,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:10.0.3": + version: 10.0.3 + resolution: "minimatch@npm:10.0.3" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10/d5b8b2538b367f2cfd4aeef27539fddeee58d1efb692102b848e4a968a09780a302c530eb5aacfa8c57f7299155fb4b4e85219ad82664dcef5c66f657111d9b8 + languageName: node + linkType: hard + "minimatch@npm:3.1.2, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -38454,15 +38472,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:~3.0.3": - version: 3.0.8 - resolution: "minimatch@npm:3.0.8" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10/6df5373cb1ea79020beb6887ff5576c58cfabcfd32c5a65c2cf58f326e4ee8eae84f129e5fa50b8a4347fa1d1e583f931285c9fb3040d984bdfb5109ef6607ec - languageName: node - linkType: hard - "minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -39070,10 +39079,10 @@ __metadata: languageName: node linkType: hard -"napi-build-utils@npm:^1.0.1": - version: 1.0.2 - resolution: "napi-build-utils@npm:1.0.2" - checksum: 10/276feb8e30189fe18718e85b6f82e4f952822baa2e7696f771cc42571a235b789dc5907a14d9ffb6838c3e4ff4c25717c2575e5ce1cf6e02e496e204c11e57f6 +"napi-build-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "napi-build-utils@npm:2.0.0" + checksum: 10/69adcdb828481737f1ec64440286013f6479d5b264e24d5439ba795f65293d0bb6d962035de07c65fae525ed7d2fcd0baab6891d8e3734ea792fec43918acf83 languageName: node linkType: hard @@ -42112,16 +42121,16 @@ __metadata: languageName: node linkType: hard -"prebuild-install@npm:^7.1.1, prebuild-install@npm:^7.1.2": - version: 7.1.2 - resolution: "prebuild-install@npm:7.1.2" +"prebuild-install@npm:^7.1.1, prebuild-install@npm:^7.1.3": + version: 7.1.3 + resolution: "prebuild-install@npm:7.1.3" dependencies: detect-libc: "npm:^2.0.0" expand-template: "npm:^2.0.3" github-from-package: "npm:0.0.0" minimist: "npm:^1.2.3" mkdirp-classic: "npm:^0.5.3" - napi-build-utils: "npm:^1.0.1" + napi-build-utils: "npm:^2.0.0" node-abi: "npm:^3.3.0" pump: "npm:^3.0.0" rc: "npm:^1.2.7" @@ -42130,7 +42139,7 @@ __metadata: tunnel-agent: "npm:^0.6.0" bin: prebuild-install: bin.js - checksum: 10/32d5c026cc978dd02762b9ad3c765178aee8383aeac4303fed3cd226eff53100db038d4791b03ae1ebc7d213a7af392d26e32095579cedb8dba1d00ad08ecd46 + checksum: 10/1b7e4c00d2750b532a4fc2a83ffb0c5fefa1b6f2ad071896ead15eeadc3255f5babd816949991af083cf7429e375ae8c7d1c51f73658559da36f948a020a3a11 languageName: node linkType: hard @@ -44826,7 +44835,7 @@ __metadata: "@types/cacheable-request": "npm:^8.3.6" "@types/global-agent": "npm:^2.1.3" "@types/memjs": "npm:^1.3.3" - "@types/node": "npm:^20.16.0" + "@types/node": "npm:^22.13.14" "@types/webpack": "npm:^5.28.0" "@useoptic/optic": "npm:^1.0.0" array-to-table: "npm:^1.0.1" @@ -48360,13 +48369,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.4.2": - version: 5.4.2 - resolution: "typescript@npm:5.4.2" +"typescript@npm:5.8.2": + version: 5.8.2 + resolution: "typescript@npm:5.8.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/f8cfdc630ab1672f004e9561eb2916935b2d267792d07ce93e97fc601c7a65191af32033d5e9c0169b7dc37da7db9bf320f7432bc84527cb7697effaa4e4559d + checksum: 10/dbc2168a55d56771f4d581997be52bab5cbc09734fec976cfbaabd787e61fb4c6cf9125fd48c6f98054ce549c77ecedefc7f64252a830dd8e9c3381f61fbeb78 languageName: node linkType: hard @@ -48400,13 +48409,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.4.2#optional!builtin": - version: 5.4.2 - resolution: "typescript@patch:typescript@npm%3A5.4.2#optional!builtin::version=5.4.2&hash=5adc0c" +"typescript@patch:typescript@npm%3A5.8.2#optional!builtin": + version: 5.8.2 + resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/f5f9a4133c2670761f0166eae5b3bafbc4a3fc24f0f42a93c9c893d9e9d6e66ea066969c5e7483fa66b4ae0e99125592553f3b92fd3599484de8be13b0615176 + checksum: 10/97920a082ffc57583b1cb6bc4faa502acc156358e03f54c7fc7fdf0b61c439a717f4c9070c449ee9ee683d4cfc3bb203127c2b9794b2950f66d9d307a4ff262c languageName: node linkType: hard @@ -48549,10 +48558,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: 10/cf0b48ed4fc99baf56584afa91aaffa5010c268b8842f62e02f752df209e3dea138b372a60a963b3b2576ed932f32329ce7ddb9cb5f27a6c83040d8cd74b7a70 +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10/ec8f41aa4359d50f9b59fa61fe3efce3477cc681908c8f84354d8567bb3701fafdddf36ef6bff307024d3feb42c837cf6f670314ba37fc8145e219560e473d14 languageName: node linkType: hard From e38052ec3a3f532cc7d3d996478c964580122c3e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 10:10:08 +0000 Subject: [PATCH 249/312] fix(deps): update nextjs monorepo to v15.5.7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/package.json | 6 +-- docs-ui/yarn.lock | 114 +++++++++++++++++++++---------------------- 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/docs-ui/package.json b/docs-ui/package.json index 9f3f7808c5..dce79fe140 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -24,7 +24,7 @@ "@lezer/highlight": "^1.2.1", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", - "@next/mdx": "15.5.6", + "@next/mdx": "15.5.7", "@remixicon/react": "^4.6.0", "@storybook/react": "^8.6.12", "@uiw/codemirror-themes": "^4.23.7", @@ -32,7 +32,7 @@ "clsx": "^2.1.1", "html-react-parser": "^5.2.5", "motion": "^12.4.1", - "next": "15.4.8", + "next": "15.5.7", "next-mdx-remote-client": "^2.1.2", "prop-types": "^15.8.1", "react": "19.1.1", @@ -49,7 +49,7 @@ "@types/react-dom": "19.1.7", "chokidar": "^3.6.0", "eslint": "^8", - "eslint-config-next": "15.5.6", + "eslint-config-next": "15.5.7", "lightningcss": "^1.28.2", "typescript": "^5", "unified": "^11.0.4" diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index fbcbbe3fef..3634aca929 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -854,25 +854,25 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.4.8": - version: 15.4.8 - resolution: "@next/env@npm:15.4.8" - checksum: 10/1e809a53745626a2806657b31b10c8b28da47a6c6efa99cb68dd5f501664e9a2a79fa64287435e338d86b00e59b74cd96e9fb6ed55b918972b61008d3ac3d789 +"@next/env@npm:15.5.7": + version: 15.5.7 + resolution: "@next/env@npm:15.5.7" + checksum: 10/11f971691018bd62a5bf253fc843fb2a6cf1431468f5c3a9d4d41753a6ff3e8bf7f539f46aba3f58f8bac59e681bf05fb5d771ac08d7dbd966a601257e1368bf languageName: node linkType: hard -"@next/eslint-plugin-next@npm:15.5.6": - version: 15.5.6 - resolution: "@next/eslint-plugin-next@npm:15.5.6" +"@next/eslint-plugin-next@npm:15.5.7": + version: 15.5.7 + resolution: "@next/eslint-plugin-next@npm:15.5.7" dependencies: fast-glob: "npm:3.3.1" - checksum: 10/67faf90bcf5735deff9cb9c18dc521af397209976db7bf39217f0f417134da55320dd61e2a6c9094193405ebf72203b9364fef6cf600b7d8fc84a5e5f7bd4edc + checksum: 10/5b59860aeccc0d07a979c40e4405b410a9d7aa86a235d5dc0edbac8d2da35586f6f2fa3407cd3d80fd7e7d4f197c70291e9c6e71a64942d09b8fe82470e90ee0 languageName: node linkType: hard -"@next/mdx@npm:15.5.6": - version: 15.5.6 - resolution: "@next/mdx@npm:15.5.6" +"@next/mdx@npm:15.5.7": + version: 15.5.7 + resolution: "@next/mdx@npm:15.5.7" dependencies: source-map: "npm:^0.7.0" peerDependencies: @@ -883,62 +883,62 @@ __metadata: optional: true "@mdx-js/react": optional: true - checksum: 10/a0b7ca6cb9e06e0be27f8581580921185767ff50ec3c03414a77e8a90dbb696317efe4da4fc9f3ad900b866ae53aa04ee726d7abac55fba03aabd5ed834aa030 + checksum: 10/caf2ad1e3a8b02381ad33fe32f59e2ef4c15c96a04ba2a7d713991c142214d3b69d25b879ffc12da1c333ffd34d30aec44061d740f708c8e12529b183a159146 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-darwin-arm64@npm:15.4.8" +"@next/swc-darwin-arm64@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-darwin-arm64@npm:15.5.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-darwin-x64@npm:15.4.8" +"@next/swc-darwin-x64@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-darwin-x64@npm:15.5.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-linux-arm64-gnu@npm:15.4.8" +"@next/swc-linux-arm64-gnu@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-arm64-gnu@npm:15.5.7" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-linux-arm64-musl@npm:15.4.8" +"@next/swc-linux-arm64-musl@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-arm64-musl@npm:15.5.7" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-linux-x64-gnu@npm:15.4.8" +"@next/swc-linux-x64-gnu@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-x64-gnu@npm:15.5.7" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-linux-x64-musl@npm:15.4.8" +"@next/swc-linux-x64-musl@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-x64-musl@npm:15.5.7" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-win32-arm64-msvc@npm:15.4.8" +"@next/swc-win32-arm64-msvc@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-win32-arm64-msvc@npm:15.5.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.4.8": - version: 15.4.8 - resolution: "@next/swc-win32-x64-msvc@npm:15.4.8" +"@next/swc-win32-x64-msvc@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-win32-x64-msvc@npm:15.5.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2515,7 +2515,7 @@ __metadata: "@lezer/highlight": "npm:^1.2.1" "@mdx-js/loader": "npm:^3.1.0" "@mdx-js/react": "npm:^3.1.0" - "@next/mdx": "npm:15.5.6" + "@next/mdx": "npm:15.5.7" "@octokit/rest": "npm:^22.0.1" "@remixicon/react": "npm:^4.6.0" "@shikijs/transformers": "npm:^3.13.0" @@ -2529,11 +2529,11 @@ __metadata: chokidar: "npm:^3.6.0" clsx: "npm:^2.1.1" eslint: "npm:^8" - eslint-config-next: "npm:15.5.6" + eslint-config-next: "npm:15.5.7" html-react-parser: "npm:^5.2.5" lightningcss: "npm:^1.28.2" motion: "npm:^12.4.1" - next: "npm:15.4.8" + next: "npm:15.5.7" next-mdx-remote-client: "npm:^2.1.2" prop-types: "npm:^15.8.1" react: "npm:19.1.1" @@ -2942,11 +2942,11 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:15.5.6": - version: 15.5.6 - resolution: "eslint-config-next@npm:15.5.6" +"eslint-config-next@npm:15.5.7": + version: 15.5.7 + resolution: "eslint-config-next@npm:15.5.7" dependencies: - "@next/eslint-plugin-next": "npm:15.5.6" + "@next/eslint-plugin-next": "npm:15.5.7" "@rushstack/eslint-patch": "npm:^1.10.3" "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -2962,7 +2962,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/6efc0a3444ca51adbc0b82e945a1988e1bd42bc153bd64fbbe10ae0e34d8473256e516f2afb138ecbba401802691fedea18d9f7fe798fbd79b4ccf8705c83554 + checksum: 10/fd1813c7ef4e33ec297b86dd0de75879e10514b12cb04a103e7a5b8c5f27d2ea0a91dd15e6d530006c9fe3e7e18f815e900bd6ba117c3b8fbe311c38c340d899 languageName: node linkType: hard @@ -5342,19 +5342,19 @@ __metadata: languageName: node linkType: hard -"next@npm:15.4.8": - version: 15.4.8 - resolution: "next@npm:15.4.8" +"next@npm:15.5.7": + version: 15.5.7 + resolution: "next@npm:15.5.7" dependencies: - "@next/env": "npm:15.4.8" - "@next/swc-darwin-arm64": "npm:15.4.8" - "@next/swc-darwin-x64": "npm:15.4.8" - "@next/swc-linux-arm64-gnu": "npm:15.4.8" - "@next/swc-linux-arm64-musl": "npm:15.4.8" - "@next/swc-linux-x64-gnu": "npm:15.4.8" - "@next/swc-linux-x64-musl": "npm:15.4.8" - "@next/swc-win32-arm64-msvc": "npm:15.4.8" - "@next/swc-win32-x64-msvc": "npm:15.4.8" + "@next/env": "npm:15.5.7" + "@next/swc-darwin-arm64": "npm:15.5.7" + "@next/swc-darwin-x64": "npm:15.5.7" + "@next/swc-linux-arm64-gnu": "npm:15.5.7" + "@next/swc-linux-arm64-musl": "npm:15.5.7" + "@next/swc-linux-x64-gnu": "npm:15.5.7" + "@next/swc-linux-x64-musl": "npm:15.5.7" + "@next/swc-win32-arm64-msvc": "npm:15.5.7" + "@next/swc-win32-x64-msvc": "npm:15.5.7" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -5397,7 +5397,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/3fc5d3d79c20af819efcf34342b55ee64025a7f6353ced4f17da303750107a8eb40c484b83d8f2352109f2dd7d137ff1f1228956b53dbf4f1f2fce0a3349eb18 + checksum: 10/bfac0cbac41b36227ec91d3a0727561f73dfc35d6a78eafd0200528ef95fa2e9d2dba5a8c8922864b4f4e4321ae6a07c6cf8f5766ac3192ad03e68516c3a458a languageName: node linkType: hard From 3b5baa9f3173432844e36e9aa8933e18031f5be7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 11:06:43 +0000 Subject: [PATCH 250/312] chore(deps): update dependency react-hook-form to v7.68.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 2b48cc86d6..b96a76ddfa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43239,11 +43239,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.12.2": - version: 7.67.0 - resolution: "react-hook-form@npm:7.67.0" + version: 7.68.0 + resolution: "react-hook-form@npm:7.68.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10/0e74a48b2da0f79166d5c6701f78a08fd5165e901e46ce5a578f0a2f25005e861023ffb35c1a96373c23701a84c3fce2111c4aced824d2ca08c9b2420a645551 + checksum: 10/c9624924cd324ee5560de51715361d754d24591734b1cf2b87c95477d35f5ca01b10e94d477bebe215afd37914c5cdbd4a717ead910d8de67f346f517f5a8d92 languageName: node linkType: hard From 805c48d23d742e0a6bb735f4c6b316b8eb8a3dc7 Mon Sep 17 00:00:00 2001 From: Jonas Beck Date: Mon, 8 Dec 2025 12:37:02 +0100 Subject: [PATCH 251/312] feat(events): restructure kafka module and add publisher Signed-off-by: Jonas Beck --- .../events-backend-module-kafka/config.d.ts | 495 ++++++++++++------ .../KafkaConsumingEventPublisher.test.ts | 163 ++++++ .../KafkaConsumingEventPublisher.ts | 109 ++++ .../config.test.ts | 275 ++++++++++ .../KafkaConsumingEventPublisher/config.ts | 91 ++++ .../src/KafkaConsumingEventPublisher/index.ts | 16 + .../module.test.ts | 122 +++++ .../module.ts} | 20 +- .../KafkaPublishingEventConsumer.test.ts | 106 ++++ .../KafkaPublishingEventConsumer.ts | 115 ++++ .../config.test.ts | 360 +++++++++++++ .../KafkaPublishingEventConsumer/config.ts | 82 +++ .../src/KafkaPublishingEventConsumer/index.ts | 16 + .../module.test.ts | 122 +++++ .../KafkaPublishingEventConsumer/module.ts | 56 ++ .../events-backend-module-kafka/src/index.ts | 16 +- .../src/publisher/KafkaConsumerClient.test.ts | 132 ----- .../src/publisher/KafkaConsumerClient.ts | 77 --- .../KafkaConsumingEventPublisher.test.ts | 92 ---- .../publisher/KafkaConsumingEventPublisher.ts | 109 ---- .../src/publisher/config.test.ts | 250 --------- .../src/publisher/config.ts | 153 ------ ...ModuleKafkaConsumingEventPublisher.test.ts | 85 --- .../LoggerServiceAdapter.ts | 0 .../src/utils/config.test.ts | 235 +++++++++ .../src/utils/config.ts | 84 +++ .../src/utils/kafkaTransformers.test.ts | 137 +++++ .../src/utils/kafkaTransformers.ts | 49 ++ 28 files changed, 2504 insertions(+), 1063 deletions(-) create mode 100644 plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.test.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/index.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/module.test.ts rename plugins/events-backend-module-kafka/src/{service/eventsModuleKafkaConsumingEventPublisher.ts => KafkaConsumingEventPublisher/module.ts} (69%) create mode 100644 plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.test.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.test.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/index.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.test.ts create mode 100644 plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.ts delete mode 100644 plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.test.ts delete mode 100644 plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.ts delete mode 100644 plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.test.ts delete mode 100644 plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts delete mode 100644 plugins/events-backend-module-kafka/src/publisher/config.test.ts delete mode 100644 plugins/events-backend-module-kafka/src/publisher/config.ts delete mode 100644 plugins/events-backend-module-kafka/src/service/eventsModuleKafkaConsumingEventPublisher.test.ts rename plugins/events-backend-module-kafka/src/{publisher => utils}/LoggerServiceAdapter.ts (100%) create mode 100644 plugins/events-backend-module-kafka/src/utils/config.test.ts create mode 100644 plugins/events-backend-module-kafka/src/utils/config.ts create mode 100644 plugins/events-backend-module-kafka/src/utils/kafkaTransformers.test.ts create mode 100644 plugins/events-backend-module-kafka/src/utils/kafkaTransformers.ts diff --git a/plugins/events-backend-module-kafka/config.d.ts b/plugins/events-backend-module-kafka/config.d.ts index 49c417098c..b3698a8999 100644 --- a/plugins/events-backend-module-kafka/config.d.ts +++ b/plugins/events-backend-module-kafka/config.d.ts @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { HumanDuration } from '@backstage/types'; export interface Config { @@ -25,179 +24,373 @@ export interface Config { kafka?: { /** * Configuration for KafkaConsumingEventPublisher + * + * Supports multiple named instances as a record where each key is a unique name + * for the Kafka consumer configuration. */ kafkaConsumingEventPublisher?: { - /** - * (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. - */ - clientId: string; - /** - * (Required) List of brokers in the Kafka cluster to connect to. - */ - brokers: string[]; - /** - * Optional SSL connection parameters to connect to the cluster. Passed directly to Node tls.connect. - * See https://nodejs.org/dist/latest-v8.x/docs/api/tls.html#tls_tls_createsecurecontext_options - */ - ssl?: - | { - ca?: string[]; - /** @visibility secret */ - key?: string; - cert?: string; - rejectUnauthorized?: boolean; - } - | boolean; - /** - * Optional SASL connection parameters. - */ - sasl?: { - mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512'; - username: string; - /** @visibility secret */ - password: string; - }; - - /** - * Optional retry connection parameters. - */ - retry: { + [name: string]: { /** - * (Optional) Maximum wait time for a retry - * Default: 30000 ms. + * (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. */ - maxRetryTime: HumanDuration | string; + clientId: string; + /** + * (Required) List of brokers in the Kafka cluster to connect to. + */ + brokers: string[]; + /** + * Optional SSL connection parameters to connect to the cluster. Passed directly to Node tls.connect. + * See https://nodejs.org/dist/latest-v8.x/docs/api/tls.html#tls_tls_createsecurecontext_options + */ + ssl?: + | { + ca?: string[]; + /** @visibility secret */ + key?: string; + cert?: string; + rejectUnauthorized?: boolean; + } + | boolean; + /** + * Optional SASL connection parameters. + */ + sasl?: { + mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512'; + username: string; + /** @visibility secret */ + password: string; + }; /** - * (Optional) Initial value used to calculate the retry (This is still randomized following the randomization factor) - * Default: 300 ms. + * Optional retry connection parameters. */ - initialRetryTime: HumanDuration | string; - - /** - * (Optional) Randomization factor - * Default: 0.2. - */ - factor: number; - - /** - * (Optional) Exponential factor - * Default: 2. - */ - multiplier: number; - - /** - * (Optional) Max number of retries per call - * Default: 5. - */ - retries: number; - }; - - /** - * (Optional) Timeout for authentication requests. - * Default: 10000 ms. - */ - authenticationTimeout: HumanDuration | string; - - /** - * (Optional) Time to wait for a successful connection. - * Default: 1000 ms. - */ - connectionTimeout: HumanDuration | string; - - /** - * (Optional) Time to wait for a successful request. - * Default: 30000 ms. - */ - requestTimeout: HumanDuration | string; - - /** - * (Optional) The request timeout can be disabled by setting enforceRequestTimeout to false. - * Default: true - */ - enforceRequestTimeout: boolean; - - /** - * Contains a object per topic for which an Kafka queue - * should be used as source of events. - */ - topics: Array<{ - /** - * (Required) The Backstage topic to publish to - */ - topic: string; - /** - * (Required) KafkaConsumer-related configuration. - */ - kafka: { + retry?: { /** - * (Required) The Kafka topics to subscribe to - */ - topics: string[]; - /** - * (Required) The GroupId to be used by the topic consumers - */ - groupId: string; - - /** - * (Optional) Timeout used to detect failures. - * The consumer sends periodic heartbeats to indicate its liveness to the broker. - * If no heartbeats are received by the broker before the expiration of this session timeout, - * then the broker will remove this consumer from the group and initiate a rebalance + * (Optional) Maximum wait time for a retry * Default: 30000 ms. */ - sessionTimeout: HumanDuration | string; + maxRetryTime?: HumanDuration | string; /** - * (Optional) The maximum time that the coordinator will wait for each member to rejoin when rebalancing the group - * Default: 60000 ms. + * (Optional) Initial value used to calculate the retry (This is still randomized following the randomization factor) + * Default: 300 ms. */ - rebalanceTimeout: HumanDuration | string; + initialRetryTime?: HumanDuration | string; /** - * (Optional) The expected time between heartbeats to the consumer coordinator. - * Heartbeats are used to ensure that the consumer's session stays active. - * The value must be set lower than session timeout - * Default: 3000 ms. + * (Optional) Randomization factor + * Default: 0.2. */ - heartbeatInterval: HumanDuration | string; + factor?: number; /** - * (Optional) The period of time after which we force a refresh of metadata - * even if we haven't seen any partition leadership changes to proactively discover any new brokers or partitions - * Default: 300000 ms (5 minutes). + * (Optional) Exponential factor + * Default: 2. */ - metadataMaxAge: HumanDuration | string; + multiplier?: number; /** - * (Optional) The maximum amount of data per-partition the server will return. - * This size must be at least as large as the maximum message size the server allows - * or else it is possible for the producer to send messages larger than the consumer can fetch. - * If that happens, the consumer can get stuck trying to fetch a large message on a certain partition - * Default: 1048576 (1MB) + * (Optional) Max number of retries per call + * Default: 5. */ - maxBytesPerPartition: number; - - /** - * (Optional) Minimum amount of data the server should return for a fetch request, otherwise wait up to maxWaitTime for more data to accumulate. - * Default: 1 - */ - minBytes: number; - - /** - * (Optional) Maximum amount of bytes to accumulate in the response. Supported by Kafka >= 0.10.1.0 - * Default: 10485760 (10MB) - */ - maxBytes: number; - - /** - * (Optional) The maximum amount of time the server will block before answering the fetch request - * if there isn’t sufficient data to immediately satisfy the requirement given by minBytes - * Default: 5000 - */ - maxWaitTime: HumanDuration | string; + retries?: number; }; - }>; + + /** + * (Optional) Timeout for authentication requests. + * Default: 10000 ms. + */ + authenticationTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful connection. + * Default: 1000 ms. + */ + connectionTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful request. + * Default: 30000 ms. + */ + requestTimeout?: HumanDuration | string; + + /** + * (Optional) The request timeout can be disabled by setting enforceRequestTimeout to false. + * Default: true + */ + enforceRequestTimeout?: boolean; + + /** + * Contains an object per topic for which a Kafka queue + * should be used as source of events. + */ + topics: Array<{ + /** + * (Required) The Backstage topic to publish to + */ + topic: string; + /** + * (Required) KafkaConsumer-related configuration. + */ + kafka: { + /** + * (Required) The Kafka topics to subscribe to + */ + topics: string[]; + /** + * (Required) The GroupId to be used by the topic consumers + */ + groupId: string; + + /** + * (Optional) Timeout used to detect failures. + * The consumer sends periodic heartbeats to indicate its liveness to the broker. + * If no heartbeats are received by the broker before the expiration of this session timeout, + * then the broker will remove this consumer from the group and initiate a rebalance + * Default: 30000 ms. + */ + sessionTimeout?: HumanDuration | string; + + /** + * (Optional) The maximum time that the coordinator will wait for each member to rejoin when rebalancing the group + * Default: 60000 ms. + */ + rebalanceTimeout?: HumanDuration | string; + + /** + * (Optional) The expected time between heartbeats to the consumer coordinator. + * Heartbeats are used to ensure that the consumer's session stays active. + * The value must be set lower than session timeout + * Default: 3000 ms. + */ + heartbeatInterval?: HumanDuration | string; + + /** + * (Optional) The period of time after which we force a refresh of metadata + * even if we haven't seen any partition leadership changes to proactively discover any new brokers or partitions + * Default: 300000 ms (5 minutes). + */ + metadataMaxAge?: HumanDuration | string; + + /** + * (Optional) The maximum amount of data per-partition the server will return. + * This size must be at least as large as the maximum message size the server allows + * or else it is possible for the producer to send messages larger than the consumer can fetch. + * If that happens, the consumer can get stuck trying to fetch a large message on a certain partition + * Default: 1048576 (1MB) + */ + maxBytesPerPartition?: number; + + /** + * (Optional) Minimum amount of data the server should return for a fetch request, otherwise wait up to maxWaitTime for more data to accumulate. + * Default: 1 + */ + minBytes?: number; + + /** + * (Optional) Maximum amount of bytes to accumulate in the response. Supported by Kafka >= 0.10.1.0 + * Default: 10485760 (10MB) + */ + maxBytes?: number; + + /** + * (Optional) The maximum amount of time the server will block before answering the fetch request + * if there isn't sufficient data to immediately satisfy the requirement given by minBytes + * Default: 5000 + */ + maxWaitTime?: HumanDuration | string; + }; + }>; + }; + }; + + /** + * Configuration for KafkaPublishingEventConsumer + * + * Supports multiple named instances as a record where each key is a unique name + * for the Kafka producer configuration. + */ + kafkaPublishingEventConsumer?: { + [name: string]: { + /** + * (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. + */ + clientId: string; + /** + * (Required) List of brokers in the Kafka cluster to connect to. + */ + brokers: string[]; + /** + * Optional SSL connection parameters to connect to the cluster. Passed directly to Node tls.connect. + * See https://nodejs.org/dist/latest-v8.x/docs/api/tls.html#tls_tls_createsecurecontext_options + */ + ssl?: + | { + ca?: string[]; + /** @visibility secret */ + key?: string; + cert?: string; + rejectUnauthorized?: boolean; + } + | boolean; + /** + * Optional SASL connection parameters. + */ + sasl?: { + mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512'; + username: string; + /** @visibility secret */ + password: string; + }; + + /** + * Optional retry connection parameters. + */ + retry?: { + /** + * (Optional) Maximum wait time for a retry + * Default: 30000 ms. + */ + maxRetryTime?: HumanDuration | string; + + /** + * (Optional) Initial value used to calculate the retry (This is still randomized following the randomization factor) + * Default: 300 ms. + */ + initialRetryTime?: HumanDuration | string; + + /** + * (Optional) Randomization factor + * Default: 0.2. + */ + factor?: number; + + /** + * (Optional) Exponential factor + * Default: 2. + */ + multiplier?: number; + + /** + * (Optional) Max number of retries per call + * Default: 5. + */ + retries?: number; + }; + + /** + * (Optional) Timeout for authentication requests. + * Default: 10000 ms. + */ + authenticationTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful connection. + * Default: 1000 ms. + */ + connectionTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful request. + * Default: 30000 ms. + */ + requestTimeout?: HumanDuration | string; + + /** + * (Optional) The request timeout can be disabled by setting enforceRequestTimeout to false. + * Default: true + */ + enforceRequestTimeout?: boolean; + + /** + * Contains an object per topic for which a Kafka queue + * should be used as destination for events. + */ + topics: Array<{ + /** + * (Required) The Backstage topic to consume from + */ + topic: string; + /** + * (Required) KafkaProducer-related configuration. + */ + kafka: { + /** + * (Required) The Kafka topic to publish to + */ + topic: string; + + /** + * (Optional) Allow topic creation when querying metadata for non-existent topics. + * Default: true + */ + allowAutoTopicCreation?: boolean; + + /** + * (Optional) The period of time after which we force a refresh of metadata + * even if we haven't seen any partition leadership changes to proactively discover any new brokers or partitions + * Default: 300000 ms (5 minutes). + */ + metadataMaxAge?: HumanDuration | string; + + /** + * (Optional) The maximum amount of time in ms that the transaction coordinator will wait for a transaction status update + * from the producer before proactively aborting the ongoing transaction. + * If this value is larger than the `transaction.max.timeout.ms`` setting in the broker, the request will fail with a `InvalidTransactionTimeout` error + * Default: 60000 ms. + */ + transactionTimeout?: HumanDuration | string; + + /** + * (Optional) Experimental. If enabled producer will ensure each message is written exactly once. Acks must be set to -1 ("all"). + * Retries will default to MAX_SAFE_INTEGER. + * Default: false. + */ + idempotent?: boolean; + + /** + * (Optional) Max number of requests that may be in progress at any time. If falsey then no limit. + * Default: null. + */ + maxInFlightRequests?: number; + + /** + * Optional retry connection parameters. + */ + retry?: { + /** + * (Optional) Maximum wait time for a retry + * Default: 30000 ms. + */ + maxRetryTime?: HumanDuration | string; + + /** + * (Optional) Initial value used to calculate the retry (This is still randomized following the randomization factor) + * Default: 300 ms. + */ + initialRetryTime?: HumanDuration | string; + + /** + * (Optional) Randomization factor + * Default: 0.2. + */ + factor?: number; + + /** + * (Optional) Exponential factor + * Default: 2. + */ + multiplier?: number; + + /** + * (Optional) Max number of retries per call + * Default: 5. + */ + retries?: number; + }; + }; + }>; + }; }; }; }; diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.test.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.test.ts new file mode 100644 index 0000000000..98781936b0 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.test.ts @@ -0,0 +1,163 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { KafkaConsumingEventPublisher } from './KafkaConsumingEventPublisher'; +import { Kafka } from 'kafkajs'; +import { ConfigReader } from '@backstage/config'; +import { mockServices } from '@backstage/backend-test-utils'; + +jest.mock('kafkajs'); + +describe('KafkaConsumingEventPublisher', () => { + const mockLogger = mockServices.logger.mock(); + const mockEvents = mockServices.events.mock(); + + const mockConsumer = { + connect: jest.fn(), + disconnect: jest.fn(), + subscribe: jest.fn(), + run: jest.fn(), + }; + + const mockKafkaClient = { + consumer: jest.fn().mockReturnValue(mockConsumer), + } as unknown as Kafka; + + jest.mocked(Kafka).mockImplementation(() => mockKafkaClient); + + const mockConfig = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaConsumingEventPublisher: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + topics: [ + { + topic: 'backstage-topic', + kafka: { + topics: ['test-topic'], + groupId: 'test-group', + }, + }, + ], + }, + }, + }, + }, + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should create instances from config', () => { + const consumers = KafkaConsumingEventPublisher.fromConfig({ + config: mockConfig, + events: mockEvents, + logger: mockLogger, + }); + + expect(consumers).toBeInstanceOf(Array); + expect(consumers).toHaveLength(1); + expect(consumers[0]).toBeInstanceOf(KafkaConsumingEventPublisher); + }); + + it('should return empty array when no config', () => { + const consumers = KafkaConsumingEventPublisher.fromConfig({ + config: new ConfigReader({}), + events: mockEvents, + logger: mockLogger, + }); + + expect(consumers).toEqual([]); + }); + + it('should start all consumers', async () => { + const consumers = KafkaConsumingEventPublisher.fromConfig({ + config: mockConfig, + events: mockEvents, + logger: mockLogger, + }); + + expect(consumers).toHaveLength(1); + + await consumers[0].start(); + + expect(mockConsumer.connect).toHaveBeenCalled(); + expect(mockConsumer.subscribe).toHaveBeenCalledWith({ + topics: ['test-topic'], + }); + expect(mockConsumer.run).toHaveBeenCalled(); + }); + + it('should shutdown all consumers', async () => { + const consumers = KafkaConsumingEventPublisher.fromConfig({ + config: mockConfig, + events: mockEvents, + logger: mockLogger, + }); + + expect(consumers).toHaveLength(1); + + await consumers[0].shutdown(); + + expect(mockConsumer.disconnect).toHaveBeenCalled(); + }); + + it('should handle multiple consumer configs', () => { + const multiConsumerConfig = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaConsumingEventPublisher: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092'], + topics: [ + { + topic: 'topic1', + kafka: { + topics: ['kafka-topic-1'], + groupId: 'group1', + }, + }, + { + topic: 'topic2', + kafka: { + topics: ['kafka-topic-2'], + groupId: 'group2', + }, + }, + ], + }, + }, + }, + }, + }, + }); + + const consumers = KafkaConsumingEventPublisher.fromConfig({ + config: multiConsumerConfig, + events: mockEvents, + logger: mockLogger, + }); + + expect(consumers).toHaveLength(1); + expect(mockKafkaClient.consumer).toHaveBeenCalledTimes(2); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts new file mode 100644 index 0000000000..41744abff2 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts @@ -0,0 +1,109 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { LoggerService } from '@backstage/backend-plugin-api'; +import { EventsService } from '@backstage/plugin-events-node'; +import { Consumer, Kafka } from 'kafkajs'; +import { + KafkaConsumerConfig, + KafkaConsumingEventPublisherConfig, + readConsumerConfig, +} from './config'; +import { Config } from '@backstage/config'; +import { loggerServiceAdapter } from '../utils/LoggerServiceAdapter'; +import { convertHeadersToMetadata } from '../utils/kafkaTransformers'; + +type KafkaConsumer = { + consumer: Consumer; + config: KafkaConsumerConfig; +}; + +/** + * This class subscribes to Kafka topics and publishes events received to the registered subscriber. + * The message payload will be used as the event payload and passed to the subscribers. + */ +export class KafkaConsumingEventPublisher { + private readonly kafkaConsumers: KafkaConsumer[]; + private readonly logger: LoggerService; + + static fromConfig(env: { + config: Config; + events: EventsService; + logger: LoggerService; + }): KafkaConsumingEventPublisher[] { + const configs = readConsumerConfig(env.config); + + return configs.map( + kafkaConfig => + new KafkaConsumingEventPublisher(env.logger, env.events, kafkaConfig), + ); + } + + private constructor( + logger: LoggerService, + private readonly events: EventsService, + config: KafkaConsumingEventPublisherConfig, + ) { + this.logger = logger.child({ + class: KafkaConsumingEventPublisher.prototype.constructor.name, + instance: config.instance, + }); + + const kafka = new Kafka({ + ...config.kafkaConfig, + logCreator: loggerServiceAdapter(this.logger), + }); + + this.kafkaConsumers = config.kafkaConsumerConfigs.map(consumerConfig => ({ + consumer: kafka.consumer(consumerConfig.consumerConfig), + config: consumerConfig, + })); + } + + async start(): Promise { + await Promise.all( + this.kafkaConsumers.map(async ({ consumer, config }) => { + const consumerLogger = this.logger.child({ + id: `events.kafka.publisher:${config.backstageTopic}`, + groupId: config.consumerConfig.groupId, + kafkaTopics: config.consumerSubscribeTopics.topics.toString(), + backstageTopic: config.backstageTopic, + }); + try { + await consumer.connect(); + await consumer.subscribe(config.consumerSubscribeTopics); + + await consumer.run({ + eachMessage: async ({ message }) => { + this.events.publish({ + topic: config.backstageTopic, + eventPayload: JSON.parse(message.value?.toString()!), + metadata: convertHeadersToMetadata(message.headers), + }); + }, + }); + } catch (error: any) { + consumerLogger.error('Kafka consumer connection failed', error); + } + }), + ); + } + + async shutdown(): Promise { + await Promise.all( + this.kafkaConsumers.map(({ consumer }) => consumer.disconnect()), + ); + } +} diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts new file mode 100644 index 0000000000..b61ee9332e --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts @@ -0,0 +1,275 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ConfigReader } from '@backstage/config'; +import { readConsumerConfig } from './config'; + +describe('readConsumerConfig', () => { + it('not configured', () => { + const publisherConfigs = readConsumerConfig(new ConfigReader({})); + + expect(publisherConfigs).toEqual([]); + }); + + it('only required fields configured', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaConsumingEventPublisher: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + topics: [ + { + topic: 'fake1', + kafka: { + topics: ['topic-A'], + groupId: 'my-group', + }, + }, + { + topic: 'fake2', + kafka: { + topics: ['topic-B'], + groupId: 'my-group', + }, + }, + ], + }, + }, + }, + }, + }, + }); + + const publisherConfigs = readConsumerConfig(config); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(1); + + const devConfig = publisherConfigs[0]; + expect(devConfig.instance).toBe('dev'); + expect(devConfig.kafkaConsumerConfigs.length).toBe(2); + + expect(devConfig.kafkaConfig.clientId).toEqual('backstage-events'); + expect(devConfig.kafkaConfig.brokers).toEqual([ + 'kafka1:9092', + 'kafka2:9092', + ]); + + expect(devConfig.kafkaConsumerConfigs).toEqual([ + { + backstageTopic: 'fake1', + consumerConfig: { + groupId: 'my-group', + }, + consumerSubscribeTopics: { + topics: ['topic-A'], + }, + }, + { + backstageTopic: 'fake2', + consumerConfig: { + groupId: 'my-group', + }, + consumerSubscribeTopics: { + topics: ['topic-B'], + }, + }, + ]); + }); + + it('all fields configured', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaConsumingEventPublisher: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + ssl: true, + sasl: { + mechanism: 'plain', + username: 'username', + password: 'password', + }, + retry: { + maxRetryTime: { milliseconds: 20000 }, + initialRetryTime: { milliseconds: 200 }, + factor: '0.4', + multiplier: '4', + retries: '10', + }, + authenticationTimeout: { milliseconds: 20000 }, + connectionTimeout: { milliseconds: 1500 }, + requestTimeout: { milliseconds: 20000 }, + enforceRequestTimeout: false, + topics: [ + { + topic: 'fake1', + kafka: { + topics: ['topic-A'], + groupId: 'my-group', + sessionTimeout: { milliseconds: 20000 }, + rebalanceTimeout: { milliseconds: 50000 }, + heartbeatInterval: { milliseconds: 2000 }, + metadataMaxAge: { milliseconds: 400000 }, + maxBytesPerPartition: 50000, + minBytes: 2, + maxBytes: 500000, + maxWaitTime: { milliseconds: 4000 }, + }, + }, + { + topic: 'fake2', + kafka: { + topics: ['topic-B'], + groupId: 'my-group', + }, + }, + ], + }, + }, + }, + }, + }, + }); + + const publisherConfigs = readConsumerConfig(config); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(1); + + const devConfig = publisherConfigs[0]; + expect(devConfig.instance).toBe('dev'); + + // Client configuration + expect(devConfig.kafkaConfig.clientId).toEqual('backstage-events'); + expect(devConfig.kafkaConfig.brokers).toEqual([ + 'kafka1:9092', + 'kafka2:9092', + ]); + expect(devConfig.kafkaConfig.ssl).toBeTruthy(); + expect(devConfig.kafkaConfig.sasl).toStrictEqual({ + mechanism: 'plain', + username: 'username', + password: 'password', + }); + expect(devConfig.kafkaConfig.authenticationTimeout).toBe(20000); + expect(devConfig.kafkaConfig.connectionTimeout).toBe(1500); + expect(devConfig.kafkaConfig.requestTimeout).toBe(20000); + expect(devConfig.kafkaConfig.enforceRequestTimeout).toBeFalsy(); + expect(devConfig.kafkaConfig.retry).toStrictEqual({ + maxRetryTime: 20000, + initialRetryTime: 200, + factor: 0.4, + multiplier: 4, + retries: 10, + }); + + // Consumer configuration + expect(devConfig.kafkaConsumerConfigs.length).toBe(2); + + expect(devConfig.kafkaConsumerConfigs).toEqual([ + { + backstageTopic: 'fake1', + consumerConfig: { + groupId: 'my-group', + sessionTimeout: 20000, + rebalanceTimeout: 50000, + heartbeatInterval: 2000, + metadataMaxAge: 400000, + maxBytesPerPartition: 50000, + minBytes: 2, + maxBytes: 500000, + maxWaitTimeInMs: 4000, + }, + consumerSubscribeTopics: { + topics: ['topic-A'], + }, + }, + { + backstageTopic: 'fake2', + consumerConfig: { + groupId: 'my-group', + }, + consumerSubscribeTopics: { + topics: ['topic-B'], + }, + }, + ]); + }); + + it('should handle HumanDuration and string values for durations and timeouts', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaConsumingEventPublisher: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + retry: { + maxRetryTime: { seconds: 1 }, + initialRetryTime: { minutes: 1 }, + factor: 0.4, + multiplier: 4, + retries: 10, + }, + authenticationTimeout: { hours: 1 }, + connectionTimeout: { days: 1 }, + topics: [], + requestTimeout: '1m', + }, + }, + }, + }, + }, + }); + + const publisherConfigs = readConsumerConfig(config); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(1); + + const devConfig = publisherConfigs[0]; + expect(devConfig.instance).toBe('dev'); + + // Client configuration + expect(devConfig.kafkaConfig.clientId).toEqual('backstage-events'); + expect(devConfig.kafkaConfig.brokers).toEqual([ + 'kafka1:9092', + 'kafka2:9092', + ]); + expect(devConfig.kafkaConfig.authenticationTimeout).toBe(3600000); + expect(devConfig.kafkaConfig.connectionTimeout).toBe(86400000); + expect(devConfig.kafkaConfig.requestTimeout).toBe(60000); + expect(devConfig.kafkaConfig.retry).toStrictEqual({ + maxRetryTime: 1000, + initialRetryTime: 60000, + factor: 0.4, + multiplier: 4, + retries: 10, + }); + + // Consumer configuration + expect(devConfig.kafkaConsumerConfigs.length).toBe(0); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts new file mode 100644 index 0000000000..dc9b477770 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts @@ -0,0 +1,91 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Config } from '@backstage/config'; +import { ConsumerConfig, ConsumerSubscribeTopics, KafkaConfig } from 'kafkajs'; +import { + readKafkaConfig, + readOptionalHumanDurationInMs, +} from '../utils/config'; + +export interface KafkaConsumerConfig { + backstageTopic: string; + consumerConfig: ConsumerConfig; + consumerSubscribeTopics: ConsumerSubscribeTopics; +} + +export interface KafkaConsumingEventPublisherConfig { + instance: string; + kafkaConfig: KafkaConfig; + kafkaConsumerConfigs: KafkaConsumerConfig[]; +} + +const CONFIG_PREFIX_PUBLISHER = + 'events.modules.kafka.kafkaConsumingEventPublisher'; + +export const readConsumerConfig = ( + config: Config, +): KafkaConsumingEventPublisherConfig[] => { + const publishers = config.getOptionalConfig(CONFIG_PREFIX_PUBLISHER); + + return ( + publishers?.keys()?.map(publisherKey => { + const publisherConfig = publishers.getConfig(publisherKey); + + return { + instance: publisherKey, + kafkaConfig: readKafkaConfig(publisherConfig), + kafkaConsumerConfigs: publisherConfig + .getConfigArray('topics') + .map(topicConfig => { + return { + backstageTopic: topicConfig.getString('topic'), + consumerConfig: { + groupId: topicConfig.getString('kafka.groupId'), + sessionTimeout: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.sessionTimeout', + ), + rebalanceTimeout: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.rebalanceTimeout', + ), + heartbeatInterval: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.heartbeatInterval', + ), + metadataMaxAge: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.metadataMaxAge', + ), + maxBytesPerPartition: topicConfig.getOptionalNumber( + 'kafka.maxBytesPerPartition', + ), + minBytes: topicConfig.getOptionalNumber('kafka.minBytes'), + maxBytes: topicConfig.getOptionalNumber('kafka.maxBytes'), + maxWaitTimeInMs: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.maxWaitTime', + ), + }, + consumerSubscribeTopics: { + topics: topicConfig.getStringArray('kafka.topics'), + }, + }; + }), + }; + }) ?? [] + ); +}; diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/index.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/index.ts new file mode 100644 index 0000000000..94d36a81e0 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { eventsModuleKafkaConsumingEventPublisher } from './module'; diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/module.test.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/module.test.ts new file mode 100644 index 0000000000..19ac969800 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/module.test.ts @@ -0,0 +1,122 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createServiceFactory } from '@backstage/backend-plugin-api'; +import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; +import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { TestEventsService } from '@backstage/plugin-events-backend-test-utils'; +import { eventsModuleKafkaConsumingEventPublisher } from './module'; +import { KafkaConsumingEventPublisher } from './KafkaConsumingEventPublisher'; + +jest.mock('./KafkaConsumingEventPublisher'); + +describe('eventsModuleKafkaConsumingEventPublisher', () => { + it('should be correctly wired and set up', async () => { + const events = new TestEventsService(); + const eventsServiceFactory = createServiceFactory({ + service: eventsServiceRef, + deps: {}, + async factory({}) { + return events; + }, + }); + + const mockKafkaConsumingEventPublisher = { + start: jest.fn(), + shutdown: jest.fn(), + } as unknown as KafkaConsumingEventPublisher; + + jest + .mocked(KafkaConsumingEventPublisher.fromConfig) + .mockReturnValue([mockKafkaConsumingEventPublisher]); + + await startTestBackend({ + features: [ + eventsServiceFactory, + eventsModuleKafkaConsumingEventPublisher, + mockServices.rootConfig.factory({ + data: { + events: { + modules: { + kafka: { + kafkaConsumingEventPublisher: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + topics: { + fake1: { + kafka: { + topics: ['topic-A'], + groupId: 'my-group', + }, + }, + fake2: { + kafka: { + topics: ['topic-B'], + groupId: 'my-group', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }), + ], + }); + + // Verify that the Kafka consumer client was started + expect(mockKafkaConsumingEventPublisher.start).toHaveBeenCalled(); + + // Verify that the shutdown hook was registered + expect(mockKafkaConsumingEventPublisher.shutdown).not.toHaveBeenCalled(); + }); + + it('should handle empty configuration gracefully', async () => { + const events = new TestEventsService(); + const eventsServiceFactory = createServiceFactory({ + service: eventsServiceRef, + deps: {}, + async factory({}) { + return events; + }, + }); + + jest.mocked(KafkaConsumingEventPublisher.fromConfig).mockReturnValue([]); + + await startTestBackend({ + features: [ + eventsServiceFactory, + eventsModuleKafkaConsumingEventPublisher, + mockServices.rootConfig.factory({ + data: { + events: { + modules: { + kafka: { + // No kafkaConsumingEventPublisher config + }, + }, + }, + }, + }), + ], + }); + + // Verify that fromConfig was called but returned empty array + expect(KafkaConsumingEventPublisher.fromConfig).toHaveBeenCalled(); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/service/eventsModuleKafkaConsumingEventPublisher.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/module.ts similarity index 69% rename from plugins/events-backend-module-kafka/src/service/eventsModuleKafkaConsumingEventPublisher.ts rename to plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/module.ts index b524454ca0..8ad3396c76 100644 --- a/plugins/events-backend-module-kafka/src/service/eventsModuleKafkaConsumingEventPublisher.ts +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/module.ts @@ -17,11 +17,11 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { KafkaConsumerClient } from '../publisher/KafkaConsumerClient'; import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { KafkaConsumingEventPublisher } from './KafkaConsumingEventPublisher'; /** - * Kafka module for the Events plugin. + * Reads messages off of Kafka topics and forwards them into the Backstage events system. * * @public */ @@ -34,22 +34,22 @@ export const eventsModuleKafkaConsumingEventPublisher = createBackendModule({ config: coreServices.rootConfig, events: eventsServiceRef, logger: coreServices.logger, - lifecycle: coreServices.lifecycle, + lifecycle: coreServices.rootLifecycle, }, async init({ config, logger, events, lifecycle }) { - const kafka = KafkaConsumerClient.fromConfig({ + const consumers = KafkaConsumingEventPublisher.fromConfig({ config, events, logger, }); - if (!kafka) { - return; - } + lifecycle.addStartupHook(async () => { + await Promise.all(consumers.map(consumer => consumer.start())); + }); - await kafka.start(); - - lifecycle.addShutdownHook(async () => await kafka.shutdown()); + lifecycle.addShutdownHook(async () => { + await Promise.all(consumers.map(consumer => consumer.shutdown())); + }); }, }); }, diff --git a/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.test.ts b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.test.ts new file mode 100644 index 0000000000..6379605901 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.test.ts @@ -0,0 +1,106 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { KafkaPublishingEventConsumer } from './KafkaPublishingEventConsumer'; +import { Kafka } from 'kafkajs'; +import { mockServices } from '@backstage/backend-test-utils'; +import { ConfigReader } from '@backstage/config'; + +jest.mock('kafkajs'); + +describe('KafkaPublishingEventConsumer', () => { + const mockLogger = mockServices.logger.mock(); + const mockEvents = mockServices.events.mock(); + + const mockProducer = { + connect: jest.fn(), + disconnect: jest.fn(), + send: jest.fn(), + }; + + const mockKafkaClient = { + producer: jest.fn().mockReturnValue(mockProducer), + } as unknown as Kafka; + + jest.mocked(Kafka).mockImplementation(() => mockKafkaClient); + + const mockConfig = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaPublishingEventConsumer: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092'], + topics: [ + { + topic: 'backstage-topic', + kafka: { + topic: 'kafka-topic', + allowAutoTopicCreation: true, + }, + }, + ], + }, + }, + }, + }, + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should create instances from config', () => { + const consumers = KafkaPublishingEventConsumer.fromConfig({ + config: mockConfig, + events: mockEvents, + logger: mockLogger, + }); + + expect(consumers).toHaveLength(1); + expect(consumers[0]).toBeInstanceOf(KafkaPublishingEventConsumer); + }); + + it('should start the consumer and subscribe to events', async () => { + const consumers = KafkaPublishingEventConsumer.fromConfig({ + config: mockConfig, + events: mockEvents, + logger: mockLogger, + }); + + await consumers[0].start(); + + expect(mockProducer.connect).toHaveBeenCalled(); + expect(mockEvents.subscribe).toHaveBeenCalledWith({ + id: 'kafka:publisher:backstage-topic', + topics: ['backstage-topic'], + onEvent: expect.any(Function), + }); + }); + + it('should shutdown the producer', async () => { + const consumers = KafkaPublishingEventConsumer.fromConfig({ + config: mockConfig, + events: mockEvents, + logger: mockLogger, + }); + + await consumers[0].shutdown(); + + expect(mockProducer.disconnect).toHaveBeenCalled(); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.ts b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.ts new file mode 100644 index 0000000000..f9443f2d69 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/KafkaPublishingEventConsumer.ts @@ -0,0 +1,115 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { LoggerService } from '@backstage/backend-plugin-api'; +import { EventParams, EventsService } from '@backstage/plugin-events-node'; +import { Kafka, Producer } from 'kafkajs'; +import { + KafkaPublisherConfig, + KafkaPublishingEventConsumerConfig, + readPublisherConfig, +} from './config'; +import { Config } from '@backstage/config'; +import { loggerServiceAdapter } from '../utils/LoggerServiceAdapter'; +import { payloadToBuffer } from '../utils/kafkaTransformers'; + +type KafkaPublisher = { + producer: Producer; + config: KafkaPublisherConfig; +}; + +/** + * This class subscribes to Backstage internal events and publishes them to Kafka topics. + * The internal event payload will be serialized and sent to the configured Kafka topic. + */ +export class KafkaPublishingEventConsumer { + private readonly kafkaPublishers: KafkaPublisher[]; + private readonly logger: LoggerService; + + static fromConfig(env: { + config: Config; + events: EventsService; + logger: LoggerService; + }): KafkaPublishingEventConsumer[] { + const configs = readPublisherConfig(env.config); + + return configs.map( + kafkaConfig => + new KafkaPublishingEventConsumer(env.logger, env.events, kafkaConfig), + ); + } + + private constructor( + logger: LoggerService, + private readonly events: EventsService, + config: KafkaPublishingEventConsumerConfig, + ) { + this.logger = logger.child({ + class: KafkaPublishingEventConsumer.prototype.constructor.name, + instance: config.instance, + }); + + const kafka = new Kafka({ + ...config.kafkaConfig, + logCreator: loggerServiceAdapter(this.logger), + }); + + this.kafkaPublishers = config.kafkaPublisherConfigs.map( + publisherConfig => ({ + producer: kafka.producer(publisherConfig.producerConfig), + config: publisherConfig, + }), + ); + } + + async start(): Promise { + await Promise.all( + this.kafkaPublishers.map(async ({ producer, config }) => { + try { + await producer.connect(); + + this.events.subscribe({ + id: `kafka:publisher:${config.backstageTopic}`, + topics: [config.backstageTopic], + onEvent: async (params: EventParams) => { + await producer.send({ + topic: config.kafkaTopic, + messages: [ + { + value: payloadToBuffer(params.eventPayload), + }, + ], + }); + }, + }); + this.logger.info( + `Subscribed to EventService, publishing events to external topic: ${config.backstageTopic}`, + ); + } catch (error: any) { + this.logger.error( + `Kafka producer connection failed for topic ${config.backstageTopic}`, + error, + ); + } + }), + ); + } + + async shutdown(): Promise { + await Promise.all( + this.kafkaPublishers.map(({ producer }) => producer.disconnect()), + ); + } +} diff --git a/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.test.ts b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.test.ts new file mode 100644 index 0000000000..bd4d622238 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.test.ts @@ -0,0 +1,360 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ConfigReader } from '@backstage/config'; +import { readPublisherConfig } from './config'; + +describe('readPublisherConfig', () => { + it('not configured', () => { + const publisherConfigs = readPublisherConfig(new ConfigReader({})); + + expect(publisherConfigs).toEqual([]); + }); + + it('only required fields configured', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaPublishingEventConsumer: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + topics: [ + { + topic: 'fake1', + kafka: { + topic: 'topic-A', + }, + }, + { + topic: 'fake2', + kafka: { + topic: 'topic-B', + }, + }, + ], + }, + }, + }, + }, + }, + }); + + const publisherConfigs = readPublisherConfig(config); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(1); + + const devConfig = publisherConfigs[0]; + expect(devConfig.instance).toBe('dev'); + expect(devConfig.kafkaPublisherConfigs.length).toBe(2); + + expect(devConfig.kafkaConfig.clientId).toEqual('backstage-events'); + expect(devConfig.kafkaConfig.brokers).toEqual([ + 'kafka1:9092', + 'kafka2:9092', + ]); + + expect(devConfig.kafkaPublisherConfigs).toEqual([ + { + backstageTopic: 'fake1', + kafkaTopic: 'topic-A', + producerConfig: { + allowAutoTopicCreation: undefined, + metadataMaxAge: undefined, + transactionTimeout: undefined, + idempotent: undefined, + maxInFlightRequests: undefined, + retry: {}, + }, + }, + { + backstageTopic: 'fake2', + kafkaTopic: 'topic-B', + producerConfig: { + allowAutoTopicCreation: undefined, + metadataMaxAge: undefined, + transactionTimeout: undefined, + idempotent: undefined, + maxInFlightRequests: undefined, + retry: {}, + }, + }, + ]); + }); + + it('all fields configured', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaPublishingEventConsumer: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + ssl: true, + sasl: { + mechanism: 'plain', + username: 'username', + password: 'password', + }, + retry: { + maxRetryTime: { milliseconds: 20000 }, + initialRetryTime: { milliseconds: 200 }, + factor: '0.4', + multiplier: '4', + retries: '10', + }, + authenticationTimeout: { milliseconds: 20000 }, + connectionTimeout: { milliseconds: 1500 }, + requestTimeout: { milliseconds: 20000 }, + enforceRequestTimeout: false, + topics: [ + { + topic: 'fake1', + kafka: { + topic: 'topic-A', + allowAutoTopicCreation: true, + metadataMaxAge: { milliseconds: 400000 }, + transactionTimeout: { milliseconds: 30000 }, + idempotent: true, + maxInFlightRequests: 5, + retry: { + maxRetryTime: { milliseconds: 15000 }, + initialRetryTime: { milliseconds: 100 }, + factor: '0.2', + multiplier: '2', + retries: '5', + }, + }, + }, + { + topic: 'fake2', + kafka: { + topic: 'topic-B', + }, + }, + ], + }, + }, + }, + }, + }, + }); + + const publisherConfigs = readPublisherConfig(config); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(1); + + const devConfig = publisherConfigs[0]; + expect(devConfig.instance).toBe('dev'); + + // Client configuration + expect(devConfig.kafkaConfig.clientId).toEqual('backstage-events'); + expect(devConfig.kafkaConfig.brokers).toEqual([ + 'kafka1:9092', + 'kafka2:9092', + ]); + expect(devConfig.kafkaConfig.ssl).toBeTruthy(); + expect(devConfig.kafkaConfig.sasl).toStrictEqual({ + mechanism: 'plain', + username: 'username', + password: 'password', + }); + expect(devConfig.kafkaConfig.authenticationTimeout).toBe(20000); + expect(devConfig.kafkaConfig.connectionTimeout).toBe(1500); + expect(devConfig.kafkaConfig.requestTimeout).toBe(20000); + expect(devConfig.kafkaConfig.enforceRequestTimeout).toBeFalsy(); + expect(devConfig.kafkaConfig.retry).toStrictEqual({ + maxRetryTime: 20000, + initialRetryTime: 200, + factor: 0.4, + multiplier: 4, + retries: 10, + }); + + // Publisher configuration + expect(devConfig.kafkaPublisherConfigs.length).toBe(2); + + expect(devConfig.kafkaPublisherConfigs).toEqual([ + { + backstageTopic: 'fake1', + kafkaTopic: 'topic-A', + producerConfig: { + allowAutoTopicCreation: true, + metadataMaxAge: 400000, + transactionTimeout: 30000, + idempotent: true, + maxInFlightRequests: 5, + retry: { + maxRetryTime: 15000, + initialRetryTime: 100, + factor: 0.2, + multiplier: 2, + retries: 5, + }, + }, + }, + { + backstageTopic: 'fake2', + kafkaTopic: 'topic-B', + producerConfig: { + allowAutoTopicCreation: undefined, + metadataMaxAge: undefined, + transactionTimeout: undefined, + idempotent: undefined, + maxInFlightRequests: undefined, + retry: {}, + }, + }, + ]); + }); + + it('should handle HumanDuration and string values for durations and timeouts', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaPublishingEventConsumer: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + retry: { + maxRetryTime: { seconds: 1 }, + initialRetryTime: { minutes: 1 }, + factor: 0.4, + multiplier: 4, + retries: 10, + }, + authenticationTimeout: { hours: 1 }, + connectionTimeout: { days: 1 }, + topics: [ + { + topic: 'fake1', + kafka: { + topic: 'topic-A', + metadataMaxAge: { seconds: 300 }, + transactionTimeout: '30s', + }, + }, + ], + requestTimeout: '1m', + }, + }, + }, + }, + }, + }); + + const publisherConfigs = readPublisherConfig(config); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(1); + + const devConfig = publisherConfigs[0]; + expect(devConfig.instance).toBe('dev'); + + // Client configuration + expect(devConfig.kafkaConfig.clientId).toEqual('backstage-events'); + expect(devConfig.kafkaConfig.brokers).toEqual([ + 'kafka1:9092', + 'kafka2:9092', + ]); + expect(devConfig.kafkaConfig.authenticationTimeout).toBe(3600000); + expect(devConfig.kafkaConfig.connectionTimeout).toBe(86400000); + expect(devConfig.kafkaConfig.requestTimeout).toBe(60000); + expect(devConfig.kafkaConfig.retry).toStrictEqual({ + maxRetryTime: 1000, + initialRetryTime: 60000, + factor: 0.4, + multiplier: 4, + retries: 10, + }); + + // Publisher configuration + expect(devConfig.kafkaPublisherConfigs.length).toBe(1); + expect( + devConfig.kafkaPublisherConfigs[0].producerConfig.metadataMaxAge, + ).toBe(300000); + expect( + devConfig.kafkaPublisherConfigs[0].producerConfig.transactionTimeout, + ).toBe(30000); + }); + + it('should handle multiple instances', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaPublishingEventConsumer: { + dev: { + clientId: 'backstage-dev', + brokers: ['kafka-dev:9092'], + topics: [ + { + topic: 'dev-topic', + kafka: { + topic: 'kafka-dev-topic', + }, + }, + ], + }, + prod: { + clientId: 'backstage-prod', + brokers: ['kafka-prod1:9092', 'kafka-prod2:9092'], + topics: [ + { + topic: 'prod-topic', + kafka: { + topic: 'kafka-prod-topic', + }, + }, + ], + }, + }, + }, + }, + }, + }); + + const publisherConfigs = readPublisherConfig(config); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(2); + + const devConfig = publisherConfigs.find(c => c.instance === 'dev')!; + expect(devConfig.kafkaConfig.clientId).toBe('backstage-dev'); + expect(devConfig.kafkaConfig.brokers).toEqual(['kafka-dev:9092']); + expect(devConfig.kafkaPublisherConfigs).toHaveLength(1); + expect(devConfig.kafkaPublisherConfigs[0].backstageTopic).toBe('dev-topic'); + + const prodConfig = publisherConfigs.find(c => c.instance === 'prod')!; + expect(prodConfig.kafkaConfig.clientId).toBe('backstage-prod'); + expect(prodConfig.kafkaConfig.brokers).toEqual([ + 'kafka-prod1:9092', + 'kafka-prod2:9092', + ]); + expect(prodConfig.kafkaPublisherConfigs).toHaveLength(1); + expect(prodConfig.kafkaPublisherConfigs[0].backstageTopic).toBe( + 'prod-topic', + ); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.ts b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.ts new file mode 100644 index 0000000000..8439e24405 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/config.ts @@ -0,0 +1,82 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Config } from '@backstage/config'; +import { + readKafkaConfig, + readOptionalHumanDurationInMs, + readRetryConfig, +} from '../utils/config'; +import { KafkaConfig, ProducerConfig } from 'kafkajs'; + +export interface KafkaPublisherConfig { + backstageTopic: string; + kafkaTopic: string; + producerConfig: ProducerConfig; +} + +export interface KafkaPublishingEventConsumerConfig { + instance: string; + kafkaConfig: KafkaConfig; + kafkaPublisherConfigs: KafkaPublisherConfig[]; +} + +const CONFIG_PREFIX_PUBLISHER = + 'events.modules.kafka.kafkaPublishingEventConsumer'; + +export const readPublisherConfig = ( + config: Config, +): KafkaPublishingEventConsumerConfig[] => { + const publishers = config.getOptionalConfig(CONFIG_PREFIX_PUBLISHER); + + return ( + publishers?.keys()?.map(publisherKey => { + const publisherConfig = publishers.getConfig(publisherKey); + + return { + instance: publisherKey, + kafkaConfig: readKafkaConfig(publisherConfig), + kafkaPublisherConfigs: publisherConfig + .getConfigArray('topics') + .map(topicConfig => { + return { + backstageTopic: topicConfig.getString('topic'), + kafkaTopic: topicConfig.getString('kafka.topic'), + producerConfig: { + allowAutoTopicCreation: topicConfig.getOptionalBoolean( + 'kafka.allowAutoTopicCreation', + ), + metadataMaxAge: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.metadataMaxAge', + ), + transactionTimeout: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.transactionTimeout', + ), + idempotent: topicConfig.getOptionalBoolean('kafka.idempotent'), + maxInFlightRequests: topicConfig.getOptionalNumber( + 'kafka.maxInFlightRequests', + ), + retry: readRetryConfig( + topicConfig.getOptionalConfig('kafka.retry'), + ), + }, + }; + }), + }; + }) ?? [] + ); +}; diff --git a/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/index.ts b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/index.ts new file mode 100644 index 0000000000..42fadd2a5a --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { eventsModuleKafkaPublishingEventConsumer } from './module'; diff --git a/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.test.ts b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.test.ts new file mode 100644 index 0000000000..39c8268300 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.test.ts @@ -0,0 +1,122 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createServiceFactory } from '@backstage/backend-plugin-api'; +import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; +import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { TestEventsService } from '@backstage/plugin-events-backend-test-utils'; +import { eventsModuleKafkaPublishingEventConsumer } from './module'; +import { KafkaPublishingEventConsumer } from './KafkaPublishingEventConsumer'; + +jest.mock('./KafkaPublishingEventConsumer'); + +describe('eventsModuleKafkaPublishingEventConsumer', () => { + it('should be correctly wired and set up', async () => { + const events = new TestEventsService(); + const eventsServiceFactory = createServiceFactory({ + service: eventsServiceRef, + deps: {}, + async factory({}) { + return events; + }, + }); + + const mockKafkaPublishingEventConsumer = { + start: jest.fn(), + shutdown: jest.fn(), + } as unknown as KafkaPublishingEventConsumer; + + jest + .mocked(KafkaPublishingEventConsumer.fromConfig) + .mockReturnValue([mockKafkaPublishingEventConsumer]); + + await startTestBackend({ + features: [ + eventsServiceFactory, + eventsModuleKafkaPublishingEventConsumer, + mockServices.rootConfig.factory({ + data: { + events: { + modules: { + kafka: { + kafkaPublishingEventConsumer: { + dev: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + topics: [ + { + topic: 'fake1', + kafka: { + topic: 'topic-A', + }, + }, + { + topic: 'fake2', + kafka: { + topic: 'topic-B', + }, + }, + ], + }, + }, + }, + }, + }, + }, + }), + ], + }); + + // Verify that the Kafka publishing event consumer was started + expect(mockKafkaPublishingEventConsumer.start).toHaveBeenCalled(); + + // Verify that the shutdown hook was registered (but not called yet) + expect(mockKafkaPublishingEventConsumer.shutdown).not.toHaveBeenCalled(); + }); + + it('should handle empty configuration gracefully', async () => { + const events = new TestEventsService(); + const eventsServiceFactory = createServiceFactory({ + service: eventsServiceRef, + deps: {}, + async factory({}) { + return events; + }, + }); + + jest.mocked(KafkaPublishingEventConsumer.fromConfig).mockReturnValue([]); + + await startTestBackend({ + features: [ + eventsServiceFactory, + eventsModuleKafkaPublishingEventConsumer, + mockServices.rootConfig.factory({ + data: { + events: { + modules: { + kafka: { + // No kafkaPublishingEventConsumer config + }, + }, + }, + }, + }), + ], + }); + + // Verify that fromConfig was called but returned empty array + expect(KafkaPublishingEventConsumer.fromConfig).toHaveBeenCalled(); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.ts b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.ts new file mode 100644 index 0000000000..dd5f0c50ab --- /dev/null +++ b/plugins/events-backend-module-kafka/src/KafkaPublishingEventConsumer/module.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { eventsServiceRef } from '@backstage/plugin-events-node'; +import { KafkaPublishingEventConsumer } from './KafkaPublishingEventConsumer'; + +/** + * Reads internal Backstage events and forwards them to Kafka topics. + * + * @public + */ +export const eventsModuleKafkaPublishingEventConsumer = createBackendModule({ + pluginId: 'events', + moduleId: 'kafka-publishing-event-consumer', + register(env) { + env.registerInit({ + deps: { + config: coreServices.rootConfig, + events: eventsServiceRef, + logger: coreServices.logger, + lifecycle: coreServices.rootLifecycle, + }, + async init({ config, logger, events, lifecycle }) { + const consumers = KafkaPublishingEventConsumer.fromConfig({ + config, + events, + logger, + }); + + lifecycle.addStartupHook(async () => { + await Promise.all(consumers.map(consumer => consumer.start())); + }); + + lifecycle.addShutdownHook(async () => { + await Promise.all(consumers.map(consumer => consumer.shutdown())); + }); + }, + }); + }, +}); diff --git a/plugins/events-backend-module-kafka/src/index.ts b/plugins/events-backend-module-kafka/src/index.ts index 3ba6207d7d..af4fb02bf1 100644 --- a/plugins/events-backend-module-kafka/src/index.ts +++ b/plugins/events-backend-module-kafka/src/index.ts @@ -13,14 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { createBackendFeatureLoader } from '@backstage/backend-plugin-api'; +import { eventsModuleKafkaConsumingEventPublisher } from './KafkaConsumingEventPublisher'; +import { eventsModuleKafkaPublishingEventConsumer } from './KafkaPublishingEventConsumer'; /** * The module "kafka" for the Backstage backend plugin "events" - * adding an Kafka-based publisher, - * receiving events from an Kafka topic and passing it to the - * internal event broker. + * adding Kafka-based event handling: + * - Consumer: receives events from Kafka topics and passes them to the internal event broker + * - Publisher: receives internal events and publishes them to Kafka topics * * @packageDocumentation */ -export { eventsModuleKafkaConsumingEventPublisher as default } from './service/eventsModuleKafkaConsumingEventPublisher'; +export default createBackendFeatureLoader({ + *loader() { + yield eventsModuleKafkaConsumingEventPublisher; + yield eventsModuleKafkaPublishingEventConsumer; + }, +}); diff --git a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.test.ts b/plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.test.ts deleted file mode 100644 index 5824bf4d41..0000000000 --- a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { KafkaConsumerClient } from './KafkaConsumerClient'; -import { ConfigReader } from '@backstage/config'; -import { KafkaConsumingEventPublisher } from './KafkaConsumingEventPublisher'; -import { mockServices } from '@backstage/backend-test-utils'; - -jest.mock('kafkajs'); -jest.mock('./KafkaConsumingEventPublisher'); - -describe('KafkaConsumerClient', () => { - const mockLogger = mockServices.logger.mock(); - const mockEvents = mockServices.events.mock(); - - const mockConfig = new ConfigReader({ - events: { - modules: { - kafka: { - kafkaConsumingEventPublisher: { - clientId: 'backstage-events', - brokers: ['kafka1:9092', 'kafka2:9092'], - topics: [ - { - topic: 'fake1', - kafka: { - topics: ['topic-A'], - groupId: 'my-group', - }, - }, - { - topic: 'fake2', - kafka: { - topics: ['topic-B'], - groupId: 'my-group', - }, - }, - ], - }, - }, - }, - }, - }); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should create an instance from config', () => { - const client = KafkaConsumerClient.fromConfig({ - config: mockConfig, - events: mockEvents, - logger: mockLogger, - }); - - expect(client).toBeInstanceOf(KafkaConsumerClient); - }); - - it('should not create an instance from config', () => { - const client = KafkaConsumerClient.fromConfig({ - config: new ConfigReader({}), - events: mockEvents, - logger: mockLogger, - }); - - expect(client).toBeUndefined(); - }); - - it('should create a consumer for each topic from config', () => { - KafkaConsumerClient.fromConfig({ - config: mockConfig, - events: mockEvents, - logger: mockLogger, - }); - - expect(KafkaConsumingEventPublisher.fromConfig).toHaveBeenCalledTimes(2); - }); - - it('should start all consumers', async () => { - const mockConsumer = { - start: jest.fn().mockResolvedValue(undefined), - }; - (KafkaConsumingEventPublisher.fromConfig as jest.Mock).mockReturnValue( - mockConsumer, - ); - - const client = KafkaConsumerClient.fromConfig({ - config: mockConfig, - events: mockEvents, - logger: mockLogger, - }); - - expect(client).toBeDefined(); - - await client?.start(); - - expect(mockConsumer.start).toHaveBeenCalled(); - }); - - it('should shutdown all consumers', async () => { - const mockConsumer = { - shutdown: jest.fn().mockResolvedValue(undefined), - }; - (KafkaConsumingEventPublisher.fromConfig as jest.Mock).mockReturnValue( - mockConsumer, - ); - - const client = KafkaConsumerClient.fromConfig({ - config: mockConfig, - events: mockEvents, - logger: mockLogger, - }); - - expect(client).toBeDefined(); - - await client?.shutdown(); - - expect(mockConsumer.shutdown).toHaveBeenCalled(); - }); -}); diff --git a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.ts b/plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.ts deleted file mode 100644 index d506e4a6af..0000000000 --- a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumerClient.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { LoggerService } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; -import { EventsService } from '@backstage/plugin-events-node'; -import { Kafka } from 'kafkajs'; -import { KafkaEventSourceConfig, readConfig } from './config'; -import { KafkaConsumingEventPublisher } from './KafkaConsumingEventPublisher'; -import { loggerServiceAdapter } from './LoggerServiceAdapter'; - -/** - * KafkaConsumerClient - * - * This class creates the Kafka client that will be used to create the KafkaConsumingEventPublisher - */ -export class KafkaConsumerClient { - private readonly kafka: Kafka; - private readonly consumers: KafkaConsumingEventPublisher[]; - - static fromConfig(options: { - config: Config; - events: EventsService; - logger: LoggerService; - }): KafkaConsumerClient | undefined { - const kafkaConfig = readConfig(options.config); - - if (!kafkaConfig) { - options.logger.info( - 'Kafka consumer not configured, skipping initialization', - ); - return undefined; - } - - return new KafkaConsumerClient(options.logger, options.events, kafkaConfig); - } - - private constructor( - logger: LoggerService, - events: EventsService, - config: KafkaEventSourceConfig, - ) { - this.kafka = new Kafka({ - ...config.kafkaConfig, - logCreator: loggerServiceAdapter(logger), - }); - - this.consumers = config.kafkaConsumerConfigs.map(consumerConfig => - KafkaConsumingEventPublisher.fromConfig({ - kafkaClient: this.kafka, - config: consumerConfig, - logger, - events, - }), - ); - } - - async start(): Promise { - this.consumers.map(async consumer => await consumer.start()); - } - - async shutdown(): Promise { - this.consumers.map(async consumer => await consumer.shutdown()); - } -} diff --git a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.test.ts b/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.test.ts deleted file mode 100644 index 64c53595ad..0000000000 --- a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { KafkaConsumingEventPublisher } from './KafkaConsumingEventPublisher'; -import { Kafka } from 'kafkajs'; -import { KafkaConsumerConfig } from './config'; -import { mockServices } from '@backstage/backend-test-utils'; - -jest.mock('kafkajs'); - -describe('KafkaConsumingEventPublisher', () => { - const mockLogger = mockServices.logger.mock(); - const mockEvents = mockServices.events.mock(); - - const mockConsumer = { - connect: jest.fn(), - disconnect: jest.fn(), - subscribe: jest.fn(), - run: jest.fn(), - }; - - const mockKafkaClient = { - consumer: jest.fn().mockReturnValue(mockConsumer), - } as unknown as Kafka; - - const kafkaConsumerConfig: KafkaConsumerConfig = { - consumerConfig: { - groupId: 'test-group', - }, - consumerSubscribeTopics: { - topics: ['test-topic'], - }, - backstageTopic: 'backstage-topic', - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should create an instance from config', () => { - const consumer = KafkaConsumingEventPublisher.fromConfig({ - kafkaClient: mockKafkaClient, - config: kafkaConsumerConfig, - events: mockEvents, - logger: mockLogger, - }); - - expect(consumer).toBeInstanceOf(KafkaConsumingEventPublisher); - }); - - it('should start the consumer', async () => { - const consumer = KafkaConsumingEventPublisher.fromConfig({ - kafkaClient: mockKafkaClient, - config: kafkaConsumerConfig, - events: mockEvents, - logger: mockLogger, - }); - - await consumer.start(); - - expect(mockConsumer.connect).toHaveBeenCalled(); - expect(mockConsumer.subscribe).toHaveBeenCalledWith( - kafkaConsumerConfig.consumerSubscribeTopics, - ); - expect(mockConsumer.run).toHaveBeenCalled(); - }); - - it('should shutdown the consumer', async () => { - const consumer = KafkaConsumingEventPublisher.fromConfig({ - kafkaClient: mockKafkaClient, - config: kafkaConsumerConfig, - events: mockEvents, - logger: mockLogger, - }); - - await consumer.shutdown(); - - expect(mockConsumer.disconnect).toHaveBeenCalled(); - }); -}); diff --git a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts b/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts deleted file mode 100644 index dfc6186fb5..0000000000 --- a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { LoggerService } from '@backstage/backend-plugin-api'; -import { EventParams, EventsService } from '@backstage/plugin-events-node'; -import { Consumer, ConsumerSubscribeTopics, IHeaders, Kafka } from 'kafkajs'; -import { KafkaConsumerConfig } from './config'; - -type EventMetadata = EventParams['metadata']; - -/** - * This class subscribes to Kafka topics and publishes events received to the registered subscriber. - * The message payload will be used as the event payload and passed to the subscribers. - */ -export class KafkaConsumingEventPublisher { - private readonly kafkaConsumer: Consumer; - private readonly consumerSubscribeTopics: ConsumerSubscribeTopics; - private readonly backstageTopic: string; - private readonly logger: LoggerService; - - static fromConfig(env: { - kafkaClient: Kafka; - config: KafkaConsumerConfig; - events: EventsService; - logger: LoggerService; - }): KafkaConsumingEventPublisher { - return new KafkaConsumingEventPublisher( - env.kafkaClient, - env.logger, - env.events, - env.config, - ); - } - - private readonly events: EventsService; - - private constructor( - kafkaClient: Kafka, - logger: LoggerService, - events: EventsService, - config: KafkaConsumerConfig, - ) { - this.events = events; - this.kafkaConsumer = kafkaClient.consumer(config.consumerConfig); - this.consumerSubscribeTopics = config.consumerSubscribeTopics; - this.backstageTopic = config.backstageTopic; - const id = `events.kafka.publisher:${this.backstageTopic}`; - this.logger = logger.child({ - class: KafkaConsumingEventPublisher.prototype.constructor.name, - groupId: config.consumerConfig.groupId, - kafkaTopics: config.consumerSubscribeTopics.topics.toString(), - backstageTopic: config.backstageTopic, - taskId: id, - }); - } - - async start(): Promise { - try { - await this.kafkaConsumer.connect(); - - await this.kafkaConsumer.subscribe(this.consumerSubscribeTopics); - - await this.kafkaConsumer.run({ - eachMessage: async ({ message }) => { - this.events.publish({ - topic: this.backstageTopic, - eventPayload: JSON.parse(message.value?.toString()!), - metadata: this.convertHeadersToMetadata(message.headers), - }); - }, - }); - } catch (error: any) { - this.logger.error('Kafka consumer connection failed ', error); - } - } - - async shutdown(): Promise { - await this.kafkaConsumer.disconnect(); - } - - private convertHeadersToMetadata = ( - headers: IHeaders | undefined, - ): EventParams['metadata'] => { - if (!headers) return undefined; - - const metadata: EventMetadata = {}; - - Object.entries(headers).forEach(([key, value]) => { - // If value is an array use toString() on all values converting any Buffer types to valid strings - if (Array.isArray(value)) metadata[key] = value.map(v => v.toString()); - // Always return the values using toString() to catch all Buffer types that should be converted to strings - else metadata[key] = value?.toString(); - }); - - return metadata; - }; -} diff --git a/plugins/events-backend-module-kafka/src/publisher/config.test.ts b/plugins/events-backend-module-kafka/src/publisher/config.test.ts deleted file mode 100644 index fc7e3049b0..0000000000 --- a/plugins/events-backend-module-kafka/src/publisher/config.test.ts +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ConfigReader } from '@backstage/config'; -import { readConfig } from './config'; - -describe('readConfig', () => { - it('not configured', () => { - const publisherConfigs = readConfig(new ConfigReader({})); - - expect(publisherConfigs).toBeUndefined(); - }); - - it('only required fields configured', () => { - const config = new ConfigReader({ - events: { - modules: { - kafka: { - kafkaConsumingEventPublisher: { - clientId: 'backstage-events', - brokers: ['kafka1:9092', 'kafka2:9092'], - topics: [ - { - topic: 'fake1', - kafka: { - topics: ['topic-A'], - groupId: 'my-group', - }, - }, - { - topic: 'fake2', - kafka: { - topics: ['topic-B'], - groupId: 'my-group', - }, - }, - ], - }, - }, - }, - }, - }); - - const publisherConfigs = readConfig(config); - - expect(publisherConfigs).toBeDefined(); - - expect(publisherConfigs?.kafkaConsumerConfigs.length).toBe(2); - - expect(publisherConfigs?.kafkaConfig.clientId).toEqual('backstage-events'); - expect(publisherConfigs?.kafkaConfig.brokers).toEqual([ - 'kafka1:9092', - 'kafka2:9092', - ]); - expect(publisherConfigs?.kafkaConsumerConfigs[0].backstageTopic).toEqual( - 'fake1', - ); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.groupId, - ).toEqual('my-group'); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerSubscribeTopics.topics, - ).toEqual(['topic-A']); - }); - - it('all fields configured', () => { - const config = new ConfigReader({ - events: { - modules: { - kafka: { - kafkaConsumingEventPublisher: { - clientId: 'backstage-events', - brokers: ['kafka1:9092', 'kafka2:9092'], - ssl: true, - sasl: { - mechanism: 'plain', - username: 'username', - password: 'password', - }, - retry: { - maxRetryTime: { milliseconds: 20000 }, - initialRetryTime: { milliseconds: 200 }, - factor: '0.4', - multiplier: '4', - retries: '10', - }, - authenticationTimeout: { milliseconds: 20000 }, - connectionTimeout: { milliseconds: 1500 }, - requestTimeout: { milliseconds: 20000 }, - enforceRequestTimeout: false, - topics: [ - { - topic: 'fake1', - kafka: { - topics: ['topic-A'], - groupId: 'my-group', - sessionTimeout: { milliseconds: 20000 }, - rebalanceTimeout: { milliseconds: 50000 }, - heartbeatInterval: { milliseconds: 2000 }, - metadataMaxAge: { milliseconds: 400000 }, - maxBytesPerPartition: 50000, - minBytes: 2, - maxBytes: 500000, - maxWaitTime: { milliseconds: 4000 }, - }, - }, - { - topic: 'fake2', - kafka: { - topics: ['topic-B'], - groupId: 'my-group', - }, - }, - ], - }, - }, - }, - }, - }); - - const publisherConfigs = readConfig(config); - - expect(publisherConfigs).toBeDefined(); - - // Client configuration - expect(publisherConfigs?.kafkaConfig.clientId).toEqual('backstage-events'); - expect(publisherConfigs?.kafkaConfig.brokers).toEqual([ - 'kafka1:9092', - 'kafka2:9092', - ]); - expect(publisherConfigs?.kafkaConfig.ssl).toBeTruthy(); - expect(publisherConfigs?.kafkaConfig.sasl).toStrictEqual({ - mechanism: 'plain', - username: 'username', - password: 'password', - }); - expect(publisherConfigs?.kafkaConfig.authenticationTimeout).toBe(20000); - expect(publisherConfigs?.kafkaConfig.connectionTimeout).toBe(1500); - expect(publisherConfigs?.kafkaConfig.requestTimeout).toBe(20000); - expect(publisherConfigs?.kafkaConfig.enforceRequestTimeout).toBeFalsy(); - expect(publisherConfigs?.kafkaConfig.retry).toStrictEqual({ - maxRetryTime: 20000, - initialRetryTime: 200, - factor: 0.4, - multiplier: 4, - retries: 10, - }); - - // Consumer configuration - expect(publisherConfigs?.kafkaConsumerConfigs.length).toBe(2); - expect(publisherConfigs?.kafkaConsumerConfigs[0].backstageTopic).toEqual( - 'fake1', - ); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.groupId, - ).toEqual('my-group'); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerSubscribeTopics.topics, - ).toEqual(['topic-A']); - - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.sessionTimeout, - ).toBe(20000); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.rebalanceTimeout, - ).toBe(50000); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig - .heartbeatInterval, - ).toBe(2000); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.metadataMaxAge, - ).toBe(400000); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig - .maxBytesPerPartition, - ).toBe(50000); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.minBytes, - ).toBe(2); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.maxBytes, - ).toBe(500000); - expect( - publisherConfigs?.kafkaConsumerConfigs[0].consumerConfig.maxWaitTimeInMs, - ).toBe(4000); - }); - - it('should handle HumanDuration and string values for durations and timeouts', () => { - const config = new ConfigReader({ - events: { - modules: { - kafka: { - kafkaConsumingEventPublisher: { - clientId: 'backstage-events', - brokers: ['kafka1:9092', 'kafka2:9092'], - retry: { - maxRetryTime: { seconds: 1 }, - initialRetryTime: { minutes: 1 }, - factor: 0.4, - multiplier: 4, - retries: 10, - }, - authenticationTimeout: { hours: 1 }, - connectionTimeout: { days: 1 }, - topics: [], - requestTimeout: '1m', - }, - }, - }, - }, - }); - - const publisherConfigs = readConfig(config); - - expect(publisherConfigs).toBeDefined(); - - // Client configuration - expect(publisherConfigs?.kafkaConfig.clientId).toEqual('backstage-events'); - expect(publisherConfigs?.kafkaConfig.brokers).toEqual([ - 'kafka1:9092', - 'kafka2:9092', - ]); - expect(publisherConfigs?.kafkaConfig.authenticationTimeout).toBe(3600000); - expect(publisherConfigs?.kafkaConfig.connectionTimeout).toBe(86400000); - expect(publisherConfigs?.kafkaConfig.requestTimeout).toBe(60000); - expect(publisherConfigs?.kafkaConfig.retry).toStrictEqual({ - maxRetryTime: 1000, - initialRetryTime: 60000, - factor: 0.4, - multiplier: 4, - retries: 10, - }); - - // Consumer configuration - expect(publisherConfigs?.kafkaConsumerConfigs.length).toBe(0); - }); -}); diff --git a/plugins/events-backend-module-kafka/src/publisher/config.ts b/plugins/events-backend-module-kafka/src/publisher/config.ts deleted file mode 100644 index 7534ce4d38..0000000000 --- a/plugins/events-backend-module-kafka/src/publisher/config.ts +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Config, readDurationFromConfig } from '@backstage/config'; -import { durationToMilliseconds } from '@backstage/types'; -import { ConsumerConfig, ConsumerSubscribeTopics, KafkaConfig } from 'kafkajs'; - -export interface KafkaConsumerConfig { - backstageTopic: string; - consumerConfig: ConsumerConfig; - consumerSubscribeTopics: ConsumerSubscribeTopics; -} - -export interface KafkaEventSourceConfig { - kafkaConfig: KafkaConfig; - kafkaConsumerConfigs: KafkaConsumerConfig[]; -} - -const CONFIG_PREFIX_PUBLISHER = - 'events.modules.kafka.kafkaConsumingEventPublisher'; - -/** - * Reads an optional HumanDuration from the config and returns the value in milliseconds if the key is defined. - * - * @param config - The configuration object to read from. - * @param key - The key to look up in the configuration. - * @returns The duration in milliseconds, or undefined if the key is not defined. - */ -const readOptionalHumanDurationInMs = ( - config: Config, - key: string, -): number | undefined => { - const humanDuration = config.has(key) - ? readDurationFromConfig(config, { key }) - : undefined; - - if (!humanDuration) return undefined; - - return durationToMilliseconds(humanDuration); -}; - -export const readConfig = ( - config: Config, -): KafkaEventSourceConfig | undefined => { - const kafkaConfig = config.getOptionalConfig(CONFIG_PREFIX_PUBLISHER); - - if (!kafkaConfig) { - return undefined; - } - - const clientId = kafkaConfig.getString('clientId'); - const brokers = kafkaConfig.getStringArray('brokers'); - - const authenticationTimeout = readOptionalHumanDurationInMs( - kafkaConfig, - 'authenticationTimeout', - ); - - const connectionTimeout = readOptionalHumanDurationInMs( - kafkaConfig, - 'connectionTimeout', - ); - const requestTimeout = readOptionalHumanDurationInMs( - kafkaConfig, - 'requestTimeout', - ); - const enforceRequestTimeout = kafkaConfig.getOptionalBoolean( - 'enforceRequestTimeout', - ); - - const ssl = kafkaConfig.getOptional('ssl') as KafkaConfig['ssl']; - const sasl = kafkaConfig.getOptional('sasl') as KafkaConfig['sasl']; - - const retry: KafkaConfig['retry'] = { - maxRetryTime: readOptionalHumanDurationInMs( - kafkaConfig, - 'retry.maxRetryTime', - ), - initialRetryTime: readOptionalHumanDurationInMs( - kafkaConfig, - 'retry.initialRetryTime', - ), - factor: kafkaConfig.getOptionalNumber('retry.factor'), - multiplier: kafkaConfig.getOptionalNumber('retry.multiplier'), - retries: kafkaConfig.getOptionalNumber('retry.retries'), - }; - - const kafkaConsumerConfigs: KafkaConsumerConfig[] = kafkaConfig - .getConfigArray('topics') - .map(topic => { - return { - backstageTopic: topic.getString('topic'), - consumerConfig: { - groupId: topic.getString('kafka.groupId'), - sessionTimeout: readOptionalHumanDurationInMs( - topic, - 'kafka.sessionTimeout', - ), - rebalanceTimeout: readOptionalHumanDurationInMs( - topic, - 'kafka.rebalanceTimeout', - ), - heartbeatInterval: readOptionalHumanDurationInMs( - topic, - 'kafka.heartbeatInterval', - ), - metadataMaxAge: readOptionalHumanDurationInMs( - topic, - 'kafka.metadataMaxAge', - ), - maxBytesPerPartition: topic.getOptionalNumber( - 'kafka.maxBytesPerPartition', - ), - minBytes: topic.getOptionalNumber('kafka.minBytes'), - maxBytes: topic.getOptionalNumber('kafka.maxBytes'), - maxWaitTimeInMs: readOptionalHumanDurationInMs( - topic, - 'kafka.maxWaitTime', - ), - }, - consumerSubscribeTopics: { - topics: topic.getStringArray('kafka.topics'), - }, - }; - }); - - return { - kafkaConfig: { - clientId, - brokers, - ssl, - sasl, - authenticationTimeout, - connectionTimeout, - requestTimeout, - enforceRequestTimeout, - retry, - }, - kafkaConsumerConfigs, - }; -}; diff --git a/plugins/events-backend-module-kafka/src/service/eventsModuleKafkaConsumingEventPublisher.test.ts b/plugins/events-backend-module-kafka/src/service/eventsModuleKafkaConsumingEventPublisher.test.ts deleted file mode 100644 index 816793f635..0000000000 --- a/plugins/events-backend-module-kafka/src/service/eventsModuleKafkaConsumingEventPublisher.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { createServiceFactory } from '@backstage/backend-plugin-api'; -import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; -import { eventsServiceRef } from '@backstage/plugin-events-node'; -import { TestEventsService } from '@backstage/plugin-events-backend-test-utils'; -import { eventsModuleKafkaConsumingEventPublisher } from './eventsModuleKafkaConsumingEventPublisher'; -import { KafkaConsumerClient } from '../publisher/KafkaConsumerClient'; - -jest.mock('../publisher/KafkaConsumerClient'); - -describe('eventsModuleKafkaConsumingEventPublisher', () => { - it('should be correctly wired and set up', async () => { - const events = new TestEventsService(); - const eventsServiceFactory = createServiceFactory({ - service: eventsServiceRef, - deps: {}, - async factory({}) { - return events; - }, - }); - - const mockKafkaConsumerClient = { - start: jest.fn(), - shutdown: jest.fn(), - }; - (KafkaConsumerClient.fromConfig as jest.Mock).mockReturnValue( - mockKafkaConsumerClient, - ); - - await startTestBackend({ - features: [ - eventsServiceFactory, - eventsModuleKafkaConsumingEventPublisher, - mockServices.rootConfig.factory({ - data: { - events: { - modules: { - kafka: { - kafkaConsumingEventPublisher: { - clientId: 'backstage-events', - brokers: ['kafka1:9092', 'kafka2:9092'], - topics: { - fake1: { - kafka: { - topics: ['topic-A'], - groupId: 'my-group', - }, - }, - fake2: { - kafka: { - topics: ['topic-B'], - groupId: 'my-group', - }, - }, - }, - }, - }, - }, - }, - }, - }), - ], - }); - - // Verify that the Kafka consumer client was started - expect(mockKafkaConsumerClient.start).toHaveBeenCalled(); - - // Verify that the shutdown hook was registered - expect(mockKafkaConsumerClient.shutdown).not.toHaveBeenCalled(); - }); -}); diff --git a/plugins/events-backend-module-kafka/src/publisher/LoggerServiceAdapter.ts b/plugins/events-backend-module-kafka/src/utils/LoggerServiceAdapter.ts similarity index 100% rename from plugins/events-backend-module-kafka/src/publisher/LoggerServiceAdapter.ts rename to plugins/events-backend-module-kafka/src/utils/LoggerServiceAdapter.ts diff --git a/plugins/events-backend-module-kafka/src/utils/config.test.ts b/plugins/events-backend-module-kafka/src/utils/config.test.ts new file mode 100644 index 0000000000..2bd6121ba2 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/utils/config.test.ts @@ -0,0 +1,235 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ConfigReader } from '@backstage/config'; +import { readRetryConfig, readKafkaConfig } from './config'; + +describe('readRetryConfig', () => { + it('should return empty object when config is undefined', () => { + const result = readRetryConfig(undefined); + expect(result).toEqual({}); + }); + + it('should return empty object when config is empty', () => { + const config = new ConfigReader({}); + const result = readRetryConfig(config); + expect(result).toEqual({}); + }); + + it('should read retry configuration with milliseconds', () => { + const config = new ConfigReader({ + maxRetryTime: { milliseconds: 20000 }, + initialRetryTime: { milliseconds: 200 }, + factor: 0.4, + multiplier: 4, + retries: 10, + }); + + const result = readRetryConfig(config); + + expect(result).toEqual({ + maxRetryTime: 20000, + initialRetryTime: 200, + factor: 0.4, + multiplier: 4, + retries: 10, + }); + }); + + it('should read retry configuration with string values', () => { + const config = new ConfigReader({ + maxRetryTime: { seconds: 20 }, + initialRetryTime: { minutes: 1 }, + factor: '0.4', + multiplier: '4', + retries: '10', + }); + + const result = readRetryConfig(config); + + expect(result).toEqual({ + maxRetryTime: 20000, + initialRetryTime: 60000, + factor: 0.4, + multiplier: 4, + retries: 10, + }); + }); + + it('should handle HumanDuration values', () => { + const config = new ConfigReader({ + maxRetryTime: { hours: 1 }, + initialRetryTime: { days: 1 }, + }); + + const result = readRetryConfig(config); + + expect(result).toEqual({ + maxRetryTime: 3600000, + initialRetryTime: 86400000, + factor: undefined, + multiplier: undefined, + retries: undefined, + }); + }); + + it('should handle partial configuration', () => { + const config = new ConfigReader({ + maxRetryTime: { milliseconds: 15000 }, + retries: 5, + }); + + const result = readRetryConfig(config); + + expect(result).toEqual({ + maxRetryTime: 15000, + initialRetryTime: undefined, + factor: undefined, + multiplier: undefined, + retries: 5, + }); + }); +}); + +describe('readKafkaConfig', () => { + it('should read minimal kafka configuration', () => { + const config = new ConfigReader({ + clientId: 'test-client', + brokers: ['kafka1:9092', 'kafka2:9092'], + }); + + const result = readKafkaConfig(config); + + expect(result).toEqual({ + clientId: 'test-client', + brokers: ['kafka1:9092', 'kafka2:9092'], + authenticationTimeout: undefined, + connectionTimeout: undefined, + requestTimeout: undefined, + enforceRequestTimeout: undefined, + ssl: undefined, + sasl: undefined, + retry: {}, + }); + }); + + it('should read full kafka configuration with all optional fields', () => { + const config = new ConfigReader({ + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + authenticationTimeout: { milliseconds: 20000 }, + connectionTimeout: { milliseconds: 1500 }, + requestTimeout: { milliseconds: 20000 }, + enforceRequestTimeout: false, + ssl: true, + sasl: { + mechanism: 'plain', + username: 'username', + password: 'password', + }, + retry: { + maxRetryTime: { milliseconds: 20000 }, + initialRetryTime: { milliseconds: 200 }, + factor: 0.4, + multiplier: 4, + retries: 10, + }, + }); + + const result = readKafkaConfig(config); + + expect(result).toEqual({ + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + authenticationTimeout: 20000, + connectionTimeout: 1500, + requestTimeout: 20000, + enforceRequestTimeout: false, + ssl: true, + sasl: { + mechanism: 'plain', + username: 'username', + password: 'password', + }, + retry: { + maxRetryTime: 20000, + initialRetryTime: 200, + factor: 0.4, + multiplier: 4, + retries: 10, + }, + }); + }); + + it('should handle HumanDuration values for timeouts', () => { + const config = new ConfigReader({ + clientId: 'test-client', + brokers: ['kafka:9092'], + authenticationTimeout: { hours: 1 }, + connectionTimeout: { days: 1 }, + requestTimeout: { minutes: 5 }, + }); + + const result = readKafkaConfig(config); + + expect(result.authenticationTimeout).toBe(3600000); + expect(result.connectionTimeout).toBe(86400000); + expect(result.requestTimeout).toBe(300000); + }); + + it('should handle complex SSL configuration', () => { + const config = new ConfigReader({ + clientId: 'secure-client', + brokers: ['secure-kafka:9093'], + ssl: { + rejectUnauthorized: false, + ca: 'ca-certificate', + key: 'client-key', + cert: 'client-cert', + }, + }); + + const result = readKafkaConfig(config); + + expect(result.ssl).toEqual({ + rejectUnauthorized: false, + ca: 'ca-certificate', + key: 'client-key', + cert: 'client-cert', + }); + }); + + it('should handle complex SASL configuration', () => { + const config = new ConfigReader({ + clientId: 'sasl-client', + brokers: ['sasl-kafka:9094'], + sasl: { + mechanism: 'scram-sha-256', + username: 'kafka-user', + password: 'kafka-password', + authorizationIdentity: 'authz-user', + }, + }); + + const result = readKafkaConfig(config); + + expect(result.sasl).toEqual({ + mechanism: 'scram-sha-256', + username: 'kafka-user', + password: 'kafka-password', + authorizationIdentity: 'authz-user', + }); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/utils/config.ts b/plugins/events-backend-module-kafka/src/utils/config.ts new file mode 100644 index 0000000000..4e140d26a3 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/utils/config.ts @@ -0,0 +1,84 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Config, readDurationFromConfig } from '@backstage/config'; +import { durationToMilliseconds } from '@backstage/types'; +import { KafkaConfig, RetryOptions } from 'kafkajs'; + +/** + * Reads an optional HumanDuration from the config and returns the value in milliseconds if the key is defined. + * + * @param config - The configuration object to read from. + * @param key - The key to look up in the configuration. + * @returns The duration in milliseconds, or undefined if the key is not defined. + */ +export const readOptionalHumanDurationInMs = ( + config: Config, + key: string, +): number | undefined => { + const humanDuration = config.has(key) + ? readDurationFromConfig(config, { key }) + : undefined; + + if (!humanDuration) return undefined; + + return durationToMilliseconds(humanDuration); +}; + +/** + * Reads retry configuration options from the provided config object. + * + * @param config - The configuration object to read retry options from, or undefined. + * @returns A RetryOptions object with optional retry settings, or an empty object if config is undefined. + */ +export const readRetryConfig = (config: Config | undefined): RetryOptions => { + if (!config) { + return {}; + } + + return { + maxRetryTime: readOptionalHumanDurationInMs(config, 'maxRetryTime'), + initialRetryTime: readOptionalHumanDurationInMs(config, 'initialRetryTime'), + factor: config.getOptionalNumber('factor'), + multiplier: config.getOptionalNumber('multiplier'), + retries: config.getOptionalNumber('retries'), + }; +}; + +/** + * Reads Kafka configuration from the provided config object. + * + * @param config - The configuration object containing Kafka settings. + * @returns A KafkaConfig object with all necessary Kafka connection and authentication settings. + */ +export const readKafkaConfig = (config: Config): KafkaConfig => { + return { + clientId: config.getString('clientId'), + brokers: config.getStringArray('brokers'), + authenticationTimeout: readOptionalHumanDurationInMs( + config, + 'authenticationTimeout', + ), + connectionTimeout: readOptionalHumanDurationInMs( + config, + 'connectionTimeout', + ), + requestTimeout: readOptionalHumanDurationInMs(config, 'requestTimeout'), + enforceRequestTimeout: config.getOptionalBoolean('enforceRequestTimeout'), + ssl: config.getOptional('ssl') as KafkaConfig['ssl'], + sasl: config.getOptional('sasl') as KafkaConfig['sasl'], + retry: readRetryConfig(config.getOptionalConfig('retry')), + }; +}; diff --git a/plugins/events-backend-module-kafka/src/utils/kafkaTransformers.test.ts b/plugins/events-backend-module-kafka/src/utils/kafkaTransformers.test.ts new file mode 100644 index 0000000000..bfb373ea53 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/utils/kafkaTransformers.test.ts @@ -0,0 +1,137 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { convertHeadersToMetadata, payloadToBuffer } from './kafkaTransformers'; + +describe('kafka-transformers', () => { + describe('convertHeadersToMetadata', () => { + it('should return undefined when headers is undefined', () => { + const result = convertHeadersToMetadata(undefined); + expect(result).toBeUndefined(); + }); + + it('should convert string headers to metadata', () => { + const headers = { + 'content-type': 'application/json', + 'user-id': '12345', + }; + + const result = convertHeadersToMetadata(headers); + + expect(result).toEqual({ + 'content-type': 'application/json', + 'user-id': '12345', + }); + }); + + it('should convert Buffer headers to string metadata', () => { + const headers = { + 'content-type': Buffer.from('application/json'), + 'correlation-id': Buffer.from('abc-123'), + }; + + const result = convertHeadersToMetadata(headers); + + expect(result).toEqual({ + 'content-type': 'application/json', + 'correlation-id': 'abc-123', + }); + }); + + it('should convert array headers to string array metadata', () => { + const headers = { + tags: ['tag1', 'tag2'], + 'buffer-tags': [Buffer.from('tag3'), Buffer.from('tag4')], + 'mixed-tags': ['tag5', Buffer.from('tag6')], + }; + + const result = convertHeadersToMetadata(headers); + + expect(result).toEqual({ + tags: ['tag1', 'tag2'], + 'buffer-tags': ['tag3', 'tag4'], + 'mixed-tags': ['tag5', 'tag6'], + }); + }); + + it('should handle mixed header types', () => { + const headers = { + 'string-header': 'value', + 'buffer-header': Buffer.from('buffer-value'), + 'array-header': ['item1', Buffer.from('item2')], + 'undefined-header': undefined, + }; + + const result = convertHeadersToMetadata(headers); + + expect(result).toEqual({ + 'string-header': 'value', + 'buffer-header': 'buffer-value', + 'array-header': ['item1', 'item2'], + 'undefined-header': undefined, + }); + }); + + it('should handle empty headers object', () => { + const headers = {}; + const result = convertHeadersToMetadata(headers); + expect(result).toEqual({}); + }); + }); + + describe('payloadToBuffer', () => { + it('should return the same Buffer when payload is already a Buffer', () => { + const originalBuffer = Buffer.from('test data'); + + const result = payloadToBuffer(originalBuffer); + + expect(result).toBe(originalBuffer); + expect(Buffer.isBuffer(result)).toBe(true); + }); + + it('should convert string to Buffer', () => { + const payload = 'hello world'; + + const result = payloadToBuffer(payload); + + expect(Buffer.isBuffer(result)).toBe(true); + expect(result.toString()).toBe('hello world'); + }); + + it('should convert object to JSON Buffer', () => { + const payload = { name: 'John', age: 30 }; + + const result = payloadToBuffer(payload); + + expect(Buffer.isBuffer(result)).toBe(true); + expect(JSON.parse(result.toString())).toEqual(payload); + }); + + it('should convert array to JSON Buffer', () => { + const payload = [1, 2, 3, 'test']; + + const result = payloadToBuffer(payload); + + expect(Buffer.isBuffer(result)).toBe(true); + expect(JSON.parse(result.toString())).toEqual(payload); + }); + + it('should convert primitives to JSON Buffer', () => { + expect(payloadToBuffer(42).toString()).toBe('42'); + expect(payloadToBuffer(true).toString()).toBe('true'); + expect(payloadToBuffer(null).toString()).toBe('null'); + }); + }); +}); diff --git a/plugins/events-backend-module-kafka/src/utils/kafkaTransformers.ts b/plugins/events-backend-module-kafka/src/utils/kafkaTransformers.ts new file mode 100644 index 0000000000..871cb08a04 --- /dev/null +++ b/plugins/events-backend-module-kafka/src/utils/kafkaTransformers.ts @@ -0,0 +1,49 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { EventParams } from '@backstage/plugin-events-node'; +import { IHeaders } from 'kafkajs'; + +type EventMetadata = EventParams['metadata']; + +export const convertHeadersToMetadata = ( + headers: IHeaders | undefined, +): EventMetadata => { + if (!headers) return undefined; + + const metadata: EventMetadata = {}; + + Object.entries(headers).forEach(([key, value]) => { + // If value is an array use toString() on all values converting any Buffer types to valid strings + if (Array.isArray(value)) metadata[key] = value.map(v => v.toString()); + // Always return the values using toString() to catch all Buffer types that should be converted to strings + else metadata[key] = value?.toString(); + }); + + return metadata; +}; + +export const payloadToBuffer = (payload: unknown): Buffer => { + if (Buffer.isBuffer(payload)) { + return payload; + } + + if (typeof payload === 'string') { + return Buffer.from(payload, 'utf8'); // More explicit encoding + } + + // Convert to JSON string then encode + return Buffer.from(JSON.stringify(payload), 'utf8'); +}; From 3016a7982cb2d647da5f086613cedfb453ca8aab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 11:58:25 +0000 Subject: [PATCH 252/312] chore(deps): update dependency @types/archiver to v7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-ad7bf17.md | 5 +++++ packages/backend-defaults/package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/renovate-ad7bf17.md diff --git a/.changeset/renovate-ad7bf17.md b/.changeset/renovate-ad7bf17.md new file mode 100644 index 0000000000..a0f90ff97d --- /dev/null +++ b/.changeset/renovate-ad7bf17.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Updated dependency `@types/archiver` to `^7.0.0`. diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 149aa275bd..80e29c8715 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -203,7 +203,7 @@ "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@google-cloud/cloud-sql-connector": "^1.4.0", - "@types/archiver": "^6.0.0", + "@types/archiver": "^7.0.0", "@types/base64-stream": "^1.0.2", "@types/compression": "^1.7.5", "@types/concat-stream": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index b96a76ddfa..20f873ca07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2891,7 +2891,7 @@ __metadata: "@manypkg/get-packages": "npm:^1.1.3" "@octokit/rest": "npm:^19.0.3" "@opentelemetry/api": "npm:^1.9.0" - "@types/archiver": "npm:^6.0.0" + "@types/archiver": "npm:^7.0.0" "@types/base64-stream": "npm:^1.0.2" "@types/compression": "npm:^1.7.5" "@types/concat-stream": "npm:^2.0.0" @@ -20036,12 +20036,12 @@ __metadata: languageName: node linkType: hard -"@types/archiver@npm:^6.0.0": - version: 6.0.4 - resolution: "@types/archiver@npm:6.0.4" +"@types/archiver@npm:^7.0.0": + version: 7.0.0 + resolution: "@types/archiver@npm:7.0.0" dependencies: "@types/readdir-glob": "npm:*" - checksum: 10/93e500f55e3fbb200b10988dbd8407df78e8a3d921d09d97c114bde609ef75e478a2fdeddc1b8da465f569219dfb1fb7dc1ff83332d77c2a03806d68a027c909 + checksum: 10/ed9d2d259b3aa86c64c8b28cfffc01ee8199ff5db906b70ad500233cef032a22368ac456c19aa5ae7b9472e1ec587d834d46b4e85d45a3f1f16bf4c7060c5bc4 languageName: node linkType: hard From 7d29cbe68dd21d411565305958d8bf74bdc8b1c8 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Mon, 8 Dec 2025 12:39:46 +0100 Subject: [PATCH 253/312] chore: update changeset Signed-off-by: benjdlambert --- .changeset/rare-rice-throw.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/rare-rice-throw.md b/.changeset/rare-rice-throw.md index e220a27ac4..6fa0434f67 100644 --- a/.changeset/rare-rice-throw.md +++ b/.changeset/rare-rice-throw.md @@ -1,5 +1,5 @@ --- -'@backstage/core-components': minor +'@backstage/core-components': patch --- -Add tooltipClasses prop to OverflowTooltip component to allow customisation of the tooltip +Add `tooltipClasses` prop to `OverflowTooltip` component to allow customisation of the tooltip From 88a1dce3c5806ccd053b7ce1a78c4b4005d3ec04 Mon Sep 17 00:00:00 2001 From: Jonas Beck Date: Mon, 8 Dec 2025 13:08:00 +0100 Subject: [PATCH 254/312] docs(events): update readme documentation Signed-off-by: Jonas Beck --- plugins/events-backend-module-kafka/README.md | 92 ++++++++++++++----- 1 file changed, 67 insertions(+), 25 deletions(-) diff --git a/plugins/events-backend-module-kafka/README.md b/plugins/events-backend-module-kafka/README.md index dbc5bf5607..f77b5d2f21 100644 --- a/plugins/events-backend-module-kafka/README.md +++ b/plugins/events-backend-module-kafka/README.md @@ -2,65 +2,107 @@ Welcome to the `events-backend-module-kafka` backend module! -This package is a module for the `events-backend` backend plugin and extends the events system with an `KafkaConsumingEventPublisher.` +This package is a module for the `events-backend` backend plugin and extends the events system with a `KafkaConsumingEventPublisher` and `KafkaPublishingEventConsumer` -This event publisher will allow you to receive events from an Kafka queue and will publish these to the used `EventsService` implementation. +This module provides two-way integration with Kafka: + +- **KafkaConsumingEventPublisher**: Receives events from Kafka queues and publishes them to the Backstage events system +- **KafkaPublishingEventConsumer**: Consumes events from Backstage and publishes them to Kafka queues ## Configuration -To set up Kafka queues, you need to configure the following values: +To set up Kafka integration, you need to configure one or both of the following components: + +### KafkaConsumingEventPublisher Configuration + +To receive events from Kafka queues and publish them to Backstage: ```yaml events: modules: kafka: kafkaConsumingEventPublisher: - clientId: your-client-id # (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. - brokers: # (Required) List of brokers in the Kafka cluster to connect to. - - broker1 - - broker2 - topics: - - topic: 'backstage.topic' # (Required) Replace with actual topic name as expected by subscribers - kafka: - topics: # (Required) The Kafka topics to subscribe to. - - topic1 - groupId: your-group-id # (Required) The GroupId to be used by the topic consumers. + production: # Instance name, will be included in logs + clientId: your-client-id # (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. + brokers: # (Required) List of brokers in the Kafka cluster to connect to. + - broker1 + - broker2 + topics: + - topic: 'backstage.topic' # (Required) Replace with actual topic name as expected by subscribers + kafka: + topics: # (Required) The Kafka topics to subscribe to. + - topic1 + groupId: your-group-id # (Required) The GroupId to be used by the topic consumers. +``` + +### KafkaPublishingEventConsumer Configuration + +To publish events from Backstage to Kafka queues, you can configure the `KafkaPublishingEventConsumer`: + +```yaml +events: + modules: + kafka: + kafkaPublishingEventConsumer: + production: # Instance name, will be included in logs + clientId: your-client-id # (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. + brokers: # (Required) List of brokers in the Kafka cluster to connect to. + - broker1 + - broker2 + topics: + - topic: 'catalog.entity.created' # (Required) The Backstage topic to consume from + kafka: + topic: kafka-topic-name # (Required) The Kafka topic to publish to ``` For a complete list of all available fields that can be configured, refer to the [config.d.ts file](./config.d.ts). ### Optional SSL Configuration -If your Kafka cluster requires SSL, you can configure it as follows: +If your Kafka cluster requires SSL, you can configure it for both `kafkaConsumingEventPublisher` and `kafkaPublishingEventConsumer` instances: ```yaml events: modules: kafka: kafkaConsumingEventPublisher: - ssl: - rejectUnauthorized: true # (Optional) If true, the server certificate is verified against the list of supplied CAs. - ca: [path/to/ca-cert] # (Optional) Array of trusted certificates in PEM format. - key: path/to/client-key # (Optional) Private key in PEM format. - cert: path/to/client-cert # (Optional) Public x509 certificate in PEM format. + production: + # ... other configuration ... + ssl: + rejectUnauthorized: true # (Optional) If true, the server certificate is verified against the list of supplied CAs. + ca: [path/to/ca-cert] # (Optional) Array of trusted certificates in PEM format. + key: path/to/client-key # (Optional) Private key in PEM format. + cert: path/to/client-cert # (Optional) Public x509 certificate in PEM format. + kafkaPublishingEventConsumer: + production: + # ... other configuration ... + ssl: + # Same SSL configuration options as above ``` ### Optional SASL Authentication Configuration -If your Kafka cluster requires `SASL` authentication, you can configure it as follows: +If your Kafka cluster requires SASL authentication, you can configure it for both components: ```yaml events: modules: kafka: kafkaConsumingEventPublisher: - sasl: - mechanism: 'plain' # SASL mechanism ('plain', 'scram-sha-256' or 'scram-sha-512') - username: your-username # SASL username - password: your-password # SASL password + production: + # ... other configuration ... + sasl: + mechanism: 'plain' # SASL mechanism ('plain', 'scram-sha-256' or 'scram-sha-512') + username: your-username # SASL username + password: your-password # SASL password + kafkaPublishingEventConsumer: + production: + # ... other configuration ... + sasl: + # Same SASL configuration options as above ``` -This section includes optional `SSL` and `SASL` authentication configuration for enhanced security. +These SSL and SASL configurations apply to both Kafka components and provide enhanced security for your Kafka connections. ## Installation From b3c0594c8e062a29d684d3557dcdb7ff284f8bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 4 Dec 2025 17:00:12 +0100 Subject: [PATCH 255/312] Use a versioned context for `useEntityList` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/green-lizards-boil.md | 5 ++ plugins/catalog-react/report.api.md | 2 +- plugins/catalog-react/src/deprecated.tsx | 18 +++++- plugins/catalog-react/src/hooks/index.ts | 6 +- .../src/hooks/useEntityListProvider.test.tsx | 64 ++++++++++++++++++- .../src/hooks/useEntityListProvider.tsx | 47 +++++++++++--- .../MockEntityListContextProvider.tsx | 9 ++- 7 files changed, 129 insertions(+), 22 deletions(-) create mode 100644 .changeset/green-lizards-boil.md diff --git a/.changeset/green-lizards-boil.md b/.changeset/green-lizards-boil.md new file mode 100644 index 0000000000..640699e001 --- /dev/null +++ b/.changeset/green-lizards-boil.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Use a versioned context for `useEntityList`, to better work with mixed `@backstage/plugin-catalog-react` versions. diff --git a/plugins/catalog-react/report.api.md b/plugins/catalog-react/report.api.md index 8916fc98f9..14c832d545 100644 --- a/plugins/catalog-react/report.api.md +++ b/plugins/catalog-react/report.api.md @@ -322,7 +322,7 @@ export const EntityLifecyclePicker: (props: { initialFilter?: string[]; }) => JSX_2.Element; -// @public +// @public @deprecated export const EntityListContext: Context< EntityListContextProps | undefined >; diff --git a/plugins/catalog-react/src/deprecated.tsx b/plugins/catalog-react/src/deprecated.tsx index 74186d9c29..7d347dda6b 100644 --- a/plugins/catalog-react/src/deprecated.tsx +++ b/plugins/catalog-react/src/deprecated.tsx @@ -15,10 +15,12 @@ */ import { PropsWithChildren, useCallback, useMemo, useState } from 'react'; +import { createVersionedValueMap } from '@backstage/version-bridge'; import { DefaultEntityFilters, - EntityListContext, EntityListContextProps, + NewEntityListContext, + OldEntityListContext, } from './hooks/useEntityListProvider'; /** @@ -81,8 +83,18 @@ export function MockEntityListContextProvider< ); return ( - + {children} - + ); } + +/** + * Creates new context for entity listing and filtering. + * + * @public + * @deprecated Please use `EntityListProvider` and `EntityListProvider` instead. + */ +export const EntityListContext = OldEntityListContext; diff --git a/plugins/catalog-react/src/hooks/index.ts b/plugins/catalog-react/src/hooks/index.ts index befcce520d..2bce5a4673 100644 --- a/plugins/catalog-react/src/hooks/index.ts +++ b/plugins/catalog-react/src/hooks/index.ts @@ -24,11 +24,7 @@ export type { EntityProviderProps, AsyncEntityProviderProps, } from './useEntity'; -export { - EntityListContext, - EntityListProvider, - useEntityList, -} from './useEntityListProvider'; +export { EntityListProvider, useEntityList } from './useEntityListProvider'; export type { DefaultEntityFilters, EntityListContextProps, diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx index f7090f330b..7b9d17d82e 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx @@ -42,7 +42,13 @@ import { } from '../filters'; import { createDeferred } from '@backstage/types'; import { EntityListPagination } from '../types'; -import { EntityListProvider, useEntityList } from './useEntityListProvider'; +import { + EntityListContextProps, + EntityListProvider, + NewEntityListContext, + useEntityList, +} from './useEntityListProvider'; +import { createVersionedValueMap } from '@backstage/version-bridge'; const entities: Entity[] = [ { @@ -1048,3 +1054,59 @@ describe(``, () => { ); }); }); + +describe('versioned context', () => { + it('should work explicitly with new versioned contexts', () => { + const value: EntityListContextProps = { + filters: {}, + entities: [], + backendEntities: [], + updateFilters: jest.fn(), + queryParameters: {}, + loading: true, + limit: 277, + setLimit: jest.fn(), + setOffset: jest.fn(), + paginationMode: 'none', + }; + + const { result } = renderHook(() => useEntityList(), { + wrapper: ({ children }) => { + const InitialFiltersWrapper = (f: PropsWithChildren<{}>) => { + const { updateFilters } = useEntityList(); + useMountEffect(() => { + updateFilters({ + kind: new EntityKindFilter('component', 'Component'), + }); + }); + return <>{f.children}; + }; + + return ( + + + + {children} + + + + ); + }, + }); + + expect(result.current.limit).toBe(277); + }); +}); diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx index 8c4927ad0a..a2ab4ea377 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx @@ -17,6 +17,11 @@ import { QueryEntitiesResponse } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { useApi } from '@backstage/core-plugin-api'; +import { + createVersionedContext, + createVersionedValueMap, + useVersionedContext, +} from '@backstage/version-bridge'; import { compact, isEqual } from 'lodash'; import qs from 'qs'; import { @@ -122,11 +127,17 @@ export type EntityListContextProps< paginationMode: PaginationMode; }; +// This context has support for multiple concurrent versions of this package. +// It is currently used in parallel with the old context in order to provide +// a smooth transition, but will eventually be the only context we use. +export const NewEntityListContext = createVersionedContext<{ + 1: EntityListContextProps; +}>('entity-list-context'); + /** * Creates new context for entity listing and filtering. - * @public */ -export const EntityListContext = createContext< +export const OldEntityListContext = createContext< EntityListContextProps | undefined >(undefined); @@ -487,9 +498,13 @@ export const EntityListProvider = ( ); return ( - - {props.children} - + + + {props.children} + + ); }; @@ -500,8 +515,22 @@ export const EntityListProvider = ( export function useEntityList< EntityFilters extends DefaultEntityFilters = DefaultEntityFilters, >(): EntityListContextProps { - const context = useContext(EntityListContext); - if (!context) - throw new Error('useEntityList must be used within EntityListProvider'); - return context; + const versionedHolder = useVersionedContext<{ + 1: EntityListContextProps; + }>('entity-list-context'); + const oldContext = useContext(OldEntityListContext); + + if (versionedHolder) { + const value = versionedHolder.atVersion(1); + if (!value) { + throw new Error('EntityListContext v1 not available'); + } + return value; + } + + if (oldContext) { + return oldContext; + } + + throw new Error('useEntityList must be used within EntityListProvider'); } diff --git a/plugins/catalog-react/src/testUtils/MockEntityListContextProvider.tsx b/plugins/catalog-react/src/testUtils/MockEntityListContextProvider.tsx index 0dcbbed8e8..e75e7e20e3 100644 --- a/plugins/catalog-react/src/testUtils/MockEntityListContextProvider.tsx +++ b/plugins/catalog-react/src/testUtils/MockEntityListContextProvider.tsx @@ -17,9 +17,10 @@ import { PropsWithChildren, useCallback, useMemo, useState } from 'react'; import { DefaultEntityFilters, - EntityListContext, EntityListContextProps, } from '@backstage/plugin-catalog-react'; +import { createVersionedValueMap } from '@backstage/version-bridge'; +import { NewEntityListContext } from '../hooks/useEntityListProvider'; /** * Simplifies testing of code that uses the entity list hooks. @@ -82,8 +83,10 @@ export function MockEntityListContextProvider< ); return ( - + {children} - + ); } From be21c5c8222257a0e0509ae5919fedbff6f05e45 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 13:04:34 +0000 Subject: [PATCH 256/312] fix(deps): update rjsf monorepo to v5.24.13 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-959c095.md | 11 +++++ plugins/home-react/package.json | 2 +- plugins/home/package.json | 8 ++-- plugins/scaffolder-react/package.json | 8 ++-- plugins/scaffolder/package.json | 8 ++-- yarn.lock | 69 +++++++++++++-------------- 6 files changed, 58 insertions(+), 48 deletions(-) create mode 100644 .changeset/renovate-959c095.md diff --git a/.changeset/renovate-959c095.md b/.changeset/renovate-959c095.md new file mode 100644 index 0000000000..d2370a1c8b --- /dev/null +++ b/.changeset/renovate-959c095.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-home-react': patch +'@backstage/plugin-home': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Updated dependency `@rjsf/utils` to `5.24.13`. +Updated dependency `@rjsf/core` to `5.24.13`. +Updated dependency `@rjsf/material-ui` to `5.24.13`. +Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index fc93ea3360..f94413ca64 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -60,7 +60,7 @@ "@backstage/frontend-plugin-api": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@rjsf/utils": "5.23.2" + "@rjsf/utils": "5.24.13" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/home/package.json b/plugins/home/package.json index 856d6ea143..01c0c5bb40 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -69,10 +69,10 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@rjsf/core": "5.23.2", - "@rjsf/material-ui": "5.23.2", - "@rjsf/utils": "5.23.2", - "@rjsf/validator-ajv8": "5.23.2", + "@rjsf/core": "5.24.13", + "@rjsf/material-ui": "5.24.13", + "@rjsf/utils": "5.24.13", + "@rjsf/validator-ajv8": "5.24.13", "lodash": "^4.17.21", "luxon": "^3.4.3", "react-grid-layout": "1.3.4", diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index dcb9f5a7a0..81a01f9229 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -73,10 +73,10 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", - "@rjsf/core": "5.23.2", - "@rjsf/material-ui": "5.23.2", - "@rjsf/utils": "5.23.2", - "@rjsf/validator-ajv8": "5.23.2", + "@rjsf/core": "5.24.13", + "@rjsf/material-ui": "5.24.13", + "@rjsf/utils": "5.24.13", + "@rjsf/validator-ajv8": "5.24.13", "@types/json-schema": "^7.0.9", "ajv": "^8.0.1", "ajv-errors": "^3.0.0", diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 0f7f139c51..55302da959 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -81,10 +81,10 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", - "@rjsf/core": "5.23.2", - "@rjsf/material-ui": "5.23.2", - "@rjsf/utils": "5.23.2", - "@rjsf/validator-ajv8": "5.23.2", + "@rjsf/core": "5.24.13", + "@rjsf/material-ui": "5.24.13", + "@rjsf/utils": "5.24.13", + "@rjsf/validator-ajv8": "5.24.13", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^15.0.0", diff --git a/yarn.lock b/yarn.lock index b96a76ddfa..03746feb43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5719,7 +5719,7 @@ __metadata: "@backstage/frontend-plugin-api": "workspace:^" "@material-ui/core": "npm:^4.12.2" "@material-ui/icons": "npm:^4.9.1" - "@rjsf/utils": "npm:5.23.2" + "@rjsf/utils": "npm:5.24.13" "@types/react": "npm:^18.0.0" "@types/react-grid-layout": "npm:^1.3.2" react: "npm:^18.0.2" @@ -5756,10 +5756,10 @@ __metadata: "@material-ui/core": "npm:^4.12.2" "@material-ui/icons": "npm:^4.9.1" "@material-ui/lab": "npm:4.0.0-alpha.61" - "@rjsf/core": "npm:5.23.2" - "@rjsf/material-ui": "npm:5.23.2" - "@rjsf/utils": "npm:5.23.2" - "@rjsf/validator-ajv8": "npm:5.23.2" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" "@testing-library/dom": "npm:^10.0.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^16.0.0" @@ -6865,10 +6865,10 @@ __metadata: "@material-ui/icons": "npm:^4.9.1" "@material-ui/lab": "npm:4.0.0-alpha.61" "@react-hookz/web": "npm:^24.0.0" - "@rjsf/core": "npm:5.23.2" - "@rjsf/material-ui": "npm:5.23.2" - "@rjsf/utils": "npm:5.23.2" - "@rjsf/validator-ajv8": "npm:5.23.2" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" "@testing-library/dom": "npm:^10.0.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^16.0.0" @@ -6941,10 +6941,10 @@ __metadata: "@material-ui/icons": "npm:^4.9.1" "@material-ui/lab": "npm:4.0.0-alpha.61" "@react-hookz/web": "npm:^24.0.0" - "@rjsf/core": "npm:5.23.2" - "@rjsf/material-ui": "npm:5.23.2" - "@rjsf/utils": "npm:5.23.2" - "@rjsf/validator-ajv8": "npm:5.23.2" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" "@testing-library/dom": "npm:^10.0.0" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^16.0.0" @@ -16412,38 +16412,37 @@ __metadata: languageName: node linkType: hard -"@rjsf/core@npm:5.23.2": - version: 5.23.2 - resolution: "@rjsf/core@npm:5.23.2" +"@rjsf/core@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/core@npm:5.24.13" dependencies: lodash: "npm:^4.17.21" lodash-es: "npm:^4.17.21" markdown-to-jsx: "npm:^7.4.1" - nanoid: "npm:^3.3.7" prop-types: "npm:^15.8.1" peerDependencies: - "@rjsf/utils": ^5.23.x + "@rjsf/utils": ^5.24.x react: ^16.14.0 || >=17 - checksum: 10/a49cbd41bb8b499ad2ed521417f53bf3fa65c09bedbf0e02ce0f00a5287a3ae4df774e74f89a8dcb8a24359d382a585ea4d20c3a6e109f4aaad2cd74b7db2b01 + checksum: 10/80defb9ccbb563722dc0a613358122e86c775d10af04d1298e416e7069fa30cddf71823c82444fb1b5ab2f8e4706ff09f2606259fdd8ea59865373eb9493eb5e languageName: node linkType: hard -"@rjsf/material-ui@npm:5.23.2": - version: 5.23.2 - resolution: "@rjsf/material-ui@npm:5.23.2" +"@rjsf/material-ui@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/material-ui@npm:5.24.13" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 - "@rjsf/core": ^5.23.x - "@rjsf/utils": ^5.23.x + "@rjsf/core": ^5.24.x + "@rjsf/utils": ^5.24.x react: ^16.14.0 || >=17 - checksum: 10/0c9ab33d4a2251bc4a3868fd09e6267ccd23e96b226204e1e2b5d9667fec375f64ac9674f3f5c8b013bb6e0b745f31854cab92b859b0c9ff2527338760664d5f + checksum: 10/b52e35973e81670cf57d8d3bda10b2b1bc57dfb5b6ab7be6176e6d5c384d40b86171bb30e7712e0d5971428e1553a70de08935fa680ef6877b0e97ad4c192059 languageName: node linkType: hard -"@rjsf/utils@npm:5.23.2": - version: 5.23.2 - resolution: "@rjsf/utils@npm:5.23.2" +"@rjsf/utils@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/utils@npm:5.24.13" dependencies: json-schema-merge-allof: "npm:^0.8.1" jsonpointer: "npm:^5.0.1" @@ -16452,21 +16451,21 @@ __metadata: react-is: "npm:^18.2.0" peerDependencies: react: ^16.14.0 || >=17 - checksum: 10/739a65a40dede96dd1d202ad0c0df96ffe4c75cd3ebcf035da9589eecf2875100c9e28066e135ececa4c188abee436b9ccaa1536992ab5d8417bb6c9e43bd156 + checksum: 10/4bd6788c4d12c147bd26c67568267ce34d15f618c1f38f964e6981d202bf78e2101ab0d286987659840455115bd8f183aa133308bf0f8468ca44153723e3c6d0 languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.23.2": - version: 5.23.2 - resolution: "@rjsf/validator-ajv8@npm:5.23.2" +"@rjsf/validator-ajv8@npm:5.24.13": + version: 5.24.13 + resolution: "@rjsf/validator-ajv8@npm:5.24.13" dependencies: ajv: "npm:^8.12.0" ajv-formats: "npm:^2.1.1" lodash: "npm:^4.17.21" lodash-es: "npm:^4.17.21" peerDependencies: - "@rjsf/utils": ^5.23.x - checksum: 10/568693ef0b93f21000b3b9352a65dd65001b4b85514fd94a1bf7562dc9ab8333f3a077c5335041fd7d250fac9a6c9cb77ea8539d8589a03afa55539898f896e6 + "@rjsf/utils": ^5.24.x + checksum: 10/a684862ded27792c8f40cfcf26436fa91f0666c6b95aa7281bb6448221a85cffb6a178fd99d172758aae2c41c58033047d902743962b7f3a2b46204ebdb0009d languageName: node linkType: hard @@ -39057,7 +39056,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.11, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.11": version: 3.3.11 resolution: "nanoid@npm:3.3.11" bin: From 68e1cd1d1794e4b48bb444ccfddd5febb115ef6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 8 Dec 2025 14:35:03 +0100 Subject: [PATCH 257/312] add explicit node version to version packages flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .github/workflows/sync_version-packages.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index a5a035d3a3..683d527e45 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -12,6 +12,7 @@ jobs: create-release-pr: name: Create Changeset PR runs-on: ubuntu-latest + steps: - name: Harden Runner uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 @@ -24,8 +25,15 @@ jobs: fetch-tags: true token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} + - name: Use Node.js 22.x + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: 22.x + registry-url: https://registry.npmjs.org/ # Needed for auth + - name: Install Dependencies run: yarn --immutable + - name: Create Release Pull Request uses: backstage/changesets-action@a39baf18913e669734ffb00c2fd9900472cfa240 # v2.3.2 with: From 2c74ea97b5cd13862b195eb301c299422c383873 Mon Sep 17 00:00:00 2001 From: Jonas Beck Date: Mon, 8 Dec 2025 13:17:48 +0100 Subject: [PATCH 258/312] chore(changeset): add changesets Signed-off-by: Jonas Beck --- .changeset/angry-views-win.md | 23 +++++++++++++++++++++++ .changeset/stale-poets-battle.md | 7 +++++++ 2 files changed, 30 insertions(+) create mode 100644 .changeset/angry-views-win.md create mode 100644 .changeset/stale-poets-battle.md diff --git a/.changeset/angry-views-win.md b/.changeset/angry-views-win.md new file mode 100644 index 0000000000..bf45881d25 --- /dev/null +++ b/.changeset/angry-views-win.md @@ -0,0 +1,23 @@ +--- +'@backstage/plugin-events-backend-module-kafka': minor +--- + +**BREAKING**: Updated `kafkaConsumingEventPublisher` configuration to support multiple named instances + +The Kafka configuration now requires named instances instead of a single configuration object for `kafkaConsumingEventPublisher`, this allows for multiple Kafka configurations. + +These changes are **required** to your `app-config.yaml`: + +```diff +events: + modules: + kafka: + kafkaConsumingEventPublisher: +- clientId: your-client-id +- brokers: [...] +- topics: [...] ++ default: # Or any name like 'prod', 'dev', etc. ++ clientId: your-client-id ++ brokers: [...] ++ topics: [...] +``` diff --git a/.changeset/stale-poets-battle.md b/.changeset/stale-poets-battle.md new file mode 100644 index 0000000000..1725fd2885 --- /dev/null +++ b/.changeset/stale-poets-battle.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-events-backend-module-kafka': minor +--- + +Added `KafkaPublishingEventConsumer` to support sending Backstage events to Kafka topics. + +This addition enables Backstage to publish events to external Kafka systems, complementing the existing ability to receive events from Kafka. This allows for better integration with external systems that rely on Kafka for event streaming. From 75683ed6c0635f8fa92a09dfa688c376d8d29b0c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 6 Dec 2025 12:53:18 +0100 Subject: [PATCH 259/312] frontend-plugin-api: new error boundary API option + boundary for app root elements Signed-off-by: Patrik Oldsberg --- .changeset/alert-api-replay.md | 5 ++ .changeset/error-boundary-api.md | 7 ++ .../AlertApi/AlertApiForwarder.ts | 17 ++++- packages/frontend-plugin-api/report.api.md | 2 + .../AppRootElementBlueprint.test.tsx | 65 +++++++++++++++++++ ...ueprint.ts => AppRootElementBlueprint.tsx} | 9 ++- .../src/components/ErrorApiBoundary.tsx | 50 ++++++++++++++ ...rBoundary.tsx => ErrorDisplayBoundary.tsx} | 18 +++-- .../src/components/ExtensionBoundary.tsx | 44 ++++++++++--- 9 files changed, 194 insertions(+), 23 deletions(-) create mode 100644 .changeset/alert-api-replay.md create mode 100644 .changeset/error-boundary-api.md rename packages/frontend-plugin-api/src/blueprints/{AppRootElementBlueprint.ts => AppRootElementBlueprint.tsx} (78%) create mode 100644 packages/frontend-plugin-api/src/components/ErrorApiBoundary.tsx rename packages/frontend-plugin-api/src/components/{ErrorBoundary.tsx => ErrorDisplayBoundary.tsx} (80%) diff --git a/.changeset/alert-api-replay.md b/.changeset/alert-api-replay.md new file mode 100644 index 0000000000..b41ec091a3 --- /dev/null +++ b/.changeset/alert-api-replay.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription. diff --git a/.changeset/error-boundary-api.md b/.changeset/error-boundary-api.md new file mode 100644 index 0000000000..74803f1dc0 --- /dev/null +++ b/.changeset/error-boundary-api.md @@ -0,0 +1,7 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Added a new `errorPresentation` prop to `ExtensionBoundary` to control how errors are presented to the user. The default is `'error-display'`, which is the current behavior of showing the error in the `ErrorDisplay` component. The new option is `'error-api'`, posts errors to the `ErrorApi` and does not allow retries. + +The `AppRootElementBlueprint` now wraps its element in an `ErrorBoundary` using the new `'error-api'` presentation mode. diff --git a/packages/core-app-api/src/apis/implementations/AlertApi/AlertApiForwarder.ts b/packages/core-app-api/src/apis/implementations/AlertApi/AlertApiForwarder.ts index 4e5397f65d..138d00c09c 100644 --- a/packages/core-app-api/src/apis/implementations/AlertApi/AlertApiForwarder.ts +++ b/packages/core-app-api/src/apis/implementations/AlertApi/AlertApiForwarder.ts @@ -17,20 +17,35 @@ import { AlertApi, AlertMessage } from '@backstage/core-plugin-api'; import { Observable } from '@backstage/types'; import { PublishSubject } from '../../../lib/subjects'; +import ObservableImpl from 'zen-observable'; /** * Base implementation for the AlertApi that simply forwards alerts to consumers. * + * Recent alerts are buffered and replayed to new subscribers to prevent + * missing alerts that were posted before subscription. + * * @public */ export class AlertApiForwarder implements AlertApi { private readonly subject = new PublishSubject(); + private readonly recentAlerts: AlertMessage[] = []; + private readonly maxBufferSize = 10; post(alert: AlertMessage) { + this.recentAlerts.push(alert); + if (this.recentAlerts.length > this.maxBufferSize) { + this.recentAlerts.shift(); + } this.subject.next(alert); } alert$(): Observable { - return this.subject; + return new ObservableImpl(subscriber => { + for (const alert of this.recentAlerts) { + subscriber.next(alert); + } + return this.subject.subscribe(subscriber); + }); } } diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index ca4f8a1a0c..e45401304b 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -1146,6 +1146,8 @@ export interface ExtensionBoundaryProps { // (undocumented) children: ReactNode; // (undocumented) + errorPresentation?: 'error-api' | 'error-display'; + // (undocumented) node: AppNode; } diff --git a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx index 39f03cfad4..31d7323aec 100644 --- a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx +++ b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx @@ -14,7 +14,19 @@ * limitations under the License. */ +import { screen, waitFor } from '@testing-library/react'; +import { + MockErrorApi, + TestApiProvider, + withLogCollector, +} from '@backstage/test-utils'; +import { errorApiRef } from '../apis'; +import { + createExtensionTester, + renderInTestApp, +} from '@backstage/frontend-test-utils'; import { AppRootElementBlueprint } from './AppRootElementBlueprint'; +import { ForwardedError } from '@backstage/errors'; describe('AppRootElementBlueprint', () => { it('should create an extension with sensible defaults', () => { @@ -46,4 +58,57 @@ describe('AppRootElementBlueprint', () => { } `); }); + + it('should post error to errorApi and not render children when error occurs', async () => { + const errorApi = new MockErrorApi({ collect: true }); + const errorMessage = 'Test error message'; + const ErrorComponent = () => { + throw new Error(errorMessage); + }; + + await withLogCollector(['error'], async () => { + const extension = AppRootElementBlueprint.make({ + params: { + element: , + }, + }); + + const tester = createExtensionTester(extension); + renderInTestApp( + + {tester.reactElement()} + , + ); + + await waitFor(() => { + const errors = errorApi.getErrors(); + expect(errors.length).toBeGreaterThan(0); + const postedError = errors[0].error; + expect(postedError).toBeInstanceOf(ForwardedError); + expect(postedError.message).toBe( + "Error in extension 'app-root-element:test'; caused by Error: Test error message", + ); + }); + + expect(screen.queryByText(errorMessage)).not.toBeInTheDocument(); + }); + }); + + it('should render children when there is no error', async () => { + const successMessage = 'Success!'; + const SuccessComponent = () =>
{successMessage}
; + + const extension = AppRootElementBlueprint.make({ + params: { + element: , + }, + }); + + const tester = createExtensionTester(extension); + renderInTestApp(tester.reactElement()); + + await waitFor(() => { + expect(screen.getByText(successMessage)).toBeInTheDocument(); + }); + }); }); diff --git a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.ts b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.tsx similarity index 78% rename from packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.ts rename to packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.tsx index d1c71155f2..955abce136 100644 --- a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.ts +++ b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ +import { ExtensionBoundary } from '@backstage/frontend-plugin-api'; import { coreExtensionData, createExtensionBlueprint } from '../wiring'; /** @@ -26,7 +27,11 @@ export const AppRootElementBlueprint = createExtensionBlueprint({ kind: 'app-root-element', attachTo: { id: 'app/root', input: 'elements' }, output: [coreExtensionData.reactElement], - *factory(params: { element: JSX.Element }) { - yield coreExtensionData.reactElement(params.element); + *factory(params: { element: JSX.Element }, { node }) { + yield coreExtensionData.reactElement( + + {params.element} + , + ); }, }); diff --git a/packages/frontend-plugin-api/src/components/ErrorApiBoundary.tsx b/packages/frontend-plugin-api/src/components/ErrorApiBoundary.tsx new file mode 100644 index 0000000000..e195da5d0f --- /dev/null +++ b/packages/frontend-plugin-api/src/components/ErrorApiBoundary.tsx @@ -0,0 +1,50 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component, ErrorInfo, ReactNode } from 'react'; +import { AppNode, ErrorApi } from '../apis'; +import { ForwardedError } from '@backstage/errors'; + +/** @internal */ +export class ErrorApiBoundary extends Component< + { + children: ReactNode; + node: AppNode; + errorApi?: ErrorApi; + }, + { error?: Error } +> { + static getDerivedStateFromError(error: Error) { + return { error }; + } + + state = { error: undefined }; + + componentDidCatch(error: Error, _errorInfo: ErrorInfo) { + const { node, errorApi } = this.props; + errorApi?.post( + new ForwardedError(`Error in extension '${node.spec.id}'`, error), + ); + } + + render() { + if (this.state.error) { + return null; + } + + return this.props.children; + } +} diff --git a/packages/frontend-plugin-api/src/components/ErrorBoundary.tsx b/packages/frontend-plugin-api/src/components/ErrorDisplayBoundary.tsx similarity index 80% rename from packages/frontend-plugin-api/src/components/ErrorBoundary.tsx rename to packages/frontend-plugin-api/src/components/ErrorDisplayBoundary.tsx index 4cde84ee93..1584f18514 100644 --- a/packages/frontend-plugin-api/src/components/ErrorBoundary.tsx +++ b/packages/frontend-plugin-api/src/components/ErrorDisplayBoundary.tsx @@ -14,25 +14,23 @@ * limitations under the License. */ -import { Component, PropsWithChildren } from 'react'; +import { Component, ReactNode } from 'react'; import { FrontendPlugin } from '../wiring'; import { ErrorDisplay } from './DefaultSwappableComponents'; -type ErrorBoundaryProps = PropsWithChildren<{ - plugin?: FrontendPlugin; -}>; -type ErrorBoundaryState = { error?: Error }; - /** @internal */ -export class ErrorBoundary extends Component< - ErrorBoundaryProps, - ErrorBoundaryState +export class ErrorDisplayBoundary extends Component< + { + children: ReactNode; + plugin: FrontendPlugin; + }, + { error?: Error } > { static getDerivedStateFromError(error: Error) { return { error }; } - state: ErrorBoundaryState = { error: undefined }; + state = { error: undefined }; handleErrorReset = () => { this.setState({ error: undefined }); diff --git a/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx b/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx index 421f41be56..6e4487ed9b 100644 --- a/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx +++ b/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx @@ -22,14 +22,23 @@ import { lazy as reactLazy, } from 'react'; import { AnalyticsContext, useAnalytics } from '../analytics'; -import { ErrorBoundary } from './ErrorBoundary'; +import { ErrorDisplayBoundary } from './ErrorDisplayBoundary'; +import { ErrorApiBoundary } from './ErrorApiBoundary'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { routableExtensionRenderedEvent } from '../../../core-plugin-api/src/analytics/Tracker'; -import { AppNode } from '../apis'; +import { AppNode, ErrorApi, errorApiRef, useApi } from '../apis'; import { coreExtensionData } from '../wiring'; import { AppNodeProvider } from './AppNodeProvider'; import { Progress } from './DefaultSwappableComponents'; +function useOptionalErrorApi(): ErrorApi | undefined { + try { + return useApi(errorApiRef); + } catch { + return undefined; + } +} + type RouteTrackerProps = PropsWithChildren<{ enabled?: boolean; }>; @@ -53,6 +62,7 @@ const RouteTracker = (props: RouteTrackerProps) => { /** @public */ export interface ExtensionBoundaryProps { + errorPresentation?: 'error-api' | 'error-display'; node: AppNode; children: ReactNode; } @@ -61,6 +71,8 @@ export interface ExtensionBoundaryProps { export function ExtensionBoundary(props: ExtensionBoundaryProps) { const { node, children } = props; + const errorApi = useOptionalErrorApi(); + const hasRoutePathOutput = Boolean( node.instance?.getData(coreExtensionData.routePath), ); @@ -70,18 +82,30 @@ export function ExtensionBoundary(props: ExtensionBoundaryProps) { // Skipping "routeRef" attribute in the new system, the extension "id" should provide more insight const attributes = { extensionId: node.spec.id, - pluginId: node.spec.plugin?.id ?? 'app', + pluginId: plugin.id ?? 'app', }; + let content = ( + + {children} + + ); + + if (props.errorPresentation === 'error-api') { + content = ( + + {content} + + ); + } else { + content = ( + {content} + ); + } + return ( - }> - - - {children} - - - + }>{content} ); } From 1d32a428179587f4dd1ceee9b59377a20d04b6fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 15:12:45 +0000 Subject: [PATCH 260/312] chore(deps): update dependency terser-webpack-plugin to v5.3.15 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 b96a76ddfa..fb318aa6e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47321,8 +47321,8 @@ __metadata: linkType: hard "terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.11": - version: 5.3.14 - resolution: "terser-webpack-plugin@npm:5.3.14" + version: 5.3.15 + resolution: "terser-webpack-plugin@npm:5.3.15" dependencies: "@jridgewell/trace-mapping": "npm:^0.3.25" jest-worker: "npm:^27.4.5" @@ -47338,7 +47338,7 @@ __metadata: optional: true uglify-js: optional: true - checksum: 10/5b7290f7edb179b83cefb8827c12371ddddc088cf251cf58a1c738d82628331ae6604273b61fe991d77411d4bb6b7178c3826aa47edf01b4ee21f973d6c8b8fb + checksum: 10/54059f0fe56c16a1e30032b33b1321051d562b5292adcf88d160c7d8e74779867014e98548ae59ba5283fe60f8725bea37c16b42f2c89ee430382cff74198b7a languageName: node linkType: hard From 9b692625996b8dfa5210a78a87e1394155a3c49d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 15:23:34 +0000 Subject: [PATCH 261/312] fix(deps): update dependency @backstage-community/plugin-explore-common to ^0.9.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-9ec01ff.md | 5 +++++ plugins/search-backend-module-explore/package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/renovate-9ec01ff.md diff --git a/.changeset/renovate-9ec01ff.md b/.changeset/renovate-9ec01ff.md new file mode 100644 index 0000000000..1ab750c0e6 --- /dev/null +++ b/.changeset/renovate-9ec01ff.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-module-explore': patch +--- + +Updated dependency `@backstage-community/plugin-explore-common` to `^0.9.0`. diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index d4a5d72b3c..812427c03c 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -49,7 +49,7 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage-community/plugin-explore-common": "^0.5.0", + "@backstage-community/plugin-explore-common": "^0.9.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", diff --git a/yarn.lock b/yarn.lock index b0cea37d22..baaece00fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2807,10 +2807,10 @@ __metadata: languageName: node linkType: hard -"@backstage-community/plugin-explore-common@npm:^0.5.0": - version: 0.5.0 - resolution: "@backstage-community/plugin-explore-common@npm:0.5.0" - checksum: 10/258dd4102f64220b28803db3825e52bb2974cad5704ca134a75b7924dd95a601c92fd8d6606cc3bcd949feace420a407a85ff32f4bd782c8e45ab728b62cda46 +"@backstage-community/plugin-explore-common@npm:^0.9.0": + version: 0.9.0 + resolution: "@backstage-community/plugin-explore-common@npm:0.9.0" + checksum: 10/ff0a81ab775a415fa3ec088cc47dd79836e50c653414ec7ff9ba4b7022eb3327ef9d47fb572aafeb4da6deaff86ac1cbd09a62caf84849e4027f30764be632d3 languageName: node linkType: hard @@ -7033,7 +7033,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-search-backend-module-explore@workspace:plugins/search-backend-module-explore" dependencies: - "@backstage-community/plugin-explore-common": "npm:^0.5.0" + "@backstage-community/plugin-explore-common": "npm:^0.9.0" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" From b267aeaa0415d4f9f6e694f43243f44ad70bc4dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 16:07:37 +0000 Subject: [PATCH 262/312] chore(deps): update dependency @types/nodemailer to v7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .changeset/renovate-aa0bb93.md | 5 + .../package.json | 2 +- yarn.lock | 1048 +++++++++-------- 3 files changed, 539 insertions(+), 516 deletions(-) create mode 100644 .changeset/renovate-aa0bb93.md diff --git a/.changeset/renovate-aa0bb93.md b/.changeset/renovate-aa0bb93.md new file mode 100644 index 0000000000..5f40a61fab --- /dev/null +++ b/.changeset/renovate-aa0bb93.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend-module-email': patch +--- + +Updated dependency `@types/nodemailer` to `^7.0.0`. diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index 30f907074b..e62ae5e92f 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -53,7 +53,7 @@ "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@types/nodemailer": "^6.4.14" + "@types/nodemailer": "^7.0.0" }, "configSchema": "config.d.ts" } diff --git a/yarn.lock b/yarn.lock index 7fd7f16edb..ac8b680ab2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -712,51 +712,51 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sesv2@npm:^3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/client-sesv2@npm:3.911.0" +"@aws-sdk/client-sesv2@npm:^3.839.0, @aws-sdk/client-sesv2@npm:^3.911.0": + version: 3.946.0 + resolution: "@aws-sdk/client-sesv2@npm:3.946.0" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/credential-provider-node": "npm:3.911.0" - "@aws-sdk/middleware-host-header": "npm:3.910.0" - "@aws-sdk/middleware-logger": "npm:3.910.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" - "@aws-sdk/middleware-user-agent": "npm:3.911.0" - "@aws-sdk/region-config-resolver": "npm:3.910.0" - "@aws-sdk/signature-v4-multi-region": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@aws-sdk/util-endpoints": "npm:3.910.0" - "@aws-sdk/util-user-agent-browser": "npm:3.910.0" - "@aws-sdk/util-user-agent-node": "npm:3.911.0" - "@smithy/config-resolver": "npm:^4.3.2" - "@smithy/core": "npm:^3.16.1" - "@smithy/fetch-http-handler": "npm:^5.3.3" - "@smithy/hash-node": "npm:^4.2.2" - "@smithy/invalid-dependency": "npm:^4.2.2" - "@smithy/middleware-content-length": "npm:^4.2.2" - "@smithy/middleware-endpoint": "npm:^4.3.3" - "@smithy/middleware-retry": "npm:^4.4.3" - "@smithy/middleware-serde": "npm:^4.2.2" - "@smithy/middleware-stack": "npm:^4.2.2" - "@smithy/node-config-provider": "npm:^4.3.2" - "@smithy/node-http-handler": "npm:^4.4.1" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/smithy-client": "npm:^4.8.1" - "@smithy/types": "npm:^4.7.1" - "@smithy/url-parser": "npm:^4.2.2" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/credential-provider-node": "npm:3.946.0" + "@aws-sdk/middleware-host-header": "npm:3.936.0" + "@aws-sdk/middleware-logger": "npm:3.936.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.936.0" + "@aws-sdk/middleware-user-agent": "npm:3.946.0" + "@aws-sdk/region-config-resolver": "npm:3.936.0" + "@aws-sdk/signature-v4-multi-region": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@aws-sdk/util-endpoints": "npm:3.936.0" + "@aws-sdk/util-user-agent-browser": "npm:3.936.0" + "@aws-sdk/util-user-agent-node": "npm:3.946.0" + "@smithy/config-resolver": "npm:^4.4.3" + "@smithy/core": "npm:^3.18.7" + "@smithy/fetch-http-handler": "npm:^5.3.6" + "@smithy/hash-node": "npm:^4.2.5" + "@smithy/invalid-dependency": "npm:^4.2.5" + "@smithy/middleware-content-length": "npm:^4.2.5" + "@smithy/middleware-endpoint": "npm:^4.3.14" + "@smithy/middleware-retry": "npm:^4.4.14" + "@smithy/middleware-serde": "npm:^4.2.6" + "@smithy/middleware-stack": "npm:^4.2.5" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/node-http-handler": "npm:^4.4.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" + "@smithy/url-parser": "npm:^4.2.5" "@smithy/util-base64": "npm:^4.3.0" "@smithy/util-body-length-browser": "npm:^4.2.0" "@smithy/util-body-length-node": "npm:^4.2.1" - "@smithy/util-defaults-mode-browser": "npm:^4.3.2" - "@smithy/util-defaults-mode-node": "npm:^4.2.3" - "@smithy/util-endpoints": "npm:^3.2.2" - "@smithy/util-middleware": "npm:^4.2.2" - "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-defaults-mode-browser": "npm:^4.3.13" + "@smithy/util-defaults-mode-node": "npm:^4.2.16" + "@smithy/util-endpoints": "npm:^3.2.5" + "@smithy/util-middleware": "npm:^4.2.5" + "@smithy/util-retry": "npm:^4.2.5" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/27831e2fe821120a1a252f9bbc00bc8b9669d38cb112e369a1690c2f7aba1bb3e7b8743acd235db1b7cbf62e4d27abced22fa068b3962e1f5313665b33ed0084 + checksum: 10/da96e92e19e3e0d1815d311820dc9ad6f35b04f19247395d82b188bafc86d53ac7dc051f84eff5cf4370f1d402d537748c262af93f45009a6fb78eb690f576ae languageName: node linkType: hard @@ -906,49 +906,49 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/client-sso@npm:3.911.0" +"@aws-sdk/client-sso@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/client-sso@npm:3.946.0" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/middleware-host-header": "npm:3.910.0" - "@aws-sdk/middleware-logger": "npm:3.910.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" - "@aws-sdk/middleware-user-agent": "npm:3.911.0" - "@aws-sdk/region-config-resolver": "npm:3.910.0" - "@aws-sdk/types": "npm:3.910.0" - "@aws-sdk/util-endpoints": "npm:3.910.0" - "@aws-sdk/util-user-agent-browser": "npm:3.910.0" - "@aws-sdk/util-user-agent-node": "npm:3.911.0" - "@smithy/config-resolver": "npm:^4.3.2" - "@smithy/core": "npm:^3.16.1" - "@smithy/fetch-http-handler": "npm:^5.3.3" - "@smithy/hash-node": "npm:^4.2.2" - "@smithy/invalid-dependency": "npm:^4.2.2" - "@smithy/middleware-content-length": "npm:^4.2.2" - "@smithy/middleware-endpoint": "npm:^4.3.3" - "@smithy/middleware-retry": "npm:^4.4.3" - "@smithy/middleware-serde": "npm:^4.2.2" - "@smithy/middleware-stack": "npm:^4.2.2" - "@smithy/node-config-provider": "npm:^4.3.2" - "@smithy/node-http-handler": "npm:^4.4.1" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/smithy-client": "npm:^4.8.1" - "@smithy/types": "npm:^4.7.1" - "@smithy/url-parser": "npm:^4.2.2" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/middleware-host-header": "npm:3.936.0" + "@aws-sdk/middleware-logger": "npm:3.936.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.936.0" + "@aws-sdk/middleware-user-agent": "npm:3.946.0" + "@aws-sdk/region-config-resolver": "npm:3.936.0" + "@aws-sdk/types": "npm:3.936.0" + "@aws-sdk/util-endpoints": "npm:3.936.0" + "@aws-sdk/util-user-agent-browser": "npm:3.936.0" + "@aws-sdk/util-user-agent-node": "npm:3.946.0" + "@smithy/config-resolver": "npm:^4.4.3" + "@smithy/core": "npm:^3.18.7" + "@smithy/fetch-http-handler": "npm:^5.3.6" + "@smithy/hash-node": "npm:^4.2.5" + "@smithy/invalid-dependency": "npm:^4.2.5" + "@smithy/middleware-content-length": "npm:^4.2.5" + "@smithy/middleware-endpoint": "npm:^4.3.14" + "@smithy/middleware-retry": "npm:^4.4.14" + "@smithy/middleware-serde": "npm:^4.2.6" + "@smithy/middleware-stack": "npm:^4.2.5" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/node-http-handler": "npm:^4.4.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" + "@smithy/url-parser": "npm:^4.2.5" "@smithy/util-base64": "npm:^4.3.0" "@smithy/util-body-length-browser": "npm:^4.2.0" "@smithy/util-body-length-node": "npm:^4.2.1" - "@smithy/util-defaults-mode-browser": "npm:^4.3.2" - "@smithy/util-defaults-mode-node": "npm:^4.2.3" - "@smithy/util-endpoints": "npm:^3.2.2" - "@smithy/util-middleware": "npm:^4.2.2" - "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-defaults-mode-browser": "npm:^4.3.13" + "@smithy/util-defaults-mode-node": "npm:^4.2.16" + "@smithy/util-endpoints": "npm:^3.2.5" + "@smithy/util-middleware": "npm:^4.2.5" + "@smithy/util-retry": "npm:^4.2.5" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/63c3f054251f9b2d823fa65c3c82887230a62bdf364af8f8b3ea5ad22995ea97058bb8ffbfacf2724c058acea0c437fc8b2bc5f21a098a03a3550df53a02e258 + checksum: 10/02f43ce6418d22ad1d4347d62eef1dc21df6945b2e2cc52f6b266488fa9d0ac51262392a5a1cfa8e8d600ffb160d3a2e1c02406a72bda3dc3dc86af4886dcbf8 languageName: node linkType: hard @@ -1018,24 +1018,24 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/core@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/core@npm:3.911.0" +"@aws-sdk/core@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/core@npm:3.946.0" dependencies: - "@aws-sdk/types": "npm:3.910.0" - "@aws-sdk/xml-builder": "npm:3.911.0" - "@smithy/core": "npm:^3.16.1" - "@smithy/node-config-provider": "npm:^4.3.2" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/signature-v4": "npm:^5.3.2" - "@smithy/smithy-client": "npm:^4.8.1" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/types": "npm:3.936.0" + "@aws-sdk/xml-builder": "npm:3.930.0" + "@smithy/core": "npm:^3.18.7" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/signature-v4": "npm:^5.3.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" "@smithy/util-base64": "npm:^4.3.0" - "@smithy/util-middleware": "npm:^4.2.2" + "@smithy/util-middleware": "npm:^4.2.5" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/d667250ebc1bf09c0e227f45b9d5c6036312b014f57c75c7f65165febc3f34d2f176a6d6042231eb3f7682f7a537d3c45f101d8c462026e380fa766a95ed70e6 + checksum: 10/0ce2629d50f15a16e9586060dba2bf8eda4188527b1c753b2f87b687f4f452aa6b26c811c8b364db44692321bed5a359f1bc3ee4666ffe306c568cc58e213c54 languageName: node linkType: hard @@ -1064,16 +1064,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.911.0" +"@aws-sdk/credential-provider-env@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/520736358644fc27a7f6b72ff2f4feafeef4a6a5ef045980f6399fb056b4b96aa0ca4ebced21c28c07aed6e54abd653a3254c56213842a879be6af975b0500f8 + checksum: 10/743a9bf2e28607a14ed1e816f650c00f068566eaff0db88505e98d4ab4757e00919db0263d272fa46d528202f4f9d48bb0932905e5de00f790fd98963754064e languageName: node linkType: hard @@ -1094,21 +1094,21 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.911.0" +"@aws-sdk/credential-provider-http@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/fetch-http-handler": "npm:^5.3.3" - "@smithy/node-http-handler": "npm:^4.4.1" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/smithy-client": "npm:^4.8.1" - "@smithy/types": "npm:^4.7.1" - "@smithy/util-stream": "npm:^4.5.2" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/fetch-http-handler": "npm:^5.3.6" + "@smithy/node-http-handler": "npm:^4.4.5" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" + "@smithy/util-stream": "npm:^4.5.6" tslib: "npm:^2.6.2" - checksum: 10/2fa71970a2d48873df48dde8aa17e949b0c6e58a3369c16f5f14e2e4193c48bfd6d33ce97c6f4e091d2aafc4ff4c0eb112559286c88749729a17a02bbe479c2d + checksum: 10/c031f544dc581aa82624be0c3427811d3c5f9527c51d6dae1056dc23371a1a747d4090a38dfcda9aefc96ed22f8bfaafa66e7c58dbee49ff5035e0746aab1bee languageName: node linkType: hard @@ -1133,24 +1133,41 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.911.0" +"@aws-sdk/credential-provider-ini@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/credential-provider-env": "npm:3.911.0" - "@aws-sdk/credential-provider-http": "npm:3.911.0" - "@aws-sdk/credential-provider-process": "npm:3.911.0" - "@aws-sdk/credential-provider-sso": "npm:3.911.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.911.0" - "@aws-sdk/nested-clients": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/credential-provider-imds": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/credential-provider-env": "npm:3.946.0" + "@aws-sdk/credential-provider-http": "npm:3.946.0" + "@aws-sdk/credential-provider-login": "npm:3.946.0" + "@aws-sdk/credential-provider-process": "npm:3.946.0" + "@aws-sdk/credential-provider-sso": "npm:3.946.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.946.0" + "@aws-sdk/nested-clients": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/credential-provider-imds": "npm:^4.2.5" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/8cd3f3747e149df49842a22e98ef952cdf730e05be10cd48f9bd21932d009d80d30587c880819174c69350bc7f2ef1929df5bebca76fb5197bb9fcfa7b3f5eb3 + checksum: 10/796b2bea8b544469672c594da106a75a40ca3f6eb244f6c832c6eb51bce7bec6dce62deedf2bee1325f4fab6c6377afd96dfe13f8c7a243464e27a4030551158 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-login@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-login@npm:3.946.0" + dependencies: + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/nested-clients": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" + tslib: "npm:^2.6.2" + checksum: 10/c6af368cee31813f2fc33d7fe9739f5a6ca5d2501bd9030237cdec1c60d95fe08181224b179d7b6694b5293d0a1b0f4a43a487e5a0caf4f7ad425a7a7104d28e languageName: node linkType: hard @@ -1174,23 +1191,23 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.911.0, @aws-sdk/credential-provider-node@npm:^3.350.0": - version: 3.911.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.911.0" +"@aws-sdk/credential-provider-node@npm:3.946.0, @aws-sdk/credential-provider-node@npm:^3.350.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.946.0" dependencies: - "@aws-sdk/credential-provider-env": "npm:3.911.0" - "@aws-sdk/credential-provider-http": "npm:3.911.0" - "@aws-sdk/credential-provider-ini": "npm:3.911.0" - "@aws-sdk/credential-provider-process": "npm:3.911.0" - "@aws-sdk/credential-provider-sso": "npm:3.911.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/credential-provider-imds": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/credential-provider-env": "npm:3.946.0" + "@aws-sdk/credential-provider-http": "npm:3.946.0" + "@aws-sdk/credential-provider-ini": "npm:3.946.0" + "@aws-sdk/credential-provider-process": "npm:3.946.0" + "@aws-sdk/credential-provider-sso": "npm:3.946.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/credential-provider-imds": "npm:^4.2.5" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/fafa8408c97e1dd2262593be52de530d8718a4bf4f95b1efbde3f5b8b81a5e96f37bbccafa5216823228d0176665746f9d1810146b1e1f42b766d88ca5a0a083 + checksum: 10/60b08bef3b23af39aa59b44a7d65cfcdf708f04e17215e28fd03673a4a07d04261d8b4e6cf5b4c46b9b13c0ebc9bd999352ef839831595aa280cfa6be292ff6b languageName: node linkType: hard @@ -1207,17 +1224,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.911.0" +"@aws-sdk/credential-provider-process@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/73707a2b54f7d4e90a4080ac2cce03aa3738a8684ed0851b874be304839c90b1d8c2167d2eb4d63015e9d79cd19f94f682f3e31f8ecb5c361fd228ebf7f1c726 + checksum: 10/c6bdfc5e182ff26efcf0eaadde48b4be4e301f02bf3e229afd698f41c76675a61fe1e9173e4a0b29b65666dbeb269d4601c649a9e61c9086cb694f50bde2a0bf languageName: node linkType: hard @@ -1236,19 +1253,19 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.911.0" +"@aws-sdk/credential-provider-sso@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.946.0" dependencies: - "@aws-sdk/client-sso": "npm:3.911.0" - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/token-providers": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/client-sso": "npm:3.946.0" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/token-providers": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/80d626057b992cdf891fc8eb3365fe45d0071e4024273a95a9699aaeda05751fc492926c230c8c6e99d6bf8dbf4e08a977e5e668326059d2aa936bf1246c1c23 + checksum: 10/a3a1e8bc3ebe3337e6cbff415d1a39cfb1eb7785b4d312d5de3c335a05a090e7150913bcd4c5f9b88da6e9a30bf69a48a739321646850e5650cca4b73d870d1a languageName: node linkType: hard @@ -1266,18 +1283,18 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.911.0" +"@aws-sdk/credential-provider-web-identity@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/nested-clients": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/nested-clients": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/1a67f0799bd44f0cfaf0260c41c8b08009d6df80bf3de1028d67e808e003d11ea474f47d4a5816f147a413b6e29f5e1b28e2f4567b6f7f16ab2cdf196b731895 + checksum: 10/00eca35ed1df538fca1faceae1db6665ba5b22dbfd852f58d089cb211beb6e8ddecd172c3e51edd196063b40684dc1855f1a3fb4f02759652ed73eefee22268e languageName: node linkType: hard @@ -1401,15 +1418,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.910.0": - version: 3.910.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.910.0" +"@aws-sdk/middleware-host-header@npm:3.936.0": + version: 3.936.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.936.0" dependencies: - "@aws-sdk/types": "npm:3.910.0" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/456442bc5ab2b632562203e5f0185da4c9b20129ba7caf8371b021f1f47ac83a06b8726791d9ac350ba60531c9eaff6e6783a4e5be1a5c44fe6a59e766937c84 + checksum: 10/ce707c2402e50b227aa7e22134738ab61e03982ec375926bfa8b074deaeba5aa9296891960294d92aa5010e5446e49224a9d34f7beb55a5ed7b0ea749e49924b languageName: node linkType: hard @@ -1435,14 +1452,14 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.910.0": - version: 3.910.0 - resolution: "@aws-sdk/middleware-logger@npm:3.910.0" +"@aws-sdk/middleware-logger@npm:3.936.0": + version: 3.936.0 + resolution: "@aws-sdk/middleware-logger@npm:3.936.0" dependencies: - "@aws-sdk/types": "npm:3.910.0" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/6153032647a6c5f79d4ef822a52079a6e56f56923d42d8f73b377ad4188df5078424fe21a88706ad27fe30906c602a1fcc68d91955f08ef4f55617bbb41d49e7 + checksum: 10/277d845cdf03aca6d3af548d3751fdb598462fc9877272eadc75fa24e0d27aee267fc84a3583d4116b0fe03c703c59786e56447a88c549bc7394ec8a4ec3d9ea languageName: node linkType: hard @@ -1458,16 +1475,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.910.0": - version: 3.910.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.910.0" +"@aws-sdk/middleware-recursion-detection@npm:3.936.0": + version: 3.936.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.936.0" dependencies: - "@aws-sdk/types": "npm:3.910.0" - "@aws/lambda-invoke-store": "npm:^0.0.1" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/types": "npm:3.936.0" + "@aws/lambda-invoke-store": "npm:^0.2.0" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/3d727f874667baf1b8076690a17c658bc2260330e23d5fe95bdaa060b235becf1202fb7f3ca277db3530f36e136fbde37dbe2ec78d0a5191d9c5291652a7ae91 + checksum: 10/55fe5db2e8ef0dfcf0e3b37ea0e3640766c44d743f327b7b4dc33d764559908a918edfa4a04a3e04c2e981164998f81a52f747979a28aeed1835a29fd6634a01 languageName: node linkType: hard @@ -1493,25 +1510,25 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.911.0" +"@aws-sdk/middleware-sdk-s3@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" "@aws-sdk/util-arn-parser": "npm:3.893.0" - "@smithy/core": "npm:^3.16.1" - "@smithy/node-config-provider": "npm:^4.3.2" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/signature-v4": "npm:^5.3.2" - "@smithy/smithy-client": "npm:^4.8.1" - "@smithy/types": "npm:^4.7.1" + "@smithy/core": "npm:^3.18.7" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/signature-v4": "npm:^5.3.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" "@smithy/util-config-provider": "npm:^4.2.0" - "@smithy/util-middleware": "npm:^4.2.2" - "@smithy/util-stream": "npm:^4.5.2" + "@smithy/util-middleware": "npm:^4.2.5" + "@smithy/util-stream": "npm:^4.5.6" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/5b154c87e0bbb34fb8d137a0e613cb0b548150f181a44e316e140a3178facdf98cc5d7823c91999a0f26be27db12b23bddbdf380f7c0eae71772749944f1d548 + checksum: 10/97b2ae196c1edfb48eb8b33332d2864053bf7ef152fade966817f9c00f76a5941e48f2224fbbcec07bc5d3f7d3b86833e1978f4b1161480d4863b971d4477876 languageName: node linkType: hard @@ -1563,64 +1580,64 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.911.0" +"@aws-sdk/middleware-user-agent@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@aws-sdk/util-endpoints": "npm:3.910.0" - "@smithy/core": "npm:^3.16.1" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@aws-sdk/util-endpoints": "npm:3.936.0" + "@smithy/core": "npm:^3.18.7" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/c6f2ea464bdc2cb084243ec0c4edf39e55e35ae47ac1c6baa7349f80c87ad8efda1b84587be4c75f21347e52229e82d41c3ac0ae48aaa6a71555f1c83bbdec1c + checksum: 10/db44fc55412e6d7d1fd6dfa356b44321f157961afd830956bd040233e453243a4d60e410edb9d244972e38f365ff0dd0798a339d1814d6322a3838c0680ac950 languageName: node linkType: hard -"@aws-sdk/nested-clients@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/nested-clients@npm:3.911.0" +"@aws-sdk/nested-clients@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/nested-clients@npm:3.946.0" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/middleware-host-header": "npm:3.910.0" - "@aws-sdk/middleware-logger": "npm:3.910.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.910.0" - "@aws-sdk/middleware-user-agent": "npm:3.911.0" - "@aws-sdk/region-config-resolver": "npm:3.910.0" - "@aws-sdk/types": "npm:3.910.0" - "@aws-sdk/util-endpoints": "npm:3.910.0" - "@aws-sdk/util-user-agent-browser": "npm:3.910.0" - "@aws-sdk/util-user-agent-node": "npm:3.911.0" - "@smithy/config-resolver": "npm:^4.3.2" - "@smithy/core": "npm:^3.16.1" - "@smithy/fetch-http-handler": "npm:^5.3.3" - "@smithy/hash-node": "npm:^4.2.2" - "@smithy/invalid-dependency": "npm:^4.2.2" - "@smithy/middleware-content-length": "npm:^4.2.2" - "@smithy/middleware-endpoint": "npm:^4.3.3" - "@smithy/middleware-retry": "npm:^4.4.3" - "@smithy/middleware-serde": "npm:^4.2.2" - "@smithy/middleware-stack": "npm:^4.2.2" - "@smithy/node-config-provider": "npm:^4.3.2" - "@smithy/node-http-handler": "npm:^4.4.1" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/smithy-client": "npm:^4.8.1" - "@smithy/types": "npm:^4.7.1" - "@smithy/url-parser": "npm:^4.2.2" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/middleware-host-header": "npm:3.936.0" + "@aws-sdk/middleware-logger": "npm:3.936.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.936.0" + "@aws-sdk/middleware-user-agent": "npm:3.946.0" + "@aws-sdk/region-config-resolver": "npm:3.936.0" + "@aws-sdk/types": "npm:3.936.0" + "@aws-sdk/util-endpoints": "npm:3.936.0" + "@aws-sdk/util-user-agent-browser": "npm:3.936.0" + "@aws-sdk/util-user-agent-node": "npm:3.946.0" + "@smithy/config-resolver": "npm:^4.4.3" + "@smithy/core": "npm:^3.18.7" + "@smithy/fetch-http-handler": "npm:^5.3.6" + "@smithy/hash-node": "npm:^4.2.5" + "@smithy/invalid-dependency": "npm:^4.2.5" + "@smithy/middleware-content-length": "npm:^4.2.5" + "@smithy/middleware-endpoint": "npm:^4.3.14" + "@smithy/middleware-retry": "npm:^4.4.14" + "@smithy/middleware-serde": "npm:^4.2.6" + "@smithy/middleware-stack": "npm:^4.2.5" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/node-http-handler": "npm:^4.4.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" + "@smithy/url-parser": "npm:^4.2.5" "@smithy/util-base64": "npm:^4.3.0" "@smithy/util-body-length-browser": "npm:^4.2.0" "@smithy/util-body-length-node": "npm:^4.2.1" - "@smithy/util-defaults-mode-browser": "npm:^4.3.2" - "@smithy/util-defaults-mode-node": "npm:^4.2.3" - "@smithy/util-endpoints": "npm:^3.2.2" - "@smithy/util-middleware": "npm:^4.2.2" - "@smithy/util-retry": "npm:^4.2.2" + "@smithy/util-defaults-mode-browser": "npm:^4.3.13" + "@smithy/util-defaults-mode-node": "npm:^4.2.16" + "@smithy/util-endpoints": "npm:^3.2.5" + "@smithy/util-middleware": "npm:^4.2.5" + "@smithy/util-retry": "npm:^4.2.5" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/c666f08f4d9f3359b29852f64c1fcd1a837002cf546554e44ca23a4f2ba67ccfa356aae3e49d531b3481d1f9b982d61ad78e6a4779fab661aa0dfc522a90fd61 + checksum: 10/137089ad8cdca5e864e1643acfea6305d9723d1dd4e842fc37693374391c8ce8575b4e23757c2939530e9cf4bec2821e30e1ef18abb73d6d0d8c23880658f6cc languageName: node linkType: hard @@ -1682,17 +1699,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.910.0": - version: 3.910.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.910.0" +"@aws-sdk/region-config-resolver@npm:3.936.0": + version: 3.936.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.936.0" dependencies: - "@aws-sdk/types": "npm:3.910.0" - "@smithy/node-config-provider": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" - "@smithy/util-config-provider": "npm:^4.2.0" - "@smithy/util-middleware": "npm:^4.2.2" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/config-resolver": "npm:^4.4.3" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/30c72ad18fa9440765ace4c4acfa26f6525573adff1fb9c12b251da709413a6e0d08894c62d011b463dfd414ead54095845c7225d2a2654adf3e5871743ac965 + checksum: 10/384ffaba2aacb86987768a2208d29f8495322ba4ccb8e536d2aeeea7dbc92ac35bf624b9e15dee63430113f7e341d9f155ca9f72ae96bf2436616a5705f790f2 languageName: node linkType: hard @@ -1710,17 +1726,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.911.0" +"@aws-sdk/signature-v4-multi-region@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.946.0" dependencies: - "@aws-sdk/middleware-sdk-s3": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/protocol-http": "npm:^5.3.2" - "@smithy/signature-v4": "npm:^5.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/middleware-sdk-s3": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/signature-v4": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/da232ca896b90c6a8ae1370e29adb83af67a5ca4b660b61ba98ade2a31b173e5a31f4f535f342d5e4bac7f963641f4401c22616feca4dc622c538ef36982fa95 + checksum: 10/a76e1fb93e7b86710d2aec3a6c97761681b2e5f25358b8b04fe0ccf49b0ae159647c8159305294e4d1a953b1514851782c3b35b56f00a7c41c6f8fe1c3d6834c languageName: node linkType: hard @@ -1739,18 +1755,18 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/token-providers@npm:3.911.0" +"@aws-sdk/token-providers@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/token-providers@npm:3.946.0" dependencies: - "@aws-sdk/core": "npm:3.911.0" - "@aws-sdk/nested-clients": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/property-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/core": "npm:3.946.0" + "@aws-sdk/nested-clients": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/88cdadde7dbddc88c5cf33a519f7dd108ce74254acdee6a6c3e4c6aa931350f873c37abe426f43238ae58b02ce9dd7bc33c8b214813938eb9db88e74172f484b + checksum: 10/8c9e60a94bda6b9152e843f45ac6a53fc91b825eaa5ae3061aec12391d1abd561184d681eb71fc0c3c84fce7ea43b53d1ab13510c21d72b345361d734b47f988 languageName: node linkType: hard @@ -1774,13 +1790,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.910.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.347.0": - version: 3.910.0 - resolution: "@aws-sdk/types@npm:3.910.0" +"@aws-sdk/types@npm:3.936.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.347.0": + version: 3.936.0 + resolution: "@aws-sdk/types@npm:3.936.0" dependencies: - "@smithy/types": "npm:^4.7.1" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/7865602184322eaa0588ae16ac3cda941d8aaceaa88a6c2ab723e37dc4017db84ba5cfdf6d3b42b01d132d3090c08a732598bf9d9734b66f1c82903e1602af6e + checksum: 10/a8d11e5c88c0006962f7fb6dd37a7cab38ee5e270ffc8046c27a19b709179e1744b173e5538599f3c2326301549fbd18ab473c7dd018f8b49cff1e9c201ccf03 languageName: node linkType: hard @@ -1835,16 +1851,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.910.0": - version: 3.910.0 - resolution: "@aws-sdk/util-endpoints@npm:3.910.0" +"@aws-sdk/util-endpoints@npm:3.936.0": + version: 3.936.0 + resolution: "@aws-sdk/util-endpoints@npm:3.936.0" dependencies: - "@aws-sdk/types": "npm:3.910.0" - "@smithy/types": "npm:^4.7.1" - "@smithy/url-parser": "npm:^4.2.2" - "@smithy/util-endpoints": "npm:^3.2.2" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/types": "npm:^4.9.0" + "@smithy/url-parser": "npm:^4.2.5" + "@smithy/util-endpoints": "npm:^3.2.5" tslib: "npm:^2.6.2" - checksum: 10/c84a4f60cffad6db765e1f2a6e9a1d178adae1023f9c0594ed36504cfe9b9438073a4e81f668a1c9b27298ceb74800ff15088fa0d757cbddad41a179a160f879 + checksum: 10/fd9d995cd79886df424a8aea9407d9f810ea1a28af0d1f31f63310edc5839e086732479932d470404376dd5aa5672be1210cb62b9ce3942da29c0461215b94f2 languageName: node linkType: hard @@ -1899,15 +1915,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.910.0": - version: 3.910.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.910.0" +"@aws-sdk/util-user-agent-browser@npm:3.936.0": + version: 3.936.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.936.0" dependencies: - "@aws-sdk/types": "npm:3.910.0" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/types": "npm:^4.9.0" bowser: "npm:^2.11.0" tslib: "npm:^2.6.2" - checksum: 10/0bd5becebf9de4c3a02f88be5cb1912fb2b82f8ecf17e82840dcacfeac96fef4f04188645fe5f4cc6ecdbdc67dc5c408bb9843a9a534afe6be68af39ae1e9440 + checksum: 10/3b08066300dfbe202ba510d547ec4988c565e0cc103c726d452696942e5c0a66dfe2b271398ee6d46e8d3da546f094d491b74f8aa91ce3ba6553e5c6802a650e languageName: node linkType: hard @@ -1928,21 +1944,21 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.911.0" +"@aws-sdk/util-user-agent-node@npm:3.946.0": + version: 3.946.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.946.0" dependencies: - "@aws-sdk/middleware-user-agent": "npm:3.911.0" - "@aws-sdk/types": "npm:3.910.0" - "@smithy/node-config-provider": "npm:^4.3.2" - "@smithy/types": "npm:^4.7.1" + "@aws-sdk/middleware-user-agent": "npm:3.946.0" + "@aws-sdk/types": "npm:3.936.0" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: 10/c87cd348edc6436f0788eaad4b05e15c4f2fe8f096f9e90d40c13f440241da4336192190be2720f9941f1c72ddfd1d8e317d616fe5db1b6d3780fafadc7941e4 + checksum: 10/7f81c001abb8ea7fc8da9f342875082fa5f0c3c069b102a3fdece8e37e9560230c0f30056cf27dd4bdc47b8a5b2cc2d127c2029bf264fdb980f77729f8cee032 languageName: node linkType: hard @@ -1956,21 +1972,21 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.911.0": - version: 3.911.0 - resolution: "@aws-sdk/xml-builder@npm:3.911.0" +"@aws-sdk/xml-builder@npm:3.930.0": + version: 3.930.0 + resolution: "@aws-sdk/xml-builder@npm:3.930.0" dependencies: - "@smithy/types": "npm:^4.7.1" + "@smithy/types": "npm:^4.9.0" fast-xml-parser: "npm:5.2.5" tslib: "npm:^2.6.2" - checksum: 10/0208021abe8ac9633c3d13f1b108de58496af152029e6b0e10fe621a1dabfa412b1f14c91d531aeaf5431335b278d354a07d96acb8bc30369cff591d073338d8 + checksum: 10/7956588f54e282c0b6cefaeefec6103c0cf787427f29d599330241b5349635f0cc3742df0a3aa6d1792b237178e3cfa3ee156379aa160fb8d7bd854c4608263d languageName: node linkType: hard -"@aws/lambda-invoke-store@npm:^0.0.1": - version: 0.0.1 - resolution: "@aws/lambda-invoke-store@npm:0.0.1" - checksum: 10/e8f54d28aade8828962f2871a22aa4e960ebc40c8fa551414181dd9dd32d6258279013c42f88e57d17aa4252cb5ed00df6a49fc35185f9fa6b6f351ccf821bd6 +"@aws/lambda-invoke-store@npm:^0.2.0": + version: 0.2.2 + resolution: "@aws/lambda-invoke-store@npm:0.2.2" + checksum: 10/18cd0cec90d9d865c9089218ef2220b0a7302a860c9a3f808b101386f569abc5ee11eb98a36947bed280a63308dd5df23c39e7b07fe9ac4f4ffcd0c4dce537c4 languageName: node linkType: hard @@ -6050,7 +6066,7 @@ __metadata: "@backstage/plugin-notifications-common": "workspace:^" "@backstage/plugin-notifications-node": "workspace:^" "@backstage/types": "workspace:^" - "@types/nodemailer": "npm:^6.4.14" + "@types/nodemailer": "npm:^7.0.0" lodash: "npm:^4.17.21" nodemailer: "npm:^7.0.7" p-throttle: "npm:^4.1.1" @@ -17421,13 +17437,13 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/abort-controller@npm:4.2.3" +"@smithy/abort-controller@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/abort-controller@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/0e1b6ea58c876f953cfd953e1dbe8aa58f6fa6530fcec89522922d93a56426943c0b0b488438c12b8994bc50880b7386ad776d308963260f4c2b3edf5d2a7abf + checksum: 10/b0335823347ebbda10a03209ceeef83a711cd0ae8c1fb711e098402f107ea5d056ded24a17cad5a331955110e87377d716b6ed081e86c7b122d6fc6f5b74da67 languageName: node linkType: hard @@ -17463,16 +17479,17 @@ __metadata: languageName: node linkType: hard -"@smithy/config-resolver@npm:^4.3.2, @smithy/config-resolver@npm:^4.3.3": - version: 4.3.3 - resolution: "@smithy/config-resolver@npm:4.3.3" +"@smithy/config-resolver@npm:^4.4.3": + version: 4.4.3 + resolution: "@smithy/config-resolver@npm:4.4.3" dependencies: - "@smithy/node-config-provider": "npm:^4.3.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/types": "npm:^4.9.0" "@smithy/util-config-provider": "npm:^4.2.0" - "@smithy/util-middleware": "npm:^4.2.3" + "@smithy/util-endpoints": "npm:^3.2.5" + "@smithy/util-middleware": "npm:^4.2.5" tslib: "npm:^2.6.2" - checksum: 10/837e9a5f82aebbc114163e658462dd8a825e107d18687a404ceeb3650b992941f795dcef6b48f43875f6ff6262c7f435247d5c8c5b4c35615a198f3c3b8f7cc2 + checksum: 10/5a00a24d77afed5d820741fbf6f3f523bd4b36c3055cabe79221f0a2bcfa3baebe143997296f0d922707cf29341ec5c8aa4747ad0dba989a59f63f4f79ba5738 languageName: node linkType: hard @@ -17494,21 +17511,21 @@ __metadata: languageName: node linkType: hard -"@smithy/core@npm:^3.16.1, @smithy/core@npm:^3.17.0": - version: 3.17.0 - resolution: "@smithy/core@npm:3.17.0" +"@smithy/core@npm:^3.18.7": + version: 3.18.7 + resolution: "@smithy/core@npm:3.18.7" dependencies: - "@smithy/middleware-serde": "npm:^4.2.3" - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/middleware-serde": "npm:^4.2.6" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" "@smithy/util-base64": "npm:^4.3.0" "@smithy/util-body-length-browser": "npm:^4.2.0" - "@smithy/util-middleware": "npm:^4.2.3" - "@smithy/util-stream": "npm:^4.5.3" + "@smithy/util-middleware": "npm:^4.2.5" + "@smithy/util-stream": "npm:^4.5.6" "@smithy/util-utf8": "npm:^4.2.0" "@smithy/uuid": "npm:^1.1.0" tslib: "npm:^2.6.2" - checksum: 10/9f58db086801f69cba388a6c6e6af172c6f9dc7376497b608ddd25080b14a90eaa8de40cf9e5e3edb68135a3d9b0b35ce1dafb887a51781a59b4e2c2afc0223e + checksum: 10/eb03d40abc3dc8f9e543d3cfbe7066b9126b6b87a1ca7eeb805f1a0ed54dafbdabe4b5ce24eb84ce9f38bebf58ff1070041e7bb6436a1a179558ddebf2851a41 languageName: node linkType: hard @@ -17525,16 +17542,16 @@ __metadata: languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^4.2.2, @smithy/credential-provider-imds@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/credential-provider-imds@npm:4.2.3" +"@smithy/credential-provider-imds@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/credential-provider-imds@npm:4.2.5" dependencies: - "@smithy/node-config-provider": "npm:^4.3.3" - "@smithy/property-provider": "npm:^4.2.3" - "@smithy/types": "npm:^4.8.0" - "@smithy/url-parser": "npm:^4.2.3" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/types": "npm:^4.9.0" + "@smithy/url-parser": "npm:^4.2.5" tslib: "npm:^2.6.2" - checksum: 10/a654f9c5cd2be7a6faae6e71c0d69d1396037510eb843a3fd6297c81317ab03164a12582d6d24e132bb32f2a0b7c425e92ce963f7169329d8ef8245496a03ef1 + checksum: 10/45ce1b74f3259c073cfbbe8924b91db7e9061c98006476a7a457eb87f84b5687aba34df98513825537d3983e7763a8ce1fa851d24e47ff8731c3100f5defbb52 languageName: node linkType: hard @@ -17606,16 +17623,16 @@ __metadata: languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.3.3, @smithy/fetch-http-handler@npm:^5.3.4": - version: 5.3.4 - resolution: "@smithy/fetch-http-handler@npm:5.3.4" +"@smithy/fetch-http-handler@npm:^5.3.6": + version: 5.3.6 + resolution: "@smithy/fetch-http-handler@npm:5.3.6" dependencies: - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/querystring-builder": "npm:^4.2.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/querystring-builder": "npm:^4.2.5" + "@smithy/types": "npm:^4.9.0" "@smithy/util-base64": "npm:^4.3.0" tslib: "npm:^2.6.2" - checksum: 10/d72a4981611a5ef7f7f2d9e0ab75c6b2d98dfc09eeab94849f60e61780642221509ff00ca85d73eb2f9d42ea99a14fc9804f25335104d015c57d573fed02262b + checksum: 10/270c8cd7541765ed33f6883d598b3bda1b211c3f8bd4130c5d3db27aa2e5972d6bc46cb9762a673cf62351bb9edf492fc8f863212a6b5abea57f9050738ab3f2 languageName: node linkType: hard @@ -17643,15 +17660,15 @@ __metadata: languageName: node linkType: hard -"@smithy/hash-node@npm:^4.2.2": - version: 4.2.3 - resolution: "@smithy/hash-node@npm:4.2.3" +"@smithy/hash-node@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/hash-node@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" "@smithy/util-buffer-from": "npm:^4.2.0" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/7fad11066f36ac4d8c29f3676b26d8ad5aaf82b30ccf417a9eecf2cf8965c2fd0afd1f5f8e28d09112e350c84385fdaa5ed8596a11413a33794923cdc61253de + checksum: 10/cfdcb7459f54c0d7ecad300d24002c6043dfd12b4d3873048b6008a7566a3e8b53bdb141ddb485859ea155e2b4ae648bc21eec5e73ab73cc1aa215c32091c43c languageName: node linkType: hard @@ -17676,13 +17693,13 @@ __metadata: languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^4.2.2": - version: 4.2.3 - resolution: "@smithy/invalid-dependency@npm:4.2.3" +"@smithy/invalid-dependency@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/invalid-dependency@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/2aaac09946401b1665c686e43a08a09cd13fd9d4fac27849db70c685109b5419d06629b248a87921e939549fddc591a35d595855a753df990a0e9dc6ed807d77 + checksum: 10/745b35246c473ec640798a4b3f3fa5fd24618778c4c2244c1917d929ca2e6bf21adc5ef90c8b279b286f917dfa31670a689609546a21a7383c62fec56402b231 languageName: node linkType: hard @@ -17735,14 +17752,14 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^4.2.2": - version: 4.2.3 - resolution: "@smithy/middleware-content-length@npm:4.2.3" +"@smithy/middleware-content-length@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/middleware-content-length@npm:4.2.5" dependencies: - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/dc8dc197435e6a3b95812bfb57431b87c7d41175c8d24372f81e5eeda19448bca2fd2cb8829788e33abe3833e32da66e3fc44482ede3c929e04eec31bb74244d + checksum: 10/2c622812c4379f1957669ddd97a3daaf99302534e6f7a3cc2f220d65f56b84451a6d2e1d78dd79712b074ecdcf4bcbd9796b73af0c15df9245b192a747d410a7 languageName: node linkType: hard @@ -17761,19 +17778,19 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.3.3, @smithy/middleware-endpoint@npm:^4.3.4": - version: 4.3.4 - resolution: "@smithy/middleware-endpoint@npm:4.3.4" +"@smithy/middleware-endpoint@npm:^4.3.14": + version: 4.3.14 + resolution: "@smithy/middleware-endpoint@npm:4.3.14" dependencies: - "@smithy/core": "npm:^3.17.0" - "@smithy/middleware-serde": "npm:^4.2.3" - "@smithy/node-config-provider": "npm:^4.3.3" - "@smithy/shared-ini-file-loader": "npm:^4.3.3" - "@smithy/types": "npm:^4.8.0" - "@smithy/url-parser": "npm:^4.2.3" - "@smithy/util-middleware": "npm:^4.2.3" + "@smithy/core": "npm:^3.18.7" + "@smithy/middleware-serde": "npm:^4.2.6" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" + "@smithy/url-parser": "npm:^4.2.5" + "@smithy/util-middleware": "npm:^4.2.5" tslib: "npm:^2.6.2" - checksum: 10/018dae712791d553bf9484b4183b6b6162da0d9a9baf6d8c39fae5669a6adf764b294edcf63827c119fed1da0bbfa3f751f4796d35379d13b8ac36504c449685 + checksum: 10/2622afb558bdc89a459e6220a16406d614da9c89d002e4b9eff6255739a887fc7eabbd2af755446730e8eb17b1268421842de4abc053c7a0c8693fb423c1108e languageName: node linkType: hard @@ -17794,20 +17811,20 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.4.3": - version: 4.4.4 - resolution: "@smithy/middleware-retry@npm:4.4.4" +"@smithy/middleware-retry@npm:^4.4.14": + version: 4.4.14 + resolution: "@smithy/middleware-retry@npm:4.4.14" dependencies: - "@smithy/node-config-provider": "npm:^4.3.3" - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/service-error-classification": "npm:^4.2.3" - "@smithy/smithy-client": "npm:^4.9.0" - "@smithy/types": "npm:^4.8.0" - "@smithy/util-middleware": "npm:^4.2.3" - "@smithy/util-retry": "npm:^4.2.3" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/service-error-classification": "npm:^4.2.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" + "@smithy/util-middleware": "npm:^4.2.5" + "@smithy/util-retry": "npm:^4.2.5" "@smithy/uuid": "npm:^1.1.0" tslib: "npm:^2.6.2" - checksum: 10/850477842b63bf6b7d362a777eee68db0d11578b3437a3ced55b3c9531622bb126531e7b9b3b4ab3627e59780f86bb3be690eb2ba0aa34fc1bf13cb29dad54c1 + checksum: 10/4e5eee34c97ca971914b684cd0d5eeeca5213893f6c7b29b029d4b9a516458eda52bff7d6e2470de8d7e89c47cabb7bbaa0101e5d1f58740f1078b26b9abbd4d languageName: node linkType: hard @@ -17821,14 +17838,14 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-serde@npm:^4.2.2, @smithy/middleware-serde@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/middleware-serde@npm:4.2.3" +"@smithy/middleware-serde@npm:^4.2.6": + version: 4.2.6 + resolution: "@smithy/middleware-serde@npm:4.2.6" dependencies: - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/725583757ed653628887c72a3924e11eda9de88a72ca337538fb3365f1cb732c0652129d15033560548178bcccf7964211926340f56fdd972a28dab549b32dc1 + checksum: 10/87aa0c6bf9743d003fed4f1d544a69610dae0005a58241b4fa8aab1c48746f104bbbb549df7f89b7040134a2af645ebecc375b3abde26c910d5e4e4c26c28b88 languageName: node linkType: hard @@ -17842,13 +17859,13 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-stack@npm:^4.2.2, @smithy/middleware-stack@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/middleware-stack@npm:4.2.3" +"@smithy/middleware-stack@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/middleware-stack@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/f6054dbb2b3f141390940caa93319c750f447da483b36d506208200023100eeda5a550b9d3415812ad194604c54cae48aa2e185f6c3ab625e87718089d75b3ab + checksum: 10/146647dabe0bc20415b82a0862b1d65ceb4f98167fff19f7002d6a8ea933527c19b5081cd4fdc4532f803e8085356e987d72c659501dccbdd8c8056a7d394ce7 languageName: node linkType: hard @@ -17864,15 +17881,15 @@ __metadata: languageName: node linkType: hard -"@smithy/node-config-provider@npm:^4.3.2, @smithy/node-config-provider@npm:^4.3.3": - version: 4.3.3 - resolution: "@smithy/node-config-provider@npm:4.3.3" +"@smithy/node-config-provider@npm:^4.3.5": + version: 4.3.5 + resolution: "@smithy/node-config-provider@npm:4.3.5" dependencies: - "@smithy/property-provider": "npm:^4.2.3" - "@smithy/shared-ini-file-loader": "npm:^4.3.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/shared-ini-file-loader": "npm:^4.4.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/0c2191861f5bcb4a0e1d5b15968c4edeb33a910948ee8378a3504311ee4da8f53a29d223ee86433b693cbd6aac9977560e62a5ef2fae108904408f4bf8b89e55 + checksum: 10/d0044a205b765be9648c44654e189804bf1cf83aed002fd5ff1cb7abbc9ed4b29886bb9b9c87fe440b8c319b3e1e2aecafec5aa147569d5921e35b1e2692f010 languageName: node linkType: hard @@ -17889,16 +17906,16 @@ __metadata: languageName: node linkType: hard -"@smithy/node-http-handler@npm:^4.4.1, @smithy/node-http-handler@npm:^4.4.2": - version: 4.4.2 - resolution: "@smithy/node-http-handler@npm:4.4.2" +"@smithy/node-http-handler@npm:^4.4.5": + version: 4.4.5 + resolution: "@smithy/node-http-handler@npm:4.4.5" dependencies: - "@smithy/abort-controller": "npm:^4.2.3" - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/querystring-builder": "npm:^4.2.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/abort-controller": "npm:^4.2.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/querystring-builder": "npm:^4.2.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/82d08f563dad787a2685c3dbc2ae8d15d11f02bce2a5ba3e078b8093e2324f6a3e15ff5730cacc0a5bbd1c096134497da15c03bd0e03c73041205f8d84621910 + checksum: 10/0748c69d581c01144360c81aa3f0eeb619c3e473540846a59949031b25bbd4a83e82beabd801c4bc9b4774f53a2e1ab00a5d3afb847f7a245788630b7c3b307a languageName: node linkType: hard @@ -17912,13 +17929,13 @@ __metadata: languageName: node linkType: hard -"@smithy/property-provider@npm:^4.2.2, @smithy/property-provider@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/property-provider@npm:4.2.3" +"@smithy/property-provider@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/property-provider@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/01368d05e878235fbda10f2d2b6c1d004d918ed84fcf01d26ad4765f4a6c7c6d889a0f3e08c786cf977f02c2eb53ae2fb01ac511c5f538ac6daa0170d41dbd7d + checksum: 10/fc7b1b26f4a0ae3bdf3e742607cc1fa4c81dbf166bdd908a528e2613dd76923722e927be66edd4ddcc203ca2c33a32c0d0088dd89132ef4feb265d7fa43b44da languageName: node linkType: hard @@ -17932,13 +17949,13 @@ __metadata: languageName: node linkType: hard -"@smithy/protocol-http@npm:^5.3.2, @smithy/protocol-http@npm:^5.3.3": - version: 5.3.3 - resolution: "@smithy/protocol-http@npm:5.3.3" +"@smithy/protocol-http@npm:^5.3.5": + version: 5.3.5 + resolution: "@smithy/protocol-http@npm:5.3.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/224043361976827a5498809e0d9fe7c5fd8a8233da40f05b8113cf5358e6bc0d4a4e6160d74ffdadb0c9733fd88cab32625d324cfd45748beb19fa69201410fb + checksum: 10/444c40f8a0cdd2b7d73a0d48527903f5a76346e93b9c1a2d9fd2b45a925259eb2afce2c3ce384a0f52eda8c82ffcd5ef137ac52580fd99f7b20c93d54191baf2 languageName: node linkType: hard @@ -17953,14 +17970,14 @@ __metadata: languageName: node linkType: hard -"@smithy/querystring-builder@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/querystring-builder@npm:4.2.3" +"@smithy/querystring-builder@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/querystring-builder@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" "@smithy/util-uri-escape": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/b0f7733d66b9e821d1efe260dc44db5586c3f8b1ebe59d30ff1fcf5d3dab87a1fa133f005e9947e7127dbfa6e504581bd2507b37c6568889ab2a99dceacb4064 + checksum: 10/34385aa700bd4476ac40901b3be11c389c898a54a84c6a109794493d9bd285d0e6fe24c8d4cc696be04e0cd0b105985cc244fe36a00a99db04ec6f81e11cae69 languageName: node linkType: hard @@ -17974,13 +17991,13 @@ __metadata: languageName: node linkType: hard -"@smithy/querystring-parser@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/querystring-parser@npm:4.2.3" +"@smithy/querystring-parser@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/querystring-parser@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/39bd2f57cf1c695f2942b4dd5362dd80ad2d2fd40d03e90396721735637190bd05ea9e942639b67ae8817a9e99fff9b510f6ba04568f14ad62228e676994107a + checksum: 10/4d3c12436409be000c865fe46fe792454d518b9939971d5f8f19d73b7e04ce26654c13555a81eaf72092bc92cdb0dddc762891f1e73785c0827933b95b81b42a languageName: node linkType: hard @@ -17993,12 +18010,12 @@ __metadata: languageName: node linkType: hard -"@smithy/service-error-classification@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/service-error-classification@npm:4.2.3" +"@smithy/service-error-classification@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/service-error-classification@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" - checksum: 10/fcb61c68fb820c379ef3e86d6b316c10b706ef76f23f19c66323555b9973cec34a237caabcb67fb5b5553f93ddb52acd1d2dbbe6a9f64806584089588c203c38 + "@smithy/types": "npm:^4.9.0" + checksum: 10/4466f742bbc960411deee6424d15525ed4cc8cc024c82c8023f380213c3e17d3eee57db91428df3b1b55281a463b8178d5f69100de48aaf0fd0e39ff81017bff languageName: node linkType: hard @@ -18012,13 +18029,13 @@ __metadata: languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^4.3.2, @smithy/shared-ini-file-loader@npm:^4.3.3": - version: 4.3.3 - resolution: "@smithy/shared-ini-file-loader@npm:4.3.3" +"@smithy/shared-ini-file-loader@npm:^4.4.0": + version: 4.4.0 + resolution: "@smithy/shared-ini-file-loader@npm:4.4.0" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/2b724e27e7e7ff58be6a75985856f3cb11b3830cd04eab3375743ab961fa9a8a5bb5efa6cb40f89afc73702c6daa36c415153f460e4ec6b08394aa4101a1ec41 + checksum: 10/09dd2fc84ce8c356995802388a3fb2d954c7a356e7d62e059ed969e28e79d8b07d84109bca81e2b2447d7f1a57f7e800bd14138552cba163253f30f5345ff524 languageName: node linkType: hard @@ -18038,19 +18055,19 @@ __metadata: languageName: node linkType: hard -"@smithy/signature-v4@npm:^5.3.2": - version: 5.3.3 - resolution: "@smithy/signature-v4@npm:5.3.3" +"@smithy/signature-v4@npm:^5.3.5": + version: 5.3.5 + resolution: "@smithy/signature-v4@npm:5.3.5" dependencies: "@smithy/is-array-buffer": "npm:^4.2.0" - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" "@smithy/util-hex-encoding": "npm:^4.2.0" - "@smithy/util-middleware": "npm:^4.2.3" + "@smithy/util-middleware": "npm:^4.2.5" "@smithy/util-uri-escape": "npm:^4.2.0" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/75c22765749fbcfe34110d745afc346aa6b6d62d2ede74e062be48e65704ff92abf1695c1e1323b211a813f355849aaeb2caa0cab3c92a34112512c51728e9ab + checksum: 10/aa615f431d436c6ccdee159e9fea15b56e7754bf713f9c0d6e0d75a915abe8a938a0b3eb36306c2ae9cd0713198ea38410f05f60bcf58ee68bbf22ae9639ce39 languageName: node linkType: hard @@ -18068,18 +18085,18 @@ __metadata: languageName: node linkType: hard -"@smithy/smithy-client@npm:^4.8.1, @smithy/smithy-client@npm:^4.9.0": - version: 4.9.0 - resolution: "@smithy/smithy-client@npm:4.9.0" +"@smithy/smithy-client@npm:^4.9.10": + version: 4.9.10 + resolution: "@smithy/smithy-client@npm:4.9.10" dependencies: - "@smithy/core": "npm:^3.17.0" - "@smithy/middleware-endpoint": "npm:^4.3.4" - "@smithy/middleware-stack": "npm:^4.2.3" - "@smithy/protocol-http": "npm:^5.3.3" - "@smithy/types": "npm:^4.8.0" - "@smithy/util-stream": "npm:^4.5.3" + "@smithy/core": "npm:^3.18.7" + "@smithy/middleware-endpoint": "npm:^4.3.14" + "@smithy/middleware-stack": "npm:^4.2.5" + "@smithy/protocol-http": "npm:^5.3.5" + "@smithy/types": "npm:^4.9.0" + "@smithy/util-stream": "npm:^4.5.6" tslib: "npm:^2.6.2" - checksum: 10/b1533d0faeaa810b87997ddc40bdda64a49af24b10fdb88ef37d1a45743b1d8eb292b7835e1da4c3f5facf47e4cc7caec7e2ccceae46ddb529257419b207086c + checksum: 10/c4e593f1e91da83c1e144d1c2e85ae88327ac99d1b11b7f1dfb6b76a63029ae3f73396893834c6beae017be0308ecab5c4c1f5449ab6aff11f55cebaa911d256 languageName: node linkType: hard @@ -18101,12 +18118,12 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^4.7.1, @smithy/types@npm:^4.8.0": - version: 4.8.0 - resolution: "@smithy/types@npm:4.8.0" +"@smithy/types@npm:^4.9.0": + version: 4.9.0 + resolution: "@smithy/types@npm:4.9.0" dependencies: tslib: "npm:^2.6.2" - checksum: 10/12ee5d629cae55b696e870caefbdbebc774deffee4171d0543552b6f8ce06ac1259fa3cf93e9be767f5e1f3c59c7ffa28a6d3dbe0a8f0c8e7811d3acbf3ab87c + checksum: 10/b966ddb05487ee634555d248c83838012c4d1cbbd17c28799743dea65ef3c597695a1a47c9cb466e1ce5dbdd1e4bb23f0b4cdfb3595e12fd892a31c275a04ea5 languageName: node linkType: hard @@ -18121,14 +18138,14 @@ __metadata: languageName: node linkType: hard -"@smithy/url-parser@npm:^4.2.2, @smithy/url-parser@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/url-parser@npm:4.2.3" +"@smithy/url-parser@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/url-parser@npm:4.2.5" dependencies: - "@smithy/querystring-parser": "npm:^4.2.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/querystring-parser": "npm:^4.2.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/e8af96bb56b5cc18841a731ec01c16ea420628099c4c090c65f0a9867e693a53fa95a7b05fac60b9ac0ef1bfad9308bf13e68ac854d8fb62f599a3dcd164203d + checksum: 10/f2649f43f9f569f90c3e68023e938f80fd43fbfce2c454162507ba7d39497f2f89e9ade2369ddc07d9aa4b7ebd7dc80b22922de8488bef04f447467949f62fc3 languageName: node linkType: hard @@ -18251,15 +18268,15 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.3.2": - version: 4.3.3 - resolution: "@smithy/util-defaults-mode-browser@npm:4.3.3" +"@smithy/util-defaults-mode-browser@npm:^4.3.13": + version: 4.3.13 + resolution: "@smithy/util-defaults-mode-browser@npm:4.3.13" dependencies: - "@smithy/property-provider": "npm:^4.2.3" - "@smithy/smithy-client": "npm:^4.9.0" - "@smithy/types": "npm:^4.8.0" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/74efd0f09dc5638c1f183eb976f7293706dc37d506e23f534a0042324515e57d0e34ac6b65b75af2d1cc2f81bcec6626167d1bd231b278bb2505ae7c29eb0578 + checksum: 10/a42116ddd4638e12137d520ace2d2acc32708a98d79de06a91ef949d2163f7246bfd400faad8a1ab5f0f5a5a55d4d73b9b7d70edd2b36d83fdb9e71d1b06e56e languageName: node linkType: hard @@ -18278,18 +18295,18 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^4.2.3": - version: 4.2.4 - resolution: "@smithy/util-defaults-mode-node@npm:4.2.4" +"@smithy/util-defaults-mode-node@npm:^4.2.16": + version: 4.2.16 + resolution: "@smithy/util-defaults-mode-node@npm:4.2.16" dependencies: - "@smithy/config-resolver": "npm:^4.3.3" - "@smithy/credential-provider-imds": "npm:^4.2.3" - "@smithy/node-config-provider": "npm:^4.3.3" - "@smithy/property-provider": "npm:^4.2.3" - "@smithy/smithy-client": "npm:^4.9.0" - "@smithy/types": "npm:^4.8.0" + "@smithy/config-resolver": "npm:^4.4.3" + "@smithy/credential-provider-imds": "npm:^4.2.5" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/property-provider": "npm:^4.2.5" + "@smithy/smithy-client": "npm:^4.9.10" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/2c89802f37ee74803d3aa151c628b6d6479c42546582e50924a93e232b3b3ea289a8373833479f92f940cfe57c48714a4be03e78cea6cdcaa001ef482126b785 + checksum: 10/9c466504abf0b8ef37bf4a72e85b1d164dcd9e8426cb30e9bbff46b0fdb536cfab21c8f5650e4500bd9a120749b462c345b681fef72d61ef7331a835c4b007ff languageName: node linkType: hard @@ -18304,14 +18321,14 @@ __metadata: languageName: node linkType: hard -"@smithy/util-endpoints@npm:^3.2.2": - version: 3.2.3 - resolution: "@smithy/util-endpoints@npm:3.2.3" +"@smithy/util-endpoints@npm:^3.2.5": + version: 3.2.5 + resolution: "@smithy/util-endpoints@npm:3.2.5" dependencies: - "@smithy/node-config-provider": "npm:^4.3.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/node-config-provider": "npm:^4.3.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/55b94c1ad0b59ca92ba0fb8510bd981d9e82cc178425ed681172418993be4744371d8408fa5ac70a88019219534bed8cba4d42177bfadd0bb6d474e701161452 + checksum: 10/3a91786650d007d6dd529107960771bb81d5fb5aef9a2189edfab6ecbfdbd673d72c8d6c1fe65c7814d34244bf448bccd7f64796646d41281b7ba18d37bdd967 languageName: node linkType: hard @@ -18343,13 +18360,13 @@ __metadata: languageName: node linkType: hard -"@smithy/util-middleware@npm:^4.2.2, @smithy/util-middleware@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/util-middleware@npm:4.2.3" +"@smithy/util-middleware@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/util-middleware@npm:4.2.5" dependencies: - "@smithy/types": "npm:^4.8.0" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/3f029d65bb40c7b4555590e502d51942bde0bd413ac691417f09b7cbe384ddb22cb12976ee6c652beac76a8652927caa64c00a743a441639df0d4eb1fecc9c79 + checksum: 10/845feb06378be04902ae371daf94bd90a739dde0cb3780f3b438c70d8af7d69a65cb231946e40e65a8ead1488b716509a197a9716d4faa200dd32a385ea8387c languageName: node linkType: hard @@ -18364,14 +18381,14 @@ __metadata: languageName: node linkType: hard -"@smithy/util-retry@npm:^4.2.2, @smithy/util-retry@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/util-retry@npm:4.2.3" +"@smithy/util-retry@npm:^4.2.5": + version: 4.2.5 + resolution: "@smithy/util-retry@npm:4.2.5" dependencies: - "@smithy/service-error-classification": "npm:^4.2.3" - "@smithy/types": "npm:^4.8.0" + "@smithy/service-error-classification": "npm:^4.2.5" + "@smithy/types": "npm:^4.9.0" tslib: "npm:^2.6.2" - checksum: 10/7907a7ef3f766984c85438240b8a46776f5f0b385d1660b7c261e2ba50947dfbe70ba4924c47e11c2937add998c99cf97639c899b0bae476dfd18fe32125afe8 + checksum: 10/e2715477f2021327e6cc3a796955d74659cbe18e264969cb1188964b82b19fa03eca82d9fe51dc3ca5839d9c654c0357dc670c85543402150536281ef3c14402 languageName: node linkType: hard @@ -18391,19 +18408,19 @@ __metadata: languageName: node linkType: hard -"@smithy/util-stream@npm:^4.5.2, @smithy/util-stream@npm:^4.5.3": - version: 4.5.3 - resolution: "@smithy/util-stream@npm:4.5.3" +"@smithy/util-stream@npm:^4.5.6": + version: 4.5.6 + resolution: "@smithy/util-stream@npm:4.5.6" dependencies: - "@smithy/fetch-http-handler": "npm:^5.3.4" - "@smithy/node-http-handler": "npm:^4.4.2" - "@smithy/types": "npm:^4.8.0" + "@smithy/fetch-http-handler": "npm:^5.3.6" + "@smithy/node-http-handler": "npm:^4.4.5" + "@smithy/types": "npm:^4.9.0" "@smithy/util-base64": "npm:^4.3.0" "@smithy/util-buffer-from": "npm:^4.2.0" "@smithy/util-hex-encoding": "npm:^4.2.0" "@smithy/util-utf8": "npm:^4.2.0" tslib: "npm:^2.6.2" - checksum: 10/d898b1c45f635fe606f53718f2e1c812a6c74f5e0e2524ec494816d4dee7635d1c59436a90b679f46419079e5053d311a84f1d707354a08d11c4708ba502c806 + checksum: 10/6406467f64a39eae77df30ea6e45c13988aff86b5de5b3f4f91929fa8eb6cd786cbda24832e489ecaa559fb9d1514d6def86765c0f548e966cbdaa98cb3a8d77 languageName: node linkType: hard @@ -21113,12 +21130,13 @@ __metadata: languageName: node linkType: hard -"@types/nodemailer@npm:^6.4.14": - version: 6.4.17 - resolution: "@types/nodemailer@npm:6.4.17" +"@types/nodemailer@npm:^7.0.0": + version: 7.0.4 + resolution: "@types/nodemailer@npm:7.0.4" dependencies: + "@aws-sdk/client-sesv2": "npm:^3.839.0" "@types/node": "npm:*" - checksum: 10/bd090c9a81f15ee5e1e2123de1004593bacc24d385460dd56c51ec657d61dc1cfd4f44fc71baac060a1abcb487aef5027509e0afd646e7118d7a8a13a95bad9d + checksum: 10/dbba903cd64d6501b2dfba9ea268b71996dcff3dba24e839385954a4462ae6515d53afc93e8eff3a5b657e5319acdfb6dcd85c10a3216bacbc3c08fabdcf4125 languageName: node linkType: hard From b80857ab0bee5a00dc7d538843b1ce9692f86a41 Mon Sep 17 00:00:00 2001 From: Kai Dubauskas Date: Mon, 17 Nov 2025 16:36:58 -0500 Subject: [PATCH 263/312] feat: add rate limit configuration Signed-off-by: Kai Dubauskas --- .changeset/pretty-breads-speak.md | 5 ++ .../lib/SlackNotificationProcessor.test.ts | 61 +++++++++++++++++++ .../src/lib/SlackNotificationProcessor.ts | 16 ++++- 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 .changeset/pretty-breads-speak.md diff --git a/.changeset/pretty-breads-speak.md b/.changeset/pretty-breads-speak.md new file mode 100644 index 0000000000..f3c77557e4 --- /dev/null +++ b/.changeset/pretty-breads-speak.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend-module-slack': patch +--- + +The rate limit is now a config variable diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts index ad4bf01e9f..02034b6470 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts @@ -953,4 +953,65 @@ describe('SlackNotificationProcessor', () => { ); }); }); + + describe('when rate limit is not configured', () => { + it('should use default rate limit of 10 messages per minute', async () => { + const slack = new WebClient(); + + const processor = SlackNotificationProcessor.fromConfig(config, { + auth, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.processOptions({ + recipients: { type: 'entity', entityRef: 'group:default/mock' }, + payload: { title: 'notification' }, + }); + + expect(slack.chat.postMessage).toHaveBeenCalled(); + }); + }); + + describe('when rate limit is configured', () => { + it('should use custom rate limit value', async () => { + const slack = new WebClient(); + const rateLimitConfig = mockServices.rootConfig({ + data: { + app: { + baseUrl: 'https://example.org', + }, + notifications: { + processors: { + slack: [ + { + token: 'mock-token', + rateLimit: 5, + }, + ], + }, + }, + }, + }); + + const processor = SlackNotificationProcessor.fromConfig(rateLimitConfig, { + auth, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.processOptions({ + recipients: { type: 'entity', entityRef: 'group:default/mock' }, + payload: { title: 'notification' }, + }); + + expect(slack.chat.postMessage).toHaveBeenCalled(); + }); + }); }); diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts index f9b00c9a58..739ab25d57 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts @@ -68,10 +68,12 @@ export class SlackNotificationProcessor implements NotificationProcessor { const slack = options.slack ?? new WebClient(token); const broadcastChannels = c.getOptionalStringArray('broadcastChannels'); const username = c.getOptionalString('username'); + const rateLimit = c.getOptionalNumber('rateLimit'); return new SlackNotificationProcessor({ slack, broadcastChannels, username, + rateLimit, ...options, }); }); @@ -84,9 +86,17 @@ export class SlackNotificationProcessor implements NotificationProcessor { catalog: CatalogService; broadcastChannels?: string[]; username?: string; + rateLimit?: number; }) { - const { auth, catalog, logger, slack, broadcastChannels, username } = - options; + const { + auth, + catalog, + logger, + slack, + broadcastChannels, + username, + rateLimit, + } = options; this.logger = logger; this.catalog = catalog; this.auth = auth; @@ -134,7 +144,7 @@ export class SlackNotificationProcessor implements NotificationProcessor { ); const throttle = pThrottle({ - limit: 10, + limit: rateLimit ?? 10, interval: durationToMilliseconds({ minutes: 1 }), }); const throttled = throttle((opts: ChatPostMessageArguments) => From 061817fb2365dcc927fee992fdba48bbda4f1261 Mon Sep 17 00:00:00 2001 From: Kai Dubauskas Date: Mon, 17 Nov 2025 16:44:32 -0500 Subject: [PATCH 264/312] docs: add rateLimit Signed-off-by: Kai Dubauskas --- docs/notifications/processors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/notifications/processors.md b/docs/notifications/processors.md index c25b669ed6..076aae652e 100644 --- a/docs/notifications/processors.md +++ b/docs/notifications/processors.md @@ -149,6 +149,7 @@ notifications: broadcastChannels: # Optional, if you wish to support broadcast notifications. - C12345678 username: 'Backstage Bot' # Optional, defaults to the name of the Slack App. + rateLimit: 40 # Optional, number of messages per minute. Defaults to 10. ``` Multiple instances can be added in the `slack` array, allowing you to have multiple configurations if you need to send From 08d6456b4af87493872ec190ef51ff02cd5db1a4 Mon Sep 17 00:00:00 2001 From: Kai Dubauskas Date: Mon, 1 Dec 2025 11:05:34 -0500 Subject: [PATCH 265/312] switch to throttleInterval and concurrencyLimit Signed-off-by: Kai Dubauskas --- .changeset/pretty-breads-speak.md | 2 +- docs/notifications/processors.md | 3 +- .../lib/SlackNotificationProcessor.test.ts | 62 ++++++++++++++----- .../src/lib/SlackNotificationProcessor.ts | 27 +++++--- 4 files changed, 71 insertions(+), 23 deletions(-) diff --git a/.changeset/pretty-breads-speak.md b/.changeset/pretty-breads-speak.md index f3c77557e4..fcc924ae81 100644 --- a/.changeset/pretty-breads-speak.md +++ b/.changeset/pretty-breads-speak.md @@ -2,4 +2,4 @@ '@backstage/plugin-notifications-backend-module-slack': patch --- -The rate limit is now a config variable +The throttle limit and interval is now a config variable diff --git a/docs/notifications/processors.md b/docs/notifications/processors.md index 076aae652e..1e3cc5b5d4 100644 --- a/docs/notifications/processors.md +++ b/docs/notifications/processors.md @@ -149,7 +149,8 @@ notifications: broadcastChannels: # Optional, if you wish to support broadcast notifications. - C12345678 username: 'Backstage Bot' # Optional, defaults to the name of the Slack App. - rateLimit: 40 # Optional, number of messages per minute. Defaults to 10. + concurrencyLimit: 20 # Optional, number of messages allowed per interval. Defaults to 10. + throttleInterval: 1m # Optional, ISO 8601 duration (or ms value). Defaults to 1 minute. ``` Multiple instances can be added in the `slack` array, allowing you to have multiple configurations if you need to send diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts index 02034b6470..2963d2c0e6 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts @@ -19,6 +19,22 @@ import { SlackNotificationProcessor } from './SlackNotificationProcessor'; import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; import { WebClient } from '@slack/web-api'; import { Entity } from '@backstage/catalog-model'; +import pThrottle from 'p-throttle'; +import { durationToMilliseconds } from '@backstage/types'; + +const throttleConfigs: Array<{ limit: number; interval: number }> = []; + +jest.mock('p-throttle', () => ({ + __esModule: true, + default: jest.fn((config: { limit: number; interval: number }) => { + throttleConfigs.push(config); + return Promise | any>(fn: T) => + (...args: Parameters) => + Promise.resolve(fn(...args)); + }), +})); + +const mockedPThrottle = pThrottle as jest.MockedFunction; jest.mock('@slack/web-api', () => { const mockSlack = { @@ -128,6 +144,8 @@ describe('SlackNotificationProcessor', () => { beforeEach(() => { jest.clearAllMocks(); + throttleConfigs.length = 0; + mockedPThrottle.mockClear(); }); it('should send a notification to a group', async () => { @@ -954,8 +972,8 @@ describe('SlackNotificationProcessor', () => { }); }); - describe('when rate limit is not configured', () => { - it('should use default rate limit of 10 messages per minute', async () => { + describe('when throttling is not configured', () => { + it('should use default concurrency limit of 10 per minute', async () => { const slack = new WebClient(); const processor = SlackNotificationProcessor.fromConfig(config, { @@ -973,13 +991,19 @@ describe('SlackNotificationProcessor', () => { }); expect(slack.chat.postMessage).toHaveBeenCalled(); + expect(throttleConfigs).toEqual([ + { + limit: 10, + interval: durationToMilliseconds({ minutes: 1 }), + }, + ]); }); }); - describe('when rate limit is configured', () => { - it('should use custom rate limit value', async () => { + describe('when throttling is configured', () => { + it('should use custom concurrency limit and interval values', async () => { const slack = new WebClient(); - const rateLimitConfig = mockServices.rootConfig({ + const throttlingConfig = mockServices.rootConfig({ data: { app: { baseUrl: 'https://example.org', @@ -989,7 +1013,8 @@ describe('SlackNotificationProcessor', () => { slack: [ { token: 'mock-token', - rateLimit: 5, + concurrencyLimit: 5, + throttleInterval: 'PT30S', }, ], }, @@ -997,14 +1022,17 @@ describe('SlackNotificationProcessor', () => { }, }); - const processor = SlackNotificationProcessor.fromConfig(rateLimitConfig, { - auth, - logger, - catalog: catalogServiceMock({ - entities: DEFAULT_ENTITIES_RESPONSE.items, - }), - slack, - })[0]; + const processor = SlackNotificationProcessor.fromConfig( + throttlingConfig, + { + auth, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + }, + )[0]; await processor.processOptions({ recipients: { type: 'entity', entityRef: 'group:default/mock' }, @@ -1012,6 +1040,12 @@ describe('SlackNotificationProcessor', () => { }); expect(slack.chat.postMessage).toHaveBeenCalled(); + expect(throttleConfigs).toEqual([ + { + limit: 5, + interval: durationToMilliseconds({ seconds: 30 }), + }, + ]); }); }); }); diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts index 739ab25d57..14bc169573 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts @@ -21,7 +21,7 @@ import { parseEntityRef, UserEntity, } from '@backstage/catalog-model'; -import { Config } from '@backstage/config'; +import { Config, readDurationFromConfig } from '@backstage/config'; import { NotFoundError } from '@backstage/errors'; import { Notification } from '@backstage/plugin-notifications-common'; import { @@ -50,6 +50,8 @@ export class SlackNotificationProcessor implements NotificationProcessor { private readonly broadcastChannels?: string[]; private readonly entityLoader: DataLoader; private readonly username?: string; + private readonly concurrencyLimit: number; + private readonly throttleInterval: number; static fromConfig( config: Config, @@ -68,12 +70,18 @@ export class SlackNotificationProcessor implements NotificationProcessor { const slack = options.slack ?? new WebClient(token); const broadcastChannels = c.getOptionalStringArray('broadcastChannels'); const username = c.getOptionalString('username'); - const rateLimit = c.getOptionalNumber('rateLimit'); + const concurrencyLimit = c.getOptionalNumber('concurrencyLimit') ?? 10; + const throttleInterval = c.has('throttleInterval') + ? durationToMilliseconds( + readDurationFromConfig(c, { key: 'throttleInterval' }), + ) + : durationToMilliseconds({ minutes: 1 }); return new SlackNotificationProcessor({ slack, broadcastChannels, username, - rateLimit, + concurrencyLimit, + throttleInterval, ...options, }); }); @@ -86,7 +94,8 @@ export class SlackNotificationProcessor implements NotificationProcessor { catalog: CatalogService; broadcastChannels?: string[]; username?: string; - rateLimit?: number; + concurrencyLimit?: number; + throttleInterval?: number; }) { const { auth, @@ -95,7 +104,8 @@ export class SlackNotificationProcessor implements NotificationProcessor { slack, broadcastChannels, username, - rateLimit, + concurrencyLimit, + throttleInterval, } = options; this.logger = logger; this.catalog = catalog; @@ -103,6 +113,9 @@ export class SlackNotificationProcessor implements NotificationProcessor { this.slack = slack; this.broadcastChannels = broadcastChannels; this.username = username; + this.concurrencyLimit = concurrencyLimit ?? 10; + this.throttleInterval = + throttleInterval ?? durationToMilliseconds({ minutes: 1 }); this.entityLoader = new DataLoader( async entityRefs => { @@ -144,8 +157,8 @@ export class SlackNotificationProcessor implements NotificationProcessor { ); const throttle = pThrottle({ - limit: rateLimit ?? 10, - interval: durationToMilliseconds({ minutes: 1 }), + limit: this.concurrencyLimit, + interval: this.throttleInterval, }); const throttled = throttle((opts: ChatPostMessageArguments) => this.sendNotification(opts), From b03b69f74cbbef19bf3cc8f8458c3cca43d1f321 Mon Sep 17 00:00:00 2001 From: Kai Dubauskas <214713432+kaidubauskas-dd@users.noreply.github.com> Date: Wed, 3 Dec 2025 13:03:59 -0500 Subject: [PATCH 266/312] Update .changeset/pretty-breads-speak.md Co-authored-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com> Signed-off-by: Kai Dubauskas <214713432+kaidubauskas-dd@users.noreply.github.com> --- .changeset/pretty-breads-speak.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/pretty-breads-speak.md b/.changeset/pretty-breads-speak.md index fcc924ae81..13accd1cd0 100644 --- a/.changeset/pretty-breads-speak.md +++ b/.changeset/pretty-breads-speak.md @@ -2,4 +2,4 @@ '@backstage/plugin-notifications-backend-module-slack': patch --- -The throttle limit and interval is now a config variable +Slack notification handler throttling can now be configured with the `concurrencyLimit` and `throttleInterval` options. From c403c7c41bceaeeab750879b73882d03ea92dcb6 Mon Sep 17 00:00:00 2001 From: Kai Dubauskas Date: Wed, 3 Dec 2025 14:59:04 -0500 Subject: [PATCH 267/312] update config.d.ts Signed-off-by: Kai Dubauskas --- plugins/notifications-backend-module-slack/config.d.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/notifications-backend-module-slack/config.d.ts b/plugins/notifications-backend-module-slack/config.d.ts index 8cd450940e..441a49331c 100644 --- a/plugins/notifications-backend-module-slack/config.d.ts +++ b/plugins/notifications-backend-module-slack/config.d.ts @@ -13,6 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { HumanDuration } from '@backstage/types'; + export interface Config { notifications?: { processors?: { @@ -28,6 +30,14 @@ export interface Config { * Names, or Slack Channel IDs. Any valid identifier that chat.postMessage can accept. */ broadcastChannels?: string[]; + /** + * Concurrency limit for Slack notifications, defaults to 10 + */ + concurrencyLimit?: number; + /** + * Throttle duration between Slack notifications, defaults to 1 minute + */ + throttleInterval?: HumanDuration | string; }>; }; }; From ed2ca0efc77cb12162b638a14040b4d6181b925d Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 8 Dec 2025 17:01:39 -0500 Subject: [PATCH 268/312] feat: provide --no-node-snapshot by default Signed-off-by: aramissennyeydd --- .../build/lib/runner/runBackend.test.ts | 189 ++++++++++++++++++ .../modules/build/lib/runner/runBackend.ts | 8 + .../src/modules/test/commands/package/test.ts | 8 + 3 files changed, 205 insertions(+) create mode 100644 packages/cli/src/modules/build/lib/runner/runBackend.test.ts diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts new file mode 100644 index 0000000000..49fb59ecd9 --- /dev/null +++ b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts @@ -0,0 +1,189 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { runBackend } from './runBackend'; + +// Mock external dependencies +jest.mock('chokidar', () => ({ + watch: jest.fn(() => ({ + on: jest.fn().mockReturnThis(), + add: jest.fn(), + })), +})); + +jest.mock('cross-spawn', () => + jest.fn(() => ({ + on: jest.fn().mockReturnThis(), + once: jest.fn().mockReturnThis(), + kill: jest.fn(), + killed: false, + exitCode: null, + pid: 12345, + })), +); + +jest.mock('../ipc', () => ({ + IpcServer: jest.fn().mockImplementation(() => ({ + addChild: jest.fn(), + })), + ServerDataStore: { + bind: jest.fn(), + }, +})); + +jest.mock('ctrlc-windows', () => ({ + ctrlc: jest.fn(), +})); + +describe('runBackend', () => { + let originalEnv: NodeJS.ProcessEnv; + let originalPlatform: string; + + beforeEach(() => { + // Save original environment + originalEnv = { ...process.env }; + originalPlatform = process.platform; + + // Clear environment variables that we're testing + delete process.env.NODE_ENV; + delete process.env.NODE_OPTIONS; + + // Mock process.stdin.on to prevent actual stdin reading + jest.spyOn(process.stdin, 'on').mockReturnValue(process.stdin); + + // Mock process.once to prevent actual signal handling + jest.spyOn(process, 'once').mockReturnValue(process); + }); + + afterEach(() => { + // Restore original environment + process.env = originalEnv; + Object.defineProperty(process, 'platform', { + value: originalPlatform, + }); + + jest.clearAllMocks(); + }); + + describe('NODE_OPTIONS environment variable', () => { + it('should add --no-node-snapshot when NODE_OPTIONS is not set', async () => { + delete process.env.NODE_OPTIONS; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_OPTIONS).toBe('--no-node-snapshot'); + }); + + it('should append --no-node-snapshot when NODE_OPTIONS exists without it', async () => { + process.env.NODE_OPTIONS = '--max-old-space-size=4096'; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_OPTIONS).toBe( + '--max-old-space-size=4096 --no-node-snapshot', + ); + }); + + it('should not add --no-node-snapshot when --node-snapshot already exists', async () => { + process.env.NODE_OPTIONS = '--node-snapshot --max-old-space-size=4096'; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_OPTIONS).toBe( + '--node-snapshot --max-old-space-size=4096', + ); + }); + + it('should not add --no-node-snapshot when --node-snapshot exists in the middle of NODE_OPTIONS', async () => { + process.env.NODE_OPTIONS = + '--max-old-space-size=4096 --node-snapshot --inspect'; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_OPTIONS).toBe( + '--max-old-space-size=4096 --node-snapshot --inspect', + ); + }); + + it('should handle NODE_OPTIONS with trailing spaces', async () => { + process.env.NODE_OPTIONS = '--max-old-space-size=4096 '; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_OPTIONS).toBe( + '--max-old-space-size=4096 --no-node-snapshot', + ); + }); + }); + + describe('NODE_ENV environment variable', () => { + it('should set NODE_ENV to development when not set', async () => { + delete process.env.NODE_ENV; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_ENV).toBe('development'); + }); + + it('should not override existing NODE_ENV', async () => { + process.env.NODE_ENV = 'production'; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_ENV).toBe('production'); + }); + }); + + describe('combined environment setup', () => { + it('should set both NODE_ENV and NODE_OPTIONS when neither is set', async () => { + delete process.env.NODE_ENV; + delete process.env.NODE_OPTIONS; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_ENV).toBe('development'); + expect(process.env.NODE_OPTIONS).toBe('--no-node-snapshot'); + }); + + it('should handle both environment variables independently', async () => { + process.env.NODE_ENV = 'test'; + process.env.NODE_OPTIONS = '--inspect'; + + runBackend({ + entry: 'src/index', + }); + + expect(process.env.NODE_ENV).toBe('test'); + expect(process.env.NODE_OPTIONS).toBe('--inspect --no-node-snapshot'); + }); + }); +}); diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.ts b/packages/cli/src/modules/build/lib/runner/runBackend.ts index 49dccf804f..d48fb34fc2 100644 --- a/packages/cli/src/modules/build/lib/runner/runBackend.ts +++ b/packages/cli/src/modules/build/lib/runner/runBackend.ts @@ -52,6 +52,14 @@ export async function runBackend(options: RunBackendOptions) { envEnv.NODE_ENV = 'development'; } + // Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder + // on Node LTS. + if (!envEnv.NODE_OPTIONS?.includes('--node-snapshot')) { + envEnv.NODE_OPTIONS = + (envEnv.NODE_OPTIONS ? envEnv.NODE_OPTIONS + ' ' : '') + + '--no-node-snapshot'; + } + // Set up the parent IPC server and bind the available services const server = new IpcServer(); ServerDataStore.bind(server); diff --git a/packages/cli/src/modules/test/commands/package/test.ts b/packages/cli/src/modules/test/commands/package/test.ts index 1ecf5b395e..72e78eae7b 100644 --- a/packages/cli/src/modules/test/commands/package/test.ts +++ b/packages/cli/src/modules/test/commands/package/test.ts @@ -78,6 +78,14 @@ export default async (_opts: OptionValues, cmd: Command) => { process.env.TZ = 'UTC'; } + // Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder + // on Node LTS. + if (!process.env.NODE_OPTIONS?.includes('--node-snapshot')) { + process.env.NODE_OPTIONS = `${ + process.env.NODE_OPTIONS ? `${process.env.NODE_OPTIONS} ` : '' + }--no-node-snapshot`; + } + // This ensures that the process doesn't exit too early before stdout is flushed if (args.includes('--help')) { (process.stdout as any)._handle.setBlocking(true); From f6f22a95096b48fc7ca43f10159c1b6bea3d4302 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 8 Dec 2025 17:02:54 -0500 Subject: [PATCH 269/312] add changeset Signed-off-by: aramissennyeydd --- .changeset/bright-lions-unite.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/bright-lions-unite.md diff --git a/.changeset/bright-lions-unite.md b/.changeset/bright-lions-unite.md new file mode 100644 index 0000000000..e9bef02e10 --- /dev/null +++ b/.changeset/bright-lions-unite.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': minor +--- + +Provide `--no-node-snapshot` by default when running the `package start` or `package test`. You can disable this behavior by providing `NODE_OPTIONS='--node-snapshot'`. From 0def824b4d05733c3bd68376982be6d34009cc32 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 8 Dec 2025 17:28:19 -0500 Subject: [PATCH 270/312] remove --no-node-snapshots flag Signed-off-by: aramissennyeydd --- .github/workflows/ci.yml | 2 +- .github/workflows/verify_e2e-windows.yml | 2 +- .github/workflows/verify_windows.yml | 2 +- docs/tooling/cli/02-build-system.md | 2 +- .../build/lib/runner/runBackend.test.ts | 108 ++++++++++-------- .../modules/build/lib/runner/runBackend.ts | 14 +-- 6 files changed, 71 insertions(+), 59 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7552898bd0..36b4114efe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -203,7 +203,7 @@ jobs: env: CI: true - NODE_OPTIONS: --max-old-space-size=8192 --no-node-snapshot --experimental-vm-modules + NODE_OPTIONS: --max-old-space-size=8192 --experimental-vm-modules INTEGRATION_TEST_GITHUB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITHUB_TOKEN }} INTEGRATION_TEST_GITLAB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITLAB_TOKEN }} INTEGRATION_TEST_BITBUCKET_TOKEN: ${{ secrets.INTEGRATION_TEST_BITBUCKET_TOKEN }} diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index 933bbb0840..f63eb5d61b 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -28,7 +28,7 @@ jobs: env: CI: true - NODE_OPTIONS: --max-old-space-size=8192 --no-node-snapshot --experimental-vm-modules + NODE_OPTIONS: --max-old-space-size=8192 --experimental-vm-modules name: E2E Windows ${{ matrix.node-version }} steps: diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index ae2ec477d3..f7de04772d 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -21,7 +21,7 @@ jobs: env: CI: true - NODE_OPTIONS: --max-old-space-size=8192 --no-node-snapshot --experimental-vm-modules + NODE_OPTIONS: --max-old-space-size=8192 --experimental-vm-modules INTEGRATION_TEST_GITHUB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITHUB_TOKEN }} INTEGRATION_TEST_GITLAB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITLAB_TOKEN }} INTEGRATION_TEST_BITBUCKET_TOKEN: ${{ secrets.INTEGRATION_TEST_BITBUCKET_TOKEN }} diff --git a/docs/tooling/cli/02-build-system.md b/docs/tooling/cli/02-build-system.md index c8d9034955..25945f73dd 100644 --- a/docs/tooling/cli/02-build-system.md +++ b/docs/tooling/cli/02-build-system.md @@ -610,7 +610,7 @@ With that in mind, here are some IDEs configurations to run backstage components 1. Click on "Edit Configurations" on top panel 2. In the modal dialog click on link "Edit configuration templates..." located in the bottom left corner. 3. "Configuration file": leave empty (`backstage-cli` adds the config) - 4. "Node options": `--no-node-snapshot --experimental-vm-modules` + 4. "Node options": ` --experimental-vm-modules` 5. "Jest package": `~/workspace/backstage/node_modules/@backstage/cli` - the location of the backstage cli package. 6. "Working directory": `~/workspace/backstage` 7. "Jest Options": `repo test --runInBand --watch=false` diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts index 49fb59ecd9..1e2c2190cf 100644 --- a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts +++ b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts @@ -15,6 +15,7 @@ */ import { runBackend } from './runBackend'; +import spawn from 'cross-spawn'; // Mock external dependencies jest.mock('chokidar', () => ({ @@ -51,8 +52,12 @@ jest.mock('ctrlc-windows', () => ({ describe('runBackend', () => { let originalEnv: NodeJS.ProcessEnv; let originalPlatform: string; + const mockSpawn = spawn as jest.MockedFunction; beforeEach(() => { + // Use fake timers to control debounce + jest.useFakeTimers(); + // Save original environment originalEnv = { ...process.env }; originalPlatform = process.platform; @@ -76,44 +81,56 @@ describe('runBackend', () => { }); jest.clearAllMocks(); + jest.useRealTimers(); }); - describe('NODE_OPTIONS environment variable', () => { - it('should add --no-node-snapshot when NODE_OPTIONS is not set', async () => { + describe('--no-node-snapshot argument handling', () => { + it('should pass --no-node-snapshot when NODE_OPTIONS is not set', () => { delete process.env.NODE_OPTIONS; runBackend({ entry: 'src/index', }); - expect(process.env.NODE_OPTIONS).toBe('--no-node-snapshot'); + // Fast-forward past the debounce delay (100ms) + jest.advanceTimersByTime(100); + + expect(mockSpawn).toHaveBeenCalled(); + const spawnArgs = mockSpawn.mock.calls[0][1] as string[]; + expect(spawnArgs).toContain('--no-node-snapshot'); }); - it('should append --no-node-snapshot when NODE_OPTIONS exists without it', async () => { + it('should pass --no-node-snapshot when NODE_OPTIONS exists without --node-snapshot', () => { process.env.NODE_OPTIONS = '--max-old-space-size=4096'; runBackend({ entry: 'src/index', }); - expect(process.env.NODE_OPTIONS).toBe( - '--max-old-space-size=4096 --no-node-snapshot', - ); + // Fast-forward past the debounce delay (100ms) + jest.advanceTimersByTime(100); + + expect(mockSpawn).toHaveBeenCalled(); + const spawnArgs = mockSpawn.mock.calls[0][1] as string[]; + expect(spawnArgs).toContain('--no-node-snapshot'); }); - it('should not add --no-node-snapshot when --node-snapshot already exists', async () => { + it('should not pass --no-node-snapshot when --node-snapshot already exists in NODE_OPTIONS', () => { process.env.NODE_OPTIONS = '--node-snapshot --max-old-space-size=4096'; runBackend({ entry: 'src/index', }); - expect(process.env.NODE_OPTIONS).toBe( - '--node-snapshot --max-old-space-size=4096', - ); + // Fast-forward past the debounce delay (100ms) + jest.advanceTimersByTime(100); + + expect(mockSpawn).toHaveBeenCalled(); + const spawnArgs = mockSpawn.mock.calls[0][1] as string[]; + expect(spawnArgs).not.toContain('--no-node-snapshot'); }); - it('should not add --no-node-snapshot when --node-snapshot exists in the middle of NODE_OPTIONS', async () => { + it('should not pass --no-node-snapshot when --node-snapshot exists in the middle of NODE_OPTIONS', () => { process.env.NODE_OPTIONS = '--max-old-space-size=4096 --node-snapshot --inspect'; @@ -121,26 +138,49 @@ describe('runBackend', () => { entry: 'src/index', }); - expect(process.env.NODE_OPTIONS).toBe( - '--max-old-space-size=4096 --node-snapshot --inspect', - ); + // Fast-forward past the debounce delay (100ms) + jest.advanceTimersByTime(100); + + expect(mockSpawn).toHaveBeenCalled(); + const spawnArgs = mockSpawn.mock.calls[0][1] as string[]; + expect(spawnArgs).not.toContain('--no-node-snapshot'); }); - it('should handle NODE_OPTIONS with trailing spaces', async () => { + it('should pass --no-node-snapshot even with trailing spaces in NODE_OPTIONS', () => { process.env.NODE_OPTIONS = '--max-old-space-size=4096 '; runBackend({ entry: 'src/index', }); - expect(process.env.NODE_OPTIONS).toBe( - '--max-old-space-size=4096 --no-node-snapshot', - ); + // Fast-forward past the debounce delay (100ms) + jest.advanceTimersByTime(100); + + expect(mockSpawn).toHaveBeenCalled(); + const spawnArgs = mockSpawn.mock.calls[0][1] as string[]; + expect(spawnArgs).toContain('--no-node-snapshot'); + }); + + it('should pass --no-node-snapshot alongside other option args like --inspect', () => { + delete process.env.NODE_OPTIONS; + + runBackend({ + entry: 'src/index', + inspectEnabled: true, + }); + + // Fast-forward past the debounce delay (100ms) + jest.advanceTimersByTime(100); + + expect(mockSpawn).toHaveBeenCalled(); + const spawnArgs = mockSpawn.mock.calls[0][1] as string[]; + expect(spawnArgs).toContain('--no-node-snapshot'); + expect(spawnArgs).toContain('--inspect'); }); }); describe('NODE_ENV environment variable', () => { - it('should set NODE_ENV to development when not set', async () => { + it('should set NODE_ENV to development when not set', () => { delete process.env.NODE_ENV; runBackend({ @@ -150,7 +190,7 @@ describe('runBackend', () => { expect(process.env.NODE_ENV).toBe('development'); }); - it('should not override existing NODE_ENV', async () => { + it('should not override existing NODE_ENV', () => { process.env.NODE_ENV = 'production'; runBackend({ @@ -160,30 +200,4 @@ describe('runBackend', () => { expect(process.env.NODE_ENV).toBe('production'); }); }); - - describe('combined environment setup', () => { - it('should set both NODE_ENV and NODE_OPTIONS when neither is set', async () => { - delete process.env.NODE_ENV; - delete process.env.NODE_OPTIONS; - - runBackend({ - entry: 'src/index', - }); - - expect(process.env.NODE_ENV).toBe('development'); - expect(process.env.NODE_OPTIONS).toBe('--no-node-snapshot'); - }); - - it('should handle both environment variables independently', async () => { - process.env.NODE_ENV = 'test'; - process.env.NODE_OPTIONS = '--inspect'; - - runBackend({ - entry: 'src/index', - }); - - expect(process.env.NODE_ENV).toBe('test'); - expect(process.env.NODE_OPTIONS).toBe('--inspect --no-node-snapshot'); - }); - }); }); diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.ts b/packages/cli/src/modules/build/lib/runner/runBackend.ts index d48fb34fc2..a3072c5dd7 100644 --- a/packages/cli/src/modules/build/lib/runner/runBackend.ts +++ b/packages/cli/src/modules/build/lib/runner/runBackend.ts @@ -52,14 +52,6 @@ export async function runBackend(options: RunBackendOptions) { envEnv.NODE_ENV = 'development'; } - // Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder - // on Node LTS. - if (!envEnv.NODE_OPTIONS?.includes('--node-snapshot')) { - envEnv.NODE_OPTIONS = - (envEnv.NODE_OPTIONS ? envEnv.NODE_OPTIONS + ' ' : '') + - '--no-node-snapshot'; - } - // Set up the parent IPC server and bind the available services const server = new IpcServer(); ServerDataStore.bind(server); @@ -123,6 +115,12 @@ export async function runBackend(options: RunBackendOptions) { } } + // Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder + // on Node LTS. + if (!envEnv.NODE_OPTIONS?.includes('--node-snapshot')) { + optionArgs.push('--no-node-snapshot'); + } + const userArgs = process.argv .slice(['node', 'backstage-cli', 'package', 'start'].length) .filter(arg => !optionArgs.includes(arg)); From 7d201ad7cbe22c655edc1f97f8c726c375123795 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 8 Dec 2025 17:30:56 -0500 Subject: [PATCH 271/312] chore(docs): add root instance metadata to sidebar Signed-off-by: aramissennyeydd --- microsite/sidebars.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/microsite/sidebars.ts b/microsite/sidebars.ts index 9a4f03620f..a68e81aa4f 100644 --- a/microsite/sidebars.ts +++ b/microsite/sidebars.ts @@ -508,6 +508,7 @@ export default { 'backend-system/core-services/plugin-metadata', 'backend-system/core-services/root-config', 'backend-system/core-services/root-health', + 'backend-system/core-services/root-instance-metadata', 'backend-system/core-services/root-http-router', 'backend-system/core-services/root-lifecycle', 'backend-system/core-services/root-logger', From 238852ca7d1318e07e192f6c6f0c55995656a0c4 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Mon, 8 Dec 2025 17:44:53 -0500 Subject: [PATCH 272/312] fix build Signed-off-by: aramissennyeydd --- .../build/lib/runner/runBackend.test.ts | 22 ------------------- .../modules/build/lib/runner/runBackend.ts | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts index 1e2c2190cf..11018b0783 100644 --- a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts +++ b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts @@ -178,26 +178,4 @@ describe('runBackend', () => { expect(spawnArgs).toContain('--inspect'); }); }); - - describe('NODE_ENV environment variable', () => { - it('should set NODE_ENV to development when not set', () => { - delete process.env.NODE_ENV; - - runBackend({ - entry: 'src/index', - }); - - expect(process.env.NODE_ENV).toBe('development'); - }); - - it('should not override existing NODE_ENV', () => { - process.env.NODE_ENV = 'production'; - - runBackend({ - entry: 'src/index', - }); - - expect(process.env.NODE_ENV).toBe('production'); - }); - }); }); diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.ts b/packages/cli/src/modules/build/lib/runner/runBackend.ts index a3072c5dd7..0550ff2563 100644 --- a/packages/cli/src/modules/build/lib/runner/runBackend.ts +++ b/packages/cli/src/modules/build/lib/runner/runBackend.ts @@ -47,7 +47,7 @@ export type RunBackendOptions = { }; export async function runBackend(options: RunBackendOptions) { - const envEnv = process.env as { NODE_ENV: string }; + const envEnv = process.env as { NODE_ENV: string; NODE_OPTIONS?: string }; if (!envEnv.NODE_ENV) { envEnv.NODE_ENV = 'development'; } From e7204e24db829872114524c9fddc8ce08f5ad0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 9 Dec 2025 08:40:50 +0100 Subject: [PATCH 273/312] updated the immediate entity provider example a bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- contrib/catalog/ImmediateEntityProvider.ts | 99 ++++++++++++---------- 1 file changed, 56 insertions(+), 43 deletions(-) diff --git a/contrib/catalog/ImmediateEntityProvider.ts b/contrib/catalog/ImmediateEntityProvider.ts index b5580b775a..9f9f986567 100644 --- a/contrib/catalog/ImmediateEntityProvider.ts +++ b/contrib/catalog/ImmediateEntityProvider.ts @@ -1,3 +1,8 @@ +import { + coreServices, + createBackendModule, + LoggerService, +} from '@backstage/backend-plugin-api'; import { ANNOTATION_LOCATION, ANNOTATION_ORIGIN_LOCATION, @@ -10,50 +15,18 @@ import { EntityProvider, EntityProviderConnection, } from '@backstage/plugin-catalog-node'; -import { parseEntityYaml } from '@backstage/plugin-catalog-backend'; +import { parseEntityYaml } from '@backstage/plugin-catalog-node'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import bodyParser from 'body-parser'; import express from 'express'; import Router from 'express-promise-router'; import lodash from 'lodash'; -import { Logger } from 'winston'; /** * An entity provider attached to a router, that lets users perform direct * manipulation of a set of entities using REST requests. - * - * @remarks - * - * Installation: - * - * Add it to the catalog builder in your - * `packages/backend/src/plugins/catalog.ts`. Note that it BOTH adds a provider - * and amends the catalog router: - * - * ``` - * const immediate = new ImmediateEntityProvider({ - * logger: env.logger, - * handleEntity: (deferred) => { - * // Optionally modify the incoming entity - * }, - * }); - * builder.addEntityProvider(immediate); - * - * // ... - * - * return router.use('/immediate', immediate.getRouter()); - * ``` - * - * API (assume a catalog prefix, e.g. `/api/catalog`): - * - * - `POST /immediate/entities`: Accepts a YAML document of entities, and - * inserts or updates the entities that match that document. Returns 201 OK on - * success. - * - * - `PUT /immediate/entities`: Accepts a YAML document of entities, and - * replaces the entire set of entities managed by the provider with those - * entities. Returns 201 OK on success. */ -export class ImmediateEntityProvider implements EntityProvider { +class ImmediateEntityProvider implements EntityProvider { private connection?: EntityProviderConnection; private readonly entityValidator: (data: unknown) => Entity; @@ -76,7 +49,7 @@ export class ImmediateEntityProvider implements EntityProvider { router.use(bodyParser.raw({ type: '*/*' })); - router.post('/entities', async (req, res) => { + router.post('/immediate/entities', async (req, res) => { if (!this.connection) { throw new Error(`Service is not yet initialized`); } @@ -89,7 +62,7 @@ export class ImmediateEntityProvider implements EntityProvider { res.status(201).end(); }); - router.put('/entities', async (req, res) => { + router.put('/immediate/entities', async (req, res) => { if (!this.connection) { throw new Error(`Service is not yet initialized`); } @@ -151,19 +124,59 @@ export class ImmediateEntityProvider implements EntityProvider { /** * Options for {@link ImmediateEntityProvider}. */ -export interface ImmediateEntityProviderOptions { +interface ImmediateEntityProviderOptions { /** - * The logger to use. + * The logger. */ - logger: Logger; + logger: LoggerService; /** - * An optional function to perform adjustments to, or validate, an incoming - * entity before being stored. It is permitted to modify the deferred entity, - * but the request is static and has had its body consumed. + * An optional callback function to perform adjustments to, or validate, an + * incoming entity before being stored. It is permitted to modify the deferred + * entity, but the request is static and has had its body consumed. */ handleEntity?: ( request: express.Request, deferred: DeferredEntity, ) => void | Promise; } + +/** + * Backend module that installs an immediate entity provider. + * + * @remarks + * + * Install it by doing `backend.add(immediateEntityProviderModule)` in your `packages/backend/src/index.ts` file. + * + * API: + * + * - `POST /api/catalog/immediate/entities`: Accepts a YAML document of entities, and + * inserts or updates the entities that match that document. Returns 201 OK on + * success. + * + * - `PUT /api/catalog/immediate/entities`: Accepts a YAML document of entities, and + * replaces the entire set of entities managed by the provider with those + * entities. Returns 201 OK on success. + */ +export const immediateEntityProviderModule = createBackendModule({ + pluginId: 'catalog', + moduleId: 'immediate-entity-provider', + register(env) { + env.registerInit({ + deps: { + logger: coreServices.logger, + router: coreServices.httpRouter, + catalogProcessing: catalogProcessingExtensionPoint, + }, + async init({ logger, router, catalogProcessing }) { + const provider = new ImmediateEntityProvider({ + logger, + // add handleEntity here if you need to modify incoming entities before they are stored + }); + + catalogProcessing.addEntityProvider(provider); + router.use(provider.getRouter()); + }, + }); + }, +}); From d3d33a08706d499716dbd9b53d3d22d8df9d3ccf Mon Sep 17 00:00:00 2001 From: Jonas Beck Date: Tue, 9 Dec 2025 10:04:16 +0100 Subject: [PATCH 274/312] chore: update api report Signed-off-by: Jonas Beck --- plugins/events-backend-module-kafka/report.api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/events-backend-module-kafka/report.api.md b/plugins/events-backend-module-kafka/report.api.md index a6b129b82e..c5e6d29c6a 100644 --- a/plugins/events-backend-module-kafka/report.api.md +++ b/plugins/events-backend-module-kafka/report.api.md @@ -6,6 +6,6 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @public -const eventsModuleKafkaConsumingEventPublisher: BackendFeature; -export default eventsModuleKafkaConsumingEventPublisher; +const _default: BackendFeature; +export default _default; ``` From 91f5ed82d661cb32c1cc8e0d95d13a7277786052 Mon Sep 17 00:00:00 2001 From: Tommy Le Date: Tue, 9 Dec 2025 10:54:43 +0100 Subject: [PATCH 275/312] fix(catalog): filter icon links before calling useProps The catalogAboutEntityCard was calling useProps() for all icon links before checking filters, causing hooks with side effects to execute for all entity types. This fix reverses the order to check the filter first, then only call useProps() if the filter passes. This prevents unnecessary side effects like API calls, auth flows, or state updates from running for icon links that won't be displayed. Signed-off-by: Tommy Le --- .changeset/ready-results-march.md | 5 +++++ plugins/catalog/src/alpha/entityCards.tsx | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/ready-results-march.md diff --git a/.changeset/ready-results-march.md b/.changeset/ready-results-march.md new file mode 100644 index 0000000000..c28ade8de9 --- /dev/null +++ b/.changeset/ready-results-march.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Fixed `catalogAboutEntityCard` to filter icon links before calling useProps(), preventing side effects from hooks in filtered-out links diff --git a/plugins/catalog/src/alpha/entityCards.tsx b/plugins/catalog/src/alpha/entityCards.tsx index 6df50a5123..556a130dff 100644 --- a/plugins/catalog/src/alpha/entityCards.tsx +++ b/plugins/catalog/src/alpha/entityCards.tsx @@ -41,12 +41,14 @@ export const catalogAboutEntityCard = EntityCardBlueprint.makeWithOverrides({ // The "useProps" functions may be calling other hooks, so we need to // call them in a component function to avoid breaking the rules of hooks. const links = inputs.iconLinks.reduce((rest, iconLink) => { - const props = iconLink.get(EntityIconLinkBlueprint.dataRefs.useProps)(); const filter = buildFilterFn( iconLink.get(EntityIconLinkBlueprint.dataRefs.filterFunction), iconLink.get(EntityIconLinkBlueprint.dataRefs.filterExpression), ); if (filter(entity)) { + const props = iconLink.get( + EntityIconLinkBlueprint.dataRefs.useProps, + )(); return [...rest, props]; } return rest; From ac759e20da97e567242f390bf752e57a9be0791f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:10:23 +0000 Subject: [PATCH 276/312] chore(deps): update dependency @modelcontextprotocol/sdk to v1.24.0 [security] Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7fd7f16edb..7c145fd541 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11060,21 +11060,32 @@ __metadata: linkType: hard "@modelcontextprotocol/sdk@npm:^1.12.3": - version: 1.13.1 - resolution: "@modelcontextprotocol/sdk@npm:1.13.1" + version: 1.24.2 + resolution: "@modelcontextprotocol/sdk@npm:1.24.2" dependencies: - ajv: "npm:^6.12.6" + ajv: "npm:^8.17.1" + ajv-formats: "npm:^3.0.1" content-type: "npm:^1.0.5" cors: "npm:^2.8.5" cross-spawn: "npm:^7.0.5" eventsource: "npm:^3.0.2" + eventsource-parser: "npm:^3.0.0" express: "npm:^5.0.1" express-rate-limit: "npm:^7.5.0" + jose: "npm:^6.1.1" pkce-challenge: "npm:^5.0.0" raw-body: "npm:^3.0.0" - zod: "npm:^3.23.8" - zod-to-json-schema: "npm:^3.24.1" - checksum: 10/b516d72e1cd14c67c8a2e5cb95fcc1c03c50be989850e3e963a7ed11000acb604e65efeaad47ea93c847130536ee51859a8d34e6dbe99d408e1a24224592e57f + zod: "npm:^3.25 || ^4.0" + zod-to-json-schema: "npm:^3.25.0" + peerDependencies: + "@cfworker/json-schema": ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + "@cfworker/json-schema": + optional: true + zod: + optional: false + checksum: 10/3411ade6e64188eeb7c68946a08f65040a5604f7bd7fe828647d73d037103214d8372f2e9f48c988bfec55dc273be8b4915498bc820bed0a61c0d53d0a5dc8a0 languageName: node linkType: hard @@ -23816,7 +23827,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.12.6": +"ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -30088,10 +30099,10 @@ __metadata: languageName: node linkType: hard -"eventsource-parser@npm:^3.0.1": - version: 3.0.1 - resolution: "eventsource-parser@npm:3.0.1" - checksum: 10/2730c54c3cb47d55d2967f2ece843f9fc95d8a11c2fef6fece8d17d9080193cbe3cd9ac7b04a325977f63cbf8c1664fdd0512dec1aec601666a5c5bd8564b61f +"eventsource-parser@npm:^3.0.0, eventsource-parser@npm:^3.0.1": + version: 3.0.6 + resolution: "eventsource-parser@npm:3.0.6" + checksum: 10/febf7058b9c2168ecbb33e92711a1646e06bd1568f60b6eb6a01a8bf9f8fcd29cc8320d57247059cacf657a296280159f21306d2e3ff33309a9552b2ef889387 languageName: node linkType: hard @@ -35324,7 +35335,7 @@ __metadata: languageName: node linkType: hard -"jose@npm:^6.0.10": +"jose@npm:^6.0.10, jose@npm:^6.1.1": version: 6.1.3 resolution: "jose@npm:6.1.3" checksum: 10/9626c51e8c3792b505e954f3094698c182208617b62dfb27269230f31e57560b083985ed8128b8a9753aa92daf18d3a2341cc826d149503f14569abe87d42389 @@ -50427,7 +50438,7 @@ __metadata: languageName: node linkType: hard -"zod-to-json-schema@npm:^3.20.4, zod-to-json-schema@npm:^3.21.4, zod-to-json-schema@npm:^3.24.1": +"zod-to-json-schema@npm:^3.20.4, zod-to-json-schema@npm:^3.21.4, zod-to-json-schema@npm:^3.25.0": version: 3.25.0 resolution: "zod-to-json-schema@npm:3.25.0" peerDependencies: @@ -50445,14 +50456,14 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.22.4, zod@npm:^3.23.8, zod@npm:^3.24.2": +"zod@npm:^3.22.4, zod@npm:^3.24.2": version: 3.25.76 resolution: "zod@npm:3.25.76" checksum: 10/f0c963ec40cd96858451d1690404d603d36507c1fc9682f2dae59ab38b578687d542708a7fdbf645f77926f78c9ed558f57c3d3aa226c285f798df0c4da16995 languageName: node linkType: hard -"zod@npm:^4.1.11": +"zod@npm:^3.25 || ^4.0, zod@npm:^4.1.11": version: 4.1.13 resolution: "zod@npm:4.1.13" checksum: 10/0679190318928f69fcb07751063719de232c663b13955fcdb55db59839569d39f3f29b955cb0cba7af0b724233f88c06b3e84c550397ad4e68f8088fa6799d88 From 622c29c9009b1449eac255ea2c8921afc0d8375e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 9 Dec 2025 12:18:11 +0100 Subject: [PATCH 277/312] Update .changeset/early-doors-visit.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/early-doors-visit.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/early-doors-visit.md b/.changeset/early-doors-visit.md index 828c8f26eb..41cd9e92b8 100644 --- a/.changeset/early-doors-visit.md +++ b/.changeset/early-doors-visit.md @@ -2,4 +2,4 @@ '@backstage/backend-defaults': patch --- -allow configuration of the referrerPolicy +Allow configuration of the `referrerPolicy` From 0700f49a4cab0fd69232fd9629f69a5da1162414 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 9 Dec 2025 12:29:15 +0100 Subject: [PATCH 278/312] Apply suggestions from code review Signed-off-by: Patrik Oldsberg --- .changeset/old-cats-shake.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/old-cats-shake.md b/.changeset/old-cats-shake.md index 5738f6cf86..3ca30a0421 100644 --- a/.changeset/old-cats-shake.md +++ b/.changeset/old-cats-shake.md @@ -1,5 +1,5 @@ --- -'@backstage/backend-defaults': minor +'@backstage/backend-defaults': patch '@backstage/backend-plugin-api': minor --- From 043140529a5e622b1745f908f82082b16ca37aa9 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 9 Dec 2025 12:54:52 +0100 Subject: [PATCH 279/312] chore: fix deps Signed-off-by: benjdlambert --- plugins/mcp-actions-backend/package.json | 1 + yarn.lock | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index da90397438..094af6de64 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -48,6 +48,7 @@ "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", + "@cfworker/json-schema": "^4.1.1", "@types/express": "^4.17.6" } } diff --git a/yarn.lock b/yarn.lock index 7c145fd541..30ba2bf004 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5994,6 +5994,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" + "@cfworker/json-schema": "npm:^4.1.1" "@modelcontextprotocol/sdk": "npm:^1.12.3" "@types/express": "npm:^4.17.6" express: "npm:^4.22.0" @@ -7904,6 +7905,13 @@ __metadata: languageName: node linkType: hard +"@cfworker/json-schema@npm:^4.1.1": + version: 4.1.1 + resolution: "@cfworker/json-schema@npm:4.1.1" + checksum: 10/62fd08bb2e6b4f0fe7c2b8f8c19f17f94b6a34feba7f455f228898ab435eda8aae082fcf6b0fe8a235a72e0ec0041922fdcd4c526acc32d45084272f000c1af9 + languageName: node + linkType: hard + "@changesets/apply-release-plan@npm:^7.0.14": version: 7.0.14 resolution: "@changesets/apply-release-plan@npm:7.0.14" From e008f86edf5dc008184bcddd62f193d6e439632b Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 9 Dec 2025 07:07:23 -0600 Subject: [PATCH 280/312] Update .changeset/short-lizards-find.md Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .changeset/short-lizards-find.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/short-lizards-find.md b/.changeset/short-lizards-find.md index f5659b13c8..6787f09bc0 100644 --- a/.changeset/short-lizards-find.md +++ b/.changeset/short-lizards-find.md @@ -1,5 +1,4 @@ --- -'@backstage/backend-defaults': minor '@backstage/plugin-devtools-backend': minor '@backstage/plugin-devtools-common': minor '@backstage/plugin-devtools': minor From 2c7447ca3a971892cf64c0a770ad8080fda565c4 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 9 Dec 2025 07:07:32 -0600 Subject: [PATCH 281/312] Update .changeset/short-lizards-find.md Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .changeset/short-lizards-find.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/short-lizards-find.md b/.changeset/short-lizards-find.md index 6787f09bc0..01ce36afb7 100644 --- a/.changeset/short-lizards-find.md +++ b/.changeset/short-lizards-find.md @@ -1,5 +1,4 @@ --- -'@backstage/plugin-devtools-backend': minor '@backstage/plugin-devtools-common': minor '@backstage/plugin-devtools': minor --- From a40b2ee43add5cff20a1e6a1d99342bc33a9b9a2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:21:15 +0000 Subject: [PATCH 282/312] chore(deps): update dependency eslint-rspack-plugin to v4.3.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0dbafe55b5..af46455744 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29814,17 +29814,18 @@ __metadata: linkType: hard "eslint-rspack-plugin@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-rspack-plugin@npm:4.2.1" + version: 4.3.0 + resolution: "eslint-rspack-plugin@npm:4.3.0" dependencies: "@types/eslint": "npm:^8.56.10" jest-worker: "npm:^29.7.0" micromatch: "npm:^4.0.8" normalize-path: "npm:^3.0.0" schema-utils: "npm:^4.2.0" + tinyglobby: "npm:^0.2.15" peerDependencies: eslint: ^8.0.0 || ^9.0.0 - checksum: 10/c45639e660d13af63c58f8f80103a033f607b9d635d9315d7d859408134cc35e2e3f981805f7abdd6061ec9d8207cfc7c0d5a097df9ac8c7ccd707ca5aa14583 + checksum: 10/e312c993474cd4df180f6790359936b581391ac660769ce94b7e00e96322aedbbebc8d9132969db72b04d4588ccf40dd17c45d8f5d48df625a015a819c215ae3 languageName: node linkType: hard From e83e038dadb0be5b69598a8beb030f1b66eb35c8 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 9 Dec 2025 15:11:32 +0100 Subject: [PATCH 283/312] chore: ok, this is it Signed-off-by: benjdlambert --- .changeset/blue-signs-fry.md | 5 +++++ plugins/mcp-actions-backend/package.json | 4 ++-- yarn.lock | 10 +++++----- 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 .changeset/blue-signs-fry.md diff --git a/.changeset/blue-signs-fry.md b/.changeset/blue-signs-fry.md new file mode 100644 index 0000000000..26861e3b7e --- /dev/null +++ b/.changeset/blue-signs-fry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-mcp-actions-backend': patch +--- + +Added `@cfworker/json-schema` as a dependency to this package part of the `@modelcontextprotocol/sdk` bump as it's required in the types diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index 094af6de64..2903b51631 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -40,7 +40,8 @@ "@backstage/errors": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", - "@modelcontextprotocol/sdk": "^1.12.3", + "@cfworker/json-schema": "^4.1.1", + "@modelcontextprotocol/sdk": "^1.24.3", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4" @@ -48,7 +49,6 @@ "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@cfworker/json-schema": "^4.1.1", "@types/express": "^4.17.6" } } diff --git a/yarn.lock b/yarn.lock index 30ba2bf004..767cff3ffe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5995,7 +5995,7 @@ __metadata: "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@cfworker/json-schema": "npm:^4.1.1" - "@modelcontextprotocol/sdk": "npm:^1.12.3" + "@modelcontextprotocol/sdk": "npm:^1.24.3" "@types/express": "npm:^4.17.6" express: "npm:^4.22.0" express-promise-router: "npm:^4.1.0" @@ -11067,9 +11067,9 @@ __metadata: languageName: node linkType: hard -"@modelcontextprotocol/sdk@npm:^1.12.3": - version: 1.24.2 - resolution: "@modelcontextprotocol/sdk@npm:1.24.2" +"@modelcontextprotocol/sdk@npm:^1.24.3": + version: 1.24.3 + resolution: "@modelcontextprotocol/sdk@npm:1.24.3" dependencies: ajv: "npm:^8.17.1" ajv-formats: "npm:^3.0.1" @@ -11093,7 +11093,7 @@ __metadata: optional: true zod: optional: false - checksum: 10/3411ade6e64188eeb7c68946a08f65040a5604f7bd7fe828647d73d037103214d8372f2e9f48c988bfec55dc273be8b4915498bc820bed0a61c0d53d0a5dc8a0 + checksum: 10/661aea493ee06674edc0d1409d5ff6e53053da2c3eb27d28ecdd5aa212d9d6bac8c00bec1cd18c1065f2d5774afef34e3cdcd19643056f954c14f611fee8cbc4 languageName: node linkType: hard From e08f48a9b5cb219a120c417f05ad7c8db776525c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 9 Dec 2025 15:00:09 +0000 Subject: [PATCH 284/312] Version Packages (next) --- .changeset/pre.json | 41 + docs/releases/v1.46.0-next.2-changelog.md | 1897 +++++++++++++++++ package.json | 2 +- packages/app-next/CHANGELOG.md | 47 + packages/app-next/package.json | 2 +- packages/app/CHANGELOG.md | 43 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 9 + packages/backend-app-api/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 27 + packages/backend-defaults/package.json | 2 +- packages/backend-dev-utils/CHANGELOG.md | 6 + packages/backend-dev-utils/package.json | 2 +- .../CHANGELOG.md | 26 + .../package.json | 2 +- packages/backend-openapi-utils/CHANGELOG.md | 10 + packages/backend-openapi-utils/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 17 + packages/backend-plugin-api/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 18 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 42 + packages/backend/package.json | 2 +- packages/cli-common/CHANGELOG.md | 8 + packages/cli-common/package.json | 2 +- packages/cli/CHANGELOG.md | 33 + packages/cli/package.json | 2 +- packages/codemods/CHANGELOG.md | 8 + packages/codemods/package.json | 2 +- packages/config-loader/CHANGELOG.md | 11 + packages/config-loader/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 11 + packages/core-app-api/package.json | 2 +- packages/core-components/CHANGELOG.md | 12 + packages/core-components/package.json | 2 +- packages/create-app/CHANGELOG.md | 9 + packages/create-app/package.json | 2 +- packages/frontend-plugin-api/CHANGELOG.md | 16 + packages/frontend-plugin-api/package.json | 2 +- packages/integration/CHANGELOG.md | 9 + packages/integration/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 14 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 20 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 12 + packages/techdocs-cli/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 15 + plugins/api-docs/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 14 + plugins/app-backend/package.json | 2 +- plugins/app-node/CHANGELOG.md | 9 + plugins/app-node/package.json | 2 +- plugins/app/CHANGELOG.md | 16 + plugins/app/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 14 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 14 + plugins/auth-node/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 16 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 11 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 11 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../catalog-backend-module-gitea/CHANGELOG.md | 12 + .../catalog-backend-module-gitea/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 13 + .../catalog-backend-module-ldap/package.json | 2 +- .../catalog-backend-module-logs/CHANGELOG.md | 9 + .../catalog-backend-module-logs/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 20 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 14 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 14 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 21 + plugins/catalog-react/package.json | 2 +- plugins/catalog/CHANGELOG.md | 26 + plugins/catalog/package.json | 2 +- plugins/devtools-backend/CHANGELOG.md | 17 + plugins/devtools-backend/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../events-backend-module-azure/CHANGELOG.md | 8 + .../events-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 8 + .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 11 + .../events-backend-module-github/package.json | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 9 + .../events-backend-module-gitlab/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../events-backend-module-kafka/CHANGELOG.md | 10 + .../events-backend-module-kafka/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 13 + plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 10 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 8 + .../example-todo-list-backend/package.json | 2 +- plugins/gateway-backend/CHANGELOG.md | 8 + plugins/gateway-backend/package.json | 2 +- plugins/home-react/CHANGELOG.md | 13 + plugins/home-react/package.json | 2 +- plugins/home/CHANGELOG.md | 20 + plugins/home/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 24 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 14 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes-node/CHANGELOG.md | 14 + plugins/kubernetes-node/package.json | 2 +- plugins/mcp-actions-backend/CHANGELOG.md | 14 + plugins/mcp-actions-backend/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- plugins/notifications-backend/CHANGELOG.md | 16 + plugins/notifications-backend/package.json | 2 +- plugins/notifications-node/CHANGELOG.md | 11 + plugins/notifications-node/package.json | 2 +- plugins/org/CHANGELOG.md | 13 + plugins/org/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 13 + plugins/permission-backend/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 12 + plugins/permission-node/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 10 + plugins/proxy-backend/package.json | 2 +- plugins/proxy-node/CHANGELOG.md | 7 + plugins/proxy-node/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 35 + plugins/scaffolder-backend/package.json | 2 +- .../scaffolder-node-test-utils/CHANGELOG.md | 10 + .../scaffolder-node-test-utils/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 13 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 23 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 26 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 10 + plugins/search-backend-module-pg/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 11 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 17 + plugins/search-backend/package.json | 2 +- plugins/search/CHANGELOG.md | 16 + plugins/search/package.json | 2 +- plugins/signals-backend/CHANGELOG.md | 12 + plugins/signals-backend/package.json | 2 +- plugins/signals-node/CHANGELOG.md | 12 + plugins/signals-node/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 18 + plugins/techdocs-backend/package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 16 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 23 + plugins/techdocs/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 14 + plugins/user-settings-backend/package.json | 2 +- 281 files changed, 3971 insertions(+), 140 deletions(-) create mode 100644 docs/releases/v1.46.0-next.2-changelog.md diff --git a/.changeset/pre.json b/.changeset/pre.json index f44b869497..89ee2fe917 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -208,49 +208,90 @@ }, "changesets": [ "afraid-items-drum", + "alert-api-replay", + "all-socks-taste", + "blue-signs-fry", "bumpy-planets-go", "chatty-sides-wear", "chilly-bikes-rule", "chilly-hotels-walk", + "chilly-waves-relate", "clean-toys-reply", "common-coins-stare", + "crazy-hornets-spend", "create-app-1764689798", + "dependabot-0d8f6de", + "dependabot-5e654fe", + "early-doors-visit", + "error-boundary-api", "famous-jars-lose", "fifty-coats-feel", + "fifty-lights-marry", "fine-eagles-sleep", "flat-pillows-rush", "floppy-bobcats-serve", "four-peaches-train", "fruity-rivers-arrive", "fruity-words-melt", + "full-needles-drive", + "funny-hornets-peel", "funny-papayas-rest", "fuzzy-phones-own", + "fuzzy-rivers-travel", "fuzzy-trees-live", + "gentle-singers-love", "gentle-trains-juggle", "great-files-shave", + "green-lizards-boil", "happy-bottles-invite", + "happy-streets-dress", + "honest-bears-itch", "kind-hoops-double", + "large-planes-punch", "legal-cloths-spend", "legal-otters-punch", + "lemon-corners-hug", "loose-pets-slide", + "loud-yaks-watch", "lucky-days-hug", "many-planes-join", "metal-boxes-laugh", "metal-humans-lose", "modern-taxes-start", "neat-pens-clean", + "nice-humans-cry", "nice-trams-shake", + "old-cats-shake", "old-parks-smell", "open-points-beam", "quiet-hats-sleep", + "rare-rice-throw", + "ready-results-march", + "renovate-7b76d6d", + "renovate-959c095", + "renovate-97eef4b", + "renovate-9ec01ff", + "renovate-a3c2cbd", + "renovate-aa0bb93", + "renovate-ad7bf17", + "renovate-d7ceb06", + "renovate-ea25c93", "rotten-melons-sleep", + "salty-camels-wash", + "seven-games-rest", "short-groups-knock", "slick-books-sleep", "slick-onions-wash", "slimy-islands-play", + "slimy-mugs-taste", + "sour-bats-press", "spicy-teeth-study", "stale-eagles-rush", + "stupid-cases-fold", + "tall-ideas-lead", + "tame-mirrors-sit", "tender-dancers-hunt", + "tired-dogs-remain", "tough-lies-grow", "twenty-ducks-relate" ] diff --git a/docs/releases/v1.46.0-next.2-changelog.md b/docs/releases/v1.46.0-next.2-changelog.md new file mode 100644 index 0000000000..0bb2bf687d --- /dev/null +++ b/docs/releases/v1.46.0-next.2-changelog.md @@ -0,0 +1,1897 @@ +# Release v1.46.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.46.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.46.0-next.2) + +## @backstage/backend-plugin-api@1.6.0-next.1 + +### Minor Changes + +- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/cli@0.35.0-next.2 + +### Minor Changes + +- f8dff94: Switched the default module resolution to `bundler` and the `module` setting to `ES2020`. + + You may need to bump some dependencies as part of this change and fix imports in code. The most common source of this is that type checking will now consider the `exports` field in `package.json` when resolving imports. This in turn can break older versions of packages that had incompatible `exports` fields. Generally these issues will have already been fixed in the upstream packages. + + You might be tempted to use `--skipLibCheck` to hide issues due to this change, but it will weaken the type safety of your project. If you run into a large number of issues and want to keep the old behavior, you can reset the `moduleResolution` and `module` settings your own `tsconfig.json` file to `node` and `ESNext` respectively. But keep in mind that the `node` option will be removed in future versions of TypeScript. + + A future version of Backstage will make these new settings mandatory, as we move to rely on the `exports` field for type resolution in packages, rather than the `typesVersions` field. + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 1226647: Updated dependency `esbuild` to `^0.27.0`. +- f89a074: Updated dependency `@pmmmwh/react-refresh-webpack-plugin` to `^0.6.0`. +- 2b81751: Updated dependency `webpack` to `~5.103.0`. +- fafd9e1: Fixed internal usage of `yargs`. +- 2bae83a: Switched ECMAScript version to ES2023. +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.2.0 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + +## @backstage/plugin-kubernetes-backend@0.21.0-next.2 + +### Minor Changes + +- 7f9846f: Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- fb029b6: Updated luxon types +- Updated dependencies + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/plugin-kubernetes-node@0.4.0-next.2 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-kubernetes-node@0.4.0-next.2 + +### Minor Changes + +- 7f9846f: Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.0-next.1 + +### Minor Changes + +- f2d034b: In the `gitlabRepoPush` action, add 'auto' possibility for `commitAction` input. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/backend-app-api@1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/backend-defaults@0.14.0-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- aa79251: build(deps): bump `node-forge` from 1.3.1 to 1.3.2 +- f96edff: Allow configuration of the `referrerPolicy` +- fb029b6: Updated luxon types +- 847a330: Fix for `jose` types +- 25b560e: Internal change to support new versions of the `logform` library +- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins. +- 3016a79: Updated dependency `@types/archiver` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/backend-dev-utils@0.1.6-next.0 + - @backstage/backend-app-api@1.4.0-next.1 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/types@1.2.2 + +## @backstage/backend-dev-utils@0.1.6-next.0 + +### Patch Changes + +- 2bae83a: Internal update for Node.js v24 support. + +## @backstage/backend-dynamic-feature-service@0.7.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-app-node@0.1.40-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-events-backend@0.5.9-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/backend-openapi-utils@0.6.4-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/backend-test-utils@1.10.2-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 8be23a4: Switched `textextensions` dependency for `text-extensions`. +- 5a737e1: Fix PostgreSQL 18 `TestDatabases` by pinning the data directory +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/backend-app-api@1.4.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/cli-common@0.1.16-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/errors@1.2.7 + +## @backstage/codemods@0.1.53-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/cli-common@0.1.16-next.2 + +## @backstage/config-loader@1.10.7-next.1 + +### Patch Changes + +- 741c47a: Updated dependency `typescript-json-schema` to `^0.67.0`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/core-app-api@1.19.3-next.1 + +### Patch Changes + +- 75683ed: Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription. +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/core-components@0.18.4-next.2 + +### Patch Changes + +- 4c00303: Add `tooltipClasses` prop to `OverflowTooltip` component to allow customisation of the tooltip +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.1-next.0 + - @backstage/version-bridge@1.0.11 + +## @backstage/create-app@0.7.7-next.2 + +### Patch Changes + +- 2bae83a: Updated engines to support Node 22 or 24 +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/cli-common@0.1.16-next.2 + +## @backstage/frontend-plugin-api@0.13.2-next.1 + +### Patch Changes + +- 75683ed: Added a new `errorPresentation` prop to `ExtensionBoundary` to control how errors are presented to the user. The default is `'error-display'`, which is the current behavior of showing the error in the `ErrorDisplay` component. The new option is `'error-api'`, posts errors to the `ErrorApi` and does not allow retries. + + The `AppRootElementBlueprint` now wraps its element in an `ErrorBoundary` using the new `'error-api'` presentation mode. + +- f3f84f1: Made the return type of `.withOverrides` to be simplified. + +- Updated dependencies + - @backstage/core-components@0.18.4-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/integration@1.18.3-next.1 + +### Patch Changes + +- fb029b6: Updated luxon types +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/repo-tools@0.16.1-next.2 + +### Patch Changes + +- 2bae83a: Bump `@microsoft/api-documenter` and `@microsoft/api-extractor` to latest versions. +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/errors@1.2.7 + +## @techdocs/cli@1.10.3-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-techdocs-node@1.13.10-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + +## @backstage/plugin-api-docs@0.13.2-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-react@0.4.39-next.0 + +## @backstage/plugin-app@0.3.3-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- f7bc228: Support to set `defaultLanguage` and `availableLanguages` for the app language API in the new frontend system +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.39-next.0 + +## @backstage/plugin-app-backend@0.5.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-app-node@0.1.40-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-app-node@0.1.40-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + +## @backstage/plugin-auth-backend@0.25.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.2.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.15-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-github-provider@0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-google-provider@0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.15-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-okta-provider@0.2.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-auth-backend-module-openshift-provider@0.1.3-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + +## @backstage/plugin-auth-node@0.6.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- e9dd634: fix flawed cookie removal logic with chunked tokens +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog@1.32.1-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- 91f5ed8: Fixed `catalogAboutEntityCard` to filter icon links before calling useProps(), preventing side effects from hooks in filtered-out links +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.5-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + +## @backstage/plugin-catalog-backend@3.2.1-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-catalog-backend-module-aws@0.4.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-bitbucket-cloud-common@0.3.5-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.11.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-backend-module-github@0.11.3-next.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.7.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-catalog-backend-module-gitlab@0.7.6-next.1 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- fb029b6: Updated luxon types +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-catalog-backend-module-ldap@0.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-logs@0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-catalog-backend-module-msgraph@0.8.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-catalog-graph@0.5.4-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-node@1.20.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-catalog-react@1.21.4-next.2 + +### Patch Changes + +- b3c0594: Use a versioned context for `useEntityList`, to better work with mixed `@backstage/plugin-catalog-react` versions. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.5-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-test-utils@0.4.2-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-react@0.4.39-next.0 + +## @backstage/plugin-devtools-backend@0.5.12-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.19 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-events-backend@0.5.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-azure@0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-events-backend-module-bitbucket-server@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-events-backend-module-gerrit@0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-events-backend-module-github@0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-gitlab@0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + +## @backstage/plugin-events-backend-module-google-pubsub@0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-kafka@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-node@0.4.18-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-gateway-backend@1.1.1-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-home@0.8.15-next.1 + +### Patch Changes + +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home-react@0.1.33-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/theme@0.7.1-next.0 + +## @backstage/plugin-home-react@0.1.33-next.1 + +### Patch Changes + +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/core-plugin-api@1.12.1-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.32-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + - @backstage/plugin-kubernetes-react@0.5.14-next.1 + - @backstage/plugin-permission-react@0.4.39-next.0 + +## @backstage/plugin-mcp-actions-backend@0.1.6-next.1 + +### Patch Changes + +- e83e038: Added `@cfworker/json-schema` as a dependency to this package part of the `@modelcontextprotocol/sdk` bump as it's required in the types +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-notifications-backend@0.6.1-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + +## @backstage/plugin-notifications-backend-module-email@0.3.17-next.1 + +### Patch Changes + +- b267aea: Updated dependency `@types/nodemailer` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.19 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + +## @backstage/plugin-notifications-backend-module-slack@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + +## @backstage/plugin-notifications-node@0.2.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.0 + +## @backstage/plugin-org@0.6.47-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-catalog-common@1.1.7 + +## @backstage/plugin-permission-backend@0.7.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-permission-node@0.10.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-proxy-backend@0.6.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-proxy-node@0.1.11-next.1 + +## @backstage/plugin-proxy-node@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + +## @backstage/plugin-scaffolder@1.34.4-next.1 + +### Patch Changes + +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.2 + - @backstage/integration@1.18.3-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + +## @backstage/plugin-scaffolder-backend@3.1.0-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 2bae83a: Updated `isolated-vm` to `6.0.1` +- 25b560e: Internal change to support new versions of the `logform` library +- 1226647: Updated dependency `esbuild` to `^0.27.0`. +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.0-next.1 + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-bitbucket-cloud-common@0.3.5-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15-next.1 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.17-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.3-next.1 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.16-next.1 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-bitbucket-cloud-common@0.3.5-next.0 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16-next.1 + +### Patch Changes + +- 5a6aca2: Improve error message when provided target branch is missing +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.16-next.1 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + - @backstage/plugin-scaffolder-node-test-utils@0.3.6-next.1 + +## @backstage/plugin-scaffolder-node@0.12.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.10.2-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + +## @backstage/plugin-scaffolder-react@1.19.4-next.2 + +### Patch Changes + +- fb029b6: Updated luxon types +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- 9b38f22: Updated dependency `use-immer` to `^0.11.0`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + +## @backstage/plugin-search@1.5.1-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + +## @backstage/plugin-search-backend@2.0.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-search-backend-module-catalog@0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-search-backend-module-elasticsearch@1.7.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.19 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-search-backend-module-explore@0.3.10-next.1 + +### Patch Changes + +- 9b69262: Updated dependency `@backstage-community/plugin-explore-common` to `^0.9.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-search-backend-module-pg@0.5.51-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-search-backend-module-techdocs@0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.13.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-search-backend-node@1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-signals-backend@0.3.11-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-signals-node@0.1.27-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-techdocs@1.16.1-next.2 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + +## @backstage/plugin-techdocs-backend@2.1.3-next.2 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 2bae83a: Corrected `ErrorCallback` type to work with Node 22 types +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-techdocs-node@1.13.10-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## @backstage/plugin-techdocs-node@1.13.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 703f8c0: There was an issue in the uploading of large size files to the AWS S3. We have modified the logic by adding retry along with multipart uploading functionality. +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-user-settings-backend@0.3.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.116-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/cli@0.35.0-next.2 + - @backstage/plugin-catalog-graph@0.5.4-next.1 + - @backstage/plugin-api-docs@0.13.2-next.1 + - @backstage/plugin-techdocs@1.16.1-next.2 + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/plugin-search@1.5.1-next.1 + - @backstage/plugin-org@0.6.47-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.2 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home@0.8.15-next.1 + - @backstage/plugin-scaffolder@1.34.4-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.2 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/frontend-app-api@0.13.3-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/ui@0.10.0-next.1 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-import@0.13.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/plugin-devtools@0.1.34-next.0 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-mui-to-bui@0.2.2-next.1 + - @backstage/plugin-notifications@0.5.12-next.0 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-signals@0.0.26-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + - @backstage/plugin-user-settings@0.8.30-next.0 + +## example-app-next@0.0.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/cli@0.35.0-next.2 + - @backstage/plugin-catalog-graph@0.5.4-next.1 + - @backstage/plugin-api-docs@0.13.2-next.1 + - @backstage/plugin-techdocs@1.16.1-next.2 + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/plugin-search@1.5.1-next.1 + - @backstage/plugin-app@0.3.3-next.1 + - @backstage/plugin-org@0.6.47-next.1 + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.2 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home@0.8.15-next.1 + - @backstage/plugin-scaffolder@1.34.4-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.2 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-compat-api@0.5.5-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/frontend-app-api@0.13.3-next.0 + - @backstage/frontend-defaults@0.3.4-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/ui@0.10.0-next.1 + - @backstage/plugin-app-visualizer@0.1.26-next.1 + - @backstage/plugin-auth@0.1.3-next.0 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-import@0.13.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-notifications@0.5.12-next.0 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-signals@0.0.26-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + - @backstage/plugin-user-settings@0.8.30-next.0 + +## example-backend@0.0.45-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-mcp-actions-backend@0.1.6-next.1 + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-app-backend@0.5.9-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.15-next.1 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3-next.1 + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-devtools-backend@0.5.12-next.1 + - @backstage/plugin-events-backend@0.5.9-next.1 + - @backstage/plugin-kubernetes-backend@0.21.0-next.2 + - @backstage/plugin-notifications-backend@0.6.1-next.1 + - @backstage/plugin-permission-backend@0.7.7-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/plugin-proxy-backend@0.6.9-next.1 + - @backstage/plugin-scaffolder-backend@3.1.0-next.1 + - @backstage/plugin-search-backend@2.0.9-next.1 + - @backstage/plugin-signals-backend@0.3.11-next.1 + - @backstage/plugin-techdocs-backend@2.1.3-next.2 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.3.10-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-auth-backend-module-github-provider@0.3.10-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.9-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.17-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.7-next.2 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.7-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-backend-module-github@0.9.3-next.1 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.17-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.11-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.9-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.9-next.1 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + +## techdocs-cli-embedded-app@0.2.115-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/cli@0.35.0-next.2 + - @backstage/plugin-techdocs@1.16.1-next.2 + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/test-utils@1.7.14-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/ui@0.10.0-next.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + +## @internal/plugin-todo-list-backend@1.0.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 diff --git a/package.json b/package.json index 4a67751584..caef1349f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.46.0-next.1", + "version": "1.46.0-next.2", "backstage": { "cli": { "new": { diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index 9e29cd2b2e..0a38482bab 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,52 @@ # example-app-next +## 0.0.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/cli@0.35.0-next.2 + - @backstage/plugin-catalog-graph@0.5.4-next.1 + - @backstage/plugin-api-docs@0.13.2-next.1 + - @backstage/plugin-techdocs@1.16.1-next.2 + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/plugin-search@1.5.1-next.1 + - @backstage/plugin-app@0.3.3-next.1 + - @backstage/plugin-org@0.6.47-next.1 + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.2 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home@0.8.15-next.1 + - @backstage/plugin-scaffolder@1.34.4-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.2 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-compat-api@0.5.5-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/frontend-app-api@0.13.3-next.0 + - @backstage/frontend-defaults@0.3.4-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/ui@0.10.0-next.1 + - @backstage/plugin-app-visualizer@0.1.26-next.1 + - @backstage/plugin-auth@0.1.3-next.0 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-import@0.13.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-notifications@0.5.12-next.0 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-signals@0.0.26-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + - @backstage/plugin-user-settings@0.8.30-next.0 + ## 0.0.30-next.1 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 5d85984979..c6d1ae36cc 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.30-next.1", + "version": "0.0.30-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 82e800c5ef..ec083df48f 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,48 @@ # example-app +## 0.2.116-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/cli@0.35.0-next.2 + - @backstage/plugin-catalog-graph@0.5.4-next.1 + - @backstage/plugin-api-docs@0.13.2-next.1 + - @backstage/plugin-techdocs@1.16.1-next.2 + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/plugin-search@1.5.1-next.1 + - @backstage/plugin-org@0.6.47-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.2 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home@0.8.15-next.1 + - @backstage/plugin-scaffolder@1.34.4-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.2 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/frontend-app-api@0.13.3-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/ui@0.10.0-next.1 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-import@0.13.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/plugin-devtools@0.1.34-next.0 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-mui-to-bui@0.2.2-next.1 + - @backstage/plugin-notifications@0.5.12-next.0 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-signals@0.0.26-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + - @backstage/plugin-user-settings@0.8.30-next.0 + ## 0.2.116-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 5515e2a9c7..6e6f1dd52d 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.116-next.1", + "version": "0.2.116-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index e171961905..e610d6ef77 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-app-api +## 1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 1.4.0-next.0 ### Minor Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index ade61d87b1..36db7175b6 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-app-api", - "version": "1.4.0-next.0", + "version": "1.4.0-next.1", "description": "Core API used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 163264fe5b..603a66f6f1 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/backend-defaults +## 0.14.0-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- aa79251: build(deps): bump `node-forge` from 1.3.1 to 1.3.2 +- f96edff: Allow configuration of the `referrerPolicy` +- fb029b6: Updated luxon types +- 847a330: Fix for `jose` types +- 25b560e: Internal change to support new versions of the `logform` library +- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins. +- 3016a79: Updated dependency `@types/archiver` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/backend-dev-utils@0.1.6-next.0 + - @backstage/backend-app-api@1.4.0-next.1 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/types@1.2.2 + ## 0.14.0-next.0 ### Minor Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 63ea7b4b55..96b96f1bf7 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.14.0-next.0", + "version": "0.14.0-next.1", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-dev-utils/CHANGELOG.md b/packages/backend-dev-utils/CHANGELOG.md index 81686fb493..4b89697ee8 100644 --- a/packages/backend-dev-utils/CHANGELOG.md +++ b/packages/backend-dev-utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/backend-dev-utils +## 0.1.6-next.0 + +### Patch Changes + +- 2bae83a: Internal update for Node.js v24 support. + ## 0.1.5 ### Patch Changes diff --git a/packages/backend-dev-utils/package.json b/packages/backend-dev-utils/package.json index 4d22c5010f..3eb9c05993 100644 --- a/packages/backend-dev-utils/package.json +++ b/packages/backend-dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dev-utils", - "version": "0.1.5", + "version": "0.1.6-next.0", "backstage": { "role": "node-library" }, diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index 25ae340cbf..aec27109a6 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/backend-dynamic-feature-service +## 0.7.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-app-node@0.1.40-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-events-backend@0.5.9-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 0.7.7-next.0 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index b2f2a5902f..416cbfdc1e 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dynamic-feature-service", - "version": "0.7.7-next.0", + "version": "0.7.7-next.1", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index 7f3a9328ae..2fb0b39cbd 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/backend-openapi-utils +## 0.6.4-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.6.4-next.0 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index 3c4908de61..715c1ddbcb 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-openapi-utils", - "version": "0.6.4-next.0", + "version": "0.6.4-next.1", "description": "OpenAPI typescript support.", "backstage": { "role": "node-library" diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 617012d22b..84ad95d700 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/backend-plugin-api +## 1.6.0-next.1 + +### Minor Changes + +- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + ## 1.5.1-next.0 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index be377d1d12..c26c0ce1de 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-plugin-api", - "version": "1.5.1-next.0", + "version": "1.6.0-next.1", "description": "Core API used by Backstage backend plugins", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index d8ee338822..921eac9383 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/backend-test-utils +## 1.10.2-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 8be23a4: Switched `textextensions` dependency for `text-extensions`. +- 5a737e1: Fix PostgreSQL 18 `TestDatabases` by pinning the data directory +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/backend-app-api@1.4.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + ## 1.10.1-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index cd4f68ead0..08b5da6630 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-test-utils", - "version": "1.10.1-next.0", + "version": "1.10.2-next.1", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 622c2329b2..dc0f2fc708 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,47 @@ # example-backend +## 0.0.45-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-mcp-actions-backend@0.1.6-next.1 + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-app-backend@0.5.9-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.15-next.1 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3-next.1 + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-devtools-backend@0.5.12-next.1 + - @backstage/plugin-events-backend@0.5.9-next.1 + - @backstage/plugin-kubernetes-backend@0.21.0-next.2 + - @backstage/plugin-notifications-backend@0.6.1-next.1 + - @backstage/plugin-permission-backend@0.7.7-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/plugin-proxy-backend@0.6.9-next.1 + - @backstage/plugin-scaffolder-backend@3.1.0-next.1 + - @backstage/plugin-search-backend@2.0.9-next.1 + - @backstage/plugin-signals-backend@0.3.11-next.1 + - @backstage/plugin-techdocs-backend@2.1.3-next.2 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.3.10-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-auth-backend-module-github-provider@0.3.10-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.9-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.17-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.7-next.2 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.7-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-backend-module-github@0.9.3-next.1 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.17-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.11-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.9-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.9-next.1 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + ## 0.0.45-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 1d0040389c..10a2eeded3 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.45-next.0", + "version": "0.0.45-next.1", "backstage": { "role": "backend" }, diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index d40c0629f4..145e04ddb3 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-common +## 0.1.16-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/errors@1.2.7 + ## 0.1.16-next.1 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index ea26ee09e6..80857bffff 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-common", - "version": "0.1.16-next.1", + "version": "0.1.16-next.2", "description": "Common functionality used by cli, backend, and create-app", "backstage": { "role": "node-library" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 9cee8632cd..6dd279fadb 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/cli +## 0.35.0-next.2 + +### Minor Changes + +- f8dff94: Switched the default module resolution to `bundler` and the `module` setting to `ES2020`. + + You may need to bump some dependencies as part of this change and fix imports in code. The most common source of this is that type checking will now consider the `exports` field in `package.json` when resolving imports. This in turn can break older versions of packages that had incompatible `exports` fields. Generally these issues will have already been fixed in the upstream packages. + + You might be tempted to use `--skipLibCheck` to hide issues due to this change, but it will weaken the type safety of your project. If you run into a large number of issues and want to keep the old behavior, you can reset the `moduleResolution` and `module` settings your own `tsconfig.json` file to `node` and `ESNext` respectively. But keep in mind that the `node` option will be removed in future versions of TypeScript. + + A future version of Backstage will make these new settings mandatory, as we move to rely on the `exports` field for type resolution in packages, rather than the `typesVersions` field. + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 1226647: Updated dependency `esbuild` to `^0.27.0`. +- f89a074: Updated dependency `@pmmmwh/react-refresh-webpack-plugin` to `^0.6.0`. +- 2b81751: Updated dependency `webpack` to `~5.103.0`. +- fafd9e1: Fixed internal usage of `yargs`. +- 2bae83a: Switched ECMAScript version to ES2023. +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.2.0 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + ## 0.34.6-next.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index be94e4e817..c48b529551 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.34.6-next.1", + "version": "0.35.0-next.2", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 13e6bfe7f6..3f85216f69 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/codemods +## 0.1.53-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/cli-common@0.1.16-next.2 + ## 0.1.53-next.1 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index f78579f714..1a84ba417a 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/codemods", - "version": "0.1.53-next.1", + "version": "0.1.53-next.2", "description": "A collection of codemods for Backstage projects", "backstage": { "role": "cli" diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 00980c43bd..7055741def 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/config-loader +## 1.10.7-next.1 + +### Patch Changes + +- 741c47a: Updated dependency `typescript-json-schema` to `^0.67.0`. +- Updated dependencies + - @backstage/cli-common@0.1.16-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 1.10.7-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 24b71ce824..bedbbff518 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config-loader", - "version": "1.10.7-next.0", + "version": "1.10.7-next.1", "description": "Config loading functionality used by Backstage backend, and CLI", "backstage": { "role": "node-library" diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index cc78499c94..19720d0c7e 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-app-api +## 1.19.3-next.1 + +### Patch Changes + +- 75683ed: Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription. +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 1.19.3-next.0 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index d0c2d2b512..70670fa27d 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-app-api", - "version": "1.19.3-next.0", + "version": "1.19.3-next.1", "description": "Core app API used by Backstage apps", "backstage": { "role": "web-library" diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index ea2023e845..b5f5ae226f 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/core-components +## 0.18.4-next.2 + +### Patch Changes + +- 4c00303: Add `tooltipClasses` prop to `OverflowTooltip` component to allow customisation of the tooltip +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.1-next.0 + - @backstage/version-bridge@1.0.11 + ## 0.18.4-next.1 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 2c3cee0c46..da266d1b66 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.18.4-next.1", + "version": "0.18.4-next.2", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 8c7fd970ab..e26b1347a3 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/create-app +## 0.7.7-next.2 + +### Patch Changes + +- 2bae83a: Updated engines to support Node 22 or 24 +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/cli-common@0.1.16-next.2 + ## 0.7.7-next.1 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index af82d507d2..029cec855a 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.7.7-next.1", + "version": "0.7.7-next.2", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index c0c6b6ec0e..6c5ede72df 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/frontend-plugin-api +## 0.13.2-next.1 + +### Patch Changes + +- 75683ed: Added a new `errorPresentation` prop to `ExtensionBoundary` to control how errors are presented to the user. The default is `'error-display'`, which is the current behavior of showing the error in the `ErrorDisplay` component. The new option is `'error-api'`, posts errors to the `ErrorApi` and does not allow retries. + + The `AppRootElementBlueprint` now wraps its element in an `ErrorBoundary` using the new `'error-api'` presentation mode. + +- f3f84f1: Made the return type of `.withOverrides` to be simplified. +- Updated dependencies + - @backstage/core-components@0.18.4-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 0.13.2-next.0 ### Patch Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 25c40b2e0a..6fa9d9f342 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.13.2-next.0", + "version": "0.13.2-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index a45b3d9770..3e412d5d88 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration +## 1.18.3-next.1 + +### Patch Changes + +- fb029b6: Updated luxon types +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 1.18.3-next.0 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 41eeb67e06..f984c2b249 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.18.3-next.0", + "version": "1.18.3-next.1", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 36723eaecf..d9fe8257fe 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/repo-tools +## 0.16.1-next.2 + +### Patch Changes + +- 2bae83a: Bump `@microsoft/api-documenter` and `@microsoft/api-extractor` to latest versions. +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/cli-node@0.2.16-next.1 + - @backstage/errors@1.2.7 + ## 0.16.1-next.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 8fb56a229a..95e29cb3f6 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.16.1-next.1", + "version": "0.16.1-next.2", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 455f18d38f..63fe804a80 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,25 @@ # techdocs-cli-embedded-app +## 0.2.115-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/cli@0.35.0-next.2 + - @backstage/plugin-techdocs@1.16.1-next.2 + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/test-utils@1.7.14-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/ui@0.10.0-next.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + ## 0.2.115-next.1 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index a8a3ba85f4..b0018e634f 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.115-next.1", + "version": "0.2.115-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 7ab69cbd97..32d6ad189e 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,17 @@ # @techdocs/cli +## 1.10.3-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-techdocs-node@1.13.10-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + ## 1.10.3-next.1 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index d8aff1bc89..fae5187156 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.10.3-next.1", + "version": "1.10.3-next.2", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 7db04d494c..a5b01fb068 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-api-docs +## 0.13.2-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-react@0.4.39-next.0 + ## 0.13.2-next.0 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index e8f7392e87..225e329d36 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.13.2-next.0", + "version": "0.13.2-next.1", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index c28c59c78c..f4df39b170 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-app-backend +## 0.5.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-app-node@0.1.40-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.5.9-next.0 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index d41dea1880..d30770d3c3 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-backend", - "version": "0.5.9-next.0", + "version": "0.5.9-next.1", "description": "A Backstage backend plugin that serves the Backstage frontend app", "backstage": { "role": "backend-plugin", diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index 1f1f124d16..3971b0ed54 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-app-node +## 0.1.40-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + ## 0.1.40-next.0 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 77049a44c4..1583d90e57 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-node", - "version": "0.1.40-next.0", + "version": "0.1.40-next.1", "description": "Node.js library for the app plugin", "backstage": { "role": "node-library", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index 0e84389ecd..351479a54f 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-app +## 0.3.3-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- f7bc228: Support to set `defaultLanguage` and `availableLanguages` for the app language API in the new frontend system +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.39-next.0 + ## 0.3.3-next.0 ### Patch Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index 8a87cae63e..a531c5b450 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.3.3-next.0", + "version": "0.3.3-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md index 29cb492841..ec89692a85 100644 --- a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-atlassian-provider +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json index 6edf029908..d22ebf0b1a 100644 --- a/plugins/auth-backend-module-atlassian-provider/package.json +++ b/plugins/auth-backend-module-atlassian-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-atlassian-provider", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "description": "The atlassian-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md index 9e73851696..7e3db38938 100644 --- a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-auth0-provider +## 0.2.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-auth0-provider/package.json b/plugins/auth-backend-module-auth0-provider/package.json index bd1dacce32..6e9293d944 100644 --- a/plugins/auth-backend-module-auth0-provider/package.json +++ b/plugins/auth-backend-module-auth0-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-auth0-provider", - "version": "0.2.10-next.0", + "version": "0.2.10-next.1", "description": "The auth0-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md index afea70a08b..6207a3cfbf 100644 --- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-aws-alb-provider +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json index d1776aca35..48dee6b124 100644 --- a/plugins/auth-backend-module-aws-alb-provider/package.json +++ b/plugins/auth-backend-module-aws-alb-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-aws-alb-provider", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "description": "The aws-alb provider module for the Backstage auth backend.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md index 9464f4ce1d..3d139b57cd 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-azure-easyauth-provider +## 0.2.15-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-azure-easyauth-provider/package.json b/plugins/auth-backend-module-azure-easyauth-provider/package.json index f48ac8d234..66f7094031 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/package.json +++ b/plugins/auth-backend-module-azure-easyauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-azure-easyauth-provider", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "description": "The azure-easyauth-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md index f4cb03f95e..12bd0a13dc 100644 --- a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-bitbucket-provider +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json index 1131d0278c..7f43a93502 100644 --- a/plugins/auth-backend-module-bitbucket-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-provider", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "The bitbucket-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md index c29d1ef826..8c0df56cb1 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-bitbucket-server-provider +## 0.2.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-server-provider/package.json b/plugins/auth-backend-module-bitbucket-server-provider/package.json index 9d410e8da0..576ca6f925 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-server-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-server-provider", - "version": "0.2.10-next.0", + "version": "0.2.10-next.1", "description": "The bitbucket-server-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md index b7928bd822..7de1d06be6 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-cloudflare-access-provider +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json index 3b1a38f544..2d524f8741 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/package.json +++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-cloudflare-access-provider", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "description": "The cloudflare-access-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index 7fc1271072..155c616491 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index 99596dea0e..69b224a9c6 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "description": "A GCP IAP auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index 23bb42eac1..d81802fd50 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 28a9404ef3..1cdc217126 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "The github-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index 0cf1db7128..9c3e318c71 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index ee06982336..5ea1d2ccf6 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "The gitlab-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 6c21b76fef..77976afe3f 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index c0d04e491c..ce142af63f 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "A Google auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-guest-provider/CHANGELOG.md b/plugins/auth-backend-module-guest-provider/CHANGELOG.md index 629e851ce9..ecf498d085 100644 --- a/plugins/auth-backend-module-guest-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-guest-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-guest-provider +## 0.2.15-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-guest-provider/package.json b/plugins/auth-backend-module-guest-provider/package.json index 5f129b83b9..03bd08d7e7 100644 --- a/plugins/auth-backend-module-guest-provider/package.json +++ b/plugins/auth-backend-module-guest-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-guest-provider", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "description": "The guest-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md index 4353509f9c..b8d865d182 100644 --- a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-microsoft-provider +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json index 9b7209cc2c..c0b0ebc89d 100644 --- a/plugins/auth-backend-module-microsoft-provider/package.json +++ b/plugins/auth-backend-module-microsoft-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-microsoft-provider", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "The microsoft-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index dc10e9a4f8..5804fe281b 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index d7c1c62aea..2b09f84a3e 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "description": "The oauth2-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md index c791003a0f..f0b86176d3 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-oauth2-proxy-provider +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/package.json b/plugins/auth-backend-module-oauth2-proxy-provider/package.json index c6d4fbe77d..9df99d1a01 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/package.json +++ b/plugins/auth-backend-module-oauth2-proxy-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "description": "The oauth2-proxy-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md index 50c0e98d58..bea755da76 100644 --- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-auth-backend-module-oidc-provider +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json index 5bc7a04766..288e43ed90 100644 --- a/plugins/auth-backend-module-oidc-provider/package.json +++ b/plugins/auth-backend-module-oidc-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oidc-provider", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "description": "The oidc-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-okta-provider/CHANGELOG.md b/plugins/auth-backend-module-okta-provider/CHANGELOG.md index afeb13cdff..9035d60a6b 100644 --- a/plugins/auth-backend-module-okta-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-okta-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-okta-provider +## 0.2.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json index 048f6410e3..d6320355ee 100644 --- a/plugins/auth-backend-module-okta-provider/package.json +++ b/plugins/auth-backend-module-okta-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-okta-provider", - "version": "0.2.10-next.0", + "version": "0.2.10-next.1", "description": "The okta-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md index 2a201b6a23..8a8c58b644 100644 --- a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-onelogin-provider +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-onelogin-provider/package.json b/plugins/auth-backend-module-onelogin-provider/package.json index ada908ed07..f2056e8062 100644 --- a/plugins/auth-backend-module-onelogin-provider/package.json +++ b/plugins/auth-backend-module-onelogin-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-onelogin-provider", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "The onelogin-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-openshift-provider/CHANGELOG.md b/plugins/auth-backend-module-openshift-provider/CHANGELOG.md index 88fd02d73e..85212d8896 100644 --- a/plugins/auth-backend-module-openshift-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-openshift-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-openshift-provider +## 0.1.3-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-openshift-provider/package.json b/plugins/auth-backend-module-openshift-provider/package.json index 1c1d23639b..e60b0cf0cd 100644 --- a/plugins/auth-backend-module-openshift-provider/package.json +++ b/plugins/auth-backend-module-openshift-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-openshift-provider", - "version": "0.1.3-next.0", + "version": "0.1.3-next.1", "description": "The OpenShift backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md index 86429f1b56..7dc93b5450 100644 --- a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-pinniped-provider +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json index a855298b92..4b4473fadd 100644 --- a/plugins/auth-backend-module-pinniped-provider/package.json +++ b/plugins/auth-backend-module-pinniped-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-pinniped-provider", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "The pinniped-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md index 2535bd1e87..fc915370ad 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-vmware-cloud-provider +## 0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + ## 0.5.10-next.0 ### Patch Changes diff --git a/plugins/auth-backend-module-vmware-cloud-provider/package.json b/plugins/auth-backend-module-vmware-cloud-provider/package.json index 36dc189e5a..93e953897f 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/package.json +++ b/plugins/auth-backend-module-vmware-cloud-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider", - "version": "0.5.10-next.0", + "version": "0.5.10-next.1", "description": "The vmware-cloud-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 04752f4432..96f12f68d3 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-auth-backend +## 0.25.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.25.7-next.0 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index c556f93de1..3f2a86a654 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.25.7-next.0", + "version": "0.25.7-next.1", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 7cf9a43e21..4168ce3284 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-auth-node +## 0.6.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- e9dd634: fix flawed cookie removal logic with chunked tokens +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.6.10-next.0 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index a1154b7bbc..d74c83e426 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.6.10-next.0", + "version": "0.6.10-next.1", "backstage": { "role": "node-library", "pluginId": "auth", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index b720e047e8..d42c4e06b6 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.4.18-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 61ce045f5a..c73960b473 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.4.18-next.1", + "version": "0.4.18-next.2", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 88e6e91ca1..c5956021fe 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.3.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.3.12-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index bea8d358d7..23ad359d21 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.3.12-next.0", + "version": "0.3.12-next.1", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md index 001bb8c816..3bf19b22da 100644 --- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-backstage-openapi +## 0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.5.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index 5045026df4..3dfa270e86 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-backstage-openapi", - "version": "0.5.9-next.0", + "version": "0.5.9-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index e34fb75316..951cd48ace 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.5.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-bitbucket-cloud-common@0.3.5-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.5.6-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 02b677cffb..d91f41cb8f 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.5.6-next.0", + "version": "0.5.6-next.1", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 96c75fb09d..7aba4e8a30 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.5.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.5.6-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 c026aaa869..f94d7c87d7 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.5.6-next.0", + "version": "0.5.6-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index f660d65434..f5b00f9d06 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.3.15-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index d50fa3baeb..bb7c0a200e 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.3.15-next.1", + "version": "0.3.15-next.2", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index d1493a5d34..dc2c9d7a4d 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.3.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index dbf1929bc8..6a49d35277 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.3.9-next.0", + "version": "0.3.9-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gitea/CHANGELOG.md b/plugins/catalog-backend-module-gitea/CHANGELOG.md index 0e3ec28314..11f4ff7cc3 100644 --- a/plugins/catalog-backend-module-gitea/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gitea +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.1.7-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitea/package.json b/plugins/catalog-backend-module-gitea/package.json index f4dacc1e06..d80ddb806f 100644 --- a/plugins/catalog-backend-module-gitea/package.json +++ b/plugins/catalog-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitea", - "version": "0.1.7-next.0", + "version": "0.1.7-next.1", "license": "Apache-2.0", "description": "The gitea backend module for the catalog plugin.", "main": "src/index.ts", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index bcd7ad1a94..2c7acb8b3e 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-backend-module-github@0.11.3-next.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.3.17-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index 1f9f085dcb..0d871749ea 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.3.17-next.1", + "version": "0.3.17-next.2", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 8362bf651c..2247087317 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-github +## 0.11.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.11.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 8fc3f9f919..cbd57f1568 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.11.3-next.1", + "version": "0.11.3-next.2", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index c7cb44a75f..1f9bc5035d 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-catalog-backend-module-gitlab@0.7.6-next.1 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index 1ecdd6b91d..12d6b52425 100644 --- a/plugins/catalog-backend-module-gitlab-org/package.json +++ b/plugins/catalog-backend-module-gitlab-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab-org", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "The gitlab-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index e4a8799928..9736abe90b 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.7.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.7.6-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 28838904cd..37edb7bb1a 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", - "version": "0.7.6-next.0", + "version": "0.7.6-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 3d29535081..d2cd96a4b1 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.7.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- fb029b6: Updated luxon types +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + ## 0.7.7-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 07559d6d01..875d3c3d9e 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.7.7-next.0", + "version": "0.7.7-next.1", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 2dbc7cdfa1..9e4cca6cc4 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.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.12.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 4ed1c23ed5..abf0717679 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", - "version": "0.12.1-next.0", + "version": "0.12.1-next.1", "description": "A Backstage catalog backend module that helps integrate towards LDAP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-logs/CHANGELOG.md b/plugins/catalog-backend-module-logs/CHANGELOG.md index 213138f4de..ffcf0a98ba 100644 --- a/plugins/catalog-backend-module-logs/CHANGELOG.md +++ b/plugins/catalog-backend-module-logs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-logs +## 0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.2.1-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-logs/package.json b/plugins/catalog-backend-module-logs/package.json index 581467311a..2b4fd92c73 100644 --- a/plugins/catalog-backend-module-logs/package.json +++ b/plugins/catalog-backend-module-logs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-logs", - "version": "0.1.17-next.0", + "version": "0.1.17-next.1", "description": "A module that subscribes to catalog related events and logs them.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 51433c91c1..7354d45c76 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.8.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.8.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 5a4161ae1f..9b87318300 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", - "version": "0.8.3-next.0", + "version": "0.8.3-next.1", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 3fd5040a18..af02b2a7dc 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.2.17-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index a32778dfe4..47ea21295f 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.17-next.0", + "version": "0.2.17-next.1", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index ef31a1fa75..01df77b6e7 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.2.17-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 218d037800..baaa9b1adb 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", - "version": "0.2.17-next.0", + "version": "0.2.17-next.1", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index fd98e743c2..490700d5f4 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index bec61b7a20..c01c22cad6 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index bb501f7c31..fb3d3f57a4 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.6.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + - @backstage/plugin-permission-common@0.9.3 + ## 0.6.7-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index fcb5d57809..d0185c8a6d 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", - "version": "0.6.7-next.1", + "version": "0.6.7-next.2", "description": "Backstage Catalog module to view unprocessed entities", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 2ab123b03f..fee155e596 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-backend +## 3.2.1-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + ## 3.2.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 508299734f..04676121a8 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "3.2.1-next.0", + "version": "3.2.1-next.1", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 759f4fbb7c..7cb4eb28b4 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-graph +## 0.5.4-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/types@1.2.2 + ## 0.5.4-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index fb28ba1a27..ff97c60d76 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.5.4-next.0", + "version": "0.5.4-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 018df720cd..018b9e4cee 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-node +## 1.20.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-common@0.9.3 + ## 1.20.1-next.0 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index d083c08d34..28ee49c7a0 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-node", - "version": "1.20.1-next.0", + "version": "1.20.1-next.1", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", "backstage": { "role": "node-library", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 8d0b154915..6a033f0865 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-react +## 1.21.4-next.2 + +### Patch Changes + +- b3c0594: Use a versioned context for `useEntityList`, to better work with mixed `@backstage/plugin-catalog-react` versions. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.5-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-test-utils@0.4.2-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-react@0.4.39-next.0 + ## 1.21.4-next.1 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 013d1e7629..ee8e8757f6 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.21.4-next.1", + "version": "1.21.4-next.2", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 32dd520819..9215ba537c 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog +## 1.32.1-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- 91f5ed8: Fixed `catalogAboutEntityCard` to filter icon links before calling useProps(), preventing side effects from hooks in filtered-out links +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.5-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + ## 1.32.1-next.0 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 3901b11b29..c0c851469a 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.32.1-next.0", + "version": "1.32.1-next.1", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index d1ae56ddac..8c3d629ba4 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-devtools-backend +## 0.5.12-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config-loader@1.10.7-next.1 + - @backstage/cli-common@0.1.16-next.2 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.19 + - @backstage/plugin-permission-common@0.9.3 + ## 0.5.12-next.0 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index ff47940175..0102e18257 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.5.12-next.0", + "version": "0.5.12-next.1", "backstage": { "role": "backend-plugin", "pluginId": "devtools", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index d3eacfee63..a59e6f1e02 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.4.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + ## 0.4.18-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 49d0ef0b3a..1c508d16ff 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.4.18-next.0", + "version": "0.4.18-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index b176789833..37f58155ab 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.2.27-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 51e79601c4..867e125f2c 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.2.27-next.0", + "version": "0.2.27-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 29a9194bd7..3a4f98290f 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.2.27-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 927e8b4ca0..99e9b66935 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.2.27-next.0", + "version": "0.2.27-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-server/CHANGELOG.md b/plugins/events-backend-module-bitbucket-server/CHANGELOG.md index 1c6b8d868c..a268c0c0f1 100644 --- a/plugins/events-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-server +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-server/package.json b/plugins/events-backend-module-bitbucket-server/package.json index b57f83a078..30bc81d2a7 100644 --- a/plugins/events-backend-module-bitbucket-server/package.json +++ b/plugins/events-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-server", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index bff39866a7..892ddfe843 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.2.27-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 2fbe20a9eb..c4e83055c6 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.2.27-next.0", + "version": "0.2.27-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 21f89ab3e2..987cea1db4 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-github +## 0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + ## 0.4.7-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 18489fe655..34300e178f 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.4.7-next.0", + "version": "0.4.7-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index f819a5918c..e63ac21b11 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + ## 0.3.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index ce1a568cd8..b328f09bb8 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.3.8-next.0", + "version": "0.3.8-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-google-pubsub/CHANGELOG.md b/plugins/events-backend-module-google-pubsub/CHANGELOG.md index dc8d774d47..624d76c284 100644 --- a/plugins/events-backend-module-google-pubsub/CHANGELOG.md +++ b/plugins/events-backend-module-google-pubsub/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-google-pubsub +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.1.7-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-google-pubsub/package.json b/plugins/events-backend-module-google-pubsub/package.json index 359c97c7f8..9f06b4db63 100644 --- a/plugins/events-backend-module-google-pubsub/package.json +++ b/plugins/events-backend-module-google-pubsub/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-google-pubsub", - "version": "0.1.7-next.0", + "version": "0.1.7-next.1", "description": "The google-pubsub backend module for the events plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/events-backend-module-kafka/CHANGELOG.md b/plugins/events-backend-module-kafka/CHANGELOG.md index 5cd64af42d..a74c0aa187 100644 --- a/plugins/events-backend-module-kafka/CHANGELOG.md +++ b/plugins/events-backend-module-kafka/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-kafka +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-kafka/package.json b/plugins/events-backend-module-kafka/package.json index a24538a617..48ba679986 100644 --- a/plugins/events-backend-module-kafka/package.json +++ b/plugins/events-backend-module-kafka/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-kafka", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "description": "The kafka backend module for the events plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 8663b0707b..6023351a5d 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-events-backend +## 0.5.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.5.9-next.0 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index db9f5c9c72..fce8d33ddf 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.5.9-next.0", + "version": "0.5.9-next.1", "backstage": { "role": "backend-plugin", "pluginId": "events", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 7ed7f0afb1..02eb3b07ba 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-node +## 0.4.18-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.4.18-next.0 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 156fb4b263..9e4ad5889f 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-node", - "version": "0.4.18-next.0", + "version": "0.4.18-next.1", "description": "The plugin-events-node module for @backstage/plugin-events-backend", "backstage": { "role": "node-library", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 411e010d16..c73992d349 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list-backend +## 1.0.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + ## 1.0.46-next.0 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 4a8e2748c2..b5dabde1e7 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.46-next.0", + "version": "1.0.46-next.1", "backstage": { "role": "backend-plugin", "pluginId": "todo-list", diff --git a/plugins/gateway-backend/CHANGELOG.md b/plugins/gateway-backend/CHANGELOG.md index fe3719d120..cdda4ba64f 100644 --- a/plugins/gateway-backend/CHANGELOG.md +++ b/plugins/gateway-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-gateway-backend +## 1.1.1-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 1.1.1-next.0 ### Patch Changes diff --git a/plugins/gateway-backend/package.json b/plugins/gateway-backend/package.json index 7d5bd658e1..c70ad78a09 100644 --- a/plugins/gateway-backend/package.json +++ b/plugins/gateway-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gateway-backend", - "version": "1.1.1-next.0", + "version": "1.1.1-next.1", "backstage": { "role": "backend-plugin", "pluginId": "gateway", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 6da0bf0084..48857f74d4 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-home-react +## 0.1.33-next.1 + +### Patch Changes + +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/core-components@0.18.4-next.2 + - @backstage/core-plugin-api@1.12.1-next.0 + ## 0.1.33-next.0 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index f94413ca64..7eec7e630c 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-react", - "version": "0.1.33-next.0", + "version": "0.1.33-next.1", "description": "A Backstage plugin that contains react components helps you build a home page", "backstage": { "role": "web-library", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 29d73e946a..e5f243bf4a 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-home +## 0.8.15-next.1 + +### Patch Changes + +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home-react@0.1.33-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/theme@0.7.1-next.0 + ## 0.8.15-next.0 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 01c0c5bb40..36ff21769a 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.8.15-next.0", + "version": "0.8.15-next.1", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 888354fa2e..1f54767a13 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-kubernetes-backend +## 0.21.0-next.2 + +### Minor Changes + +- 7f9846f: Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- fb029b6: Updated luxon types +- Updated dependencies + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/plugin-kubernetes-node@0.4.0-next.2 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + - @backstage/plugin-permission-common@0.9.3 + ## 0.20.5-next.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index a4cb8e924a..79ef93c0a2 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.20.5-next.1", + "version": "0.21.0-next.2", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index f61279e01b..7136e5d3e1 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.32-next.2 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + - @backstage/plugin-kubernetes-react@0.5.14-next.1 + - @backstage/plugin-permission-react@0.4.39-next.0 + ## 0.0.32-next.1 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index f5f67971f9..18897c6ba1 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.32-next.1", + "version": "0.0.32-next.2", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index d3f12c3c7d..79f922532f 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes-node +## 0.4.0-next.2 + +### Minor Changes + +- 7f9846f: Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.9-next.0 + ## 0.3.7-next.1 ### Patch Changes diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 9796e05212..5dfc49b66c 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-node", - "version": "0.3.7-next.1", + "version": "0.4.0-next.2", "description": "Node.js library for the kubernetes plugin", "backstage": { "role": "node-library", diff --git a/plugins/mcp-actions-backend/CHANGELOG.md b/plugins/mcp-actions-backend/CHANGELOG.md index 78341c0273..f5a0738405 100644 --- a/plugins/mcp-actions-backend/CHANGELOG.md +++ b/plugins/mcp-actions-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-mcp-actions-backend +## 0.1.6-next.1 + +### Patch Changes + +- e83e038: Added `@cfworker/json-schema` as a dependency to this package part of the `@modelcontextprotocol/sdk` bump as it's required in the types +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index 2903b51631..5a19fe1c46 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mcp-actions-backend", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "backstage": { "role": "backend-plugin", "pluginId": "mcp-actions", diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index feade91398..9a479822c1 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-notifications-backend-module-email +## 0.3.17-next.1 + +### Patch Changes + +- b267aea: Updated dependency `@types/nodemailer` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.19 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index e62ae5e92f..a4e0957c23 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.3.17-next.0", + "version": "0.3.17-next.1", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend-module-slack/CHANGELOG.md b/plugins/notifications-backend-module-slack/CHANGELOG.md index 9000ef2203..38c740cb4b 100644 --- a/plugins/notifications-backend-module-slack/CHANGELOG.md +++ b/plugins/notifications-backend-module-slack/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-notifications-backend-module-slack +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + ## 0.2.2-next.0 ### Patch Changes diff --git a/plugins/notifications-backend-module-slack/package.json b/plugins/notifications-backend-module-slack/package.json index 9cb2486d3e..86a60c88bf 100644 --- a/plugins/notifications-backend-module-slack/package.json +++ b/plugins/notifications-backend-module-slack/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-slack", - "version": "0.2.2-next.0", + "version": "0.2.2-next.1", "description": "The slack backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index 7ae71e5b23..e52d81afc0 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-notifications-backend +## 0.6.1-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + ## 0.6.1-next.0 ### Patch Changes diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index 5e50a6b787..d2df0faf9b 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.6.1-next.0", + "version": "0.6.1-next.1", "backstage": { "role": "backend-plugin", "pluginId": "notifications", diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md index 97cd9b2585..bd74b53be2 100644 --- a/plugins/notifications-node/CHANGELOG.md +++ b/plugins/notifications-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-notifications-node +## 0.2.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.0 + ## 0.2.22-next.0 ### Patch Changes diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json index 25d7b2f9ca..529e7904a4 100644 --- a/plugins/notifications-node/package.json +++ b/plugins/notifications-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-node", - "version": "0.2.22-next.0", + "version": "0.2.22-next.1", "description": "Node.js library for the notifications plugin", "backstage": { "role": "node-library", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 3bc994dcfe..bbf64740b8 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-org +## 0.6.47-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-catalog-common@1.1.7 + ## 0.6.47-next.0 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 09e801d7be..340f6a3773 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.47-next.0", + "version": "0.6.47-next.1", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index ec8e371159..3296f8b846 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-permission-common@0.9.3 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index 1d4c5af43c..65d806f37e 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "description": "Allow all policy backend module for the permission plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 4b63ed405c..3df4344b18 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-permission-backend +## 0.7.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + ## 0.7.7-next.0 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 5e599c2d3b..da36d835a9 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.7.7-next.0", + "version": "0.7.7-next.1", "backstage": { "role": "backend-plugin", "pluginId": "permission", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 4594d38882..213b9f24f3 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-node +## 0.10.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + ## 0.10.7-next.0 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 3384aa7524..b222eb63cd 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-node", - "version": "0.10.7-next.0", + "version": "0.10.7-next.1", "description": "Common permission and authorization utilities for backend plugins", "backstage": { "role": "node-library", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 8bb9e73f52..04cdca7611 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-proxy-backend +## 0.6.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-proxy-node@0.1.11-next.1 + ## 0.6.9-next.0 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 331ea354c2..c408692f3d 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-backend", - "version": "0.6.9-next.0", + "version": "0.6.9-next.1", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", "backstage": { "role": "backend-plugin", diff --git a/plugins/proxy-node/CHANGELOG.md b/plugins/proxy-node/CHANGELOG.md index 12abd91157..6388858064 100644 --- a/plugins/proxy-node/CHANGELOG.md +++ b/plugins/proxy-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-proxy-node +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/proxy-node/package.json b/plugins/proxy-node/package.json index 4ac4d1fe96..3e786060b5 100644 --- a/plugins/proxy-node/package.json +++ b/plugins/proxy-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-node", - "version": "0.1.11-next.0", + "version": "0.1.11-next.1", "description": "The plugin-proxy-node module for @backstage/plugin-proxy-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index f1984afffd..96198a8eb7 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index ff47d56ed1..a854181873 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index 3238b13b21..f8c8771f7d 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-bitbucket-cloud-common@0.3.5-next.0 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index 7c44716291..dc0a41490b 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index d533bb63f4..761be5b8ed 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.16-next.1 + +### Patch Changes + +- 5a6aca2: Improve error message when provided target branch is missing +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 3590b4112a..c5c1c0c8ed 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index 56c67b9a14..337b24d4be 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.16-next.1 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index 4516920aa7..d2720727d7 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.3.17-next.0", + "version": "0.3.17-next.1", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index db8919e652..eaa585eef1 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.3.16-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 ada64e8f9c..9a4172f9c4 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.16-next.0", + "version": "0.3.16-next.1", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 4f600fc7b0..1307d6a5e9 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.3.18-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 64fb9236af..91310eb1ba 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.18-next.0", + "version": "0.3.18-next.1", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index ab185367bc..cda0bf51f5 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index c9a954831e..fd100111cb 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index 26696b6452..c9330fa586 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index 07592568ca..644b7fca64 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index d3a913d054..94e70ce3f8 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index 99e2c05f86..8a6baf517a 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index 46ec5e751d..a00a5a058f 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.9.3-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index f22f9a3741..a57a96432e 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.9.3-next.0", + "version": "0.9.3-next.1", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index a22e1d71bf..33fb7194a1 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.11.0-next.1 + +### Minor Changes + +- f2d034b: In the `gitlabRepoPush` action, add 'auto' possibility for `commitAction` input. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.10.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 21786474e2..367c13d3e7 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.10.1-next.0", + "version": "0.11.0-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index 584f2bcc7d..59f47d7b4d 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-notifications-node@0.2.22-next.1 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 64bd96badb..b9602f3434 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.17-next.0", + "version": "0.1.17-next.1", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index e6e17558b3..42edca5af2 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.16-next.1 + +### Patch Changes + +- 2bae83a: Bumped dev dependencies `@types/node` +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.5.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 2ae26dd016..d197cdefbe 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.16-next.0", + "version": "0.5.16-next.1", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 8fbec8e18b..400474d985 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.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.2.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index a012921907..007b31ac46 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.2.16-next.0", + "version": "0.2.16-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 2c436729f9..bc8d43c5ea 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.4.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + - @backstage/plugin-scaffolder-node-test-utils@0.3.6-next.1 + ## 0.4.17-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 66e1342a8e..855489615e 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.4.17-next.0", + "version": "0.4.17-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index e9b0bdc5e7..f4e7e7debe 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-scaffolder-backend +## 3.1.0-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 2bae83a: Updated `isolated-vm` to `6.0.1` +- 25b560e: Internal change to support new versions of the `logform` library +- 1226647: Updated dependency `esbuild` to `^0.27.0`. +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.0-next.1 + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-bitbucket-cloud-common@0.3.5-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15-next.1 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.17-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.16-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.3-next.1 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 3.1.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index c3876a7926..04cf514359 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "3.1.0-next.0", + "version": "3.1.0-next.1", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 91fff5040d..47362fb401 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.10.2-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2-next.1 + ## 0.3.6-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index 3c79f30575..d081c42dc1 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.3.6-next.0", + "version": "0.3.6-next.1", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index a621739d50..ba1b53b67c 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-node +## 0.12.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + ## 0.12.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 995ae74b4b..ae8e75cec6 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.12.2-next.0", + "version": "0.12.2-next.1", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 552035d603..f30fe5d9e3 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder-react +## 1.19.4-next.2 + +### Patch Changes + +- fb029b6: Updated luxon types +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- 9b38f22: Updated dependency `use-immer` to `^0.11.0`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + ## 1.19.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 81a01f9229..e1c16d4766 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.19.4-next.1", + "version": "1.19.4-next.2", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 69554368b7..e4f60d5251 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-scaffolder +## 1.34.4-next.1 + +### Patch Changes + +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.2 + - @backstage/integration@1.18.3-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-scaffolder-common@1.7.4-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + ## 1.34.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 55302da959..5ad62724e3 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.34.4-next.0", + "version": "1.34.4-next.1", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 1d03a38610..caf5a08281 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-catalog +## 0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 0.3.11-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index d18fd312be..5443263128 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.3.11-next.0", + "version": "0.3.11-next.1", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 49f4c81608..cd8defb8bb 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.7.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.19 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 1.7.9-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 3b88035bf0..bb54cbd96d 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", - "version": "1.7.9-next.0", + "version": "1.7.9-next.1", "description": "A module for the search backend that implements search using ElasticSearch", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index 34e5e6c170..a4867f5c91 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-module-explore +## 0.3.10-next.1 + +### Patch Changes + +- 9b69262: Updated dependency `@backstage-community/plugin-explore-common` to `^0.9.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 812427c03c..8d0a93ed8b 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-explore", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "A module for the search backend that exports explore modules", "backstage": { "moved": "@backstage-community/plugin-search-backend-module-explore", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 243aad3628..3534805fb6 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.51-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 0.5.51-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 68195fae66..0d2a0b62ab 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-pg", - "version": "0.5.51-next.0", + "version": "0.5.51-next.1", "description": "A module for the search backend that implements search using PostgreSQL", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md index 41dcefb7e3..bf7ebfee3b 100644 --- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md +++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-stack-overflow-collator +## 0.3.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 0.3.16-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json index 4cba0f4a68..467f1b44e5 100644 --- a/plugins/search-backend-module-stack-overflow-collator/package.json +++ b/plugins/search-backend-module-stack-overflow-collator/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-stack-overflow-collator", - "version": "0.3.16-next.0", + "version": "0.3.16-next.1", "description": "A module for the search backend that exports stack overflow modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 3dd94ff352..1a13d347bb 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.13.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1-next.1 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 0.4.9-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index e195cb09c9..99cdd4c21e 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", - "version": "0.4.9-next.0", + "version": "0.4.9-next.1", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 86a763ad93..6df657c83d 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-node +## 1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-common@1.2.21 + ## 1.4.0-next.0 ### Minor Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index bc96651e9b..ee679be575 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-node", - "version": "1.4.0-next.0", + "version": "1.4.0-next.1", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", "backstage": { "role": "node-library", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index d26dd70831..e8c9fcfefd 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-search-backend +## 2.0.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + ## 2.0.9-next.0 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index d8ffc4a309..44e6bad708 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "2.0.9-next.0", + "version": "2.0.9-next.1", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 789e9b2603..017baea2e3 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search +## 1.5.1-next.1 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + ## 1.5.1-next.0 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 794178d870..4e305eb9cb 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.5.1-next.0", + "version": "1.5.1-next.1", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals-backend/CHANGELOG.md b/plugins/signals-backend/CHANGELOG.md index 778eedd8e0..188b7e1ba4 100644 --- a/plugins/signals-backend/CHANGELOG.md +++ b/plugins/signals-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-signals-backend +## 0.3.11-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + ## 0.3.11-next.0 ### Patch Changes diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index 16e84637bd..080fd73c2b 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-backend", - "version": "0.3.11-next.0", + "version": "0.3.11-next.1", "backstage": { "role": "backend-plugin", "pluginId": "signals", diff --git a/plugins/signals-node/CHANGELOG.md b/plugins/signals-node/CHANGELOG.md index 4d963038a4..8225fe5587 100644 --- a/plugins/signals-node/CHANGELOG.md +++ b/plugins/signals-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-signals-node +## 0.1.27-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + ## 0.1.27-next.0 ### Patch Changes diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json index 3727d3de12..6c4c4f7ffe 100644 --- a/plugins/signals-node/package.json +++ b/plugins/signals-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-node", - "version": "0.1.27-next.0", + "version": "0.1.27-next.1", "description": "Node.js library for the signals plugin", "backstage": { "role": "node-library", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 97fe3bdab4..46bbd1df35 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-backend +## 2.1.3-next.2 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 2bae83a: Corrected `ErrorCallback` type to work with Node 22 types +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-techdocs-node@1.13.10-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + ## 2.1.3-next.1 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 9580ed2326..62d1e82240 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "2.1.3-next.1", + "version": "2.1.3-next.2", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 6a6b95c922..c05eadf12a 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-node +## 1.13.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 703f8c0: There was an issue in the uploading of large size files to the AWS S3. We have modified the logic by adding retry along with multipart uploading functionality. +- Updated dependencies + - @backstage/integration@1.18.3-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.19 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.13.10-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 4752dc65c5..3b3d3f9539 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.13.10-next.0", + "version": "1.13.10-next.1", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 2aaf6459f0..5d15b4a023 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs +## 1.16.1-next.2 + +### Patch Changes + +- f3f84f1: Minor extension type updates after frontend API bump +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/integration@1.18.3-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + ## 1.16.1-next.1 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 7870dd71f3..ac3917eeae 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.16.1-next.1", + "version": "1.16.1-next.2", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 57d1f676c4..dcca2b7ae7 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-user-settings-backend +## 0.3.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-signals-node@0.1.27-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.3.9-next.0 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 4a744fca45..6549870a80 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings-backend", - "version": "0.3.9-next.0", + "version": "0.3.9-next.1", "description": "The Backstage backend plugin to manage user settings", "backstage": { "role": "backend-plugin", From 6a552b389ae5f48fea3110b50ac9b572b0baa8d8 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 11:14:52 -0800 Subject: [PATCH 285/312] Update plugins/devtools/config.d.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: williamwu-mongodb --- plugins/devtools/config.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/devtools/config.d.ts b/plugins/devtools/config.d.ts index 4a22aa15a3..841bb0b042 100644 --- a/plugins/devtools/config.d.ts +++ b/plugins/devtools/config.d.ts @@ -14,12 +14,12 @@ * limitations under the License. */ export interface Config { - devTools: { + devTools?: { /** * Scheduled tasks configuration * @visibility frontend */ - scheduledTasks: { + scheduledTasks?: { /** * A list of plugin IDs to select from, e.g. ['catalog', 'scaffolder'] * @visibility frontend From ef961b22997e1934ced1f5bc80c21611c61eba9e Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 11:15:02 -0800 Subject: [PATCH 286/312] Update .changeset/short-lizards-find.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: williamwu-mongodb --- .changeset/short-lizards-find.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/short-lizards-find.md b/.changeset/short-lizards-find.md index 01ce36afb7..6b0a307d61 100644 --- a/.changeset/short-lizards-find.md +++ b/.changeset/short-lizards-find.md @@ -1,6 +1,6 @@ --- -'@backstage/plugin-devtools-common': minor -'@backstage/plugin-devtools': minor +'@backstage/plugin-devtools-common': patch +'@backstage/plugin-devtools': patch --- Added scheduled tasks UI feature for the DevTools plugin From c89d74b7633415396555226793a32e2f45e25ee7 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 12:05:21 -0800 Subject: [PATCH 287/312] address feedback Signed-off-by: williamwu-mongodb --- plugins/devtools-common/package.json | 15 ++++ plugins/devtools-common/report-alpha.api.md | 69 +++++++++++++++++++ plugins/devtools-common/report.api.md | 60 ---------------- plugins/devtools-common/src/alpha.ts | 24 +++++++ plugins/devtools-common/src/index.ts | 18 ++++- plugins/devtools-common/src/permissions.ts | 6 +- plugins/devtools-common/src/types.ts | 6 +- plugins/devtools/report.api.md | 2 +- plugins/devtools/src/api/DevToolsApi.ts | 4 +- plugins/devtools/src/api/DevToolsClient.ts | 4 +- .../ScheduledTaskDetailedPanel.tsx | 2 +- .../ScheduledTasksContent.tsx | 48 +++++++++---- .../DefaultDevToolsPage.tsx | 3 +- 13 files changed, 173 insertions(+), 88 deletions(-) create mode 100644 plugins/devtools-common/report-alpha.api.md create mode 100644 plugins/devtools-common/src/alpha.ts diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index c442185e14..4ae841206d 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -25,8 +25,23 @@ }, "license": "Apache-2.0", "sideEffects": false, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, "main": "src/index.ts", "types": "src/index.ts", + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "files": [ "dist" ], diff --git a/plugins/devtools-common/report-alpha.api.md b/plugins/devtools-common/report-alpha.api.md new file mode 100644 index 0000000000..3c3b7ff89e --- /dev/null +++ b/plugins/devtools-common/report-alpha.api.md @@ -0,0 +1,69 @@ +## API Report File for "@backstage/plugin-devtools-common" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BasicPermission } from '@backstage/plugin-permission-common'; +import { JsonObject } from '@backstage/types'; + +// @alpha (undocumented) +export const devToolsTaskSchedulerCreatePermission: BasicPermission; + +// @alpha (undocumented) +export const devToolsTaskSchedulerReadPermission: BasicPermission; + +// @alpha (undocumented) +export type ScheduledTasks = { + scheduledTasks?: TaskApiTasksResponse[]; + error?: string; +}; + +// @alpha +export interface TaskApiTasksResponse { + // (undocumented) + pluginId: string; + // (undocumented) + scope: 'global' | 'local'; + // (undocumented) + settings: { + version: number; + } & JsonObject; + // (undocumented) + taskId: string; + // (undocumented) + taskState: + | { + status: 'running'; + startedAt: string; + timesOutAt?: string; + lastRunError?: string; + lastRunEndedAt?: string; + } + | { + status: 'idle'; + startsAt?: string; + lastRunError?: string; + lastRunEndedAt?: string; + } + | null; + // (undocumented) + workerState: + | { + status: 'initial-wait'; + } + | { + status: 'idle'; + } + | { + status: 'running'; + } + | null; +} + +// @alpha (undocumented) +export type TriggerScheduledTask = { + error?: string; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/devtools-common/report.api.md b/plugins/devtools-common/report.api.md index 87abc3f397..25743fce7f 100644 --- a/plugins/devtools-common/report.api.md +++ b/plugins/devtools-common/report.api.md @@ -4,7 +4,6 @@ ```ts import { BasicPermission } from '@backstage/plugin-permission-common'; -import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; // @public (undocumented) @@ -45,12 +44,6 @@ export const devToolsInfoReadPermission: BasicPermission; // @public export const devToolsPermissions: BasicPermission[]; -// @public (undocumented) -export const devToolsTaskSchedulerCreatePermission: BasicPermission; - -// @public (undocumented) -export const devToolsTaskSchedulerReadPermission: BasicPermission; - // @public (undocumented) export type Endpoint = { name: string; @@ -90,57 +83,4 @@ export type PackageDependency = { name: string; versions: string; }; - -// @public (undocumented) -export type ScheduledTasks = { - scheduledTasks?: TaskApiTasksResponse[]; - error?: string; -}; - -// @public -export interface TaskApiTasksResponse { - // (undocumented) - pluginId: string; - // (undocumented) - scope: 'global' | 'local'; - // (undocumented) - settings: { - version: number; - } & JsonObject; - // (undocumented) - taskId: string; - // (undocumented) - taskState: - | { - status: 'running'; - startedAt: string; - timesOutAt?: string; - lastRunError?: string; - lastRunEndedAt?: string; - } - | { - status: 'idle'; - startsAt?: string; - lastRunError?: string; - lastRunEndedAt?: string; - } - | null; - // (undocumented) - workerState: - | { - status: 'initial-wait'; - } - | { - status: 'idle'; - } - | { - status: 'running'; - } - | null; -} - -// @public (undocumented) -export type TriggerScheduledTask = { - error?: string; -}; ``` diff --git a/plugins/devtools-common/src/alpha.ts b/plugins/devtools-common/src/alpha.ts new file mode 100644 index 0000000000..984967c4f3 --- /dev/null +++ b/plugins/devtools-common/src/alpha.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { + devToolsTaskSchedulerReadPermission, + devToolsTaskSchedulerCreatePermission, +} from './permissions'; +export type { + ScheduledTasks, + TaskApiTasksResponse, + TriggerScheduledTask, +} from './types'; diff --git a/plugins/devtools-common/src/index.ts b/plugins/devtools-common/src/index.ts index be7426394b..88bc0d545f 100644 --- a/plugins/devtools-common/src/index.ts +++ b/plugins/devtools-common/src/index.ts @@ -20,5 +20,19 @@ * @packageDocumentation */ -export * from './types'; -export * from './permissions'; +export type { + ConfigError, + ConfigInfo, + DevToolsInfo, + Endpoint, + ExternalDependency, + PackageDependency, +} from './types'; +export { ExternalDependencyStatus } from './types'; +export { + devToolsAdministerPermission, + devToolsConfigReadPermission, + devToolsExternalDependenciesReadPermission, + devToolsInfoReadPermission, + devToolsPermissions, +} from './permissions'; diff --git a/plugins/devtools-common/src/permissions.ts b/plugins/devtools-common/src/permissions.ts index 1fefb5027a..0c93c0ff2a 100644 --- a/plugins/devtools-common/src/permissions.ts +++ b/plugins/devtools-common/src/permissions.ts @@ -49,7 +49,7 @@ export const devToolsExternalDependenciesReadPermission = createPermission({ }); /** - * @public + * @alpha */ export const devToolsTaskSchedulerReadPermission = createPermission({ name: 'devtools.task-scheduler', @@ -57,7 +57,7 @@ export const devToolsTaskSchedulerReadPermission = createPermission({ }); /** - * @public + * @alpha */ export const devToolsTaskSchedulerCreatePermission = createPermission({ name: 'devtools.task-scheduler', @@ -74,6 +74,4 @@ export const devToolsPermissions = [ devToolsInfoReadPermission, devToolsConfigReadPermission, devToolsExternalDependenciesReadPermission, - devToolsTaskSchedulerReadPermission, - devToolsTaskSchedulerCreatePermission, ]; diff --git a/plugins/devtools-common/src/types.ts b/plugins/devtools-common/src/types.ts index 3b700f31ae..dc35188fde 100644 --- a/plugins/devtools-common/src/types.ts +++ b/plugins/devtools-common/src/types.ts @@ -88,7 +88,7 @@ export type ConfigError = { * This is a duplication of the below: * @see https://github.com/backstage/backstage/blob/master/packages/backend-defaults/src/entrypoints/scheduler/lib/types.ts * - * @public + * @alpha */ export interface TaskApiTasksResponse { taskId: string; @@ -123,13 +123,13 @@ export interface TaskApiTasksResponse { | null; } -/** @public */ +/** @alpha */ export type ScheduledTasks = { scheduledTasks?: TaskApiTasksResponse[]; error?: string; }; -/** @public */ +/** @alpha */ export type TriggerScheduledTask = { error?: string; }; diff --git a/plugins/devtools/report.api.md b/plugins/devtools/report.api.md index e4cfe7ddde..80297f299b 100644 --- a/plugins/devtools/report.api.md +++ b/plugins/devtools/report.api.md @@ -9,7 +9,7 @@ import { JSX as JSX_2 } from 'react/jsx-runtime'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { TabProps } from '@material-ui/core/Tab'; -import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha'; // @public (undocumented) export const ConfigContent: () => JSX_2.Element; diff --git a/plugins/devtools/src/api/DevToolsApi.ts b/plugins/devtools/src/api/DevToolsApi.ts index 4f58f013d4..4fc579ee06 100644 --- a/plugins/devtools/src/api/DevToolsApi.ts +++ b/plugins/devtools/src/api/DevToolsApi.ts @@ -19,9 +19,11 @@ import { ConfigInfo, DevToolsInfo, ExternalDependency, +} from '@backstage/plugin-devtools-common'; +import { ScheduledTasks, TriggerScheduledTask, -} from '@backstage/plugin-devtools-common'; +} from '@backstage/plugin-devtools-common/alpha'; export const devToolsApiRef = createApiRef({ id: 'plugin.devtools.service', diff --git a/plugins/devtools/src/api/DevToolsClient.ts b/plugins/devtools/src/api/DevToolsClient.ts index 5e13202099..cd4f53fa81 100644 --- a/plugins/devtools/src/api/DevToolsClient.ts +++ b/plugins/devtools/src/api/DevToolsClient.ts @@ -19,9 +19,11 @@ import { ConfigInfo, DevToolsInfo, ExternalDependency, +} from '@backstage/plugin-devtools-common'; +import { ScheduledTasks, TriggerScheduledTask, -} from '@backstage/plugin-devtools-common'; +} from '@backstage/plugin-devtools-common/alpha'; import { ResponseError } from '@backstage/errors'; import { DevToolsApi } from './DevToolsApi'; diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx index b26abca221..a29e1eb10e 100644 --- a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import Box from '@material-ui/core/Box'; diff --git a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx index 29822b90f9..2d4abd56ef 100644 --- a/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx +++ b/plugins/devtools/src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx @@ -22,18 +22,23 @@ import Tooltip from '@material-ui/core/Tooltip'; import Autocomplete from '@material-ui/lab/Autocomplete'; import TextField from '@material-ui/core/TextField'; import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; -import { Progress, Table, TableColumn } from '@backstage/core-components'; +import { + ErrorPanel, + Progress, + Table, + TableColumn, +} from '@backstage/core-components'; import Alert from '@material-ui/lab/Alert'; import { useScheduledTasks, useTriggerScheduledTask } from '../../../hooks'; -import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common'; +import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha'; import { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api'; import RefreshIcon from '@material-ui/icons/Refresh'; import NightsStay from '@material-ui/icons/NightsStay'; -import Error from '@material-ui/icons/Error'; +import ErrorIcon from '@material-ui/icons/Error'; import CircularProgress from '@material-ui/core/CircularProgress'; import { ScheduledTaskDetailPanel } from './ScheduledTaskDetailedPanel'; import { RequirePermission } from '@backstage/plugin-permission-react'; -import { devToolsTaskSchedulerCreatePermission } from '@backstage/plugin-devtools-common'; +import { devToolsTaskSchedulerCreatePermission } from '@backstage/plugin-devtools-common/alpha'; const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -141,7 +146,7 @@ export const ScheduledTasksContent = () => { return ( {rowData.taskState?.lastRunError && ( - + )} {rowData.taskId} @@ -197,11 +202,9 @@ export const ScheduledTasksContent = () => { { triggerTask(selectedPlugin, rowData.taskId); - if (isTriggering) { - ; - } if (triggerError) { alertApi.post({ message: `Error triggering task ${rowData.taskId}: ${error}`, @@ -252,11 +255,30 @@ export const ScheduledTasksContent = () => { {loading && } {error && ( - - The plugin ID "{selectedPlugin}" doesn't have any scheduled tasks or - may contain a typo. Please verify the plugin ID is correct and that - the plugin has registered scheduled tasks. - + + + The plugin ID "{selectedPlugin}" doesn't have any scheduled tasks or + may contain a typo. + + + Please verify: + +
    +
  • + + The plugin ID is spelled correctly + +
  • +
  • + + The plugin has registered scheduled tasks + +
  • +
+
)} {!loading && !error && ( diff --git a/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx b/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx index 11cba0213b..d706fe44e7 100644 --- a/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx +++ b/plugins/devtools/src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx @@ -17,9 +17,8 @@ import { devToolsConfigReadPermission, devToolsInfoReadPermission, - devToolsTaskSchedulerReadPermission, } from '@backstage/plugin-devtools-common'; - +import { devToolsTaskSchedulerReadPermission } from '@backstage/plugin-devtools-common/alpha'; import { ConfigContent } from '../Content/ConfigContent'; import { DevToolsLayout } from '../DevToolsLayout'; import { InfoContent } from '../Content/InfoContent'; From d76c3261437b478190e935b9d741767287a5f5e7 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 12:45:34 -0800 Subject: [PATCH 288/312] repo fix Signed-off-by: williamwu-mongodb --- plugins/devtools-common/package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index 4ae841206d..cc03b91103 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -12,10 +12,7 @@ ] }, "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "module": "dist/index.esm.js", - "types": "dist/index.d.ts" + "access": "public" }, "homepage": "https://backstage.io", "repository": { From 02b0071484b32322f606b5c07b78dcd1f93d0a41 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 12:54:21 -0800 Subject: [PATCH 289/312] Update plugins/devtools-common/src/permissions.ts Co-authored-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Signed-off-by: williamwu-mongodb --- plugins/devtools-common/src/permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/devtools-common/src/permissions.ts b/plugins/devtools-common/src/permissions.ts index 0c93c0ff2a..fcec4d5e91 100644 --- a/plugins/devtools-common/src/permissions.ts +++ b/plugins/devtools-common/src/permissions.ts @@ -52,7 +52,7 @@ export const devToolsExternalDependenciesReadPermission = createPermission({ * @alpha */ export const devToolsTaskSchedulerReadPermission = createPermission({ - name: 'devtools.task-scheduler', + name: 'devtools.scheduler.read', attributes: { action: 'read' }, }); From bf97a69ad0af0c5653abd0d7942ef6630f4c685d Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 12:54:32 -0800 Subject: [PATCH 290/312] Update plugins/devtools-common/src/permissions.ts Co-authored-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Signed-off-by: williamwu-mongodb --- plugins/devtools-common/src/permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/devtools-common/src/permissions.ts b/plugins/devtools-common/src/permissions.ts index fcec4d5e91..01685d3cb6 100644 --- a/plugins/devtools-common/src/permissions.ts +++ b/plugins/devtools-common/src/permissions.ts @@ -60,7 +60,7 @@ export const devToolsTaskSchedulerReadPermission = createPermission({ * @alpha */ export const devToolsTaskSchedulerCreatePermission = createPermission({ - name: 'devtools.task-scheduler', + name: 'devtools.scheduler.trigger', attributes: { action: 'create' }, }); From c692fbf5e3096ae5d801429f101cd12b6adb38e9 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Tue, 9 Dec 2025 12:54:41 -0800 Subject: [PATCH 291/312] Update plugins/devtools-common/src/permissions.ts Co-authored-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Signed-off-by: williamwu-mongodb --- plugins/devtools-common/src/permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/devtools-common/src/permissions.ts b/plugins/devtools-common/src/permissions.ts index 01685d3cb6..42a7efe777 100644 --- a/plugins/devtools-common/src/permissions.ts +++ b/plugins/devtools-common/src/permissions.ts @@ -61,7 +61,7 @@ export const devToolsTaskSchedulerReadPermission = createPermission({ */ export const devToolsTaskSchedulerCreatePermission = createPermission({ name: 'devtools.scheduler.trigger', - attributes: { action: 'create' }, + attributes: { action: 'update' }, }); /** From d78945eff946cb8f60e8b7ee92062eadd223ca9e Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 9 Dec 2025 17:52:18 -0500 Subject: [PATCH 292/312] fix test errors by adding to repo test as well Signed-off-by: aramissennyeydd --- .../cli/src/modules/build/lib/runner/runBackend.test.ts | 5 +---- packages/cli/src/modules/test/commands/repo/test.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts index 11018b0783..fbffec92d3 100644 --- a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts +++ b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts @@ -60,12 +60,9 @@ describe('runBackend', () => { // Save original environment originalEnv = { ...process.env }; + process.env = {}; originalPlatform = process.platform; - // Clear environment variables that we're testing - delete process.env.NODE_ENV; - delete process.env.NODE_OPTIONS; - // Mock process.stdin.on to prevent actual stdin reading jest.spyOn(process.stdin, 'on').mockReturnValue(process.stdin); diff --git a/packages/cli/src/modules/test/commands/repo/test.ts b/packages/cli/src/modules/test/commands/repo/test.ts index fd18ba09fe..40e6666dcf 100644 --- a/packages/cli/src/modules/test/commands/repo/test.ts +++ b/packages/cli/src/modules/test/commands/repo/test.ts @@ -289,6 +289,14 @@ export async function command(opts: OptionValues, cmd: Command): Promise { process.env.TZ = 'UTC'; } + // Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder + // on Node LTS. + if (!process.env.NODE_OPTIONS?.includes('--node-snapshot')) { + process.env.NODE_OPTIONS = `${ + process.env.NODE_OPTIONS ? `${process.env.NODE_OPTIONS} ` : '' + }--no-node-snapshot`; + } + // This ensures that the process doesn't exit too early before stdout is flushed if (args.includes('--jest-help')) { removeOptionArg(args, '--jest-help'); From c03ea7e6e8e5913c6efc958c91e4fb6b6cdf58e0 Mon Sep 17 00:00:00 2001 From: Kai Dubauskas Date: Wed, 10 Dec 2025 12:07:03 -0500 Subject: [PATCH 293/312] address comments Signed-off-by: Kai Dubauskas --- docs/notifications/processors.md | 2 +- plugins/notifications-backend-module-slack/config.d.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/notifications/processors.md b/docs/notifications/processors.md index 1e3cc5b5d4..7ae98a528c 100644 --- a/docs/notifications/processors.md +++ b/docs/notifications/processors.md @@ -150,7 +150,7 @@ notifications: - C12345678 username: 'Backstage Bot' # Optional, defaults to the name of the Slack App. concurrencyLimit: 20 # Optional, number of messages allowed per interval. Defaults to 10. - throttleInterval: 1m # Optional, ISO 8601 duration (or ms value). Defaults to 1 minute. + throttleInterval: 1m # Optional, Accepts ISO-8601 duration, ms-style ("1m", "30s"), or HumanDuration ({ minutes: 2 }). Defaults to 1 minute ``` Multiple instances can be added in the `slack` array, allowing you to have multiple configurations if you need to send diff --git a/plugins/notifications-backend-module-slack/config.d.ts b/plugins/notifications-backend-module-slack/config.d.ts index 441a49331c..e5971ec3ff 100644 --- a/plugins/notifications-backend-module-slack/config.d.ts +++ b/plugins/notifications-backend-module-slack/config.d.ts @@ -31,11 +31,11 @@ export interface Config { */ broadcastChannels?: string[]; /** - * Concurrency limit for Slack notifications, defaults to 10 + * Concurrency limit for Slack notifications per backend instance of the notifications plugin, defaults to 10. */ concurrencyLimit?: number; /** - * Throttle duration between Slack notifications, defaults to 1 minute + * Throttle duration between Slack notifications per backend instance of the notifications plugin, defaults to 1 minute. */ throttleInterval?: HumanDuration | string; }>; From 51a4cd3b7621ba71152bb07a9fb5974ce90900cb Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Wed, 10 Dec 2025 13:58:45 -0500 Subject: [PATCH 294/312] fix type error Signed-off-by: aramissennyeydd --- packages/cli/src/modules/build/lib/runner/runBackend.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts index fbffec92d3..2b97ae352c 100644 --- a/packages/cli/src/modules/build/lib/runner/runBackend.test.ts +++ b/packages/cli/src/modules/build/lib/runner/runBackend.test.ts @@ -60,7 +60,7 @@ describe('runBackend', () => { // Save original environment originalEnv = { ...process.env }; - process.env = {}; + process.env = { NODE_ENV: 'test' }; originalPlatform = process.platform; // Mock process.stdin.on to prevent actual stdin reading From c07af9f966b05ad1135dc925942985627bca99ce Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 10 Dec 2025 20:33:41 +0100 Subject: [PATCH 295/312] cli: move back to ES2022 in tsconfig Signed-off-by: Patrik Oldsberg --- .changeset/stupid-cases-fold.md | 4 +++- packages/cli/config/tsconfig.json | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.changeset/stupid-cases-fold.md b/.changeset/stupid-cases-fold.md index 5cf0f0f72a..6ee2472746 100644 --- a/.changeset/stupid-cases-fold.md +++ b/.changeset/stupid-cases-fold.md @@ -2,4 +2,6 @@ '@backstage/cli': patch --- -Switched ECMAScript version to ES2023. +Switched compilation target to ES2022 in order to match the new set of supported Node.js versions, which are 22 and 24. + +The TypeScript compilation target has been set to ES2022, because setting it to a higher target will break projects on older TypeScript versions. If you use a newer TypeScript version in your own project, you can bump `compilerOptions.target` to ES2023 or ES2024 in your own `tsconfig.json` file. diff --git a/packages/cli/config/tsconfig.json b/packages/cli/config/tsconfig.json index 7648e0238a..40a572da4d 100644 --- a/packages/cli/config/tsconfig.json +++ b/packages/cli/config/tsconfig.json @@ -33,7 +33,7 @@ "strictNullChecks": true, "strictPropertyInitialization": true, "stripInternal": true, - "target": "ES2023", + "target": "ES2022", "types": ["node", "jest", "webpack-env"], "useDefineForClassFields": true } From f2b7585824476b932eb497c89f57b8dceca1d546 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Thu, 11 Dec 2025 09:33:46 +0100 Subject: [PATCH 296/312] feat: support marking a github app as a public token generator Signed-off-by: benjdlambert --- packages/integration/config.d.ts | 4 + ...eInstanceGithubCredentialsProvider.test.ts | 326 ++++++++++++++++++ ...SingleInstanceGithubCredentialsProvider.ts | 44 +++ packages/integration/src/github/config.ts | 5 + 4 files changed, 379 insertions(+) diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index a601d63472..a49c4cc0d6 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -330,6 +330,10 @@ export interface Config { * https://docs.github.com/en/rest/reference/apps#list-installations-for-the-authenticated-app--code-samples */ allowedInstallationOwners?: string[]; + /** + * If true, then an installation token will be issued for access when no other token is available. + */ + publicAccess?: boolean; }>; }>; diff --git a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.test.ts b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.test.ts index 0468e96e14..fefccf22f6 100644 --- a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.test.ts +++ b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.test.ts @@ -563,4 +563,330 @@ describe('SingleInstanceGithubCredentialsProvider tests', () => { 2, ); }); + + describe('public access', () => { + it('should use an installation token when public access is enabled and owner is not in allowed list', async () => { + const githubProvider = SingleInstanceGithubCredentialsProvider.create({ + host: 'github.com', + apps: [ + { + appId: 1, + privateKey: 'privateKey', + webhookSecret: '123', + clientId: 'CLIENT_ID', + clientSecret: 'CLIENT_SECRET', + allowedInstallationOwners: ['other-org'], + publicAccess: true, + }, + ], + }); + + octokit.apps.listInstallations.mockResolvedValue({ + headers: { + etag: '123', + }, + data: [ + { + id: 1, + repository_selection: 'all', + account: { + login: 'other-org', + }, + }, + ], + } as RestEndpointMethodTypes['apps']['listInstallations']['response']); + + octokit.apps.createInstallationAccessToken.mockResolvedValueOnce({ + data: { + expires_at: DateTime.local().plus({ hours: 1 }).toString(), + token: 'public_access_token', + }, + } as RestEndpointMethodTypes['apps']['createInstallationAccessToken']['response']); + + const { token, headers, type } = await githubProvider.getCredentials({ + url: 'https://github.com/some-public-org/some-repo', + }); + + expect(type).toEqual('app'); + expect(token).toEqual('public_access_token'); + expect(headers).toEqual({ Authorization: 'Bearer public_access_token' }); + }); + + it('should use an installation token when public access is enabled and no installation exists for owner', async () => { + const githubProvider = SingleInstanceGithubCredentialsProvider.create({ + host: 'github.com', + apps: [ + { + appId: 1, + privateKey: 'privateKey', + webhookSecret: '123', + clientId: 'CLIENT_ID', + clientSecret: 'CLIENT_SECRET', + publicAccess: true, + }, + ], + }); + + octokit.apps.listInstallations.mockResolvedValue({ + headers: { + etag: '123', + }, + data: [ + { + id: 42, + repository_selection: 'all', + account: { + login: 'installed-org', + }, + }, + ], + } as RestEndpointMethodTypes['apps']['listInstallations']['response']); + + octokit.apps.createInstallationAccessToken.mockResolvedValueOnce({ + data: { + expires_at: DateTime.local().plus({ hours: 1 }).toString(), + token: 'public_installation_token', + }, + } as RestEndpointMethodTypes['apps']['createInstallationAccessToken']['response']); + + const { token, headers, type } = await githubProvider.getCredentials({ + url: 'https://github.com/non-installed-org/some-repo', + }); + + expect(type).toEqual('app'); + expect(token).toEqual('public_installation_token'); + expect(headers).toEqual({ + Authorization: 'Bearer public_installation_token', + }); + }); + + it('should not use public access when normal installation credentials are available', async () => { + const githubProvider = SingleInstanceGithubCredentialsProvider.create({ + host: 'github.com', + apps: [ + { + appId: 1, + privateKey: 'privateKey', + webhookSecret: '123', + clientId: 'CLIENT_ID', + clientSecret: 'CLIENT_SECRET', + publicAccess: true, + }, + ], + }); + + octokit.apps.listInstallations.mockResolvedValue({ + headers: { + etag: '123', + }, + data: [ + { + id: 1, + repository_selection: 'all', + account: { + login: 'backstage', + }, + }, + ], + } as RestEndpointMethodTypes['apps']['listInstallations']['response']); + + octokit.apps.createInstallationAccessToken.mockResolvedValueOnce({ + data: { + expires_at: DateTime.local().plus({ hours: 1 }).toString(), + token: 'normal_token', + }, + } as RestEndpointMethodTypes['apps']['createInstallationAccessToken']['response']); + + const { token, type } = await githubProvider.getCredentials({ + url: 'https://github.com/backstage/repo', + }); + + expect(type).toEqual('app'); + expect(token).toEqual('normal_token'); + // createInstallationAccessToken should only be called once for the normal flow + expect(octokit.apps.createInstallationAccessToken).toHaveBeenCalledTimes( + 1, + ); + }); + + it('should fall back to configured token when public access fails', async () => { + const githubProvider = SingleInstanceGithubCredentialsProvider.create({ + host: 'github.com', + apps: [ + { + appId: 1, + privateKey: 'privateKey', + webhookSecret: '123', + clientId: 'CLIENT_ID', + clientSecret: 'CLIENT_SECRET', + allowedInstallationOwners: ['other-org'], + publicAccess: true, + }, + ], + token: 'fallback_token', + }); + + octokit.apps.listInstallations.mockResolvedValue({ + headers: { + etag: '123', + }, + data: [], + } as unknown as RestEndpointMethodTypes['apps']['listInstallations']['response']); + + const { token, type } = await githubProvider.getCredentials({ + url: 'https://github.com/some-org/repo', + }); + + expect(type).toEqual('token'); + expect(token).toEqual('fallback_token'); + }); + + it('should return undefined when public access is disabled and no installation exists', async () => { + const githubProvider = SingleInstanceGithubCredentialsProvider.create({ + host: 'github.com', + apps: [ + { + appId: 1, + privateKey: 'privateKey', + webhookSecret: '123', + clientId: 'CLIENT_ID', + clientSecret: 'CLIENT_SECRET', + allowedInstallationOwners: ['other-org'], + // publicAccess is not set (defaults to false) + }, + ], + }); + + octokit.apps.listInstallations.mockResolvedValue({ + headers: { + etag: '123', + }, + data: [ + { + id: 1, + repository_selection: 'all', + account: { + login: 'other-org', + }, + }, + ], + } as RestEndpointMethodTypes['apps']['listInstallations']['response']); + + const { token, headers } = await githubProvider.getCredentials({ + url: 'https://github.com/some-org/repo', + }); + + expect(token).toBeUndefined(); + expect(headers).toBeUndefined(); + }); + + it('should cache public access tokens separately from regular tokens', async () => { + const githubProvider = SingleInstanceGithubCredentialsProvider.create({ + host: 'github.com', + apps: [ + { + appId: 1, + privateKey: 'privateKey', + webhookSecret: '123', + clientId: 'CLIENT_ID', + clientSecret: 'CLIENT_SECRET', + allowedInstallationOwners: ['installed-org'], + publicAccess: true, + }, + ], + }); + + octokit.apps.listInstallations.mockResolvedValue({ + headers: { + etag: '123', + }, + data: [ + { + id: 1, + repository_selection: 'all', + account: { + login: 'installed-org', + }, + }, + ], + } as RestEndpointMethodTypes['apps']['listInstallations']['response']); + + octokit.apps.createInstallationAccessToken.mockResolvedValue({ + data: { + expires_at: DateTime.local().plus({ hours: 1 }).toString(), + token: 'public_token', + }, + } as RestEndpointMethodTypes['apps']['createInstallationAccessToken']['response']); + + // First call for a public org + await githubProvider.getCredentials({ + url: 'https://github.com/public-org/repo', + }); + + // Second call for the same public org should use cached token + await githubProvider.getCredentials({ + url: 'https://github.com/public-org/repo', + }); + + // createInstallationAccessToken should only be called once due to caching + expect(octokit.apps.createInstallationAccessToken).toHaveBeenCalledTimes( + 1, + ); + }); + + it('should use public access with multiple apps when only one has publicAccess enabled', async () => { + const githubProvider = SingleInstanceGithubCredentialsProvider.create({ + host: 'github.com', + apps: [ + { + appId: 1, + privateKey: 'privateKey', + webhookSecret: '123', + clientId: 'CLIENT_ID', + clientSecret: 'CLIENT_SECRET', + allowedInstallationOwners: ['org-1'], + // publicAccess not set, defaults to false + }, + { + appId: 2, + privateKey: 'privateKey2', + webhookSecret: '456', + clientId: 'CLIENT_ID_2', + clientSecret: 'CLIENT_SECRET_2', + allowedInstallationOwners: ['org-2'], + publicAccess: true, + }, + ], + }); + + octokit.apps.listInstallations.mockResolvedValue({ + headers: { + etag: '123', + }, + data: [ + { + id: 1, + repository_selection: 'all', + account: { + login: 'org-2', + }, + }, + ], + } as RestEndpointMethodTypes['apps']['listInstallations']['response']); + + octokit.apps.createInstallationAccessToken.mockResolvedValueOnce({ + data: { + expires_at: DateTime.local().plus({ hours: 1 }).toString(), + token: 'public_access_from_app_2', + }, + } as RestEndpointMethodTypes['apps']['createInstallationAccessToken']['response']); + + const { token, type } = await githubProvider.getCredentials({ + url: 'https://github.com/unknown-org/repo', + }); + + expect(type).toEqual('app'); + expect(token).toEqual('public_access_from_app_2'); + }); + }); }); diff --git a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts index d2c1e37a65..40d166b223 100644 --- a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts +++ b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts @@ -100,6 +100,7 @@ class GithubAppManager { private readonly baseAuthConfig: { appId: number; privateKey: string }; private readonly cache = new Cache(); private readonly allowedInstallationOwners: string[] | undefined; // undefined allows all installations + public readonly publicAccess: boolean; constructor(config: GithubAppConfig, baseUrl?: string) { this.allowedInstallationOwners = config.allowedInstallationOwners?.map( @@ -116,6 +117,7 @@ class GithubAppManager { authStrategy: createAppAuth, auth: this.baseAuthConfig, }); + this.publicAccess = config.publicAccess ?? false; } async getInstallationCredentials( @@ -170,6 +172,30 @@ class GithubAppManager { }); } + async getPublicInstallationToken(): Promise<{ accessToken: string }> { + const [installation] = await this.getInstallations(); + + if (!installation) { + throw new Error(`No installation found for public app`); + } + + return this.cache.getOrCreateToken( + `public:${installation.id}`, + undefined, + async () => { + const result = await this.appClient.apps.createInstallationAccessToken({ + installation_id: installation.id, + headers: HEADERS, + }); + + return { + token: result.data.token, + expiresAt: DateTime.fromISO(result.data.expires_at), + }; + }, + ); + } + getInstallations(): Promise< RestEndpointMethodTypes['apps']['listInstallations']['response']['data'] > { @@ -185,12 +211,14 @@ class GithubAppManager { inst.account.login?.toLocaleLowerCase('en-US') === owner.toLocaleLowerCase('en-US'), ); + if (installation) { return { installationId: installation.id, suspended: Boolean(installation.suspended_by), }; } + const notFoundError = new Error( `No app installation found for ${owner} in ${this.baseAuthConfig.appId}`, ); @@ -245,10 +273,26 @@ export class GithubAppCredentialsMux { const result = results.find( resultItem => resultItem.credentials?.accessToken, ); + if (result) { return result.credentials!.accessToken; } + // If there was no token returned, then let's find a public access app and use an installation to get a token. + const publicAccessApp = this.apps.find(app => app.publicAccess); + if (publicAccessApp) { + const publicResult = await publicAccessApp + .getPublicInstallationToken() + .then( + credentials => ({ credentials, error: undefined }), + error => ({ credentials: undefined, error }), + ); + + if (publicResult.credentials?.accessToken) { + return publicResult.credentials.accessToken; + } + } + const errors = results.map(r => r.error); const notNotFoundError = errors.find(err => err?.name !== 'NotFoundError'); if (notNotFoundError) { diff --git a/packages/integration/src/github/config.ts b/packages/integration/src/github/config.ts index 74a0267d62..f755b84c2a 100644 --- a/packages/integration/src/github/config.ts +++ b/packages/integration/src/github/config.ts @@ -109,6 +109,10 @@ export type GithubAppConfig = { * https://docs.github.com/en/rest/reference/apps#list-installations-for-the-authenticated-app--code-samples */ allowedInstallationOwners?: string[]; + /** + * If true, then an installation token will be issued for access when no other token is available. + */ + publicAccess?: boolean; }; /** @@ -133,6 +137,7 @@ export function readGithubIntegrationConfig( allowedInstallationOwners: c.getOptionalStringArray( 'allowedInstallationOwners', ), + publicAccess: c.getOptionalBoolean('publicAccess'), })); if (!isValidHost(host)) { From a26a3229bca53d93348ea7dcb92f2eb9ff76684c Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Thu, 11 Dec 2025 09:39:49 +0100 Subject: [PATCH 297/312] chore: add changeset Signed-off-by: benjdlambert --- .changeset/bumpy-pens-swim.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/bumpy-pens-swim.md diff --git a/.changeset/bumpy-pens-swim.md b/.changeset/bumpy-pens-swim.md new file mode 100644 index 0000000000..462045e462 --- /dev/null +++ b/.changeset/bumpy-pens-swim.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +Added support for using a GitHub App installation to generate tokens for public repository access when the `publicAccess` option is enabled. When all other authentication methods fail (e.g., the app is not installed in that organization), the provider will now use an available installation to generate a token that can be used to access public repositories as read only. From 9fa23b3ea1f5724800cf3acb243137dc13e85eb4 Mon Sep 17 00:00:00 2001 From: Jonas Beck Date: Thu, 11 Dec 2025 10:16:46 +0100 Subject: [PATCH 298/312] feat(events): add backwards compatability to kafkaConsumingEventPublisher config Signed-off-by: Jonas Beck --- .changeset/angry-views-win.md | 20 +- .../events-backend-module-kafka/config.d.ts | 487 ++++++++++++------ .../KafkaConsumingEventPublisher.ts | 2 +- .../config.test.ts | 87 +++- .../KafkaConsumingEventPublisher/config.ts | 119 +++-- 5 files changed, 488 insertions(+), 227 deletions(-) diff --git a/.changeset/angry-views-win.md b/.changeset/angry-views-win.md index bf45881d25..9d406280a7 100644 --- a/.changeset/angry-views-win.md +++ b/.changeset/angry-views-win.md @@ -2,22 +2,4 @@ '@backstage/plugin-events-backend-module-kafka': minor --- -**BREAKING**: Updated `kafkaConsumingEventPublisher` configuration to support multiple named instances - -The Kafka configuration now requires named instances instead of a single configuration object for `kafkaConsumingEventPublisher`, this allows for multiple Kafka configurations. - -These changes are **required** to your `app-config.yaml`: - -```diff -events: - modules: - kafka: - kafkaConsumingEventPublisher: -- clientId: your-client-id -- brokers: [...] -- topics: [...] -+ default: # Or any name like 'prod', 'dev', etc. -+ clientId: your-client-id -+ brokers: [...] -+ topics: [...] -``` +Added support for multiple named instances in `kafkaConsumingEventPublisher` configuration. The previous single configuration format is still supported for backward compatibility. diff --git a/plugins/events-backend-module-kafka/config.d.ts b/plugins/events-backend-module-kafka/config.d.ts index b3698a8999..47ebae0653 100644 --- a/plugins/events-backend-module-kafka/config.d.ts +++ b/plugins/events-backend-module-kafka/config.d.ts @@ -25,184 +25,359 @@ export interface Config { /** * Configuration for KafkaConsumingEventPublisher * - * Supports multiple named instances as a record where each key is a unique name - * for the Kafka consumer configuration. + * Supports either: + * 1. Single configuration object (legacy format) + * 2. Multiple named instances as a record where each key is a unique name for the Kafka instance */ - kafkaConsumingEventPublisher?: { - [name: string]: { - /** - * (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. - */ - clientId: string; - /** - * (Required) List of brokers in the Kafka cluster to connect to. - */ - brokers: string[]; - /** - * Optional SSL connection parameters to connect to the cluster. Passed directly to Node tls.connect. - * See https://nodejs.org/dist/latest-v8.x/docs/api/tls.html#tls_tls_createsecurecontext_options - */ - ssl?: - | { - ca?: string[]; - /** @visibility secret */ - key?: string; - cert?: string; - rejectUnauthorized?: boolean; - } - | boolean; - /** - * Optional SASL connection parameters. - */ - sasl?: { - mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512'; - username: string; - /** @visibility secret */ - password: string; - }; - - /** - * Optional retry connection parameters. - */ - retry?: { + kafkaConsumingEventPublisher?: + | { /** - * (Optional) Maximum wait time for a retry - * Default: 30000 ms. + * (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. */ - maxRetryTime?: HumanDuration | string; + clientId: string; + /** + * (Required) List of brokers in the Kafka cluster to connect to. + */ + brokers: string[]; + /** + * Optional SSL connection parameters to connect to the cluster. Passed directly to Node tls.connect. + * See https://nodejs.org/dist/latest-v8.x/docs/api/tls.html#tls_tls_createsecurecontext_options + */ + ssl?: + | { + ca?: string[]; + /** @visibility secret */ + key?: string; + cert?: string; + rejectUnauthorized?: boolean; + } + | boolean; + /** + * Optional SASL connection parameters. + */ + sasl?: { + mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512'; + username: string; + /** @visibility secret */ + password: string; + }; /** - * (Optional) Initial value used to calculate the retry (This is still randomized following the randomization factor) - * Default: 300 ms. + * Optional retry connection parameters. */ - initialRetryTime?: HumanDuration | string; - - /** - * (Optional) Randomization factor - * Default: 0.2. - */ - factor?: number; - - /** - * (Optional) Exponential factor - * Default: 2. - */ - multiplier?: number; - - /** - * (Optional) Max number of retries per call - * Default: 5. - */ - retries?: number; - }; - - /** - * (Optional) Timeout for authentication requests. - * Default: 10000 ms. - */ - authenticationTimeout?: HumanDuration | string; - - /** - * (Optional) Time to wait for a successful connection. - * Default: 1000 ms. - */ - connectionTimeout?: HumanDuration | string; - - /** - * (Optional) Time to wait for a successful request. - * Default: 30000 ms. - */ - requestTimeout?: HumanDuration | string; - - /** - * (Optional) The request timeout can be disabled by setting enforceRequestTimeout to false. - * Default: true - */ - enforceRequestTimeout?: boolean; - - /** - * Contains an object per topic for which a Kafka queue - * should be used as source of events. - */ - topics: Array<{ - /** - * (Required) The Backstage topic to publish to - */ - topic: string; - /** - * (Required) KafkaConsumer-related configuration. - */ - kafka: { + retry?: { /** - * (Required) The Kafka topics to subscribe to - */ - topics: string[]; - /** - * (Required) The GroupId to be used by the topic consumers - */ - groupId: string; - - /** - * (Optional) Timeout used to detect failures. - * The consumer sends periodic heartbeats to indicate its liveness to the broker. - * If no heartbeats are received by the broker before the expiration of this session timeout, - * then the broker will remove this consumer from the group and initiate a rebalance + * (Optional) Maximum wait time for a retry * Default: 30000 ms. */ - sessionTimeout?: HumanDuration | string; + maxRetryTime?: HumanDuration | string; /** - * (Optional) The maximum time that the coordinator will wait for each member to rejoin when rebalancing the group - * Default: 60000 ms. + * (Optional) Initial value used to calculate the retry (This is still randomized following the randomization factor) + * Default: 300 ms. */ - rebalanceTimeout?: HumanDuration | string; + initialRetryTime?: HumanDuration | string; /** - * (Optional) The expected time between heartbeats to the consumer coordinator. - * Heartbeats are used to ensure that the consumer's session stays active. - * The value must be set lower than session timeout - * Default: 3000 ms. + * (Optional) Randomization factor + * Default: 0.2. */ - heartbeatInterval?: HumanDuration | string; + factor?: number; /** - * (Optional) The period of time after which we force a refresh of metadata - * even if we haven't seen any partition leadership changes to proactively discover any new brokers or partitions - * Default: 300000 ms (5 minutes). + * (Optional) Exponential factor + * Default: 2. */ - metadataMaxAge?: HumanDuration | string; + multiplier?: number; /** - * (Optional) The maximum amount of data per-partition the server will return. - * This size must be at least as large as the maximum message size the server allows - * or else it is possible for the producer to send messages larger than the consumer can fetch. - * If that happens, the consumer can get stuck trying to fetch a large message on a certain partition - * Default: 1048576 (1MB) + * (Optional) Max number of retries per call + * Default: 5. */ - maxBytesPerPartition?: number; - - /** - * (Optional) Minimum amount of data the server should return for a fetch request, otherwise wait up to maxWaitTime for more data to accumulate. - * Default: 1 - */ - minBytes?: number; - - /** - * (Optional) Maximum amount of bytes to accumulate in the response. Supported by Kafka >= 0.10.1.0 - * Default: 10485760 (10MB) - */ - maxBytes?: number; - - /** - * (Optional) The maximum amount of time the server will block before answering the fetch request - * if there isn't sufficient data to immediately satisfy the requirement given by minBytes - * Default: 5000 - */ - maxWaitTime?: HumanDuration | string; + retries?: number; }; - }>; - }; - }; + + /** + * (Optional) Timeout for authentication requests. + * Default: 10000 ms. + */ + authenticationTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful connection. + * Default: 1000 ms. + */ + connectionTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful request. + * Default: 30000 ms. + */ + requestTimeout?: HumanDuration | string; + + /** + * (Optional) The request timeout can be disabled by setting enforceRequestTimeout to false. + * Default: true + */ + enforceRequestTimeout?: boolean; + + /** + * Contains an object per topic for which a Kafka queue + * should be used as source of events. + */ + topics: Array<{ + /** + * (Required) The Backstage topic to publish to + */ + topic: string; + /** + * (Required) KafkaConsumer-related configuration. + */ + kafka: { + /** + * (Required) The Kafka topics to subscribe to + */ + topics: string[]; + /** + * (Required) The GroupId to be used by the topic consumers + */ + groupId: string; + + /** + * (Optional) Timeout used to detect failures. + * The consumer sends periodic heartbeats to indicate its liveness to the broker. + * If no heartbeats are received by the broker before the expiration of this session timeout, + * then the broker will remove this consumer from the group and initiate a rebalance + * Default: 30000 ms. + */ + sessionTimeout?: HumanDuration | string; + + /** + * (Optional) The maximum time that the coordinator will wait for each member to rejoin when rebalancing the group + * Default: 60000 ms. + */ + rebalanceTimeout?: HumanDuration | string; + + /** + * (Optional) The expected time between heartbeats to the consumer coordinator. + * Heartbeats are used to ensure that the consumer's session stays active. + * The value must be set lower than session timeout + * Default: 3000 ms. + */ + heartbeatInterval?: HumanDuration | string; + + /** + * (Optional) The period of time after which we force a refresh of metadata + * even if we haven't seen any partition leadership changes to proactively discover any new brokers or partitions + * Default: 300000 ms (5 minutes). + */ + metadataMaxAge?: HumanDuration | string; + + /** + * (Optional) The maximum amount of data per-partition the server will return. + * This size must be at least as large as the maximum message size the server allows + * or else it is possible for the producer to send messages larger than the consumer can fetch. + * If that happens, the consumer can get stuck trying to fetch a large message on a certain partition + * Default: 1048576 (1MB) + */ + maxBytesPerPartition?: number; + + /** + * (Optional) Minimum amount of data the server should return for a fetch request, otherwise wait up to maxWaitTime for more data to accumulate. + * Default: 1 + */ + minBytes?: number; + + /** + * (Optional) Maximum amount of bytes to accumulate in the response. Supported by Kafka >= 0.10.1.0 + * Default: 10485760 (10MB) + */ + maxBytes?: number; + + /** + * (Optional) The maximum amount of time the server will block before answering the fetch request + * if there isn't sufficient data to immediately satisfy the requirement given by minBytes + * Default: 5000 + */ + maxWaitTime?: HumanDuration | string; + }; + }>; + } + | { + [name: string]: { + /** + * (Required) Client ID used by Backstage to identify when connecting to the Kafka cluster. + */ + clientId: string; + /** + * (Required) List of brokers in the Kafka cluster to connect to. + */ + brokers: string[]; + /** + * Optional SSL connection parameters to connect to the cluster. Passed directly to Node tls.connect. + * See https://nodejs.org/dist/latest-v8.x/docs/api/tls.html#tls_tls_createsecurecontext_options + */ + ssl?: + | { + ca?: string[]; + /** @visibility secret */ + key?: string; + cert?: string; + rejectUnauthorized?: boolean; + } + | boolean; + /** + * Optional SASL connection parameters. + */ + sasl?: { + mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512'; + username: string; + /** @visibility secret */ + password: string; + }; + + /** + * Optional retry connection parameters. + */ + retry?: { + /** + * (Optional) Maximum wait time for a retry + * Default: 30000 ms. + */ + maxRetryTime?: HumanDuration | string; + + /** + * (Optional) Initial value used to calculate the retry (This is still randomized following the randomization factor) + * Default: 300 ms. + */ + initialRetryTime?: HumanDuration | string; + + /** + * (Optional) Randomization factor + * Default: 0.2. + */ + factor?: number; + + /** + * (Optional) Exponential factor + * Default: 2. + */ + multiplier?: number; + + /** + * (Optional) Max number of retries per call + * Default: 5. + */ + retries?: number; + }; + + /** + * (Optional) Timeout for authentication requests. + * Default: 10000 ms. + */ + authenticationTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful connection. + * Default: 1000 ms. + */ + connectionTimeout?: HumanDuration | string; + + /** + * (Optional) Time to wait for a successful request. + * Default: 30000 ms. + */ + requestTimeout?: HumanDuration | string; + + /** + * (Optional) The request timeout can be disabled by setting enforceRequestTimeout to false. + * Default: true + */ + enforceRequestTimeout?: boolean; + + /** + * Contains an object per topic for which a Kafka queue + * should be used as source of events. + */ + topics: Array<{ + /** + * (Required) The Backstage topic to publish to + */ + topic: string; + /** + * (Required) KafkaConsumer-related configuration. + */ + kafka: { + /** + * (Required) The Kafka topics to subscribe to + */ + topics: string[]; + /** + * (Required) The GroupId to be used by the topic consumers + */ + groupId: string; + + /** + * (Optional) Timeout used to detect failures. + * The consumer sends periodic heartbeats to indicate its liveness to the broker. + * If no heartbeats are received by the broker before the expiration of this session timeout, + * then the broker will remove this consumer from the group and initiate a rebalance + * Default: 30000 ms. + */ + sessionTimeout?: HumanDuration | string; + + /** + * (Optional) The maximum time that the coordinator will wait for each member to rejoin when rebalancing the group + * Default: 60000 ms. + */ + rebalanceTimeout?: HumanDuration | string; + + /** + * (Optional) The expected time between heartbeats to the consumer coordinator. + * Heartbeats are used to ensure that the consumer's session stays active. + * The value must be set lower than session timeout + * Default: 3000 ms. + */ + heartbeatInterval?: HumanDuration | string; + + /** + * (Optional) The period of time after which we force a refresh of metadata + * even if we haven't seen any partition leadership changes to proactively discover any new brokers or partitions + * Default: 300000 ms (5 minutes). + */ + metadataMaxAge?: HumanDuration | string; + + /** + * (Optional) The maximum amount of data per-partition the server will return. + * This size must be at least as large as the maximum message size the server allows + * or else it is possible for the producer to send messages larger than the consumer can fetch. + * If that happens, the consumer can get stuck trying to fetch a large message on a certain partition + * Default: 1048576 (1MB) + */ + maxBytesPerPartition?: number; + + /** + * (Optional) Minimum amount of data the server should return for a fetch request, otherwise wait up to maxWaitTime for more data to accumulate. + * Default: 1 + */ + minBytes?: number; + + /** + * (Optional) Maximum amount of bytes to accumulate in the response. Supported by Kafka >= 0.10.1.0 + * Default: 10485760 (10MB) + */ + maxBytes?: number; + + /** + * (Optional) The maximum amount of time the server will block before answering the fetch request + * if there isn't sufficient data to immediately satisfy the requirement given by minBytes + * Default: 5000 + */ + maxWaitTime?: HumanDuration | string; + }; + }>; + }; + }; /** * Configuration for KafkaPublishingEventConsumer diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts index 41744abff2..b996032575 100644 --- a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/KafkaConsumingEventPublisher.ts @@ -43,7 +43,7 @@ export class KafkaConsumingEventPublisher { events: EventsService; logger: LoggerService; }): KafkaConsumingEventPublisher[] { - const configs = readConsumerConfig(env.config); + const configs = readConsumerConfig(env.config, env.logger); return configs.map( kafkaConfig => diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts index b61ee9332e..16ee9e0a4c 100644 --- a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.test.ts @@ -15,10 +15,16 @@ */ import { ConfigReader } from '@backstage/config'; import { readConsumerConfig } from './config'; +import { mockServices } from '@backstage/backend-test-utils'; + +const mockLogger = mockServices.logger.mock(); describe('readConsumerConfig', () => { it('not configured', () => { - const publisherConfigs = readConsumerConfig(new ConfigReader({})); + const publisherConfigs = readConsumerConfig( + new ConfigReader({}), + mockLogger, + ); expect(publisherConfigs).toEqual([]); }); @@ -55,7 +61,7 @@ describe('readConsumerConfig', () => { }, }); - const publisherConfigs = readConsumerConfig(config); + const publisherConfigs = readConsumerConfig(config, mockLogger); expect(publisherConfigs).toBeDefined(); expect(Array.isArray(publisherConfigs)).toBe(true); @@ -150,7 +156,7 @@ describe('readConsumerConfig', () => { }, }); - const publisherConfigs = readConsumerConfig(config); + const publisherConfigs = readConsumerConfig(config, mockLogger); expect(publisherConfigs).toBeDefined(); expect(Array.isArray(publisherConfigs)).toBe(true); @@ -243,7 +249,7 @@ describe('readConsumerConfig', () => { }, }); - const publisherConfigs = readConsumerConfig(config); + const publisherConfigs = readConsumerConfig(config, mockLogger); expect(publisherConfigs).toBeDefined(); expect(Array.isArray(publisherConfigs)).toBe(true); @@ -272,4 +278,77 @@ describe('readConsumerConfig', () => { // Consumer configuration expect(devConfig.kafkaConsumerConfigs.length).toBe(0); }); + + it('single instance configuration (legacy format)', () => { + const config = new ConfigReader({ + events: { + modules: { + kafka: { + kafkaConsumingEventPublisher: { + clientId: 'backstage-events', + brokers: ['kafka1:9092', 'kafka2:9092'], + topics: [ + { + topic: 'fake1', + kafka: { + topics: ['topic-A'], + groupId: 'my-group', + }, + }, + { + topic: 'fake2', + kafka: { + topics: ['topic-B'], + groupId: 'my-group', + }, + }, + ], + }, + }, + }, + }, + }); + + const publisherConfigs = readConsumerConfig(config, mockLogger); + + expect(publisherConfigs).toBeDefined(); + expect(Array.isArray(publisherConfigs)).toBe(true); + expect(publisherConfigs).toHaveLength(1); + + const defaultConfig = publisherConfigs[0]; + expect(defaultConfig.instance).toBe('default'); + expect(defaultConfig.kafkaConsumerConfigs.length).toBe(2); + + expect(defaultConfig.kafkaConfig.clientId).toEqual('backstage-events'); + expect(defaultConfig.kafkaConfig.brokers).toEqual([ + 'kafka1:9092', + 'kafka2:9092', + ]); + + expect(defaultConfig.kafkaConsumerConfigs).toEqual([ + { + backstageTopic: 'fake1', + consumerConfig: { + groupId: 'my-group', + }, + consumerSubscribeTopics: { + topics: ['topic-A'], + }, + }, + { + backstageTopic: 'fake2', + consumerConfig: { + groupId: 'my-group', + }, + consumerSubscribeTopics: { + topics: ['topic-B'], + }, + }, + ]); + + // Verify deprecation warning was logged + expect(mockLogger.warn).toHaveBeenCalledWith( + 'Legacy single config format detected at events.modules.kafka.kafkaConsumingEventPublisher.', + ); + }); }); diff --git a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts index dc9b477770..b07378a1d6 100644 --- a/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts +++ b/plugins/events-backend-module-kafka/src/KafkaConsumingEventPublisher/config.ts @@ -19,6 +19,7 @@ import { readKafkaConfig, readOptionalHumanDurationInMs, } from '../utils/config'; +import { LoggerService } from '@backstage/backend-plugin-api'; export interface KafkaConsumerConfig { backstageTopic: string; @@ -35,57 +36,81 @@ export interface KafkaConsumingEventPublisherConfig { const CONFIG_PREFIX_PUBLISHER = 'events.modules.kafka.kafkaConsumingEventPublisher'; +const processSinglePublisher = ( + instanceName: string, + publisherConfig: Config, +): KafkaConsumingEventPublisherConfig => { + return { + instance: instanceName, + kafkaConfig: readKafkaConfig(publisherConfig), + kafkaConsumerConfigs: publisherConfig + .getConfigArray('topics') + .map(topicConfig => { + return { + backstageTopic: topicConfig.getString('topic'), + consumerConfig: { + groupId: topicConfig.getString('kafka.groupId'), + sessionTimeout: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.sessionTimeout', + ), + rebalanceTimeout: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.rebalanceTimeout', + ), + heartbeatInterval: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.heartbeatInterval', + ), + metadataMaxAge: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.metadataMaxAge', + ), + maxBytesPerPartition: topicConfig.getOptionalNumber( + 'kafka.maxBytesPerPartition', + ), + minBytes: topicConfig.getOptionalNumber('kafka.minBytes'), + maxBytes: topicConfig.getOptionalNumber('kafka.maxBytes'), + maxWaitTimeInMs: readOptionalHumanDurationInMs( + topicConfig, + 'kafka.maxWaitTime', + ), + }, + consumerSubscribeTopics: { + topics: topicConfig.getStringArray('kafka.topics'), + }, + }; + }), + }; +}; + export const readConsumerConfig = ( config: Config, + logger: LoggerService, ): KafkaConsumingEventPublisherConfig[] => { - const publishers = config.getOptionalConfig(CONFIG_PREFIX_PUBLISHER); + const publishersConfig = config.getOptionalConfig(CONFIG_PREFIX_PUBLISHER); + + // Check for legacy single publisher format + if (publishersConfig?.getOptionalString('clientId')) { + logger.warn( + 'Legacy single config format detected at events.modules.kafka.kafkaConsumingEventPublisher.', + ); + return [ + processSinglePublisher( + 'default', // use `default` as instance name for legacy single config + publishersConfig, + ), + ]; + } return ( - publishers?.keys()?.map(publisherKey => { - const publisherConfig = publishers.getConfig(publisherKey); - - return { - instance: publisherKey, - kafkaConfig: readKafkaConfig(publisherConfig), - kafkaConsumerConfigs: publisherConfig - .getConfigArray('topics') - .map(topicConfig => { - return { - backstageTopic: topicConfig.getString('topic'), - consumerConfig: { - groupId: topicConfig.getString('kafka.groupId'), - sessionTimeout: readOptionalHumanDurationInMs( - topicConfig, - 'kafka.sessionTimeout', - ), - rebalanceTimeout: readOptionalHumanDurationInMs( - topicConfig, - 'kafka.rebalanceTimeout', - ), - heartbeatInterval: readOptionalHumanDurationInMs( - topicConfig, - 'kafka.heartbeatInterval', - ), - metadataMaxAge: readOptionalHumanDurationInMs( - topicConfig, - 'kafka.metadataMaxAge', - ), - maxBytesPerPartition: topicConfig.getOptionalNumber( - 'kafka.maxBytesPerPartition', - ), - minBytes: topicConfig.getOptionalNumber('kafka.minBytes'), - maxBytes: topicConfig.getOptionalNumber('kafka.maxBytes'), - maxWaitTimeInMs: readOptionalHumanDurationInMs( - topicConfig, - 'kafka.maxWaitTime', - ), - }, - consumerSubscribeTopics: { - topics: topicConfig.getStringArray('kafka.topics'), - }, - }; - }), - }; - }) ?? [] + publishersConfig + ?.keys() + ?.map(publisherKey => + processSinglePublisher( + publisherKey, + publishersConfig.getConfig(publisherKey), + ), + ) ?? [] ); }; From 45146fbbc79ac173778a0af7e55af45029d60361 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Thu, 11 Dec 2025 10:47:44 +0100 Subject: [PATCH 299/312] chore: fix api reports Signed-off-by: benjdlambert --- packages/integration/report.api.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/integration/report.api.md b/packages/integration/report.api.md index f642058ccd..d065f441f0 100644 --- a/packages/integration/report.api.md +++ b/packages/integration/report.api.md @@ -665,6 +665,7 @@ export type GithubAppConfig = { clientId: string; clientSecret: string; allowedInstallationOwners?: string[]; + publicAccess?: boolean; }; // @public From 8cab6b0b7e382e21c8c90f1d84828d724bd1ce65 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 11 Dec 2025 11:02:33 +0100 Subject: [PATCH 300/312] docs: +in Signed-off-by: Patrik Oldsberg --- docs/plugins/structure-of-a-plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/structure-of-a-plugin.md b/docs/plugins/structure-of-a-plugin.md index 0d18942320..8412ead179 100644 --- a/docs/plugins/structure-of-a-plugin.md +++ b/docs/plugins/structure-of-a-plugin.md @@ -81,7 +81,7 @@ export const ExamplePage = examplePlugin.provide( ``` This is where the plugin is created and where it creates and exports extensions -that can be imported and used the app. See reference docs for +that can be imported and used in the app. See reference docs for [`createPlugin`](../reference/core-plugin-api.createplugin.md) or introduction to the new [Composability System](./composability.md). From 93740f4fed898b235e0103d8fa764aa5c336421e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 11 Dec 2025 10:25:54 +0000 Subject: [PATCH 301/312] Initial plan From 2576e92f29c86a5eec108454257b241b911ba64f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 11 Dec 2025 10:30:59 +0000 Subject: [PATCH 302/312] Exit prerelease mode Co-authored-by: benjdlambert <3645856+benjdlambert@users.noreply.github.com> --- .changeset/pre.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 89ee2fe917..3419f9dbb2 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "next", "initialVersions": { "example-app": "0.2.115", From a413977c7c4078a34d49cc649cf007017bca818e Mon Sep 17 00:00:00 2001 From: Rogerio Angeliski Date: Thu, 11 Dec 2025 16:12:30 -0300 Subject: [PATCH 303/312] chore: add page size options to GithubOrgEntityProvider Signed-off-by: Rogerio Angeliski --- .changeset/swift-moments-think.md | 5 ++++ .../report.api.md | 2 ++ .../src/providers/GithubOrgEntityProvider.ts | 28 +++++++++++++++++-- 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 .changeset/swift-moments-think.md diff --git a/.changeset/swift-moments-think.md b/.changeset/swift-moments-think.md new file mode 100644 index 0000000000..185fd4ff48 --- /dev/null +++ b/.changeset/swift-moments-think.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +Added configurable `pageSizes` option to `GithubOrgEntityProvider` for GitHub GraphQL API queries to prevent `RESOURCE_LIMITS_EXCEEDED` errors with organizations with large number of teams and members. This aligns the configuration options with `GithubMultiOrgEntityProvider`. diff --git a/plugins/catalog-backend-module-github/report.api.md b/plugins/catalog-backend-module-github/report.api.md index 5f140a0d5e..aa275cfc9e 100644 --- a/plugins/catalog-backend-module-github/report.api.md +++ b/plugins/catalog-backend-module-github/report.api.md @@ -229,6 +229,7 @@ export class GithubOrgEntityProvider implements EntityProvider { githubCredentialsProvider?: GithubCredentialsProvider; userTransformer?: UserTransformer; teamTransformer?: TeamTransformer; + pageSizes?: Partial; excludeSuspendedUsers?: boolean; }); connect(connection: EntityProviderConnection): Promise; @@ -252,6 +253,7 @@ export interface GithubOrgEntityProviderOptions { id: string; logger: LoggerService; orgUrl: string; + pageSizes?: Partial; schedule?: 'manual' | SchedulerServiceTaskRunner; teamTransformer?: TeamTransformer; userTransformer?: UserTransformer; diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts index 4758311e83..35ec849e12 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts @@ -59,6 +59,7 @@ import { getOrganizationTeams, getOrganizationTeamsFromUsers, getOrganizationUsers, + GithubPageSizes, GithubTeam, } from '../lib/github'; import { areGroupEntities, areUserEntities } from '../lib/guards'; @@ -132,6 +133,12 @@ export interface GithubOrgEntityProviderOptions { */ teamTransformer?: TeamTransformer; + /** + * Optionally configure page sizes for GitHub GraphQL API queries. + * Reduce these values if hitting RESOURCE_LIMITS_EXCEEDED errors. + */ + pageSizes?: Partial; + /** * Optionally exclude suspended users when querying organization users. * @defaultValue false @@ -176,6 +183,7 @@ export class GithubOrgEntityProvider implements EntityProvider { userTransformer: options.userTransformer, teamTransformer: options.teamTransformer, events: options.events, + pageSizes: options.pageSizes, excludeSuspendedUsers: options.excludeSuspendedUsers, }); @@ -194,6 +202,7 @@ export class GithubOrgEntityProvider implements EntityProvider { githubCredentialsProvider?: GithubCredentialsProvider; userTransformer?: UserTransformer; teamTransformer?: TeamTransformer; + pageSizes?: Partial; excludeSuspendedUsers?: boolean; }, ) { @@ -207,6 +216,13 @@ export class GithubOrgEntityProvider implements EntityProvider { return `GithubOrgEntityProvider:${this.options.id}`; } + private getPageSizes(): GithubPageSizes { + return { + ...DEFAULT_PAGE_SIZES, + ...this.options.pageSizes, + }; + } + /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.connect} */ async connect(connection: EntityProviderConnection) { this.connection = connection; @@ -242,18 +258,20 @@ export class GithubOrgEntityProvider implements EntityProvider { }); const { org } = parseGithubOrgUrl(this.options.orgUrl); + const pageSizes = this.getPageSizes(); const { users } = await getOrganizationUsers( client, org, tokenType, this.options.userTransformer, - DEFAULT_PAGE_SIZES, + pageSizes, this.options.excludeSuspendedUsers, ); const { teams } = await getOrganizationTeams( client, org, this.options.teamTransformer, + pageSizes, ); if (areGroupEntities(teams)) { @@ -365,6 +383,7 @@ export class GithubOrgEntityProvider implements EntityProvider { }); const { org } = parseGithubOrgUrl(this.options.orgUrl); + const pageSizes = this.getPageSizes(); const { team } = await getOrganizationTeam( client, org, @@ -377,7 +396,7 @@ export class GithubOrgEntityProvider implements EntityProvider { org, tokenType, this.options.userTransformer, - DEFAULT_PAGE_SIZES, + pageSizes, this.options.excludeSuspendedUsers, ); @@ -395,6 +414,7 @@ export class GithubOrgEntityProvider implements EntityProvider { org, usersToRebuild.map(u => u.metadata.name), this.options.teamTransformer, + pageSizes, ); if (areGroupEntities(teams)) { @@ -458,6 +478,7 @@ export class GithubOrgEntityProvider implements EntityProvider { }); const { org } = parseGithubOrgUrl(this.options.orgUrl); + const pageSizes = this.getPageSizes(); const { team } = await getOrganizationTeam( client, org, @@ -470,7 +491,7 @@ export class GithubOrgEntityProvider implements EntityProvider { org, tokenType, this.options.userTransformer, - DEFAULT_PAGE_SIZES, + pageSizes, this.options.excludeSuspendedUsers, ); @@ -481,6 +502,7 @@ export class GithubOrgEntityProvider implements EntityProvider { org, [userLogin], this.options.teamTransformer, + pageSizes, ); // we include group because the removed event need to update the old group too From 069306ea81a3cb4d87f95c1b0d388b90118293b8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 02:00:09 +0000 Subject: [PATCH 304/312] fix(deps): update dependency next to v15.5.8 [security] Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/package.json | 2 +- docs-ui/yarn.lock | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs-ui/package.json b/docs-ui/package.json index ff5d59e7f0..27ebe16ec2 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -32,7 +32,7 @@ "clsx": "^2.1.1", "html-react-parser": "^5.2.5", "motion": "^12.4.1", - "next": "15.5.7", + "next": "15.5.8", "next-mdx-remote-client": "^2.1.2", "prop-types": "^15.8.1", "react": "19.1.1", diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 3634aca929..c6661c361f 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -854,10 +854,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.5.7": - version: 15.5.7 - resolution: "@next/env@npm:15.5.7" - checksum: 10/11f971691018bd62a5bf253fc843fb2a6cf1431468f5c3a9d4d41753a6ff3e8bf7f539f46aba3f58f8bac59e681bf05fb5d771ac08d7dbd966a601257e1368bf +"@next/env@npm:15.5.8": + version: 15.5.8 + resolution: "@next/env@npm:15.5.8" + checksum: 10/8bc59025b43879208cf83771e1a0879bba9962410ab392fbc2fc04967fa9879bea8722faf293e6b4fff3bbc7302194c4c39a4df37fb9153f2c37c84c200e3139 languageName: node linkType: hard @@ -1416,12 +1416,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20": - version: 20.19.11 - resolution: "@types/node@npm:20.19.11" +"@types/node@npm:^22.13.14": + version: 22.19.2 + resolution: "@types/node@npm:22.19.2" dependencies: undici-types: "npm:~6.21.0" - checksum: 10/7179ed464a781cad20117362df58c12839b40922b53356e1a74f86c99d9d1ef9a27edce360901608f896c247c9c4131ba9c7222331e92cde17b723c75d5c8f2e + checksum: 10/c7e72fde4aef120d984416f4aa01d23b0704eeed7a0a63cdf6178783361f3985abb02a65133b80f47226ad61f38a27fe82c3cd6dd6a62d5b82bc643fe54b9c97 languageName: node linkType: hard @@ -2521,7 +2521,7 @@ __metadata: "@shikijs/transformers": "npm:^3.13.0" "@storybook/react": "npm:^8.6.12" "@types/mdx": "npm:^2.0.13" - "@types/node": "npm:^20" + "@types/node": "npm:^22.13.14" "@types/react": "npm:19.1.9" "@types/react-dom": "npm:19.1.7" "@uiw/codemirror-themes": "npm:^4.23.7" @@ -2533,7 +2533,7 @@ __metadata: html-react-parser: "npm:^5.2.5" lightningcss: "npm:^1.28.2" motion: "npm:^12.4.1" - next: "npm:15.5.7" + next: "npm:15.5.8" next-mdx-remote-client: "npm:^2.1.2" prop-types: "npm:^15.8.1" react: "npm:19.1.1" @@ -5342,11 +5342,11 @@ __metadata: languageName: node linkType: hard -"next@npm:15.5.7": - version: 15.5.7 - resolution: "next@npm:15.5.7" +"next@npm:15.5.8": + version: 15.5.8 + resolution: "next@npm:15.5.8" dependencies: - "@next/env": "npm:15.5.7" + "@next/env": "npm:15.5.8" "@next/swc-darwin-arm64": "npm:15.5.7" "@next/swc-darwin-x64": "npm:15.5.7" "@next/swc-linux-arm64-gnu": "npm:15.5.7" @@ -5397,7 +5397,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/bfac0cbac41b36227ec91d3a0727561f73dfc35d6a78eafd0200528ef95fa2e9d2dba5a8c8922864b4f4e4321ae6a07c6cf8f5766ac3192ad03e68516c3a458a + checksum: 10/bf952a258b65fcc803a670b869e7bd60c921a8005ca4bc58c3849386994c384d4edeb36575c2aaea2aa0026ed774c50d5205a3f1b8702b107c0ff790e473b1ac languageName: node linkType: hard From 9b8bde47d1c9f8361c9f38e005efac3dc82b3c6a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Dec 2025 10:12:30 +0100 Subject: [PATCH 305/312] frontend-plugin-api: remove unnecessary dependencies Signed-off-by: Patrik Oldsberg --- .changeset/swift-wolves-judge.md | 5 +++++ packages/frontend-internal/package.json | 3 +-- packages/frontend-plugin-api/package.json | 5 +---- packages/frontend-plugin-api/report.api.md | 4 ++-- .../frontend-plugin-api/src/apis/definitions/ConfigApi.ts | 2 +- .../frontend-plugin-api/src/schema/createSchemaFromZod.ts | 2 +- packages/frontend-plugin-api/src/wiring/createExtension.ts | 2 +- .../src/wiring/createExtensionBlueprint.ts | 2 +- yarn.lock | 4 ---- 9 files changed, 13 insertions(+), 16 deletions(-) create mode 100644 .changeset/swift-wolves-judge.md diff --git a/.changeset/swift-wolves-judge.md b/.changeset/swift-wolves-judge.md new file mode 100644 index 0000000000..399ed5bad8 --- /dev/null +++ b/.changeset/swift-wolves-judge.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Removed unnecessary dependencies on `@backstage/core-components`, `@backstage/config`, `@material-ui/core`, and `lodash`. diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 4ac3285d9f..f2268f38f4 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -25,8 +25,7 @@ "dependencies": { "@backstage/frontend-plugin-api": "workspace:^", "@backstage/types": "workspace:^", - "@backstage/version-bridge": "workspace:^", - "zod": "^3.22.4" + "@backstage/version-bridge": "workspace:^" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 6fa9d9f342..af3359ff22 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -40,18 +40,15 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/config": "workspace:^", - "@backstage/core-components": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", - "@material-ui/core": "^4.12.4", - "lodash": "^4.17.21", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4" }, "devDependencies": { "@backstage/cli": "workspace:^", + "@backstage/config": "workspace:^", "@backstage/frontend-app-api": "workspace:^", "@backstage/frontend-test-utils": "workspace:^", "@backstage/test-utils": "workspace:^", diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index e45401304b..fbe7110d80 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -6,7 +6,7 @@ import { AnyRouteRefParams as AnyRouteRefParams_2 } from '@backstage/frontend-plugin-api'; import { ApiRef as ApiRef_2 } from '@backstage/frontend-plugin-api'; import { ComponentType } from 'react'; -import { Config } from '@backstage/config'; +import type { Config } from '@backstage/config'; import { ConfigurableExtensionDataRef as ConfigurableExtensionDataRef_2 } from '@backstage/frontend-plugin-api'; import { Expand } from '@backstage/types'; import { ExpandRecursive } from '@backstage/types'; @@ -23,7 +23,7 @@ import { PropsWithChildren } from 'react'; import { ReactNode } from 'react'; import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; import { SwappableComponentRef as SwappableComponentRef_2 } from '@backstage/frontend-plugin-api'; -import { z } from 'zod'; +import type { z } from 'zod'; // @public export type AlertApi = { diff --git a/packages/frontend-plugin-api/src/apis/definitions/ConfigApi.ts b/packages/frontend-plugin-api/src/apis/definitions/ConfigApi.ts index d3bada9e46..f935dfa3af 100644 --- a/packages/frontend-plugin-api/src/apis/definitions/ConfigApi.ts +++ b/packages/frontend-plugin-api/src/apis/definitions/ConfigApi.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { ApiRef, createApiRef } from '../system'; -import { Config } from '@backstage/config'; +import type { Config } from '@backstage/config'; /** * The Config API is used to provide a mechanism to access the diff --git a/packages/frontend-plugin-api/src/schema/createSchemaFromZod.ts b/packages/frontend-plugin-api/src/schema/createSchemaFromZod.ts index 85f9d5c44a..b15ff980ec 100644 --- a/packages/frontend-plugin-api/src/schema/createSchemaFromZod.ts +++ b/packages/frontend-plugin-api/src/schema/createSchemaFromZod.ts @@ -15,7 +15,7 @@ */ import { JsonObject } from '@backstage/types'; -import { z, ZodSchema, ZodTypeDef } from 'zod'; +import { z, type ZodSchema, type ZodTypeDef } from 'zod'; import zodToJsonSchema from 'zod-to-json-schema'; import { PortableSchema } from './types'; diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 9b55505056..6e4aba2910 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -26,7 +26,7 @@ import { } from '@internal/frontend'; import { ExtensionDataRef, ExtensionDataValue } from './createExtensionDataRef'; import { ExtensionInput } from './createExtensionInput'; -import { z } from 'zod'; +import type { z } from 'zod'; import { createSchemaFromZod } from '../schema/createSchemaFromZod'; import { OpaqueExtensionDefinition } from '@internal/frontend'; import { ExtensionDataContainer } from './types'; diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts index c6723388ae..a7537d27e9 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts @@ -26,7 +26,7 @@ import { ctxParamsSymbol, VerifyExtensionAttachTo, } from './createExtension'; -import { z } from 'zod'; +import type { z } from 'zod'; import { ExtensionInput } from './createExtensionInput'; import { ExtensionDataRef, ExtensionDataValue } from './createExtensionDataRef'; import { createExtensionDataContainer } from '@internal/frontend'; diff --git a/yarn.lock b/yarn.lock index aa77e44a64..d0a49e1dbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3819,19 +3819,16 @@ __metadata: dependencies: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" - "@backstage/core-components": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/frontend-app-api": "workspace:^" "@backstage/frontend-test-utils": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" - "@material-ui/core": "npm:^4.12.4" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^16.0.0" "@types/react": "npm:^18.0.0" history: "npm:^5.3.0" - lodash: "npm:^4.17.21" react: "npm:^18.0.2" react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.3.0" @@ -9873,7 +9870,6 @@ __metadata: "@backstage/version-bridge": "workspace:^" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^16.0.0" - zod: "npm:^3.22.4" languageName: unknown linkType: soft From 2460fbc92fcb8033084a1891c3c9974a5133b3be Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Dec 2025 14:59:48 +0100 Subject: [PATCH 306/312] OWNERS: add new core maintainers and sponsor Signed-off-by: Patrik Oldsberg --- OWNERS.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/OWNERS.md b/OWNERS.md index 44b4ebca15..764237d9c1 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -5,11 +5,13 @@ Team: @backstage/maintainers -| Maintainer | Organization | GitHub | Discord | -| --------------- | ------------ | ----------------------------------------------- | ------------- | -| Patrik Oldsberg | Spotify | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | -| Fredrik Adelöw | Spotify | [freben](https://github.com/freben) | `freben#3926` | -| Ben Lambert | Spotify | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | +| Maintainer | Organization | GitHub | Discord | +| --------------- | ------------ | ----------------------------------------------------- | ------------- | +| André Wanlin | Spotify | [awanlin](https://github.com/awanlin) | `ahhhndre` | +| Aramis Sennyey | DoorDash | [aramissennyeydd](https://github.com/aramissennyeydd) | `Aramis#7984` | +| Ben Lambert | Spotify | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` | +| Fredrik Adelöw | Spotify | [freben](https://github.com/freben) | `freben#3926` | +| Patrik Oldsberg | Spotify | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` | ## Project Areas @@ -78,7 +80,7 @@ Scope: The Backstage Documentation and Microsite, excluding the plugins listing | Name | Organization | GitHub | Discord | | --------------- | ------------- | ----------------------------------------------------- | ------------- | -| Andre Wanlin | Spotify | [awanlin](https://github.com/awanlin) | `ahhhndre` | +| André Wanlin | Spotify | [awanlin](https://github.com/awanlin) | `ahhhndre` | | Aramis Sennyey | DoorDash | [aramissennyeydd](https://github.com/aramissennyeydd) | `Aramis#7984` | | Peter Macdonald | VodafoneZiggo | [Parsifal-M](https://github.com/Parsifal-M) | `parsifal` | @@ -267,6 +269,7 @@ Scope: The Scaffolder frontend and backend plugins, and related tooling. | Niklas Gustavsson | Spotify | [protocol7](https://github.com/protocol7) | | | Dave Zolotusky | Spotify | [dzolotusky](https://github.com/dzolotusky) | | | Pia Nilsson | Spotify | [pianilsson](https://github.com/pianilsson) | | +| Stefan Särne | Spotify | [ssarne](https://github.com/ssarne) | | ## Organization Members @@ -274,9 +277,7 @@ Scope: The Scaffolder frontend and backend plugins, and related tooling. | ------------------------------ | ------------------------- | ----------------------------------------------------- | ------------------------------ | | Adam Harvey | Okta | [adamdmharvey](https://github.com/adamdmharvey) | `adamharvey_` | | Alex Crome | | [afscrome](https://github.com/afscrome) | `afscrome` | -| Andre Wanlin | Spotify | [awanlin](https://github.com/awanlin) | `ahhhndre` | | Andrew Thauer | Wealthsimple | [andrewthauer](https://github.com/andrewthauer) | `andrewthauer#3060` | -| Aramis Sennyey | DoorDash | [aramissennyeydd](https://github.com/aramissennyeydd) | `Aramis#7984` | | Brian Fletcher | Roadie.io | [punkle](https://github.com/punkle) | `Brian Fletcher#7051` | | Carlos Esteban Lopez Jaramillo | VMWare | [luchillo17](https://github.com/luchillo17) | `luchillo17#8777` | | David Tuite | Roadie.io | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` | From 06b3889ba3f7b3a77d724e8be271c018f6cc0847 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:52:51 +0000 Subject: [PATCH 307/312] fix(deps): update dependency next to v15.5.9 [security] Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs-ui/package.json | 2 +- docs-ui/yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs-ui/package.json b/docs-ui/package.json index 27ebe16ec2..d6dcb4830a 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -32,7 +32,7 @@ "clsx": "^2.1.1", "html-react-parser": "^5.2.5", "motion": "^12.4.1", - "next": "15.5.8", + "next": "15.5.9", "next-mdx-remote-client": "^2.1.2", "prop-types": "^15.8.1", "react": "19.1.1", diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index c6661c361f..7d22bb8977 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -854,10 +854,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.5.8": - version: 15.5.8 - resolution: "@next/env@npm:15.5.8" - checksum: 10/8bc59025b43879208cf83771e1a0879bba9962410ab392fbc2fc04967fa9879bea8722faf293e6b4fff3bbc7302194c4c39a4df37fb9153f2c37c84c200e3139 +"@next/env@npm:15.5.9": + version: 15.5.9 + resolution: "@next/env@npm:15.5.9" + checksum: 10/962329701343c2617c85ae99ef35adfd9e8f7b58d9c0316f2f0857f82875a91ef3151ef0743c50964b0066aa3d1214c5193cf229f7757d7c9329f7fb95605a4a languageName: node linkType: hard @@ -2533,7 +2533,7 @@ __metadata: html-react-parser: "npm:^5.2.5" lightningcss: "npm:^1.28.2" motion: "npm:^12.4.1" - next: "npm:15.5.8" + next: "npm:15.5.9" next-mdx-remote-client: "npm:^2.1.2" prop-types: "npm:^15.8.1" react: "npm:19.1.1" @@ -5342,11 +5342,11 @@ __metadata: languageName: node linkType: hard -"next@npm:15.5.8": - version: 15.5.8 - resolution: "next@npm:15.5.8" +"next@npm:15.5.9": + version: 15.5.9 + resolution: "next@npm:15.5.9" dependencies: - "@next/env": "npm:15.5.8" + "@next/env": "npm:15.5.9" "@next/swc-darwin-arm64": "npm:15.5.7" "@next/swc-darwin-x64": "npm:15.5.7" "@next/swc-linux-arm64-gnu": "npm:15.5.7" @@ -5397,7 +5397,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/bf952a258b65fcc803a670b869e7bd60c921a8005ca4bc58c3849386994c384d4edeb36575c2aaea2aa0026ed774c50d5205a3f1b8702b107c0ff790e473b1ac + checksum: 10/ac27b82de08c9720e8e99cd64102af5e30306a8c861630d50da347a02c288cc441273ada64875c47e7a4d5991ff69cc92b23e906ce3271f9835a7911a0f060cc languageName: node linkType: hard From e49a022a16464a12de69f174c6afd51500014791 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Fri, 12 Dec 2025 10:16:48 -0800 Subject: [PATCH 308/312] bugfix: add devtools alpha permissions to devtools-backend Signed-off-by: williamwu-mongodb --- plugins/devtools-backend/src/plugin.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/devtools-backend/src/plugin.ts b/plugins/devtools-backend/src/plugin.ts index d3fefda343..d7ac3ff6d9 100644 --- a/plugins/devtools-backend/src/plugin.ts +++ b/plugins/devtools-backend/src/plugin.ts @@ -20,6 +20,10 @@ import { } from '@backstage/backend-plugin-api'; import { createRouter } from './service/router'; import { devToolsPermissions } from '@backstage/plugin-devtools-common'; +import { + devToolsTaskSchedulerReadPermission, + devToolsTaskSchedulerCreatePermission, +} from '@backstage/plugin-devtools-common/alpha'; /** * DevTools backend plugin @@ -61,7 +65,11 @@ export const devtoolsPlugin = createBackendPlugin({ path: '/health', allow: 'unauthenticated', }); - permissionsRegistry.addPermissions(devToolsPermissions); + permissionsRegistry.addPermissions([ + ...devToolsPermissions, + devToolsTaskSchedulerReadPermission, + devToolsTaskSchedulerCreatePermission, + ]); }, }); }, From 347bd8f99b7722537492f823143e446bfa4b2d4f Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Fri, 12 Dec 2025 10:19:15 -0800 Subject: [PATCH 309/312] add changeset Signed-off-by: williamwu-mongodb --- .changeset/poor-bees-relate.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/poor-bees-relate.md diff --git a/.changeset/poor-bees-relate.md b/.changeset/poor-bees-relate.md new file mode 100644 index 0000000000..dd0105a673 --- /dev/null +++ b/.changeset/poor-bees-relate.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools-backend': patch +--- + +add the devtools alpha permissions to the devtools backend plugin permissions registry From 29c757ca6928f4ead825a5a96532dd9933f0a6b1 Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Fri, 12 Dec 2025 10:33:10 -0800 Subject: [PATCH 310/312] remove changeset Signed-off-by: williamwu-mongodb --- .changeset/poor-bees-relate.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/poor-bees-relate.md diff --git a/.changeset/poor-bees-relate.md b/.changeset/poor-bees-relate.md deleted file mode 100644 index dd0105a673..0000000000 --- a/.changeset/poor-bees-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-devtools-backend': patch ---- - -add the devtools alpha permissions to the devtools backend plugin permissions registry From f5fd27ef0f8e6b4e2b97eeb4d8ed53dea5a168af Mon Sep 17 00:00:00 2001 From: williamwu-mongodb Date: Fri, 12 Dec 2025 10:40:46 -0800 Subject: [PATCH 311/312] modify existing changeset Signed-off-by: williamwu-mongodb --- .changeset/short-lizards-find.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.changeset/short-lizards-find.md b/.changeset/short-lizards-find.md index 6b0a307d61..051fcd20bb 100644 --- a/.changeset/short-lizards-find.md +++ b/.changeset/short-lizards-find.md @@ -1,5 +1,6 @@ --- -'@backstage/plugin-devtools-common': patch +'@backstage/plugin-devtools-common': patch' +'@backstage/plugin-devtools-backend': patch '@backstage/plugin-devtools': patch --- From 825ebb9994326e9da1fcb11a28003f4e6f68c30f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sat, 13 Dec 2025 19:33:04 +0100 Subject: [PATCH 312/312] Update .changeset/short-cloths-tie.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/short-cloths-tie.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/short-cloths-tie.md b/.changeset/short-cloths-tie.md index 1ee308c308..fe379fb18d 100644 --- a/.changeset/short-cloths-tie.md +++ b/.changeset/short-cloths-tie.md @@ -1,5 +1,5 @@ --- -'@backstage/backend-defaults': minor +'@backstage/backend-defaults': patch --- Don't warn when parsing `storeOptions` for `memory` cache