From d1c325e1c7864aa0d65259a4100a3015b852d053 Mon Sep 17 00:00:00 2001 From: Karl Haworth Date: Tue, 16 Apr 2024 07:51:02 -0400 Subject: [PATCH 01/44] - update readme to include information on wolfi package strategy Signed-off-by: Karl Haworth --- contrib/docker/minimal-harded-image/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/docker/minimal-harded-image/README.md b/contrib/docker/minimal-harded-image/README.md index accb2188ac..5737cd3be0 100644 --- a/contrib/docker/minimal-harded-image/README.md +++ b/contrib/docker/minimal-harded-image/README.md @@ -10,3 +10,5 @@ The `Dockerfile` in this directory uses a [`wolfi-base`](https://github.com/wolf - `Wolfi` OS uses packages from the [os repository](https://github.com/wolfi-dev/os) on GitHub. Some packages may be named differently. - While `Wolfi` uses `apk`, the OS is designed to support `glibc`. - Due to the stripped down nature of the base image, additional packages might be needed compared to a distribution like Debian or Ubuntu. +- Chainguard will maintain one version of each Wolfi package at a time, which will track the latest version of the upstream software in the package. Chainguard will end patch support for previous versions of packages in Wolfi. [Read more here](https://edu.chainguard.dev/chainguard/chainguard-images/faq/#what-packages-are-available-in-chainguard-images) + - It is encouraged to use a relative pin or use a third-party tool to ensure the packages are kept up to date From 3ad8f49c1decfc5f1d78838581940e5c72e14421 Mon Sep 17 00:00:00 2001 From: Karl Haworth Date: Tue, 16 Apr 2024 07:51:23 -0400 Subject: [PATCH 02/44] add info on digests Signed-off-by: Karl Haworth --- contrib/docker/minimal-harded-image/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contrib/docker/minimal-harded-image/README.md b/contrib/docker/minimal-harded-image/README.md index 5737cd3be0..a4f19784d4 100644 --- a/contrib/docker/minimal-harded-image/README.md +++ b/contrib/docker/minimal-harded-image/README.md @@ -4,6 +4,16 @@ DockerHub images in general did not seem ideal for Backstage as the number of vu The `Dockerfile` in this directory uses a [`wolfi-base`](https://github.com/wolfi-dev) image from Chainguard Images. This improves the security of the application and reduces false positives in scanners. +## Pinning Digest + +To reduce maintenance, the digest of the image has been removed from the `./Dockerfile` file. A complete example with the digest would be `cgr.dev/chainguard/wolfi-base:latest@sha256:3d6dece13cdb5546cd03b20e14f9af354bc1a56ab5a7b47dca3e6c1557211fcf` and it is suggested to update the `FROM` line in the `Dockerfile` to use a digest. + +Using the digest allows tools such as Dependabot or Renovate to know exactly which image digest is being utilized and allows for Pull Requests to be triggered when a new digest is available. It is suggested to setup Dependabot/Renovate or a similar tool to ensure the image is kept up to date so that vulnerability fixes that have been addressed are pulled in frequently. + +### Obtaining Digest + +To obtain the latest digest, perform a `docker pull` on the image to get the latest digest in the command output or use `crane digest `. + ## Considerations - `Wolfi` only releases the `latest` tag for public consumption however digests can be pinned. From 4120800bd9e4b46c84b2e1b1436929b3f133eb07 Mon Sep 17 00:00:00 2001 From: Karl Haworth Date: Tue, 16 Apr 2024 07:51:40 -0400 Subject: [PATCH 03/44] - move path from `minimal-harded-image` -> `minimal-hardened-image` Signed-off-by: Karl Haworth --- .../Dockerfile | 0 .../README.md | 0 docs/deployment/docker.md | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename contrib/docker/{minimal-harded-image => minimal-hardened-image}/Dockerfile (100%) rename contrib/docker/{minimal-harded-image => minimal-hardened-image}/README.md (100%) diff --git a/contrib/docker/minimal-harded-image/Dockerfile b/contrib/docker/minimal-hardened-image/Dockerfile similarity index 100% rename from contrib/docker/minimal-harded-image/Dockerfile rename to contrib/docker/minimal-hardened-image/Dockerfile diff --git a/contrib/docker/minimal-harded-image/README.md b/contrib/docker/minimal-hardened-image/README.md similarity index 100% rename from contrib/docker/minimal-harded-image/README.md rename to contrib/docker/minimal-hardened-image/README.md diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md index 791882224d..9ec5460a88 100644 --- a/docs/deployment/docker.md +++ b/docs/deployment/docker.md @@ -345,8 +345,8 @@ The `Dockerfile` mentioned above located in `packages/backend` is maintained by ### Minimal Hardened Image -A contributed `Dockerfile` exists within the directory of `contrib/docker/minimal-harded-image` which uses the [`wolfi-base`](https://github.com/wolfi-dev) image to reduce vulnerabilities. When this was contributed, this alternative `Dockerfile` reduced 98.2% of vulnerabilities in the built Backstage docker image when compared with the image built from `packages/backend/Dockerfile`. +A contributed `Dockerfile` exists within the directory of `contrib/docker/minimal-hardened-image` which uses the [`wolfi-base`](https://github.com/wolfi-dev) image to reduce vulnerabilities. When this was contributed, this alternative `Dockerfile` reduced 98.2% of vulnerabilities in the built Backstage docker image when compared with the image built from `packages/backend/Dockerfile`. -To reduce maintenance, the digest of the image has been removed from the `contrib/docker/minimal-harded-image/Dockerfile` file. A complete example with the digest would be `cgr.dev/chainguard/wolfi-base:latest@sha256:3d6dece13cdb5546cd03b20e14f9af354bc1a56ab5a7b47dca3e6c1557211fcf` and it is suggested to update the `FROM` line in the `Dockerfile` to use a digest. Please do a docker pull on the image to get the latest digest. Using the digest allows tools such as Dependabot or Renovate to know exactly which image digest is being utilized and allows for Pull Requests to be triggered when a new digest is available. +To reduce maintenance, the digest of the image has been removed from the `contrib/docker/minimal-hardened-image/Dockerfile` file. A complete example with the digest would be `cgr.dev/chainguard/wolfi-base:latest@sha256:3d6dece13cdb5546cd03b20e14f9af354bc1a56ab5a7b47dca3e6c1557211fcf` and it is suggested to update the `FROM` line in the `Dockerfile` to use a digest. Please do a docker pull on the image to get the latest digest. Using the digest allows tools such as Dependabot or Renovate to know exactly which image digest is being utilized and allows for Pull Requests to be triggered when a new digest is available. It is suggested to setup Dependabot/Renovate or a similar tool to ensure the image is kept up to date so that vulnerability fixes that have been addressed are pulled in frequently. From 9d089a421916cd366e2c669983bf2d8303d1061d Mon Sep 17 00:00:00 2001 From: Karl Haworth Date: Tue, 16 Apr 2024 07:52:35 -0400 Subject: [PATCH 04/44] change item to subbullet Signed-off-by: Karl Haworth --- contrib/docker/minimal-hardened-image/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/docker/minimal-hardened-image/README.md b/contrib/docker/minimal-hardened-image/README.md index a4f19784d4..c9a41d0d19 100644 --- a/contrib/docker/minimal-hardened-image/README.md +++ b/contrib/docker/minimal-hardened-image/README.md @@ -17,7 +17,8 @@ To obtain the latest digest, perform a `docker pull` on the image to get the lat ## Considerations - `Wolfi` only releases the `latest` tag for public consumption however digests can be pinned. -- `Wolfi` OS uses packages from the [os repository](https://github.com/wolfi-dev/os) on GitHub. Some packages may be named differently. +- `Wolfi` OS uses packages from the [os repository](https://github.com/wolfi-dev/os) on GitHub. + - Some packages may be named differently. - While `Wolfi` uses `apk`, the OS is designed to support `glibc`. - Due to the stripped down nature of the base image, additional packages might be needed compared to a distribution like Debian or Ubuntu. - Chainguard will maintain one version of each Wolfi package at a time, which will track the latest version of the upstream software in the package. Chainguard will end patch support for previous versions of packages in Wolfi. [Read more here](https://edu.chainguard.dev/chainguard/chainguard-images/faq/#what-packages-are-available-in-chainguard-images) From 79d91e06af741dd2701c69c1706859ceaad9ef2e Mon Sep 17 00:00:00 2001 From: Karl Haworth Date: Tue, 16 Apr 2024 11:48:32 -0500 Subject: [PATCH 05/44] add wolfi to vale accept list Signed-off-by: Karl Haworth --- .github/vale/config/vocabularies/Backstage/accept.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index b525d7e48e..77b144dbcb 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -462,6 +462,7 @@ Weaveworks Webpack widget's winston +Wolfi www WWW XCMetrics From b55f026d43b2c8a14b4c2340470bb9cdd7903271 Mon Sep 17 00:00:00 2001 From: Karl Haworth Date: Tue, 16 Apr 2024 11:49:12 -0500 Subject: [PATCH 06/44] remove backticks from 'wolfi' Signed-off-by: Karl Haworth --- contrib/docker/minimal-hardened-image/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/docker/minimal-hardened-image/README.md b/contrib/docker/minimal-hardened-image/README.md index c9a41d0d19..62045a4ded 100644 --- a/contrib/docker/minimal-hardened-image/README.md +++ b/contrib/docker/minimal-hardened-image/README.md @@ -2,7 +2,7 @@ DockerHub images in general did not seem ideal for Backstage as the number of vulnerabilities were quite high regardless of the image used. -The `Dockerfile` in this directory uses a [`wolfi-base`](https://github.com/wolfi-dev) image from Chainguard Images. This improves the security of the application and reduces false positives in scanners. +The `Dockerfile` in this directory uses a [wolfi-base](https://github.com/wolfi-dev) image from Chainguard Images. This improves the security of the application and reduces false positives in scanners. ## Pinning Digest @@ -16,10 +16,10 @@ To obtain the latest digest, perform a `docker pull` on the image to get the lat ## Considerations -- `Wolfi` only releases the `latest` tag for public consumption however digests can be pinned. -- `Wolfi` OS uses packages from the [os repository](https://github.com/wolfi-dev/os) on GitHub. +- Wolfi only releases the `latest` tag for public consumption however digests can be pinned. +- Wolfi OS uses packages from the [os repository](https://github.com/wolfi-dev/os) on GitHub. - Some packages may be named differently. -- While `Wolfi` uses `apk`, the OS is designed to support `glibc`. +- While Wolfi uses `apk`, the OS is designed to support `glibc`. - Due to the stripped down nature of the base image, additional packages might be needed compared to a distribution like Debian or Ubuntu. - Chainguard will maintain one version of each Wolfi package at a time, which will track the latest version of the upstream software in the package. Chainguard will end patch support for previous versions of packages in Wolfi. [Read more here](https://edu.chainguard.dev/chainguard/chainguard-images/faq/#what-packages-are-available-in-chainguard-images) - It is encouraged to use a relative pin or use a third-party tool to ensure the packages are kept up to date From 6f5a3a3ce5b337de29ccb54c0f887ec113d1b583 Mon Sep 17 00:00:00 2001 From: secustor Date: Wed, 17 Apr 2024 17:19:35 +0200 Subject: [PATCH 07/44] fix(plugins/catalog-backend-module-unprocessed): correctly translate owner to string in case of nullish value Signed-off-by: secustor --- .changeset/cyan-suns-shave.md | 5 +++++ .../src/UnprocessedEntitiesModule.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/cyan-suns-shave.md diff --git a/.changeset/cyan-suns-shave.md b/.changeset/cyan-suns-shave.md new file mode 100644 index 0000000000..09e51d9548 --- /dev/null +++ b/.changeset/cyan-suns-shave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-unprocessed': patch +--- + +Correctly convert owner to string in case owner has not been provided diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index 23042ff2d8..c46848f201 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -162,7 +162,7 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'failed', - owner: String(req.query.owner), + owner: req.query.owner?.toString(), }), ); }) @@ -170,7 +170,7 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'pending', - owner: String(req.query.owner), + owner: req.query.owner?.toString(), }), ); }) From c35ea7c8ecb3a6c0873ce89752cd5401f0ec695c Mon Sep 17 00:00:00 2001 From: Sebastian Poxhofer Date: Sat, 20 Apr 2024 08:47:59 +0200 Subject: [PATCH 08/44] Apply suggestions from code review Co-authored-by: Vincenzo Scamporlino Signed-off-by: Sebastian Poxhofer --- .../src/UnprocessedEntitiesModule.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index c46848f201..6f0fa7d2e5 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -162,7 +162,7 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'failed', - owner: req.query.owner?.toString(), + owner: typeof req.query.owner === 'string' ? req.query.owner : undefined, }), ); }) @@ -170,7 +170,7 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'pending', - owner: req.query.owner?.toString(), + owner: typeof req.query.owner === 'string' ? req.query.owner : undefined }), ); }) From 09f89885bbdb45a82569096153a91ee745f8e9c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 24 Apr 2024 18:36:24 +0200 Subject: [PATCH 09/44] Remove explicit alg check for user tokens in verifyToken MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/loud-timers-flow.md | 5 +++++ .../implementations/auth/user/UserTokenHandler.ts | 11 ++--------- 2 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 .changeset/loud-timers-flow.md diff --git a/.changeset/loud-timers-flow.md b/.changeset/loud-timers-flow.md new file mode 100644 index 0000000000..d7d0d96970 --- /dev/null +++ b/.changeset/loud-timers-flow.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Remove explicit `alg` check for user tokens in `verifyToken` diff --git a/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.ts b/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.ts index af3faae22d..bd73d8701f 100644 --- a/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.ts +++ b/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.ts @@ -34,18 +34,14 @@ import { JwksClient } from '../JwksClient'; */ export class UserTokenHandler { static create(options: { discovery: DiscoveryService }): UserTokenHandler { - const algorithms = ['ES256']; // TODO: configurable? const jwksClient = new JwksClient(async () => { const url = await options.discovery.getBaseUrl('auth'); return new URL(`${url}/.well-known/jwks.json`); }); - return new UserTokenHandler(algorithms, jwksClient); + return new UserTokenHandler(jwksClient); } - constructor( - private readonly algorithms: string[], - private readonly jwksClient: JwksClient, - ) {} + constructor(private readonly jwksClient: JwksClient) {} async verifyToken(token: string) { const verifyOpts = this.#getTokenVerificationOptions(token); @@ -79,7 +75,6 @@ export class UserTokenHandler { if (typ === tokenTypes.user.typParam) { return { - algorithms: this.algorithms, requiredClaims: ['iat', 'exp', 'sub'], typ: tokenTypes.user.typParam, }; @@ -87,7 +82,6 @@ export class UserTokenHandler { if (typ === tokenTypes.limitedUser.typParam) { return { - algorithms: this.algorithms, requiredClaims: ['iat', 'exp', 'sub'], typ: tokenTypes.limitedUser.typParam, }; @@ -96,7 +90,6 @@ export class UserTokenHandler { const { aud } = decodeJwt(token); if (aud === tokenTypes.user.audClaim) { return { - algorithms: this.algorithms, audience: tokenTypes.user.audClaim, }; } From 0329b2514b3790413f53bb0f5012f816718f094f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 25 Apr 2024 09:57:53 +0200 Subject: [PATCH 10/44] add test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../auth/user/UserTokenHandler.test.ts | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.test.ts b/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.test.ts index f2a86e4a20..b0e8418655 100644 --- a/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.test.ts +++ b/packages/backend-app-api/src/services/implementations/auth/user/UserTokenHandler.test.ts @@ -133,6 +133,34 @@ describe('UserTokenHandler', () => { ).rejects.toThrow('signature verification failed'); }); + it('should fail to verify tokens that have a bad alg', async () => { + const expectedIssuedAt = 1712071714; + const expectedExpiresAt = 1712075314; + + jest.useFakeTimers({ + now: expectedIssuedAt * 1000 + 600_000, + }); + + const header = encodeData({ + typ: 'vnd.backstage.user', + alg: 'none', + }); + const payload = encodeData({ + iss: 'http://localhost:7007/api/auth', + sub: 'user:development/guest', + ent: ['user:development/guest', 'group:default/team-a'], + aud: 'backstage', + iat: expectedIssuedAt, + exp: expectedExpiresAt, + uip: 'proof', + }); + const token = `${header}.${payload}.`; + + await expect(userTokenHandler.verifyToken(token)).rejects.toThrow( + /Unsupported "alg" value/, + ); + }); + it('should verify a valid legacy backstage token', async () => { const expectedIssuedAt = 1712071714; const expectedExpiresAt = 1712075314; @@ -151,7 +179,7 @@ describe('UserTokenHandler', () => { sub: 'user:development/guest', ent: ['user:development/guest', 'group:default/team-a'], aud: 'backstage', - iat: 1712071714, + iat: expectedIssuedAt, exp: expectedExpiresAt, }, }; @@ -179,7 +207,7 @@ describe('UserTokenHandler', () => { iss: 'http://localhost:7007/api/auth', ent: ['user:development/guest', 'group:default/team-a'], aud: 'backstage', - iat: 1712071714, + iat: expectedIssuedAt, exp: expectedExpiresAt, }, }; @@ -209,7 +237,7 @@ describe('UserTokenHandler', () => { sub: 'user:development/guest', ent: ['user:development/guest', 'group:default/team-a'], aud: 'backstage', - iat: 1712071714, + iat: expectedIssuedAt, exp: expectedExpiresAt, uip: 'proof', }, @@ -239,7 +267,7 @@ describe('UserTokenHandler', () => { payload: { sub: 'user:development/guest', ent: ['user:development/guest', 'group:default/team-a'], - iat: 1712071714, + iat: expectedIssuedAt, exp: expectedExpiresAt, }, }; From 8479a0be3fb631116e6cb3a8ee5857fc085fc89f Mon Sep 17 00:00:00 2001 From: zcmander Date: Thu, 25 Apr 2024 14:11:18 +0300 Subject: [PATCH 11/44] fix: stitching queue gauge to not include entities from the future Signed-off-by: zcmander --- .changeset/sweet-zoos-clap.md | 5 +++++ plugins/catalog-backend/src/stitching/progressTracker.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changeset/sweet-zoos-clap.md diff --git a/.changeset/sweet-zoos-clap.md b/.changeset/sweet-zoos-clap.md new file mode 100644 index 0000000000..8c76f4abd7 --- /dev/null +++ b/.changeset/sweet-zoos-clap.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Fixed bug in stitching queue gauge that included entities that are scheduled in the future. diff --git a/plugins/catalog-backend/src/stitching/progressTracker.ts b/plugins/catalog-backend/src/stitching/progressTracker.ts index 9e00a1a01b..8c305b4978 100644 --- a/plugins/catalog-backend/src/stitching/progressTracker.ts +++ b/plugins/catalog-backend/src/stitching/progressTracker.ts @@ -54,7 +54,8 @@ export function progressTracker(knex: Knex, logger: LoggerService) { stitchingQueueCount.addCallback(async result => { const total = await knex('refresh_state') .count({ count: '*' }) - .whereNotNull('next_stitch_at'); + .whereNotNull('next_stitch_at') + .where('next_stitch_at', '<=', knex.fn.now()); result.observe(Number(total[0].count)); }); From 6d89bf4f720985c896778a4f4d4617c99529d071 Mon Sep 17 00:00:00 2001 From: secustor Date: Thu, 25 Apr 2024 19:59:51 +0200 Subject: [PATCH 12/44] prettier fix Signed-off-by: secustor --- .../src/UnprocessedEntitiesModule.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index 6f0fa7d2e5..34aedd61af 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -162,7 +162,8 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'failed', - owner: typeof req.query.owner === 'string' ? req.query.owner : undefined, + owner: + typeof req.query.owner === 'string' ? req.query.owner : undefined, }), ); }) @@ -170,7 +171,8 @@ export class UnprocessedEntitiesModule { return res.json( await this.unprocessed({ reason: 'pending', - owner: typeof req.query.owner === 'string' ? req.query.owner : undefined + owner: + typeof req.query.owner === 'string' ? req.query.owner : undefined, }), ); }) From a9ac73a8eeba54995d88c8c726b0661c89b1e449 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 26 Apr 2024 09:35:46 +0530 Subject: [PATCH 13/44] fix: fix deadlinks on microsite Signed-off-by: Aditya Kumar --- microsite/data/plugins/airbrake.yaml | 2 +- microsite/data/plugins/analytics-module-ga.yaml | 2 +- microsite/data/plugins/apollo-explorer.yaml | 2 +- microsite/data/plugins/azure-pipelines.yaml | 2 +- microsite/data/plugins/badges.yaml | 2 +- microsite/data/plugins/bazaar.yaml | 2 +- microsite/data/plugins/bitrise.yaml | 2 +- microsite/data/plugins/firehydrant.yaml | 4 ++-- microsite/data/plugins/fossa.yaml | 2 +- microsite/data/plugins/github-codespaces.yaml | 2 +- microsite/data/plugins/linguist.yaml | 2 +- microsite/data/plugins/newrelic-dashboard.yaml | 2 +- microsite/data/plugins/octopus-deploy.yaml | 2 +- microsite/data/plugins/opencost.yaml | 2 +- microsite/data/plugins/puppetdb.yaml | 2 +- microsite/data/plugins/shortcuts.yaml | 2 +- microsite/data/plugins/sonarqube.yaml | 2 +- microsite/data/plugins/stack-overflow.yaml | 2 +- 18 files changed, 19 insertions(+), 19 deletions(-) diff --git a/microsite/data/plugins/airbrake.yaml b/microsite/data/plugins/airbrake.yaml index 7f946597ef..8facf13185 100644 --- a/microsite/data/plugins/airbrake.yaml +++ b/microsite/data/plugins/airbrake.yaml @@ -4,7 +4,7 @@ author: Simply Business authorUrl: https://github.com/simplybusiness/ category: Monitoring description: Access Airbrake error monitoring and other integrations from within Backstage -documentation: https://github.com/backstage/backstage/blob/master/plugins/airbrake +documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/airbrake/plugins/airbrake iconUrl: https://wp-assets.airbrake.io/wp-content/uploads/2020/10/05222904/Square-white-A-on-Orange.png npmPackageName: '@backstage/plugin-airbrake' addedDate: '2022-01-10' diff --git a/microsite/data/plugins/analytics-module-ga.yaml b/microsite/data/plugins/analytics-module-ga.yaml index 54dea6454a..968b1831ab 100644 --- a/microsite/data/plugins/analytics-module-ga.yaml +++ b/microsite/data/plugins/analytics-module-ga.yaml @@ -4,7 +4,7 @@ author: Spotify authorUrl: https://github.com/spotify category: Monitoring description: Track usage of your Backstage instance using Google Analytics. -documentation: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-ga/README.md iconUrl: /img/ga-icon.png npmPackageName: '@backstage/plugin-analytics-module-ga' addedDate: '2021-10-07' diff --git a/microsite/data/plugins/apollo-explorer.yaml b/microsite/data/plugins/apollo-explorer.yaml index 98008e3fc0..cebf36654e 100644 --- a/microsite/data/plugins/apollo-explorer.yaml +++ b/microsite/data/plugins/apollo-explorer.yaml @@ -4,7 +4,7 @@ author: unredundant authorUrl: https://github.com/unredundant category: Debugging description: Integrates Apollo Explorer graphs as a tool to browse GraphQL API endpoints inside Backstage. -documentation: https://github.com/backstage/backstage/blob/master/plugins/apollo-explorer/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/apollo-explorer/plugins/apollo-explorer/README.md iconUrl: /img/apollo-explorer.png npmPackageName: '@backstage/plugin-apollo-explorer' addedDate: '2022-07-20' diff --git a/microsite/data/plugins/azure-pipelines.yaml b/microsite/data/plugins/azure-pipelines.yaml index 5b719a4248..e0e3534fdb 100644 --- a/microsite/data/plugins/azure-pipelines.yaml +++ b/microsite/data/plugins/azure-pipelines.yaml @@ -4,7 +4,7 @@ author: Keyloop authorUrl: https://keyloop.com/ category: CI/CD description: Easily view your Azure Pipelines within the Software Catalog -documentation: https://github.com/backstage/backstage/blob/master/plugins/azure-devops/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/azure-devops/plugins/azure-devops/README.md iconUrl: /img/azure-pipelines.svg npmPackageName: '@backstage/plugin-azure-devops' addedDate: '2021-12-22' diff --git a/microsite/data/plugins/badges.yaml b/microsite/data/plugins/badges.yaml index 86d16ab547..789aaf155d 100644 --- a/microsite/data/plugins/badges.yaml +++ b/microsite/data/plugins/badges.yaml @@ -4,7 +4,7 @@ author: Andreas Stenius authorUrl: https://github.com/backstage/community category: Discovery description: The badges plugin offers a set of badges that can be used outside of Backstage, showing information related to data from the catalog. -documentation: https://github.com/backstage/backstage/blob/master/plugins/badges/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/badges/plugins/badges/README.md iconUrl: /img/badges.svg npmPackageName: '@backstage/plugin-badges' addedDate: '2021-09-29' diff --git a/microsite/data/plugins/bazaar.yaml b/microsite/data/plugins/bazaar.yaml index ce3a4d5dfc..1130822e77 100644 --- a/microsite/data/plugins/bazaar.yaml +++ b/microsite/data/plugins/bazaar.yaml @@ -3,7 +3,7 @@ author: Axis Communications AB authorUrl: https://www.axis.com category: Discovery description: A marketplace where engineers can propose projects suitable for inner sourcing -documentation: https://github.com/backstage/backstage/blob/master/plugins/bazaar/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/bazaar/plugins/bazaar/README.md iconUrl: /img/bazaar.svg npmPackageName: '@backstage/plugin-bazaar' addedDate: '2022-01-11' diff --git a/microsite/data/plugins/bitrise.yaml b/microsite/data/plugins/bitrise.yaml index 5e5b74f3ad..5cbfe5aabf 100644 --- a/microsite/data/plugins/bitrise.yaml +++ b/microsite/data/plugins/bitrise.yaml @@ -4,7 +4,7 @@ author: SDA SE authorUrl: https://sda.se/ category: CI/CD description: View Bitrise builds and download the build artifacts within Backstage. -documentation: https://github.com/backstage/backstage/blob/master/plugins/bitrise/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/bitrise/plugins/bitrise/README.md iconUrl: https://avatars.githubusercontent.com/u/7174390?s=400&v=4 npmPackageName: '@backstage/plugin-bitrise' addedDate: '2021-03-01' diff --git a/microsite/data/plugins/firehydrant.yaml b/microsite/data/plugins/firehydrant.yaml index 8a1f122051..7aa00675b4 100644 --- a/microsite/data/plugins/firehydrant.yaml +++ b/microsite/data/plugins/firehydrant.yaml @@ -4,7 +4,7 @@ author: FireHydrant authorUrl: https://firehydrant.io/ category: Monitoring description: View service incidents information from FireHydrant, such as active incidents and incident metrics, directly within Backstage. -documentation: https://github.com/backstage/backstage/blob/master/plugins/firehydrant/README.md -iconUrl: https://raw.githubusercontent.com/backstage/backstage/master/plugins/firehydrant/doc/firehydrant_logo.png +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/firehydrant/plugins/firehydrant/README.md +iconUrl: https://github.com/backstage/community-plugins/blob/main/workspaces/firehydrant/plugins/firehydrant/doc/firehydrant_logo.png npmPackageName: '@backstage/plugin-firehydrant' addedDate: '2021-08-18' diff --git a/microsite/data/plugins/fossa.yaml b/microsite/data/plugins/fossa.yaml index e46228a848..a1a66eb7d6 100644 --- a/microsite/data/plugins/fossa.yaml +++ b/microsite/data/plugins/fossa.yaml @@ -4,7 +4,7 @@ author: SDA SE authorUrl: https://sda.se/ category: Quality description: View FOSSA license compliance of your components in Backstage. -documentation: https://github.com/backstage/backstage/blob/master/plugins/fossa/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/fossa/plugins/fossa/README.md iconUrl: https://avatars0.githubusercontent.com/u/9543448?s=400&v=4 npmPackageName: '@backstage/plugin-fossa' addedDate: '2020-12-10' diff --git a/microsite/data/plugins/github-codespaces.yaml b/microsite/data/plugins/github-codespaces.yaml index d846235bd6..043be3200b 100644 --- a/microsite/data/plugins/github-codespaces.yaml +++ b/microsite/data/plugins/github-codespaces.yaml @@ -5,7 +5,7 @@ authorUrl: https://github.com/adityasinghal26 category: Development description: Integrates GitHub Codespaces for a Backstage component with the Authenticated User. documentation: https://github.com/adityasinghal26/backstage-plugins/tree/main/plugins/github-codespaces -iconUrl: https://github.com/adityasinghal26/backstage-plugins/blob/00c9c00ba9acc3135014d6454ccf04f573195eef/plugins/github-codespaces/images/GitHubLogo.png +iconUrl: https://github.com/adityasinghal26/backstage-plugins/blob/main/plugins/github-codespaces/images/GitHubLogo.png npmPackageName: '@adityasinghal26/plugin-github-codespaces' tags: - github diff --git a/microsite/data/plugins/linguist.yaml b/microsite/data/plugins/linguist.yaml index d76936391c..fb8e88b747 100644 --- a/microsite/data/plugins/linguist.yaml +++ b/microsite/data/plugins/linguist.yaml @@ -4,7 +4,7 @@ author: Keyloop authorUrl: https://keyloop.com/ category: Metadata description: View the programming language break down for your entities within the Software Catalog -documentation: https://github.com/backstage/backstage/blob/master/plugins/linguist/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/linguist/plugins/linguist/README.md iconUrl: /img/linguist.svg npmPackageName: '@backstage/plugin-linguist' addedDate: '2023-06-17' diff --git a/microsite/data/plugins/newrelic-dashboard.yaml b/microsite/data/plugins/newrelic-dashboard.yaml index 420c506b35..e53285cca7 100644 --- a/microsite/data/plugins/newrelic-dashboard.yaml +++ b/microsite/data/plugins/newrelic-dashboard.yaml @@ -4,7 +4,7 @@ author: '@mufaddal7' authorUrl: https://github.com/mufaddal7 category: Monitoring description: Easily view your New Relic Dashboards in Backstage, via real-time snapshots of your dashboards -documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/newrelic-dashboard/plugins/newrelic-dashboard +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/newrelic/plugins/newrelic-dashboard/README.md iconUrl: https://newrelic.com/themes/custom/erno/assets/mediakit/new_relic_logo_vertical_white.svg npmPackageName: '@backstage-community/plugin-newrelic-dashboard' tags: diff --git a/microsite/data/plugins/octopus-deploy.yaml b/microsite/data/plugins/octopus-deploy.yaml index 1ed7439695..cfc5e2c9e5 100644 --- a/microsite/data/plugins/octopus-deploy.yaml +++ b/microsite/data/plugins/octopus-deploy.yaml @@ -4,7 +4,7 @@ author: jmezach authorUrl: https://jmezach.github.io/ category: CI/CD description: Easily view your Octopus Deploy releases within the Software Catalog -documentation: https://github.com/backstage/backstage/blob/master/plugins/octopus-deploy/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/octopus-deploy/plugins/octopus-deploy/README.md iconUrl: /img/octopus-deploy.svg npmPackageName: '@backstage/plugin-octopus-deploy' addedDate: '2023-02-24' diff --git a/microsite/data/plugins/opencost.yaml b/microsite/data/plugins/opencost.yaml index 950b0606a7..95973e3b0c 100644 --- a/microsite/data/plugins/opencost.yaml +++ b/microsite/data/plugins/opencost.yaml @@ -4,7 +4,7 @@ author: Matt Ray authorUrl: https://opencost.io category: Monitoring description: OpenCost provides cloud cost monitoring for your cloud native environments. -documentation: https://github.com/backstage/backstage/blob/master/plugins/opencost/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/opencost/plugins/opencost/README.md iconUrl: /img/opencost.png npmPackageName: '@backstage/plugin-opencost' addedDate: '2023-10-26' diff --git a/microsite/data/plugins/puppetdb.yaml b/microsite/data/plugins/puppetdb.yaml index d3b6bd2bcb..650d8318d3 100644 --- a/microsite/data/plugins/puppetdb.yaml +++ b/microsite/data/plugins/puppetdb.yaml @@ -4,7 +4,7 @@ author: TDabasinskas authorUrl: https://github.com/tdabasinskas category: Configuration Management description: Visualize resource information and Puppet facts from PuppetDB. -documentation: https://github.com/backstage/backstage/blob/master/plugins/puppetdb/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/puppetdb/plugins/puppetdb/README.md iconUrl: /img/puppet.png npmPackageName: '@backstage/plugin-puppetdb' tags: diff --git a/microsite/data/plugins/shortcuts.yaml b/microsite/data/plugins/shortcuts.yaml index 7c3f2c6d56..b420e28e2f 100644 --- a/microsite/data/plugins/shortcuts.yaml +++ b/microsite/data/plugins/shortcuts.yaml @@ -4,7 +4,7 @@ author: Spotify authorUrl: https://github.com/spotify category: Utility description: The shortcuts plugin allows a user to have easy access to pages within a Backstage app by storing them as "shortcuts" in the Sidebar. -documentation: https://github.com/backstage/backstage/blob/master/plugins/shortcuts/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/shortcuts/plugins/shortcuts/README.md iconUrl: /img/shortcuts.svg npmPackageName: '@backstage/plugin-shortcuts' addedDate: '2021-10-06' diff --git a/microsite/data/plugins/sonarqube.yaml b/microsite/data/plugins/sonarqube.yaml index f24441c46e..72c662e2fa 100644 --- a/microsite/data/plugins/sonarqube.yaml +++ b/microsite/data/plugins/sonarqube.yaml @@ -4,7 +4,7 @@ author: SDA SE authorUrl: https://sda.se/ category: Quality description: Components to display code quality metrics from SonarCloud and SonarQube. -documentation: https://github.com/backstage/backstage/blob/master/plugins/sonarqube/README.md +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/sonarqube/plugins/sonarqube/README.md iconUrl: /img/sonarqube-icon.svg npmPackageName: '@backstage/plugin-sonarqube' addedDate: '2020-11-03' diff --git a/microsite/data/plugins/stack-overflow.yaml b/microsite/data/plugins/stack-overflow.yaml index a5e2122f8a..b058ce90fe 100644 --- a/microsite/data/plugins/stack-overflow.yaml +++ b/microsite/data/plugins/stack-overflow.yaml @@ -4,7 +4,7 @@ author: Spotify authorUrl: https://github.com/spotify category: Discovery description: Provides Stack Overflow specific functionality that can be used in different ways (e.g. for homepage and search) to compose your Backstage App. -documentation: https://github.com/backstage/backstage/blob/master/plugins/stack-overflow +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/stack-overflow/plugins/stack-overflow/README.md iconUrl: /img/stack-overflow-logo.svg npmPackageName: '@backstage/plugin-stack-overflow' addedDate: '2022-06-14' From f6633ca8d233c7f63c65312095c80a43c964a835 Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Thu, 25 Apr 2024 08:48:08 +0300 Subject: [PATCH 14/44] feat: allow setting notification as read automatically when opening link Signed-off-by: Heikki Hellgren --- .changeset/young-guests-reflect.md | 5 +++++ plugins/notifications/api-report.md | 3 +++ .../NotificationsPage/NotificationsPage.tsx | 4 ++++ .../NotificationsTable/NotificationsTable.tsx | 14 ++++++++++++-- 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 .changeset/young-guests-reflect.md diff --git a/.changeset/young-guests-reflect.md b/.changeset/young-guests-reflect.md new file mode 100644 index 0000000000..355c38bc21 --- /dev/null +++ b/.changeset/young-guests-reflect.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications': patch +--- + +Add option to set the notification as read automatically when the notification link is opened diff --git a/plugins/notifications/api-report.md b/plugins/notifications/api-report.md index 8fbd148b6d..3699aa1bb0 100644 --- a/plugins/notifications/api-report.md +++ b/plugins/notifications/api-report.md @@ -80,6 +80,7 @@ export const NotificationsPage: ( // @public (undocumented) export type NotificationsPageProps = { + markAsReadOnLinkOpen?: boolean; title?: string; themeId?: string; subtitle?: string; @@ -110,6 +111,7 @@ export const NotificationsSidebarItem: (props?: { // @public (undocumented) export const NotificationsTable: ({ + markAsReadOnLinkOpen, isLoading, notifications, isUnread, @@ -127,6 +129,7 @@ export type NotificationsTableProps = Pick< TableProps, 'onPageChange' | 'onRowsPerPageChange' | 'page' | 'totalCount' > & { + markAsReadOnLinkOpen?: boolean; isLoading?: boolean; isUnread: boolean; notifications?: Notification_2[]; diff --git a/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx b/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx index f1dd9aba5f..d1dde185f2 100644 --- a/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx +++ b/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx @@ -43,6 +43,8 @@ const ThrottleDelayMs = 2000; /** @public */ export type NotificationsPageProps = { + /** Mark notification as read when opening the link it contains, defaults to false */ + markAsReadOnLinkOpen?: boolean; title?: string; themeId?: string; subtitle?: string; @@ -59,6 +61,7 @@ export const NotificationsPage = (props?: NotificationsPageProps) => { tooltip, type, typeLink, + markAsReadOnLinkOpen, } = props ?? {}; const [refresh, setRefresh] = React.useState(false); @@ -171,6 +174,7 @@ export const NotificationsPage = (props?: NotificationsPageProps) => { & { + markAsReadOnLinkOpen?: boolean; isLoading?: boolean; isUnread: boolean; notifications?: Notification[]; @@ -65,6 +66,7 @@ export type NotificationsTableProps = Pick< /** @public */ export const NotificationsTable = ({ + markAsReadOnLinkOpen, isLoading, notifications = [], isUnread, @@ -213,7 +215,14 @@ export const NotificationsTable = ({ {notification.payload.link ? ( - + { + if (markAsReadOnLinkOpen && !notification.read) { + onSwitchReadStatus([notification.id], true); + } + }} + > {notification.payload.title} ) : ( @@ -267,6 +276,7 @@ export const NotificationsTable = ({ }, ], [ + markAsReadOnLinkOpen, selectedNotifications, notifications, isUnread, From ba765801da0547f1d991d2f0569e76a7d0eef771 Mon Sep 17 00:00:00 2001 From: npiyush97 Date: Fri, 26 Apr 2024 22:52:06 +0530 Subject: [PATCH 15/44] microsite to v3 Signed-off-by: npiyush97 --- docs/publishing.md | 2 +- microsite/docusaurus.config.js | 349 --------------------------------- microsite/docusaurus.config.ts | 349 +++++++++++++++++++++++++++++++++ microsite/package.json | 6 +- microsite/tsconfig.json | 2 +- microsite/yarn.lock | 33 ++-- 6 files changed, 368 insertions(+), 373 deletions(-) delete mode 100644 microsite/docusaurus.config.js create mode 100644 microsite/docusaurus.config.ts diff --git a/docs/publishing.md b/docs/publishing.md index 29853955f1..d7a4f65008 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -52,7 +52,7 @@ Additional steps for the main line release - Create Release Notes PR - Add the release note file as [`/docs/releases/vx.y.0.md`](./releases) - Add an entry to [`/microsite/sidebar.json`](https://github.com/backstage/backstage/blob/master/microsite/sidebars.json) for the release note - - Update the navigation bar item in [`/microsite/docusaurus.config.js`](https://github.com/backstage/backstage/blob/master/microsite/docusaurus.config.js) to point to the new release note + - Update the navigation bar item in [`/microsite/docusaurus.config.ts`](https://github.com/backstage/backstage/blob/master/microsite/docusaurus.config.ts) to point to the new release note - Finally copy the content, without the metadata header, into the description of the [`Version Packages` Pull Request](https://github.com/backstage/backstage/pulls?q=is%3Aopen+is%3Apr+in%3Atitle+%22Version+Packages) Once the release has been published edit the newly created release in the [GitHub repository](https://github.com/backstage/backstage/releases) and replace the text content with the release notes. diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js deleted file mode 100644 index 1866deda5c..0000000000 --- a/microsite/docusaurus.config.js +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright 2022 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// @ts-check - -/** @type{import('prism-react-renderer').PrismTheme} **/ -// @ts-ignore -const prismTheme = require('prism-react-renderer/themes/vsDark'); -prismTheme.plain.backgroundColor = '#232323'; - -/** @type {import('@docusaurus/types').Config} */ -module.exports = { - title: 'Backstage Software Catalog and Developer Platform', - tagline: 'An open source framework for building developer portals', - url: 'https://backstage.io', - baseUrl: '/', - organizationName: 'Spotify', - projectName: 'backstage', - scripts: [ - 'https://buttons.github.io/buttons.js', - 'https://unpkg.com/medium-zoom@1.0.6/dist/medium-zoom.min.js', - '/js/medium-zoom.js', - '/js/dismissable-banner.js', - '/js/scroll-nav-to-view-in-docs.js', - ], - stylesheets: [ - 'https://fonts.googleapis.com/css?family=IBM+Plex+Mono:500,700&display=swap', - ], - favicon: 'img/favicon.ico', - customFields: { - fossWebsite: 'https://spotify.github.io/', - repoUrl: 'https://github.com/backstage/backstage', - }, - onBrokenLinks: 'log', - onBrokenMarkdownLinks: 'log', - presets: [ - [ - '@docusaurus/preset-classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - { - docs: { - editUrl: 'https://github.com/backstage/backstage/edit/master/docs/', - path: '../docs', - sidebarPath: 'sidebars.json', - }, - blog: { - path: 'blog', - }, - theme: { - customCss: 'src/theme/customTheme.scss', - }, - gtag: { - trackingID: 'G-KSEVGGNCJW', - }, - }, - ], - ], - markdown: { - preprocessor({ fileContent }) { - // Replace all HTML comments with empty strings as these are not supported by MDXv2. - return fileContent.replace(//gs, ''); - }, - format: 'detect', - }, - webpack: { - jsLoader: isServer => ({ - loader: require.resolve('swc-loader'), - options: { - jsc: { - parser: { - syntax: 'typescript', - tsx: true, - }, - target: 'es2017', - }, - module: { - type: isServer ? 'commonjs' : 'es6', - }, - }, - }), - }, - plugins: [ - 'docusaurus-plugin-sass', - () => ({ - name: 'yaml-loader', - configureWebpack() { - return { - module: { - rules: [ - { - test: /\.ya?ml$/, - use: 'yaml-loader', - }, - ], - }, - }; - }, - }), - [ - '@docusaurus/plugin-client-redirects', - { - redirects: [ - { - from: '/docs', - to: '/docs/overview/what-is-backstage', - }, - { - from: '/docs/features/software-catalog/software-catalog-overview', - to: '/docs/features/software-catalog/', - }, - { - from: '/docs/features/software-templates/software-templates-index', - to: '/docs/features/software-templates/', - }, - { - from: '/docs/features/techdocs/techdocs-overview', - to: '/docs/features/techdocs/', - }, - { - from: '/docs/features/kubernetes/overview', - to: '/docs/features/kubernetes/', - }, - { - from: '/docs/features/search/search-overview', - to: '/docs/features/search/', - }, - { - from: '/docs/getting-started/running-backstage-locally', - to: '/docs/getting-started/', - }, - { - from: '/docs/features/software-templates/testing-scaffolder-alpha', - to: '/docs/features/software-templates/migrating-to-rjsf-v5', - }, - { - from: '/docs/auth/glossary', - to: '/docs/references/glossary', - }, - { - from: '/docs/overview/glossary', - to: '/docs/references/glossary', - }, - { - from: '/docs/getting-started/create-an-app', - to: '/docs/getting-started/', - }, - { - from: '/docs/getting-started/configuration', - to: '/docs/getting-started/#next-steps', - }, - ], - }, - ], - [ - 'docusaurus-pushfeedback', - { - project: 'q8w1i6cair', - hideIcon: true, - customFont: true, - buttonStyle: 'dark', - }, - ], - ], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - { - colorMode: { - defaultMode: 'dark', - disableSwitch: true, - }, - navbar: { - logo: { - alt: 'Backstage Software Catalog and Developer Platform', - src: 'img/logo.svg', - }, - items: [ - { - href: 'https://github.com/backstage/backstage', - label: 'GitHub', - position: 'left', - }, - { - to: 'docs/overview/what-is-backstage', - label: 'Docs', - position: 'left', - }, - { - to: '/plugins', - label: 'Plugins', - position: 'left', - }, - { - to: '/blog', - label: 'Blog', - position: 'left', - }, - { - to: 'docs/releases/v1.26.0', - label: 'Releases', - position: 'left', - }, - { - to: '/demos', - label: 'Demos', - position: 'left', - }, - { - to: '/community', - label: 'Community', - position: 'left', - }, - ], - }, - image: 'img/sharing-opengraph.png', - footer: { - links: [ - { - items: [ - { - html: ` - - - `, - }, - ], - }, - { - title: 'Docs', - items: [ - { - label: 'What is Backstage?', - to: 'docs/overview/what-is-backstage', - }, - { - label: 'Getting started', - to: 'docs/getting-started/', - }, - { - label: 'Software Catalog', - to: 'docs/features/software-catalog/', - }, - { - label: 'Create a Plugin', - to: 'docs/plugins/create-a-plugin', - }, - { - label: 'Designing for Backstage', - to: 'docs/dls/design', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'Support chatroom', - to: 'https://discord.gg/backstage-687207715902193673', - }, - { - label: 'Contributing', - to: 'https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md', - }, - { - label: 'Adopting', - to: 'https://backstage.spotify.com', - }, - { - label: 'Subscribe to our newsletter', - to: 'https://info.backstage.spotify.com/newsletter_subscribe', - }, - { - label: 'CNCF Incubation', - to: 'https://www.cncf.io/projects/', - }, - ], - }, - { - title: 'More', - items: [ - { - label: 'Open Source @ Spotify', - to: 'https://spotify.github.io/', - }, - { - label: 'Spotify Engineering Blog', - to: 'https://engineering.atspotify.com/', - }, - { - label: 'Spotify for Developers', - to: 'https://developer.spotify.com/', - }, - { - label: 'GitHub', - to: 'https://github.com/backstage/', - }, - ], - }, - ], - copyright: - '

Made with ❤️ at Spotify

', - }, - algolia: { - apiKey: '1f0ba86672ccfc3576faa94583e5b318', - indexName: 'crawler_Backstage Docusaurus 2', - appId: 'JCMFNHCHI8', - searchParameters: {}, - }, - prism: { - theme: prismTheme, - // Supported languages: https://prismjs.com/#supported-languages - // Default languages: https://github.com/FormidableLabs/prism-react-renderer/blob/master/packages/generate-prism-languages/index.ts#L9-L23 - additionalLanguages: ['docker', 'bash'], - magicComments: [ - // Extend the default highlight class name - { - className: 'code-block-highlight-line', - line: 'highlight-next-line', - block: { start: 'highlight-start', end: 'highlight-end' }, - }, - { - className: 'code-block-add-line', - line: 'highlight-add-next-line', - block: { start: 'highlight-add-start', end: 'highlight-add-end' }, - }, - { - className: 'code-block-remove-line', - line: 'highlight-remove-next-line', - block: { - start: 'highlight-remove-start', - end: 'highlight-remove-end', - }, - }, - ], - }, - }, -}; diff --git a/microsite/docusaurus.config.ts b/microsite/docusaurus.config.ts new file mode 100644 index 0000000000..256784ddcc --- /dev/null +++ b/microsite/docusaurus.config.ts @@ -0,0 +1,349 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// @ts-check + +/** @type{import('prism-react-renderer').PrismTheme} **/ +// @ts-ignore +import { themes } from 'prism-react-renderer'; +import type * as Preset from '@docusaurus/preset-classic'; +import { Config } from '@docusaurus/types'; +const backstageTheme = themes.vsDark; +backstageTheme.plain.backgroundColor = '#232323'; + +const config: Config = { + title: 'Backstage Software Catalog and Developer Platform', + tagline: 'An open source framework for building developer portals', + url: 'https://backstage.io', + baseUrl: '/', + organizationName: 'Spotify', + projectName: 'backstage', + scripts: [ + 'https://buttons.github.io/buttons.js', + 'https://unpkg.com/medium-zoom@1.0.6/dist/medium-zoom.min.js', + '/js/medium-zoom.js', + '/js/dismissable-banner.js', + '/js/scroll-nav-to-view-in-docs.js', + ], + stylesheets: [ + 'https://fonts.googleapis.com/css?family=IBM+Plex+Mono:500,700&display=swap', + ], + favicon: 'img/favicon.ico', + customFields: { + fossWebsite: 'https://spotify.github.io/', + repoUrl: 'https://github.com/backstage/backstage', + }, + onBrokenLinks: 'log', + onBrokenMarkdownLinks: 'log', + presets: [ + [ + '@docusaurus/preset-classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + { + docs: { + editUrl: 'https://github.com/backstage/backstage/edit/master/docs/', + path: '../docs', + sidebarPath: 'sidebars.json', + }, + blog: { + path: 'blog', + }, + theme: { + customCss: 'src/theme/customTheme.scss', + }, + gtag: { + trackingID: 'G-KSEVGGNCJW', + }, + }, + ], + ], + markdown: { + preprocessor({ fileContent }) { + // Replace all HTML comments with empty strings as these are not supported by MDXv2. + return fileContent.replace(//gs, ''); + }, + format: 'detect', + }, + webpack: { + jsLoader: isServer => ({ + loader: require.resolve('swc-loader'), + options: { + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + target: 'es2017', + }, + module: { + type: isServer ? 'commonjs' : 'es6', + }, + }, + }), + }, + plugins: [ + 'docusaurus-plugin-sass', + () => ({ + name: 'yaml-loader', + configureWebpack() { + return { + module: { + rules: [ + { + test: /\.ya?ml$/, + use: 'yaml-loader', + }, + ], + }, + }; + }, + }), + [ + '@docusaurus/plugin-client-redirects', + { + redirects: [ + { + from: '/docs', + to: '/docs/overview/what-is-backstage', + }, + { + from: '/docs/features/software-catalog/software-catalog-overview', + to: '/docs/features/software-catalog/', + }, + { + from: '/docs/features/software-templates/software-templates-index', + to: '/docs/features/software-templates/', + }, + { + from: '/docs/features/techdocs/techdocs-overview', + to: '/docs/features/techdocs/', + }, + { + from: '/docs/features/kubernetes/overview', + to: '/docs/features/kubernetes/', + }, + { + from: '/docs/features/search/search-overview', + to: '/docs/features/search/', + }, + { + from: '/docs/getting-started/running-backstage-locally', + to: '/docs/getting-started/', + }, + { + from: '/docs/features/software-templates/testing-scaffolder-alpha', + to: '/docs/features/software-templates/migrating-to-rjsf-v5', + }, + { + from: '/docs/auth/glossary', + to: '/docs/references/glossary', + }, + { + from: '/docs/overview/glossary', + to: '/docs/references/glossary', + }, + { + from: '/docs/getting-started/create-an-app', + to: '/docs/getting-started/', + }, + { + from: '/docs/getting-started/configuration', + to: '/docs/getting-started/#next-steps', + }, + ], + }, + ], + [ + 'docusaurus-pushfeedback', + { + project: 'q8w1i6cair', + hideIcon: true, + customFont: true, + buttonStyle: 'dark', + }, + ], + ], + themeConfig: { + colorMode: { + defaultMode: 'dark', + disableSwitch: true, + }, + navbar: { + logo: { + alt: 'Backstage Software Catalog and Developer Platform', + src: 'img/logo.svg', + }, + items: [ + { + href: 'https://github.com/backstage/backstage', + label: 'GitHub', + position: 'left', + }, + { + to: 'docs/overview/what-is-backstage', + label: 'Docs', + position: 'left', + }, + { + to: '/plugins', + label: 'Plugins', + position: 'left', + }, + { + to: '/blog', + label: 'Blog', + position: 'left', + }, + { + to: 'docs/releases/v1.26.0', + label: 'Releases', + position: 'left', + }, + { + to: '/demos', + label: 'Demos', + position: 'left', + }, + { + to: '/community', + label: 'Community', + position: 'left', + }, + ], + }, + image: 'img/sharing-opengraph.png', + footer: { + links: [ + { + items: [ + { + html: ` + + + `, + }, + ], + }, + { + title: 'Docs', + items: [ + { + label: 'What is Backstage?', + to: 'docs/overview/what-is-backstage', + }, + { + label: 'Getting started', + to: 'docs/getting-started/', + }, + { + label: 'Software Catalog', + to: 'docs/features/software-catalog/', + }, + { + label: 'Create a Plugin', + to: 'docs/plugins/create-a-plugin', + }, + { + label: 'Designing for Backstage', + to: 'docs/dls/design', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Support chatroom', + to: 'https://discord.gg/backstage-687207715902193673', + }, + { + label: 'Contributing', + to: 'https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md', + }, + { + label: 'Adopting', + to: 'https://backstage.spotify.com', + }, + { + label: 'Subscribe to our newsletter', + to: 'https://info.backstage.spotify.com/newsletter_subscribe', + }, + { + label: 'CNCF Incubation', + to: 'https://www.cncf.io/projects/', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Open Source @ Spotify', + to: 'https://spotify.github.io/', + }, + { + label: 'Spotify Engineering Blog', + to: 'https://engineering.atspotify.com/', + }, + { + label: 'Spotify for Developers', + to: 'https://developer.spotify.com/', + }, + { + label: 'GitHub', + to: 'https://github.com/backstage/', + }, + ], + }, + ], + copyright: `

Made with ❤️ at Spotify

`, + }, + algolia: { + apiKey: '1f0ba86672ccfc3576faa94583e5b318', + indexName: 'crawler_Backstage Docusaurus 2', + appId: 'JCMFNHCHI8', + searchParameters: {}, + }, + prism: { + theme: backstageTheme, + // Supported languages: https://prismjs.com/#supported-languages + // Default languages: https://github.com/FormidableLabs/prism-react-renderer/blob/master/packages/generate-prism-languages/index.ts#L9-L23 + additionalLanguages: ['docker', 'bash'], + magicComments: [ + // Extend the default highlight class name + { + className: 'code-block-highlight-line', + line: 'highlight-next-line', + block: { start: 'highlight-start', end: 'highlight-end' }, + }, + { + className: 'code-block-add-line', + line: 'highlight-add-next-line', + block: { start: 'highlight-add-start', end: 'highlight-add-end' }, + }, + { + className: 'code-block-remove-line', + line: 'highlight-remove-next-line', + block: { + start: 'highlight-remove-start', + end: 'highlight-remove-end', + }, + }, + ], + }, + } satisfies Preset.ThemeConfig, +}; +export default config; diff --git a/microsite/package.json b/microsite/package.json index 1be5272286..edc4c08612 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -22,12 +22,14 @@ "@docusaurus/core": "^3.1.1", "@docusaurus/plugin-client-redirects": "^3.1.1", "@docusaurus/preset-classic": "^3.1.1", + "@docusaurus/types": "^3.1.1", + "@mdx-js/react": "^3.0.0", "@swc/core": "^1.3.46", "clsx": "^2.0.0", "docusaurus-plugin-sass": "^0.2.3", "docusaurus-pushfeedback": "^1.0.0", "luxon": "^3.0.0", - "prism-react-renderer": "^1.3.5", + "prism-react-renderer": "^2.1.0", "react": "^18.0.0", "react-dom": "^18.0.0", "sass": "^1.57.1", @@ -35,8 +37,8 @@ }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.1.1", + "@docusaurus/tsconfig": "^3.1.1", "@spotify/prettier-config": "^15.0.0", - "@tsconfig/docusaurus": "^2.0.0", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.18.0", "js-yaml": "^4.1.0", diff --git a/microsite/tsconfig.json b/microsite/tsconfig.json index ae8fe2298a..71bc403643 100644 --- a/microsite/tsconfig.json +++ b/microsite/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@tsconfig/docusaurus/tsconfig.json", + "extends": "@docusaurus/tsconfig", "compilerOptions": { "baseUrl": ".", "types": [ diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 259bbca7b0..3ca3e2837a 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2160,7 +2160,14 @@ __metadata: languageName: node linkType: hard -"@docusaurus/types@npm:3.2.1": +"@docusaurus/tsconfig@npm:^3.1.1": + version: 3.2.1 + resolution: "@docusaurus/tsconfig@npm:3.2.1" + checksum: ea3c28b79b0de069c50f7b3a67d3ff682b6ded2ef02d2c7a4c2eaeddc8fcf79c9d9f5e60fbd2966cf3d247fbb8f63897b80a61fdd8b485c745a12eb684ae241a + languageName: node + linkType: hard + +"@docusaurus/types@npm:3.2.1, @docusaurus/types@npm:^3.1.1": version: 3.2.1 resolution: "@docusaurus/types@npm:3.2.1" dependencies: @@ -2842,13 +2849,6 @@ __metadata: languageName: node linkType: hard -"@tsconfig/docusaurus@npm:^2.0.0": - version: 2.0.3 - resolution: "@tsconfig/docusaurus@npm:2.0.3" - checksum: d8245a64bf131daa0c287649cb9c37ad8fecb2aedea18e15047e0df6463916e5012af3755bd73ecf90999ace1f14a3748a8b3e041d5158e2a85c22a539c649c9 - languageName: node - linkType: hard - "@types/acorn@npm:^4.0.0": version: 4.0.6 resolution: "@types/acorn@npm:4.0.6" @@ -3847,9 +3847,11 @@ __metadata: "@docusaurus/module-type-aliases": ^3.1.1 "@docusaurus/plugin-client-redirects": ^3.1.1 "@docusaurus/preset-classic": ^3.1.1 + "@docusaurus/tsconfig": ^3.1.1 + "@docusaurus/types": ^3.1.1 + "@mdx-js/react": ^3.0.0 "@spotify/prettier-config": ^15.0.0 "@swc/core": ^1.3.46 - "@tsconfig/docusaurus": ^2.0.0 "@types/luxon": ^3.0.0 "@types/webpack-env": ^1.18.0 clsx: ^2.0.0 @@ -3858,7 +3860,7 @@ __metadata: js-yaml: ^4.1.0 luxon: ^3.0.0 prettier: ^2.6.2 - prism-react-renderer: ^1.3.5 + prism-react-renderer: ^2.1.0 react: ^18.0.0 react-dom: ^18.0.0 sass: ^1.57.1 @@ -9583,16 +9585,7 @@ __metadata: languageName: node linkType: hard -"prism-react-renderer@npm:^1.3.5": - version: 1.3.5 - resolution: "prism-react-renderer@npm:1.3.5" - peerDependencies: - react: ">=0.14.9" - checksum: c18806dcbc4c0b4fd6fd15bd06b4f7c0a6da98d93af235c3e970854994eb9b59e23315abb6cfc29e69da26d36709a47e25da85ab27fed81b6812f0a52caf6dfa - languageName: node - linkType: hard - -"prism-react-renderer@npm:^2.3.0": +"prism-react-renderer@npm:^2.1.0, prism-react-renderer@npm:^2.3.0": version: 2.3.1 resolution: "prism-react-renderer@npm:2.3.1" dependencies: From cfacb71538028155f94961b303e4f60d32b1d2b7 Mon Sep 17 00:00:00 2001 From: npiyush97 Date: Fri, 26 Apr 2024 23:01:58 +0530 Subject: [PATCH 16/44] recommeded codeql fix Signed-off-by: npiyush97 --- microsite/docusaurus.config.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/microsite/docusaurus.config.ts b/microsite/docusaurus.config.ts index 256784ddcc..e2ae4ab338 100644 --- a/microsite/docusaurus.config.ts +++ b/microsite/docusaurus.config.ts @@ -73,7 +73,15 @@ const config: Config = { markdown: { preprocessor({ fileContent }) { // Replace all HTML comments with empty strings as these are not supported by MDXv2. - return fileContent.replace(//gs, ''); + function removeHtmlComments(input) { + let previous; + do { + previous = input; + input = input.replace(//gs, ''); } while (input !== previous); return input; } From d541ff686f828c9b7a18e447e2dc81359f5918fe Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Thu, 2 May 2024 08:11:35 +0300 Subject: [PATCH 44/44] fix: email processor esm issue with p-throttle + config read Signed-off-by: Heikki Hellgren --- .changeset/cyan-eagles-hammer.md | 6 ++++++ .github/renovate.json5 | 4 ++++ .../notifications-backend-module-email/package.json | 2 +- .../processor/NotificationsEmailProcessor.test.ts | 12 ++++++------ .../src/processor/NotificationsEmailProcessor.ts | 2 +- yarn.lock | 10 +++++----- 6 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 .changeset/cyan-eagles-hammer.md diff --git a/.changeset/cyan-eagles-hammer.md b/.changeset/cyan-eagles-hammer.md new file mode 100644 index 0000000000..dfe6f0bc62 --- /dev/null +++ b/.changeset/cyan-eagles-hammer.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-notifications-backend-module-email': patch +'@backstage/plugin-notifications-backend': patch +--- + +Fixed email processor `esm` issue and config reading diff --git a/.github/renovate.json5 b/.github/renovate.json5 index a9cb54912a..1c8d611c49 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -62,6 +62,10 @@ matchPackageNames: ['p-limit'], allowedVersions: '<4.0.0', }, + { + matchPackageNames: ['p-throttle'], + allowedVersions: '<4.0.0', + }, { matchPackageNames: ['p-queue'], allowedVersions: '<7.0.0', diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index 94b5e10578..bb99d9cb97 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -45,7 +45,7 @@ "@backstage/types": "workspace:^", "lodash": "^4.17.21", "nodemailer": "^6.9.13", - "p-throttle": "^6.1.0" + "p-throttle": "^4.1.1" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts index 3af1e498ca..11eef9b999 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts @@ -52,7 +52,7 @@ describe('NotificationsEmailProcessor', () => { notifications: { processors: { email: { - transport: { + transportConfig: { transport: 'smtp', hostname: 'localhost', port: 465, @@ -98,7 +98,7 @@ describe('NotificationsEmailProcessor', () => { notifications: { processors: { email: { - transport: { + transportConfig: { transport: 'ses', region: 'us-west-2', }, @@ -138,7 +138,7 @@ describe('NotificationsEmailProcessor', () => { notifications: { processors: { email: { - transport: { + transportConfig: { transport: 'sendmail', path: '/usr/local/bin/sendmail', }, @@ -189,7 +189,7 @@ describe('NotificationsEmailProcessor', () => { notifications: { processors: { email: { - transport: { + transportConfig: { transport: 'sendmail', path: '/usr/local/bin/sendmail', }, @@ -246,7 +246,7 @@ describe('NotificationsEmailProcessor', () => { notifications: { processors: { email: { - transport: { + transportConfig: { transport: 'sendmail', path: '/usr/local/bin/sendmail', }, @@ -306,7 +306,7 @@ describe('NotificationsEmailProcessor', () => { notifications: { processors: { email: { - transport: { + transportConfig: { transport: 'sendmail', path: '/usr/local/bin/sendmail', }, diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts index 5387d09c3d..ce944d9592 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts @@ -62,7 +62,7 @@ export class NotificationsEmailProcessor implements NotificationProcessor { const emailProcessorConfig = config.getConfig( 'notifications.processors.email', ); - this.transportConfig = emailProcessorConfig.getConfig('transport'); + this.transportConfig = emailProcessorConfig.getConfig('transportConfig'); this.broadcastConfig = emailProcessorConfig.getOptionalConfig('broadcastConfig'); this.sender = emailProcessorConfig.getString('sender'); diff --git a/yarn.lock b/yarn.lock index 3cf5a79175..6b4def9d8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6193,7 +6193,7 @@ __metadata: "@types/nodemailer": ^6.4.14 lodash: ^4.17.21 nodemailer: ^6.9.13 - p-throttle: ^6.1.0 + p-throttle: ^4.1.1 languageName: unknown linkType: soft @@ -33449,10 +33449,10 @@ __metadata: languageName: node linkType: hard -"p-throttle@npm:^6.1.0": - version: 6.1.0 - resolution: "p-throttle@npm:6.1.0" - checksum: c1947cca8844564c3d86f8c09067add5e7398b87898cb1f1aea5c48d2c211590d039a316d28a4b0d95364ffa0213c01dff6bf71175c468eab0e381f77715dbdb +"p-throttle@npm:^4.1.1": + version: 4.1.1 + resolution: "p-throttle@npm:4.1.1" + checksum: fe8709f3c3b1da7c033479375c2c302e80c1a5d86449013afa7cd46d1dc210bc824a7e4a9d088e66d31987d00878c2b5491bb2fe76246d4d2fc9a1636f5f8298 languageName: node linkType: hard