From e957db135de81001c9e74a2c8a0505d418148cfc Mon Sep 17 00:00:00 2001 From: Scott Rosenberg Date: Mon, 30 Dec 2024 18:17:55 +0200 Subject: [PATCH 01/58] Create crossplane.yaml Signed-off-by: Scott Rosenberg --- microsite/data/plugins/crossplane.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 microsite/data/plugins/crossplane.yaml diff --git a/microsite/data/plugins/crossplane.yaml b/microsite/data/plugins/crossplane.yaml new file mode 100644 index 0000000000..0fe66ae43c --- /dev/null +++ b/microsite/data/plugins/crossplane.yaml @@ -0,0 +1,9 @@ +title: Crossplane +author: terasky.com +authorUrl: https://github.com/terasky-oss +category: Kubernetes +description: View Crossplane Resources in Backstage. +documentation: https://github.com/TeraSky-OSS/backstage-plugins/tree/main/plugins/crossplane-resources +iconUrl: https://github.com/cncf/artwork/blob/main/projects/crossplane/icon/color/crossplane-icon-color.png?raw=true +npmPackageName: '@terasky/backstage-plugin-crossplane-resources-frontend' +addedDate: '2024-12-30' From 782c2cf900bb69f3d9716912e809c9410e0ebe39 Mon Sep 17 00:00:00 2001 From: Scott Rosenberg Date: Mon, 30 Dec 2024 18:35:08 +0200 Subject: [PATCH 02/58] Create kubernetes-ingestor.yaml Signed-off-by: Scott Rosenberg --- microsite/data/plugins/kubernetes-ingestor.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 microsite/data/plugins/kubernetes-ingestor.yaml diff --git a/microsite/data/plugins/kubernetes-ingestor.yaml b/microsite/data/plugins/kubernetes-ingestor.yaml new file mode 100644 index 0000000000..006333e990 --- /dev/null +++ b/microsite/data/plugins/kubernetes-ingestor.yaml @@ -0,0 +1,9 @@ +title: Kubernetes Ingestor +author: terasky.com +authorUrl: https://github.com/terasky-oss +category: Kubernetes +description: Automatically Ingest Kubernetes Workloads and Crossplane Claims as Components, and XRDs as Templates. +documentation: https://github.com/TeraSky-OSS/backstage-plugins/tree/main/plugins/kubernetes-ingestor +iconUrl: https://avatars.githubusercontent.com/u/13629408 +npmPackageName: '@terasky/backstage-plugin-kubernetes-ingestor' +addedDate: '2024-12-30' From d2b16dbd7dd532980cee61081d95e9f3f9981a3f Mon Sep 17 00:00:00 2001 From: Niklas Aronsson Date: Fri, 20 Sep 2024 13:46:49 +0200 Subject: [PATCH 03/58] feat(gerrit-urlreader): support fetching content from a commit Signed-off-by: Niklas Aronsson --- .changeset/light-sloths-report.md | 6 + .changeset/old-waves-camp.md | 13 ++ .../urlReader/lib/GerritUrlReader.test.ts | 72 ++++++++--- .../urlReader/lib/GerritUrlReader.ts | 84 ++++++------ packages/integration/report.api.md | 10 +- packages/integration/src/gerrit/core.test.ts | 122 ++++++++++++++++++ packages/integration/src/gerrit/core.ts | 61 ++++++++- packages/integration/src/gerrit/index.ts | 1 + 8 files changed, 302 insertions(+), 67 deletions(-) create mode 100644 .changeset/light-sloths-report.md create mode 100644 .changeset/old-waves-camp.md diff --git a/.changeset/light-sloths-report.md b/.changeset/light-sloths-report.md new file mode 100644 index 0000000000..8e9c20e9a4 --- /dev/null +++ b/.changeset/light-sloths-report.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-defaults': patch +--- + +The `GerritUrlReader` can now read content from a commit and not only from the top of a branch. The +Gitiles URL must contain the full commit `SHA` hash like: `https://gerrit.com/gitiles/repo/+/2846e8dc327ae2f60249983b1c3b96f42f205bae/catalog-info.yaml`. diff --git a/.changeset/old-waves-camp.md b/.changeset/old-waves-camp.md new file mode 100644 index 0000000000..04e3b520ae --- /dev/null +++ b/.changeset/old-waves-camp.md @@ -0,0 +1,13 @@ +--- +'@backstage/integration': patch +--- + +A new Gerrit helper function (`buildGerritGitilesArchiveUrlFromLocation`) has been added. This +constructs a Gitiles URL to download an archive. It is similar to the existing +`buildGerritGitilesArchiveUrl` but also support content referenced by a full commit `SHA`. + +**DEPRECATIONS**: The function `buildGerritGitilesArchiveUrl` is deprecated, use the +`buildGerritGitilesArchiveUrlFromLocation` function instead. + +**DEPRECATIONS**: The function `parseGerritGitilesUrl` is deprecated, use the +`parseGitilesUrlRef` function instead. diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts index 14ca4c018e..2fbb85b9b1 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts @@ -20,7 +20,7 @@ import { registerMswTestHooks, } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; -import { NotModifiedError, NotFoundError } from '@backstage/errors'; +import { NotModifiedError } from '@backstage/errors'; import { GerritIntegration, readGerritIntegrationConfig, @@ -36,22 +36,11 @@ import { GerritUrlReader } from './GerritUrlReader'; import getRawBody from 'raw-body'; const mockDir = createMockDirectory({ mockOsTmpDir: true }); -const env = process.env; -process.env = { ...env, DISABLE_GERRIT_GITILES_REQUIREMENT: '1' }; const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config: new ConfigReader({}), }); -const cloneMock = jest.fn(() => Promise.resolve()); -jest.mock('./git', () => ({ - Git: { - fromAuth: () => ({ - clone: cloneMock, - }), - }, -})); - // Gerrit processor without a gitilesBaseUrl configured const gerritProcessor = new GerritUrlReader( new GerritIntegration( @@ -96,12 +85,10 @@ describe.skip('GerritUrlReader', () => { beforeEach(() => { mockDir.clear(); - process.env = { ...env, DISABLE_GERRIT_GITILES_REQUIREMENT: '1' }; }); afterAll(() => { jest.clearAllMocks(); - process.env = env; }); describe('reader factory', () => { @@ -186,7 +173,24 @@ describe.skip('GerritUrlReader', () => { const buffer = await result.buffer(); expect(buffer.toString()).toBe(responseBuffer.toString()); }); - + it('should be able to read file contents of a commit as buffer', async () => { + worker.use( + rest.get( + 'https://gerrit.com/projects/web%2Fproject/commits/f775f9119c313c7ffc890d7908a45997273434d5/files/LICENSE/content', + (_, res, ctx) => { + return res( + ctx.status(200), + ctx.body(responseBuffer.toString('base64')), + ); + }, + ), + ); + const result = await gerritProcessor.readUrl( + 'https://gerrit.com/web/project/+/f775f9119c313c7ffc890d7908a45997273434d5/LICENSE', + ); + const buffer = await result.buffer(); + expect(buffer.toString()).toBe(responseBuffer.toString()); + }); it('should be able to read file contents as stream', async () => { worker.use( rest.get( @@ -258,6 +262,7 @@ describe.skip('GerritUrlReader', () => { const treeUrlGitiles = 'https://gerrit.com/gitiles/app/web/+/refs/heads/master/'; const etag = '52432507a70b677b5674b019c9a46b2e9f29d0a1'; + const sha = 'f775f9119c313c7ffc890d7908a45997273434d5'; const mkdocsContent = 'a repo fetched using git clone'; const mdContent = 'doc'; const repoArchiveBuffer = fs.readFileSync( @@ -302,6 +307,19 @@ describe.skip('GerritUrlReader', () => { ctx.body(repoArchiveDocsBuffer), ), ), + rest.get( + `https://gerrit.com/gitiles/app/web/\\+archive/${sha}.tar.gz`, + (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/x-gzip'), + ctx.set( + 'content-disposition', + 'attachment; filename=web-refs/heads/master.tar.gz', + ), + ctx.body(repoArchiveBuffer), + ), + ), ); }); @@ -330,8 +348,6 @@ describe.skip('GerritUrlReader', () => { const mdFile = await files[1].content(); expect(mdFile.toString()).toBe('site_name: Test\n'); - - expect(cloneMock).not.toHaveBeenCalled(); }); it('throws NotModifiedError for matching etags.', async () => { @@ -346,15 +362,17 @@ describe.skip('GerritUrlReader', () => { ); }); - it('throws NotFoundError if branch info not found.', async () => { + it('throws ResponseError if branch info not found.', async () => { worker.use( rest.get(branchAPIUrl, (_, res, ctx) => { return res(ctx.status(404, 'Not found.')); }), ); - await expect(gerritProcessor.readTree(treeUrl)).rejects.toThrow( - NotFoundError, + await expect( + gerritProcessor.readTree(treeUrl), + ).rejects.toMatchInlineSnapshot( + `[ResponseError: Request failed with 404 Not found.]`, ); }); @@ -386,8 +404,20 @@ describe.skip('GerritUrlReader', () => { const mdFile = await files[0].content(); expect(mdFile.toString()).toBe('# Test\n'); + }); + it('throws NotModifiedError for a known commit.', async () => { + const shaTreeUrl = `https://gerrit.com/app/web/+/${sha}/`; - expect(cloneMock).not.toHaveBeenCalled(); + await expect( + gerritProcessor.readTree(shaTreeUrl, { etag: sha }), + ).rejects.toThrow(NotModifiedError); + }); + it('can fetch files for a specifc sha.', async () => { + const response = await gerritProcessorWithGitiles.readTree( + `https://gerrit.com/gitiles/app/web/+/${sha}/`, + ); + + expect(response.etag).toBe(sha); }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts index 2ef9116208..835624627b 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts @@ -28,14 +28,18 @@ import { Readable } from 'stream'; import { GerritIntegration, ScmIntegrations, - buildGerritGitilesArchiveUrl, + buildGerritGitilesArchiveUrlFromLocation, getGerritBranchApiUrl, getGerritFileContentsApiUrl, getGerritRequestOptions, - parseGerritGitilesUrl, parseGerritJsonResponse, + parseGitilesUrlRef, } from '@backstage/integration'; -import { NotFoundError, NotModifiedError } from '@backstage/errors'; +import { + NotFoundError, + NotModifiedError, + ResponseError, +} from '@backstage/errors'; import { ReadTreeResponseFactory, ReaderFactory } from './types'; /** @@ -135,34 +139,9 @@ export class GerritUrlReader implements UrlReaderService { url: string, options?: UrlReaderServiceReadTreeOptions, ): Promise { - const apiUrl = getGerritBranchApiUrl(this.integration.config, url); - let response: Response; - try { - response = await fetch(apiUrl, { - method: 'GET', - ...getGerritRequestOptions(this.integration.config), - }); - } catch (e) { - throw new Error(`Unable to read branch state ${url}, ${e}`); - } + const urlRevision = await this.getRevisionForUrl(url, options); - if (response.status === 404) { - throw new NotFoundError(`Not found: ${url}`); - } - - if (!response.ok) { - throw new Error( - `${url} could not be read as ${apiUrl}, ${response.status} ${response.statusText}`, - ); - } - const branchInfo = (await parseGerritJsonResponse(response as any)) as { - revision: string; - }; - if (options?.etag === branchInfo.revision) { - throw new NotModifiedError(); - } - - return this.readTreeFromGitiles(url, branchInfo.revision, options); + return this.readTreeFromGitiles(url, urlRevision, options); } async search(): Promise { @@ -179,16 +158,10 @@ export class GerritUrlReader implements UrlReaderService { revision: string, options?: UrlReaderServiceReadTreeOptions, ) { - const { branch, filePath, project } = parseGerritGitilesUrl( + const archiveUrl = buildGerritGitilesArchiveUrlFromLocation( this.integration.config, url, ); - const archiveUrl = buildGerritGitilesArchiveUrl( - this.integration.config, - project, - branch, - filePath, - ); const archiveResponse = await fetch(archiveUrl, { ...getGerritRequestOptions(this.integration.config), // TODO(freben): The signal cast is there because pre-3.x versions of @@ -217,4 +190,41 @@ export class GerritUrlReader implements UrlReaderService { stripFirstDirectory: false, }); } + + private async getRevisionForUrl( + url: string, + options?: UrlReaderServiceReadTreeOptions, + ): Promise { + const { ref, refType } = parseGitilesUrlRef(this.integration.config, url); + // The url points to a static revision. + if (refType === 'sha') { + if (options?.etag === ref) { + throw new NotModifiedError(); + } + return ref; + } + + const apiUrl = getGerritBranchApiUrl(this.integration.config, url); + let response: Response; + try { + response = await fetch(apiUrl, { + method: 'GET', + ...getGerritRequestOptions(this.integration.config), + }); + } catch (e) { + throw new Error(`Unable to read branch state ${url}, ${e}`); + } + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + const branchInfo = (await parseGerritJsonResponse(response as any)) as { + revision: string; + }; + if (options?.etag === branchInfo.revision) { + throw new NotModifiedError(); + } + return branchInfo.revision; + } } diff --git a/packages/integration/report.api.md b/packages/integration/report.api.md index 5129dbb7c2..6bb48b8185 100644 --- a/packages/integration/report.api.md +++ b/packages/integration/report.api.md @@ -299,7 +299,7 @@ export type BitbucketServerIntegrationConfig = { password?: string; }; -// @public +// @public @deprecated export function buildGerritGitilesArchiveUrl( config: GerritIntegrationConfig, project: string, @@ -307,6 +307,12 @@ export function buildGerritGitilesArchiveUrl( filePath: string, ): string; +// @public +export function buildGerritGitilesArchiveUrlFromLocation( + config: GerritIntegrationConfig, + url: string, +): string; + // @public export class DefaultAzureCredentialsManager implements AzureCredentialsManager { static fromIntegrations( @@ -802,7 +808,7 @@ export interface IntegrationsByType { harness: ScmIntegrationsGroup; } -// @public +// @public @deprecated export function parseGerritGitilesUrl( config: GerritIntegrationConfig, url: string, diff --git a/packages/integration/src/gerrit/core.test.ts b/packages/integration/src/gerrit/core.test.ts index c031612c40..5899196f65 100644 --- a/packages/integration/src/gerrit/core.test.ts +++ b/packages/integration/src/gerrit/core.test.ts @@ -21,6 +21,7 @@ import { registerMswTestHooks } from '../helpers'; import { GerritIntegrationConfig } from './config'; import { buildGerritGitilesArchiveUrl, + buildGerritGitilesArchiveUrlFromLocation, buildGerritGitilesUrl, getGerritBranchApiUrl, getGerritCloneRepoUrl, @@ -115,6 +116,94 @@ describe('gerrit core', () => { }); }); + describe('buildGerritGitilesArchiveUrlFromLocation', () => { + const config: GerritIntegrationConfig = { + host: 'gerrit.com', + baseUrl: 'https://gerrit.com', + gitilesBaseUrl: 'https://gerrit.com/gitiles', + }; + const configWithPath: GerritIntegrationConfig = { + host: 'gerrit.com', + baseUrl: 'https://gerrit.com/gerrit', + gitilesBaseUrl: 'https://gerrit.com/gerrit/plugins/gitiles', + }; + const configWithDedicatedGitiles: GerritIntegrationConfig = { + host: 'gerrit.com', + baseUrl: 'https://gerrit.com/gerrit', + gitilesBaseUrl: 'https://dedicated-gitiles-server.com/gerrit/gitiles', + }; + it('can create an archive url for a branch', () => { + expect( + buildGerritGitilesArchiveUrlFromLocation( + config, + 'https://gerrit.com/gitiles/repo/+/refs/heads/dev/', + ), + ).toEqual( + 'https://gerrit.com/gitiles/repo/+archive/refs/heads/dev.tar.gz', + ); + }); + it('can create an archive url for a sha', () => { + expect( + buildGerritGitilesArchiveUrlFromLocation( + config, + 'https://gerrit.com/gitiles/repo/+/2846e8dc327ae2f60249983b1c3b96f42f205bae/', + ), + ).toEqual( + 'https://gerrit.com/gitiles/repo/+archive/2846e8dc327ae2f60249983b1c3b96f42f205bae.tar.gz', + ); + }); + it('can create an archive url for a sha with a specific directory', () => { + expect( + buildGerritGitilesArchiveUrlFromLocation( + config, + 'https://gerrit.com/gitiles/repo/+/2846e8dc327ae2f60249983b1c3b96f42f205bae/docs', + ), + ).toEqual( + 'https://gerrit.com/gitiles/repo/+archive/2846e8dc327ae2f60249983b1c3b96f42f205bae/docs.tar.gz', + ); + }); + it('can create an archive url for a specific directory', () => { + expect( + buildGerritGitilesArchiveUrlFromLocation( + config, + 'https://gerrit.com/gitiles/repo/+/refs/heads/dev/docs/', + ), + ).toEqual( + 'https://gerrit.com/gitiles/repo/+archive/refs/heads/dev/docs.tar.gz', + ); + }); + it('can create an authenticated url when auth is enabled and an url-path is used', () => { + const authConfig = { + ...configWithPath, + username: 'username', + password: 'password', + }; + expect( + buildGerritGitilesArchiveUrlFromLocation( + authConfig, + 'https://gerrit.com/gerrit/plugins/gitiles/repo/+/refs/heads/dev/docs/', + ), + ).toEqual( + 'https://gerrit.com/gerrit/a/plugins/gitiles/repo/+archive/refs/heads/dev/docs.tar.gz', + ); + }); + it('Cannot build an authenticated url when a dedicated Gitiles server is used', () => { + const authConfig = { + ...configWithDedicatedGitiles, + username: 'username', + password: 'password', + }; + expect(() => + buildGerritGitilesArchiveUrlFromLocation( + authConfig, + 'https://gerrit.com/gitiles/repo/+/refs/heads/dev/', + ), + ).toThrow( + 'Since the baseUrl (Gerrit) is not part of the gitilesBaseUrl, an authentication URL could not be constructed.', + ); + }); + }); + describe('buildGerritGitilesUrl', () => { it('can create an url from arguments', () => { const config: GerritIntegrationConfig = { @@ -426,6 +515,39 @@ describe('gerrit core', () => { 'https://gerrit.com/a/projects/web%2Fproject/branches/master/files/README.md/content', ); }); + it('can create an authenticated url for a commit.', () => { + const authConfig: GerritIntegrationConfig = { + host: 'gerrit.com', + baseUrl: 'https://gerrit.com', + gitilesBaseUrl: 'https://gerrit.com', + username: 'u', + password: 'u', + }; + + const authFileContentUrl = getGerritFileContentsApiUrl( + authConfig, + 'https://gerrit.com/web/project/+/157f862803d45b9d269f0e390f88aece1ded51e8/README.md', + ); + expect(authFileContentUrl).toEqual( + 'https://gerrit.com/a/projects/web%2Fproject/commits/157f862803d45b9d269f0e390f88aece1ded51e8/files/README.md/content', + ); + }); + it('will throw for unsupported ref types (tag).', () => { + const authConfig: GerritIntegrationConfig = { + host: 'gerrit.com', + baseUrl: 'https://gerrit.com', + gitilesBaseUrl: 'https://gerrit.com', + username: 'u', + password: 'u', + }; + + expect(() => + getGerritFileContentsApiUrl( + authConfig, + 'https://gerrit.com/modules/events-broker/+/refs/tags/v3.5.6/src/main/java/com/gerritforge/gerrit/eventbroker/BrokerApi.java', + ), + ).toThrow(/gitiles ref type/); + }); }); describe('parseGerritJsonResponse', () => { diff --git a/packages/integration/src/gerrit/core.ts b/packages/integration/src/gerrit/core.ts index e50ce97bbb..d44865881d 100644 --- a/packages/integration/src/gerrit/core.ts +++ b/packages/integration/src/gerrit/core.ts @@ -41,8 +41,9 @@ const GERRIT_BODY_PREFIX = ")]}'"; * * @param url - An URL pointing to a file stored in git. * @public + * @deprecated `parseGerritGitilesUrl` is deprecated. Use + * {@link parseGitilesUrlRef} instead. */ - export function parseGerritGitilesUrl( config: GerritIntegrationConfig, url: string, @@ -215,6 +216,8 @@ export function buildGerritGitilesUrl( * @param branch - The branch we will target. * @param filePath - The absolute file path. * @public + * @deprecated `buildGerritGitilesArchiveUrl` is deprecated. Use + * {@link buildGerritGitilesArchiveUrlFromLocation} instead. */ export function buildGerritGitilesArchiveUrl( config: GerritIntegrationConfig, @@ -229,6 +232,38 @@ export function buildGerritGitilesArchiveUrl( )}/${project}/+archive/refs/heads/${branch}${archiveName}`; } +/** + * Build a Gerrit Gitiles archive url from a Gitiles url. + * + * @param config - A Gerrit provider config. + * @param url - The gitiles url + * @public + */ +export function buildGerritGitilesArchiveUrlFromLocation( + config: GerritIntegrationConfig, + url: string, +): string { + const { + path: filePath, + ref, + project, + refType, + } = parseGitilesUrlRef(config, url); + const archiveName = + filePath === '/' || filePath === '' ? '.tar.gz' : `/${filePath}.tar.gz`; + if (refType === 'branch') { + return `${getGitilesAuthenticationUrl( + config, + )}/${project}/+archive/refs/heads/${ref}${archiveName}`; + } + if (refType === 'sha') { + return `${getGitilesAuthenticationUrl( + config, + )}/${project}/+archive/${ref}${archiveName}`; + } + throw new Error(`Unsupported gitiles ref type: ${refType}`); +} + /** * Return the authentication prefix. * @@ -324,13 +359,25 @@ export function getGerritFileContentsApiUrl( config: GerritIntegrationConfig, url: string, ) { - const { branch, filePath, project } = parseGerritGitilesUrl(config, url); + const { ref, refType, path, project } = parseGitilesUrlRef(config, url); - return `${config.baseUrl}${getAuthenticationPrefix( - config, - )}projects/${encodeURIComponent( - project, - )}/branches/${branch}/files/${encodeURIComponent(filePath)}/content`; + // https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-content + if (refType === 'branch') { + return `${config.baseUrl}${getAuthenticationPrefix( + config, + )}projects/${encodeURIComponent( + project, + )}/branches/${ref}/files/${encodeURIComponent(path)}/content`; + } + // https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-content-from-commit + if (refType === 'sha') { + return `${config.baseUrl}${getAuthenticationPrefix( + config, + )}projects/${encodeURIComponent( + project, + )}/commits/${ref}/files/${encodeURIComponent(path)}/content`; + } + throw new Error(`Unsupported gitiles ref type: ${refType}`); } /** diff --git a/packages/integration/src/gerrit/index.ts b/packages/integration/src/gerrit/index.ts index f2e5934c95..3df52bf02b 100644 --- a/packages/integration/src/gerrit/index.ts +++ b/packages/integration/src/gerrit/index.ts @@ -20,6 +20,7 @@ export { } from './config'; export { buildGerritGitilesArchiveUrl, + buildGerritGitilesArchiveUrlFromLocation, getGerritBranchApiUrl, getGerritCloneRepoUrl, getGerritFileContentsApiUrl, From ca5883a7261f846167ce283fe75ad35503ee6c6a Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Thu, 2 Jan 2025 15:52:31 +0100 Subject: [PATCH 04/58] cli: remove vite flag Signed-off-by: Vincenzo Scamporlino --- packages/app/package.json | 5 - packages/cli/package.json | 28 +- packages/cli/src/lib/bundler/server.ts | 239 +++++---------- yarn.lock | 391 +++---------------------- 4 files changed, 113 insertions(+), 550 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index a0fab03738..17162eafd3 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -73,18 +73,13 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@modyfi/vite-plugin-yaml": "^1.1.0", "@octokit/rest": "^19.0.3", - "@vitejs/plugin-react": "^4.3.1", "history": "^5.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4", - "vite": "^5.0.0", - "vite-plugin-html": "^3.2.2", - "vite-plugin-node-polyfills": "^0.22.0", "zen-observable": "^0.10.0" }, "devDependencies": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 41ef6c10fd..3bf74a4735 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -192,28 +192,16 @@ "@types/terser-webpack-plugin": "^5.0.4", "@types/webpack-sources": "^3.2.3", "@types/yarnpkg__lockfile": "^1.1.4", - "@vitejs/plugin-react": "^4.3.1", "del": "^8.0.0", "msw": "^1.0.0", - "nodemon": "^3.0.1", - "vite": "^5.0.0", - "vite-plugin-html": "^3.2.2", - "vite-plugin-node-polyfills": "^0.22.0" + "nodemon": "^3.0.1" }, "peerDependencies": { - "@modyfi/vite-plugin-yaml": "^1.1.0", "@rspack/core": "^1.0.10", "@rspack/dev-server": "^1.0.9", - "@rspack/plugin-react-refresh": "^1.0.0", - "@vitejs/plugin-react": "^4.0.4", - "vite": "^5.0.0", - "vite-plugin-html": "^3.2.0", - "vite-plugin-node-polyfills": "^0.22.0" + "@rspack/plugin-react-refresh": "^1.0.0" }, "peerDependenciesMeta": { - "@modyfi/vite-plugin-yaml": { - "optional": true - }, "@rspack/core": { "optional": true }, @@ -222,18 +210,6 @@ }, "@rspack/plugin-react-refresh": { "optional": true - }, - "@vitejs/plugin-react": { - "optional": true - }, - "vite": { - "optional": true - }, - "vite-plugin-html": { - "optional": true - }, - "vite-plugin-node-polyfills": { - "optional": true } }, "configSchema": { diff --git a/packages/cli/src/lib/bundler/server.ts b/packages/cli/src/lib/bundler/server.ts index 1b62c82ce5..2931b3f53e 100644 --- a/packages/cli/src/lib/bundler/server.ts +++ b/packages/cli/src/lib/bundler/server.ts @@ -27,7 +27,6 @@ import { createConfig, resolveBaseUrl, resolveEndpoint } from './config'; import { createDetectedModulesEntryPoint } from './packageDetection'; import { resolveBundlingPaths, resolveOptionalBundlingPaths } from './paths'; import { ServeOptions } from './types'; -import { hasReactDomClient } from './hasReactDomClient'; export async function serveBundle(options: ServeOptions) { const paths = resolveBundlingPaths(options); @@ -54,17 +53,11 @@ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be const { name } = await fs.readJson(libPaths.resolveTarget('package.json')); let webpackServer: WebpackDevServer | undefined = undefined; - // @ts-ignore - let viteServer: import('vite').ViteDevServer | undefined = undefined; let latestFrontendAppConfigs: AppConfig[] = []; /** Triggers a full reload of all clients */ const triggerReload = () => { - if (viteServer) { - viteServer.restart(); - } - if (webpackServer) { webpackServer.invalidate(); @@ -147,167 +140,84 @@ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be moduleFederation: options.moduleFederation, }); - if (process.env.EXPERIMENTAL_VITE) { - const vite = require('vite') as typeof import('vite'); - const { default: viteReact } = - require('@vitejs/plugin-react') as typeof import('@vitejs/plugin-react'); - const { default: viteYaml } = - require('@modyfi/vite-plugin-yaml') as typeof import('@modyfi/vite-plugin-yaml'); - const { nodePolyfills: viteNodePolyfills } = - require('vite-plugin-node-polyfills') as typeof import('vite-plugin-node-polyfills'); - const { createHtmlPlugin: viteHtml } = - require('vite-plugin-html') as typeof import('vite-plugin-html'); + const bundler = (rspack ?? webpack) as typeof webpack; + const DevServer: typeof WebpackDevServer = rspack + ? require('@rspack/dev-server').RspackDevServer + : WebpackDevServer; - viteServer = await vite.createServer({ - define: { - 'process.argv': JSON.stringify(process.argv), - 'process.env.APP_CONFIG': JSON.stringify(cliConfig.frontendAppConfigs), - // This allows for conditional imports of react-dom/client, since there's no way - // to check for presence of it in source code without module resolution errors. - 'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(hasReactDomClient()), - }, - optimizeDeps: { - esbuildOptions: { - plugins: [ - { - name: 'custom-define', - setup(build) { - const define = (build.initialOptions.define ||= {}); - define['process.env.HAS_REACT_DOM_CLIENT'] = JSON.stringify( - hasReactDomClient(), - ); - define['process.env.NODE_ENV'] = JSON.stringify('development'); - }, - }, - ], - }, - }, - plugins: [ - viteReact(), - viteNodePolyfills({ - include: [ - 'buffer', - 'events', - 'fs', - 'http', - 'https', - 'os', - 'path', - 'process', - 'querystring', - 'stream', - 'url', - 'util', - 'zlib', - ], - globals: { - global: true, - Buffer: true, - process: true, - }, - }), - viteYaml(), - viteHtml({ - entry: paths.targetEntry, - // todo(blam): we should look at contributing to thPe plugin here - // to support absolute paths, but works in the interim at least. - template: 'public/index.html', - inject: { - data: { - config: frontendConfig, - publicPath: config.output?.publicPath, - }, - }, - }), - ], - server: { - host, - port, - }, - publicDir: paths.targetPublic, - root: paths.targetPath, - }); - } else { - const bundler = (rspack ?? webpack) as typeof webpack; - const DevServer: typeof WebpackDevServer = rspack - ? require('@rspack/dev-server').RspackDevServer - : WebpackDevServer; - - if (rspack) { - console.log( - chalk.yellow(`⚠️ WARNING: Using experimental RSPack dev server.`), - ); - } - - const publicPaths = await resolveOptionalBundlingPaths({ - entry: 'src/index-public-experimental', - dist: 'dist/public', - }); - if (publicPaths) { - console.log( - chalk.yellow( - `⚠️ WARNING: The app /public entry point is an experimental feature that may receive immediate breaking changes.`, - ), - ); - } - const compiler = publicPaths - ? bundler([config, await createConfig(publicPaths, commonConfigOptions)]) - : bundler(config); - - webpackServer = new DevServer( - { - hot: !process.env.CI, - devMiddleware: { - publicPath: config.output?.publicPath as string, - stats: 'errors-warnings', - }, - static: paths.targetPublic - ? { - publicPath: config.output?.publicPath as string, - directory: paths.targetPublic, - } - : undefined, - historyApiFallback: - options.moduleFederation?.mode === 'remote' - ? false - : { - // Paths with dots should still use the history fallback. - // See https://github.com/facebookincubator/create-react-app/issues/387. - disableDotRule: true, - - // The index needs to be rewritten relative to the new public path, including subroutes. - index: `${config.output?.publicPath}index.html`, - }, - server: - url.protocol === 'https:' - ? { - type: 'https', - options: { - cert: fullConfig.getString('app.https.certificate.cert'), - key: fullConfig.getString('app.https.certificate.key'), - }, - } - : {}, - host, - port, - proxy: targetPkg.proxy, - // When the dev server is behind a proxy, the host and public hostname differ - allowedHosts: [url.hostname], - client: { - webSocketURL: { hostname: host, port }, - }, - headers: { - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': 'GET, OPTIONS', - 'Access-Control-Allow-Headers': - 'X-Requested-With, content-type, Authorization', - }, - }, - compiler, + if (rspack) { + console.log( + chalk.yellow(`⚠️ WARNING: Using experimental RSPack dev server.`), ); } - await viteServer?.listen(); + const publicPaths = await resolveOptionalBundlingPaths({ + entry: 'src/index-public-experimental', + dist: 'dist/public', + }); + if (publicPaths) { + console.log( + chalk.yellow( + `⚠️ WARNING: The app /public entry point is an experimental feature that may receive immediate breaking changes.`, + ), + ); + } + const compiler = publicPaths + ? bundler([config, await createConfig(publicPaths, commonConfigOptions)]) + : bundler(config); + + webpackServer = new DevServer( + { + hot: !process.env.CI, + devMiddleware: { + publicPath: config.output?.publicPath as string, + stats: 'errors-warnings', + }, + static: paths.targetPublic + ? { + publicPath: config.output?.publicPath as string, + directory: paths.targetPublic, + } + : undefined, + historyApiFallback: + options.moduleFederation?.mode === 'remote' + ? false + : { + // Paths with dots should still use the history fallback. + // See https://github.com/facebookincubator/create-react-app/issues/387. + disableDotRule: true, + + // The index needs to be rewritten relative to the new public path, including subroutes. + index: `${config.output?.publicPath}index.html`, + }, + server: + url.protocol === 'https:' + ? { + type: 'https', + options: { + cert: fullConfig.getString('app.https.certificate.cert'), + key: fullConfig.getString('app.https.certificate.key'), + }, + } + : {}, + host, + port, + proxy: targetPkg.proxy, + // When the dev server is behind a proxy, the host and public hostname differ + allowedHosts: [url.hostname], + client: { + webSocketURL: { hostname: host, port }, + }, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, OPTIONS', + 'Access-Control-Allow-Headers': + 'X-Requested-With, content-type, Authorization', + }, + }, + compiler, + ); + await new Promise(async (resolve, reject) => { if (webpackServer) { webpackServer.startCallback((err?: Error) => { @@ -330,7 +240,6 @@ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be for (const signal of ['SIGINT', 'SIGTERM'] as const) { process.on(signal, () => { webpackServer?.stop(); - viteServer?.close(); // exit instead of resolve. The process is shutting down and resolving a promise here logs an error process.exit(); }); diff --git a/yarn.lock b/yarn.lock index ab8676ace9..6a2f005fd6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1872,7 +1872,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.19.6, @babel/core@npm:^7.24.7, @babel/core@npm:^7.26.0": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.19.6, @babel/core@npm:^7.24.7": version: 7.26.0 resolution: "@babel/core@npm:7.26.0" dependencies: @@ -2956,28 +2956,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 41c833cd7f91b1432710f91b1325706e57979b2e8da44e83d86312c78bbe96cd9ef778b4e79e4e17ab25fa32c72b909f2be7f28e876779ede28e27506c41f4ae - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-source@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a3e0e5672e344e9d01fb20b504fe29a84918eaa70cec512c4d4b1b035f72803261257343d8e93673365b72c371f35cf34bb0d129720bf178a4c87812c8b9c662 - languageName: node - linkType: hard - "@babel/plugin-transform-react-jsx@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5" @@ -3988,7 +3966,6 @@ __metadata: "@types/yarnpkg__lockfile": ^1.1.4 "@typescript-eslint/eslint-plugin": ^8.17.0 "@typescript-eslint/parser": ^8.16.0 - "@vitejs/plugin-react": ^4.3.1 "@yarnpkg/lockfile": ^1.1.0 "@yarnpkg/parsers": ^3.0.0 bfj: ^8.0.0 @@ -4061,9 +4038,6 @@ __metadata: terser-webpack-plugin: ^5.1.3 ts-morph: ^24.0.0 util: ^0.12.3 - vite: ^5.0.0 - vite-plugin-html: ^3.2.2 - vite-plugin-node-polyfills: ^0.22.0 webpack: ^5.94.0 webpack-dev-server: ^5.0.0 yaml: ^2.0.0 @@ -4072,31 +4046,16 @@ __metadata: yn: ^4.0.0 zod: ^3.22.4 peerDependencies: - "@modyfi/vite-plugin-yaml": ^1.1.0 "@rspack/core": ^1.0.10 "@rspack/dev-server": ^1.0.9 "@rspack/plugin-react-refresh": ^1.0.0 - "@vitejs/plugin-react": ^4.0.4 - vite: ^5.0.0 - vite-plugin-html: ^3.2.0 - vite-plugin-node-polyfills: ^0.22.0 peerDependenciesMeta: - "@modyfi/vite-plugin-yaml": - optional: true "@rspack/core": optional: true "@rspack/dev-server": optional: true "@rspack/plugin-react-refresh": optional: true - "@vitejs/plugin-react": - optional: true - vite: - optional: true - vite-plugin-html: - optional: true - vite-plugin-node-polyfills: - optional: true bin: backstage-cli: bin/backstage-cli languageName: unknown @@ -11825,19 +11784,6 @@ __metadata: languageName: node linkType: hard -"@modyfi/vite-plugin-yaml@npm:^1.1.0": - version: 1.1.0 - resolution: "@modyfi/vite-plugin-yaml@npm:1.1.0" - dependencies: - "@rollup/pluginutils": 5.1.0 - js-yaml: 4.1.0 - tosource: 2.0.0-alpha.3 - peerDependencies: - vite: ^3.2.7 || ^4.0.5 || ^5.0.5 - checksum: 6989cde89323321b714b69d11b9125c8d3483a8c6ace536df313edd653180e85e6013effbc6cb8b89e6f9d6e107a10f7a82fadf6a44e81255b437702d5dd1db0 - languageName: node - linkType: hard - "@motionone/animation@npm:^10.12.0": version: 10.16.3 resolution: "@motionone/animation@npm:10.16.3" @@ -15479,22 +15425,6 @@ __metadata: languageName: node linkType: hard -"@rollup/plugin-inject@npm:^5.0.5": - version: 5.0.5 - resolution: "@rollup/plugin-inject@npm:5.0.5" - dependencies: - "@rollup/pluginutils": ^5.0.1 - estree-walker: ^2.0.2 - magic-string: ^0.30.3 - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 22cb772fd6f7178308b2ece95cdde5f8615f6257197832166294552a7e4c0d3976dc996cbfa6470af3151d8b86c00091aa93da5f4db6ec563f11b6db29fd1b63 - languageName: node - linkType: hard - "@rollup/plugin-json@npm:^6.0.0": version: 6.1.0 resolution: "@rollup/plugin-json@npm:6.1.0" @@ -15543,7 +15473,17 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:5.1.0, @rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.5, @rollup/pluginutils@npm:^5.1.0": +"@rollup/pluginutils@npm:^4.2.1": + version: 4.2.1 + resolution: "@rollup/pluginutils@npm:4.2.1" + dependencies: + estree-walker: ^2.0.1 + picomatch: ^2.2.2 + checksum: 6bc41f22b1a0f1efec3043899e4d3b6b1497b3dea4d94292d8f83b4cf07a1073ecbaedd562a22d11913ff7659f459677b01b09e9598a98936e746780ecc93a12 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.5, @rollup/pluginutils@npm:^5.1.0": version: 5.1.0 resolution: "@rollup/pluginutils@npm:5.1.0" dependencies: @@ -15559,16 +15499,6 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^4.2.0, @rollup/pluginutils@npm:^4.2.1": - version: 4.2.1 - resolution: "@rollup/pluginutils@npm:4.2.1" - dependencies: - estree-walker: ^2.0.1 - picomatch: ^2.2.2 - checksum: 6bc41f22b1a0f1efec3043899e4d3b6b1497b3dea4d94292d8f83b4cf07a1073ecbaedd562a22d11913ff7659f459677b01b09e9598a98936e746780ecc93a12 - languageName: node - linkType: hard - "@rollup/rollup-android-arm-eabi@npm:4.27.4": version: 4.27.4 resolution: "@rollup/rollup-android-arm-eabi@npm:4.27.4" @@ -18688,7 +18618,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.5": +"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.18.0": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -21030,21 +20960,6 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:^4.3.1": - version: 4.3.4 - resolution: "@vitejs/plugin-react@npm:4.3.4" - dependencies: - "@babel/core": ^7.26.0 - "@babel/plugin-transform-react-jsx-self": ^7.25.9 - "@babel/plugin-transform-react-jsx-source": ^7.25.9 - "@types/babel__core": ^7.20.5 - react-refresh: ^0.14.2 - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - checksum: d417f40d9259a1d5193152f7d9fee081d5bf41cbeef9662ae1123ccc1e26aa4b6b04bc82ebb8c4fbfde9516a746fb3af7da19fdd449819c30f0631daaa10a44b - languageName: node - linkType: hard - "@vitest/expect@npm:2.0.5": version: 2.0.5 resolution: "@vitest/expect@npm:2.0.5" @@ -22752,19 +22667,6 @@ __metadata: languageName: node linkType: hard -"assert@npm:^2.0.0": - version: 2.1.0 - resolution: "assert@npm:2.1.0" - dependencies: - call-bind: ^1.0.2 - is-nan: ^1.3.2 - object-is: ^1.1.5 - object.assign: ^4.1.4 - util: ^0.12.5 - checksum: 1ed1cabba9abe55f4109b3f7292b4e4f3cf2953aad8dc148c0b3c3bd676675c31b1abb32ef563b7d5a19d1715bf90d1e5f09fad2a4ee655199468902da80f7c2 - languageName: node - linkType: hard - "assertion-error@npm:^2.0.1": version: 2.0.1 resolution: "assertion-error@npm:2.0.1" @@ -23651,15 +23553,6 @@ __metadata: languageName: node linkType: hard -"browser-resolve@npm:^2.0.0": - version: 2.0.0 - resolution: "browser-resolve@npm:2.0.0" - dependencies: - resolve: ^1.17.0 - checksum: 69225e73b555bd6d2a08fb93c7342cfcf3b5058b975099c52649cd5c3cec84c2066c5385084d190faedfb849684d9dabe10129f0cd401d1883572f2e6650f440 - languageName: node - linkType: hard - "browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4": version: 1.2.0 resolution: "browserify-aes@npm:1.2.0" @@ -23828,7 +23721,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.5.0, buffer@npm:^5.7.1": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -24079,7 +23972,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": version: 1.0.8 resolution: "call-bind@npm:1.0.8" dependencies: @@ -24862,7 +24755,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.10, colorette@npm:^2.0.16, colorette@npm:^2.0.20": +"colorette@npm:^2.0.10, colorette@npm:^2.0.20": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d @@ -25164,13 +25057,6 @@ __metadata: languageName: node linkType: hard -"connect-history-api-fallback@npm:^1.6.0": - version: 1.6.0 - resolution: "connect-history-api-fallback@npm:1.6.0" - checksum: 804ca2be28c999032ecd37a9f71405e5d7b7a4b3defcebbe41077bb8c5a0a150d7b59f51dcc33b2de30bc7e217a31d10f8cfad27e8e74c2fc7655eeba82d6e7e - languageName: node - linkType: hard - "connect-history-api-fallback@npm:^2.0.0": version: 2.0.0 resolution: "connect-history-api-fallback@npm:2.0.0" @@ -25200,7 +25086,7 @@ __metadata: languageName: node linkType: hard -"consola@npm:^2.15.0, consola@npm:^2.15.3": +"consola@npm:^2.15.0": version: 2.15.3 resolution: "consola@npm:2.15.3" checksum: 8ef7a09b703ec67ac5c389a372a33b6dc97eda6c9876443a60d76a3076eea0259e7f67a4e54fd5a52f97df73690822d090cf8b7e102b5761348afef7c6d03e28 @@ -25536,7 +25422,7 @@ __metadata: languageName: node linkType: hard -"create-require@npm:^1.1.0, create-require@npm:^1.1.1": +"create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff @@ -25747,7 +25633,7 @@ __metadata: languageName: node linkType: hard -"css-select@npm:^4.1.3, css-select@npm:^4.2.1": +"css-select@npm:^4.1.3": version: 4.3.0 resolution: "css-select@npm:4.3.0" dependencies: @@ -26820,13 +26706,6 @@ __metadata: languageName: node linkType: hard -"domain-browser@npm:^4.22.0": - version: 4.23.0 - resolution: "domain-browser@npm:4.23.0" - checksum: 95b772f5fa88300240694380e06e03868573acdf86ca392a58c78602d6536dca2097ad2469a1500bd23a1329b09992de846e0b66c364cbf5711a7fee3ee5dac9 - languageName: node - linkType: hard - "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" @@ -26925,14 +26804,7 @@ __metadata: languageName: node linkType: hard -"dotenv-expand@npm:^8.0.2": - version: 8.0.3 - resolution: "dotenv-expand@npm:8.0.3" - checksum: 128ce90ac825b543de3ece0154a51b056ab0dc36bb26d97a68cd0b8707327ecd3c182fb6ac63b26a0fcdfa85064419906a1065cb634f1f9dc08ad311375f1fc0 - languageName: node - linkType: hard - -"dotenv@npm:^16.0.0, dotenv@npm:^16.3.1": +"dotenv@npm:^16.3.1": version: 16.4.5 resolution: "dotenv@npm:16.4.5" checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c @@ -27642,7 +27514,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.21.0, esbuild@npm:^0.21.3": +"esbuild@npm:^0.21.0": version: 0.21.5 resolution: "esbuild@npm:0.21.5" dependencies: @@ -28502,7 +28374,6 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 - "@modyfi/vite-plugin-yaml": ^1.1.0 "@octokit/rest": ^19.0.3 "@playwright/test": ^1.32.3 "@testing-library/dom": ^10.0.0 @@ -28513,7 +28384,6 @@ __metadata: "@types/react": "*" "@types/react-dom": "*" "@types/zen-observable": ^0.8.0 - "@vitejs/plugin-react": ^4.3.1 axios: ^1.7.7 cross-env: ^7.0.0 history: ^5.0.0 @@ -28523,9 +28393,6 @@ __metadata: react-router: ^6.3.0 react-router-dom: ^6.3.0 react-use: ^17.2.4 - vite: ^5.0.0 - vite-plugin-html: ^3.2.2 - vite-plugin-node-polyfills: ^0.22.0 zen-observable: ^0.10.0 languageName: unknown linkType: soft @@ -28943,7 +28810,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -29727,7 +29594,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:10.1.0, fs-extra@npm:^10.0.0, fs-extra@npm:^10.0.1": +"fs-extra@npm:10.1.0, fs-extra@npm:^10.0.0": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" dependencies: @@ -29825,7 +29692,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -29844,7 +29711,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -31066,7 +30933,7 @@ __metadata: languageName: node linkType: hard -"html-minifier-terser@npm:^6.0.2, html-minifier-terser@npm:^6.1.0": +"html-minifier-terser@npm:^6.0.2": version: 6.1.0 resolution: "html-minifier-terser@npm:6.1.0" dependencies: @@ -32196,16 +32063,6 @@ __metadata: languageName: node linkType: hard -"is-nan@npm:^1.3.2": - version: 1.3.2 - resolution: "is-nan@npm:1.3.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - checksum: 5dfadcef6ad12d3029d43643d9800adbba21cf3ce2ec849f734b0e14ee8da4070d82b15fdb35138716d02587c6578225b9a22779cab34888a139cc43e4e3610a - languageName: node - linkType: hard - "is-network-error@npm:^1.0.0": version: 1.0.1 resolution: "is-network-error@npm:1.0.1" @@ -32667,13 +32524,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-timers-promises@npm:^1.0.1": - version: 1.0.1 - resolution: "isomorphic-timers-promises@npm:1.0.1" - checksum: 16ef59f0fbcceba1a037c74b5f7195d252ae058724ccd3e53b37ad034e8498f5532084e8ab18e7940ba3fa8fca2f21403d00eed15802ab1f7cab7c099cba62a8 - languageName: node - linkType: hard - "isomorphic-ws@npm:5.0.0, isomorphic-ws@npm:^5.0.0": version: 5.0.0 resolution: "isomorphic-ws@npm:5.0.0" @@ -33429,7 +33279,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:=4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:=4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -37158,16 +37008,6 @@ __metadata: languageName: node linkType: hard -"node-html-parser@npm:^5.3.3": - version: 5.4.2 - resolution: "node-html-parser@npm:5.4.2" - dependencies: - css-select: ^4.2.1 - he: 1.2.0 - checksum: 2d2391147c83b402786eeab95d23ea4e24ca8608e0e70a2823bfd4f2a248be13a8cc31acfd55a0109e051131e4f0c17d7ada8d999ce70ff2e342ab0110f5da59 - languageName: node - linkType: hard - "node-html-parser@npm:^6.1.1": version: 6.1.5 resolution: "node-html-parser@npm:6.1.5" @@ -37277,41 +37117,6 @@ __metadata: languageName: node linkType: hard -"node-stdlib-browser@npm:^1.2.0": - version: 1.2.0 - resolution: "node-stdlib-browser@npm:1.2.0" - dependencies: - assert: ^2.0.0 - browser-resolve: ^2.0.0 - browserify-zlib: ^0.2.0 - buffer: ^5.7.1 - console-browserify: ^1.1.0 - constants-browserify: ^1.0.0 - create-require: ^1.1.1 - crypto-browserify: ^3.11.0 - domain-browser: ^4.22.0 - events: ^3.0.0 - https-browserify: ^1.0.0 - isomorphic-timers-promises: ^1.0.1 - os-browserify: ^0.3.0 - path-browserify: ^1.0.1 - pkg-dir: ^5.0.0 - process: ^0.11.10 - punycode: ^1.4.1 - querystring-es3: ^0.2.1 - readable-stream: ^3.6.0 - stream-browserify: ^3.0.0 - stream-http: ^3.2.0 - string_decoder: ^1.0.0 - timers-browserify: ^2.0.4 - tty-browserify: 0.0.1 - url: ^0.11.0 - util: ^0.12.4 - vm-browserify: ^1.0.1 - checksum: fe491f0839319fd9bb95964c6f7da81fc7fde4c3ac9062aa367f19bc5a6060d0d9e423d3de4196cb51f8259d6aaf6cf380048c48a86eb3721c6223dd0dcc5bfd - languageName: node - linkType: hard - "node-watch@npm:0.7.3": version: 0.7.3 resolution: "node-watch@npm:0.7.3" @@ -37687,16 +37492,6 @@ __metadata: languageName: node linkType: hard -"object-is@npm:^1.1.5": - version: 1.1.6 - resolution: "object-is@npm:1.1.6" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - checksum: 3ea22759967e6f2380a2cbbd0f737b42dc9ddb2dfefdb159a1b927fea57335e1b058b564bfa94417db8ad58cddab33621a035de6f5e5ad56d89f2dd03e66c6a1 - languageName: node - linkType: hard - "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -38786,13 +38581,6 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^0.2.0": - version: 0.2.0 - resolution: "pathe@npm:0.2.0" - checksum: 9a8149ce152088f30d15b0b03a7c128ba21f16b4dc1f3f90fe38eee9f6d0f1d6da8e4e47bd2a4f9e14aaac7c30ed01cfc86216479011de2bdc598b65e6f19f41 - languageName: node - linkType: hard - "pathval@npm:^2.0.0": version: 2.0.0 resolution: "pathval@npm:2.0.0" @@ -39118,15 +38906,6 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^5.0.0": - version: 5.0.0 - resolution: "pkg-dir@npm:5.0.0" - dependencies: - find-up: ^5.0.0 - checksum: b167bb8dac7bbf22b1d5e30ec223e6b064b84b63010c9d49384619a36734caf95ed23ad23d4f9bd975e8e8082b60a83395f43a89bb192df53a7c25a38ecb57d9 - languageName: node - linkType: hard - "pkg-up@npm:^3.1.0": version: 3.1.0 resolution: "pkg-up@npm:3.1.0" @@ -39646,7 +39425,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.1.0, postcss@npm:^8.4.33, postcss@npm:^8.4.43": +"postcss@npm:^8.1.0, postcss@npm:^8.4.33": version: 8.4.49 resolution: "postcss@npm:8.4.49" dependencies: @@ -40164,7 +39943,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.2.4, punycode@npm:^1.3.2, punycode@npm:^1.4.1": +"punycode@npm:^1.2.4, punycode@npm:^1.3.2": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 @@ -40238,7 +40017,7 @@ __metadata: languageName: node linkType: hard -"querystring-es3@npm:^0.2.0, querystring-es3@npm:^0.2.1": +"querystring-es3@npm:^0.2.0": version: 0.2.1 resolution: "querystring-es3@npm:0.2.1" checksum: 691e8d6b8b157e7cd49ae8e83fcf86de39ab3ba948c25abaa94fba84c0986c641aa2f597770848c64abce290ed17a39c9df6df737dfa7e87c3b63acc7d225d61 @@ -40914,7 +40693,7 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.14.0, react-refresh@npm:^0.14.2": +"react-refresh@npm:^0.14.0": version: 0.14.2 resolution: "react-refresh@npm:0.14.2" checksum: d80db4bd40a36dab79010dc8aa317a5b931f960c0d83c4f3b81f0552cbcf7f29e115b84bb7908ec6a1eb67720fff7023084eff73ece8a7ddc694882478464382 @@ -41841,7 +41620,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.1.6, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:~1.22.1, resolve@npm:~1.22.2": +"resolve@npm:1.22.8, resolve@npm:^1.1.6, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:~1.22.1, resolve@npm:~1.22.2": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -41867,7 +41646,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.22.8#~builtin, resolve@patch:resolve@~1.22.1#~builtin, resolve@patch:resolve@~1.22.2#~builtin": +"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.22.8#~builtin, resolve@patch:resolve@~1.22.1#~builtin, resolve@patch:resolve@~1.22.2#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -42190,7 +41969,7 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.20.0, rollup@npm:^4.27.3": +"rollup@npm:^4.27.3": version: 4.27.4 resolution: "rollup@npm:4.27.4" dependencies: @@ -43648,7 +43427,7 @@ __metadata: languageName: node linkType: hard -"stream-browserify@npm:3.0.0, stream-browserify@npm:^3.0.0": +"stream-browserify@npm:3.0.0": version: 3.0.0 resolution: "stream-browserify@npm:3.0.0" dependencies: @@ -43704,18 +43483,6 @@ __metadata: languageName: node linkType: hard -"stream-http@npm:^3.2.0": - version: 3.2.0 - resolution: "stream-http@npm:3.2.0" - dependencies: - builtin-status-codes: ^3.0.0 - inherits: ^2.0.4 - readable-stream: ^3.6.0 - xtend: ^4.0.2 - checksum: c9b78453aeb0c84fcc59555518ac62bacab9fa98e323e7b7666e5f9f58af8f3155e34481078509b02929bd1268427f664d186604cdccee95abc446099b339f83 - languageName: node - linkType: hard - "stream-json@npm:^1.7.4": version: 1.8.0 resolution: "stream-json@npm:1.8.0" @@ -44982,7 +44749,7 @@ __metadata: languageName: node linkType: hard -"tosource@npm:2.0.0-alpha.3, tosource@npm:^2.0.0-alpha.3": +"tosource@npm:^2.0.0-alpha.3": version: 2.0.0-alpha.3 resolution: "tosource@npm:2.0.0-alpha.3" checksum: bc03a7571de8ed4306e6721283fa891f2adcab9dd80c46f6f177d4259b34bb192fe3a2cb3e1e2ce16f9db0bc7e534acfcb5478ab094b0ba255f98abfce6dab46 @@ -45322,13 +45089,6 @@ __metadata: languageName: node linkType: hard -"tty-browserify@npm:0.0.1": - version: 0.0.1 - resolution: "tty-browserify@npm:0.0.1" - checksum: 93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 - languageName: node - linkType: hard - "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -46560,83 +46320,6 @@ __metadata: languageName: node linkType: hard -"vite-plugin-html@npm:^3.2.2": - version: 3.2.2 - resolution: "vite-plugin-html@npm:3.2.2" - dependencies: - "@rollup/pluginutils": ^4.2.0 - colorette: ^2.0.16 - connect-history-api-fallback: ^1.6.0 - consola: ^2.15.3 - dotenv: ^16.0.0 - dotenv-expand: ^8.0.2 - ejs: ^3.1.6 - fast-glob: ^3.2.11 - fs-extra: ^10.0.1 - html-minifier-terser: ^6.1.0 - node-html-parser: ^5.3.3 - pathe: ^0.2.0 - peerDependencies: - vite: ">=2.0.0" - checksum: 2fd6e1f91f74a4432222ed28e68d5f27e58ccbc9ad44e71ff9d02b684b358b0c634bdb4dd32e9d93d09e88d83c3b7b74b89698e25510bc5b94173cdc067b3ac2 - languageName: node - linkType: hard - -"vite-plugin-node-polyfills@npm:^0.22.0": - version: 0.22.0 - resolution: "vite-plugin-node-polyfills@npm:0.22.0" - dependencies: - "@rollup/plugin-inject": ^5.0.5 - node-stdlib-browser: ^1.2.0 - peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - checksum: c08d3df0d5cc3102280483d3f7b216f92a18e0708fcb9f67f78f01ab865474254756bacee17caa90b3f46afe5834cb9d8de0dd0e58c1bbbdae1b949edc1e6b57 - languageName: node - linkType: hard - -"vite@npm:^5.0.0": - version: 5.4.11 - resolution: "vite@npm:5.4.11" - dependencies: - esbuild: ^0.21.3 - fsevents: ~2.3.3 - postcss: ^8.4.43 - rollup: ^4.20.0 - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: 8c5b31d17487b69c40a30419dc0ade9f33360eb6893dbfa33a90980271bd74d35ae550b5cbb2a9e640f0df41ea36fd1bb4f222c98f6d02e607080f20832e69e8 - languageName: node - linkType: hard - "vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -47471,7 +47154,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:^4.0.2": +"xtend@npm:^4.0.0": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a From 8557e0956cf83e657da5b969454ec736d16b7e36 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Thu, 2 Jan 2025 15:53:10 +0100 Subject: [PATCH 05/58] vite changeset Signed-off-by: Vincenzo Scamporlino --- .changeset/swift-islands-burn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/swift-islands-burn.md diff --git a/.changeset/swift-islands-burn.md b/.changeset/swift-islands-burn.md new file mode 100644 index 0000000000..f38870143b --- /dev/null +++ b/.changeset/swift-islands-burn.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Removed the `EXPERIMENTAL_VITE` flag for using Vite as a dev server. If you were using this feature, we recommend switching to Rspack via the `EXPERIMENTAL_RSPACK` flag. From 92408ded229384bc2c36b8b0bcfc3013e1f6b4c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 3 Jan 2025 14:19:54 +0000 Subject: [PATCH 06/58] chore(deps): update dependency eslint-plugin-storybook to v0.11.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- storybook/yarn.lock | 8 ++++---- yarn.lock | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/storybook/yarn.lock b/storybook/yarn.lock index be21a0fead..1a245bebeb 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2689,15 +2689,15 @@ __metadata: linkType: hard "eslint-plugin-storybook@npm:^0.11.0": - version: 0.11.1 - resolution: "eslint-plugin-storybook@npm:0.11.1" + version: 0.11.2 + resolution: "eslint-plugin-storybook@npm:0.11.2" dependencies: "@storybook/csf": ^0.1.11 "@typescript-eslint/utils": ^8.8.1 ts-dedent: ^2.2.0 peerDependencies: - eslint: ">=6" - checksum: 8b8eb30b598f3c44c2bbf921e318215338f1159c1fba2d2f6cd5bc0b2ec14515655cf1760b5e11355baddabc2ac8446d4dc18ee6df6d2252555b126ff649a421 + eslint: ">=8" + checksum: 04dab47b676db57aa6c2325d4ab66283f5970133a2615cc68a97e42cb4ae1c79317e6db73bcfc24468e146bdff4c9ffe90a368bf2bcb67593954485f058b33ca languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index b48c24a935..a66e440310 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28001,15 +28001,15 @@ __metadata: linkType: hard "eslint-plugin-storybook@npm:^0.11.1": - version: 0.11.1 - resolution: "eslint-plugin-storybook@npm:0.11.1" + version: 0.11.2 + resolution: "eslint-plugin-storybook@npm:0.11.2" dependencies: "@storybook/csf": ^0.1.11 "@typescript-eslint/utils": ^8.8.1 ts-dedent: ^2.2.0 peerDependencies: - eslint: ">=6" - checksum: 8b8eb30b598f3c44c2bbf921e318215338f1159c1fba2d2f6cd5bc0b2ec14515655cf1760b5e11355baddabc2ac8446d4dc18ee6df6d2252555b126ff649a421 + eslint: ">=8" + checksum: 04dab47b676db57aa6c2325d4ab66283f5970133a2615cc68a97e42cb4ae1c79317e6db73bcfc24468e146bdff4c9ffe90a368bf2bcb67593954485f058b33ca languageName: node linkType: hard From 11b001cf4dad381d3d6717482112dacafbdbf729 Mon Sep 17 00:00:00 2001 From: Matt Benson Date: Fri, 18 Oct 2024 14:09:51 -0500 Subject: [PATCH 07/58] Add proxyEndpointsExtensionPoint Signed-off-by: Matt Benson --- .changeset/four-bananas-sneeze.md | 6 +++ docs/plugins/proxying.md | 39 ++++++++++++++ plugins/proxy-backend/dev/index.ts | 28 ++++++++++ plugins/proxy-backend/package.json | 1 + plugins/proxy-backend/report.api.md | 3 ++ plugins/proxy-backend/src/plugin.ts | 10 ++++ plugins/proxy-backend/src/service/router.ts | 6 ++- plugins/proxy-node/.eslintrc.js | 1 + plugins/proxy-node/README.md | 5 ++ plugins/proxy-node/catalog-info.yaml | 10 ++++ plugins/proxy-node/package.json | 59 +++++++++++++++++++++ plugins/proxy-node/report-alpha.api.md | 19 +++++++ plugins/proxy-node/src/alpha/index.ts | 36 +++++++++++++ yarn.lock | 13 +++++ 14 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 .changeset/four-bananas-sneeze.md create mode 100644 plugins/proxy-node/.eslintrc.js create mode 100644 plugins/proxy-node/README.md create mode 100644 plugins/proxy-node/catalog-info.yaml create mode 100644 plugins/proxy-node/package.json create mode 100644 plugins/proxy-node/report-alpha.api.md create mode 100644 plugins/proxy-node/src/alpha/index.ts diff --git a/.changeset/four-bananas-sneeze.md b/.changeset/four-bananas-sneeze.md new file mode 100644 index 0000000000..025dae518a --- /dev/null +++ b/.changeset/four-bananas-sneeze.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-proxy-backend': minor +'@backstage/plugin-proxy-node': minor +--- + +Add proxyEndpointsExtensionPoint diff --git a/docs/plugins/proxying.md b/docs/plugins/proxying.md index 09afa3f519..e4aff4b399 100644 --- a/docs/plugins/proxying.md +++ b/docs/plugins/proxying.md @@ -120,3 +120,42 @@ third-parties. The same logic applies to headers that are sent from the target back to the frontend. + +### New backend extension + +The proxy plugin additionally supports a `proxyExtensionEndpoint` which a proxy +plugin module can utilize in order to programmatically register additional +endpoints, whose payloads are specified exactly as in app-config (described +above). Note that endpoints configured in app-config will always override those +registered in this manner. + +Example: + +```ts +backend.add( + createBackendModule({ + pluginId: 'proxy', + moduleId: 'demo-additional-endpoints', + register: reg => { + reg.registerInit({ + deps: { + proxyEndpoints: proxyEndpointsExtensionPoint, + }, + init: async ({ proxyEndpoints }) => { + let largerExampleAuth: string = /* exercise for the reader */; + proxyEndpoints.addProxyEndpoints({ + "/simple-example": "http://simple.example.com:8080", + "/larger-example/v1": { + target: "http://larger.example.com:8080/svc.v1", + credentials: "require", + headers: { + Authorization: largerExampleAuth + }, + }, + }); + }, + }); + }, + }), +); +``` diff --git a/plugins/proxy-backend/dev/index.ts b/plugins/proxy-backend/dev/index.ts index 43c75d24df..4e4f84056a 100644 --- a/plugins/proxy-backend/dev/index.ts +++ b/plugins/proxy-backend/dev/index.ts @@ -15,7 +15,35 @@ */ import { createBackend } from '@backstage/backend-defaults'; +import { createBackendModule } from '@backstage/backend-plugin-api'; +import { proxyEndpointsExtensionPoint } from '@backstage/plugin-proxy-node/alpha'; const backend = createBackend(); backend.add(import('../src/alpha')); + +backend.add( + createBackendModule({ + pluginId: 'proxy', + moduleId: 'demo-additional-endpoints', + register: reg => { + reg.registerInit({ + deps: { + proxyEndpoints: proxyEndpointsExtensionPoint, + }, + init: async ({ proxyEndpoints }) => { + proxyEndpoints.addProxyEndpoints({ + ...Object.fromEntries( + ['foo', 'bar', 'baz'].map(msv => [ + `/${msv}`, + { target: `http://${msv}.org` }, + ]), + ), + '/gocd': 'http://cannot-override-config.no', + }); + }, + }); + }, + }), +); + backend.start(); diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 97c14a271e..b297981013 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -56,6 +56,7 @@ "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", + "@backstage/plugin-proxy-node": "workspace:^", "@backstage/types": "workspace:^", "@types/express": "^4.17.6", "express": "^4.17.1", diff --git a/plugins/proxy-backend/report.api.md b/plugins/proxy-backend/report.api.md index c0601eac30..ef0fe37c96 100644 --- a/plugins/proxy-backend/report.api.md +++ b/plugins/proxy-backend/report.api.md @@ -6,6 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; import { DiscoveryService } from '@backstage/backend-plugin-api'; import express from 'express'; +import { JsonObject } from '@backstage/types'; import { Logger } from 'winston'; import { RootConfigService } from '@backstage/backend-plugin-api'; @@ -18,6 +19,8 @@ export default proxyPlugin; // @public @deprecated (undocumented) export interface RouterOptions { + // (undocumented) + additionalEndpoints?: JsonObject; // (undocumented) config: RootConfigService; // (undocumented) diff --git a/plugins/proxy-backend/src/plugin.ts b/plugins/proxy-backend/src/plugin.ts index 1039a6a3e8..2e310860d5 100644 --- a/plugins/proxy-backend/src/plugin.ts +++ b/plugins/proxy-backend/src/plugin.ts @@ -20,6 +20,8 @@ import { coreServices, } from '@backstage/backend-plugin-api'; import { createRouterInternal } from './service/router'; +import { proxyEndpointsExtensionPoint } from '@backstage/plugin-proxy-node/alpha'; +import { JsonObject } from '@backstage/types'; /** * The proxy backend plugin. @@ -29,6 +31,13 @@ import { createRouterInternal } from './service/router'; export const proxyPlugin = createBackendPlugin({ pluginId: 'proxy', register(env) { + const additionalEndpoints = {}; + + env.registerExtensionPoint(proxyEndpointsExtensionPoint, { + addProxyEndpoints(endpoints: JsonObject) { + Object.assign(additionalEndpoints, endpoints); + }, + }); env.registerInit({ deps: { config: coreServices.rootConfig, @@ -42,6 +51,7 @@ export const proxyPlugin = createBackendPlugin({ discovery, logger: loggerToWinstonLogger(logger), httpRouterService: httpRouter, + additionalEndpoints, }); }, }); diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts index 9ea064ea55..b0c7c95589 100644 --- a/plugins/proxy-backend/src/service/router.ts +++ b/plugins/proxy-backend/src/service/router.ts @@ -63,6 +63,7 @@ export interface RouterOptions { discovery: DiscoveryService; skipInvalidProxies?: boolean; reviveConsumedRequestBodies?: boolean; + additionalEndpoints?: JsonObject; } export interface ProxyConfig extends Options { @@ -315,7 +316,10 @@ export async function createRouterInternal( const externalUrl = await options.discovery.getExternalBaseUrl('proxy'); const { pathname: pathPrefix } = new URL(externalUrl); - const proxyConfig = readProxyConfig(options.config, options.logger); + const proxyConfig = { + ...(options.additionalEndpoints ?? {}), + ...readProxyConfig(options.config, options.logger), + }; configureMiddlewares( proxyOptions, currentRouter, diff --git a/plugins/proxy-node/.eslintrc.js b/plugins/proxy-node/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/proxy-node/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/proxy-node/README.md b/plugins/proxy-node/README.md new file mode 100644 index 0000000000..7f48a17cf6 --- /dev/null +++ b/plugins/proxy-node/README.md @@ -0,0 +1,5 @@ +# backstage-plugin-proxy-node-node + +Welcome to the Node.js library package for the proxy-node plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/plugins/proxy-node/catalog-info.yaml b/plugins/proxy-node/catalog-info.yaml new file mode 100644 index 0000000000..94dad42af2 --- /dev/null +++ b/plugins/proxy-node/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-proxy-node + title: '@backstage/plugin-proxy-node' + description: The plugin-proxy-node module for @backstage/plugin-proxy-backend +spec: + lifecycle: experimental + type: backstage-node-library + owner: maintainers diff --git a/plugins/proxy-node/package.json b/plugins/proxy-node/package.json new file mode 100644 index 0000000000..8293ae0c98 --- /dev/null +++ b/plugins/proxy-node/package.json @@ -0,0 +1,59 @@ +{ + "name": "@backstage/plugin-proxy-node", + "version": "0.0.0", + "description": "The plugin-proxy-node module for @backstage/plugin-proxy-backend", + "backstage": { + "role": "node-library", + "pluginId": "proxy-backend", + "pluginPackages": [ + "@backstage/plugin-proxy-node" + ] + }, + "publishConfig": { + "access": "public" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/proxy-node" + }, + "license": "Apache-2.0", + "exports": { + "./alpha": "./src/alpha/index.ts", + "./package.json": "./package.json" + }, + "main": "src/alpha/index.ts", + "types": "src/alpha/index.ts", + "typesVersions": { + "*": { + "alpha": [ + "src/alpha/index.ts" + ], + "package.json": [ + "package.json" + ] + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "start": "backstage-cli package start", + "test": "backstage-cli package test" + }, + "dependencies": { + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/types": "workspace:^" + }, + "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^", + "@backstage/config": "workspace:^" + } +} diff --git a/plugins/proxy-node/report-alpha.api.md b/plugins/proxy-node/report-alpha.api.md new file mode 100644 index 0000000000..c64e5b773a --- /dev/null +++ b/plugins/proxy-node/report-alpha.api.md @@ -0,0 +1,19 @@ +## API Report File for "@backstage/plugin-proxy-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; + +// @alpha +export interface ProxyEndpointsExtensionPoint { + // (undocumented) + addProxyEndpoints(endpoints: JsonObject): void; +} + +// @alpha +export const proxyEndpointsExtensionPoint: ExtensionPoint; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/proxy-node/src/alpha/index.ts b/plugins/proxy-node/src/alpha/index.ts new file mode 100644 index 0000000000..215ec93d17 --- /dev/null +++ b/plugins/proxy-node/src/alpha/index.ts @@ -0,0 +1,36 @@ +/* + * 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 { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; + +/** + * Extension point interface for managing proxy endpoints. + * + * @alpha + */ +export interface ProxyEndpointsExtensionPoint { + addProxyEndpoints(endpoints: JsonObject): void; +} + +/** + * Extension point for managing proxy endpoints. + * + * @alpha + */ +export const proxyEndpointsExtensionPoint = + createExtensionPoint({ + id: 'proxy.endpoints', + }); diff --git a/yarn.lock b/yarn.lock index b48c24a935..665257942b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7120,6 +7120,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/config-loader": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-proxy-node": "workspace:^" "@backstage/types": "workspace:^" "@types/express": ^4.17.6 "@types/http-proxy-middleware": ^1.0.0 @@ -7137,6 +7138,18 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-proxy-node@workspace:^, @backstage/plugin-proxy-node@workspace:plugins/proxy-node": + version: 0.0.0-use.local + resolution: "@backstage/plugin-proxy-node@workspace:plugins/proxy-node" + dependencies: + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/types": "workspace:^" + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder-backend-module-azure@workspace:^, @backstage/plugin-scaffolder-backend-module-azure@workspace:plugins/scaffolder-backend-module-azure": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-azure@workspace:plugins/scaffolder-backend-module-azure" From ca2f9c29de0bfd87b5e97dd981905e580343ae75 Mon Sep 17 00:00:00 2001 From: Matt Benson Date: Thu, 14 Nov 2024 18:30:39 -0600 Subject: [PATCH 08/58] strongly type proxyConfig Signed-off-by: Matt Benson --- plugins/proxy-backend/src/plugin.ts | 3 +-- plugins/proxy-backend/src/service/router.ts | 10 ++-------- plugins/proxy-node/package.json | 5 +++-- plugins/proxy-node/report-alpha.api.md | 16 ++++++++++++++-- plugins/proxy-node/src/alpha/index.ts | 16 ++++++++++++++-- yarn.lock | 3 ++- 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/plugins/proxy-backend/src/plugin.ts b/plugins/proxy-backend/src/plugin.ts index 2e310860d5..52c1c26acd 100644 --- a/plugins/proxy-backend/src/plugin.ts +++ b/plugins/proxy-backend/src/plugin.ts @@ -21,7 +21,6 @@ import { } from '@backstage/backend-plugin-api'; import { createRouterInternal } from './service/router'; import { proxyEndpointsExtensionPoint } from '@backstage/plugin-proxy-node/alpha'; -import { JsonObject } from '@backstage/types'; /** * The proxy backend plugin. @@ -34,7 +33,7 @@ export const proxyPlugin = createBackendPlugin({ const additionalEndpoints = {}; env.registerExtensionPoint(proxyEndpointsExtensionPoint, { - addProxyEndpoints(endpoints: JsonObject) { + addProxyEndpoints(endpoints) { Object.assign(additionalEndpoints, endpoints); }, }); diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts index b0c7c95589..b578a9aed6 100644 --- a/plugins/proxy-backend/src/service/router.ts +++ b/plugins/proxy-backend/src/service/router.ts @@ -20,7 +20,6 @@ import Router from 'express-promise-router'; import { createProxyMiddleware, fixRequestBody, - Options, RequestHandler, } from 'http-proxy-middleware'; import { Logger } from 'winston'; @@ -31,6 +30,7 @@ import { HttpRouterService, RootConfigService, } from '@backstage/backend-plugin-api'; +import { ProxyConfig } from '@backstage/plugin-proxy-node/alpha'; // A list of headers that are always forwarded to the proxy targets. const safeForwardHeaders = [ @@ -66,12 +66,6 @@ export interface RouterOptions { additionalEndpoints?: JsonObject; } -export interface ProxyConfig extends Options { - allowedMethods?: string[]; - allowedHeaders?: string[]; - reviveRequestBody?: boolean; -} - // Creates a proxy middleware, possibly with defaults added on top of the // given config. export function buildMiddleware( @@ -88,7 +82,7 @@ export function buildMiddleware( fullConfig = { target: config }; credentialsPolicy = 'require'; } else { - const { credentials, ...rest } = config as any; + const { credentials, ...rest } = config; fullConfig = rest; credentialsPolicy = credentials ?? 'require'; } diff --git a/plugins/proxy-node/package.json b/plugins/proxy-node/package.json index 8293ae0c98..152fea3069 100644 --- a/plugins/proxy-node/package.json +++ b/plugins/proxy-node/package.json @@ -49,11 +49,12 @@ }, "dependencies": { "@backstage/backend-plugin-api": "workspace:^", - "@backstage/types": "workspace:^" + "http-proxy-middleware": "^2.0.0" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@backstage/config": "workspace:^" + "@backstage/config": "workspace:^", + "@types/http-proxy-middleware": "^1.0.0" } } diff --git a/plugins/proxy-node/report-alpha.api.md b/plugins/proxy-node/report-alpha.api.md index c64e5b773a..3608ea7ec6 100644 --- a/plugins/proxy-node/report-alpha.api.md +++ b/plugins/proxy-node/report-alpha.api.md @@ -4,12 +4,24 @@ ```ts import { ExtensionPoint } from '@backstage/backend-plugin-api'; -import { JsonObject } from '@backstage/types'; +import { Options } from 'http-proxy-middleware'; + +// @alpha +export interface ProxyConfig extends Options { + // (undocumented) + allowedHeaders?: string[]; + // (undocumented) + allowedMethods?: string[]; + // (undocumented) + credentials?: 'require' | 'forward' | 'dangerously-allow-unauthenticated'; + // (undocumented) + reviveRequestBody?: boolean; +} // @alpha export interface ProxyEndpointsExtensionPoint { // (undocumented) - addProxyEndpoints(endpoints: JsonObject): void; + addProxyEndpoints(endpoints: Record): void; } // @alpha diff --git a/plugins/proxy-node/src/alpha/index.ts b/plugins/proxy-node/src/alpha/index.ts index 215ec93d17..da5eb85f80 100644 --- a/plugins/proxy-node/src/alpha/index.ts +++ b/plugins/proxy-node/src/alpha/index.ts @@ -14,7 +14,19 @@ * limitations under the License. */ import { createExtensionPoint } from '@backstage/backend-plugin-api'; -import { JsonObject } from '@backstage/types'; +import { Options } from 'http-proxy-middleware'; + +/** + * http-proxy-middleware proxy config interface. + * + * @alpha + */ +export interface ProxyConfig extends Options { + allowedMethods?: string[]; + allowedHeaders?: string[]; + reviveRequestBody?: boolean; + credentials?: 'require' | 'forward' | 'dangerously-allow-unauthenticated'; +} /** * Extension point interface for managing proxy endpoints. @@ -22,7 +34,7 @@ import { JsonObject } from '@backstage/types'; * @alpha */ export interface ProxyEndpointsExtensionPoint { - addProxyEndpoints(endpoints: JsonObject): void; + addProxyEndpoints(endpoints: Record): void; } /** diff --git a/yarn.lock b/yarn.lock index 665257942b..715b7060d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7146,7 +7146,8 @@ __metadata: "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" - "@backstage/types": "workspace:^" + "@types/http-proxy-middleware": ^1.0.0 + http-proxy-middleware: ^2.0.0 languageName: unknown linkType: soft From 12ba80ff37be8cf2299ae76561987f4bacd5d8be Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Fri, 3 Jan 2025 14:02:56 +0100 Subject: [PATCH 09/58] docs: use a valid configuration as example Entity can't have spaces in their names. Signed-off-by: Gabriel Dugny --- .changeset/tasty-chairs-beam.md | 5 +++++ plugins/catalog-backend-module-backstage-openapi/README.md | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/tasty-chairs-beam.md diff --git a/.changeset/tasty-chairs-beam.md b/.changeset/tasty-chairs-beam.md new file mode 100644 index 0000000000..8a64e6fd0e --- /dev/null +++ b/.changeset/tasty-chairs-beam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-backstage-openapi': patch +--- + +docs: Use a valid configuration as example diff --git a/plugins/catalog-backend-module-backstage-openapi/README.md b/plugins/catalog-backend-module-backstage-openapi/README.md index 8df5b5d6c9..c4342d42cf 100644 --- a/plugins/catalog-backend-module-backstage-openapi/README.md +++ b/plugins/catalog-backend-module-backstage-openapi/README.md @@ -26,14 +26,14 @@ catalog: backstageOpenapi: plugins: - catalog - - todo + - events - search entityOverrides: # All optional metadata: - name: 'my name' + name: 'my-name' title: 'my title' spec: - owner: 'my team' + owner: 'my-team' ``` We will attempt to load each plugin's OpenAPI spec hosted at `${pluginRoute}/openapi.json`. These are automatically added if you are using `@backstage/backend-openapi-utils`'s `createValidatedOpenApiRouter`. From c3f91c07a5631b395db5312e70bebafff67950c9 Mon Sep 17 00:00:00 2001 From: Scott Rosenberg Date: Sun, 5 Jan 2025 12:35:01 +0200 Subject: [PATCH 10/58] add-kyverno-policy-reports-plugin Signed-off-by: Scott Rosenberg --- microsite/data/plugins/kyverno.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 microsite/data/plugins/kyverno.yaml diff --git a/microsite/data/plugins/kyverno.yaml b/microsite/data/plugins/kyverno.yaml new file mode 100644 index 0000000000..63554d02fe --- /dev/null +++ b/microsite/data/plugins/kyverno.yaml @@ -0,0 +1,9 @@ +title: Kyverno Policy Reports +author: terasky.com +authorUrl: https://github.com/terasky-oss +category: Kubernetes +description: View Kyverno Policy reports for Kubernetes resources related to components in Backstage. +documentation: https://github.com/TeraSky-OSS/backstage-plugins/tree/main/plugins/kyverno-policy-reports +iconUrl: https://github.com/cncf/artwork/blob/main/projects/kyverno/icon/color/kyverno-icon-color.png?raw=true +npmPackageName: '@terasky/backstage-plugin-kyverno-policy-reports' +addedDate: '2025-01-05' From 0cea9bfdf501d4322bb3846837441f21d287244d Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 6 Jan 2025 10:55:00 +0530 Subject: [PATCH 11/58] Updated observability docs Signed-off-by: AmbrishRamachandiran --- docs/plugins/observability.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/observability.md b/docs/plugins/observability.md index 324e6751d4..3bc625e7c6 100644 --- a/docs/plugins/observability.md +++ b/docs/plugins/observability.md @@ -11,7 +11,7 @@ Backstage integrator. ## Datadog RUM Events See how to install Datadog Events in your app -[here](../integrations/datadog-rum/installation.md) +[here](../integrations/datadog-rum/installation.md). ## Logging From 6affa12249f251bcda3cd5539e883cdafef864cc Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 6 Jan 2025 11:00:54 +0530 Subject: [PATCH 12/58] Updated docs of backstage conf Signed-off-by: AmbrishRamachandiran --- docs/conf/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf/index.md b/docs/conf/index.md index ef6faffd8b..659ffccfe3 100644 --- a/docs/conf/index.md +++ b/docs/conf/index.md @@ -61,7 +61,7 @@ More details are provided in dedicated sections of the documentation. - [Reading Configuration](./reading.md): How to read configuration in your plugin. -- [Writing Configuration](./writing.md): How to provide configuration for your +- [Writing Configuration](./writing.md): How to write configuration for your Backstage deployment. - [Defining Configuration](./defining.md): How to define a configuration schema for users of your plugin or package. From f96a41dae56e4da08f087c7952fc39ff6d6170ea Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 6 Jan 2025 14:37:22 +0530 Subject: [PATCH 13/58] Updated info in the linking local packages docs Signed-off-by: AmbrishRamachandiran --- docs/tooling/local-dev/linking-local-packages.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tooling/local-dev/linking-local-packages.md b/docs/tooling/local-dev/linking-local-packages.md index 9205195f64..c2bb55722c 100644 --- a/docs/tooling/local-dev/linking-local-packages.md +++ b/docs/tooling/local-dev/linking-local-packages.md @@ -48,9 +48,9 @@ If you are encountering errors related to React, it is likely that the versions ## Generating temporary patches -!!!info +:::info This feature is experimental and currently only supports Yarn workspaces. -!!! +::: After making local changes to a package in an external workspace you might often want to merge and deploy these changes in your own project. You can use Yarn patches for this purpose, but it can be quite cumbersome to create these patches manually. To make this process easier, you can use `yarn backstage-repo-tools generate-patch` command from the `@backstage/repo-tools` package to generate a patch and resolution entries in the external workspace. From efcf6c51d6abac3b44a7a9f95c960dde2f0330e6 Mon Sep 17 00:00:00 2001 From: Deepankumar Loganathan Date: Mon, 6 Jan 2025 12:35:18 +0100 Subject: [PATCH 14/58] Added Jager Tracing plugin Signed-off-by: Deepankumar Loganathan --- microsite/data/plugins/jaegertracing.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 microsite/data/plugins/jaegertracing.yaml diff --git a/microsite/data/plugins/jaegertracing.yaml b/microsite/data/plugins/jaegertracing.yaml new file mode 100644 index 0000000000..dc93193ddb --- /dev/null +++ b/microsite/data/plugins/jaegertracing.yaml @@ -0,0 +1,14 @@ +--- +title: Jaeger Tracing +author: Deepankumar +authorUrl: https://github.com/deepan10 +category: Observability +description: View Jaeger traces and trace details in Backstage components. +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/jaeger/plugins/jaeger/README.md +iconUrl: https://avatars.githubusercontent.com/u/28545596?s=200&v=4 +npmPackageName: '@backstage-community/plugin-jaeger' +tags: + - monitoring + - tracing + - observability +addedDate: '2024-12-21' From 77a423332a25b0b2950048788eeb2974d7d4dbb8 Mon Sep 17 00:00:00 2001 From: Mark Shields <4237425+beejiujitsu@users.noreply.github.com> Date: Mon, 30 Dec 2024 12:34:17 -0500 Subject: [PATCH 15/58] feat(plugin): glean Signed-off-by: Mark Shields <4237425+beejiujitsu@users.noreply.github.com> --- microsite/data/plugins/glean.yaml | 10 ++++++++++ .../static/img/glean-logo-circular-white.png | Bin 0 -> 10548 bytes 2 files changed, 10 insertions(+) create mode 100644 microsite/data/plugins/glean.yaml create mode 100644 microsite/static/img/glean-logo-circular-white.png diff --git a/microsite/data/plugins/glean.yaml b/microsite/data/plugins/glean.yaml new file mode 100644 index 0000000000..19e2c8b441 --- /dev/null +++ b/microsite/data/plugins/glean.yaml @@ -0,0 +1,10 @@ +--- +title: Glean +author: Mark Shields +authorUrl: https://github.com/beejiujitsu +category: Search +description: Index Backstage TechDocs-enabled Entities into Glean, the AI-powered work assistant +documentation: https://github.com/beejiujitsu/wealthsimple-backstage-plugins/tree/master/plugins/glean-backend +iconUrl: /img/glean-logo-circular-white.png +npmPackageName: '@beejiujitsu/backstage-plugin-glean-backend' +addedDate: '2024-12-30' \ No newline at end of file diff --git a/microsite/static/img/glean-logo-circular-white.png b/microsite/static/img/glean-logo-circular-white.png new file mode 100644 index 0000000000000000000000000000000000000000..bc83f0a6d858d4c36a8d54bff5a26aa1d24530d5 GIT binary patch literal 10548 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 Date: Wed, 8 Jan 2025 09:58:05 -0500 Subject: [PATCH 16/58] yarn prettier:fix from microsite dir Signed-off-by: Mark Shields <4237425+beejiujitsu@users.noreply.github.com> --- microsite/data/plugins/glean.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/glean.yaml b/microsite/data/plugins/glean.yaml index 19e2c8b441..057ec2f4fd 100644 --- a/microsite/data/plugins/glean.yaml +++ b/microsite/data/plugins/glean.yaml @@ -7,4 +7,4 @@ description: Index Backstage TechDocs-enabled Entities into Glean, the AI-powere documentation: https://github.com/beejiujitsu/wealthsimple-backstage-plugins/tree/master/plugins/glean-backend iconUrl: /img/glean-logo-circular-white.png npmPackageName: '@beejiujitsu/backstage-plugin-glean-backend' -addedDate: '2024-12-30' \ No newline at end of file +addedDate: '2024-12-30' From 98ec4160488bec96d4fe89786d20aad536fe529f Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Thu, 9 Jan 2025 12:31:02 +0530 Subject: [PATCH 17/58] Updated docs of versioning policy Signed-off-by: AmbrishRamachandiran --- docs/overview/versioning-policy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/overview/versioning-policy.md b/docs/overview/versioning-policy.md index f5e2e222f8..e108161281 100644 --- a/docs/overview/versioning-policy.md +++ b/docs/overview/versioning-policy.md @@ -108,7 +108,7 @@ The following versioning policy applies to all packages: - Breaking changes are noted in the changelog, and documentation is updated. - Breaking changes are prefixed with `**BREAKING**: ` in the changelog. - All public exports are considered stable and will have an entry in the - changelog + changelog. - Breaking changes are recommended to document a clear upgrade path in the changelog. This may be omitted for newly introduced or unstable packages. From cfa7d685660f5c44dc65100bc674cc31b7ae780f Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Wed, 18 Dec 2024 15:40:25 -0700 Subject: [PATCH 18/58] Add ApiBlueprint for form-decorators Signed-off-by: Tim Hansen --- .../src/alpha/api/FormDecoratorsApi.ts | 31 +++++++++++++++++++ plugins/scaffolder/src/alpha/api/index.ts | 2 +- plugins/scaffolder/src/alpha/plugin.tsx | 2 ++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts index 13c4b6d1a2..bc48ee3436 100644 --- a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts +++ b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts @@ -14,8 +14,14 @@ * limitations under the License. */ +import { + ApiBlueprint, + createApiFactory, + createExtensionInput, +} from '@backstage/frontend-plugin-api'; import { ScaffolderFormDecoratorsApi } from './types'; import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; +import { formDecoratorsApiRef } from './ref'; /** @alpha */ export class DefaultScaffolderFormDecoratorsApi @@ -37,3 +43,28 @@ export class DefaultScaffolderFormDecoratorsApi return this.options.decorators; } } + +/** @alpha */ +export const formDecoratorsApi = ApiBlueprint.makeWithOverrides({ + name: 'form-decorators', + inputs: { + // TODO: this should come from the inputs that the form decorators use + formDecorators: createExtensionInput([]), + }, + factory(originalFactory, { inputs }) { + // TODO: this should come from the inputs that the form decorators use + const formDecorators = + inputs.formDecorators as unknown as ScaffolderFormDecorator[]; + + return originalFactory({ + factory: createApiFactory({ + api: formDecoratorsApiRef, + deps: {}, + factory: () => + DefaultScaffolderFormDecoratorsApi.create({ + decorators: formDecorators, + }), + }), + }); + }, +}); diff --git a/plugins/scaffolder/src/alpha/api/index.ts b/plugins/scaffolder/src/alpha/api/index.ts index 07d4b65a3b..b6161dd252 100644 --- a/plugins/scaffolder/src/alpha/api/index.ts +++ b/plugins/scaffolder/src/alpha/api/index.ts @@ -16,4 +16,4 @@ export { formDecoratorsApiRef } from './ref'; export type { ScaffolderFormDecoratorsApi } from './types'; -export { DefaultScaffolderFormDecoratorsApi } from './FormDecoratorsApi'; +export * from './FormDecoratorsApi'; diff --git a/plugins/scaffolder/src/alpha/plugin.tsx b/plugins/scaffolder/src/alpha/plugin.tsx index 44ec1f5d4c..e281f51b0f 100644 --- a/plugins/scaffolder/src/alpha/plugin.tsx +++ b/plugins/scaffolder/src/alpha/plugin.tsx @@ -33,6 +33,7 @@ import { scaffolderApi, } from './extensions'; import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; +import { formDecoratorsApi } from './api'; /** @alpha */ export default createFrontendPlugin({ @@ -53,6 +54,7 @@ export default createFrontendPlugin({ scaffolderApi, scaffolderPage, scaffolderNavItem, + formDecoratorsApi, formFieldsApi, repoUrlPickerFormField, ], From 6bb6a7c7c31ee35611461e7508f984d5617eace8 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Fri, 20 Dec 2024 08:04:26 -0700 Subject: [PATCH 19/58] Add FormDecoratorBlueprint Signed-off-by: Tim Hansen Co-authored-by: blam --- .../blueprints/FormDecoratorBlueprint.tsx | 41 +++++++++++++++++++ .../src/next/blueprints/index.ts | 1 + .../src/alpha/api/FormDecoratorsApi.ts | 12 +++--- 3 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx diff --git a/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx new file mode 100644 index 0000000000..73e55948bb --- /dev/null +++ b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx @@ -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 { + createExtensionBlueprint, + createExtensionDataRef, +} from '@backstage/frontend-plugin-api'; +import { ScaffolderFormDecorator } from '../extensions'; + +const formDecoratorExtensionDataRef = + createExtensionDataRef().with({ + id: 'scaffolder.form-decorator-loader', + }); + +/** + * @alpha + * Creates extensions that are Field Extensions for the Scaffolder + * */ +export const FormDecoratorBlueprint = createExtensionBlueprint({ + kind: 'scaffolder-form-decorator', + attachTo: { id: 'api:scaffolder/form-decorator', input: 'formDecorators' }, + dataRefs: { + formDecoratorLoader: formDecoratorExtensionDataRef, + }, + output: [formDecoratorExtensionDataRef], + *factory(params: { decorator: ScaffolderFormDecorator }) { + yield formDecoratorExtensionDataRef(params.decorator); + }, +}); diff --git a/plugins/scaffolder-react/src/next/blueprints/index.ts b/plugins/scaffolder-react/src/next/blueprints/index.ts index 165c583ac8..d9d0d2e0b3 100644 --- a/plugins/scaffolder-react/src/next/blueprints/index.ts +++ b/plugins/scaffolder-react/src/next/blueprints/index.ts @@ -14,5 +14,6 @@ * limitations under the License. */ +export * from './FormDecoratorBlueprint'; export * from './FormFieldBlueprint'; export * from './types'; diff --git a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts index bc48ee3436..41bf91dba0 100644 --- a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts +++ b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts @@ -22,6 +22,7 @@ import { import { ScaffolderFormDecoratorsApi } from './types'; import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; import { formDecoratorsApiRef } from './ref'; +import { FormDecoratorBlueprint } from '@backstage/plugin-scaffolder-react/alpha'; /** @alpha */ export class DefaultScaffolderFormDecoratorsApi @@ -48,13 +49,14 @@ export class DefaultScaffolderFormDecoratorsApi export const formDecoratorsApi = ApiBlueprint.makeWithOverrides({ name: 'form-decorators', inputs: { - // TODO: this should come from the inputs that the form decorators use - formDecorators: createExtensionInput([]), + formDecorators: createExtensionInput([ + FormDecoratorBlueprint.dataRefs.formDecoratorLoader, + ]), }, factory(originalFactory, { inputs }) { - // TODO: this should come from the inputs that the form decorators use - const formDecorators = - inputs.formDecorators as unknown as ScaffolderFormDecorator[]; + const formDecorators = inputs.formDecorators.map(e => + e.get(FormDecoratorBlueprint.dataRefs.formDecoratorLoader), + ); return originalFactory({ factory: createApiFactory({ From 528e51e258a3d2cb5d948b1ebd1f2dd287fed503 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Wed, 8 Jan 2025 15:30:12 -0700 Subject: [PATCH 20/58] Fix attachTo Signed-off-by: Tim Hansen --- .../src/next/blueprints/FormDecoratorBlueprint.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx index 73e55948bb..436b1df85c 100644 --- a/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx +++ b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx @@ -30,7 +30,7 @@ const formDecoratorExtensionDataRef = * */ export const FormDecoratorBlueprint = createExtensionBlueprint({ kind: 'scaffolder-form-decorator', - attachTo: { id: 'api:scaffolder/form-decorator', input: 'formDecorators' }, + attachTo: { id: 'api:scaffolder/form-decorators', input: 'formDecorators' }, dataRefs: { formDecoratorLoader: formDecoratorExtensionDataRef, }, From 47562876499fe4f34acdc1c1c4f1bb337df1682f Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Wed, 8 Jan 2025 15:35:25 -0700 Subject: [PATCH 21/58] changeset Signed-off-by: Tim Hansen --- .changeset/strong-schools-fix.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/strong-schools-fix.md diff --git a/.changeset/strong-schools-fix.md b/.changeset/strong-schools-fix.md new file mode 100644 index 0000000000..117d33a3eb --- /dev/null +++ b/.changeset/strong-schools-fix.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Added support for `FormDecoratorBlueprint` to create form decorators in the Scaffolder plugin From c830134b470dae7d2634d0e2bfa9028e605d5ca6 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Thu, 9 Jan 2025 07:51:32 -0700 Subject: [PATCH 22/58] api-reports Signed-off-by: Tim Hansen --- plugins/scaffolder-react/report-alpha.api.md | 24 +++++++++ plugins/scaffolder/report-alpha.api.md | 52 ++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/plugins/scaffolder-react/report-alpha.api.md b/plugins/scaffolder-react/report-alpha.api.md index 4f9f86d1ac..4cddb48602 100644 --- a/plugins/scaffolder-react/report-alpha.api.md +++ b/plugins/scaffolder-react/report-alpha.api.md @@ -132,6 +132,30 @@ export const Form: ( props: PropsWithChildren, ) => React_2.JSX.Element; +// @alpha +export const FormDecoratorBlueprint: ExtensionBlueprint<{ + kind: 'scaffolder-form-decorator'; + name: undefined; + params: { + decorator: ScaffolderFormDecorator; + }; + output: ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >; + inputs: {}; + config: {}; + configInput: {}; + dataRefs: { + formDecoratorLoader: ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >; + }; +}>; + // @alpha export const FormFieldBlueprint: ExtensionBlueprint<{ kind: 'scaffolder-form-field'; diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index e272b57655..7623350d96 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -80,6 +80,33 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; + 'api:scaffolder/form-decorators': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + formDecorators: ExtensionInput< + ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-decorators'; + params: { + factory: AnyApiFactory; + }; + }>; 'page:scaffolder': ExtensionDefinition<{ kind: 'page'; name: undefined; @@ -173,6 +200,31 @@ export class DefaultScaffolderFormDecoratorsApi getFormDecorators(): Promise; } +// @alpha (undocumented) +export const formDecoratorsApi: ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef; + inputs: { + formDecorators: ExtensionInput< + ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-decorators'; + params: { + factory: AnyApiFactory; + }; +}>; + // @alpha (undocumented) export const formDecoratorsApiRef: ApiRef; From d4a8246fd1799d95c4d2b2a25b75c0caf5a5e56f Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Sat, 11 Jan 2025 00:01:57 +1100 Subject: [PATCH 23/58] cfaccess: fallback to identity email when constructing the user profile Signed-off-by: Tyler Davis --- .changeset/fast-seas-hunt.md | 5 ++++ .../src/authenticator.test.ts | 23 ++++++++++++++++++- .../src/authenticator.ts | 2 +- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 .changeset/fast-seas-hunt.md diff --git a/.changeset/fast-seas-hunt.md b/.changeset/fast-seas-hunt.md new file mode 100644 index 0000000000..6e187cb6b1 --- /dev/null +++ b/.changeset/fast-seas-hunt.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch +--- + +Fallback to email from cfIdentity when constructing user profile for Service Token support. diff --git a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts index 678e513412..69fcb742e5 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts +++ b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts @@ -18,7 +18,7 @@ import { mockServices } from '@backstage/backend-test-utils'; import { createCloudflareAccessAuthenticator } from './authenticator'; describe('authenticator', () => { - it('createCloudflareAccessAuthenticator works', async () => { + it('works for normal users', async () => { const auth = createCloudflareAccessAuthenticator({ cache: mockServices.cache.mock(), }); @@ -38,4 +38,25 @@ describe('authenticator', () => { }, }); }); + + it('works for service tokens', async () => { + const auth = createCloudflareAccessAuthenticator({ + cache: mockServices.cache.mock(), + }); + + const profile = await auth.defaultProfileTransform( + { + cfIdentity: { name: 'Name', email: 'hello@example.com' } as any, + claims: {} as any, + token: 'fake', + }, + {} as any, + ); + expect(profile).toEqual({ + profile: { + displayName: 'Name', + email: 'hello@example.com', + }, + }); + }); }); diff --git a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts index c15a1a19a0..632c439d7e 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts @@ -38,7 +38,7 @@ export function createCloudflareAccessAuthenticator(options?: { async defaultProfileTransform(result: CloudflareAccessResult) { return { profile: { - email: result.claims.email, + email: result.claims.email ?? result.cfIdentity.email, displayName: result.cfIdentity.name, }, }; From 96a6c36bb4e118da5a01319146072f18cbe00d55 Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Sat, 11 Jan 2025 08:06:39 +1100 Subject: [PATCH 24/58] simplify to always use email from cfIdentity Signed-off-by: Tyler Davis --- .../src/authenticator.test.ts | 2 +- .../src/authenticator.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts index 69fcb742e5..ea38bd5180 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts +++ b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.test.ts @@ -25,7 +25,7 @@ describe('authenticator', () => { const profile = await auth.defaultProfileTransform( { - cfIdentity: { name: 'Name' } as any, + cfIdentity: { name: 'Name', email: 'hello@example.com' } as any, claims: { email: 'hello@example.com' } as any, token: 'fake', }, diff --git a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts index 632c439d7e..7b311a60f0 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts +++ b/plugins/auth-backend-module-cloudflare-access-provider/src/authenticator.ts @@ -38,7 +38,7 @@ export function createCloudflareAccessAuthenticator(options?: { async defaultProfileTransform(result: CloudflareAccessResult) { return { profile: { - email: result.claims.email ?? result.cfIdentity.email, + email: result.cfIdentity.email, displayName: result.cfIdentity.name, }, }; From 197dda1483fc0beab9a95c24c4534e98c63a5db1 Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Sat, 11 Jan 2025 08:08:00 +1100 Subject: [PATCH 25/58] update changeset Signed-off-by: Tyler Davis --- .changeset/fast-seas-hunt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fast-seas-hunt.md b/.changeset/fast-seas-hunt.md index 6e187cb6b1..c4fb45dd47 100644 --- a/.changeset/fast-seas-hunt.md +++ b/.changeset/fast-seas-hunt.md @@ -2,4 +2,4 @@ '@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch --- -Fallback to email from cfIdentity when constructing user profile for Service Token support. +Use email from cfIdentity instead of claims when constructing user profile for Service Token support. From 659183e5043ff249b2290068595a5f0fd6b5a2d1 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 10 Jan 2025 15:17:53 -0600 Subject: [PATCH 26/58] Added 04kash to Community Plugins Signed-off-by: Andre Wanlin --- OWNERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS.md b/OWNERS.md index 0932d3386b..15e989f3b7 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -132,6 +132,7 @@ Scope: Tooling and Community Repo Maintainers for the Backstage [Community Plugi | -------------------- | ------------ | ------------------------------------------- | ------------ | | André Wanlin | Spotify | [awanlin](https://github.com/awanlin) | `ahhhndre` | | Bethany Griggs | Red Hat | [BethGriggs](https://github.com/BethGriggs) | `bethgriggs` | +| Kashish Mittal | Red Hat | [04kash](https://github.com/04kash) | `kashh._.` | | Nick Boldt | Red Hat | [nickboldt](https://github.com/nickboldt) | `nboldt` | | Vincenzo Scamporlino | Spotify | [vinzscam](https://github.com/vinzscam) | `vinzscam` | From 7b6298706b80d043c5236f8bbc6fe4e4e8c69669 Mon Sep 17 00:00:00 2001 From: Jente Sondervorst Date: Fri, 10 Jan 2025 22:20:09 +0100 Subject: [PATCH 27/58] Updated the path field in the gitlab:group:ensureExists action to accept an array of objects (with name and slug) besides the existing array of strings Fixes #28392 Signed-off-by: Jente Sondervorst --- .changeset/young-forks-grab.md | 5 ++ .../gitlabGroupEnsureExists.examples.test.ts | 47 +++++++++++++++++++ .../gitlabGroupEnsureExists.examples.ts | 20 ++++++++ .../actions/gitlabGroupEnsureExists.test.ts | 41 +++++++++++++++- .../src/actions/gitlabGroupEnsureExists.ts | 27 +++++++---- 5 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 .changeset/young-forks-grab.md diff --git a/.changeset/young-forks-grab.md b/.changeset/young-forks-grab.md new file mode 100644 index 0000000000..d48a4f1f7d --- /dev/null +++ b/.changeset/young-forks-grab.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': minor +--- + +Updated the path field in the gitlab:group:ensureExists action to accept an array of either strings or objects with name and slug fields. diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts index 202b397d19..eaeb65ae9c 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.test.ts @@ -196,4 +196,51 @@ describe('gitlab:group:ensureExists', () => { expect(mockContext.output).toHaveBeenCalledWith('groupId', 42); }); + + it(`Should ${examples[4].description}`, async () => { + mockGitlabClient.Groups.search.mockResolvedValue([ + { + id: 1, + full_path: 'group1', + }, + { + id: 2, + full_path: 'group1/group2', + }, + ]); + mockGitlabClient.Groups.create.mockResolvedValue({ + id: 3, + full_path: 'group1/group2/group3', + }); + + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'tokenlols', + apiBaseUrl: 'https://api.gitlab.com', + }, + ], + }, + }); + const integrations = ScmIntegrations.fromConfig(config); + + const action = createGitlabGroupEnsureExistsAction({ integrations }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[4].example).steps[0].input, + }); + + expect(mockGitlabClient.Groups.create).toHaveBeenCalledWith( + 'Group 3', + 'group3', + { + parentId: 2, + }, + ); + + expect(mockContext.output).toHaveBeenCalledWith('groupId', 3); + }); }); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts index 41dd822e82..bbe7ad4722 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.examples.ts @@ -82,4 +82,24 @@ export const examples: TemplateExample[] = [ ], }), }, + { + description: 'Create a group nested within another group using objects', + example: yaml.stringify({ + steps: [ + { + id: 'gitlabGroup', + name: 'Group', + action: 'gitlab:group:ensureExists', + input: { + repoUrl: 'gitlab.com', + path: [ + { name: 'Group 1', slug: 'group1' }, + { name: 'Group 2', slug: 'group2' }, + { name: 'Group 3', slug: 'group3' }, + ], + }, + }, + ], + }), + }, ]; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts index 1192052e6d..f9dc12eb54 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.test.ts @@ -62,7 +62,7 @@ describe('gitlab:group:ensureExists', () => { const mockContext = createMockActionContext(); - it('should create a new group if it does not exists', async () => { + it('should create a new group from string if it does not exists', async () => { mockGitlabClient.Groups.search.mockResolvedValue([ { id: 1, @@ -94,6 +94,45 @@ describe('gitlab:group:ensureExists', () => { expect(mockContext.output).toHaveBeenCalledWith('groupId', 3); }); + it('should create a new group from object if it does not exists', async () => { + mockGitlabClient.Groups.search.mockResolvedValue([ + { + id: 1, + full_path: 'bar', + }, + { + id: 2, + full_path: 'foo', + }, + ]); + + mockGitlabClient.Groups.create.mockResolvedValue({ + id: 3, + full_path: 'foo/bar', + }); + + await action.handler({ + ...mockContext, + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + path: [ + { name: 'Foo', slug: 'foo' }, + { name: 'Bar is a nice name', slug: 'bar' }, + ], + }, + }); + + expect(mockGitlabClient.Groups.create).toHaveBeenCalledWith( + 'Bar is a nice name', + 'bar', + { + parentId: 2, + }, + ); + + expect(mockContext.output).toHaveBeenCalledWith('groupId', 3); + }); + it('should return existing group if it does exists', async () => { mockGitlabClient.Groups.search.mockResolvedValue([ { diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts index 7134726e6f..50ce7a761b 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabGroupEnsureExists.ts @@ -41,9 +41,18 @@ export const createGitlabGroupEnsureExistsAction = (options: { input: commonGitlabConfig.merge( z.object({ path: z - .array(z.string(), { - description: 'A path of group names that is ensured to exist', - }) + .array( + z.string().or( + z.object({ + name: z.string(), + slug: z.string(), + }), + ), + { + description: + 'A path of group names or objects (name and slug) that is ensured to exist', + }, + ) .min(1), }), ), @@ -68,9 +77,11 @@ export const createGitlabGroupEnsureExistsAction = (options: { let currentPath: string | null = null; let parentId: number | null = null; for (const pathElement of path) { - const fullPath: string = currentPath - ? `${currentPath}/${pathElement}` - : pathElement; + const slug = + typeof pathElement === 'string' ? pathElement : pathElement.slug; + const name = + typeof pathElement === 'string' ? pathElement : pathElement.name; + const fullPath: string = currentPath ? `${currentPath}/${slug}` : slug; const result = (await api.Groups.search( fullPath, )) as unknown as Array; // recast since the return type for search is wrong in the gitbeaker typings @@ -81,8 +92,8 @@ export const createGitlabGroupEnsureExistsAction = (options: { ctx.logger.info(`creating missing group ${fullPath}`); parentId = ( await api.Groups.create( - pathElement, - pathElement, + name, + slug, parentId ? { parentId: parentId, From 4273db9b7e9ab2f604afe7ab8010de40ed189a07 Mon Sep 17 00:00:00 2001 From: Jente Sondervorst Date: Fri, 10 Jan 2025 22:52:11 +0100 Subject: [PATCH 28/58] Updated api Signed-off-by: Jente Sondervorst --- plugins/scaffolder-backend-module-gitlab/report.api.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend-module-gitlab/report.api.md b/plugins/scaffolder-backend-module-gitlab/report.api.md index 896c0a5899..5ead133e7a 100644 --- a/plugins/scaffolder-backend-module-gitlab/report.api.md +++ b/plugins/scaffolder-backend-module-gitlab/report.api.md @@ -14,7 +14,13 @@ export const createGitlabGroupEnsureExistsAction: (options: { integrations: ScmIntegrationRegistry; }) => TemplateAction< { - path: string[]; + path: ( + | string + | { + name: string; + slug: string; + } + )[]; repoUrl: string; token?: string | undefined; }, From f0f89c1baaf455a9cfbd06ba55bc4e9cc0927ddc Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sat, 11 Jan 2025 09:14:11 +0000 Subject: [PATCH 29/58] Add top nav bar Signed-off-by: Charles de Dreuille --- canon-docs/src/app/layout.tsx | 12 +-- .../src/components/Sidebar/Sidebar.module.css | 17 ++-- canon-docs/src/components/Sidebar/index.tsx | 16 ++-- canon-docs/src/components/Toolbar/index.tsx | 18 ++++ .../src/components/Toolbar/nav.module.css | 84 +++++++++++++++++++ canon-docs/src/components/Toolbar/nav.tsx | 54 ++++++++++++ .../src/components/Toolbar/styles.module.css | 21 +++++ .../tabs.module.css} | 0 .../components/{Sidebar => Toolbar}/tabs.tsx | 54 +----------- 9 files changed, 195 insertions(+), 81 deletions(-) create mode 100644 canon-docs/src/components/Toolbar/index.tsx create mode 100644 canon-docs/src/components/Toolbar/nav.module.css create mode 100644 canon-docs/src/components/Toolbar/nav.tsx create mode 100644 canon-docs/src/components/Toolbar/styles.module.css rename canon-docs/src/components/{Sidebar/Tabs.module.css => Toolbar/tabs.module.css} (100%) rename canon-docs/src/components/{Sidebar => Toolbar}/tabs.tsx (50%) diff --git a/canon-docs/src/app/layout.tsx b/canon-docs/src/app/layout.tsx index f51e130a67..6eb1856a1d 100644 --- a/canon-docs/src/app/layout.tsx +++ b/canon-docs/src/app/layout.tsx @@ -1,8 +1,9 @@ import type { Metadata } from 'next'; import { Sidebar } from '../components/Sidebar'; +import { Toolbar } from '@/components/Toolbar'; +import { Providers } from './providers'; import styles from './page.module.css'; -import { Providers } from './providers'; import './globals.css'; import '/public/core.css'; @@ -19,10 +20,6 @@ export default function RootLayout({ }: Readonly<{ children: React.ReactNode; }>) { - // const cookieStore = await cookies(); - // const theme = cookieStore.get('theme')?.value || 'light'; - // const themeName = cookieStore.get('theme-name')?.value || 'default'; - return (
-
{children}
+
+ + {children} +
diff --git a/canon-docs/src/components/Sidebar/Sidebar.module.css b/canon-docs/src/components/Sidebar/Sidebar.module.css index 809f1b560b..1b9aa02424 100644 --- a/canon-docs/src/components/Sidebar/Sidebar.module.css +++ b/canon-docs/src/components/Sidebar/Sidebar.module.css @@ -13,22 +13,15 @@ overflow: hidden; } +.logoContainer { + padding-left: 6px; + padding-top: 32px; +} + .logo path { fill: var(--canon-text-primary); } -.content { - padding-top: 20px; -} - -.actions { - display: flex; - flex-direction: row; - gap: 12px; - margin-top: 20px; - margin-bottom: 12px; -} - .menu { display: flex; flex-direction: row; diff --git a/canon-docs/src/components/Sidebar/index.tsx b/canon-docs/src/components/Sidebar/index.tsx index ecbf157d6c..455ab4be9b 100644 --- a/canon-docs/src/components/Sidebar/index.tsx +++ b/canon-docs/src/components/Sidebar/index.tsx @@ -1,5 +1,4 @@ import styles from './Sidebar.module.css'; -import { TabsVersion, TabsPages, TabsTheme } from './tabs'; import { Docs } from './docs'; import { Playground } from './playground'; import Link from 'next/link'; @@ -7,7 +6,7 @@ import Link from 'next/link'; export const Sidebar = () => { return (
-
+
{ -
- - -
- -
- - -
+
+
+ +
); diff --git a/canon-docs/src/components/Toolbar/index.tsx b/canon-docs/src/components/Toolbar/index.tsx new file mode 100644 index 0000000000..dfa6fd049d --- /dev/null +++ b/canon-docs/src/components/Toolbar/index.tsx @@ -0,0 +1,18 @@ +import Link from 'next/link'; +import { TabsVersion, TabsTheme } from './tabs'; +import styles from './styles.module.css'; +import { Nav } from './nav'; + +export const Toolbar = () => { + return ( +
+
+
+
+ + +
+
+ ); +}; diff --git a/canon-docs/src/components/Toolbar/nav.module.css b/canon-docs/src/components/Toolbar/nav.module.css new file mode 100644 index 0000000000..cb89843088 --- /dev/null +++ b/canon-docs/src/components/Toolbar/nav.module.css @@ -0,0 +1,84 @@ +.tabs { + height: 60px; +} + +.tabsTheme { + width: 142px; + border-radius: 0.375rem; + background-color: var(--canon-surface-2); + transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; +} + +.list { + display: flex; + position: relative; + z-index: 0; + gap: 1.5rem; +} + +.tab { + height: 60px; + display: flex; + align-items: center; + justify-content: center; + border: 0; + margin: 0; + outline: 0; + background: none; + appearance: none; + color: var(--canon-text-secondary) !important; + font-family: inherit; + font-size: 0.75rem; + line-height: 1.25rem; + font-weight: 500; + user-select: none; + flex: 1; + cursor: pointer; + padding: 0; + + &[data-selected] { + color: var(--canon-text-primary) !important; + + & p { + color: var(--canon-text-primary) !important; + } + } + + @media (hover: hover) { + &:hover { + color: var(--canon-text-primary); + } + } + + &:focus-visible { + position: relative; + + &::before { + content: ''; + position: absolute; + inset: 0.25rem 0; + border-radius: 0.25rem; + outline: 2px solid var(--canon-surface-1); + outline-offset: -1px; + } + } +} + +.tab p { + color: var(--canon-text-secondary) !important; +} + +.indicator { + position: absolute; + z-index: -1; + left: 0; + bottom: -1px; + translate: var(--active-tab-left) -50%; + width: var(--active-tab-width); + height: 1px; + border-radius: 0.25rem; + background-color: var(--canon-text-primary); + transition-property: translate, width, background-color; + transition-duration: 200ms; + transition-timing-function: ease-in-out; +} diff --git a/canon-docs/src/components/Toolbar/nav.tsx b/canon-docs/src/components/Toolbar/nav.tsx new file mode 100644 index 0000000000..b9d7ff0e35 --- /dev/null +++ b/canon-docs/src/components/Toolbar/nav.tsx @@ -0,0 +1,54 @@ +'use client'; + +import { Tabs } from '@base-ui-components/react/tabs'; +import { Text } from '../../../../packages/canon'; +import { usePathname } from 'next/navigation'; +import { useRouter } from 'next/navigation'; +import styles from './nav.module.css'; + +export const Nav = () => { + const pathname = usePathname(); + const router = useRouter(); + + const onValueChange = (value: string) => { + if (value === 'docs') { + router.push('/'); + } else { + router.push('/playground'); + } + }; + + return ( + + + { + router.push('/'); + }} + > + + Documentation + + + { + router.push('/playground'); + }} + > + + Playground + + + + + + ); +}; diff --git a/canon-docs/src/components/Toolbar/styles.module.css b/canon-docs/src/components/Toolbar/styles.module.css new file mode 100644 index 0000000000..3840030c02 --- /dev/null +++ b/canon-docs/src/components/Toolbar/styles.module.css @@ -0,0 +1,21 @@ +.toolbar { + position: sticky; + top: 0; + left: 0; + right: 0; + z-index: 1000; + background-color: var(--canon-surface-1); + border-bottom: 1px solid var(--canon-border-base); + height: 60px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 var(--canon-spacing-md); + transition: background-color 0.2s ease-in-out; +} + +.actions { + display: flex; + align-items: center; + gap: var(--canon-spacing-md); +} diff --git a/canon-docs/src/components/Sidebar/Tabs.module.css b/canon-docs/src/components/Toolbar/tabs.module.css similarity index 100% rename from canon-docs/src/components/Sidebar/Tabs.module.css rename to canon-docs/src/components/Toolbar/tabs.module.css diff --git a/canon-docs/src/components/Sidebar/tabs.tsx b/canon-docs/src/components/Toolbar/tabs.tsx similarity index 50% rename from canon-docs/src/components/Sidebar/tabs.tsx rename to canon-docs/src/components/Toolbar/tabs.tsx index e43f9a0422..39d21ff408 100644 --- a/canon-docs/src/components/Sidebar/tabs.tsx +++ b/canon-docs/src/components/Toolbar/tabs.tsx @@ -1,12 +1,9 @@ 'use client'; -import styles from './Tabs.module.css'; import { Tabs } from '@base-ui-components/react/tabs'; -import { Icon } from '../../../../packages/canon/src/components/Icon'; -import { Text } from '../../../../packages/canon/src/components/Text'; -import { usePathname } from 'next/navigation'; -import { useRouter } from 'next/navigation'; +import { Icon, Text } from '../../../../packages/canon'; import { usePlayground } from '@/utils/playground-context'; +import styles from './tabs.module.css'; export const TabsVersion = () => { const { selectedThemeName, setSelectedThemeName } = usePlayground(); @@ -54,50 +51,3 @@ export const TabsTheme = () => { ); }; - -export const TabsPages = () => { - const pathname = usePathname(); - const router = useRouter(); - - const onValueChange = (value: string) => { - if (value === 'docs') { - router.push('/'); - } else { - router.push('/playground'); - } - }; - - return ( - - - { - router.push('/'); - }} - > - - Documentation - - - { - router.push('/playground'); - }} - > - - Playground - - - - - - ); -}; From 305bab61ee110b0eac8cc84d2aeabd33fde2e202 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sat, 11 Jan 2025 11:10:19 +0000 Subject: [PATCH 30/58] Add new Select theme in the toolbar Signed-off-by: Charles de Dreuille --- canon-docs/src/components/Toolbar/index.tsx | 8 +- .../src/components/Toolbar/nav.module.css | 37 ++--- canon-docs/src/components/Toolbar/nav.tsx | 9 +- .../src/components/Toolbar/styles.module.css | 4 +- canon-docs/src/components/Toolbar/tabs.tsx | 53 ------- .../components/Toolbar/theme-name.module.css | 129 ++++++++++++++++++ .../src/components/Toolbar/theme-name.tsx | 48 +++++++ .../{tabs.module.css => theme.module.css} | 16 +-- canon-docs/src/components/Toolbar/theme.tsx | 28 ++++ 9 files changed, 231 insertions(+), 101 deletions(-) delete mode 100644 canon-docs/src/components/Toolbar/tabs.tsx create mode 100644 canon-docs/src/components/Toolbar/theme-name.module.css create mode 100644 canon-docs/src/components/Toolbar/theme-name.tsx rename canon-docs/src/components/Toolbar/{tabs.module.css => theme.module.css} (82%) create mode 100644 canon-docs/src/components/Toolbar/theme.tsx diff --git a/canon-docs/src/components/Toolbar/index.tsx b/canon-docs/src/components/Toolbar/index.tsx index dfa6fd049d..eac51f1857 100644 --- a/canon-docs/src/components/Toolbar/index.tsx +++ b/canon-docs/src/components/Toolbar/index.tsx @@ -1,5 +1,5 @@ -import Link from 'next/link'; -import { TabsVersion, TabsTheme } from './tabs'; +import { ThemeSelector } from './theme'; +import { ThemeNameSelector } from './theme-name'; import styles from './styles.module.css'; import { Nav } from './nav'; @@ -10,8 +10,8 @@ export const Toolbar = () => {
- - + +
); diff --git a/canon-docs/src/components/Toolbar/nav.module.css b/canon-docs/src/components/Toolbar/nav.module.css index cb89843088..6c1b8e62d4 100644 --- a/canon-docs/src/components/Toolbar/nav.module.css +++ b/canon-docs/src/components/Toolbar/nav.module.css @@ -13,39 +13,26 @@ display: flex; position: relative; z-index: 0; - gap: 1.5rem; + gap: var(--canon-spacing-lg); } .tab { + all: unset; height: 60px; - display: flex; - align-items: center; - justify-content: center; - border: 0; - margin: 0; - outline: 0; - background: none; - appearance: none; - color: var(--canon-text-secondary) !important; - font-family: inherit; - font-size: 0.75rem; - line-height: 1.25rem; - font-weight: 500; - user-select: none; - flex: 1; + color: var(--canon-text-secondary); + font-size: var(--canon-font-size-body); + font-weight: var(--canon-font-weight-bold); cursor: pointer; - padding: 0; + transition: color 0.2s ease-in-out; - &[data-selected] { - color: var(--canon-text-primary) !important; - - & p { - color: var(--canon-text-primary) !important; - } + &:hover { + color: var(--canon-text-primary); } - @media (hover: hover) { - &:hover { + &[data-selected] { + color: var(--canon-text-primary); + + & p { color: var(--canon-text-primary); } } diff --git a/canon-docs/src/components/Toolbar/nav.tsx b/canon-docs/src/components/Toolbar/nav.tsx index b9d7ff0e35..017599581e 100644 --- a/canon-docs/src/components/Toolbar/nav.tsx +++ b/canon-docs/src/components/Toolbar/nav.tsx @@ -1,7 +1,6 @@ 'use client'; import { Tabs } from '@base-ui-components/react/tabs'; -import { Text } from '../../../../packages/canon'; import { usePathname } from 'next/navigation'; import { useRouter } from 'next/navigation'; import styles from './nav.module.css'; @@ -32,9 +31,7 @@ export const Nav = () => { router.push('/'); }} > - - Documentation - + Documentation { router.push('/playground'); }} > - - Playground - + Playground diff --git a/canon-docs/src/components/Toolbar/styles.module.css b/canon-docs/src/components/Toolbar/styles.module.css index 3840030c02..c960dca891 100644 --- a/canon-docs/src/components/Toolbar/styles.module.css +++ b/canon-docs/src/components/Toolbar/styles.module.css @@ -3,7 +3,7 @@ top: 0; left: 0; right: 0; - z-index: 1000; + z-index: 10; background-color: var(--canon-surface-1); border-bottom: 1px solid var(--canon-border-base); height: 60px; @@ -17,5 +17,5 @@ .actions { display: flex; align-items: center; - gap: var(--canon-spacing-md); + gap: var(--canon-spacing-sm); } diff --git a/canon-docs/src/components/Toolbar/tabs.tsx b/canon-docs/src/components/Toolbar/tabs.tsx deleted file mode 100644 index 39d21ff408..0000000000 --- a/canon-docs/src/components/Toolbar/tabs.tsx +++ /dev/null @@ -1,53 +0,0 @@ -'use client'; - -import { Tabs } from '@base-ui-components/react/tabs'; -import { Icon, Text } from '../../../../packages/canon'; -import { usePlayground } from '@/utils/playground-context'; -import styles from './tabs.module.css'; - -export const TabsVersion = () => { - const { selectedThemeName, setSelectedThemeName } = usePlayground(); - return ( - - - - - Theme 1 - - - - - Theme 2 - - - - - - ); -}; - -export const TabsTheme = () => { - const { selectedTheme, setSelectedTheme } = usePlayground(); - - return ( - - - - - - - - - - - - ); -}; diff --git a/canon-docs/src/components/Toolbar/theme-name.module.css b/canon-docs/src/components/Toolbar/theme-name.module.css new file mode 100644 index 0000000000..807f22d343 --- /dev/null +++ b/canon-docs/src/components/Toolbar/theme-name.module.css @@ -0,0 +1,129 @@ +.Select { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; + height: 2.5rem; + padding-left: 0.875rem; + padding-right: 0.75rem; + margin: 0; + outline: 0; + border: 1px solid var(--color-gray-200); + border-radius: 0.375rem; + font-family: inherit; + font-size: 1rem; + line-height: 1.5rem; + color: var(--color-gray-900); + cursor: pointer; + user-select: none; + background-color: var(--canon-surface-2); + transition: background-color 0.2s ease-in-out; + + &:focus-visible { + outline: 2px solid var(--color-blue); + outline-offset: -1px; + } +} + +.SelectIcon { + display: flex; +} + +.Popup { + box-sizing: border-box; + padding-block: 0.25rem; + border-radius: 0.375rem; + background-color: canvas; + color: var(--color-gray-900); + border: 1px solid var(--canon-border-base); + + transform-origin: var(--transform-origin); + transition: transform 150ms, opacity 150ms; + + &[data-starting-style], + &[data-ending-style] { + opacity: 0; + transform: scale(0.9); + } + + &[data-side='none'] { + transition: none; + transform: none; + opacity: 1; + } + + @media (prefers-color-scheme: light) { + outline: 1px solid var(--color-gray-200); + box-shadow: 0px 10px 15px -3px var(--color-gray-200), + 0px 4px 6px -4px var(--color-gray-200); + } + + @media (prefers-color-scheme: dark) { + outline: 1px solid var(--color-gray-300); + outline-offset: -1px; + } +} + +.Item { + box-sizing: border-box; + outline: 0; + font-size: 0.875rem; + line-height: 1rem; + padding-block: 0.5rem; + padding-left: 0.625rem; + padding-right: 1rem; + font-size: var(--canon-font-size-body); + font-weight: var(--canon-font-weight-bold); + display: grid; + gap: 0.5rem; + align-items: center; + grid-template-columns: 0.75rem 1fr; + cursor: default; + user-select: none; + + [data-side='none'] & { + font-size: 1rem; + padding-right: 3rem; + min-width: calc(var(--anchor-width) + 1rem); + } + + &[data-highlighted] { + z-index: 0; + position: relative; + color: var(--color-gray-50); + } + + &[data-highlighted]::before { + content: ''; + z-index: -1; + position: absolute; + inset-block: 0; + inset-inline: 0.25rem; + border-radius: 0.25rem; + background-color: var(--color-gray-900); + } +} + +.ItemIndicator { + grid-column-start: 1; +} + +.ItemIndicatorIcon { + display: block; + width: 0.75rem; + height: 0.75rem; +} + +.ItemText { + grid-column-start: 2; +} + +.SelectValue { + font-size: var(--canon-font-size-body); + font-weight: var(--canon-font-weight-bold); +} + +.Positioner { + z-index: 20; +} diff --git a/canon-docs/src/components/Toolbar/theme-name.tsx b/canon-docs/src/components/Toolbar/theme-name.tsx new file mode 100644 index 0000000000..57c858dd44 --- /dev/null +++ b/canon-docs/src/components/Toolbar/theme-name.tsx @@ -0,0 +1,48 @@ +'use client'; + +import { Select } from '@base-ui-components/react/select'; +import styles from './theme-name.module.css'; +import { Icon } from '@backstage/canon'; +import { usePlayground } from '@/utils/playground-context'; + +const themes = [ + { name: 'Backstage Legacy', value: 'legacy' }, + { name: 'Backstage Default', value: 'default' }, +]; + +export const ThemeNameSelector = () => { + const { selectedThemeName, setSelectedThemeName } = usePlayground(); + + return ( + + + + + + + + + + + {themes.map(({ name, value }) => ( + + + + + + {name} + + + ))} + + + + + ); +}; diff --git a/canon-docs/src/components/Toolbar/tabs.module.css b/canon-docs/src/components/Toolbar/theme.module.css similarity index 82% rename from canon-docs/src/components/Toolbar/tabs.module.css rename to canon-docs/src/components/Toolbar/theme.module.css index e74b47853a..d61b0e09f9 100644 --- a/canon-docs/src/components/Toolbar/tabs.module.css +++ b/canon-docs/src/components/Toolbar/theme.module.css @@ -6,7 +6,7 @@ } .tabsTheme { - width: 142px; + width: 120px; border-radius: 0.375rem; background-color: var(--canon-surface-2); transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; @@ -16,7 +16,7 @@ display: flex; position: relative; z-index: 0; - padding-inline: 0.25rem; + padding-inline: 0.375rem; gap: 0.25rem; } @@ -29,21 +29,17 @@ outline: 0; background: none; appearance: none; - color: var(--canon-text-secondary) !important; - font-family: inherit; - font-size: 0.75rem; - line-height: 1.25rem; - font-weight: 500; + color: var(--canon-text-secondary); user-select: none; - height: 2.25rem; + height: 40px; flex: 1; cursor: pointer; &[data-selected] { - color: var(--canon-text-primary) !important; + color: var(--canon-text-primary); & p { - color: var(--canon-text-primary) !important; + color: var(--canon-text-primary); } } diff --git a/canon-docs/src/components/Toolbar/theme.tsx b/canon-docs/src/components/Toolbar/theme.tsx new file mode 100644 index 0000000000..94224048ea --- /dev/null +++ b/canon-docs/src/components/Toolbar/theme.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { Tabs } from '@base-ui-components/react/tabs'; +import { Icon } from '@backstage/canon'; +import { usePlayground } from '@/utils/playground-context'; +import styles from './theme.module.css'; + +export const ThemeSelector = () => { + const { selectedTheme, setSelectedTheme } = usePlayground(); + + return ( + + + + + + + + + + + + ); +}; From a74c49beffee5cc3e144bbde91b2709524ab53b1 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sat, 11 Jan 2025 11:40:30 +0000 Subject: [PATCH 31/58] Cleanup some styles Signed-off-by: Charles de Dreuille --- canon-docs/src/app/globals.css | 6 ++ .../src/components/Sidebar/Sidebar.module.css | 20 ++++++ canon-docs/src/components/Sidebar/docs.tsx | 13 ++-- .../src/components/Toolbar/nav.module.css | 1 + canon-docs/src/mdx-components.modules.css | 3 + canon-docs/src/mdx-components.tsx | 62 ++++++++++++++++--- 6 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 canon-docs/src/mdx-components.modules.css diff --git a/canon-docs/src/app/globals.css b/canon-docs/src/app/globals.css index de791f589a..ece334696b 100644 --- a/canon-docs/src/app/globals.css +++ b/canon-docs/src/app/globals.css @@ -4,6 +4,12 @@ body { background-color: var(--canon-background); color: var(--canon-text-primary); transition: background-color 0.2s ease-in-out; + + --docs-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; + + font-family: var(--docs-font); } iframe { diff --git a/canon-docs/src/components/Sidebar/Sidebar.module.css b/canon-docs/src/components/Sidebar/Sidebar.module.css index 1b9aa02424..6a5b94bed8 100644 --- a/canon-docs/src/components/Sidebar/Sidebar.module.css +++ b/canon-docs/src/components/Sidebar/Sidebar.module.css @@ -39,6 +39,13 @@ width: 100%; } +.sectionTitle { + font-family: var(--docs-font); + font-size: var(--canon-font-size-body); + font-weight: var(--canon-font-weight-bold); + padding: 12px 0; +} + .line { width: 100%; display: flex; @@ -58,3 +65,16 @@ .line.active { background-color: var(--canon-surface-2); } + +.lineTitle { + font-family: var(--docs-font); + font-size: var(--canon-font-size-body); + font-weight: var(--canon-font-weight-regular); + color: var(--canon-text-primary); +} + +.lineStatus { + font-family: var(--docs-font); + font-size: var(--canon-font-size-body); + color: var(--canon-text-secondary); +} diff --git a/canon-docs/src/components/Sidebar/docs.tsx b/canon-docs/src/components/Sidebar/docs.tsx index 0d83b9bb0f..13c1675c20 100644 --- a/canon-docs/src/components/Sidebar/docs.tsx +++ b/canon-docs/src/components/Sidebar/docs.tsx @@ -55,9 +55,7 @@ export const Docs = () => { return ( - - {section.title} - +
{section.title}
{section.content.map(item => { const isActive = pathname === `${section.url}/${item.slug}`; @@ -68,17 +66,14 @@ export const Docs = () => { key={item.slug} className={`${styles.line} ${isActive ? styles.active : ''}`} > - {item.title} - +
{item.title}
+
{item.status === 'alpha' && 'Alpha'} {item.status === 'beta' && 'Beta'} {item.status === 'inProgress' && 'In Progress'} {item.status === 'stable' && 'Stable'} {item.status === 'deprecated' && 'Deprecated'} - +
); })} diff --git a/canon-docs/src/components/Toolbar/nav.module.css b/canon-docs/src/components/Toolbar/nav.module.css index 6c1b8e62d4..a7fe11e8ad 100644 --- a/canon-docs/src/components/Toolbar/nav.module.css +++ b/canon-docs/src/components/Toolbar/nav.module.css @@ -19,6 +19,7 @@ .tab { all: unset; height: 60px; + font-family: var(--docs-font); color: var(--canon-text-secondary); font-size: var(--canon-font-size-body); font-weight: var(--canon-font-weight-bold); diff --git a/canon-docs/src/mdx-components.modules.css b/canon-docs/src/mdx-components.modules.css new file mode 100644 index 0000000000..5550a859df --- /dev/null +++ b/canon-docs/src/mdx-components.modules.css @@ -0,0 +1,3 @@ +.paragraph { + font-family: var(--docs-font); +} diff --git a/canon-docs/src/mdx-components.tsx b/canon-docs/src/mdx-components.tsx index 84239d2995..308356bc67 100644 --- a/canon-docs/src/mdx-components.tsx +++ b/canon-docs/src/mdx-components.tsx @@ -1,33 +1,64 @@ +import React, { ReactNode } from 'react'; import type { MDXComponents } from 'mdx/types'; import Image, { ImageProps } from 'next/image'; -import { ReactNode } from 'react'; -import React from 'react'; import { CodeBlock } from '@/components/CodeBlock'; import { Heading } from '../../packages/canon/src/components/Heading'; -import { Text } from '../../packages/canon/src/components/Text'; import { Box } from '../../packages/canon/src/components/Box'; export function useMDXComponents(components: MDXComponents): MDXComponents { return { // Allows customizing built-in components, e.g. to add styling. h1: ({ children }) => ( - - {children as ReactNode} + +

+ {children as ReactNode} +

), h2: ({ children }) => ( - {children as ReactNode} +

+ {children as ReactNode} +

), h3: ({ children }) => ( - {children as ReactNode} +

+ {children as ReactNode} +

), p: ({ children }) => ( - {children as ReactNode} +

+ {children as ReactNode} +

), a: ({ children, href }) => ( @@ -42,6 +73,21 @@ export function useMDXComponents(components: MDXComponents): MDXComponents { return ; }, + code: ({ children }) => ( + + {children} + + ), img: props => ( Date: Sat, 11 Jan 2025 11:51:14 +0000 Subject: [PATCH 32/58] Cleanup styles Signed-off-by: Charles de Dreuille --- canon-docs/src/app/globals.css | 2 -- canon-docs/src/mdx-components.modules.css | 3 --- 2 files changed, 5 deletions(-) delete mode 100644 canon-docs/src/mdx-components.modules.css diff --git a/canon-docs/src/app/globals.css b/canon-docs/src/app/globals.css index ece334696b..4b39735a22 100644 --- a/canon-docs/src/app/globals.css +++ b/canon-docs/src/app/globals.css @@ -8,8 +8,6 @@ body { --docs-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - - font-family: var(--docs-font); } iframe { diff --git a/canon-docs/src/mdx-components.modules.css b/canon-docs/src/mdx-components.modules.css deleted file mode 100644 index 5550a859df..0000000000 --- a/canon-docs/src/mdx-components.modules.css +++ /dev/null @@ -1,3 +0,0 @@ -.paragraph { - font-family: var(--docs-font); -} From 38994c81639e121fa624d02e9755a4ff63a6a2d1 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sun, 12 Jan 2025 08:43:56 +0000 Subject: [PATCH 33/58] Small cleanups + open graph image Signed-off-by: Charles de Dreuille --- canon-docs/src/app/opengraph-image.jpg | Bin 0 -> 358365 bytes .../components/Toolbar/theme-name.module.css | 30 +++++++++++------- .../src/components/Toolbar/theme.module.css | 8 ++--- 3 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 canon-docs/src/app/opengraph-image.jpg diff --git a/canon-docs/src/app/opengraph-image.jpg b/canon-docs/src/app/opengraph-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4dc9025ec503b3c1149a52b07fa3ce93bc8e293a GIT binary patch literal 358365 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 z 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 G|J0ogO0B{hKj}GbUjWw&Tc1!SC>t#~imdhTX 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®qkK`YH$ZN?F{_4H6v8fi^bvZC((q zJ=YZob}IamIOUahCU#TmXS`|a0OriHt)U(xckpBd@wCgM<~wjW9p~x1@AC8?AY4c5 z5Q$pCL(>8gLBmEBGT&bni7J6}j$05cKYqp%6*0B%e910K)fUn|OEIlKB4Fk}@1P-r zTI?p2EsZ(+{{K&fh6c&XW7p zkaJ1jmH*wD^IQTTKFs)KtnH~_-07qVV!k*s3B2fS9FEvCbEjOy7Fn40v(=9NVxMT8 z**4zqnUXJvdYurxa=Mijv~iEHNT;4wQ$n`p#K}nkzG0UibKXS0N;+rTm;!UK&VNvg z|0k`jv&6mcHZT}9+0Q#&NJw?fcB1Xs?SM;_0bLDGo_;bao)06exW)|I2BCS2`t9(< zX621H2wqEPeBR5hJ*U5N)&@PXWeFB&`dARPW>`d;f5A;klk)~li|_%cg_th722HbY zV^ICm7{Mf#ng0g6MJOGi9-;20&RvG*0qom@?QhQf?5(Z+)MogT?csE@=C(LKPo;WG zFsQ@9p`ifE26xTdcNl=M#TGXzT8GiFS+o644kdyCj z`98NgzoHnO(k-X49L!!72e3oZ)Veu1`>rnTj%u6F>Lgr{z*7txl6A3XT?=EBP#lA4 z$iw*y^@(CMndt@4p+C8H2`c(8h;z+zq*SuO=O?4yqu%iio1|A@E8uubJ$ZZrsK+zq zk6-j};Y6O!oGalHr$mBTe^wGJ3V7J2yhUSJwXjuqQUJ-&`M5I+J=O|*Pu&QAnpEQmx~FA6}O-A+PQIV?*wxIDV0~@#*kbr1|~BLxE>P89M)YSkNeiFJPK@+v- z{hhIUU3^?b5BKC2NZ{UHX?Jq1x4@lH&wti!TU;V_Lkw|2-Ii0<(ApYOe`i&M5 znhb3yOJ9-beZ_!OR0tUM!Yu*BII_cTkMgkt-FfP4nnXf_dVpBx-E{QeAFke z#>Y6OgL&<@-9s#0O$Xha{?hDrrI&&O4boe%ZRlR}l54M9Z+JP|3BLZOExhn!AWUxvhrHJ{d-eQf#V`81ns8Qb1s&reviq8S7~Y^9zY;b2Z4?S z8=bCRB#DRh5Zh&Bb%E}q!E-dEzYco~5Ar*9tx$tWu;uwxQ#3+T3vX>*({e_{2mqKC z!iFmap2~GEYqe1^?$ynRj;F0UiMXSGe=x$LK~rzv!k#Oc!!_?b39z)y?xa#Yh*0S^pVpea=%BfQHaO~37E zd{_OO(Im|4&QI6aNEa!*hTZ;s`nwTFzU?$EY9qSIG$xui;QW22^^V}L?af!GC zM;xV?(i6O{1VL_ErzI+E>s#2!zO=UHuRGTRS#GAinb6Isr0vt7WGn3Esv6(`E0DEN zI8vWTBskEcoOezQpg7*i@%?0Dxdk|9Aq?P9?hk09d>JC03Vep@O*&GX?e$&PwJ9&a z4C`Oucc?SURV}SX&#paY$jQdzIZyDfXC`D!h|%NBd=6=y1hK6)ur?jmm3yM#;`xW0 zc~>rhW7pD-cP%?@uATFtzrT~@--_4PpFP;ST%2AiT7>!sq#6gmb@PIE1HaU~P*8d@ z#1m2qKOu2~+0-eT5=QR6c8D!TWv8w*J8841i!z)pjm_x+@3PSL59^gb<=23X_|-(k zu~To16k&!?Nz)itcZDN$PUMcws7>F-(bqSV;H{7kA^qH4s)cQ16>rSlU*H z9wD6mI@3lK#=GUThfQdd7XqPPOogWf+{3wi${loM41Ak25kR*;JV67t3{dZQSgMCT z+t`RdzsSv#DL>P`K5W*Lu!5IDs5Rd$8vRO1(BTNr6g1xHQu#*MH4c}A|3^~_vizgs z!&aTD&5LaxdL^R%zqit0Py7ld)s2RgN;@B8bKbX9hx3b#2JmOU^{LuschwsoepF!r z87_(B>DiVYzeoI0sVdPKQ?~JB|XM)9BKh0g?_b1%+qeKRIiz%?wy4ljK6Zca)hUmsB7}b{#pM+POIoWOH zW9PpPXNy(2R@kp+hkgM6u(l^1yyf9G+LJ9fn0h(VTlsiEnM8( zdv1H|s{<2zsbh%K>1(XR>tok&m$$+mQX0@?ZISPnKuDte^!Ej}n;e)0VMW9=aD|7N3N-bz<+A38^Mhr5 zz^+4ki}UywqRXyrGAtqTn)zwo+~J<@=Kt74#3(p`fh{!au0Eds3c%8TCbjX!VGr@w z3mmXRVXN6($2I#J#)ha<7X)@dlFRNMcH>2FFiv^9G|C-)Sx4*j>TU~mzdxGpIv|I` z@}|+bLtp8Pd%IX)2BJw`l$9HJzg2soFE=4?|5sYog zvKs`72W-^w`3OC}&sKE$yeDor$sAmkLu*dlIo;g&K7oZ^=JeNT>JmWLgjU!J(KI&e z!qOi~PHv%kZu&Xz9%7me^g^`J9WD=fVWO%Y0V!{A<80%}KNO_0%WIPP)eBfG=)jt- zNMRTvN@XA5&;_4%fDc}8Y|Sq(9k-ggRDO#;v!H8_^DYITtfzF`t<8Y)!VBuIrA&Vu z&a?r+8DIvDLG~sw=r$q6X`Pjwh1bt9tb9*H29fsoUa`7AR^VOwq0%4uUhYV<@Cwu` zQX5uh^i-lgY?UksBmz{Ib$0x2XUwSuMhSu7uC2`&DRHmb5<)aZ&*4*U?_OwA1L$m3 zS%{^4!rF(L6<>kv!!y@b0hDwN4`URO>8Ty-tL9)|T{IMZ5!$<%T}-^v=nB}aaPyfNzG^k%rkz!By?_k;)d z;}u_&nb}Jcc}pyA)JToXR#wWWg4s&yOq)Im5ODLDu&|LXEB_lEjWYdMXM&3(_mZJT z_LED%_%(R?uJaR#JV_Ar_PTL_dnGji?-a->9k}{UKsfzosS*o$>$n({vDIbY8UL>g zc{Npc63Bb%o*Fdueb538^4DBd^$kkv9;%f1BSNfmtUj%TFwKe*tW>W+sa|aXf?1?~ z8LR`r&s^&wvy$I9B%#K|^beFsFYrx=e`&1oZeNpnP35nwP)tzcxWu3A10rEfa4}(>K1B>V536?#)^B`F2naJ8@Ub#bk zJyI!0g5~>a3zPbVv#9nF0r>YSW_oq(VM_iOfDU(4@ zQCt(%-P}9~Hgi|Me8u=fuI`BoTWQ!SqMc$9u6z_kkfMc%ksT$IGH|S;-7{2h$3(S~ z)50}Cb$8`i{Iv=q_SKtdZ)!L%zPDHV0}BOhuZKr`o--UXH*CC!l(=-(TREIuw~@Ou zqr4aO-|_e9p-nM?%NF2ym+Ak&Pl3v^dUa62ru@d#D8YS0{pNH*@*L!f4BQbXaHivC zOlisUwm#Lw(>%*%nzj3T$dw zX)mgUw>>sf6t)Uuk4Ly``m`hz1m|z1lYNCj6^owe70a+P)1&UnM%|$B^TXKO-M3u3 z?Y-aw`Q2va0x^C17n7n0VF((k3Q9HQ3tD~z`hvQdUIX4RQ-U6=O`DmbQilk+4c@V> zQUa!#75C(#$KiJSa`_s9;!gN3KXcI=7dh2?+CfeX*YU(ftojZM`}j}gl7!WG)Y9I} z_CLaDb0>h?SdiGF^{0!K7J7!*vws*Qh0{-7Sw_~DOGDypz9YjO^6rRuK(K9n(4f6RbQp4u}FKBVeYmEI8S>~w^9+v zf7q|C%6DAs0FRj>gCJ&~nsvJteI(0Hp&kr?nO{DmWR;$?s63r;VETsj(BVwy)Xeda ziaW%}6D_UjpW$hY*Whjf^zMA(6iiE52KY8p+L#-+978PWi6z(R#=_GEz}0MN{sgHiG;+UR+7CFk<_ZpfP+YX2Y$sDXIo# zuK@Jx=`c!uXLb4#x%1i|wtA|HlTpS4Z)?E{3UEvBSSSq1q+cU^lVXa3SZH11B-W?z z1}7bR5Ms+^L?68QiL@~*Fy_!sI}cU*p$9UXFTl-cD01_;QCt1`X|8A@VZQ&?5oh2o zbX+}lWQ+%zK8;QOM8gPM<1KcYvs5!oh&sNbwWr&O0BBH0`V%KZYXfQ@TX2AARwg~W zzXX^|gu9RCfv1%)7uSsY!|a!e-Bg!77W#57jA!nCtgMiPyZ+%zz576R40XOQrAEX;6v+!j9W|OFoCapD^eiH=CaM3j9q>RG^1F zL_I-GrM;T{1NI-9=09a^=(RdQZL>k;E_`!a>7vv8(7q|x*j=AWH^aUUX6xFFh|&Ar zjILB6^tdibmh%K5>V2r>|Ci;3=9d8o)4=BFP8-(4X&N1$y>FjE^>OAc*s!~g+`8jng$o&;u&*%j_SokcHHoYEuS6_n|kD@&~B$0uc>tl#>!uFpp_ku5SBzEe(Q+oQrL|eAW zQ(N2obV$4deH?q@UK;T3xb6bIzXfYZ-^b?N^NIVL-KsF&c=WeF?-j7!>qD4cb7)YW zA@p%xBC-M!?43)j8w5`>qF*oss1ZVa##aAG(YE^|RPjY2=1fE<8JeH}%0{BEG97S> z3-)?%3BCVJkR8Go7Z(-1Urs@K(20#b;~=;)xnnU29ZO# zCmwEYu-o0to_W!y}<#0{hDxPXF~C3RbABuFv!;Al@~Gb*O71#ST!{_PPinz z@;i;s*?b{(ZBExQ0QrB@Z1oQU0{+tnq+=$>q=s?za#tF@nNevgSIil|DB5=r{4k0< zD=g3|jHivMVmW$Z|NB0?{>+|e`7jT>i=hFFIc03wg~VZE1CJd25uQ7;KI4g`>95cv zR-&*hqr$%zb8t{isiHe^p(aqhT(cx6fqz?==8PZ6eMC*)_H;aHPio)jmY_Gv=T)44 z$Rs+so~G7nvBD-kP(zRG%2)}LxAKW-z_f1>LfiXPslAybp+m)O%h+m7_Z*I=a)s{l#l|7>8F%q;Vr(a1wB-m@gL=mjaI~1- zoF*<_&chl<=f5t23U+Hw8m}p9^pZ5&9)0Wa@?@WUXHrX_TmAL|wm-+K@UYHz(;XA*G!YkG~Ws@4R4kY)v_b56qG?3kIl}7FM8GDU`}j zv<|kvGlUuhk_x&CaNf4f-wE`eQ%`{CsAOhZo3ZJh;0Q}fbmuUkY;)^%Nm{{9vnzxt zuKL8@*-njq)zGT_3jPFvg#vSS`_nsleQ?&c>?UznO0cd6z&jCA!{2(ak% z*q}fVgc}@@7)gQ^Pjo}xcIjR`>y{URC&`O7h3p>aGY>M0+Q0R?D^(C{IUHRQNhB%G zP>qBs(82SGCls=0tF2HaE9(NHq1&&oTGKK-7Zk8~yXp!FF!vb!ODD$k zPUwJnot=Lt*+Xb%_A_^_P-TVuLsa=QWmCeZ#t}FrQ|&dJE{9FL?5ZMO9pJ__b$Bjr z!o?tQffeoSiW53bc>wz)^7RM4Q5E#J4JCVM%25r$$8IJMB>lW!2bv`zC#6K!B< zbHBg#%CJVZGhA;c0#nd7<5l|kPVgFi;eps7KlxL&#K( z-fGm7NRU-CP>q04!F^}@%W=0UkSFj03arN*6O{QspzF?5f6YPtREXeNv2}(<0crN4 z6I&*CPV!pV249GohC>uelV?fv${VOOr>Shhy=s}*1 zB(Yk+wC+i;#~Nz#=6jb@*-{Cz#Cn1%HFpdn-A6I z+FTceRQhNf%29cG%HXN$@E4@=f&;|(VyE&)AsCUsjL|UFhn%+Dr)93wFGWFwEXC>%PWU}|d$DfricJZLKS92d4<}W$ z@hjVC3=BWN|FrSbfvlR=8f&T%h@odgh58fFu5{a1zO%j@D;VM@=**}s5d$#wqQ7JR z2Yx`9^4`Do4GOOq=u%~DH7)c!RzU^k@IIDO)wT<- zZwiU#_dai>p#x@quomo79JzciA$@yJaQx;dx4f%kbnnf}wlw>c*S#I)7JM}fD%1C;u3&pVq}HB#6Q7$ncdbZ(;Vr2* zX`wxtF1I)0hMaZ$=DLH4KgpapvE!5HK?Xwn!Z3u1PP2zBjY{P2W2OE(Ua)hTAONG> zXgF4OJKX_hGtk`tcN=4y_o?~qIYX|Szdy;%4*Vy8-jBx^~LKYW%5r zPjHEoYTE9EqeTirnh|y`3m)j2f4&|0uTL?5vrCo0TJR4D0^=$B>s^ysPRH)UP3qH0 zHe`&RDl-(_DuvpWk#0Mc)Bj~%%4|j^!Fi+Uzrev0gDsgV+HJi+y(w@pL83jcK#a-9q>_J|Ui>xoalSdnVu`)xqkhskAXF(_EhJLPH6Da|~4) z9#940hSOwH>+gLNl|?8OYT^kBghYH}RqlDf>x}10jh-MTDuW%Yho22v5kg4ji@j?T zc;94xIFc&MyH|+|+58o`RHd`LA;q(>+|C4oi&TflO~qmeO;9S2h!2{wOP_;~lw;M2 zr<}dR?`igW*wIUyPUHQe&@_h9gLs@TKuKyc=b>q5odjNynUs}033o^O6kEnNfUyN; zc@psCX+-}kjC=9cAJ~~icSvuIk8aC?3f9tWicv5Nbhml*1k+Bqbdm@+ZxM{!i2Ga~ zm;l(uN;--4cxyARIrqU0l+J#tSrL30T=8GlNk}9Qn;wW# zl}4eTP(T*Oql+P_~0mSS6X_MeK!Y))y zyIhd!t!v2>&+fMgnFuXD2Ww~_!^3v<$YeQn2{pXnIawXUz$&M5=dFu*h=S!`7(I;D zTT@PwD2=nOSkwApP`-?oMLpF&NscOXKyY zQ!d-+z7h*MYm*qEknW2W(5gNG{E`md)F9lHjT41hZqcwSPwutRx31;kuDpkIkjpye z$Vcl9See8BWE5B<)i3S3;sX+Is^*%aA;0?9OkxT5Hh-&5N{aDKTuewk9krT7K-=^K zv+Q#dzl1$xgEXR`nbc%ziVEy7ALXkHBWXHvE|{~AqGg7VCYmr8w~(lZX{Q3n@N#qWUJq#LhS&D*8EE2aN;k5F;gj|~WM9%2I*SXmy z{X=E&MBT4rW}8|V(+9a`Mh2~;p^rT88+QIN@t;0-&cMkPj)KRk4jwIJB7A8E@QN5w zUfpk%${>B1uRNFEm&CHZv0UZ!p@<3K@v{}j&lg50QG-Rc-!xbt0V*IXJ# z@9C81&B}GN>Is;6(4?U-3KAua*lW_WsCz1&pd%dFJN8b2KKeMJsmeG0Q84NQdnu9UyQMYkdU&FaQ-%w5K(55Z$ckl8JIV5APK= zNU@xVGEwm0TfGwl&F`scT55-pp!wTwG}=Szt;VnJFOnG8T#J8L*3~VLd*LAem-iAH z%u*LV?9`{tr2zHjbc>yo1lyAZSXWMYa7rSYQgtzD(@Lr!5|LcPleYOo@~l2U$0oiE zO}+sm9d+g(SOsnNJmB!Gc8|>nr7)5wvq&vH$(odNkGK<9JlZhE+?(I zWsZJR*F3fB)A6r54sCK!HyT-?pbh-~<{6G;#@|;HbYsdp1~RcU;J~jQb+PG7S=Qk- zznW+(=J=C)c%YnT?-U1-%b^8WhB0)pr$X*pkQe6% z!*@utCbEoPmg^esx>t(#h%~Gp+Qd+XPBgED1N09#NW~^ioA*vYFuOa>i;i z`?WB8-3@eD- zKX7FXro2#X8kBrll}5Z_Hf4ECj=KI}`rQg!pm*EtHAPntrf$8sknj-4X=|OLN3Ei0 zli^na;ehq_^AlHk&>Vjwk;}P=)zRXqFURfeNsz-q>tMZ;m!;%oJEx0k?saVBF#b6+F_Ig+JBVOfhOH&_y%AlDwT?yWAt3#mi+i9OS{_d=v za9GiW!G^Ab=Kw>!Fe8<<_SavmG=|?4YA?g_+l&c^D$RhgZGR_pS>X3%b?GBe)^=f zmw$A3veQ`J$@Rt-F^O&jXt$ga^{=p4H@rv|^}C34n9TL72RW-Q@~N7bJpy8dz2)h@1IE`KWz-rr+3UE4IiB3)B6GIHnssW%(T}Zb-W!UcCaf95u=@BSJ=}`PuG)+ zW;#ztpmp9qO0B+`a)kLTiT>7(SRHMAT9Edq{faJ|56g>T%{jU3MpPP%^Ura=Ipm**v3W?95mXZF%@XfxGt%(HY{{-lju9p7qBuKOL`f$&{xEb{PFLlop*L#HX0?TaTg#|f8 z{Jp2hTgs)anXG^xD@t^hc3mFMS?+l-C(5KG{S3Abn_~)(^dcqg4*og zt~Td<=43}Jp17BpRwa&Tni<+BPa8gRL3O%$h)wRPe#?zt|1;o|mp8a;L?$bj-4Qob zb_x(@IlT*&on8*ljQUPI(1&B*)*$kVwFz%K@@Ym+p22^2Qr)@sWm0;iC?*D#r)#nu z&FK$^H3Ngk36H6<0e0@fLjOvu)s@DzlyFIT^ZmrnEg-UX^$nNNYHE&M82&sgH;0>; zAHs|j9_Y9JFom%IJ5By;@z!1L^94uo7nW7!p+25&{0rL#E}a=Playb0k$~*ts5ULw z*or-1IC3AWKGZp*t9*mkc(ETNQ*Kh1z@N6tVdqGnb_9V;B?Ed|2rIl=^%VcG77`^n zp1iMVUqYT>*(VzL4bbh(mbM3jT6ozgsh-%Lm~nqW)cD?)gRTz;uw0&U-o}q*Y~B8P zvf9kn+x6&>N~wuPX7rQw;ltE)rhNuClYEU8+hOv2Wi4;i-X7%}4&ZEUfYfZV;hjTu zjT@`ZJDD@~(|sdb`TLAde+YswrNXd_J$h%DW}P?BH}(-Q(Zi6_kP=SRDv&ii9toQW zxjTE!Y%m?V86KG|%uYR>dh5}ada_4E+a=Td-y(OzKyyul{(lvnjX%@t|HnVOV`gr1 zvl%g4#jv)ix$D$W%uQOD=Ag!qIwm(Ka*{JQ6E&J)C>5a?r`(2gYUE~SIXb7lu~Ec0 zr-O=bb^KK4x9{I@U61#5JznqE>-jo|*U}Hw;uZ|L`KGM?P*(Y?$(P&1MA~Rr^4!Z&*OLB&QvXBBGlWQ1q@NxisDOYpE*giNV#UsoP- z>a8QFD#qeL-uX1>f#L2O_BuA1r(Jp&G+)O6V4u`WK&mKY3hRI>y_qCs5J_QM>Zz@# z=5r_fqD2b{42=U64lykoR}tTEqOPFzNQ8d@0@wr`krcE)4DqxVNB|xEDJz#W5RiE& z5~P;!o_u8`(O>mf6Jc8322TPU zx?Wn%JXiDt7D%8@M(Qcjmwy1`Q?tV`lf*#~Dmhf^_4b$PEM@A610;ZZ)A6PQr9N36 zc;18{0ukCZfxlZu>ijUG;Et6E<^8#@O4w%A{wRM503*yZFJ-CZ#J?i`ksFj&gqN(C z#W2(Pj&y&`^Whf%s#j+NY#Pq1Xkg1cqZ$h@j3#O8KA(hMUW&yLjW|lRzhDhoBaTl_ zD^}6mzN3#Z5bIeBOSH=tMc?m=n|O};`gZuy9+>%$2Su#nUvl^Wq7iXsdpNWp=o-f= z{M&!e_h7>zqKE9CGm;^SQ~8eI>&-jOF{oOOrpmqz+PCYcMNz)1pCMq`9Q9D--h-%( z_3Z<87`5H@zPMR{F7l!o!j28LwrpfcZJs1DKyDsakXh};DsOU>iUr{2-n|yFYzvZ4 z>^Ry8C3%|7)s{$H;c%=u&~IOVTEbp~Q~qA43BY0|hge(&n%}F|H;tq~w@Rv)zxEeD&HKNCd-4 z=zMnCB=~2ZtuIjvnF`KW8<&Aa3#V`BzTsJFi%|U6Ht?K^Q0H$SI!0}rO$Rvr1bARh>r)GY{t{ zJz+o-f_$y}He8C#AC&f8-Fr|PFEmT?OzEq@TmsU--tZZ6j0ECT&L z>qVkfKMl;KQG1JTg&()Abs1YX2~+$a=tcU!htPeUE&;)j=lDhBs7`MgKT!yY4kDphNlQGemuZPu9pefhMV(za*YJyw1VGVIRfRgz3e_ z2OYfzZTBjdvfm51#RapiUkt%qjcXKkb@r|q2X!(oz&_iG)D>p< zg2%CU{|BOJ%}K_I>(A^jJd|0HXN@wnlsch6>a+&d4xFxKP;b>9uqPWz6ZhGBR&9vJ z`tbtCbB=>N}S174R^{jiQ}ssA(uuaLWLD8^I6A zOyy3Ui`3#QSvCU(y~5SAh1uUir&`7<1BKyrG44K?&-q`~>l5dopl1bOXF@Z!VWu#j zn@Vc!`(ILBJB@oZe^9RvxTuI~JfSEGi?lgasI9Z}nPCb0U=~h-BqBiTu|6O>$Bx_x z!+h=7oR=KouOLkJ@nq5~PTM$f5)VXDe-HN;4j;Yh3-Y!vq_n{XVwp&PYsbnY%mu(D zn&_RGb7>@iNLtUe`m}1(VzV|hlCgM_qfxa^kejp_Ea z6jhmyb7%*jdD6Q>Y|BeB5`(EBOZbw(!+*;qiwyA4(MeaMilOuFT;DKsS|0jBQ~fCd z9~ups38GoG`}+!8el@K;{l>X%vuS_im8!UF)wY{H8G=dh!bMm%V}K5$Gprubd=LD1 zhPzBYqn$aD0D{9863(W|e(BQE>k^Ho3H|5XbDt$q41U7Gbx^}jdAnM( zc^=B++@%vJA<27yq@ODW1A3Dj^Xu7Kg=_KS1#%mQjv$Jmp?nAkG(Y9okDjH}LNU3f zNao{0qR*@3dNew*4dQ1g3;J_{W&9|bLRWZc4eaaazwn$1*9YcJcy16^=&g|mp>wa@ zN#(KR;MVl^73X-U zwv4+q)q>+_xy-0GvmVV39q`4Ap`d{<%XXSVH_?@meTwoE@Ab|vY;kZ4dPZjs{M|&X z$LF!U5pXloy;k|p2BO6w&WjY?CeSRUn0TSY1tL;sSiK(XuTPOfL(?`O{ld_z0N*)B zeQyo<%r(o9x{$WYxTw!3?_A9n-1ZxxZTB4C3_|r`^4y}wHUo&>pxh3-85iQ*&pd|K z$5HtoNmCyh<{ofkLfaKdufG2}zkdH!DxiH`0653(N`paf)52^(Hm(;gi~995U{Uw_ zmmSRsq2PyEO>x01teW1$%8&S59}0~?S5~bhfT6f-|9%InR}GzZn5@S)Qq#oTR)7BZ zm&fNoAL@lG!;fM-L*wll{g9?XUY&Nj8(dhy8)#z(2)%iHN3iFP`b|@aa0rRBl-y?4 z6nNCw=u{%%kSW=Y z`IQ#60sw@*%^s02ys^{l6~~wXy(|}Wibq`h)TG&BRki1_jpW`b@ZGQDZ)srr&>2x@ zJT=n<+4iG$i%-28Ick?@?HZiF3gy`niW_mEC{R|rOtVA2;mH2+=*1nAvOhfu89aR7 z`ov3{*7jQ+lBGjV-3(DB|(Q7;HW^^8iL02V{|wV z9d;{@h%<=K4-ZJ8aiw{;x8sSuS_?_V-wqy`cAr?=hZ@$n*; zkv@FZKWwIV(vF*-TUjF{lg>7XD*I*XXw@S3a$F;&@^5G&qzQO6`rxWyFW7$`LL)5%w$Kw0a7aU{W-{@2Xn$N5*V&YD(z{p0d>r2 z0U(luHq?TZ%Jmkk&o5G_?;I(ml>?L%vEU8Q=)I-+j3>jS&1tB^k!{s(*sxzmmfF%? z6zmGrDj!muZxfBmTZ$jC&}R|*6W1);cR_55Ro6U1K|go1jjf$dGL7pl$VF!`ZZu^5 z8Ly1Rb`MYadtlp^*EBu2^ZK-~nN{s4sAcG|jk4oVp<9wPF>yFKPW5E7uLRaV_`5+DMSOdh9nq zV`x1UL4mTCH_MX@+8>=fH?cZA9+%NH(~llm!n=k6+s2xeqg#JiPJ{Qdo6XQS$;O`9 zt2>vz3mTRs@j!W@#ntKfqWjoxAE`vj!w5v6!~I9JNR&();NaD+h=rp6_$G`KN-ZQ} z){FX+U$@MnZ?Kl3_f6FPJo?#yqdnw69rCtr+wUSJhOrr2{oZ_l8;6N-T%ql>;CG0f zELAmJz3XaEr+!!?vTvqAs5p_JeG1eB)_RV0_#ChQEiz6Tlr9sQ58%&i&AVvp-0&`l zroolh+sG>=2MvsGxl|a%4P><`@>{rB#F0pHyqgRFJ$u_0XCU$#vjCu{${o63Ctkrq zL6u1_pd6u814+EvfEb`v_vo0B{=yLd3#zE;Dt^wNFvp3*koxbThl6A*I>`3_df!K- zt@lA=={iwwO+yo5`%li${DG>s)VDaMU%_D2JROl?dw1NA1|VA*x|O|s#8@ZFesn$tso2jaZ2VImK%_6kk#372Z?tZn@t*8K^By@!yN zcm}KI!fW{Da1GBXn9f*SRSZ8$-5+xzLw+X(t;wRiO*Uuzg=H+-g+_L$)4?MQMqQ%F z#SDkvpdt3MSRzgtz&~!Djrt-F`f#(xekL=zhNn@~e48WeeMD}Z@;p?e-fBBgyci4B z-Z4wHeBaVlQLC-F8$%-pqe))(wljbXZWtwzvamD;3#j30r#LS|_XcOV=*7ThELLXer5N*(wpHeh4s2rNiO!h`UtHvU&77(E?CH(uq=7*Aoc ze>f15QOKVrwYI`p-}@C`8bwTP_{sr-+XdX8@4>^VRA|dZ#Engivaa zo-!>j0-<+hqCHT;MxLf;_{A?s0Wzcpx{vSbC(IQ{Mmbq&T&fZ%uX!i$`JrA@#xicjW-~g^m8;-s_mp=cg<1GHjlWo}CPQy5J(sq*v#D{40`vaz>I&3F!IbH_9_-ir+RGwkAaJLcjir zhU>TmnydPMT7!aGB+3FkwOsc~)rt?E#PHc351bM9XbYhy?I%Iz-}99Txq$_a_n9F} zy0|zx@qeg2YzD_cMexpFXmyOn-i5d79U^GjKVk-08X2K1-tJ zWLvhOcqNCX?(wJw*TZoWn)x%tBVo>KSraS({@&QvmXvxogMKwFr>#FHZP|E8bl_sb z6zR?ZJLpr13bv!Z+?bM%XZ_U!(AWBXe8+pVmpJ2w|C>U!rL*JvSW; zQHz#wg`;6MrW17rx{Ew11KUS2W%3qEz3(gq)T0? zBYI|S%O$ssxWrx2K<1pnOvu(wm&y;i6}f;>Kxk1YAYI!BzE`%fI0<Ow&)ikaQi` zltB%sS>k28d)JLkkKFvCV_K%^VWFj3x))QACA~>bb_EQ+{fFNW$E<>5occ^Vg;CWR zflq&}_+%W(!QUm>fks2}zx;w(krRNX;c{Nq{n?$&a|8u?x+6jj9i{2Jx9+&qmAc{s zzk`T3R&}81k-E}2Tf7@@WG-E_qz%W8Vc=OUT@TECB+8oze0cJ?R(1* zCwzL^o_8<;p|g9Nv3lRr)+wn+)!MsB2C(-$`^Z?bF0csjBMS7c|1N5jqT?*LdzD?6 z!uNWl?|A&X3H{6N%57>m&FJ!&lrZeyggZcXq}4(#uHU?-uCh!zSz5uNwQg0d&2%(l z?q6Ss*4KYI;|{oeq~}Z-2eP@Fp-HoZmI7VdRcn{=+^<@5J|Bgkmgb1f^E0!4zu5(w z3L1DjrI&4(kuaRvvDe0#Or%-}LhFG6P)jMI=?v zm%0Sa6XB$e#^DEqS01!4cmyAoIt%X*wY{ELJ2VkdU{6VeaYn-`KQOCwz2WhJzbU92 z5`Eyf!NeTTYj4D%3%^*6a~YXWj42D^Q_3t{HFYjR67WYWZK_y2pJvhP zpl;uPJSf0pZ6>`5FOJuK2Y&1drZyvLcHQWJznR6sgt0EJA%wM8LAu5W!3t0&)ZSm8 z=!cI4kqJIi)9LezN|RouOnYhbT3RX{0YH52n4H0a8F%@=lZv`Ypu`v^ASQZF1qH3- ztn;+)HviD;RuVOz(U};wZ0*X}FoeM60#1UI0U_1GqT(0B;Cn_i$`6Tq0Cgm_H-LJaq%2TT$L@_bKYa=j~zWyH6M4hL`+jW-TFmvuOh(pk~!8L&F&J(GT6CVKiZ zQGJ{aU2Rg`GHkYUI~m!egvY1SH#)qNJj$>U_~c#yy!ZL)XF4LFFKeSuT-|bSOUEsNoQ}}ceQpKH-{uUdhy@ztiImU9cvF`g!~YD zYvD8B&t}i>Rs%tkE&zlSTm|L1b<+?pIe6sPKXPQX@W)-NFD^e!t?)ySD8Q1(Wci-kZk7*9{BN5tP5cX7 zN>C3G9a$}y*_>X9RpVjb-!LM9AT#{Yw#H{ zhc*yPBn>Q?Sr|wK;mPBs7&_!N^I}D4IW|mVAYW(2kwnDj$^nR0Ol^{qz6d(dRSR@> z|1noHsvc}7?~hGH6p_12Ru-MpdPQ6QfWzswZ|`E{xZtO`g&2^({bn4f5Di#z5L*+} zNr*M8r!b!!s8}~iw{^~a=A3(zq}OR8`IOA_j=WL&F@@Nfzy=WutLzUI6#V7`l)n|~BLeO- z7{yI~GMFC+D`g_9fKM?2#x&rpW-JvphS?1n@l0|`ue`E;FdVdSeMW<|VnDr*@x^%C z`HX{zUib?A@Y>TQk2E>QY3E!dm81)3GkM%8BJ{T7J8lQeqpW7n&HbxS($jN#2z{DZ z-KVXX)WM%$eOvj`UQY1b(5_s9VV(iAVs=U{faO^{sPW$fpLpftk3BerxD|ITv8CXo zCQ_G=w+}W4;8%ZXiWQEMlaDP=<$n-mDk;_^9HPeB{x2ku<+ViR!t{~jJHB~!i0YTRJW!TphRR~?+egIZB4`8l}kZP+7D zQ$X?XRQvu2`{2uc+3DGs@m+W11FYom1W?$w=c8z{hCaK34yJfnb~HQfdfI+7*%I(^ zH=6;WUd)x^RLG)g7aR7rt0u6^i&DQ!v=w~HXNH#YY4P1RagMb_ z1&rZs_8qkimM4kO8@^Tg)0J6CvLpb8smYO!TRnE>PJlInW|Y_SuGFd}ER%Zj6k_Uc zbrBe{0Z_RJ6T>@v2K-;3t2Rmz9A>YHoaYG3sLUhpDCz7Z%%jBlaLv8JZC!ZCxRqaV z$)P#E#5k?MYGMRvvHo~^h#Q=&PcuB-PJB6~FuiT?2sN>)sTO<>m1^O+arm{!tZ60y zKGp4UHV%7ox=$l#xa}q+gRUhUXHmW5l6%n{nvtIWkn#7kRB0uZDJALhi}szz#B`oKXn-!8RI4X zzAko+``O^!dwcRX<0zL9_kiuXvEUHN@NeUkk*yM8kSi|jOi_U}h%x~Zt$;=5*)BjQj8 z%ARX!C2-VcGKC&o3*XB^Raz$qfE;i`lF#I(^}bsDW7q=pMQubnPwP=*JbsFu92*yA zYq$QV1nK&lQqK-u6CLvF1zl}^d>+5s&;kX?Q|6Ssu7lKa}| kxerSy&6m Date: Sun, 12 Jan 2025 08:52:56 +0000 Subject: [PATCH 34/58] Small responsive fixes Signed-off-by: Charles de Dreuille --- canon-docs/src/app/page.module.css | 7 ++++- .../src/components/Sidebar/Sidebar.module.css | 30 +++++++++++-------- .../src/components/Toolbar/nav.module.css | 9 +++++- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/canon-docs/src/app/page.module.css b/canon-docs/src/app/page.module.css index 9119d2e9c5..b0fbed71c1 100644 --- a/canon-docs/src/app/page.module.css +++ b/canon-docs/src/app/page.module.css @@ -3,10 +3,15 @@ } .container { - padding-left: 300px; width: 100%; } +@media (min-width: 768px) { + .container { + padding-left: 300px; + } +} + .page { flex: 1; } diff --git a/canon-docs/src/components/Sidebar/Sidebar.module.css b/canon-docs/src/components/Sidebar/Sidebar.module.css index 6a5b94bed8..1733dd4f3a 100644 --- a/canon-docs/src/components/Sidebar/Sidebar.module.css +++ b/canon-docs/src/components/Sidebar/Sidebar.module.css @@ -1,16 +1,22 @@ .sidebar { - position: fixed; - top: 0; - left: 0; - width: 300px; - height: 100vh; - color: var(--canon-text-primary); - background-color: var(--canon-surface-1); - border-right: 1px solid var(--canon-border-base); - padding-left: 20px; - padding-right: 20px; - transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; - overflow: hidden; + display: none; +} + +@media (min-width: 768px) { + .sidebar { + display: fixed; + top: 0; + left: 0; + width: 300px; + height: 100vh; + color: var(--canon-text-primary); + background-color: var(--canon-surface-1); + border-right: 1px solid var(--canon-border-base); + padding-left: 20px; + padding-right: 20px; + transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; + overflow: hidden; + } } .logoContainer { diff --git a/canon-docs/src/components/Toolbar/nav.module.css b/canon-docs/src/components/Toolbar/nav.module.css index a7fe11e8ad..9b90f047d3 100644 --- a/canon-docs/src/components/Toolbar/nav.module.css +++ b/canon-docs/src/components/Toolbar/nav.module.css @@ -1,5 +1,12 @@ .tabs { - height: 60px; + display: none; +} + +@media (min-width: 768px) { + .tabs { + display: block; + height: 60px; + } } .tabsTheme { From cf3632a4728e5ca9afca0c77277b4c88ed26bf2a Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sun, 12 Jan 2025 08:56:29 +0000 Subject: [PATCH 35/58] Update Sidebar.module.css Signed-off-by: Charles de Dreuille --- canon-docs/src/components/Sidebar/Sidebar.module.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/canon-docs/src/components/Sidebar/Sidebar.module.css b/canon-docs/src/components/Sidebar/Sidebar.module.css index 1733dd4f3a..870f504d28 100644 --- a/canon-docs/src/components/Sidebar/Sidebar.module.css +++ b/canon-docs/src/components/Sidebar/Sidebar.module.css @@ -4,7 +4,8 @@ @media (min-width: 768px) { .sidebar { - display: fixed; + display: block; + position: fixed; top: 0; left: 0; width: 300px; From 9ab26f3cc54994ce4862fb78d49993032d15249a Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 13 Jan 2025 10:50:54 +0530 Subject: [PATCH 36/58] Updated docs of k8s Signed-off-by: AmbrishRamachandiran --- docs/deployment/k8s.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deployment/k8s.md b/docs/deployment/k8s.md index 1a225d6d12..aae49b6069 100644 --- a/docs/deployment/k8s.md +++ b/docs/deployment/k8s.md @@ -169,7 +169,7 @@ Kubernetes definitions in a single file and apply them at the same time. Note the volume `type: local`; this creates a volume using local disk on Kubernetes nodes. More likely in a production scenario, you'd want to use a more highly available -[type of PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes). +[types of PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes). Apply the storage volume and claim to the Kubernetes cluster: From a913bebf46efbffd336f47e781cc642c1ced39a1 Mon Sep 17 00:00:00 2001 From: mpsanchis Date: Thu, 24 Oct 2024 18:19:18 +0200 Subject: [PATCH 37/58] feat(scaffolder-backend-module-gitlab): Add gitlab scaffolder action to migrate groups and projects (bulk_imports) Signed-off-by: mpsanchis --- .changeset/purple-scissors-switch.md | 5 + .../report.api.md | 14 ++ .../gitlabProjectMigrate.examples.test.ts | 89 +++++++++++ .../actions/gitlabProjectMigrate.examples.ts | 40 +++++ .../src/actions/gitlabProjectMigrate.test.ts | 94 +++++++++++ .../src/actions/gitlabProjectMigrate.ts | 151 ++++++++++++++++++ .../src/actions/index.ts | 1 + .../src/module.ts | 2 + 8 files changed, 396 insertions(+) create mode 100644 .changeset/purple-scissors-switch.md create mode 100644 plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.test.ts create mode 100644 plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.ts create mode 100644 plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.test.ts create mode 100644 plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.ts diff --git a/.changeset/purple-scissors-switch.md b/.changeset/purple-scissors-switch.md new file mode 100644 index 0000000000..fe3fd07f58 --- /dev/null +++ b/.changeset/purple-scissors-switch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +--- + +Added action `gitlab:group:migrate` to migrate projects using `bulk_import` diff --git a/plugins/scaffolder-backend-module-gitlab/report.api.md b/plugins/scaffolder-backend-module-gitlab/report.api.md index 896c0a5899..2cdbce6366 100644 --- a/plugins/scaffolder-backend-module-gitlab/report.api.md +++ b/plugins/scaffolder-backend-module-gitlab/report.api.md @@ -88,6 +88,20 @@ export const createGitlabProjectDeployTokenAction: (options: { } >; +// @public +export const createGitlabProjectMigrateAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + destinationAccessToken: string; + destinationUrl: string; + sourceAccessToken: string; + sourceFullPath: string; + sourceUrl: string; + }, + JsonObject +>; + // @public export const createGitlabProjectVariableAction: (options: { integrations: ScmIntegrationRegistry; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.test.ts new file mode 100644 index 0000000000..869bda30ec --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.test.ts @@ -0,0 +1,89 @@ +/* + * 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 { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { createGitlabProjectMigrateAction } from './gitlabProjectMigrate'; +import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; +import { createMockDirectory } from '@backstage/backend-test-utils'; +import { examples } from './gitlabProjectMigrate.examples'; +import yaml from 'yaml'; + +const mockGitlabClient = { + Migrations: { + create: jest.fn(), + }, +}; + +jest.mock('@gitbeaker/rest', () => ({ + Gitlab: class { + constructor() { + return mockGitlabClient; + } + }, +})); + +describe('gitlab:group:migrate', () => { + let instance: TemplateAction; + + beforeEach(() => { + jest.clearAllMocks(); + + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.local.com', + token: 'token', + apiBaseUrl: 'https://api.gitlab.local.com', + }, + { + host: 'hosted.gitlab.com', + apiBaseUrl: 'https://api.hosted.gitlab.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + instance = createGitlabProjectMigrateAction({ integrations }); + }); + + describe('Migrate a gitlab project to a different gitlab instance in another', () => { + const workspacePath = createMockDirectory().resolve('workspace'); + + it(`Execute example ${examples[0].description}`, async () => { + const input = yaml.parse(examples[0].example).steps[0].input; + const ctx = createMockActionContext({ input, workspacePath }); + await instance.handler(ctx); + + expect(mockGitlabClient.Migrations.create).toHaveBeenCalledWith( + { + url: 'https://gitlab.remote.com', + access_token: 'lolstoken', + }, + [ + { + sourceType: 'project_entity', + sourceFullPath: 'my/wonderful-repo', + destinationSlug: 'precious-repo', + destinationNamespace: 'my/local/site', + }, + ], + ); + }); + }); +}); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.ts new file mode 100644 index 0000000000..9fe53cb415 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.examples.ts @@ -0,0 +1,40 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Import repo from remote GitLab instance', + example: yaml.stringify({ + steps: [ + { + id: 'importGitLabRepo', + action: 'gitlab:repo:push', + name: 'Push changes to gitlab repository', + input: { + destinationAccessToken: 'tokenslols', + destinationUrl: + 'gitlab.local.com?repo=precious-repo&owner=my%2Flocal%2Fsite', + sourceAccessToken: 'lolstoken', + sourceFullPath: 'my/wonderful-repo', + sourceUrl: 'https://gitlab.remote.com', + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.test.ts new file mode 100644 index 0000000000..8e3bc6560d --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.test.ts @@ -0,0 +1,94 @@ +/* + * 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 { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { createGitlabProjectMigrateAction } from './gitlabProjectMigrate'; +import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; +import { createMockDirectory } from '@backstage/backend-test-utils'; + +const mockGitlabClient = { + Migrations: { + create: jest.fn(), + }, +}; + +jest.mock('@gitbeaker/rest', () => ({ + Gitlab: class { + constructor() { + return mockGitlabClient; + } + }, +})); + +describe('createGitlabRepoMigrate', () => { + let instance: TemplateAction; + + beforeEach(() => { + jest.clearAllMocks(); + + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'token', + apiBaseUrl: 'https://api.gitlab.com', + }, + { + host: 'hosted.gitlab.com', + apiBaseUrl: 'https://api.hosted.gitlab.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + instance = createGitlabProjectMigrateAction({ integrations }); + }); + + describe('createGitlabRepoImportAction', () => { + const workspacePath = createMockDirectory().resolve('workspace'); + + it('default repo import action is created', async () => { + const input = { + destinationAccessToken: 'moreLOLsToken', + destinationUrl: + 'gitlab.com?owner=migrated%2Ffoo%2Fbar&repo=migrated-go-lang', + sourceUrl: 'https://gitlab.remote.com', + sourceAccessToken: 'lolstoken', + sourceFullPath: 'foo/bar/go-lang', + }; + const ctx = createMockActionContext({ input, workspacePath }); + await instance.handler(ctx); + + expect(mockGitlabClient.Migrations.create).toHaveBeenCalledWith( + { + url: 'https://gitlab.remote.com', + access_token: 'lolstoken', + }, + [ + { + sourceType: 'project_entity', + sourceFullPath: 'foo/bar/go-lang', + destinationSlug: 'migrated-go-lang', + destinationNamespace: 'migrated/foo/bar', + }, + ], + ); + }); + }); +}); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.ts new file mode 100644 index 0000000000..659215c1c0 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabProjectMigrate.ts @@ -0,0 +1,151 @@ +/* + * 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 { + createTemplateAction, + parseRepoUrl, +} from '@backstage/plugin-scaffolder-node'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { InputError } from '@backstage/errors'; +import { createGitlabApi } from './helpers'; +import { examples } from './gitlabRepoPush.examples'; +import { MigrationEntityOptions } from '@gitbeaker/rest'; + +/** + * Create a new action that imports a gitlab project into another gitlab project (potentially from another gitlab instance). + * + * @public + */ +export const createGitlabProjectMigrateAction = (options: { + integrations: ScmIntegrationRegistry; +}) => { + const { integrations } = options; + + return createTemplateAction<{ + destinationAccessToken: string; + destinationUrl: string; + sourceAccessToken: string; + sourceFullPath: string; + sourceUrl: string; + }>({ + id: 'gitlab:group:migrate', + examples, + schema: { + input: { + required: [ + 'destinationAccessToken', + 'destinationUrl', + 'sourceAccessToken', + 'sourceFullPath', + 'sourceUrl', + ], + type: 'object', + properties: { + destinationAccessToken: { + type: 'string', + title: 'Target Repository Access Token', + description: `The token to use for authorization to the target GitLab'`, + }, + destinationUrl: { + type: 'string', + title: 'Target Project Location', + description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`, + }, + sourceAccessToken: { + type: 'string', + title: 'Source Group Access Token', + description: `The token to use for authorization to the source GitLab'`, + }, + sourceFullPath: { + type: 'string', + title: 'Group Full Path', + description: + 'Full path to the project in the source Gitlab instance', + }, + sourceUrl: { + type: 'string', + title: 'Source URL Location', + description: `Accepts the format 'https://gitlab.com/'`, + }, + }, + }, + output: { + type: 'object', + properties: { + importedRepoUrl: { + title: 'URL to the newly imported repo', + type: 'string', + }, + }, + }, + }, + + async handler(ctx) { + const { + destinationAccessToken, + destinationUrl, + sourceAccessToken, + sourceFullPath, + sourceUrl, + } = ctx.input; + + const { + host: destinationHost, + repo: destinationSlug, + owner: destinationNamespace, + } = parseRepoUrl(destinationUrl, integrations); + + if (!destinationNamespace) { + throw new InputError( + `Failed to determine target repository to migrate to. Make sure destinationUrl matches the format 'gitlab.myorg.com?repo=project_name&owner=group_name'`, + ); + } + + const api = createGitlabApi({ + integrations, + token: destinationAccessToken, + repoUrl: destinationUrl, + }); + + const migrationEntity: MigrationEntityOptions[] = [ + { + sourceType: 'project_entity', + sourceFullPath: sourceFullPath, + destinationSlug: destinationSlug, + destinationNamespace: destinationNamespace, + }, + ]; + + const sourceConfig = { + url: sourceUrl, + access_token: sourceAccessToken, + }; + + try { + await api.Migrations.create(sourceConfig, migrationEntity); + } catch (e: any) { + throw new InputError( + `Failed to transfer repo ${sourceFullPath}. Make sure that ${sourceFullPath} exists in ${sourceUrl}, and token has enough rights.\nError: ${e}`, + ); + } + + ctx.output( + 'importedRepoUrl', + `${destinationHost}/${destinationNamespace}/${destinationSlug}`, + ); + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts index c601c4656e..54a91a91bf 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts @@ -15,6 +15,7 @@ */ export * from './gitlab'; export * from './gitlabGroupEnsureExists'; +export * from './gitlabProjectMigrate'; export * from './gitlabIssueCreate'; export * from './gitlabIssueEdit'; export * from './gitlabMergeRequest'; diff --git a/plugins/scaffolder-backend-module-gitlab/src/module.ts b/plugins/scaffolder-backend-module-gitlab/src/module.ts index 9f18532cdf..f96d6d7c45 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/module.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/module.ts @@ -24,6 +24,7 @@ import { } from '@backstage/plugin-scaffolder-node/alpha'; import { createGitlabGroupEnsureExistsAction, + createGitlabProjectMigrateAction, createGitlabIssueAction, createGitlabProjectAccessTokenAction, createGitlabProjectDeployTokenAction, @@ -55,6 +56,7 @@ export const gitlabModule = createBackendModule({ scaffolder.addActions( createGitlabGroupEnsureExistsAction({ integrations }), + createGitlabProjectMigrateAction({ integrations }), createGitlabIssueAction({ integrations }), createGitlabProjectAccessTokenAction({ integrations }), createGitlabProjectDeployTokenAction({ integrations }), From 9bb0614dbbc7e129b7b04f1e38ceca1a481b1eaf Mon Sep 17 00:00:00 2001 From: mpsanchis Date: Mon, 6 Jan 2025 10:10:35 +0100 Subject: [PATCH 38/58] chore(scaffolder-backend-module-gitlab): Do not export project migrate action (transition to new backend system) Signed-off-by: mpsanchis --- .../scaffolder-backend-module-gitlab/report.api.md | 14 -------------- .../src/actions/index.ts | 1 - .../scaffolder-backend-module-gitlab/src/module.ts | 2 +- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/report.api.md b/plugins/scaffolder-backend-module-gitlab/report.api.md index 2cdbce6366..896c0a5899 100644 --- a/plugins/scaffolder-backend-module-gitlab/report.api.md +++ b/plugins/scaffolder-backend-module-gitlab/report.api.md @@ -88,20 +88,6 @@ export const createGitlabProjectDeployTokenAction: (options: { } >; -// @public -export const createGitlabProjectMigrateAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - destinationAccessToken: string; - destinationUrl: string; - sourceAccessToken: string; - sourceFullPath: string; - sourceUrl: string; - }, - JsonObject ->; - // @public export const createGitlabProjectVariableAction: (options: { integrations: ScmIntegrationRegistry; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts index 54a91a91bf..c601c4656e 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts @@ -15,7 +15,6 @@ */ export * from './gitlab'; export * from './gitlabGroupEnsureExists'; -export * from './gitlabProjectMigrate'; export * from './gitlabIssueCreate'; export * from './gitlabIssueEdit'; export * from './gitlabMergeRequest'; diff --git a/plugins/scaffolder-backend-module-gitlab/src/module.ts b/plugins/scaffolder-backend-module-gitlab/src/module.ts index f96d6d7c45..7dbfddfc1b 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/module.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/module.ts @@ -24,7 +24,6 @@ import { } from '@backstage/plugin-scaffolder-node/alpha'; import { createGitlabGroupEnsureExistsAction, - createGitlabProjectMigrateAction, createGitlabIssueAction, createGitlabProjectAccessTokenAction, createGitlabProjectDeployTokenAction, @@ -35,6 +34,7 @@ import { createTriggerGitlabPipelineAction, editGitlabIssueAction, } from './actions'; +import { createGitlabProjectMigrateAction } from './actions/gitlabProjectMigrate'; import { createHandleAutocompleteRequest } from './autocomplete/autocomplete'; /** From 4f9b056ec12d19fa050420fb81bdf6415b95ea7b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 13 Jan 2025 11:45:33 +0100 Subject: [PATCH 39/58] changesets: exit prerelease Signed-off-by: Patrik Oldsberg --- .changeset/pre.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 47232c15e9..bb3ef0d04b 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "next", "initialVersions": { "example-app": "0.2.104", From 8c04d7acd06b1ea59c8aa636773995ddf692635f Mon Sep 17 00:00:00 2001 From: Kamil Andrzejewski Date: Mon, 13 Jan 2025 14:23:19 +0100 Subject: [PATCH 40/58] chore: update getFile in BitbucketServerClient to use REST API paths for URL construction Signed-off-by: Kamil Andrzejewski --- .changeset/thick-radios-wink.md | 5 +++++ .../src/lib/BitbucketServerClient.test.ts | 2 +- .../src/lib/BitbucketServerClient.ts | 3 +-- 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 .changeset/thick-radios-wink.md diff --git a/.changeset/thick-radios-wink.md b/.changeset/thick-radios-wink.md new file mode 100644 index 0000000000..25b12cc09f --- /dev/null +++ b/.changeset/thick-radios-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +--- + +Updated the `getFile` method in `BitbucketServerClient` to use `this.config.apiBaseUrl` directly for constructing the API request URL, removing the creation of an unnecessary `URL` object. The method now relies on REST API paths for accessing resources instead of direct access, ensuring better alignment with Bitbucket's API conventions. diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts index db2a05d0b1..6abcede9de 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.test.ts @@ -153,7 +153,7 @@ describe('BitbucketServerClient', () => { it('getFile', async () => { server.use( rest.get( - `https://${config.host}/projects/test-project/repos/test-repo/raw/catalog-info.yaml`, + `${config.apiBaseUrl}/projects/test-project/repos/test-repo/raw/catalog-info.yaml`, (req, res, ctx) => { if ( req.headers.get('authorization') !== diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts index 73373ffff1..3dd61d64e7 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts @@ -77,9 +77,8 @@ export class BitbucketServerClient { repo: string; path: string; }): Promise { - const base = new URL(this.config.apiBaseUrl); return throttledFetch( - `${base.protocol}//${base.host}/projects/${options.projectKey}/repos/${options.repo}/raw/${options.path}`, + `${this.config.apiBaseUrl}/projects/${options.projectKey}/repos/${options.repo}/raw/${options.path}`, getBitbucketServerRequestOptions(this.config), ); } From 486fe1ce689fe2146974c99af5b466c62cb6c320 Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Tue, 14 Jan 2025 09:05:32 +1100 Subject: [PATCH 41/58] changeset grammar Signed-off-by: Tyler Davis --- .changeset/fast-seas-hunt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fast-seas-hunt.md b/.changeset/fast-seas-hunt.md index c4fb45dd47..0dcf8daf30 100644 --- a/.changeset/fast-seas-hunt.md +++ b/.changeset/fast-seas-hunt.md @@ -2,4 +2,4 @@ '@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch --- -Use email from cfIdentity instead of claims when constructing user profile for Service Token support. +Use the email from `cfIdentity` instead of `claims` when constructing user profile in order to support Cloudflare Service Tokens. From 4c0a674aef09621d351638a9f2a8c1255265f549 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 14 Jan 2025 07:49:27 +0100 Subject: [PATCH 42/58] Update docs/plugins/proxying.md Co-authored-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Signed-off-by: Ben Lambert Signed-off-by: blam --- docs/plugins/proxying.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/proxying.md b/docs/plugins/proxying.md index e4aff4b399..0e57a9a72a 100644 --- a/docs/plugins/proxying.md +++ b/docs/plugins/proxying.md @@ -121,7 +121,7 @@ third-parties. The same logic applies to headers that are sent from the target back to the frontend. -### New backend extension +### Proxy Extension Endpoint The proxy plugin additionally supports a `proxyExtensionEndpoint` which a proxy plugin module can utilize in order to programmatically register additional From e11c2fc6481db9f4b10d13dcdba0698dc17e9747 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 14 Jan 2025 07:59:08 +0100 Subject: [PATCH 43/58] chore: Refactor a little bit to use `proxyconfig` instead Signed-off-by: blam --- plugins/proxy-backend/report.api.md | 4 ++-- plugins/proxy-backend/src/service/router.ts | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/proxy-backend/report.api.md b/plugins/proxy-backend/report.api.md index ef0fe37c96..90e7f54378 100644 --- a/plugins/proxy-backend/report.api.md +++ b/plugins/proxy-backend/report.api.md @@ -6,8 +6,8 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; import { DiscoveryService } from '@backstage/backend-plugin-api'; import express from 'express'; -import { JsonObject } from '@backstage/types'; import { Logger } from 'winston'; +import { ProxyConfig } from '@backstage/plugin-proxy-node/alpha'; import { RootConfigService } from '@backstage/backend-plugin-api'; // @public @deprecated @@ -20,7 +20,7 @@ export default proxyPlugin; // @public @deprecated (undocumented) export interface RouterOptions { // (undocumented) - additionalEndpoints?: JsonObject; + additionalEndpoints?: ProxyConfig; // (undocumented) config: RootConfigService; // (undocumented) diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts index b578a9aed6..934b1fcecb 100644 --- a/plugins/proxy-backend/src/service/router.ts +++ b/plugins/proxy-backend/src/service/router.ts @@ -63,7 +63,7 @@ export interface RouterOptions { discovery: DiscoveryService; skipInvalidProxies?: boolean; reviveConsumedRequestBodies?: boolean; - additionalEndpoints?: JsonObject; + additionalEndpoints?: ProxyConfig; } // Creates a proxy middleware, possibly with defaults added on top of the @@ -310,10 +310,11 @@ export async function createRouterInternal( const externalUrl = await options.discovery.getExternalBaseUrl('proxy'); const { pathname: pathPrefix } = new URL(externalUrl); - const proxyConfig = { + const proxyConfig: ProxyConfig = { ...(options.additionalEndpoints ?? {}), ...readProxyConfig(options.config, options.logger), }; + configureMiddlewares( proxyOptions, currentRouter, @@ -356,10 +357,10 @@ function configureMiddlewares( }, router: express.Router, pathPrefix: string, - proxyConfig: any, + proxyConfig: ProxyConfig, httpRouterService?: HttpRouterService, ) { - Object.entries(proxyConfig).forEach(([route, proxyRouteConfig]) => { + Object.entries(proxyConfig).forEach(([route, proxyRouteConfig]) => { try { router.use( route, From 10b4e8a3d120fc538a4c13478c9d6c36b8463310 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 14 Jan 2025 08:01:09 +0100 Subject: [PATCH 44/58] chore: updating changeset Signed-off-by: blam --- .changeset/four-bananas-sneeze.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/four-bananas-sneeze.md b/.changeset/four-bananas-sneeze.md index 025dae518a..0f496b306f 100644 --- a/.changeset/four-bananas-sneeze.md +++ b/.changeset/four-bananas-sneeze.md @@ -1,6 +1,6 @@ --- -'@backstage/plugin-proxy-backend': minor +'@backstage/plugin-proxy-backend': patch '@backstage/plugin-proxy-node': minor --- -Add proxyEndpointsExtensionPoint +Added `proxyEndpointsExtensionPoint` to allow addition of proxy configuration through an extension point in the new backend system. From 27ad9a3446ade7160c9245ad5790a0d2952022ec Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Sat, 21 Dec 2024 21:13:09 +0100 Subject: [PATCH 45/58] update gitbeaker to support reviewerId's in it's interface (#3498), add reviewer id's with async retrieval Signed-off-by: Hghtwr --- packages/backend/src/index.ts | 3 ++ .../src/actions/gitlabMergeRequest.ts | 28 +++++++++++++++++++ yarn.lock | 21 ++++++++++---- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 8ae9864a4a..12dfa59302 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -61,4 +61,7 @@ backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); backend.add(import('./instanceMetadata')); +// backend.add(eventsModuleGitlabWebhook); +backend.add(import('@backstage/plugin-catalog-backend-module-gitlab-org')); + backend.start(); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts index 4e4812fdcf..502b9988aa 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts @@ -100,6 +100,7 @@ export const createPublishGitlabMergeRequestAction = (options: { projectid?: string; removeSourceBranch?: boolean; assignee?: string; + reviewers?: string[]; }>({ id: 'publish:gitlab:merge-request', examples, @@ -179,6 +180,14 @@ which uses additional API calls in order to detect whether to 'create', 'update' type: 'string', description: 'User this merge request will be assigned to', }, + reviewers: { + title: 'Merge Request Reviewers', + type: 'array', + items: { + type: 'string', + }, + description: 'Users that will be assigned as reviewers', + }, }, }, output: { @@ -207,6 +216,7 @@ which uses additional API calls in order to detect whether to 'create', 'update' async handler(ctx) { const { assignee, + reviewers, branchName, targetBranchName, description, @@ -242,6 +252,23 @@ which uses additional API calls in order to detect whether to 'create', 'update' } } + let reviewerIds: number[] | undefined; + if (reviewers !== undefined) { + reviewerIds = await Promise.all( + reviewers.map(async reviewer => { + try { + const reviewerUser = await api.Users.username(reviewer); + return reviewerUser[0].id; + } catch (e) { + ctx.logger.warn( + `Failed to find gitlab user id for ${reviewer}: ${e}. Proceeding with MR creation without reviewer.`, + ); + return undefined; + } + }), + ); + } + let fileRoot: string; if (sourcePath) { fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath); @@ -364,6 +391,7 @@ which uses additional API calls in order to detect whether to 'create', 'update' description, removeSourceBranch: removeSourceBranch ? removeSourceBranch : false, assigneeId, + reviewerIds, }, ).then(mergeRequest => mergeRequest.web_url ?? mergeRequest.webUrl); ctx.output('projectid', repoID); diff --git a/yarn.lock b/yarn.lock index f40ec341af..01138c7cab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,3 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - __metadata: version: 6 cacheKey: 8 @@ -6018,7 +6015,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-backend-module-gitlab-org@workspace:plugins/catalog-backend-module-gitlab-org": +"@backstage/plugin-catalog-backend-module-gitlab-org@workspace:^, @backstage/plugin-catalog-backend-module-gitlab-org@workspace:plugins/catalog-backend-module-gitlab-org": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-gitlab-org@workspace:plugins/catalog-backend-module-gitlab-org" dependencies: @@ -7736,7 +7733,9 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/plugin-scaffolder-node-test-utils": "workspace:^" - "@gitbeaker/rest": ^41.2.0 + "@gitbeaker/core": ^39.28.0 + "@gitbeaker/node": ^35.8.0 + "@gitbeaker/rest": ^39.25.0 luxon: ^3.0.0 winston: ^3.2.1 yaml: ^2.0.0 @@ -10176,6 +10175,17 @@ __metadata: languageName: node linkType: hard +"@gitbeaker/core@npm:^39.28.0, @gitbeaker/core@npm:^39.34.3": + version: 39.34.3 + resolution: "@gitbeaker/core@npm:39.34.3" + dependencies: + "@gitbeaker/requester-utils": ^39.34.3 + qs: ^6.11.2 + xcase: ^2.0.1 + checksum: 2b0ccd6137ee717b6f51c51c8f7063b84beeebfdb044574f2257f282864411c4f0932f2619893385f2a86bb4fa342b75be972fd1868640ab4e260f2280cc52b3 + languageName: node + linkType: hard + "@gitbeaker/core@npm:^40.6.0": version: 40.6.0 resolution: "@gitbeaker/core@npm:40.6.0" @@ -28878,6 +28888,7 @@ __metadata: "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" + "@backstage/plugin-catalog-backend-module-gitlab-org": "workspace:^" "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" From f9c8dc79449d9c5ef093bb2f04a104c9a5baceb4 Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Sat, 21 Dec 2024 23:00:52 +0100 Subject: [PATCH 46/58] revert test changes Signed-off-by: Hghtwr --- packages/backend/package.json | 1 + packages/backend/src/index.ts | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 6409dfae7a..6483a77397 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -40,6 +40,7 @@ "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", + "@backstage/plugin-catalog-backend-module-gitlab-org": "workspace:^", "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 12dfa59302..8ae9864a4a 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -61,7 +61,4 @@ backend.add(import('@backstage/plugin-signals-backend')); backend.add(import('@backstage/plugin-notifications-backend')); backend.add(import('./instanceMetadata')); -// backend.add(eventsModuleGitlabWebhook); -backend.add(import('@backstage/plugin-catalog-backend-module-gitlab-org')); - backend.start(); From 0bafea1a81e4155f9305e03fc30154af85b94046 Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Sat, 21 Dec 2024 23:02:25 +0100 Subject: [PATCH 47/58] revert test changes Signed-off-by: Hghtwr --- packages/backend/package.json | 1 - yarn.lock | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 6483a77397..6409dfae7a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -40,7 +40,6 @@ "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", - "@backstage/plugin-catalog-backend-module-gitlab-org": "workspace:^", "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", diff --git a/yarn.lock b/yarn.lock index 01138c7cab..6087c9cf30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6015,7 +6015,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-backend-module-gitlab-org@workspace:^, @backstage/plugin-catalog-backend-module-gitlab-org@workspace:plugins/catalog-backend-module-gitlab-org": +"@backstage/plugin-catalog-backend-module-gitlab-org@workspace:plugins/catalog-backend-module-gitlab-org": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-gitlab-org@workspace:plugins/catalog-backend-module-gitlab-org" dependencies: @@ -28888,7 +28888,6 @@ __metadata: "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" - "@backstage/plugin-catalog-backend-module-gitlab-org": "workspace:^" "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" From 8fb529a2a04973b3c1f5ca345102df2a6c8aae2e Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Sat, 21 Dec 2024 23:06:08 +0100 Subject: [PATCH 48/58] add changeset Signed-off-by: Hghtwr --- .changeset/lovely-stingrays-know.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/lovely-stingrays-know.md diff --git a/.changeset/lovely-stingrays-know.md b/.changeset/lovely-stingrays-know.md new file mode 100644 index 0000000000..f672a31e24 --- /dev/null +++ b/.changeset/lovely-stingrays-know.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': minor +--- + +Added reviewerIds to the Gitlab Merge Request action. From 04f8fb830d19c7476fe7c033fb5106c4543098a9 Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Mon, 23 Dec 2024 12:01:18 +0100 Subject: [PATCH 49/58] return undefined if reviewer not found, add basic testing Signed-off-by: Hghtwr --- .../src/actions/gitlabMergeRequest.test.ts | 193 +++++++++++++++++- .../src/actions/gitlabMergeRequest.ts | 32 +-- 2 files changed, 204 insertions(+), 21 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts index b5db1b4811..e95856658e 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts @@ -67,13 +67,29 @@ const mockGitlabClient = { }, Users: { all: jest.fn(async (userOptions: { username: string }) => { - if (userOptions.username !== 'John Smith') - throw new Error('user does not exist'); - return [ - { - id: 123, - }, - ]; + switch (userOptions.username) { + case 'John Smith': + return [ + { + id: 123, + }, + ]; + case 'Jane Doe': + return [ + { + id: 456, + }, + ]; + default: + throw new Error('user does not exist'); + } + // if (userOptions.username !== 'John Smith') + // throw new Error('user does not exist'); + // return [ + // { + // id: 123, + // }, + // ]; }), }, Repositories: { @@ -517,6 +533,169 @@ describe('createGitLabMergeRequest', () => { }); }); + describe('createGitlabMergeRequestWithReviewers', () => { + it('no reviewers are set when a no reviewer are passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + title: 'Create my new MR', + branchName: 'new-mr', + description: 'This is an important change', + removeSourceBranch: false, + targetPath: 'Subdirectory', + assignee: 'John Smith', + }; + mockDir.setContent({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + + const ctx = createMockActionContext({ input, workspacePath }); + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + ); + expect(mockGitlabClient.Commits.create).not.toHaveBeenCalled(); + expect(mockGitlabClient.MergeRequests.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + 'Create my new MR', + { + description: 'This is an important change', + removeSourceBranch: false, + assigneeId: 123, + }, + ); + }); + + it('reviewer is set correcly when a valid reviewer username is passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + title: 'Create my new MR', + branchName: 'new-mr', + description: 'This is an important change', + removeSourceBranch: false, + targetPath: 'Subdirectory', + assignee: 'John Smith', + reviewers: ['Jane Doe'], + }; + mockDir.setContent({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + + const ctx = createMockActionContext({ input, workspacePath }); + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + ); + expect(mockGitlabClient.Commits.create).not.toHaveBeenCalled(); + expect(mockGitlabClient.MergeRequests.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + 'Create my new MR', + { + description: 'This is an important change', + removeSourceBranch: false, + assigneeId: 123, + reviewerIds: [456], + }, + ); + }); + + it('reviewers are set correcly when valid reviewers username are passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + title: 'Create my new MR', + branchName: 'new-mr', + description: 'This is an important change', + removeSourceBranch: false, + targetPath: 'Subdirectory', + assignee: 'John Smith', + reviewers: ['Jane Doe', 'John Smith'], + }; + mockDir.setContent({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + + const ctx = createMockActionContext({ input, workspacePath }); + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + ); + expect(mockGitlabClient.Commits.create).not.toHaveBeenCalled(); + expect(mockGitlabClient.MergeRequests.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + 'Create my new MR', + { + description: 'This is an important change', + removeSourceBranch: false, + assigneeId: 123, + reviewerIds: [456, 123], + }, + ); + }); + + it('assignee is not set when a valid assignee username is not passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + title: 'Create my new MR', + branchName: 'new-mr', + description: 'This is an important change', + removeSourceBranch: false, + targetPath: 'Subdirectory', + reviewers: ['John Doe'], + }; + mockDir.setContent({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + + const ctx = createMockActionContext({ input, workspacePath }); + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + ); + expect(mockGitlabClient.Commits.create).not.toHaveBeenCalled(); + expect(mockGitlabClient.MergeRequests.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + 'Create my new MR', + { + description: 'This is an important change', + removeSourceBranch: false, + assigneeId: undefined, + reviewerIds: [], + }, + ); + }); + }); + describe('createGitLabMergeRequestWithoutCommitAction', () => { it('default commitAction is auto', async () => { const input = { diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts index 502b9988aa..e72f4831a9 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts @@ -252,21 +252,25 @@ which uses additional API calls in order to detect whether to 'create', 'update' } } - let reviewerIds: number[] | undefined; + let reviewerIds: number[] | undefined = undefined; // Explicitly set to undefined. Strangely, passing an empty array to the API will result the other options being undefined also being explicity passed to the Gitlab API call (e.g. assigneeId) if (reviewers !== undefined) { - reviewerIds = await Promise.all( - reviewers.map(async reviewer => { - try { - const reviewerUser = await api.Users.username(reviewer); - return reviewerUser[0].id; - } catch (e) { - ctx.logger.warn( - `Failed to find gitlab user id for ${reviewer}: ${e}. Proceeding with MR creation without reviewer.`, - ); - return undefined; - } - }), - ); + reviewerIds = ( + await Promise.all( + reviewers.map(async reviewer => { + try { + const reviewerUser = await api.Users.all({ + username: reviewer, + }); + return reviewerUser[0].id; + } catch (e) { + ctx.logger.warn( + `Failed to find gitlab user id for ${reviewer}: ${e}. Proceeding with MR creation without reviewer.`, + ); + return undefined; + } + }), + ) + ).filter(id => id !== undefined) as number[]; } let fileRoot: string; From ee55a6cdefaf818796544a56c04fb945155d2b84 Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Mon, 23 Dec 2024 15:57:28 +0100 Subject: [PATCH 50/58] added automatic assignment of reviewers when they are eligible approvers Signed-off-by: Hghtwr --- .../src/actions/gitlabMergeRequest.ts | 60 +++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts index e72f4831a9..9493b899b5 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts @@ -20,7 +20,12 @@ import { SerializedFile, serializeDirectoryContents, } from '@backstage/plugin-scaffolder-node'; -import { Gitlab, RepositoryTreeSchema, CommitAction } from '@gitbeaker/rest'; +import { + Gitlab, + RepositoryTreeSchema, + CommitAction, + SimpleUserSchema, +} from '@gitbeaker/rest'; import path from 'path'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { InputError } from '@backstage/errors'; @@ -386,7 +391,7 @@ which uses additional API calls in order to detect whether to 'create', 'update' } } try { - const mergeRequestUrl = await api.MergeRequests.create( + let mergeRequest = await api.MergeRequests.create( repoID, branchName, String(targetBranch), @@ -397,11 +402,58 @@ which uses additional API calls in order to detect whether to 'create', 'update' assigneeId, reviewerIds, }, - ).then(mergeRequest => mergeRequest.web_url ?? mergeRequest.webUrl); + ); + + // Because we don't know the code owners before the MR is created, we can't check the approval rules beforehand. + // Getting the approval rules beforehand is very difficult, especially, because of the inheritance rules for groups. + // Code owners take a moment to be processed and added to the approval rules after the MR is created. + + while ( + mergeRequest.detailed_merge_status === 'preparing' || + mergeRequest.detailed_merge_status === 'approvals_syncing' || + mergeRequest.detailed_merge_status === 'checking' + ) { + mergeRequest = await api.MergeRequests.show(repoID, mergeRequest.iid); + ctx.logger.info(`${mergeRequest.detailed_merge_status}`); + } + + const approvalRules = await api.MergeRequestApprovals.allApprovalRules( + repoID, + { + mergerequestIId: mergeRequest.iid, + }, + ); + + // This works right away for users/groups set in the rules. + if (approvalRules.length !== 0) { + const eligibleApprovers = approvalRules + .filter(rule => rule.eligible_approvers !== undefined) + .map(rule => { + return rule.eligible_approvers as SimpleUserSchema[]; + }) + .flat(); + + const eligibleUserIds = new Set([ + ...eligibleApprovers.map(user => user.id), + ...(reviewerIds ?? []), + ]); + + mergeRequest = await api.MergeRequests.edit( + repoID, + mergeRequest.iid, + { + reviewerIds: Array.from(eligibleUserIds), + }, + ); + } + ctx.output('projectid', repoID); ctx.output('targetBranchName', targetBranch); ctx.output('projectPath', repoID); - ctx.output('mergeRequestUrl', mergeRequestUrl); + ctx.output( + 'mergeRequestUrl', + mergeRequest.web_url ?? mergeRequest.webUrl, + ); } catch (e) { throw new InputError( `Merge request creation failed. ${getErrorMessage(e)}`, From d68530719f98d93c2625e6db9219398886e8b74c Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Mon, 23 Dec 2024 16:07:54 +0100 Subject: [PATCH 51/58] fixed changeset Signed-off-by: Hghtwr --- .changeset/lovely-stingrays-know.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/lovely-stingrays-know.md b/.changeset/lovely-stingrays-know.md index f672a31e24..056b4f391d 100644 --- a/.changeset/lovely-stingrays-know.md +++ b/.changeset/lovely-stingrays-know.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-scaffolder-backend-module-gitlab': minor +'@backstage/plugin-scaffolder-backend-module-gitlab': patch --- -Added reviewerIds to the Gitlab Merge Request action. +Added `reviewerIds` to the Gitlab Merge Request action. From 9bcd3f582e44752b38cbc8b54f510188e99dbdf0 Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Sun, 29 Dec 2024 10:12:01 +0100 Subject: [PATCH 52/58] add tests for automatic reviewer assignment Signed-off-by: Hghtwr --- .../gitlabMergeRequest.examples.test.ts | 52 ++++++ .../src/actions/gitlabMergeRequest.test.ts | 156 +++++++++++++++++- .../src/actions/gitlabMergeRequest.ts | 1 - 3 files changed, 204 insertions(+), 5 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.examples.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.examples.test.ts index 087d474807..e6aea81285 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.examples.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.examples.test.ts @@ -42,6 +42,58 @@ const mockGitlabClient = { default_branch: 'main', }; }), + show: jest.fn(async (_: any) => { + return { + default_branch: 'main', + }; + }), + edit: jest.fn(async (_: any) => { + return { + default_branch: 'main', + }; + }), + }, + MergeRequestApprovals: { + allApprovalRules: jest.fn(async (_: any) => { + return [ + { + id: 123, + name: 'rule1', + rule_type: 'regular', + eligible_approvers: [ + { + id: 123, + username: 'John Smith', + }, + { + id: 456, + username: 'Jane Doe', + }, + ], + approvals_required: 1, + users: [], + contains_hidden_groups: false, + report_type: null, + section: null, + source_rule: { approvals_required: 1 }, + overridden: false, + }, + { + id: 456, + name: 'All Members', + rule_type: 'any_approver', + eligible_approvers: [], + approvals_required: 1, + users: [], + groups: [], + contains_hidden_groups: false, + report_type: null, + section: null, + source_rule: { approvals_required: 1 }, + overridden: false, + }, + ]; + }), }, Projects: { create: jest.fn(), diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts index e95856658e..a61a26ebb5 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts @@ -51,11 +51,86 @@ const mockGitlabClient = { create: jest.fn(), }, MergeRequests: { - create: jest.fn(async (_: any) => { + create: jest.fn(async (repoId: string) => { + if (repoId === 'owner/repo-without-approvals') { + return { + iid: 5, + }; + } + return { + default_branch: 'main', + iid: 4, + }; + }), + show: jest.fn(async (repoId: string, iid: number) => { + if (repoId === 'owner/repo' && iid === 4) { + return { + iid: 4, + }; + } else if (repoId === 'owner/repo-without-approvals' && iid === 5) { + return { + iid: 5, + }; + } return { default_branch: 'main', }; }), + edit: jest.fn(async (_: any) => { + return { + default_branch: 'main', + }; + }), + }, + MergeRequestApprovals: { + allApprovalRules: jest.fn( + async (repoId: string, options: { mergerequestIId: number }) => { + if ( + repoId === 'owner/repo-without-approvals' && + options.mergerequestIId === 5 + ) { + return []; + } + return [ + { + id: 123, + name: 'rule1', + rule_type: 'regular', + eligible_approvers: [ + { + id: 234, + username: 'Bob Vance', + }, + { + id: 345, + username: 'Dina Fox', + }, + ], + approvals_required: 1, + users: [], + contains_hidden_groups: false, + report_type: null, + section: null, + source_rule: { approvals_required: 1 }, + overridden: false, + }, + { + id: 456, + name: 'All Members', + rule_type: 'any_approver', + eligible_approvers: [], + approvals_required: 1, + users: [], + groups: [], + contains_hidden_groups: false, + report_type: null, + section: null, + source_rule: { approvals_required: 1 }, + overridden: false, + }, + ]; + }, + ), }, Projects: { create: jest.fn(), @@ -74,6 +149,12 @@ const mockGitlabClient = { id: 123, }, ]; + case 'Bob Vance': + return [ + { + id: 234, + }, + ]; case 'Jane Doe': return [ { @@ -571,9 +652,19 @@ describe('createGitLabMergeRequest', () => { assigneeId: 123, }, ); + expect( + mockGitlabClient.MergeRequestApprovals.allApprovalRules, + ).toHaveBeenCalled(); + expect(mockGitlabClient.MergeRequests.edit).toHaveBeenCalledWith( + 'owner/repo', + 4, + { + reviewerIds: [234, 345], // Approval Rule Members + }, + ); }); - it('reviewer is set correcly when a valid reviewer username is passed in options', async () => { + it('reviewer is set correcly when a valid reviewer username is passed in options in combination with MR approval rules', async () => { const input = { repoUrl: 'gitlab.com?repo=repo&owner=owner', title: 'Create my new MR', @@ -582,7 +673,7 @@ describe('createGitLabMergeRequest', () => { removeSourceBranch: false, targetPath: 'Subdirectory', assignee: 'John Smith', - reviewers: ['Jane Doe'], + reviewers: ['Jane Doe', 'Bob Vance'], }; mockDir.setContent({ [workspacePath]: { @@ -609,9 +700,66 @@ describe('createGitLabMergeRequest', () => { description: 'This is an important change', removeSourceBranch: false, assigneeId: 123, - reviewerIds: [456], + reviewerIds: [456, 234], // Jane Doe and Bob Vance }, ); + expect( + mockGitlabClient.MergeRequestApprovals.allApprovalRules, + ).toHaveBeenCalled(); + expect(mockGitlabClient.MergeRequests.edit).toHaveBeenCalledWith( + 'owner/repo', + 4, + { + reviewerIds: [234, 345, 456], // Approval Rule Members + Jane Doe (individual reviewer) but no duplicates (Bob Vance) + }, + ); + }); + + it('reviewer is set correcly when a valid reviewer username is passed in options and no MR rules exist', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo-without-approvals&owner=owner', + title: 'Create my new MR', + branchName: 'new-mr', + description: 'This is an important change', + removeSourceBranch: false, + targetPath: 'Subdirectory', + assignee: 'John Smith', + reviewers: ['Jane Doe', 'Bob Vance'], + }; + mockDir.setContent({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + + const ctx = createMockActionContext({ input, workspacePath }); + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo-without-approvals', + 'new-mr', + 'main', + ); + expect(mockGitlabClient.Commits.create).not.toHaveBeenCalled(); + expect(mockGitlabClient.MergeRequests.create).toHaveBeenCalledWith( + 'owner/repo-without-approvals', + 'new-mr', + 'main', + 'Create my new MR', + { + description: 'This is an important change', + removeSourceBranch: false, + assigneeId: 123, + reviewerIds: [456, 234], // Jane Doe and Bob Vance + }, + ); + expect( + mockGitlabClient.MergeRequestApprovals.allApprovalRules, + ).toHaveBeenCalledWith('owner/repo-without-approvals', { + mergerequestIId: 5, + }); + expect(mockGitlabClient.MergeRequests.edit).not.toHaveBeenCalled(); }); it('reviewers are set correcly when valid reviewers username are passed in options', async () => { diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts index 9493b899b5..607a904d0a 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts @@ -424,7 +424,6 @@ which uses additional API calls in order to detect whether to 'create', 'update' }, ); - // This works right away for users/groups set in the rules. if (approvalRules.length !== 0) { const eligibleApprovers = approvalRules .filter(rule => rule.eligible_approvers !== undefined) From 2cc4b5944acd5bb8d5f8cd0535963e5563550d6d Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Sun, 29 Dec 2024 10:37:07 +0100 Subject: [PATCH 53/58] updating api report Signed-off-by: Hghtwr --- .../report.api.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/report.api.md b/plugins/scaffolder-backend-module-gitlab/report.api.md index 896c0a5899..e67ee05146 100644 --- a/plugins/scaffolder-backend-module-gitlab/report.api.md +++ b/plugins/scaffolder-backend-module-gitlab/report.api.md @@ -33,11 +33,11 @@ export const createGitlabIssueAction: (options: { projectId: number; labels?: string | undefined; description?: string | undefined; - weight?: number | undefined; token?: string | undefined; + weight?: number | undefined; assignees?: number[] | undefined; - createdAt?: string | undefined; confidential?: boolean | undefined; + createdAt?: string | undefined; milestoneId?: number | undefined; epicId?: number | undefined; dueDate?: string | undefined; @@ -61,8 +61,8 @@ export const createGitlabProjectAccessTokenAction: (options: { projectId: string | number; name?: string | undefined; token?: string | undefined; - scopes?: string[] | undefined; expiresAt?: string | undefined; + scopes?: string[] | undefined; accessLevel?: number | undefined; }, { @@ -76,8 +76,8 @@ export const createGitlabProjectDeployTokenAction: (options: { }) => TemplateAction< { name: string; - scopes: string[]; repoUrl: string; + scopes: string[]; projectId: string | number; username?: string | undefined; token?: string | undefined; @@ -118,7 +118,7 @@ export const createGitlabRepoPushAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'delete' | 'create' | undefined; + commitAction?: 'update' | 'create' | 'delete' | undefined; }, JsonObject >; @@ -198,10 +198,11 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'auto' | 'update' | 'delete' | 'create' | 'skip' | undefined; + commitAction?: 'auto' | 'update' | 'skip' | 'create' | 'delete' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; + reviewers?: string[] | undefined; }, JsonObject >; @@ -211,8 +212,8 @@ export const createTriggerGitlabPipelineAction: (options: { integrations: ScmIntegrationRegistry; }) => TemplateAction< { - branch: string; repoUrl: string; + branch: string; projectId: number; tokenDescription: string; token?: string | undefined; @@ -234,8 +235,8 @@ export const editGitlabIssueAction: (options: { title?: string | undefined; labels?: string | undefined; description?: string | undefined; - weight?: number | undefined; token?: string | undefined; + weight?: number | undefined; assignees?: number[] | undefined; addLabels?: string | undefined; confidential?: boolean | undefined; From b11da743d23e4577e90defa71bb5d83780a2d9bc Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Mon, 30 Dec 2024 09:45:23 +0100 Subject: [PATCH 54/58] update api signature Signed-off-by: Hghtwr --- .../report.api.md | 16 ++++++++-------- plugins/scaffolder-backend/report.api.md | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/report.api.md b/plugins/scaffolder-backend-module-gitlab/report.api.md index e67ee05146..b8ed736c03 100644 --- a/plugins/scaffolder-backend-module-gitlab/report.api.md +++ b/plugins/scaffolder-backend-module-gitlab/report.api.md @@ -33,11 +33,11 @@ export const createGitlabIssueAction: (options: { projectId: number; labels?: string | undefined; description?: string | undefined; - token?: string | undefined; weight?: number | undefined; + token?: string | undefined; assignees?: number[] | undefined; - confidential?: boolean | undefined; createdAt?: string | undefined; + confidential?: boolean | undefined; milestoneId?: number | undefined; epicId?: number | undefined; dueDate?: string | undefined; @@ -61,8 +61,8 @@ export const createGitlabProjectAccessTokenAction: (options: { projectId: string | number; name?: string | undefined; token?: string | undefined; - expiresAt?: string | undefined; scopes?: string[] | undefined; + expiresAt?: string | undefined; accessLevel?: number | undefined; }, { @@ -76,8 +76,8 @@ export const createGitlabProjectDeployTokenAction: (options: { }) => TemplateAction< { name: string; - repoUrl: string; scopes: string[]; + repoUrl: string; projectId: string | number; username?: string | undefined; token?: string | undefined; @@ -118,7 +118,7 @@ export const createGitlabRepoPushAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'create' | 'delete' | undefined; + commitAction?: 'update' | 'delete' | 'create' | undefined; }, JsonObject >; @@ -198,7 +198,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; @@ -212,8 +212,8 @@ export const createTriggerGitlabPipelineAction: (options: { integrations: ScmIntegrationRegistry; }) => TemplateAction< { - repoUrl: string; branch: string; + repoUrl: string; projectId: number; tokenDescription: string; token?: string | undefined; @@ -235,8 +235,8 @@ export const editGitlabIssueAction: (options: { title?: string | undefined; labels?: string | undefined; description?: string | undefined; - token?: string | undefined; weight?: number | undefined; + token?: string | undefined; assignees?: number[] | undefined; addLabels?: string | undefined; confidential?: boolean | undefined; diff --git a/plugins/scaffolder-backend/report.api.md b/plugins/scaffolder-backend/report.api.md index 20273697d3..d2bb6f1bb1 100644 --- a/plugins/scaffolder-backend/report.api.md +++ b/plugins/scaffolder-backend/report.api.md @@ -358,6 +358,7 @@ export const createPublishGitlabMergeRequestAction: (options: { projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; + reviewers?: string[] | undefined; }, JsonObject >; From c0a16aee2e87c10584bdf677a731b055f272481e Mon Sep 17 00:00:00 2001 From: Hghtwr Date: Thu, 2 Jan 2025 10:18:08 +0100 Subject: [PATCH 55/58] remove commented parts Signed-off-by: Hghtwr --- .../src/actions/gitlabMergeRequest.test.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts index a61a26ebb5..874764b5ba 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.test.ts @@ -164,13 +164,6 @@ const mockGitlabClient = { default: throw new Error('user does not exist'); } - // if (userOptions.username !== 'John Smith') - // throw new Error('user does not exist'); - // return [ - // { - // id: 123, - // }, - // ]; }), }, Repositories: { From 64554d16adb317282b659f5241c04b92b6ad85c1 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 14 Jan 2025 08:05:13 +0100 Subject: [PATCH 56/58] chore: reset Signed-off-by: blam Signed-off-by: blam --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 41533ef516..89c00b9d9d 100644 --- a/package.json +++ b/package.json @@ -84,9 +84,6 @@ ] }, "prettier": "@backstage/cli/config/prettier", - "jest": { - "rejectFrontendNetworkRequests": true - }, "resolutions": { "@changesets/assemble-release-plan@^6.0.0": "patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch", "@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", @@ -137,6 +134,9 @@ "sort-package-json": "^2.8.0", "typescript": "~5.2.0" }, + "jest": { + "rejectFrontendNetworkRequests": true + }, "packageManager": "yarn@3.8.1", "engines": { "node": "20 || 22" From 5740c8b1437303dbd2eee01954a60b47bc231e90 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 14 Jan 2025 08:11:32 +0100 Subject: [PATCH 57/58] cghore: reset Signed-off-by: blam --- package.json | 6 +++--- yarn.lock | 18 ++++-------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 89c00b9d9d..41533ef516 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,9 @@ ] }, "prettier": "@backstage/cli/config/prettier", + "jest": { + "rejectFrontendNetworkRequests": true + }, "resolutions": { "@changesets/assemble-release-plan@^6.0.0": "patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch", "@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", @@ -134,9 +137,6 @@ "sort-package-json": "^2.8.0", "typescript": "~5.2.0" }, - "jest": { - "rejectFrontendNetworkRequests": true - }, "packageManager": "yarn@3.8.1", "engines": { "node": "20 || 22" diff --git a/yarn.lock b/yarn.lock index 6087c9cf30..f40ec341af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,3 +1,6 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + __metadata: version: 6 cacheKey: 8 @@ -7733,9 +7736,7 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/plugin-scaffolder-node-test-utils": "workspace:^" - "@gitbeaker/core": ^39.28.0 - "@gitbeaker/node": ^35.8.0 - "@gitbeaker/rest": ^39.25.0 + "@gitbeaker/rest": ^41.2.0 luxon: ^3.0.0 winston: ^3.2.1 yaml: ^2.0.0 @@ -10175,17 +10176,6 @@ __metadata: languageName: node linkType: hard -"@gitbeaker/core@npm:^39.28.0, @gitbeaker/core@npm:^39.34.3": - version: 39.34.3 - resolution: "@gitbeaker/core@npm:39.34.3" - dependencies: - "@gitbeaker/requester-utils": ^39.34.3 - qs: ^6.11.2 - xcase: ^2.0.1 - checksum: 2b0ccd6137ee717b6f51c51c8f7063b84beeebfdb044574f2257f282864411c4f0932f2619893385f2a86bb4fa342b75be972fd1868640ab4e260f2280cc52b3 - languageName: node - linkType: hard - "@gitbeaker/core@npm:^40.6.0": version: 40.6.0 resolution: "@gitbeaker/core@npm:40.6.0" From 517d8226b321ccd1c93e7d05149ac06b73990d71 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 14 Jan 2025 08:32:25 +0100 Subject: [PATCH 58/58] chore: updating changeset Signed-off-by: blam --- .changeset/young-forks-grab.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/young-forks-grab.md b/.changeset/young-forks-grab.md index d48a4f1f7d..8cc5f96600 100644 --- a/.changeset/young-forks-grab.md +++ b/.changeset/young-forks-grab.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-scaffolder-backend-module-gitlab': minor +'@backstage/plugin-scaffolder-backend-module-gitlab': patch --- -Updated the path field in the gitlab:group:ensureExists action to accept an array of either strings or objects with name and slug fields. +Updated the path field in the `gitlab:group:ensureExists` action to accept an array of either strings or objects with name and slug fields.