From 9a9170047b628c59f1c7737e7c650465fbb35778 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Wed, 18 Jan 2023 14:32:00 -0800
Subject: [PATCH 001/511] Implementation for oauth2 authentication using a
redirect flow (without window popup) from frontend to backend API, followed
by a redirect back to the fronted. A localstorage provider token is added
before the redirect to the backend auth API.
During the subsequent front end refresh an asynchronous backstage session refresh is triggered when the provider token is put in localstorage. The session refresh will return a backstage authentication token if authentication succeeded during the previous backend auth API execution.
Addresses https://github.com/backstage/backstage/issues/9582
Signed-off-by: headphonejames
---
app-config.yaml | 1 +
packages/app-defaults/src/defaults/apis.ts | 8 +
packages/core-app-api/api-report.md | 2 +
packages/core-app-api/config.d.ts | 6 +
.../auth/atlassian/AtlassianAuth.ts | 2 +
.../auth/bitbucket/BitbucketAuth.ts | 3 +
.../implementations/auth/github/GithubAuth.ts | 3 +
.../implementations/auth/gitlab/GitlabAuth.ts | 3 +
.../implementations/auth/google/GoogleAuth.ts | 3 +
.../auth/microsoft/MicrosoftAuth.ts | 3 +
.../implementations/auth/oauth2/OAuth2.ts | 2 +
.../implementations/auth/okta/OktaAuth.ts | 3 +
.../auth/onelogin/OneLoginAuth.ts | 4 +
.../src/apis/implementations/auth/types.ts | 1 +
.../DefaultAuthConnector.test.ts | 35 ++
.../lib/AuthConnector/DefaultAuthConnector.ts | 31 +-
.../src/lib/AuthConnector/types.ts | 1 +
.../RefreshingAuthSessionManager.ts | 2 +-
.../OAuthRequestDialog/OAuthRequestDialog.tsx | 13 +-
.../src/layout/SignInPage/commonProvider.tsx | 9 +-
packages/core-plugin-api/api-report.md | 1 +
.../src/apis/definitions/auth.ts | 6 +-
plugins/auth-backend/api-report.md | 12 +-
.../src/lib/flow/authFlowHelpers.test.ts | 17 +
.../src/lib/flow/authFlowHelpers.ts | 8 +
plugins/auth-backend/src/lib/flow/index.ts | 6 +-
.../src/lib/oauth/OAuthAdapter.test.ts | 537 +++++++-----------
.../src/lib/oauth/OAuthAdapter.ts | 31 +-
plugins/auth-backend/src/lib/oauth/types.ts | 1 +
plugins/auth-backend/src/providers/types.ts | 2 +
plugins/auth-backend/src/service/router.ts | 4 +
31 files changed, 426 insertions(+), 334 deletions(-)
diff --git a/app-config.yaml b/app-config.yaml
index dd72051189..1d3bf31083 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -293,6 +293,7 @@ auth:
# path: my-sessions
environment: development
+ usePopup: false
### Providing an auth.session.secret will enable session support in the auth-backend
# session:
# secret: custom session secret
diff --git a/packages/app-defaults/src/defaults/apis.ts b/packages/app-defaults/src/defaults/apis.ts
index 3f5cfc1c58..9e71855714 100644
--- a/packages/app-defaults/src/defaults/apis.ts
+++ b/packages/app-defaults/src/defaults/apis.ts
@@ -131,6 +131,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
}),
}),
createApiFactory({
@@ -145,6 +146,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
}),
}),
createApiFactory({
@@ -160,6 +162,7 @@ export const apis = [
oauthRequestApi,
defaultScopes: ['read:user'],
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
}),
}),
createApiFactory({
@@ -174,6 +177,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
}),
}),
createApiFactory({
@@ -188,6 +192,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
}),
}),
createApiFactory({
@@ -202,6 +207,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
}),
}),
createApiFactory({
@@ -217,6 +223,7 @@ export const apis = [
oauthRequestApi,
defaultScopes: ['team'],
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
}),
}),
createApiFactory({
@@ -231,6 +238,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
+ usePopup: configApi.getOptionalBoolean('auth.usePopup'),
});
},
}),
diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md
index 133ac22e5b..aaaccb17de 100644
--- a/packages/core-app-api/api-report.md
+++ b/packages/core-app-api/api-report.md
@@ -263,6 +263,7 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
+ usePopup?: boolean;
};
// @public
@@ -516,6 +517,7 @@ export type OneLoginAuthCreateOptions = {
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
+ usePopup?: boolean;
provider?: AuthProviderInfo;
};
diff --git a/packages/core-app-api/config.d.ts b/packages/core-app-api/config.d.ts
index ae876f7fe0..0dd73369f6 100644
--- a/packages/core-app-api/config.d.ts
+++ b/packages/core-app-api/config.d.ts
@@ -114,5 +114,11 @@ export interface Config {
* @visibility frontend
*/
environment?: string;
+ /**
+ $ The authentication flow type - either using a popup to authenticate or perform a http redirect
+ * default value: 'true'
+ * @visibility frontend
+ */
+ usePopup?: boolean;
};
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
index 07ebefca28..5582a29c00 100644
--- a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
@@ -34,6 +34,7 @@ export default class AtlassianAuth {
const {
discoveryApi,
environment = 'development',
+ usePopup = true,
provider = DEFAULT_PROVIDER,
oauthRequestApi,
} = options;
@@ -43,6 +44,7 @@ export default class AtlassianAuth {
oauthRequestApi,
provider,
environment,
+ usePopup,
});
}
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
index 7c5d4f3fc0..1d27eb1aa3 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
@@ -36,6 +36,7 @@ export type BitbucketAuthResponse = {
const DEFAULT_PROVIDER = {
id: 'bitbucket',
title: 'Bitbucket',
+ provider_id: 'bitbucket-auth-provider',
icon: () => null,
};
@@ -49,6 +50,7 @@ export default class BitbucketAuth {
const {
discoveryApi,
environment = 'development',
+ usePopup = true,
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['team'],
@@ -59,6 +61,7 @@ export default class BitbucketAuth {
oauthRequestApi,
provider,
environment,
+ usePopup,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
index 7efe4e95c6..11af9995a1 100644
--- a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
@@ -21,6 +21,7 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'github',
title: 'GitHub',
+ provider_id: 'github-auth-provider',
icon: () => null,
};
@@ -37,6 +38,7 @@ export default class GithubAuth {
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['read:user'],
+ usePopup = true,
} = options;
return OAuth2.create({
@@ -45,6 +47,7 @@ export default class GithubAuth {
provider,
environment,
defaultScopes,
+ usePopup,
});
}
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
index 00085de8ac..965d0431ac 100644
--- a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
@@ -21,6 +21,7 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'gitlab',
title: 'GitLab',
+ provider_id: 'gitlab-auth-provider',
icon: () => null,
};
@@ -34,6 +35,7 @@ export default class GitlabAuth {
const {
discoveryApi,
environment = 'development',
+ usePopup = true,
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['read_user'],
@@ -44,6 +46,7 @@ export default class GitlabAuth {
oauthRequestApi,
provider,
environment,
+ usePopup,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
index 8a528f4511..514b257ada 100644
--- a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
@@ -21,6 +21,7 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'google',
title: 'Google',
+ provider_id: 'google-auth-provider',
icon: () => null,
};
@@ -37,6 +38,7 @@ export default class GoogleAuth {
discoveryApi,
oauthRequestApi,
environment = 'development',
+ usePopup = true,
provider = DEFAULT_PROVIDER,
defaultScopes = [
'openid',
@@ -50,6 +52,7 @@ export default class GoogleAuth {
oauthRequestApi,
provider,
environment,
+ usePopup,
defaultScopes,
scopeTransform(scopes: string[]) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
index be5776609d..e988a79268 100644
--- a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
@@ -21,6 +21,7 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'microsoft',
title: 'Microsoft',
+ provider_id: 'microsoft-auth-provider',
icon: () => null,
};
@@ -33,6 +34,7 @@ export default class MicrosoftAuth {
static create(options: OAuthApiCreateOptions): typeof microsoftAuthApiRef.T {
const {
environment = 'development',
+ usePopup = true,
provider = DEFAULT_PROVIDER,
oauthRequestApi,
discoveryApi,
@@ -50,6 +52,7 @@ export default class MicrosoftAuth {
oauthRequestApi,
provider,
environment,
+ usePopup,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
index ad2d04cb56..a1d0c7d3a9 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
@@ -77,6 +77,7 @@ export default class OAuth2
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = [],
+ usePopup = true,
scopeTransform = x => x,
} = options;
@@ -85,6 +86,7 @@ export default class OAuth2
environment,
provider,
oauthRequestApi: oauthRequestApi,
+ usePopup,
sessionTransform(res: OAuth2Response): OAuth2Session {
return {
...res,
diff --git a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
index 42c0ddd0ed..db574e7fb2 100644
--- a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
@@ -21,6 +21,7 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'okta',
title: 'Okta',
+ provider_id: 'okta-auth-provider',
icon: () => null,
};
@@ -46,6 +47,7 @@ export default class OktaAuth {
const {
discoveryApi,
environment = 'development',
+ usePopup = true,
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['openid', 'email', 'profile', 'offline_access'],
@@ -56,6 +58,7 @@ export default class OktaAuth {
oauthRequestApi,
provider,
environment,
+ usePopup,
defaultScopes,
scopeTransform(scopes) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
index ea9e2cad28..d767cb6b55 100644
--- a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
@@ -30,12 +30,14 @@ export type OneLoginAuthCreateOptions = {
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
+ usePopup?: boolean;
provider?: AuthProviderInfo;
};
const DEFAULT_PROVIDER = {
id: 'onelogin',
title: 'onelogin',
+ provider_id: 'onelogin-auth-provider',
icon: () => null,
};
@@ -63,6 +65,7 @@ export default class OneLoginAuth {
const {
discoveryApi,
environment = 'development',
+ usePopup = true,
provider = DEFAULT_PROVIDER,
oauthRequestApi,
} = options;
@@ -72,6 +75,7 @@ export default class OneLoginAuth {
oauthRequestApi,
provider,
environment,
+ usePopup,
defaultScopes: ['openid', 'email', 'profile', 'offline_access'],
scopeTransform(scopes) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/types.ts b/packages/core-app-api/src/apis/implementations/auth/types.ts
index 55d6c19098..e29fe0c7d2 100644
--- a/packages/core-app-api/src/apis/implementations/auth/types.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/types.ts
@@ -37,4 +37,5 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
+ usePopup?: boolean;
};
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
index 2b132e09cd..113ee95bd0 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
@@ -34,8 +34,10 @@ const defaultOptions = {
provider: {
id: 'my-provider',
title: 'My Provider',
+ provider_id: 'myprovider-auth-provider',
icon: () => null,
},
+ usePopup: true,
oauthRequestApi: new MockOAuthApi(),
sessionTransform: ({ expiresInSeconds, ...res }: any) => ({
...res,
@@ -182,4 +184,37 @@ describe('DefaultAuthConnector', () => {
url: 'http://my-host/api/auth/my-provider/start?scope=-ab-&origin=http%3A%2F%2Flocalhost&env=production',
});
});
+
+ it('should redirect to api server', async () => {
+ const mockOauth = new MockOAuthApi();
+ const mockResponse = jest.fn();
+ // replace the window.location object
+ Object.defineProperty(window, 'location', {
+ value: {
+ hash: {
+ endsWith: mockResponse,
+ includes: mockResponse,
+ },
+ assign: mockResponse,
+ },
+ writable: true,
+ });
+ const helper = new DefaultAuthConnector({
+ ...defaultOptions,
+ usePopup: false,
+ oauthRequestApi: mockOauth,
+ });
+
+ const sessionPromise = helper.createSession({
+ scopes: new Set(['a', 'b']),
+ });
+
+ await mockOauth.triggerAll();
+
+ await expect(sessionPromise).resolves.toEqual({});
+ // redirect to the auth api
+ expect(window.location.href).toMatch(
+ 'http://my-host/api/auth/my-provider/start?scope=a%20b&authType=redirect&env=production',
+ );
+ });
});
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
index 988c9f17b1..acc6b97b2c 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
@@ -32,6 +32,10 @@ type Options = {
* Environment hint passed on to auth backend, for example 'production' or 'development'
*/
environment: string;
+ /**
+ * use a popup or a redirect for authentication with backend authentication api
+ */
+ usePopup: boolean;
/**
* Information about the auth provider to be shown to the user.
* The ID Must match the backend auth plugin configuration, for example 'google'.
@@ -77,12 +81,37 @@ export class DefaultAuthConnector
provider,
joinScopes = defaultJoinScopes,
oauthRequestApi,
+ usePopup,
sessionTransform = id => id,
} = options;
this.authRequester = oauthRequestApi.createAuthRequester({
provider,
- onAuthRequest: scopes => this.showPopup(scopes),
+ onAuthRequest: async scopes => {
+ if (!usePopup) {
+ // modal before redirect
+ const scope = this.joinScopesFunc(scopes);
+ const redirectUrl = await this.buildUrl('/start', {
+ scope,
+ origin: window.location.origin,
+ redirectUrl: window.location.href,
+ authType: 'redirect',
+ });
+
+ if (provider.hasOwnProperty('provider_id')) {
+ // set the sign in provider here
+ localStorage.setItem(
+ '@backstage/core:SignInPage:provider',
+ provider.provider_id!,
+ );
+ }
+
+ window.location.href = redirectUrl;
+ // we need to return to exit function or else popup occurs
+ return Promise.resolve({} as AuthSession);
+ }
+ return this.showPopup(scopes);
+ },
});
this.discoveryApi = discoveryApi;
diff --git a/packages/core-app-api/src/lib/AuthConnector/types.ts b/packages/core-app-api/src/lib/AuthConnector/types.ts
index 464a2ed627..7c4f19184e 100644
--- a/packages/core-app-api/src/lib/AuthConnector/types.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/types.ts
@@ -17,6 +17,7 @@
export type CreateSessionOptions = {
scopes: Set;
instantPopup?: boolean;
+ redirectUrl?: string;
};
/**
diff --git a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts
index d31f5e29bf..67d83bb36a 100644
--- a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts
+++ b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts
@@ -93,7 +93,7 @@ export class RefreshingAuthSessionManager implements SessionManager {
//
// We skip this check if an instant login popup is requested, as we need to
// stay in a synchronous call stack from the user interaction. The downside
- // is that that the user will sometimes be requested to log in even if they
+ // is that the user will sometimes be requested to log in even if they
// already had an existing session.
if (!this.currentSession && !options.instantPopup) {
try {
diff --git a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
index 02b1afe4a1..1884e6e358 100644
--- a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
+++ b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
@@ -24,7 +24,11 @@ import Button from '@material-ui/core/Button';
import React, { useMemo, useState } from 'react';
import useObservable from 'react-use/lib/useObservable';
import LoginRequestListItem from './LoginRequestListItem';
-import { useApi, oauthRequestApiRef } from '@backstage/core-plugin-api';
+import {
+ useApi,
+ oauthRequestApiRef,
+ configApiRef,
+} from '@backstage/core-plugin-api';
import Typography from '@material-ui/core/Typography';
export type OAuthRequestDialogClassKey =
@@ -58,6 +62,12 @@ export function OAuthRequestDialog(_props: {}) {
const classes = useStyles();
const [busy, setBusy] = useState(false);
const oauthRequestApi = useApi(oauthRequestApiRef);
+ const configApi = useApi(configApiRef);
+ const usePopup = configApi.getOptionalBoolean('auth.usePopup') ?? true;
+ const redirectMessage = usePopup
+ ? ''
+ : 'This will trigger a http redirect to OAuth Login.';
+
const requests = useObservable(
useMemo(() => oauthRequestApi.authRequest$(), [oauthRequestApi]),
[],
@@ -83,6 +93,7 @@ export function OAuthRequestDialog(_props: {}) {
Login Required
+ {redirectMessage}
diff --git a/packages/core-components/src/layout/SignInPage/commonProvider.tsx b/packages/core-components/src/layout/SignInPage/commonProvider.tsx
index 8f426a3907..aa458692dd 100644
--- a/packages/core-components/src/layout/SignInPage/commonProvider.tsx
+++ b/packages/core-components/src/layout/SignInPage/commonProvider.tsx
@@ -24,7 +24,7 @@ import {
SignInProvider,
SignInProviderConfig,
} from './types';
-import { useApi, errorApiRef } from '@backstage/core-plugin-api';
+import { useApi, errorApiRef, configApiRef } from '@backstage/core-plugin-api';
import { GridItem } from './styles';
import { ForwardedError } from '@backstage/errors';
import { UserIdentity } from './UserIdentity';
@@ -33,13 +33,18 @@ const Component: ProviderComponent = ({ config, onSignInSuccess }) => {
const { apiRef, title, message } = config as SignInProviderConfig;
const authApi = useApi(apiRef);
const errorApi = useApi(errorApiRef);
+ const configApi = useApi(configApiRef);
+ const usePopup = configApi.getOptionalBoolean('auth.usePopup') ?? true;
const handleLogin = async () => {
try {
const identityResponse = await authApi.getBackstageIdentity({
- instantPopup: true,
+ instantPopup: usePopup,
});
if (!identityResponse) {
+ if (!usePopup) {
+ return;
+ }
throw new Error(
`The ${title} provider is not configured to support sign-in`,
);
diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md
index dc7aa9eb5f..ecf615dd01 100644
--- a/packages/core-plugin-api/api-report.md
+++ b/packages/core-plugin-api/api-report.md
@@ -193,6 +193,7 @@ export type AuthProviderInfo = {
id: string;
title: string;
icon: IconComponent;
+ provider_id?: string;
};
// @public
diff --git a/packages/core-plugin-api/src/apis/definitions/auth.ts b/packages/core-plugin-api/src/apis/definitions/auth.ts
index 163ae74806..6ae19d53a6 100644
--- a/packages/core-plugin-api/src/apis/definitions/auth.ts
+++ b/packages/core-plugin-api/src/apis/definitions/auth.ts
@@ -54,6 +54,11 @@ export type AuthProviderInfo = {
* Icon for the auth provider.
*/
icon: IconComponent;
+
+ /**
+ * The provider id from the list of provider configured in the login page
+ */
+ provider_id?: string;
};
/**
@@ -285,7 +290,6 @@ export type SessionApi = {
* Sign out from the current session. This will reload the page.
*/
signOut(): Promise;
-
/**
* Observe the current state of the auth session. Emits the current state on subscription.
*/
diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md
index 88cb33863e..b272f81c2e 100644
--- a/plugins/auth-backend/api-report.md
+++ b/plugins/auth-backend/api-report.md
@@ -41,6 +41,7 @@ export type AuthProviderConfig = {
appUrl: string;
isOriginAllowed: (origin: string) => boolean;
cookieConfigurer?: CookieConfigurer;
+ isPopupAuthenticationRequest: boolean;
};
// @public (undocumented)
@@ -268,7 +269,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
handlers: OAuthHandlers,
options: Pick<
OAuthAdapterOptions,
- 'providerId' | 'persistScopes' | 'callbackUrl'
+ 'providerId' | 'persistScopes' | 'callbackUrl' | 'redirectUrl'
>,
): OAuthAdapter;
// (undocumented)
@@ -284,10 +285,12 @@ export type OAuthAdapterOptions = {
providerId: string;
persistScopes?: boolean;
appOrigin: string;
+ redirectUrl?: string;
baseUrl: string;
cookieConfigurer: CookieConfigurer;
isOriginAllowed: (origin: string) => boolean;
callbackUrl: string;
+ isPopupAuthenticationRequest: boolean;
};
// @public (undocumented)
@@ -385,6 +388,7 @@ export type OAuthState = {
env: string;
origin?: string;
scope?: string;
+ redirectUrl?: string;
};
// @public
@@ -667,6 +671,12 @@ export const providers: Readonly<{
// @public (undocumented)
export const readState: (stateString: string) => OAuthState;
+// @public (undocumented)
+export const redirectMessageResponse: (
+ res: express.Response,
+ redirectUrl: string,
+) => void;
+
// @public (undocumented)
export interface RouterOptions {
// (undocumented)
diff --git a/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts b/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts
index a0c437815d..868477506a 100644
--- a/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts
+++ b/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts
@@ -19,6 +19,7 @@ import {
safelyEncodeURIComponent,
ensuresXRequestedWith,
postMessageResponse,
+ redirectMessageResponse,
} from './authFlowHelpers';
import { WebMessageResponse } from './types';
@@ -178,6 +179,22 @@ describe('oauth helpers', () => {
});
});
+ describe('redirectMessageResponse', () => {
+ const redirectUrl = 'http://localhost:3000/catalog';
+ it('should perform redirect', () => {
+ const mockResponse = {
+ end: jest.fn().mockReturnThis(),
+ setHeader: jest.fn().mockReturnThis(),
+ redirect: jest.fn().mockReturnThis(),
+ } as unknown as express.Response;
+
+ redirectMessageResponse(mockResponse, redirectUrl);
+ expect(mockResponse.redirect).toHaveBeenCalledTimes(1);
+ expect(mockResponse.end).not.toHaveBeenCalled();
+ expect(mockResponse.setHeader).not.toHaveBeenCalled();
+ });
+ });
+
describe('ensuresXRequestedWith', () => {
it('should return false if no header present', () => {
const mockRequest = {
diff --git a/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts b/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts
index 94ac4fba15..08449fd923 100644
--- a/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts
+++ b/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts
@@ -69,6 +69,14 @@ export const postMessageResponse = (
res.end(``);
};
+/** @public */
+export const redirectMessageResponse = (
+ res: express.Response,
+ redirectUrl: string,
+) => {
+ res.redirect(redirectUrl);
+};
+
/** @public */
export const ensuresXRequestedWith = (req: express.Request) => {
const requiredHeader = req.header('X-Requested-With');
diff --git a/plugins/auth-backend/src/lib/flow/index.ts b/plugins/auth-backend/src/lib/flow/index.ts
index f7b4491edb..ebc3fe2ebe 100644
--- a/plugins/auth-backend/src/lib/flow/index.ts
+++ b/plugins/auth-backend/src/lib/flow/index.ts
@@ -14,6 +14,10 @@
* limitations under the License.
*/
-export { ensuresXRequestedWith, postMessageResponse } from './authFlowHelpers';
+export {
+ ensuresXRequestedWith,
+ postMessageResponse,
+ redirectMessageResponse,
+} from './authFlowHelpers';
export type { WebMessageResponse } from './types';
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
index e0d4f0e051..31d7e5aff5 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
@@ -74,6 +74,7 @@ describe('OAuthAdapter', () => {
providerId: 'test-provider',
appOrigin: 'http://localhost:3000',
baseUrl: 'http://domain.org/auth',
+ isPopupAuthenticationRequest: true,
cookieConfigurer: mockCookieConfigurer,
tokenIssuer: {
issueToken: async () => 'my-id-token',
@@ -83,56 +84,10 @@ describe('OAuthAdapter', () => {
callbackUrl: 'http://domain.org/auth/test-provider/handler/frame',
};
- it('sets the correct headers in start', async () => {
- const oauthProvider = new OAuthAdapter(
- providerInstance,
- oAuthProviderOptions,
- );
- const mockRequest = {
- query: {
- scope: 'user',
- env: 'development',
- },
- } as unknown as express.Request;
+ const defaultState = { nonce: 'nonce', env: 'development' };
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- statusCode: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- await oauthProvider.start(mockRequest, mockResponse);
- // nonce cookie checks
- expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
- expect(mockResponse.cookie).toHaveBeenCalledWith(
- `${oAuthProviderOptions.providerId}-nonce`,
- expect.any(String),
- expect.objectContaining({
- httpOnly: true,
- path: '/auth/test-provider/handler',
- maxAge: TEN_MINUTES_MS,
- domain: 'domain.org',
- sameSite: 'lax',
- secure: false,
- }),
- );
- // redirect checks
- expect(mockResponse.setHeader).toHaveBeenCalledTimes(2);
- expect(mockResponse.setHeader).toHaveBeenCalledWith('Location', '/url');
- expect(mockResponse.setHeader).toHaveBeenCalledWith('Content-Length', '0');
- expect(mockResponse.statusCode).toEqual(301);
- expect(mockResponse.end).toHaveBeenCalledTimes(1);
- });
-
- it('sets the refresh cookie if refresh is enabled', async () => {
- const oauthProvider = new OAuthAdapter(providerInstance, {
- ...oAuthProviderOptions,
- isOriginAllowed: () => false,
- });
-
- const state = { nonce: 'nonce', env: 'development' };
- const mockRequest = {
+ const createEncodedQueryMockRequest = (state: any) => {
+ return {
cookies: {
'test-provider-nonce': 'nonce',
},
@@ -140,12 +95,69 @@ describe('OAuthAdapter', () => {
state: encodeState(state),
},
} as unknown as express.Request;
+ };
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
+ const mockResponse = {
+ cookie: jest.fn().mockReturnThis(),
+ end: jest.fn().mockReturnThis(),
+ setHeader: jest.fn().mockReturnThis(),
+ statusCode: jest.fn().mockReturnThis(),
+ redirect: jest.fn().mockReturnThis(),
+ status: jest.fn().mockReturnThis(),
+ json: jest.fn().mockReturnThis(),
+ } as unknown as express.Response;
+
+ const mockStartRequest = {
+ query: {
+ scope: 'user',
+ env: 'development',
+ },
+ } as unknown as express.Request;
+
+ const expectedStartAuthCookieData = {
+ httpOnly: true,
+ path: '/auth/test-provider/handler',
+ maxAge: TEN_MINUTES_MS,
+ domain: 'domain.org',
+ sameSite: 'lax',
+ secure: false,
+ };
+
+ it('sets the correct headers in start', async () => {
+ const oauthProvider = new OAuthAdapter(
+ providerInstance,
+ oAuthProviderOptions,
+ );
+
+ await oauthProvider.start(mockStartRequest, mockResponse);
+ // nonce cookie checks
+ expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
+ expect(mockResponse.cookie).toHaveBeenCalledWith(
+ `${oAuthProviderOptions.providerId}-nonce`,
+ expect.any(String),
+ expect.objectContaining(expectedStartAuthCookieData),
+ );
+ expect(mockResponse.setHeader).toHaveBeenCalledTimes(2);
+ expect(mockResponse.setHeader).toHaveBeenCalledWith('Location', '/url');
+ expect(mockResponse.setHeader).toHaveBeenCalledWith('Content-Length', '0');
+ expect(mockResponse.statusCode).toEqual(301);
+ expect(mockResponse.end).toHaveBeenCalledTimes(1);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
+ });
+
+ const refreshCookieData = {
+ ...expectedStartAuthCookieData,
+ path: '/auth/test-provider',
+ maxAge: THOUSAND_DAYS_MS,
+ };
+
+ it('sets the refresh cookie if refresh is enabled', async () => {
+ const oauthProvider = new OAuthAdapter(providerInstance, {
+ ...oAuthProviderOptions,
+ isOriginAllowed: () => false,
+ });
+
+ const mockRequest = createEncodedQueryMockRequest(defaultState);
await oauthProvider.frameHandler(mockRequest, mockResponse);
expect(mockCookieConfigurer).toHaveBeenCalledTimes(1);
@@ -153,15 +165,22 @@ describe('OAuthAdapter', () => {
expect(mockResponse.cookie).toHaveBeenCalledWith(
expect.stringContaining('test-provider-refresh-token'),
expect.stringContaining('token'),
- expect.objectContaining({
- httpOnly: true,
- path: '/auth/test-provider',
- maxAge: THOUSAND_DAYS_MS,
- domain: 'domain.org',
- secure: false,
- sameSite: 'lax',
- }),
+ expect.objectContaining(refreshCookieData),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
+ });
+
+ it('sets the refresh cookie if refresh is enabled with redirect', async () => {
+ const oauthProvider = new OAuthAdapter(providerInstance, {
+ ...oAuthProviderOptions,
+ isOriginAllowed: () => false,
+ isPopupAuthenticationRequest: false,
+ });
+
+ const mockRequest = createEncodedQueryMockRequest(defaultState);
+
+ await oauthProvider.frameHandler(mockRequest, mockResponse);
+ expect(mockResponse.redirect).toHaveBeenCalledTimes(1);
});
it('persists scope through cookie if enabled', async () => {
@@ -179,32 +198,15 @@ describe('OAuthAdapter', () => {
});
// First we test the /start request, making sure state is set
- const mockStartReq = {
- query: {
- scope: 'user',
- env: 'development',
- },
- } as unknown as express.Request;
- const mockStartRes = {
- cookie: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- statusCode: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- await oauthProvider.start(mockStartReq, mockStartRes);
+ await oauthProvider.start(mockStartRequest, mockResponse);
expect(handlers.start).toHaveBeenCalledTimes(1);
expect(handlers.start).toHaveBeenCalledWith({
- query: {
- scope: 'user',
- env: 'development',
- },
+ ...mockStartRequest,
scope: 'user',
state: {
nonce: expect.any(String),
env: 'development',
- origin: undefined,
scope: 'user',
},
});
@@ -223,6 +225,7 @@ describe('OAuthAdapter', () => {
cookie: jest.fn().mockReturnThis(),
setHeader: jest.fn().mockReturnThis(),
end: jest.fn().mockReturnThis(),
+ redirect: jest.fn().mockReturnThis(),
} as unknown as express.Response;
await oauthProvider.frameHandler(mockHandleReq, mockHandleRes);
@@ -230,17 +233,11 @@ describe('OAuthAdapter', () => {
expect(mockHandleRes.cookie).toHaveBeenCalledWith(
'test-provider-granted-scope',
'user',
- expect.objectContaining({
- httpOnly: true,
- path: '/auth/test-provider',
- maxAge: THOUSAND_DAYS_MS,
- domain: 'domain.org',
- secure: false,
- sameSite: 'lax',
- }),
+ expect.objectContaining(refreshCookieData),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
- // Them make sure scopes are forwarded correctly during refresh
+ // Then make sure scopes are forwarded correctly during refresh
const mockRefreshReq = {
query: { scope: 'ignore-me' },
cookies: {
@@ -252,6 +249,7 @@ describe('OAuthAdapter', () => {
const mockRefreshRes = {
status: jest.fn().mockReturnThis(),
json: jest.fn().mockReturnThis(),
+ redirect: jest.fn().mockReturnThis(),
} as unknown as express.Response;
await oauthProvider.refresh(mockRefreshReq, mockRefreshRes);
expect(handlers.refresh).toHaveBeenCalledTimes(1);
@@ -261,8 +259,18 @@ describe('OAuthAdapter', () => {
refreshToken: 'refresh-token',
}),
);
+ expect(mockRefreshRes.redirect).not.toHaveBeenCalled();
});
+ const mockRequestWithHeader = {
+ header: () => 'XMLHttpRequest',
+ cookies: {
+ 'test-provider-refresh-token': 'token',
+ },
+ query: {},
+ get: jest.fn(),
+ } as unknown as express.Request;
+
it('removes refresh cookie and calls logout handler when logging out', async () => {
const logoutSpy = jest.spyOn(providerInstance, 'logout');
const oauthProvider = new OAuthAdapter(providerInstance, {
@@ -270,22 +278,8 @@ describe('OAuthAdapter', () => {
isOriginAllowed: () => false,
});
- const mockRequest = {
- cookies: {
- 'test-provider-refresh-token': 'token',
- },
- header: () => 'XMLHttpRequest',
- get: jest.fn(),
- } as unknown as express.Request;
-
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- status: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- await oauthProvider.logout(mockRequest, mockResponse);
- expect(mockRequest.get).toHaveBeenCalledTimes(1);
+ await oauthProvider.logout(mockRequestWithHeader, mockResponse);
+ expect(mockRequestWithHeader.get).toHaveBeenCalledTimes(1);
expect(logoutSpy).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledWith(
@@ -294,6 +288,7 @@ describe('OAuthAdapter', () => {
expect.objectContaining({ path: '/auth/test-provider' }),
);
expect(mockResponse.end).toHaveBeenCalledTimes(1);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
it('gets new access-token when refreshing', async () => {
@@ -302,20 +297,7 @@ describe('OAuthAdapter', () => {
isOriginAllowed: () => false,
});
- const mockRequest = {
- header: () => 'XMLHttpRequest',
- cookies: {
- 'test-provider-refresh-token': 'token',
- },
- query: {},
- } as unknown as express.Request;
-
- const mockResponse = {
- json: jest.fn().mockReturnThis(),
- status: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- await oauthProvider.refresh(mockRequest, mockResponse);
+ await oauthProvider.refresh(mockRequestWithHeader, mockResponse);
expect(mockResponse.json).toHaveBeenCalledTimes(1);
expect(mockResponse.json).toHaveBeenCalledWith({
...mockResponseData,
@@ -328,6 +310,7 @@ describe('OAuthAdapter', () => {
},
},
});
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
it('sets new access-token when old cookie exists', async () => {
@@ -337,20 +320,12 @@ describe('OAuthAdapter', () => {
});
const mockRequest = {
- header: () => 'XMLHttpRequest',
+ ...mockRequestWithHeader,
cookies: {
'test-provider-refresh-token': 'old-token',
},
- query: {},
- get: jest.fn(),
} as unknown as express.Request;
- const mockResponse = {
- json: jest.fn().mockReturnThis(),
- status: jest.fn().mockReturnThis(),
- cookie: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
await oauthProvider.refresh(mockRequest, mockResponse);
expect(mockRequest.get).toHaveBeenCalledTimes(1);
expect(mockCookieConfigurer).toHaveBeenCalledTimes(1);
@@ -358,15 +333,9 @@ describe('OAuthAdapter', () => {
expect(mockResponse.cookie).toHaveBeenCalledWith(
'test-provider-refresh-token',
'token',
- expect.objectContaining({
- httpOnly: true,
- path: '/auth/test-provider',
- maxAge: THOUSAND_DAYS_MS,
- domain: 'domain.org',
- secure: false,
- sameSite: 'lax',
- }),
+ expect.objectContaining(refreshCookieData),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
it('sets the correct nonce cookie configuration', async () => {
@@ -374,168 +343,97 @@ describe('OAuthAdapter', () => {
baseUrl: 'http://domain.org/auth',
appUrl: 'http://domain.org',
isOriginAllowed: () => false,
+ isPopupAuthenticationRequest: true,
};
const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, {
...oAuthProviderOptions,
});
- const mockRequest = {
- query: {
- scope: 'user',
- env: 'development',
- origin: 'http://domain.org',
- },
- } as unknown as express.Request;
-
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- statusCode: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- await oauthProvider.start(mockRequest, mockResponse);
+ await oauthProvider.start(mockStartRequest, mockResponse);
expect(mockCookieConfigurer).not.toHaveBeenCalled();
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledWith(
`${oAuthProviderOptions.providerId}-nonce`,
expect.any(String),
- expect.objectContaining({
- httpOnly: true,
- domain: 'domain.org',
- maxAge: TEN_MINUTES_MS,
- path: '/auth/test-provider/handler',
- secure: false,
- sameSite: 'lax',
- }),
+ expect.objectContaining(expectedStartAuthCookieData),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
- it('sets the correct nonce cookie configuration using origin from request', async () => {
- const config = {
- baseUrl: 'http://domain.org/auth',
- appUrl: 'http://domain.org',
- isOriginAllowed: () => false,
- };
+ const config = {
+ baseUrl: 'http://domain.org/auth',
+ appUrl: 'http://domain.org',
+ isOriginAllowed: () => false,
+ isPopupAuthenticationRequest: true,
+ };
+ const mockStartRequestWithOrigin = {
+ query: {
+ scope: 'user',
+ env: 'development',
+ origin: 'http://other.domain',
+ },
+ } as unknown as express.Request;
+
+ it('sets the correct nonce cookie configuration using origin from request', async () => {
const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, {
...oAuthProviderOptions,
callbackUrl: 'https://domain.org/auth/test-provider/handler/frame',
});
- const mockRequest = {
- query: {
- scope: 'user',
- env: 'development',
- origin: 'http://other.domain',
- },
- } as unknown as express.Request;
-
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- statusCode: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- await oauthProvider.start(mockRequest, mockResponse);
+ await oauthProvider.start(mockStartRequestWithOrigin, mockResponse);
expect(mockCookieConfigurer).not.toHaveBeenCalled();
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledWith(
`${oAuthProviderOptions.providerId}-nonce`,
expect.any(String),
expect.objectContaining({
- httpOnly: true,
- domain: 'domain.org',
- maxAge: TEN_MINUTES_MS,
- path: '/auth/test-provider/handler',
+ ...expectedStartAuthCookieData,
secure: true,
sameSite: 'none',
}),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
- it('sets the correct cookie configuration using an secure callbackUrl', async () => {
- const config = {
- baseUrl: 'https://domain.org/auth',
- appUrl: 'http://domain.org',
- isOriginAllowed: () => false,
- };
+ const secureCookieData = {
+ ...refreshCookieData,
+ secure: true,
+ sameSite: 'lax',
+ maxAge: THOUSAND_DAYS_MS,
+ };
+ it('sets the correct cookie configuration using an secure callbackUrl', async () => {
const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, {
...oAuthProviderOptions,
callbackUrl: 'https://domain.org/auth/test-provider/handler/frame',
});
- const state = {
- nonce: 'nonce',
- env: 'development',
- };
-
- const mockRequest = {
- cookies: {
- 'test-provider-nonce': 'nonce',
- },
- query: {
- state: encodeState(state),
- },
- } as unknown as express.Request;
-
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
+ const mockRequest = createEncodedQueryMockRequest(defaultState);
await oauthProvider.frameHandler(mockRequest, mockResponse);
expect(mockCookieConfigurer).not.toHaveBeenCalled();
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledWith(
expect.stringContaining('test-provider-refresh-token'),
expect.stringContaining('token'),
- expect.objectContaining({
- httpOnly: true,
- domain: 'domain.org',
- path: '/auth/test-provider',
- secure: true,
- sameSite: 'lax',
- }),
+ expect.objectContaining(secureCookieData),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
- it('sets the correct cookie configuration when on different domains and secure', async () => {
- const config = {
- baseUrl: 'https://domain.org/auth',
- appUrl: 'http://domain.org',
- isOriginAllowed: () => false,
- };
+ const secureSameSiteNoneCookieData = {
+ ...secureCookieData,
+ sameSite: 'none',
+ };
+ it('sets the correct cookie configuration when on different domains and secure', async () => {
const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, {
...oAuthProviderOptions,
callbackUrl: 'https://authdomain.org/auth/test-provider/handler/frame',
});
- const state = {
- nonce: 'nonce',
- env: 'development',
- };
-
- const mockRequest = {
- cookies: {
- 'test-provider-nonce': 'nonce',
- },
- query: {
- state: encodeState(state),
- },
- } as unknown as express.Request;
-
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
+ const mockRequest = createEncodedQueryMockRequest(defaultState);
await oauthProvider.frameHandler(mockRequest, mockResponse);
expect(mockCookieConfigurer).not.toHaveBeenCalled();
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
@@ -543,106 +441,109 @@ describe('OAuthAdapter', () => {
expect.stringContaining('test-provider-refresh-token'),
expect.stringContaining('token'),
expect.objectContaining({
- httpOnly: true,
+ ...secureSameSiteNoneCookieData,
domain: 'authdomain.org',
- path: '/auth/test-provider',
- secure: true,
- sameSite: 'none',
}),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
+ const configOriginAllowed = {
+ ...config,
+ isOriginAllowed: () => true,
+ };
+
it('sets the correct cookie configuration using origin from state', async () => {
- const config = {
- baseUrl: 'https://domain.org/auth',
- appUrl: 'http://domain.org',
- isOriginAllowed: () => true,
- };
+ const oauthProvider = OAuthAdapter.fromConfig(
+ configOriginAllowed,
+ providerInstance,
+ {
+ ...oAuthProviderOptions,
+ callbackUrl: 'https://domain.org/auth/test-provider/handler/frame',
+ },
+ );
- const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, {
- ...oAuthProviderOptions,
- callbackUrl: 'https://domain.org/auth/test-provider/handler/frame',
- });
-
- const state = {
- nonce: 'nonce',
- env: 'development',
+ const mockRequest = createEncodedQueryMockRequest({
+ ...defaultState,
origin: 'http://other.domain',
- };
-
- const mockRequest = {
- cookies: {
- 'test-provider-nonce': 'nonce',
- },
- query: {
- state: encodeState(state),
- },
- } as unknown as express.Request;
-
- const mockResponse = {
- cookie: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- end: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
+ });
await oauthProvider.frameHandler(mockRequest, mockResponse);
expect(mockCookieConfigurer).not.toHaveBeenCalled();
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledWith(
expect.stringContaining('test-provider-refresh-token'),
expect.stringContaining('token'),
- expect.objectContaining({
- httpOnly: true,
- domain: 'domain.org',
- path: '/auth/test-provider',
- secure: true,
- sameSite: 'none',
- }),
+ expect.objectContaining(secureSameSiteNoneCookieData),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
});
- it('sets the correct cookie configuration using origin from header', async () => {
- const config = {
- baseUrl: 'https://domain.org/auth',
- appUrl: 'http://domain.org',
- isOriginAllowed: () => false,
- };
+ const mockRequestWithGetMockReturn = {
+ header: () => 'XMLHttpRequest',
+ cookies: {
+ 'test-provider-refresh-token': 'old-token',
+ },
+ query: {},
+ get: jest.fn().mockReturnValue('http://other.domain'),
+ } as unknown as express.Request;
+ it('sets the correct cookie configuration using origin from header', async () => {
const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, {
...oAuthProviderOptions,
callbackUrl: 'https://domain.org/auth/test-provider/handler/frame',
});
- const mockRequest = {
- header: () => 'XMLHttpRequest',
- cookies: {
- 'test-provider-refresh-token': 'old-token',
- },
- query: {},
- get: jest.fn().mockReturnValue('http://other.domain'),
- } as unknown as express.Request;
-
- const mockResponse = {
- json: jest.fn().mockReturnThis(),
- status: jest.fn().mockReturnThis(),
- cookie: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- await oauthProvider.refresh(mockRequest, mockResponse);
- expect(mockRequest.get).toHaveBeenCalledTimes(1);
+ await oauthProvider.refresh(mockRequestWithGetMockReturn, mockResponse);
+ expect(mockRequestWithGetMockReturn.get).toHaveBeenCalledTimes(1);
expect(mockCookieConfigurer).not.toHaveBeenCalled();
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledWith(
'test-provider-refresh-token',
'token',
- expect.objectContaining({
- httpOnly: true,
- path: '/auth/test-provider',
- maxAge: THOUSAND_DAYS_MS,
- domain: 'domain.org',
- secure: true,
- sameSite: 'none',
- }),
+ expect.objectContaining(secureSameSiteNoneCookieData),
);
+ expect(mockResponse.redirect).not.toHaveBeenCalled();
+ });
+
+ it('executed a response redirect when isPopupAuthenticationRequest is false', async () => {
+ const handlers = {
+ start: jest.fn(async (_req: { state: OAuthState }) => ({
+ url: '/url',
+ status: 301,
+ })),
+ handler: jest.fn(async () => ({ response: mockResponseData })),
+ refresh: jest.fn(async () => ({ response: mockResponseData })),
+ };
+ const configWithNoPopupEnabled = {
+ ...configOriginAllowed,
+ isPopupAuthenticationRequest: false,
+ };
+ const oauthProvider = OAuthAdapter.fromConfig(
+ configWithNoPopupEnabled,
+ handlers,
+ {
+ ...oAuthProviderOptions,
+ callbackUrl: 'https://domain.org/auth/test-provider/handler/frame',
+ },
+ );
+
+ const state = {
+ ...defaultState,
+ origin: 'http://other.domain',
+ redirectUrl: 'http://domain.org',
+ };
+
+ const mockRequest = {
+ ...createEncodedQueryMockRequest(state),
+ get: jest.fn().mockReturnValue('http://other.domain'),
+ } as unknown as express.Request;
+
+ await oauthProvider.frameHandler(mockRequest, mockResponse);
+ expect(mockRequest.get).not.toHaveBeenCalled();
+ expect(mockResponse.end).not.toHaveBeenCalled();
+ expect(mockCookieConfigurer).not.toHaveBeenCalled();
+ expect(mockResponse.cookie).not.toHaveBeenCalled();
+ expect(mockResponse.redirect).toHaveBeenCalledTimes(1);
+ expect(mockResponse.redirect).toHaveBeenCalledWith('http://domain.org');
});
});
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
index 85104e9608..239e660298 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
@@ -33,7 +33,12 @@ import {
NotAllowedError,
} from '@backstage/errors';
import { defaultCookieConfigurer, readState, verifyNonce } from './helpers';
-import { postMessageResponse, ensuresXRequestedWith } from '../flow';
+import {
+ postMessageResponse,
+ redirectMessageResponse,
+ ensuresXRequestedWith,
+ WebMessageResponse,
+} from '../flow';
import {
OAuthHandlers,
OAuthStartRequest,
@@ -51,10 +56,12 @@ export type OAuthAdapterOptions = {
providerId: string;
persistScopes?: boolean;
appOrigin: string;
+ redirectUrl?: string;
baseUrl: string;
cookieConfigurer: CookieConfigurer;
isOriginAllowed: (origin: string) => boolean;
callbackUrl: string;
+ isPopupAuthenticationRequest: boolean;
};
/** @public */
@@ -64,10 +71,11 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
handlers: OAuthHandlers,
options: Pick<
OAuthAdapterOptions,
- 'providerId' | 'persistScopes' | 'callbackUrl'
+ 'providerId' | 'persistScopes' | 'callbackUrl' | 'redirectUrl'
>,
): OAuthAdapter {
- const { appUrl, baseUrl, isOriginAllowed } = config;
+ const { appUrl, baseUrl, isOriginAllowed, isPopupAuthenticationRequest } =
+ config;
const { origin: appOrigin } = new URL(appUrl);
const cookieConfigurer = config.cookieConfigurer ?? defaultCookieConfigurer;
@@ -78,6 +86,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
baseUrl,
cookieConfigurer,
isOriginAllowed,
+ isPopupAuthenticationRequest: isPopupAuthenticationRequest,
});
}
@@ -98,7 +107,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
const scope = req.query.scope?.toString() ?? '';
const env = req.query.env?.toString();
const origin = req.query.origin?.toString();
-
+ const redirectUrl = req.query.redirectUrl?.toString();
if (!env) {
throw new InputError('No env provided in request query parameters');
}
@@ -109,7 +118,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
// set a nonce cookie before redirecting to oauth provider
this.setNonceCookie(res, nonce, cookieConfig);
- const state: OAuthState = { nonce, env, origin };
+ const state: OAuthState = { nonce, env, origin, redirectUrl };
// If scopes are persisted then we pass them through the state so that we
// can set the cookie on successful auth
@@ -136,6 +145,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
try {
const state: OAuthState = readState(req.query.state?.toString() ?? '');
+ const redirectUrl = state.redirectUrl ?? '';
if (state.origin) {
try {
@@ -169,11 +179,16 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
const identity = await this.populateIdentity(response.backstageIdentity);
- // post message back to popup if successful
- return postMessageResponse(res, appOrigin, {
+ const responseObj: WebMessageResponse = {
type: 'authorization_response',
response: { ...response, backstageIdentity: identity },
- });
+ };
+
+ if (!this.options.isPopupAuthenticationRequest) {
+ return redirectMessageResponse(res, redirectUrl);
+ }
+ // post message back to popup if successful
+ return postMessageResponse(res, appOrigin, responseObj);
} catch (error) {
const { name, message } = isError(error)
? error
diff --git a/plugins/auth-backend/src/lib/oauth/types.ts b/plugins/auth-backend/src/lib/oauth/types.ts
index 3902c3f026..2b06e1f78b 100644
--- a/plugins/auth-backend/src/lib/oauth/types.ts
+++ b/plugins/auth-backend/src/lib/oauth/types.ts
@@ -90,6 +90,7 @@ export type OAuthState = {
env: string;
origin?: string;
scope?: string;
+ redirectUrl?: string;
};
/** @public */
diff --git a/plugins/auth-backend/src/providers/types.ts b/plugins/auth-backend/src/providers/types.ts
index 1459cff484..f70b639de9 100644
--- a/plugins/auth-backend/src/providers/types.ts
+++ b/plugins/auth-backend/src/providers/types.ts
@@ -131,6 +131,8 @@ export type AuthProviderConfig = {
* The function used to resolve cookie configuration based on the auth provider options.
*/
cookieConfigurer?: CookieConfigurer;
+
+ isPopupAuthenticationRequest: boolean;
};
/** @public */
diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts
index 8013777415..f19eb54a72 100644
--- a/plugins/auth-backend/src/service/router.ts
+++ b/plugins/auth-backend/src/service/router.ts
@@ -107,6 +107,9 @@ export async function createRouter(
...providerFactories,
};
const providersConfig = config.getConfig('auth.providers');
+ const isPopupAuthenticationRequest =
+ config.getOptionalBoolean('auth.usePopup') ?? true;
+
const configuredProviders = providersConfig.keys();
const isOriginAllowed = createOriginFilter(config);
@@ -123,6 +126,7 @@ export async function createRouter(
baseUrl: authUrl,
appUrl,
isOriginAllowed,
+ isPopupAuthenticationRequest: isPopupAuthenticationRequest,
},
config: providersConfig.getConfig(providerId),
logger,
From ae4d826fb215e7a6b2038cccf90970027a073bf6 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Fri, 3 Feb 2023 12:03:01 -0800
Subject: [PATCH 002/511] Updates to redirect implementation after initial PR
review.
Signed-off-by: headphonejames
---
app-config.yaml | 2 +-
packages/app-defaults/src/defaults/apis.ts | 16 +++---
packages/core-app-api/config.d.ts | 6 +-
.../OAuthRequestApi/OAuthRequestManager.ts | 6 ++
.../auth/atlassian/AtlassianAuth.ts | 4 +-
.../auth/bitbucket/BitbucketAuth.ts | 5 +-
.../implementations/auth/github/GithubAuth.ts | 5 +-
.../implementations/auth/gitlab/GitlabAuth.ts | 5 +-
.../implementations/auth/google/GoogleAuth.ts | 5 +-
.../auth/microsoft/MicrosoftAuth.ts | 5 +-
.../implementations/auth/oauth2/OAuth2.ts | 4 +-
.../implementations/auth/okta/OktaAuth.ts | 5 +-
.../auth/onelogin/OneLoginAuth.ts | 7 +--
.../src/apis/implementations/auth/types.ts | 2 +-
.../DefaultAuthConnector.test.ts | 40 +-------------
.../lib/AuthConnector/DefaultAuthConnector.ts | 55 +++++++++----------
.../src/lib/AuthConnector/types.ts | 1 -
.../OAuthRequestDialog/OAuthRequestDialog.tsx | 15 ++---
.../src/layout/SignInPage/commonProvider.tsx | 15 +++--
.../src/layout/SignInPage/providers.tsx | 7 +--
.../src/apis/definitions/OAuthRequestApi.ts | 10 ++++
.../src/apis/definitions/auth.ts | 5 --
.../src/lib/flow/authFlowHelpers.test.ts | 17 ------
.../src/lib/flow/authFlowHelpers.ts | 8 ---
.../src/lib/oauth/OAuthAdapter.test.ts | 16 +++---
.../src/lib/oauth/OAuthAdapter.ts | 13 ++---
plugins/auth-backend/src/lib/oauth/types.ts | 1 +
plugins/auth-backend/src/providers/types.ts | 2 -
plugins/auth-backend/src/service/router.ts | 3 -
29 files changed, 107 insertions(+), 178 deletions(-)
diff --git a/app-config.yaml b/app-config.yaml
index 1d3bf31083..350b9068e3 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -293,7 +293,7 @@ auth:
# path: my-sessions
environment: development
- usePopup: false
+ authFlow: redirect
### Providing an auth.session.secret will enable session support in the auth-backend
# session:
# secret: custom session secret
diff --git a/packages/app-defaults/src/defaults/apis.ts b/packages/app-defaults/src/defaults/apis.ts
index 9e71855714..feb4cd6cc8 100644
--- a/packages/app-defaults/src/defaults/apis.ts
+++ b/packages/app-defaults/src/defaults/apis.ts
@@ -131,7 +131,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -146,7 +146,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -162,7 +162,7 @@ export const apis = [
oauthRequestApi,
defaultScopes: ['read:user'],
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -177,7 +177,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -192,7 +192,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -207,7 +207,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -223,7 +223,7 @@ export const apis = [
oauthRequestApi,
defaultScopes: ['team'],
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -238,7 +238,7 @@ export const apis = [
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- usePopup: configApi.getOptionalBoolean('auth.usePopup'),
+ authFlow: configApi.getOptionalString('auth.authFlow'),
});
},
}),
diff --git a/packages/core-app-api/config.d.ts b/packages/core-app-api/config.d.ts
index 0dd73369f6..c499dfa7c6 100644
--- a/packages/core-app-api/config.d.ts
+++ b/packages/core-app-api/config.d.ts
@@ -115,10 +115,10 @@ export interface Config {
*/
environment?: string;
/**
- $ The authentication flow type - either using a popup to authenticate or perform a http redirect
- * default value: 'true'
+ $ The authentication flow type - currently supports 'popup' and 'redirect'
+ * default value: 'popup'
* @visibility frontend
*/
- usePopup?: boolean;
+ authFlow?: string;
};
}
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts
index 5d467be7b4..751f2bf24c 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts
@@ -37,8 +37,10 @@ export class OAuthRequestManager implements OAuthRequestApi {
private readonly subject = new BehaviorSubject([]);
private currentRequests: PendingOAuthRequest[] = [];
private handlerCount = 0;
+ private authFlowStr: string = 'popup';
createAuthRequester(options: OAuthRequesterOptions): OAuthRequester {
+ this.authFlowStr = options.authFlow;
const handler = new OAuthPendingRequests();
const index = this.handlerCount;
@@ -91,4 +93,8 @@ export class OAuthRequestManager implements OAuthRequestApi {
authRequest$(): Observable {
return this.subject;
}
+
+ authFlow(): string {
+ return this.authFlowStr;
+ }
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
index 5582a29c00..df714e2290 100644
--- a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
@@ -34,7 +34,7 @@ export default class AtlassianAuth {
const {
discoveryApi,
environment = 'development',
- usePopup = true,
+ authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
} = options;
@@ -44,7 +44,7 @@ export default class AtlassianAuth {
oauthRequestApi,
provider,
environment,
- usePopup,
+ authFlow,
});
}
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
index 1d27eb1aa3..3bdb09b010 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
@@ -36,7 +36,6 @@ export type BitbucketAuthResponse = {
const DEFAULT_PROVIDER = {
id: 'bitbucket',
title: 'Bitbucket',
- provider_id: 'bitbucket-auth-provider',
icon: () => null,
};
@@ -50,7 +49,7 @@ export default class BitbucketAuth {
const {
discoveryApi,
environment = 'development',
- usePopup = true,
+ authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['team'],
@@ -61,7 +60,7 @@ export default class BitbucketAuth {
oauthRequestApi,
provider,
environment,
- usePopup,
+ authFlow,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
index 11af9995a1..5acdd20719 100644
--- a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
@@ -21,7 +21,6 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'github',
title: 'GitHub',
- provider_id: 'github-auth-provider',
icon: () => null,
};
@@ -38,7 +37,7 @@ export default class GithubAuth {
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['read:user'],
- usePopup = true,
+ authFlow = 'popup',
} = options;
return OAuth2.create({
@@ -47,7 +46,7 @@ export default class GithubAuth {
provider,
environment,
defaultScopes,
- usePopup,
+ authFlow,
});
}
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
index 965d0431ac..919d67dd8d 100644
--- a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
@@ -21,7 +21,6 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'gitlab',
title: 'GitLab',
- provider_id: 'gitlab-auth-provider',
icon: () => null,
};
@@ -35,7 +34,7 @@ export default class GitlabAuth {
const {
discoveryApi,
environment = 'development',
- usePopup = true,
+ authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['read_user'],
@@ -46,7 +45,7 @@ export default class GitlabAuth {
oauthRequestApi,
provider,
environment,
- usePopup,
+ authFlow,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
index 514b257ada..e8adefb08f 100644
--- a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
@@ -21,7 +21,6 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'google',
title: 'Google',
- provider_id: 'google-auth-provider',
icon: () => null,
};
@@ -38,7 +37,7 @@ export default class GoogleAuth {
discoveryApi,
oauthRequestApi,
environment = 'development',
- usePopup = true,
+ authFlow = 'popup',
provider = DEFAULT_PROVIDER,
defaultScopes = [
'openid',
@@ -52,7 +51,7 @@ export default class GoogleAuth {
oauthRequestApi,
provider,
environment,
- usePopup,
+ authFlow,
defaultScopes,
scopeTransform(scopes: string[]) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
index e988a79268..c28e115950 100644
--- a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
@@ -21,7 +21,6 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'microsoft',
title: 'Microsoft',
- provider_id: 'microsoft-auth-provider',
icon: () => null,
};
@@ -34,7 +33,7 @@ export default class MicrosoftAuth {
static create(options: OAuthApiCreateOptions): typeof microsoftAuthApiRef.T {
const {
environment = 'development',
- usePopup = true,
+ authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
discoveryApi,
@@ -52,7 +51,7 @@ export default class MicrosoftAuth {
oauthRequestApi,
provider,
environment,
- usePopup,
+ authFlow,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
index a1d0c7d3a9..7a133154f2 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
@@ -77,7 +77,7 @@ export default class OAuth2
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = [],
- usePopup = true,
+ authFlow = 'popup',
scopeTransform = x => x,
} = options;
@@ -86,7 +86,7 @@ export default class OAuth2
environment,
provider,
oauthRequestApi: oauthRequestApi,
- usePopup,
+ authFlow,
sessionTransform(res: OAuth2Response): OAuth2Session {
return {
...res,
diff --git a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
index db574e7fb2..9075d8cb82 100644
--- a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
@@ -21,7 +21,6 @@ import { OAuthApiCreateOptions } from '../types';
const DEFAULT_PROVIDER = {
id: 'okta',
title: 'Okta',
- provider_id: 'okta-auth-provider',
icon: () => null,
};
@@ -47,7 +46,7 @@ export default class OktaAuth {
const {
discoveryApi,
environment = 'development',
- usePopup = true,
+ authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['openid', 'email', 'profile', 'offline_access'],
@@ -58,7 +57,7 @@ export default class OktaAuth {
oauthRequestApi,
provider,
environment,
- usePopup,
+ authFlow,
defaultScopes,
scopeTransform(scopes) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
index d767cb6b55..edfcbc4463 100644
--- a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
@@ -30,14 +30,13 @@ export type OneLoginAuthCreateOptions = {
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
- usePopup?: boolean;
+ authFlow?: string;
provider?: AuthProviderInfo;
};
const DEFAULT_PROVIDER = {
id: 'onelogin',
title: 'onelogin',
- provider_id: 'onelogin-auth-provider',
icon: () => null,
};
@@ -65,7 +64,7 @@ export default class OneLoginAuth {
const {
discoveryApi,
environment = 'development',
- usePopup = true,
+ authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
} = options;
@@ -75,7 +74,7 @@ export default class OneLoginAuth {
oauthRequestApi,
provider,
environment,
- usePopup,
+ authFlow: authFlow,
defaultScopes: ['openid', 'email', 'profile', 'offline_access'],
scopeTransform(scopes) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/types.ts b/packages/core-app-api/src/apis/implementations/auth/types.ts
index e29fe0c7d2..fdb2bbc7f8 100644
--- a/packages/core-app-api/src/apis/implementations/auth/types.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/types.ts
@@ -37,5 +37,5 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
- usePopup?: boolean;
+ authFlow?: string;
};
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
index 113ee95bd0..fd2a2833a8 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
@@ -34,16 +34,15 @@ const defaultOptions = {
provider: {
id: 'my-provider',
title: 'My Provider',
- provider_id: 'myprovider-auth-provider',
icon: () => null,
},
- usePopup: true,
oauthRequestApi: new MockOAuthApi(),
sessionTransform: ({ expiresInSeconds, ...res }: any) => ({
...res,
scopes: new Set(res.scopes.split(' ')),
expiresAt: new Date(Date.now() + expiresInSeconds * 1000),
}),
+ authFlow: 'popup',
};
describe('DefaultAuthConnector', () => {
@@ -133,7 +132,7 @@ describe('DefaultAuthConnector', () => {
expect(popupSpy).toHaveBeenCalledTimes(1);
expect(popupSpy.mock.calls[0][0]).toMatchObject({
- url: 'http://my-host/api/auth/my-provider/start?scope=a%20b&origin=http%3A%2F%2Flocalhost&env=production',
+ url: 'http://my-host/api/auth/my-provider/start?scope=a%20b&origin=http%3A%2F%2Flocalhost&authFlow=popup&env=production',
});
await expect(sessionPromise).resolves.toEqual({
@@ -181,40 +180,7 @@ describe('DefaultAuthConnector', () => {
expect(popupSpy).toHaveBeenCalledTimes(1);
expect(popupSpy.mock.calls[0][0]).toMatchObject({
- url: 'http://my-host/api/auth/my-provider/start?scope=-ab-&origin=http%3A%2F%2Flocalhost&env=production',
+ url: 'http://my-host/api/auth/my-provider/start?scope=-ab-&origin=http%3A%2F%2Flocalhost&authFlow=popup&env=production',
});
});
-
- it('should redirect to api server', async () => {
- const mockOauth = new MockOAuthApi();
- const mockResponse = jest.fn();
- // replace the window.location object
- Object.defineProperty(window, 'location', {
- value: {
- hash: {
- endsWith: mockResponse,
- includes: mockResponse,
- },
- assign: mockResponse,
- },
- writable: true,
- });
- const helper = new DefaultAuthConnector({
- ...defaultOptions,
- usePopup: false,
- oauthRequestApi: mockOauth,
- });
-
- const sessionPromise = helper.createSession({
- scopes: new Set(['a', 'b']),
- });
-
- await mockOauth.triggerAll();
-
- await expect(sessionPromise).resolves.toEqual({});
- // redirect to the auth api
- expect(window.location.href).toMatch(
- 'http://my-host/api/auth/my-provider/start?scope=a%20b&authType=redirect&env=production',
- );
- });
});
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
index acc6b97b2c..7cada8b0f9 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
@@ -32,10 +32,6 @@ type Options = {
* Environment hint passed on to auth backend, for example 'production' or 'development'
*/
environment: string;
- /**
- * use a popup or a redirect for authentication with backend authentication api
- */
- usePopup: boolean;
/**
* Information about the auth provider to be shown to the user.
* The ID Must match the backend auth plugin configuration, for example 'google'.
@@ -53,6 +49,10 @@ type Options = {
* Function used to transform an auth response into the session type.
*/
sessionTransform?(response: any): AuthSession | Promise;
+ /**
+ * The UI authentication flow with backend authentication api. Supports either 'popup' or 'redirect'.
+ */
+ authFlow: string;
};
function defaultJoinScopes(scopes: Set) {
@@ -73,6 +73,7 @@ export class DefaultAuthConnector
private readonly joinScopesFunc: (scopes: Set) => string;
private readonly authRequester: OAuthRequester;
private readonly sessionTransform: (response: any) => Promise;
+ private readonly authFlow: string;
constructor(options: Options) {
const {
@@ -81,39 +82,22 @@ export class DefaultAuthConnector
provider,
joinScopes = defaultJoinScopes,
oauthRequestApi,
- usePopup,
+ authFlow,
sessionTransform = id => id,
} = options;
this.authRequester = oauthRequestApi.createAuthRequester({
provider,
onAuthRequest: async scopes => {
- if (!usePopup) {
- // modal before redirect
- const scope = this.joinScopesFunc(scopes);
- const redirectUrl = await this.buildUrl('/start', {
- scope,
- origin: window.location.origin,
- redirectUrl: window.location.href,
- authType: 'redirect',
- });
-
- if (provider.hasOwnProperty('provider_id')) {
- // set the sign in provider here
- localStorage.setItem(
- '@backstage/core:SignInPage:provider',
- provider.provider_id!,
- );
- }
-
- window.location.href = redirectUrl;
- // we need to return to exit function or else popup occurs
- return Promise.resolve({} as AuthSession);
+ if (authFlow === 'popup') {
+ return this.showPopup(scopes);
}
- return this.showPopup(scopes);
+ return this.executeRedirect(scopes);
},
+ authFlow,
});
+ this.authFlow = authFlow;
this.discoveryApi = discoveryApi;
this.environment = environment;
this.provider = provider;
@@ -122,7 +106,7 @@ export class DefaultAuthConnector
}
async createSession(options: CreateSessionOptions): Promise {
- if (options.instantPopup) {
+ if (options.instantPopup && this.authFlow === 'popup') {
return this.showPopup(options.scopes);
}
return this.authRequester(options.scopes);
@@ -184,6 +168,7 @@ export class DefaultAuthConnector
const popupUrl = await this.buildUrl('/start', {
scope,
origin: window.location.origin,
+ authFlow: 'popup',
});
const payload = await showLoginPopup({
@@ -197,6 +182,20 @@ export class DefaultAuthConnector
return await this.sessionTransform(payload);
}
+ private async executeRedirect(scopes: Set): Promise {
+ const scope = this.joinScopesFunc(scopes);
+ const redirectUrl = await this.buildUrl('/start', {
+ scope,
+ origin: window.location.origin,
+ redirectUrl: window.location.href,
+ authFlow: 'redirect',
+ });
+ // redirect to auth api
+ window.location.href = redirectUrl;
+ // return a promise that never resolves
+ return new Promise(() => {});
+ }
+
private async buildUrl(
path: string,
query?: { [key: string]: string | boolean | undefined },
diff --git a/packages/core-app-api/src/lib/AuthConnector/types.ts b/packages/core-app-api/src/lib/AuthConnector/types.ts
index 7c4f19184e..464a2ed627 100644
--- a/packages/core-app-api/src/lib/AuthConnector/types.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/types.ts
@@ -17,7 +17,6 @@
export type CreateSessionOptions = {
scopes: Set;
instantPopup?: boolean;
- redirectUrl?: string;
};
/**
diff --git a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
index 1884e6e358..e68120298a 100644
--- a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
+++ b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
@@ -24,11 +24,7 @@ import Button from '@material-ui/core/Button';
import React, { useMemo, useState } from 'react';
import useObservable from 'react-use/lib/useObservable';
import LoginRequestListItem from './LoginRequestListItem';
-import {
- useApi,
- oauthRequestApiRef,
- configApiRef,
-} from '@backstage/core-plugin-api';
+import { useApi, oauthRequestApiRef } from '@backstage/core-plugin-api';
import Typography from '@material-ui/core/Typography';
export type OAuthRequestDialogClassKey =
@@ -62,11 +58,10 @@ export function OAuthRequestDialog(_props: {}) {
const classes = useStyles();
const [busy, setBusy] = useState(false);
const oauthRequestApi = useApi(oauthRequestApiRef);
- const configApi = useApi(configApiRef);
- const usePopup = configApi.getOptionalBoolean('auth.usePopup') ?? true;
- const redirectMessage = usePopup
- ? ''
- : 'This will trigger a http redirect to OAuth Login.';
+ const redirectMessage =
+ oauthRequestApi.authFlow() === 'popup'
+ ? ''
+ : 'This will trigger a http redirect to OAuth Login.';
const requests = useObservable(
useMemo(() => oauthRequestApi.authRequest$(), [oauthRequestApi]),
diff --git a/packages/core-components/src/layout/SignInPage/commonProvider.tsx b/packages/core-components/src/layout/SignInPage/commonProvider.tsx
index aa458692dd..6796e3f22d 100644
--- a/packages/core-components/src/layout/SignInPage/commonProvider.tsx
+++ b/packages/core-components/src/layout/SignInPage/commonProvider.tsx
@@ -24,27 +24,25 @@ import {
SignInProvider,
SignInProviderConfig,
} from './types';
-import { useApi, errorApiRef, configApiRef } from '@backstage/core-plugin-api';
+import { useApi, errorApiRef } from '@backstage/core-plugin-api';
import { GridItem } from './styles';
import { ForwardedError } from '@backstage/errors';
import { UserIdentity } from './UserIdentity';
+import { PROVIDER_STORAGE_KEY } from './providers';
const Component: ProviderComponent = ({ config, onSignInSuccess }) => {
- const { apiRef, title, message } = config as SignInProviderConfig;
+ const { apiRef, title, message, id } = config as SignInProviderConfig;
const authApi = useApi(apiRef);
const errorApi = useApi(errorApiRef);
- const configApi = useApi(configApiRef);
- const usePopup = configApi.getOptionalBoolean('auth.usePopup') ?? true;
const handleLogin = async () => {
try {
+ localStorage.setItem(PROVIDER_STORAGE_KEY, id);
const identityResponse = await authApi.getBackstageIdentity({
- instantPopup: usePopup,
+ instantPopup: true,
});
if (!identityResponse) {
- if (!usePopup) {
- return;
- }
+ localStorage.removeItem(PROVIDER_STORAGE_KEY);
throw new Error(
`The ${title} provider is not configured to support sign-in`,
);
@@ -60,6 +58,7 @@ const Component: ProviderComponent = ({ config, onSignInSuccess }) => {
}),
);
} catch (error) {
+ localStorage.removeItem(PROVIDER_STORAGE_KEY);
errorApi.post(new ForwardedError('Login failed', error));
}
};
diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx
index 23d6c95b3c..716befda17 100644
--- a/packages/core-components/src/layout/SignInPage/providers.tsx
+++ b/packages/core-components/src/layout/SignInPage/providers.tsx
@@ -32,7 +32,7 @@ import { guestProvider } from './guestProvider';
import { customProvider } from './customProvider';
import { IdentityApiSignOutProxy } from './IdentityApiSignOutProxy';
-const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider';
+export const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider';
export type SignInProviderType = {
[key: string]: {
@@ -134,6 +134,7 @@ export const useSignInProviders = (
.loader(apiHolder, provider.config?.apiRef!)
.then(result => {
if (didCancel) {
+ localStorage.removeItem(PROVIDER_STORAGE_KEY);
return;
}
if (result) {
@@ -143,10 +144,10 @@ export const useSignInProviders = (
}
})
.catch(error => {
+ localStorage.removeItem(PROVIDER_STORAGE_KEY);
if (didCancel) {
return;
}
- localStorage.removeItem(PROVIDER_STORAGE_KEY);
errorApi.post(error);
setLoading(false);
});
@@ -172,8 +173,6 @@ export const useSignInProviders = (
const { Component } = provider.components;
const handleSignInSuccess = (result: IdentityApi) => {
- localStorage.setItem(PROVIDER_STORAGE_KEY, provider.id);
-
handleWrappedResult(result);
};
diff --git a/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts b/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts
index 75bf3a3864..2027852de7 100644
--- a/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts
+++ b/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts
@@ -35,6 +35,11 @@ export type OAuthRequesterOptions = {
* trigger() is called on an auth requests.
*/
onAuthRequest(scopes: Set): Promise;
+
+ /**
+ * The authentication flow type
+ */
+ authFlow: string;
};
/**
@@ -119,6 +124,11 @@ export type OAuthRequestApi = {
* AuthRequester calls will resolve to the value returned by the onAuthRequest call.
*/
authRequest$(): Observable;
+
+ /**
+ * The authentication flow type
+ */
+ authFlow(): string;
};
/**
diff --git a/packages/core-plugin-api/src/apis/definitions/auth.ts b/packages/core-plugin-api/src/apis/definitions/auth.ts
index 6ae19d53a6..3ab8c98fee 100644
--- a/packages/core-plugin-api/src/apis/definitions/auth.ts
+++ b/packages/core-plugin-api/src/apis/definitions/auth.ts
@@ -54,11 +54,6 @@ export type AuthProviderInfo = {
* Icon for the auth provider.
*/
icon: IconComponent;
-
- /**
- * The provider id from the list of provider configured in the login page
- */
- provider_id?: string;
};
/**
diff --git a/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts b/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts
index 868477506a..a0c437815d 100644
--- a/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts
+++ b/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts
@@ -19,7 +19,6 @@ import {
safelyEncodeURIComponent,
ensuresXRequestedWith,
postMessageResponse,
- redirectMessageResponse,
} from './authFlowHelpers';
import { WebMessageResponse } from './types';
@@ -179,22 +178,6 @@ describe('oauth helpers', () => {
});
});
- describe('redirectMessageResponse', () => {
- const redirectUrl = 'http://localhost:3000/catalog';
- it('should perform redirect', () => {
- const mockResponse = {
- end: jest.fn().mockReturnThis(),
- setHeader: jest.fn().mockReturnThis(),
- redirect: jest.fn().mockReturnThis(),
- } as unknown as express.Response;
-
- redirectMessageResponse(mockResponse, redirectUrl);
- expect(mockResponse.redirect).toHaveBeenCalledTimes(1);
- expect(mockResponse.end).not.toHaveBeenCalled();
- expect(mockResponse.setHeader).not.toHaveBeenCalled();
- });
- });
-
describe('ensuresXRequestedWith', () => {
it('should return false if no header present', () => {
const mockRequest = {
diff --git a/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts b/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts
index 08449fd923..94ac4fba15 100644
--- a/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts
+++ b/plugins/auth-backend/src/lib/flow/authFlowHelpers.ts
@@ -69,14 +69,6 @@ export const postMessageResponse = (
res.end(``);
};
-/** @public */
-export const redirectMessageResponse = (
- res: express.Response,
- redirectUrl: string,
-) => {
- res.redirect(redirectUrl);
-};
-
/** @public */
export const ensuresXRequestedWith = (req: express.Request) => {
const requiredHeader = req.header('X-Requested-With');
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
index 31d7e5aff5..dd45ab5441 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
@@ -74,7 +74,6 @@ describe('OAuthAdapter', () => {
providerId: 'test-provider',
appOrigin: 'http://localhost:3000',
baseUrl: 'http://domain.org/auth',
- isPopupAuthenticationRequest: true,
cookieConfigurer: mockCookieConfigurer,
tokenIssuer: {
issueToken: async () => 'my-id-token',
@@ -174,10 +173,14 @@ describe('OAuthAdapter', () => {
const oauthProvider = new OAuthAdapter(providerInstance, {
...oAuthProviderOptions,
isOriginAllowed: () => false,
- isPopupAuthenticationRequest: false,
});
- const mockRequest = createEncodedQueryMockRequest(defaultState);
+ const state = {
+ ...defaultState,
+ redirectUrl: 'http://localhost:3000',
+ authFlow: 'redirect',
+ };
+ const mockRequest = createEncodedQueryMockRequest(state);
await oauthProvider.frameHandler(mockRequest, mockResponse);
expect(mockResponse.redirect).toHaveBeenCalledTimes(1);
@@ -343,7 +346,6 @@ describe('OAuthAdapter', () => {
baseUrl: 'http://domain.org/auth',
appUrl: 'http://domain.org',
isOriginAllowed: () => false,
- isPopupAuthenticationRequest: true,
};
const oauthProvider = OAuthAdapter.fromConfig(config, providerInstance, {
@@ -365,7 +367,6 @@ describe('OAuthAdapter', () => {
baseUrl: 'http://domain.org/auth',
appUrl: 'http://domain.org',
isOriginAllowed: () => false,
- isPopupAuthenticationRequest: true,
};
const mockStartRequestWithOrigin = {
@@ -505,7 +506,7 @@ describe('OAuthAdapter', () => {
expect(mockResponse.redirect).not.toHaveBeenCalled();
});
- it('executed a response redirect when isPopupAuthenticationRequest is false', async () => {
+ it('executed a response redirect when authFlow query string is set to "redirect"', async () => {
const handlers = {
start: jest.fn(async (_req: { state: OAuthState }) => ({
url: '/url',
@@ -516,7 +517,6 @@ describe('OAuthAdapter', () => {
};
const configWithNoPopupEnabled = {
...configOriginAllowed,
- isPopupAuthenticationRequest: false,
};
const oauthProvider = OAuthAdapter.fromConfig(
configWithNoPopupEnabled,
@@ -531,6 +531,7 @@ describe('OAuthAdapter', () => {
...defaultState,
origin: 'http://other.domain',
redirectUrl: 'http://domain.org',
+ authFlow: 'redirect',
};
const mockRequest = {
@@ -540,7 +541,6 @@ describe('OAuthAdapter', () => {
await oauthProvider.frameHandler(mockRequest, mockResponse);
expect(mockRequest.get).not.toHaveBeenCalled();
- expect(mockResponse.end).not.toHaveBeenCalled();
expect(mockCookieConfigurer).not.toHaveBeenCalled();
expect(mockResponse.cookie).not.toHaveBeenCalled();
expect(mockResponse.redirect).toHaveBeenCalledTimes(1);
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
index 239e660298..ac55fa8ad1 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
@@ -35,7 +35,6 @@ import {
import { defaultCookieConfigurer, readState, verifyNonce } from './helpers';
import {
postMessageResponse,
- redirectMessageResponse,
ensuresXRequestedWith,
WebMessageResponse,
} from '../flow';
@@ -61,7 +60,6 @@ export type OAuthAdapterOptions = {
cookieConfigurer: CookieConfigurer;
isOriginAllowed: (origin: string) => boolean;
callbackUrl: string;
- isPopupAuthenticationRequest: boolean;
};
/** @public */
@@ -74,8 +72,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
'providerId' | 'persistScopes' | 'callbackUrl' | 'redirectUrl'
>,
): OAuthAdapter {
- const { appUrl, baseUrl, isOriginAllowed, isPopupAuthenticationRequest } =
- config;
+ const { appUrl, baseUrl, isOriginAllowed } = config;
const { origin: appOrigin } = new URL(appUrl);
const cookieConfigurer = config.cookieConfigurer ?? defaultCookieConfigurer;
@@ -86,7 +83,6 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
baseUrl,
cookieConfigurer,
isOriginAllowed,
- isPopupAuthenticationRequest: isPopupAuthenticationRequest,
});
}
@@ -108,6 +104,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
const env = req.query.env?.toString();
const origin = req.query.origin?.toString();
const redirectUrl = req.query.redirectUrl?.toString();
+ const authFlow = req.query.authFlow?.toString();
if (!env) {
throw new InputError('No env provided in request query parameters');
}
@@ -118,7 +115,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
// set a nonce cookie before redirecting to oauth provider
this.setNonceCookie(res, nonce, cookieConfig);
- const state: OAuthState = { nonce, env, origin, redirectUrl };
+ const state: OAuthState = { nonce, env, origin, redirectUrl, authFlow };
// If scopes are persisted then we pass them through the state so that we
// can set the cookie on successful auth
@@ -184,8 +181,8 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
response: { ...response, backstageIdentity: identity },
};
- if (!this.options.isPopupAuthenticationRequest) {
- return redirectMessageResponse(res, redirectUrl);
+ if (state.authFlow === 'redirect') {
+ res.redirect(redirectUrl);
}
// post message back to popup if successful
return postMessageResponse(res, appOrigin, responseObj);
diff --git a/plugins/auth-backend/src/lib/oauth/types.ts b/plugins/auth-backend/src/lib/oauth/types.ts
index 2b06e1f78b..4cb7a94ffd 100644
--- a/plugins/auth-backend/src/lib/oauth/types.ts
+++ b/plugins/auth-backend/src/lib/oauth/types.ts
@@ -91,6 +91,7 @@ export type OAuthState = {
origin?: string;
scope?: string;
redirectUrl?: string;
+ authFlow?: string;
};
/** @public */
diff --git a/plugins/auth-backend/src/providers/types.ts b/plugins/auth-backend/src/providers/types.ts
index f70b639de9..1459cff484 100644
--- a/plugins/auth-backend/src/providers/types.ts
+++ b/plugins/auth-backend/src/providers/types.ts
@@ -131,8 +131,6 @@ export type AuthProviderConfig = {
* The function used to resolve cookie configuration based on the auth provider options.
*/
cookieConfigurer?: CookieConfigurer;
-
- isPopupAuthenticationRequest: boolean;
};
/** @public */
diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts
index f19eb54a72..9440a2c4ed 100644
--- a/plugins/auth-backend/src/service/router.ts
+++ b/plugins/auth-backend/src/service/router.ts
@@ -107,8 +107,6 @@ export async function createRouter(
...providerFactories,
};
const providersConfig = config.getConfig('auth.providers');
- const isPopupAuthenticationRequest =
- config.getOptionalBoolean('auth.usePopup') ?? true;
const configuredProviders = providersConfig.keys();
@@ -126,7 +124,6 @@ export async function createRouter(
baseUrl: authUrl,
appUrl,
isOriginAllowed,
- isPopupAuthenticationRequest: isPopupAuthenticationRequest,
},
config: providersConfig.getConfig(providerId),
logger,
From 167f457803168ab6d675d4e13aa3a0e52c9a906f Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Fri, 3 Feb 2023 12:18:50 -0800
Subject: [PATCH 003/511] fix missing code fixes from update after PR review.
Signed-off-by: headphonejames
---
.../implementations/OAuthRequestApi/MockOAuthApi.test.ts | 4 ++++
.../apis/implementations/OAuthRequestApi/MockOAuthApi.ts | 4 ++++
.../OAuthRequestApi/OAuthRequestManager.test.ts | 1 +
plugins/auth-backend/src/lib/flow/index.ts | 6 +-----
4 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts
index a64fadeb3e..a22fc24626 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts
@@ -25,12 +25,14 @@ describe('MockOAuthApi', () => {
const requester1 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler1,
+ authFlow: 'popup',
});
const authHandler2 = jest.fn().mockResolvedValue('other');
const requester2 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler2,
+ authFlow: 'popup',
});
const promises = [
@@ -68,12 +70,14 @@ describe('MockOAuthApi', () => {
const requester1 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler1,
+ authFlow: 'popup',
});
const authHandler2 = jest.fn();
const requester2 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler2,
+ authFlow: 'popup',
});
const promises = [
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts
index 193c474361..4ca0ffc645 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts
@@ -55,4 +55,8 @@ export default class MockOAuthApi implements OAuthRequestApi {
});
});
}
+
+ authFlow() {
+ return 'popup';
+ }
}
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts
index 4dd6af715e..54cfc8e41b 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts
@@ -30,6 +30,7 @@ describe('OAuthRequestManager', () => {
icon: () => null,
},
onAuthRequest: async () => 'hello',
+ authFlow: 'popup',
});
expect(reqSpy).toHaveBeenCalledTimes(0);
diff --git a/plugins/auth-backend/src/lib/flow/index.ts b/plugins/auth-backend/src/lib/flow/index.ts
index ebc3fe2ebe..f7b4491edb 100644
--- a/plugins/auth-backend/src/lib/flow/index.ts
+++ b/plugins/auth-backend/src/lib/flow/index.ts
@@ -14,10 +14,6 @@
* limitations under the License.
*/
-export {
- ensuresXRequestedWith,
- postMessageResponse,
- redirectMessageResponse,
-} from './authFlowHelpers';
+export { ensuresXRequestedWith, postMessageResponse } from './authFlowHelpers';
export type { WebMessageResponse } from './types';
From 564de00947ec31bcd95c74a17ce4dd4aad56f748 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Fri, 3 Feb 2023 13:35:28 -0800
Subject: [PATCH 004/511] update api reports
Signed-off-by: headphonejames
---
packages/core-app-api/api-report.md | 6 ++++--
packages/core-plugin-api/api-report.md | 3 ++-
plugins/auth-backend/api-report.md | 9 +--------
3 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md
index aaaccb17de..d0890bfca8 100644
--- a/packages/core-app-api/api-report.md
+++ b/packages/core-app-api/api-report.md
@@ -263,7 +263,7 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
- usePopup?: boolean;
+ authFlow?: string;
};
// @public
@@ -492,6 +492,8 @@ export type OAuthApiCreateOptions = AuthApiCreateOptions & {
// @public
export class OAuthRequestManager implements OAuthRequestApi {
+ // (undocumented)
+ authFlow(): string;
// (undocumented)
authRequest$(): Observable;
// (undocumented)
@@ -517,7 +519,7 @@ export type OneLoginAuthCreateOptions = {
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
- usePopup?: boolean;
+ authFlow?: string;
provider?: AuthProviderInfo;
};
diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md
index ecf615dd01..d5f9bcbc60 100644
--- a/packages/core-plugin-api/api-report.md
+++ b/packages/core-plugin-api/api-report.md
@@ -193,7 +193,6 @@ export type AuthProviderInfo = {
id: string;
title: string;
icon: IconComponent;
- provider_id?: string;
};
// @public
@@ -549,6 +548,7 @@ export type OAuthRequestApi = {
options: OAuthRequesterOptions,
): OAuthRequester;
authRequest$(): Observable;
+ authFlow(): string;
};
// @public
@@ -563,6 +563,7 @@ export type OAuthRequester = (
export type OAuthRequesterOptions = {
provider: AuthProviderInfo;
onAuthRequest(scopes: Set): Promise;
+ authFlow: string;
};
// @public
diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md
index b272f81c2e..68852626a9 100644
--- a/plugins/auth-backend/api-report.md
+++ b/plugins/auth-backend/api-report.md
@@ -41,7 +41,6 @@ export type AuthProviderConfig = {
appUrl: string;
isOriginAllowed: (origin: string) => boolean;
cookieConfigurer?: CookieConfigurer;
- isPopupAuthenticationRequest: boolean;
};
// @public (undocumented)
@@ -290,7 +289,6 @@ export type OAuthAdapterOptions = {
cookieConfigurer: CookieConfigurer;
isOriginAllowed: (origin: string) => boolean;
callbackUrl: string;
- isPopupAuthenticationRequest: boolean;
};
// @public (undocumented)
@@ -389,6 +387,7 @@ export type OAuthState = {
origin?: string;
scope?: string;
redirectUrl?: string;
+ authFlow?: string;
};
// @public
@@ -671,12 +670,6 @@ export const providers: Readonly<{
// @public (undocumented)
export const readState: (stateString: string) => OAuthState;
-// @public (undocumented)
-export const redirectMessageResponse: (
- res: express.Response,
- redirectUrl: string,
-) => void;
-
// @public (undocumented)
export interface RouterOptions {
// (undocumented)
From ad15aaa285d9f2308f8a43eddd011dc8e29eeca3 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Tue, 21 Feb 2023 18:45:50 -0800
Subject: [PATCH 005/511] Add onSignInStarted() and onSignInFailure() hooks.
Clean up and renaming.
Signed-off-by: headphonejames
---
packages/core-app-api/src/app/types.ts | 10 +++++++++-
.../src/layout/SignInPage/commonProvider.tsx | 16 ++++++++++------
.../src/layout/SignInPage/customProvider.tsx | 3 ++-
.../src/layout/SignInPage/guestProvider.tsx | 7 +++++--
.../src/layout/SignInPage/providers.tsx | 10 ++++++++++
.../src/lib/oauth/OAuthAdapter.test.ts | 6 +++---
.../auth-backend/src/lib/oauth/OAuthAdapter.ts | 17 ++++++++++-------
plugins/auth-backend/src/lib/oauth/types.ts | 2 +-
plugins/auth-backend/src/service/router.ts | 1 -
9 files changed, 50 insertions(+), 22 deletions(-)
diff --git a/packages/core-app-api/src/app/types.ts b/packages/core-app-api/src/app/types.ts
index 75b8fb2a34..8f5e1f5b27 100644
--- a/packages/core-app-api/src/app/types.ts
+++ b/packages/core-app-api/src/app/types.ts
@@ -45,9 +45,17 @@ export type BootErrorPageProps = {
*/
export type SignInPageProps = {
/**
- * Set the IdentityApi on successful sign in. This should only be called once.
+ * Invoked when the sign-in process has started.
+ */
+ onSignInStarted(): void;
+ /**
+ * Set the IdentityApi on successful sign-in. This should only be called once.
*/
onSignInSuccess(identityApi: IdentityApi): void;
+ /**
+ * Invoked when the sign-in process has failed.
+ */
+ onSignInFailure(): void;
};
/**
diff --git a/packages/core-components/src/layout/SignInPage/commonProvider.tsx b/packages/core-components/src/layout/SignInPage/commonProvider.tsx
index 6796e3f22d..1827981e6f 100644
--- a/packages/core-components/src/layout/SignInPage/commonProvider.tsx
+++ b/packages/core-components/src/layout/SignInPage/commonProvider.tsx
@@ -28,21 +28,25 @@ import { useApi, errorApiRef } from '@backstage/core-plugin-api';
import { GridItem } from './styles';
import { ForwardedError } from '@backstage/errors';
import { UserIdentity } from './UserIdentity';
-import { PROVIDER_STORAGE_KEY } from './providers';
-const Component: ProviderComponent = ({ config, onSignInSuccess }) => {
- const { apiRef, title, message, id } = config as SignInProviderConfig;
+const Component: ProviderComponent = ({
+ config,
+ onSignInStarted,
+ onSignInSuccess,
+ onSignInFailure,
+}) => {
+ const { apiRef, title, message } = config as SignInProviderConfig;
const authApi = useApi(apiRef);
const errorApi = useApi(errorApiRef);
const handleLogin = async () => {
try {
- localStorage.setItem(PROVIDER_STORAGE_KEY, id);
+ onSignInStarted();
const identityResponse = await authApi.getBackstageIdentity({
instantPopup: true,
});
if (!identityResponse) {
- localStorage.removeItem(PROVIDER_STORAGE_KEY);
+ onSignInFailure();
throw new Error(
`The ${title} provider is not configured to support sign-in`,
);
@@ -58,7 +62,7 @@ const Component: ProviderComponent = ({ config, onSignInSuccess }) => {
}),
);
} catch (error) {
- localStorage.removeItem(PROVIDER_STORAGE_KEY);
+ onSignInFailure();
errorApi.post(new ForwardedError('Login failed', error));
}
};
diff --git a/packages/core-components/src/layout/SignInPage/customProvider.tsx b/packages/core-components/src/layout/SignInPage/customProvider.tsx
index 101c74d3cd..ad02715447 100644
--- a/packages/core-components/src/layout/SignInPage/customProvider.tsx
+++ b/packages/core-components/src/layout/SignInPage/customProvider.tsx
@@ -61,7 +61,7 @@ const asInputRef = (renderResult: UseFormRegisterReturn) => {
};
};
-const Component: ProviderComponent = ({ onSignInSuccess }) => {
+const Component: ProviderComponent = ({ onSignInStarted, onSignInSuccess }) => {
const classes = useFormStyles();
const { register, handleSubmit, formState } = useForm({
mode: 'onChange',
@@ -70,6 +70,7 @@ const Component: ProviderComponent = ({ onSignInSuccess }) => {
const { errors } = formState;
const handleResult = ({ userId, idToken }: Data) => {
+ onSignInStarted();
onSignInSuccess(
UserIdentity.fromLegacy({
userId,
diff --git a/packages/core-components/src/layout/SignInPage/guestProvider.tsx b/packages/core-components/src/layout/SignInPage/guestProvider.tsx
index b2370a98d5..5393c1ea89 100644
--- a/packages/core-components/src/layout/SignInPage/guestProvider.tsx
+++ b/packages/core-components/src/layout/SignInPage/guestProvider.tsx
@@ -22,7 +22,7 @@ import { GridItem } from './styles';
import { ProviderComponent, ProviderLoader, SignInProvider } from './types';
import { GuestUserIdentity } from './GuestUserIdentity';
-const Component: ProviderComponent = ({ onSignInSuccess }) => (
+const Component: ProviderComponent = ({ onSignInStarted, onSignInSuccess }) => (
(
diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx
index 716befda17..1f3db4da36 100644
--- a/packages/core-components/src/layout/SignInPage/providers.tsx
+++ b/packages/core-components/src/layout/SignInPage/providers.tsx
@@ -176,11 +176,21 @@ export const useSignInProviders = (
handleWrappedResult(result);
};
+ const handleSignInStarted = () => {
+ localStorage.setItem(PROVIDER_STORAGE_KEY, provider.config!.id);
+ };
+
+ const handleSignInFailure = () => {
+ localStorage.removeItem(PROVIDER_STORAGE_KEY);
+ };
+
return (
);
}),
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
index dd45ab5441..1b6653d97e 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
@@ -178,7 +178,7 @@ describe('OAuthAdapter', () => {
const state = {
...defaultState,
redirectUrl: 'http://localhost:3000',
- authFlow: 'redirect',
+ flow: 'redirect',
};
const mockRequest = createEncodedQueryMockRequest(state);
@@ -506,7 +506,7 @@ describe('OAuthAdapter', () => {
expect(mockResponse.redirect).not.toHaveBeenCalled();
});
- it('executed a response redirect when authFlow query string is set to "redirect"', async () => {
+ it('executed a response redirect when flow query string is set to "redirect"', async () => {
const handlers = {
start: jest.fn(async (_req: { state: OAuthState }) => ({
url: '/url',
@@ -531,7 +531,7 @@ describe('OAuthAdapter', () => {
...defaultState,
origin: 'http://other.domain',
redirectUrl: 'http://domain.org',
- authFlow: 'redirect',
+ flow: 'redirect',
};
const mockRequest = {
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
index ac55fa8ad1..78365cda0f 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
@@ -55,7 +55,6 @@ export type OAuthAdapterOptions = {
providerId: string;
persistScopes?: boolean;
appOrigin: string;
- redirectUrl?: string;
baseUrl: string;
cookieConfigurer: CookieConfigurer;
isOriginAllowed: (origin: string) => boolean;
@@ -69,7 +68,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
handlers: OAuthHandlers,
options: Pick<
OAuthAdapterOptions,
- 'providerId' | 'persistScopes' | 'callbackUrl' | 'redirectUrl'
+ 'providerId' | 'persistScopes' | 'callbackUrl'
>,
): OAuthAdapter {
const { appUrl, baseUrl, isOriginAllowed } = config;
@@ -104,7 +103,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
const env = req.query.env?.toString();
const origin = req.query.origin?.toString();
const redirectUrl = req.query.redirectUrl?.toString();
- const authFlow = req.query.authFlow?.toString();
+ const flow = req.query.authFlow?.toString();
if (!env) {
throw new InputError('No env provided in request query parameters');
}
@@ -115,7 +114,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
// set a nonce cookie before redirecting to oauth provider
this.setNonceCookie(res, nonce, cookieConfig);
- const state: OAuthState = { nonce, env, origin, redirectUrl, authFlow };
+ const state: OAuthState = { nonce, env, origin, redirectUrl, flow: flow };
// If scopes are persisted then we pass them through the state so that we
// can set the cookie on successful auth
@@ -142,7 +141,6 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
try {
const state: OAuthState = readState(req.query.state?.toString() ?? '');
- const redirectUrl = state.redirectUrl ?? '';
if (state.origin) {
try {
@@ -181,8 +179,13 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
response: { ...response, backstageIdentity: identity },
};
- if (state.authFlow === 'redirect') {
- res.redirect(redirectUrl);
+ if (state.flow === 'redirect') {
+ if (!state.redirectUrl) {
+ throw new InputError(
+ 'No redirectUrl provided in request query parameters',
+ );
+ }
+ res.redirect(state.redirectUrl);
}
// post message back to popup if successful
return postMessageResponse(res, appOrigin, responseObj);
diff --git a/plugins/auth-backend/src/lib/oauth/types.ts b/plugins/auth-backend/src/lib/oauth/types.ts
index 4cb7a94ffd..e960af2988 100644
--- a/plugins/auth-backend/src/lib/oauth/types.ts
+++ b/plugins/auth-backend/src/lib/oauth/types.ts
@@ -91,7 +91,7 @@ export type OAuthState = {
origin?: string;
scope?: string;
redirectUrl?: string;
- authFlow?: string;
+ flow?: string;
};
/** @public */
diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts
index 9440a2c4ed..8013777415 100644
--- a/plugins/auth-backend/src/service/router.ts
+++ b/plugins/auth-backend/src/service/router.ts
@@ -107,7 +107,6 @@ export async function createRouter(
...providerFactories,
};
const providersConfig = config.getConfig('auth.providers');
-
const configuredProviders = providersConfig.keys();
const isOriginAllowed = createOriginFilter(config);
From 0354c9fb0d43eff49f9908d0b90d56ea556fc135 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Tue, 21 Feb 2023 19:35:37 -0800
Subject: [PATCH 006/511] fix SignInPageWrapper with new sign in hooks
Signed-off-by: headphonejames
---
packages/core-app-api/src/app/AppRouter.tsx | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/packages/core-app-api/src/app/AppRouter.tsx b/packages/core-app-api/src/app/AppRouter.tsx
index b799983a3b..33de9d479c 100644
--- a/packages/core-app-api/src/app/AppRouter.tsx
+++ b/packages/core-app-api/src/app/AppRouter.tsx
@@ -72,8 +72,22 @@ function SignInPageWrapper({
const configApi = useApi(configApiRef);
const basePath = getBasePath(configApi);
+ const handleSignInStarted = () => {
+ // no-op
+ };
+
+ const handleSignInFailure = () => {
+ // no-op
+ };
+
if (!identityApi) {
- return ;
+ return (
+
+ );
}
appIdentityProxy.setTarget(identityApi, {
From 3ae55c4a8d9a057233b7f8cc1e87dd9123697595 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Tue, 21 Feb 2023 19:48:35 -0800
Subject: [PATCH 007/511] api reports
Signed-off-by: headphonejames
---
packages/core-app-api/api-report.md | 2 ++
packages/core-plugin-api/api-report.md | 2 ++
plugins/auth-backend/api-report.md | 5 ++---
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md
index d0890bfca8..f8d5a99cd6 100644
--- a/packages/core-app-api/api-report.md
+++ b/packages/core-app-api/api-report.md
@@ -545,7 +545,9 @@ export class SamlAuth
// @public
export type SignInPageProps = {
+ onSignInStarted(): void;
onSignInSuccess(identityApi: IdentityApi): void;
+ onSignInFailure(): void;
};
// @public
diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md
index d5f9bcbc60..17278d4cc5 100644
--- a/packages/core-plugin-api/api-report.md
+++ b/packages/core-plugin-api/api-report.md
@@ -695,7 +695,9 @@ export enum SessionState {
// @public
export type SignInPageProps = {
+ onSignInStarted(): void;
onSignInSuccess(identityApi: IdentityApi_2): void;
+ onSignInFailure(): void;
};
// @public
diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md
index 68852626a9..5caea64b33 100644
--- a/plugins/auth-backend/api-report.md
+++ b/plugins/auth-backend/api-report.md
@@ -268,7 +268,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
handlers: OAuthHandlers,
options: Pick<
OAuthAdapterOptions,
- 'providerId' | 'persistScopes' | 'callbackUrl' | 'redirectUrl'
+ 'providerId' | 'persistScopes' | 'callbackUrl'
>,
): OAuthAdapter;
// (undocumented)
@@ -284,7 +284,6 @@ export type OAuthAdapterOptions = {
providerId: string;
persistScopes?: boolean;
appOrigin: string;
- redirectUrl?: string;
baseUrl: string;
cookieConfigurer: CookieConfigurer;
isOriginAllowed: (origin: string) => boolean;
@@ -387,7 +386,7 @@ export type OAuthState = {
origin?: string;
scope?: string;
redirectUrl?: string;
- authFlow?: string;
+ flow?: string;
};
// @public
From 5acc047748415e48206a5526bb9c10e0ad264e71 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Mon, 27 Feb 2023 16:34:30 -0800
Subject: [PATCH 008/511] Move configuration of redirect authentication flow to
a global parameter named "enableExperimentalRedirectFlow". Pass the configApi
instance into authentication providers to read new configuration parameter.
Signed-off-by: headphonejames
---
app-config.yaml | 1 -
packages/app-defaults/src/defaults/apis.ts | 16 ++++-----
packages/core-app-api/api-report.md | 7 ++--
packages/core-app-api/config.d.ts | 13 +++----
.../OAuthRequestApi/MockOAuthApi.test.ts | 4 ---
.../OAuthRequestManager.test.ts | 1 -
.../OAuthRequestApi/OAuthRequestManager.ts | 6 ----
.../auth/atlassian/AtlassianAuth.ts | 4 +--
.../auth/bitbucket/BitbucketAuth.test.ts | 7 ++++
.../auth/bitbucket/BitbucketAuth.ts | 4 +--
.../auth/github/GithubAuth.test.ts | 7 ++++
.../implementations/auth/github/GithubAuth.ts | 4 +--
.../auth/gitlab/GitlabAuth.test.ts | 7 ++++
.../implementations/auth/gitlab/GitlabAuth.ts | 4 +--
.../auth/google/GoogleAuth.test.ts | 7 ++++
.../implementations/auth/google/GoogleAuth.ts | 4 +--
.../auth/microsoft/MicrosoftAuth.ts | 4 +--
.../auth/oauth2/OAuth2.test.ts | 13 +++++++
.../implementations/auth/oauth2/OAuth2.ts | 4 +--
.../auth/okta/OktaAuth.test.ts | 6 ++++
.../implementations/auth/okta/OktaAuth.ts | 4 +--
.../auth/onelogin/OneLoginAuth.ts | 7 ++--
.../src/apis/implementations/auth/types.ts | 4 +--
.../DefaultAuthConnector.test.ts | 8 ++++-
.../lib/AuthConnector/DefaultAuthConnector.ts | 36 ++++++++++---------
.../OAuthRequestDialog/OAuthRequestDialog.tsx | 18 ++++++----
packages/core-plugin-api/api-report.md | 2 --
.../src/apis/definitions/OAuthRequestApi.ts | 10 ------
.../test-utils/src/testUtils/defaultApis.ts | 8 +++++
.../src/lib/oauth/OAuthAdapter.ts | 2 +-
plugins/gitops-profiles/package.json | 1 +
.../ProfileCatalog/ProfileCatalog.test.tsx | 6 ++++
yarn.lock | 1 +
33 files changed, 143 insertions(+), 87 deletions(-)
diff --git a/app-config.yaml b/app-config.yaml
index 350b9068e3..dd72051189 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -293,7 +293,6 @@ auth:
# path: my-sessions
environment: development
- authFlow: redirect
### Providing an auth.session.secret will enable session support in the auth-backend
# session:
# secret: custom session secret
diff --git a/packages/app-defaults/src/defaults/apis.ts b/packages/app-defaults/src/defaults/apis.ts
index feb4cd6cc8..b3a3d55736 100644
--- a/packages/app-defaults/src/defaults/apis.ts
+++ b/packages/app-defaults/src/defaults/apis.ts
@@ -128,10 +128,10 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
GoogleAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -143,10 +143,10 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
MicrosoftAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -158,11 +158,11 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
GithubAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
defaultScopes: ['read:user'],
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -174,10 +174,10 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
OktaAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -189,10 +189,10 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
GitlabAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -204,10 +204,10 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
OneLoginAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -219,11 +219,11 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
BitbucketAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
defaultScopes: ['team'],
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
}),
}),
createApiFactory({
@@ -235,10 +235,10 @@ export const apis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) => {
return AtlassianAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
- authFlow: configApi.getOptionalString('auth.authFlow'),
});
},
}),
diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md
index f8d5a99cd6..f7e2155db0 100644
--- a/packages/core-app-api/api-report.md
+++ b/packages/core-app-api/api-report.md
@@ -24,6 +24,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api';
import { bitbucketAuthApiRef } from '@backstage/core-plugin-api';
import { ComponentType } from 'react';
import { Config } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
import { ConfigReader } from '@backstage/config';
import { DiscoveryApi } from '@backstage/core-plugin-api';
import { ErrorApi } from '@backstage/core-plugin-api';
@@ -263,7 +264,7 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
- authFlow?: string;
+ configApi: ConfigApi;
};
// @public
@@ -492,8 +493,6 @@ export type OAuthApiCreateOptions = AuthApiCreateOptions & {
// @public
export class OAuthRequestManager implements OAuthRequestApi {
- // (undocumented)
- authFlow(): string;
// (undocumented)
authRequest$(): Observable;
// (undocumented)
@@ -516,10 +515,10 @@ export class OneLoginAuth {
// @public
export type OneLoginAuthCreateOptions = {
+ configApi: ConfigApi;
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
- authFlow?: string;
provider?: AuthProviderInfo;
};
diff --git a/packages/core-app-api/config.d.ts b/packages/core-app-api/config.d.ts
index c499dfa7c6..2de1d96114 100644
--- a/packages/core-app-api/config.d.ts
+++ b/packages/core-app-api/config.d.ts
@@ -114,11 +114,12 @@ export interface Config {
* @visibility frontend
*/
environment?: string;
- /**
- $ The authentication flow type - currently supports 'popup' and 'redirect'
- * default value: 'popup'
- * @visibility frontend
- */
- authFlow?: string;
};
+
+ /**
+ $ Enable redirect authentication flow type, instead of a popup for authentication
+ * default value: 'false'
+ * @visibility frontend
+ */
+ enableExperimentalRedirectFlow?: boolean;
}
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts
index a22fc24626..a64fadeb3e 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.test.ts
@@ -25,14 +25,12 @@ describe('MockOAuthApi', () => {
const requester1 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler1,
- authFlow: 'popup',
});
const authHandler2 = jest.fn().mockResolvedValue('other');
const requester2 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler2,
- authFlow: 'popup',
});
const promises = [
@@ -70,14 +68,12 @@ describe('MockOAuthApi', () => {
const requester1 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler1,
- authFlow: 'popup',
});
const authHandler2 = jest.fn();
const requester2 = mock.createAuthRequester({
provider: { icon: () => null, title: 'Test', id: 'test-provider' },
onAuthRequest: authHandler2,
- authFlow: 'popup',
});
const promises = [
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts
index 54cfc8e41b..4dd6af715e 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.test.ts
@@ -30,7 +30,6 @@ describe('OAuthRequestManager', () => {
icon: () => null,
},
onAuthRequest: async () => 'hello',
- authFlow: 'popup',
});
expect(reqSpy).toHaveBeenCalledTimes(0);
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts
index 751f2bf24c..5d467be7b4 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.ts
@@ -37,10 +37,8 @@ export class OAuthRequestManager implements OAuthRequestApi {
private readonly subject = new BehaviorSubject([]);
private currentRequests: PendingOAuthRequest[] = [];
private handlerCount = 0;
- private authFlowStr: string = 'popup';
createAuthRequester(options: OAuthRequesterOptions): OAuthRequester {
- this.authFlowStr = options.authFlow;
const handler = new OAuthPendingRequests();
const index = this.handlerCount;
@@ -93,8 +91,4 @@ export class OAuthRequestManager implements OAuthRequestApi {
authRequest$(): Observable {
return this.subject;
}
-
- authFlow(): string {
- return this.authFlowStr;
- }
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
index df714e2290..3477eec361 100644
--- a/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts
@@ -32,19 +32,19 @@ const DEFAULT_PROVIDER = {
export default class AtlassianAuth {
static create(options: OAuthApiCreateOptions): typeof atlassianAuthApiRef.T {
const {
+ configApi,
discoveryApi,
environment = 'development',
- authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
- authFlow,
});
}
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts
index f4bd7cbe85..29cd696a29 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts
@@ -17,6 +17,8 @@
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import BitbucketAuth from './BitbucketAuth';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
const getSession = jest.fn();
@@ -32,6 +34,10 @@ describe('BitbucketAuth', () => {
jest.resetAllMocks();
});
+ const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+ });
+
it.each([
['team api write_repository', ['team', 'api', 'write_repository']],
['read_repository sudo', ['read_repository', 'sudo']],
@@ -39,6 +45,7 @@ describe('BitbucketAuth', () => {
const gitlabAuth = BitbucketAuth.create({
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
+ configApi: configApi,
});
gitlabAuth.getAccessToken(scope);
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
index 3bdb09b010..7a9f1bc094 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts
@@ -47,20 +47,20 @@ const DEFAULT_PROVIDER = {
export default class BitbucketAuth {
static create(options: OAuthApiCreateOptions): typeof bitbucketAuthApiRef.T {
const {
+ configApi,
discoveryApi,
environment = 'development',
- authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['team'],
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
- authFlow,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts
index ea7b4ac688..e34c3cea87 100644
--- a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts
@@ -17,6 +17,8 @@
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import GithubAuth from './GithubAuth';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
const getSession = jest.fn();
@@ -32,8 +34,13 @@ describe('GithubAuth', () => {
jest.resetAllMocks();
});
+ const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+ });
+
it('should forward access token request to session manager', async () => {
const githubAuth = GithubAuth.create({
+ configApi: configApi,
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
});
diff --git a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
index 5acdd20719..943dfa7da4 100644
--- a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts
@@ -32,21 +32,21 @@ const DEFAULT_PROVIDER = {
export default class GithubAuth {
static create(options: OAuthApiCreateOptions): typeof githubAuthApiRef.T {
const {
+ configApi,
discoveryApi,
environment = 'development',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['read:user'],
- authFlow = 'popup',
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
defaultScopes,
- authFlow,
});
}
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts
index 3346af9b7c..71368c173e 100644
--- a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts
@@ -17,6 +17,8 @@
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import GitlabAuth from './GitlabAuth';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
const getSession = jest.fn();
@@ -39,7 +41,12 @@ describe('GitlabAuth', () => {
],
['read_repository sudo', ['read_repository', 'sudo']],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
+ const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+ });
+
const gitlabAuth = GitlabAuth.create({
+ configApi: configApi,
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
});
diff --git a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
index 919d67dd8d..c39f5a6e23 100644
--- a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts
@@ -32,20 +32,20 @@ const DEFAULT_PROVIDER = {
export default class GitlabAuth {
static create(options: OAuthApiCreateOptions): typeof gitlabAuthApiRef.T {
const {
+ configApi,
discoveryApi,
environment = 'development',
- authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['read_user'],
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
- authFlow,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts
index f8a1c3a1f5..44a3fed30f 100644
--- a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts
@@ -17,6 +17,8 @@
import GoogleAuth from './GoogleAuth';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
const PREFIX = 'https://www.googleapis.com/auth/';
@@ -58,7 +60,12 @@ describe('GoogleAuth', () => {
[`${PREFIX}profile`, [`${PREFIX}profile`]],
[`${PREFIX}openid`, [`${PREFIX}openid`]],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
+ const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+ });
+
const googleAuth = GoogleAuth.create({
+ configApi: configApi,
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
});
diff --git a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
index e8adefb08f..f4674ab64f 100644
--- a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts
@@ -34,10 +34,10 @@ const SCOPE_PREFIX = 'https://www.googleapis.com/auth/';
export default class GoogleAuth {
static create(options: OAuthApiCreateOptions): typeof googleAuthApiRef.T {
const {
+ configApi,
discoveryApi,
oauthRequestApi,
environment = 'development',
- authFlow = 'popup',
provider = DEFAULT_PROVIDER,
defaultScopes = [
'openid',
@@ -47,11 +47,11 @@ export default class GoogleAuth {
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
- authFlow,
defaultScopes,
scopeTransform(scopes: string[]) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
index c28e115950..30cfde7c6e 100644
--- a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts
@@ -32,8 +32,8 @@ const DEFAULT_PROVIDER = {
export default class MicrosoftAuth {
static create(options: OAuthApiCreateOptions): typeof microsoftAuthApiRef.T {
const {
+ configApi,
environment = 'development',
- authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
discoveryApi,
@@ -47,11 +47,11 @@ export default class MicrosoftAuth {
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
- authFlow,
defaultScopes,
});
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
index 0bb40c23fc..671d80c2be 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
@@ -17,6 +17,8 @@
import OAuth2 from './OAuth2';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
const theFuture = new Date(Date.now() + 3600000);
const thePast = new Date(Date.now() - 10);
@@ -34,12 +36,17 @@ jest.mock('../../../../lib/AuthSessionManager', () => ({
},
}));
+const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+});
+
describe('OAuth2', () => {
it('should get refreshed access token', async () => {
getSession = jest.fn().mockResolvedValue({
providerInfo: { accessToken: 'access-token', expiresAt: theFuture },
});
const oauth2 = OAuth2.create({
+ configApi: configApi,
scopeTransform: scopeTransform,
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
@@ -59,6 +66,7 @@ describe('OAuth2', () => {
providerInfo: { accessToken: 'access-token', expiresAt: theFuture },
});
const oauth2 = OAuth2.create({
+ configApi: configApi,
scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`),
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
@@ -75,7 +83,9 @@ describe('OAuth2', () => {
getSession = jest.fn().mockResolvedValue({
providerInfo: { idToken: 'id-token', expiresAt: theFuture },
});
+
const oauth2 = OAuth2.create({
+ configApi: configApi,
scopeTransform: scopeTransform,
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
@@ -90,6 +100,7 @@ describe('OAuth2', () => {
providerInfo: { idToken: 'id-token', expiresAt: theFuture },
});
const oauth2 = OAuth2.create({
+ configApi: configApi,
scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`),
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
@@ -113,6 +124,7 @@ describe('OAuth2', () => {
})
.mockRejectedValue(error);
const oauth2 = OAuth2.create({
+ configApi: configApi,
scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`),
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
@@ -147,6 +159,7 @@ describe('OAuth2', () => {
},
});
const oauth2 = OAuth2.create({
+ configApi: configApi,
scopeTransform: scopes => scopes.map(scope => `my-prefix/${scope}`),
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
index 7a133154f2..e3ff395fd0 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
@@ -72,21 +72,21 @@ export default class OAuth2
{
static create(options: OAuth2CreateOptions) {
const {
+ configApi,
discoveryApi,
environment = 'development',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = [],
- authFlow = 'popup',
scopeTransform = x => x,
} = options;
const connector = new DefaultAuthConnector({
+ configApi,
discoveryApi,
environment,
provider,
oauthRequestApi: oauthRequestApi,
- authFlow,
sessionTransform(res: OAuth2Response): OAuth2Session {
return {
...res,
diff --git a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts
index 6489b326ff..1918e51a34 100644
--- a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts
@@ -17,6 +17,8 @@
import OktaAuth from './OktaAuth';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
const PREFIX = 'okta.';
@@ -50,7 +52,11 @@ describe('OktaAuth', () => {
[`${PREFIX}profile`, [`${PREFIX}profile`]],
[`${PREFIX}openid`, [`${PREFIX}openid`]],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
+ const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+ });
const auth = OktaAuth.create({
+ configApi: configApi,
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
});
diff --git a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
index 9075d8cb82..c1921a8f93 100644
--- a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.ts
@@ -44,20 +44,20 @@ const OKTA_SCOPE_PREFIX: string = 'okta.';
export default class OktaAuth {
static create(options: OAuthApiCreateOptions): typeof oktaAuthApiRef.T {
const {
+ configApi,
discoveryApi,
environment = 'development',
- authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
defaultScopes = ['openid', 'email', 'profile', 'offline_access'],
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
- authFlow,
defaultScopes,
scopeTransform(scopes) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
index edfcbc4463..8beac05755 100644
--- a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
@@ -18,6 +18,7 @@ import {
oneloginAuthApiRef,
OAuthRequestApi,
AuthProviderInfo,
+ ConfigApi,
DiscoveryApi,
} from '@backstage/core-plugin-api';
import { OAuth2 } from '../oauth2';
@@ -27,10 +28,10 @@ import { OAuth2 } from '../oauth2';
* @public
*/
export type OneLoginAuthCreateOptions = {
+ configApi: ConfigApi;
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
- authFlow?: string;
provider?: AuthProviderInfo;
};
@@ -62,19 +63,19 @@ export default class OneLoginAuth {
options: OneLoginAuthCreateOptions,
): typeof oneloginAuthApiRef.T {
const {
+ configApi,
discoveryApi,
environment = 'development',
- authFlow = 'popup',
provider = DEFAULT_PROVIDER,
oauthRequestApi,
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
environment,
- authFlow: authFlow,
defaultScopes: ['openid', 'email', 'profile', 'offline_access'],
scopeTransform(scopes) {
return scopes.map(scope => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/types.ts b/packages/core-app-api/src/apis/implementations/auth/types.ts
index fdb2bbc7f8..c2614a54ff 100644
--- a/packages/core-app-api/src/apis/implementations/auth/types.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/types.ts
@@ -13,9 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
import {
AuthProviderInfo,
+ ConfigApi,
DiscoveryApi,
OAuthRequestApi,
} from '@backstage/core-plugin-api';
@@ -37,5 +37,5 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
- authFlow?: string;
+ configApi: ConfigApi;
};
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
index fd2a2833a8..8234f3cc51 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
@@ -21,6 +21,8 @@ import { UrlPatternDiscovery } from '../../apis';
import { setupRequestMockHandlers } from '@backstage/test-utils';
import { setupServer } from 'msw/node';
import { rest } from 'msw';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
jest.mock('../loginPopup', () => {
return {
@@ -28,6 +30,10 @@ jest.mock('../loginPopup', () => {
};
});
+const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+});
+
const defaultOptions = {
discoveryApi: UrlPatternDiscovery.compile('http://my-host/api/{{pluginId}}'),
environment: 'production',
@@ -42,7 +48,7 @@ const defaultOptions = {
scopes: new Set(res.scopes.split(' ')),
expiresAt: new Date(Date.now() + expiresInSeconds * 1000),
}),
- authFlow: 'popup',
+ configApi: configApi,
};
describe('DefaultAuthConnector', () => {
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
index 7cada8b0f9..3ec997d80a 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
@@ -13,12 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
import {
- OAuthRequester,
- OAuthRequestApi,
AuthProviderInfo,
+ ConfigApi,
DiscoveryApi,
+ OAuthRequestApi,
+ OAuthRequester,
} from '@backstage/core-plugin-api';
import { showLoginPopup } from '../loginPopup';
import { AuthConnector, CreateSessionOptions } from './types';
@@ -50,9 +50,9 @@ type Options = {
*/
sessionTransform?(response: any): AuthSession | Promise;
/**
- * The UI authentication flow with backend authentication api. Supports either 'popup' or 'redirect'.
+ * ConfigApi instance used to configure authentication flow of pop-up or redirect.
*/
- authFlow: string;
+ configApi: ConfigApi;
};
function defaultJoinScopes(scopes: Set) {
@@ -68,36 +68,37 @@ export class DefaultAuthConnector
implements AuthConnector
{
private readonly discoveryApi: DiscoveryApi;
+ private readonly configApi: ConfigApi;
private readonly environment: string;
private readonly provider: AuthProviderInfo;
private readonly joinScopesFunc: (scopes: Set) => string;
private readonly authRequester: OAuthRequester;
private readonly sessionTransform: (response: any) => Promise;
- private readonly authFlow: string;
-
constructor(options: Options) {
const {
+ configApi,
discoveryApi,
environment,
provider,
joinScopes = defaultJoinScopes,
oauthRequestApi,
- authFlow,
sessionTransform = id => id,
} = options;
this.authRequester = oauthRequestApi.createAuthRequester({
provider,
onAuthRequest: async scopes => {
- if (authFlow === 'popup') {
+ const enableExperimentalRedirectFlow =
+ this.configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ??
+ false;
+ if (!enableExperimentalRedirectFlow) {
return this.showPopup(scopes);
}
return this.executeRedirect(scopes);
},
- authFlow,
});
- this.authFlow = authFlow;
+ this.configApi = configApi;
this.discoveryApi = discoveryApi;
this.environment = environment;
this.provider = provider;
@@ -106,7 +107,11 @@ export class DefaultAuthConnector
}
async createSession(options: CreateSessionOptions): Promise {
- if (options.instantPopup && this.authFlow === 'popup') {
+ const enableExperimentalRedirectFlow =
+ this.configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ??
+ false;
+
+ if (options.instantPopup && !enableExperimentalRedirectFlow) {
return this.showPopup(options.scopes);
}
return this.authRequester(options.scopes);
@@ -184,14 +189,13 @@ export class DefaultAuthConnector
private async executeRedirect(scopes: Set): Promise {
const scope = this.joinScopesFunc(scopes);
- const redirectUrl = await this.buildUrl('/start', {
+ // redirect to auth api
+ window.location.href = await this.buildUrl('/start', {
scope,
origin: window.location.origin,
redirectUrl: window.location.href,
- authFlow: 'redirect',
+ flow: 'redirect',
});
- // redirect to auth api
- window.location.href = redirectUrl;
// return a promise that never resolves
return new Promise(() => {});
}
diff --git a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
index e68120298a..c7a8e49faa 100644
--- a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
+++ b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
import { makeStyles, Theme } from '@material-ui/core/styles';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
@@ -24,7 +23,11 @@ import Button from '@material-ui/core/Button';
import React, { useMemo, useState } from 'react';
import useObservable from 'react-use/lib/useObservable';
import LoginRequestListItem from './LoginRequestListItem';
-import { useApi, oauthRequestApiRef } from '@backstage/core-plugin-api';
+import {
+ useApi,
+ configApiRef,
+ oauthRequestApiRef,
+} from '@backstage/core-plugin-api';
import Typography from '@material-ui/core/Typography';
export type OAuthRequestDialogClassKey =
@@ -58,10 +61,13 @@ export function OAuthRequestDialog(_props: {}) {
const classes = useStyles();
const [busy, setBusy] = useState(false);
const oauthRequestApi = useApi(oauthRequestApiRef);
- const redirectMessage =
- oauthRequestApi.authFlow() === 'popup'
- ? ''
- : 'This will trigger a http redirect to OAuth Login.';
+ const configApi = useApi(configApiRef);
+
+ const authRedirect =
+ configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ?? false;
+ const redirectMessage = authRedirect
+ ? 'This will trigger a http redirect to OAuth Login.'
+ : '';
const requests = useObservable(
useMemo(() => oauthRequestApi.authRequest$(), [oauthRequestApi]),
diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md
index 17278d4cc5..6bba47a3f4 100644
--- a/packages/core-plugin-api/api-report.md
+++ b/packages/core-plugin-api/api-report.md
@@ -548,7 +548,6 @@ export type OAuthRequestApi = {
options: OAuthRequesterOptions,
): OAuthRequester;
authRequest$(): Observable;
- authFlow(): string;
};
// @public
@@ -563,7 +562,6 @@ export type OAuthRequester = (
export type OAuthRequesterOptions = {
provider: AuthProviderInfo;
onAuthRequest(scopes: Set): Promise;
- authFlow: string;
};
// @public
diff --git a/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts b/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts
index 2027852de7..75bf3a3864 100644
--- a/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts
+++ b/packages/core-plugin-api/src/apis/definitions/OAuthRequestApi.ts
@@ -35,11 +35,6 @@ export type OAuthRequesterOptions = {
* trigger() is called on an auth requests.
*/
onAuthRequest(scopes: Set): Promise;
-
- /**
- * The authentication flow type
- */
- authFlow: string;
};
/**
@@ -124,11 +119,6 @@ export type OAuthRequestApi = {
* AuthRequester calls will resolve to the value returned by the onAuthRequest call.
*/
authRequest$(): Observable;
-
- /**
- * The authentication flow type
- */
- authFlow(): string;
};
/**
diff --git a/packages/test-utils/src/testUtils/defaultApis.ts b/packages/test-utils/src/testUtils/defaultApis.ts
index 1ff10bfe6f..2231d28cd0 100644
--- a/packages/test-utils/src/testUtils/defaultApis.ts
+++ b/packages/test-utils/src/testUtils/defaultApis.ts
@@ -89,6 +89,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
GoogleAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
@@ -103,6 +104,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
MicrosoftAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
@@ -117,6 +119,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
GithubAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
defaultScopes: ['read:user'],
@@ -132,6 +135,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
OktaAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
@@ -146,6 +150,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
GitlabAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
@@ -160,6 +165,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
OneLoginAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
@@ -174,6 +180,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
BitbucketAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
defaultScopes: ['team'],
@@ -189,6 +196,7 @@ export const defaultApis = [
},
factory: ({ discoveryApi, oauthRequestApi, configApi }) => {
return AtlassianAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
environment: configApi.getOptionalString('auth.environment'),
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
index 78365cda0f..3d2a312a81 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
@@ -103,7 +103,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
const env = req.query.env?.toString();
const origin = req.query.origin?.toString();
const redirectUrl = req.query.redirectUrl?.toString();
- const flow = req.query.authFlow?.toString();
+ const flow = req.query.flow?.toString();
if (!env) {
throw new InputError('No env provided in request query parameters');
}
diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json
index b485aea867..9c8f623c12 100644
--- a/plugins/gitops-profiles/package.json
+++ b/plugins/gitops-profiles/package.json
@@ -33,6 +33,7 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
+ "@backstage/config": "workspace:^",
"@backstage/core-components": "workspace:^",
"@backstage/core-plugin-api": "workspace:^",
"@backstage/theme": "workspace:^",
diff --git a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx
index 5aa59a1cae..03d3d84c36 100644
--- a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx
+++ b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx
@@ -18,6 +18,8 @@ import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils';
import React from 'react';
import { gitOpsApiRef, GitOpsRestApi } from '../../api';
import ProfileCatalog from './ProfileCatalog';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
import {
ApiProvider,
@@ -31,6 +33,9 @@ import { githubAuthApiRef } from '@backstage/core-plugin-api';
describe('ProfileCatalog', () => {
it('should render', async () => {
const oauthRequestApi = new OAuthRequestManager();
+ const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+ });
const apis = TestApiRegistry.from(
[gitOpsApiRef, new GitOpsRestApi('http://localhost:3008')],
[
@@ -40,6 +45,7 @@ describe('ProfileCatalog', () => {
'http://example.com/{{pluginId}}',
),
oauthRequestApi,
+ configApi: configApi,
}),
],
);
diff --git a/yarn.lock b/yarn.lock
index 7cc0dbd8b5..974db36e32 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6195,6 +6195,7 @@ __metadata:
resolution: "@backstage/plugin-gitops-profiles@workspace:plugins/gitops-profiles"
dependencies:
"@backstage/cli": "workspace:^"
+ "@backstage/config": "workspace:^"
"@backstage/core-app-api": "workspace:^"
"@backstage/core-components": "workspace:^"
"@backstage/core-plugin-api": "workspace:^"
From fa9e9e36ab093b72669bb8f10caba2e69c5d8ca8 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Mon, 27 Feb 2023 16:39:13 -0800
Subject: [PATCH 009/511] fix query string name
Signed-off-by: headphonejames
---
.../src/lib/AuthConnector/DefaultAuthConnector.test.ts | 4 ++--
.../src/lib/AuthConnector/DefaultAuthConnector.ts | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
index 8234f3cc51..51da9cbfb5 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts
@@ -138,7 +138,7 @@ describe('DefaultAuthConnector', () => {
expect(popupSpy).toHaveBeenCalledTimes(1);
expect(popupSpy.mock.calls[0][0]).toMatchObject({
- url: 'http://my-host/api/auth/my-provider/start?scope=a%20b&origin=http%3A%2F%2Flocalhost&authFlow=popup&env=production',
+ url: 'http://my-host/api/auth/my-provider/start?scope=a%20b&origin=http%3A%2F%2Flocalhost&flow=popup&env=production',
});
await expect(sessionPromise).resolves.toEqual({
@@ -186,7 +186,7 @@ describe('DefaultAuthConnector', () => {
expect(popupSpy).toHaveBeenCalledTimes(1);
expect(popupSpy.mock.calls[0][0]).toMatchObject({
- url: 'http://my-host/api/auth/my-provider/start?scope=-ab-&origin=http%3A%2F%2Flocalhost&authFlow=popup&env=production',
+ url: 'http://my-host/api/auth/my-provider/start?scope=-ab-&origin=http%3A%2F%2Flocalhost&flow=popup&env=production',
});
});
});
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
index 3ec997d80a..633ccb8ae1 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
@@ -173,7 +173,7 @@ export class DefaultAuthConnector
const popupUrl = await this.buildUrl('/start', {
scope,
origin: window.location.origin,
- authFlow: 'popup',
+ flow: 'popup',
});
const payload = await showLoginPopup({
From 63a6a3d44ba2e61094778a7ff4dfcd5e78141a6c Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Mon, 27 Feb 2023 17:32:00 -0800
Subject: [PATCH 010/511] rebase and fix bitbucket server
Signed-off-by: headphonejames
---
packages/app-defaults/src/defaults/apis.ts | 4 +++-
.../auth/bitbucketServer/BitbucketServerAuth.test.ts | 7 +++++++
.../auth/bitbucketServer/BitbucketServerAuth.ts | 2 ++
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/packages/app-defaults/src/defaults/apis.ts b/packages/app-defaults/src/defaults/apis.ts
index f8464adaff..3a552c25c7 100644
--- a/packages/app-defaults/src/defaults/apis.ts
+++ b/packages/app-defaults/src/defaults/apis.ts
@@ -233,9 +233,11 @@ export const apis = [
deps: {
discoveryApi: discoveryApiRef,
oauthRequestApi: oauthRequestApiRef,
+ configApi: configApiRef,
},
- factory: ({ discoveryApi, oauthRequestApi }) =>
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
BitbucketServerAuth.create({
+ configApi,
discoveryApi,
oauthRequestApi,
defaultScopes: ['REPO_READ'],
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts
index 32e7755a00..e1625c7687 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts
@@ -17,6 +17,8 @@
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import BitbucketServerAuth from './BitbucketServerAuth';
+import { ConfigReader } from '@backstage/config';
+import { ConfigApi } from '@backstage/core-plugin-api';
const getSession = jest.fn();
@@ -40,7 +42,12 @@ describe('BitbucketServerAuth', () => {
['PROJECT_ADMIN', 'REPO_READ', 'ACCOUNT_WRITE'],
],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
+ const configApi: ConfigApi = new ConfigReader({
+ enableExperimentalRedirectFlow: false,
+ });
+
const bitbucketServerAuth = BitbucketServerAuth.create({
+ configApi: configApi,
oauthRequestApi: new MockOAuthApi(),
discoveryApi: UrlPatternDiscovery.compile('http://example.com'),
});
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts
index dc50eff6ab..b25deffb93 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts
@@ -48,6 +48,7 @@ export default class BitbucketServerAuth {
options: OAuthApiCreateOptions,
): typeof bitbucketServerAuthApiRef.T {
const {
+ configApi,
discoveryApi,
environment = 'development',
provider = DEFAULT_PROVIDER,
@@ -56,6 +57,7 @@ export default class BitbucketServerAuth {
} = options;
return OAuth2.create({
+ configApi,
discoveryApi,
oauthRequestApi,
provider,
From cef1a238a963f8adfd59863d0d76180c98b27750 Mon Sep 17 00:00:00 2001
From: Morgan Bentell
Date: Tue, 28 Feb 2023 17:35:09 +0100
Subject: [PATCH 011/511] bump mui labs to remove warnings
Signed-off-by: Morgan Bentell
---
plugins/adr/package.json | 2 +-
plugins/airbrake/package.json | 2 +-
plugins/allure/package.json | 2 +-
plugins/analytics-module-ga/package.json | 2 +-
plugins/apache-airflow/package.json | 2 +-
plugins/api-docs/package.json | 2 +-
plugins/azure-devops/package.json | 2 +-
plugins/azure-sites/package.json | 2 +-
plugins/badges/package.json | 2 +-
plugins/bazaar/package.json | 2 +-
plugins/bitrise/package.json | 2 +-
plugins/catalog-graph/package.json | 2 +-
plugins/catalog-import/package.json | 2 +-
plugins/catalog-react/package.json | 2 +-
plugins/catalog/package.json | 2 +-
plugins/cicd-statistics/package.json | 2 +-
plugins/circleci/package.json | 2 +-
plugins/cloudbuild/package.json | 2 +-
plugins/code-climate/package.json | 2 +-
plugins/code-coverage/package.json | 2 +-
plugins/config-schema/package.json | 2 +-
plugins/cost-insights/package.json | 2 +-
plugins/dynatrace/package.json | 2 +-
plugins/entity-feedback/package.json | 2 +-
plugins/example-todo-list/package.json | 2 +-
plugins/explore/package.json | 2 +-
plugins/firehydrant/package.json | 2 +-
plugins/fossa/package.json | 2 +-
plugins/gcalendar/package.json | 2 +-
plugins/gcp-projects/package.json | 2 +-
plugins/git-release-manager/package.json | 2 +-
plugins/github-actions/package.json | 2 +-
plugins/github-deployments/package.json | 2 +-
.../github-pull-requests-board/package.json | 2 +-
plugins/gitops-profiles/package.json | 2 +-
plugins/gocd/package.json | 2 +-
plugins/graphiql/package.json | 2 +-
plugins/graphql-voyager/package.json | 2 +-
plugins/home/package.json | 2 +-
plugins/ilert/package.json | 2 +-
plugins/jenkins/package.json | 2 +-
plugins/kafka/package.json | 2 +-
plugins/kubernetes/package.json | 2 +-
plugins/lighthouse/package.json | 2 +-
plugins/newrelic-dashboard/package.json | 2 +-
plugins/newrelic/package.json | 2 +-
plugins/octopus-deploy/package.json | 2 +-
plugins/org/package.json | 2 +-
plugins/pagerduty/package.json | 2 +-
plugins/periskop/package.json | 2 +-
plugins/rollbar/package.json | 2 +-
plugins/scaffolder-react/package.json | 2 +-
plugins/scaffolder/package.json | 2 +-
plugins/search-react/package.json | 2 +-
plugins/search/package.json | 2 +-
plugins/sentry/package.json | 2 +-
plugins/shortcuts/package.json | 2 +-
plugins/sonarqube/package.json | 2 +-
plugins/splunk-on-call/package.json | 2 +-
plugins/tech-insights/package.json | 2 +-
plugins/tech-radar/package.json | 2 +-
.../techdocs-addons-test-utils/package.json | 2 +-
.../package.json | 2 +-
plugins/techdocs-react/package.json | 2 +-
plugins/techdocs/package.json | 2 +-
plugins/todo/package.json | 2 +-
plugins/user-settings/package.json | 2 +-
plugins/xcmetrics/package.json | 2 +-
yarn.lock | 138 +++++++++---------
69 files changed, 137 insertions(+), 137 deletions(-)
diff --git a/plugins/adr/package.json b/plugins/adr/package.json
index 3910fbdef9..7169c0ab79 100644
--- a/plugins/adr/package.json
+++ b/plugins/adr/package.json
@@ -33,7 +33,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-markdown": "^8.0.0",
"react-use": "^17.2.4",
"remark-gfm": "^3.0.1"
diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json
index 22d961419c..1ea4291201 100644
--- a/plugins/airbrake/package.json
+++ b/plugins/airbrake/package.json
@@ -31,7 +31,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/allure/package.json b/plugins/allure/package.json
index 98296190b7..af30c8d540 100644
--- a/plugins/allure/package.json
+++ b/plugins/allure/package.json
@@ -30,7 +30,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json
index 2cf706b25e..11ef7ad2ad 100644
--- a/plugins/analytics-module-ga/package.json
+++ b/plugins/analytics-module-ga/package.json
@@ -28,7 +28,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-ga": "^3.3.0",
"react-use": "^17.2.4"
},
diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json
index b249948e90..d9d4d8f7df 100644
--- a/plugins/apache-airflow/package.json
+++ b/plugins/apache-airflow/package.json
@@ -26,7 +26,7 @@
"@backstage/core-plugin-api": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"cross-fetch": "^3.1.5",
"qs": "^6.10.1",
"react-use": "^17.2.4"
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index 7660e62320..41232d25c1 100644
--- a/plugins/api-docs/package.json
+++ b/plugins/api-docs/package.json
@@ -41,7 +41,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"graphiql": "^1.8.8",
"graphql": "^16.0.0",
"graphql-ws": "^5.4.1",
diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json
index 4174675f03..3d7f36af83 100644
--- a/plugins/azure-devops/package.json
+++ b/plugins/azure-devops/package.json
@@ -37,7 +37,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"humanize-duration": "^3.27.0",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json
index 7d37bf287a..f3ea8bf1fc 100644
--- a/plugins/azure-sites/package.json
+++ b/plugins/azure-sites/package.json
@@ -40,7 +40,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
},
diff --git a/plugins/badges/package.json b/plugins/badges/package.json
index a5a610c041..eada841784 100644
--- a/plugins/badges/package.json
+++ b/plugins/badges/package.json
@@ -37,7 +37,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json
index ae3703cbbc..064b5e00f9 100644
--- a/plugins/bazaar/package.json
+++ b/plugins/bazaar/package.json
@@ -34,7 +34,7 @@
"@date-io/luxon": "1.x",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/pickers": "^3.3.10",
"@testing-library/jest-dom": "^5.10.1",
"luxon": "^3.0.0",
diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json
index 3366b34d9a..ed5fa886a8 100644
--- a/plugins/bitrise/package.json
+++ b/plugins/bitrise/package.json
@@ -30,7 +30,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"cross-fetch": "^3.1.5",
"lodash": "^4.17.21",
"luxon": "^3.0.0",
diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json
index 0e093a3ab1..63bf8953d2 100644
--- a/plugins/catalog-graph/package.json
+++ b/plugins/catalog-graph/package.json
@@ -30,7 +30,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"classnames": "^2.3.1",
"lodash": "^4.17.15",
"p-limit": "^3.1.0",
diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json
index 57633f7b22..6f0b9deeaf 100644
--- a/plugins/catalog-import/package.json
+++ b/plugins/catalog-import/package.json
@@ -44,7 +44,7 @@
"@backstage/plugin-catalog-react": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@octokit/rest": "^19.0.3",
"git-url-parse": "^13.0.0",
"js-base64": "^3.6.0",
diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json
index 7a707240ca..4a9c30ad0d 100644
--- a/plugins/catalog-react/package.json
+++ b/plugins/catalog-react/package.json
@@ -59,7 +59,7 @@
"@backstage/version-bridge": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"classnames": "^2.2.6",
"jwt-decode": "^3.1.0",
"lodash": "^4.17.21",
diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json
index 212f4044b4..42a78f31c8 100644
--- a/plugins/catalog/package.json
+++ b/plugins/catalog/package.json
@@ -46,7 +46,7 @@
"@backstage/types": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"history": "^5.0.0",
"lodash": "^4.17.21",
"pluralize": "^8.0.0",
diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json
index 79469a7ce8..46165c6ed1 100644
--- a/plugins/cicd-statistics/package.json
+++ b/plugins/cicd-statistics/package.json
@@ -43,7 +43,7 @@
"@date-io/luxon": "^1.3.13",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/pickers": "^3.3.10",
"already": "^3.2.0",
"humanize-duration": "^3.27.0",
diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json
index b657d07f28..d8e558792d 100644
--- a/plugins/circleci/package.json
+++ b/plugins/circleci/package.json
@@ -40,7 +40,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"circleci-api": "^4.0.0",
"humanize-duration": "^3.27.0",
"lodash": "^4.17.21",
diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json
index 7604fdaf63..6f1130710f 100644
--- a/plugins/cloudbuild/package.json
+++ b/plugins/cloudbuild/package.json
@@ -40,7 +40,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"luxon": "^3.0.0",
"qs": "^6.9.4",
"react-use": "^17.2.4"
diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json
index 0f99afff6a..20ba30f548 100644
--- a/plugins/code-climate/package.json
+++ b/plugins/code-climate/package.json
@@ -29,7 +29,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"humanize-duration": "^3.27.1",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json
index 3a2de06c7f..09815ff66c 100644
--- a/plugins/code-coverage/package.json
+++ b/plugins/code-coverage/package.json
@@ -32,7 +32,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/styles": "^4.11.0",
"highlight.js": "^10.6.0",
"luxon": "^3.0.0",
diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json
index 07773496c0..4ad91d70ed 100644
--- a/plugins/config-schema/package.json
+++ b/plugins/config-schema/package.json
@@ -31,7 +31,7 @@
"@backstage/types": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"jsonschema": "^1.2.6",
"react-use": "^17.2.4",
"zen-observable": "^0.10.0"
diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json
index bce00a354f..17c59ba034 100644
--- a/plugins/cost-insights/package.json
+++ b/plugins/cost-insights/package.json
@@ -41,7 +41,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/styles": "^4.9.6",
"@types/recharts": "^1.8.14",
"classnames": "^2.2.6",
diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json
index ef8c2bb22b..09563fe6bd 100644
--- a/plugins/dynatrace/package.json
+++ b/plugins/dynatrace/package.json
@@ -33,7 +33,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json
index bcf3895d7b..12c6edd750 100644
--- a/plugins/entity-feedback/package.json
+++ b/plugins/entity-feedback/package.json
@@ -36,7 +36,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.9.13",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json
index 4eb7d3357f..a14a3a7a04 100644
--- a/plugins/example-todo-list/package.json
+++ b/plugins/example-todo-list/package.json
@@ -28,7 +28,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/explore/package.json b/plugins/explore/package.json
index c53f00ff6a..e7f0a2d1f2 100644
--- a/plugins/explore/package.json
+++ b/plugins/explore/package.json
@@ -44,7 +44,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"classnames": "^2.2.6",
"react-use": "^17.2.4"
},
diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json
index 06edc1cd38..0658f60386 100644
--- a/plugins/firehydrant/package.json
+++ b/plugins/firehydrant/package.json
@@ -29,7 +29,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
},
diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json
index 5864780dca..0c74bb722f 100644
--- a/plugins/fossa/package.json
+++ b/plugins/fossa/package.json
@@ -41,7 +41,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"cross-fetch": "^3.1.5",
"luxon": "^3.0.0",
"p-limit": "^3.0.2",
diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json
index 37df64f7f4..7eedbc1e03 100644
--- a/plugins/gcalendar/package.json
+++ b/plugins/gcalendar/package.json
@@ -28,7 +28,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@maxim_mazurok/gapi.client.calendar": "^3.0.20220408",
"@tanstack/react-query": "^4.1.3",
"classnames": "^2.3.1",
diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json
index 2a382f97bb..e2e1924642 100644
--- a/plugins/gcp-projects/package.json
+++ b/plugins/gcp-projects/package.json
@@ -38,7 +38,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@react-hookz/web": "^20.0.0"
},
"peerDependencies": {
diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json
index 63ebb36dfb..90e95ac665 100644
--- a/plugins/git-release-manager/package.json
+++ b/plugins/git-release-manager/package.json
@@ -29,7 +29,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@octokit/rest": "^19.0.3",
"luxon": "^3.0.0",
"qs": "^6.10.1",
diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json
index 8a51def8c4..821d4dd4fd 100644
--- a/plugins/github-actions/package.json
+++ b/plugins/github-actions/package.json
@@ -42,7 +42,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@octokit/rest": "^19.0.3",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json
index 9027c5f23a..376ddf012b 100644
--- a/plugins/github-deployments/package.json
+++ b/plugins/github-deployments/package.json
@@ -33,7 +33,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@octokit/graphql": "^5.0.0",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json
index e837da56e9..964fe13d5f 100644
--- a/plugins/github-pull-requests-board/package.json
+++ b/plugins/github-pull-requests-board/package.json
@@ -42,7 +42,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@octokit/rest": "^19.0.3",
"luxon": "^3.0.0",
"p-limit": "^4.0.0",
diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json
index 1f42adc3d9..de4a081134 100644
--- a/plugins/gitops-profiles/package.json
+++ b/plugins/gitops-profiles/package.json
@@ -38,7 +38,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json
index 4567a6e59b..4a1e0201eb 100644
--- a/plugins/gocd/package.json
+++ b/plugins/gocd/package.json
@@ -37,7 +37,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"lodash": "^4.17.21",
"luxon": "^3.0.0",
"qs": "^6.10.1",
diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json
index 7f1bd12beb..c7b295b00b 100644
--- a/plugins/graphiql/package.json
+++ b/plugins/graphiql/package.json
@@ -37,7 +37,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"graphiql": "^1.5.12",
"graphql": "^16.0.0",
"graphql-ws": "^5.4.1",
diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json
index 3f6d833f7f..afa5111e3e 100644
--- a/plugins/graphql-voyager/package.json
+++ b/plugins/graphql-voyager/package.json
@@ -28,7 +28,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"graphql-voyager": "^1.0.0-rc.31",
"react-use": "^17.2.4"
},
diff --git a/plugins/home/package.json b/plugins/home/package.json
index f7f98a26fd..bc8fdff417 100644
--- a/plugins/home/package.json
+++ b/plugins/home/package.json
@@ -41,7 +41,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"lodash": "^4.17.21",
"react-use": "^17.2.4"
},
diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json
index 1bf968218a..6b10364303 100644
--- a/plugins/ilert/package.json
+++ b/plugins/ilert/package.json
@@ -32,7 +32,7 @@
"@date-io/luxon": "1.x",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/pickers": "^3.3.10",
"humanize-duration": "^3.26.0",
"luxon": "^3.0.0",
diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json
index f6eb791af0..4c1d50c9cc 100644
--- a/plugins/jenkins/package.json
+++ b/plugins/jenkins/package.json
@@ -42,7 +42,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
},
diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json
index 98f01102f3..102c37cd42 100644
--- a/plugins/kafka/package.json
+++ b/plugins/kafka/package.json
@@ -32,7 +32,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json
index b69efb0d65..d67240441f 100644
--- a/plugins/kubernetes/package.json
+++ b/plugins/kubernetes/package.json
@@ -43,7 +43,7 @@
"@kubernetes/client-node": "0.18.1",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@types/react": "^16.13.1 || ^17.0.0",
"cronstrue": "^2.2.0",
"js-yaml": "^4.0.0",
diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json
index 0d9d1365eb..a90e1b00b6 100644
--- a/plugins/lighthouse/package.json
+++ b/plugins/lighthouse/package.json
@@ -42,7 +42,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json
index 462352b69e..99ea9c4690 100644
--- a/plugins/newrelic-dashboard/package.json
+++ b/plugins/newrelic-dashboard/package.json
@@ -29,7 +29,7 @@
"@backstage/plugin-catalog-react": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"devDependencies": {
diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json
index 9d183f34d6..03c472c12e 100644
--- a/plugins/newrelic/package.json
+++ b/plugins/newrelic/package.json
@@ -38,7 +38,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json
index c469b55c38..31d2de1947 100644
--- a/plugins/octopus-deploy/package.json
+++ b/plugins/octopus-deploy/package.json
@@ -29,7 +29,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.9.13",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/org/package.json b/plugins/org/package.json
index c1a4e8b1e5..384987858d 100644
--- a/plugins/org/package.json
+++ b/plugins/org/package.json
@@ -35,7 +35,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"p-limit": "^3.1.0",
"pluralize": "^8.0.0",
"qs": "^6.10.1",
diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json
index f248c6f31f..3b9f9b8ca0 100644
--- a/plugins/pagerduty/package.json
+++ b/plugins/pagerduty/package.json
@@ -41,7 +41,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"classnames": "^2.2.6",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json
index eba10dc41e..bc1d415a14 100644
--- a/plugins/periskop/package.json
+++ b/plugins/periskop/package.json
@@ -31,7 +31,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
},
diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json
index f95f2cb8c4..6c09d3b268 100644
--- a/plugins/rollbar/package.json
+++ b/plugins/rollbar/package.json
@@ -40,7 +40,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"lodash": "^4.17.21",
"react-sparklines": "^1.7.0",
"react-use": "^17.2.4"
diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json
index 070a92ee53..93e4c7150e 100644
--- a/plugins/scaffolder-react/package.json
+++ b/plugins/scaffolder-react/package.json
@@ -57,7 +57,7 @@
"@backstage/version-bridge": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@react-hookz/web": "^20.0.0",
"@rjsf/core": "^3.2.1",
"@rjsf/core-v5": "npm:@rjsf/core@5.1.0",
diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json
index 8a0c1f8e26..91b6334159 100644
--- a/plugins/scaffolder/package.json
+++ b/plugins/scaffolder/package.json
@@ -65,7 +65,7 @@
"@codemirror/view": "^6.0.0",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@react-hookz/web": "^20.0.0",
"@rjsf/core": "^3.2.1",
"@rjsf/material-ui": "^3.2.1",
diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json
index fd8242b552..1990aecc36 100644
--- a/plugins/search-react/package.json
+++ b/plugins/search-react/package.json
@@ -39,7 +39,7 @@
"@backstage/version-bridge": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"lodash": "^4.17.21",
"qs": "^6.9.4",
"react-use": "^17.3.2"
diff --git a/plugins/search/package.json b/plugins/search/package.json
index 31b57878dd..cff45cef09 100644
--- a/plugins/search/package.json
+++ b/plugins/search/package.json
@@ -45,7 +45,7 @@
"@backstage/version-bridge": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"qs": "^6.9.4",
"react-use": "^17.2.4"
},
diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json
index 7d385260f4..d5af0e1732 100644
--- a/plugins/sentry/package.json
+++ b/plugins/sentry/package.json
@@ -41,7 +41,7 @@
"@material-table/core": "^3.1.0",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"luxon": "^3.0.0",
"react-sparklines": "^1.7.0",
"react-use": "^17.2.4"
diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json
index 0209e76ec7..968618f2b3 100644
--- a/plugins/shortcuts/package.json
+++ b/plugins/shortcuts/package.json
@@ -29,7 +29,7 @@
"@backstage/types": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@types/zen-observable": "^0.8.2",
"react-hook-form": "^7.12.2",
"react-use": "^17.2.4",
diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json
index ef14f6da58..69feee56e1 100644
--- a/plugins/sonarqube/package.json
+++ b/plugins/sonarqube/package.json
@@ -43,7 +43,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/styles": "^4.10.0",
"cross-fetch": "^3.1.5",
"rc-progress": "3.4.1",
diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json
index 2703a95871..e0eadaf035 100644
--- a/plugins/splunk-on-call/package.json
+++ b/plugins/splunk-on-call/package.json
@@ -40,7 +40,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"classnames": "^2.2.6",
"luxon": "^3.0.0",
"react-use": "^17.2.4"
diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json
index 25b72e0de5..62631fbf29 100644
--- a/plugins/tech-insights/package.json
+++ b/plugins/tech-insights/package.json
@@ -37,7 +37,7 @@
"@backstage/types": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"qs": "^6.9.4",
"react-use": "^17.2.4"
},
diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json
index afb484dc06..b3fd617478 100644
--- a/plugins/tech-radar/package.json
+++ b/plugins/tech-radar/package.json
@@ -37,7 +37,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"color": "^4.0.1",
"d3-force": "^3.0.0",
"prop-types": "^15.7.2",
diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json
index 2f9078c7f8..a238509540 100644
--- a/plugins/techdocs-addons-test-utils/package.json
+++ b/plugins/techdocs-addons-test-utils/package.json
@@ -44,7 +44,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@testing-library/react": "^12.1.3",
"react-use": "^17.2.4",
"testing-library__dom": "^7.29.4-beta.1"
diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json
index 51d656007d..13f0f0de07 100644
--- a/plugins/techdocs-module-addons-contrib/package.json
+++ b/plugins/techdocs-module-addons-contrib/package.json
@@ -41,7 +41,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@react-hookz/web": "^20.0.0",
"git-url-parse": "^13.0.0",
"photoswipe": "^5.3.5",
diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json
index e2e45febf0..f03d13616a 100644
--- a/plugins/techdocs-react/package.json
+++ b/plugins/techdocs-react/package.json
@@ -39,7 +39,7 @@
"@backstage/core-plugin-api": "workspace:^",
"@backstage/version-bridge": "workspace:^",
"@material-ui/core": "^4.12.2",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/styles": "^4.11.0",
"jss": "~10.10.0",
"lodash": "^4.17.21",
diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json
index b66750991b..1147599d8f 100644
--- a/plugins/techdocs/package.json
+++ b/plugins/techdocs/package.json
@@ -47,7 +47,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@material-ui/styles": "^4.10.0",
"dompurify": "^2.2.9",
"event-source-polyfill": "1.0.25",
diff --git a/plugins/todo/package.json b/plugins/todo/package.json
index 8c925c5cf7..d58cf2c420 100644
--- a/plugins/todo/package.json
+++ b/plugins/todo/package.json
@@ -38,7 +38,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"peerDependencies": {
diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json
index cce6dfa1e5..1b6bf61001 100644
--- a/plugins/user-settings/package.json
+++ b/plugins/user-settings/package.json
@@ -41,7 +41,7 @@
"@backstage/types": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"@types/react": "^16.13.1 || ^17.0.0",
"react-use": "^17.2.4",
"zen-observable": "^0.10.0"
diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json
index 107cb9600e..241a32fc24 100644
--- a/plugins/xcmetrics/package.json
+++ b/plugins/xcmetrics/package.json
@@ -29,7 +29,7 @@
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
- "@material-ui/lab": "4.0.0-alpha.57",
+ "@material-ui/lab": "4.0.0-alpha.61",
"lodash": "^4.17.21",
"luxon": "^3.0.0",
"react-use": "^17.2.4",
diff --git a/yarn.lock b/yarn.lock
index fc43679003..229d156ece 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4280,7 +4280,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4333,7 +4333,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4362,7 +4362,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4390,7 +4390,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4416,7 +4416,7 @@ __metadata:
"@backstage/test-utils": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4460,7 +4460,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4672,7 +4672,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4734,7 +4734,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4786,7 +4786,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -4837,7 +4837,7 @@ __metadata:
"@date-io/luxon": 1.x
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/pickers": ^3.3.10
"@testing-library/jest-dom": ^5.10.1
cross-fetch: ^3.1.5
@@ -4878,7 +4878,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -5301,7 +5301,7 @@ __metadata:
"@backstage/types": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -5363,7 +5363,7 @@ __metadata:
"@backstage/test-utils": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@octokit/rest": ^19.0.3
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -5457,7 +5457,7 @@ __metadata:
"@backstage/version-bridge": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -5504,7 +5504,7 @@ __metadata:
"@backstage/types": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -5548,7 +5548,7 @@ __metadata:
"@date-io/luxon": ^1.3.13
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/pickers": ^3.3.10
"@types/luxon": ^3.0.0
"@types/react": ^16.13.1 || ^17.0.0
@@ -5578,7 +5578,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -5612,7 +5612,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -5642,7 +5642,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -5704,7 +5704,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/styles": ^4.11.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -5770,7 +5770,7 @@ __metadata:
"@backstage/types": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -5810,7 +5810,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/styles": ^4.9.6
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -5853,7 +5853,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -5917,7 +5917,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.9.13
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.1
@@ -6171,7 +6171,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6201,7 +6201,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6231,7 +6231,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6260,7 +6260,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@maxim_mazurok/gapi.client.calendar": ^3.0.20220408
"@tanstack/react-query": ^4.1.3
"@testing-library/jest-dom": ^5.10.1
@@ -6295,7 +6295,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@react-hookz/web": ^20.0.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -6323,7 +6323,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@octokit/rest": ^19.0.3
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -6360,7 +6360,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@octokit/rest": ^19.0.3
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -6394,7 +6394,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@octokit/graphql": ^5.0.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -6458,7 +6458,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@octokit/rest": ^19.0.3
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -6489,7 +6489,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6519,7 +6519,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6550,7 +6550,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6607,7 +6607,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6660,7 +6660,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6693,7 +6693,7 @@ __metadata:
"@date-io/luxon": 1.x
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/pickers": ^3.3.10
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -6762,7 +6762,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -6817,7 +6817,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -6905,7 +6905,7 @@ __metadata:
"@kubernetes/client-node": 0.18.1
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -6967,7 +6967,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -7100,7 +7100,7 @@ __metadata:
"@backstage/plugin-catalog-react": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@types/react": ^16.13.1 || ^17.0.0
cross-fetch: ^3.1.5
@@ -7123,7 +7123,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -7151,7 +7151,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.9.13
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -7209,7 +7209,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -7242,7 +7242,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -7295,7 +7295,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -7561,7 +7561,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -7766,7 +7766,7 @@ __metadata:
"@backstage/version-bridge": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@react-hookz/web": ^20.0.0
"@rjsf/core": ^3.2.1
"@rjsf/core-v5": "npm:@rjsf/core@5.1.0"
@@ -7830,7 +7830,7 @@ __metadata:
"@codemirror/view": ^6.0.0
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@react-hookz/web": ^20.0.0
"@rjsf/core": ^3.2.1
"@rjsf/material-ui": ^3.2.1
@@ -7981,7 +7981,7 @@ __metadata:
"@backstage/version-bridge": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -8017,7 +8017,7 @@ __metadata:
"@backstage/version-bridge": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/react-hooks": ^8.0.0
@@ -8050,7 +8050,7 @@ __metadata:
"@material-table/core": ^3.1.0
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8082,7 +8082,7 @@ __metadata:
"@backstage/types": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8149,7 +8149,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/styles": ^4.10.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -8179,7 +8179,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8368,7 +8368,7 @@ __metadata:
"@backstage/types": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8397,7 +8397,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8434,7 +8434,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8501,7 +8501,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@react-hookz/web": ^20.0.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -8575,7 +8575,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@backstage/version-bridge": "workspace:^"
"@material-ui/core": ^4.12.2
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/styles": ^4.11.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -8614,7 +8614,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@material-ui/styles": ^4.10.0
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
@@ -8682,7 +8682,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8735,7 +8735,7 @@ __metadata:
"@backstage/types": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -8821,7 +8821,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -11005,7 +11005,7 @@ __metadata:
"@backstage/theme": "workspace:^"
"@material-ui/core": ^4.12.2
"@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.57
+ "@material-ui/lab": 4.0.0-alpha.61
"@testing-library/jest-dom": ^5.10.1
"@testing-library/react": ^12.1.3
"@testing-library/user-event": ^14.0.0
@@ -11707,7 +11707,7 @@ __metadata:
languageName: node
linkType: hard
-"@material-ui/lab@npm:^4.0.0-alpha.57, @material-ui/lab@npm:^4.0.0-alpha.60, @material-ui/lab@npm:^4.0.0-alpha.61":
+"@material-ui/lab@npm:4.0.0-alpha.61, @material-ui/lab@npm:^4.0.0-alpha.57, @material-ui/lab@npm:^4.0.0-alpha.60, @material-ui/lab@npm:^4.0.0-alpha.61":
version: 4.0.0-alpha.61
resolution: "@material-ui/lab@npm:4.0.0-alpha.61"
dependencies:
From d7e856ad55b002b6ffe1e986fcdceed8e4f3a88d Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Tue, 28 Feb 2023 17:05:11 -0800
Subject: [PATCH 012/511] simplify code and test cases. clean up rendering.
Signed-off-by: headphonejames
---
packages/core-app-api/api-report.md | 4 +--
.../auth/bitbucket/BitbucketAuth.test.ts | 7 ++--
.../BitbucketServerAuth.test.ts | 7 ++--
.../auth/github/GithubAuth.test.ts | 7 ++--
.../auth/gitlab/GitlabAuth.test.ts | 7 ++--
.../auth/google/GoogleAuth.test.ts | 7 ++--
.../auth/oauth2/OAuth2.test.ts | 7 ++--
.../auth/okta/OktaAuth.test.ts | 7 ++--
.../src/apis/implementations/auth/types.ts | 2 +-
packages/core-app-api/src/app/AppRouter.tsx | 16 +--------
packages/core-app-api/src/app/types.ts | 8 -----
.../lib/AuthConnector/DefaultAuthConnector.ts | 33 ++++++++++++-------
.../OAuthRequestDialog/OAuthRequestDialog.tsx | 9 ++---
.../src/layout/SignInPage/types.ts | 13 +++++++-
packages/core-plugin-api/api-report.md | 2 --
.../src/apis/definitions/auth.ts | 1 +
.../src/lib/oauth/OAuthAdapter.ts | 2 +-
.../ProfileCatalog/ProfileCatalog.test.tsx | 12 +++----
18 files changed, 63 insertions(+), 88 deletions(-)
diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md
index 405c9ed7b8..a2a34171b1 100644
--- a/packages/core-app-api/api-report.md
+++ b/packages/core-app-api/api-report.md
@@ -265,7 +265,7 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
- configApi: ConfigApi;
+ configApi?: ConfigApi;
};
// @public
@@ -564,9 +564,7 @@ export class SamlAuth
// @public
export type SignInPageProps = {
- onSignInStarted(): void;
onSignInSuccess(identityApi: IdentityApi): void;
- onSignInFailure(): void;
};
// @public
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts
index 29cd696a29..1335808280 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.test.ts
@@ -17,8 +17,7 @@
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import BitbucketAuth from './BitbucketAuth';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
+import { MockConfigApi } from '@backstage/test-utils';
const getSession = jest.fn();
@@ -34,9 +33,7 @@ describe('BitbucketAuth', () => {
jest.resetAllMocks();
});
- const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
- });
+ const configApi = new MockConfigApi({});
it.each([
['team api write_repository', ['team', 'api', 'write_repository']],
diff --git a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts
index e1625c7687..5631a9a886 100644
--- a/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.test.ts
@@ -17,8 +17,7 @@
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import BitbucketServerAuth from './BitbucketServerAuth';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
+import { MockConfigApi } from '@backstage/test-utils';
const getSession = jest.fn();
@@ -42,9 +41,7 @@ describe('BitbucketServerAuth', () => {
['PROJECT_ADMIN', 'REPO_READ', 'ACCOUNT_WRITE'],
],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
- const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
- });
+ const configApi = new MockConfigApi({});
const bitbucketServerAuth = BitbucketServerAuth.create({
configApi: configApi,
diff --git a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts
index e34c3cea87..fc77754f6f 100644
--- a/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.test.ts
@@ -17,8 +17,7 @@
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import GithubAuth from './GithubAuth';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
+import { MockConfigApi } from '@backstage/test-utils';
const getSession = jest.fn();
@@ -34,9 +33,7 @@ describe('GithubAuth', () => {
jest.resetAllMocks();
});
- const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
- });
+ const configApi = new MockConfigApi({});
it('should forward access token request to session manager', async () => {
const githubAuth = GithubAuth.create({
diff --git a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts
index 71368c173e..6dde0c0334 100644
--- a/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.test.ts
@@ -17,8 +17,7 @@
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
import GitlabAuth from './GitlabAuth';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
+import { MockConfigApi } from '@backstage/test-utils';
const getSession = jest.fn();
@@ -41,9 +40,7 @@ describe('GitlabAuth', () => {
],
['read_repository sudo', ['read_repository', 'sudo']],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
- const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
- });
+ const configApi = new MockConfigApi({});
const gitlabAuth = GitlabAuth.create({
configApi: configApi,
diff --git a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts
index 44a3fed30f..7897eef42e 100644
--- a/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.test.ts
@@ -17,8 +17,7 @@
import GoogleAuth from './GoogleAuth';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
+import { MockConfigApi } from '@backstage/test-utils';
const PREFIX = 'https://www.googleapis.com/auth/';
@@ -60,9 +59,7 @@ describe('GoogleAuth', () => {
[`${PREFIX}profile`, [`${PREFIX}profile`]],
[`${PREFIX}openid`, [`${PREFIX}openid`]],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
- const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
- });
+ const configApi = new MockConfigApi({});
const googleAuth = GoogleAuth.create({
configApi: configApi,
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
index 671d80c2be..c6d92d2dad 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
@@ -17,8 +17,7 @@
import OAuth2 from './OAuth2';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
+import { MockConfigApi } from '@backstage/test-utils';
const theFuture = new Date(Date.now() + 3600000);
const thePast = new Date(Date.now() - 10);
@@ -36,9 +35,7 @@ jest.mock('../../../../lib/AuthSessionManager', () => ({
},
}));
-const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
-});
+const configApi = new MockConfigApi({});
describe('OAuth2', () => {
it('should get refreshed access token', async () => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts
index 1918e51a34..5e7370a947 100644
--- a/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.test.ts
@@ -17,8 +17,7 @@
import OktaAuth from './OktaAuth';
import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi';
import { UrlPatternDiscovery } from '../../DiscoveryApi';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
+import { MockConfigApi } from '@backstage/test-utils';
const PREFIX = 'okta.';
@@ -52,9 +51,7 @@ describe('OktaAuth', () => {
[`${PREFIX}profile`, [`${PREFIX}profile`]],
[`${PREFIX}openid`, [`${PREFIX}openid`]],
])(`should normalize scopes correctly - %p`, (scope, scopes) => {
- const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
- });
+ const configApi = new MockConfigApi({});
const auth = OktaAuth.create({
configApi: configApi,
oauthRequestApi: new MockOAuthApi(),
diff --git a/packages/core-app-api/src/apis/implementations/auth/types.ts b/packages/core-app-api/src/apis/implementations/auth/types.ts
index c2614a54ff..08ddc5e659 100644
--- a/packages/core-app-api/src/apis/implementations/auth/types.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/types.ts
@@ -37,5 +37,5 @@ export type AuthApiCreateOptions = {
discoveryApi: DiscoveryApi;
environment?: string;
provider?: AuthProviderInfo;
- configApi: ConfigApi;
+ configApi?: ConfigApi;
};
diff --git a/packages/core-app-api/src/app/AppRouter.tsx b/packages/core-app-api/src/app/AppRouter.tsx
index 33de9d479c..b799983a3b 100644
--- a/packages/core-app-api/src/app/AppRouter.tsx
+++ b/packages/core-app-api/src/app/AppRouter.tsx
@@ -72,22 +72,8 @@ function SignInPageWrapper({
const configApi = useApi(configApiRef);
const basePath = getBasePath(configApi);
- const handleSignInStarted = () => {
- // no-op
- };
-
- const handleSignInFailure = () => {
- // no-op
- };
-
if (!identityApi) {
- return (
-
- );
+ return ;
}
appIdentityProxy.setTarget(identityApi, {
diff --git a/packages/core-app-api/src/app/types.ts b/packages/core-app-api/src/app/types.ts
index 8f5e1f5b27..3d9005b0c0 100644
--- a/packages/core-app-api/src/app/types.ts
+++ b/packages/core-app-api/src/app/types.ts
@@ -44,18 +44,10 @@ export type BootErrorPageProps = {
* @public
*/
export type SignInPageProps = {
- /**
- * Invoked when the sign-in process has started.
- */
- onSignInStarted(): void;
/**
* Set the IdentityApi on successful sign-in. This should only be called once.
*/
onSignInSuccess(identityApi: IdentityApi): void;
- /**
- * Invoked when the sign-in process has failed.
- */
- onSignInFailure(): void;
};
/**
diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
index 633ccb8ae1..f2c35b0ba3 100644
--- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
+++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts
@@ -23,6 +23,8 @@ import {
import { showLoginPopup } from '../loginPopup';
import { AuthConnector, CreateSessionOptions } from './types';
+let warned = false;
+
type Options = {
/**
* DiscoveryApi instance used to locate the auth backend endpoint.
@@ -52,7 +54,7 @@ type Options = {
/**
* ConfigApi instance used to configure authentication flow of pop-up or redirect.
*/
- configApi: ConfigApi;
+ configApi?: ConfigApi;
};
function defaultJoinScopes(scopes: Set) {
@@ -68,12 +70,12 @@ export class DefaultAuthConnector
implements AuthConnector
{
private readonly discoveryApi: DiscoveryApi;
- private readonly configApi: ConfigApi;
private readonly environment: string;
private readonly provider: AuthProviderInfo;
private readonly joinScopesFunc: (scopes: Set) => string;
private readonly authRequester: OAuthRequester;
private readonly sessionTransform: (response: any) => Promise;
+ private readonly enableExperimentalRedirectFlow: boolean;
constructor(options: Options) {
const {
configApi,
@@ -85,20 +87,28 @@ export class DefaultAuthConnector
sessionTransform = id => id,
} = options;
+ if (!warned && !configApi) {
+ // eslint-disable-next-line no-console
+ console.warn(
+ 'DEPRECATION WARNING: Authentication providers require a configApi instance to configure the authentication flow. Please provide one to the authentication provider constructor.',
+ );
+ warned = true;
+ }
+
+ this.enableExperimentalRedirectFlow = configApi
+ ? configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ?? false
+ : false;
+
this.authRequester = oauthRequestApi.createAuthRequester({
provider,
onAuthRequest: async scopes => {
- const enableExperimentalRedirectFlow =
- this.configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ??
- false;
- if (!enableExperimentalRedirectFlow) {
+ if (!this.enableExperimentalRedirectFlow) {
return this.showPopup(scopes);
}
return this.executeRedirect(scopes);
},
});
- this.configApi = configApi;
this.discoveryApi = discoveryApi;
this.environment = environment;
this.provider = provider;
@@ -107,11 +117,10 @@ export class DefaultAuthConnector
}
async createSession(options: CreateSessionOptions): Promise {
- const enableExperimentalRedirectFlow =
- this.configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ??
- false;
-
- if (options.instantPopup && !enableExperimentalRedirectFlow) {
+ if (options.instantPopup) {
+ if (this.enableExperimentalRedirectFlow) {
+ return this.executeRedirect(options.scopes);
+ }
return this.showPopup(options.scopes);
}
return this.authRequester(options.scopes);
diff --git a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
index c7a8e49faa..3e6c685401 100644
--- a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
+++ b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
@@ -65,9 +65,6 @@ export function OAuthRequestDialog(_props: {}) {
const authRedirect =
configApi.getOptionalBoolean('enableExperimentalRedirectFlow') ?? false;
- const redirectMessage = authRedirect
- ? 'This will trigger a http redirect to OAuth Login.'
- : '';
const requests = useObservable(
useMemo(() => oauthRequestApi.authRequest$(), [oauthRequestApi]),
@@ -94,7 +91,11 @@ export function OAuthRequestDialog(_props: {}) {
Login Required
- {redirectMessage}
+ {authRedirect ? (
+
+ This will trigger a http redirect to OAuth Login.
+
+ ) : null}
diff --git a/packages/core-components/src/layout/SignInPage/types.ts b/packages/core-components/src/layout/SignInPage/types.ts
index 8a0430a27d..6213c03432 100644
--- a/packages/core-components/src/layout/SignInPage/types.ts
+++ b/packages/core-components/src/layout/SignInPage/types.ts
@@ -35,8 +35,19 @@ export type SignInProviderConfig = {
/** @public */
export type IdentityProviders = ('guest' | 'custom' | SignInProviderConfig)[];
+/**
+ * Invoked when the sign-in process has failed.
+ */
+export type onSignInFailure = () => void;
+/**
+ * Invoked when the sign-in process has started.
+ */
+export type onSignInStarted = () => void;
+
export type ProviderComponent = ComponentType<
- SignInPageProps & { config: SignInProviderConfig }
+ { onSignInStarted: onSignInStarted } & {
+ onSignInFailure: onSignInFailure;
+ } & SignInPageProps & { config: SignInProviderConfig }
>;
export type ProviderLoader = (
diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md
index 035b837729..4887f0b7f2 100644
--- a/packages/core-plugin-api/api-report.md
+++ b/packages/core-plugin-api/api-report.md
@@ -687,9 +687,7 @@ export enum SessionState {
// @public
export type SignInPageProps = {
- onSignInStarted(): void;
onSignInSuccess(identityApi: IdentityApi_2): void;
- onSignInFailure(): void;
};
// @public
diff --git a/packages/core-plugin-api/src/apis/definitions/auth.ts b/packages/core-plugin-api/src/apis/definitions/auth.ts
index 21717e19e0..43597639b6 100644
--- a/packages/core-plugin-api/src/apis/definitions/auth.ts
+++ b/packages/core-plugin-api/src/apis/definitions/auth.ts
@@ -285,6 +285,7 @@ export type SessionApi = {
* Sign out from the current session. This will reload the page.
*/
signOut(): Promise;
+
/**
* Observe the current state of the auth session. Emits the current state on subscription.
*/
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
index 3d2a312a81..b7aa5390fb 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
@@ -114,7 +114,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
// set a nonce cookie before redirecting to oauth provider
this.setNonceCookie(res, nonce, cookieConfig);
- const state: OAuthState = { nonce, env, origin, redirectUrl, flow: flow };
+ const state: OAuthState = { nonce, env, origin, redirectUrl, flow };
// If scopes are persisted then we pass them through the state so that we
// can set the cookie on successful auth
diff --git a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx
index 03d3d84c36..eb58e03580 100644
--- a/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx
+++ b/plugins/gitops-profiles/src/components/ProfileCatalog/ProfileCatalog.test.tsx
@@ -14,12 +14,14 @@
* limitations under the License.
*/
-import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils';
+import {
+ MockConfigApi,
+ renderInTestApp,
+ TestApiRegistry,
+} from '@backstage/test-utils';
import React from 'react';
import { gitOpsApiRef, GitOpsRestApi } from '../../api';
import ProfileCatalog from './ProfileCatalog';
-import { ConfigReader } from '@backstage/config';
-import { ConfigApi } from '@backstage/core-plugin-api';
import {
ApiProvider,
@@ -33,9 +35,7 @@ import { githubAuthApiRef } from '@backstage/core-plugin-api';
describe('ProfileCatalog', () => {
it('should render', async () => {
const oauthRequestApi = new OAuthRequestManager();
- const configApi: ConfigApi = new ConfigReader({
- enableExperimentalRedirectFlow: false,
- });
+ const configApi = new MockConfigApi({});
const apis = TestApiRegistry.from(
[gitOpsApiRef, new GitOpsRestApi('http://localhost:3008')],
[
From 57ec7e225036924af3167a9a8d99c344c1b6e8d6 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Tue, 28 Feb 2023 17:20:23 -0800
Subject: [PATCH 013/511] minor clean up
Signed-off-by: headphonejames
---
.../src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts | 4 ----
packages/core-app-api/src/apis/implementations/auth/types.ts | 1 +
.../src/components/OAuthRequestDialog/OAuthRequestDialog.tsx | 1 +
packages/core-components/src/layout/SignInPage/providers.tsx | 2 +-
plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts | 1 +
5 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts
index 4ca0ffc645..193c474361 100644
--- a/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts
+++ b/packages/core-app-api/src/apis/implementations/OAuthRequestApi/MockOAuthApi.ts
@@ -55,8 +55,4 @@ export default class MockOAuthApi implements OAuthRequestApi {
});
});
}
-
- authFlow() {
- return 'popup';
- }
}
diff --git a/packages/core-app-api/src/apis/implementations/auth/types.ts b/packages/core-app-api/src/apis/implementations/auth/types.ts
index 08ddc5e659..7a74fd3a3b 100644
--- a/packages/core-app-api/src/apis/implementations/auth/types.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/types.ts
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
import {
AuthProviderInfo,
ConfigApi,
diff --git a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
index 3e6c685401..0159d8f503 100644
--- a/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
+++ b/packages/core-components/src/components/OAuthRequestDialog/OAuthRequestDialog.tsx
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
import { makeStyles, Theme } from '@material-ui/core/styles';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
diff --git a/packages/core-components/src/layout/SignInPage/providers.tsx b/packages/core-components/src/layout/SignInPage/providers.tsx
index 1f3db4da36..5e7ab7b7be 100644
--- a/packages/core-components/src/layout/SignInPage/providers.tsx
+++ b/packages/core-components/src/layout/SignInPage/providers.tsx
@@ -32,7 +32,7 @@ import { guestProvider } from './guestProvider';
import { customProvider } from './customProvider';
import { IdentityApiSignOutProxy } from './IdentityApiSignOutProxy';
-export const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider';
+const PROVIDER_STORAGE_KEY = '@backstage/core:SignInPage:provider';
export type SignInProviderType = {
[key: string]: {
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
index b7aa5390fb..5f51b2d301 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
@@ -104,6 +104,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
const origin = req.query.origin?.toString();
const redirectUrl = req.query.redirectUrl?.toString();
const flow = req.query.flow?.toString();
+
if (!env) {
throw new InputError('No env provided in request query parameters');
}
From 7908d72e033fb6af4d95a41d62d82ef1afe42511 Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Tue, 28 Feb 2023 21:56:38 -0800
Subject: [PATCH 014/511] add change set
Signed-off-by: headphonejames
---
.changeset/long-gorillas-remain.md | 11 +++++++++++
1 file changed, 11 insertions(+)
create mode 100644 .changeset/long-gorillas-remain.md
diff --git a/.changeset/long-gorillas-remain.md b/.changeset/long-gorillas-remain.md
new file mode 100644
index 0000000000..f74dc1b1a7
--- /dev/null
+++ b/.changeset/long-gorillas-remain.md
@@ -0,0 +1,11 @@
+---
+'@backstage/core-components': minor
+'@backstage/core-plugin-api': minor
+'@backstage/plugin-gitops-profiles': minor
+'@backstage/app-defaults': minor
+'@backstage/core-app-api': minor
+'@backstage/plugin-auth-backend': minor
+'@backstage/test-utils': minor
+---
+
+Introduce a new global config parameter, "enableExperimentalRedirectFlow" When enabled, instead of having a popup window where the authentication takes place, backstage will redirect to the authentication backend plugin, followed by a redirect back to the backstage frontend after authentication takes place.
From f41478fd0236eca84115492481c7f9a7a1169c33 Mon Sep 17 00:00:00 2001
From: Morgan Bentell
Date: Wed, 1 Mar 2023 09:34:53 +0100
Subject: [PATCH 015/511] wrap settingsaddons in span to remove warning from
mui Menu component
Signed-off-by: Morgan Bentell
---
.../TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx
index 0cef4d521f..df4197b5b6 100644
--- a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx
+++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx
@@ -107,7 +107,7 @@ export const TechDocsReaderPageSubheader = (props: {
onClose={handleClose}
keepMounted
>
- {settingsAddons}
+ {settingsAddons}
>
) : null}
From 08048a5a8b81e6d59830f046a0aa1e7553ddb3e5 Mon Sep 17 00:00:00 2001
From: Morgan Bentell
Date: Wed, 1 Mar 2023 13:39:54 +0100
Subject: [PATCH 016/511] use span if the value of the header label content is
not string, to remove warnings from validateDomNesting
Signed-off-by: Morgan Bentell
---
.../src/layout/HeaderLabel/HeaderLabel.tsx | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx
index e3b6299f85..bc27bd82ec 100644
--- a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx
+++ b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx
@@ -50,9 +50,16 @@ type HeaderLabelContentProps = {
className: string;
};
-const HeaderLabelContent = ({ value, className }: HeaderLabelContentProps) => (
- {value}
-);
+const HeaderLabelContent = ({ value, className }: HeaderLabelContentProps) => {
+ return (
+
+ {value}
+
+ );
+};
type HeaderLabelProps = {
label: string;
From 7cf160e4bc02f1c41017e7ef4dda2d8933481823 Mon Sep 17 00:00:00 2001
From: Morgan Bentell
Date: Wed, 1 Mar 2023 13:55:58 +0100
Subject: [PATCH 017/511] cancel debounced function on unmount to avoid
updating state on an umounted component
Signed-off-by: Morgan Bentell
---
plugins/techdocs-react/src/hooks.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/plugins/techdocs-react/src/hooks.ts b/plugins/techdocs-react/src/hooks.ts
index e8cc7bddc8..42d8f0fbc1 100644
--- a/plugins/techdocs-react/src/hooks.ts
+++ b/plugins/techdocs-react/src/hooks.ts
@@ -82,6 +82,8 @@ export const useShadowRootSelection = (waitMillis: number = 0) => {
[shadowRoot, setSelection, waitMillis],
);
+ useEffect(() => handleSelectionChange.cancel);
+
useEffect(() => {
window.document.addEventListener('selectionchange', handleSelectionChange);
return () =>
From 8e00acb28db6b0ba3efccec32f92f8db0413d32f Mon Sep 17 00:00:00 2001
From: Morgan Bentell
Date: Wed, 1 Mar 2023 14:04:51 +0100
Subject: [PATCH 018/511] add changeset
Signed-off-by: Morgan Bentell
---
.changeset/seven-gifts-fetch.md | 73 +++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
create mode 100644 .changeset/seven-gifts-fetch.md
diff --git a/.changeset/seven-gifts-fetch.md b/.changeset/seven-gifts-fetch.md
new file mode 100644
index 0000000000..0646eb3d9e
--- /dev/null
+++ b/.changeset/seven-gifts-fetch.md
@@ -0,0 +1,73 @@
+---
+'@backstage/plugin-techdocs-module-addons-contrib': patch
+'@backstage/plugin-github-pull-requests-board': patch
+'@backstage/plugin-techdocs-addons-test-utils': patch
+'@backstage/plugin-analytics-module-ga': patch
+'@backstage/plugin-git-release-manager': patch
+'@backstage/plugin-github-deployments': patch
+'@backstage/plugin-newrelic-dashboard': patch
+'@internal/plugin-todo-list': patch
+'@backstage/core-components': patch
+'@backstage/plugin-scaffolder-react': patch
+'@backstage/plugin-cicd-statistics': patch
+'@backstage/plugin-entity-feedback': patch
+'@backstage/plugin-gitops-profiles': patch
+'@backstage/plugin-graphql-voyager': patch
+'@backstage/plugin-apache-airflow': patch
+'@backstage/plugin-catalog-import': patch
+'@backstage/plugin-github-actions': patch
+'@backstage/plugin-octopus-deploy': patch
+'@backstage/plugin-splunk-on-call': patch
+'@backstage/plugin-techdocs-react': patch
+'@backstage/plugin-catalog-graph': patch
+'@backstage/plugin-catalog-react': patch
+'@backstage/plugin-code-coverage': patch
+'@backstage/plugin-config-schema': patch
+'@backstage/plugin-cost-insights': patch
+'@backstage/plugin-tech-insights': patch
+'@backstage/plugin-user-settings': patch
+'@backstage/plugin-azure-devops': patch
+'@backstage/plugin-code-climate': patch
+'@backstage/plugin-gcp-projects': patch
+'@backstage/plugin-search-react': patch
+'@backstage/plugin-azure-sites': patch
+'@backstage/plugin-firehydrant': patch
+'@backstage/plugin-cloudbuild': patch
+'@backstage/plugin-kubernetes': patch
+'@backstage/plugin-lighthouse': patch
+'@backstage/plugin-scaffolder': patch
+'@backstage/plugin-tech-radar': patch
+'@backstage/plugin-dynatrace': patch
+'@backstage/plugin-gcalendar': patch
+'@backstage/plugin-pagerduty': patch
+'@backstage/plugin-shortcuts': patch
+'@backstage/plugin-sonarqube': patch
+'@backstage/plugin-xcmetrics': patch
+'@backstage/plugin-airbrake': patch
+'@backstage/plugin-api-docs': patch
+'@backstage/plugin-circleci': patch
+'@backstage/plugin-graphiql': patch
+'@backstage/plugin-newrelic': patch
+'@backstage/plugin-periskop': patch
+'@backstage/plugin-techdocs': patch
+'@backstage/plugin-bitrise': patch
+'@backstage/plugin-catalog': patch
+'@backstage/plugin-explore': patch
+'@backstage/plugin-jenkins': patch
+'@backstage/plugin-rollbar': patch
+'@backstage/plugin-allure': patch
+'@backstage/plugin-badges': patch
+'@backstage/plugin-bazaar': patch
+'@backstage/plugin-search': patch
+'@backstage/plugin-sentry': patch
+'@backstage/plugin-fossa': patch
+'@backstage/plugin-ilert': patch
+'@backstage/plugin-kafka': patch
+'@backstage/plugin-gocd': patch
+'@backstage/plugin-home': patch
+'@backstage/plugin-todo': patch
+'@backstage/plugin-adr': patch
+'@backstage/plugin-org': patch
+---
+
+Small tweaks to remove warnings in the console during development (mainly focusing on techdocs)
From e73da4a0a99fa7f276c39f3e70f3f9f4dd280936 Mon Sep 17 00:00:00 2001
From: Morgan Bentell
Date: Wed, 1 Mar 2023 15:45:23 +0100
Subject: [PATCH 019/511] use div insted of span because it's not allowed
Signed-off-by: Morgan Bentell
---
plugins/techdocs-backend/.gitignore | 1 +
.../TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/plugins/techdocs-backend/.gitignore b/plugins/techdocs-backend/.gitignore
index 7b4d4ba2e6..ff1cdd948f 100644
--- a/plugins/techdocs-backend/.gitignore
+++ b/plugins/techdocs-backend/.gitignore
@@ -1 +1,2 @@
static
+**/?/
diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx
index df4197b5b6..f3612aa46e 100644
--- a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx
+++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx
@@ -107,7 +107,7 @@ export const TechDocsReaderPageSubheader = (props: {
onClose={handleClose}
keepMounted
>
- {settingsAddons}
+ {settingsAddons}
>
) : null}
From 911c25de59cefe6f77823258438123edb7f9299a Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Sun, 5 Mar 2023 20:17:14 +0100
Subject: [PATCH 020/511] eslint-plugin: add auto fix for missing imports
Signed-off-by: Patrik Oldsberg
---
.changeset/twelve-parrots-camp.md | 5 +
packages/eslint-plugin/lib/getPackages.js | 4 +
packages/eslint-plugin/lib/visitImports.js | 30 ++-
.../rules/no-undeclared-imports.js | 188 +++++++++++++-----
.../src/no-undeclared-imports.test.ts | 64 +++++-
5 files changed, 232 insertions(+), 59 deletions(-)
create mode 100644 .changeset/twelve-parrots-camp.md
diff --git a/.changeset/twelve-parrots-camp.md b/.changeset/twelve-parrots-camp.md
new file mode 100644
index 0000000000..ea7e254f29
--- /dev/null
+++ b/.changeset/twelve-parrots-camp.md
@@ -0,0 +1,5 @@
+---
+'@backstage/eslint-plugin': patch
+---
+
+Add support for auto-fixing missing imports detected by the `no-undeclared-imports` rule.
diff --git a/packages/eslint-plugin/lib/getPackages.js b/packages/eslint-plugin/lib/getPackages.js
index f5f2c63cc1..8f4ccfacf3 100644
--- a/packages/eslint-plugin/lib/getPackages.js
+++ b/packages/eslint-plugin/lib/getPackages.js
@@ -31,6 +31,7 @@ const manypkg = require('@manypkg/get-packages');
* @property {ExtendedPackage} root
* @property {ExtendedPackage[]} list
* @property {Map} map
+ * @property {() => void} clearCache
* @property {(path: string) => ExtendedPackage | undefined} byPath
*/
@@ -64,6 +65,9 @@ module.exports = (function () {
pkg => !path.relative(pkg.dir, filePath).startsWith('..'),
);
},
+ clearCache() {
+ result = undefined;
+ },
};
lastLoadAt = Date.now();
return result;
diff --git a/packages/eslint-plugin/lib/visitImports.js b/packages/eslint-plugin/lib/visitImports.js
index 1a344c1101..376c37575f 100644
--- a/packages/eslint-plugin/lib/visitImports.js
+++ b/packages/eslint-plugin/lib/visitImports.js
@@ -24,6 +24,16 @@ const getPackages = require('./getPackages');
* @type {object}
* @property {'local'} type
* @property {'value' | 'type'} kind
+ * @property {import('estree').Node} node
+ * @property {string} path
+ */
+
+/**
+ * @typedef ImportDirective
+ * @type {object}
+ * @property {'directive'} type
+ * @property {'value' | 'type'} kind
+ * @property {import('estree').Node} node
* @property {string} path
*/
@@ -32,6 +42,7 @@ const getPackages = require('./getPackages');
* @type {object}
* @property {'internal'} type
* @property {'value' | 'type'} kind
+ * @property {import('estree').Node} node
* @property {string} path
* @property {import('./getPackages').ExtendedPackage} package
* @property {string} packageName
@@ -42,6 +53,7 @@ const getPackages = require('./getPackages');
* @type {object}
* @property {'external'} type
* @property {'value' | 'type'} kind
+ * @property {import('estree').Node} node
* @property {string} path
* @property {string} packageName
*/
@@ -51,6 +63,7 @@ const getPackages = require('./getPackages');
* @type {object}
* @property {'builtin'} type
* @property {'value' | 'type'} kind
+ * @property {import('estree').Literal} node
* @property {string} path
* @property {string} packageName
*/
@@ -58,7 +71,7 @@ const getPackages = require('./getPackages');
/**
* @callback ImportVisitor
* @param {ConsideredNode} node
- * @param {LocalImport | InternalImport | ExternalImport | BuiltinImport} import
+ * @param {ImportDirective | LocalImport | InternalImport | ExternalImport | BuiltinImport} import
*/
/**
@@ -68,7 +81,7 @@ const getPackages = require('./getPackages');
/**
* @param {ConsideredNode} node
- * @returns {undefined | {path: string, kind: 'type' | 'value'}}
+ * @returns {undefined | {path: string, node: import('estree').Literal, kind: 'type' | 'value'}}
*/
function getImportInfo(node) {
/** @type {import('estree').Expression | import('estree').SpreadElement | undefined | null} */
@@ -95,7 +108,11 @@ function getImportInfo(node) {
/** @type {any} */
const anyNode = node;
- return { path: pathNode.value, kind: anyNode.importKind ?? 'value' };
+ return {
+ path: pathNode.value,
+ node: pathNode,
+ kind: anyNode.importKind ?? 'value',
+ };
}
/**
@@ -122,6 +139,10 @@ module.exports = function visitImports(context, visitor) {
return visitor(node, { type: 'local', ...info });
}
+ if (info.path.startsWith('directive:')) {
+ return visitor(node, { type: 'directive', ...info });
+ }
+
const pathParts = info.path.split('/');
// Check for match with plain name, then namespaced name
@@ -143,6 +164,7 @@ module.exports = function visitImports(context, visitor) {
return visitor(node, {
type: 'builtin',
kind: info.kind,
+ node: info.node,
path: subPath,
packageName,
});
@@ -151,6 +173,7 @@ module.exports = function visitImports(context, visitor) {
return visitor(node, {
type: 'external',
kind: info.kind,
+ node: info.node,
path: subPath,
packageName,
});
@@ -159,6 +182,7 @@ module.exports = function visitImports(context, visitor) {
return visitor(node, {
type: 'internal',
kind: info.kind,
+ node: info.node,
path: subPath,
package: pkg,
packageName,
diff --git a/packages/eslint-plugin/rules/no-undeclared-imports.js b/packages/eslint-plugin/rules/no-undeclared-imports.js
index b1e11d1b97..06f0afed46 100644
--- a/packages/eslint-plugin/rules/no-undeclared-imports.js
+++ b/packages/eslint-plugin/rules/no-undeclared-imports.js
@@ -20,6 +20,7 @@ const path = require('path');
const getPackageMap = require('../lib/getPackages');
const visitImports = require('../lib/visitImports');
const minimatch = require('minimatch');
+const { execFileSync } = require('child_process');
const depFields = {
dep: 'dependencies',
@@ -124,11 +125,13 @@ function getAddFlagForDepsField(depsField) {
module.exports = {
meta: {
type: 'problem',
+ fixable: 'code',
messages: {
undeclared:
"{{ packageName }} must be declared in {{ depsField }} of {{ packageJsonPath }}, run 'yarn --cwd {{ packagePath }} add{{ addFlag }} {{ packageName }}' from the project root.",
switch:
'{{ packageName }} is declared in {{ oldDepsField }}, but should be moved to {{ depsField }} in {{ packageJsonPath }}.',
+ switchBack: 'Switch back to import declaration',
},
docs: {
description:
@@ -150,63 +153,150 @@ module.exports = {
return {};
}
- return visitImports(context, (node, imp) => {
- // We leave checking of type imports to the repo-tools check,
- // and we skip builtins and local imports
- if (
- imp.kind === 'type' ||
- imp.type === 'builtin' ||
- imp.type === 'local'
- ) {
- return;
- }
+ /** @type Array<{name: string, flag: string, node: import('estree').Node}> */
+ const importsToAdd = [];
- // We skip imports for the package itself
- if (imp.packageName === localPkg.packageJson.name) {
- return;
- }
+ return {
+ // All missing imports that we detect are collected as we traverse, and then we use
+ // the program exit to execute all install directives that have been found.
+ ['Program:exit']() {
+ /** @type Record> */
+ const byFlag = {};
- const modulePath = path.relative(localPkg.dir, filePath);
- const expectedType = getExpectedDepType(
- localPkg.packageJson,
- imp.packageName,
- modulePath,
- );
+ for (const { name, flag } of importsToAdd) {
+ byFlag[flag] = byFlag[flag] ?? new Set();
+ byFlag[flag].add(name);
+ }
- const conflict = findConflict(
- localPkg.packageJson,
- imp.packageName,
- expectedType,
- );
+ for (const name of byFlag[''] ?? []) {
+ byFlag['--dev']?.delete(name);
+ }
+ for (const name of byFlag['--peer'] ?? []) {
+ byFlag['']?.delete(name);
+ byFlag['--dev']?.delete(name);
+ }
- if (conflict) {
- try {
- const fullImport = imp.path
- ? `${imp.packageName}/${imp.path}`
- : imp.packageName;
- require.resolve(fullImport, {
- paths: [localPkg.dir],
+ for (const [flag, names] of Object.entries(byFlag)) {
+ // The security implication of this is a bit interesting, as crafted add-import
+ // directives could be used to install malicious packages. However, the same is true
+ // for adding malicious packages to package.json, so there's significant difference.
+ execFileSync('yarn', ['add', ...(flag || []), ...names], {
+ cwd: localPkg.dir,
+ stdio: 'inherit',
});
- } catch {
- // If the dependency doesn't resolve then it's likely a type import, ignore
+ }
+
+ // This switches all import directives back to the original import.
+ for (const added of importsToAdd) {
+ context.report({
+ node: added.node,
+ messageId: 'switchBack',
+ fix(fixer) {
+ return fixer.replaceText(added.node, `'${added.name}'`);
+ },
+ });
+ }
+
+ importsToAdd.length = 0;
+ packages.clearCache();
+ },
+ ...visitImports(context, (node, imp) => {
+ // We leave checking of type imports to the repo-tools check,
+ // and we skip builtins and local imports
+ if (
+ imp.kind === 'type' ||
+ imp.type === 'builtin' ||
+ imp.type === 'local'
+ ) {
return;
}
- const packagePath = path.relative(packages.root.dir, localPkg.dir);
- const packageJsonPath = path.join(packagePath, 'package.json');
+ // Any import directive that is found is collected for processing later
+ if (imp.type === 'directive') {
+ const parts = imp.path.split(':');
+ if (parts[1] !== 'add-import') {
+ return;
+ }
+ const [type, name] = parts.slice(2);
+ if (!name.match(/^(@[-\w\.~]+\/)?[-\w\.~]*$/i)) {
+ throw new Error(
+ `Invalid package name to add as dependency: '${name}'`,
+ );
+ }
- context.report({
- node,
- messageId: conflict.oldDepsField ? 'switch' : 'undeclared',
- data: {
- ...conflict,
- packagePath,
- addFlag: getAddFlagForDepsField(conflict.depsField),
- packageName: imp.packageName,
- packageJsonPath: packageJsonPath,
- },
- });
- }
- });
+ importsToAdd.push({
+ flag: getAddFlagForDepsField(type).trim(),
+ name,
+ node: imp.node,
+ });
+ return;
+ }
+
+ // We skip imports for the package itself
+ if (imp.packageName === localPkg.packageJson.name) {
+ return;
+ }
+
+ const modulePath = path.relative(localPkg.dir, filePath);
+ const expectedType = getExpectedDepType(
+ localPkg.packageJson,
+ imp.packageName,
+ modulePath,
+ );
+
+ const conflict = findConflict(
+ localPkg.packageJson,
+ imp.packageName,
+ expectedType,
+ );
+
+ if (conflict) {
+ try {
+ const fullImport = imp.path
+ ? `${imp.packageName}/${imp.path}`
+ : imp.packageName;
+ require.resolve(fullImport, {
+ paths: [localPkg.dir],
+ });
+ } catch {
+ // If the dependency doesn't resolve then it's likely a type import, ignore
+ return;
+ }
+
+ const packagePath = path.relative(packages.root.dir, localPkg.dir);
+ const packageJsonPath = path.join(packagePath, 'package.json');
+
+ context.report({
+ node,
+ messageId: conflict.oldDepsField ? 'switch' : 'undeclared',
+ data: {
+ ...conflict,
+ packagePath,
+ addFlag: getAddFlagForDepsField(conflict.depsField),
+ packageName: imp.packageName,
+ packageJsonPath: packageJsonPath,
+ },
+ // This fix callback is always executed, regardless of whether linting is run with
+ // fixes enabled or not. There is no way to determine if fixes are being applied, so
+ // instead our fix will replace the import with a directive that will be picked up
+ // on the next run. When ESLint applies fixes all rules are re-run to make sure the fixes
+ // applied correctly, which means that these directives will be picked up, executed,
+ // and switched back to the original import immediately.
+ // This is not true for all editor integrations. For example, VSCode translates there fixes
+ // to native editor commands, and does not re-run ESLint. This means that the import directive
+ // will end up in source code, and the import directive fix needs to be applied manually too.
+ // There is to my knowledge no way around this that doesn't get very hacky, so it will do for now.
+ fix: conflict.oldDepsField
+ ? undefined
+ : fixer => {
+ return fixer.replaceText(
+ imp.node,
+ `'directive:add-import:${conflict.depsField}:${imp.packageName}'`,
+ );
+ },
+ });
+ }
+ }),
+ };
},
};
diff --git a/packages/eslint-plugin/src/no-undeclared-imports.test.ts b/packages/eslint-plugin/src/no-undeclared-imports.test.ts
index 78844899ba..e92d422057 100644
--- a/packages/eslint-plugin/src/no-undeclared-imports.test.ts
+++ b/packages/eslint-plugin/src/no-undeclared-imports.test.ts
@@ -18,6 +18,10 @@ import { RuleTester } from 'eslint';
import { join as joinPath } from 'path';
import rule from '../rules/no-undeclared-imports';
+jest.mock('child_process', () => ({
+ execFileSync: jest.fn(),
+}));
+
const RULE = 'no-undeclared-imports';
const FIXTURE = joinPath(__dirname, '__fixtures__/monorepo');
@@ -45,6 +49,9 @@ const ERR_SWITCHED = (
'package.json',
)}.`,
});
+const ERR_SWITCH_BACK = () => ({
+ message: 'Switch back to import declaration',
+});
process.chdir(FIXTURE);
@@ -130,6 +137,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import 'lodash'`,
+ output: `import 'directive:add-import:dependencies:lodash'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')),
@@ -137,6 +145,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import { debounce } from 'lodash'`,
+ output: `import { debounce } from 'directive:add-import:dependencies:lodash'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')),
@@ -144,6 +153,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import * as _ from 'lodash'`,
+ output: `import * as _ from 'directive:add-import:dependencies:lodash'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')),
@@ -151,6 +161,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import _ from 'lodash'`,
+ output: `import _ from 'directive:add-import:dependencies:lodash'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')),
@@ -158,6 +169,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import('lodash')`,
+ output: `import('directive:add-import:dependencies:lodash')`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')),
@@ -165,6 +177,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `require('lodash')`,
+ output: `require('directive:add-import:dependencies:lodash')`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')),
@@ -172,13 +185,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import 'lodash'`,
- filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
- errors: [
- ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')),
- ],
- },
- {
- code: `import 'lodash'`,
+ output: `import 'directive:add-import:devDependencies:lodash'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.test.ts'),
errors: [
ERR_UNDECLARED(
@@ -191,6 +198,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import 'react'`,
+ output: `import 'directive:add-import:peerDependencies:react'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED(
@@ -203,6 +211,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import 'react'`,
+ output: `import 'directive:add-import:peerDependencies:react'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.test.ts'),
errors: [
ERR_UNDECLARED(
@@ -215,6 +224,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import 'react-dom'`,
+ output: `import 'directive:add-import:dependencies:react-dom'`,
filename: joinPath(FIXTURE, 'packages/foo/src/index.ts'),
errors: [
ERR_UNDECLARED(
@@ -226,6 +236,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import 'react-dom'`,
+ output: `import 'directive:add-import:devDependencies:react-dom'`,
filename: joinPath(FIXTURE, 'packages/foo/src/index.test.ts'),
errors: [
ERR_UNDECLARED(
@@ -238,6 +249,7 @@ ruleTester.run(RULE, rule, {
},
{
code: `import '@internal/foo'`,
+ output: `import 'directive:add-import:dependencies:@internal/foo'`,
filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
errors: [
ERR_UNDECLARED(
@@ -247,5 +259,43 @@ ruleTester.run(RULE, rule, {
),
],
},
+
+ // Switching back to original import declarations
+ {
+ code: `import 'directive:add-import:dependencies:lodash'`,
+ output: `import 'lodash'`,
+ filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
+ errors: [ERR_SWITCH_BACK()],
+ },
+ {
+ code: `import { debounce } from 'directive:add-import:dependencies:lodash'`,
+ output: `import { debounce } from 'lodash'`,
+ filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
+ errors: [ERR_SWITCH_BACK()],
+ },
+ {
+ code: `import * as _ from 'directive:add-import:dependencies:lodash'`,
+ output: `import * as _ from 'lodash'`,
+ filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
+ errors: [ERR_SWITCH_BACK()],
+ },
+ {
+ code: `import _ from 'directive:add-import:dependencies:lodash'`,
+ output: `import _ from 'lodash'`,
+ filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
+ errors: [ERR_SWITCH_BACK()],
+ },
+ {
+ code: `import('directive:add-import:dependencies:lodash')`,
+ output: `import('lodash')`,
+ filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
+ errors: [ERR_SWITCH_BACK()],
+ },
+ {
+ code: `require('directive:add-import:dependencies:lodash')`,
+ output: `require('lodash')`,
+ filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'),
+ errors: [ERR_SWITCH_BACK()],
+ },
],
});
From 8f72438559c22c6447dacf94f1173c859b6041b6 Mon Sep 17 00:00:00 2001
From: Headphones James
Date: Mon, 6 Mar 2023 10:10:04 -0800
Subject: [PATCH 021/511] Update .changeset/long-gorillas-remain.md
Co-authored-by: Patrik Oldsberg
Signed-off-by: Headphones James
---
.changeset/long-gorillas-remain.md | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/.changeset/long-gorillas-remain.md b/.changeset/long-gorillas-remain.md
index f74dc1b1a7..60ad6fa092 100644
--- a/.changeset/long-gorillas-remain.md
+++ b/.changeset/long-gorillas-remain.md
@@ -1,11 +1,9 @@
---
-'@backstage/core-components': minor
-'@backstage/core-plugin-api': minor
-'@backstage/plugin-gitops-profiles': minor
+'@backstage/core-components': patch
'@backstage/app-defaults': minor
'@backstage/core-app-api': minor
-'@backstage/plugin-auth-backend': minor
+'@backstage/plugin-auth-backend': patch
'@backstage/test-utils': minor
---
-Introduce a new global config parameter, "enableExperimentalRedirectFlow" When enabled, instead of having a popup window where the authentication takes place, backstage will redirect to the authentication backend plugin, followed by a redirect back to the backstage frontend after authentication takes place.
+Introduce a new global config parameter, `auth.enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window.
From ef729bc30cb3c3726fded9b5d7c144b9eaaad3cf Mon Sep 17 00:00:00 2001
From: headphonejames
Date: Mon, 6 Mar 2023 10:16:21 -0800
Subject: [PATCH 022/511] clean up, add missing optional configApi to
OneLoginAuthCreateOptions.
Signed-off-by: headphonejames
---
packages/core-app-api/api-report.md | 2 +-
.../apis/implementations/auth/onelogin/OneLoginAuth.ts | 2 +-
packages/core-components/src/layout/SignInPage/types.ts | 8 +++++---
3 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md
index a2a34171b1..d7e4a22873 100644
--- a/packages/core-app-api/api-report.md
+++ b/packages/core-app-api/api-report.md
@@ -535,7 +535,7 @@ export class OneLoginAuth {
// @public
export type OneLoginAuthCreateOptions = {
- configApi: ConfigApi;
+ configApi?: ConfigApi;
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
diff --git a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
index 8beac05755..d8f54e7e50 100644
--- a/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.ts
@@ -28,7 +28,7 @@ import { OAuth2 } from '../oauth2';
* @public
*/
export type OneLoginAuthCreateOptions = {
- configApi: ConfigApi;
+ configApi?: ConfigApi;
discoveryApi: DiscoveryApi;
oauthRequestApi: OAuthRequestApi;
environment?: string;
diff --git a/packages/core-components/src/layout/SignInPage/types.ts b/packages/core-components/src/layout/SignInPage/types.ts
index 6213c03432..a7e1ca62c2 100644
--- a/packages/core-components/src/layout/SignInPage/types.ts
+++ b/packages/core-components/src/layout/SignInPage/types.ts
@@ -45,9 +45,11 @@ export type onSignInFailure = () => void;
export type onSignInStarted = () => void;
export type ProviderComponent = ComponentType<
- { onSignInStarted: onSignInStarted } & {
- onSignInFailure: onSignInFailure;
- } & SignInPageProps & { config: SignInProviderConfig }
+ SignInPageProps & {
+ config: SignInProviderConfig;
+ onSignInStarted(): void;
+ onSignInFailure(): void;
+ }
>;
export type ProviderLoader = (
From 19a0d5b4295e8012851dd86800cd521746400dc7 Mon Sep 17 00:00:00 2001
From: Aramis Sennyey
Date: Mon, 6 Mar 2023 17:03:42 -0500
Subject: [PATCH 023/511] Add additional auth backend props and limit
visibility.
Signed-off-by: Aramis Sennyey
---
plugins/auth-backend/config.d.ts | 97 +++++++++++++++++++++++++++++---
1 file changed, 88 insertions(+), 9 deletions(-)
diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts
index 5aff9df90a..cdd3fe1bf0 100644
--- a/plugins/auth-backend/config.d.ts
+++ b/plugins/auth-backend/config.d.ts
@@ -62,30 +62,72 @@ export interface Config {
*/
providers?: {
google?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ callbackUrl: string;
+ };
};
github?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ callbackUrl?: string;
+ enterpriseInstanceUrl?: string;
+ };
};
gitlab?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ audience?: string;
+ callbackUrl?: string;
+ };
};
saml?: {
entryPoint: string;
logoutUrl?: string;
issuer: string;
+ /**
+ * @visibility secret
+ */
cert: string;
audience?: string;
+ /**
+ * @visibility secret
+ */
privateKey?: string;
authnContext?: string[];
identifierFormat?: string;
+ /**
+ * @visibility secret
+ */
decryptionPvk?: string;
signatureAlgorithm?: 'sha256' | 'sha512';
digestAlgorithm?: string;
acceptedClockSkewMs?: number;
};
okta?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ audience: string;
+ authServerId?: string;
+ idp?: string;
+ callbackUrl?: string;
+ };
};
oauth2?: {
[authEnv: string]: {
@@ -101,19 +143,56 @@ export interface Config {
};
};
oidc?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ callbackUrl?: string;
+ metadataUrl: string;
+ scope?: string;
+ prompt?: string;
+ };
};
auth0?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ domain: string;
+ callbackUrl?: string;
+ audience?: string;
+ connection?: string;
+ connectionScope?: string;
+ };
};
microsoft?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ tenantId: string;
+ callbackUrl?: string;
+ };
};
onelogin?: {
- [authEnv: string]: { [key: string]: string };
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ issuer: string;
+ callbackUrl?: string;
+ };
};
awsalb?: {
- issuer?: string;
+ iss?: string;
region: string;
};
cfaccess?: {
From 354295465f7e35b714ed13677be63851be4ad753 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 7 Mar 2023 09:53:11 +0000
Subject: [PATCH 024/511] fix(deps): update dependency kafkajs to v2.2.4
Signed-off-by: Renovate Bot
---
yarn.lock | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 14d1ddbc05..07cfb527df 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -28053,9 +28053,9 @@ __metadata:
linkType: hard
"kafkajs@npm:^2.0.0":
- version: 2.2.3
- resolution: "kafkajs@npm:2.2.3"
- checksum: 30f17de75da852942334b6069c5c515e2531a7b610997f0e4c6088281f16588df45ac920218411d9ae995c09af1f69186ed4d73cbe0e5f1247ec756dd9c7678e
+ version: 2.2.4
+ resolution: "kafkajs@npm:2.2.4"
+ checksum: 83e9e8bc50a09b142f4ff79f6a2bd88ecc21b83bcefe6621ab1716118d624886befb7371731274f67812ce35dd50b53140ff3b49a06e5d9169fe6b164d72fea5
languageName: node
linkType: hard
From f04f99a897cddc71c3137c1b4d7b693eaaa4fa93 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 7 Mar 2023 13:04:23 +0000
Subject: [PATCH 025/511] chore(deps): update graphqlcodegenerator monorepo to
v3.2.2
Signed-off-by: Renovate Bot
---
yarn.lock | 100 +++++++++++++++++++++++++++++-------------------------
1 file changed, 54 insertions(+), 46 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 2bf9c900df..337903e13e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10604,8 +10604,8 @@ __metadata:
linkType: hard
"@graphql-codegen/cli@npm:^3.0.0":
- version: 3.2.1
- resolution: "@graphql-codegen/cli@npm:3.2.1"
+ version: 3.2.2
+ resolution: "@graphql-codegen/cli@npm:3.2.2"
dependencies:
"@babel/generator": ^7.18.13
"@babel/template": ^7.18.10
@@ -10626,12 +10626,12 @@ __metadata:
"@whatwg-node/fetch": ^0.8.0
chalk: ^4.1.0
cosmiconfig: ^7.0.0
- cosmiconfig-typescript-loader: ^4.3.0
debounce: ^1.2.0
detect-indent: ^6.0.0
- graphql-config: ^4.4.0
+ graphql-config: ^4.5.0
inquirer: ^8.0.0
is-glob: ^4.0.1
+ jiti: ^1.17.1
json-to-pretty-yaml: ^1.2.2
listr2: ^4.0.5
log-symbols: ^4.0.0
@@ -10639,7 +10639,6 @@ __metadata:
shell-quote: ^1.7.3
string-env-interpolation: ^1.0.1
ts-log: ^2.2.3
- ts-node: ^10.9.1
tslib: ^2.4.0
yaml: ^1.10.0
yargs: ^17.0.0
@@ -10650,7 +10649,7 @@ __metadata:
graphql-code-generator: cjs/bin.js
graphql-codegen: cjs/bin.js
graphql-codegen-esm: esm/bin.js
- checksum: b62e2a3cee866cb006163946272f25ba9cc59bb2d45b7b3df5d1b220096e79183929456a440e5c4980d6a5664d6b14d7870d7f1760eb250b9211f4743d2afad3
+ checksum: b94284ac538a3504f96c7d507c140b7cfee30042209c4230ffc3068f05b6b27c75e1922b31c696363ab43e34e472ed194cc72996bbb10f59991cd2a4a35ff36e
languageName: node
linkType: hard
@@ -10669,18 +10668,18 @@ __metadata:
linkType: hard
"@graphql-codegen/graphql-modules-preset@npm:^3.0.0":
- version: 3.1.0
- resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.0"
+ version: 3.1.1
+ resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.1"
dependencies:
"@graphql-codegen/plugin-helpers": ^4.1.0
- "@graphql-codegen/visitor-plugin-common": 3.0.1
+ "@graphql-codegen/visitor-plugin-common": 3.0.2
"@graphql-tools/utils": ^9.0.0
change-case-all: 1.0.15
parse-filepath: ^1.0.2
tslib: ~2.5.0
peerDependencies:
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
- checksum: cee2e7f8afbc0b0d81592abfc8894422b791f0eca6e878a789de980bf1710a3c726786ade296e653cc83f920b2618aa9f5c9dbb6934ee9da0122b2d10ef5bdb5
+ checksum: f437590afa33ac308c075d214b501404ae2f99888cac8071d05cc2b8c7ceaea5aef8f86bb60e7a9a45902126dc99bd20d77e951c0beef665aaa31ac3c2217e26
languageName: node
linkType: hard
@@ -10714,39 +10713,39 @@ __metadata:
linkType: hard
"@graphql-codegen/typescript-resolvers@npm:^3.0.0":
- version: 3.1.0
- resolution: "@graphql-codegen/typescript-resolvers@npm:3.1.0"
+ version: 3.1.1
+ resolution: "@graphql-codegen/typescript-resolvers@npm:3.1.1"
dependencies:
"@graphql-codegen/plugin-helpers": ^4.1.0
- "@graphql-codegen/typescript": ^3.0.1
- "@graphql-codegen/visitor-plugin-common": 3.0.1
+ "@graphql-codegen/typescript": ^3.0.2
+ "@graphql-codegen/visitor-plugin-common": 3.0.2
"@graphql-tools/utils": ^9.0.0
auto-bind: ~4.0.0
tslib: ~2.5.0
peerDependencies:
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
- checksum: 05888a9dfd1556fe15465a524750c36881334c231297e2e89bccb536450bed61fde2ba182ba4e79e34be846ce2e2439f3f6b31a67e7437f03a4e4ace62e84dcd
+ checksum: 88faa1ca2335096aa9939101f3591007d9fa477836d969a3c622dbf67704505600387a2e9fbb416d61b5ef42dbd79a0d351003037c0756d8d0c7f32c7961e783
languageName: node
linkType: hard
-"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.1":
- version: 3.0.1
- resolution: "@graphql-codegen/typescript@npm:3.0.1"
+"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.2":
+ version: 3.0.2
+ resolution: "@graphql-codegen/typescript@npm:3.0.2"
dependencies:
"@graphql-codegen/plugin-helpers": ^4.1.0
"@graphql-codegen/schema-ast": ^3.0.1
- "@graphql-codegen/visitor-plugin-common": 3.0.1
+ "@graphql-codegen/visitor-plugin-common": 3.0.2
auto-bind: ~4.0.0
tslib: ~2.5.0
peerDependencies:
graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
- checksum: 56a369237971cc4a5a4987628ec0fcceed66ec03a292b3d17b6ffb64279185cd085be351268c55be6b152634c430e885b9c584d816aaa25f067d91c6996c329a
+ checksum: e92dc54804b6ad45fb2499b91cb89743e455a984684e2b1df1b1a8f479a0bbffa5c625be97ccb55874ac8b7316a820b546e9e312b22eda78012acd5c27594a28
languageName: node
linkType: hard
-"@graphql-codegen/visitor-plugin-common@npm:3.0.1":
- version: 3.0.1
- resolution: "@graphql-codegen/visitor-plugin-common@npm:3.0.1"
+"@graphql-codegen/visitor-plugin-common@npm:3.0.2":
+ version: 3.0.2
+ resolution: "@graphql-codegen/visitor-plugin-common@npm:3.0.2"
dependencies:
"@graphql-codegen/plugin-helpers": ^4.1.0
"@graphql-tools/optimize": ^1.3.0
@@ -10760,7 +10759,7 @@ __metadata:
tslib: ~2.5.0
peerDependencies:
graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
- checksum: 32bf553f73938581f634b1bbdf8616b1cb30cc85c73d7a8f6088d2a81a957e198c7c278edf6582c1eee7328a4463cea4725316b1743b87b26dc3e9fdd8318648
+ checksum: c8f941df7f8304b722b492ceaf15dddcf33e3a69bc29b54970908ffa12b14d92276958005bd307648e0cdc55f9e243d0fb390862f73a17a26bd50f6484ac42d6
languageName: node
linkType: hard
@@ -20284,18 +20283,6 @@ __metadata:
languageName: node
linkType: hard
-"cosmiconfig-typescript-loader@npm:^4.3.0":
- version: 4.3.0
- resolution: "cosmiconfig-typescript-loader@npm:4.3.0"
- peerDependencies:
- "@types/node": "*"
- cosmiconfig: ">=7"
- ts-node: ">=10"
- typescript: ">=3"
- checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb
- languageName: node
- linkType: hard
-
"cosmiconfig@npm:8.0.0":
version: 8.0.0
resolution: "cosmiconfig@npm:8.0.0"
@@ -24970,9 +24957,9 @@ __metadata:
languageName: node
linkType: hard
-"graphql-config@npm:^4.4.0":
- version: 4.4.0
- resolution: "graphql-config@npm:4.4.0"
+"graphql-config@npm:^4.5.0":
+ version: 4.5.0
+ resolution: "graphql-config@npm:4.5.0"
dependencies:
"@graphql-tools/graphql-file-loader": ^7.3.7
"@graphql-tools/json-file-loader": ^7.3.7
@@ -24981,14 +24968,17 @@ __metadata:
"@graphql-tools/url-loader": ^7.9.7
"@graphql-tools/utils": ^9.0.0
cosmiconfig: 8.0.0
- minimatch: 4.2.1
+ jiti: 1.17.1
+ minimatch: 4.2.3
string-env-interpolation: 1.0.1
tslib: ^2.4.0
peerDependencies:
cosmiconfig-toml-loader: ^1.0.0
- cosmiconfig-typescript-loader: ^4.0.0
graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
- checksum: 2f8cbb4710a7c0a411074eb843317bc66e5602fdab7eefa9765812d986d4b04fc2d285d3c0811ed0efaef12ea58351676561d704e79880f5848ed970badab500
+ peerDependenciesMeta:
+ cosmiconfig-toml-loader:
+ optional: true
+ checksum: 8ab1a3ce3534598ddac2df213b6af2eecd9ebcca2268d39cc3e87a6e55749483389a6df222e9e0acd638dd2479378a5c8e8d90f980e6a54e700c4c4ae3522123
languageName: node
linkType: hard
@@ -27615,6 +27605,24 @@ __metadata:
languageName: node
linkType: hard
+"jiti@npm:1.17.1":
+ version: 1.17.1
+ resolution: "jiti@npm:1.17.1"
+ bin:
+ jiti: bin/jiti.js
+ checksum: 56c6d8488e7e9cc6ee66a0f0d5e18db6669cb12b2e93364f393442289a9bc75a8e8c796249f59015e01c3ebdf9478e2ca8b76c30e29072c678ee00d39de757c7
+ languageName: node
+ linkType: hard
+
+"jiti@npm:^1.17.1":
+ version: 1.17.2
+ resolution: "jiti@npm:1.17.2"
+ bin:
+ jiti: bin/jiti.js
+ checksum: 51941fea3622d1ff80d914ec6ec95ae463ede598a4a2317f1e8ff018823212eba6b9ea1c638c97c18f681870b1c2b9f49fbb13021b7c2415c46c8a3b1910f1e3
+ languageName: node
+ linkType: hard
+
"jju@npm:~1.4.0":
version: 1.4.0
resolution: "jju@npm:1.4.0"
@@ -30323,12 +30331,12 @@ __metadata:
languageName: node
linkType: hard
-"minimatch@npm:4.2.1":
- version: 4.2.1
- resolution: "minimatch@npm:4.2.1"
+"minimatch@npm:4.2.3":
+ version: 4.2.3
+ resolution: "minimatch@npm:4.2.3"
dependencies:
brace-expansion: ^1.1.7
- checksum: 2b1514e3d0f29a549912f0db7ae7b82c5cab4a8f2dd0369f1c6451a325b3f12b2cf473c95873b6157bb8df183d6cf6db82ff03614b6adaaf1d7e055beccdfd01
+ checksum: 3392388e3ef7de7ae9a3a48d48a27a323934452f4af81b925dfbe85ce2dc07da855e3dbcc69229888be4e5118f6c0b79847d30f3e7c0e0017b25e423c11c0409
languageName: node
linkType: hard
From c7d88f8bab3ffce2f2939a1accdfd98e3d95edfd Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Mon, 6 Mar 2023 14:35:12 +0100
Subject: [PATCH 026/511] GOVERNANCE: update governance based on CNCF
contributor ladder template
Co-authored-by: Johan Haals
Signed-off-by: Patrik Oldsberg
---
.github/vale/Vocab/Backstage/accept.txt | 1 +
GOVERNANCE.md | 266 ++++++++++++++++++------
OWNERS.md | 83 +++++---
3 files changed, 258 insertions(+), 92 deletions(-)
diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt
index 63fa474115..d3b0928b6e 100644
--- a/.github/vale/Vocab/Backstage/accept.txt
+++ b/.github/vale/Vocab/Backstage/accept.txt
@@ -82,6 +82,7 @@ Debounce
debuggability
declaratively
deduplicated
+deliverables
dependabot
deps
destructured
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
index 5bafa19c81..82380129c6 100644
--- a/GOVERNANCE.md
+++ b/GOVERNANCE.md
@@ -1,88 +1,234 @@
-# Process for becoming a maintainer
+# Project Areas
-## a) Your organization is not yet a maintainer
+The Backstage project is divided into several project areas, each covering particular parts of the project. The main driver for each area is ownership of code in the main Backstage repository, as well as other repositories in the Backstage GitHub organization. Each area has a set of maintainers and repository content that they own. There may be no overlap in ownership between areas, which is defined as multiple owners for a single line in the GitHub code owners file. Each area is represented by a team in the Backstage GitHub organization. Apart from certain project-wide concerns, such as the release process, each area is self-governing and chooses their own ways of working. Project areas may also have special interest groups (SIGs) related to their area, but this is not required.
-- Express interest to the sponsors that your organization is interested in becoming a maintainer. Becoming a maintainer generally means that you are going to be spending substantial time on Backstage for the foreseeable future. You should have domain expertise and be extremely proficient in TypeScript.
-- We will expect you to start contributing increasingly complicated PRs, under the guidance of the existing maintainers.
-- We may ask you to do some PRs from our backlog.
-- As you gain experience with the code base and our standards, we will ask you to do code reviews for incoming PRs.
-- After a period of approximately 2-3 months of working together and making sure we see eye to eye, the existing sponsors and maintainers will confer and decide whether to grant maintainer status or not. We make no guarantees on the length of time this will take, but 2-3 months is the approximate goal.
+The project areas as well as their maintainers are listed in the [OWNERS.md](./OWNERS.md) file.
-## b) Your organization is currently a maintainer
+Each project area must have at least one maintainer. Project area maintainers may have shared ownership with the core maintainers, which in that case is considered an incubating area. The project area maintainers help drive work forward in the area, but they might not yet feel ready to take on ownership. The goal should generally be that these project area maintainers eventually become sole maintainers of the project area. This is to allow for a more smooth onboarding and transition of ownership, where members of the community might for example be new to open source maintainership.
-To become a maintainer you need to demonstrate the following:
+## Adding new project areas
-- First decide whether your organization really needs more people with maintainer access. Valid reasons are "blast radius", a large organization that is working on multiple unrelated projects, etc.
-- Contact a sponsor for your organization and express interest.
-- Start doing PRs and code reviews under the guidance of your maintainer.
-- After a period of 1-2 months the existing sponsors will discuss granting maintainer access.
-- Maintainer access can be upgraded to sponsor access after another conference of the existing sponsors.
+Project areas are added by nominating new maintainers for that area. See the sections for becoming a [Project Area Maintainer](#project-area-maintainer).
-# Maintainer responsibilities
+Project areas may also by added by splitting existing areas. Every area that is created through this process must have at least one maintainer.
-- Monitor email aliases.
-- Monitor Discord (delayed response is perfectly acceptable).
-- Triage GitHub issues and perform pull request reviews for other maintainers and the community.
-- Triage build issues - file issues for known flaky builds or bugs, and either fix or find someone to fix any master build breakages.
-- During GitHub issue triage, apply all applicable ([labels](https://github.com/backstage/backstage/labels)) to each new issue. Labels are extremely useful for future issue follow-up. Which labels to apply is somewhat subjective so just use your best judgment. A few of the most important labels that are not self-explanatory are:
- - good first issue: Mark any issue that can reasonably be accomplished by a new contributor with this label.
- - help wanted: Unless it is immediately obvious that someone is going to work on an issue (and if so assign it), mark it help wanted.
-- Make sure that ongoing PRs are moving forward at the right pace or closing them.
-- Participate when called upon in the security release process. Note that although this should be a rare occurrence, if a serious vulnerability is found, the process may take up to several full days of work to implement. This reality should be taken into account when discussing time commitment obligations with employers.
-- In general, continue to be willing to spend at least 25% of one's time working on Backstage (~1.25 business days per week).
-- We currently maintain an "on-call" rotation within the maintainers. Each on-call is 1 week. Although all maintainers are welcome to perform all of the above tasks, it is the on-call maintainer's responsibility to triage incoming issues/questions and marshal ongoing work forward. To reiterate, it is not the responsibility of the on-call maintainer to answer all questions and do all reviews, but it is their responsibility to make sure that everything is being actively covered by someone.
+## Removing project areas
-# When does a maintainer lose maintainer status
+Project areas are removed by removing all maintainers for that area and removing the corresponding team from the Backstage GitHub organization. The project area can be re-added later if there is a need for it. Reasons for removal may include lack of activity, lack of maintainers, or lack of relevance to the project.
-If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of the sponsors and maintainers per the voting process below.
+# Project Roles
-# End User Sponsors
+## Contributor
-## Role of a Backstage End User Sponsor
+A Contributor contributes directly to the project and adds value to it. Contributions need not be code. People at the Contributor level may be new contributors, or they may only contribute occasionally.
-- Provide support for Backstage by removing blockers, securing funding, providing advocacy, feedback, and ensuring project continuity and long term success.
-- Assist Backstage maintainers in prioritizing upcoming roadmap items and planned work.
-- Provide neutral mediation for any disputes that arise as part of the project.
+### Responsibilities
-## Backstage End User Sponsor Membership
+- Follow the [CNCF CoC](https://github.com/cncf/foundation/blob/main/code-of-conduct.md)
+- Follow the project [contributing guide](CONTRIBUTING.md)
+
+### How to get involved
+
+- Participating in community discussions
+- Helping other users
+- Submitting bug reports
+- Commenting on issues
+- Trying out new releases
+- Attending community events
+
+### How to contribute
+
+- Report and sometimes resolve issues
+- Occasionally submit PRs
+- Contribute to the documentation
+- Show up at meetings, takes notes
+- Answer questions from other community members
+- Submit feedback on issues and PRs
+- Test releases and patches and submit reviews
+- Run or helps run events
+- Promote the project in public
+
+## Organization Member
+
+An org member is a frequent contributor that has become a member of the Backstage GitHub organization. In addition to the responsibilities of contributors, an org member is also expected to be reasonably active in the community through continuous contributions of any type.
+
+An Organization Member must meet the responsibilities and has the requirements of a Contributor.
+
+### Responsibilities
+
+- Continues to contribute regularly, as demonstrated by having at least 10 GitHub contributions per year, as found in [Devstats](https://backstage.devstats.cncf.io/d/48/users-statistics-by-repository-group?orgId=1&var-period=y&var-metric=contributions&var-repogroup_name=All&from=now-1y&to=now&var-users=All).
+
+### Requirements
+
+- Must have successful contributions to the project, including at least one of the following:
+- Must have at least 10 contributions to the projects in the form of:
+ - Accepted PRs
+ - Helpful PR reviews
+ - Resolving GitHub issues
+ - Or some equivalent combination or contributions to the project
+- Must have been contributing for at least 3 months
+- Or is the member of a team that owns a project area, in which case the above requirements do not apply and the member is instead vetted by the project area maintainers.
+
+### Becoming an Organization Member
+
+Open an issue towards https://github.com/backstage/community using the [org membership request template](#TODO).
+
+### Privileges
+
+- Membership in the Backstage GitHub organization
+
+## Plugin Maintainer
+
+A Plugin Maintainer is responsible for maintaining an individual Backstage plugin or module. This includes reviewing contributions and respond to issues towards an individual plugin, as well as keeping the plugin up to date.
+
+Plugin Maintainer is a lightweight form of ownership that is primarily reflected though code owners of the plugin packages in the [CODEOWNERS.md](./.github/CODEOWNERS) file. Each plugin can have one or more maintainers. If a plugin becomes a significant part of the Backstage ecosystem, it may be promoted to be a distinct project area instead.
+
+A Plugin Maintainer has all the rights and responsibilities of an Organization Member.
+
+### Responsibilities
+
+- Review the majority of PRs towards the plugin
+- Respond to GitHub issues related to the plugin
+- Keep the plugin up-to-date with Backstage libraries and other dependencies
+- Follow the [reviewing guide](https://github.com/backstage/backstage/blob/master/REVIEWING.md)
+
+### Requirements
+
+- Is an Organization Member
+- Display knowledge of Backstage's review process and best practices for plugin design
+- Is supportive of new and occasional contributors and helps get useful PRs in shape to merge
+
+### Privileges
+
+- GitHub code owner of the plugin directory, with rights to approve and merge PRs towards the plugin
+
+### Becoming a Plugin Maintainer
+
+To become a Plugin Maintainer, you first need to be an Organization Member. You can then file a pull request towards [CODEOWNERS.md](./.github/CODEOWNERS) requesting to be added as a code owner of the plugin directory. Existing code owners of that plugin alongside the core maintainers will then review the request.
+
+## Project Area Maintainer
+
+Project Area Maintainers are owners of a particular project area. They are expected to review and merge pull requests towards their area, and also drive development and manage tech health. A Project Area Maintainer also need to commit a certain number of hours per month towards the project, and exercise judgment for the good of the project, independent of their employer. Project Area Maintainers should also mentor new maintainers and participate in and lead community meetings related to their area. New Project Area Maintainers need to be approved by the existing project area maintainers, or the core maintainers if it is a new area.
+
+The maintainers of a project area may be represented by a team in external organization. In this case, the state as a project area maintainer is tied to the membership in that team. New members of the team may automatically be added as maintainers, as well as removed when they leave. This process is governed autonomously by the team of project area maintainers.
+
+A Project Area Maintainer has all the rights and responsibilities of an Organization Member.
+
+### Responsibilities
+
+- Review PRs towards their project area. Project area maintainers are expected to review at least 20 PRs per year, or the majority of all PRs towards the area
+- Follow the [reviewing guide](https://github.com/backstage/backstage/blob/master/REVIEWING.md)
+- Triage and respond to issues related to their project area
+- Mentor new project area maintainers
+- Write refactoring PRs
+- Determine strategy and policy for the project area
+- Participate in or leading community meetings related to their project area
+
+### Requirements
+
+- Is an Organization Member
+- Have made at least 5 meaningful contributions towards the project area
+- Demonstrates knowledge of their project area, and how it fits into the larger Backstage project
+- Is able to exercise judgment for the good of the project, independent of their employer, friends, or team
+- Mentors other contributors and project area maintainers
+- Can commit to spending at least 16 hours per month working on the project, preferably distributed evenly across the month
+
+### Privileges
+
+- Approve and merge PRs towards their project area
+- Drive the direction and roadmap of their project area
+
+### Becoming a Project Area Maintainer
+
+If you are interested in becoming a project area maintainer, reach out to the existing maintainers for that area. If you wish to become a maintainer for a new area, reach out to the core maintainers.
+
+Any current project area maintainer or core maintainer may nominate a new project area maintainer by opening a PR towards the [OWNERS.md](https://github.com/backstage/backstage/blob/master/OWNERS.md) file. A majority of the project area maintainers for that area must approve the PR. If there are no existing maintainers for that area, the PR must be approved by a majority of the core maintainers.
+
+## Core Maintainer
+
+Core Maintainers are responsible for the Backstage project as a whole. They help review and merge project-level pull requests as well as coordinate work affecting multiple project areas. A project maintainer needs to commit the majority of their working time towards the project, and exercise judgment for the good of the project, independent of their employer. Project maintainers should also mentor and seek out new maintainers, lead community meetings, and communicate with the CNCF on behalf of the project. To become a project maintainer one needs to have been the maintainer of a number of different project areas, demonstrate a deep knowledge of large parts of the Backstage project, and be backed by the existing project maintainers.
+
+A Core Maintainer have all the rights and responsibilities of a Project Area Maintainer.
+
+### Responsibilities
+
+- Take part in the incoming issue and PR triage and review process. PRs are shared equally among all maintainers
+- Mentor new Project Area Maintainers and Plugin Maintainers
+- Drive refactoring and manage tech health across the entire project
+- Participate in CNCF maintainer activities
+- Respond to security incidents in accordance to our [security policy](./SECURITY.md)
+- Determine strategy and policy for the project
+- Participate in or leading community meetings
+
+### Requirements
+
+- Experience as a Project Area Maintainer for at least 6 months
+- Demonstrates a broad knowledge of the project across multiple areas
+- Is able to exercise judgment for the good of the project, independent of their employer, friends, or team
+- Mentors other contributors
+- Can commit to spending at least 10 days per month working on the project
+
+### Privileges
+
+- Approve PRs that fall outside any specific project area
+- Merge PRs to any area of the project
+- Represent the project in public as a Maintainer
+- Communicate with the CNCF on behalf of the project
+- Have a vote in Maintainer decision-making meetings
+
+### Becoming a Core Maintainer
+
+Any core maintainer or end user sponsor may nominate a new core maintainer by opening a PR towards the [OWNERS.md](https://github.com/backstage/backstage/blob/master/OWNERS.md) file. Core maintainers must be approved by a majority of the existing core maintainers and end user sponsors.
+
+## End User Sponsors
+
+### Role of a Backstage End User Sponsor
+
+- Provide support for Backstage by removing blockers, securing funding, providing advocacy, feedback, and ensuring project continuity and long term success
+- Assist Backstage maintainers in prioritizing upcoming roadmap items and planned work
+- Provide neutral mediation for any disputes that arise as part of the project
+
+### Backstage End User Sponsor Membership
The End User Sponsors group comprises at most 5 people. To be eligible for membership in the group, you or the company where you work you must:
- Be responsible for and end user of a production Backstage deployment of non-trivial size
- Be active contributors to the open source project
- Be willing and able to attend regularly-scheduled End User Sponsor meetings
-- Abide by [Backstage’s Code of Conduct](./CODE_OF_CONDUCT.md).
+- Abide by [CNCF CoC](https://github.com/cncf/foundation/blob/main/code-of-conduct.md)
Candidates for membership will be nominated by current Sponsor members or by Backstage maintainers. If there are more nominations than Sponsor seats remaining, existing sponsors shall vote on the candidates, and the candidates with the most votes will become Sponsors. Any ties will be broken by current Backstage sponsors.
-# Reviewers
-
-The project also contains a team called [@backstage/reviewers](https://github.com/orgs/backstage/teams/reviewers). This is the team of people who are the fallback in [`CODEOWNERS`](./.github/CODEOWNERS). This team will typically contain the maintainers, and a small number of additional people who are permitted to approve and merge pull requests. The purpose of this group is to offload some of the review work from the maintainers, simplifying and speeding up the review process for contributors.
-
-This responsibility is distinct from the maintainer role. A reviewer must not approve and merge changes that have a level of impact that a maintainer should oversee; see below for clarification. For that class of changes, a reviewer can still review the pull request thoroughly without approving it (e.g. with a comment on the pull request), and is expected to notify `@backstage/maintainers` for final approval. Note that it is best to not use the GitHub review approve functionality for this, since that would let Hall of Fame members self-merge the pull request before maintainers get the chance to look at it.
-
-The following is a non-exhaustive list of types of change, for which a reviewer should defer final decision and merge to a maintainer:
-
-- A larger refactoring that significantly affects the structure of/between packages
-- Changes that settle or alter the trajectory of contested ongoing topics in issues or elsewhere
-- Changes that affect the [Architecture Decision Records](./docs/architecture-decisions)
-- Changes to APIs that have large customer impact, such as the core APIs in `@backstage/core-*` packages, or significant `@backstage/cli` changes.
-- Pull requests whose build checks are not passing fully
-- Additions and removals of entire packages
-- Releases (e.g. pull requests titled `Version Packages`)
-
-A maintainer may suggest an addition to the reviewers team by opening a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. Prospective reviewers are not expected to do this themselves, but should rather ask a maintainer to sponsor their addition. All of the maintainers and sponsors are called to vote on the addition (see the section below about voting). If the vote passes, the pull request can be approved and merged, and the corresponding addition to the GitHub team can be made.
-
-A reviewer can elect to remove themselves from the reviewers group by opening, or asking a maintainer to open, a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. A maintainer will approve and merge the pull request, and the corresponding removal from the GitHub team can be made.
-
-A maintainer can call on the other maintainers and sponsors for a vote to remove a reviewer (see the section below about conflict resolution and voting). If the vote passes, a maintainer creates a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. After approval by another maintainer, the pull request can be merged, and the corresponding removal from the GitHub team can be made.
-
# Conflict resolution and voting
-In general, we prefer that technical issues and membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting.
+In general, we prefer that technical issues and membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and core maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting.
In all cases in this document where voting is mentioned, the voting process is a simple majority in which each sponsor receives two votes and each maintainer receives one vote. If such a majority is reached, the vote is said to have _passed_.
-# Adding new projects to the Backstage GitHub organization
+## Inactivity
-New projects will be added to the Backstage organization via GitHub issue discussion in one of the existing projects in the organization. Once sufficient discussion has taken place (~3-5 business days but depending on the volume of conversation), the maintainers of the project where the issue was opened (since different projects in the organization may have different maintainers) will decide whether the new project should be added. See the section above on voting if the maintainers cannot easily decide.
+It is important for contributors to be and stay active to set an example and show commitment to the project. Inactivity is harmful to the project as it may lead to unexpected delays, contributor attrition, and a lost of trust in the project.
+
+Inactivity is measured by periods of no contributions for longer than:
+
+- Core Maintainer: 2 months
+- Project Area Maintainer: 4 months
+- Plugin Maintainer: 6 months
+- Organization Member: 8 months
+
+Consequences of being inactive include:
+
+- Involuntary removal or demotion
+- Being asked to move to Emeritus status
+
+## Involuntary Removal or Demotion
+
+Involuntary removal/demotion of a contributor happens when responsibilities and requirements aren't being met. This may include repeated patterns of inactivity, extended period of inactivity, a period of failing to meet the requirements of your role, and/or a violation of the Code of Conduct. This process is important because it protects the community and its deliverables while also opens up opportunities for new contributors to step in.
+
+Involuntary removal or demotion is handled through a vote by a majority of the current Core Maintainers. Some aspects of this process may be automated, such as removal after periods of inactivity.
+
+## Stepping Down/Emeritus Process
+
+If and when contributors' commitment levels change, contributors can consider stepping down (moving down the contributor ladder) vs moving to emeritus status (completely stepping away from the project).
+
+Contact the Maintainers about changing to Emeritus status, or reducing your contributor level.
diff --git a/OWNERS.md b/OWNERS.md
index 6615046540..e41d8c6b62 100644
--- a/OWNERS.md
+++ b/OWNERS.md
@@ -1,43 +1,62 @@
- See [CONTRIBUTING.md](CONTRIBUTING.md) for general contribution guidelines.
- See [GOVERNANCE.md](GOVERNANCE.md) for governance guidelines and responsibilities.
-This page lists all active sponsors and maintainers.
+## Core Maintainers
+
+| Maintainer | Organization | GitHub | Discord |
+| --------------- | ------------ | ----------------------------------------------- | ------------- |
+| Patrik Oldsberg | Spotify | [Rugvip](https://github.com/Rugvip) | `Rugvip#0019` |
+| Fredrik Adelöw | Spotify | [freben](https://github.com/freben) | `freben#3926` |
+| Ben Lambert | Spotify | [benjdlambert](https://github.com/benjdlambert) | `blam#2159` |
+| Johan Haals | Spotify | [jhaals](https://github.com/jhaals) | `Johan#0679` |
+
+# Project Areas
+
+## Catalog
+
+Team: @backstage/catalog
+
+| Name | Organization | GitHub | Discord |
+| ---- | ------------ | ---------------------------- | ------- |
+| TBD | TBD | [TBD](http://github.com/TBD) | TBD |
+
+## TechDocs
+
+Team: @backstage/techdocs
+
+| Name | Organization | GitHub | Discord |
+| ---- | ------------ | ---------------------------- | ------- |
+| TBD | TBD | [TBD](http://github.com/TBD) | TBD |
+
+## Search
+
+Team: @backstage/search
+
+| Name | Organization | GitHub | Discord |
+| ---- | ------------ | ---------------------------- | ------- |
+| TBD | TBD | [TBD](http://github.com/TBD) | TBD |
# Sponsors
-- Niklas Gustavsson ([protocol7](https://github.com/protocol7)) (ngn@spotify.com)
-- Dave Zolotusky ([dzolotusky](https://github.com/dzolotusky)) (dzolo@spotify.com)
-- Lee Mills ([leemills83](https://github.com/leemills83)) (leem@spotify.com)
+| Name | Organization | GitHub | Email |
+| ----------------- | ------------ | ------------------------------------------- | ----------------- |
+| Niklas Gustavsson | Spotify | [protocol7](https://github.com/protocol7) | ngn@spotify.com |
+| Dave Zolotusky | Spotify | [dzolotusky](https://github.com/dzolotusky) | dzolo@spotify.com |
+| Lee Mills | Spotify | [leemills83](https://github.com/leemills83) | leem@spotify.com |
-# Maintainers
+# Organization Members
-- Patrik Oldsberg ([rugvip](https://github.com/rugvip)) (Discord: @Rugvip)
-- Fredrik Adelöw ([freben](https://github.com/freben)) (Discord: @freben)
-- Ben Lambert ([benjdlambert](https://github.com/benjdlambert)) (Discord: @blam)
-- Johan Haals ([jhaals](https://github.com/jhaals)) (Discord: @jhaals)
+People that have made significant contributions to the project
-# Reviewers
+| Name | Organization | GitHub | Discord |
+| ------------- | ------------ | ----------------------------------------------- | ------------------------------ |
+| Andrew Thauer | Wealthsimple | [andrewthauer](https://github.com/andrewthauer) | `andrewthauer#3060` |
+| David Tuite | Roadie | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` |
+| Jussi Hallila | Roadie | [Xantier](https://github.com/Xantier) | `Xantier#0086` |
+| Adam Harvey | Cisco | [adamdmharvey](https://github.com/adamdmharvey) | `adamharvey#3739` |
-See [`GOVERNANCE.md`](./GOVERNANCE.md) for details about how the reviewers team
-works.
+# Emeritus Core Maintainers
-- Patrik Oldsberg ([rugvip](https://github.com/rugvip)) (Discord: @Rugvip)
-- Fredrik Adelöw ([freben](https://github.com/freben)) (Discord: @freben)
-- Ben Lambert ([benjdlambert](https://github.com/benjdlambert)) (Discord: @blam)
-- Johan Haals ([jhaals](https://github.com/jhaals)) (Discord: @jhaals)
-- Himanshu Mishra ([OrkoHunter](https://github.com/OrkoHunter)) (Discord: @OrkoHunter)
-- Tim Hansen ([timbonicus](https://github.com/timbonicus)) (Discord: @timbonicus)
-
-# Emeritus maintainers
-
-- Stefan Ã…lund ([stefanalund](https://github.com/stefanalund)) (Discord: @stalund)
-
-# Hall of Fame
-
-People that have made significant contributions to the project and earned write access.
-
-- Andrew Thauer - Wealthsimple (GitHub: [andrewthauer](https://github.com/andrewthauer))
-- Oliver Sand - SDA SE (GitHub: [Fox32](https://github.com/Fox32))
-- David Tuite - Roadie (GitHub: [dtuite](https://github.com/dtuite))
-- Adam Harvey - Cisco (GitHub: [adamdmharvey](https://github.com/adamdmharvey))
-- Dominik Henneke - SDA SE (GitHub: [dhenneke](https://github.com/dhenneke))
+| Maintainer | Organization | GitHub | Discord |
+| ------------ | ------------ | --------------------------------------------- | -------------- |
+| Stefan Ã…lund | Spotify | [stefanalund](https://github.com/stefanalund) | `stalund#9602` |
From 136bbfa000a7f93b814cd4f7e1a7336e7316506c Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Tue, 7 Mar 2023 19:13:15 +0100
Subject: [PATCH 027/511] Update GOVERNANCE.md
Co-authored-by: Phil Kuang
Signed-off-by: Patrik Oldsberg
---
GOVERNANCE.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
index 82380129c6..b2582ecd31 100644
--- a/GOVERNANCE.md
+++ b/GOVERNANCE.md
@@ -146,7 +146,7 @@ Any current project area maintainer or core maintainer may nominate a new projec
## Core Maintainer
-Core Maintainers are responsible for the Backstage project as a whole. They help review and merge project-level pull requests as well as coordinate work affecting multiple project areas. A project maintainer needs to commit the majority of their working time towards the project, and exercise judgment for the good of the project, independent of their employer. Project maintainers should also mentor and seek out new maintainers, lead community meetings, and communicate with the CNCF on behalf of the project. To become a project maintainer one needs to have been the maintainer of a number of different project areas, demonstrate a deep knowledge of large parts of the Backstage project, and be backed by the existing project maintainers.
+Core Maintainers are responsible for the Backstage project as a whole. They help review and merge project-level pull requests as well as coordinate work affecting multiple project areas. A core maintainer needs to commit the majority of their working time towards the project, and exercise judgment for the good of the project, independent of their employer. Core maintainers should also mentor and seek out new maintainers, lead community meetings, and communicate with the CNCF on behalf of the project. To become a core maintainer one needs to have been the maintainer of a number of different project areas, demonstrate a deep knowledge of large parts of the Backstage project, and be backed by the existing core maintainers.
A Core Maintainer have all the rights and responsibilities of a Project Area Maintainer.
From c17fa10182574f52491ecdf1295a526f9d62e781 Mon Sep 17 00:00:00 2001
From: Yuri Titi
Date: Tue, 7 Mar 2023 16:11:02 -0300
Subject: [PATCH 028/511] feat(@backstage/plugin-catalog-backend-module-azure):
Add branch filter support
Signed-off-by: Yuri Titi
---
.changeset/modern-colts-exercise.md | 5 +++
docs/integrations/azure/discovery.md | 9 +++--
.../src/lib/azure.ts | 1 +
.../AzureDevOpsEntityProvider.test.ts | 40 +++++++++++++++++--
.../providers/AzureDevOpsEntityProvider.ts | 10 +++--
.../src/providers/config.test.ts | 24 ++++++++++-
.../src/providers/config.ts | 2 +
.../src/providers/types.ts | 1 +
8 files changed, 81 insertions(+), 11 deletions(-)
create mode 100644 .changeset/modern-colts-exercise.md
diff --git a/.changeset/modern-colts-exercise.md b/.changeset/modern-colts-exercise.md
new file mode 100644
index 0000000000..d869945870
--- /dev/null
+++ b/.changeset/modern-colts-exercise.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-azure': minor
+---
+
+Add branch filter support
diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md
index 6cb135900e..d96b7d84ab 100644
--- a/docs/integrations/azure/discovery.md
+++ b/docs/integrations/azure/discovery.md
@@ -61,6 +61,7 @@ catalog:
host: selfhostedazure.yourcompany.com
organization: myorg
project: myproject
+ branch: development
```
The parameters available are:
@@ -70,6 +71,7 @@ The parameters available are:
- **`project:`** _(optional)_ Your project slug. Wildcards are supported as show on the examples above. If not set, all projects will be searched. For a project name containing spaces, use both single and double quotes as in `project: '"My Project Name"'`.
- **`repository:`** _(optional)_ The repository name. Wildcards are supported as show on the examples above. If not set, all repositories will be searched.
- **`path:`** _(optional)_ Where to find catalog-info.yaml files. Defaults to /catalog-info.yaml.
+- **`branch:`** _(optional)_ The branch name to use.
- **`schedule`** _(optional)_:
- **`frequency`**:
How often you want the task to run. The system does its best to avoid overlapping invocations.
@@ -80,9 +82,10 @@ The parameters available are:
- **`scope`** _(optional)_:
`'global'` or `'local'`. Sets the scope of concurrency control.
-_Note:_ the path parameter follows the same rules as the search on Azure DevOps
-web interface. For more details visit the
-[official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops).
+_Note:_
+
+- The path parameter follows the same rules as the search on Azure DevOps web interface. For more details visit the [official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops).
+- The branch parameters need that the branch desired it`s added on 'Searchable branches' on Azure DevOps Repositories
As this provider is not one of the default providers, you will first need to install
the Azure catalog plugin:
diff --git a/plugins/catalog-backend-module-azure/src/lib/azure.ts b/plugins/catalog-backend-module-azure/src/lib/azure.ts
index 0c96d133d3..714090d5bc 100644
--- a/plugins/catalog-backend-module-azure/src/lib/azure.ts
+++ b/plugins/catalog-backend-module-azure/src/lib/azure.ts
@@ -34,6 +34,7 @@ export interface CodeSearchResultItem {
project: {
name: string;
};
+ branch?: string;
}
const isCloud = (host: string) => host === 'dev.azure.com';
diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
index dff1164899..53919b9bb4 100644
--- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
@@ -105,9 +105,13 @@ describe('AzureDevOpsEntityProvider', () => {
await (taskDef.fn as () => Promise)();
const expectedEntities = codeSearchResults.map(item => {
- const url = encodeURI(
- `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}`,
- );
+ const url = item.branch
+ ? encodeURI(
+ `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}&version=GBmybranch`,
+ )
+ : encodeURI(
+ `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}`,
+ );
return {
entity: {
apiVersion: 'backstage.io/v1alpha1',
@@ -177,6 +181,36 @@ describe('AzureDevOpsEntityProvider', () => {
);
});
+ // eslint-disable-next-line jest/expect-expect
+ it('single mutation when repos use branch filter', async () => {
+ return expectMutation(
+ 'allReposSingleFile',
+ {
+ organization: 'myorganization',
+ project: 'myproject',
+ branch: 'mybranch',
+ },
+ [
+ {
+ fileName: 'catalog-info.yaml',
+ path: '/catalog-info.yaml',
+ repository: {
+ name: 'myrepo',
+ },
+ project: {
+ name: 'myproject',
+ },
+ branch: 'mybranch',
+ },
+ ],
+ 'https://dev.azure.com/myorganization/myproject',
+ {
+ 'myrepo?path=/catalog-info.yaml':
+ 'generated-589e8cc47341987c7a34f5291791151fa64f7754',
+ },
+ );
+ });
+
// eslint-disable-next-line jest/expect-expect
it('single mutation when multiple repos have multiple files', async () => {
return expectMutation(
diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts
index 788b9c2f05..457a9e74f2 100644
--- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts
@@ -177,8 +177,12 @@ export class AzureDevOpsEntityProvider implements EntityProvider {
private createObjectUrl(file: CodeSearchResultItem): string {
const baseUrl = `https://${this.config.host}/${this.config.organization}/${file.project.name}`;
- return encodeURI(
- `${baseUrl}/_git/${file.repository.name}?path=${file.path}`,
- );
+
+ let fullUrl = `${baseUrl}/_git/${file.repository.name}?path=${file.path}`;
+ if (this.config.branch) {
+ fullUrl += `&version=GB${this.config.branch}`;
+ }
+
+ return encodeURI(fullUrl);
}
}
diff --git a/plugins/catalog-backend-module-azure/src/providers/config.test.ts b/plugins/catalog-backend-module-azure/src/providers/config.test.ts
index a09079f1c3..02dbaab90e 100644
--- a/plugins/catalog-backend-module-azure/src/providers/config.test.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/config.test.ts
@@ -44,17 +44,30 @@ describe('readAzureDevOpsConfigs', () => {
},
},
};
+ const provider5 = {
+ host: 'azure.mycompany.com',
+ organization: 'mycompany',
+ project: 'myproject',
+ branch: 'mybranch',
+ };
+
const config = {
catalog: {
providers: {
- azureDevOps: { provider1, provider2, provider3, provider4 },
+ azureDevOps: {
+ provider1,
+ provider2,
+ provider3,
+ provider4,
+ provider5,
+ },
},
},
};
const actual = readAzureDevOpsConfigs(new ConfigReader(config));
- expect(actual).toHaveLength(4);
+ expect(actual).toHaveLength(5);
expect(actual[0]).toEqual({
...provider1,
path: '/catalog-info.yaml',
@@ -85,5 +98,12 @@ describe('readAzureDevOpsConfigs', () => {
frequency: Duration.fromISO(provider4.schedule.frequency),
},
});
+ expect(actual[4]).toEqual({
+ ...provider5,
+ branch: 'mybranch',
+ path: '/catalog-info.yaml',
+ repository: '*',
+ id: 'provider5',
+ });
});
});
diff --git a/plugins/catalog-backend-module-azure/src/providers/config.ts b/plugins/catalog-backend-module-azure/src/providers/config.ts
index c84c242488..3c10a50863 100644
--- a/plugins/catalog-backend-module-azure/src/providers/config.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/config.ts
@@ -41,6 +41,7 @@ function readAzureDevOpsConfig(id: string, config: Config): AzureDevOpsConfig {
const project = config.getString('project');
const host = config.getOptionalString('host') || 'dev.azure.com';
const repository = config.getOptionalString('repository') || '*';
+ const branch = config.getOptionalString('branch');
const path = config.getOptionalString('path') || '/catalog-info.yaml';
const schedule = config.has('schedule')
@@ -53,6 +54,7 @@ function readAzureDevOpsConfig(id: string, config: Config): AzureDevOpsConfig {
organization,
project,
repository,
+ branch,
path,
schedule,
};
diff --git a/plugins/catalog-backend-module-azure/src/providers/types.ts b/plugins/catalog-backend-module-azure/src/providers/types.ts
index b22a8551a5..3cd827b380 100644
--- a/plugins/catalog-backend-module-azure/src/providers/types.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/types.ts
@@ -22,6 +22,7 @@ export type AzureDevOpsConfig = {
organization: string;
project: string;
repository: string;
+ branch?: string;
path: string;
schedule?: TaskScheduleDefinition;
};
From e339789173e64f4eacca76492175edbd674e6334 Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Sat, 25 Feb 2023 00:10:13 -0600
Subject: [PATCH 029/511] Add global-agent to dependencies; Update Readme w/
instructions
Signed-off-by: zjpersc
---
packages/techdocs-cli/README.md | 7 +++++++
packages/techdocs-cli/package.json | 1 +
2 files changed, 8 insertions(+)
diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md
index ae296d2c26..e6ba03e1d0 100644
--- a/packages/techdocs-cli/README.md
+++ b/packages/techdocs-cli/README.md
@@ -40,6 +40,13 @@ yarn start
yarn techdocs-cli:dev [...options]
```
+### Connecting behind a proxy
+```sh
+# Prior to executing the techdocs-cli command
+export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY}
+export GLOBAL_AGENT_NO_PROXY=${NO_PROXY}
+```
+
### Using an example docs project
For the purpose of local development, we have created an example documentation project. You are of course also free to create your own local test site - all it takes is a `docs/index.md` and an `mkdocs.yml` in a directory.
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 0a3bbed06f..371ddf440f 100644
--- a/packages/techdocs-cli/package.json
+++ b/packages/techdocs-cli/package.json
@@ -69,6 +69,7 @@
"commander": "^9.1.0",
"dockerode": "^3.3.1",
"fs-extra": "^10.0.1",
+ "global-agent": "^3.0.0",
"http-proxy": "^1.18.1",
"react-dev-utils": "^12.0.0-next.60",
"serve-handler": "^6.1.3",
From 7b4991adb9f1b2bc86b4a3e490de22472c2d5398 Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Sat, 25 Feb 2023 00:37:06 -0600
Subject: [PATCH 030/511] Adding changeset
Signed-off-by: zjpersc
---
.changeset/short-panthers-float.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 .changeset/short-panthers-float.md
diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md
new file mode 100644
index 0000000000..91eafe28aa
--- /dev/null
+++ b/.changeset/short-panthers-float.md
@@ -0,0 +1,5 @@
+---
+'@techdocs/cli': patch
+---
+
+Adding global-agent to enable the ability to publish through a proxy
From 8af3a93d07c213b1f2b432504491ea20d1455233 Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Sun, 26 Feb 2023 20:40:13 -0600
Subject: [PATCH 031/511] Revert "Adding changeset"
This reverts commit b83d77e1bc7b608b0478d3de91c2080a9d153872.
Signed-off-by: zjpersc
---
.changeset/short-panthers-float.md | 5 -----
1 file changed, 5 deletions(-)
delete mode 100644 .changeset/short-panthers-float.md
diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md
deleted file mode 100644
index 91eafe28aa..0000000000
--- a/.changeset/short-panthers-float.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@techdocs/cli': patch
----
-
-Adding global-agent to enable the ability to publish through a proxy
From 1093f1b1cd62741029400aba24ec51b7d7121e55 Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Sun, 26 Feb 2023 20:40:21 -0600
Subject: [PATCH 032/511] Revert "Add global-agent to dependencies; Update
Readme w/ instructions"
This reverts commit 39f5a8389b8ff4afcb18fb19a0ca20d2552abc83.
Signed-off-by: zjpersc
---
packages/techdocs-cli/README.md | 7 -------
packages/techdocs-cli/package.json | 1 -
2 files changed, 8 deletions(-)
diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md
index e6ba03e1d0..ae296d2c26 100644
--- a/packages/techdocs-cli/README.md
+++ b/packages/techdocs-cli/README.md
@@ -40,13 +40,6 @@ yarn start
yarn techdocs-cli:dev [...options]
```
-### Connecting behind a proxy
-```sh
-# Prior to executing the techdocs-cli command
-export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY}
-export GLOBAL_AGENT_NO_PROXY=${NO_PROXY}
-```
-
### Using an example docs project
For the purpose of local development, we have created an example documentation project. You are of course also free to create your own local test site - all it takes is a `docs/index.md` and an `mkdocs.yml` in a directory.
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 371ddf440f..0a3bbed06f 100644
--- a/packages/techdocs-cli/package.json
+++ b/packages/techdocs-cli/package.json
@@ -69,7 +69,6 @@
"commander": "^9.1.0",
"dockerode": "^3.3.1",
"fs-extra": "^10.0.1",
- "global-agent": "^3.0.0",
"http-proxy": "^1.18.1",
"react-dev-utils": "^12.0.0-next.60",
"serve-handler": "^6.1.3",
From b348420a804d69047c98aea9743292c9156e4e3e Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Sun, 26 Feb 2023 20:44:08 -0600
Subject: [PATCH 033/511] Adding global-agent to dependencies; updated README
w/ instructions
Signed-off-by: zjpersc
---
.changeset/short-panthers-float.md | 5 +++++
packages/techdocs-cli/README.md | 7 +++++++
packages/techdocs-cli/package.json | 1 +
3 files changed, 13 insertions(+)
create mode 100644 .changeset/short-panthers-float.md
diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md
new file mode 100644
index 0000000000..41ec71a7aa
--- /dev/null
+++ b/.changeset/short-panthers-float.md
@@ -0,0 +1,5 @@
+---
+'@techdocs/cli': patch
+---
+
+Adding global-agent to enable the ability to publish through a proxy
\ No newline at end of file
diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md
index ae296d2c26..e6ba03e1d0 100644
--- a/packages/techdocs-cli/README.md
+++ b/packages/techdocs-cli/README.md
@@ -40,6 +40,13 @@ yarn start
yarn techdocs-cli:dev [...options]
```
+### Connecting behind a proxy
+```sh
+# Prior to executing the techdocs-cli command
+export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY}
+export GLOBAL_AGENT_NO_PROXY=${NO_PROXY}
+```
+
### Using an example docs project
For the purpose of local development, we have created an example documentation project. You are of course also free to create your own local test site - all it takes is a `docs/index.md` and an `mkdocs.yml` in a directory.
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 0a3bbed06f..371ddf440f 100644
--- a/packages/techdocs-cli/package.json
+++ b/packages/techdocs-cli/package.json
@@ -69,6 +69,7 @@
"commander": "^9.1.0",
"dockerode": "^3.3.1",
"fs-extra": "^10.0.1",
+ "global-agent": "^3.0.0",
"http-proxy": "^1.18.1",
"react-dev-utils": "^12.0.0-next.60",
"serve-handler": "^6.1.3",
From 9796fe16d731856b4e4d59bf66f7cafcafccdef1 Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Tue, 7 Mar 2023 14:31:34 -0600
Subject: [PATCH 034/511] Updating techdocs-cli dependency on
global-agent@3.0.0 in yarn.lock
Signed-off-by: zjpersc
---
yarn.lock | 1 +
1 file changed, 1 insertion(+)
diff --git a/yarn.lock b/yarn.lock
index 6973779ac5..b335996073 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13923,6 +13923,7 @@ __metadata:
dockerode: ^3.3.1
find-process: ^1.4.5
fs-extra: ^10.0.1
+ global-agent: ^3.0.0
http-proxy: ^1.18.1
nodemon: ^2.0.2
react-dev-utils: ^12.0.0-next.60
From 6620edc944c17302739b8717f8265d099075984b Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Tue, 7 Mar 2023 17:07:57 -0600
Subject: [PATCH 035/511] Fixing prettier errors
Signed-off-by: zjpersc
---
.changeset/short-panthers-float.md | 2 +-
packages/techdocs-cli/README.md | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md
index 41ec71a7aa..91eafe28aa 100644
--- a/.changeset/short-panthers-float.md
+++ b/.changeset/short-panthers-float.md
@@ -2,4 +2,4 @@
'@techdocs/cli': patch
---
-Adding global-agent to enable the ability to publish through a proxy
\ No newline at end of file
+Adding global-agent to enable the ability to publish through a proxy
diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md
index e6ba03e1d0..85c0075946 100644
--- a/packages/techdocs-cli/README.md
+++ b/packages/techdocs-cli/README.md
@@ -41,7 +41,8 @@ yarn techdocs-cli:dev [...options]
```
### Connecting behind a proxy
-```sh
+
+```sh
# Prior to executing the techdocs-cli command
export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY}
export GLOBAL_AGENT_NO_PROXY=${NO_PROXY}
From 172afbb4f0e83bcc149899f9c05e4f52d2b9682b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 8 Mar 2023 11:30:43 +0000
Subject: [PATCH 036/511] fix(deps): update dependency @google-cloud/firestore
to v6.5.0
Signed-off-by: Renovate Bot
---
yarn.lock | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 31923b65bd..a013eb5113 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10086,14 +10086,14 @@ __metadata:
linkType: hard
"@google-cloud/firestore@npm:^6.0.0":
- version: 6.4.3
- resolution: "@google-cloud/firestore@npm:6.4.3"
+ version: 6.5.0
+ resolution: "@google-cloud/firestore@npm:6.5.0"
dependencies:
fast-deep-equal: ^3.1.1
functional-red-black-tree: ^1.0.1
- google-gax: ^3.5.3
+ google-gax: ^3.5.7
protobufjs: ^7.0.0
- checksum: 8bbde2c9bad94459c231d41855e65866b2383f20e2741aa93d86204370172dd62af94e1eb66d977e000e0c7292c986eb25fe967db7ee847593fd9a68c9fb91e3
+ checksum: dd9cf4eee263a976239232143d5caf213c34850a352c6b6cb15b7b17cfddc2c6bee5e72eed0d188f4317eb5cb6a898372d02c54be8a30bbdc7ffbd360e138cb7
languageName: node
linkType: hard
@@ -24434,7 +24434,7 @@ __metadata:
languageName: node
linkType: hard
-"google-gax@npm:^3.5.2, google-gax@npm:^3.5.3":
+"google-gax@npm:^3.5.2, google-gax@npm:^3.5.7":
version: 3.5.7
resolution: "google-gax@npm:3.5.7"
dependencies:
From 616c278b898cb0021d3c9303ba1347e11710e608 Mon Sep 17 00:00:00 2001
From: Yuri Titi
Date: Wed, 8 Mar 2023 08:58:49 -0300
Subject: [PATCH 037/511] Update .changeset/modern-colts-exercise.md
Co-authored-by: Johan Haals
Signed-off-by: Yuri Titi
---
.changeset/modern-colts-exercise.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.changeset/modern-colts-exercise.md b/.changeset/modern-colts-exercise.md
index d869945870..1dfe2f441a 100644
--- a/.changeset/modern-colts-exercise.md
+++ b/.changeset/modern-colts-exercise.md
@@ -1,5 +1,5 @@
---
-'@backstage/plugin-catalog-backend-module-azure': minor
+'@backstage/plugin-catalog-backend-module-azure': patch
---
Add branch filter support
From 7de756703dbd15c0356a3f6ac1049dd2b3511092 Mon Sep 17 00:00:00 2001
From: Yuri Titi
Date: Wed, 8 Mar 2023 08:59:36 -0300
Subject: [PATCH 038/511] Update
plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
Co-authored-by: Johan Haals
Signed-off-by: Yuri Titi
---
.../src/providers/AzureDevOpsEntityProvider.test.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
index 53919b9bb4..dba29cbb88 100644
--- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
@@ -107,7 +107,7 @@ describe('AzureDevOpsEntityProvider', () => {
const expectedEntities = codeSearchResults.map(item => {
const url = item.branch
? encodeURI(
- `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}&version=GBmybranch`,
+ `${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}&version=GB${item.branch}`,
)
: encodeURI(
`${expectedBaseUrl}/_git/${item.repository.name}?path=${item.path}`,
From 3efdf55f238fb806f112dadbb6f25ed1faeb020c Mon Sep 17 00:00:00 2001
From: Brian Fletcher
Date: Wed, 8 Mar 2023 16:33:45 +0000
Subject: [PATCH 039/511] remove unhandled promise on bad creds
The unhandled promise had been bringing down the whole application when
the creds were bad.
Signed-off-by: Brian Fletcher
---
.../AwsIamKubernetesAuthTranslator.ts | 66 +++++++++----------
1 file changed, 32 insertions(+), 34 deletions(-)
diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts
index b89945902d..84e60c9c69 100644
--- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts
+++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts
@@ -55,46 +55,44 @@ export class AwsIamKubernetesAuthTranslator
assumeRole?: string,
externalId?: string,
): Promise {
- return new Promise(async (resolve, reject) => {
- const awsCreds = await this.awsGetCredentials();
+ const awsCreds = await this.awsGetCredentials();
- if (!(awsCreds instanceof Credentials))
- return reject(Error('No AWS credentials found.'));
+ if (!(awsCreds instanceof Credentials))
+ throw new Error('No AWS credentials found.');
- let creds: SigningCreds = {
- accessKeyId: awsCreds.accessKeyId,
- secretAccessKey: awsCreds.secretAccessKey,
- sessionToken: awsCreds.sessionToken,
+ let creds: SigningCreds = {
+ accessKeyId: awsCreds.accessKeyId,
+ secretAccessKey: awsCreds.secretAccessKey,
+ sessionToken: awsCreds.sessionToken,
+ };
+
+ if (!this.validCredentials(creds))
+ throw new Error('Invalid AWS credentials found.');
+ if (!assumeRole) return creds;
+
+ try {
+ const params: AWS.STS.Types.AssumeRoleRequest = {
+ RoleArn: assumeRole,
+ RoleSessionName: 'backstage-login',
};
+ if (externalId) params.ExternalId = externalId;
- if (!this.validCredentials(creds))
- return reject(Error('Invalid AWS credentials found.'));
- if (!assumeRole) return resolve(creds);
+ const assumedRole = await new AWS.STS().assumeRole(params).promise();
- try {
- const params: AWS.STS.Types.AssumeRoleRequest = {
- RoleArn: assumeRole,
- RoleSessionName: 'backstage-login',
- };
- if (externalId) params.ExternalId = externalId;
-
- const assumedRole = await new AWS.STS().assumeRole(params).promise();
-
- if (!assumedRole.Credentials) {
- throw new Error(`No credentials returned for role ${assumeRole}`);
- }
-
- creds = {
- accessKeyId: assumedRole.Credentials.AccessKeyId,
- secretAccessKey: assumedRole.Credentials.SecretAccessKey,
- sessionToken: assumedRole.Credentials.SessionToken,
- };
- } catch (e) {
- console.warn(`There was an error assuming the role: ${e}`);
- return reject(Error(`Unable to assume role: ${e}`));
+ if (!assumedRole.Credentials) {
+ throw new Error(`No credentials returned for role ${assumeRole}`);
}
- return resolve(creds);
- });
+
+ creds = {
+ accessKeyId: assumedRole.Credentials.AccessKeyId,
+ secretAccessKey: assumedRole.Credentials.SecretAccessKey,
+ sessionToken: assumedRole.Credentials.SessionToken,
+ };
+ } catch (e) {
+ console.warn(`There was an error assuming the role: ${e}`);
+ throw new Error(`Unable to assume role: ${e}`);
+ }
+ return creds;
}
async getBearerToken(
clusterName: string,
From 75d4985f5e80c8a86bbe2dbf216da330a651994c Mon Sep 17 00:00:00 2001
From: Brian Fletcher
Date: Wed, 8 Mar 2023 16:38:42 +0000
Subject: [PATCH 040/511] add changeset for k8s plugin
Signed-off-by: Brian Fletcher
---
.changeset/fuzzy-actors-turn.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 .changeset/fuzzy-actors-turn.md
diff --git a/.changeset/fuzzy-actors-turn.md b/.changeset/fuzzy-actors-turn.md
new file mode 100644
index 0000000000..3cb8f84cae
--- /dev/null
+++ b/.changeset/fuzzy-actors-turn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-kubernetes-backend': patch
+---
+
+Fixes bug whereby backstage crashes when bad aws credentials are provided to the kubernetes plugin.
From bd1ee2b7403b5049e67c72458526e521328770eb Mon Sep 17 00:00:00 2001
From: Brian Fletcher
Date: Wed, 8 Mar 2023 16:42:59 +0000
Subject: [PATCH 041/511] remove typo
Signed-off-by: Brian Fletcher
---
.changeset/fuzzy-actors-turn.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.changeset/fuzzy-actors-turn.md b/.changeset/fuzzy-actors-turn.md
index 3cb8f84cae..bd92ad34ef 100644
--- a/.changeset/fuzzy-actors-turn.md
+++ b/.changeset/fuzzy-actors-turn.md
@@ -2,4 +2,4 @@
'@backstage/plugin-kubernetes-backend': patch
---
-Fixes bug whereby backstage crashes when bad aws credentials are provided to the kubernetes plugin.
+Fixes bug whereby backstage crashes when bad credentials are provided to the kubernetes plugin.
From 075761de52824a061987bb039c23ba5ee2fbd162 Mon Sep 17 00:00:00 2001
From: Yuri Titi
Date: Wed, 8 Mar 2023 14:47:29 -0300
Subject: [PATCH 042/511] Update discovery.md
Signed-off-by: Yuri Titi
---
docs/integrations/azure/discovery.md | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md
index d96b7d84ab..2308b8634b 100644
--- a/docs/integrations/azure/discovery.md
+++ b/docs/integrations/azure/discovery.md
@@ -85,7 +85,13 @@ The parameters available are:
_Note:_
- The path parameter follows the same rules as the search on Azure DevOps web interface. For more details visit the [official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops).
-- The branch parameters need that the branch desired it`s added on 'Searchable branches' on Azure DevOps Repositories
+- To use branch parameters, it is necessary that the desired branch be added to the "Searchable branches" list within Azure DevOps Repositories. To do this, follow the instructions below:
+1. Access your Azure DevOps and open the repository in which you want to add the branch.
+2. Click on "Settings" in the lower-left corner of the screen.
+3. Select the "Options" option in the left navigation bar.
+4. In the "Searchable branches" section, click on the "Add" button to add a new branch.
+5. In the window that appears, enter the name of the branch you want to add and click "Add".
+6. The added branch will now appear in the "Searchable branches" list.
As this provider is not one of the default providers, you will first need to install
the Azure catalog plugin:
From b2e182cdfa4f352d6d6907bff359854db7f8a95d Mon Sep 17 00:00:00 2001
From: Sudeep Sinha
Date: Wed, 8 Mar 2023 13:54:24 -0500
Subject: [PATCH 043/511] Fix font size and color in search result item
Signed-off-by: Sudeep Sinha
---
.changeset/many-eggs-press.md | 6 ++++++
.../DefaultResultListItem/DefaultResultListItem.tsx | 2 ++
.../src/search/components/TechDocsSearchResultListItem.tsx | 2 ++
3 files changed, 10 insertions(+)
create mode 100644 .changeset/many-eggs-press.md
diff --git a/.changeset/many-eggs-press.md b/.changeset/many-eggs-press.md
new file mode 100644
index 0000000000..551cf9e759
--- /dev/null
+++ b/.changeset/many-eggs-press.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-search-react': patch
+'@backstage/plugin-techdocs': patch
+---
+
+Fixes a UI bug in search result item which rendered the item text with incorrect font size and color
diff --git a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx
index cf89b6a9cd..0d2c59e173 100644
--- a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx
+++ b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx
@@ -81,6 +81,8 @@ export const DefaultResultListItemComponent = ({
WebkitLineClamp: lineClamp,
overflow: 'hidden',
}}
+ color="textSecondary"
+ variant="body2"
>
{highlight?.fields.text ? (
{highlight?.fields.text ? (
Date: Wed, 8 Mar 2023 21:55:09 -0300
Subject: [PATCH 044/511] docs(azure-discovery): fix prettier
Signed-off-by: Yuri Titi
---
docs/integrations/azure/discovery.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md
index 2308b8634b..bcbb00a49d 100644
--- a/docs/integrations/azure/discovery.md
+++ b/docs/integrations/azure/discovery.md
@@ -86,6 +86,7 @@ _Note:_
- The path parameter follows the same rules as the search on Azure DevOps web interface. For more details visit the [official search documentation](https://docs.microsoft.com/en-us/azure/devops/project/search/get-started-search?view=azure-devops).
- To use branch parameters, it is necessary that the desired branch be added to the "Searchable branches" list within Azure DevOps Repositories. To do this, follow the instructions below:
+
1. Access your Azure DevOps and open the repository in which you want to add the branch.
2. Click on "Settings" in the lower-left corner of the screen.
3. Select the "Options" option in the left navigation bar.
From cad86281a24db3643f3a2f3965a8be0cf91d2d23 Mon Sep 17 00:00:00 2001
From: Yuri Titi
Date: Thu, 9 Mar 2023 09:43:30 -0300
Subject: [PATCH 045/511] Add link to discovery information
Signed-off-by: Yuri Titi
---
.changeset/modern-colts-exercise.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/.changeset/modern-colts-exercise.md b/.changeset/modern-colts-exercise.md
index 1dfe2f441a..651f10bc98 100644
--- a/.changeset/modern-colts-exercise.md
+++ b/.changeset/modern-colts-exercise.md
@@ -3,3 +3,4 @@
---
Add branch filter support
+https://backstage.io/docs/integrations/azure/discovery
From e27ddc36dade80b41389f87ddad17875fc2c98f4 Mon Sep 17 00:00:00 2001
From: Bogdan Nechyporenko
Date: Thu, 9 Mar 2023 15:40:47 +0100
Subject: [PATCH 046/511] Cancelling the running task (executing of a
scaffolder template)
Signed-off-by: Bogdan Nechyporenko
---
.changeset/backend-token-authentication.md | 5 +
.changeset/beige-hats-cheer.md | 27 +
.changeset/big-gorillas-fail1.md | 5 +
.changeset/big-gorillas-fail2.md | 5 +
.changeset/big-gorillas-fail3.md | 5 +
.changeset/big-gorillas-fail4.md | 5 +
.changeset/big-gorillas-fail5.md | 5 +
.changeset/big-gorillas-fail6.md | 5 +
.changeset/cold-dogs-watch.md | 5 +
.changeset/create-app-1678209629.md | 5 +
.changeset/curly-jobs-kneel.md | 8 +
.../dull-adults-drum.md | 0
.changeset/gorgeous-pumas-speak.md | 5 +
.changeset/healthy-buses-live-1.md | 5 +
.changeset/healthy-buses-live-2.md | 5 +
.changeset/healthy-buses-live-3.md | 5 +
.changeset/healthy-buses-live-4.md | 5 +
.changeset/healthy-buses-live-5.md | 5 +
.changeset/healthy-buses-live-6.md | 5 +
.changeset/healthy-buses-live-7.md | 5 +
.changeset/healthy-buses-live-8.md | 5 +
.changeset/healthy-buses-live-9.md | 5 +
.changeset/honest-clouds-shout.md | 5 +
.changeset/light-bees-end.md | 5 +
.changeset/moody-apes-know.md | 16 +
.changeset/nine-bikes-applaud.md | 5 +
.changeset/pre.json | 33 +-
.changeset/proud-jokes-pull.md | 5 +
.changeset/rotten-cats-matter.md | 19 +
.changeset/silver-bikes-breathe.md | 21 +-
.changeset/stupid-games-brake.md | 5 +
.changeset/twenty-insects-live.md | 5 +
.changeset/witty-squids-fetch.md | 5 +
.changeset/young-walls-prove.md | 5 +
ADOPTERS.md | 1 +
docs/auth/gitlab/provider.md | 6 +-
docs/features/kubernetes/configuration.md | 5 +-
docs/features/software-templates/index.md | 4 +
.../writing-custom-actions.md | 7 +-
docs/overview/adopting.md | 2 +-
docs/releases/v1.12.0-next.2-changelog.md | 1833 +++++++++++++++++
.../src/components/simpleCard/simpleCard.tsx | 17 +
.../src/pages/on-demand/_onDemandCard.tsx | 66 +
microsite-next/src/pages/on-demand/index.tsx | 78 +
.../src/pages/on-demand/onDemand.module.scss | 44 +
.../src/pages/plugins/_pluginCard.tsx | 37 +-
microsite-next/src/pages/plugins/index.tsx | 13 +-
.../src/util/truncateDescription.tsx | 11 +
microsite/pages/en/plugins.js | 2 +-
package.json | 2 +-
packages/app-defaults/CHANGELOG.md | 10 +
packages/app-defaults/package.json | 2 +-
packages/app/CHANGELOG.md | 64 +
packages/app/package.json | 2 +-
packages/backend-app-api/CHANGELOG.md | 12 +
packages/backend-app-api/package.json | 2 +-
packages/backend-common/CHANGELOG.md | 28 +
packages/backend-common/package.json | 2 +-
.../src/reading/AwsS3UrlReader.test.ts | 12 +-
packages/backend-defaults/CHANGELOG.md | 9 +
packages/backend-defaults/package.json | 2 +-
packages/backend-next/CHANGELOG.md | 11 +
packages/backend-next/package.json | 2 +-
packages/backend-plugin-api/CHANGELOG.md | 9 +
packages/backend-plugin-api/package.json | 2 +-
packages/backend-tasks/CHANGELOG.md | 12 +
packages/backend-tasks/package.json | 2 +-
packages/backend-tasks/src/migrations.test.ts | 7 +-
packages/backend-test-utils/CHANGELOG.md | 11 +
packages/backend-test-utils/package.json | 2 +-
packages/backend/CHANGELOG.md | 47 +
packages/backend/package.json | 2 +-
packages/core-app-api/CHANGELOG.md | 26 +
packages/core-app-api/package.json | 2 +-
.../auth/oauth2/OAuth2.test.ts | 24 +-
.../implementations/auth/oauth2/OAuth2.ts | 5 +-
packages/core-components/CHANGELOG.md | 12 +
packages/core-components/package.json | 2 +-
packages/core-plugin-api/CHANGELOG.md | 11 +
packages/core-plugin-api/api-report.md | 6 +-
packages/core-plugin-api/package.json | 2 +-
.../src/apis/definitions/auth.ts | 6 +-
packages/create-app/CHANGELOG.md | 6 +
packages/create-app/package.json | 2 +-
.../default-app/packages/app/.eslintignore | 1 +
packages/dev-utils/CHANGELOG.md | 13 +
packages/dev-utils/package.json | 2 +-
packages/e2e-test/CHANGELOG.md | 7 +
packages/e2e-test/package.json | 2 +-
packages/integration-react/CHANGELOG.md | 10 +
packages/integration-react/api-report.md | 6 +-
packages/integration-react/package.json | 2 +-
.../techdocs-cli-embedded-app/CHANGELOG.md | 17 +
.../techdocs-cli-embedded-app/package.json | 2 +-
packages/techdocs-cli/CHANGELOG.md | 9 +
packages/techdocs-cli/package.json | 2 +-
packages/test-utils/CHANGELOG.md | 10 +
packages/test-utils/package.json | 2 +-
plugins/adr-backend/CHANGELOG.md | 10 +
plugins/adr-backend/package.json | 2 +-
plugins/adr/CHANGELOG.md | 11 +
plugins/adr/package.json | 2 +-
plugins/airbrake-backend/CHANGELOG.md | 8 +
plugins/airbrake-backend/package.json | 2 +-
plugins/airbrake/CHANGELOG.md | 11 +
plugins/airbrake/package.json | 2 +-
plugins/allure/CHANGELOG.md | 9 +
plugins/allure/package.json | 2 +-
plugins/analytics-module-ga/CHANGELOG.md | 9 +
plugins/analytics-module-ga/package.json | 2 +-
plugins/apache-airflow/CHANGELOG.md | 8 +
plugins/apache-airflow/package.json | 2 +-
plugins/api-docs/CHANGELOG.md | 11 +
plugins/api-docs/package.json | 2 +-
plugins/apollo-explorer/CHANGELOG.md | 8 +
plugins/apollo-explorer/package.json | 2 +-
plugins/app-backend/CHANGELOG.md | 9 +
plugins/app-backend/package.json | 2 +-
plugins/auth-backend/CHANGELOG.md | 9 +
plugins/auth-backend/package.json | 2 +-
plugins/auth-node/CHANGELOG.md | 9 +
plugins/auth-node/package.json | 2 +-
plugins/azure-devops-backend/CHANGELOG.md | 8 +
plugins/azure-devops-backend/package.json | 2 +-
plugins/azure-devops/CHANGELOG.md | 9 +
plugins/azure-devops/package.json | 2 +-
plugins/azure-sites-backend/CHANGELOG.md | 8 +
plugins/azure-sites-backend/package.json | 2 +-
plugins/azure-sites/CHANGELOG.md | 9 +
plugins/azure-sites/package.json | 2 +-
plugins/badges-backend/CHANGELOG.md | 8 +
plugins/badges-backend/package.json | 2 +-
plugins/badges/CHANGELOG.md | 9 +
plugins/badges/package.json | 2 +-
plugins/bazaar-backend/CHANGELOG.md | 10 +
plugins/bazaar-backend/package.json | 2 +-
plugins/bazaar/CHANGELOG.md | 11 +
plugins/bazaar/package.json | 2 +-
plugins/bitrise/CHANGELOG.md | 9 +
plugins/bitrise/package.json | 2 +-
.../catalog-backend-module-aws/CHANGELOG.md | 14 +
.../alpha-api-report.md | 2 +-
.../catalog-backend-module-aws/api-report.md | 10 +-
.../catalog-backend-module-aws/package.json | 3 +-
.../catalog-backend-module-aws/src/alpha.ts | 2 +-
.../catalogModuleAwsS3EntityProvider.test.ts} | 6 +-
.../catalogModuleAwsS3EntityProvider.ts} | 2 +-
.../src/module/index.ts | 17 +
.../src/processors/AwsEKSClusterProcessor.ts | 2 +-
.../AwsOrganizationCloudAccountProcessor.ts | 2 +-
.../AwsS3DiscoveryProcessor.test.ts | 2 +-
.../src/processors/AwsS3DiscoveryProcessor.ts | 2 +-
.../src/providers/AwsS3EntityProvider.test.ts | 2 +-
.../src/providers/AwsS3EntityProvider.ts | 2 +-
.../catalog-backend-module-azure/CHANGELOG.md | 13 +
.../alpha-api-report.md | 2 +-
.../api-report.md | 10 +-
.../catalog-backend-module-azure/package.json | 3 +-
.../catalog-backend-module-azure/src/alpha.ts | 2 +-
...ogModuleAzureDevOpsEntityProvider.test.ts} | 6 +-
...catalogModuleAzureDevOpsEntityProvider.ts} | 2 +-
.../src/module/index.ts | 17 +
.../AzureDevOpsDiscoveryProcessor.test.ts | 2 +-
.../AzureDevOpsDiscoveryProcessor.ts | 2 +-
.../AzureDevOpsEntityProvider.test.ts | 2 +-
.../providers/AzureDevOpsEntityProvider.ts | 2 +-
.../CHANGELOG.md | 14 +
.../alpha-api-report.md | 2 +-
.../api-report.md | 4 +-
.../package.json | 3 +-
.../src/alpha.ts | 2 +-
.../src/index.ts | 2 +-
...oduleBitbucketCloudEntityProvider.test.ts} | 8 +-
...alogModuleBitbucketCloudEntityProvider.ts} | 4 +-
.../src/module/index.ts | 17 +
.../BitbucketCloudEntityProvider.test.ts | 2 +-
.../BitbucketCloudEntityProvider.ts | 2 +-
...BitbucketCloudEntityProviderConfig.test.ts | 0
.../BitbucketCloudEntityProviderConfig.ts | 0
.../CHANGELOG.md | 13 +
.../alpha-api-report.md | 2 +-
.../api-report.md | 6 +-
.../package.json | 3 +-
.../src/alpha.ts | 2 +-
...duleBitbucketServerEntityProvider.test.ts} | 6 +-
...logModuleBitbucketServerEntityProvider.ts} | 2 +-
.../src/module/index.ts | 17 +
.../BitbucketServerEntityProvider.test.ts | 2 +-
.../BitbucketServerEntityProvider.ts | 2 +-
.../BitbucketServerLocationParser.ts | 2 +-
.../CHANGELOG.md | 10 +
.../api-report.md | 8 +-
.../package.json | 4 +-
.../src/BitbucketDiscoveryProcessor.test.ts | 5 +-
.../src/BitbucketDiscoveryProcessor.ts | 2 +-
.../src/lib/BitbucketRepositoryParser.test.ts | 2 +-
.../src/lib/BitbucketRepositoryParser.ts | 2 +-
.../CHANGELOG.md | 13 +
.../alpha-api-report.md | 2 +-
.../api-report.md | 4 +-
.../package.json | 3 +-
.../src/alpha.ts | 2 +-
...catalogModuleGerritEntityProvider.test.ts} | 6 +-
.../catalogModuleGerritEntityProvider.ts} | 2 +-
.../src/module/index.ts | 17 +
.../providers/GerritEntityProvider.test.ts | 2 +-
.../src/providers/GerritEntityProvider.ts | 2 +-
.../CHANGELOG.md | 15 +
.../alpha-api-report.md | 2 +-
.../api-report.md | 10 +-
.../package.json | 2 +-
.../src/alpha.ts | 2 +-
.../src/deprecated.ts | 2 +-
.../src/lib/github.ts | 4 +-
...catalogModuleGithubEntityProvider.test.ts} | 6 +-
.../catalogModuleGithubEntityProvider.ts} | 2 +-
.../src/module/index.ts | 17 +
.../GithubDiscoveryProcessor.test.ts | 2 +-
.../processors/GithubDiscoveryProcessor.ts | 2 +-
.../GithubMultiOrgReaderProcessor.ts | 2 +-
.../GithubOrgReaderProcessor.test.ts | 2 +-
.../processors/GithubOrgReaderProcessor.ts | 2 +-
.../providers/GithubEntityProvider.test.ts | 2 +-
.../src/providers/GithubEntityProvider.ts | 2 +-
.../providers/GithubOrgEntityProvider.test.ts | 2 +-
.../src/providers/GithubOrgEntityProvider.ts | 2 +-
.../CHANGELOG.md | 14 +
.../alpha-api-report.md | 2 +-
.../api-report.md | 10 +-
.../package.json | 3 +-
.../src/GitLabDiscoveryProcessor.test.ts | 2 +-
.../src/GitLabDiscoveryProcessor.ts | 2 +-
.../src/alpha.ts | 2 +-
...duleGitlabDiscoveryEntityProvider.test.ts} | 6 +-
...logModuleGitlabDiscoveryEntityProvider.ts} | 2 +-
.../GitlabDiscoveryEntityProvider.test.ts | 2 +-
.../GitlabDiscoveryEntityProvider.ts | 2 +-
.../GitlabOrgDiscoveryEntityProvider.test.ts | 2 +-
.../GitlabOrgDiscoveryEntityProvider.ts | 2 +-
.../CHANGELOG.md | 13 +
.../alpha-api-report.md | 2 +-
.../api-report.md | 2 +-
.../package.json | 5 +-
.../IncrementalIngestionDatabaseManager.ts | 2 +-
.../src/engine/IncrementalIngestionEngine.ts | 2 +-
...ncrementalIngestionEntityProvider.test.ts} | 6 +-
...duleIncrementalIngestionEntityProvider.ts} | 2 +-
.../src/module/index.ts | 2 +-
.../src/run.ts | 4 +-
.../src/service/IncrementalCatalogBuilder.ts | 1 +
.../src/types.ts | 2 +-
.../catalog-backend-module-ldap/CHANGELOG.md | 9 +
.../catalog-backend-module-ldap/api-report.md | 10 +-
.../catalog-backend-module-ldap/package.json | 4 +-
.../src/processors/LdapOrgEntityProvider.ts | 2 +-
.../src/processors/LdapOrgReaderProcessor.ts | 2 +-
.../CHANGELOG.md | 13 +
.../alpha-api-report.md | 4 +-
.../api-report.md | 10 +-
.../package.json | 3 +-
.../src/alpha.ts | 3 +-
...leMicrosoftGraphOrgEntityProvider.test.ts} | 6 +-
...gModuleMicrosoftGraphOrgEntityProvider.ts} | 8 +-
.../src/module/index.ts | 18 +
.../MicrosoftGraphOrgEntityProvider.test.ts | 2 +-
.../MicrosoftGraphOrgEntityProvider.ts | 2 +-
.../MicrosoftGraphOrgReaderProcessor.ts | 2 +-
.../CHANGELOG.md | 11 +
.../package.json | 2 +-
.../CHANGELOG.md | 15 +
.../alpha-api-report.md | 12 +
.../api-report.md | 4 +-
.../package.json | 24 +-
.../src/alpha.ts} | 4 +-
...atalogModulePuppetDbEntityProvider.test.ts | 79 +
.../catalogModulePuppetDbEntityProvider.ts | 51 +
.../src/module/index.ts | 17 +
.../providers/PuppetDbEntityProvider.test.ts | 2 +-
.../src/providers/PuppetDbEntityProvider.ts | 6 +-
plugins/catalog-backend/CHANGELOG.md | 12 +
plugins/catalog-backend/api-report.md | 161 +-
plugins/catalog-backend/package.json | 2 +-
plugins/catalog-backend/src/deprecated.ts | 143 ++
plugins/catalog-backend/src/index.ts | 37 +-
plugins/catalog-customized/CHANGELOG.md | 8 +
plugins/catalog-customized/package.json | 2 +-
plugins/catalog-graph/CHANGELOG.md | 9 +
plugins/catalog-graph/package.json | 2 +-
plugins/catalog-import/CHANGELOG.md | 12 +
plugins/catalog-import/package.json | 2 +-
.../src/api/CatalogImportClient.test.ts | 1 -
plugins/catalog-node/CHANGELOG.md | 7 +
plugins/catalog-node/api-report.md | 10 +
plugins/catalog-node/package.json | 2 +-
plugins/catalog-node/src/conversion.ts | 103 +
plugins/catalog-node/src/index.ts | 1 +
plugins/catalog-react/CHANGELOG.md | 11 +
plugins/catalog-react/package.json | 2 +-
plugins/catalog/CHANGELOG.md | 15 +
plugins/catalog/package.json | 2 +-
.../EntitySwitch/EntitySwitch.test.tsx | 36 +
.../components/EntitySwitch/EntitySwitch.tsx | 2 +-
.../CHANGELOG.md | 8 +
.../package.json | 2 +-
plugins/cicd-statistics/CHANGELOG.md | 8 +
plugins/cicd-statistics/package.json | 2 +-
plugins/circleci/CHANGELOG.md | 9 +
plugins/circleci/package.json | 2 +-
plugins/cloudbuild/CHANGELOG.md | 9 +
plugins/cloudbuild/package.json | 2 +-
plugins/code-climate/CHANGELOG.md | 9 +
plugins/code-climate/package.json | 2 +-
plugins/code-coverage-backend/CHANGELOG.md | 9 +
plugins/code-coverage-backend/package.json | 2 +-
plugins/code-coverage/CHANGELOG.md | 10 +
plugins/code-coverage/package.json | 2 +-
plugins/codescene/CHANGELOG.md | 9 +
plugins/codescene/package.json | 2 +-
plugins/config-schema/CHANGELOG.md | 9 +
plugins/config-schema/package.json | 2 +-
plugins/cost-insights/CHANGELOG.md | 10 +
plugins/cost-insights/package.json | 2 +-
plugins/dynatrace/CHANGELOG.md | 9 +
plugins/dynatrace/package.json | 2 +-
plugins/entity-feedback-backend/CHANGELOG.md | 9 +
plugins/entity-feedback-backend/package.json | 2 +-
plugins/entity-feedback/CHANGELOG.md | 9 +
plugins/entity-feedback/package.json | 2 +-
plugins/entity-validation/CHANGELOG.md | 9 +
plugins/entity-validation/package.json | 2 +-
.../CHANGELOG.md | 11 +
.../alpha-api-report.md | 2 +-
.../package.json | 2 +-
.../src/alpha.ts | 2 +-
...duleAwsSqsConsumingEventPublisher.test.ts} | 6 +-
...ntsModuleAwsSqsConsumingEventPublisher.ts} | 4 +-
.../events-backend-module-azure/CHANGELOG.md | 8 +
.../alpha-api-report.md | 2 +-
.../events-backend-module-azure/package.json | 2 +-
.../events-backend-module-azure/src/alpha.ts | 2 +-
...ventsModuleAzureDevOpsEventRouter.test.ts} | 6 +-
... => eventsModuleAzureDevOpsEventRouter.ts} | 2 +-
.../CHANGELOG.md | 8 +
.../alpha-api-report.md | 2 +-
.../package.json | 2 +-
.../src/alpha.ts | 2 +-
...tsModuleBitbucketCloudEventRouter.test.ts} | 6 +-
... eventsModuleBitbucketCloudEventRouter.ts} | 2 +-
.../events-backend-module-gerrit/CHANGELOG.md | 8 +
.../alpha-api-report.md | 2 +-
.../events-backend-module-gerrit/package.json | 2 +-
.../events-backend-module-gerrit/src/alpha.ts | 2 +-
... => eventsModuleGerritEventRouter.test.ts} | 6 +-
...le.ts => eventsModuleGerritEventRouter.ts} | 2 +-
.../events-backend-module-github/CHANGELOG.md | 9 +
.../alpha-api-report.md | 4 +-
.../events-backend-module-github/package.json | 2 +-
.../events-backend-module-github/src/alpha.ts | 4 +-
... => eventsModuleGithubEventRouter.test.ts} | 6 +-
...le.ts => eventsModuleGithubEventRouter.ts} | 2 +-
...t.ts => eventsModuleGithubWebhook.test.ts} | 6 +-
...Module.ts => eventsModuleGithubWebhook.ts} | 2 +-
.../events-backend-module-gitlab/CHANGELOG.md | 9 +
.../alpha-api-report.md | 4 +-
.../events-backend-module-gitlab/package.json | 2 +-
.../events-backend-module-gitlab/src/alpha.ts | 4 +-
... => eventsModuleGitlabEventRouter.test.ts} | 6 +-
...le.ts => eventsModuleGitlabEventRouter.ts} | 2 +-
...t.ts => eventsModuleGitlabWebhook.test.ts} | 4 +-
...Module.ts => eventsModuleGitlabWebhook.ts} | 2 +-
.../events-backend-test-utils/CHANGELOG.md | 7 +
.../events-backend-test-utils/package.json | 2 +-
plugins/events-backend/CHANGELOG.md | 10 +
plugins/events-backend/README.md | 4 +-
plugins/events-backend/package.json | 2 +-
plugins/events-node/CHANGELOG.md | 7 +
plugins/events-node/package.json | 2 +-
.../example-todo-list-backend/CHANGELOG.md | 10 +
.../example-todo-list-backend/package.json | 2 +-
plugins/example-todo-list/CHANGELOG.md | 8 +
plugins/example-todo-list/package.json | 2 +-
plugins/explore-backend/CHANGELOG.md | 8 +
plugins/explore-backend/package.json | 2 +-
plugins/explore-react/CHANGELOG.md | 7 +
plugins/explore-react/package.json | 2 +-
plugins/explore/CHANGELOG.md | 12 +
plugins/explore/package.json | 2 +-
plugins/firehydrant/CHANGELOG.md | 9 +
plugins/firehydrant/package.json | 2 +-
plugins/fossa/CHANGELOG.md | 9 +
plugins/fossa/package.json | 2 +-
plugins/gcalendar/CHANGELOG.md | 8 +
plugins/gcalendar/package.json | 2 +-
plugins/gcp-projects/CHANGELOG.md | 8 +
plugins/gcp-projects/package.json | 2 +-
plugins/git-release-manager/CHANGELOG.md | 9 +
plugins/git-release-manager/package.json | 2 +-
plugins/github-actions/CHANGELOG.md | 10 +
plugins/github-actions/package.json | 2 +-
plugins/github-deployments/CHANGELOG.md | 11 +
plugins/github-deployments/package.json | 2 +-
plugins/github-issues/CHANGELOG.md | 10 +
plugins/github-issues/package.json | 2 +-
.../github-pull-requests-board/CHANGELOG.md | 10 +
.../github-pull-requests-board/package.json | 2 +-
plugins/gitops-profiles/CHANGELOG.md | 8 +
plugins/gitops-profiles/package.json | 2 +-
plugins/gocd/CHANGELOG.md | 9 +
plugins/gocd/package.json | 2 +-
plugins/graphiql/CHANGELOG.md | 8 +
plugins/graphiql/package.json | 2 +-
plugins/graphql-backend/CHANGELOG.md | 9 +
plugins/graphql-backend/package.json | 2 +-
plugins/graphql-voyager/CHANGELOG.md | 8 +
plugins/graphql-voyager/package.json | 2 +-
plugins/home/CHANGELOG.md | 10 +
plugins/home/package.json | 2 +-
plugins/ilert/CHANGELOG.md | 9 +
plugins/ilert/package.json | 2 +-
plugins/jenkins-backend/CHANGELOG.md | 9 +
plugins/jenkins-backend/package.json | 2 +-
plugins/jenkins/CHANGELOG.md | 9 +
plugins/jenkins/package.json | 2 +-
plugins/kafka-backend/CHANGELOG.md | 9 +
plugins/kafka-backend/package.json | 2 +-
plugins/kafka/CHANGELOG.md | 10 +
plugins/kafka/package.json | 2 +-
plugins/kubernetes-backend/CHANGELOG.md | 9 +
plugins/kubernetes-backend/package.json | 2 +-
plugins/kubernetes/CHANGELOG.md | 11 +
plugins/kubernetes/package.json | 2 +-
plugins/kubernetes/src/plugin.ts | 4 +
plugins/lighthouse-backend/CHANGELOG.md | 9 +
plugins/lighthouse-backend/package.json | 2 +-
plugins/lighthouse/CHANGELOG.md | 10 +
plugins/lighthouse/package.json | 2 +-
plugins/linguist-backend/CHANGELOG.md | 11 +
plugins/linguist-backend/package.json | 2 +-
plugins/linguist/CHANGELOG.md | 9 +
plugins/linguist/package.json | 2 +-
plugins/microsoft-calendar/CHANGELOG.md | 8 +
plugins/microsoft-calendar/package.json | 2 +-
plugins/newrelic-dashboard/CHANGELOG.md | 9 +
plugins/newrelic-dashboard/package.json | 2 +-
plugins/newrelic/CHANGELOG.md | 8 +
plugins/newrelic/package.json | 2 +-
plugins/octopus-deploy/CHANGELOG.md | 9 +
plugins/octopus-deploy/package.json | 2 +-
plugins/org-react/CHANGELOG.md | 9 +
plugins/org-react/package.json | 2 +-
plugins/org/CHANGELOG.md | 10 +
plugins/org/package.json | 2 +-
plugins/pagerduty/CHANGELOG.md | 9 +
plugins/pagerduty/package.json | 2 +-
plugins/periskop-backend/CHANGELOG.md | 9 +
plugins/periskop-backend/package.json | 2 +-
plugins/periskop/CHANGELOG.md | 9 +
plugins/periskop/package.json | 2 +-
plugins/permission-backend/CHANGELOG.md | 10 +
plugins/permission-backend/package.json | 2 +-
plugins/permission-node/CHANGELOG.md | 9 +
plugins/permission-node/package.json | 2 +-
plugins/permission-react/CHANGELOG.md | 8 +
plugins/permission-react/package.json | 2 +-
plugins/playlist-backend/CHANGELOG.md | 10 +
plugins/playlist-backend/package.json | 2 +-
plugins/playlist/CHANGELOG.md | 11 +
plugins/playlist/package.json | 2 +-
plugins/proxy-backend/CHANGELOG.md | 9 +
plugins/proxy-backend/package.json | 2 +-
plugins/proxy-backend/src/service/router.ts | 5 +
plugins/rollbar-backend/CHANGELOG.md | 8 +
plugins/rollbar-backend/package.json | 2 +-
plugins/rollbar/CHANGELOG.md | 9 +
plugins/rollbar/package.json | 2 +-
.../CHANGELOG.md | 12 +
.../README.md | 2 +
.../api-report.md | 2 +-
.../package.json | 2 +-
.../src/actions/fetch/cookiecutter.test.ts | 12 +
.../src/actions/fetch/cookiecutter.ts | 11 +-
.../CHANGELOG.md | 11 +
.../package.json | 2 +-
.../src/actions/fetch/rails/index.test.ts | 2 +-
.../CHANGELOG.md | 8 +
.../package.json | 2 +-
.../CHANGELOG.md | 8 +
.../package.json | 2 +-
plugins/scaffolder-backend/CHANGELOG.md | 18 +
plugins/scaffolder-backend/api-report.md | 34 +-
plugins/scaffolder-backend/package.json | 4 +-
.../actions/builtin/catalog/write.ts | 1 +
.../actions/builtin/createBuiltinActions.ts | 3 +-
.../scaffolder/actions/builtin/debug/index.ts | 1 +
.../actions/builtin/debug/wait.test.ts | 76 +
.../scaffolder/actions/builtin/debug/wait.ts | 131 ++
.../actions/builtin/publish/azure.test.ts | 11 +-
.../src/scaffolder/dryrun/createDryRunner.ts | 7 +-
.../tasks/DatabaseTaskStore.test.ts | 191 ++
.../src/scaffolder/tasks/DatabaseTaskStore.ts | 72 +-
.../tasks/NunjucksWorkflowRunner.test.ts | 3 +-
.../tasks/NunjucksWorkflowRunner.ts | 310 +--
.../src/scaffolder/tasks/StorageTaskBroker.ts | 64 +-
.../src/scaffolder/tasks/TaskWorker.test.ts | 88 +-
.../src/scaffolder/tasks/TaskWorker.ts | 5 +-
.../src/scaffolder/tasks/types.ts | 47 +-
.../scaffolder-backend/src/service/router.ts | 19 +-
plugins/scaffolder-node/CHANGELOG.md | 7 +
plugins/scaffolder-node/api-report.md | 1 +
plugins/scaffolder-node/package.json | 2 +-
plugins/scaffolder-node/src/actions/types.ts | 5 +
plugins/scaffolder-react/CHANGELOG.md | 12 +
plugins/scaffolder-react/api-report.md | 9 +-
plugins/scaffolder-react/package.json | 2 +-
plugins/scaffolder-react/src/api/types.ts | 14 +-
.../src/hooks/useEventStream.ts | 13 +-
.../components/Workflow/Workflow.test.tsx | 4 +-
plugins/scaffolder/CHANGELOG.md | 21 +
plugins/scaffolder/api-report.md | 2 +
plugins/scaffolder/package.json | 2 +-
plugins/scaffolder/src/api.ts | 45 +-
.../ActionsPage/ActionsPage.test.tsx | 1 +
.../src/components/TaskPage/TaskPage.tsx | 39 +-
.../TemplatePage/TemplatePage.test.tsx | 6 +-
.../src/next/OngoingTask/ContextMenu.tsx | 28 +-
.../src/next/OngoingTask/OngoingTask.test.tsx | 84 +
.../src/next/OngoingTask/OngoingTask.tsx | 12 +-
.../TemplateWizardPage.test.tsx | 1 +
.../CHANGELOG.md | 9 +
.../package.json | 2 +-
plugins/search-backend-module-pg/CHANGELOG.md | 9 +
plugins/search-backend-module-pg/package.json | 2 +-
plugins/search-backend-node/CHANGELOG.md | 9 +
plugins/search-backend-node/package.json | 2 +-
plugins/search-backend/CHANGELOG.md | 11 +
plugins/search-backend/package.json | 2 +-
plugins/search-react/CHANGELOG.md | 10 +
plugins/search-react/package.json | 2 +-
plugins/search/CHANGELOG.md | 12 +
plugins/search/package.json | 2 +-
plugins/sentry/CHANGELOG.md | 9 +
plugins/sentry/package.json | 2 +-
plugins/shortcuts/CHANGELOG.md | 8 +
plugins/shortcuts/package.json | 2 +-
plugins/sonarqube-backend/CHANGELOG.md | 8 +
plugins/sonarqube-backend/package.json | 2 +-
plugins/sonarqube-react/CHANGELOG.md | 7 +
plugins/sonarqube-react/package.json | 2 +-
plugins/sonarqube/CHANGELOG.md | 11 +
plugins/sonarqube/package.json | 2 +-
plugins/splunk-on-call/CHANGELOG.md | 10 +
plugins/splunk-on-call/package.json | 2 +-
plugins/stack-overflow-backend/CHANGELOG.md | 8 +
plugins/stack-overflow-backend/package.json | 2 +-
plugins/stack-overflow/CHANGELOG.md | 11 +
plugins/stack-overflow/package.json | 2 +-
plugins/stackstorm/CHANGELOG.md | 8 +
plugins/stackstorm/package.json | 2 +-
.../CHANGELOG.md | 10 +
.../package.json | 2 +-
plugins/tech-insights-backend/CHANGELOG.md | 10 +
plugins/tech-insights-backend/package.json | 2 +-
plugins/tech-insights-node/CHANGELOG.md | 9 +
plugins/tech-insights-node/package.json | 2 +-
plugins/tech-insights/CHANGELOG.md | 10 +
plugins/tech-insights/package.json | 2 +-
plugins/tech-radar/CHANGELOG.md | 8 +
plugins/tech-radar/package.json | 2 +-
.../techdocs-addons-test-utils/CHANGELOG.md | 15 +
.../techdocs-addons-test-utils/package.json | 2 +-
plugins/techdocs-backend/CHANGELOG.md | 10 +
plugins/techdocs-backend/package.json | 2 +-
.../CHANGELOG.md | 11 +
.../package.json | 2 +-
plugins/techdocs-node/CHANGELOG.md | 11 +
plugins/techdocs-node/package.json | 2 +-
.../src/stages/generate/helpers.test.ts | 4 +-
plugins/techdocs-react/CHANGELOG.md | 10 +
plugins/techdocs-react/package.json | 2 +-
plugins/techdocs/CHANGELOG.md | 15 +
plugins/techdocs/package.json | 2 +-
plugins/todo-backend/CHANGELOG.md | 11 +
plugins/todo-backend/package.json | 2 +-
plugins/todo-backend/src/plugin.ts | 2 +-
plugins/todo/CHANGELOG.md | 9 +
plugins/todo/package.json | 2 +-
plugins/user-settings-backend/CHANGELOG.md | 9 +
plugins/user-settings-backend/package.json | 2 +-
plugins/user-settings/CHANGELOG.md | 10 +
plugins/user-settings/package.json | 2 +-
plugins/vault-backend/CHANGELOG.md | 9 +
plugins/vault-backend/package.json | 2 +-
plugins/vault/CHANGELOG.md | 9 +
plugins/vault/package.json | 2 +-
plugins/xcmetrics/CHANGELOG.md | 8 +
plugins/xcmetrics/package.json | 2 +-
yarn.lock | 1352 +++++-------
597 files changed, 6911 insertions(+), 1680 deletions(-)
create mode 100644 .changeset/backend-token-authentication.md
create mode 100644 .changeset/beige-hats-cheer.md
create mode 100644 .changeset/big-gorillas-fail1.md
create mode 100644 .changeset/big-gorillas-fail2.md
create mode 100644 .changeset/big-gorillas-fail3.md
create mode 100644 .changeset/big-gorillas-fail4.md
create mode 100644 .changeset/big-gorillas-fail5.md
create mode 100644 .changeset/big-gorillas-fail6.md
create mode 100644 .changeset/cold-dogs-watch.md
create mode 100644 .changeset/create-app-1678209629.md
create mode 100644 .changeset/curly-jobs-kneel.md
rename {plugins/.changeset => .changeset}/dull-adults-drum.md (100%)
create mode 100644 .changeset/gorgeous-pumas-speak.md
create mode 100644 .changeset/healthy-buses-live-1.md
create mode 100644 .changeset/healthy-buses-live-2.md
create mode 100644 .changeset/healthy-buses-live-3.md
create mode 100644 .changeset/healthy-buses-live-4.md
create mode 100644 .changeset/healthy-buses-live-5.md
create mode 100644 .changeset/healthy-buses-live-6.md
create mode 100644 .changeset/healthy-buses-live-7.md
create mode 100644 .changeset/healthy-buses-live-8.md
create mode 100644 .changeset/healthy-buses-live-9.md
create mode 100644 .changeset/honest-clouds-shout.md
create mode 100644 .changeset/light-bees-end.md
create mode 100644 .changeset/moody-apes-know.md
create mode 100644 .changeset/nine-bikes-applaud.md
create mode 100644 .changeset/proud-jokes-pull.md
create mode 100644 .changeset/rotten-cats-matter.md
create mode 100644 .changeset/stupid-games-brake.md
create mode 100644 .changeset/twenty-insects-live.md
create mode 100644 .changeset/witty-squids-fetch.md
create mode 100644 .changeset/young-walls-prove.md
create mode 100644 docs/releases/v1.12.0-next.2-changelog.md
create mode 100644 microsite-next/src/components/simpleCard/simpleCard.tsx
create mode 100644 microsite-next/src/pages/on-demand/_onDemandCard.tsx
create mode 100644 microsite-next/src/pages/on-demand/index.tsx
create mode 100644 microsite-next/src/pages/on-demand/onDemand.module.scss
create mode 100644 microsite-next/src/util/truncateDescription.tsx
create mode 100644 packages/create-app/templates/default-app/packages/app/.eslintignore
rename plugins/catalog-backend-module-aws/src/{service/AwsS3EntityProviderCatalogModule.test.ts => module/catalogModuleAwsS3EntityProvider.test.ts} (92%)
rename plugins/catalog-backend-module-aws/src/{service/AwsS3EntityProviderCatalogModule.ts => module/catalogModuleAwsS3EntityProvider.ts} (96%)
create mode 100644 plugins/catalog-backend-module-aws/src/module/index.ts
rename plugins/catalog-backend-module-azure/src/{service/AzureDevOpsEntityProviderCatalogModule.test.ts => module/catalogModuleAzureDevOpsEntityProvider.test.ts} (92%)
rename plugins/catalog-backend-module-azure/src/{service/AzureDevOpsEntityProviderCatalogModule.ts => module/catalogModuleAzureDevOpsEntityProvider.ts} (96%)
create mode 100644 plugins/catalog-backend-module-azure/src/module/index.ts
rename plugins/catalog-backend-module-bitbucket-cloud/src/{service/BitbucketCloudEntityProviderCatalogModule.test.ts => module/catalogModuleBitbucketCloudEntityProvider.test.ts} (90%)
rename plugins/catalog-backend-module-bitbucket-cloud/src/{service/BitbucketCloudEntityProviderCatalogModule.ts => module/catalogModuleBitbucketCloudEntityProvider.ts} (93%)
create mode 100644 plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts
rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProvider.test.ts (99%)
rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProvider.ts (99%)
rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProviderConfig.test.ts (100%)
rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProviderConfig.ts (100%)
rename plugins/catalog-backend-module-bitbucket-server/src/{service/BitbucketServerEntityProviderCatalogModule.test.ts => module/catalogModuleBitbucketServerEntityProvider.test.ts} (92%)
rename plugins/catalog-backend-module-bitbucket-server/src/{service/BitbucketServerEntityProviderCatalogModule.ts => module/catalogModuleBitbucketServerEntityProvider.ts} (96%)
create mode 100644 plugins/catalog-backend-module-bitbucket-server/src/module/index.ts
rename plugins/catalog-backend-module-gerrit/src/{service/GerritEntityProviderCatalogModule.test.ts => module/catalogModuleGerritEntityProvider.test.ts} (93%)
rename plugins/catalog-backend-module-gerrit/src/{service/GerritEntityProviderCatalogModule.ts => module/catalogModuleGerritEntityProvider.ts} (96%)
create mode 100644 plugins/catalog-backend-module-gerrit/src/module/index.ts
rename plugins/catalog-backend-module-github/src/{service/GithubEntityProviderCatalogModule.test.ts => module/catalogModuleGithubEntityProvider.test.ts} (92%)
rename plugins/catalog-backend-module-github/src/{service/GithubEntityProviderCatalogModule.ts => module/catalogModuleGithubEntityProvider.ts} (96%)
create mode 100644 plugins/catalog-backend-module-github/src/module/index.ts
rename plugins/catalog-backend-module-gitlab/src/{service/GitlabDiscoveryEntityProviderCatalogModule.test.ts => module/catalogModuleGitlabDiscoveryEntityProvider.test.ts} (92%)
rename plugins/catalog-backend-module-gitlab/src/{service/GitlabDiscoveryEntityProviderCatalogModule.ts => module/catalogModuleGitlabDiscoveryEntityProvider.ts} (96%)
rename plugins/catalog-backend-module-incremental-ingestion/src/module/{incrementalIngestionEntityProviderCatalogModule.test.ts => catalogModuleIncrementalIngestionEntityProvider.test.ts} (91%)
rename plugins/catalog-backend-module-incremental-ingestion/src/module/{incrementalIngestionEntityProviderCatalogModule.ts => catalogModuleIncrementalIngestionEntityProvider.ts} (97%)
rename plugins/catalog-backend-module-msgraph/src/{service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts => module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts} (92%)
rename plugins/catalog-backend-module-msgraph/src/{service/MicrosoftGraphOrgEntityProviderCatalogModule.ts => module/catalogModuleMicrosoftGraphOrgEntityProvider.ts} (91%)
create mode 100644 plugins/catalog-backend-module-msgraph/src/module/index.ts
create mode 100644 plugins/catalog-backend-module-puppetdb/CHANGELOG.md
create mode 100644 plugins/catalog-backend-module-puppetdb/alpha-api-report.md
rename plugins/{catalog-backend/src/util/index.ts => catalog-backend-module-puppetdb/src/alpha.ts} (84%)
create mode 100644 plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts
create mode 100644 plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts
create mode 100644 plugins/catalog-backend-module-puppetdb/src/module/index.ts
create mode 100644 plugins/catalog-backend/src/deprecated.ts
create mode 100644 plugins/catalog-node/src/conversion.ts
rename plugins/events-backend-module-aws-sqs/src/service/{AwsSqsConsumingEventPublisherEventsModule.test.ts => eventsModuleAwsSqsConsumingEventPublisher.test.ts} (92%)
rename plugins/events-backend-module-aws-sqs/src/service/{AwsSqsConsumingEventPublisherEventsModule.ts => eventsModuleAwsSqsConsumingEventPublisher.ts} (92%)
rename plugins/events-backend-module-azure/src/service/{AzureDevOpsEventRouterEventsModule.test.ts => eventsModuleAzureDevOpsEventRouter.test.ts} (88%)
rename plugins/events-backend-module-azure/src/service/{AzureDevOpsEventRouterEventsModule.ts => eventsModuleAzureDevOpsEventRouter.ts} (95%)
rename plugins/events-backend-module-bitbucket-cloud/src/service/{BitbucketCloudEventRouterEventsModule.test.ts => eventsModuleBitbucketCloudEventRouter.test.ts} (88%)
rename plugins/events-backend-module-bitbucket-cloud/src/service/{BitbucketCloudEventRouterEventsModule.ts => eventsModuleBitbucketCloudEventRouter.ts} (95%)
rename plugins/events-backend-module-gerrit/src/service/{GerritEventRouterEventsModule.test.ts => eventsModuleGerritEventRouter.test.ts} (89%)
rename plugins/events-backend-module-gerrit/src/service/{GerritEventRouterEventsModule.ts => eventsModuleGerritEventRouter.ts} (95%)
rename plugins/events-backend-module-github/src/service/{GithubEventRouterEventsModule.test.ts => eventsModuleGithubEventRouter.test.ts} (89%)
rename plugins/events-backend-module-github/src/service/{GithubEventRouterEventsModule.ts => eventsModuleGithubEventRouter.ts} (95%)
rename plugins/events-backend-module-github/src/service/{GithubWebhookEventsModule.test.ts => eventsModuleGithubWebhook.test.ts} (94%)
rename plugins/events-backend-module-github/src/service/{GithubWebhookEventsModule.ts => eventsModuleGithubWebhook.ts} (95%)
rename plugins/events-backend-module-gitlab/src/service/{GitlabEventRouterEventsModule.test.ts => eventsModuleGitlabEventRouter.test.ts} (89%)
rename plugins/events-backend-module-gitlab/src/service/{GitlabEventRouterEventsModule.ts => eventsModuleGitlabEventRouter.ts} (95%)
rename plugins/events-backend-module-gitlab/src/service/{GitlabWebhookEventsModule.test.ts => eventsModuleGitlabWebhook.test.ts} (95%)
rename plugins/events-backend-module-gitlab/src/service/{GitlabWebhookEventsModule.ts => eventsModuleGitlabWebhook.ts} (95%)
create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts
create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts
create mode 100644 plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts
create mode 100644 plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx
diff --git a/.changeset/backend-token-authentication.md b/.changeset/backend-token-authentication.md
new file mode 100644
index 0000000000..3b0f016800
--- /dev/null
+++ b/.changeset/backend-token-authentication.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Make identity valid if subject of token is a backstage server-2-server auth token
diff --git a/.changeset/beige-hats-cheer.md b/.changeset/beige-hats-cheer.md
new file mode 100644
index 0000000000..83b70d137e
--- /dev/null
+++ b/.changeset/beige-hats-cheer.md
@@ -0,0 +1,27 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago:
+
+- `CatalogProcessor`
+- `CatalogProcessorCache`
+- `CatalogProcessorEmit`
+- `CatalogProcessorEntityResult`
+- `CatalogProcessorErrorResult`
+- `CatalogProcessorLocationResult`
+- `CatalogProcessorParser`
+- `CatalogProcessorRefreshKeysResult`
+- `CatalogProcessorRelationResult`
+- `CatalogProcessorResult`
+- `DeferredEntity`
+- `EntityProvider`
+- `EntityProviderConnection`
+- `EntityProviderMutation`
+- `EntityRelationSpec`
+- `processingResult`
+
+Also moved over and deprecated the following symbols:
+
+- `locationSpecToLocationEntity`
+- `locationSpecToMetadataName`
diff --git a/.changeset/big-gorillas-fail1.md b/.changeset/big-gorillas-fail1.md
new file mode 100644
index 0000000000..18c2d621d7
--- /dev/null
+++ b/.changeset/big-gorillas-fail1.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend-module-bitbucket-cloud': patch
+---
+
+Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/big-gorillas-fail2.md b/.changeset/big-gorillas-fail2.md
new file mode 100644
index 0000000000..bc34bf9aaa
--- /dev/null
+++ b/.changeset/big-gorillas-fail2.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend-module-aws-sqs': patch
+---
+
+Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/big-gorillas-fail3.md b/.changeset/big-gorillas-fail3.md
new file mode 100644
index 0000000000..352c1a2cff
--- /dev/null
+++ b/.changeset/big-gorillas-fail3.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend-module-gerrit': patch
+---
+
+Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/big-gorillas-fail4.md b/.changeset/big-gorillas-fail4.md
new file mode 100644
index 0000000000..add8699f8b
--- /dev/null
+++ b/.changeset/big-gorillas-fail4.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend-module-github': patch
+---
+
+Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/big-gorillas-fail5.md b/.changeset/big-gorillas-fail5.md
new file mode 100644
index 0000000000..549eb61f24
--- /dev/null
+++ b/.changeset/big-gorillas-fail5.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend-module-gitlab': patch
+---
+
+Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/big-gorillas-fail6.md b/.changeset/big-gorillas-fail6.md
new file mode 100644
index 0000000000..6622b5222e
--- /dev/null
+++ b/.changeset/big-gorillas-fail6.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend-module-azure': patch
+---
+
+Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/cold-dogs-watch.md b/.changeset/cold-dogs-watch.md
new file mode 100644
index 0000000000..99b25a833e
--- /dev/null
+++ b/.changeset/cold-dogs-watch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-puppetdb': patch
+---
+
+Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system
diff --git a/.changeset/create-app-1678209629.md b/.changeset/create-app-1678209629.md
new file mode 100644
index 0000000000..b50d431d4b
--- /dev/null
+++ b/.changeset/create-app-1678209629.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Bumped create-app version.
diff --git a/.changeset/curly-jobs-kneel.md b/.changeset/curly-jobs-kneel.md
new file mode 100644
index 0000000000..f313beab88
--- /dev/null
+++ b/.changeset/curly-jobs-kneel.md
@@ -0,0 +1,8 @@
+---
+'@backstage/plugin-scaffolder': patch
+'@backstage/plugin-scaffolder-backend': patch
+'@backstage/plugin-scaffolder-node': patch
+'@backstage/plugin-scaffolder-react': patch
+---
+
+Added a possibility to cancel the running task (executing of a scaffolder template)
diff --git a/plugins/.changeset/dull-adults-drum.md b/.changeset/dull-adults-drum.md
similarity index 100%
rename from plugins/.changeset/dull-adults-drum.md
rename to .changeset/dull-adults-drum.md
diff --git a/.changeset/gorgeous-pumas-speak.md b/.changeset/gorgeous-pumas-speak.md
new file mode 100644
index 0000000000..60f40c6748
--- /dev/null
+++ b/.changeset/gorgeous-pumas-speak.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+fix entity switch rendering when there is no default case
diff --git a/.changeset/healthy-buses-live-1.md b/.changeset/healthy-buses-live-1.md
new file mode 100644
index 0000000000..7e433372df
--- /dev/null
+++ b/.changeset/healthy-buses-live-1.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+---
+
+Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-2.md b/.changeset/healthy-buses-live-2.md
new file mode 100644
index 0000000000..ab577276d8
--- /dev/null
+++ b/.changeset/healthy-buses-live-2.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-bitbucket-server': patch
+---
+
+Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-3.md b/.changeset/healthy-buses-live-3.md
new file mode 100644
index 0000000000..493236ea73
--- /dev/null
+++ b/.changeset/healthy-buses-live-3.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
+---
+
+Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-4.md b/.changeset/healthy-buses-live-4.md
new file mode 100644
index 0000000000..fdc223a7f4
--- /dev/null
+++ b/.changeset/healthy-buses-live-4.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-msgraph': patch
+---
+
+Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-5.md b/.changeset/healthy-buses-live-5.md
new file mode 100644
index 0000000000..f540751696
--- /dev/null
+++ b/.changeset/healthy-buses-live-5.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-gerrit': patch
+---
+
+Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-6.md b/.changeset/healthy-buses-live-6.md
new file mode 100644
index 0000000000..f293e56eae
--- /dev/null
+++ b/.changeset/healthy-buses-live-6.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-github': patch
+---
+
+Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-7.md b/.changeset/healthy-buses-live-7.md
new file mode 100644
index 0000000000..7e7219bf01
--- /dev/null
+++ b/.changeset/healthy-buses-live-7.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-gitlab': patch
+---
+
+Renamed `gitlabDiscoveryEntityProviderCatalogModule` to `catalogModuleGitlabDiscoveryEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-8.md b/.changeset/healthy-buses-live-8.md
new file mode 100644
index 0000000000..9137a3b31a
--- /dev/null
+++ b/.changeset/healthy-buses-live-8.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-azure': patch
+---
+
+Renamed `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/healthy-buses-live-9.md b/.changeset/healthy-buses-live-9.md
new file mode 100644
index 0000000000..dbcba51470
--- /dev/null
+++ b/.changeset/healthy-buses-live-9.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-aws': patch
+---
+
+Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns).
diff --git a/.changeset/honest-clouds-shout.md b/.changeset/honest-clouds-shout.md
new file mode 100644
index 0000000000..0a7249d9ad
--- /dev/null
+++ b/.changeset/honest-clouds-shout.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+catalog write action should allow any shape of object
diff --git a/.changeset/light-bees-end.md b/.changeset/light-bees-end.md
new file mode 100644
index 0000000000..9fbbc44da0
--- /dev/null
+++ b/.changeset/light-bees-end.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-kubernetes': patch
+---
+
+GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters
diff --git a/.changeset/moody-apes-know.md b/.changeset/moody-apes-know.md
new file mode 100644
index 0000000000..bd48cb108e
--- /dev/null
+++ b/.changeset/moody-apes-know.md
@@ -0,0 +1,16 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+'@backstage/plugin-catalog-backend-module-bitbucket-server': patch
+'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
+'@backstage/plugin-catalog-backend-module-bitbucket': patch
+'@backstage/plugin-catalog-backend-module-puppetdb': patch
+'@backstage/plugin-catalog-backend-module-msgraph': patch
+'@backstage/plugin-catalog-backend-module-gerrit': patch
+'@backstage/plugin-catalog-backend-module-github': patch
+'@backstage/plugin-catalog-backend-module-gitlab': patch
+'@backstage/plugin-catalog-backend-module-azure': patch
+'@backstage/plugin-catalog-backend-module-ldap': patch
+'@backstage/plugin-catalog-backend-module-aws': patch
+---
+
+Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend`
diff --git a/.changeset/nine-bikes-applaud.md b/.changeset/nine-bikes-applaud.md
new file mode 100644
index 0000000000..77a1c0e4be
--- /dev/null
+++ b/.changeset/nine-bikes-applaud.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch
+---
+
+allow container runner to be undefined in cookiecutter plugin
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 2f69a85050..fc7fbffc9a 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -1,5 +1,5 @@
{
- "mode": "pre",
+ "mode": "exit",
"tag": "next",
"initialVersions": {
"example-app": "0.2.80",
@@ -210,44 +210,63 @@
"@backstage/plugin-vault-backend": "0.2.8",
"@backstage/plugin-xcmetrics": "0.2.35",
"@backstage/plugin-octopus-deploy": "0.0.0",
- "@backstage/plugin-stackstorm": "0.0.0"
+ "@backstage/plugin-stackstorm": "0.0.0",
+ "@backstage/plugin-catalog-backend-module-puppetdb": "0.0.1"
},
"changesets": [
"afraid-trees-stare",
+ "backend-token-authentication",
"breezy-bees-care",
"bright-kids-raise",
+ "clean-lemons-jump",
"clean-planes-join",
+ "clever-dogs-cheat",
"cool-clocks-prove",
+ "cool-feet-speak",
"create-app-1676993958",
+ "create-app-1678209629",
"curvy-pets-hang",
"eight-radios-bake",
+ "eighty-chairs-roll",
"eighty-geese-return",
+ "empty-books-occur",
"famous-sloths-tie",
+ "fifty-beds-dress",
"flat-kids-occur",
"flat-peaches-act",
"forty-snails-clap",
"four-lizards-grin",
+ "fresh-hairs-switch",
"fuzzy-trains-search",
+ "gentle-bears-love",
"gentle-pears-clean",
"great-trains-jam",
"grumpy-bikes-begin",
"happy-boxes-arrive",
+ "honest-clouds-shout",
"honest-nails-bake",
"khaki-poems-run",
+ "light-bees-end",
"light-sheep-trade",
"long-nails-pump",
"long-wolves-drive",
+ "lovely-tigers-look",
+ "mean-toys-itch",
"metal-suns-rhyme",
"mighty-games-turn",
"mighty-years-own",
"new-jobs-deny",
"nice-planets-wave",
+ "nine-bikes-applaud",
"ninety-turtles-wait",
"odd-fireants-bathe",
"odd-oranges-tease",
"odd-waves-rescue",
"old-foxes-shave",
+ "olive-berries-poke",
+ "orange-experts-hug",
"perfect-mayflies-greet",
+ "pink-dolls-unite",
"polite-chicken-do",
"polite-falcons-jump",
"polite-wombats-smash",
@@ -267,8 +286,13 @@
"renovate-fb85ae7",
"rich-clocks-approve",
"rich-wombats-rescue",
+ "rotten-cats-matter",
+ "rotten-panthers-share",
+ "selfish-hats-wait",
"short-mayflies-fix",
+ "silent-dryers-end",
"silly-suits-run",
+ "silver-bikes-breathe",
"silver-lies-rest",
"six-melons-rhyme",
"slimy-lobsters-kneel",
@@ -282,6 +306,7 @@
"tall-hats-talk",
"ten-tigers-marry",
"thin-candles-wait",
+ "tiny-llamas-jump",
"tricky-jars-film",
"twelve-cars-push",
"twenty-jeans-speak",
@@ -292,9 +317,11 @@
"wicked-lions-repeat",
"wicked-spoons-call",
"wild-ads-pull",
+ "wild-bulldogs-suffer",
"witty-geckos-design",
"yellow-bananas-yawn",
"young-schools-double",
- "young-scissors-cough"
+ "young-scissors-cough",
+ "young-walls-prove"
]
}
diff --git a/.changeset/proud-jokes-pull.md b/.changeset/proud-jokes-pull.md
new file mode 100644
index 0000000000..7d7790889a
--- /dev/null
+++ b/.changeset/proud-jokes-pull.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-node': patch
+---
+
+Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated.
diff --git a/.changeset/rotten-cats-matter.md b/.changeset/rotten-cats-matter.md
new file mode 100644
index 0000000000..2515db9991
--- /dev/null
+++ b/.changeset/rotten-cats-matter.md
@@ -0,0 +1,19 @@
+---
+'@backstage/core-app-api': minor
+---
+
+`OAuth2` now gets ID tokens from a session with the `openid` scope explicitly
+requested.
+
+This should not be considered a breaking change, because spec-compliant OIDC
+providers will already be returning ID tokens if and only if the `openid` scope
+is granted.
+
+This change makes the dependence explicit, and removes the burden on
+OAuth2-based providers which require an ID token (e.g. this is done by various
+default [auth
+handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add
+`openid` to their default scopes. _That_ could carry another indirect benefit:
+by removing `openid` from the default scopes for a provider, grants for
+resource-specific access tokens can avoid requesting excess ID token-related
+scopes.
diff --git a/.changeset/silver-bikes-breathe.md b/.changeset/silver-bikes-breathe.md
index 63dabf7b2e..0288580bba 100644
--- a/.changeset/silver-bikes-breathe.md
+++ b/.changeset/silver-bikes-breathe.md
@@ -2,4 +2,23 @@
'@backstage/plugin-catalog': minor
---
-allow entity switch to render all cases that match the condition
+Allow `EntitySwitch` to render all cases that match the condition.
+
+This change introduces a new parameter for the `EntitySwitch` component
+`renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch`
+will render all `EntitySwitch.Case` that contain `if` parameter, and it
+evaluates to true. In case none of the cases match, the default case will be
+rendered, if any.
+
+This means for example in the CI/CD page you can now do the following:
+
+```tsx
+
+ Jenkins
+ CodeBuild
+ No CI/CD
+
+```
+
+This allows the component to have multiple CI/CD systems and all of those are
+rendered on the same page.
diff --git a/.changeset/stupid-games-brake.md b/.changeset/stupid-games-brake.md
new file mode 100644
index 0000000000..0a50a32ffa
--- /dev/null
+++ b/.changeset/stupid-games-brake.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-backend': patch
+---
+
+Updated README instructions
diff --git a/.changeset/twenty-insects-live.md b/.changeset/twenty-insects-live.md
new file mode 100644
index 0000000000..d3f8cdfc25
--- /dev/null
+++ b/.changeset/twenty-insects-live.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-proxy-backend': patch
+---
+
+Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`.
diff --git a/.changeset/witty-squids-fetch.md b/.changeset/witty-squids-fetch.md
new file mode 100644
index 0000000000..3e13421038
--- /dev/null
+++ b/.changeset/witty-squids-fetch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`.
diff --git a/.changeset/young-walls-prove.md b/.changeset/young-walls-prove.md
new file mode 100644
index 0000000000..33fafa1548
--- /dev/null
+++ b/.changeset/young-walls-prove.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-plugin-api': minor
+---
+
+The GitLab auth provider can now be used to get OpenID tokens.
diff --git a/ADOPTERS.md b/ADOPTERS.md
index 70b2992cf9..26f4331b70 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -233,4 +233,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/
| [Gumtree](https://www.gumtree.com.au) | [Kumar Gaurav](https://www.linkedin.com/in/kumargaurav517) | We are starting to use it as a single place to find all component information in a distributed architecture. |
| [N26](https://n26.com) | [Alexei Timofti](https://www.linkedin.com/in/alexeitimofti) | We use Backstage for our service catalog and are actively looking into adopting other plugins like TechDocs, TechInsights and Software Templates. |
| [The LEGO Group](https://www.lego.com) | [Waqas Ali](https://www.linkedin.com/in/waqasali47) | We are building our internal develper portal on top of Backstage. |
+| [CORS.gmbh](https://www.cors.gmbh) | [@dpfaffenbauer](https://github.com/dpfaffenbauer) | Developer Portal for our Projects we develop for our Customers and Hosting them On Kubernetes. |
diff --git a/docs/auth/gitlab/provider.md b/docs/auth/gitlab/provider.md
index 5041e161c5..dc41617812 100644
--- a/docs/auth/gitlab/provider.md
+++ b/docs/auth/gitlab/provider.md
@@ -18,7 +18,11 @@ Settings for local development:
- Name: Backstage (or your custom app name)
- Redirect URI: `http://localhost:7007/api/auth/gitlab/handler/frame`
-- Scopes: `read_api` and `read_user`
+- Scopes: `read_user` for sign-in. If you also need ID tokens (e.g. if you are
+ using the Kubernetes plugin and have clusters with `authProvider: oidc` and
+ [`oidcTokenProvider:
+gitlab`](https://backstage.io/docs/features/kubernetes/configuration/#clustersoidctokenprovider-optional)),
+ add the `openid` scope.
## Configuration
diff --git a/docs/features/kubernetes/configuration.md b/docs/features/kubernetes/configuration.md
index 837574aa9e..458637f316 100644
--- a/docs/features/kubernetes/configuration.md
+++ b/docs/features/kubernetes/configuration.md
@@ -160,8 +160,9 @@ auth:
audience: ${AUTH_OKTA_AUDIENCE}
```
-The following values are supported out-of-the-box by the frontend: `google`, `microsoft`,
-`okta`, `onelogin`.
+The following values are supported out-of-the-box by the frontend: `gitlab` (the
+application whose `clientId` is used by the auth provider should be granted the
+`openid` scope), `google`, `microsoft`, `okta`, `onelogin`.
Take note that `oidcTokenProvider` is just the issuer for the token, you can use any
of these with an OIDC enabled cluster, like using `microsoft` as the issuer for a EKS
diff --git a/docs/features/software-templates/index.md b/docs/features/software-templates/index.md
index 5911e192b1..fbccf8848c 100644
--- a/docs/features/software-templates/index.md
+++ b/docs/features/software-templates/index.md
@@ -58,6 +58,10 @@ It shouldn't take too long, and you'll have a success screen!
If it fails, you'll be able to click on each section to get the log from the
step that failed which can be helpful in debugging.
+You can also cancel the running process. Once you clicked on button "Cancel", the abort signal
+will be sent to a task and all next steps won't be executed. The current step will be cancelled
+only if it supports it.
+

## View Component in Catalog
diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md
index 3e89e89582..7a841dfd0e 100644
--- a/docs/features/software-templates/writing-custom-actions.md
+++ b/docs/features/software-templates/writing-custom-actions.md
@@ -71,7 +71,7 @@ You can also choose to define your custom action using JSON schema instead of `z
```ts title="With JSON Schema"
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
-import fs from 'fs-extra';
+import { writeFile } from 'fs';
export const createNewFileAction = () => {
return createTemplateAction<{ contents: string; filename: string }>({
@@ -95,9 +95,12 @@ export const createNewFileAction = () => {
},
},
async handler(ctx) {
- await fs.outputFile(
+ const { signal } = ctx;
+ await writeFile(
`${ctx.workspacePath}/${ctx.input.filename}`,
ctx.input.contents,
+ { signal },
+ _ => {},
);
},
});
diff --git a/docs/overview/adopting.md b/docs/overview/adopting.md
index 0765d4a452..15450c995b 100644
--- a/docs/overview/adopting.md
+++ b/docs/overview/adopting.md
@@ -153,7 +153,7 @@ Backstage as _the_ platform:
percentage of engineers is below 50%. Most engineers actually use Backstage on
a daily basis.
-Again, any feedback is appreciated. Please use the Edit button at the top of the
+Again, any feedback is appreciated. Please use the Edit button at the bottom of the
page to make a suggestion.
_**Note!** It might be tempting to try to optimize Backstage usage and
diff --git a/docs/releases/v1.12.0-next.2-changelog.md b/docs/releases/v1.12.0-next.2-changelog.md
new file mode 100644
index 0000000000..7a64ec5f84
--- /dev/null
+++ b/docs/releases/v1.12.0-next.2-changelog.md
@@ -0,0 +1,1833 @@
+# Release v1.12.0-next.2
+
+## @backstage/backend-tasks@0.5.0-next.2
+
+### Minor Changes
+
+- 1578276708a: add functionality to get descriptions from the scheduler for triggering
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/core-app-api@1.6.0-next.2
+
+### Minor Changes
+
+- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly
+ requested.
+
+ This should not be considered a breaking change, because spec-compliant OIDC
+ providers will already be returning ID tokens if and only if the `openid` scope
+ is granted.
+
+ This change makes the dependence explicit, and removes the burden on
+ OAuth2-based providers which require an ID token (e.g. this is done by various
+ default [auth
+ handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add
+ `openid` to their default scopes. _That_ could carry another indirect benefit:
+ by removing `openid` from the default scopes for a provider, grants for
+ resource-specific access tokens can avoid requesting excess ID token-related
+ scopes.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/core-plugin-api@1.5.0-next.2
+
+### Minor Changes
+
+- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-catalog@1.9.0-next.2
+
+### Minor Changes
+
+- 23cc40039c0: allow entity switch to render all cases that match the condition
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+
+## @backstage/plugin-catalog-backend-module-puppetdb@0.1.0-next.0
+
+### Minor Changes
+
+- a1efcf9a658: Initial version of the plugin.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-scaffolder@1.12.0-next.2
+
+### Minor Changes
+
+- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version.
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles.
+- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-scaffolder-react@1.2.0-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/app-defaults@1.2.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+
+## @backstage/backend-app-api@0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/backend-common@0.18.3-next.2
+
+### Patch Changes
+
+- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres
+
+ The example config below connects to the database as user `v-backstage-123` but sets the ownership of
+ the create schemas and tables to `backstage`
+
+ ```yaml
+ backend:
+ database:
+ client: pg
+ pluginDivisionMode: schema
+ role: backstage
+ connection:
+ user: v-backstage-123
+ ...
+ ```
+
+- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3
+
+- Updated dependencies
+ - @backstage/backend-app-api@0.4.1-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+ - @backstage/integration-aws-node@0.1.2-next.0
+
+## @backstage/backend-defaults@0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-app-api@0.4.1-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
+## @backstage/backend-plugin-api@0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/backend-test-utils@0.1.35-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-app-api@0.4.1-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/core-components@0.12.5-next.2
+
+### Patch Changes
+
+- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations.
+ For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc.
+ This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar.
+- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/create-app@0.4.38-next.2
+
+### Patch Changes
+
+- Bumped create-app version.
+
+## @backstage/dev-utils@1.0.13-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/app-defaults@1.2.1-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/test-utils@1.2.6-next.2
+
+## @backstage/integration-react@1.1.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @techdocs/cli@1.4.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.6.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/test-utils@1.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-adr@0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+
+## @backstage/plugin-adr-backend@0.3.1-next.2
+
+### Patch Changes
+
+- 2a73ded3861: Support MADR v3 format
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-airbrake@0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/dev-utils@1.0.13-next.2
+ - @backstage/test-utils@1.2.6-next.2
+
+## @backstage/plugin-airbrake-backend@0.2.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-allure@0.1.32-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-analytics-module-ga@0.1.27-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-apache-airflow@0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-api-docs@0.9.1-next.2
+
+### Patch Changes
+
+- 8bc7dcec820: Fix dark theme Swagger's clear button font color.
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-apollo-explorer@0.1.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-app-backend@0.3.43-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-auth-backend@0.18.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-auth-node@0.2.12-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-azure-devops@0.2.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-azure-devops-backend@0.3.22-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-azure-sites@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-azure-sites-backend@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-badges@0.2.40-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-badges-backend@0.1.37-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-bazaar@0.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/cli@0.22.4-next.1
+
+## @backstage/plugin-bazaar-backend@0.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-bitrise@0.1.43-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-catalog-backend@1.8.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.17-next.2
+
+### Patch Changes
+
+- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.14-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.2.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-github@0.2.6-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.1.14-next.2
+
+### Patch Changes
+
+- be129f8f3cd: filter gitlab groups by prefix
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-catalog-backend-module-ldap@0.5.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.5.2-next.2
+
+### Patch Changes
+
+- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-catalog-backend-module-openapi@0.1.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-graph@0.2.28-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-catalog-import@0.9.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-catalog-node@1.3.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
+## @backstage/plugin-catalog-react@1.4.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-cicd-statistics@0.1.18-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-cicd-statistics@0.1.18-next.2
+
+## @backstage/plugin-circleci@0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-cloudbuild@0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-code-climate@0.1.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-code-coverage@0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-code-coverage-backend@0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-codescene@0.1.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-config-schema@0.1.39-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-cost-insights@0.12.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-dynatrace@3.0.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-entity-feedback@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-entity-feedback-backend@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-entity-validation@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-events-backend@0.2.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-events-backend-module-aws-sqs@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-events-backend-module-azure@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+
+## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+
+## @backstage/plugin-events-backend-module-gerrit@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+
+## @backstage/plugin-events-backend-module-github@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-events-backend-module-gitlab@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-events-backend-test-utils@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.2.4-next.2
+
+## @backstage/plugin-events-node@0.2.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
+## @backstage/plugin-explore@0.4.1-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-explore-react@0.0.27-next.2
+
+## @backstage/plugin-explore-backend@0.0.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-explore-react@0.0.27-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-firehydrant@0.1.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-fossa@0.2.48-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-gcalendar@0.3.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-gcp-projects@0.3.35-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-git-release-manager@0.3.29-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-github-actions@0.5.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-github-deployments@0.1.47-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-github-issues@0.2.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-github-pull-requests-board@0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-gitops-profiles@0.3.34-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-gocd@0.1.22-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-graphiql@0.2.48-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-graphql-backend@0.1.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/plugin-catalog-graphql@0.3.19-next.1
+
+## @backstage/plugin-graphql-voyager@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-home@0.4.32-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-ilert@0.2.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-jenkins@0.7.15-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-jenkins-backend@0.1.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-kafka@0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-kafka-backend@0.2.36-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-kubernetes@0.7.9-next.2
+
+### Patch Changes
+
+- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-kubernetes-backend@0.9.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-lighthouse@0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-lighthouse-backend@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-linguist@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-linguist-backend@0.2.0-next.2
+
+### Patch Changes
+
+- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API).
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-microsoft-calendar@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-newrelic@0.3.34-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-newrelic-dashboard@0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-octopus-deploy@0.1.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-org@0.6.6-next.2
+
+### Patch Changes
+
+- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text.
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-org-react@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-pagerduty@0.5.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-periskop@0.1.14-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-periskop-backend@0.1.14-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-permission-backend@0.5.18-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-permission-node@0.7.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-permission-react@0.4.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-playlist@0.1.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+
+## @backstage/plugin-playlist-backend@0.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-proxy-backend@0.2.37-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-rollbar@0.4.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-rollbar-backend@0.1.40-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-scaffolder-backend@1.12.0-next.2
+
+### Patch Changes
+
+- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token
+- 65454876fb2: Minor API report tweaks
+- 9968f455921: catalog write action should allow any shape of object
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.18-next.2
+
+### Patch Changes
+
+- 62414770ead: allow container runner to be undefined in cookiecutter plugin
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.1.3-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-scaffolder-node@0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
+## @backstage/plugin-scaffolder-react@1.2.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles.
+- d9893263ba9: scaffolder/next: Fix for steps without properties
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-search@1.1.1-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-search-backend@1.2.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-search-backend-module-pg@0.5.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-search-backend-node@1.1.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-search-react@1.5.1-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- 553f3c95011: Correctly disable next button in `SearchPagination` on last page
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-sentry@0.5.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-shortcuts@0.3.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-sonarqube@0.6.5-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-sonarqube-react@0.1.4-next.2
+
+## @backstage/plugin-sonarqube-backend@0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-sonarqube-react@0.1.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-splunk-on-call@0.4.5-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-stack-overflow@0.1.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-home@0.4.32-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-stack-overflow-backend@0.1.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-stackstorm@0.1.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-tech-insights@0.3.8-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-tech-insights-backend@0.5.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-tech-insights-node@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-tech-insights-node@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-tech-insights-node@0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-tech-radar@0.6.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-techdocs@1.6.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/plugin-techdocs@1.6.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/test-utils@1.2.6-next.2
+
+## @backstage/plugin-techdocs-backend@1.5.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.6.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-techdocs-node@1.6.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+ - @backstage/integration-aws-node@0.1.2-next.0
+
+## @backstage/plugin-techdocs-react@1.1.4-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-todo@0.2.18-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-todo-backend@0.1.40-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## @backstage/plugin-user-settings@0.7.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-user-settings-backend@0.1.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
+## @backstage/plugin-vault@0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @backstage/plugin-vault-backend@0.2.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @backstage/plugin-xcmetrics@0.2.36-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## example-app@0.2.81-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-scaffolder-react@1.2.0-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-tech-insights@0.3.8-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/plugin-scaffolder@1.12.0-next.2
+ - @backstage/plugin-techdocs@1.6.0-next.2
+ - @backstage/plugin-explore@0.4.1-next.2
+ - @backstage/plugin-search@1.1.1-next.2
+ - @backstage/plugin-kubernetes@0.7.9-next.2
+ - @backstage/plugin-api-docs@0.9.1-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/plugin-org@0.6.6-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/app-defaults@1.2.1-next.2
+ - @backstage/cli@0.22.4-next.1
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/plugin-airbrake@0.3.16-next.2
+ - @backstage/plugin-apache-airflow@0.2.9-next.2
+ - @backstage/plugin-azure-devops@0.2.7-next.2
+ - @backstage/plugin-azure-sites@0.1.5-next.2
+ - @backstage/plugin-badges@0.2.40-next.2
+ - @backstage/plugin-catalog-graph@0.2.28-next.2
+ - @backstage/plugin-catalog-import@0.9.6-next.2
+ - @backstage/plugin-circleci@0.3.16-next.2
+ - @backstage/plugin-cloudbuild@0.3.16-next.2
+ - @backstage/plugin-code-coverage@0.2.9-next.2
+ - @backstage/plugin-cost-insights@0.12.5-next.2
+ - @backstage/plugin-dynatrace@3.0.0-next.2
+ - @backstage/plugin-entity-feedback@0.1.1-next.2
+ - @backstage/plugin-gcalendar@0.3.12-next.2
+ - @backstage/plugin-gcp-projects@0.3.35-next.2
+ - @backstage/plugin-github-actions@0.5.16-next.2
+ - @backstage/plugin-gocd@0.1.22-next.2
+ - @backstage/plugin-graphiql@0.2.48-next.2
+ - @backstage/plugin-home@0.4.32-next.2
+ - @backstage/plugin-jenkins@0.7.15-next.2
+ - @backstage/plugin-kafka@0.3.16-next.2
+ - @backstage/plugin-lighthouse@0.4.1-next.2
+ - @backstage/plugin-linguist@0.1.1-next.2
+ - @backstage/plugin-microsoft-calendar@0.1.1-next.2
+ - @backstage/plugin-newrelic@0.3.34-next.2
+ - @backstage/plugin-newrelic-dashboard@0.2.9-next.2
+ - @backstage/plugin-pagerduty@0.5.9-next.2
+ - @backstage/plugin-playlist@0.1.7-next.2
+ - @backstage/plugin-rollbar@0.4.16-next.2
+ - @backstage/plugin-sentry@0.5.1-next.2
+ - @backstage/plugin-shortcuts@0.3.8-next.2
+ - @backstage/plugin-stack-overflow@0.1.12-next.2
+ - @backstage/plugin-stackstorm@0.1.0-next.2
+ - @backstage/plugin-tech-radar@0.6.2-next.2
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.2
+ - @backstage/plugin-todo@0.2.18-next.2
+ - @backstage/plugin-user-settings@0.7.1-next.2
+ - @internal/plugin-catalog-customized@0.0.8-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/config@1.0.7-next.0
+
+## example-backend@0.2.81-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/plugin-adr-backend@0.3.1-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-linguist-backend@0.2.0-next.2
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2
+ - example-app@0.2.81-next.2
+ - @backstage/plugin-techdocs-backend@1.5.4-next.2
+ - @backstage/plugin-auth-backend@0.18.1-next.2
+ - @backstage/plugin-entity-feedback-backend@0.1.1-next.2
+ - @backstage/plugin-jenkins-backend@0.1.33-next.2
+ - @backstage/plugin-kubernetes-backend@0.9.4-next.2
+ - @backstage/plugin-permission-backend@0.5.18-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/plugin-playlist-backend@0.2.6-next.2
+ - @backstage/plugin-search-backend@1.2.4-next.2
+ - @backstage/plugin-lighthouse-backend@0.1.1-next.2
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/plugin-tech-insights-backend@0.5.9-next.2
+ - @backstage/plugin-tech-insights-node@0.4.1-next.2
+ - @backstage/plugin-app-backend@0.3.43-next.2
+ - @backstage/plugin-azure-devops-backend@0.3.22-next.2
+ - @backstage/plugin-azure-sites-backend@0.1.5-next.2
+ - @backstage/plugin-badges-backend@0.1.37-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-code-coverage-backend@0.2.9-next.2
+ - @backstage/plugin-events-backend@0.2.4-next.2
+ - @backstage/plugin-explore-backend@0.0.5-next.2
+ - @backstage/plugin-graphql-backend@0.1.33-next.2
+ - @backstage/plugin-kafka-backend@0.2.36-next.2
+ - @backstage/plugin-proxy-backend@0.2.37-next.2
+ - @backstage/plugin-rollbar-backend@0.1.40-next.2
+ - @backstage/plugin-search-backend-module-pg@0.5.4-next.2
+ - @backstage/plugin-todo-backend@0.1.40-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
+## example-backend-next@0.0.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/backend-defaults@0.1.8-next.2
+ - @backstage/plugin-app-backend@0.3.43-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-todo-backend@0.1.40-next.2
+
+## e2e-test@0.2.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.4.38-next.2
+
+## techdocs-cli-embedded-app@0.2.80-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-techdocs@1.6.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/app-defaults@1.2.1-next.2
+ - @backstage/cli@0.22.4-next.1
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/test-utils@1.2.6-next.2
+ - @backstage/config@1.0.7-next.0
+
+## @internal/plugin-catalog-customized@0.0.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+
+## @internal/plugin-todo-list@1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
+## @internal/plugin-todo-list-backend@1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
diff --git a/microsite-next/src/components/simpleCard/simpleCard.tsx b/microsite-next/src/components/simpleCard/simpleCard.tsx
new file mode 100644
index 0000000000..77be566f18
--- /dev/null
+++ b/microsite-next/src/components/simpleCard/simpleCard.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+
+export interface ICardData {
+ header: React.ReactNode;
+ body: React.ReactNode;
+ footer: React.ReactNode;
+}
+
+export const SimpleCard = ({ header, body, footer }: ICardData) => (
+
+
{header}
+
+
{body}
+
+
{footer}
+
+);
diff --git a/microsite-next/src/pages/on-demand/_onDemandCard.tsx b/microsite-next/src/pages/on-demand/_onDemandCard.tsx
new file mode 100644
index 0000000000..e203c80f9a
--- /dev/null
+++ b/microsite-next/src/pages/on-demand/_onDemandCard.tsx
@@ -0,0 +1,66 @@
+import Link from '@docusaurus/Link';
+import { SimpleCard } from '@site/src/components/simpleCard/simpleCard';
+import React from 'react';
+
+export interface IOnDemandData {
+ title: string;
+ category: string;
+ description: string;
+ date: string;
+ youtubeUrl: string;
+ youtubeImgUrl: string;
+ rsvpUrl: string;
+ eventUrl: string;
+}
+
+export const OnDemandCard = ({
+ title,
+ category,
+ description,
+ date,
+ youtubeUrl,
+ youtubeImgUrl,
+ rsvpUrl,
+ eventUrl,
+}: IOnDemandData) => (
+
+ {title}
+
+ on {date}
+
+ {category}
+
+
+ >
+ }
+ body={{description}
}
+ footer={
+ category.toLowerCase() === 'upcoming' ? (
+ <>
+
+ Event page
+
+
+
+ Remind me
+
+ >
+ ) : (
+
+ Watch on YouTube
+
+ )
+ }
+ />
+);
diff --git a/microsite-next/src/pages/on-demand/index.tsx b/microsite-next/src/pages/on-demand/index.tsx
new file mode 100644
index 0000000000..7262005f70
--- /dev/null
+++ b/microsite-next/src/pages/on-demand/index.tsx
@@ -0,0 +1,78 @@
+import Layout from '@theme/Layout';
+import clsx from 'clsx';
+import React from 'react';
+
+import { IOnDemandData, OnDemandCard } from './_onDemandCard';
+import pluginsStyles from './onDemand.module.scss';
+import { truncateDescription } from '@site/src/util/truncateDescription';
+import Link from '@docusaurus/Link';
+
+//#region Plugin data import
+const onDemandContext = require.context(
+ '../../../../microsite/data/on-demand',
+ false,
+ /\.ya?ml/,
+);
+
+const onDemandData = onDemandContext.keys().reduce(
+ (acum, id) => {
+ const pluginData: IOnDemandData = onDemandContext(id).default;
+
+ acum[
+ pluginData.category === 'Upcoming' ? 'upcomingEvents' : 'onDemandEvents'
+ ].push(truncateDescription(pluginData));
+
+ return acum;
+ },
+ {
+ upcomingEvents: [] as IOnDemandData[],
+ onDemandEvents: [] as IOnDemandData[],
+ },
+);
+//#endregion
+
+const Plugins = () => (
+
+
+
+
+
Community sessions
+
+
+ Upcoming events and recorded sessions about updates, demos and
+ discussions.
+
+
+
+
+ Add an event or recording
+
+
+
+
+
+
Upcoming live events
+
+
+ {onDemandData.upcomingEvents.map(eventData => (
+
+ ))}
+
+
+
Community on demand
+
+
+ {onDemandData.onDemandEvents.map(eventData => (
+
+ ))}
+
+
+
+);
+
+export default Plugins;
diff --git a/microsite-next/src/pages/on-demand/onDemand.module.scss b/microsite-next/src/pages/on-demand/onDemand.module.scss
new file mode 100644
index 0000000000..fba051ec97
--- /dev/null
+++ b/microsite-next/src/pages/on-demand/onDemand.module.scss
@@ -0,0 +1,44 @@
+.onDemandPage {
+ :global(.marketplaceBanner) {
+ display: flex;
+ align-items: center;
+ }
+
+ :global(.marketplaceContent) {
+ flex: 1;
+ }
+
+ :global(.card) {
+ max-width: 100%;
+ }
+
+ :global(.card .card__header) {
+ display: grid;
+ row-gap: 0.25rem;
+ column-gap: 1rem;
+ justify-items: start;
+
+ > * {
+ margin: 0;
+ }
+
+ :global(img) {
+ width: 250px;
+ max-width: 100%;
+ justify-self: center;
+ }
+ }
+
+ :global(.card .card__footer) {
+ gap: 1rem;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
+ }
+
+ :global(.cardsContainer) {
+ gap: 1rem;
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ justify-items: start;
+ }
+}
diff --git a/microsite-next/src/pages/plugins/_pluginCard.tsx b/microsite-next/src/pages/plugins/_pluginCard.tsx
index dec62af06f..99f27b865d 100644
--- a/microsite-next/src/pages/plugins/_pluginCard.tsx
+++ b/microsite-next/src/pages/plugins/_pluginCard.tsx
@@ -1,4 +1,5 @@
import Link from '@docusaurus/Link';
+import { SimpleCard } from '@site/src/components/simpleCard/simpleCard';
import React from 'react';
export interface IPluginData {
@@ -23,32 +24,30 @@ export const PluginCard = ({
iconUrl,
title,
}: IPluginData) => (
-
-
-

+
+
- {title}
+ {title}
-
- by {author}
-
+
+ by {author}
+
-
- {category}
-
-
-
-
-
-
+
+ {category}
+
+ >
+ }
+ body={
{description}
}
+ footer={
Explore
-
-
+ }
+ />
);
diff --git a/microsite-next/src/pages/plugins/index.tsx b/microsite-next/src/pages/plugins/index.tsx
index f8c6f78819..0e57e01994 100644
--- a/microsite-next/src/pages/plugins/index.tsx
+++ b/microsite-next/src/pages/plugins/index.tsx
@@ -5,18 +5,9 @@ import React from 'react';
import { IPluginData, PluginCard } from './_pluginCard';
import pluginsStyles from './plugins.module.scss';
+import { truncateDescription } from '@site/src/util/truncateDescription';
//#region Plugin data import
-const maxDescLength = 160;
-
-const truncatePluginDescription = (pluginData: IPluginData) =>
- pluginData.description.length > maxDescLength
- ? {
- ...pluginData,
- description: pluginData.description.slice(0, maxDescLength) + '...',
- }
- : pluginData;
-
const pluginsContext = require.context(
'../../../../microsite/data/plugins',
false,
@@ -29,7 +20,7 @@ const plugins = pluginsContext.keys().reduce(
acum[
pluginData.category === 'Core Feature' ? 'corePlugins' : 'otherPlugins'
- ].push(truncatePluginDescription(pluginData));
+ ].push(truncateDescription(pluginData));
return acum;
},
diff --git a/microsite-next/src/util/truncateDescription.tsx b/microsite-next/src/util/truncateDescription.tsx
new file mode 100644
index 0000000000..dc661cbd49
--- /dev/null
+++ b/microsite-next/src/util/truncateDescription.tsx
@@ -0,0 +1,11 @@
+export const maxDescLength = 160;
+
+export const truncateDescription = (
+ itemData: T,
+) =>
+ itemData.description.length > maxDescLength
+ ? {
+ ...itemData,
+ description: itemData.description.slice(0, maxDescLength) + '...',
+ }
+ : itemData;
diff --git a/microsite/pages/en/plugins.js b/microsite/pages/en/plugins.js
index 237161b98a..6e2e1c09ad 100644
--- a/microsite/pages/en/plugins.js
+++ b/microsite/pages/en/plugins.js
@@ -24,7 +24,7 @@ const truncate = text =>
const newForDays = 100;
const addPluginDocsLink = '/docs/plugins/add-to-marketplace';
-const defaultIconUrl = 'img/logo-gradient-on-dark.svg';
+const defaultIconUrl = '/img/logo-gradient-on-dark.svg';
const Plugins = () => (
diff --git a/package.json b/package.json
index 1bdaa670c8..43a146e0a1 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
"@types/react": "^17",
"@types/react-dom": "^17"
},
- "version": "1.12.0-next.1",
+ "version": "1.12.0-next.2",
"dependencies": {
"@backstage/errors": "workspace:^",
"@manypkg/get-packages": "^1.1.3"
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index 648fad21b9..0b2b813d14 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/app-defaults
+## 1.2.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+
## 1.2.1-next.1
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index 76af117a84..873a2fa28f 100644
--- a/packages/app-defaults/package.json
+++ b/packages/app-defaults/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
- "version": "1.2.1-next.1",
+ "version": "1.2.1-next.2",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 301c3684fc..ac21cbad07 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,69 @@
# example-app
+## 0.2.81-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-scaffolder-react@1.2.0-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-tech-insights@0.3.8-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/plugin-scaffolder@1.12.0-next.2
+ - @backstage/plugin-techdocs@1.6.0-next.2
+ - @backstage/plugin-explore@0.4.1-next.2
+ - @backstage/plugin-search@1.1.1-next.2
+ - @backstage/plugin-kubernetes@0.7.9-next.2
+ - @backstage/plugin-api-docs@0.9.1-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/plugin-org@0.6.6-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/app-defaults@1.2.1-next.2
+ - @backstage/cli@0.22.4-next.1
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/plugin-airbrake@0.3.16-next.2
+ - @backstage/plugin-apache-airflow@0.2.9-next.2
+ - @backstage/plugin-azure-devops@0.2.7-next.2
+ - @backstage/plugin-azure-sites@0.1.5-next.2
+ - @backstage/plugin-badges@0.2.40-next.2
+ - @backstage/plugin-catalog-graph@0.2.28-next.2
+ - @backstage/plugin-catalog-import@0.9.6-next.2
+ - @backstage/plugin-circleci@0.3.16-next.2
+ - @backstage/plugin-cloudbuild@0.3.16-next.2
+ - @backstage/plugin-code-coverage@0.2.9-next.2
+ - @backstage/plugin-cost-insights@0.12.5-next.2
+ - @backstage/plugin-dynatrace@3.0.0-next.2
+ - @backstage/plugin-entity-feedback@0.1.1-next.2
+ - @backstage/plugin-gcalendar@0.3.12-next.2
+ - @backstage/plugin-gcp-projects@0.3.35-next.2
+ - @backstage/plugin-github-actions@0.5.16-next.2
+ - @backstage/plugin-gocd@0.1.22-next.2
+ - @backstage/plugin-graphiql@0.2.48-next.2
+ - @backstage/plugin-home@0.4.32-next.2
+ - @backstage/plugin-jenkins@0.7.15-next.2
+ - @backstage/plugin-kafka@0.3.16-next.2
+ - @backstage/plugin-lighthouse@0.4.1-next.2
+ - @backstage/plugin-linguist@0.1.1-next.2
+ - @backstage/plugin-microsoft-calendar@0.1.1-next.2
+ - @backstage/plugin-newrelic@0.3.34-next.2
+ - @backstage/plugin-newrelic-dashboard@0.2.9-next.2
+ - @backstage/plugin-pagerduty@0.5.9-next.2
+ - @backstage/plugin-playlist@0.1.7-next.2
+ - @backstage/plugin-rollbar@0.4.16-next.2
+ - @backstage/plugin-sentry@0.5.1-next.2
+ - @backstage/plugin-shortcuts@0.3.8-next.2
+ - @backstage/plugin-stack-overflow@0.1.12-next.2
+ - @backstage/plugin-stackstorm@0.1.0-next.2
+ - @backstage/plugin-tech-radar@0.6.2-next.2
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.2
+ - @backstage/plugin-todo@0.2.18-next.2
+ - @backstage/plugin-user-settings@0.7.1-next.2
+ - @internal/plugin-catalog-customized@0.0.8-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.81-next.1
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index b74a2c7a6e..c51f8be911 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app",
- "version": "0.2.81-next.1",
+ "version": "0.2.81-next.2",
"private": true,
"backstage": {
"role": "frontend"
diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md
index 4cbc4fa844..6ea78e983f 100644
--- a/packages/backend-app-api/CHANGELOG.md
+++ b/packages/backend-app-api/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/backend-app-api
+## 0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.4.1-next.1
### Patch Changes
diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json
index dd5a404118..f59e39ef09 100644
--- a/packages/backend-app-api/package.json
+++ b/packages/backend-app-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-app-api",
"description": "Core API used by Backstage backend apps",
- "version": "0.4.1-next.1",
+ "version": "0.4.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md
index a3dfe498e9..06968a3c8a 100644
--- a/packages/backend-common/CHANGELOG.md
+++ b/packages/backend-common/CHANGELOG.md
@@ -1,5 +1,33 @@
# @backstage/backend-common
+## 0.18.3-next.2
+
+### Patch Changes
+
+- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres
+
+ The example config below connects to the database as user `v-backstage-123` but sets the ownership of
+ the create schemas and tables to `backstage`
+
+ ```yaml
+ backend:
+ database:
+ client: pg
+ pluginDivisionMode: schema
+ role: backstage
+ connection:
+ user: v-backstage-123
+ ...
+ ```
+
+- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3
+- Updated dependencies
+ - @backstage/backend-app-api@0.4.1-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+ - @backstage/integration-aws-node@0.1.2-next.0
+
## 0.18.3-next.1
### Patch Changes
diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json
index 665b14e2dd..beee72c860 100644
--- a/packages/backend-common/package.json
+++ b/packages/backend-common/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
- "version": "0.18.3-next.1",
+ "version": "0.18.3-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
index dad12c7660..0bd4d2636f 100644
--- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
+++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
@@ -265,10 +265,8 @@ describe('AwsS3UrlReader', () => {
reader.readUrl(
'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml',
),
- ).rejects.toThrow(
- Error(
- `Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml`,
- ),
+ ).rejects.toMatchInlineSnapshot(
+ `[Error: Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml]`,
);
});
});
@@ -325,10 +323,8 @@ describe('AwsS3UrlReader', () => {
reader.readUrl!(
'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml',
),
- ).rejects.toThrow(
- Error(
- `Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml`,
- ),
+ ).rejects.toMatchInlineSnapshot(
+ `[Error: Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml]`,
);
});
});
diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md
index bbf760d6e2..7283ae89e2 100644
--- a/packages/backend-defaults/CHANGELOG.md
+++ b/packages/backend-defaults/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/backend-defaults
+## 0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-app-api@0.4.1-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
## 0.1.8-next.1
### Patch Changes
diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json
index 468bcfd4ce..2ae0074849 100644
--- a/packages/backend-defaults/package.json
+++ b/packages/backend-defaults/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-defaults",
"description": "Backend defaults used by Backstage backend apps",
- "version": "0.1.8-next.1",
+ "version": "0.1.8-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md
index fdce1b2096..91ded2391f 100644
--- a/packages/backend-next/CHANGELOG.md
+++ b/packages/backend-next/CHANGELOG.md
@@ -1,5 +1,16 @@
# example-backend-next
+## 0.0.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/backend-defaults@0.1.8-next.2
+ - @backstage/plugin-app-backend@0.3.43-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-todo-backend@0.1.40-next.2
+
## 0.0.9-next.1
### Patch Changes
diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json
index 1540803b3b..9f7ec8306a 100644
--- a/packages/backend-next/package.json
+++ b/packages/backend-next/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend-next",
- "version": "0.0.9-next.1",
+ "version": "0.0.9-next.2",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md
index 8319475840..5125411eb6 100644
--- a/packages/backend-plugin-api/CHANGELOG.md
+++ b/packages/backend-plugin-api/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/backend-plugin-api
+## 0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.4.1-next.1
### Patch Changes
diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json
index 856f2a70e2..4d97fdcd74 100644
--- a/packages/backend-plugin-api/package.json
+++ b/packages/backend-plugin-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-plugin-api",
"description": "Core API used by Backstage backend plugins",
- "version": "0.4.1-next.1",
+ "version": "0.4.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md
index acce10665a..7eb43c4677 100644
--- a/packages/backend-tasks/CHANGELOG.md
+++ b/packages/backend-tasks/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/backend-tasks
+## 0.5.0-next.2
+
+### Minor Changes
+
+- 1578276708a: add functionality to get descriptions from the scheduler for triggering
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.4.4-next.1
### Patch Changes
diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json
index 3f3c594cd4..fa826067c8 100644
--- a/packages/backend-tasks/package.json
+++ b/packages/backend-tasks/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
- "version": "0.4.4-next.1",
+ "version": "0.5.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-tasks/src/migrations.test.ts b/packages/backend-tasks/src/migrations.test.ts
index 4d37b9d39e..74503ab9a7 100644
--- a/packages/backend-tasks/src/migrations.test.ts
+++ b/packages/backend-tasks/src/migrations.test.ts
@@ -71,8 +71,11 @@ describe('migrations', () => {
await migrateDownOnce(knex);
- await expect(knex('backstage_backend_tasks__tasks')).rejects.toThrow(
- /backstage_backend_tasks__tasks/,
+ // This looks odd - you might expect a .toThrow at the end but that
+ // actually is flaky for some reason specifically on sqlite when
+ // performing multiple runs in sequence
+ await expect(knex('backstage_backend_tasks__tasks')).rejects.toEqual(
+ expect.anything(),
);
await knex.destroy();
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
index d1f383bf43..3b20fe92d5 100644
--- a/packages/backend-test-utils/CHANGELOG.md
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/backend-test-utils
+## 0.1.35-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-app-api@0.4.1-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.35-next.1
### Patch Changes
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index d5ace4b8f3..e797e346ff 100644
--- a/packages/backend-test-utils/package.json
+++ b/packages/backend-test-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
- "version": "0.1.35-next.1",
+ "version": "0.1.35-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 8430961cc5..933d9688b9 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,52 @@
# example-backend
+## 0.2.81-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/plugin-adr-backend@0.3.1-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-linguist-backend@0.2.0-next.2
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2
+ - example-app@0.2.81-next.2
+ - @backstage/plugin-techdocs-backend@1.5.4-next.2
+ - @backstage/plugin-auth-backend@0.18.1-next.2
+ - @backstage/plugin-entity-feedback-backend@0.1.1-next.2
+ - @backstage/plugin-jenkins-backend@0.1.33-next.2
+ - @backstage/plugin-kubernetes-backend@0.9.4-next.2
+ - @backstage/plugin-permission-backend@0.5.18-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/plugin-playlist-backend@0.2.6-next.2
+ - @backstage/plugin-search-backend@1.2.4-next.2
+ - @backstage/plugin-lighthouse-backend@0.1.1-next.2
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/plugin-tech-insights-backend@0.5.9-next.2
+ - @backstage/plugin-tech-insights-node@0.4.1-next.2
+ - @backstage/plugin-app-backend@0.3.43-next.2
+ - @backstage/plugin-azure-devops-backend@0.3.22-next.2
+ - @backstage/plugin-azure-sites-backend@0.1.5-next.2
+ - @backstage/plugin-badges-backend@0.1.37-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-code-coverage-backend@0.2.9-next.2
+ - @backstage/plugin-events-backend@0.2.4-next.2
+ - @backstage/plugin-explore-backend@0.0.5-next.2
+ - @backstage/plugin-graphql-backend@0.1.33-next.2
+ - @backstage/plugin-kafka-backend@0.2.36-next.2
+ - @backstage/plugin-proxy-backend@0.2.37-next.2
+ - @backstage/plugin-rollbar-backend@0.1.40-next.2
+ - @backstage/plugin-search-backend-module-pg@0.5.4-next.2
+ - @backstage/plugin-todo-backend@0.1.40-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.2.81-next.1
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 40b47bbc7b..107a1147f1 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.2.81-next.1",
+ "version": "0.2.81-next.2",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md
index 092a43cfe0..d91fa44f05 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,31 @@
# @backstage/core-app-api
+## 1.6.0-next.2
+
+### Minor Changes
+
+- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly
+ requested.
+
+ This should not be considered a breaking change, because spec-compliant OIDC
+ providers will already be returning ID tokens if and only if the `openid` scope
+ is granted.
+
+ This change makes the dependence explicit, and removes the burden on
+ OAuth2-based providers which require an ID token (e.g. this is done by various
+ default [auth
+ handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add
+ `openid` to their default scopes. _That_ could carry another indirect benefit:
+ by removing `openid` from the default scopes for a provider, grants for
+ resource-specific access tokens can avoid requesting excess ID token-related
+ scopes.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.5.1-next.1
### Patch Changes
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index d17e05fdea..073a5a22b2 100644
--- a/packages/core-app-api/package.json
+++ b/packages/core-app-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
- "version": "1.5.1-next.1",
+ "version": "1.6.0-next.2",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
index 0bb40c23fc..63070120ef 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts
@@ -48,9 +48,8 @@ describe('OAuth2', () => {
expect(await oauth2.getAccessToken('my-scope my-scope2')).toBe(
'access-token',
);
- expect(getSession).toHaveBeenCalledTimes(1);
- expect(getSession.mock.calls[0][0].scopes).toEqual(
- new Set(['my-scope', 'my-scope2']),
+ expect(getSession).toHaveBeenCalledWith(
+ expect.objectContaining({ scopes: new Set(['my-scope', 'my-scope2']) }),
);
});
@@ -65,9 +64,10 @@ describe('OAuth2', () => {
});
expect(await oauth2.getAccessToken('my-scope')).toBe('access-token');
- expect(getSession).toHaveBeenCalledTimes(1);
- expect(getSession.mock.calls[0][0].scopes).toEqual(
- new Set(['my-prefix/my-scope']),
+ expect(getSession).toHaveBeenCalledWith(
+ expect.objectContaining({
+ scopes: new Set(['my-prefix/my-scope']),
+ }),
);
});
@@ -82,7 +82,11 @@ describe('OAuth2', () => {
});
expect(await oauth2.getIdToken()).toBe('id-token');
- expect(getSession).toHaveBeenCalledTimes(1);
+ expect(getSession).toHaveBeenCalledWith(
+ expect.objectContaining({
+ scopes: new Set(['openid']),
+ }),
+ );
});
it('should get optional id token', async () => {
@@ -96,7 +100,11 @@ describe('OAuth2', () => {
});
expect(await oauth2.getIdToken({ optional: true })).toBe('id-token');
- expect(getSession).toHaveBeenCalledTimes(1);
+ expect(getSession).toHaveBeenCalledWith(
+ expect.objectContaining({
+ scopes: new Set(['openid']),
+ }),
+ );
});
it('should share popup closed errors', async () => {
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
index ad2d04cb56..6f88178415 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
@@ -153,7 +153,10 @@ export default class OAuth2
}
async getIdToken(options: AuthRequestOptions = {}) {
- const session = await this.sessionManager.getSession(options);
+ const session = await this.sessionManager.getSession({
+ ...options,
+ scopes: new Set(['openid']),
+ });
return session?.providerInfo.idToken ?? '';
}
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index 4dbeaea64c..0eac19716d 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/core-components
+## 0.12.5-next.2
+
+### Patch Changes
+
+- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations.
+ For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc.
+ This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar.
+- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.12.5-next.1
### Patch Changes
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index 47f882d2cc..9630d7d706 100644
--- a/packages/core-components/package.json
+++ b/packages/core-components/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
- "version": "0.12.5-next.1",
+ "version": "0.12.5-next.2",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md
index 278d8d6d02..1001c01e52 100644
--- a/packages/core-plugin-api/CHANGELOG.md
+++ b/packages/core-plugin-api/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/core-plugin-api
+## 1.5.0-next.2
+
+### Minor Changes
+
+- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7-next.0
+
## 1.4.1-next.1
### Patch Changes
diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md
index 4887f0b7f2..eabd300fc6 100644
--- a/packages/core-plugin-api/api-report.md
+++ b/packages/core-plugin-api/api-report.md
@@ -482,7 +482,11 @@ export const githubAuthApiRef: ApiRef<
// @public
export const gitlabAuthApiRef: ApiRef<
- OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi
+ OAuthApi &
+ OpenIdConnectApi &
+ ProfileInfoApi &
+ BackstageIdentityApi &
+ SessionApi
>;
// @public
diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json
index e765762a8a..335f0f0efd 100644
--- a/packages/core-plugin-api/package.json
+++ b/packages/core-plugin-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-plugin-api",
"description": "Core API used by Backstage plugins",
- "version": "1.4.1-next.1",
+ "version": "1.5.0-next.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core-plugin-api/src/apis/definitions/auth.ts b/packages/core-plugin-api/src/apis/definitions/auth.ts
index 43597639b6..62d0d5c810 100644
--- a/packages/core-plugin-api/src/apis/definitions/auth.ts
+++ b/packages/core-plugin-api/src/apis/definitions/auth.ts
@@ -357,7 +357,11 @@ export const oktaAuthApiRef: ApiRef<
* for a full list of supported scopes.
*/
export const gitlabAuthApiRef: ApiRef<
- OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi
+ OAuthApi &
+ OpenIdConnectApi &
+ ProfileInfoApi &
+ BackstageIdentityApi &
+ SessionApi
> = createApiRef({
id: 'core.auth.gitlab',
});
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index 3a9a28e3ac..b17da7ba7b 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/create-app
+## 0.4.38-next.2
+
+### Patch Changes
+
+- Bumped create-app version.
+
## 0.4.38-next.1
### Patch Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index ef569aee6b..4097e3bd57 100644
--- a/packages/create-app/package.json
+++ b/packages/create-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
- "version": "0.4.38-next.1",
+ "version": "0.4.38-next.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/create-app/templates/default-app/packages/app/.eslintignore b/packages/create-app/templates/default-app/packages/app/.eslintignore
new file mode 100644
index 0000000000..a48cf0de7a
--- /dev/null
+++ b/packages/create-app/templates/default-app/packages/app/.eslintignore
@@ -0,0 +1 @@
+public
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index abfd8997f3..85a0c81ee7 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/dev-utils
+## 1.0.13-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/app-defaults@1.2.1-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/test-utils@1.2.6-next.2
+
## 1.0.13-next.1
### Patch Changes
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index 119564ceae..d4f120b359 100644
--- a/packages/dev-utils/package.json
+++ b/packages/dev-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/dev-utils",
"description": "Utilities for developing Backstage plugins.",
- "version": "1.0.13-next.1",
+ "version": "1.0.13-next.2",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md
index 9829e00e7f..7c3dcdbc36 100644
--- a/packages/e2e-test/CHANGELOG.md
+++ b/packages/e2e-test/CHANGELOG.md
@@ -1,5 +1,12 @@
# e2e-test
+## 0.2.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.4.38-next.2
+
## 0.2.1-next.1
### Patch Changes
diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json
index ecc377c6e2..f8c6f815e8 100644
--- a/packages/e2e-test/package.json
+++ b/packages/e2e-test/package.json
@@ -1,7 +1,7 @@
{
"name": "e2e-test",
"description": "E2E test for verifying Backstage packages",
- "version": "0.2.1-next.1",
+ "version": "0.2.1-next.2",
"private": true,
"backstage": {
"role": "cli"
diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md
index b1d72eec52..028c939822 100644
--- a/packages/integration-react/CHANGELOG.md
+++ b/packages/integration-react/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/integration-react
+## 1.1.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 1.1.11-next.1
### Patch Changes
diff --git a/packages/integration-react/api-report.md b/packages/integration-react/api-report.md
index 5b0c9d6174..3af0704990 100644
--- a/packages/integration-react/api-report.md
+++ b/packages/integration-react/api-report.md
@@ -23,7 +23,11 @@ export class ScmAuth implements ScmAuthApi {
ScmAuthApi,
{
github: OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi;
- gitlab: OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi;
+ gitlab: OAuthApi &
+ OpenIdConnectApi &
+ ProfileInfoApi &
+ BackstageIdentityApi &
+ SessionApi;
azure: OAuthApi &
OpenIdConnectApi &
ProfileInfoApi &
diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json
index 62e3234439..119a8683d6 100644
--- a/packages/integration-react/package.json
+++ b/packages/integration-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration-react",
"description": "Frontend package for managing integrations towards external systems",
- "version": "1.1.11-next.1",
+ "version": "1.1.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md
index a350735be4..2d2b669e38 100644
--- a/packages/techdocs-cli-embedded-app/CHANGELOG.md
+++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md
@@ -1,5 +1,22 @@
# techdocs-cli-embedded-app
+## 0.2.80-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-techdocs@1.6.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/app-defaults@1.2.1-next.2
+ - @backstage/cli@0.22.4-next.1
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/test-utils@1.2.6-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.80-next.1
### Patch Changes
diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json
index cc5d64e234..2cbb1aabc8 100644
--- a/packages/techdocs-cli-embedded-app/package.json
+++ b/packages/techdocs-cli-embedded-app/package.json
@@ -1,6 +1,6 @@
{
"name": "techdocs-cli-embedded-app",
- "version": "0.2.80-next.1",
+ "version": "0.2.80-next.2",
"private": true,
"backstage": {
"role": "frontend"
diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md
index bddbd4a2d0..facd967e90 100644
--- a/packages/techdocs-cli/CHANGELOG.md
+++ b/packages/techdocs-cli/CHANGELOG.md
@@ -1,5 +1,14 @@
# @techdocs/cli
+## 1.4.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.6.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.4.0-next.1
### Minor Changes
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 169ef04a47..e8d9277871 100644
--- a/packages/techdocs-cli/package.json
+++ b/packages/techdocs-cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@techdocs/cli",
"description": "Utility CLI for managing TechDocs sites in Backstage.",
- "version": "1.4.0-next.1",
+ "version": "1.4.0-next.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md
index c5a30b5629..e521e9af91 100644
--- a/packages/test-utils/CHANGELOG.md
+++ b/packages/test-utils/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/test-utils
+## 1.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.2.6-next.1
### Patch Changes
diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json
index e43ca2a8b3..59ec2ce989 100644
--- a/packages/test-utils/package.json
+++ b/packages/test-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/test-utils",
"description": "Utilities to test Backstage plugins and apps.",
- "version": "1.2.6-next.1",
+ "version": "1.2.6-next.2",
"publishConfig": {
"access": "public"
},
diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md
index 6b96383f68..58b37f1731 100644
--- a/plugins/adr-backend/CHANGELOG.md
+++ b/plugins/adr-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-adr-backend
+## 0.3.1-next.2
+
+### Patch Changes
+
+- 2a73ded3861: Support MADR v3 format
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.3.1-next.1
### Patch Changes
diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json
index 452a58f4e5..f73bf159b0 100644
--- a/plugins/adr-backend/package.json
+++ b/plugins/adr-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
- "version": "0.3.1-next.1",
+ "version": "0.3.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md
index 13e8ad37a2..a50f1a60d3 100644
--- a/plugins/adr/CHANGELOG.md
+++ b/plugins/adr/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-adr
+## 0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+
## 0.4.1-next.1
### Patch Changes
diff --git a/plugins/adr/package.json b/plugins/adr/package.json
index 0456e3961a..5e56c39638 100644
--- a/plugins/adr/package.json
+++ b/plugins/adr/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
- "version": "0.4.1-next.1",
+ "version": "0.4.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md
index a88cf895d0..bcbd88a755 100644
--- a/plugins/airbrake-backend/CHANGELOG.md
+++ b/plugins/airbrake-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-airbrake-backend
+## 0.2.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.16-next.1
### Patch Changes
diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json
index 0e5b160a86..52bd89e909 100644
--- a/plugins/airbrake-backend/package.json
+++ b/plugins/airbrake-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake-backend",
- "version": "0.2.16-next.1",
+ "version": "0.2.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md
index 406564d8cf..088bfbdcf9 100644
--- a/plugins/airbrake/CHANGELOG.md
+++ b/plugins/airbrake/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-airbrake
+## 0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/dev-utils@1.0.13-next.2
+ - @backstage/test-utils@1.2.6-next.2
+
## 0.3.16-next.1
### Patch Changes
diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json
index 4c31a2b5e7..e577ee8862 100644
--- a/plugins/airbrake/package.json
+++ b/plugins/airbrake/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake",
- "version": "0.3.16-next.1",
+ "version": "0.3.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md
index 48ce2bd75c..efde01c0b5 100644
--- a/plugins/allure/CHANGELOG.md
+++ b/plugins/allure/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-allure
+## 0.1.32-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.32-next.1
### Patch Changes
diff --git a/plugins/allure/package.json b/plugins/allure/package.json
index f6dcdda941..18bf52feab 100644
--- a/plugins/allure/package.json
+++ b/plugins/allure/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-allure",
"description": "A Backstage plugin that integrates with Allure",
- "version": "0.1.32-next.1",
+ "version": "0.1.32-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md
index c65f20cedd..e457b76bf8 100644
--- a/plugins/analytics-module-ga/CHANGELOG.md
+++ b/plugins/analytics-module-ga/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-analytics-module-ga
+## 0.1.27-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.27-next.1
### Patch Changes
diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json
index 722c34895e..b7152b1f69 100644
--- a/plugins/analytics-module-ga/package.json
+++ b/plugins/analytics-module-ga/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-analytics-module-ga",
- "version": "0.1.27-next.1",
+ "version": "0.1.27-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md
index 8fec434e37..acc474e6e3 100644
--- a/plugins/apache-airflow/CHANGELOG.md
+++ b/plugins/apache-airflow/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-apache-airflow
+## 0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.9-next.1
### Patch Changes
diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json
index 87889f6c86..070cbc4136 100644
--- a/plugins/apache-airflow/package.json
+++ b/plugins/apache-airflow/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-apache-airflow",
- "version": "0.2.9-next.1",
+ "version": "0.2.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md
index 3966fa5ee8..56644c2322 100644
--- a/plugins/api-docs/CHANGELOG.md
+++ b/plugins/api-docs/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-api-docs
+## 0.9.1-next.2
+
+### Patch Changes
+
+- 8bc7dcec820: Fix dark theme Swagger's clear button font color.
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.9.1-next.1
### Patch Changes
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index a3d14e7fa2..d7db6566f9 100644
--- a/plugins/api-docs/package.json
+++ b/plugins/api-docs/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-api-docs",
"description": "A Backstage plugin that helps represent API entities in the frontend",
- "version": "0.9.1-next.1",
+ "version": "0.9.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md
index 57b6934d5b..8e48be2ab8 100644
--- a/plugins/apollo-explorer/CHANGELOG.md
+++ b/plugins/apollo-explorer/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-apollo-explorer
+## 0.1.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.9-next.1
### Patch Changes
diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json
index 2aab81c0d3..0fcc315797 100644
--- a/plugins/apollo-explorer/package.json
+++ b/plugins/apollo-explorer/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-apollo-explorer",
- "version": "0.1.9-next.1",
+ "version": "0.1.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md
index 784c2d23c4..79c8276eeb 100644
--- a/plugins/app-backend/CHANGELOG.md
+++ b/plugins/app-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-app-backend
+## 0.3.43-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.3.43-next.1
### Patch Changes
diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json
index 43152faca1..77804372d1 100644
--- a/plugins/app-backend/package.json
+++ b/plugins/app-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-app-backend",
"description": "A Backstage backend plugin that serves the Backstage frontend app",
- "version": "0.3.43-next.1",
+ "version": "0.3.43-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md
index 97124b3a3e..a22b2e40ee 100644
--- a/plugins/auth-backend/CHANGELOG.md
+++ b/plugins/auth-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-backend
+## 0.18.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.18.1-next.1
### Patch Changes
diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json
index f399028594..bcc62814ed 100644
--- a/plugins/auth-backend/package.json
+++ b/plugins/auth-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend",
"description": "A Backstage backend plugin that handles authentication",
- "version": "0.18.1-next.1",
+ "version": "0.18.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md
index 71e17743b4..0e7bcefae2 100644
--- a/plugins/auth-node/CHANGELOG.md
+++ b/plugins/auth-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-node
+## 0.2.12-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.12-next.1
### Patch Changes
diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json
index ffecaf44ba..093b23add9 100644
--- a/plugins/auth-node/package.json
+++ b/plugins/auth-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-node",
- "version": "0.2.12-next.1",
+ "version": "0.2.12-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md
index bc92e8cdd4..a4a7492ffc 100644
--- a/plugins/azure-devops-backend/CHANGELOG.md
+++ b/plugins/azure-devops-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-azure-devops-backend
+## 0.3.22-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.3.22-next.1
### Patch Changes
diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json
index dd46929944..1d921a468a 100644
--- a/plugins/azure-devops-backend/package.json
+++ b/plugins/azure-devops-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops-backend",
- "version": "0.3.22-next.1",
+ "version": "0.3.22-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md
index 3d82d3a0dd..b9fcc646b7 100644
--- a/plugins/azure-devops/CHANGELOG.md
+++ b/plugins/azure-devops/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-devops
+## 0.2.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.7-next.1
### Patch Changes
diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json
index bec734c09b..f8bc46f422 100644
--- a/plugins/azure-devops/package.json
+++ b/plugins/azure-devops/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops",
- "version": "0.2.7-next.1",
+ "version": "0.2.7-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md
index 439163b00d..9bc9b99388 100644
--- a/plugins/azure-sites-backend/CHANGELOG.md
+++ b/plugins/azure-sites-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-azure-sites-backend
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json
index e4a739d730..3cb7023933 100644
--- a/plugins/azure-sites-backend/package.json
+++ b/plugins/azure-sites-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-sites-backend",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md
index 2bb6cfba96..1de9e7a804 100644
--- a/plugins/azure-sites/CHANGELOG.md
+++ b/plugins/azure-sites/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-sites
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json
index 4c17e880ea..6daadf199a 100644
--- a/plugins/azure-sites/package.json
+++ b/plugins/azure-sites/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-sites",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md
index b2e06a5a0e..837e71bcce 100644
--- a/plugins/badges-backend/CHANGELOG.md
+++ b/plugins/badges-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-badges-backend
+## 0.1.37-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.37-next.1
### Patch Changes
diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json
index 73d4930130..f570a47874 100644
--- a/plugins/badges-backend/package.json
+++ b/plugins/badges-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges-backend",
"description": "A Backstage backend plugin that generates README badges for your entities",
- "version": "0.1.37-next.1",
+ "version": "0.1.37-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md
index 0d4f78a5ba..567c3e81d6 100644
--- a/plugins/badges/CHANGELOG.md
+++ b/plugins/badges/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-badges
+## 0.2.40-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.40-next.1
### Patch Changes
diff --git a/plugins/badges/package.json b/plugins/badges/package.json
index ebed209962..7e817c024d 100644
--- a/plugins/badges/package.json
+++ b/plugins/badges/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges",
"description": "A Backstage plugin that generates README badges for your entities",
- "version": "0.2.40-next.1",
+ "version": "0.2.40-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md
index 4e579285b0..203c1ef67f 100644
--- a/plugins/bazaar-backend/CHANGELOG.md
+++ b/plugins/bazaar-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-bazaar-backend
+## 0.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.6-next.1
### Patch Changes
diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json
index bac1f58a41..c9221e5c69 100644
--- a/plugins/bazaar-backend/package.json
+++ b/plugins/bazaar-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar-backend",
- "version": "0.2.6-next.1",
+ "version": "0.2.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md
index d13b98ef23..57ba471000 100644
--- a/plugins/bazaar/CHANGELOG.md
+++ b/plugins/bazaar/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-bazaar
+## 0.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/cli@0.22.4-next.1
+
## 0.2.6-next.1
### Patch Changes
diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json
index d1a3b435cb..6a2311004b 100644
--- a/plugins/bazaar/package.json
+++ b/plugins/bazaar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar",
- "version": "0.2.6-next.1",
+ "version": "0.2.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md
index 856f77b655..1a9d86268d 100644
--- a/plugins/bitrise/CHANGELOG.md
+++ b/plugins/bitrise/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-bitrise
+## 0.1.43-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.43-next.1
### Patch Changes
diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json
index ab34c9ef88..41cb8562b5 100644
--- a/plugins/bitrise/package.json
+++ b/plugins/bitrise/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-bitrise",
"description": "A Backstage plugin that integrates towards Bitrise",
- "version": "0.1.43-next.1",
+ "version": "0.1.43-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md
index 76cd99d3c1..f4e268aae7 100644
--- a/plugins/catalog-backend-module-aws/CHANGELOG.md
+++ b/plugins/catalog-backend-module-aws/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend-module-aws
+## 0.1.17-next.2
+
+### Patch Changes
+
+- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.17-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-aws/alpha-api-report.md b/plugins/catalog-backend-module-aws/alpha-api-report.md
index 8781975085..f78f6a802d 100644
--- a/plugins/catalog-backend-module-aws/alpha-api-report.md
+++ b/plugins/catalog-backend-module-aws/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const awsS3EntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleAwsS3EntityProvider: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/catalog-backend-module-aws/api-report.md b/plugins/catalog-backend-module-aws/api-report.md
index 5086ec1ea7..491dbf497e 100644
--- a/plugins/catalog-backend-module-aws/api-report.md
+++ b/plugins/catalog-backend-module-aws/api-report.md
@@ -3,13 +3,13 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
-import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorParser } from '@backstage/plugin-catalog-backend';
+import { CatalogProcessor } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorParser } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
import { Credentials } from 'aws-sdk';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import { Logger } from 'winston';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json
index 18b210ae67..79271cf4de 100644
--- a/plugins/catalog-backend-module-aws/package.json
+++ b/plugins/catalog-backend-module-aws/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-aws",
"description": "A Backstage catalog backend module that helps integrate towards AWS",
- "version": "0.1.17-next.1",
+ "version": "0.1.17-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -53,7 +53,6 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-catalog-common": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@backstage/plugin-kubernetes-common": "workspace:^",
diff --git a/plugins/catalog-backend-module-aws/src/alpha.ts b/plugins/catalog-backend-module-aws/src/alpha.ts
index 3ae30df0cb..c277a0a680 100644
--- a/plugins/catalog-backend-module-aws/src/alpha.ts
+++ b/plugins/catalog-backend-module-aws/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { awsS3EntityProviderCatalogModule } from './service/AwsS3EntityProviderCatalogModule';
+export * from './module';
diff --git a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts
similarity index 92%
rename from plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts
index 868a9535b4..1475da9e79 100644
--- a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts
@@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
-import { awsS3EntityProviderCatalogModule } from './AwsS3EntityProviderCatalogModule';
+import { catalogModuleAwsS3EntityProvider } from './catalogModuleAwsS3EntityProvider';
import { AwsS3EntityProvider } from '../providers';
-describe('awsS3EntityProviderCatalogModule', () => {
+describe('catalogModuleAwsS3EntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let usedSchedule: TaskScheduleDefinition | undefined;
@@ -66,7 +66,7 @@ describe('awsS3EntityProviderCatalogModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [awsS3EntityProviderCatalogModule()],
+ features: [catalogModuleAwsS3EntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
diff --git a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.ts b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts
similarity index 96%
rename from plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts
index 5d4170ec1c..452284e526 100644
--- a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts
@@ -27,7 +27,7 @@ import { AwsS3EntityProvider } from '../providers';
*
* @alpha
*/
-export const awsS3EntityProviderCatalogModule = createBackendModule({
+export const catalogModuleAwsS3EntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'awsS3EntityProvider',
register(env) {
diff --git a/plugins/catalog-backend-module-aws/src/module/index.ts b/plugins/catalog-backend-module-aws/src/module/index.ts
new file mode 100644
index 0000000000..5644c034ea
--- /dev/null
+++ b/plugins/catalog-backend-module-aws/src/module/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModuleAwsS3EntityProvider } from './catalogModuleAwsS3EntityProvider';
diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts b/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts
index b6418ade03..05c85c7426 100644
--- a/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts
+++ b/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts
@@ -17,7 +17,7 @@
import {
CatalogProcessor,
CatalogProcessorEmit,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import {
ANNOTATION_KUBERNETES_API_SERVER,
diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts b/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts
index ecc42e69ea..c0ba1e3e98 100644
--- a/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts
+++ b/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts
@@ -20,7 +20,7 @@ import {
CatalogProcessor,
CatalogProcessorEmit,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import AWS, { Credentials, Organizations } from 'aws-sdk';
import { Account, ListAccountsResponse } from 'aws-sdk/clients/organizations';
diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts
index ef540da7f5..7818b21bd1 100644
--- a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts
+++ b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts
@@ -21,7 +21,7 @@ import {
CatalogProcessorEntityResult,
CatalogProcessorResult,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import {
S3Client,
ListObjectsV2Command,
diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts
index 072c3d8384..d6722d046e 100644
--- a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts
+++ b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts
@@ -21,7 +21,7 @@ import {
CatalogProcessorEmit,
CatalogProcessorParser,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import limiterFactory from 'p-limit';
diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts
index 134a3c6338..821fb6d4f4 100644
--- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts
+++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts
@@ -21,7 +21,7 @@ import {
TaskRunner,
} from '@backstage/backend-tasks';
import { ConfigReader } from '@backstage/config';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { AwsS3EntityProvider } from './AwsS3EntityProvider';
import aws from 'aws-sdk';
import AWSMock from 'aws-sdk-mock';
diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts
index 5e24d4dc13..8212f9279a 100644
--- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts
+++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts
@@ -21,7 +21,7 @@ import {
EntityProvider,
EntityProviderConnection,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import { AwsCredentials } from '../credentials/AwsCredentials';
import { readAwsS3Configs } from './config';
diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md
index 1dd3f48c2d..86566d383f 100644
--- a/plugins/catalog-backend-module-azure/CHANGELOG.md
+++ b/plugins/catalog-backend-module-azure/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-catalog-backend-module-azure
+## 0.1.14-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.14-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-azure/alpha-api-report.md b/plugins/catalog-backend-module-azure/alpha-api-report.md
index 486aac7775..66551a2856 100644
--- a/plugins/catalog-backend-module-azure/alpha-api-report.md
+++ b/plugins/catalog-backend-module-azure/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const azureDevOpsEntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleAzureDevOpsEntityProvider: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/catalog-backend-module-azure/api-report.md b/plugins/catalog-backend-module-azure/api-report.md
index 8fb7edeb53..a1b9d706a9 100644
--- a/plugins/catalog-backend-module-azure/api-report.md
+++ b/plugins/catalog-backend-module-azure/api-report.md
@@ -3,12 +3,12 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
-import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
+import { CatalogProcessor } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { ScmIntegrationRegistry } from '@backstage/integration';
diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json
index c9a8d4b921..afe85243db 100644
--- a/plugins/catalog-backend-module-azure/package.json
+++ b/plugins/catalog-backend-module-azure/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-azure",
"description": "A Backstage catalog backend module that helps integrate towards Azure",
- "version": "0.1.14-next.1",
+ "version": "0.1.14-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -52,7 +52,6 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@backstage/types": "workspace:^",
"lodash": "^4.17.21",
diff --git a/plugins/catalog-backend-module-azure/src/alpha.ts b/plugins/catalog-backend-module-azure/src/alpha.ts
index cc3c4a83af..c277a0a680 100644
--- a/plugins/catalog-backend-module-azure/src/alpha.ts
+++ b/plugins/catalog-backend-module-azure/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { azureDevOpsEntityProviderCatalogModule } from './service/AzureDevOpsEntityProviderCatalogModule';
+export * from './module';
diff --git a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts
similarity index 92%
rename from plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts
index a8e526e871..fa3b3d865e 100644
--- a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts
@@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
-import { azureDevOpsEntityProviderCatalogModule } from './AzureDevOpsEntityProviderCatalogModule';
+import { catalogModuleAzureDevOpsEntityProvider } from './catalogModuleAzureDevOpsEntityProvider';
import { AzureDevOpsEntityProvider } from '../providers';
-describe('azureDevOpsEntityProviderCatalogModule', () => {
+describe('catalogModuleAzureDevOpsEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let usedSchedule: TaskScheduleDefinition | undefined;
@@ -69,7 +69,7 @@ describe('azureDevOpsEntityProviderCatalogModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [azureDevOpsEntityProviderCatalogModule()],
+ features: [catalogModuleAzureDevOpsEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
diff --git a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts
similarity index 96%
rename from plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts
index 3fc1ddf3a4..ec8b6441ba 100644
--- a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts
@@ -27,7 +27,7 @@ import { AzureDevOpsEntityProvider } from '../providers';
*
* @alpha
*/
-export const azureDevOpsEntityProviderCatalogModule = createBackendModule({
+export const catalogModuleAzureDevOpsEntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'azureDevOpsEntityProvider',
register(env) {
diff --git a/plugins/catalog-backend-module-azure/src/module/index.ts b/plugins/catalog-backend-module-azure/src/module/index.ts
new file mode 100644
index 0000000000..cfa8c78548
--- /dev/null
+++ b/plugins/catalog-backend-module-azure/src/module/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModuleAzureDevOpsEntityProvider } from './catalogModuleAzureDevOpsEntityProvider';
diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts
index 38df737179..0a1ec1e3cf 100644
--- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts
+++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts
@@ -16,7 +16,7 @@
import { getVoidLogger } from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import {
AzureDevOpsDiscoveryProcessor,
parseUrl,
diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts
index 8893d5d42d..fde59046ef 100644
--- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts
+++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts
@@ -24,7 +24,7 @@ import {
CatalogProcessorEmit,
LocationSpec,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { codeSearch } from '../lib';
diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
index dff1164899..23a668d60b 100644
--- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts
@@ -21,7 +21,7 @@ import {
TaskRunner,
} from '@backstage/backend-tasks';
import { ConfigReader } from '@backstage/config';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { CodeSearchResultItem } from '../lib';
import { AzureDevOpsEntityProvider } from './AzureDevOpsEntityProvider';
import { codeSearch } from '../lib';
diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts
index 788b9c2f05..89572286a1 100644
--- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts
+++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts
@@ -22,7 +22,7 @@ import {
EntityProviderConnection,
LocationSpec,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { readAzureDevOpsConfigs } from './config';
import { Logger } from 'winston';
import { AzureDevOpsConfig } from './types';
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
index 6992b44c87..b1de810710 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend-module-bitbucket-cloud
+## 0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md b/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md
index 77b4b77410..a5d0ffc665 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md
+++ b/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha (undocumented)
-export const bitbucketCloudEntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleBitbucketCloudEntityProvider: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/api-report.md b/plugins/catalog-backend-module-bitbucket-cloud/api-report.md
index 456ea62dd3..22eeddea3a 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/api-report.md
+++ b/plugins/catalog-backend-module-bitbucket-cloud/api-report.md
@@ -5,8 +5,8 @@
```ts
import { CatalogApi } from '@backstage/catalog-client';
import { Config } from '@backstage/config';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { EventParams } from '@backstage/plugin-events-node';
import { Events } from '@backstage/plugin-bitbucket-cloud-common';
import { EventSubscriber } from '@backstage/plugin-events-node';
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json
index 96922c7a8c..8ed58f0333 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/package.json
+++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud",
"description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud",
- "version": "0.1.10-next.1",
+ "version": "0.1.10-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -53,7 +53,6 @@
"@backstage/config": "workspace:^",
"@backstage/integration": "workspace:^",
"@backstage/plugin-bitbucket-cloud-common": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-catalog-common": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts
index e949dcb894..c277a0a680 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { bitbucketCloudEntityProviderCatalogModule } from './service/BitbucketCloudEntityProviderCatalogModule';
+export * from './module';
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts
index 1c15ad4e8f..d730d8618d 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts
@@ -20,4 +20,4 @@
* @packageDocumentation
*/
-export { BitbucketCloudEntityProvider } from './BitbucketCloudEntityProvider';
+export { BitbucketCloudEntityProvider } from './providers/BitbucketCloudEntityProvider';
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts
similarity index 90%
rename from plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts
index 630c18b134..a34eae3750 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts
@@ -23,10 +23,10 @@ import { startTestBackend, mockServices } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import { Duration } from 'luxon';
-import { bitbucketCloudEntityProviderCatalogModule } from './BitbucketCloudEntityProviderCatalogModule';
-import { BitbucketCloudEntityProvider } from '../BitbucketCloudEntityProvider';
+import { catalogModuleBitbucketCloudEntityProvider } from './catalogModuleBitbucketCloudEntityProvider';
+import { BitbucketCloudEntityProvider } from '../providers/BitbucketCloudEntityProvider';
-describe('bitbucketCloudEntityProviderCatalogModule', () => {
+describe('catalogModuleBitbucketCloudEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let addedSubscribers: Array | undefined;
@@ -73,7 +73,7 @@ describe('bitbucketCloudEntityProviderCatalogModule', () => {
}),
[coreServices.scheduler, scheduler],
],
- features: [bitbucketCloudEntityProviderCatalogModule()],
+ features: [catalogModuleBitbucketCloudEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts
similarity index 93%
rename from plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts
index a95d99ceef..7c4f4a30b2 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts
@@ -24,12 +24,12 @@ import {
catalogServiceRef,
} from '@backstage/plugin-catalog-node/alpha';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
-import { BitbucketCloudEntityProvider } from '../BitbucketCloudEntityProvider';
+import { BitbucketCloudEntityProvider } from '../providers/BitbucketCloudEntityProvider';
/**
* @alpha
*/
-export const bitbucketCloudEntityProviderCatalogModule = createBackendModule({
+export const catalogModuleBitbucketCloudEntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'bitbucketCloudEntityProvider',
register(env) {
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts
new file mode 100644
index 0000000000..f9654971be
--- /dev/null
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModuleBitbucketCloudEntityProvider } from './catalogModuleBitbucketCloudEntityProvider';
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts
similarity index 99%
rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts
rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts
index 367e95b99b..727b7fd40c 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts
@@ -27,7 +27,7 @@ import { ConfigReader } from '@backstage/config';
import {
EntityProviderConnection,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Events } from '@backstage/plugin-bitbucket-cloud-common';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts
similarity index 99%
rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts
rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts
index a139bd7d8d..11c872cf7b 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts
@@ -33,7 +33,7 @@ import {
EntityProvider,
EntityProviderConnection,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import { EventParams, EventSubscriber } from '@backstage/plugin-events-node';
import {
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts
similarity index 100%
rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.test.ts
rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts
similarity index 100%
rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.ts
rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts
diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
index 3dbe16771d..00341a3870 100644
--- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-catalog-backend-module-bitbucket-server
+## 0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.8-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md b/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md
index 3177828f51..2cc53a3c16 100644
--- a/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md
+++ b/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha (undocumented)
-export const bitbucketServerEntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleBitbucketServerEntityProvider: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/catalog-backend-module-bitbucket-server/api-report.md b/plugins/catalog-backend-module-bitbucket-server/api-report.md
index 6c840883af..467294f3b0 100644
--- a/plugins/catalog-backend-module-bitbucket-server/api-report.md
+++ b/plugins/catalog-backend-module-bitbucket-server/api-report.md
@@ -6,9 +6,9 @@
import { BitbucketServerIntegrationConfig } from '@backstage/integration';
import { Config } from '@backstage/config';
import { Entity } from '@backstage/catalog-model';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { Response as Response_2 } from 'node-fetch';
diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json
index 3c58377976..433d4bc907 100644
--- a/plugins/catalog-backend-module-bitbucket-server/package.json
+++ b/plugins/catalog-backend-module-bitbucket-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-server",
- "version": "0.1.8-next.1",
+ "version": "0.1.8-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -51,7 +51,6 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@types/node-fetch": "^2.5.12",
"node-fetch": "^2.6.7",
diff --git a/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts b/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts
index d6227c29f1..c277a0a680 100644
--- a/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts
+++ b/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { bitbucketServerEntityProviderCatalogModule } from './service/BitbucketServerEntityProviderCatalogModule';
+export * from './module';
diff --git a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts
similarity index 92%
rename from plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts
index bdd7209364..d17b4a4c96 100644
--- a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts
@@ -23,11 +23,11 @@ import {
} from '@backstage/backend-tasks';
import { startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
-import { bitbucketServerEntityProviderCatalogModule } from './BitbucketServerEntityProviderCatalogModule';
+import { catalogModuleBitbucketServerEntityProvider } from './catalogModuleBitbucketServerEntityProvider';
import { Duration } from 'luxon';
import { BitbucketServerEntityProvider } from '../providers';
-describe('bitbucketServerEntityProviderCatalogModule', () => {
+describe('catalogModuleBitbucketServerEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let usedSchedule: TaskScheduleDefinition | undefined;
@@ -73,7 +73,7 @@ describe('bitbucketServerEntityProviderCatalogModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [bitbucketServerEntityProviderCatalogModule()],
+ features: [catalogModuleBitbucketServerEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
diff --git a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts
similarity index 96%
rename from plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts
index deab47c9e9..354bce7d6d 100644
--- a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts
@@ -25,7 +25,7 @@ import { BitbucketServerEntityProvider } from '../providers';
/**
* @alpha
*/
-export const bitbucketServerEntityProviderCatalogModule = createBackendModule({
+export const catalogModuleBitbucketServerEntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'bitbucketServerEntityProvider',
register(env) {
diff --git a/plugins/catalog-backend-module-bitbucket-server/src/module/index.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/index.ts
new file mode 100644
index 0000000000..160f099ae0
--- /dev/null
+++ b/plugins/catalog-backend-module-bitbucket-server/src/module/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModuleBitbucketServerEntityProvider } from './catalogModuleBitbucketServerEntityProvider';
diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts
index 20299e3452..bc3fa2ae23 100644
--- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts
@@ -22,7 +22,7 @@ import {
} from '@backstage/backend-tasks';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { BitbucketServerEntityProvider } from './BitbucketServerEntityProvider';
diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts
index 2ecdd79019..fd2b3e3959 100644
--- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts
+++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts
@@ -25,7 +25,7 @@ import {
import {
EntityProvider,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import * as uuid from 'uuid';
import { BitbucketServerClient, paginated } from '../lib';
diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts
index 7f6dae8872..e5d48f92b8 100644
--- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts
+++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts
@@ -17,7 +17,7 @@
import {
LocationSpec,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Entity } from '@backstage/catalog-model';
import { Logger } from 'winston';
import { BitbucketServerClient } from '../lib';
diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md
index 3ede5969ae..eef6da4c0e 100644
--- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-catalog-backend-module-bitbucket
+## 0.2.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.2.10-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket/api-report.md b/plugins/catalog-backend-module-bitbucket/api-report.md
index 053c6040a4..30b2a89826 100644
--- a/plugins/catalog-backend-module-bitbucket/api-report.md
+++ b/plugins/catalog-backend-module-bitbucket/api-report.md
@@ -4,11 +4,11 @@
```ts
import { BitbucketIntegration } from '@backstage/integration';
-import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorResult } from '@backstage/plugin-catalog-backend';
+import { CatalogProcessor } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorResult } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { ScmIntegrationRegistry } from '@backstage/integration';
diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json
index 39b5399e21..79fbbe08c4 100644
--- a/plugins/catalog-backend-module-bitbucket/package.json
+++ b/plugins/catalog-backend-module-bitbucket/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket",
"description": "A Backstage catalog backend module that helps integrate towards Bitbucket",
- "version": "0.2.10-next.1",
+ "version": "0.2.10-next.2",
"deprecated": true,
"main": "src/index.ts",
"types": "src/index.ts",
@@ -39,7 +39,7 @@
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
"@backstage/plugin-bitbucket-cloud-common": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
+ "@backstage/plugin-catalog-node": "workspace:^",
"@backstage/types": "workspace:^",
"lodash": "^4.17.21",
"node-fetch": "^2.6.7",
diff --git a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts
index f7a56ebc8f..262fb4e6c4 100644
--- a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts
+++ b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts
@@ -18,10 +18,7 @@ import { getVoidLogger } from '@backstage/backend-common';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { Models } from '@backstage/plugin-bitbucket-cloud-common';
-import {
- LocationSpec,
- processingResult,
-} from '@backstage/plugin-catalog-backend';
+import { LocationSpec, processingResult } from '@backstage/plugin-catalog-node';
import { RequestHandler, rest } from 'msw';
import { setupServer } from 'msw/node';
import { BitbucketDiscoveryProcessor } from './BitbucketDiscoveryProcessor';
diff --git a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts
index 78aa3eacfd..3f25d6ed7b 100644
--- a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts
+++ b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts
@@ -28,7 +28,7 @@ import {
CatalogProcessor,
CatalogProcessorEmit,
LocationSpec,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import {
BitbucketRepository,
diff --git a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts
index 41f467ebaa..478ccd7c52 100644
--- a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts
+++ b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { processingResult } from '@backstage/plugin-catalog-backend';
+import { processingResult } from '@backstage/plugin-catalog-node';
import { defaultRepositoryParser } from './BitbucketRepositoryParser';
describe('BitbucketRepositoryParser', () => {
diff --git a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts
index 97225e2579..aa973f87c2 100644
--- a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts
+++ b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts
@@ -18,7 +18,7 @@ import { BitbucketIntegration } from '@backstage/integration';
import {
CatalogProcessorResult,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
/**
diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md
index 7cd5eb2bb5..07ab61c8c4 100644
--- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-catalog-backend-module-gerrit
+## 0.1.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.11-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-gerrit/alpha-api-report.md b/plugins/catalog-backend-module-gerrit/alpha-api-report.md
index 03f5d099b9..5aee61f28a 100644
--- a/plugins/catalog-backend-module-gerrit/alpha-api-report.md
+++ b/plugins/catalog-backend-module-gerrit/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha (undocumented)
-export const gerritEntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleGerritEntityProvider: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/catalog-backend-module-gerrit/api-report.md b/plugins/catalog-backend-module-gerrit/api-report.md
index 1dee786da1..f64e697555 100644
--- a/plugins/catalog-backend-module-gerrit/api-report.md
+++ b/plugins/catalog-backend-module-gerrit/api-report.md
@@ -4,8 +4,8 @@
```ts
import { Config } from '@backstage/config';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { TaskRunner } from '@backstage/backend-tasks';
diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json
index 357b5416bf..af9727cbf9 100644
--- a/plugins/catalog-backend-module-gerrit/package.json
+++ b/plugins/catalog-backend-module-gerrit/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-gerrit",
- "version": "0.1.11-next.1",
+ "version": "0.1.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -48,7 +48,6 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"fs-extra": "10.1.0",
"node-fetch": "^2.6.7",
diff --git a/plugins/catalog-backend-module-gerrit/src/alpha.ts b/plugins/catalog-backend-module-gerrit/src/alpha.ts
index 8b03d9312a..c277a0a680 100644
--- a/plugins/catalog-backend-module-gerrit/src/alpha.ts
+++ b/plugins/catalog-backend-module-gerrit/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { gerritEntityProviderCatalogModule } from './service/GerritEntityProviderCatalogModule';
+export * from './module';
diff --git a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts
similarity index 93%
rename from plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts
index 51c1749c66..0511aa7b4c 100644
--- a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts
@@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
-import { gerritEntityProviderCatalogModule } from './GerritEntityProviderCatalogModule';
+import { catalogModuleGerritEntityProvider } from './catalogModuleGerritEntityProvider';
import { GerritEntityProvider } from '../providers/GerritEntityProvider';
-describe('gerritEntityProviderCatalogModule', () => {
+describe('catalogModuleGerritEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let usedSchedule: TaskScheduleDefinition | undefined;
@@ -79,7 +79,7 @@ describe('gerritEntityProviderCatalogModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [gerritEntityProviderCatalogModule()],
+ features: [catalogModuleGerritEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
diff --git a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts
similarity index 96%
rename from plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts
index 782c724094..814259fb40 100644
--- a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts
@@ -25,7 +25,7 @@ import { GerritEntityProvider } from '../providers/GerritEntityProvider';
/**
* @alpha
*/
-export const gerritEntityProviderCatalogModule = createBackendModule({
+export const catalogModuleGerritEntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'gerritEntityProvider',
register(env) {
diff --git a/plugins/catalog-backend-module-gerrit/src/module/index.ts b/plugins/catalog-backend-module-gerrit/src/module/index.ts
new file mode 100644
index 0000000000..95760538e7
--- /dev/null
+++ b/plugins/catalog-backend-module-gerrit/src/module/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModuleGerritEntityProvider } from './catalogModuleGerritEntityProvider';
diff --git a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts
index 5d258ee94f..9892b60a21 100644
--- a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts
@@ -22,7 +22,7 @@ import {
} from '@backstage/backend-tasks';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import fs from 'fs-extra';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
diff --git a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts
index 986f8ae60c..76cccaf37b 100644
--- a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts
+++ b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts
@@ -22,7 +22,7 @@ import {
EntityProviderConnection,
LocationSpec,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import fetch, { Response } from 'node-fetch';
import {
GerritIntegration,
diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md
index c7e9e756ba..1e0c455391 100644
--- a/plugins/catalog-backend-module-github/CHANGELOG.md
+++ b/plugins/catalog-backend-module-github/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-catalog-backend-module-github
+## 0.2.6-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.2.6-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-github/alpha-api-report.md b/plugins/catalog-backend-module-github/alpha-api-report.md
index eb13ec4558..0d4e16b4ea 100644
--- a/plugins/catalog-backend-module-github/alpha-api-report.md
+++ b/plugins/catalog-backend-module-github/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const githubEntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleGithubEntityProvider: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/catalog-backend-module-github/api-report.md b/plugins/catalog-backend-module-github/api-report.md
index c732740997..23faa31495 100644
--- a/plugins/catalog-backend-module-github/api-report.md
+++ b/plugins/catalog-backend-module-github/api-report.md
@@ -4,19 +4,19 @@
```ts
import { AnalyzeOptions } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
+import { CatalogProcessor } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
import { Entity } from '@backstage/catalog-model';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { EventParams } from '@backstage/plugin-events-node';
import { EventSubscriber } from '@backstage/plugin-events-node';
import { GithubCredentialsProvider } from '@backstage/integration';
import { GithubIntegrationConfig } from '@backstage/integration';
import { graphql } from '@octokit/graphql';
import { GroupEntity } from '@backstage/catalog-model';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json
index 733c3e8dc3..fe9183917e 100644
--- a/plugins/catalog-backend-module-github/package.json
+++ b/plugins/catalog-backend-module-github/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-github",
"description": "A Backstage catalog backend module that helps integrate towards GitHub",
- "version": "0.2.6-next.1",
+ "version": "0.2.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-github/src/alpha.ts b/plugins/catalog-backend-module-github/src/alpha.ts
index 1b83eead82..c277a0a680 100644
--- a/plugins/catalog-backend-module-github/src/alpha.ts
+++ b/plugins/catalog-backend-module-github/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { githubEntityProviderCatalogModule } from './service/GithubEntityProviderCatalogModule';
+export * from './module';
diff --git a/plugins/catalog-backend-module-github/src/deprecated.ts b/plugins/catalog-backend-module-github/src/deprecated.ts
index d094bb4031..e27a856358 100644
--- a/plugins/catalog-backend-module-github/src/deprecated.ts
+++ b/plugins/catalog-backend-module-github/src/deprecated.ts
@@ -19,7 +19,7 @@ import { Config } from '@backstage/config';
import {
EntityProvider,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { GithubEntityProvider } from './providers/GithubEntityProvider';
import {
diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts
index ae6e14fc23..30e7bd83d4 100644
--- a/plugins/catalog-backend-module-github/src/lib/github.ts
+++ b/plugins/catalog-backend-module-github/src/lib/github.ts
@@ -26,7 +26,7 @@ import {
} from './defaultTransformers';
import { withLocations } from '../providers/GithubOrgEntityProvider';
-import { DeferredEntity } from '@backstage/plugin-catalog-backend';
+import { DeferredEntity } from '@backstage/plugin-catalog-node';
// Graphql types
@@ -195,7 +195,7 @@ export async function getOrganizationTeams(
parentTeam { slug }
members(first: 100, membership: IMMEDIATE) {
pageInfo { hasNextPage }
- nodes {
+ nodes {
avatarUrl,
bio,
email,
diff --git a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts
similarity index 92%
rename from plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts
index 7c08e8947d..82a5552dba 100644
--- a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts
@@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
-import { githubEntityProviderCatalogModule } from './GithubEntityProviderCatalogModule';
+import { catalogModuleGithubEntityProvider } from './catalogModuleGithubEntityProvider';
import { GithubEntityProvider } from '../providers/GithubEntityProvider';
-describe('githubEntityProviderCatalogModule', () => {
+describe('catalogModuleGithubEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let usedSchedule: TaskScheduleDefinition | undefined;
@@ -66,7 +66,7 @@ describe('githubEntityProviderCatalogModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [githubEntityProviderCatalogModule()],
+ features: [catalogModuleGithubEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
diff --git a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts
similarity index 96%
rename from plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts
index 246f700248..997da3023b 100644
--- a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts
@@ -27,7 +27,7 @@ import { GithubEntityProvider } from '../providers/GithubEntityProvider';
*
* @alpha
*/
-export const githubEntityProviderCatalogModule = createBackendModule({
+export const catalogModuleGithubEntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'githubEntityProvider',
register(env) {
diff --git a/plugins/catalog-backend-module-github/src/module/index.ts b/plugins/catalog-backend-module-github/src/module/index.ts
new file mode 100644
index 0000000000..640a633093
--- /dev/null
+++ b/plugins/catalog-backend-module-github/src/module/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModuleGithubEntityProvider } from './catalogModuleGithubEntityProvider';
diff --git a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts
index f30007c677..f008c88dbe 100644
--- a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts
+++ b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts
@@ -20,7 +20,7 @@ import {
DefaultGithubCredentialsProvider,
ScmIntegrations,
} from '@backstage/integration';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { GithubDiscoveryProcessor, parseUrl } from './GithubDiscoveryProcessor';
import { getOrganizationRepositories } from '../lib';
diff --git a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts
index c6733df13b..0907b8ac8d 100644
--- a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts
+++ b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts
@@ -26,7 +26,7 @@ import {
CatalogProcessorEmit,
LocationSpec,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { graphql } from '@octokit/graphql';
import { Logger } from 'winston';
import { getOrganizationRepositories } from '../lib';
diff --git a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts
index 7777da6b1b..9709977010 100644
--- a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts
+++ b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts
@@ -34,7 +34,7 @@ import {
CatalogProcessorEmit,
LocationSpec,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { graphql } from '@octokit/graphql';
import { Logger } from 'winston';
import {
diff --git a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts
index ce81e2cf42..195214d561 100644
--- a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts
+++ b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts
@@ -20,7 +20,7 @@ import {
GithubCredentialsProvider,
ScmIntegrations,
} from '@backstage/integration';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { graphql } from '@octokit/graphql';
import { GithubOrgReaderProcessor } from './GithubOrgReaderProcessor';
diff --git a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts
index 90c168ccf4..654deb3079 100644
--- a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts
+++ b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts
@@ -27,7 +27,7 @@ import {
CatalogProcessorEmit,
LocationSpec,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { graphql } from '@octokit/graphql';
import { Logger } from 'winston';
import {
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
index 2be5df09fe..21e6a46fbf 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
@@ -21,7 +21,7 @@ import {
TaskRunner,
} from '@backstage/backend-tasks';
import { ConfigReader } from '@backstage/config';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { GithubEntityProvider } from './GithubEntityProvider';
import * as helpers from '../lib/github';
import { EventParams } from '@backstage/plugin-events-node';
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
index 3c6fd43bd0..839f40e91a 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
@@ -28,7 +28,7 @@ import {
EntityProvider,
EntityProviderConnection,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts
index 2711425998..ff42e42718 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts
@@ -20,7 +20,7 @@ import {
GithubCredentialsProvider,
GithubIntegrationConfig,
} from '@backstage/integration';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { graphql } from '@octokit/graphql';
import { EventParams } from '@backstage/plugin-events-node';
import {
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts
index 2a888e6f91..02e225c938 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts
@@ -33,7 +33,7 @@ import { EventSubscriber } from '@backstage/plugin-events-node';
import {
EntityProvider,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { graphql } from '@octokit/graphql';
import {
OrganizationEvent,
diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md
index c7e0a592ca..491d972754 100644
--- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-catalog-backend-module-gitlab
+## 0.1.14-next.2
+
+### Patch Changes
+
+- be129f8f3cd: filter gitlab groups by prefix
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.14-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-gitlab/alpha-api-report.md b/plugins/catalog-backend-module-gitlab/alpha-api-report.md
index 8912b4a7b2..f14b41d6c5 100644
--- a/plugins/catalog-backend-module-gitlab/alpha-api-report.md
+++ b/plugins/catalog-backend-module-gitlab/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const gitlabDiscoveryEntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleGitlabDiscoveryEntityProvider: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/catalog-backend-module-gitlab/api-report.md b/plugins/catalog-backend-module-gitlab/api-report.md
index 68ea45169f..2596b5c99a 100644
--- a/plugins/catalog-backend-module-gitlab/api-report.md
+++ b/plugins/catalog-backend-module-gitlab/api-report.md
@@ -3,12 +3,12 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
-import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
+import { CatalogProcessor } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { TaskRunner } from '@backstage/backend-tasks';
diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json
index f2042e4f8e..ed07ea842c 100644
--- a/plugins/catalog-backend-module-gitlab/package.json
+++ b/plugins/catalog-backend-module-gitlab/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-gitlab",
"description": "A Backstage catalog backend module that helps integrate towards GitLab",
- "version": "0.1.14-next.1",
+ "version": "0.1.14-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -52,7 +52,6 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@backstage/types": "workspace:^",
"lodash": "^4.17.21",
diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts
index 385ce59bfb..6333184ea8 100644
--- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts
+++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts
@@ -17,7 +17,7 @@
import { getVoidLogger } from '@backstage/backend-common';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { rest, RestRequest } from 'msw';
import { setupServer } from 'msw/node';
import { GitLabDiscoveryProcessor, parseUrl } from './GitLabDiscoveryProcessor';
diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts
index 756093bc56..9f2cd9b17a 100644
--- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts
+++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts
@@ -29,7 +29,7 @@ import {
CatalogProcessorEmit,
LocationSpec,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { GitLabClient, GitLabProject, paginated } from './lib';
diff --git a/plugins/catalog-backend-module-gitlab/src/alpha.ts b/plugins/catalog-backend-module-gitlab/src/alpha.ts
index 883ffc13c4..ace970e3aa 100644
--- a/plugins/catalog-backend-module-gitlab/src/alpha.ts
+++ b/plugins/catalog-backend-module-gitlab/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { gitlabDiscoveryEntityProviderCatalogModule } from './service/GitlabDiscoveryEntityProviderCatalogModule';
+export { catalogModuleGitlabDiscoveryEntityProvider } from './module/catalogModuleGitlabDiscoveryEntityProvider';
diff --git a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts
similarity index 92%
rename from plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts
index efb86e4223..7a3d0a0e0d 100644
--- a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts
@@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
-import { gitlabDiscoveryEntityProviderCatalogModule } from './GitlabDiscoveryEntityProviderCatalogModule';
+import { catalogModuleGitlabDiscoveryEntityProvider } from './catalogModuleGitlabDiscoveryEntityProvider';
import { GitlabDiscoveryEntityProvider } from '../providers';
-describe('gitlabDiscoveryEntityProviderCatalogModule', () => {
+describe('catalogModuleGitlabDiscoveryEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let usedSchedule: TaskScheduleDefinition | undefined;
@@ -78,7 +78,7 @@ describe('gitlabDiscoveryEntityProviderCatalogModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [gitlabDiscoveryEntityProviderCatalogModule()],
+ features: [catalogModuleGitlabDiscoveryEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M'));
diff --git a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts
similarity index 96%
rename from plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts
index 0adf5b18f2..ffae233319 100644
--- a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts
@@ -27,7 +27,7 @@ import { GitlabDiscoveryEntityProvider } from '../providers';
*
* @alpha
*/
-export const gitlabDiscoveryEntityProviderCatalogModule = createBackendModule({
+export const catalogModuleGitlabDiscoveryEntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'gitlabDiscoveryEntityProvider',
register(env) {
diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts
index ae19edc48c..42fa1b471c 100644
--- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts
@@ -22,7 +22,7 @@ import {
} from '@backstage/backend-tasks';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { GitlabDiscoveryEntityProvider } from './GitlabDiscoveryEntityProvider';
diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts
index f0d88c34f5..ece10ee8c6 100644
--- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts
+++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts
@@ -22,7 +22,7 @@ import {
EntityProviderConnection,
LocationSpec,
locationSpecToLocationEntity,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import * as uuid from 'uuid';
import { Logger } from 'winston';
import {
diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts
index cff215acd3..5a323a8dec 100644
--- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts
@@ -22,7 +22,7 @@ import {
} from '@backstage/backend-tasks';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { GitlabOrgDiscoveryEntityProvider } from './GitlabOrgDiscoveryEntityProvider';
diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts
index db1efac86d..acfa784c2e 100644
--- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts
+++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts
@@ -20,7 +20,7 @@ import { GitLabIntegration, ScmIntegrations } from '@backstage/integration';
import {
EntityProvider,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import * as uuid from 'uuid';
import { Logger } from 'winston';
import {
diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
index ad4649ab7f..11393c6db2 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
+++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-catalog-backend-module-incremental-ingestion
+## 0.3.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.3.0-next.1
### Minor Changes
diff --git a/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md b/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md
index ec9c59a4c4..b11ec43cf5 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md
+++ b/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md
@@ -8,7 +8,7 @@ import { IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-mod
import { IncrementalEntityProviderOptions } from '@backstage/plugin-catalog-backend-module-incremental-ingestion';
// @alpha
-export const incrementalIngestionEntityProviderCatalogModule: (options: {
+export const catalogModuleIncrementalIngestionEntityProvider: (options: {
providers: {
provider: IncrementalEntityProvider;
options: IncrementalEntityProviderOptions;
diff --git a/plugins/catalog-backend-module-incremental-ingestion/api-report.md b/plugins/catalog-backend-module-incremental-ingestion/api-report.md
index 167c07f70f..c2fad4576c 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/api-report.md
+++ b/plugins/catalog-backend-module-incremental-ingestion/api-report.md
@@ -7,7 +7,7 @@
import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
import type { Config } from '@backstage/config';
-import type { DeferredEntity } from '@backstage/plugin-catalog-backend';
+import type { DeferredEntity } from '@backstage/plugin-catalog-node';
import type { DurationObjectUnits } from 'luxon';
import { EventParams } from '@backstage/plugin-events-node';
import { EventSubscriber } from '@backstage/plugin-events-node';
diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json
index a88e3af1fa..5b2a534fcb 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/package.json
+++ b/plugins/catalog-backend-module-incremental-ingestion/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-incremental-ingestion",
"description": "An entity provider for streaming large asset sources into the catalog",
- "version": "0.3.0-next.1",
+ "version": "0.3.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -69,8 +69,7 @@
"@backstage/backend-app-api": "workspace:^",
"@backstage/backend-defaults": "workspace:^",
"@backstage/backend-test-utils": "workspace:^",
- "@backstage/cli": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^"
+ "@backstage/cli": "workspace:^"
},
"files": [
"dist",
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts
index cf47942754..527d345706 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts
@@ -15,7 +15,7 @@
*/
import { Knex } from 'knex';
-import type { DeferredEntity } from '@backstage/plugin-catalog-backend';
+import type { DeferredEntity } from '@backstage/plugin-catalog-node';
import { stringifyEntityRef } from '@backstage/catalog-model';
import { Duration } from 'luxon';
import { v4 } from 'uuid';
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
index 228c7a2505..13d5bfff71 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import type { DeferredEntity } from '@backstage/plugin-catalog-backend';
+import type { DeferredEntity } from '@backstage/plugin-catalog-node';
import { IterationEngine, IterationEngineOptions } from '../types';
import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';
import { performance } from 'perf_hooks';
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts
similarity index 91%
rename from plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts
index dbadf573a4..ef07b4cb10 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts
@@ -20,9 +20,9 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { IncrementalEntityProvider } from '../types';
-import { incrementalIngestionEntityProviderCatalogModule } from './incrementalIngestionEntityProviderCatalogModule';
+import { catalogModuleIncrementalIngestionEntityProvider } from './catalogModuleIncrementalIngestionEntityProvider';
-describe('bitbucketServerEntityProviderCatalogModule', () => {
+describe('catalogModuleIncrementalIngestionEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
const provider1: IncrementalEntityProvider = {
getProviderName: () => 'provider1',
@@ -57,7 +57,7 @@ describe('bitbucketServerEntityProviderCatalogModule', () => {
[coreServices.scheduler, scheduler],
],
features: [
- incrementalIngestionEntityProviderCatalogModule({
+ catalogModuleIncrementalIngestionEntityProvider({
providers: [
{
provider: provider1,
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts
similarity index 97%
rename from plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts
index 261768c142..19d5742b46 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts
@@ -30,7 +30,7 @@ import { WrapperProviders } from './WrapperProviders';
*
* @alpha
*/
-export const incrementalIngestionEntityProviderCatalogModule =
+export const catalogModuleIncrementalIngestionEntityProvider =
createBackendModule(
(options: {
providers: Array<{
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts
index 577cf193e2..9fcee99e01 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { incrementalIngestionEntityProviderCatalogModule } from './incrementalIngestionEntityProviderCatalogModule';
+export { catalogModuleIncrementalIngestionEntityProvider } from './catalogModuleIncrementalIngestionEntityProvider';
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts
index f1b6bd1529..f94c988237 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts
@@ -25,7 +25,7 @@ import {
import { ConfigReader } from '@backstage/config';
import { catalogPlugin } from '@backstage/plugin-catalog-backend/alpha';
import { IncrementalEntityProvider } from '.';
-import { incrementalIngestionEntityProviderCatalogModule } from './alpha';
+import { catalogModuleIncrementalIngestionEntityProvider } from './alpha';
const provider: IncrementalEntityProvider = {
getProviderName: () => 'test-provider',
@@ -63,7 +63,7 @@ async function main() {
backend.add(catalogPlugin());
backend.add(
- incrementalIngestionEntityProviderCatalogModule({
+ catalogModuleIncrementalIngestionEntityProvider({
providers: [
{
provider: provider,
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts
index c8458be09b..59cdf32391 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
import {
IncrementalEntityProvider,
IncrementalEntityProviderOptions,
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/types.ts b/plugins/catalog-backend-module-incremental-ingestion/src/types.ts
index cd1e63b044..5f9d0489e6 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/types.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/types.ts
@@ -26,7 +26,7 @@ import type { Config } from '@backstage/config';
import type {
DeferredEntity,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { EventParams } from '@backstage/plugin-events-node';
import type { PermissionEvaluator } from '@backstage/plugin-permission-common';
import type { DurationObjectUnits } from 'luxon';
diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md
index 78614a4c31..5e176f09ba 100644
--- a/plugins/catalog-backend-module-ldap/CHANGELOG.md
+++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-catalog-backend-module-ldap
+## 0.5.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.5.10-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-ldap/api-report.md b/plugins/catalog-backend-module-ldap/api-report.md
index 9876c163e8..088e34fc34 100644
--- a/plugins/catalog-backend-module-ldap/api-report.md
+++ b/plugins/catalog-backend-module-ldap/api-report.md
@@ -3,15 +3,15 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
-import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
+import { CatalogProcessor } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
import { Client } from 'ldapjs';
import { Config } from '@backstage/config';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { GroupEntity } from '@backstage/catalog-model';
import { JsonValue } from '@backstage/types';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { SearchEntry } from 'ldapjs';
import { SearchOptions } from 'ldapjs';
diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json
index eb8bbd1f97..06b33f1db2 100644
--- a/plugins/catalog-backend-module-ldap/package.json
+++ b/plugins/catalog-backend-module-ldap/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-ldap",
"description": "A Backstage catalog backend module that helps integrate towards LDAP",
- "version": "0.5.10-next.1",
+ "version": "0.5.10-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -36,7 +36,7 @@
"@backstage/catalog-model": "workspace:^",
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
+ "@backstage/plugin-catalog-node": "workspace:^",
"@backstage/types": "workspace:^",
"@types/ldapjs": "^2.2.0",
"ldapjs": "^2.2.0",
diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts
index 64d56cc8bc..811f451b26 100644
--- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts
+++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts
@@ -24,7 +24,7 @@ import { Config } from '@backstage/config';
import {
EntityProvider,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { merge } from 'lodash';
import * as uuid from 'uuid';
import { Logger } from 'winston';
diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts
index fcfdb43eb1..9c5442ca0c 100644
--- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts
+++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts
@@ -29,7 +29,7 @@ import {
CatalogProcessorEmit,
LocationSpec,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
/**
* Extracts teams and users out of an LDAP server.
diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md
index 0d1f93299f..dc1a32f25a 100644
--- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md
+++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-catalog-backend-module-msgraph
+## 0.5.2-next.2
+
+### Patch Changes
+
+- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.5.2-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-msgraph/alpha-api-report.md b/plugins/catalog-backend-module-msgraph/alpha-api-report.md
index ed30b83bc8..0fa093a1bc 100644
--- a/plugins/catalog-backend-module-msgraph/alpha-api-report.md
+++ b/plugins/catalog-backend-module-msgraph/alpha-api-report.md
@@ -9,10 +9,10 @@ import { OrganizationTransformer } from '@backstage/plugin-catalog-backend-modul
import { UserTransformer } from '@backstage/plugin-catalog-backend-module-msgraph';
// @alpha
-export const microsoftGraphOrgEntityProviderCatalogModule: () => BackendFeature;
+export const catalogModuleMicrosoftGraphOrgEntityProvider: () => BackendFeature;
// @alpha
-export interface MicrosoftGraphOrgEntityProviderCatalogModuleOptions {
+export interface CatalogModuleMicrosoftGraphOrgEntityProviderOptions {
groupTransformer?: GroupTransformer | Record;
organizationTransformer?:
| OrganizationTransformer
diff --git a/plugins/catalog-backend-module-msgraph/api-report.md b/plugins/catalog-backend-module-msgraph/api-report.md
index 10a4f405c0..bde8c06fbb 100644
--- a/plugins/catalog-backend-module-msgraph/api-report.md
+++ b/plugins/catalog-backend-module-msgraph/api-report.md
@@ -3,13 +3,13 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
-import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
+import { CatalogProcessor } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { GroupEntity } from '@backstage/catalog-model';
-import { LocationSpec } from '@backstage/plugin-catalog-backend';
+import { LocationSpec } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json
index 369daa1c6b..f66151bbc4 100644
--- a/plugins/catalog-backend-module-msgraph/package.json
+++ b/plugins/catalog-backend-module-msgraph/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-msgraph",
"description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph",
- "version": "0.5.2-next.1",
+ "version": "0.5.2-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -51,7 +51,6 @@
"@backstage/backend-tasks": "workspace:^",
"@backstage/catalog-model": "workspace:^",
"@backstage/config": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@microsoft/microsoft-graph-types": "^2.6.0",
"@types/node-fetch": "^2.5.12",
diff --git a/plugins/catalog-backend-module-msgraph/src/alpha.ts b/plugins/catalog-backend-module-msgraph/src/alpha.ts
index 137808d881..c277a0a680 100644
--- a/plugins/catalog-backend-module-msgraph/src/alpha.ts
+++ b/plugins/catalog-backend-module-msgraph/src/alpha.ts
@@ -14,5 +14,4 @@
* limitations under the License.
*/
-export { microsoftGraphOrgEntityProviderCatalogModule } from './service/MicrosoftGraphOrgEntityProviderCatalogModule';
-export type { MicrosoftGraphOrgEntityProviderCatalogModuleOptions } from './service/MicrosoftGraphOrgEntityProviderCatalogModule';
+export * from './module';
diff --git a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts
similarity index 92%
rename from plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts
rename to plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts
index 3763553162..3362c75c95 100644
--- a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts
@@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { Duration } from 'luxon';
-import { microsoftGraphOrgEntityProviderCatalogModule } from './MicrosoftGraphOrgEntityProviderCatalogModule';
+import { catalogModuleMicrosoftGraphOrgEntityProvider } from './catalogModuleMicrosoftGraphOrgEntityProvider';
import { MicrosoftGraphOrgEntityProvider } from '../processors';
-describe('awsS3EntityProviderCatalogModule', () => {
+describe('catalogModuleMicrosoftGraphOrgEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
let addedProviders: Array | undefined;
let usedSchedule: TaskScheduleDefinition | undefined;
@@ -71,7 +71,7 @@ describe('awsS3EntityProviderCatalogModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [microsoftGraphOrgEntityProviderCatalogModule()],
+ features: [catalogModuleMicrosoftGraphOrgEntityProvider()],
});
expect(usedSchedule?.frequency).toEqual(Duration.fromISO('PT30M'));
diff --git a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts
similarity index 91%
rename from plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.ts
rename to plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts
index 11be567045..7cd8b65f0b 100644
--- a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.ts
+++ b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts
@@ -28,11 +28,11 @@ import {
import { MicrosoftGraphOrgEntityProvider } from '../processors';
/**
- * Options for {@link microsoftGraphOrgEntityProviderCatalogModule}.
+ * Options for {@link catalogModuleMicrosoftGraphOrgEntityProvider}.
*
* @alpha
*/
-export interface MicrosoftGraphOrgEntityProviderCatalogModuleOptions {
+export interface CatalogModuleMicrosoftGraphOrgEntityProviderOptions {
/**
* The function that transforms a user entry in msgraph to an entity.
* Optionally, you can pass separate transformers per provider ID.
@@ -59,13 +59,13 @@ export interface MicrosoftGraphOrgEntityProviderCatalogModuleOptions {
*
* @alpha
*/
-export const microsoftGraphOrgEntityProviderCatalogModule = createBackendModule(
+export const catalogModuleMicrosoftGraphOrgEntityProvider = createBackendModule(
{
pluginId: 'catalog',
moduleId: 'microsoftGraphOrgEntityProvider',
register(
env,
- options?: MicrosoftGraphOrgEntityProviderCatalogModuleOptions,
+ options?: CatalogModuleMicrosoftGraphOrgEntityProviderOptions,
) {
env.registerInit({
deps: {
diff --git a/plugins/catalog-backend-module-msgraph/src/module/index.ts b/plugins/catalog-backend-module-msgraph/src/module/index.ts
new file mode 100644
index 0000000000..f53f41141c
--- /dev/null
+++ b/plugins/catalog-backend-module-msgraph/src/module/index.ts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModuleMicrosoftGraphOrgEntityProvider } from './catalogModuleMicrosoftGraphOrgEntityProvider';
+export type { CatalogModuleMicrosoftGraphOrgEntityProviderOptions } from './catalogModuleMicrosoftGraphOrgEntityProvider';
diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts
index 8af327cf27..dccf7ed53d 100644
--- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts
@@ -26,7 +26,7 @@ import {
GroupEntity,
UserEntity,
} from '@backstage/catalog-model';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import {
MicrosoftGraphClient,
MICROSOFT_GRAPH_USER_ID_ANNOTATION,
diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts
index 071fa7f266..3ef02344eb 100644
--- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts
+++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts
@@ -24,7 +24,7 @@ import { Config } from '@backstage/config';
import {
EntityProvider,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { merge } from 'lodash';
import * as uuid from 'uuid';
import { Logger } from 'winston';
diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts
index 1267648481..2beef51c31 100644
--- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts
+++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts
@@ -20,7 +20,7 @@ import {
CatalogProcessorEmit,
LocationSpec,
processingResult,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import {
GroupTransformer,
diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md
index 954eff2c98..8bf478947a 100644
--- a/plugins/catalog-backend-module-openapi/CHANGELOG.md
+++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-catalog-backend-module-openapi
+## 0.1.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.9-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json
index 691581bf77..fee080d1bf 100644
--- a/plugins/catalog-backend-module-openapi/package.json
+++ b/plugins/catalog-backend-module-openapi/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-openapi",
"description": "A Backstage catalog backend module that helps with OpenAPI specifications",
- "version": "0.1.9-next.1",
+ "version": "0.1.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md
new file mode 100644
index 0000000000..5bc50ae148
--- /dev/null
+++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md
@@ -0,0 +1,15 @@
+# @backstage/plugin-catalog-backend-module-puppetdb
+
+## 0.1.0-next.0
+
+### Minor Changes
+
+- a1efcf9a658: Initial version of the plugin.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/config@1.0.7-next.0
diff --git a/plugins/catalog-backend-module-puppetdb/alpha-api-report.md b/plugins/catalog-backend-module-puppetdb/alpha-api-report.md
new file mode 100644
index 0000000000..0856fdb836
--- /dev/null
+++ b/plugins/catalog-backend-module-puppetdb/alpha-api-report.md
@@ -0,0 +1,12 @@
+## API Report File for "@backstage/plugin-catalog-backend-module-puppetdb"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import { BackendFeature } from '@backstage/backend-plugin-api';
+
+// @alpha
+export const catalogModulePuppetDbEntityProvider: () => BackendFeature;
+
+// (No @packageDocumentation comment for this package)
+```
diff --git a/plugins/catalog-backend-module-puppetdb/api-report.md b/plugins/catalog-backend-module-puppetdb/api-report.md
index 8764ac1e7c..a4954ce6bd 100644
--- a/plugins/catalog-backend-module-puppetdb/api-report.md
+++ b/plugins/catalog-backend-module-puppetdb/api-report.md
@@ -4,8 +4,8 @@
```ts
import { Config } from '@backstage/config';
-import { EntityProvider } from '@backstage/plugin-catalog-backend';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-backend';
+import { EntityProvider } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { JsonValue } from '@backstage/types';
import { Logger } from 'winston';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json
index b6539dbbe6..252fe21969 100644
--- a/plugins/catalog-backend-module-puppetdb/package.json
+++ b/plugins/catalog-backend-module-puppetdb/package.json
@@ -1,14 +1,27 @@
{
"name": "@backstage/plugin-catalog-backend-module-puppetdb",
"description": "A Backstage catalog backend module that helps integrate towards PuppetDB",
- "version": "0.0.1",
+ "version": "0.1.0-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
"publishConfig": {
- "access": "public",
- "main": "dist/index.cjs.js",
- "types": "dist/index.d.ts"
+ "access": "public"
+ },
+ "exports": {
+ ".": "./src/index.ts",
+ "./alpha": "./src/alpha.ts",
+ "./package.json": "./package.json"
+ },
+ "typesVersions": {
+ "*": {
+ "alpha": [
+ "src/alpha.ts"
+ ],
+ "package.json": [
+ "package.json"
+ ]
+ }
},
"backstage": {
"role": "backend-plugin-module"
@@ -35,11 +48,12 @@
},
"dependencies": {
"@backstage/backend-common": "workspace:^",
+ "@backstage/backend-plugin-api": "workspace:^",
"@backstage/backend-tasks": "workspace:^",
"@backstage/catalog-model": "workspace:^",
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
- "@backstage/plugin-catalog-backend": "workspace:^",
+ "@backstage/plugin-catalog-node": "workspace:^",
"@backstage/types": "workspace:^",
"lodash": "^4.17.21",
"luxon": "^3.0.0",
diff --git a/plugins/catalog-backend/src/util/index.ts b/plugins/catalog-backend-module-puppetdb/src/alpha.ts
similarity index 84%
rename from plugins/catalog-backend/src/util/index.ts
rename to plugins/catalog-backend-module-puppetdb/src/alpha.ts
index b3bd4d5316..c277a0a680 100644
--- a/plugins/catalog-backend/src/util/index.ts
+++ b/plugins/catalog-backend-module-puppetdb/src/alpha.ts
@@ -1,5 +1,5 @@
/*
- * Copyright 2022 The Backstage Authors
+ * 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.
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { locationSpecToLocationEntity } from './conversion';
+export * from './module';
diff --git a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts
new file mode 100644
index 0000000000..e2745e9268
--- /dev/null
+++ b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { getVoidLogger } from '@backstage/backend-common';
+import { coreServices } from '@backstage/backend-plugin-api';
+import {
+ PluginTaskScheduler,
+ TaskScheduleDefinition,
+} from '@backstage/backend-tasks';
+import { startTestBackend } from '@backstage/backend-test-utils';
+import { ConfigReader } from '@backstage/config';
+import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
+import { catalogModulePuppetDbEntityProvider } from './catalogModulePuppetDbEntityProvider';
+import { PuppetDbEntityProvider } from '../providers/PuppetDbEntityProvider';
+
+describe('catalogModulePuppetDbEntityProvider', () => {
+ it('should register provider at the catalog extension point', async () => {
+ let addedProviders: Array | undefined;
+ let usedSchedule: TaskScheduleDefinition | undefined;
+
+ const extensionPoint = {
+ addEntityProvider: (providers: any) => {
+ addedProviders = providers;
+ },
+ };
+ const runner = jest.fn();
+ const scheduler = {
+ createScheduledTaskRunner: (schedule: TaskScheduleDefinition) => {
+ usedSchedule = schedule;
+ return runner;
+ },
+ } as unknown as PluginTaskScheduler;
+
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ puppetdb: {
+ baseUrl: 'http://puppetdb:8080',
+ schedule: {
+ frequency: { minutes: 10 },
+ timeout: { minutes: 10 },
+ },
+ },
+ },
+ },
+ });
+
+ await startTestBackend({
+ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
+ services: [
+ [coreServices.config, config],
+ [coreServices.logger, getVoidLogger()],
+ [coreServices.scheduler, scheduler],
+ ],
+ features: [catalogModulePuppetDbEntityProvider()],
+ });
+
+ expect(usedSchedule?.frequency).toEqual({ minutes: 10 });
+ expect(usedSchedule?.timeout).toEqual({ minutes: 10 });
+ expect(addedProviders?.length).toEqual(1);
+ expect(addedProviders?.pop()?.getProviderName()).toEqual(
+ 'puppetdb-provider:default',
+ );
+ expect(runner).not.toHaveBeenCalled();
+ });
+});
diff --git a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts
new file mode 100644
index 0000000000..9a7d279cd3
--- /dev/null
+++ b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {
+ createBackendModule,
+ coreServices,
+} from '@backstage/backend-plugin-api';
+import { loggerToWinstonLogger } from '@backstage/backend-common';
+import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
+import { PuppetDbEntityProvider } from '../providers/PuppetDbEntityProvider';
+
+/**
+ * Registers the `PuppetDbEntityProvider` with the catalog processing extension point.
+ *
+ * @alpha
+ */
+export const catalogModulePuppetDbEntityProvider = createBackendModule({
+ pluginId: 'catalog',
+ moduleId: 'puppetDbEntityProvider',
+ register(env) {
+ env.registerInit({
+ deps: {
+ catalog: catalogProcessingExtensionPoint,
+ config: coreServices.config,
+ logger: coreServices.logger,
+ scheduler: coreServices.scheduler,
+ },
+ async init({ catalog, config, logger, scheduler }) {
+ catalog.addEntityProvider(
+ PuppetDbEntityProvider.fromConfig(config, {
+ logger: loggerToWinstonLogger(logger),
+ scheduler,
+ }),
+ );
+ },
+ });
+ },
+});
diff --git a/plugins/catalog-backend-module-puppetdb/src/module/index.ts b/plugins/catalog-backend-module-puppetdb/src/module/index.ts
new file mode 100644
index 0000000000..f30f236df4
--- /dev/null
+++ b/plugins/catalog-backend-module-puppetdb/src/module/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { catalogModulePuppetDbEntityProvider } from './catalogModulePuppetDbEntityProvider';
diff --git a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts
index 0ab6fb35b7..ad89e1fd9a 100644
--- a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts
@@ -21,7 +21,7 @@ import { PuppetDbEntityProvider } from './PuppetDbEntityProvider';
import {
DeferredEntity,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import * as puppetFunctions from '../puppet/read';
import { ANNOTATION_PUPPET_CERTNAME } from '../puppet';
import {
diff --git a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts
index b2d2738fd3..8c63baf467 100644
--- a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts
+++ b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts
@@ -17,7 +17,7 @@
import {
EntityProvider,
EntityProviderConnection,
-} from '@backstage/plugin-catalog-backend';
+} from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import {
PuppetDbEntityProviderConfig,
@@ -116,13 +116,13 @@ export class PuppetDbEntityProvider implements EntityProvider {
this.transformer = transformer;
}
- /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.connect} */
+ /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.connect} */
async connect(connection: EntityProviderConnection): Promise {
this.connection = connection;
await this.scheduleFn();
}
- /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.getProviderName} */
+ /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.getProviderName} */
getProviderName(): string {
return `puppetdb-provider:${this.config.id}`;
}
diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md
index cbb5dd0fd4..1cc3b3620a 100644
--- a/plugins/catalog-backend/CHANGELOG.md
+++ b/plugins/catalog-backend/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-backend
+## 1.8.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 1.8.0-next.1
### Patch Changes
diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md
index 00c13a31ea..5e7b2dee02 100644
--- a/plugins/catalog-backend/api-report.md
+++ b/plugins/catalog-backend/api-report.md
@@ -12,29 +12,30 @@ import { AnalyzeLocationRequest as AnalyzeLocationRequest_2 } from '@backstage/p
import { AnalyzeLocationResponse as AnalyzeLocationResponse_2 } from '@backstage/plugin-catalog-common';
import { CatalogApi } from '@backstage/catalog-client';
import { CatalogEntityDocument } from '@backstage/plugin-catalog-common';
-import { CatalogProcessor } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorCache } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorEntityResult } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorErrorResult } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorLocationResult } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorParser } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorRefreshKeysResult } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorRelationResult } from '@backstage/plugin-catalog-node';
-import { CatalogProcessorResult } from '@backstage/plugin-catalog-node';
+import { CatalogProcessor as CatalogProcessor_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorCache as CatalogProcessorCache_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEmit as CatalogProcessorEmit_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorEntityResult as CatalogProcessorEntityResult_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorErrorResult as CatalogProcessorErrorResult_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorLocationResult as CatalogProcessorLocationResult_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorParser as CatalogProcessorParser_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorRefreshKeysResult as CatalogProcessorRefreshKeysResult_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorRelationResult as CatalogProcessorRelationResult_2 } from '@backstage/plugin-catalog-node';
+import { CatalogProcessorResult as CatalogProcessorResult_2 } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
-import { DeferredEntity } from '@backstage/plugin-catalog-node';
+import { DeferredEntity as DeferredEntity_2 } from '@backstage/plugin-catalog-node';
import { DocumentCollatorFactory } from '@backstage/plugin-search-common';
import { Entity } from '@backstage/catalog-model';
import { EntityPolicy } from '@backstage/catalog-model';
-import { EntityProvider } from '@backstage/plugin-catalog-node';
-import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
-import { EntityProviderMutation } from '@backstage/plugin-catalog-node';
-import { EntityRelationSpec } from '@backstage/plugin-catalog-node';
+import { EntityProvider as EntityProvider_2 } from '@backstage/plugin-catalog-node';
+import { EntityProviderConnection as EntityProviderConnection_2 } from '@backstage/plugin-catalog-node';
+import { EntityProviderMutation as EntityProviderMutation_2 } from '@backstage/plugin-catalog-node';
+import { EntityRelationSpec as EntityRelationSpec_2 } from '@backstage/plugin-catalog-node';
import { GetEntitiesRequest } from '@backstage/catalog-client';
import { JsonValue } from '@backstage/types';
-import { LocationEntityV1alpha1 } from '@backstage/catalog-model';
import { LocationSpec as LocationSpec_2 } from '@backstage/plugin-catalog-common';
+import { locationSpecToLocationEntity as locationSpecToLocationEntity_2 } from '@backstage/plugin-catalog-node';
+import { locationSpecToMetadataName as locationSpecToMetadataName_2 } from '@backstage/plugin-catalog-node';
import { Logger } from 'winston';
import { Permission } from '@backstage/plugin-permission-common';
import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
@@ -43,7 +44,6 @@ import { PermissionRule } from '@backstage/plugin-permission-node';
import { PermissionRuleParams } from '@backstage/plugin-permission-common';
import { PluginDatabaseManager } from '@backstage/backend-common';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
-import { processingResult } from '@backstage/plugin-catalog-node';
import { Readable } from 'stream';
import { Router } from 'express';
import { ScmIntegrationRegistry } from '@backstage/integration';
@@ -73,7 +73,7 @@ export type AnalyzeOptions = {
};
// @public (undocumented)
-export class AnnotateLocationEntityProcessor implements CatalogProcessor {
+export class AnnotateLocationEntityProcessor implements CatalogProcessor_2 {
constructor(options: { integrations: ScmIntegrationRegistry });
// (undocumented)
getProcessorName(): string;
@@ -81,13 +81,13 @@ export class AnnotateLocationEntityProcessor implements CatalogProcessor {
preProcessEntity(
entity: Entity,
location: LocationSpec_2,
- _: CatalogProcessorEmit,
+ _: CatalogProcessorEmit_2,
originLocation: LocationSpec_2,
): Promise;
}
// @public (undocumented)
-export class AnnotateScmSlugEntityProcessor implements CatalogProcessor {
+export class AnnotateScmSlugEntityProcessor implements CatalogProcessor_2 {
constructor(opts: { scmIntegrationRegistry: ScmIntegrationRegistry });
// (undocumented)
static fromConfig(config: Config): AnnotateScmSlugEntityProcessor;
@@ -98,14 +98,14 @@ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor {
}
// @public (undocumented)
-export class BuiltinKindsEntityProcessor implements CatalogProcessor {
+export class BuiltinKindsEntityProcessor implements CatalogProcessor_2 {
// (undocumented)
getProcessorName(): string;
// (undocumented)
postProcessEntity(
entity: Entity,
_location: LocationSpec_2,
- emit: CatalogProcessorEmit,
+ emit: CatalogProcessorEmit_2,
): Promise;
// (undocumented)
validateEntityKind(entity: Entity): Promise;
@@ -117,7 +117,7 @@ export class CatalogBuilder {
...policies: Array>
): CatalogBuilder;
addEntityProvider(
- ...providers: Array>
+ ...providers: Array>
): CatalogBuilder;
addLocationAnalyzers(
...analyzers: Array>
@@ -128,18 +128,18 @@ export class CatalogBuilder {
>
): this;
addProcessor(
- ...processors: Array>
+ ...processors: Array>
): CatalogBuilder;
build(): Promise<{
processingEngine: CatalogProcessingEngine;
router: Router;
}>;
static create(env: CatalogEnvironment): CatalogBuilder;
- getDefaultProcessors(): CatalogProcessor[];
+ getDefaultProcessors(): CatalogProcessor_2[];
replaceEntityPolicies(policies: EntityPolicy[]): CatalogBuilder;
- replaceProcessors(processors: CatalogProcessor[]): CatalogBuilder;
+ replaceProcessors(processors: CatalogProcessor_2[]): CatalogBuilder;
setAllowedLocationTypes(allowedLocationTypes: string[]): CatalogBuilder;
- setEntityDataParser(parser: CatalogProcessorParser): CatalogBuilder;
+ setEntityDataParser(parser: CatalogProcessorParser_2): CatalogBuilder;
setFieldFormatValidators(validators: Partial): CatalogBuilder;
setLocationAnalyzer(locationAnalyzer: LocationAnalyzer): CatalogBuilder;
setPlaceholderResolver(
@@ -187,28 +187,39 @@ export interface CatalogProcessingEngine {
stop(): Promise;
}
-export { CatalogProcessor };
+// @public @deprecated (undocumented)
+export type CatalogProcessor = CatalogProcessor_2;
-export { CatalogProcessorCache };
+// @public @deprecated (undocumented)
+export type CatalogProcessorCache = CatalogProcessorCache_2;
-export { CatalogProcessorEmit };
+// @public @deprecated (undocumented)
+export type CatalogProcessorEmit = CatalogProcessorEmit_2;
-export { CatalogProcessorEntityResult };
+// @public @deprecated (undocumented)
+export type CatalogProcessorEntityResult = CatalogProcessorEntityResult_2;
-export { CatalogProcessorErrorResult };
+// @public @deprecated (undocumented)
+export type CatalogProcessorErrorResult = CatalogProcessorErrorResult_2;
-export { CatalogProcessorLocationResult };
+// @public @deprecated (undocumented)
+export type CatalogProcessorLocationResult = CatalogProcessorLocationResult_2;
-export { CatalogProcessorParser };
+// @public @deprecated (undocumented)
+export type CatalogProcessorParser = CatalogProcessorParser_2;
-export { CatalogProcessorRefreshKeysResult };
+// @public @deprecated (undocumented)
+export type CatalogProcessorRefreshKeysResult =
+ CatalogProcessorRefreshKeysResult_2;
-export { CatalogProcessorRelationResult };
+// @public @deprecated (undocumented)
+export type CatalogProcessorRelationResult = CatalogProcessorRelationResult_2;
-export { CatalogProcessorResult };
+// @public @deprecated (undocumented)
+export type CatalogProcessorResult = CatalogProcessorResult_2;
// @public (undocumented)
-export class CodeOwnersProcessor implements CatalogProcessor {
+export class CodeOwnersProcessor implements CatalogProcessor_2 {
constructor(options: {
integrations: ScmIntegrationRegistry;
logger: Logger;
@@ -304,7 +315,8 @@ export type DefaultCatalogCollatorFactoryOptions = {
entityTransformer?: CatalogCollatorEntityTransformer;
};
-export { DeferredEntity };
+// @public @deprecated (undocumented)
+export type DeferredEntity = DeferredEntity_2;
// @public
export type EntitiesSearchFilter = {
@@ -325,24 +337,28 @@ export type EntityFilter =
}
| EntitiesSearchFilter;
-export { EntityProvider };
+// @public @deprecated (undocumented)
+export type EntityProvider = EntityProvider_2;
-export { EntityProviderConnection };
+// @public @deprecated (undocumented)
+export type EntityProviderConnection = EntityProviderConnection_2;
-export { EntityProviderMutation };
+// @public @deprecated (undocumented)
+export type EntityProviderMutation = EntityProviderMutation_2;
-export { EntityRelationSpec };
+// @public @deprecated (undocumented)
+export type EntityRelationSpec = EntityRelationSpec_2;
// @public (undocumented)
-export class FileReaderProcessor implements CatalogProcessor {
+export class FileReaderProcessor implements CatalogProcessor_2 {
// (undocumented)
getProcessorName(): string;
// (undocumented)
readLocation(
location: LocationSpec_2,
optional: boolean,
- emit: CatalogProcessorEmit,
- parser: CatalogProcessorParser,
+ emit: CatalogProcessorEmit_2,
+ parser: CatalogProcessorParser_2,
): Promise;
}
@@ -354,7 +370,7 @@ export type LocationAnalyzer = {
};
// @public (undocumented)
-export class LocationEntityProcessor implements CatalogProcessor {
+export class LocationEntityProcessor implements CatalogProcessor_2 {
constructor(options: LocationEntityProcessorOptions);
// (undocumented)
getProcessorName(): string;
@@ -362,7 +378,7 @@ export class LocationEntityProcessor implements CatalogProcessor {
postProcessEntity(
entity: Entity,
location: LocationSpec_2,
- emit: CatalogProcessorEmit,
+ emit: CatalogProcessorEmit_2,
): Promise;
}
@@ -374,20 +390,20 @@ export type LocationEntityProcessorOptions = {
// @public @deprecated
export type LocationSpec = LocationSpec_2;
-// @public (undocumented)
-export function locationSpecToLocationEntity(opts: {
- location: LocationSpec_2;
- parentEntity?: Entity;
-}): LocationEntityV1alpha1;
+// @public @deprecated (undocumented)
+export const locationSpecToLocationEntity: typeof locationSpecToLocationEntity_2;
+
+// @public @deprecated (undocumented)
+export const locationSpecToMetadataName: typeof locationSpecToMetadataName_2;
// @public (undocumented)
export function parseEntityYaml(
data: Buffer,
location: LocationSpec_2,
-): Iterable;
+): Iterable;
// @public
-export class PlaceholderProcessor implements CatalogProcessor {
+export class PlaceholderProcessor implements CatalogProcessor_2 {
constructor(options: PlaceholderProcessorOptions);
// (undocumented)
getProcessorName(): string;
@@ -395,7 +411,7 @@ export class PlaceholderProcessor implements CatalogProcessor {
preProcessEntity(
entity: Entity,
location: LocationSpec_2,
- emit: CatalogProcessorEmit,
+ emit: CatalogProcessorEmit_2,
): Promise;
}
@@ -418,7 +434,7 @@ export type PlaceholderResolverParams = {
baseUrl: string;
read: PlaceholderResolverRead;
resolveUrl: PlaceholderResolverResolveUrl;
- emit: CatalogProcessorEmit;
+ emit: CatalogProcessorEmit_2;
};
// @public (undocumented)
@@ -433,7 +449,28 @@ export type PlaceholderResolverResolveUrl = (
// @public
export type ProcessingIntervalFunction = () => number;
-export { processingResult };
+// @public @deprecated (undocumented)
+export const processingResult: Readonly<{
+ readonly notFoundError: (
+ atLocation: LocationSpec_2,
+ message: string,
+ ) => CatalogProcessorResult_2;
+ readonly inputError: (
+ atLocation: LocationSpec_2,
+ message: string,
+ ) => CatalogProcessorResult_2;
+ readonly generalError: (
+ atLocation: LocationSpec_2,
+ message: string,
+ ) => CatalogProcessorResult_2;
+ readonly location: (newLocation: LocationSpec_2) => CatalogProcessorResult_2;
+ readonly entity: (
+ atLocation: LocationSpec_2,
+ newEntity: Entity,
+ ) => CatalogProcessorResult_2;
+ readonly relation: (spec: EntityRelationSpec_2) => CatalogProcessorResult_2;
+ readonly refresh: (key: string) => CatalogProcessorResult_2;
+}>;
// @public (undocumented)
export type ScmLocationAnalyzer = {
@@ -444,7 +481,7 @@ export type ScmLocationAnalyzer = {
};
// @public (undocumented)
-export class UrlReaderProcessor implements CatalogProcessor {
+export class UrlReaderProcessor implements CatalogProcessor_2 {
constructor(options: { reader: UrlReader; logger: Logger });
// (undocumented)
getProcessorName(): string;
@@ -452,9 +489,9 @@ export class UrlReaderProcessor implements CatalogProcessor {
readLocation(
location: LocationSpec_2,
optional: boolean,
- emit: CatalogProcessorEmit,
- parser: CatalogProcessorParser,
- cache: CatalogProcessorCache,
+ emit: CatalogProcessorEmit_2,
+ parser: CatalogProcessorParser_2,
+ cache: CatalogProcessorCache_2,
): Promise;
}
```
diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json
index 5d221f2f41..35eac97cc1 100644
--- a/plugins/catalog-backend/package.json
+++ b/plugins/catalog-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend",
"description": "The Backstage backend plugin that provides the Backstage catalog",
- "version": "1.8.0-next.1",
+ "version": "1.8.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend/src/deprecated.ts b/plugins/catalog-backend/src/deprecated.ts
new file mode 100644
index 0000000000..c92ec719b7
--- /dev/null
+++ b/plugins/catalog-backend/src/deprecated.ts
@@ -0,0 +1,143 @@
+/*
+ * 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 {
+ locationSpecToMetadataName as _locationSpecToMetadataName,
+ locationSpecToLocationEntity as _locationSpecToLocationEntity,
+ processingResult as _processingResult,
+ type DeferredEntity as _DeferredEntity,
+ type EntityRelationSpec as _EntityRelationSpec,
+ type CatalogProcessor as _CatalogProcessor,
+ type CatalogProcessorParser as _CatalogProcessorParser,
+ type CatalogProcessorCache as _CatalogProcessorCache,
+ type CatalogProcessorEmit as _CatalogProcessorEmit,
+ type CatalogProcessorLocationResult as _CatalogProcessorLocationResult,
+ type CatalogProcessorEntityResult as _CatalogProcessorEntityResult,
+ type CatalogProcessorRelationResult as _CatalogProcessorRelationResult,
+ type CatalogProcessorErrorResult as _CatalogProcessorErrorResult,
+ type CatalogProcessorRefreshKeysResult as _CatalogProcessorRefreshKeysResult,
+ type CatalogProcessorResult as _CatalogProcessorResult,
+ type EntityProvider as _EntityProvider,
+ type EntityProviderConnection as _EntityProviderConnection,
+ type EntityProviderMutation as _EntityProviderMutation,
+} from '@backstage/plugin-catalog-node';
+import { type LocationSpec as _LocationSpec } from '@backstage/plugin-catalog-common';
+
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export const locationSpecToMetadataName = _locationSpecToMetadataName;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export const locationSpecToLocationEntity = _locationSpecToLocationEntity;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export const processingResult = _processingResult;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type DeferredEntity = _DeferredEntity;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type EntityRelationSpec = _EntityRelationSpec;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessor = _CatalogProcessor;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorParser = _CatalogProcessorParser;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorCache = _CatalogProcessorCache;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorEmit = _CatalogProcessorEmit;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorLocationResult = _CatalogProcessorLocationResult;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorEntityResult = _CatalogProcessorEntityResult;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorRelationResult = _CatalogProcessorRelationResult;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorErrorResult = _CatalogProcessorErrorResult;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorRefreshKeysResult =
+ _CatalogProcessorRefreshKeysResult;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type CatalogProcessorResult = _CatalogProcessorResult;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type EntityProvider = _EntityProvider;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type EntityProviderConnection = _EntityProviderConnection;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type EntityProviderMutation = _EntityProviderMutation;
+
+/**
+ * Holds the entity location information.
+ *
+ * @remarks
+ *
+ * `presence` flag: when using repo importer plugin, location is being created before the component yaml file is merged to the main branch.
+ * This flag is then set to indicate that the file can be not present.
+ * default value: 'required'.
+ *
+ * @public
+ * @deprecated use the same type from `@backstage/plugin-catalog-common` instead
+ */
+export type LocationSpec = _LocationSpec;
diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts
index e52336f036..b3d2bc95c7 100644
--- a/plugins/catalog-backend/src/index.ts
+++ b/plugins/catalog-backend/src/index.ts
@@ -20,45 +20,10 @@
* @packageDocumentation
*/
-export type {
- DeferredEntity,
- EntityRelationSpec,
- CatalogProcessor,
- CatalogProcessorParser,
- CatalogProcessorCache,
- CatalogProcessorEmit,
- CatalogProcessorLocationResult,
- CatalogProcessorEntityResult,
- CatalogProcessorRelationResult,
- CatalogProcessorErrorResult,
- CatalogProcessorRefreshKeysResult,
- CatalogProcessorResult,
- EntityProvider,
- EntityProviderConnection,
- EntityProviderMutation,
-} from '@backstage/plugin-catalog-node';
-export { processingResult } from '@backstage/plugin-catalog-node';
-
export * from './catalog';
export * from './ingestion';
export * from './modules';
export * from './processing';
export * from './search';
export * from './service';
-export * from './util';
-
-import { LocationSpec as NonDeprecatedLocationSpec } from '@backstage/plugin-catalog-common';
-
-/**
- * Holds the entity location information.
- *
- * @remarks
- *
- * `presence` flag: when using repo importer plugin, location is being created before the component yaml file is merged to the main branch.
- * This flag is then set to indicate that the file can be not present.
- * default value: 'required'.
- *
- * @public
- * @deprecated use the same type from `@backstage/plugin-catalog-common` instead
- */
-export type LocationSpec = NonDeprecatedLocationSpec;
+export * from './deprecated';
diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md
index 1b30333d89..654672a156 100644
--- a/plugins/catalog-customized/CHANGELOG.md
+++ b/plugins/catalog-customized/CHANGELOG.md
@@ -1,5 +1,13 @@
# @internal/plugin-catalog-customized
+## 0.0.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+
## 0.0.8-next.1
### Patch Changes
diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json
index b0b4b7aba3..20ef38355b 100644
--- a/plugins/catalog-customized/package.json
+++ b/plugins/catalog-customized/package.json
@@ -1,7 +1,7 @@
{
"name": "@internal/plugin-catalog-customized",
"description": "The internal Backstage Customizable plugin for browsing the Backstage catalog",
- "version": "0.0.8-next.1",
+ "version": "0.0.8-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md
index 418ae1f83a..bd0a9d7c76 100644
--- a/plugins/catalog-graph/CHANGELOG.md
+++ b/plugins/catalog-graph/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-catalog-graph
+## 0.2.28-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.28-next.1
### Patch Changes
diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json
index 2947b62b8c..ab7e7e78a9 100644
--- a/plugins/catalog-graph/package.json
+++ b/plugins/catalog-graph/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-graph",
- "version": "0.2.28-next.1",
+ "version": "0.2.28-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md
index d8eac64d15..0451769b82 100644
--- a/plugins/catalog-import/CHANGELOG.md
+++ b/plugins/catalog-import/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-import
+## 0.9.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.9.6-next.1
### Patch Changes
diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json
index 6721a5bbd9..baddab4656 100644
--- a/plugins/catalog-import/package.json
+++ b/plugins/catalog-import/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-import",
"description": "A Backstage plugin the helps you import entities into your catalog",
- "version": "0.9.6-next.1",
+ "version": "0.9.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-import/src/api/CatalogImportClient.test.ts b/plugins/catalog-import/src/api/CatalogImportClient.test.ts
index e77abc8a85..646a3b7bf9 100644
--- a/plugins/catalog-import/src/api/CatalogImportClient.test.ts
+++ b/plugins/catalog-import/src/api/CatalogImportClient.test.ts
@@ -121,7 +121,6 @@ describe('CatalogImportClient', () => {
});
afterEach(() => {
- jest.restoreAllMocks();
jest.clearAllMocks();
});
diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md
index d1b629247f..8ed02981ca 100644
--- a/plugins/catalog-node/CHANGELOG.md
+++ b/plugins/catalog-node/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-catalog-node
+## 1.3.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
## 1.3.4-next.1
### Patch Changes
diff --git a/plugins/catalog-node/api-report.md b/plugins/catalog-node/api-report.md
index 87da0b6944..47a8e66ca9 100644
--- a/plugins/catalog-node/api-report.md
+++ b/plugins/catalog-node/api-report.md
@@ -8,6 +8,7 @@
import { CompoundEntityRef } from '@backstage/catalog-model';
import { Entity } from '@backstage/catalog-model';
import { JsonValue } from '@backstage/types';
+import { LocationEntityV1alpha1 } from '@backstage/catalog-model';
import { LocationSpec as LocationSpec_2 } from '@backstage/plugin-catalog-common';
// @public (undocumented)
@@ -142,6 +143,15 @@ export type EntityRelationSpec = {
// @public @deprecated
export type LocationSpec = LocationSpec_2;
+// @public
+export function locationSpecToLocationEntity(opts: {
+ location: LocationSpec_2;
+ parentEntity?: Entity;
+}): LocationEntityV1alpha1;
+
+// @public
+export function locationSpecToMetadataName(location: LocationSpec_2): string;
+
// @public
export const processingResult: Readonly<{
readonly notFoundError: (
diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json
index 677463c52b..d5ad3b86ea 100644
--- a/plugins/catalog-node/package.json
+++ b/plugins/catalog-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-node",
"description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend",
- "version": "1.3.4-next.1",
+ "version": "1.3.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-node/src/conversion.ts b/plugins/catalog-node/src/conversion.ts
new file mode 100644
index 0000000000..bbaebc7e35
--- /dev/null
+++ b/plugins/catalog-node/src/conversion.ts
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {
+ Entity,
+ LocationEntityV1alpha1,
+ ANNOTATION_LOCATION,
+ ANNOTATION_ORIGIN_LOCATION,
+ stringifyEntityRef,
+ stringifyLocationRef,
+} from '@backstage/catalog-model';
+import { createHash } from 'crypto';
+import { LocationSpec } from '@backstage/plugin-catalog-common';
+
+/**
+ * A standard way of producing a machine generated name for a location.
+ *
+ * @public
+ */
+export function locationSpecToMetadataName(location: LocationSpec) {
+ const hash = createHash('sha1')
+ .update(`${location.type}:${location.target}`)
+ .digest('hex');
+ return `generated-${hash}`;
+}
+
+/**
+ * A standard way of producing a machine generated Location kind entity for a
+ * location.
+ *
+ * @public
+ */
+export function locationSpecToLocationEntity(opts: {
+ location: LocationSpec;
+ parentEntity?: Entity;
+}): LocationEntityV1alpha1 {
+ const location = opts.location;
+ const parentEntity = opts.parentEntity;
+
+ let ownLocation: string;
+ let originLocation: string;
+ if (parentEntity) {
+ const maybeOwnLocation =
+ parentEntity.metadata.annotations?.[ANNOTATION_LOCATION];
+ if (!maybeOwnLocation) {
+ throw new Error(
+ `Parent entity '${stringifyEntityRef(
+ parentEntity,
+ )}' of location '${stringifyLocationRef(
+ location,
+ )}' does not have a location annotation`,
+ );
+ }
+ ownLocation = maybeOwnLocation;
+ const maybeOriginLocation =
+ parentEntity.metadata.annotations?.[ANNOTATION_ORIGIN_LOCATION];
+ if (!maybeOriginLocation) {
+ throw new Error(
+ `Parent entity '${stringifyEntityRef(
+ parentEntity,
+ )}' of location '${stringifyLocationRef(
+ location,
+ )}' does not have an origin location annotation`,
+ );
+ }
+ originLocation = maybeOriginLocation;
+ } else {
+ ownLocation = stringifyLocationRef(location);
+ originLocation = ownLocation;
+ }
+
+ const result: LocationEntityV1alpha1 = {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'Location',
+ metadata: {
+ name: locationSpecToMetadataName(location),
+ annotations: {
+ [ANNOTATION_LOCATION]: ownLocation,
+ [ANNOTATION_ORIGIN_LOCATION]: originLocation,
+ },
+ },
+ spec: {
+ type: location.type,
+ target: location.target,
+ presence: location.presence,
+ },
+ };
+
+ return result;
+}
diff --git a/plugins/catalog-node/src/index.ts b/plugins/catalog-node/src/index.ts
index 6a1accfcbd..2dd8b5fd5a 100644
--- a/plugins/catalog-node/src/index.ts
+++ b/plugins/catalog-node/src/index.ts
@@ -21,4 +21,5 @@
*/
export * from './api';
+export * from './conversion';
export * from './processing';
diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md
index e1b9da465e..4d8acf0936 100644
--- a/plugins/catalog-react/CHANGELOG.md
+++ b/plugins/catalog-react/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-catalog-react
+## 1.4.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/integration@1.4.3-next.0
+
## 1.4.0-next.1
### Patch Changes
diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json
index 81f91374e6..8f0b9627c7 100644
--- a/plugins/catalog-react/package.json
+++ b/plugins/catalog-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-react",
"description": "A frontend library that helps other Backstage plugins interact with the catalog",
- "version": "1.4.0-next.1",
+ "version": "1.4.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md
index 0b3ade1136..873c90de07 100644
--- a/plugins/catalog/CHANGELOG.md
+++ b/plugins/catalog/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-catalog
+## 1.9.0-next.2
+
+### Minor Changes
+
+- 23cc40039c0: allow entity switch to render all cases that match the condition
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+
## 1.9.0-next.1
### Minor Changes
diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json
index c65cfccfaa..c66ae8fb5e 100644
--- a/plugins/catalog/package.json
+++ b/plugins/catalog/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog",
"description": "The Backstage plugin for browsing the Backstage catalog",
- "version": "1.9.0-next.1",
+ "version": "1.9.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx
index 8ee44041c8..13e214d823 100644
--- a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx
+++ b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx
@@ -173,6 +173,42 @@ describe('EntitySwitch', () => {
expect(screen.getByText('C')).toBeInTheDocument();
});
+ it('should render nothing if no default case is set for multiple matches', () => {
+ const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity;
+
+ render(
+
+
+
+ A
} />
+ B} />
+
+
+ ,
+ );
+
+ expect(screen.queryByText('A')).not.toBeInTheDocument();
+ expect(screen.queryByText('B')).not.toBeInTheDocument();
+ });
+
+ it('should render nothing if no default case is set for default', () => {
+ const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity;
+
+ render(
+
+
+
+ A} />
+ B} />
+
+
+ ,
+ );
+
+ expect(screen.queryByText('A')).not.toBeInTheDocument();
+ expect(screen.queryByText('B')).not.toBeInTheDocument();
+ });
+
it('should switch with async condition that is true', async () => {
const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity;
diff --git a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx
index 6ad3c66ab3..3cd806faa5 100644
--- a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx
+++ b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx
@@ -169,7 +169,7 @@ function AsyncEntitySwitch({
}
function getDefaultChildren(results: SwitchCaseResult[]) {
- return results.filter(r => r.if === undefined)[0].children ?? null;
+ return results.filter(r => r.if === undefined)[0]?.children ?? null;
}
EntitySwitch.Case = EntitySwitchCaseComponent;
diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
index dc47a327c0..55ec192258 100644
--- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
+++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-cicd-statistics-module-gitlab
+## 0.1.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-cicd-statistics@0.1.18-next.2
+
## 0.1.12-next.1
### Patch Changes
diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json
index c5b999fefb..38de7c6799 100644
--- a/plugins/cicd-statistics-module-gitlab/package.json
+++ b/plugins/cicd-statistics-module-gitlab/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-cicd-statistics-module-gitlab",
"description": "CI/CD Statistics plugin module; Gitlab CICD",
- "version": "0.1.12-next.1",
+ "version": "0.1.12-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md
index 37deb19ea9..97434f99c7 100644
--- a/plugins/cicd-statistics/CHANGELOG.md
+++ b/plugins/cicd-statistics/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-cicd-statistics
+## 0.1.18-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.18-next.1
### Patch Changes
diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json
index 6078d3a641..8262235489 100644
--- a/plugins/cicd-statistics/package.json
+++ b/plugins/cicd-statistics/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-cicd-statistics",
"description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)",
- "version": "0.1.18-next.1",
+ "version": "0.1.18-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md
index e91f34eb87..c43162fe14 100644
--- a/plugins/circleci/CHANGELOG.md
+++ b/plugins/circleci/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-circleci
+## 0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.16-next.1
### Patch Changes
diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json
index 1ba2a8f7b1..55d02ce8bd 100644
--- a/plugins/circleci/package.json
+++ b/plugins/circleci/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-circleci",
"description": "A Backstage plugin that integrates towards Circle CI",
- "version": "0.3.16-next.1",
+ "version": "0.3.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md
index c5c915d5a4..bc5f71d8e1 100644
--- a/plugins/cloudbuild/CHANGELOG.md
+++ b/plugins/cloudbuild/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-cloudbuild
+## 0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.16-next.1
### Patch Changes
diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json
index f5787447c8..04fa511cb6 100644
--- a/plugins/cloudbuild/package.json
+++ b/plugins/cloudbuild/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-cloudbuild",
"description": "A Backstage plugin that integrates towards Google Cloud Build",
- "version": "0.3.16-next.1",
+ "version": "0.3.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md
index 90a9895eac..e98be293b8 100644
--- a/plugins/code-climate/CHANGELOG.md
+++ b/plugins/code-climate/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-code-climate
+## 0.1.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.16-next.1
### Patch Changes
diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json
index b6c2a04942..9890f8b95e 100644
--- a/plugins/code-climate/package.json
+++ b/plugins/code-climate/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-code-climate",
- "version": "0.1.16-next.1",
+ "version": "0.1.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md
index b425cc02da..74336f32c8 100644
--- a/plugins/code-coverage-backend/CHANGELOG.md
+++ b/plugins/code-coverage-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-code-coverage-backend
+## 0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.2.9-next.1
### Patch Changes
diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json
index 9a060d1f0f..fca52bdebc 100644
--- a/plugins/code-coverage-backend/package.json
+++ b/plugins/code-coverage-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-code-coverage-backend",
"description": "A Backstage backend plugin that helps you keep track of your code coverage",
- "version": "0.2.9-next.1",
+ "version": "0.2.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md
index 73cabd8ca1..914768f638 100644
--- a/plugins/code-coverage/CHANGELOG.md
+++ b/plugins/code-coverage/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-code-coverage
+## 0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.9-next.1
### Patch Changes
diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json
index ae2b03416b..cfdddfc6af 100644
--- a/plugins/code-coverage/package.json
+++ b/plugins/code-coverage/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-code-coverage",
"description": "A Backstage plugin that helps you keep track of your code coverage",
- "version": "0.2.9-next.1",
+ "version": "0.2.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md
index 610487334c..7390729c48 100644
--- a/plugins/codescene/CHANGELOG.md
+++ b/plugins/codescene/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-codescene
+## 0.1.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.11-next.1
### Patch Changes
diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json
index a4b1bf6d75..49cedd3bc4 100644
--- a/plugins/codescene/package.json
+++ b/plugins/codescene/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-codescene",
- "version": "0.1.11-next.1",
+ "version": "0.1.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md
index def33080f2..5e0de80621 100644
--- a/plugins/config-schema/CHANGELOG.md
+++ b/plugins/config-schema/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-config-schema
+## 0.1.39-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.39-next.1
### Patch Changes
diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json
index bb0b43729b..730265cbea 100644
--- a/plugins/config-schema/package.json
+++ b/plugins/config-schema/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-config-schema",
"description": "A Backstage plugin that lets you browse the configuration schema of your app",
- "version": "0.1.39-next.1",
+ "version": "0.1.39-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md
index d673749859..f108804cb6 100644
--- a/plugins/cost-insights/CHANGELOG.md
+++ b/plugins/cost-insights/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-cost-insights
+## 0.12.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.12.5-next.1
### Patch Changes
diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json
index f2a907dfb3..aabd4d340d 100644
--- a/plugins/cost-insights/package.json
+++ b/plugins/cost-insights/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-cost-insights",
"description": "A Backstage plugin that helps you keep track of your cloud spend",
- "version": "0.12.5-next.1",
+ "version": "0.12.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md
index 4949fd5e16..402ee43c1e 100644
--- a/plugins/dynatrace/CHANGELOG.md
+++ b/plugins/dynatrace/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-dynatrace
+## 3.0.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 3.0.0-next.1
### Patch Changes
diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json
index 49c408fff3..c66ef32c7b 100644
--- a/plugins/dynatrace/package.json
+++ b/plugins/dynatrace/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-dynatrace",
- "version": "3.0.0-next.1",
+ "version": "3.0.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md
index f0acfaef30..cac724d7ef 100644
--- a/plugins/entity-feedback-backend/CHANGELOG.md
+++ b/plugins/entity-feedback-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-entity-feedback-backend
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json
index 9ac805295e..b482fdb212 100644
--- a/plugins/entity-feedback-backend/package.json
+++ b/plugins/entity-feedback-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-entity-feedback-backend",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md
index 23016c805f..72cb7b272a 100644
--- a/plugins/entity-feedback/CHANGELOG.md
+++ b/plugins/entity-feedback/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-entity-feedback
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json
index da0bc0b0ca..760b192440 100644
--- a/plugins/entity-feedback/package.json
+++ b/plugins/entity-feedback/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-entity-feedback",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md
index cd37ad05f9..43ecb6527d 100644
--- a/plugins/entity-validation/CHANGELOG.md
+++ b/plugins/entity-validation/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-entity-validation
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json
index 33f0d8fc60..81c13cc46b 100644
--- a/plugins/entity-validation/package.json
+++ b/plugins/entity-validation/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-entity-validation",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md
index e80ae855d6..0e5659c538 100644
--- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md
+++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-events-backend-module-aws-sqs
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-aws-sqs/alpha-api-report.md b/plugins/events-backend-module-aws-sqs/alpha-api-report.md
index b9f60c4437..e48515a414 100644
--- a/plugins/events-backend-module-aws-sqs/alpha-api-report.md
+++ b/plugins/events-backend-module-aws-sqs/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const awsSqsConsumingEventPublisherEventsModule: () => BackendFeature;
+export const eventsModuleAwsSqsConsumingEventPublisher: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json
index 050e13a15f..9278099801 100644
--- a/plugins/events-backend-module-aws-sqs/package.json
+++ b/plugins/events-backend-module-aws-sqs/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-aws-sqs",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-aws-sqs/src/alpha.ts b/plugins/events-backend-module-aws-sqs/src/alpha.ts
index 00f08e4417..4f3ae09c42 100644
--- a/plugins/events-backend-module-aws-sqs/src/alpha.ts
+++ b/plugins/events-backend-module-aws-sqs/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { awsSqsConsumingEventPublisherEventsModule } from './service/AwsSqsConsumingEventPublisherEventsModule';
+export { eventsModuleAwsSqsConsumingEventPublisher } from './service/eventsModuleAwsSqsConsumingEventPublisher';
diff --git a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.test.ts b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts
similarity index 92%
rename from plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.test.ts
rename to plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts
index 3963b9a8b6..921dc38552 100644
--- a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.test.ts
+++ b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts
@@ -20,10 +20,10 @@ import { startTestBackend } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
import { TestEventBroker } from '@backstage/plugin-events-backend-test-utils';
-import { awsSqsConsumingEventPublisherEventsModule } from './AwsSqsConsumingEventPublisherEventsModule';
+import { eventsModuleAwsSqsConsumingEventPublisher } from './eventsModuleAwsSqsConsumingEventPublisher';
import { AwsSqsConsumingEventPublisher } from '../publisher/AwsSqsConsumingEventPublisher';
-describe('awsSqsEventsModule', () => {
+describe('eventsModuleAwsSqsConsumingEventPublisher', () => {
it('should be correctly wired and set up', async () => {
const config = new ConfigReader({
events: {
@@ -68,7 +68,7 @@ describe('awsSqsEventsModule', () => {
[coreServices.logger, getVoidLogger()],
[coreServices.scheduler, scheduler],
],
- features: [awsSqsConsumingEventPublisherEventsModule()],
+ features: [eventsModuleAwsSqsConsumingEventPublisher()],
});
expect(addedPublishers).not.toBeUndefined();
diff --git a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts
similarity index 92%
rename from plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts
rename to plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts
index 4205bd231b..41ae2d80d7 100644
--- a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts
+++ b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts
@@ -27,9 +27,9 @@ import { AwsSqsConsumingEventPublisher } from '../publisher/AwsSqsConsumingEvent
*
* @alpha
*/
-export const awsSqsConsumingEventPublisherEventsModule = createBackendModule({
+export const eventsModuleAwsSqsConsumingEventPublisher = createBackendModule({
pluginId: 'events',
- moduleId: 'awsSqsConsumingEventPublisherEventsModule',
+ moduleId: 'awsSqsConsumingEventPublisher',
register(env) {
env.registerInit({
deps: {
diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md
index df7cfc4aa9..159603d965 100644
--- a/plugins/events-backend-module-azure/CHANGELOG.md
+++ b/plugins/events-backend-module-azure/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-azure
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-azure/alpha-api-report.md b/plugins/events-backend-module-azure/alpha-api-report.md
index e3fed2cab0..1bd568d1df 100644
--- a/plugins/events-backend-module-azure/alpha-api-report.md
+++ b/plugins/events-backend-module-azure/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const azureDevOpsEventRouterEventsModule: () => BackendFeature;
+export const eventsModuleAzureDevOpsEventRouter: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json
index ca0e0e614f..ef00f0f3b9 100644
--- a/plugins/events-backend-module-azure/package.json
+++ b/plugins/events-backend-module-azure/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-azure",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-azure/src/alpha.ts b/plugins/events-backend-module-azure/src/alpha.ts
index 8eacbd8270..07334fcbda 100644
--- a/plugins/events-backend-module-azure/src/alpha.ts
+++ b/plugins/events-backend-module-azure/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { azureDevOpsEventRouterEventsModule } from './service/AzureDevOpsEventRouterEventsModule';
+export { eventsModuleAzureDevOpsEventRouter } from './service/eventsModuleAzureDevOpsEventRouter';
diff --git a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.test.ts b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.test.ts
similarity index 88%
rename from plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.test.ts
rename to plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.test.ts
index dbd61782ae..1ff756a2d2 100644
--- a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.test.ts
+++ b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.test.ts
@@ -16,10 +16,10 @@
import { startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
-import { azureDevOpsEventRouterEventsModule } from './AzureDevOpsEventRouterEventsModule';
+import { eventsModuleAzureDevOpsEventRouter } from './eventsModuleAzureDevOpsEventRouter';
import { AzureDevOpsEventRouter } from '../router/AzureDevOpsEventRouter';
-describe('azureDevOpsEventRouterEventsModule', () => {
+describe('eventsModuleAzureDevOpsEventRouter', () => {
it('should be correctly wired and set up', async () => {
let addedPublisher: AzureDevOpsEventRouter | undefined;
let addedSubscriber: AzureDevOpsEventRouter | undefined;
@@ -35,7 +35,7 @@ describe('azureDevOpsEventRouterEventsModule', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
- features: [azureDevOpsEventRouterEventsModule()],
+ features: [eventsModuleAzureDevOpsEventRouter()],
});
expect(addedPublisher).not.toBeUndefined();
diff --git a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.ts b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.ts
similarity index 95%
rename from plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.ts
rename to plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.ts
index 18851befa4..36f3acada0 100644
--- a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.ts
+++ b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.ts
@@ -25,7 +25,7 @@ import { AzureDevOpsEventRouter } from '../router/AzureDevOpsEventRouter';
*
* @alpha
*/
-export const azureDevOpsEventRouterEventsModule = createBackendModule({
+export const eventsModuleAzureDevOpsEventRouter = createBackendModule({
pluginId: 'events',
moduleId: 'azureDevOpsEventRouter',
register(env) {
diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
index 5f2a679c67..9cf0d0a70e 100644
--- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
+++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-bitbucket-cloud
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md b/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md
index f8e550bf98..5e63ae36c8 100644
--- a/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md
+++ b/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const bitbucketCloudEventRouterEventsModule: () => BackendFeature;
+export const eventsModuleBitbucketCloudEventRouter: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json
index 44849ff0fc..fa7dba892e 100644
--- a/plugins/events-backend-module-bitbucket-cloud/package.json
+++ b/plugins/events-backend-module-bitbucket-cloud/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-bitbucket-cloud",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts b/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts
index e19ff9c9b5..75cda4327d 100644
--- a/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts
+++ b/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { bitbucketCloudEventRouterEventsModule } from './service/BitbucketCloudEventRouterEventsModule';
+export { eventsModuleBitbucketCloudEventRouter } from './service/eventsModuleBitbucketCloudEventRouter';
diff --git a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.test.ts b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.test.ts
similarity index 88%
rename from plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.test.ts
rename to plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.test.ts
index 60ce5b713e..17d2252c7b 100644
--- a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.test.ts
+++ b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.test.ts
@@ -16,10 +16,10 @@
import { startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
-import { bitbucketCloudEventRouterEventsModule } from './BitbucketCloudEventRouterEventsModule';
+import { eventsModuleBitbucketCloudEventRouter } from './eventsModuleBitbucketCloudEventRouter';
import { BitbucketCloudEventRouter } from '../router/BitbucketCloudEventRouter';
-describe('bitbucketCloudEventRouterEventsModule', () => {
+describe('eventsModuleBitbucketCloudEventRouter', () => {
it('should be correctly wired and set up', async () => {
let addedPublisher: BitbucketCloudEventRouter | undefined;
let addedSubscriber: BitbucketCloudEventRouter | undefined;
@@ -35,7 +35,7 @@ describe('bitbucketCloudEventRouterEventsModule', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
- features: [bitbucketCloudEventRouterEventsModule()],
+ features: [eventsModuleBitbucketCloudEventRouter()],
});
expect(addedPublisher).not.toBeUndefined();
diff --git a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.ts b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.ts
similarity index 95%
rename from plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.ts
rename to plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.ts
index 9516651aa3..60a8cc31c8 100644
--- a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.ts
+++ b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.ts
@@ -25,7 +25,7 @@ import { BitbucketCloudEventRouter } from '../router/BitbucketCloudEventRouter';
*
* @alpha
*/
-export const bitbucketCloudEventRouterEventsModule = createBackendModule({
+export const eventsModuleBitbucketCloudEventRouter = createBackendModule({
pluginId: 'events',
moduleId: 'bitbucketCloudEventRouter',
register(env) {
diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md
index 263fe8ac5b..accd659217 100644
--- a/plugins/events-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/events-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-gerrit
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-gerrit/alpha-api-report.md b/plugins/events-backend-module-gerrit/alpha-api-report.md
index f610d518e7..d1be54730f 100644
--- a/plugins/events-backend-module-gerrit/alpha-api-report.md
+++ b/plugins/events-backend-module-gerrit/alpha-api-report.md
@@ -6,7 +6,7 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const gerritEventRouterEventsModule: () => BackendFeature;
+export const eventsModuleGerritEventRouter: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json
index 3a407cb786..de5d104781 100644
--- a/plugins/events-backend-module-gerrit/package.json
+++ b/plugins/events-backend-module-gerrit/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-gerrit",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-gerrit/src/alpha.ts b/plugins/events-backend-module-gerrit/src/alpha.ts
index 26fd89b14d..788331b998 100644
--- a/plugins/events-backend-module-gerrit/src/alpha.ts
+++ b/plugins/events-backend-module-gerrit/src/alpha.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export { gerritEventRouterEventsModule } from './service/GerritEventRouterEventsModule';
+export { eventsModuleGerritEventRouter } from './service/eventsModuleGerritEventRouter';
diff --git a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.test.ts b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.test.ts
similarity index 89%
rename from plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.test.ts
rename to plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.test.ts
index 6a8f4f46ff..88ef995966 100644
--- a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.test.ts
+++ b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.test.ts
@@ -16,10 +16,10 @@
import { startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
-import { gerritEventRouterEventsModule } from './GerritEventRouterEventsModule';
+import { eventsModuleGerritEventRouter } from './eventsModuleGerritEventRouter';
import { GerritEventRouter } from '../router/GerritEventRouter';
-describe('gerritEventRouterEventsModule', () => {
+describe('eventsModuleGerritEventRouter', () => {
it('should be correctly wired and set up', async () => {
let addedPublisher: GerritEventRouter | undefined;
let addedSubscriber: GerritEventRouter | undefined;
@@ -35,7 +35,7 @@ describe('gerritEventRouterEventsModule', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
- features: [gerritEventRouterEventsModule()],
+ features: [eventsModuleGerritEventRouter()],
});
expect(addedPublisher).not.toBeUndefined();
diff --git a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.ts b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.ts
similarity index 95%
rename from plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.ts
rename to plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.ts
index 31f5c9b384..8d490ea0b2 100644
--- a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.ts
+++ b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.ts
@@ -25,7 +25,7 @@ import { GerritEventRouter } from '../router/GerritEventRouter';
*
* @alpha
*/
-export const gerritEventRouterEventsModule = createBackendModule({
+export const eventsModuleGerritEventRouter = createBackendModule({
pluginId: 'events',
moduleId: 'gerritEventRouter',
register(env) {
diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md
index ca28508b5c..b531c5db52 100644
--- a/plugins/events-backend-module-github/CHANGELOG.md
+++ b/plugins/events-backend-module-github/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-events-backend-module-github
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-github/alpha-api-report.md b/plugins/events-backend-module-github/alpha-api-report.md
index cb95928b17..c233df8634 100644
--- a/plugins/events-backend-module-github/alpha-api-report.md
+++ b/plugins/events-backend-module-github/alpha-api-report.md
@@ -6,10 +6,10 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const githubEventRouterEventsModule: () => BackendFeature;
+export const eventsModuleGithubEventRouter: () => BackendFeature;
// @alpha
-export const githubWebhookEventsModule: () => BackendFeature;
+export const eventsModuleGithubWebhook: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json
index e19f5a66e1..4a010f5841 100644
--- a/plugins/events-backend-module-github/package.json
+++ b/plugins/events-backend-module-github/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-github",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-github/src/alpha.ts b/plugins/events-backend-module-github/src/alpha.ts
index 8a712cacb1..2db8e9d9aa 100644
--- a/plugins/events-backend-module-github/src/alpha.ts
+++ b/plugins/events-backend-module-github/src/alpha.ts
@@ -14,5 +14,5 @@
* limitations under the License.
*/
-export { githubEventRouterEventsModule } from './service/GithubEventRouterEventsModule';
-export { githubWebhookEventsModule } from './service/GithubWebhookEventsModule';
+export { eventsModuleGithubEventRouter } from './service/eventsModuleGithubEventRouter';
+export { eventsModuleGithubWebhook } from './service/eventsModuleGithubWebhook';
diff --git a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.test.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.test.ts
similarity index 89%
rename from plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.test.ts
rename to plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.test.ts
index 0e2ca69366..bfa186c7bc 100644
--- a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.test.ts
+++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.test.ts
@@ -16,10 +16,10 @@
import { startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
-import { githubEventRouterEventsModule } from './GithubEventRouterEventsModule';
+import { eventsModuleGithubEventRouter } from './eventsModuleGithubEventRouter';
import { GithubEventRouter } from '../router/GithubEventRouter';
-describe('githubEventRouterEventsModule', () => {
+describe('eventsModuleGithubEventRouter', () => {
it('should be correctly wired and set up', async () => {
let addedPublisher: GithubEventRouter | undefined;
let addedSubscriber: GithubEventRouter | undefined;
@@ -35,7 +35,7 @@ describe('githubEventRouterEventsModule', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
- features: [githubEventRouterEventsModule()],
+ features: [eventsModuleGithubEventRouter()],
});
expect(addedPublisher).not.toBeUndefined();
diff --git a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.ts
similarity index 95%
rename from plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.ts
rename to plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.ts
index 56cc571763..17485098c2 100644
--- a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.ts
+++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.ts
@@ -25,7 +25,7 @@ import { GithubEventRouter } from '../router/GithubEventRouter';
*
* @alpha
*/
-export const githubEventRouterEventsModule = createBackendModule({
+export const eventsModuleGithubEventRouter = createBackendModule({
pluginId: 'events',
moduleId: 'githubEventRouter',
register(env) {
diff --git a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts
similarity index 94%
rename from plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts
rename to plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts
index 9e33cac6a0..b8a252aaba 100644
--- a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts
+++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts
@@ -23,9 +23,9 @@ import {
RequestDetails,
} from '@backstage/plugin-events-node';
import { sign } from '@octokit/webhooks-methods';
-import { githubWebhookEventsModule } from './GithubWebhookEventsModule';
+import { eventsModuleGithubWebhook } from './eventsModuleGithubWebhook';
-describe('githubWebhookEventsModule', () => {
+describe('eventsModuleGithubWebhook', () => {
const secret = 'valid-secret';
const payload = { test: 'payload' };
const payloadString = JSON.stringify(payload);
@@ -60,7 +60,7 @@ describe('githubWebhookEventsModule', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [[coreServices.config, config]],
- features: [githubWebhookEventsModule()],
+ features: [eventsModuleGithubWebhook()],
});
expect(addedIngress).not.toBeUndefined();
diff --git a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts
similarity index 95%
rename from plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts
rename to plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts
index 10cb12e431..7e89ceead7 100644
--- a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts
+++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts
@@ -28,7 +28,7 @@ import { createGithubSignatureValidator } from '../http/createGithubSignatureVal
*
* @alpha
*/
-export const githubWebhookEventsModule = createBackendModule({
+export const eventsModuleGithubWebhook = createBackendModule({
pluginId: 'events',
moduleId: 'githubWebhook',
register(env) {
diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md
index ea0787ca23..f992585219 100644
--- a/plugins/events-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/events-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-events-backend-module-gitlab
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-gitlab/alpha-api-report.md b/plugins/events-backend-module-gitlab/alpha-api-report.md
index 64727cc844..bf61f66a4b 100644
--- a/plugins/events-backend-module-gitlab/alpha-api-report.md
+++ b/plugins/events-backend-module-gitlab/alpha-api-report.md
@@ -6,10 +6,10 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
// @alpha
-export const gitlabEventRouterEventsModule: () => BackendFeature;
+export const eventsModuleGitlabEventRouter: () => BackendFeature;
// @alpha
-export const gitlabWebhookEventsModule: () => BackendFeature;
+export const eventsModuleGitlabWebhook: () => BackendFeature;
// (No @packageDocumentation comment for this package)
```
diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json
index 4e9510ad80..917f9fdb89 100644
--- a/plugins/events-backend-module-gitlab/package.json
+++ b/plugins/events-backend-module-gitlab/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-gitlab",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-gitlab/src/alpha.ts b/plugins/events-backend-module-gitlab/src/alpha.ts
index 357c9f81ce..65610af96c 100644
--- a/plugins/events-backend-module-gitlab/src/alpha.ts
+++ b/plugins/events-backend-module-gitlab/src/alpha.ts
@@ -14,5 +14,5 @@
* limitations under the License.
*/
-export { gitlabEventRouterEventsModule } from './service/GitlabEventRouterEventsModule';
-export { gitlabWebhookEventsModule } from './service/GitlabWebhookEventsModule';
+export { eventsModuleGitlabEventRouter } from './service/eventsModuleGitlabEventRouter';
+export { eventsModuleGitlabWebhook } from './service/eventsModuleGitlabWebhook';
diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.test.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.test.ts
similarity index 89%
rename from plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.test.ts
rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.test.ts
index f8b03bc0f3..86a0df6e68 100644
--- a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.test.ts
+++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.test.ts
@@ -16,10 +16,10 @@
import { startTestBackend } from '@backstage/backend-test-utils';
import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha';
-import { gitlabEventRouterEventsModule } from './GitlabEventRouterEventsModule';
+import { eventsModuleGitlabEventRouter } from './eventsModuleGitlabEventRouter';
import { GitlabEventRouter } from '../router/GitlabEventRouter';
-describe('gitlabEventRouterEventsModule', () => {
+describe('eventsModuleGitlabEventRouter', () => {
it('should be correctly wired and set up', async () => {
let addedPublisher: GitlabEventRouter | undefined;
let addedSubscriber: GitlabEventRouter | undefined;
@@ -35,7 +35,7 @@ describe('gitlabEventRouterEventsModule', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [],
- features: [gitlabEventRouterEventsModule()],
+ features: [eventsModuleGitlabEventRouter()],
});
expect(addedPublisher).not.toBeUndefined();
diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.ts
similarity index 95%
rename from plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.ts
rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.ts
index 39ccd5cd60..3425601529 100644
--- a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.ts
+++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.ts
@@ -25,7 +25,7 @@ import { GitlabEventRouter } from '../router/GitlabEventRouter';
*
* @alpha
*/
-export const gitlabEventRouterEventsModule = createBackendModule({
+export const eventsModuleGitlabEventRouter = createBackendModule({
pluginId: 'events',
moduleId: 'gitlabEventRouter',
register(env) {
diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts
similarity index 95%
rename from plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts
rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts
index b42f2c474e..c38233ecfd 100644
--- a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts
+++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts
@@ -22,7 +22,7 @@ import {
HttpPostIngressOptions,
RequestDetails,
} from '@backstage/plugin-events-node';
-import { gitlabWebhookEventsModule } from './GitlabWebhookEventsModule';
+import { eventsModuleGitlabWebhook } from './eventsModuleGitlabWebhook';
describe('gitlabWebhookEventsModule', () => {
const requestWithToken = (token?: string) => {
@@ -55,7 +55,7 @@ describe('gitlabWebhookEventsModule', () => {
await startTestBackend({
extensionPoints: [[eventsExtensionPoint, extensionPoint]],
services: [[coreServices.config, config]],
- features: [gitlabWebhookEventsModule()],
+ features: [eventsModuleGitlabWebhook()],
});
expect(addedIngress).not.toBeUndefined();
diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts
similarity index 95%
rename from plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts
rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts
index c20e55caa9..0933ef342a 100644
--- a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts
+++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts
@@ -30,7 +30,7 @@ import { createGitlabTokenValidator } from '../http/createGitlabTokenValidator';
*
* @alpha
*/
-export const gitlabWebhookEventsModule = createBackendModule({
+export const eventsModuleGitlabWebhook = createBackendModule({
pluginId: 'events',
moduleId: 'gitlabWebhook',
register(env) {
diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md
index 73b92152bd..aaf14aa68b 100644
--- a/plugins/events-backend-test-utils/CHANGELOG.md
+++ b/plugins/events-backend-test-utils/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-events-backend-test-utils
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.2.4-next.2
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json
index 115645436b..67d6671497 100644
--- a/plugins/events-backend-test-utils/package.json
+++ b/plugins/events-backend-test-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-events-backend-test-utils",
"description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md
index 9d78dc77c1..82fb0c6fc1 100644
--- a/plugins/events-backend/CHANGELOG.md
+++ b/plugins/events-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-events-backend
+## 0.2.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-events-node@0.2.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/events-backend/README.md b/plugins/events-backend/README.md
index cef8ac7330..cf89f389b2 100644
--- a/plugins/events-backend/README.md
+++ b/plugins/events-backend/README.md
@@ -186,9 +186,9 @@ import { eventsExtensionPoint } from '@backstage/plugin-events-node';
// [...]
-export const yourModuleEventsModule = createBackendModule({
+export const eventsModuleYourFeature = createBackendModule({
pluginId: 'events',
- moduleId: 'yourModule',
+ moduleId: 'yourFeature',
register(env) {
// [...]
env.registerInit({
diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json
index 6e4b1684e5..4a51e56b6a 100644
--- a/plugins/events-backend/package.json
+++ b/plugins/events-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend",
- "version": "0.2.4-next.1",
+ "version": "0.2.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md
index 0e1853b101..a19d9badc2 100644
--- a/plugins/events-node/CHANGELOG.md
+++ b/plugins/events-node/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-events-node
+## 0.2.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json
index bd473abaa7..76eb1b2bf3 100644
--- a/plugins/events-node/package.json
+++ b/plugins/events-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-events-node",
"description": "The plugin-events-node module for @backstage/plugin-events-backend",
- "version": "0.2.4-next.1",
+ "version": "0.2.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md
index 628d6e419d..edde9b9d54 100644
--- a/plugins/example-todo-list-backend/CHANGELOG.md
+++ b/plugins/example-todo-list-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @internal/plugin-todo-list-backend
+## 1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.0.11-next.1
### Patch Changes
diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json
index 562bbc0c7f..5579f748b2 100644
--- a/plugins/example-todo-list-backend/package.json
+++ b/plugins/example-todo-list-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@internal/plugin-todo-list-backend",
- "version": "1.0.11-next.1",
+ "version": "1.0.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md
index 281928f88a..4739ab303e 100644
--- a/plugins/example-todo-list/CHANGELOG.md
+++ b/plugins/example-todo-list/CHANGELOG.md
@@ -1,5 +1,13 @@
# @internal/plugin-todo-list
+## 1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 1.0.11-next.1
### Patch Changes
diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json
index b572bfc215..a7366ce36f 100644
--- a/plugins/example-todo-list/package.json
+++ b/plugins/example-todo-list/package.json
@@ -1,6 +1,6 @@
{
"name": "@internal/plugin-todo-list",
- "version": "1.0.11-next.1",
+ "version": "1.0.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md
index bb9023f693..7874062954 100644
--- a/plugins/explore-backend/CHANGELOG.md
+++ b/plugins/explore-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-explore-backend
+## 0.0.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.0.5-next.1
### Patch Changes
diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json
index f16954ad47..dbdab19329 100644
--- a/plugins/explore-backend/package.json
+++ b/plugins/explore-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-explore-backend",
- "version": "0.0.5-next.1",
+ "version": "0.0.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md
index 135369b215..1f68752e6e 100644
--- a/plugins/explore-react/CHANGELOG.md
+++ b/plugins/explore-react/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-explore-react
+## 0.0.27-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.0.27-next.1
### Patch Changes
diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json
index 26d5b8465c..6bb7ad5f0a 100644
--- a/plugins/explore-react/package.json
+++ b/plugins/explore-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-explore-react",
"description": "A frontend library for Backstage plugins that want to interact with the explore plugin",
- "version": "0.0.27-next.1",
+ "version": "0.0.27-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md
index 8942e1f286..72d93cf927 100644
--- a/plugins/explore/CHANGELOG.md
+++ b/plugins/explore/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-explore
+## 0.4.1-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-explore-react@0.0.27-next.2
+
## 0.4.1-next.1
### Patch Changes
diff --git a/plugins/explore/package.json b/plugins/explore/package.json
index 15d642af77..c91671c816 100644
--- a/plugins/explore/package.json
+++ b/plugins/explore/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-explore",
"description": "A Backstage plugin for building an exploration page of your software ecosystem",
- "version": "0.4.1-next.1",
+ "version": "0.4.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md
index 81e7c9b7c7..1fbf09d8d4 100644
--- a/plugins/firehydrant/CHANGELOG.md
+++ b/plugins/firehydrant/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-firehydrant
+## 0.1.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.33-next.1
### Patch Changes
diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json
index 3f4b86a192..293679c2ea 100644
--- a/plugins/firehydrant/package.json
+++ b/plugins/firehydrant/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-firehydrant",
"description": "A Backstage plugin that integrates towards FireHydrant",
- "version": "0.1.33-next.1",
+ "version": "0.1.33-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md
index ec2b669edb..af439b6fd0 100644
--- a/plugins/fossa/CHANGELOG.md
+++ b/plugins/fossa/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-fossa
+## 0.2.48-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.48-next.1
### Patch Changes
diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json
index ff2d936880..1135c76bb1 100644
--- a/plugins/fossa/package.json
+++ b/plugins/fossa/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-fossa",
"description": "A Backstage plugin that integrates towards FOSSA",
- "version": "0.2.48-next.1",
+ "version": "0.2.48-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md
index 0f3c21ee25..2460deb73c 100644
--- a/plugins/gcalendar/CHANGELOG.md
+++ b/plugins/gcalendar/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-gcalendar
+## 0.3.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.12-next.1
### Patch Changes
diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json
index fc0c8961f5..83471340b8 100644
--- a/plugins/gcalendar/package.json
+++ b/plugins/gcalendar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-gcalendar",
- "version": "0.3.12-next.1",
+ "version": "0.3.12-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md
index 3857a37d0f..ecb3ec60fc 100644
--- a/plugins/gcp-projects/CHANGELOG.md
+++ b/plugins/gcp-projects/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-gcp-projects
+## 0.3.35-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.35-next.1
### Patch Changes
diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json
index e62870eb11..1029b37cd0 100644
--- a/plugins/gcp-projects/package.json
+++ b/plugins/gcp-projects/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-gcp-projects",
"description": "A Backstage plugin that helps you manage projects in GCP",
- "version": "0.3.35-next.1",
+ "version": "0.3.35-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md
index 52b1bfe29e..c97568b076 100644
--- a/plugins/git-release-manager/CHANGELOG.md
+++ b/plugins/git-release-manager/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-git-release-manager
+## 0.3.29-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
## 0.3.29-next.1
### Patch Changes
diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json
index ce2577c7b9..0c9507bc24 100644
--- a/plugins/git-release-manager/package.json
+++ b/plugins/git-release-manager/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-git-release-manager",
"description": "A Backstage plugin that helps you manage releases in git",
- "version": "0.3.29-next.1",
+ "version": "0.3.29-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md
index 112d5ff49f..ffec353673 100644
--- a/plugins/github-actions/CHANGELOG.md
+++ b/plugins/github-actions/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-github-actions
+## 0.5.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
## 0.5.16-next.1
### Patch Changes
diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json
index 6d8103b349..d26249218e 100644
--- a/plugins/github-actions/package.json
+++ b/plugins/github-actions/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-github-actions",
"description": "A Backstage plugin that integrates towards GitHub Actions",
- "version": "0.5.16-next.1",
+ "version": "0.5.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md
index 3aa2e656bc..cc8c6a838e 100644
--- a/plugins/github-deployments/CHANGELOG.md
+++ b/plugins/github-deployments/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-github-deployments
+## 0.1.47-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.47-next.1
### Patch Changes
diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json
index 2c93cf3bc4..f9019b5029 100644
--- a/plugins/github-deployments/package.json
+++ b/plugins/github-deployments/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-github-deployments",
"description": "A Backstage plugin that integrates towards GitHub Deployments",
- "version": "0.1.47-next.1",
+ "version": "0.1.47-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md
index 6a4910e4af..5a440a28f3 100644
--- a/plugins/github-issues/CHANGELOG.md
+++ b/plugins/github-issues/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-github-issues
+## 0.2.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
## 0.2.5-next.1
### Patch Changes
diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json
index 6192130475..83e457a606 100644
--- a/plugins/github-issues/package.json
+++ b/plugins/github-issues/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-github-issues",
- "version": "0.2.5-next.1",
+ "version": "0.2.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md
index 38abb67517..ae15428eed 100644
--- a/plugins/github-pull-requests-board/CHANGELOG.md
+++ b/plugins/github-pull-requests-board/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-github-pull-requests-board
+## 0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json
index 5872f0608d..ff5393988b 100644
--- a/plugins/github-pull-requests-board/package.json
+++ b/plugins/github-pull-requests-board/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-github-pull-requests-board",
"description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team",
- "version": "0.1.10-next.1",
+ "version": "0.1.10-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md
index a276f24d9e..8522e1e16c 100644
--- a/plugins/gitops-profiles/CHANGELOG.md
+++ b/plugins/gitops-profiles/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-gitops-profiles
+## 0.3.34-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.34-next.1
### Patch Changes
diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json
index c12c487f24..291b73b308 100644
--- a/plugins/gitops-profiles/package.json
+++ b/plugins/gitops-profiles/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-gitops-profiles",
"description": "A Backstage plugin that helps you manage GitOps profiles",
- "version": "0.3.34-next.1",
+ "version": "0.3.34-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md
index 68cdfced64..71d7aa3af0 100644
--- a/plugins/gocd/CHANGELOG.md
+++ b/plugins/gocd/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-gocd
+## 0.1.22-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.22-next.1
### Patch Changes
diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json
index 9f1f299d29..f9789ffde4 100644
--- a/plugins/gocd/package.json
+++ b/plugins/gocd/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-gocd",
"description": "A Backstage plugin that integrates towards GoCD",
- "version": "0.1.22-next.1",
+ "version": "0.1.22-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md
index 85e7cf021d..f110d7b813 100644
--- a/plugins/graphiql/CHANGELOG.md
+++ b/plugins/graphiql/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-graphiql
+## 0.2.48-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.48-next.1
### Patch Changes
diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json
index 27a1ad7e07..a608ecb8db 100644
--- a/plugins/graphiql/package.json
+++ b/plugins/graphiql/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-graphiql",
"description": "Backstage plugin for browsing GraphQL APIs",
- "version": "0.2.48-next.1",
+ "version": "0.2.48-next.2",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md
index 79405f2635..0ab0918031 100644
--- a/plugins/graphql-backend/CHANGELOG.md
+++ b/plugins/graphql-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-graphql-backend
+## 0.1.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/plugin-catalog-graphql@0.3.19-next.1
+
## 0.1.33-next.1
### Patch Changes
diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json
index 5293a2dbcb..401119b052 100644
--- a/plugins/graphql-backend/package.json
+++ b/plugins/graphql-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-graphql-backend",
"description": "An experimental Backstage backend plugin for GraphQL",
- "version": "0.1.33-next.1",
+ "version": "0.1.33-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md
index 556bff7f8a..982dfec9dc 100644
--- a/plugins/graphql-voyager/CHANGELOG.md
+++ b/plugins/graphql-voyager/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-graphql-voyager
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json
index cfaf9bb449..5d2b809bb3 100644
--- a/plugins/graphql-voyager/package.json
+++ b/plugins/graphql-voyager/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-graphql-voyager",
"description": "Backstage plugin for GraphQL Voyager",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md
index cbab27bfd6..51552a0135 100644
--- a/plugins/home/CHANGELOG.md
+++ b/plugins/home/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-home
+## 0.4.32-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.4.32-next.1
### Patch Changes
diff --git a/plugins/home/package.json b/plugins/home/package.json
index 1c1d7da24d..2957625478 100644
--- a/plugins/home/package.json
+++ b/plugins/home/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-home",
"description": "A Backstage plugin that helps you build a home page",
- "version": "0.4.32-next.1",
+ "version": "0.4.32-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md
index 9b672bb3ab..e3d63efd71 100644
--- a/plugins/ilert/CHANGELOG.md
+++ b/plugins/ilert/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-ilert
+## 0.2.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.5-next.1
### Patch Changes
diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json
index ccfc5dbc3a..cc8183d6cb 100644
--- a/plugins/ilert/package.json
+++ b/plugins/ilert/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-ilert",
"description": "A Backstage plugin that integrates towards iLert",
- "version": "0.2.5-next.1",
+ "version": "0.2.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md
index 787e930973..f18f75d0a4 100644
--- a/plugins/jenkins-backend/CHANGELOG.md
+++ b/plugins/jenkins-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-jenkins-backend
+## 0.1.33-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.33-next.1
### Patch Changes
diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json
index 6228f6e83e..daf5073792 100644
--- a/plugins/jenkins-backend/package.json
+++ b/plugins/jenkins-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-jenkins-backend",
"description": "A Backstage backend plugin that integrates towards Jenkins",
- "version": "0.1.33-next.1",
+ "version": "0.1.33-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md
index 098d3154c4..fe8f1e2d13 100644
--- a/plugins/jenkins/CHANGELOG.md
+++ b/plugins/jenkins/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-jenkins
+## 0.7.15-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.7.15-next.1
### Patch Changes
diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json
index 59c3d92f6c..204d88db60 100644
--- a/plugins/jenkins/package.json
+++ b/plugins/jenkins/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-jenkins",
"description": "A Backstage plugin that integrates towards Jenkins",
- "version": "0.7.15-next.1",
+ "version": "0.7.15-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md
index 02c498e3fe..92bcf3de3f 100644
--- a/plugins/kafka-backend/CHANGELOG.md
+++ b/plugins/kafka-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-kafka-backend
+## 0.2.36-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.36-next.1
### Patch Changes
diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json
index 61e32c8177..38b1f60fcb 100644
--- a/plugins/kafka-backend/package.json
+++ b/plugins/kafka-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-kafka-backend",
"description": "A Backstage backend plugin that integrates towards Kafka",
- "version": "0.2.36-next.1",
+ "version": "0.2.36-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md
index d55d1f74ec..1706f206e7 100644
--- a/plugins/kafka/CHANGELOG.md
+++ b/plugins/kafka/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-kafka
+## 0.3.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.3.16-next.1
### Patch Changes
diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json
index 04cb3c0da0..017c14881a 100644
--- a/plugins/kafka/package.json
+++ b/plugins/kafka/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-kafka",
"description": "A Backstage plugin that integrates towards Kafka",
- "version": "0.3.16-next.1",
+ "version": "0.3.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md
index a502089e13..ac1287f8aa 100644
--- a/plugins/kubernetes-backend/CHANGELOG.md
+++ b/plugins/kubernetes-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-kubernetes-backend
+## 0.9.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.9.4-next.1
### Patch Changes
diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json
index 3e45bed285..ee7844c76e 100644
--- a/plugins/kubernetes-backend/package.json
+++ b/plugins/kubernetes-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-kubernetes-backend",
"description": "A Backstage backend plugin that integrates towards Kubernetes",
- "version": "0.9.4-next.1",
+ "version": "0.9.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md
index ea6a7f0732..05929a7d46 100644
--- a/plugins/kubernetes/CHANGELOG.md
+++ b/plugins/kubernetes/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-kubernetes
+## 0.7.9-next.2
+
+### Patch Changes
+
+- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.7.9-next.1
### Patch Changes
diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json
index 39d4cfdec6..ed806ee521 100644
--- a/plugins/kubernetes/package.json
+++ b/plugins/kubernetes/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-kubernetes",
"description": "A Backstage plugin that integrates towards Kubernetes",
- "version": "0.7.9-next.1",
+ "version": "0.7.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes/src/plugin.ts b/plugins/kubernetes/src/plugin.ts
index 124bff831b..e2b13f43fe 100644
--- a/plugins/kubernetes/src/plugin.ts
+++ b/plugins/kubernetes/src/plugin.ts
@@ -23,6 +23,7 @@ import {
createRouteRef,
discoveryApiRef,
identityApiRef,
+ gitlabAuthApiRef,
googleAuthApiRef,
microsoftAuthApiRef,
oktaAuthApiRef,
@@ -49,18 +50,21 @@ export const kubernetesPlugin = createPlugin({
createApiFactory({
api: kubernetesAuthProvidersApiRef,
deps: {
+ gitlabAuthApi: gitlabAuthApiRef,
googleAuthApi: googleAuthApiRef,
microsoftAuthApi: microsoftAuthApiRef,
oktaAuthApi: oktaAuthApiRef,
oneloginAuthApi: oneloginAuthApiRef,
},
factory: ({
+ gitlabAuthApi,
googleAuthApi,
microsoftAuthApi,
oktaAuthApi,
oneloginAuthApi,
}) => {
const oidcProviders = {
+ gitlab: gitlabAuthApi,
google: googleAuthApi,
microsoft: microsoftAuthApi,
okta: oktaAuthApi,
diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md
index 9eac651564..0caf949bd6 100644
--- a/plugins/lighthouse-backend/CHANGELOG.md
+++ b/plugins/lighthouse-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-lighthouse-backend
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json
index cb70cc6746..7fa51b3446 100644
--- a/plugins/lighthouse-backend/package.json
+++ b/plugins/lighthouse-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-lighthouse-backend",
"description": "Backend functionalities for lighthouse",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md
index 219a59b025..f326707dfa 100644
--- a/plugins/lighthouse/CHANGELOG.md
+++ b/plugins/lighthouse/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-lighthouse
+## 0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.4.1-next.1
### Patch Changes
diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json
index 6928c32e6a..3fcb24986d 100644
--- a/plugins/lighthouse/package.json
+++ b/plugins/lighthouse/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-lighthouse",
"description": "A Backstage plugin that integrates towards Lighthouse",
- "version": "0.4.1-next.1",
+ "version": "0.4.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md
index c7ea736e5a..ac922c735b 100644
--- a/plugins/linguist-backend/CHANGELOG.md
+++ b/plugins/linguist-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-linguist-backend
+## 0.2.0-next.2
+
+### Patch Changes
+
+- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API).
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.0-next.1
### Patch Changes
diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json
index 15d4496bc8..01c4f12afa 100644
--- a/plugins/linguist-backend/package.json
+++ b/plugins/linguist-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-linguist-backend",
- "version": "0.2.0-next.1",
+ "version": "0.2.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md
index 471fbf4042..3d83855122 100644
--- a/plugins/linguist/CHANGELOG.md
+++ b/plugins/linguist/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-linguist
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json
index a26813a1b4..276bb81574 100644
--- a/plugins/linguist/package.json
+++ b/plugins/linguist/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-linguist",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md
index 6347b1bcf7..69a93bc320 100644
--- a/plugins/microsoft-calendar/CHANGELOG.md
+++ b/plugins/microsoft-calendar/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-microsoft-calendar
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json
index 04f466598e..8d20a5de70 100644
--- a/plugins/microsoft-calendar/package.json
+++ b/plugins/microsoft-calendar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-microsoft-calendar",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md
index 0cf1afb2f6..93b27ba385 100644
--- a/plugins/newrelic-dashboard/CHANGELOG.md
+++ b/plugins/newrelic-dashboard/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-newrelic-dashboard
+## 0.2.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.9-next.1
### Patch Changes
diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json
index 93b3af02d0..9958741b5f 100644
--- a/plugins/newrelic-dashboard/package.json
+++ b/plugins/newrelic-dashboard/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-newrelic-dashboard",
- "version": "0.2.9-next.1",
+ "version": "0.2.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md
index 4c319caeed..bd0ef0d06f 100644
--- a/plugins/newrelic/CHANGELOG.md
+++ b/plugins/newrelic/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-newrelic
+## 0.3.34-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.34-next.1
### Patch Changes
diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json
index bacfc2e2f1..3ad74b3949 100644
--- a/plugins/newrelic/package.json
+++ b/plugins/newrelic/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-newrelic",
"description": "A Backstage plugin that integrates towards New Relic",
- "version": "0.3.34-next.1",
+ "version": "0.3.34-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md
index a9020f76c3..a3743722b8 100644
--- a/plugins/octopus-deploy/CHANGELOG.md
+++ b/plugins/octopus-deploy/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-octopus-deploy
+## 0.1.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.0-next.1
### Patch Changes
diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json
index c5cdf1fed4..9ba86f1587 100644
--- a/plugins/octopus-deploy/package.json
+++ b/plugins/octopus-deploy/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-octopus-deploy",
- "version": "0.1.0-next.1",
+ "version": "0.1.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md
index c67228c438..cb59276110 100644
--- a/plugins/org-react/CHANGELOG.md
+++ b/plugins/org-react/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-org-react
+## 0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.5-next.1
### Patch Changes
diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json
index 853ba7058d..a2e6623523 100644
--- a/plugins/org-react/package.json
+++ b/plugins/org-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-org-react",
- "version": "0.1.5-next.1",
+ "version": "0.1.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md
index 15cb675035..4728f8be20 100644
--- a/plugins/org/CHANGELOG.md
+++ b/plugins/org/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-org
+## 0.6.6-next.2
+
+### Patch Changes
+
+- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text.
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.6.6-next.1
### Patch Changes
diff --git a/plugins/org/package.json b/plugins/org/package.json
index 08cadc11db..bd7ea9a344 100644
--- a/plugins/org/package.json
+++ b/plugins/org/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-org",
"description": "A Backstage plugin that helps you create entity pages for your organization",
- "version": "0.6.6-next.1",
+ "version": "0.6.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md
index e6e2519fba..37189de162 100644
--- a/plugins/pagerduty/CHANGELOG.md
+++ b/plugins/pagerduty/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-pagerduty
+## 0.5.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.5.9-next.1
### Patch Changes
diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json
index 9f57e8bfcd..0ae7623240 100644
--- a/plugins/pagerduty/package.json
+++ b/plugins/pagerduty/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-pagerduty",
"description": "A Backstage plugin that integrates towards PagerDuty",
- "version": "0.5.9-next.1",
+ "version": "0.5.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md
index 79c9e4c931..aa43870b1d 100644
--- a/plugins/periskop-backend/CHANGELOG.md
+++ b/plugins/periskop-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-periskop-backend
+## 0.1.14-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.14-next.1
### Patch Changes
diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json
index bc72277f12..11e38bcd36 100644
--- a/plugins/periskop-backend/package.json
+++ b/plugins/periskop-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-periskop-backend",
- "version": "0.1.14-next.1",
+ "version": "0.1.14-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md
index 6be9142f0e..d41640b55c 100644
--- a/plugins/periskop/CHANGELOG.md
+++ b/plugins/periskop/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-periskop
+## 0.1.14-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.14-next.1
### Patch Changes
diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json
index 06d5827ebe..1e7ca292d1 100644
--- a/plugins/periskop/package.json
+++ b/plugins/periskop/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-periskop",
- "version": "0.1.14-next.1",
+ "version": "0.1.14-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md
index d9062aa03f..a55c711386 100644
--- a/plugins/permission-backend/CHANGELOG.md
+++ b/plugins/permission-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-permission-backend
+## 0.5.18-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.5.18-next.1
### Patch Changes
diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json
index 734e8c63b0..a7202c9672 100644
--- a/plugins/permission-backend/package.json
+++ b/plugins/permission-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-permission-backend",
- "version": "0.5.18-next.1",
+ "version": "0.5.18-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md
index c9c0fc5005..59052c2184 100644
--- a/plugins/permission-node/CHANGELOG.md
+++ b/plugins/permission-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-permission-node
+## 0.7.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.7.6-next.1
### Patch Changes
diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json
index 1a9dacffa0..92c0a7685a 100644
--- a/plugins/permission-node/package.json
+++ b/plugins/permission-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-permission-node",
"description": "Common permission and authorization utilities for backend plugins",
- "version": "0.7.6-next.1",
+ "version": "0.7.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md
index ce5346c846..31832e9a83 100644
--- a/plugins/permission-react/CHANGELOG.md
+++ b/plugins/permission-react/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-permission-react
+## 0.4.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.4.11-next.1
### Patch Changes
diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json
index f904830280..1d5d0713b7 100644
--- a/plugins/permission-react/package.json
+++ b/plugins/permission-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-permission-react",
- "version": "0.4.11-next.1",
+ "version": "0.4.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md
index 7ababd2832..da2697188a 100644
--- a/plugins/playlist-backend/CHANGELOG.md
+++ b/plugins/playlist-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-playlist-backend
+## 0.2.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.6-next.1
### Patch Changes
diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json
index 990a651ccb..2d868b950a 100644
--- a/plugins/playlist-backend/package.json
+++ b/plugins/playlist-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-playlist-backend",
- "version": "0.2.6-next.1",
+ "version": "0.2.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md
index 450fc880f2..bc0263fd00 100644
--- a/plugins/playlist/CHANGELOG.md
+++ b/plugins/playlist/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-playlist
+## 0.1.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+
## 0.1.7-next.1
### Patch Changes
diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json
index 18faa09cc8..445171f9b8 100644
--- a/plugins/playlist/package.json
+++ b/plugins/playlist/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-playlist",
- "version": "0.1.7-next.1",
+ "version": "0.1.7-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md
index dc5562369c..8b649c44de 100644
--- a/plugins/proxy-backend/CHANGELOG.md
+++ b/plugins/proxy-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-proxy-backend
+## 0.2.37-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.37-next.1
### Patch Changes
diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json
index 72bbef0750..a7d320c37c 100644
--- a/plugins/proxy-backend/package.json
+++ b/plugins/proxy-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-proxy-backend",
"description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend",
- "version": "0.2.37-next.1",
+ "version": "0.2.37-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts
index b669e82f3f..6912965659 100644
--- a/plugins/proxy-backend/src/service/router.ts
+++ b/plugins/proxy-backend/src/service/router.ts
@@ -121,6 +121,11 @@ export function buildMiddleware(
// Attach the logger to the proxy config
fullConfig.logProvider = () => logger;
+ // http-proxy-middleware uses this log level to check if it should log the
+ // requests that it proxies. Setting this to the most verbose log level
+ // ensures that it always logs these requests. Our logger ends up deciding
+ // if the logs are displayed or not.
+ fullConfig.logLevel = 'debug';
// Only return the allowed HTTP headers to not forward unwanted secret headers
const requestHeaderAllowList = new Set(
diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md
index 2e1a515b5d..edda54dcd1 100644
--- a/plugins/rollbar-backend/CHANGELOG.md
+++ b/plugins/rollbar-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-rollbar-backend
+## 0.1.40-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.40-next.1
### Patch Changes
diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json
index 1fcb4d288b..31d802dece 100644
--- a/plugins/rollbar-backend/package.json
+++ b/plugins/rollbar-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-rollbar-backend",
"description": "A Backstage backend plugin that integrates towards Rollbar",
- "version": "0.1.40-next.1",
+ "version": "0.1.40-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md
index df90e7f8bf..943db21cce 100644
--- a/plugins/rollbar/CHANGELOG.md
+++ b/plugins/rollbar/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-rollbar
+## 0.4.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.4.16-next.1
### Patch Changes
diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json
index ff4e1d3539..a3189c147d 100644
--- a/plugins/rollbar/package.json
+++ b/plugins/rollbar/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-rollbar",
"description": "A Backstage plugin that integrates towards Rollbar",
- "version": "0.4.16-next.1",
+ "version": "0.4.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
index e7a96b1596..2dcb0eb279 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-scaffolder-backend-module-cookiecutter
+## 0.2.18-next.2
+
+### Patch Changes
+
+- 62414770ead: allow container runner to be undefined in cookiecutter plugin
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.2.18-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-cookiecutter/README.md b/plugins/scaffolder-backend-module-cookiecutter/README.md
index ae34e09c96..0e8e11ef7d 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/README.md
+++ b/plugins/scaffolder-backend-module-cookiecutter/README.md
@@ -161,3 +161,5 @@ You can do so by including the following lines in the last step of your Dockerfi
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 install cookiecutter
```
+
+In this case, you don't have to include `containerRunner` in the action configuration.
diff --git a/plugins/scaffolder-backend-module-cookiecutter/api-report.md b/plugins/scaffolder-backend-module-cookiecutter/api-report.md
index 76f2ced66f..2944f5240e 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/api-report.md
+++ b/plugins/scaffolder-backend-module-cookiecutter/api-report.md
@@ -15,7 +15,7 @@ import { UrlReader } from '@backstage/backend-common';
export function createFetchCookiecutterAction(options: {
reader: UrlReader;
integrations: ScmIntegrations;
- containerRunner: ContainerRunner;
+ containerRunner?: ContainerRunner;
}): TemplateAction<{
url: string;
targetPath?: string | undefined;
diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json
index e0f2368664..373320191a 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/package.json
+++ b/plugins/scaffolder-backend-module-cookiecutter/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-cookiecutter",
"description": "A module for the scaffolder backend that lets you template projects using cookiecutter",
- "version": "0.2.18-next.1",
+ "version": "0.2.18-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts
index f8b049f95f..9d7f06afc8 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts
+++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts
@@ -223,4 +223,16 @@ describe('fetch:cookiecutter', () => {
}),
);
});
+
+ it('should throw error if cookiecutter is not installed and containerRunner is undefined', async () => {
+ commandExists.mockResolvedValue(false);
+ const ccAction = createFetchCookiecutterAction({
+ integrations,
+ reader: mockReader,
+ });
+
+ await expect(ccAction.handler(mockContext)).rejects.toThrow(
+ /Invalid state: containerRunner cannot be undefined when cookiecutter is not installed/,
+ );
+ });
});
diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts
index 5c69b9dce2..b63a044a20 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts
+++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts
@@ -33,9 +33,9 @@ import {
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
export class CookiecutterRunner {
- private readonly containerRunner: ContainerRunner;
+ private readonly containerRunner?: ContainerRunner;
- constructor({ containerRunner }: { containerRunner: ContainerRunner }) {
+ constructor({ containerRunner }: { containerRunner?: ContainerRunner }) {
this.containerRunner = containerRunner;
}
@@ -101,6 +101,11 @@ export class CookiecutterRunner {
logStream,
});
} else {
+ if (this.containerRunner === undefined) {
+ throw new Error(
+ 'Invalid state: containerRunner cannot be undefined when cookiecutter is not installed',
+ );
+ }
await this.containerRunner.runContainer({
imageName: imageName ?? 'spotify/backstage-cookiecutter',
command: 'cookiecutter',
@@ -139,7 +144,7 @@ export class CookiecutterRunner {
export function createFetchCookiecutterAction(options: {
reader: UrlReader;
integrations: ScmIntegrations;
- containerRunner: ContainerRunner;
+ containerRunner?: ContainerRunner;
}) {
const { reader, containerRunner, integrations } = options;
diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md
index e816de1aa9..5c7fb1dc2d 100644
--- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-scaffolder-backend-module-rails
+## 0.4.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.12.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.4.11-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json
index 2ba80b2e32..be9d053340 100644
--- a/plugins/scaffolder-backend-module-rails/package.json
+++ b/plugins/scaffolder-backend-module-rails/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-rails",
"description": "A module for the scaffolder backend that lets you template projects using Rails",
- "version": "0.4.11-next.1",
+ "version": "0.4.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts
index 56f85d002e..37d0bcac4a 100644
--- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts
+++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts
@@ -91,7 +91,7 @@ describe('fetch:rails', () => {
beforeEach(() => {
mockFs({ [`${mockContext.workspacePath}/result`]: {} });
- jest.restoreAllMocks();
+ jest.clearAllMocks();
});
afterEach(() => {
diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md
index e804b6c33b..ae6d8734c9 100644
--- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-scaffolder-backend-module-sentry
+## 0.1.3-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.3-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json
index acd7030e29..36f5139b28 100644
--- a/plugins/scaffolder-backend-module-sentry/package.json
+++ b/plugins/scaffolder-backend-module-sentry/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-sentry",
- "version": "0.1.3-next.1",
+ "version": "0.1.3-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
index 786a2d1f2b..e87cf64167 100644
--- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-scaffolder-backend-module-yeoman
+## 0.2.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.16-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json
index 82651cf781..01ba3f5eea 100644
--- a/plugins/scaffolder-backend-module-yeoman/package.json
+++ b/plugins/scaffolder-backend-module-yeoman/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-yeoman",
- "version": "0.2.16-next.1",
+ "version": "0.2.16-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md
index 2ffbda38db..65a827797f 100644
--- a/plugins/scaffolder-backend/CHANGELOG.md
+++ b/plugins/scaffolder-backend/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-scaffolder-backend
+## 1.12.0-next.2
+
+### Patch Changes
+
+- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token
+- 65454876fb2: Minor API report tweaks
+- 9968f455921: catalog write action should allow any shape of object
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-backend@1.8.0-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/plugin-scaffolder-node@0.1.1-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 1.12.0-next.1
### Minor Changes
diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md
index ca9b3543af..e0f7ddb441 100644
--- a/plugins/scaffolder-backend/api-report.md
+++ b/plugins/scaffolder-backend/api-report.md
@@ -11,9 +11,11 @@ import { CatalogProcessor } from '@backstage/plugin-catalog-backend';
import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend';
import { Config } from '@backstage/config';
import { createPullRequest } from 'octokit-plugin-create-pull-request';
+import { Duration } from 'luxon';
import { Entity } from '@backstage/catalog-model';
import express from 'express';
import { GithubCredentialsProvider } from '@backstage/integration';
+import { HumanDuration } from '@backstage/types';
import { IdentityApi } from '@backstage/plugin-auth-node';
import { JsonObject } from '@backstage/types';
import { JsonValue } from '@backstage/types';
@@ -527,6 +529,11 @@ export const createTemplateAction: <
action: TemplateActionOptions,
) => TemplateAction_2;
+// @public
+export function createWaitAction(options?: {
+ maxWaitTime?: Duration | HumanDuration;
+}): TemplateAction_2;
+
// @public
export type CreateWorkerOptions = {
taskBroker: TaskBroker;
@@ -549,6 +556,14 @@ export interface CurrentClaimedTask {
// @public
export class DatabaseTaskStore implements TaskStore {
+ // (undocumented)
+ cancelTask(
+ options: TaskStoreEmitOptions<
+ {
+ message: string;
+ } & JsonObject
+ >,
+ ): Promise;
// (undocumented)
claimTask(): Promise;
// (undocumented)
@@ -693,6 +708,8 @@ export type SerializedTaskEvent = {
// @public
export interface TaskBroker {
+ // (undocumented)
+ cancel?(taskId: string): Promise;
// (undocumented)
claim(): Promise;
// (undocumented)
@@ -730,6 +747,8 @@ export type TaskCompletionState = 'failed' | 'completed';
// @public
export interface TaskContext {
+ // (undocumented)
+ cancelSignal: AbortSignal;
// (undocumented)
complete(result: TaskCompletionState, metadata?: JsonObject): Promise;
// (undocumented)
@@ -749,16 +768,19 @@ export interface TaskContext {
}
// @public
-export type TaskEventType = 'completion' | 'log';
+export type TaskEventType = 'completion' | 'log' | 'cancelled';
// @public
export class TaskManager implements TaskContext {
+ // (undocumented)
+ get cancelSignal(): AbortSignal;
// (undocumented)
complete(result: TaskCompletionState, metadata?: JsonObject): Promise;
// (undocumented)
static create(
task: CurrentClaimedTask,
storage: TaskStore,
+ abortSignal: AbortSignal,
logger: Logger,
): TaskManager;
// (undocumented)
@@ -780,14 +802,16 @@ export type TaskSecrets = TaskSecrets_2;
// @public
export type TaskStatus =
- | 'open'
- | 'processing'
- | 'failed'
| 'cancelled'
- | 'completed';
+ | 'completed'
+ | 'failed'
+ | 'open'
+ | 'processing';
// @public
export interface TaskStore {
+ // (undocumented)
+ cancelTask?(options: TaskStoreEmitOptions): Promise;
// (undocumented)
claimTask(): Promise;
// (undocumented)
diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json
index bc4ecb8bf9..e27f3ecead 100644
--- a/plugins/scaffolder-backend/package.json
+++ b/plugins/scaffolder-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-scaffolder-backend",
"description": "The Backstage backend plugin that helps you create new things",
- "version": "1.12.0-next.1",
+ "version": "1.12.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -64,6 +64,7 @@
"@gitbeaker/node": "^35.1.0",
"@octokit/webhooks": "^10.0.0",
"@types/express": "^4.17.6",
+ "@types/luxon": "^3.0.0",
"azure-devops-node-api": "^11.0.1",
"command-exists": "^1.2.9",
"compression": "^1.7.4",
@@ -109,6 +110,7 @@
"mock-fs": "^5.1.0",
"msw": "^1.0.0",
"supertest": "^6.1.3",
+ "wait-for-expect": "^3.0.2",
"yaml": "^2.0.0"
},
"files": [
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts
index aaaf504833..9e823d2574 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts
@@ -70,6 +70,7 @@ export function createCatalogWriteAction() {
// TODO: this should reference an zod entity validator if it existed.
entity: z
.object({})
+ .passthrough()
.describe(
'You can provide the same values used in the Entity schema.',
),
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts
index 9ba4a27b1a..d4c8de3604 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts
@@ -30,7 +30,7 @@ import {
} from './catalog';
import { TemplateFilter, TemplateGlobal } from '../../../lib';
-import { createDebugLogAction } from './debug';
+import { createDebugLogAction, createWaitAction } from './debug';
import { createFetchPlainAction, createFetchTemplateAction } from './fetch';
import {
createFilesystemDeleteAction,
@@ -159,6 +159,7 @@ export const createBuiltinActions = (
config,
}),
createDebugLogAction(),
+ createWaitAction(),
createCatalogRegisterAction({ catalogClient, integrations }),
createFetchCatalogEntityAction({ catalogClient }),
createCatalogWriteAction(),
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts
index 8cc50a7eba..3776ce7f03 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts
@@ -15,3 +15,4 @@
*/
export { createDebugLogAction } from './log';
+export { createWaitAction } from './wait';
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts
new file mode 100644
index 0000000000..0d4cdaba4b
--- /dev/null
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { getVoidLogger } from '@backstage/backend-common';
+import mockFs from 'mock-fs';
+import { createWaitAction } from './wait';
+import { Writable } from 'stream';
+import os from 'os';
+
+describe('debug:wait', () => {
+ const action = createWaitAction();
+
+ const logStream = {
+ write: jest.fn(),
+ } as jest.Mocked> as jest.Mocked;
+
+ const mockTmpDir = os.tmpdir();
+ const mockContext = {
+ input: {},
+ baseUrl: 'somebase',
+ workspacePath: mockTmpDir,
+ logger: getVoidLogger(),
+ logStream,
+ output: jest.fn(),
+ createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir),
+ };
+
+ beforeEach(() => {
+ jest.resetAllMocks();
+ });
+
+ afterEach(() => {
+ mockFs.restore();
+ });
+
+ it('should wait for specified period of time', async () => {
+ const context = {
+ ...mockContext,
+ input: {
+ milliseconds: 50,
+ },
+ };
+ const start = new Date().getTime();
+ await action.handler(context);
+ const end = new Date().getTime();
+ expect(end - start).toBeGreaterThanOrEqual(50);
+ });
+
+ it('should not allow to set waiting time longer than the max waiting time', async () => {
+ const context = {
+ ...mockContext,
+ input: {
+ minutes: 11,
+ },
+ };
+
+ await expect(async () => {
+ await action.handler(context);
+ }).rejects.toThrow(
+ 'Waiting duration is longer than the maximum threshold of 0 hours, 0 minutes, 30 seconds',
+ );
+ });
+});
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts
new file mode 100644
index 0000000000..02cab239cb
--- /dev/null
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
+import { HumanDuration } from '@backstage/types';
+import yaml from 'yaml';
+import { Duration } from 'luxon';
+
+const id = 'debug:wait';
+
+const MAX_WAIT_TIME_IN_ISO = 'T00:00:30';
+
+const examples = [
+ {
+ description: 'Waiting for 5 seconds',
+ example: yaml.stringify({
+ steps: [
+ {
+ action: id,
+ id: 'wait-5sec',
+ name: 'Waiting for 5 seconds',
+ input: {
+ seconds: 5,
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description: 'Waiting for 5 minutes',
+ example: yaml.stringify({
+ steps: [
+ {
+ action: id,
+ id: 'wait-5min',
+ name: 'Waiting for 5 minutes',
+ input: {
+ minutes: 5,
+ },
+ },
+ ],
+ }),
+ },
+];
+
+/**
+ * Waits for a certain period of time.
+ *
+ * @remarks
+ *
+ * This task is useful to give some waiting time for manual intervention.
+ * Has to be used in a combination with other actions.
+ *
+ * @public
+ */
+export function createWaitAction(options?: {
+ maxWaitTime?: Duration | HumanDuration;
+}) {
+ const toDuration = (
+ maxWaitTime: Duration | HumanDuration | undefined,
+ ): Duration => {
+ if (maxWaitTime) {
+ if (maxWaitTime instanceof Duration) {
+ return maxWaitTime;
+ }
+ return Duration.fromObject(maxWaitTime);
+ }
+ return Duration.fromISOTime(MAX_WAIT_TIME_IN_ISO);
+ };
+
+ return createTemplateAction({
+ id,
+ description: 'Waits for a certain period of time.',
+ examples,
+ schema: {
+ input: {
+ type: 'object',
+ properties: {
+ minutes: {
+ title: 'Waiting period in minutes.',
+ type: 'number',
+ },
+ seconds: {
+ title: 'Waiting period in seconds.',
+ type: 'number',
+ },
+ milliseconds: {
+ title: 'Waiting period in milliseconds.',
+ type: 'number',
+ },
+ },
+ },
+ },
+ async handler(ctx) {
+ const delayTime = Duration.fromObject(ctx.input);
+ const maxWait = toDuration(options?.maxWaitTime);
+
+ if (delayTime.minus(maxWait).toMillis() > 0) {
+ throw new Error(
+ `Waiting duration is longer than the maximum threshold of ${maxWait.toHuman()}`,
+ );
+ }
+
+ await new Promise(resolve => {
+ const controller = new AbortController();
+ const timeoutHandle = setTimeout(abort, delayTime.toMillis());
+ ctx.signal?.addEventListener('abort', abort);
+
+ function abort() {
+ ctx.signal?.removeEventListener('abort', abort);
+ clearTimeout(timeoutHandle!);
+ controller.abort();
+ resolve('finished');
+ }
+ });
+ },
+ });
+}
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts
index 2d2775572f..a2262c1f9f 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts
@@ -62,7 +62,7 @@ describe('publish:azure', () => {
(WebApi as unknown as jest.Mock).mockImplementation(() => mockGitApi);
beforeEach(() => {
- jest.restoreAllMocks();
+ jest.clearAllMocks();
});
it('should throw an error when the repoUrl is not well formed', async () => {
@@ -183,7 +183,12 @@ describe('publish:azure', () => {
id: '709e891c-dee7-4f91-b963-534713c0737f',
}));
- await action.handler(mockContext);
+ await action.handler({
+ ...mockContext,
+ input: {
+ repoUrl: 'dev.azure.com?repo=bob&owner=owner&organization=org',
+ },
+ });
expect(WebApi).toHaveBeenCalledWith(
'https://dev.azure.com/org',
@@ -234,7 +239,7 @@ describe('publish:azure', () => {
expect(initRepoAndPush).toHaveBeenCalledWith({
dir: mockContext.workspacePath,
remoteUrl: 'https://dev.azure.com/organization/project/_git/repo',
- defaultBranch: 'master',
+ defaultBranch: 'main',
auth: { username: 'notempty', password: 'tokenlols' },
logger: mockContext.logger,
commitMessage: 'initial commit',
diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts
index 1929e3b8ac..d9302f4d74 100644
--- a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts
@@ -25,7 +25,7 @@ import {
SerializedFile,
serializeDirectoryContents,
} from '../../lib/files';
-import { TemplateFilter, TemplateGlobal } from '../../lib/templating';
+import { TemplateFilter, TemplateGlobal } from '../../lib';
import { TemplateActionRegistry } from '../actions';
import { NunjucksWorkflowRunner } from '../tasks/NunjucksWorkflowRunner';
import { DecoratedActionsRegistry } from './DecoratedActionsRegistry';
@@ -94,6 +94,8 @@ export function createDryRunner(options: TemplateTesterCreateOptions) {
try {
await deserializeDirectoryContents(contentsPath, input.directoryContents);
+ const abortSignal = new AbortController().signal;
+
const result = await workflowRunner.execute({
spec: {
...input.spec,
@@ -117,6 +119,7 @@ export function createDryRunner(options: TemplateTesterCreateOptions) {
done: false,
isDryRun: true,
getWorkspaceName: async () => `dry-run-${dryRunId}`,
+ cancelSignal: abortSignal,
async emitLog(message: string, logMetadata?: JsonObject) {
if (logMetadata?.stepId === dryRunId) {
return;
@@ -128,7 +131,7 @@ export function createDryRunner(options: TemplateTesterCreateOptions) {
},
});
},
- async complete() {
+ complete: async () => {
throw new Error('Not implemented');
},
});
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts
new file mode 100644
index 0000000000..4c0eb94c82
--- /dev/null
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { DatabaseManager } from '@backstage/backend-common';
+import { ConfigReader } from '@backstage/config';
+import { DatabaseTaskStore } from './DatabaseTaskStore';
+import { TaskSpec } from '@backstage/plugin-scaffolder-common';
+import { ConflictError } from '@backstage/errors';
+
+const createStore = async () => {
+ const manager = DatabaseManager.fromConfig(
+ new ConfigReader({
+ backend: {
+ database: {
+ client: 'better-sqlite3',
+ connection: ':memory:',
+ },
+ },
+ }),
+ ).forPlugin('scaffolder');
+ const store = await DatabaseTaskStore.create({
+ database: manager,
+ });
+ return { store, manager };
+};
+
+describe('DatabaseTaskStore', () => {
+ it('should create the database store and run migration', async () => {
+ const { store, manager } = await createStore();
+ expect(store).toBeDefined();
+
+ const client = await manager.getClient();
+ expect(client.schema.hasTable('tasks')).toBeTruthy();
+ expect(client.schema.hasTable('task_events')).toBeTruthy();
+ });
+
+ it('should list all created tasks', async () => {
+ const { store } = await createStore();
+ await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+
+ const { tasks } = await store.list({});
+ expect(tasks.length).toBe(1);
+ expect(tasks[0].createdBy).toBe('me');
+ expect(tasks[0].status).toBe('open');
+ expect(tasks[0].id).toBeDefined();
+ });
+
+ it('should list filtered created tasks by createdBy', async () => {
+ const { store } = await createStore();
+
+ await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+
+ await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'him',
+ });
+
+ const { tasks } = await store.list({ createdBy: 'him' });
+ expect(tasks.length).toBe(1);
+ expect(tasks[0].createdBy).toBe('him');
+ expect(tasks[0].status).toBe('open');
+ expect(tasks[0].id).toBeDefined();
+ });
+
+ it('should sent an event to start cancelling the task', async () => {
+ const { store } = await createStore();
+
+ const { taskId } = await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+ const task = await store.getTask(taskId);
+ expect(task.status).toBe('open');
+
+ await store.cancelTask({
+ taskId,
+ body: {
+ message: `Step 2 has been cancelled.`,
+ stepId: 2,
+ status: 'cancelled',
+ },
+ });
+
+ const { events } = await store.listEvents({ taskId });
+ const event = events[0];
+ expect(event.taskId).toBe(taskId);
+ expect(event.body.status).toBe('cancelled');
+ });
+
+ it('should emit a log event', async () => {
+ const { store } = await createStore();
+ const { taskId } = await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+ await store.emitLogEvent({
+ taskId,
+ body: {
+ message: 'Step #2 failed',
+ stepId: 2,
+ status: 'failed',
+ },
+ });
+ const { events } = await store.listEvents({ taskId });
+ const event = events[0];
+ expect(event.taskId).toBe(taskId);
+ expect(event.body.status).toBe('failed');
+ expect(event.type).toBe('log');
+ });
+
+ it('should complete the task', async () => {
+ const { store } = await createStore();
+ const { taskId } = await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+ const task = await store.getTask(taskId);
+ expect(task.status).toBe('open');
+
+ const message = `This task was marked as stale as it exceeded its timeout`;
+ await store.completeTask({
+ taskId,
+ status: 'cancelled',
+ eventBody: { message },
+ });
+
+ const taskAfterCompletion = await store.getTask(taskId);
+ expect(taskAfterCompletion.status).toBe('cancelled');
+ });
+
+ it('should claim a new task', async () => {
+ const { store } = await createStore();
+ const { taskId } = await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+ const task = await store.getTask(taskId);
+ expect(task.status).toBe('open');
+ await store.claimTask();
+
+ const claimedTask = await store.getTask(taskId);
+ expect(claimedTask.status).toBe('processing');
+ });
+
+ it('should shutdown the running task', async () => {
+ const { store } = await createStore();
+ const { taskId } = await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+ const task = await store.getTask(taskId);
+ expect(task.status).toBe('open');
+ await store.claimTask();
+ await store.shutdownTask({ taskId });
+
+ const claimedTask = await store.getTask(taskId);
+ expect(claimedTask.status).toBe('failed');
+ });
+
+ it('should be not possible to shutdown not running task', async () => {
+ const { store } = await createStore();
+ const { taskId } = await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+ const task = await store.getTask(taskId);
+ expect(task.status).toBe('open');
+ await expect(async () => {
+ await store.shutdownTask({ taskId });
+ }).rejects.toThrow(ConflictError);
+ });
+});
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts
index 879b457544..f3cb9b645e 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts
@@ -220,7 +220,7 @@ export class DatabaseTaskStore implements TaskStore {
.update({
status: 'processing',
last_heartbeat_at: this.db.fn.now(),
- // remove the secrets when moving moving to processing state.
+ // remove the secrets when moving to processing state.
secrets: null,
});
@@ -287,13 +287,14 @@ export class DatabaseTaskStore implements TaskStore {
const { taskId, status, eventBody } = options;
let oldStatus: string;
- if (status === 'failed' || status === 'completed') {
+ if (['failed', 'completed', 'cancelled'].includes(status)) {
oldStatus = 'processing';
} else {
throw new Error(
`Invalid status update of run '${taskId}' to status '${status}'`,
);
}
+
await this.db.transaction(async tx => {
const [task] = await tx('tasks')
.where({
@@ -302,6 +303,40 @@ export class DatabaseTaskStore implements TaskStore {
.limit(1)
.select();
+ const updateTask = async (criteria: {
+ id: string;
+ status?: TaskStatus;
+ }) => {
+ const updateCount = await tx('tasks')
+ .where(criteria)
+ .update({
+ status,
+ });
+
+ if (updateCount !== 1) {
+ throw new ConflictError(
+ `Failed to update status to '${status}' for taskId ${taskId}`,
+ );
+ }
+
+ await tx('task_events').insert({
+ task_id: taskId,
+ event_type: 'completion',
+ body: JSON.stringify(eventBody),
+ });
+ };
+
+ if (status === 'cancelled') {
+ await updateTask({
+ id: taskId,
+ });
+ return;
+ }
+
+ if (task.status === 'cancelled') {
+ return;
+ }
+
if (!task) {
throw new Error(`No task with taskId ${taskId} found`);
}
@@ -311,25 +346,10 @@ export class DatabaseTaskStore implements TaskStore {
`as it is currently '${task.status}', expected '${oldStatus}'`,
);
}
- const updateCount = await tx('tasks')
- .where({
- id: taskId,
- status: oldStatus,
- })
- .update({
- status,
- });
- if (updateCount !== 1) {
- throw new ConflictError(
- `Failed to update status to '${status}' for taskId ${taskId}`,
- );
- }
-
- await tx('task_events').insert({
- task_id: taskId,
- event_type: 'completion',
- body: JSON.stringify(eventBody),
+ await updateTask({
+ id: taskId,
+ status: oldStatus,
});
});
}
@@ -419,4 +439,16 @@ export class DatabaseTaskStore implements TaskStore {
},
});
}
+
+ async cancelTask(
+ options: TaskStoreEmitOptions<{ message: string } & JsonObject>,
+ ): Promise {
+ const { taskId, body } = options;
+ const serializedBody = JSON.stringify(body);
+ await this.db('task_events').insert({
+ task_id: taskId,
+ event_type: 'cancelled',
+ body: serializedBody,
+ });
+ }
}
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts
index 0d2246ed36..3b6ec54249 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts
@@ -70,6 +70,7 @@ describe('DefaultWorkflowRunner', () => {
complete: async () => {},
done: false,
emitLog: async () => {},
+ cancelSignal: new AbortController().signal,
getWorkspaceName: () => Promise.resolve('test-workspace'),
});
@@ -166,7 +167,7 @@ describe('DefaultWorkflowRunner', () => {
});
await expect(runner.execute(task)).rejects.toThrow(
- /Invalid input passed to action jest-validated-action, instance requires property \"foo\"/,
+ /Invalid input passed to action jest-validated-action, instance requires property "foo"/,
);
});
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts
index 88abe05cad..629c730d48 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts
@@ -15,7 +15,12 @@
*/
import { ScmIntegrations } from '@backstage/integration';
-import { TaskContext, WorkflowResponse, WorkflowRunner } from './types';
+import {
+ TaskContext,
+ TaskTrackType,
+ WorkflowResponse,
+ WorkflowRunner,
+} from './types';
import * as winston from 'winston';
import fs from 'fs-extra';
import path from 'path';
@@ -99,6 +104,7 @@ const createStepLogger = ({
export class NunjucksWorkflowRunner implements WorkflowRunner {
constructor(private readonly options: NunjucksWorkflowRunnerOptions) {}
+
private readonly tracker = scaffoldingTracker();
private isSingleTemplateString(input: string) {
@@ -180,6 +186,138 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
});
}
+ async executeStep(
+ task: TaskContext,
+ step: TaskStep,
+ context: TemplateContext,
+ renderTemplate: (template: string, values: unknown) => string,
+ taskTrack: TaskTrackType,
+ workspacePath: string,
+ ) {
+ const stepTrack = await this.tracker.stepStart(task, step);
+
+ if (task.cancelSignal.aborted) {
+ throw new Error(`Step ${step.name} has been cancelled.`);
+ }
+
+ try {
+ if (step.if) {
+ const ifResult = await this.render(step.if, context, renderTemplate);
+ if (!isTruthy(ifResult)) {
+ await stepTrack.skipFalsy();
+ return;
+ }
+ }
+
+ const action: TemplateAction =
+ this.options.actionRegistry.get(step.action);
+ const { taskLogger, streamLogger } = createStepLogger({ task, step });
+
+ if (task.isDryRun) {
+ const redactedSecrets = Object.fromEntries(
+ Object.entries(task.secrets ?? {}).map(secret => [
+ secret[0],
+ '[REDACTED]',
+ ]),
+ );
+ const debugInput =
+ (step.input &&
+ this.render(
+ step.input,
+ {
+ ...context,
+ secrets: redactedSecrets,
+ },
+ renderTemplate,
+ )) ??
+ {};
+ taskLogger.info(
+ `Running ${
+ action.id
+ } in dry-run mode with inputs (secrets redacted): ${JSON.stringify(
+ debugInput,
+ undefined,
+ 2,
+ )}`,
+ );
+ if (!action.supportsDryRun) {
+ await taskTrack.skipDryRun(step, action);
+ const outputSchema = action.schema?.output;
+ if (outputSchema) {
+ context.steps[step.id] = {
+ output: generateExampleOutput(outputSchema) as {
+ [name in string]: JsonValue;
+ },
+ };
+ } else {
+ context.steps[step.id] = { output: {} };
+ }
+ return;
+ }
+ }
+
+ // Secrets are only passed when templating the input to actions for security reasons
+ const input =
+ (step.input &&
+ this.render(
+ step.input,
+ { ...context, secrets: task.secrets ?? {} },
+ renderTemplate,
+ )) ??
+ {};
+
+ if (action.schema?.input) {
+ const validateResult = validateJsonSchema(input, action.schema.input);
+ if (!validateResult.valid) {
+ const errors = validateResult.errors.join(', ');
+ throw new InputError(
+ `Invalid input passed to action ${action.id}, ${errors}`,
+ );
+ }
+ }
+
+ const tmpDirs = new Array();
+ const stepOutput: { [outputName: string]: JsonValue } = {};
+
+ await action.handler({
+ input,
+ secrets: task.secrets ?? {},
+ logger: taskLogger,
+ logStream: streamLogger,
+ workspacePath,
+ createTemporaryDirectory: async () => {
+ const tmpDir = await fs.mkdtemp(`${workspacePath}_step-${step.id}-`);
+ tmpDirs.push(tmpDir);
+ return tmpDir;
+ },
+ output(name: string, value: JsonValue) {
+ stepOutput[name] = value;
+ },
+ templateInfo: task.spec.templateInfo,
+ user: task.spec.user,
+ isDryRun: task.isDryRun,
+ signal: task.cancelSignal,
+ });
+
+ // Remove all temporary directories that were created when executing the action
+ for (const tmpDir of tmpDirs) {
+ await fs.remove(tmpDir);
+ }
+
+ context.steps[step.id] = { output: stepOutput };
+
+ if (task.cancelSignal.aborted) {
+ throw new Error(`Step ${step.name} has been cancelled.`);
+ }
+
+ await stepTrack.markSuccessful();
+ } catch (err) {
+ await taskTrack.markFailed(step, err);
+ await stepTrack.markFailed();
+ throw err;
+ }
+ }
+
async execute(task: TaskContext): Promise {
if (!isValidTaskSpec(task.spec)) {
throw new InputError(
@@ -191,7 +329,12 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
await task.getWorkspaceName(),
);
- const { integrations } = this.options;
+ const {
+ additionalTemplateFilters,
+ additionalTemplateGlobals,
+ integrations,
+ } = this.options;
+
const renderTemplate = await SecureTemplater.loadRenderer({
// TODO(blam): let's work out how we can deprecate this.
// We shouldn't really need to be exposing these now we can deal with
@@ -200,8 +343,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
parseRepoUrl(url: string) {
return parseRepoUrl(url, integrations);
},
- additionalTemplateFilters: this.options.additionalTemplateFilters,
- additionalTemplateGlobals: this.options.additionalTemplateGlobals,
+ additionalTemplateFilters,
+ additionalTemplateGlobals,
});
try {
@@ -215,126 +358,14 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
};
for (const step of task.spec.steps) {
- const stepTrack = await this.tracker.stepStart(task, step);
- try {
- if (step.if) {
- const ifResult = await this.render(
- step.if,
- context,
- renderTemplate,
- );
- if (!isTruthy(ifResult)) {
- await stepTrack.skipFalsy();
- continue;
- }
- }
-
- const action = this.options.actionRegistry.get(step.action);
- const { taskLogger, streamLogger } = createStepLogger({ task, step });
-
- if (task.isDryRun) {
- const redactedSecrets = Object.fromEntries(
- Object.entries(task.secrets ?? {}).map(secret => [
- secret[0],
- '[REDACTED]',
- ]),
- );
- const debugInput =
- (step.input &&
- this.render(
- step.input,
- {
- ...context,
- secrets: redactedSecrets,
- },
- renderTemplate,
- )) ??
- {};
- taskLogger.info(
- `Running ${
- action.id
- } in dry-run mode with inputs (secrets redacted): ${JSON.stringify(
- debugInput,
- undefined,
- 2,
- )}`,
- );
- if (!action.supportsDryRun) {
- await taskTrack.skipDryRun(step, action);
- const outputSchema = action.schema?.output;
- if (outputSchema) {
- context.steps[step.id] = {
- output: generateExampleOutput(outputSchema) as {
- [name in string]: JsonValue;
- },
- };
- } else {
- context.steps[step.id] = { output: {} };
- }
- continue;
- }
- }
-
- // Secrets are only passed when templating the input to actions for security reasons
- const input =
- (step.input &&
- this.render(
- step.input,
- { ...context, secrets: task.secrets ?? {} },
- renderTemplate,
- )) ??
- {};
-
- if (action.schema?.input) {
- const validateResult = validateJsonSchema(
- input,
- action.schema.input,
- );
- if (!validateResult.valid) {
- const errors = validateResult.errors.join(', ');
- throw new InputError(
- `Invalid input passed to action ${action.id}, ${errors}`,
- );
- }
- }
-
- const tmpDirs = new Array();
- const stepOutput: { [outputName: string]: JsonValue } = {};
-
- await action.handler({
- input,
- secrets: task.secrets ?? {},
- logger: taskLogger,
- logStream: streamLogger,
- workspacePath,
- createTemporaryDirectory: async () => {
- const tmpDir = await fs.mkdtemp(
- `${workspacePath}_step-${step.id}-`,
- );
- tmpDirs.push(tmpDir);
- return tmpDir;
- },
- output(name: string, value: JsonValue) {
- stepOutput[name] = value;
- },
- templateInfo: task.spec.templateInfo,
- user: task.spec.user,
- isDryRun: task.isDryRun,
- });
-
- // Remove all temporary directories that were created when executing the action
- for (const tmpDir of tmpDirs) {
- await fs.remove(tmpDir);
- }
-
- context.steps[step.id] = { output: stepOutput };
-
- await stepTrack.markSuccessful();
- } catch (err) {
- await taskTrack.markFailed(step, err);
- await stepTrack.markFailed();
- throw err;
- }
+ await this.executeStep(
+ task,
+ step,
+ context,
+ renderTemplate,
+ taskTrack,
+ workspacePath,
+ );
}
const output = this.render(task.spec.output, context, renderTemplate);
@@ -380,7 +411,10 @@ function scaffoldingTracker() {
template,
});
- async function skipDryRun(step: TaskStep, action: TemplateAction) {
+ async function skipDryRun(
+ step: TaskStep,
+ action: TemplateAction,
+ ) {
task.emitLog(`Skipping because ${action.id} does not support dry-run`, {
stepId: step.id,
status: 'skipped',
@@ -409,8 +443,22 @@ function scaffoldingTracker() {
taskTimer({ result: 'failed' });
}
+ async function markCancelled(step: TaskStep) {
+ await task.emitLog(`Step ${step.id} has been cancelled.`, {
+ stepId: step.id,
+ status: 'cancelled',
+ });
+ taskCount.inc({
+ template,
+ user,
+ result: 'cancelled',
+ });
+ taskTimer({ result: 'cancelled' });
+ }
+
return {
skipDryRun,
+ markCancelled,
markSuccessful,
markFailed,
};
@@ -441,6 +489,15 @@ function scaffoldingTracker() {
stepTimer({ result: 'ok' });
}
+ async function markCancelled() {
+ stepCount.inc({
+ template,
+ step: step.name,
+ result: 'cancelled',
+ });
+ stepTimer({ result: 'cancelled' });
+ }
+
async function markFailed() {
stepCount.inc({
template,
@@ -459,8 +516,9 @@ function scaffoldingTracker() {
}
return {
- markSuccessful,
+ markCancelled,
markFailed,
+ markSuccessful,
skipFalsy,
};
}
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts
index d01351d8ae..fc5a724e47 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts
@@ -39,8 +39,13 @@ export class TaskManager implements TaskContext {
private heartbeatTimeoutId?: ReturnType;
- static create(task: CurrentClaimedTask, storage: TaskStore, logger: Logger) {
- const agent = new TaskManager(task, storage, logger);
+ static create(
+ task: CurrentClaimedTask,
+ storage: TaskStore,
+ abortSignal: AbortSignal,
+ logger: Logger,
+ ) {
+ const agent = new TaskManager(task, storage, abortSignal, logger);
agent.startTimeout();
return agent;
}
@@ -49,6 +54,7 @@ export class TaskManager implements TaskContext {
private constructor(
private readonly task: CurrentClaimedTask,
private readonly storage: TaskStore,
+ private readonly signal: AbortSignal,
private readonly logger: Logger,
) {}
@@ -56,6 +62,10 @@ export class TaskManager implements TaskContext {
return this.task.spec;
}
+ get cancelSignal() {
+ return this.signal;
+ }
+
get secrets() {
return this.task.secrets;
}
@@ -165,6 +175,33 @@ export class StorageTaskBroker implements TaskBroker {
private deferredDispatch = defer();
+ private async registerCancellable(
+ taskId: string,
+ abortController: AbortController,
+ ) {
+ let shouldUnsubscribe = false;
+ const subscription = this.event$({ taskId, after: undefined }).subscribe({
+ error: _ => {
+ subscription.unsubscribe();
+ },
+ next: ({ events }) => {
+ for (const event of events) {
+ if (event.type === 'cancelled') {
+ abortController.abort();
+ shouldUnsubscribe = true;
+ }
+
+ if (event.type === 'completion') {
+ shouldUnsubscribe = true;
+ }
+ }
+ if (shouldUnsubscribe) {
+ subscription.unsubscribe();
+ }
+ },
+ });
+ }
+
/**
* {@inheritdoc TaskBroker.claim}
*/
@@ -172,6 +209,8 @@ export class StorageTaskBroker implements TaskBroker {
for (;;) {
const pendingTask = await this.storage.claimTask();
if (pendingTask) {
+ const abortController = new AbortController();
+ await this.registerCancellable(pendingTask.id, abortController);
return TaskManager.create(
{
taskId: pendingTask.id,
@@ -180,6 +219,7 @@ export class StorageTaskBroker implements TaskBroker {
createdBy: pendingTask.createdBy,
},
this.storage,
+ abortController.signal,
this.logger,
);
}
@@ -271,4 +311,24 @@ export class StorageTaskBroker implements TaskBroker {
this.deferredDispatch.resolve();
this.deferredDispatch = defer();
}
+
+ async cancel(taskId: string) {
+ const { events } = await this.storage.listEvents({ taskId });
+ const currentStepId =
+ events.length > 0
+ ? events
+ .filter(({ body }) => body?.stepId)
+ .reduce((prev, curr) => (prev.id > curr.id ? prev : curr)).body
+ .stepId
+ : 0;
+
+ await this.storage.cancelTask?.({
+ taskId,
+ body: {
+ message: `Step ${currentStepId} has been cancelled.`,
+ stepId: currentStepId,
+ status: 'cancelled',
+ },
+ });
+ }
}
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts
index d39671cb67..e886b31369 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts
@@ -15,7 +15,7 @@
*/
import os from 'os';
-import { getVoidLogger, DatabaseManager } from '@backstage/backend-common';
+import { DatabaseManager, getVoidLogger } from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { DatabaseTaskStore } from './DatabaseTaskStore';
import { StorageTaskBroker } from './StorageTaskBroker';
@@ -23,7 +23,14 @@ import { TaskWorker, TaskWorkerOptions } from './TaskWorker';
import { ScmIntegrations } from '@backstage/integration';
import { TemplateActionRegistry } from '../actions';
import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner';
-import { TaskBroker, TaskContext, WorkflowRunner } from './types';
+import {
+ SerializedTaskEvent,
+ TaskBroker,
+ TaskContext,
+ WorkflowRunner,
+} from './types';
+import ObservableImpl from 'zen-observable';
+import waitForExpect from 'wait-for-expect';
jest.mock('./NunjucksWorkflowRunner');
const MockedNunjucksWorkflowRunner =
@@ -198,6 +205,67 @@ describe('Concurrent TaskWorker', () => {
});
});
+describe('Cancellable TaskWorker', () => {
+ let storage: DatabaseTaskStore;
+ const integrations: ScmIntegrations = {} as ScmIntegrations;
+ const actionRegistry: TemplateActionRegistry = {} as TemplateActionRegistry;
+ const workingDirectory = os.tmpdir();
+
+ let myTask: TaskContext | undefined = undefined;
+
+ const workflowRunner: NunjucksWorkflowRunner = {
+ execute: (task: TaskContext) => {
+ myTask = task;
+ },
+ } as unknown as NunjucksWorkflowRunner;
+
+ beforeAll(async () => {
+ storage = await createStore();
+ });
+
+ beforeEach(() => {
+ jest.resetAllMocks();
+ MockedNunjucksWorkflowRunner.mockImplementation(() => workflowRunner);
+ });
+
+ const logger = getVoidLogger();
+
+ it('should be able to cancel the running task', async () => {
+ const taskBroker = new StorageTaskBroker(storage, logger);
+ const taskWorker = await TaskWorker.create({
+ logger,
+ workingDirectory,
+ integrations,
+ taskBroker,
+ actionRegistry,
+ });
+
+ const steps = [...Array(10)].map(n => ({
+ id: `test${n}`,
+ name: `test${n}`,
+ action: 'not-found-action',
+ }));
+
+ const { taskId } = await taskBroker.dispatch({
+ spec: {
+ apiVersion: 'scaffolder.backstage.io/v1beta3',
+ steps,
+ output: {
+ result: '{{ steps.test.output.testOutput }}',
+ },
+ parameters: {},
+ },
+ });
+
+ await taskWorker.start();
+ await taskBroker.cancel(taskId);
+
+ await waitForExpect(() => {
+ expect(myTask?.cancelSignal.aborted).toBeTruthy();
+ });
+ });
+});
+
describe('TaskWorker internals', () => {
const TaskWorkerConstructor = TaskWorker as unknown as {
new (options: TaskWorkerOptions): TaskWorker;
@@ -219,10 +287,24 @@ describe('TaskWorker internals', () => {
},
};
+ const subscribers = new Set<
+ ZenObservable.SubscriptionObserver<{ events: SerializedTaskEvent[] }>
+ >();
+
let claimedTaskCount = 0;
const taskWorker = new TaskWorkerConstructor({
runners: { workflowRunner },
taskBroker: {
+ event$() {
+ return new ObservableImpl<{ events: SerializedTaskEvent[] }>(
+ subscriber => {
+ subscribers.add(subscriber);
+ return () => {
+ subscribers.delete(subscriber);
+ };
+ },
+ );
+ },
async claim() {
claimedTaskCount++;
return {
@@ -233,7 +315,7 @@ describe('TaskWorker internals', () => {
async complete(_result, _metadata) {},
} as TaskContext;
},
- } as TaskBroker,
+ } as unknown as TaskBroker,
concurrentTasksLimit: 2,
});
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts
index 82829665a3..5723e7136f 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts
@@ -21,10 +21,7 @@ import { Logger } from 'winston';
import { TemplateActionRegistry } from '../actions';
import { ScmIntegrations } from '@backstage/integration';
import { assertError } from '@backstage/errors';
-import {
- TemplateFilter,
- TemplateGlobal,
-} from '../../lib/templating/SecureTemplater';
+import { TemplateFilter, TemplateGlobal } from '../../lib';
/**
* TaskWorkerOptions
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts
index 5a91802f3e..112276b9dd 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts
@@ -15,8 +15,9 @@
*/
import { JsonValue, JsonObject, Observable } from '@backstage/types';
-import { TaskSpec } from '@backstage/plugin-scaffolder-common';
+import { TaskSpec, TaskStep } from '@backstage/plugin-scaffolder-common';
import { TaskSecrets } from '@backstage/plugin-scaffolder-node';
+import { TemplateAction } from '@backstage/plugin-scaffolder-node';
/**
* The status of each step of the Task
@@ -24,11 +25,11 @@ import { TaskSecrets } from '@backstage/plugin-scaffolder-node';
* @public
*/
export type TaskStatus =
- | 'open'
- | 'processing'
- | 'failed'
| 'cancelled'
- | 'completed';
+ | 'completed'
+ | 'failed'
+ | 'open'
+ | 'processing';
/**
* The state of a completed task.
@@ -57,7 +58,7 @@ export type SerializedTask = {
*
* @public
*/
-export type TaskEventType = 'completion' | 'log';
+export type TaskEventType = 'completion' | 'log' | 'cancelled';
/**
* SerializedTaskEvent
@@ -99,13 +100,17 @@ export type TaskBrokerDispatchOptions = {
* @public
*/
export interface TaskContext {
+ cancelSignal: AbortSignal;
spec: TaskSpec;
secrets?: TaskSecrets;
createdBy?: string;
done: boolean;
isDryRun?: boolean;
- emitLog(message: string, logMetadata?: JsonObject): Promise;
+
complete(result: TaskCompletionState, metadata?: JsonObject): Promise;
+
+ emitLog(message: string, logMetadata?: JsonObject): Promise;
+
getWorkspaceName(): Promise;
}
@@ -115,16 +120,23 @@ export interface TaskContext {
* @public
*/
export interface TaskBroker {
+ cancel?(taskId: string): Promise;
+
claim(): Promise;
+
dispatch(
options: TaskBrokerDispatchOptions,
): Promise;
+
vacuumTasks(options: { timeoutS: number }): Promise;
+
event$(options: {
taskId: string;
after: number | undefined;
}): Observable<{ events: SerializedTaskEvent[] }>;
+
get(taskId: string): Promise;
+
list?(options?: { createdBy?: string }): Promise<{ tasks: SerializedTask[] }>;
}
@@ -181,30 +193,51 @@ export type TaskStoreCreateTaskResult = {
* @public
*/
export interface TaskStore {
+ cancelTask?(options: TaskStoreEmitOptions): Promise;
+
createTask(
options: TaskStoreCreateTaskOptions,
): Promise;
+
getTask(taskId: string): Promise;
+
claimTask(): Promise;
+
completeTask(options: {
taskId: string;
status: TaskStatus;
eventBody: JsonObject;
}): Promise;
+
heartbeatTask(taskId: string): Promise;
+
listStaleTasks(options: { timeoutS: number }): Promise<{
tasks: { taskId: string }[];
}>;
+
list?(options: { createdBy?: string }): Promise<{ tasks: SerializedTask[] }>;
emitLogEvent(options: TaskStoreEmitOptions): Promise;
+
listEvents(
options: TaskStoreListEventsOptions,
): Promise<{ events: SerializedTaskEvent[] }>;
+
shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise;
}
export type WorkflowResponse = { output: { [key: string]: JsonValue } };
+
export interface WorkflowRunner {
execute(task: TaskContext): Promise;
}
+
+export type TaskTrackType = {
+ markCancelled: (step: TaskStep) => Promise;
+ markFailed: (step: TaskStep, err: Error) => Promise;
+ markSuccessful: () => Promise;
+ skipDryRun: (
+ step: TaskStep,
+ action: TemplateAction,
+ ) => Promise;
+};
diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts
index e40958c778..b2be3e2749 100644
--- a/plugins/scaffolder-backend/src/service/router.ts
+++ b/plugins/scaffolder-backend/src/service/router.ts
@@ -94,14 +94,11 @@ function isSupportedTemplate(entity: TemplateEntityV1beta3) {
* until someone explicitly passes an IdentityApi. When we have reasonable confidence that most backstage deployments
* are using the IdentityApi, we can remove this function.
*/
-function buildDefaultIdentityClient({
- logger,
-}: {
- logger: Logger;
-}): IdentityApi {
+function buildDefaultIdentityClient(options: RouterOptions): IdentityApi {
return {
getIdentity: async ({ request }: IdentityApiGetIdentityRequest) => {
const header = request.headers.authorization;
+ const { logger } = options;
if (!header) {
return undefined;
@@ -131,6 +128,10 @@ function buildDefaultIdentityClient({
throw new TypeError('Expected string sub claim');
}
+ if (sub === 'backstage-server') {
+ return undefined;
+ }
+
// Check that it's a valid ref, otherwise this will throw.
parseEntityRef(sub);
@@ -178,8 +179,7 @@ export async function createRouter(
const logger = parentLogger.child({ plugin: 'scaffolder' });
const identity: IdentityApi =
- options.identity || buildDefaultIdentityClient({ logger });
-
+ options.identity || buildDefaultIdentityClient(options);
const workingDirectory = await getWorkingDirectory(config, logger);
const integrations = ScmIntegrations.fromConfig(config);
@@ -414,6 +414,11 @@ export async function createRouter(
delete task.secrets;
res.status(200).json(task);
})
+ .post('/v2/tasks/:taskId/cancel', async (req, res) => {
+ const { taskId } = req.params;
+ await taskBroker.cancel?.(taskId);
+ res.status(200).json({ status: 'cancelled' });
+ })
.get('/v2/tasks/:taskId/eventstream', async (req, res) => {
const { taskId } = req.params;
const after =
diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md
index 6668baa16e..37b9613524 100644
--- a/plugins/scaffolder-node/CHANGELOG.md
+++ b/plugins/scaffolder-node/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-scaffolder-node
+## 0.1.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md
index 89b7171ef9..d5b9b73767 100644
--- a/plugins/scaffolder-node/api-report.md
+++ b/plugins/scaffolder-node/api-report.md
@@ -30,6 +30,7 @@ export type ActionContext = {
entity?: UserEntity;
ref?: string;
};
+ signal?: AbortSignal;
};
// @public
diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json
index ddb2f24083..8978c155bf 100644
--- a/plugins/scaffolder-node/package.json
+++ b/plugins/scaffolder-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-scaffolder-node",
"description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend",
- "version": "0.1.1-next.1",
+ "version": "0.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts
index cce149adbe..8827aaf98c 100644
--- a/plugins/scaffolder-node/src/actions/types.ts
+++ b/plugins/scaffolder-node/src/actions/types.ts
@@ -60,6 +60,11 @@ export type ActionContext = {
*/
ref?: string;
};
+
+ /**
+ * Implement the signal to make your custom step abortable https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
+ */
+ signal?: AbortSignal;
};
/** @public */
diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md
index d81194d2aa..25385e4816 100644
--- a/plugins/scaffolder-react/CHANGELOG.md
+++ b/plugins/scaffolder-react/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-scaffolder-react
+## 1.2.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles.
+- d9893263ba9: scaffolder/next: Fix for steps without properties
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 1.2.0-next.1
### Minor Changes
diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md
index 0fbc8d0eed..da8309d5ec 100644
--- a/plugins/scaffolder-react/api-report.md
+++ b/plugins/scaffolder-react/api-report.md
@@ -113,7 +113,7 @@ export type ListActionsResponse = Array;
// @public
export type LogEvent = {
- type: 'log' | 'completion';
+ type: 'log' | 'completion' | 'cancelled';
body: {
message: string;
stepId?: string;
@@ -126,6 +126,7 @@ export type LogEvent = {
// @public
export interface ScaffolderApi {
+ cancelTask(taskId: string): Promise;
// (undocumented)
dryRun?(options: ScaffolderDryRunOptions): Promise;
// (undocumented)
@@ -266,10 +267,11 @@ export type ScaffolderTaskOutput = {
// @public
export type ScaffolderTaskStatus =
+ | 'cancelled'
+ | 'completed'
+ | 'failed'
| 'open'
| 'processing'
- | 'failed'
- | 'completed'
| 'skipped';
// @public
@@ -287,6 +289,7 @@ export const SecretsContextProvider: (
// @public
export type TaskStream = {
+ cancelled: boolean;
loading: boolean;
error?: Error;
stepLogs: {
diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json
index 2a22881306..4e0cb590e4 100644
--- a/plugins/scaffolder-react/package.json
+++ b/plugins/scaffolder-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-scaffolder-react",
"description": "A frontend library that helps other Backstage plugins interact with the Scaffolder",
- "version": "1.2.0-next.1",
+ "version": "1.2.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder-react/src/api/types.ts b/plugins/scaffolder-react/src/api/types.ts
index 0a517e7bff..b39555c14f 100644
--- a/plugins/scaffolder-react/src/api/types.ts
+++ b/plugins/scaffolder-react/src/api/types.ts
@@ -24,10 +24,11 @@ import { TemplateParameterSchema } from '../types';
* @public
*/
export type ScaffolderTaskStatus =
+ | 'cancelled'
+ | 'completed'
+ | 'failed'
| 'open'
| 'processing'
- | 'failed'
- | 'completed'
| 'skipped';
/**
@@ -96,7 +97,7 @@ export type ScaffolderTaskOutput = {
* @public
*/
export type LogEvent = {
- type: 'log' | 'completion';
+ type: 'log' | 'completion' | 'cancelled';
body: {
message: string;
stepId?: string;
@@ -196,6 +197,13 @@ export interface ScaffolderApi {
getTask(taskId: string): Promise;
+ /**
+ * Sends a signal to a task broker to cancel the running task by taskId.
+ *
+ * @param taskId - the id of the task
+ */
+ cancelTask(taskId: string): Promise;
+
listTasks?(options: {
filterByOwnership: 'owned' | 'all';
}): Promise<{ tasks: ScaffolderTask[] }>;
diff --git a/plugins/scaffolder-react/src/hooks/useEventStream.ts b/plugins/scaffolder-react/src/hooks/useEventStream.ts
index d8c9cf4c1f..ec49911471 100644
--- a/plugins/scaffolder-react/src/hooks/useEventStream.ts
+++ b/plugins/scaffolder-react/src/hooks/useEventStream.ts
@@ -44,6 +44,7 @@ export type ScaffolderStep = {
* @public
*/
export type TaskStream = {
+ cancelled: boolean;
loading: boolean;
error?: Error;
stepLogs: { [stepId in string]: string[] };
@@ -66,6 +67,7 @@ type ReducerLogEntry = {
type ReducerAction =
| { type: 'INIT'; data: ScaffolderTask }
+ | { type: 'CANCELLED' }
| { type: 'LOGS'; data: ReducerLogEntry[] }
| { type: 'COMPLETED'; data: ReducerLogEntry }
| { type: 'ERROR'; data: Error };
@@ -111,7 +113,7 @@ function reducer(draft: TaskStream, action: ReducerAction) {
}
if (
- ['cancelled', 'failed', 'completed'].includes(currentStep.status)
+ ['cancelled', 'completed', 'failed'].includes(currentStep.status)
) {
currentStep.endedAt = entry.createdAt;
}
@@ -131,6 +133,11 @@ function reducer(draft: TaskStream, action: ReducerAction) {
return;
}
+ case 'CANCELLED': {
+ draft.cancelled = true;
+ return;
+ }
+
case 'ERROR': {
draft.error = action.data;
draft.loading = false;
@@ -151,6 +158,7 @@ function reducer(draft: TaskStream, action: ReducerAction) {
export const useTaskEventStream = (taskId: string): TaskStream => {
const scaffolderApi = useApi(scaffolderApiRef);
const [state, dispatch] = useImmerReducer(reducer, {
+ cancelled: false,
loading: true,
completed: false,
stepLogs: {} as { [stepId in string]: string[] },
@@ -196,6 +204,9 @@ export const useTaskEventStream = (taskId: string): TaskStream => {
switch (event.type) {
case 'log':
return collectedLogEvents.push(event);
+ case 'cancelled':
+ dispatch({ type: 'CANCELLED' });
+ return undefined;
case 'completion':
emitLogs();
dispatch({ type: 'COMPLETED', data: event });
diff --git a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx
index 03604881d2..81c5a697e0 100644
--- a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx
+++ b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx
@@ -24,10 +24,10 @@ import { act, fireEvent } from '@testing-library/react';
import React from 'react';
import { Workflow } from './Workflow';
import { analyticsApiRef } from '@backstage/core-plugin-api';
-import { ScaffolderApi } from '../../../api/types';
-import { scaffolderApiRef } from '../../../api/ref';
+import { ScaffolderApi, scaffolderApiRef } from '../../../api';
const scaffolderApiMock: jest.Mocked = {
+ cancelTask: jest.fn(),
scaffold: jest.fn(),
getTemplateParameterSchema: jest.fn(),
getIntegrationsList: jest.fn(),
diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md
index a0a6d7b750..d3c377154e 100644
--- a/plugins/scaffolder/CHANGELOG.md
+++ b/plugins/scaffolder/CHANGELOG.md
@@ -1,5 +1,26 @@
# @backstage/plugin-scaffolder
+## 1.12.0-next.2
+
+### Minor Changes
+
+- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version.
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles.
+- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-scaffolder-react@1.2.0-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/plugin-permission-react@0.4.11-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 1.12.0-next.1
### Minor Changes
diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md
index 6b8d6d345f..45d0b2675c 100644
--- a/plugins/scaffolder/api-report.md
+++ b/plugins/scaffolder/api-report.md
@@ -360,6 +360,8 @@ export class ScaffolderClient implements ScaffolderApi_2 {
useLongPollingLogs?: boolean;
});
// (undocumented)
+ cancelTask(taskId: string): Promise;
+ // (undocumented)
dryRun(
options: ScaffolderDryRunOptions_2,
): Promise;
diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json
index 8258dceab9..7d939a3d1e 100644
--- a/plugins/scaffolder/package.json
+++ b/plugins/scaffolder/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-scaffolder",
"description": "The Backstage plugin that helps you create new things",
- "version": "1.12.0-next.1",
+ "version": "1.12.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts
index 15bd1925b3..7a3f6c14bb 100644
--- a/plugins/scaffolder/src/api.ts
+++ b/plugins/scaffolder/src/api.ts
@@ -229,24 +229,22 @@ export class ScaffolderClient implements ScaffolderApi {
const url = `${baseUrl}/v2/tasks/${encodeURIComponent(
taskId,
)}/eventstream`;
+
+ const processEvent = (event: any) => {
+ if (event.data) {
+ try {
+ subscriber.next(JSON.parse(event.data));
+ } catch (ex) {
+ subscriber.error(ex);
+ }
+ }
+ };
+
const eventSource = new EventSource(url, { withCredentials: true });
- eventSource.addEventListener('log', (event: any) => {
- if (event.data) {
- try {
- subscriber.next(JSON.parse(event.data));
- } catch (ex) {
- subscriber.error(ex);
- }
- }
- });
+ eventSource.addEventListener('log', processEvent);
+ eventSource.addEventListener('cancelled', processEvent);
eventSource.addEventListener('completion', (event: any) => {
- if (event.data) {
- try {
- subscriber.next(JSON.parse(event.data));
- } catch (ex) {
- subscriber.error(ex);
- }
- }
+ processEvent(event);
eventSource.close();
subscriber.complete();
});
@@ -310,4 +308,19 @@ export class ScaffolderClient implements ScaffolderApi {
return await response.json();
}
+
+ async cancelTask(taskId: string): Promise {
+ const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');
+ const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`;
+
+ const response = await this.fetchApi.fetch(url, {
+ method: 'POST',
+ });
+
+ if (!response.ok) {
+ throw await ResponseError.fromResponse(response);
+ }
+
+ return await response.json();
+ }
}
diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx
index 552d0cea6a..90f6f9b393 100644
--- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx
+++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx
@@ -25,6 +25,7 @@ import { rootRouteRef } from '../../routes';
const scaffolderApiMock: jest.Mocked = {
scaffold: jest.fn(),
+ cancelTask: jest.fn(),
getTemplateParameterSchema: jest.fn(),
getIntegrationsList: jest.fn(),
getTask: jest.fn(),
diff --git a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx
index f78d48e686..78cdc5d935 100644
--- a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx
+++ b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx
@@ -19,11 +19,15 @@ import {
Content,
ErrorPage,
Header,
- Page,
LogViewer,
+ Page,
Progress,
} from '@backstage/core-components';
-import { useRouteRef, useRouteRefParams } from '@backstage/core-plugin-api';
+import {
+ useApi,
+ useRouteRef,
+ useRouteRefParams,
+} from '@backstage/core-plugin-api';
import { BackstageTheme } from '@backstage/theme';
import {
Button,
@@ -59,6 +63,7 @@ import {
scaffolderTaskRouteRef,
selectedTemplateRouteRef,
} from '../../routes';
+import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
// typings are wrong for this library, so fallback to not parsing types.
const humanizeDuration = require('humanize-duration');
@@ -188,9 +193,10 @@ export const TaskStatusStepper = memo(
nonLinear
>
{steps.map((step, index) => {
+ const isCancelled = step.status === 'cancelled';
+ const isActive = step.status === 'processing';
const isCompleted = step.status === 'completed';
const isFailed = step.status === 'failed';
- const isActive = step.status === 'processing';
const isSkipped = step.status === 'skipped';
return (
@@ -199,7 +205,7 @@ export const TaskStatusStepper = memo(
{
const { loadingText } = props;
-
const classes = useStyles();
const navigate = useNavigate();
const rootPath = useRouteRef(rootRouteRef);
+ const scaffolderApi = useApi(scaffolderApiRef);
const templateRoute = useRouteRef(selectedTemplateRouteRef);
const [userSelectedStepId, setUserSelectedStepId] = useState<
string | undefined
>(undefined);
+ const [clickedToCancel, setClickedToCancel] = useState(false);
const [lastActiveStepId, setLastActiveStepId] = useState(
undefined,
);
const { taskId } = useRouteRefParams(scaffolderTaskRouteRef);
const taskStream = useTaskEventStream(taskId);
const completed = taskStream.completed;
+ const taskCancelled = taskStream.cancelled;
const steps = useMemo(
() =>
taskStream.task?.spec.steps.map(step => ({
@@ -295,9 +302,7 @@ export const TaskPage = (props: TaskPageProps) => {
}, [taskStream.stepLogs, currentStepId, loadingText]);
const taskNotFound =
- taskStream.completed === true &&
- taskStream.loading === false &&
- !taskStream.task;
+ taskStream.completed && !taskStream.loading && !taskStream.task;
const { output } = taskStream;
@@ -320,6 +325,11 @@ export const TaskPage = (props: TaskPageProps) => {
);
};
+ const handleCancel = async () => {
+ setClickedToCancel(true);
+ await scaffolderApi.cancelTask(taskId);
+ };
+
return (
{
>
Start Over
+
diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx
index b4358146fd..344929fa43 100644
--- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx
+++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx
@@ -47,6 +47,7 @@ jest.mock('react-router-dom', () => {
});
const scaffolderApiMock: jest.Mocked = {
+ cancelTask: jest.fn(),
scaffold: jest.fn(),
getTemplateParameterSchema: jest.fn(),
getIntegrationsList: jest.fn(),
@@ -338,10 +339,7 @@ describe('TemplatePage', () => {
it('should display a section or property based on a feature flag', async () => {
featureFlagsApiMock.isActive.mockImplementation(flag => {
- if (flag === 'experimental-feature') {
- return true;
- }
- return false;
+ return flag === 'experimental-feature';
});
scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue(
schemaMockValue,
diff --git a/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx
index d4c771a9f8..985dd98903 100644
--- a/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx
+++ b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx
@@ -23,15 +23,21 @@ import {
MenuList,
Popover,
} from '@material-ui/core';
+import { useAsync } from '@react-hookz/web';
+import Cancel from '@material-ui/icons/Cancel';
import Retry from '@material-ui/icons/Repeat';
import Toc from '@material-ui/icons/Toc';
import MoreVert from '@material-ui/icons/MoreVert';
import React, { useState } from 'react';
+import { useApi } from '@backstage/core-plugin-api';
+import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
type ContextMenuProps = {
+ cancelEnabled?: boolean;
logsVisible?: boolean;
- onToggleLogs?: (state: boolean) => void;
onStartOver?: () => void;
+ onToggleLogs?: (state: boolean) => void;
+ taskId?: string;
};
const useStyles = makeStyles((theme: BackstageTheme) => ({
@@ -41,10 +47,18 @@ const useStyles = makeStyles((theme: BackstageTheme) => ({
}));
export const ContextMenu = (props: ContextMenuProps) => {
- const { logsVisible, onToggleLogs, onStartOver } = props;
+ const { cancelEnabled, logsVisible, onStartOver, onToggleLogs, taskId } =
+ props;
const classes = useStyles();
+ const scaffolderApi = useApi(scaffolderApiRef);
const [anchorEl, setAnchorEl] = useState();
+ const [{ status: cancelStatus }, { execute: cancel }] = useAsync(async () => {
+ if (taskId) {
+ await scaffolderApi.cancelTask(taskId);
+ }
+ });
+
return (
<>
{
+
>
diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx
new file mode 100644
index 0000000000..9e9212b9e8
--- /dev/null
+++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { OngoingTask } from './OngoingTask';
+import React from 'react';
+import { renderInTestApp, TestApiProvider } from '@backstage/test-utils';
+import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
+import { act, fireEvent, waitFor } from '@testing-library/react';
+import { nextRouteRef } from '../routes';
+
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+ useParams: () => ({ taskId: 'my-task' }),
+}));
+
+jest.mock('@backstage/plugin-scaffolder-react', () => ({
+ ...jest.requireActual('@backstage/plugin-scaffolder-react'),
+ useTaskEventStream: () => ({
+ cancelled: false,
+ loading: true,
+ stepLogs: {},
+ completed: false,
+ steps: {},
+ task: {
+ spec: {
+ steps: [],
+ templateInfo: { entity: { metadata: { name: 'my-template' } } },
+ },
+ },
+ }),
+}));
+
+describe('OngoingTask', () => {
+ const mockScaffolderApi = {
+ cancelTask: jest.fn(),
+ getTask: jest.fn().mockImplementation(async () => {}),
+ };
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('should trigger cancel api on "Cancel" click in context menu', async () => {
+ const cancelOptionLabel = 'Cancel';
+ const rendered = await renderInTestApp(
+
+
+ ,
+ { mountedRoutes: { '/': nextRouteRef } },
+ );
+ const { getByText, getByTestId } = rendered;
+
+ await act(async () => {
+ fireEvent.click(getByTestId('menu-button'));
+ });
+ expect(getByTestId('cancel-task')).not.toHaveClass('Mui-disabled');
+
+ await act(async () => {
+ fireEvent.click(getByText(cancelOptionLabel));
+ });
+
+ expect(mockScaffolderApi.cancelTask).toHaveBeenCalled();
+ await act(async () => {
+ fireEvent.click(getByTestId('menu-button'));
+ });
+
+ await waitFor(() => {
+ expect(getByTestId('cancel-task')).toHaveClass('Mui-disabled');
+ });
+ });
+});
diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx
index fc1c1a7413..9c64e2179b 100644
--- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx
+++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx
@@ -13,8 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import React, { useEffect, useMemo, useState, useCallback } from 'react';
-import { Page, Header, Content, ErrorPanel } from '@backstage/core-components';
+import React, { useCallback, useEffect, useMemo, useState } from 'react';
+import { Content, ErrorPanel, Header, Page } from '@backstage/core-components';
import { useNavigate, useParams } from 'react-router-dom';
import { Box, makeStyles, Paper } from '@material-ui/core';
import {
@@ -105,6 +105,8 @@ export const OngoingTask = (props: {
const templateName =
taskStream.task?.spec.templateInfo?.entity?.metadata.name;
+ const cancelEnabled = !(taskStream.cancelled || taskStream.completed);
+
return (
diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx
index c4f9c75ceb..da4112979c 100644
--- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx
+++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx
@@ -41,6 +41,7 @@ jest.mock('react-router-dom', () => {
});
const scaffolderApiMock: jest.Mocked = {
+ cancelTask: jest.fn(),
scaffold: jest.fn(),
getTemplateParameterSchema: jest.fn(),
getIntegrationsList: jest.fn(),
diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md
index 5e1d423f65..8576e6602c 100644
--- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md
+++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-search-backend-module-elasticsearch
+## 1.1.4-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.1.4-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json
index 7dbc84251d..6520571ec6 100644
--- a/plugins/search-backend-module-elasticsearch/package.json
+++ b/plugins/search-backend-module-elasticsearch/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend-module-elasticsearch",
"description": "A module for the search backend that implements search using ElasticSearch",
- "version": "1.1.4-next.1",
+ "version": "1.1.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md
index 2284fb17dd..db32c01817 100644
--- a/plugins/search-backend-module-pg/CHANGELOG.md
+++ b/plugins/search-backend-module-pg/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-search-backend-module-pg
+## 0.5.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.5.4-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json
index a9e09db620..c6513c8e27 100644
--- a/plugins/search-backend-module-pg/package.json
+++ b/plugins/search-backend-module-pg/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend-module-pg",
"description": "A module for the search backend that implements search using PostgreSQL",
- "version": "0.5.4-next.1",
+ "version": "0.5.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md
index 87c8390e7c..5fcd3bd0fa 100644
--- a/plugins/search-backend-node/CHANGELOG.md
+++ b/plugins/search-backend-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-search-backend-node
+## 1.1.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.1.4-next.1
### Patch Changes
diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json
index 593d459cb3..d86be92e92 100644
--- a/plugins/search-backend-node/package.json
+++ b/plugins/search-backend-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend-node",
"description": "A library for Backstage backend plugins that want to interact with the search backend plugin",
- "version": "1.1.4-next.1",
+ "version": "1.1.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md
index 29bc3ea9d3..513ee4536a 100644
--- a/plugins/search-backend/CHANGELOG.md
+++ b/plugins/search-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-search-backend
+## 1.2.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-permission-node@0.7.6-next.2
+ - @backstage/plugin-search-backend-node@1.1.4-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.2.4-next.1
### Patch Changes
diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json
index faadd54835..0baecca0a9 100644
--- a/plugins/search-backend/package.json
+++ b/plugins/search-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search-backend",
"description": "The Backstage backend plugin that provides your backstage app with search",
- "version": "1.2.4-next.1",
+ "version": "1.2.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md
index e1fb0049bf..9fc158de5d 100644
--- a/plugins/search-react/CHANGELOG.md
+++ b/plugins/search-react/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-search-react
+## 1.5.1-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- 553f3c95011: Correctly disable next button in `SearchPagination` on last page
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 1.5.1-next.1
### Patch Changes
diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json
index edd00ca6cf..355191cb47 100644
--- a/plugins/search-react/package.json
+++ b/plugins/search-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-react",
- "version": "1.5.1-next.1",
+ "version": "1.5.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md
index e326f19ef4..3d02621576 100644
--- a/plugins/search/CHANGELOG.md
+++ b/plugins/search/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-search
+## 1.1.1-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.1.1-next.1
### Patch Changes
diff --git a/plugins/search/package.json b/plugins/search/package.json
index e8aab6022d..353981cae1 100644
--- a/plugins/search/package.json
+++ b/plugins/search/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-search",
"description": "The Backstage plugin that provides your backstage app with search",
- "version": "1.1.1-next.1",
+ "version": "1.1.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md
index abfdb54ce8..89b5d8312a 100644
--- a/plugins/sentry/CHANGELOG.md
+++ b/plugins/sentry/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-sentry
+## 0.5.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.5.1-next.1
### Patch Changes
diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json
index 9893994cf8..1139898926 100644
--- a/plugins/sentry/package.json
+++ b/plugins/sentry/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-sentry",
"description": "A Backstage plugin that integrates towards Sentry",
- "version": "0.5.1-next.1",
+ "version": "0.5.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md
index 4b00e77e28..2360461f73 100644
--- a/plugins/shortcuts/CHANGELOG.md
+++ b/plugins/shortcuts/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-shortcuts
+## 0.3.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.8-next.1
### Patch Changes
diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json
index bddd20e5b3..eb48088934 100644
--- a/plugins/shortcuts/package.json
+++ b/plugins/shortcuts/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-shortcuts",
"description": "A Backstage plugin that provides a shortcuts feature to the sidebar",
- "version": "0.3.8-next.1",
+ "version": "0.3.8-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md
index e44e90767b..f60f7bf047 100644
--- a/plugins/sonarqube-backend/CHANGELOG.md
+++ b/plugins/sonarqube-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-sonarqube-backend
+## 0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.8-next.1
### Patch Changes
diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json
index 0a25762ae4..d7de98d307 100644
--- a/plugins/sonarqube-backend/package.json
+++ b/plugins/sonarqube-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-sonarqube-backend",
- "version": "0.1.8-next.1",
+ "version": "0.1.8-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md
index d3feb6b79d..6c7d5d41f2 100644
--- a/plugins/sonarqube-react/CHANGELOG.md
+++ b/plugins/sonarqube-react/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-sonarqube-react
+## 0.1.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.4-next.1
### Patch Changes
diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json
index 8700254987..d5266cd220 100644
--- a/plugins/sonarqube-react/package.json
+++ b/plugins/sonarqube-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-sonarqube-react",
- "version": "0.1.4-next.1",
+ "version": "0.1.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md
index c632224252..6c6f69aaf8 100644
--- a/plugins/sonarqube/CHANGELOG.md
+++ b/plugins/sonarqube/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-sonarqube
+## 0.6.5-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-sonarqube-react@0.1.4-next.2
+
## 0.6.5-next.1
### Patch Changes
diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json
index 3775f6c30b..48d221e508 100644
--- a/plugins/sonarqube/package.json
+++ b/plugins/sonarqube/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-sonarqube",
"description": "",
- "version": "0.6.5-next.1",
+ "version": "0.6.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md
index 4c36b337e5..830c918ced 100644
--- a/plugins/splunk-on-call/CHANGELOG.md
+++ b/plugins/splunk-on-call/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-splunk-on-call
+## 0.4.5-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.4.5-next.1
### Patch Changes
diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json
index 4da3a55108..97a5357bd0 100644
--- a/plugins/splunk-on-call/package.json
+++ b/plugins/splunk-on-call/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-splunk-on-call",
"description": "A Backstage plugin that integrates towards Splunk On-Call",
- "version": "0.4.5-next.1",
+ "version": "0.4.5-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md
index c395fe7094..fab1416363 100644
--- a/plugins/stack-overflow-backend/CHANGELOG.md
+++ b/plugins/stack-overflow-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-stack-overflow-backend
+## 0.1.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.12-next.1
### Patch Changes
diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json
index b3aa6573df..2dd405dc3b 100644
--- a/plugins/stack-overflow-backend/package.json
+++ b/plugins/stack-overflow-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-stack-overflow-backend",
- "version": "0.1.12-next.1",
+ "version": "0.1.12-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md
index d69e9441b1..050900554d 100644
--- a/plugins/stack-overflow/CHANGELOG.md
+++ b/plugins/stack-overflow/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-stack-overflow
+## 0.1.12-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/plugin-home@0.4.32-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.12-next.1
### Patch Changes
diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json
index 3ad363962d..3675593181 100644
--- a/plugins/stack-overflow/package.json
+++ b/plugins/stack-overflow/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-stack-overflow",
- "version": "0.1.12-next.1",
+ "version": "0.1.12-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md
index bbeb51a609..f68c853b7b 100644
--- a/plugins/stackstorm/CHANGELOG.md
+++ b/plugins/stackstorm/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-stackstorm
+## 0.1.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.0-next.1
### Patch Changes
diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json
index 61ac3da384..a1ba109d76 100644
--- a/plugins/stackstorm/package.json
+++ b/plugins/stackstorm/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-stackstorm",
"description": "A Backstage plugin that integrates towards StackStorm",
- "version": "0.1.0-next.1",
+ "version": "0.1.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
index 3f8e02187c..12e6693589 100644
--- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
+++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-tech-insights-backend-module-jsonfc
+## 0.1.27-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-tech-insights-node@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.1.27-next.1
### Patch Changes
diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json
index 496cd1ec00..7d60ec0cdc 100644
--- a/plugins/tech-insights-backend-module-jsonfc/package.json
+++ b/plugins/tech-insights-backend-module-jsonfc/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-tech-insights-backend-module-jsonfc",
- "version": "0.1.27-next.1",
+ "version": "0.1.27-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md
index 50bdd8f65d..c4e8061f05 100644
--- a/plugins/tech-insights-backend/CHANGELOG.md
+++ b/plugins/tech-insights-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-tech-insights-backend
+## 0.5.9-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/plugin-tech-insights-node@0.4.1-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.5.9-next.1
### Patch Changes
diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json
index a7f868fbad..e11bf60e0d 100644
--- a/plugins/tech-insights-backend/package.json
+++ b/plugins/tech-insights-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-tech-insights-backend",
- "version": "0.5.9-next.1",
+ "version": "0.5.9-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md
index e43a61629d..ed9f3667f0 100644
--- a/plugins/tech-insights-node/CHANGELOG.md
+++ b/plugins/tech-insights-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-tech-insights-node
+## 0.4.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.4.1-next.1
### Patch Changes
diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json
index 428341c54d..6a546f86c1 100644
--- a/plugins/tech-insights-node/package.json
+++ b/plugins/tech-insights-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-tech-insights-node",
- "version": "0.4.1-next.1",
+ "version": "0.4.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md
index a1e75d80b7..e8d57b056f 100644
--- a/plugins/tech-insights/CHANGELOG.md
+++ b/plugins/tech-insights/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-tech-insights
+## 0.3.8-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.3.8-next.1
### Patch Changes
diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json
index 3eb7a5ae90..680641b1b0 100644
--- a/plugins/tech-insights/package.json
+++ b/plugins/tech-insights/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-tech-insights",
- "version": "0.3.8-next.1",
+ "version": "0.3.8-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md
index 998d703860..4ad21662bd 100644
--- a/plugins/tech-radar/CHANGELOG.md
+++ b/plugins/tech-radar/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-tech-radar
+## 0.6.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.6.2-next.1
### Patch Changes
diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json
index 6f67def94c..273bd79255 100644
--- a/plugins/tech-radar/package.json
+++ b/plugins/tech-radar/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-tech-radar",
"description": "A Backstage plugin that lets you display a Tech Radar for your organization",
- "version": "0.6.2-next.1",
+ "version": "0.6.2-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md
index 4396148d7d..35dedb8a0b 100644
--- a/plugins/techdocs-addons-test-utils/CHANGELOG.md
+++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-techdocs-addons-test-utils
+## 1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/plugin-techdocs@1.6.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/plugin-catalog@1.9.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/test-utils@1.2.6-next.2
+
## 1.0.11-next.1
### Patch Changes
diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json
index 45aa1f6f04..8dc81b2cf7 100644
--- a/plugins/techdocs-addons-test-utils/package.json
+++ b/plugins/techdocs-addons-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs-addons-test-utils",
- "version": "1.0.11-next.1",
+ "version": "1.0.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md
index 0b3b0bad56..8e4be204db 100644
--- a/plugins/techdocs-backend/CHANGELOG.md
+++ b/plugins/techdocs-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-techdocs-backend
+## 1.5.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.6.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 1.5.4-next.1
### Patch Changes
diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json
index dbc482db47..c9fff25b70 100644
--- a/plugins/techdocs-backend/package.json
+++ b/plugins/techdocs-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-techdocs-backend",
"description": "The Backstage backend plugin that renders technical documentation for your components",
- "version": "1.5.4-next.1",
+ "version": "1.5.4-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
index 9c70b13dc7..69fa5d8cfd 100644
--- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md
+++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-techdocs-module-addons-contrib
+## 1.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/integration@1.4.3-next.0
+
## 1.0.11-next.1
### Patch Changes
diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json
index 9089802b41..b5aebb262c 100644
--- a/plugins/techdocs-module-addons-contrib/package.json
+++ b/plugins/techdocs-module-addons-contrib/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-techdocs-module-addons-contrib",
"description": "Plugin module for contributed TechDocs Addons",
- "version": "1.0.11-next.1",
+ "version": "1.0.11-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md
index 5c13883594..28a11e4b57 100644
--- a/plugins/techdocs-node/CHANGELOG.md
+++ b/plugins/techdocs-node/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-techdocs-node
+## 1.6.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+ - @backstage/integration-aws-node@0.1.2-next.0
+
## 1.6.0-next.1
### Minor Changes
diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json
index 7328927307..4c3a4a3496 100644
--- a/plugins/techdocs-node/package.json
+++ b/plugins/techdocs-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-techdocs-node",
"description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli",
- "version": "1.6.0-next.1",
+ "version": "1.6.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts
index b24d85430b..6bcdf0d984 100644
--- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts
+++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts
@@ -565,7 +565,9 @@ describe('helpers', () => {
} = await getMkdocsYml(inputDir, defaultSiteOptions);
expect(mkdocsPath).toBe(key);
- expect(content).toBe(mkdocsDefaultYml.toString());
+ expect(content.split(/[\r\n]+/g)).toEqual(
+ mkdocsDefaultYml.toString().split(/[\r\n]+/g),
+ );
expect(configIsTemporary).toBe(true);
});
diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md
index 7894f77a44..cbc52cf570 100644
--- a/plugins/techdocs-react/CHANGELOG.md
+++ b/plugins/techdocs-react/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-techdocs-react
+## 1.1.4-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/config@1.0.7-next.0
+
## 1.1.4-next.1
### Patch Changes
diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json
index 3d31cc0e17..ae8d7e21ae 100644
--- a/plugins/techdocs-react/package.json
+++ b/plugins/techdocs-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-techdocs-react",
"description": "Shared frontend utilities for TechDocs and Addons",
- "version": "1.1.4-next.1",
+ "version": "1.1.4-next.2",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md
index 60d826f2c4..7ce9542731 100644
--- a/plugins/techdocs/CHANGELOG.md
+++ b/plugins/techdocs/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-techdocs
+## 1.6.0-next.2
+
+### Patch Changes
+
+- 65454876fb2: Minor API report tweaks
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-techdocs-react@1.1.4-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/plugin-search-react@1.5.1-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+ - @backstage/integration-react@1.1.11-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 1.6.0-next.1
### Patch Changes
diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json
index 8f15b11152..88ebb91c1b 100644
--- a/plugins/techdocs/package.json
+++ b/plugins/techdocs/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-techdocs",
"description": "The Backstage plugin that renders technical documentation for your components",
- "version": "1.6.0-next.1",
+ "version": "1.6.0-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md
index f22ef56503..6abd6c3562 100644
--- a/plugins/todo-backend/CHANGELOG.md
+++ b/plugins/todo-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-todo-backend
+## 0.1.40-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+ - @backstage/plugin-catalog-node@1.3.4-next.2
+ - @backstage/config@1.0.7-next.0
+ - @backstage/integration@1.4.3-next.0
+
## 0.1.40-next.1
### Patch Changes
diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json
index ebd874b3e6..cb37bc5eb5 100644
--- a/plugins/todo-backend/package.json
+++ b/plugins/todo-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-todo-backend",
"description": "A Backstage backend plugin that lets you browse TODO comments in your source code",
- "version": "0.1.40-next.1",
+ "version": "0.1.40-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/todo-backend/src/plugin.ts b/plugins/todo-backend/src/plugin.ts
index b9a73a84ee..640ea1a0ce 100644
--- a/plugins/todo-backend/src/plugin.ts
+++ b/plugins/todo-backend/src/plugin.ts
@@ -27,7 +27,7 @@ import { createRouter } from './service/router';
* @public
*/
export const todoPlugin = createBackendPlugin({
- pluginId: 'todo-backend',
+ pluginId: 'todo',
register(env) {
env.registerInit({
deps: {
diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md
index 3eb0e8a30b..3e716065a1 100644
--- a/plugins/todo/CHANGELOG.md
+++ b/plugins/todo/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-todo
+## 0.2.18-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.18-next.1
### Patch Changes
diff --git a/plugins/todo/package.json b/plugins/todo/package.json
index 01a0829835..6cc2491a78 100644
--- a/plugins/todo/package.json
+++ b/plugins/todo/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-todo",
"description": "A Backstage plugin that lets you browse TODO comments in your source code",
- "version": "0.2.18-next.1",
+ "version": "0.2.18-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md
index 3141c9f8b1..4bcf306e42 100644
--- a/plugins/user-settings-backend/CHANGELOG.md
+++ b/plugins/user-settings-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-user-settings-backend
+## 0.1.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.2.12-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/backend-plugin-api@0.4.1-next.2
+
## 0.1.7-next.1
### Patch Changes
diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json
index 833241dc72..a98e0e9313 100644
--- a/plugins/user-settings-backend/package.json
+++ b/plugins/user-settings-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-user-settings-backend",
"description": "The Backstage backend plugin to manage user settings",
- "version": "0.1.7-next.1",
+ "version": "0.1.7-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md
index 1cb2322c4d..435fa2b2d4 100644
--- a/plugins/user-settings/CHANGELOG.md
+++ b/plugins/user-settings/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-user-settings
+## 0.7.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-app-api@1.6.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.7.1-next.1
### Patch Changes
diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json
index 01ae0e1134..e49c54687d 100644
--- a/plugins/user-settings/package.json
+++ b/plugins/user-settings/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-user-settings",
"description": "A Backstage plugin that provides a settings page",
- "version": "0.7.1-next.1",
+ "version": "0.7.1-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md
index d3717a29e1..31b822c68b 100644
--- a/plugins/vault-backend/CHANGELOG.md
+++ b/plugins/vault-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-vault-backend
+## 0.2.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.5.0-next.2
+ - @backstage/backend-common@0.18.3-next.2
+ - @backstage/config@1.0.7-next.0
+
## 0.2.10-next.1
### Patch Changes
diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json
index f9966b2316..336363e9ad 100644
--- a/plugins/vault-backend/package.json
+++ b/plugins/vault-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-vault-backend",
"description": "A Backstage backend plugin that integrates towards Vault",
- "version": "0.2.10-next.1",
+ "version": "0.2.10-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md
index df3e5659d1..1f6d8446bd 100644
--- a/plugins/vault/CHANGELOG.md
+++ b/plugins/vault/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-vault
+## 0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/plugin-catalog-react@1.4.0-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/vault/package.json b/plugins/vault/package.json
index 20a8e235c0..127c9cf753 100644
--- a/plugins/vault/package.json
+++ b/plugins/vault/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-vault",
"description": "A Backstage plugin that integrates towards Vault",
- "version": "0.1.10-next.1",
+ "version": "0.1.10-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md
index 2ea83d9a11..e9a2023939 100644
--- a/plugins/xcmetrics/CHANGELOG.md
+++ b/plugins/xcmetrics/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-xcmetrics
+## 0.2.36-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.12.5-next.2
+ - @backstage/core-plugin-api@1.5.0-next.2
+
## 0.2.36-next.1
### Patch Changes
diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json
index 5e3ffebcba..fb7695e090 100644
--- a/plugins/xcmetrics/package.json
+++ b/plugins/xcmetrics/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-xcmetrics",
"description": "A Backstage plugin that shows XCode build metrics for your components",
- "version": "0.2.36-next.1",
+ "version": "0.2.36-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/yarn.lock b/yarn.lock
index 2bf9c900df..5c0f64c734 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -508,88 +508,48 @@ __metadata:
linkType: hard
"@aws-sdk/client-sqs@npm:^3.208.0":
- version: 3.276.0
- resolution: "@aws-sdk/client-sqs@npm:3.276.0"
+ version: 3.282.0
+ resolution: "@aws-sdk/client-sqs@npm:3.282.0"
dependencies:
"@aws-crypto/sha256-browser": 3.0.0
"@aws-crypto/sha256-js": 3.0.0
- "@aws-sdk/client-sts": 3.276.0
- "@aws-sdk/config-resolver": 3.272.0
- "@aws-sdk/credential-provider-node": 3.272.0
- "@aws-sdk/fetch-http-handler": 3.272.0
+ "@aws-sdk/client-sts": 3.282.0
+ "@aws-sdk/config-resolver": 3.282.0
+ "@aws-sdk/credential-provider-node": 3.282.0
+ "@aws-sdk/fetch-http-handler": 3.282.0
"@aws-sdk/hash-node": 3.272.0
"@aws-sdk/invalid-dependency": 3.272.0
"@aws-sdk/md5-js": 3.272.0
- "@aws-sdk/middleware-content-length": 3.272.0
- "@aws-sdk/middleware-endpoint": 3.272.0
- "@aws-sdk/middleware-host-header": 3.272.0
+ "@aws-sdk/middleware-content-length": 3.282.0
+ "@aws-sdk/middleware-endpoint": 3.282.0
+ "@aws-sdk/middleware-host-header": 3.282.0
"@aws-sdk/middleware-logger": 3.272.0
- "@aws-sdk/middleware-recursion-detection": 3.272.0
- "@aws-sdk/middleware-retry": 3.272.0
+ "@aws-sdk/middleware-recursion-detection": 3.282.0
+ "@aws-sdk/middleware-retry": 3.282.0
"@aws-sdk/middleware-sdk-sqs": 3.272.0
"@aws-sdk/middleware-serde": 3.272.0
- "@aws-sdk/middleware-signing": 3.272.0
+ "@aws-sdk/middleware-signing": 3.282.0
"@aws-sdk/middleware-stack": 3.272.0
- "@aws-sdk/middleware-user-agent": 3.272.0
+ "@aws-sdk/middleware-user-agent": 3.282.0
"@aws-sdk/node-config-provider": 3.272.0
- "@aws-sdk/node-http-handler": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/smithy-client": 3.272.0
+ "@aws-sdk/node-http-handler": 3.282.0
+ "@aws-sdk/protocol-http": 3.282.0
+ "@aws-sdk/smithy-client": 3.279.0
"@aws-sdk/types": 3.272.0
"@aws-sdk/url-parser": 3.272.0
"@aws-sdk/util-base64": 3.208.0
"@aws-sdk/util-body-length-browser": 3.188.0
"@aws-sdk/util-body-length-node": 3.208.0
- "@aws-sdk/util-defaults-mode-browser": 3.272.0
- "@aws-sdk/util-defaults-mode-node": 3.272.0
+ "@aws-sdk/util-defaults-mode-browser": 3.279.0
+ "@aws-sdk/util-defaults-mode-node": 3.282.0
"@aws-sdk/util-endpoints": 3.272.0
"@aws-sdk/util-retry": 3.272.0
- "@aws-sdk/util-user-agent-browser": 3.272.0
- "@aws-sdk/util-user-agent-node": 3.272.0
+ "@aws-sdk/util-user-agent-browser": 3.282.0
+ "@aws-sdk/util-user-agent-node": 3.282.0
"@aws-sdk/util-utf8": 3.254.0
fast-xml-parser: 4.1.2
tslib: ^2.3.1
- checksum: 88139fde34fa6348e841de13fce5e68b2dfb735c5358c959f9956a8c918048bde8b1ff701e8e701807af5f67f6df129056986b62a7e07096cc7097f3491d36b8
- languageName: node
- linkType: hard
-
-"@aws-sdk/client-sso-oidc@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/client-sso-oidc@npm:3.272.0"
- dependencies:
- "@aws-crypto/sha256-browser": 3.0.0
- "@aws-crypto/sha256-js": 3.0.0
- "@aws-sdk/config-resolver": 3.272.0
- "@aws-sdk/fetch-http-handler": 3.272.0
- "@aws-sdk/hash-node": 3.272.0
- "@aws-sdk/invalid-dependency": 3.272.0
- "@aws-sdk/middleware-content-length": 3.272.0
- "@aws-sdk/middleware-endpoint": 3.272.0
- "@aws-sdk/middleware-host-header": 3.272.0
- "@aws-sdk/middleware-logger": 3.272.0
- "@aws-sdk/middleware-recursion-detection": 3.272.0
- "@aws-sdk/middleware-retry": 3.272.0
- "@aws-sdk/middleware-serde": 3.272.0
- "@aws-sdk/middleware-stack": 3.272.0
- "@aws-sdk/middleware-user-agent": 3.272.0
- "@aws-sdk/node-config-provider": 3.272.0
- "@aws-sdk/node-http-handler": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/smithy-client": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/url-parser": 3.272.0
- "@aws-sdk/util-base64": 3.208.0
- "@aws-sdk/util-body-length-browser": 3.188.0
- "@aws-sdk/util-body-length-node": 3.208.0
- "@aws-sdk/util-defaults-mode-browser": 3.272.0
- "@aws-sdk/util-defaults-mode-node": 3.272.0
- "@aws-sdk/util-endpoints": 3.272.0
- "@aws-sdk/util-retry": 3.272.0
- "@aws-sdk/util-user-agent-browser": 3.272.0
- "@aws-sdk/util-user-agent-node": 3.272.0
- "@aws-sdk/util-utf8": 3.254.0
- tslib: ^2.3.1
- checksum: a1ee61c2fc86a74439e06c98aa10c8246e31579eb480b625321f7dfe8fd26af49bd6ead803da2443700c5943eab5ba90dfc33fc4d9f23b1a680850d73526da4d
+ checksum: d3a2a2abb27313666aa8c9842c91a098b2570878a9853d59bf07d480669723d77b74ad2ca8e5297dc593d8e76578c78c2634f81e4eed84b84b020b06af04c423
languageName: node
linkType: hard
@@ -633,46 +593,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/client-sso@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/client-sso@npm:3.272.0"
- dependencies:
- "@aws-crypto/sha256-browser": 3.0.0
- "@aws-crypto/sha256-js": 3.0.0
- "@aws-sdk/config-resolver": 3.272.0
- "@aws-sdk/fetch-http-handler": 3.272.0
- "@aws-sdk/hash-node": 3.272.0
- "@aws-sdk/invalid-dependency": 3.272.0
- "@aws-sdk/middleware-content-length": 3.272.0
- "@aws-sdk/middleware-endpoint": 3.272.0
- "@aws-sdk/middleware-host-header": 3.272.0
- "@aws-sdk/middleware-logger": 3.272.0
- "@aws-sdk/middleware-recursion-detection": 3.272.0
- "@aws-sdk/middleware-retry": 3.272.0
- "@aws-sdk/middleware-serde": 3.272.0
- "@aws-sdk/middleware-stack": 3.272.0
- "@aws-sdk/middleware-user-agent": 3.272.0
- "@aws-sdk/node-config-provider": 3.272.0
- "@aws-sdk/node-http-handler": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/smithy-client": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/url-parser": 3.272.0
- "@aws-sdk/util-base64": 3.208.0
- "@aws-sdk/util-body-length-browser": 3.188.0
- "@aws-sdk/util-body-length-node": 3.208.0
- "@aws-sdk/util-defaults-mode-browser": 3.272.0
- "@aws-sdk/util-defaults-mode-node": 3.272.0
- "@aws-sdk/util-endpoints": 3.272.0
- "@aws-sdk/util-retry": 3.272.0
- "@aws-sdk/util-user-agent-browser": 3.272.0
- "@aws-sdk/util-user-agent-node": 3.272.0
- "@aws-sdk/util-utf8": 3.254.0
- tslib: ^2.3.1
- checksum: 7549e813ef8088d22a0a1f9c8a42532d2d2050c932fd6e7d4f717aea2cd554938283f3af0f1fe9597b24724c6b2438947b3089452ed9c0dfafb1efad15f3ac60
- languageName: node
- linkType: hard
-
"@aws-sdk/client-sso@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/client-sso@npm:3.282.0"
@@ -713,50 +633,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/client-sts@npm:3.276.0":
- version: 3.276.0
- resolution: "@aws-sdk/client-sts@npm:3.276.0"
- dependencies:
- "@aws-crypto/sha256-browser": 3.0.0
- "@aws-crypto/sha256-js": 3.0.0
- "@aws-sdk/config-resolver": 3.272.0
- "@aws-sdk/credential-provider-node": 3.272.0
- "@aws-sdk/fetch-http-handler": 3.272.0
- "@aws-sdk/hash-node": 3.272.0
- "@aws-sdk/invalid-dependency": 3.272.0
- "@aws-sdk/middleware-content-length": 3.272.0
- "@aws-sdk/middleware-endpoint": 3.272.0
- "@aws-sdk/middleware-host-header": 3.272.0
- "@aws-sdk/middleware-logger": 3.272.0
- "@aws-sdk/middleware-recursion-detection": 3.272.0
- "@aws-sdk/middleware-retry": 3.272.0
- "@aws-sdk/middleware-sdk-sts": 3.272.0
- "@aws-sdk/middleware-serde": 3.272.0
- "@aws-sdk/middleware-signing": 3.272.0
- "@aws-sdk/middleware-stack": 3.272.0
- "@aws-sdk/middleware-user-agent": 3.272.0
- "@aws-sdk/node-config-provider": 3.272.0
- "@aws-sdk/node-http-handler": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/smithy-client": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/url-parser": 3.272.0
- "@aws-sdk/util-base64": 3.208.0
- "@aws-sdk/util-body-length-browser": 3.188.0
- "@aws-sdk/util-body-length-node": 3.208.0
- "@aws-sdk/util-defaults-mode-browser": 3.272.0
- "@aws-sdk/util-defaults-mode-node": 3.272.0
- "@aws-sdk/util-endpoints": 3.272.0
- "@aws-sdk/util-retry": 3.272.0
- "@aws-sdk/util-user-agent-browser": 3.272.0
- "@aws-sdk/util-user-agent-node": 3.272.0
- "@aws-sdk/util-utf8": 3.254.0
- fast-xml-parser: 4.1.2
- tslib: ^2.3.1
- checksum: 3250322448500789588d24b6fac295b551ab4c1661ab9aa93f173e63b4673260bb2e551c079d811da752115e583b76f5c7ffb16d94b3c66275e75e52a93f35f3
- languageName: node
- linkType: hard
-
"@aws-sdk/client-sts@npm:3.282.0, @aws-sdk/client-sts@npm:^3.208.0":
version: 3.282.0
resolution: "@aws-sdk/client-sts@npm:3.282.0"
@@ -801,19 +677,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/config-resolver@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/config-resolver@npm:3.272.0"
- dependencies:
- "@aws-sdk/signature-v4": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/util-config-provider": 3.208.0
- "@aws-sdk/util-middleware": 3.272.0
- tslib: ^2.3.1
- checksum: d2a2fa4f013ad04f50522aec1001efd34c62ababbc809b176d2e31e41828d867de616ff01bfcaa12603b344ca6838ea5946c72d21e5f2573b90828e29bad6e35
- languageName: node
- linkType: hard
-
"@aws-sdk/config-resolver@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/config-resolver@npm:3.282.0"
@@ -863,23 +726,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/credential-provider-ini@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/credential-provider-ini@npm:3.272.0"
- dependencies:
- "@aws-sdk/credential-provider-env": 3.272.0
- "@aws-sdk/credential-provider-imds": 3.272.0
- "@aws-sdk/credential-provider-process": 3.272.0
- "@aws-sdk/credential-provider-sso": 3.272.0
- "@aws-sdk/credential-provider-web-identity": 3.272.0
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/shared-ini-file-loader": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: 06c1dfc6bff09472e11dd7e2c295cfdf71c36af11cb6ba33ce0328aaf9d0baee3f99de8ceec32ff473925b55ad190c9f85f125cf43874c25e22c37e8e3c648d3
- languageName: node
- linkType: hard
-
"@aws-sdk/credential-provider-ini@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/credential-provider-ini@npm:3.282.0"
@@ -897,24 +743,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/credential-provider-node@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/credential-provider-node@npm:3.272.0"
- dependencies:
- "@aws-sdk/credential-provider-env": 3.272.0
- "@aws-sdk/credential-provider-imds": 3.272.0
- "@aws-sdk/credential-provider-ini": 3.272.0
- "@aws-sdk/credential-provider-process": 3.272.0
- "@aws-sdk/credential-provider-sso": 3.272.0
- "@aws-sdk/credential-provider-web-identity": 3.272.0
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/shared-ini-file-loader": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: 25c5ab8583821f63c7eb1a5257869dd21159d0b7643ff9a9c094e9b5c78c887bc441f1a2f974eaace62c1879d13e7d590bb3ea2623f5a5de822bf773b1aab100
- languageName: node
- linkType: hard
-
"@aws-sdk/credential-provider-node@npm:3.282.0, @aws-sdk/credential-provider-node@npm:^3.208.0":
version: 3.282.0
resolution: "@aws-sdk/credential-provider-node@npm:3.282.0"
@@ -945,20 +773,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/credential-provider-sso@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/credential-provider-sso@npm:3.272.0"
- dependencies:
- "@aws-sdk/client-sso": 3.272.0
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/shared-ini-file-loader": 3.272.0
- "@aws-sdk/token-providers": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: ac1ada61e67f6f0a82ed8507c0218a03fe40e2d1e4ee064578e63573f868195800088dc3e33d58d7d04877e464342987005aceb300e4db9a141080cdc695e46e
- languageName: node
- linkType: hard
-
"@aws-sdk/credential-provider-sso@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/credential-provider-sso@npm:3.282.0"
@@ -1075,19 +889,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/fetch-http-handler@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/fetch-http-handler@npm:3.272.0"
- dependencies:
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/querystring-builder": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/util-base64": 3.208.0
- tslib: ^2.3.1
- checksum: 63d047db7b7ebfee49af8bf42f3a7aa1bea37cc687e7046bc77913c23ed99056e91b5ab77739157428be73b2a2f29783a7a659ccf29a440dd63b750d313d46cc
- languageName: node
- linkType: hard
-
"@aws-sdk/fetch-http-handler@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/fetch-http-handler@npm:3.282.0"
@@ -1156,11 +957,11 @@ __metadata:
linkType: hard
"@aws-sdk/lib-storage@npm:^3.208.0":
- version: 3.276.0
- resolution: "@aws-sdk/lib-storage@npm:3.276.0"
+ version: 3.282.0
+ resolution: "@aws-sdk/lib-storage@npm:3.282.0"
dependencies:
- "@aws-sdk/middleware-endpoint": 3.272.0
- "@aws-sdk/smithy-client": 3.272.0
+ "@aws-sdk/middleware-endpoint": 3.282.0
+ "@aws-sdk/smithy-client": 3.279.0
buffer: 5.6.0
events: 3.3.0
stream-browserify: 3.0.0
@@ -1168,7 +969,7 @@ __metadata:
peerDependencies:
"@aws-sdk/abort-controller": ^3.0.0
"@aws-sdk/client-s3": ^3.0.0
- checksum: 1e34d3569c8cf2f7c42efdd7966a9faea64bf49f4fe1fcb0ff30ed86670a5ba2361bb14279e7dc1bc110a1ff9e5cec3551bc8a56b3c9c4d19f98ff4842a8de19
+ checksum: 14f1f21a653d239721ca488b6d7951511576a2e2652d240f3561ac0255cd4af321bc41531c15c3c6fae4095da062f5e841c6c9b58afd80be9bf105b63a256f72
languageName: node
linkType: hard
@@ -1196,17 +997,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-content-length@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-content-length@npm:3.272.0"
- dependencies:
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: e1a9c3e6fec8dcfed90bb44b25a8f4786b4ed0cbd79c6f69e3d8e91d394402ad4f2667231aafdcc05caf136a331434d54fac286a72ab5870dd90705a2e56243b
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-content-length@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-content-length@npm:3.282.0"
@@ -1218,22 +1008,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-endpoint@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-endpoint@npm:3.272.0"
- dependencies:
- "@aws-sdk/middleware-serde": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/signature-v4": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/url-parser": 3.272.0
- "@aws-sdk/util-config-provider": 3.208.0
- "@aws-sdk/util-middleware": 3.272.0
- tslib: ^2.3.1
- checksum: c3acd1a35d33cff87a43df371ae138faf6c9569497c36b009cafc2fdb1f21e352671df6eb56730634d7f135bef2a47ac588ac7cdd2905676292a418b79a0eab1
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-endpoint@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-endpoint@npm:3.282.0"
@@ -1276,17 +1050,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-host-header@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-host-header@npm:3.272.0"
- dependencies:
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: 3e191fe72de35b517a20fe47f647527579458091d4d66d55ef7e6b08107a4f4d7abe77afdcdd061776db906309d414525ff63e472c2c05d6e2447f41582f64fb
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-host-header@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-host-header@npm:3.282.0"
@@ -1318,17 +1081,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-recursion-detection@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-recursion-detection@npm:3.272.0"
- dependencies:
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: cdc150a4f3cbd5d7c6926befcf7eb49daea1d0ca054dbe7b82e013eb74f3850056b78603f61989c2bb3cdc748798674b6811c3011c6a8c1773e13dfa11ea3ae7
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-recursion-detection@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-recursion-detection@npm:3.282.0"
@@ -1340,21 +1092,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-retry@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-retry@npm:3.272.0"
- dependencies:
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/service-error-classification": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/util-middleware": 3.272.0
- "@aws-sdk/util-retry": 3.272.0
- tslib: ^2.3.1
- uuid: ^8.3.2
- checksum: 208e8f1b96f5ee47d28d76d0f7738f0ae7e355cb9aa24dcb88a8c4d9aa35bf833bf333c1ad4a6d11d18ec27b1713cac0ee04e0fdac17462059416a214f366944
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-retry@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-retry@npm:3.282.0"
@@ -1394,20 +1131,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-sdk-sts@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-sdk-sts@npm:3.272.0"
- dependencies:
- "@aws-sdk/middleware-signing": 3.272.0
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/signature-v4": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: d808f945ae7354ef7102737418794565f26af3ca3241c3873235284400a13faf118242e92eba1831c25fc249d9c6a15f3c16e4ae3101cd6d5ab175a669b70fcb
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-sdk-sts@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-sdk-sts@npm:3.282.0"
@@ -1432,20 +1155,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-signing@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-signing@npm:3.272.0"
- dependencies:
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/signature-v4": 3.272.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/util-middleware": 3.272.0
- tslib: ^2.3.1
- checksum: 0b711de21b0f2b28178b211ae2de962676038ed49ff9247810c2213018b77ca399285278a0b448a0242f92796e1360b83c09aa268fe64a7f153428b9ed919edc
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-signing@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-signing@npm:3.282.0"
@@ -1479,17 +1188,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/middleware-user-agent@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/middleware-user-agent@npm:3.272.0"
- dependencies:
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: a392a8c68509f118f008002e4ef6ba7fea9f93ade97963449e6eec951c0319a7cc8fd40cf77bda1540ff25ebbbe75785a6fc5ed4be63676144e5242892940732
- languageName: node
- linkType: hard
-
"@aws-sdk/middleware-user-agent@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/middleware-user-agent@npm:3.282.0"
@@ -1513,19 +1211,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/node-http-handler@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/node-http-handler@npm:3.272.0"
- dependencies:
- "@aws-sdk/abort-controller": 3.272.0
- "@aws-sdk/protocol-http": 3.272.0
- "@aws-sdk/querystring-builder": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: cbcdab82a7611d1d776197e921563ac6248173aa6e5a6f6e6486a735c71763ae69d1d6ae6de8acebcb8020cdfa089a776d9180929397291623db8f11a1f7b8a9
- languageName: node
- linkType: hard
-
"@aws-sdk/node-http-handler@npm:3.282.0, @aws-sdk/node-http-handler@npm:^3.208.0":
version: 3.282.0
resolution: "@aws-sdk/node-http-handler@npm:3.282.0"
@@ -1559,16 +1244,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/protocol-http@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/protocol-http@npm:3.272.0"
- dependencies:
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: 59d7c97b1a46bc3c072f56caec365472c9d94638923799ad2418cee52bb0eab945ab080cd63f5351ff45ad943dde9d88b294e096af36524e184c0764b2ea6cc5
- languageName: node
- linkType: hard
-
"@aws-sdk/protocol-http@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/protocol-http@npm:3.282.0"
@@ -1646,21 +1321,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/signature-v4@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/signature-v4@npm:3.272.0"
- dependencies:
- "@aws-sdk/is-array-buffer": 3.201.0
- "@aws-sdk/types": 3.272.0
- "@aws-sdk/util-hex-encoding": 3.201.0
- "@aws-sdk/util-middleware": 3.272.0
- "@aws-sdk/util-uri-escape": 3.201.0
- "@aws-sdk/util-utf8": 3.254.0
- tslib: ^2.3.1
- checksum: bdf997ed7779e173797bd31a9ae39bc9860e12cb7d0a734b4a47c76bde435c5c1d5f56dbb3c5f1a2b26a828367fd88f34a4527b8a12d4c1a60b3b0049aacf706
- languageName: node
- linkType: hard
-
"@aws-sdk/signature-v4@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/signature-v4@npm:3.282.0"
@@ -1676,17 +1336,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/smithy-client@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/smithy-client@npm:3.272.0"
- dependencies:
- "@aws-sdk/middleware-stack": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: 8ba3c4733a32c7c28ec06735b0fc3dbc33a1657bfc54dc28f6770b021fda74680c693812d8c6db2291197a275f32fd80be909dddda4eb726328bf34e8d18bccc
- languageName: node
- linkType: hard
-
"@aws-sdk/smithy-client@npm:3.279.0":
version: 3.279.0
resolution: "@aws-sdk/smithy-client@npm:3.279.0"
@@ -1698,19 +1347,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/token-providers@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/token-providers@npm:3.272.0"
- dependencies:
- "@aws-sdk/client-sso-oidc": 3.272.0
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/shared-ini-file-loader": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: 8d49846f4ad124707879a9b8adaea089c4d02dfd1c15dcceb083fecd538ecce1db65f1104e6178b13941acb2a4ae275c5cf9eb586d5d25757eb9fb454bdbb70c
- languageName: node
- linkType: hard
-
"@aws-sdk/token-providers@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/token-providers@npm:3.282.0"
@@ -1807,18 +1443,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/util-defaults-mode-browser@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.272.0"
- dependencies:
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/types": 3.272.0
- bowser: ^2.11.0
- tslib: ^2.3.1
- checksum: 56594cc954c6431ced3646668fd92d8229eb1c20a37d6c66b0ebf3ce88a7f9803c63d432c78412768ebf0d141fdacef01644ea0f3507e6fb295a22c80f728c1a
- languageName: node
- linkType: hard
-
"@aws-sdk/util-defaults-mode-browser@npm:3.279.0":
version: 3.279.0
resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.279.0"
@@ -1831,20 +1455,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/util-defaults-mode-node@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/util-defaults-mode-node@npm:3.272.0"
- dependencies:
- "@aws-sdk/config-resolver": 3.272.0
- "@aws-sdk/credential-provider-imds": 3.272.0
- "@aws-sdk/node-config-provider": 3.272.0
- "@aws-sdk/property-provider": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- checksum: ee0e44d78d70b6eab73d6e8455972218cb1a15950f47d81d72d094420b2719add34bf46218016f85242a2a155216d2a0542ed5f4e68e171efc09691125fcb6fd
- languageName: node
- linkType: hard
-
"@aws-sdk/util-defaults-mode-node@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/util-defaults-mode-node@npm:3.282.0"
@@ -1946,17 +1556,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/util-user-agent-browser@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/util-user-agent-browser@npm:3.272.0"
- dependencies:
- "@aws-sdk/types": 3.272.0
- bowser: ^2.11.0
- tslib: ^2.3.1
- checksum: e5ac1b88f9af45c2e0dbec40d2aa9c616634df252ac437f2dfd3aeb316fe561a5c09d481c075945843b3a7f5edafbc10ef26741c6ccacc4d435d8be7eeab179c
- languageName: node
- linkType: hard
-
"@aws-sdk/util-user-agent-browser@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/util-user-agent-browser@npm:3.282.0"
@@ -1968,22 +1567,6 @@ __metadata:
languageName: node
linkType: hard
-"@aws-sdk/util-user-agent-node@npm:3.272.0":
- version: 3.272.0
- resolution: "@aws-sdk/util-user-agent-node@npm:3.272.0"
- dependencies:
- "@aws-sdk/node-config-provider": 3.272.0
- "@aws-sdk/types": 3.272.0
- tslib: ^2.3.1
- peerDependencies:
- aws-crt: ">=1.0.0"
- peerDependenciesMeta:
- aws-crt:
- optional: true
- checksum: 25d5f39349190e6323f893de4f0e7a931751bf1521808210515ef8d951c1a6a3e5f1dc1773cbd5ca9f999c5d00f3a421ad570b5f79b20dc2692012a9f833ff24
- languageName: node
- linkType: hard
-
"@aws-sdk/util-user-agent-node@npm:3.282.0":
version: 3.282.0
resolution: "@aws-sdk/util-user-agent-node@npm:3.282.0"
@@ -2075,13 +1658,6 @@ __metadata:
languageName: node
linkType: hard
-"@azure/core-asynciterator-polyfill@npm:^1.0.0":
- version: 1.0.0
- resolution: "@azure/core-asynciterator-polyfill@npm:1.0.0"
- checksum: b6d3ab3f0ffc0a9f426a1d2cc90b81778730b14d81af7dcab9760c9e241f7c0f6843d45fad572dcd1379232b3fb2cacd76d110a0d54a999ceb1bf0fd9ed39e99
- languageName: node
- linkType: hard
-
"@azure/core-auth@npm:^1.1.4, @azure/core-auth@npm:^1.3.0, @azure/core-auth@npm:^1.4.0":
version: 1.4.0
resolution: "@azure/core-auth@npm:1.4.0"
@@ -2107,26 +1683,25 @@ __metadata:
languageName: node
linkType: hard
-"@azure/core-http@npm:^2.0.0":
- version: 2.2.4
- resolution: "@azure/core-http@npm:2.2.4"
+"@azure/core-http@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "@azure/core-http@npm:3.0.0"
dependencies:
"@azure/abort-controller": ^1.0.0
- "@azure/core-asynciterator-polyfill": ^1.0.0
"@azure/core-auth": ^1.3.0
"@azure/core-tracing": 1.0.0-preview.13
+ "@azure/core-util": ^1.1.1
"@azure/logger": ^1.0.0
"@types/node-fetch": ^2.5.0
"@types/tunnel": ^0.0.3
form-data: ^4.0.0
node-fetch: ^2.6.7
process: ^0.11.10
- tough-cookie: ^4.0.0
tslib: ^2.2.0
tunnel: ^0.0.6
uuid: ^8.3.0
xml2js: ^0.4.19
- checksum: abda8c34c6d54f61b77080b1d4c01b3828cf9a344eb100346ebcc5ef9903d8f57651fbc73c0230afad5fe497c5c6da576a77cf43827f87417cecac7d7e612967
+ checksum: 9b6885a60a8fdac924cc9544e09d66757ff4ed51ed20ce3c279321e684e21c295c091ad9d45477e02baae5255e3a92c5fbb2ac46687d261d66488c294b32846f
languageName: node
linkType: hard
@@ -2188,12 +1763,13 @@ __metadata:
languageName: node
linkType: hard
-"@azure/core-util@npm:^1.0.0":
- version: 1.0.0
- resolution: "@azure/core-util@npm:1.0.0"
+"@azure/core-util@npm:^1.0.0, @azure/core-util@npm:^1.1.1":
+ version: 1.2.0
+ resolution: "@azure/core-util@npm:1.2.0"
dependencies:
+ "@azure/abort-controller": ^1.0.0
tslib: ^2.2.0
- checksum: a0a9cce9452f78babb224fa2ea5566811bd946c55e5c867ca75e6ecd7fcf796b2ec2aa7424e141f03d8e14141e80f048897d0d3c227a7ff0bbaa9ba3d2fc14c9
+ checksum: 58c7e3c9e9fda27242c1ab1dbfcf11eab52cc3e6459a2509fa5572a3faebf3f24c6bf9d92883cd80974119fc1e2c16c7bd2c71f20cfbe670405515c73fdb4093
languageName: node
linkType: hard
@@ -2293,18 +1869,18 @@ __metadata:
linkType: hard
"@azure/storage-blob@npm:^12.5.0":
- version: 12.12.0
- resolution: "@azure/storage-blob@npm:12.12.0"
+ version: 12.13.0
+ resolution: "@azure/storage-blob@npm:12.13.0"
dependencies:
"@azure/abort-controller": ^1.0.0
- "@azure/core-http": ^2.0.0
+ "@azure/core-http": ^3.0.0
"@azure/core-lro": ^2.2.0
"@azure/core-paging": ^1.1.1
"@azure/core-tracing": 1.0.0-preview.13
"@azure/logger": ^1.0.0
events: ^3.0.0
tslib: ^2.2.0
- checksum: bb7f6514a251f8ec337718088b8c9ba80e27b34c786b7fb380fdca19eb3735a0da917dcfcdacef27d0eb256d007a37f89f3d6b08c55405cbcc04685f2a51da3b
+ checksum: 1509b8904eb46937b76f9acc04e9e0c39e8e9219a3bc3f5c006df7eb4d29ff2ed0ebbecc875f9372b5a349639e79123b30bbfb407864cfe91633dd6871a9bd99
languageName: node
linkType: hard
@@ -5373,7 +4949,6 @@ __metadata:
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
"@backstage/integration": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-catalog-common": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
"@backstage/plugin-kubernetes-common": "workspace:^"
@@ -5404,7 +4979,6 @@ __metadata:
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
"@backstage/integration": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
"@backstage/types": "workspace:^"
"@types/lodash": ^4.14.151
@@ -5431,7 +5005,6 @@ __metadata:
"@backstage/config": "workspace:^"
"@backstage/integration": "workspace:^"
"@backstage/plugin-bitbucket-cloud-common": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-catalog-common": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
"@backstage/plugin-events-node": "workspace:^"
@@ -5455,7 +5028,6 @@ __metadata:
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
"@backstage/integration": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
"@types/node-fetch": ^2.5.12
luxon: ^3.0.0
@@ -5478,7 +5050,7 @@ __metadata:
"@backstage/errors": "workspace:^"
"@backstage/integration": "workspace:^"
"@backstage/plugin-bitbucket-cloud-common": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
+ "@backstage/plugin-catalog-node": "workspace:^"
"@backstage/types": "workspace:^"
"@types/lodash": ^4.14.151
lodash: ^4.17.21
@@ -5501,7 +5073,6 @@ __metadata:
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
"@backstage/integration": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
"@types/fs-extra": ^9.0.1
fs-extra: 10.1.0
@@ -5559,7 +5130,6 @@ __metadata:
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
"@backstage/integration": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
"@backstage/types": "workspace:^"
"@types/lodash": ^4.14.151
@@ -5612,7 +5182,7 @@ __metadata:
"@backstage/cli": "workspace:^"
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
+ "@backstage/plugin-catalog-node": "workspace:^"
"@backstage/types": "workspace:^"
"@types/ldapjs": ^2.2.0
"@types/lodash": ^4.14.151
@@ -5635,7 +5205,6 @@ __metadata:
"@backstage/catalog-model": "workspace:^"
"@backstage/cli": "workspace:^"
"@backstage/config": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-catalog-node": "workspace:^"
"@microsoft/microsoft-graph-types": ^2.6.0
"@types/lodash": ^4.14.151
@@ -5676,13 +5245,14 @@ __metadata:
resolution: "@backstage/plugin-catalog-backend-module-puppetdb@workspace:plugins/catalog-backend-module-puppetdb"
dependencies:
"@backstage/backend-common": "workspace:^"
+ "@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-tasks": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/catalog-model": "workspace:^"
"@backstage/cli": "workspace:^"
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
+ "@backstage/plugin-catalog-node": "workspace:^"
"@backstage/types": "workspace:^"
"@types/lodash": ^4.14.151
lodash: ^4.17.21
@@ -8180,6 +7750,7 @@ __metadata:
"@types/express": ^4.17.6
"@types/fs-extra": ^9.0.1
"@types/git-url-parse": ^9.0.0
+ "@types/luxon": ^3.0.0
"@types/mock-fs": ^4.13.0
"@types/nunjucks": ^3.1.4
"@types/supertest": ^2.0.8
@@ -8214,6 +7785,7 @@ __metadata:
supertest: ^6.1.3
uuid: ^8.2.0
vm2: ^3.9.11
+ wait-for-expect: ^3.0.2
winston: ^3.2.1
yaml: ^2.0.0
zen-observable: ^0.10.0
@@ -11580,50 +11152,50 @@ __metadata:
languageName: node
linkType: hard
-"@jest/console@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/console@npm:29.3.1"
+"@jest/console@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/console@npm:29.4.3"
dependencies:
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
"@types/node": "*"
chalk: ^4.0.0
- jest-message-util: ^29.3.1
- jest-util: ^29.3.1
+ jest-message-util: ^29.4.3
+ jest-util: ^29.4.3
slash: ^3.0.0
- checksum: 9eecbfb6df4f5b810374849b7566d321255e6fd6e804546236650384966be532ff75a3e445a3277eadefe67ddf4dc56cd38332abd72d6a450f1bea9866efc6d7
+ checksum: 8d9b163febe735153b523db527742309f4d598eda22f17f04e030060329bd3da4de7420fc1f7812f7a16f08273654a7de094c4b4e8b81a99dbfc17cfb1629008
languageName: node
linkType: hard
-"@jest/core@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/core@npm:29.3.1"
+"@jest/core@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/core@npm:29.4.3"
dependencies:
- "@jest/console": ^29.3.1
- "@jest/reporters": ^29.3.1
- "@jest/test-result": ^29.3.1
- "@jest/transform": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/console": ^29.4.3
+ "@jest/reporters": ^29.4.3
+ "@jest/test-result": ^29.4.3
+ "@jest/transform": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/node": "*"
ansi-escapes: ^4.2.1
chalk: ^4.0.0
ci-info: ^3.2.0
exit: ^0.1.2
graceful-fs: ^4.2.9
- jest-changed-files: ^29.2.0
- jest-config: ^29.3.1
- jest-haste-map: ^29.3.1
- jest-message-util: ^29.3.1
- jest-regex-util: ^29.2.0
- jest-resolve: ^29.3.1
- jest-resolve-dependencies: ^29.3.1
- jest-runner: ^29.3.1
- jest-runtime: ^29.3.1
- jest-snapshot: ^29.3.1
- jest-util: ^29.3.1
- jest-validate: ^29.3.1
- jest-watcher: ^29.3.1
+ jest-changed-files: ^29.4.3
+ jest-config: ^29.4.3
+ jest-haste-map: ^29.4.3
+ jest-message-util: ^29.4.3
+ jest-regex-util: ^29.4.3
+ jest-resolve: ^29.4.3
+ jest-resolve-dependencies: ^29.4.3
+ jest-runner: ^29.4.3
+ jest-runtime: ^29.4.3
+ jest-snapshot: ^29.4.3
+ jest-util: ^29.4.3
+ jest-validate: ^29.4.3
+ jest-watcher: ^29.4.3
micromatch: ^4.0.4
- pretty-format: ^29.3.1
+ pretty-format: ^29.4.3
slash: ^3.0.0
strip-ansi: ^6.0.0
peerDependencies:
@@ -11631,7 +11203,7 @@ __metadata:
peerDependenciesMeta:
node-notifier:
optional: true
- checksum: e3ac9201e8a084ccd832b17877b56490402b919f227622bb24f9372931e77b869e60959d34144222ce20fb619d0a6a6be20b257adb077a6b0f430a4584a45b0f
+ checksum: 4aa10644d66f44f051d5dd9cdcedce27acc71216dbcc5e7adebdea458e27aefe27c78f457d7efd49f58b968c35f42de5a521590876e2013593e675120b9e6ab1
languageName: node
linkType: hard
@@ -11644,15 +11216,15 @@ __metadata:
languageName: node
linkType: hard
-"@jest/environment@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/environment@npm:29.3.1"
+"@jest/environment@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/environment@npm:29.4.3"
dependencies:
- "@jest/fake-timers": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/fake-timers": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/node": "*"
- jest-mock: ^29.3.1
- checksum: 974102aba7cc80508f787bb5504dcc96e5392e0a7776a63dffbf54ddc2c77d52ef4a3c08ed2eedec91965befff873f70cd7c9ed56f62bb132dcdb821730e6076
+ jest-mock: ^29.4.3
+ checksum: 7c1b0cc4e84b90f8a3bbeca9bbf088882c88aee70a81b3b8e24265dcb1cbc302cd1eee3319089cf65bfd39adbaea344903c712afea106cb8da6c86088d99c5fb
languageName: node
linkType: hard
@@ -11665,60 +11237,60 @@ __metadata:
languageName: node
linkType: hard
-"@jest/expect-utils@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/expect-utils@npm:29.3.1"
+"@jest/expect-utils@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/expect-utils@npm:29.4.3"
dependencies:
- jest-get-type: ^29.2.0
- checksum: 7f3b853eb1e4299988f66b9aa49c1aacb7b8da1cf5518dca4ccd966e865947eed8f1bde6c8f5207d8400e9af870112a44b57aa83515ad6ea5e4a04a971863adb
+ jest-get-type: ^29.4.3
+ checksum: 2bbed39ff2fb59f5acac465a1ce7303e3b4b62b479e4f386261986c9827f7f799ea912761e22629c5daf10addf8513f16733c14a29c2647bb66d4ee625e9ff92
languageName: node
linkType: hard
-"@jest/expect@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/expect@npm:29.3.1"
+"@jest/expect@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/expect@npm:29.4.3"
dependencies:
- expect: ^29.3.1
- jest-snapshot: ^29.3.1
- checksum: 1d7b5cc735c8a99bfbed884d80fdb43b23b3456f4ec88c50fd86404b097bb77fba84f44e707fc9b49f106ca1154ae03f7c54dc34754b03f8a54eeb420196e5bf
+ expect: ^29.4.3
+ jest-snapshot: ^29.4.3
+ checksum: 08d0d40077ec99a7491fe59d05821dbd31126cfba70875855d8a063698b7126b5f6c309c50811caacc6ae2f727c6e44f51bdcf1d6c1ea832b4f020045ef22d45
languageName: node
linkType: hard
-"@jest/fake-timers@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/fake-timers@npm:29.3.1"
+"@jest/fake-timers@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/fake-timers@npm:29.4.3"
dependencies:
- "@jest/types": ^29.3.1
- "@sinonjs/fake-timers": ^9.1.2
+ "@jest/types": ^29.4.3
+ "@sinonjs/fake-timers": ^10.0.2
"@types/node": "*"
- jest-message-util: ^29.3.1
- jest-mock: ^29.3.1
- jest-util: ^29.3.1
- checksum: b1dafa8cdc439ef428cd772c775f0b22703677f52615513eda11a104bbfc352d7ec69b1225db95d4ef2e1b4ef0f23e1a7d96de5313aeb0950f672e6548ae069d
+ jest-message-util: ^29.4.3
+ jest-mock: ^29.4.3
+ jest-util: ^29.4.3
+ checksum: adaceb9143c395cccf3d7baa0e49b7042c3092a554e8283146df19926247e34c21b5bde5688bb90e9e87b4a02e4587926c5d858ee0a38d397a63175d0a127874
languageName: node
linkType: hard
-"@jest/globals@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/globals@npm:29.3.1"
+"@jest/globals@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/globals@npm:29.4.3"
dependencies:
- "@jest/environment": ^29.3.1
- "@jest/expect": ^29.3.1
- "@jest/types": ^29.3.1
- jest-mock: ^29.3.1
- checksum: 4d2b9458aabf7c28fd167e53984477498c897b64eec67a7f84b8fff465235cae1456ee0721cb0e7943f0cda443c7656adb9801f9f34e27495b8ebbd9f3033100
+ "@jest/environment": ^29.4.3
+ "@jest/expect": ^29.4.3
+ "@jest/types": ^29.4.3
+ jest-mock: ^29.4.3
+ checksum: ea76b546ceb4aa5ce2bb3726df12f989b23150b51c9f7664790caa81b943012a657cf3a8525498af1c3518cdb387f54b816cfba1b0ddd22c7b20f03b1d7290b4
languageName: node
linkType: hard
-"@jest/reporters@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/reporters@npm:29.3.1"
+"@jest/reporters@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/reporters@npm:29.4.3"
dependencies:
"@bcoe/v8-coverage": ^0.2.3
- "@jest/console": ^29.3.1
- "@jest/test-result": ^29.3.1
- "@jest/transform": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/console": ^29.4.3
+ "@jest/test-result": ^29.4.3
+ "@jest/transform": ^29.4.3
+ "@jest/types": ^29.4.3
"@jridgewell/trace-mapping": ^0.3.15
"@types/node": "*"
chalk: ^4.0.0
@@ -11731,9 +11303,9 @@ __metadata:
istanbul-lib-report: ^3.0.0
istanbul-lib-source-maps: ^4.0.0
istanbul-reports: ^3.1.3
- jest-message-util: ^29.3.1
- jest-util: ^29.3.1
- jest-worker: ^29.3.1
+ jest-message-util: ^29.4.3
+ jest-util: ^29.4.3
+ jest-worker: ^29.4.3
slash: ^3.0.0
string-length: ^4.0.1
strip-ansi: ^6.0.0
@@ -11743,7 +11315,7 @@ __metadata:
peerDependenciesMeta:
node-notifier:
optional: true
- checksum: 273e0c6953285f01151e9d84ac1e55744802a1ec79fb62dafeea16a49adfe7b24e7f35bef47a0214e5e057272dbfdacf594208286b7766046fd0f3cfa2043840
+ checksum: 7aa2e429c915bd96c3334962addd69d2bbf52065725757ddde26b293f8c4420a1e8c65363cc3e1e5ec89100a5273ccd3771bec58325a2cc0d97afdc81995073a
languageName: node
linkType: hard
@@ -11756,70 +11328,70 @@ __metadata:
languageName: node
linkType: hard
-"@jest/schemas@npm:^29.0.0":
- version: 29.0.0
- resolution: "@jest/schemas@npm:29.0.0"
+"@jest/schemas@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/schemas@npm:29.4.3"
dependencies:
- "@sinclair/typebox": ^0.24.1
- checksum: 41355c78f09eb1097e57a3c5d0ca11c9099e235e01ea5fa4e3953562a79a6a9296c1d300f1ba50ca75236048829e056b00685cd2f1ff8285e56fd2ce01249acb
+ "@sinclair/typebox": ^0.25.16
+ checksum: ac754e245c19dc39e10ebd41dce09040214c96a4cd8efa143b82148e383e45128f24599195ab4f01433adae4ccfbe2db6574c90db2862ccd8551a86704b5bebd
languageName: node
linkType: hard
-"@jest/source-map@npm:^29.2.0":
- version: 29.2.0
- resolution: "@jest/source-map@npm:29.2.0"
+"@jest/source-map@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/source-map@npm:29.4.3"
dependencies:
"@jridgewell/trace-mapping": ^0.3.15
callsites: ^3.0.0
graceful-fs: ^4.2.9
- checksum: 09f76ab63d15dcf44b3035a79412164f43be34ec189575930f1a00c87e36ea0211ebd6a4fbe2253c2516e19b49b131f348ddbb86223ca7b6bbac9a6bc76ec96e
+ checksum: 2301d225145f8123540c0be073f35a80fd26a2f5e59550fd68525d8cea580fb896d12bf65106591ffb7366a8a19790076dbebc70e0f5e6ceb51f81827ed1f89c
languageName: node
linkType: hard
-"@jest/test-result@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/test-result@npm:29.3.1"
+"@jest/test-result@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/test-result@npm:29.4.3"
dependencies:
- "@jest/console": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/console": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/istanbul-lib-coverage": ^2.0.0
collect-v8-coverage: ^1.0.0
- checksum: b24ac283321189b624c372a6369c0674b0ee6d9e3902c213452c6334d037113718156b315364bee8cee0f03419c2bdff5e2c63967193fb422830e79cbb26866a
+ checksum: 164f102b96619ec283c2c39e208b8048e4674f75bf3c3a4f2e95048ae0f9226105add684b25f10d286d91c221625f877e2c1cfc3da46c42d7e1804da239318cb
languageName: node
linkType: hard
-"@jest/test-sequencer@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/test-sequencer@npm:29.3.1"
+"@jest/test-sequencer@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/test-sequencer@npm:29.4.3"
dependencies:
- "@jest/test-result": ^29.3.1
+ "@jest/test-result": ^29.4.3
graceful-fs: ^4.2.9
- jest-haste-map: ^29.3.1
+ jest-haste-map: ^29.4.3
slash: ^3.0.0
- checksum: a8325b1ea0ce644486fb63bb67cedd3524d04e3d7b1e6c1e3562bf12ef477ecd0cf34044391b2a07d925e1c0c8b4e0f3285035ceca3a474a2c55980f1708caf3
+ checksum: 145e1fa9379e5be3587bde6d585b8aee5cf4442b06926928a87e9aec7de5be91b581711d627c6ca13144d244fe05e5d248c13b366b51bedc404f9dcfbfd79e9e
languageName: node
linkType: hard
-"@jest/transform@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/transform@npm:29.3.1"
+"@jest/transform@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/transform@npm:29.4.3"
dependencies:
"@babel/core": ^7.11.6
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
"@jridgewell/trace-mapping": ^0.3.15
babel-plugin-istanbul: ^6.1.1
chalk: ^4.0.0
convert-source-map: ^2.0.0
fast-json-stable-stringify: ^2.1.0
graceful-fs: ^4.2.9
- jest-haste-map: ^29.3.1
- jest-regex-util: ^29.2.0
- jest-util: ^29.3.1
+ jest-haste-map: ^29.4.3
+ jest-regex-util: ^29.4.3
+ jest-util: ^29.4.3
micromatch: ^4.0.4
pirates: ^4.0.4
slash: ^3.0.0
- write-file-atomic: ^4.0.1
- checksum: 673df5900ffc95bc811084e09d6e47948034dea6ab6cc4f81f80977e3a52468a6c2284d0ba9796daf25a62ae50d12f7e97fc9a3a0c587f11f2a479ff5493ca53
+ write-file-atomic: ^4.0.2
+ checksum: 082d74e04044213aa7baa8de29f8383e5010034f867969c8602a2447a4ef2f484cfaf2491eba3179ce42f369f7a0af419cbd087910f7e5caf7aa5d1fe03f2ff9
languageName: node
linkType: hard
@@ -11850,17 +11422,17 @@ __metadata:
languageName: node
linkType: hard
-"@jest/types@npm:^29.3.1":
- version: 29.3.1
- resolution: "@jest/types@npm:29.3.1"
+"@jest/types@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "@jest/types@npm:29.4.3"
dependencies:
- "@jest/schemas": ^29.0.0
+ "@jest/schemas": ^29.4.3
"@types/istanbul-lib-coverage": ^2.0.0
"@types/istanbul-reports": ^3.0.0
"@types/node": "*"
"@types/yargs": ^17.0.8
chalk: ^4.0.0
- checksum: 6f9faf27507b845ff3839c1adc6dbd038d7046d03d37e84c9fc956f60718711a801a5094c7eeee6b39ccf42c0ab61347fdc0fa49ab493ae5a8efd2fd41228ee8
+ checksum: 1756f4149d360f98567f56f434144f7af23ed49a2c42889261a314df6b6654c2de70af618fb2ee0ee39cadaf10835b885845557184509503646c9cb9dcc02bac
languageName: node
linkType: hard
@@ -13984,6 +13556,13 @@ __metadata:
languageName: node
linkType: hard
+"@sinclair/typebox@npm:^0.25.16":
+ version: 0.25.23
+ resolution: "@sinclair/typebox@npm:0.25.23"
+ checksum: 5720daec6e604be9ac849e6361cfa30d19f4d01934c9b79a3a5f5290dfcefaa300192ea0d384bb5dd0104432d88447bbad27adfacdf0b0f042b510bf15fbd5db
+ languageName: node
+ linkType: hard
+
"@sindresorhus/is@npm:^4.0.0":
version: 4.0.0
resolution: "@sindresorhus/is@npm:4.0.0"
@@ -14009,6 +13588,15 @@ __metadata:
languageName: node
linkType: hard
+"@sinonjs/fake-timers@npm:^10.0.2":
+ version: 10.0.2
+ resolution: "@sinonjs/fake-timers@npm:10.0.2"
+ dependencies:
+ "@sinonjs/commons": ^2.0.0
+ checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824
+ languageName: node
+ linkType: hard
+
"@sinonjs/fake-timers@npm:^7.0.4":
version: 7.1.2
resolution: "@sinonjs/fake-timers@npm:7.1.2"
@@ -15450,12 +15038,12 @@ __metadata:
linkType: hard
"@types/jest@npm:*, @types/jest@npm:^29.0.0":
- version: 29.2.6
- resolution: "@types/jest@npm:29.2.6"
+ version: 29.4.0
+ resolution: "@types/jest@npm:29.4.0"
dependencies:
expect: ^29.0.0
pretty-format: ^29.0.0
- checksum: 90190ac830334af1470d255853f9621fe657e5030b4d96773fc1f884833cd303c76580b00c1b86dc38a8db94f1c7141d462190437a10af31852b8845a57c48ba
+ checksum: 23760282362a252e6690314584d83a47512d4cd61663e957ed3398ecf98195fe931c45606ee2f9def12f8ed7d8aa102d492ec42d26facdaf8b78094a31e6568e
languageName: node
linkType: hard
@@ -16195,11 +15783,11 @@ __metadata:
linkType: hard
"@types/sanitize-html@npm:^2.6.2":
- version: 2.8.0
- resolution: "@types/sanitize-html@npm:2.8.0"
+ version: 2.8.1
+ resolution: "@types/sanitize-html@npm:2.8.1"
dependencies:
htmlparser2: ^8.0.0
- checksum: 6e583cac673832536fac8da53890073f753baf2c49826fd0c2831e615cb5527692d03b2b5ba9eb8caf8694de4bfb1c31fd12398d2b68331725590a6ceb8f82fe
+ checksum: 9c07d3a9d925e291472f74b097fb179b32659ea01834f728887811e5fc75cf2b17d844e32e97c0e583eba993af86a3f8250c82c8fa3152abf9ff2a8582972906
languageName: node
linkType: hard
@@ -17424,18 +17012,18 @@ __metadata:
languageName: node
linkType: hard
-"apollo-reporting-protobuf@npm:^3.3.1, apollo-reporting-protobuf@npm:^3.3.3":
- version: 3.3.3
- resolution: "apollo-reporting-protobuf@npm:3.3.3"
+"apollo-reporting-protobuf@npm:^3.3.1, apollo-reporting-protobuf@npm:^3.4.0":
+ version: 3.4.0
+ resolution: "apollo-reporting-protobuf@npm:3.4.0"
dependencies:
"@apollo/protobufjs": 1.2.6
- checksum: 6900db30476ef2e888ecef4c291e26579eba9695dc874ca8b3d1f93064bea307689172790b9d574849e5bdb371953ea38f2caddc5abb51e1ca197197f3d56d28
+ checksum: 5bf50e9cecd3c2334cd12e0ebe59be6c4d7b1b9ee443c7d913011ea1b84513f57561fb6c3ceb66083321acb6d1c56f72e2ab0edf378cf742693409eb8dcdc46b
languageName: node
linkType: hard
-"apollo-server-core@npm:^3.11.1":
- version: 3.11.1
- resolution: "apollo-server-core@npm:3.11.1"
+"apollo-server-core@npm:^3.12.0":
+ version: 3.12.0
+ resolution: "apollo-server-core@npm:3.12.0"
dependencies:
"@apollo/utils.keyvaluecache": ^1.0.1
"@apollo/utils.logger": ^1.0.0
@@ -17446,11 +17034,11 @@ __metadata:
"@graphql-tools/schema": ^8.0.0
"@josephg/resolvable": ^1.0.0
apollo-datasource: ^3.3.2
- apollo-reporting-protobuf: ^3.3.3
+ apollo-reporting-protobuf: ^3.4.0
apollo-server-env: ^4.2.1
apollo-server-errors: ^3.3.1
- apollo-server-plugin-base: ^3.7.1
- apollo-server-types: ^3.7.1
+ apollo-server-plugin-base: ^3.7.2
+ apollo-server-types: ^3.8.0
async-retry: ^1.2.1
fast-json-stable-stringify: ^2.1.0
graphql-tag: ^2.11.0
@@ -17462,7 +17050,7 @@ __metadata:
whatwg-mimetype: ^3.0.0
peerDependencies:
graphql: ^15.3.0 || ^16.0.0
- checksum: a5cb7cff331680c2a926c64e88f744425b724bcfae46aeb02ae636d0b6f57a605e561eb284e765618bd0b2b5f8c556c92183f69852f2e4f5889368fee6aa38dc
+ checksum: b7a37a78901d38a330c9df8fe870da3dcf512f43ab60fdf9ab0ba37be03977db5d4b72eabf51a830d2a9dcfb2974d7bfbc5aa8719e3afac113c8bd7222740b8f
languageName: node
linkType: hard
@@ -17484,9 +17072,9 @@ __metadata:
languageName: node
linkType: hard
-"apollo-server-express@npm:^3.0.0, apollo-server-express@npm:^3.11.1":
- version: 3.11.1
- resolution: "apollo-server-express@npm:3.11.1"
+"apollo-server-express@npm:^3.0.0, apollo-server-express@npm:^3.12.0":
+ version: 3.12.0
+ resolution: "apollo-server-express@npm:3.12.0"
dependencies:
"@types/accepts": ^1.3.5
"@types/body-parser": 1.19.2
@@ -17494,54 +17082,54 @@ __metadata:
"@types/express": 4.17.14
"@types/express-serve-static-core": 4.17.31
accepts: ^1.3.5
- apollo-server-core: ^3.11.1
- apollo-server-types: ^3.7.1
+ apollo-server-core: ^3.12.0
+ apollo-server-types: ^3.8.0
body-parser: ^1.19.0
cors: ^2.8.5
parseurl: ^1.3.3
peerDependencies:
express: ^4.17.1
graphql: ^15.3.0 || ^16.0.0
- checksum: 1db1a77aaa2f760c885233ded249b632e467bb4895d1c3f797df6e197a9ca7021c5b65dd8829e88fd6dbf32d925c7dcf62b48b949a518e2e31072c490302fa60
+ checksum: bd4bc213f506e2aeb2be961961de51e431f8774344b349e9b02f475714a623703eb62423ad968a8f8b6859919ae0d1912c40cf15a4df24e6f81b4f4c5653e70b
languageName: node
linkType: hard
-"apollo-server-plugin-base@npm:^3.7.1":
- version: 3.7.1
- resolution: "apollo-server-plugin-base@npm:3.7.1"
+"apollo-server-plugin-base@npm:^3.7.2":
+ version: 3.7.2
+ resolution: "apollo-server-plugin-base@npm:3.7.2"
dependencies:
- apollo-server-types: ^3.7.1
+ apollo-server-types: ^3.8.0
peerDependencies:
graphql: ^15.3.0 || ^16.0.0
- checksum: db8c5f658da8c51c067bd6659b31ec2436d4961437b6f6f6b1b2a109d26764bc52a4dbe1bdafcb3c712b0e2f13ca10ed787e90423505685d2043a77363bdfc0b
+ checksum: d6ea6dbfad8bb82959286eae89878ccccbd09743c3df2b76bf790f470cbf5441ba06dcb6835a25f0bf32f4df05722cce157ae983ce32db4b69de8a72c9949e2e
languageName: node
linkType: hard
-"apollo-server-types@npm:^3.7.1":
- version: 3.7.1
- resolution: "apollo-server-types@npm:3.7.1"
+"apollo-server-types@npm:^3.8.0":
+ version: 3.8.0
+ resolution: "apollo-server-types@npm:3.8.0"
dependencies:
"@apollo/utils.keyvaluecache": ^1.0.1
"@apollo/utils.logger": ^1.0.0
- apollo-reporting-protobuf: ^3.3.3
+ apollo-reporting-protobuf: ^3.4.0
apollo-server-env: ^4.2.1
peerDependencies:
graphql: ^15.3.0 || ^16.0.0
- checksum: fe9a0847d0b8ab70dbe407b4ba1f5e506d351ff1f728193f4b308806e73b958f50537478a71edeefdd66fcf3dbf32ec732b6ffe6542860d5b683b1d657a019a2
+ checksum: 20accd42b65ceb95819a1610c410488fbe548ee309227d7fa22fd17dd1205e557091ba9c9a20efa532192098a4193e34eb58fc91d762b55fdf31229ac9fc7133
languageName: node
linkType: hard
"apollo-server@npm:^3.0.0":
- version: 3.11.1
- resolution: "apollo-server@npm:3.11.1"
+ version: 3.12.0
+ resolution: "apollo-server@npm:3.12.0"
dependencies:
"@types/express": 4.17.14
- apollo-server-core: ^3.11.1
- apollo-server-express: ^3.11.1
+ apollo-server-core: ^3.12.0
+ apollo-server-express: ^3.12.0
express: ^4.17.1
peerDependencies:
graphql: ^15.3.0 || ^16.0.0
- checksum: 6d4e981682e3b60313dddfe999c408c683f7e4cdeed5c14b6d6245b708808b94cb14df67ebe1b9df38df6b5193a9291089c41e287d014f2a9f94b2f3ecc9b376
+ checksum: 6f3dade76f202f04a890b2385923a0319a859a0ab48121b1636e22d5eae83afe042d7a0a501aff3d8816e67de4f29f8efa598e350814a40f41d079610dee346e
languageName: node
linkType: hard
@@ -18102,20 +17690,20 @@ __metadata:
languageName: node
linkType: hard
-"babel-jest@npm:^29.3.1":
- version: 29.3.1
- resolution: "babel-jest@npm:29.3.1"
+"babel-jest@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "babel-jest@npm:29.4.3"
dependencies:
- "@jest/transform": ^29.3.1
+ "@jest/transform": ^29.4.3
"@types/babel__core": ^7.1.14
babel-plugin-istanbul: ^6.1.1
- babel-preset-jest: ^29.2.0
+ babel-preset-jest: ^29.4.3
chalk: ^4.0.0
graceful-fs: ^4.2.9
slash: ^3.0.0
peerDependencies:
"@babel/core": ^7.8.0
- checksum: 793848238a771a931ddeb5930b9ec8ab800522ac8d64933665698f4a39603d157e572e20b57d79610277e1df88d3ee82b180d59a21f3570388f602beeb38a595
+ checksum: a1a95937adb5e717dbffc2eb9e583fa6d26c7e5d5b07bb492a2d7f68631510a363e9ff097eafb642ad642dfac9dc2b13872b584f680e166a4f0922c98ea95853
languageName: node
linkType: hard
@@ -18141,15 +17729,15 @@ __metadata:
languageName: node
linkType: hard
-"babel-plugin-jest-hoist@npm:^29.2.0":
- version: 29.2.0
- resolution: "babel-plugin-jest-hoist@npm:29.2.0"
+"babel-plugin-jest-hoist@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "babel-plugin-jest-hoist@npm:29.4.3"
dependencies:
"@babel/template": ^7.3.3
"@babel/types": ^7.3.3
"@types/babel__core": ^7.1.14
"@types/babel__traverse": ^7.0.6
- checksum: 368d271ceae491ae6b96cd691434859ea589fbe5fd5aead7660df75d02394077273c6442f61f390e9347adffab57a32b564d0fabcf1c53c4b83cd426cb644072
+ checksum: c8702a6db6b30ec39dfb9f8e72b501c13895231ed80b15ed2648448f9f0c7b7cc4b1529beac31802ae655f63479a05110ca612815aa25fb1b0e6c874e1589137
languageName: node
linkType: hard
@@ -18288,15 +17876,15 @@ __metadata:
languageName: node
linkType: hard
-"babel-preset-jest@npm:^29.2.0":
- version: 29.2.0
- resolution: "babel-preset-jest@npm:29.2.0"
+"babel-preset-jest@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "babel-preset-jest@npm:29.4.3"
dependencies:
- babel-plugin-jest-hoist: ^29.2.0
+ babel-plugin-jest-hoist: ^29.4.3
babel-preset-current-node-syntax: ^1.0.0
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 1b09a2db968c36e064daf98082cfffa39c849b63055112ddc56fc2551fd0d4783897265775b1d2f8a257960a3339745de92e74feb01bad86d41c4cecbfa854fc
+ checksum: a091721861ea2f8d969ace8fe06570cff8f2e847dbc6e4800abacbe63f72131abde615ce0a3b6648472c97e55a5be7f8bf7ae381e2b194ad2fa1737096febcf5
languageName: node
linkType: hard
@@ -21539,10 +21127,10 @@ __metadata:
languageName: node
linkType: hard
-"diff-sequences@npm:^29.3.1":
- version: 29.3.1
- resolution: "diff-sequences@npm:29.3.1"
- checksum: 8edab8c383355022e470779a099852d595dd856f9f5bd7af24f177e74138a668932268b4c4fd54096eed643861575c3652d4ecbbb1a9d710488286aed3ffa443
+"diff-sequences@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "diff-sequences@npm:29.4.3"
+ checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7
languageName: node
linkType: hard
@@ -23452,16 +23040,16 @@ __metadata:
languageName: node
linkType: hard
-"expect@npm:^29.0.0, expect@npm:^29.3.1":
- version: 29.3.1
- resolution: "expect@npm:29.3.1"
+"expect@npm:^29.0.0, expect@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "expect@npm:29.4.3"
dependencies:
- "@jest/expect-utils": ^29.3.1
- jest-get-type: ^29.2.0
- jest-matcher-utils: ^29.3.1
- jest-message-util: ^29.3.1
- jest-util: ^29.3.1
- checksum: e9588c2a430b558b9a3dc72d4ad05f36b047cb477bc6a7bb9cfeef7614fe7e5edbab424c2c0ce82739ee21ecbbbd24596259528209f84cd72500cc612d910d30
+ "@jest/expect-utils": ^29.4.3
+ jest-get-type: ^29.4.3
+ jest-matcher-utils: ^29.4.3
+ jest-message-util: ^29.4.3
+ jest-util: ^29.4.3
+ checksum: ff9dd8c50c0c6fd4b2b00f6dbd7ab0e2063fe1953be81a8c10ae1c005c7f5667ba452918e2efb055504b72b701a4f82575a081a0a7158efb16d87991b0366feb
languageName: node
linkType: hard
@@ -27050,57 +26638,57 @@ __metadata:
languageName: node
linkType: hard
-"jest-changed-files@npm:^29.2.0":
- version: 29.2.0
- resolution: "jest-changed-files@npm:29.2.0"
+"jest-changed-files@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-changed-files@npm:29.4.3"
dependencies:
execa: ^5.0.0
p-limit: ^3.1.0
- checksum: 8ad8290324db1de2ee3c9443d3e3fbfdcb6d72ec7054c5796be2854b2bc239dea38a7c797c8c9c2bd959f539d44305790f2f75b18f3046b04317ed77c7480cb1
+ checksum: 9a70bd8e92b37e18ad26d8bea97c516f41119fb7046b4255a13c76d557b0e54fa0629726de5a093fadfd6a0a08ce45da65a57086664d505b8db4b3133133e141
languageName: node
linkType: hard
-"jest-circus@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-circus@npm:29.3.1"
+"jest-circus@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-circus@npm:29.4.3"
dependencies:
- "@jest/environment": ^29.3.1
- "@jest/expect": ^29.3.1
- "@jest/test-result": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/environment": ^29.4.3
+ "@jest/expect": ^29.4.3
+ "@jest/test-result": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/node": "*"
chalk: ^4.0.0
co: ^4.6.0
dedent: ^0.7.0
is-generator-fn: ^2.0.0
- jest-each: ^29.3.1
- jest-matcher-utils: ^29.3.1
- jest-message-util: ^29.3.1
- jest-runtime: ^29.3.1
- jest-snapshot: ^29.3.1
- jest-util: ^29.3.1
+ jest-each: ^29.4.3
+ jest-matcher-utils: ^29.4.3
+ jest-message-util: ^29.4.3
+ jest-runtime: ^29.4.3
+ jest-snapshot: ^29.4.3
+ jest-util: ^29.4.3
p-limit: ^3.1.0
- pretty-format: ^29.3.1
+ pretty-format: ^29.4.3
slash: ^3.0.0
stack-utils: ^2.0.3
- checksum: 125710debd998ad9693893e7c1235e271b79f104033b8169d82afe0bc0d883f8f5245feef87adcbb22ad27ff749fd001aa998d11a132774b03b4e2b8af77d5d8
+ checksum: 2739bef9c888743b49ff3fe303131381618e5d2f250f613a91240d9c86e19e6874fc904cbd8bcb02ec9ec59a84e5dae4ffec929f0c6171e87ddbc05508a137f4
languageName: node
linkType: hard
-"jest-cli@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-cli@npm:29.3.1"
+"jest-cli@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-cli@npm:29.4.3"
dependencies:
- "@jest/core": ^29.3.1
- "@jest/test-result": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/core": ^29.4.3
+ "@jest/test-result": ^29.4.3
+ "@jest/types": ^29.4.3
chalk: ^4.0.0
exit: ^0.1.2
graceful-fs: ^4.2.9
import-local: ^3.0.2
- jest-config: ^29.3.1
- jest-util: ^29.3.1
- jest-validate: ^29.3.1
+ jest-config: ^29.4.3
+ jest-util: ^29.4.3
+ jest-validate: ^29.4.3
prompts: ^2.0.1
yargs: ^17.3.1
peerDependencies:
@@ -27110,34 +26698,34 @@ __metadata:
optional: true
bin:
jest: bin/jest.js
- checksum: 829895d33060042443bd1e9e87eb68993773d74f2c8a9b863acf53cece39d227ae0e7d76df2e9c5934c414bdf70ce398a34b3122cfe22164acb2499a74d7288d
+ checksum: f4c9f6d76cde2c60a4169acbebb3f862728be03bcf3fe0077d2e55da7f9f3c3e9483cfa6e936832d35eabf96ee5ebf0300c4b0bd43cffff099801793466bfdd8
languageName: node
linkType: hard
-"jest-config@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-config@npm:29.3.1"
+"jest-config@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-config@npm:29.4.3"
dependencies:
"@babel/core": ^7.11.6
- "@jest/test-sequencer": ^29.3.1
- "@jest/types": ^29.3.1
- babel-jest: ^29.3.1
+ "@jest/test-sequencer": ^29.4.3
+ "@jest/types": ^29.4.3
+ babel-jest: ^29.4.3
chalk: ^4.0.0
ci-info: ^3.2.0
deepmerge: ^4.2.2
glob: ^7.1.3
graceful-fs: ^4.2.9
- jest-circus: ^29.3.1
- jest-environment-node: ^29.3.1
- jest-get-type: ^29.2.0
- jest-regex-util: ^29.2.0
- jest-resolve: ^29.3.1
- jest-runner: ^29.3.1
- jest-util: ^29.3.1
- jest-validate: ^29.3.1
+ jest-circus: ^29.4.3
+ jest-environment-node: ^29.4.3
+ jest-get-type: ^29.4.3
+ jest-regex-util: ^29.4.3
+ jest-resolve: ^29.4.3
+ jest-runner: ^29.4.3
+ jest-util: ^29.4.3
+ jest-validate: ^29.4.3
micromatch: ^4.0.4
parse-json: ^5.2.0
- pretty-format: ^29.3.1
+ pretty-format: ^29.4.3
slash: ^3.0.0
strip-json-comments: ^3.1.1
peerDependencies:
@@ -27148,7 +26736,7 @@ __metadata:
optional: true
ts-node:
optional: true
- checksum: 6e663f04ae1024a53a4c2c744499b4408ca9a8b74381dd5e31b11bb3c7393311ecff0fb61b06287768709eb2c9e5a2fd166d258f5a9123abbb4c5812f99c12fe
+ checksum: 92f9a9c6850b18682cb01892774a33967472af23a5844438d8c68077d5f2a29b15b665e4e4db7de3d74002a6dca158cd5b2cb9f5debfd2cce5e1aee6c74e3873
languageName: node
linkType: hard
@@ -27173,72 +26761,72 @@ __metadata:
languageName: node
linkType: hard
-"jest-diff@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-diff@npm:29.3.1"
+"jest-diff@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-diff@npm:29.4.3"
dependencies:
chalk: ^4.0.0
- diff-sequences: ^29.3.1
- jest-get-type: ^29.2.0
- pretty-format: ^29.3.1
- checksum: ac5c09745f2b1897e6f53216acaf6ed44fc4faed8e8df053ff4ac3db5d2a1d06a17b876e49faaa15c8a7a26f5671bcbed0a93781dcc2835f781c79a716a591a9
+ diff-sequences: ^29.4.3
+ jest-get-type: ^29.4.3
+ pretty-format: ^29.4.3
+ checksum: 877fd1edffef6b319688c27b152e5b28e2bc4bcda5ce0ca90d7e137f9fafda4280bae25403d4c0bfd9806c2c0b15d966aa2dfaf5f9928ec8f1ccea7fa1d08ed6
languageName: node
linkType: hard
-"jest-docblock@npm:^29.2.0":
- version: 29.2.0
- resolution: "jest-docblock@npm:29.2.0"
+"jest-docblock@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-docblock@npm:29.4.3"
dependencies:
detect-newline: ^3.0.0
- checksum: b3f1227b7d73fc9e4952180303475cf337b36fa65c7f730ac92f0580f1c08439983262fee21cf3dba11429aa251b4eee1e3bc74796c5777116b400d78f9d2bbe
+ checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df
languageName: node
linkType: hard
-"jest-each@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-each@npm:29.3.1"
+"jest-each@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-each@npm:29.4.3"
dependencies:
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
chalk: ^4.0.0
- jest-get-type: ^29.2.0
- jest-util: ^29.3.1
- pretty-format: ^29.3.1
- checksum: 16d51ef8f96fba44a3479f1c6f7672027e3b39236dc4e41217c38fe60a3b66b022ffcee72f8835a442f7a8a0a65980a93fb8e73a9782d192452526e442ad049a
+ jest-get-type: ^29.4.3
+ jest-util: ^29.4.3
+ pretty-format: ^29.4.3
+ checksum: 1f72738338399efab0139eaea18bc198be0c6ed889770c8cbfa70bf9c724e8171fe1d3a29a94f9f39b8493ee6b2529bb350fb7c7c75e0d7eddfd28c253c79f9d
languageName: node
linkType: hard
"jest-environment-jsdom@npm:^29.0.2":
- version: 29.3.1
- resolution: "jest-environment-jsdom@npm:29.3.1"
+ version: 29.4.3
+ resolution: "jest-environment-jsdom@npm:29.4.3"
dependencies:
- "@jest/environment": ^29.3.1
- "@jest/fake-timers": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/environment": ^29.4.3
+ "@jest/fake-timers": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/jsdom": ^20.0.0
"@types/node": "*"
- jest-mock: ^29.3.1
- jest-util: ^29.3.1
+ jest-mock: ^29.4.3
+ jest-util: ^29.4.3
jsdom: ^20.0.0
peerDependencies:
canvas: ^2.5.0
peerDependenciesMeta:
canvas:
optional: true
- checksum: 91b04ed02b2275c3a47740e20c2691f67c4295e17174c8ccd3a71fe77707239e487506bd157279b4257ce1be0a8c2be377817ee85689966a9e604bb6ef1199f0
+ checksum: 3fb29bb4b472e05a38fdb235aa936ad469dfa2f6c1cab97fe3d1a7c585351976d05c7bbbd715b9747f070a225dcf10a9166df1461e0fb838ea7a377a8e64bed4
languageName: node
linkType: hard
-"jest-environment-node@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-environment-node@npm:29.3.1"
+"jest-environment-node@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-environment-node@npm:29.4.3"
dependencies:
- "@jest/environment": ^29.3.1
- "@jest/fake-timers": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/environment": ^29.4.3
+ "@jest/fake-timers": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/node": "*"
- jest-mock: ^29.3.1
- jest-util: ^29.3.1
- checksum: 16d4854bd2d35501bd4862ca069baf27ce9f5fd7642fdcab9d2dab49acd28c082d0c8882bf2bb28ed7bbaada486da577c814c9688ddc62d1d9f74a954fde996a
+ jest-mock: ^29.4.3
+ jest-util: ^29.4.3
+ checksum: 3c7362edfdbd516e83af7367c95dde35761a482b174de9735c07633405486ec73e19624e9bea4333fca33c24e8d65eaa1aa6594e0cb6bfeeeb564ccc431ee61d
languageName: node
linkType: hard
@@ -27249,43 +26837,43 @@ __metadata:
languageName: node
linkType: hard
-"jest-get-type@npm:^29.2.0":
- version: 29.2.0
- resolution: "jest-get-type@npm:29.2.0"
- checksum: e396fd880a30d08940ed8a8e43cd4595db1b8ff09649018eb358ca701811137556bae82626af73459e3c0f8c5e972ed1e57fd3b1537b13a260893dac60a90942
+"jest-get-type@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-get-type@npm:29.4.3"
+ checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce
languageName: node
linkType: hard
-"jest-haste-map@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-haste-map@npm:29.3.1"
+"jest-haste-map@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-haste-map@npm:29.4.3"
dependencies:
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
"@types/graceful-fs": ^4.1.3
"@types/node": "*"
anymatch: ^3.0.3
fb-watchman: ^2.0.0
fsevents: ^2.3.2
graceful-fs: ^4.2.9
- jest-regex-util: ^29.2.0
- jest-util: ^29.3.1
- jest-worker: ^29.3.1
+ jest-regex-util: ^29.4.3
+ jest-util: ^29.4.3
+ jest-worker: ^29.4.3
micromatch: ^4.0.4
walker: ^1.0.8
dependenciesMeta:
fsevents:
optional: true
- checksum: 97ea26af0c28a2ba568c9c65d06211487bbcd501cb4944f9d55e07fd2b00ad96653ea2cc9033f3d5b7dc1feda33e47ae9cc56b400191ea4533be213c9f82e67c
+ checksum: c7a83ebe6008b3fe96a96235e8153092e54b14df68e0f4205faedec57450df26b658578495a71c6d82494c01fbb44bca98c1506a6b2b9c920696dcc5d2e2bc59
languageName: node
linkType: hard
-"jest-leak-detector@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-leak-detector@npm:29.3.1"
+"jest-leak-detector@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-leak-detector@npm:29.4.3"
dependencies:
- jest-get-type: ^29.2.0
- pretty-format: ^29.3.1
- checksum: 0dd8ed31ae0b5a3d14f13f567ca8567f2663dd2d540d1e55511d3b3fd7f80a1d075392179674ebe9fab9be0b73678bf4d2f8bbbc0f4bdd52b9815259194da559
+ jest-get-type: ^29.4.3
+ pretty-format: ^29.4.3
+ checksum: ec2b45e6f0abce81bd0dd0f6fd06b433c24d1ec865267af7640fae540ec868b93752598e407a9184d9c7419cbf32e8789007cc8c1be1a84f8f7321a0f8ad01f1
languageName: node
linkType: hard
@@ -27301,15 +26889,15 @@ __metadata:
languageName: node
linkType: hard
-"jest-matcher-utils@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-matcher-utils@npm:29.3.1"
+"jest-matcher-utils@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-matcher-utils@npm:29.4.3"
dependencies:
chalk: ^4.0.0
- jest-diff: ^29.3.1
- jest-get-type: ^29.2.0
- pretty-format: ^29.3.1
- checksum: 311e8d9f1e935216afc7dd8c6acf1fbda67a7415e1afb1bf72757213dfb025c1f2dc5e2c185c08064a35cdc1f2d8e40c57616666774ed1b03e57eb311c20ec77
+ jest-diff: ^29.4.3
+ jest-get-type: ^29.4.3
+ pretty-format: ^29.4.3
+ checksum: 9e13cbe42d2113bab2691110c7c3ba5cec3b94abad2727e1de90929d0f67da444e9b2066da3b476b5bf788df53a8ede0e0a950cfb06a04e4d6d566d115ee4f1d
languageName: node
linkType: hard
@@ -27330,31 +26918,31 @@ __metadata:
languageName: node
linkType: hard
-"jest-message-util@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-message-util@npm:29.3.1"
+"jest-message-util@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-message-util@npm:29.4.3"
dependencies:
"@babel/code-frame": ^7.12.13
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
"@types/stack-utils": ^2.0.0
chalk: ^4.0.0
graceful-fs: ^4.2.9
micromatch: ^4.0.4
- pretty-format: ^29.3.1
+ pretty-format: ^29.4.3
slash: ^3.0.0
stack-utils: ^2.0.3
- checksum: 15d0a2fca3919eb4570bbf575734780c4b9e22de6aae903c4531b346699f7deba834c6c86fe6e9a83ad17fac0f7935511cf16dce4d71a93a71ebb25f18a6e07b
+ checksum: 64f06b9550021e68da0059020bea8691283cf818918810bb67192d7b7fb9b691c7eadf55c2ca3cd04df5394918f2327245077095cdc0d6b04be3532d2c7d0ced
languageName: node
linkType: hard
-"jest-mock@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-mock@npm:29.3.1"
+"jest-mock@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-mock@npm:29.4.3"
dependencies:
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
"@types/node": "*"
- jest-util: ^29.3.1
- checksum: 9098852cb2866db4a1a59f9f7581741dfc572f648e9e574a1b187fd69f5f2f6190ad387ede21e139a8b80a6a1343ecc3d6751cd2ae1ae11d7ea9fa1950390fb2
+ jest-util: ^29.4.3
+ checksum: 8eb4a29b02d2cd03faac0290b6df6d23b4ffa43f72b21c7fff3c7dd04a2797355b1e85862b70b15341dd33ee3a693b17db5520a6f6e6b81ee75601987de6a1a2
languageName: node
linkType: hard
@@ -27370,102 +26958,102 @@ __metadata:
languageName: node
linkType: hard
-"jest-regex-util@npm:^29.2.0":
- version: 29.2.0
- resolution: "jest-regex-util@npm:29.2.0"
- checksum: 7c533e51c51230dac20c0d7395b19b8366cb022f7c6e08e6bcf2921626840ff90424af4c9b4689f02f0addfc9b071c4cd5f8f7a989298a4c8e0f9c94418ca1c3
+"jest-regex-util@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-regex-util@npm:29.4.3"
+ checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a
languageName: node
linkType: hard
-"jest-resolve-dependencies@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-resolve-dependencies@npm:29.3.1"
+"jest-resolve-dependencies@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-resolve-dependencies@npm:29.4.3"
dependencies:
- jest-regex-util: ^29.2.0
- jest-snapshot: ^29.3.1
- checksum: 6ec4727a87c6e7954e93de9949ab9967b340ee2f07626144c273355f05a2b65fa47eb8dece2d6e5f4fd99cdb893510a3540aa5e14ba443f70b3feb63f6f98982
+ jest-regex-util: ^29.4.3
+ jest-snapshot: ^29.4.3
+ checksum: 3ad934cd2170c9658d8800f84a975dafc866ec85b7ce391c640c09c3744ced337787620d8667dc8d1fa5e0b1493f973caa1a1bb980e4e6a50b46a1720baf0bd1
languageName: node
linkType: hard
-"jest-resolve@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-resolve@npm:29.3.1"
+"jest-resolve@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-resolve@npm:29.4.3"
dependencies:
chalk: ^4.0.0
graceful-fs: ^4.2.9
- jest-haste-map: ^29.3.1
+ jest-haste-map: ^29.4.3
jest-pnp-resolver: ^1.2.2
- jest-util: ^29.3.1
- jest-validate: ^29.3.1
+ jest-util: ^29.4.3
+ jest-validate: ^29.4.3
resolve: ^1.20.0
- resolve.exports: ^1.1.0
+ resolve.exports: ^2.0.0
slash: ^3.0.0
- checksum: 0dea22ed625e07b8bfee52dea1391d3a4b453c1a0c627a0fa7c22e44bb48e1c289afe6f3c316def70753773f099c4e8f436c7a2cc12fcc6c7dd6da38cba2cd5f
+ checksum: 056a66beccf833f3c7e5a8fc9bfec218886e87b0b103decdbdf11893669539df489d1490cd6d5f0eea35731e8be0d2e955a6710498f970d2eae734da4df029dc
languageName: node
linkType: hard
-"jest-runner@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-runner@npm:29.3.1"
+"jest-runner@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-runner@npm:29.4.3"
dependencies:
- "@jest/console": ^29.3.1
- "@jest/environment": ^29.3.1
- "@jest/test-result": ^29.3.1
- "@jest/transform": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/console": ^29.4.3
+ "@jest/environment": ^29.4.3
+ "@jest/test-result": ^29.4.3
+ "@jest/transform": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/node": "*"
chalk: ^4.0.0
emittery: ^0.13.1
graceful-fs: ^4.2.9
- jest-docblock: ^29.2.0
- jest-environment-node: ^29.3.1
- jest-haste-map: ^29.3.1
- jest-leak-detector: ^29.3.1
- jest-message-util: ^29.3.1
- jest-resolve: ^29.3.1
- jest-runtime: ^29.3.1
- jest-util: ^29.3.1
- jest-watcher: ^29.3.1
- jest-worker: ^29.3.1
+ jest-docblock: ^29.4.3
+ jest-environment-node: ^29.4.3
+ jest-haste-map: ^29.4.3
+ jest-leak-detector: ^29.4.3
+ jest-message-util: ^29.4.3
+ jest-resolve: ^29.4.3
+ jest-runtime: ^29.4.3
+ jest-util: ^29.4.3
+ jest-watcher: ^29.4.3
+ jest-worker: ^29.4.3
p-limit: ^3.1.0
source-map-support: 0.5.13
- checksum: 61ad445d8a5f29573332f27a21fc942fb0d2a82bf901a0ea1035bf3bd7f349d1e425f71f54c3a3f89b292a54872c3248d395a2829d987f26b6025b15530ea5d2
+ checksum: c41108e5da01e0b8fdc2a06c5042eb49bb1d8db0e0d4651769fd1b9fe84ab45188617c11a3a8e1c83748b29bfe57dd77001ec57e86e3e3c30f3534e0314f8882
languageName: node
linkType: hard
-"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-runtime@npm:29.3.1"
+"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-runtime@npm:29.4.3"
dependencies:
- "@jest/environment": ^29.3.1
- "@jest/fake-timers": ^29.3.1
- "@jest/globals": ^29.3.1
- "@jest/source-map": ^29.2.0
- "@jest/test-result": ^29.3.1
- "@jest/transform": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/environment": ^29.4.3
+ "@jest/fake-timers": ^29.4.3
+ "@jest/globals": ^29.4.3
+ "@jest/source-map": ^29.4.3
+ "@jest/test-result": ^29.4.3
+ "@jest/transform": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/node": "*"
chalk: ^4.0.0
cjs-module-lexer: ^1.0.0
collect-v8-coverage: ^1.0.0
glob: ^7.1.3
graceful-fs: ^4.2.9
- jest-haste-map: ^29.3.1
- jest-message-util: ^29.3.1
- jest-mock: ^29.3.1
- jest-regex-util: ^29.2.0
- jest-resolve: ^29.3.1
- jest-snapshot: ^29.3.1
- jest-util: ^29.3.1
+ jest-haste-map: ^29.4.3
+ jest-message-util: ^29.4.3
+ jest-mock: ^29.4.3
+ jest-regex-util: ^29.4.3
+ jest-resolve: ^29.4.3
+ jest-snapshot: ^29.4.3
+ jest-util: ^29.4.3
slash: ^3.0.0
strip-bom: ^4.0.0
- checksum: 82f27b48f000be074064a854e16e768f9453e9b791d8c5f9316606c37f871b5b10f70544c1b218ab9784f00bd972bb77f868c5ab6752c275be2cd219c351f5a7
+ checksum: b99f8a910d1a38e7476058ba04ad44dfd3d93e837bb7c301d691e646a1085412fde87f06fbe271c9145f0e72d89400bfa7f6994bc30d456c7742269f37d0f570
languageName: node
linkType: hard
-"jest-snapshot@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-snapshot@npm:29.3.1"
+"jest-snapshot@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-snapshot@npm:29.4.3"
dependencies:
"@babel/core": ^7.11.6
"@babel/generator": ^7.7.2
@@ -27473,25 +27061,25 @@ __metadata:
"@babel/plugin-syntax-typescript": ^7.7.2
"@babel/traverse": ^7.7.2
"@babel/types": ^7.3.3
- "@jest/expect-utils": ^29.3.1
- "@jest/transform": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/expect-utils": ^29.4.3
+ "@jest/transform": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/babel__traverse": ^7.0.6
"@types/prettier": ^2.1.5
babel-preset-current-node-syntax: ^1.0.0
chalk: ^4.0.0
- expect: ^29.3.1
+ expect: ^29.4.3
graceful-fs: ^4.2.9
- jest-diff: ^29.3.1
- jest-get-type: ^29.2.0
- jest-haste-map: ^29.3.1
- jest-matcher-utils: ^29.3.1
- jest-message-util: ^29.3.1
- jest-util: ^29.3.1
+ jest-diff: ^29.4.3
+ jest-get-type: ^29.4.3
+ jest-haste-map: ^29.4.3
+ jest-matcher-utils: ^29.4.3
+ jest-message-util: ^29.4.3
+ jest-util: ^29.4.3
natural-compare: ^1.4.0
- pretty-format: ^29.3.1
+ pretty-format: ^29.4.3
semver: ^7.3.5
- checksum: d7d0077935e78c353c828be78ccb092e12ba7622cb0577f21641fadd728ae63a7c1f4a0d8113bfb38db3453a64bfa232fb1cdeefe0e2b48c52ef4065b0ab75ae
+ checksum: 79ba52f2435e23ce72b1309be4b17fdbcb299d1c2ce97ebb61df9a62711e9463035f63b4c849181b2fe5aa17b3e09d30ee4668cc25fb3c6f59511c010b4d9494
languageName: node
linkType: hard
@@ -27509,47 +27097,47 @@ __metadata:
languageName: node
linkType: hard
-"jest-util@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-util@npm:29.3.1"
+"jest-util@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-util@npm:29.4.3"
dependencies:
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
"@types/node": "*"
chalk: ^4.0.0
ci-info: ^3.2.0
graceful-fs: ^4.2.9
picomatch: ^2.2.3
- checksum: f67c60f062b94d21cb60e84b3b812d64b7bfa81fe980151de5c17a74eb666042d0134e2e756d099b7606a1fcf1d633824d2e58197d01d76dde1e2dc00dfcd413
+ checksum: 606b3e6077895baf8fb4ad4d08c134f37a6b81d5ba77ae654c942b1ae4b7294ab3b5a0eb93db34f129407b367970cf3b76bf5c80897b30f215f2bc8bf20a5f3f
languageName: node
linkType: hard
-"jest-validate@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-validate@npm:29.3.1"
+"jest-validate@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-validate@npm:29.4.3"
dependencies:
- "@jest/types": ^29.3.1
+ "@jest/types": ^29.4.3
camelcase: ^6.2.0
chalk: ^4.0.0
- jest-get-type: ^29.2.0
+ jest-get-type: ^29.4.3
leven: ^3.1.0
- pretty-format: ^29.3.1
- checksum: 92584f0b8ac284235f12b3b812ccbc43ef6dea080a3b98b1aa81adbe009e962d0aa6131f21c8157b30ac3d58f335961694238a93d553d1d1e02ab264c923778c
+ pretty-format: ^29.4.3
+ checksum: 983e56430d86bed238448cae031535c1d908f760aa312cd4a4ec0e92f3bc1b6675415ddf57cdeceedb8ad9c698e5bcd10f0a856dfc93a8923bdecc7733f4ba80
languageName: node
linkType: hard
-"jest-watcher@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-watcher@npm:29.3.1"
+"jest-watcher@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-watcher@npm:29.4.3"
dependencies:
- "@jest/test-result": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/test-result": ^29.4.3
+ "@jest/types": ^29.4.3
"@types/node": "*"
ansi-escapes: ^4.2.1
chalk: ^4.0.0
emittery: ^0.13.1
- jest-util: ^29.3.1
+ jest-util: ^29.4.3
string-length: ^4.0.1
- checksum: 60d189473486c73e9d540406a30189da5a3c67bfb0fb4ad4a83991c189135ef76d929ec99284ca5a505fe4ee9349ae3c99b54d2e00363e72837b46e77dec9642
+ checksum: 44b64991b3414db853c3756f14690028f4edef7aebfb204a4291cc1901c2239fa27a8687c5c5abbecc74bf613e0bb9b1378bf766430c9febcc71e9c0cb5ad8fc
languageName: node
linkType: hard
@@ -27584,26 +27172,26 @@ __metadata:
languageName: node
linkType: hard
-"jest-worker@npm:^29.3.1":
- version: 29.3.1
- resolution: "jest-worker@npm:29.3.1"
+"jest-worker@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "jest-worker@npm:29.4.3"
dependencies:
"@types/node": "*"
- jest-util: ^29.3.1
+ jest-util: ^29.4.3
merge-stream: ^2.0.0
supports-color: ^8.0.0
- checksum: 38687fcbdc2b7ddc70bbb5dfc703ae095b46b3c7f206d62ecdf5f4d16e336178e217302138f3b906125576bb1cfe4cfe8d43681276fa5899d138ed9422099fb3
+ checksum: c99ae66f257564613e72c5797c3a68f21a22e1c1fb5f30d14695ff5b508a0d2405f22748f13a3df8d1015b5e16abb130170f81f047ff68f58b6b1d2ff6ebc51b
languageName: node
linkType: hard
"jest@npm:^29.0.2":
- version: 29.3.1
- resolution: "jest@npm:29.3.1"
+ version: 29.4.3
+ resolution: "jest@npm:29.4.3"
dependencies:
- "@jest/core": ^29.3.1
- "@jest/types": ^29.3.1
+ "@jest/core": ^29.4.3
+ "@jest/types": ^29.4.3
import-local: ^3.0.2
- jest-cli: ^29.3.1
+ jest-cli: ^29.4.3
peerDependencies:
node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
peerDependenciesMeta:
@@ -27611,7 +27199,7 @@ __metadata:
optional: true
bin:
jest: bin/jest.js
- checksum: 613f4ec657b14dd84c0056b2fef1468502927fd551bef0b19d4a91576a609678fb316c6a5b5fc6120dd30dd4ff4569070ffef3cb507db9bb0260b28ddaa18d7a
+ checksum: 084d10d1ceaade3c40e6d3bbd71b9b71b8919ba6fbd6f1f6699bdc259a6ba2f7350c7ccbfa10c11f7e3e01662853650a6244210179542fe4ba87e77dc3f3109f
languageName: node
linkType: hard
@@ -33286,14 +32874,14 @@ __metadata:
languageName: node
linkType: hard
-"pretty-format@npm:^29.0.0, pretty-format@npm:^29.3.1":
- version: 29.3.1
- resolution: "pretty-format@npm:29.3.1"
+"pretty-format@npm:^29.0.0, pretty-format@npm:^29.4.3":
+ version: 29.4.3
+ resolution: "pretty-format@npm:29.4.3"
dependencies:
- "@jest/schemas": ^29.0.0
+ "@jest/schemas": ^29.4.3
ansi-styles: ^5.0.0
react-is: ^18.0.0
- checksum: 9917a0bb859cd7a24a343363f70d5222402c86d10eb45bcc2f77b23a4e67586257390e959061aec22762a782fe6bafb59bf34eb94527bc2e5d211afdb287eb4e
+ checksum: 3258b9a010bd79b3cf73783ad1e4592b6326fc981b6e31b742f316f14e7fbac09b48a9dbf274d092d9bde404db9fe16f518370e121837dc078a597392e6e5cc5
languageName: node
linkType: hard
@@ -35066,10 +34654,10 @@ __metadata:
languageName: node
linkType: hard
-"resolve.exports@npm:^1.1.0":
- version: 1.1.0
- resolution: "resolve.exports@npm:1.1.0"
- checksum: 52865af8edb088f6c7759a328584a5de6b226754f004b742523adcfe398cfbc4559515104bc2ae87b8e78b1e4de46c9baec400b3fb1f7d517b86d2d48a098a2d
+"resolve.exports@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "resolve.exports@npm:2.0.0"
+ checksum: d8bee3b0cc0a0ae6c8323710983505bc6a3a2574f718e96f01e048a0f0af035941434b386cc9efc7eededc5e1199726185c306ec6f6a1aa55d5fbad926fd0634
languageName: node
linkType: hard
@@ -37332,13 +36920,13 @@ __metadata:
linkType: hard
"swr@npm:^2.0.0":
- version: 2.0.4
- resolution: "swr@npm:2.0.4"
+ version: 2.1.0
+ resolution: "swr@npm:2.1.0"
dependencies:
use-sync-external-store: ^1.2.0
peerDependencies:
react: ^16.11.0 || ^17.0.0 || ^18.0.0
- checksum: 2fd26baed9a0ad3ecf24d7a64c4929f9c3be71c942e883ab369c3929aa297a47b0512c29ed8cdfd0ce2e3f5ee3f181d80c16b2b95128a0ae58bc133b4a0ea5a8
+ checksum: 7de1799f319c7ebfb996cb843279169144b7087215ce7318dd6011590908341ac7d5bca93a197666557c2450b0297d9efbc610fd069b82dc3387130c619965fc
languageName: node
linkType: hard
@@ -39609,7 +39197,7 @@ __metadata:
languageName: node
linkType: hard
-"write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.1":
+"write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.2":
version: 4.0.2
resolution: "write-file-atomic@npm:4.0.2"
dependencies:
From 99df676e3241618bf162267edd8e01d95b5ff673 Mon Sep 17 00:00:00 2001
From: Heikki Hellgren
Date: Thu, 9 Mar 2023 17:06:56 +0200
Subject: [PATCH 047/511] feat: allow adding external links to shortcuts
This is behind a new property `allowExternalLinks` to make sure the
application developer knows what he is doing. Only http(s) links are
allowed.
Signed-off-by: Heikki Hellgren
---
.changeset/strong-crews-repeat.md | 5 +++
packages/app/src/components/Root/Root.tsx | 2 +-
plugins/shortcuts/README.md | 2 +
plugins/shortcuts/api-report.md | 2 +
plugins/shortcuts/src/AddShortcut.tsx | 10 ++++-
plugins/shortcuts/src/EditShortcut.tsx | 10 ++++-
plugins/shortcuts/src/ShortcutForm.test.tsx | 44 +++++++++++++++++++++
plugins/shortcuts/src/ShortcutForm.tsx | 26 +++++++++---
plugins/shortcuts/src/ShortcutItem.tsx | 4 +-
plugins/shortcuts/src/Shortcuts.tsx | 3 ++
10 files changed, 98 insertions(+), 10 deletions(-)
create mode 100644 .changeset/strong-crews-repeat.md
diff --git a/.changeset/strong-crews-repeat.md b/.changeset/strong-crews-repeat.md
new file mode 100644
index 0000000000..144c1842c6
--- /dev/null
+++ b/.changeset/strong-crews-repeat.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-shortcuts': minor
+---
+
+Allow external links to be added as shortcuts
diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx
index 8cec54326a..8b71637773 100644
--- a/packages/app/src/components/Root/Root.tsx
+++ b/packages/app/src/components/Root/Root.tsx
@@ -167,7 +167,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => (
-
+
diff --git a/plugins/shortcuts/README.md b/plugins/shortcuts/README.md
index cd79901656..46b878a579 100644
--- a/plugins/shortcuts/README.md
+++ b/plugins/shortcuts/README.md
@@ -44,6 +44,8 @@ export const SidebarComponent = () => (
);
```
+To allow external links to be added as shortcut, you can add `allowExternalLinks` property to the `` component.
+
The plugin exports a `shortcutApiRef` but the plugin includes a default implementation of the `ShortcutApi` that uses `localStorage` to store each user's shortcuts.
To overwrite the default implementation add it to the App's `apis.ts`:
diff --git a/plugins/shortcuts/api-report.md b/plugins/shortcuts/api-report.md
index 1aa1dea003..657db8e2ca 100644
--- a/plugins/shortcuts/api-report.md
+++ b/plugins/shortcuts/api-report.md
@@ -57,6 +57,8 @@ export const shortcutsPlugin: BackstagePlugin<{}, {}, {}>;
// @public
export interface ShortcutsProps {
+ // (undocumented)
+ allowExternalLinks?: boolean;
// (undocumented)
icon?: IconComponent;
}
diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx
index e4b1ba84ce..1e14767531 100644
--- a/plugins/shortcuts/src/AddShortcut.tsx
+++ b/plugins/shortcuts/src/AddShortcut.tsx
@@ -45,9 +45,16 @@ type Props = {
onClose: () => void;
anchorEl?: Element;
api: ShortcutApi;
+
+ allowExternalLinks?: boolean;
};
-export const AddShortcut = ({ onClose, anchorEl, api }: Props) => {
+export const AddShortcut = ({
+ onClose,
+ anchorEl,
+ api,
+ allowExternalLinks,
+}: Props) => {
const classes = useStyles();
const alertApi = useApi(alertApiRef);
const { pathname } = useLocation();
@@ -114,6 +121,7 @@ export const AddShortcut = ({ onClose, anchorEl, api }: Props) => {
onClose={handleClose}
onSave={handleSave}
formValues={formValues}
+ allowExternalLinks={allowExternalLinks}
/>
diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx
index 702275e90e..5336841633 100644
--- a/plugins/shortcuts/src/EditShortcut.tsx
+++ b/plugins/shortcuts/src/EditShortcut.tsx
@@ -46,9 +46,16 @@ type Props = {
onClose: () => void;
anchorEl?: Element;
api: ShortcutApi;
+ allowExternalLinks?: boolean;
};
-export const EditShortcut = ({ shortcut, onClose, anchorEl, api }: Props) => {
+export const EditShortcut = ({
+ shortcut,
+ onClose,
+ anchorEl,
+ api,
+ allowExternalLinks,
+}: Props) => {
const classes = useStyles();
const alertApi = useApi(alertApiRef);
const open = Boolean(anchorEl);
@@ -127,6 +134,7 @@ export const EditShortcut = ({ shortcut, onClose, anchorEl, api }: Props) => {
formValues={{ url: shortcut.url, title: shortcut.title }}
onClose={handleClose}
onSave={handleSave}
+ allowExternalLinks={allowExternalLinks}
/>
diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx
index 2582148fc7..3a52356b5d 100644
--- a/plugins/shortcuts/src/ShortcutForm.test.tsx
+++ b/plugins/shortcuts/src/ShortcutForm.test.tsx
@@ -43,6 +43,50 @@ describe('ShortcutForm', () => {
});
});
+ it('allows external links', async () => {
+ await renderInTestApp();
+
+ const urlInput = screen.getByPlaceholderText('Enter a URL');
+ const titleInput = screen.getByPlaceholderText('Enter a display name');
+ fireEvent.change(urlInput, {
+ target: { value: 'https://www.backstage.io' },
+ });
+ fireEvent.change(titleInput, { target: { value: 'Backstage' } });
+
+ fireEvent.click(screen.getByText('Save'));
+ await waitFor(() => {
+ expect(props.onSave).toHaveBeenCalledWith(
+ expect.objectContaining({
+ title: 'Backstage',
+ url: 'https://www.backstage.io',
+ }),
+ expect.anything(),
+ );
+ });
+ });
+
+ it('allows relative links when external links are enabled', async () => {
+ await renderInTestApp();
+
+ const urlInput = screen.getByPlaceholderText('Enter a URL');
+ const titleInput = screen.getByPlaceholderText('Enter a display name');
+ fireEvent.change(urlInput, {
+ target: { value: '/catalog' },
+ });
+ fireEvent.change(titleInput, { target: { value: 'Catalog' } });
+
+ fireEvent.click(screen.getByText('Save'));
+ await waitFor(() => {
+ expect(props.onSave).toHaveBeenCalledWith(
+ expect.objectContaining({
+ title: 'Catalog',
+ url: '/catalog',
+ }),
+ expect.anything(),
+ );
+ });
+ });
+
it('calls the save handler', async () => {
await renderInTestApp(
;
onClose: () => void;
+ allowExternalLinks?: boolean;
};
-export const ShortcutForm = ({ formValues, onSave, onClose }: Props) => {
+export const ShortcutForm = ({
+ formValues,
+ onSave,
+ onClose,
+ allowExternalLinks,
+}: Props) => {
const classes = useStyles();
-
const {
handleSubmit,
reset,
@@ -70,10 +75,19 @@ export const ShortcutForm = ({ formValues, onSave, onClose }: Props) => {
control={control}
rules={{
required: true,
- pattern: {
- value: /^\//,
- message: 'Must be a relative URL (starts with a /)',
- },
+ ...(allowExternalLinks
+ ? {
+ pattern: {
+ value: /^(https?:\/\/)|\//,
+ message: 'Must start with http(s):// or /',
+ },
+ }
+ : {
+ pattern: {
+ value: /^\//,
+ message: 'Must be a relative URL (starts with a /)',
+ },
+ }),
}}
render={({ field }) => (
type Props = {
shortcut: Shortcut;
api: ShortcutApi;
+ allowExternalLinks?: boolean;
};
-export const ShortcutItem = ({ shortcut, api }: Props) => {
+export const ShortcutItem = ({ shortcut, api, allowExternalLinks }: Props) => {
const classes = useStyles();
const [anchorEl, setAnchorEl] = React.useState();
@@ -100,6 +101,7 @@ export const ShortcutItem = ({ shortcut, api }: Props) => {
anchorEl={anchorEl}
api={api}
shortcut={shortcut}
+ allowExternalLinks={allowExternalLinks}
/>
>
);
diff --git a/plugins/shortcuts/src/Shortcuts.tsx b/plugins/shortcuts/src/Shortcuts.tsx
index 28aa33e8f2..6b9ea4d79b 100644
--- a/plugins/shortcuts/src/Shortcuts.tsx
+++ b/plugins/shortcuts/src/Shortcuts.tsx
@@ -35,6 +35,7 @@ import { IconComponent, useApi } from '@backstage/core-plugin-api';
*/
export interface ShortcutsProps {
icon?: IconComponent;
+ allowExternalLinks?: boolean;
}
export const Shortcuts = (props: ShortcutsProps) => {
@@ -62,6 +63,7 @@ export const Shortcuts = (props: ShortcutsProps) => {
onClose={handleClose}
anchorEl={anchorEl}
api={shortcutApi}
+ allowExternalLinks={props.allowExternalLinks}
/>
{loading ? (
@@ -71,6 +73,7 @@ export const Shortcuts = (props: ShortcutsProps) => {
key={shortcut.id}
shortcut={shortcut}
api={shortcutApi}
+ allowExternalLinks={props.allowExternalLinks}
/>
))
)}
From 6a51a49a8100eee8aa4f5f901a284e7d194f7abf Mon Sep 17 00:00:00 2001
From: Boris Bera
Date: Thu, 9 Mar 2023 11:18:49 -0500
Subject: [PATCH 048/511] Ensure `` component respects header styles
in `columns[*].headerStyle`
Signed-off-by: Boris Bera
---
.changeset/tidy-pumpkins-clean.md | 5 ++
.../src/components/Table/Table.test.tsx | 57 +++++++++++++++++++
.../src/components/Table/Table.tsx | 2 +-
3 files changed, 63 insertions(+), 1 deletion(-)
create mode 100644 .changeset/tidy-pumpkins-clean.md
diff --git a/.changeset/tidy-pumpkins-clean.md b/.changeset/tidy-pumpkins-clean.md
new file mode 100644
index 0000000000..c5a067a98c
--- /dev/null
+++ b/.changeset/tidy-pumpkins-clean.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Fix bug where `` component would not take into account header styles defined in `columns[*].headerStyle`.
diff --git a/packages/core-components/src/components/Table/Table.test.tsx b/packages/core-components/src/components/Table/Table.test.tsx
index ff17409502..8f27d7f280 100644
--- a/packages/core-components/src/components/Table/Table.test.tsx
+++ b/packages/core-components/src/components/Table/Table.test.tsx
@@ -17,6 +17,7 @@
import React from 'react';
import { renderInTestApp } from '@backstage/test-utils';
import { Table } from './Table';
+import { prettyDOM } from '@testing-library/react';
const column1 = {
title: 'Column 1',
@@ -142,6 +143,62 @@ describe('', () => {
});
});
+ describe('with style headers', () => {
+ describe('with CSS properties object', () => {
+ it('renders styled headers', async () => {
+ const columns = [
+ column1,
+ {
+ ...column2,
+ headerStyle: {
+ backgroundColor: 'pink',
+ },
+ },
+ ];
+
+ const rendered = await renderInTestApp(
+ ,
+ );
+
+ expect(rendered.getByText(column1.title).closest('th')).not.toHaveStyle(
+ {
+ backgroundColor: 'pink',
+ },
+ );
+ expect(rendered.getByText(column2.title).closest('th')).toHaveStyle({
+ backgroundColor: 'pink',
+ });
+ });
+
+ it('renders styled headers with highlight', async () => {
+ const columns = [
+ {
+ ...column1,
+ highlight: true,
+ },
+ {
+ ...column2,
+ highlight: true,
+ headerStyle: {
+ backgroundColor: 'pink',
+ },
+ },
+ ];
+
+ const rendered = await renderInTestApp(
+ ,
+ );
+
+ const column1Header = rendered.getByText(column1.title).closest('th');
+ expect(column1Header?.style.backgroundColor).toBe('');
+ expect(column1Header?.style.color).toBe('rgb(0, 0, 0)');
+ const column2Header = rendered.getByText(column2.title).closest('th');
+ expect(column2Header?.style.backgroundColor).toBe('pink');
+ expect(column2Header?.style.color).toBe('rgb(0, 0, 0)');
+ });
+ });
+ });
+
it('renders with subtitle', async () => {
const rendered = await renderInTestApp(
,
diff --git a/packages/core-components/src/components/Table/Table.tsx b/packages/core-components/src/components/Table/Table.tsx
index 89a1d69b96..c43345c9d2 100644
--- a/packages/core-components/src/components/Table/Table.tsx
+++ b/packages/core-components/src/components/Table/Table.tsx
@@ -169,7 +169,7 @@ function convertColumns(
theme: BackstageTheme,
): TableColumn[] {
return columns.map(column => {
- const headerStyle: React.CSSProperties = {};
+ const headerStyle: React.CSSProperties = column.headerStyle ?? {};
let cellStyle = column.cellStyle || {};
From ab0e9546a99bf438da479a32c62f236403eed84b Mon Sep 17 00:00:00 2001
From: Boris Bera
Date: Thu, 9 Mar 2023 11:22:37 -0500
Subject: [PATCH 049/511] Remove leftover import from testing
Signed-off-by: Boris Bera
---
packages/core-components/src/components/Table/Table.test.tsx | 1 -
1 file changed, 1 deletion(-)
diff --git a/packages/core-components/src/components/Table/Table.test.tsx b/packages/core-components/src/components/Table/Table.test.tsx
index 8f27d7f280..ffdca26d98 100644
--- a/packages/core-components/src/components/Table/Table.test.tsx
+++ b/packages/core-components/src/components/Table/Table.test.tsx
@@ -17,7 +17,6 @@
import React from 'react';
import { renderInTestApp } from '@backstage/test-utils';
import { Table } from './Table';
-import { prettyDOM } from '@testing-library/react';
const column1 = {
title: 'Column 1',
From 9b8c374ace558489fe2b6b8a3f69e5ac4fc99f9b Mon Sep 17 00:00:00 2001
From: afalco
Date: Thu, 9 Mar 2023 10:49:34 -0600
Subject: [PATCH 050/511] Do not show timer for skipped steps
Signed-off-by: afalco
---
.changeset/mean-emus-hide.md | 5 +++++
.../src/next/components/TaskSteps/TaskSteps.tsx | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 .changeset/mean-emus-hide.md
diff --git a/.changeset/mean-emus-hide.md b/.changeset/mean-emus-hide.md
new file mode 100644
index 0000000000..955e25d258
--- /dev/null
+++ b/.changeset/mean-emus-hide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-react': patch
+---
+
+Remove timer for skipped steps in Scaffolder Next's TaskSteps
diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx
index 632500f07e..668306fa9e 100644
--- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx
+++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx
@@ -80,7 +80,7 @@ export const TaskSteps = (props: TaskStepsProps) => {
StepIconComponent={StepIcon}
>
{step.name}
-
+ {!isSkipped && }
From e2e3dd08a5444cf7a4aac96018274a02f2b86199 Mon Sep 17 00:00:00 2001
From: Dustin Brewer
Date: Thu, 9 Mar 2023 22:47:17 +0000
Subject: [PATCH 051/511] Add FireHydrant annotation option
Signed-off-by: Dustin Brewer
---
.changeset/tidy-planes-unite.md | 5 ++++
plugins/firehydrant/README.md | 8 ++++++
plugins/firehydrant/package.json | 1 +
plugins/firehydrant/src/api/index.ts | 5 +++-
.../ServiceDetailsCard/ServiceDetailsCard.tsx | 7 ++---
plugins/firehydrant/src/components/hooks.ts | 27 +++++++++++++++++++
.../src/components/serviceDetails.ts | 13 +++++++--
plugins/firehydrant/src/index.ts | 6 ++++-
plugins/firehydrant/src/plugin.ts | 3 +++
yarn.lock | 1 +
10 files changed, 69 insertions(+), 7 deletions(-)
create mode 100644 .changeset/tidy-planes-unite.md
create mode 100644 plugins/firehydrant/src/components/hooks.ts
diff --git a/.changeset/tidy-planes-unite.md b/.changeset/tidy-planes-unite.md
new file mode 100644
index 0000000000..158498d381
--- /dev/null
+++ b/.changeset/tidy-planes-unite.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-firehydrant': minor
+---
+
+Allow firehydrant to use component annotation
diff --git a/plugins/firehydrant/README.md b/plugins/firehydrant/README.md
index d7169e08f0..4472536245 100644
--- a/plugins/firehydrant/README.md
+++ b/plugins/firehydrant/README.md
@@ -56,3 +56,11 @@ proxy:
# Supply the token you generated from https://app.firehydrant.io/organizations/bots
Authorization: Bearer fhb-e4911b22bcd788c4a4afeb0c111ffbfa
```
+
+4. Optionally add an annotation to the yaml config file of a component
+
+```yaml
+metadata:
+ annotations:
+ firehydrant.com/service-name:
+```
diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json
index 293679c2ea..8084876f69 100644
--- a/plugins/firehydrant/package.json
+++ b/plugins/firehydrant/package.json
@@ -23,6 +23,7 @@
"clean": "backstage-cli package clean"
},
"dependencies": {
+ "@backstage/catalog-model": "workspace:^",
"@backstage/core-components": "workspace:^",
"@backstage/core-plugin-api": "workspace:^",
"@backstage/plugin-catalog-react": "workspace:^",
diff --git a/plugins/firehydrant/src/api/index.ts b/plugins/firehydrant/src/api/index.ts
index 7101b5dc62..45834d90e9 100644
--- a/plugins/firehydrant/src/api/index.ts
+++ b/plugins/firehydrant/src/api/index.ts
@@ -30,6 +30,7 @@ export interface FireHydrantAPI {
getServiceDetails(options: {
serviceName: string;
+ lookupByName: boolean;
}): Promise;
getServiceIncidents(options: {
@@ -77,10 +78,12 @@ export class FireHydrantAPIClient implements FireHydrantAPI {
async getServiceDetails(options: {
serviceName: string;
+ lookupByName: boolean;
}): Promise {
+ const queryOpt = options.lookupByName ? 'name' : 'query';
const proxyUrl = await this.getApiUrl();
const response = await fetch(
- `${proxyUrl}/services?query=${options.serviceName}`,
+ `${proxyUrl}/services?${queryOpt}=${options.serviceName}`,
);
if (!response.ok) {
diff --git a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx
index bc2dd46fef..b6bfbcc13b 100644
--- a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx
+++ b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx
@@ -39,6 +39,7 @@ import {
ResponseErrorPanel,
} from '@backstage/core-components';
import { configApiRef, useApi } from '@backstage/core-plugin-api';
+import { isFireHydrantAvailable, getFireHydrantServiceName } from '../hooks';
const useStyles = makeStyles(theme => ({
button: {
@@ -149,14 +150,14 @@ export const ServiceDetailsCard = () => {
const startDate = DateTime.now().minus({ days: 30 }).toUTC();
const endDate = DateTime.now().toUTC();
+ // The service name is provided by an annotation or a Backstage generated service name.
// The Backstage service name in FireHydrant is a unique formatted string
// that requires the entity's kind, name, and namespace.
- const fireHydrantServiceName = `${entity?.kind}:${
- entity?.metadata?.namespace ?? 'default'
- }/${entity?.metadata?.name}`;
+ const fireHydrantServiceName = getFireHydrantServiceName(entity);
const { loading, value, error } = useServiceDetails({
serviceName: fireHydrantServiceName,
+ lookupByName: isFireHydrantAvailable(entity),
});
const activeIncidents: string[] = value?.service?.active_incidents ?? [];
diff --git a/plugins/firehydrant/src/components/hooks.ts b/plugins/firehydrant/src/components/hooks.ts
new file mode 100644
index 0000000000..e8129e1b28
--- /dev/null
+++ b/plugins/firehydrant/src/components/hooks.ts
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Entity } from '@backstage/catalog-model';
+
+export const FIREHYDRANT_SERVICE_NAME_ANNOTATION =
+ 'firehydrant.com/service-name';
+export const isFireHydrantAvailable = (entity: Entity) =>
+ Boolean(entity.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION]);
+export const getFireHydrantServiceName = (entity: Entity) =>
+ isFireHydrantAvailable(entity)
+ ? entity?.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION] ?? ''
+ : `${entity?.kind}:${entity?.metadata?.namespace ?? 'default'}/${
+ entity?.metadata?.name
+ }`;
diff --git a/plugins/firehydrant/src/components/serviceDetails.ts b/plugins/firehydrant/src/components/serviceDetails.ts
index 9c12677577..f0ea325419 100644
--- a/plugins/firehydrant/src/components/serviceDetails.ts
+++ b/plugins/firehydrant/src/components/serviceDetails.ts
@@ -17,13 +17,22 @@ import useAsyncRetry from 'react-use/lib/useAsyncRetry';
import { fireHydrantApiRef } from '../api';
import { errorApiRef, useApi } from '@backstage/core-plugin-api';
-export const useServiceDetails = ({ serviceName }: { serviceName: string }) => {
+export const useServiceDetails = ({
+ serviceName,
+ lookupByName,
+}: {
+ serviceName: string;
+ lookupByName: boolean;
+}) => {
const api = useApi(fireHydrantApiRef);
const errorApi = useApi(errorApiRef);
const { loading, value, error, retry } = useAsyncRetry(async () => {
try {
- return await api.getServiceDetails({ serviceName: serviceName });
+ return await api.getServiceDetails({
+ serviceName: serviceName,
+ lookupByName: lookupByName,
+ });
} catch (e) {
errorApi.post(e);
return Promise.reject(e);
diff --git a/plugins/firehydrant/src/index.ts b/plugins/firehydrant/src/index.ts
index f1ef66fd3e..218b944244 100644
--- a/plugins/firehydrant/src/index.ts
+++ b/plugins/firehydrant/src/index.ts
@@ -20,4 +20,8 @@
* @packageDocumentation
*/
-export { firehydrantPlugin, FirehydrantCard } from './plugin';
+export {
+ firehydrantPlugin,
+ FirehydrantCard,
+ isFireHydrantAvailable,
+} from './plugin';
diff --git a/plugins/firehydrant/src/plugin.ts b/plugins/firehydrant/src/plugin.ts
index 6deefe4fce..14a8c53c66 100644
--- a/plugins/firehydrant/src/plugin.ts
+++ b/plugins/firehydrant/src/plugin.ts
@@ -50,3 +50,6 @@ export const FirehydrantCard = firehydrantPlugin.provide(
},
}),
);
+
+/** @public */
+export { isFireHydrantAvailable } from './components/hooks';
diff --git a/yarn.lock b/yarn.lock
index 4ad5e727d0..5d3cd95dbb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6249,6 +6249,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@backstage/plugin-firehydrant@workspace:plugins/firehydrant"
dependencies:
+ "@backstage/catalog-model": "workspace:^"
"@backstage/cli": "workspace:^"
"@backstage/core-app-api": "workspace:^"
"@backstage/core-components": "workspace:^"
From cce21f4cc4a4468f9d63385ea944ac2a4f3c04a0 Mon Sep 17 00:00:00 2001
From: Dustin Brewer
Date: Thu, 9 Mar 2023 23:06:14 +0000
Subject: [PATCH 052/511] Add a few tests
Signed-off-by: Dustin Brewer
---
.../firehydrant/src/components/hooks.test.ts | 67 +++++++++++++++++++
1 file changed, 67 insertions(+)
create mode 100644 plugins/firehydrant/src/components/hooks.test.ts
diff --git a/plugins/firehydrant/src/components/hooks.test.ts b/plugins/firehydrant/src/components/hooks.test.ts
new file mode 100644
index 0000000000..4278911ebb
--- /dev/null
+++ b/plugins/firehydrant/src/components/hooks.test.ts
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Entity } from '@backstage/catalog-model';
+import { isFireHydrantAvailable, getFireHydrantServiceName } from './hooks';
+
+describe('firehydrant-hooks-isFireHydrantAvailable', () => {
+ it('should find an annotation', () => {
+ const e: Entity = {
+ metadata: {
+ annotations: {
+ 'firehydrant.com/service-name': 'test-fh-name',
+ },
+ },
+ };
+ expect(isFireHydrantAvailable(e)).toEqual(true);
+ });
+
+ it('should not find an annotation', () => {
+ const e: Entity = {
+ metadata: {},
+ };
+ expect(isFireHydrantAvailable(e)).toEqual(false);
+ });
+});
+
+describe('firehydrant-hooks-getFireHydrantServiceName', () => {
+ it('should return annotation service name', () => {
+ const expected = 'test-fh-name';
+ const e: Entity = {
+ kind: 'Component',
+ metadata: {
+ namespace: 'default',
+ name: 'test-fh-name',
+ annotations: {
+ 'firehydrant.com/service-name': expected,
+ },
+ },
+ };
+ expect(getFireHydrantServiceName(e)).toEqual(expected);
+ });
+
+ it('should return generated service name', () => {
+ const expected = 'Component:default/test-fh-name';
+ const e: Entity = {
+ kind: 'Component',
+ metadata: {
+ namespace: 'default',
+ name: 'test-fh-name',
+ annotations: {},
+ },
+ };
+ expect(getFireHydrantServiceName(e)).toEqual(expected);
+ });
+});
From 88da0bcff21a9f83b81c49c7eb9b5ac96435a64e Mon Sep 17 00:00:00 2001
From: Kurt King
Date: Thu, 9 Mar 2023 16:18:32 -0700
Subject: [PATCH 053/511] add plugId property
Signed-off-by: Kurt King
---
docs/plugins/feature-flags.md | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md
index a572143d6e..d6847d3f65 100644
--- a/docs/plugins/feature-flags.md
+++ b/docs/plugins/feature-flags.md
@@ -37,7 +37,12 @@ Defining feature flag in the application is done by adding feature flags in`feat
const app = createApp({
// ...
featureFlags: [
- { name: 'tech-radar', description: 'Enables the tech radar plugin' },
+ // pluginId can be left empty for feature flags used in the application. It is required for feature flags used in plugins
+ {
+ pluginId: '',
+ name: 'tech-radar',
+ description: 'Enables the tech radar plugin',
+ },
],
// ...
});
From 0708a169de2bb16e787912cef8cc086ddb7e842c Mon Sep 17 00:00:00 2001
From: Kurt King
Date: Thu, 9 Mar 2023 16:20:46 -0700
Subject: [PATCH 054/511] move comment after prettier ran
Signed-off-by: Kurt King
---
docs/plugins/feature-flags.md | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md
index d6847d3f65..7b7a6c1435 100644
--- a/docs/plugins/feature-flags.md
+++ b/docs/plugins/feature-flags.md
@@ -37,9 +37,8 @@ Defining feature flag in the application is done by adding feature flags in`feat
const app = createApp({
// ...
featureFlags: [
- // pluginId can be left empty for feature flags used in the application. It is required for feature flags used in plugins
{
- pluginId: '',
+ pluginId: '', // pluginId is required for feature flags in plugins. It can be left blank for a feature flag leveraged in the application.
name: 'tech-radar',
description: 'Enables the tech radar plugin',
},
From 392e71fa7fbfea1bc652ca28fe72e135dc04c253 Mon Sep 17 00:00:00 2001
From: Dustin Brewer
Date: Thu, 9 Mar 2023 23:22:54 +0000
Subject: [PATCH 055/511] Correcting Entity in tests
Signed-off-by: Dustin Brewer
---
plugins/firehydrant/src/components/hooks.test.ts | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/plugins/firehydrant/src/components/hooks.test.ts b/plugins/firehydrant/src/components/hooks.test.ts
index 4278911ebb..2fbf1e2d57 100644
--- a/plugins/firehydrant/src/components/hooks.test.ts
+++ b/plugins/firehydrant/src/components/hooks.test.ts
@@ -19,7 +19,11 @@ import { isFireHydrantAvailable, getFireHydrantServiceName } from './hooks';
describe('firehydrant-hooks-isFireHydrantAvailable', () => {
it('should find an annotation', () => {
const e: Entity = {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'Component',
metadata: {
+ namespace: 'default',
+ name: 'test-fh-name',
annotations: {
'firehydrant.com/service-name': 'test-fh-name',
},
@@ -30,7 +34,12 @@ describe('firehydrant-hooks-isFireHydrantAvailable', () => {
it('should not find an annotation', () => {
const e: Entity = {
- metadata: {},
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'Component',
+ metadata: {
+ namespace: 'default',
+ name: 'test-fh-name',
+ },
};
expect(isFireHydrantAvailable(e)).toEqual(false);
});
@@ -40,6 +49,7 @@ describe('firehydrant-hooks-getFireHydrantServiceName', () => {
it('should return annotation service name', () => {
const expected = 'test-fh-name';
const e: Entity = {
+ apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
metadata: {
namespace: 'default',
@@ -55,6 +65,7 @@ describe('firehydrant-hooks-getFireHydrantServiceName', () => {
it('should return generated service name', () => {
const expected = 'Component:default/test-fh-name';
const e: Entity = {
+ apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
metadata: {
namespace: 'default',
From ad4840b0f579fee2c724b0cbebaf94cc426c3f3b Mon Sep 17 00:00:00 2001
From: Dustin Brewer
Date: Fri, 10 Mar 2023 00:08:59 +0000
Subject: [PATCH 056/511] Correcting the api-report
Signed-off-by: Dustin Brewer
---
plugins/firehydrant/api-report.md | 4 ++++
plugins/firehydrant/src/components/hooks.ts | 1 +
2 files changed, 5 insertions(+)
diff --git a/plugins/firehydrant/api-report.md b/plugins/firehydrant/api-report.md
index 2e3bcf6385..0ff5bbc62a 100644
--- a/plugins/firehydrant/api-report.md
+++ b/plugins/firehydrant/api-report.md
@@ -6,6 +6,7 @@
///
import { BackstagePlugin } from '@backstage/core-plugin-api';
+import { Entity } from '@backstage/catalog-model';
import { RouteRef } from '@backstage/core-plugin-api';
// @public (undocumented)
@@ -19,4 +20,7 @@ export const firehydrantPlugin: BackstagePlugin<
{},
{}
>;
+
+// @public (undocumented)
+export const isFireHydrantAvailable: (entity: Entity) => boolean;
```
diff --git a/plugins/firehydrant/src/components/hooks.ts b/plugins/firehydrant/src/components/hooks.ts
index e8129e1b28..d9145f13f0 100644
--- a/plugins/firehydrant/src/components/hooks.ts
+++ b/plugins/firehydrant/src/components/hooks.ts
@@ -17,6 +17,7 @@ import { Entity } from '@backstage/catalog-model';
export const FIREHYDRANT_SERVICE_NAME_ANNOTATION =
'firehydrant.com/service-name';
+/** @public */
export const isFireHydrantAvailable = (entity: Entity) =>
Boolean(entity.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION]);
export const getFireHydrantServiceName = (entity: Entity) =>
From 9d8528eb8d3ee4cf0b8cf5d04a5d478f169164c6 Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Fri, 10 Mar 2023 12:04:28 +0100
Subject: [PATCH 057/511] cli: add node-plugin template
Signed-off-by: Patrik Oldsberg
---
packages/cli/src/lib/new/factories/index.ts | 1 +
.../src/lib/new/factories/pluginNode.test.ts | 107 ++++++++++++++++++
.../cli/src/lib/new/factories/pluginNode.ts | 74 ++++++++++++
.../default-node-plugin-package/.eslintrc.js | 1 +
.../default-node-plugin-package/README.md.hbs | 5 +
.../package.json.hbs | 36 ++++++
.../src/index.ts.hbs | 18 +++
.../src/setupTests.ts | 1 +
.../default-node-plugin-package/tsconfig.json | 9 ++
9 files changed, 252 insertions(+)
create mode 100644 packages/cli/src/lib/new/factories/pluginNode.test.ts
create mode 100644 packages/cli/src/lib/new/factories/pluginNode.ts
create mode 100644 packages/cli/templates/default-node-plugin-package/.eslintrc.js
create mode 100644 packages/cli/templates/default-node-plugin-package/README.md.hbs
create mode 100644 packages/cli/templates/default-node-plugin-package/package.json.hbs
create mode 100644 packages/cli/templates/default-node-plugin-package/src/index.ts.hbs
create mode 100644 packages/cli/templates/default-node-plugin-package/src/setupTests.ts
create mode 100644 packages/cli/templates/default-node-plugin-package/tsconfig.json
diff --git a/packages/cli/src/lib/new/factories/index.ts b/packages/cli/src/lib/new/factories/index.ts
index 80a24702e0..9fc69e0ca4 100644
--- a/packages/cli/src/lib/new/factories/index.ts
+++ b/packages/cli/src/lib/new/factories/index.ts
@@ -18,4 +18,5 @@ export { frontendPlugin } from './frontendPlugin';
export { backendPlugin } from './backendPlugin';
export { webLibraryPackage } from './webLibraryPackage';
export { pluginCommon } from './pluginCommon';
+export { pluginNode } from './pluginNode';
export { scaffolderModule } from './scaffolderModule';
diff --git a/packages/cli/src/lib/new/factories/pluginNode.test.ts b/packages/cli/src/lib/new/factories/pluginNode.test.ts
new file mode 100644
index 0000000000..50971ff191
--- /dev/null
+++ b/packages/cli/src/lib/new/factories/pluginNode.test.ts
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import fs from 'fs-extra';
+import mockFs from 'mock-fs';
+import { sep, resolve as resolvePath } from 'path';
+import { paths } from '../../paths';
+import { Task } from '../../tasks';
+import { FactoryRegistry } from '../FactoryRegistry';
+import { createMockOutputStream, mockPaths } from './common/testUtils';
+import { pluginNode } from './pluginNode';
+
+describe('pluginNode factory', () => {
+ beforeEach(() => {
+ mockPaths({
+ targetRoot: '/root',
+ });
+ });
+
+ afterEach(() => {
+ mockFs.restore();
+ jest.resetAllMocks();
+ });
+
+ it('should create a node plugin package', async () => {
+ mockFs({
+ '/root': {
+ plugins: mockFs.directory(),
+ },
+ [paths.resolveOwn('templates')]: mockFs.load(
+ paths.resolveOwn('templates'),
+ ),
+ });
+
+ const options = await FactoryRegistry.populateOptions(pluginNode, {
+ id: 'test',
+ });
+
+ let modified = false;
+
+ const [output, mockStream] = createMockOutputStream();
+ jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream);
+ jest.spyOn(Task, 'forCommand').mockResolvedValue();
+
+ await pluginNode.create(options, {
+ private: true,
+ isMonoRepo: true,
+ defaultVersion: '1.0.0',
+ markAsModified: () => {
+ modified = true;
+ },
+ createTemporaryDirectory: () => fs.mkdtemp('test'),
+ });
+
+ expect(modified).toBe(true);
+
+ expect(output).toEqual([
+ '',
+ 'Creating Node.js plugin library backstage-plugin-test-node',
+ 'Checking Prerequisites:',
+ `availability plugins${sep}test-node`,
+ 'creating temp dir',
+ 'Executing Template:',
+ 'copying .eslintrc.js',
+ 'templating README.md.hbs',
+ 'templating package.json.hbs',
+ 'templating index.ts.hbs',
+ 'copying setupTests.ts',
+ 'Installing:',
+ `moving plugins${sep}test-node`,
+ ]);
+
+ await expect(
+ fs.readJson('/root/plugins/test-node/package.json'),
+ ).resolves.toEqual(
+ expect.objectContaining({
+ name: 'backstage-plugin-test-node',
+ description: 'Node.js library for the test plugin',
+ private: true,
+ version: '1.0.0',
+ }),
+ );
+
+ expect(Task.forCommand).toHaveBeenCalledTimes(2);
+ expect(Task.forCommand).toHaveBeenCalledWith('yarn install', {
+ cwd: resolvePath('/root/plugins/test-node'),
+ optional: true,
+ });
+ expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', {
+ cwd: resolvePath('/root/plugins/test-node'),
+ optional: true,
+ });
+ });
+});
diff --git a/packages/cli/src/lib/new/factories/pluginNode.ts b/packages/cli/src/lib/new/factories/pluginNode.ts
new file mode 100644
index 0000000000..44dbea9fce
--- /dev/null
+++ b/packages/cli/src/lib/new/factories/pluginNode.ts
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import chalk from 'chalk';
+import { paths } from '../../paths';
+import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners';
+import { createFactory, CreateContext } from '../types';
+import { Task } from '../../tasks';
+import { ownerPrompt, pluginIdPrompt } from './common/prompts';
+import { executePluginPackageTemplate } from './common/tasks';
+
+type Options = {
+ id: string;
+ owner?: string;
+ codeOwnersPath?: string;
+};
+
+export const pluginNode = createFactory({
+ name: 'plugin-node',
+ description: 'A new Node.js library plugin package',
+ optionsDiscovery: async () => ({
+ codeOwnersPath: await getCodeownersFilePath(paths.targetRoot),
+ }),
+ optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
+ async create(options: Options, ctx: CreateContext) {
+ const { id } = options;
+ const suffix = `${id}-node`;
+ const name = ctx.scope
+ ? `@${ctx.scope}/plugin-${suffix}`
+ : `backstage-plugin-${suffix}`;
+
+ Task.log();
+ Task.log(`Creating Node.js plugin library ${chalk.cyan(name)}`);
+
+ const targetDir = ctx.isMonoRepo
+ ? paths.resolveTargetRoot('plugins', suffix)
+ : paths.resolveTargetRoot(`backstage-plugin-${suffix}`);
+
+ await executePluginPackageTemplate(ctx, {
+ targetDir,
+ templateName: 'default-node-plugin-package',
+ values: {
+ id,
+ name,
+ privatePackage: ctx.private,
+ npmRegistry: ctx.npmRegistry,
+ pluginVersion: ctx.defaultVersion,
+ },
+ });
+
+ if (options.owner) {
+ await addCodeownersEntry(`/plugins/${suffix}`, options.owner);
+ }
+
+ await Task.forCommand('yarn install', { cwd: targetDir, optional: true });
+ await Task.forCommand('yarn lint --fix', {
+ cwd: targetDir,
+ optional: true,
+ });
+ },
+});
diff --git a/packages/cli/templates/default-node-plugin-package/.eslintrc.js b/packages/cli/templates/default-node-plugin-package/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/packages/cli/templates/default-node-plugin-package/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/packages/cli/templates/default-node-plugin-package/README.md.hbs b/packages/cli/templates/default-node-plugin-package/README.md.hbs
new file mode 100644
index 0000000000..a9fc97935e
--- /dev/null
+++ b/packages/cli/templates/default-node-plugin-package/README.md.hbs
@@ -0,0 +1,5 @@
+# {{name}}
+
+Welcome to the Node.js library package for the {{id}} plugin!
+
+_This plugin was created through the Backstage CLI_
diff --git a/packages/cli/templates/default-node-plugin-package/package.json.hbs b/packages/cli/templates/default-node-plugin-package/package.json.hbs
new file mode 100644
index 0000000000..45becd1bea
--- /dev/null
+++ b/packages/cli/templates/default-node-plugin-package/package.json.hbs
@@ -0,0 +1,36 @@
+{
+ "name": "{{name}}",
+ "description": "Node.js library for the {{id}} plugin",
+ "version": "{{pluginVersion}}",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+{{#if privatePackage}}
+ "private": {{privatePackage}},
+{{/if}}
+ "publishConfig": {
+{{#if npmRegistry}}
+ "registry": "{{npmRegistry}}",
+{{/if}}
+ "access": "public",
+ "main": "dist/index.cjs.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "node-library"
+ },
+ "scripts": {
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "clean": "backstage-cli package clean",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack"
+ },
+ "devDependencies": {
+ "@backstage/cli": "{{versionQuery '@backstage/cli'}}"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs b/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs
new file mode 100644
index 0000000000..8f5ad37ffb
--- /dev/null
+++ b/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs
@@ -0,0 +1,18 @@
+/***/
+/**
+ * Node.js library for the {{id}} plugin.
+ *
+ * @packageDocumentation
+ */
+
+// In this package you might for example export functions that
+// help other plugins or module interact with your plugin.
+
+/**
+ * Does something useful.
+ *
+ * @public
+ */
+export function someFunction() {
+ // ...
+}
diff --git a/packages/cli/templates/default-node-plugin-package/src/setupTests.ts b/packages/cli/templates/default-node-plugin-package/src/setupTests.ts
new file mode 100644
index 0000000000..cb0ff5c3b5
--- /dev/null
+++ b/packages/cli/templates/default-node-plugin-package/src/setupTests.ts
@@ -0,0 +1 @@
+export {};
diff --git a/packages/cli/templates/default-node-plugin-package/tsconfig.json b/packages/cli/templates/default-node-plugin-package/tsconfig.json
new file mode 100644
index 0000000000..5ae9aeb62d
--- /dev/null
+++ b/packages/cli/templates/default-node-plugin-package/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "@backstage/cli/config/tsconfig.json",
+ "include": ["src"],
+ "exclude": ["node_modules"],
+ "compilerOptions": {
+ "outDir": "dist-types",
+ "rootDir": "."
+ }
+}
From 862267c646827870e88b8632f27ddbf260fbcb0e Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Fri, 10 Mar 2023 13:36:00 +0100
Subject: [PATCH 058/511] docs/local-dev: fix docs for `new`
Signed-off-by: Patrik Oldsberg
---
docs/local-dev/cli-commands.md | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/docs/local-dev/cli-commands.md b/docs/local-dev/cli-commands.md
index 174fb3e348..8c1e061237 100644
--- a/docs/local-dev/cli-commands.md
+++ b/docs/local-dev/cli-commands.md
@@ -212,14 +212,13 @@ backstage-cli new --select plugin --option id=foo
```
This command is typically added as script in the root `package.json` to be
-executed with `yarn backstage-create`, using options that are appropriate for
-the organization that owns the app repo. For example you may have it set up like
-this:
+executed with `yarn new`, using options that are appropriate for the organization
+that owns the app repo. For example you may have it set up like this:
```json
{
"scripts": {
- "backstage-create": "backstage-cli create --scope internal --no-private --npm-registry https://acme.org/npm"
+ "new": "backstage-cli new --scope internal --no-private --npm-registry https://acme.org/npm"
}
}
```
From 09e87a95e25459c7bf03fe125325110be3fad7b4 Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Fri, 10 Mar 2023 13:23:51 +0100
Subject: [PATCH 059/511] cli: add web-plugin template
Signed-off-by: Patrik Oldsberg
---
packages/cli/src/lib/new/factories/index.ts | 1 +
.../src/lib/new/factories/pluginWeb.test.ts | 114 ++++++++++++++++++
.../cli/src/lib/new/factories/pluginWeb.ts | 74 ++++++++++++
.../default-react-plugin-package/.eslintrc.js | 1 +
.../README.md.hbs | 5 +
.../package.json.hbs | 47 ++++++++
.../ExampleComponent.test.tsx | 18 +++
.../ExampleComponent/ExampleComponent.tsx | 29 +++++
.../src/components/ExampleComponent/index.ts | 2 +
.../src/components/index.ts | 5 +
.../src/hooks/index.ts | 5 +
.../src/hooks/useExample/index.ts | 1 +
.../src/hooks/useExample/useExample.ts | 15 +++
.../src/index.ts.hbs | 12 ++
.../src/setupTests.ts | 1 +
.../tsconfig.json | 11 ++
16 files changed, 341 insertions(+)
create mode 100644 packages/cli/src/lib/new/factories/pluginWeb.test.ts
create mode 100644 packages/cli/src/lib/new/factories/pluginWeb.ts
create mode 100644 packages/cli/templates/default-react-plugin-package/.eslintrc.js
create mode 100644 packages/cli/templates/default-react-plugin-package/README.md.hbs
create mode 100644 packages/cli/templates/default-react-plugin-package/package.json.hbs
create mode 100644 packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.test.tsx
create mode 100644 packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.tsx
create mode 100644 packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/index.ts
create mode 100644 packages/cli/templates/default-react-plugin-package/src/components/index.ts
create mode 100644 packages/cli/templates/default-react-plugin-package/src/hooks/index.ts
create mode 100644 packages/cli/templates/default-react-plugin-package/src/hooks/useExample/index.ts
create mode 100644 packages/cli/templates/default-react-plugin-package/src/hooks/useExample/useExample.ts
create mode 100644 packages/cli/templates/default-react-plugin-package/src/index.ts.hbs
create mode 100644 packages/cli/templates/default-react-plugin-package/src/setupTests.ts
create mode 100644 packages/cli/templates/default-react-plugin-package/tsconfig.json
diff --git a/packages/cli/src/lib/new/factories/index.ts b/packages/cli/src/lib/new/factories/index.ts
index 9fc69e0ca4..232e762b91 100644
--- a/packages/cli/src/lib/new/factories/index.ts
+++ b/packages/cli/src/lib/new/factories/index.ts
@@ -19,4 +19,5 @@ export { backendPlugin } from './backendPlugin';
export { webLibraryPackage } from './webLibraryPackage';
export { pluginCommon } from './pluginCommon';
export { pluginNode } from './pluginNode';
+export { pluginWeb } from './pluginWeb';
export { scaffolderModule } from './scaffolderModule';
diff --git a/packages/cli/src/lib/new/factories/pluginWeb.test.ts b/packages/cli/src/lib/new/factories/pluginWeb.test.ts
new file mode 100644
index 0000000000..bcd62f3bcd
--- /dev/null
+++ b/packages/cli/src/lib/new/factories/pluginWeb.test.ts
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import fs from 'fs-extra';
+import mockFs from 'mock-fs';
+import { sep, resolve as resolvePath } from 'path';
+import { paths } from '../../paths';
+import { Task } from '../../tasks';
+import { FactoryRegistry } from '../FactoryRegistry';
+import { createMockOutputStream, mockPaths } from './common/testUtils';
+import { pluginWeb } from './pluginWeb';
+
+describe('pluginWeb factory', () => {
+ beforeEach(() => {
+ mockPaths({
+ targetRoot: '/root',
+ });
+ });
+
+ afterEach(() => {
+ mockFs.restore();
+ jest.resetAllMocks();
+ });
+
+ it('should create a react plugin package', async () => {
+ mockFs({
+ '/root': {
+ plugins: mockFs.directory(),
+ },
+ [paths.resolveOwn('templates')]: mockFs.load(
+ paths.resolveOwn('templates'),
+ ),
+ });
+
+ const options = await FactoryRegistry.populateOptions(pluginWeb, {
+ id: 'test',
+ });
+
+ let modified = false;
+
+ const [output, mockStream] = createMockOutputStream();
+ jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream);
+ jest.spyOn(Task, 'forCommand').mockResolvedValue();
+
+ await pluginWeb.create(options, {
+ private: true,
+ isMonoRepo: true,
+ defaultVersion: '1.0.0',
+ markAsModified: () => {
+ modified = true;
+ },
+ createTemporaryDirectory: () => fs.mkdtemp('test'),
+ });
+
+ expect(modified).toBe(true);
+
+ expect(output).toEqual([
+ '',
+ 'Creating web plugin library backstage-plugin-test-react',
+ 'Checking Prerequisites:',
+ `availability plugins${sep}test-react`,
+ 'creating temp dir',
+ 'Executing Template:',
+ 'copying .eslintrc.js',
+ 'templating README.md.hbs',
+ 'templating package.json.hbs',
+ 'templating index.ts.hbs',
+ 'copying setupTests.ts',
+ 'copying index.ts',
+ 'copying ExampleComponent.test.tsx',
+ 'copying ExampleComponent.tsx',
+ 'copying index.ts',
+ 'copying index.ts',
+ 'copying index.ts',
+ 'copying useExample.ts',
+ 'Installing:',
+ `moving plugins${sep}test-react`,
+ ]);
+
+ await expect(
+ fs.readJson('/root/plugins/test-react/package.json'),
+ ).resolves.toEqual(
+ expect.objectContaining({
+ name: 'backstage-plugin-test-react',
+ description: 'Web library for the test plugin',
+ private: true,
+ version: '1.0.0',
+ }),
+ );
+
+ expect(Task.forCommand).toHaveBeenCalledTimes(2);
+ expect(Task.forCommand).toHaveBeenCalledWith('yarn install', {
+ cwd: resolvePath('/root/plugins/test-react'),
+ optional: true,
+ });
+ expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', {
+ cwd: resolvePath('/root/plugins/test-react'),
+ optional: true,
+ });
+ });
+});
diff --git a/packages/cli/src/lib/new/factories/pluginWeb.ts b/packages/cli/src/lib/new/factories/pluginWeb.ts
new file mode 100644
index 0000000000..8189654eb2
--- /dev/null
+++ b/packages/cli/src/lib/new/factories/pluginWeb.ts
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2021 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import chalk from 'chalk';
+import { paths } from '../../paths';
+import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners';
+import { createFactory, CreateContext } from '../types';
+import { Task } from '../../tasks';
+import { ownerPrompt, pluginIdPrompt } from './common/prompts';
+import { executePluginPackageTemplate } from './common/tasks';
+
+type Options = {
+ id: string;
+ owner?: string;
+ codeOwnersPath?: string;
+};
+
+export const pluginWeb = createFactory({
+ name: 'plugin-react',
+ description: 'A new web library plugin package',
+ optionsDiscovery: async () => ({
+ codeOwnersPath: await getCodeownersFilePath(paths.targetRoot),
+ }),
+ optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
+ async create(options: Options, ctx: CreateContext) {
+ const { id } = options;
+ const suffix = `${id}-react`;
+ const name = ctx.scope
+ ? `@${ctx.scope}/plugin-${suffix}`
+ : `backstage-plugin-${suffix}`;
+
+ Task.log();
+ Task.log(`Creating web plugin library ${chalk.cyan(name)}`);
+
+ const targetDir = ctx.isMonoRepo
+ ? paths.resolveTargetRoot('plugins', suffix)
+ : paths.resolveTargetRoot(`backstage-plugin-${suffix}`);
+
+ await executePluginPackageTemplate(ctx, {
+ targetDir,
+ templateName: 'default-react-plugin-package',
+ values: {
+ id,
+ name,
+ privatePackage: ctx.private,
+ npmRegistry: ctx.npmRegistry,
+ pluginVersion: ctx.defaultVersion,
+ },
+ });
+
+ if (options.owner) {
+ await addCodeownersEntry(`/plugins/${suffix}`, options.owner);
+ }
+
+ await Task.forCommand('yarn install', { cwd: targetDir, optional: true });
+ await Task.forCommand('yarn lint --fix', {
+ cwd: targetDir,
+ optional: true,
+ });
+ },
+});
diff --git a/packages/cli/templates/default-react-plugin-package/.eslintrc.js b/packages/cli/templates/default-react-plugin-package/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/packages/cli/templates/default-react-plugin-package/README.md.hbs b/packages/cli/templates/default-react-plugin-package/README.md.hbs
new file mode 100644
index 0000000000..ab1c36da6b
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/README.md.hbs
@@ -0,0 +1,5 @@
+# {{name}}
+
+Welcome to the web library package for the {{id}} plugin!
+
+_This plugin was created through the Backstage CLI_
diff --git a/packages/cli/templates/default-react-plugin-package/package.json.hbs b/packages/cli/templates/default-react-plugin-package/package.json.hbs
new file mode 100644
index 0000000000..e0ee408eda
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/package.json.hbs
@@ -0,0 +1,47 @@
+{
+ "name": "{{name}}",
+ "description": "Web library for the {{id}} plugin",
+ "version": "{{pluginVersion}}",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+{{#if privatePackage}}
+ "private": {{privatePackage}},
+{{/if}}
+ "publishConfig": {
+{{#if npmRegistry}}
+ "registry": "{{npmRegistry}}",
+{{/if}}
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "web-library"
+ },
+ "scripts": {
+ "start": "backstage-cli package start",
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "clean": "backstage-cli package clean",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack"
+ },
+ "dependencies": {
+ "@backstage/core-plugin-api": "{{versionQuery '@backstage/core-plugin-api'}}",
+ "@material-ui/core": "{{versionQuery '@material-ui/core' '4.12.2'}}"
+ },
+ "peerDependencies": {
+ "react": "{{versionQuery 'react' '^16.13.1 || ^17.0.0'}}"
+ },
+ "devDependencies": {
+ "@backstage/cli": "{{versionQuery '@backstage/cli'}}",
+ "@backstage/test-utils": "{{versionQuery '@backstage/test-utils'}}",
+ "@testing-library/jest-dom": "{{versionQuery '@testing-library/jest-dom' '5.10.1'}}",
+ "@testing-library/react": "{{versionQuery '@testing-library/react' '12.1.3'}}"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.test.tsx b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.test.tsx
new file mode 100644
index 0000000000..c770cca8cb
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.test.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+import { screen } from '@testing-library/react';
+import { renderInTestApp } from '@backstage/test-utils';
+import { ExampleComponent } from './ExampleComponent';
+
+describe('ExampleComponent', () => {
+ it('should render', async () => {
+ await renderInTestApp()
+
+ expect(screen.getByText('Hello World')).toBeInTheDocument();
+ });
+
+ it('should display a custom message', async () => {
+ await renderInTestApp()
+
+ expect(screen.getByText('Hello Example')).toBeInTheDocument();
+ })
+})
diff --git a/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.tsx b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.tsx
new file mode 100644
index 0000000000..a1ab0937db
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/ExampleComponent.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import { Typography } from '@material-ui/core';
+
+/**
+ * Props for {@link ExampleComponent}.
+ *
+ * @public
+ */
+export interface ExampleComponentProps {
+ message?: string;
+}
+
+/**
+ * Displays an example.
+ *
+ * @remarks
+ *
+ * Longer descriptions should be put after the `@remarks` tag. That way the initial summary
+ * will show up in the API docs overview section, while the longer description will only be
+ * displayed on the page for the specific API.
+ *
+ * @public
+ */
+export function ExampleComponent(props: ExampleComponentProps) {
+ // By destructuring props here rather than in the signature the API docs will look nicer
+ const { message = 'Hello World' } = props;
+
+ return {message};
+}
diff --git a/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/index.ts b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/index.ts
new file mode 100644
index 0000000000..9bb2f2c378
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/components/ExampleComponent/index.ts
@@ -0,0 +1,2 @@
+export { ExampleComponent } from './ExampleComponent';
+export type { ExampleComponentProps } from './ExampleComponent';
diff --git a/packages/cli/templates/default-react-plugin-package/src/components/index.ts b/packages/cli/templates/default-react-plugin-package/src/components/index.ts
new file mode 100644
index 0000000000..0380b8ce5f
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/components/index.ts
@@ -0,0 +1,5 @@
+/***/
+// The index file in ./components/ is typically responsible for selecting
+// which components are public API and should be exported from the package.
+
+export * from './ExampleComponent';
diff --git a/packages/cli/templates/default-react-plugin-package/src/hooks/index.ts b/packages/cli/templates/default-react-plugin-package/src/hooks/index.ts
new file mode 100644
index 0000000000..cec94f4b04
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/hooks/index.ts
@@ -0,0 +1,5 @@
+/***/
+// The index file in ./hooks/ is typically responsible for selecting
+// which hooks are public API and should be exported from the package.
+
+export * from './useExample';
diff --git a/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/index.ts b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/index.ts
new file mode 100644
index 0000000000..f1fd276930
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/index.ts
@@ -0,0 +1 @@
+export { useExample } from './useExample';
diff --git a/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/useExample.ts b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/useExample.ts
new file mode 100644
index 0000000000..911d255238
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/hooks/useExample/useExample.ts
@@ -0,0 +1,15 @@
+import { useEffect } from 'react';
+import { useApi, alertApiRef } from '@backstage/core-plugin-api';
+
+/**
+ * Shows an example alert.
+ *
+ * @public
+ */
+export function useExample() {
+ const alertApi = useApi(alertApiRef);
+
+ useEffect(() => {
+ alertApi.post({ message: 'Hello World!' });
+ }, [alertApi])
+}
diff --git a/packages/cli/templates/default-react-plugin-package/src/index.ts.hbs b/packages/cli/templates/default-react-plugin-package/src/index.ts.hbs
new file mode 100644
index 0000000000..a7ebb26f00
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/index.ts.hbs
@@ -0,0 +1,12 @@
+/***/
+/**
+ * Web library for the {{id}} plugin.
+ *
+ * @packageDocumentation
+ */
+
+// In this package you might for example export components or hooks
+// that are useful to other plugins or modules.
+
+export * from './components'
+export * from './hooks'
diff --git a/packages/cli/templates/default-react-plugin-package/src/setupTests.ts b/packages/cli/templates/default-react-plugin-package/src/setupTests.ts
new file mode 100644
index 0000000000..7b0828bfa8
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/src/setupTests.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/packages/cli/templates/default-react-plugin-package/tsconfig.json b/packages/cli/templates/default-react-plugin-package/tsconfig.json
new file mode 100644
index 0000000000..ce3409d31f
--- /dev/null
+++ b/packages/cli/templates/default-react-plugin-package/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "extends": "@backstage/cli/config/tsconfig.json",
+ "include": [
+ "src",
+ ],
+ "exclude": ["node_modules"],
+ "compilerOptions": {
+ "outDir": "dist-types",
+ "rootDir": "."
+ }
+}
From 2011b86052c6d3371a92d62103035b28ec5f0b47 Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Fri, 10 Mar 2023 13:30:21 +0100
Subject: [PATCH 060/511] changesets: changeset for web and node library
templates
Signed-off-by: Patrik Oldsberg
---
.changeset/cyan-sheep-tap.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 .changeset/cyan-sheep-tap.md
diff --git a/.changeset/cyan-sheep-tap.md b/.changeset/cyan-sheep-tap.md
new file mode 100644
index 0000000000..7812e6b6c6
--- /dev/null
+++ b/.changeset/cyan-sheep-tap.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Added templates for new plugin Web and Node.js libraries.
From 5b76423c59b7dbee8919e5340fd3b9c3124dc979 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 Mar 2023 13:08:13 +0000
Subject: [PATCH 061/511] fix(deps): update dependency @codemirror/view to
v6.9.2
Signed-off-by: Renovate Bot
---
yarn.lock | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 57e53c8a10..663107e961 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9390,13 +9390,13 @@ __metadata:
linkType: hard
"@codemirror/view@npm:^6.0.0":
- version: 6.9.1
- resolution: "@codemirror/view@npm:6.9.1"
+ version: 6.9.2
+ resolution: "@codemirror/view@npm:6.9.2"
dependencies:
"@codemirror/state": ^6.1.4
style-mod: ^4.0.0
w3c-keyname: ^2.2.4
- checksum: 485d54d338a27ebde6bec489e3008db80a2a801fe27db0d4a3c70181c8739f806f035855ba13d5b311d186ad2b130db07196e8b465ec102b0142df0689bff2f8
+ checksum: e6faaf1b2daf9e4605eafd1782a0a6363cf0ee8a6c4e1aa57ebea2b2cc2b402914f07448f12210da0144126860adab052442c51831911a326867a53c745a60cf
languageName: node
linkType: hard
From bf1019508b310f60e735bd52ef59e7572d09dad5 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 Mar 2023 13:48:52 +0000
Subject: [PATCH 062/511] fix(deps): update dependency @swc/core to v1.3.39
Signed-off-by: Renovate Bot
---
microsite/yarn.lock | 86 ++++++++++++++++++++++-----------------------
storybook/yarn.lock | 86 ++++++++++++++++++++++-----------------------
yarn.lock | 86 ++++++++++++++++++++++-----------------------
3 files changed, 129 insertions(+), 129 deletions(-)
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index a9db81ead4..078cdc2546 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -2623,90 +2623,90 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-darwin-arm64@npm:1.3.38"
+"@swc/core-darwin-arm64@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-darwin-arm64@npm:1.3.39"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-darwin-x64@npm:1.3.38"
+"@swc/core-darwin-x64@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-darwin-x64@npm:1.3.39"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38"
+"@swc/core-linux-arm-gnueabihf@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38"
+"@swc/core-linux-arm64-gnu@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm64-musl@npm:1.3.38"
+"@swc/core-linux-arm64-musl@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm64-musl@npm:1.3.39"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-x64-gnu@npm:1.3.38"
+"@swc/core-linux-x64-gnu@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-x64-gnu@npm:1.3.39"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-x64-musl@npm:1.3.38"
+"@swc/core-linux-x64-musl@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-x64-musl@npm:1.3.39"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38"
+"@swc/core-win32-arm64-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38"
+"@swc/core-win32-ia32-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-x64-msvc@npm:1.3.38"
+"@swc/core-win32-x64-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-x64-msvc@npm:1.3.39"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@swc/core@npm:^1.3.36":
- version: 1.3.38
- resolution: "@swc/core@npm:1.3.38"
+ version: 1.3.39
+ resolution: "@swc/core@npm:1.3.39"
dependencies:
- "@swc/core-darwin-arm64": 1.3.38
- "@swc/core-darwin-x64": 1.3.38
- "@swc/core-linux-arm-gnueabihf": 1.3.38
- "@swc/core-linux-arm64-gnu": 1.3.38
- "@swc/core-linux-arm64-musl": 1.3.38
- "@swc/core-linux-x64-gnu": 1.3.38
- "@swc/core-linux-x64-musl": 1.3.38
- "@swc/core-win32-arm64-msvc": 1.3.38
- "@swc/core-win32-ia32-msvc": 1.3.38
- "@swc/core-win32-x64-msvc": 1.3.38
+ "@swc/core-darwin-arm64": 1.3.39
+ "@swc/core-darwin-x64": 1.3.39
+ "@swc/core-linux-arm-gnueabihf": 1.3.39
+ "@swc/core-linux-arm64-gnu": 1.3.39
+ "@swc/core-linux-arm64-musl": 1.3.39
+ "@swc/core-linux-x64-gnu": 1.3.39
+ "@swc/core-linux-x64-musl": 1.3.39
+ "@swc/core-win32-arm64-msvc": 1.3.39
+ "@swc/core-win32-ia32-msvc": 1.3.39
+ "@swc/core-win32-x64-msvc": 1.3.39
dependenciesMeta:
"@swc/core-darwin-arm64":
optional: true
@@ -2728,7 +2728,7 @@ __metadata:
optional: true
"@swc/core-win32-x64-msvc":
optional: true
- checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7
+ checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d
languageName: node
linkType: hard
diff --git a/storybook/yarn.lock b/storybook/yarn.lock
index 9c05864306..eb70dadd2f 100644
--- a/storybook/yarn.lock
+++ b/storybook/yarn.lock
@@ -2966,90 +2966,90 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-darwin-arm64@npm:1.3.38"
+"@swc/core-darwin-arm64@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-darwin-arm64@npm:1.3.39"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-darwin-x64@npm:1.3.38"
+"@swc/core-darwin-x64@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-darwin-x64@npm:1.3.39"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38"
+"@swc/core-linux-arm-gnueabihf@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38"
+"@swc/core-linux-arm64-gnu@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm64-musl@npm:1.3.38"
+"@swc/core-linux-arm64-musl@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm64-musl@npm:1.3.39"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-x64-gnu@npm:1.3.38"
+"@swc/core-linux-x64-gnu@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-x64-gnu@npm:1.3.39"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-x64-musl@npm:1.3.38"
+"@swc/core-linux-x64-musl@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-x64-musl@npm:1.3.39"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38"
+"@swc/core-win32-arm64-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38"
+"@swc/core-win32-ia32-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-x64-msvc@npm:1.3.38"
+"@swc/core-win32-x64-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-x64-msvc@npm:1.3.39"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@swc/core@npm:^1.3.9":
- version: 1.3.38
- resolution: "@swc/core@npm:1.3.38"
+ version: 1.3.39
+ resolution: "@swc/core@npm:1.3.39"
dependencies:
- "@swc/core-darwin-arm64": 1.3.38
- "@swc/core-darwin-x64": 1.3.38
- "@swc/core-linux-arm-gnueabihf": 1.3.38
- "@swc/core-linux-arm64-gnu": 1.3.38
- "@swc/core-linux-arm64-musl": 1.3.38
- "@swc/core-linux-x64-gnu": 1.3.38
- "@swc/core-linux-x64-musl": 1.3.38
- "@swc/core-win32-arm64-msvc": 1.3.38
- "@swc/core-win32-ia32-msvc": 1.3.38
- "@swc/core-win32-x64-msvc": 1.3.38
+ "@swc/core-darwin-arm64": 1.3.39
+ "@swc/core-darwin-x64": 1.3.39
+ "@swc/core-linux-arm-gnueabihf": 1.3.39
+ "@swc/core-linux-arm64-gnu": 1.3.39
+ "@swc/core-linux-arm64-musl": 1.3.39
+ "@swc/core-linux-x64-gnu": 1.3.39
+ "@swc/core-linux-x64-musl": 1.3.39
+ "@swc/core-win32-arm64-msvc": 1.3.39
+ "@swc/core-win32-ia32-msvc": 1.3.39
+ "@swc/core-win32-x64-msvc": 1.3.39
dependenciesMeta:
"@swc/core-darwin-arm64":
optional: true
@@ -3071,7 +3071,7 @@ __metadata:
optional: true
"@swc/core-win32-x64-msvc":
optional: true
- checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7
+ checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d
languageName: node
linkType: hard
diff --git a/yarn.lock b/yarn.lock
index 663107e961..2f46341024 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13866,90 +13866,90 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-darwin-arm64@npm:1.3.38"
+"@swc/core-darwin-arm64@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-darwin-arm64@npm:1.3.39"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-darwin-x64@npm:1.3.38"
+"@swc/core-darwin-x64@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-darwin-x64@npm:1.3.39"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38"
+"@swc/core-linux-arm-gnueabihf@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38"
+"@swc/core-linux-arm64-gnu@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-arm64-musl@npm:1.3.38"
+"@swc/core-linux-arm64-musl@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-arm64-musl@npm:1.3.39"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-x64-gnu@npm:1.3.38"
+"@swc/core-linux-x64-gnu@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-x64-gnu@npm:1.3.39"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-linux-x64-musl@npm:1.3.38"
+"@swc/core-linux-x64-musl@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-linux-x64-musl@npm:1.3.39"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38"
+"@swc/core-win32-arm64-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38"
+"@swc/core-win32-ia32-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.3.38":
- version: 1.3.38
- resolution: "@swc/core-win32-x64-msvc@npm:1.3.38"
+"@swc/core-win32-x64-msvc@npm:1.3.39":
+ version: 1.3.39
+ resolution: "@swc/core-win32-x64-msvc@npm:1.3.39"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@swc/core@npm:^1.3.9":
- version: 1.3.38
- resolution: "@swc/core@npm:1.3.38"
+ version: 1.3.39
+ resolution: "@swc/core@npm:1.3.39"
dependencies:
- "@swc/core-darwin-arm64": 1.3.38
- "@swc/core-darwin-x64": 1.3.38
- "@swc/core-linux-arm-gnueabihf": 1.3.38
- "@swc/core-linux-arm64-gnu": 1.3.38
- "@swc/core-linux-arm64-musl": 1.3.38
- "@swc/core-linux-x64-gnu": 1.3.38
- "@swc/core-linux-x64-musl": 1.3.38
- "@swc/core-win32-arm64-msvc": 1.3.38
- "@swc/core-win32-ia32-msvc": 1.3.38
- "@swc/core-win32-x64-msvc": 1.3.38
+ "@swc/core-darwin-arm64": 1.3.39
+ "@swc/core-darwin-x64": 1.3.39
+ "@swc/core-linux-arm-gnueabihf": 1.3.39
+ "@swc/core-linux-arm64-gnu": 1.3.39
+ "@swc/core-linux-arm64-musl": 1.3.39
+ "@swc/core-linux-x64-gnu": 1.3.39
+ "@swc/core-linux-x64-musl": 1.3.39
+ "@swc/core-win32-arm64-msvc": 1.3.39
+ "@swc/core-win32-ia32-msvc": 1.3.39
+ "@swc/core-win32-x64-msvc": 1.3.39
dependenciesMeta:
"@swc/core-darwin-arm64":
optional: true
@@ -13971,7 +13971,7 @@ __metadata:
optional: true
"@swc/core-win32-x64-msvc":
optional: true
- checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7
+ checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d
languageName: node
linkType: hard
From b37a450fe555f4cc711d05ffb1b2044d145e4c5d Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Fri, 10 Mar 2023 15:03:31 +0100
Subject: [PATCH 063/511] Update
packages/cli/templates/default-node-plugin-package/src/index.ts.hbs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Fredrik Adelöw
Signed-off-by: Patrik Oldsberg
---
.../cli/templates/default-node-plugin-package/src/index.ts.hbs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs b/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs
index 8f5ad37ffb..355b35c373 100644
--- a/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs
+++ b/packages/cli/templates/default-node-plugin-package/src/index.ts.hbs
@@ -6,7 +6,7 @@
*/
// In this package you might for example export functions that
-// help other plugins or module interact with your plugin.
+// help other plugins or modules interact with your plugin.
/**
* Does something useful.
From bbd7b4d7687feb2d45d3a7eace56d92e9e08ba69 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?=
Date: Fri, 10 Mar 2023 15:39:51 +0100
Subject: [PATCH 064/511] bump the openstack swift sdk to get a newer file-type
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Fredrik Adelöw
---
plugins/techdocs-node/package.json | 2 +-
yarn.lock | 20 ++++++++++----------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json
index 4c3a4a3496..a247ef483e 100644
--- a/plugins/techdocs-node/package.json
+++ b/plugins/techdocs-node/package.json
@@ -54,7 +54,7 @@
"@backstage/integration-aws-node": "workspace:^",
"@backstage/plugin-search-common": "workspace:^",
"@google-cloud/storage": "^6.0.0",
- "@trendyol-js/openstack-swift-sdk": "^0.0.5",
+ "@trendyol-js/openstack-swift-sdk": "^0.0.6",
"@types/express": "^4.17.6",
"express": "^4.17.1",
"fs-extra": "10.1.0",
diff --git a/yarn.lock b/yarn.lock
index 663107e961..a4ee8b8787 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8620,7 +8620,7 @@ __metadata:
"@backstage/integration-aws-node": "workspace:^"
"@backstage/plugin-search-common": "workspace:^"
"@google-cloud/storage": ^6.0.0
- "@trendyol-js/openstack-swift-sdk": ^0.0.5
+ "@trendyol-js/openstack-swift-sdk": ^0.0.6
"@types/express": ^4.17.6
"@types/fs-extra": ^9.0.5
"@types/js-yaml": ^4.0.0
@@ -14177,15 +14177,15 @@ __metadata:
languageName: node
linkType: hard
-"@trendyol-js/openstack-swift-sdk@npm:^0.0.5":
- version: 0.0.5
- resolution: "@trendyol-js/openstack-swift-sdk@npm:0.0.5"
+"@trendyol-js/openstack-swift-sdk@npm:^0.0.6":
+ version: 0.0.6
+ resolution: "@trendyol-js/openstack-swift-sdk@npm:0.0.6"
dependencies:
agentkeepalive: ^4.1.4
axios: ^0.21.1
axios-cached-dns-resolve: 0.5.2
- file-type: 16.5.3
- checksum: 35a3c705aa9b3daa44bef590a8aad4ceda89106ca3368b0d1b574be5aa1f064d42fb0c26e0570481e57be2ad3296d416e27ad37303a3d95d2d65f3df0b2446df
+ file-type: ^16.5.4
+ checksum: 999a1afa5f0dc2b1f41c1c13104f68d147c488b7ee5836581cc5acb485b9e963fb822177b6996a901339a06a9900dd8ff78ed7fd8b1d29f2c2f7809c5c54c62a
languageName: node
linkType: hard
@@ -23447,14 +23447,14 @@ __metadata:
languageName: node
linkType: hard
-"file-type@npm:16.5.3":
- version: 16.5.3
- resolution: "file-type@npm:16.5.3"
+"file-type@npm:^16.5.4":
+ version: 16.5.4
+ resolution: "file-type@npm:16.5.4"
dependencies:
readable-web-to-node-stream: ^3.0.0
strtok3: ^6.2.4
token-types: ^4.1.1
- checksum: 38a4443d0f7b9b3de8a44a1d75d441f9ddb544a1adbf22ec7bc07d135452c3464000c64daa51220ffec6a38ceec7565a1290337bd81aab2e6273c79db5ed9ef3
+ checksum: d983c0f36491c57fcb6cc70fcb02c36d6b53f312a15053263e1924e28ca8314adf0db32170801ad777f09432c32155f31715ceaee66310947731588120d7ec27
languageName: node
linkType: hard
From bf493710f50c1888bc49642613fa940b4351b00f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?=
Date: Fri, 10 Mar 2023 15:42:10 +0100
Subject: [PATCH 065/511] changeset
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Fredrik Adelöw
---
.changeset/cold-plants-boil.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 .changeset/cold-plants-boil.md
diff --git a/.changeset/cold-plants-boil.md b/.changeset/cold-plants-boil.md
new file mode 100644
index 0000000000..a991601a88
--- /dev/null
+++ b/.changeset/cold-plants-boil.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs-node': patch
+---
+
+Update to a newer version of `@trendyol-js/openstack-swift-sdk`
From 3ef5fb09ca5017d61a47edd33d7c44d189987204 Mon Sep 17 00:00:00 2001
From: Emma Indal
Date: Fri, 10 Mar 2023 15:41:08 +0100
Subject: [PATCH 066/511] fix broken stack overflow stories - mock stack
overflow api
Signed-off-by: Emma Indal
---
.changeset/silver-donkeys-eat.md | 5 +++
.../templates/DefaultTemplate.stories.tsx | 32 +++++++++++++++----
plugins/stack-overflow/api-report.md | 11 +++++++
.../src/api/StackOverflowApi.ts | 6 ++++
.../StackOverflowQuestions.stories.tsx | 21 ++++++++++++
plugins/stack-overflow/src/index.ts | 2 ++
6 files changed, 71 insertions(+), 6 deletions(-)
create mode 100644 .changeset/silver-donkeys-eat.md
diff --git a/.changeset/silver-donkeys-eat.md b/.changeset/silver-donkeys-eat.md
new file mode 100644
index 0000000000..0995a2025c
--- /dev/null
+++ b/.changeset/silver-donkeys-eat.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-stack-overflow': patch
+---
+
+Export api ref and StackOverflowApi type
diff --git a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx
index 638fe8bc29..9cf2e8ab35 100644
--- a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx
+++ b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx
@@ -19,7 +19,7 @@ import {
HomePageCompanyLogo,
HomePageStarredEntities,
TemplateBackstageLogo,
- TemplateBackstageLogoIcon
+ TemplateBackstageLogoIcon,
} from '@backstage/plugin-home';
import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils';
import { Content, Page, InfoCard } from '@backstage/core-components';
@@ -31,12 +31,12 @@ import {
} from '@backstage/plugin-catalog-react';
import { configApiRef } from '@backstage/core-plugin-api';
import { ConfigReader } from '@backstage/config';
+import { HomePageSearchBar, searchPlugin } from '@backstage/plugin-search';
import {
- HomePageSearchBar,
- searchPlugin,
-} from '@backstage/plugin-search';
-import { searchApiRef, SearchContextProvider } from '@backstage/plugin-search-react';
-import { HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow';
+ searchApiRef,
+ SearchContextProvider,
+} from '@backstage/plugin-search-react';
+import { stackOverflowApiRef, HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow';
import { Grid, makeStyles } from '@material-ui/core';
import React, { ComponentType } from 'react';
@@ -79,6 +79,25 @@ const mockCatalogApi = {
getEntities: async () => ({ items: entities }),
};
+const mockStackOverflowApi = {
+ listQuestions: async () => [
+ {
+ title: 'Customizing Spotify backstage UI',
+ link: 'stackoverflow.question/1',
+ answer_count: 0,
+ tags: ['backstage'],
+ owner: { 'some owner': 'name' },
+ },
+ {
+ title: 'Customizing Spotify backstage UI',
+ link: 'stackoverflow.question/1',
+ answer_count: 0,
+ tags: ['backstage'],
+ owner: { 'some owner': 'name' },
+ },
+ ],
+};
+
const starredEntitiesApi = new MockStarredEntitiesApi();
starredEntitiesApi.toggleStarred('component:default/example-starred-entity');
starredEntitiesApi.toggleStarred('component:default/example-starred-entity-2');
@@ -93,6 +112,7 @@ export default {
<>
Promise.resolve({ results: [] }) }],
diff --git a/plugins/stack-overflow/api-report.md b/plugins/stack-overflow/api-report.md
index fe2a970c13..598bd06a04 100644
--- a/plugins/stack-overflow/api-report.md
+++ b/plugins/stack-overflow/api-report.md
@@ -5,6 +5,7 @@
```ts
///
+import { ApiRef } from '@backstage/core-plugin-api';
import { BackstagePlugin } from '@backstage/core-plugin-api';
import { CardExtensionProps } from '@backstage/plugin-home';
import { ReactNode } from 'react';
@@ -15,6 +16,16 @@ export const HomePageStackOverflowQuestions: (
props: CardExtensionProps,
) => JSX.Element;
+// @public (undocumented)
+export type StackOverflowApi = {
+ listQuestions(options?: {
+ requestParams: StackOverflowQuestionsRequestParams;
+ }): Promise;
+};
+
+// @public (undocumented)
+export const stackOverflowApiRef: ApiRef;
+
// @public
export const StackOverflowIcon: () => JSX.Element;
diff --git a/plugins/stack-overflow/src/api/StackOverflowApi.ts b/plugins/stack-overflow/src/api/StackOverflowApi.ts
index 6e76f51409..d470e879e7 100644
--- a/plugins/stack-overflow/src/api/StackOverflowApi.ts
+++ b/plugins/stack-overflow/src/api/StackOverflowApi.ts
@@ -20,10 +20,16 @@ import {
StackOverflowQuestionsRequestParams,
} from '../types';
+/**
+ * @public
+ */
export const stackOverflowApiRef = createApiRef({
id: 'plugin.stackoverflow.service',
});
+/**
+ * @public
+ */
export type StackOverflowApi = {
listQuestions(options?: {
requestParams: StackOverflowQuestionsRequestParams;
diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx
index 35ace44c14..aed1ed25aa 100644
--- a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx
+++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx
@@ -21,6 +21,26 @@ import { ConfigReader } from '@backstage/config';
import { Grid } from '@material-ui/core';
import React, { ComponentType } from 'react';
import { StackOverflowIcon } from '../../icons';
+import { stackOverflowApiRef } from '../../api';
+
+const mockStackOverflowApi = {
+ listQuestions: async () => [
+ {
+ title: 'Customizing Spotify backstage UI',
+ link: 'stackoverflow.question/1',
+ answer_count: 0,
+ tags: ['backstage'],
+ owner: { 'some owner': 'name' },
+ },
+ {
+ title: 'Customizing Spotify backstage UI',
+ link: 'stackoverflow.question/1',
+ answer_count: 0,
+ tags: ['backstage'],
+ owner: { 'some owner': 'name' },
+ },
+ ],
+};
export default {
title: 'Plugins/Home/Components/StackOverflow',
@@ -39,6 +59,7 @@ export default {
},
}),
],
+ [stackOverflowApiRef, mockStackOverflowApi],
]}
>
diff --git a/plugins/stack-overflow/src/index.ts b/plugins/stack-overflow/src/index.ts
index 5965d66983..a796f563eb 100644
--- a/plugins/stack-overflow/src/index.ts
+++ b/plugins/stack-overflow/src/index.ts
@@ -30,3 +30,5 @@ export type {
StackOverflowQuestionsContentProps,
StackOverflowQuestionsRequestParams,
} from './types';
+export { stackOverflowApiRef } from './api';
+export type { StackOverflowApi } from './api';
From 92b495328bd3a3627c2b91b107c3175b10d44ab2 Mon Sep 17 00:00:00 2001
From: Oleg S <97077423+RobotSail@users.noreply.github.com>
Date: Mon, 6 Mar 2023 17:00:01 -0500
Subject: [PATCH 067/511] expose the techdocs-backend plugin using the new
system
Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com>
---
.changeset/large-feet-wash.md | 6 ++
packages/backend-next/package.json | 1 +
packages/backend-next/src/index.ts | 2 +
plugins/techdocs-backend/api-report.md | 4 ++
plugins/techdocs-backend/package.json | 1 +
plugins/techdocs-backend/src/index.ts | 1 +
plugins/techdocs-backend/src/plugin.ts | 95 ++++++++++++++++++++++++++
yarn.lock | 2 +
8 files changed, 112 insertions(+)
create mode 100644 .changeset/large-feet-wash.md
create mode 100644 plugins/techdocs-backend/src/plugin.ts
diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md
new file mode 100644
index 0000000000..15e3c54b42
--- /dev/null
+++ b/.changeset/large-feet-wash.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-techdocs-backend': minor
+'example-backend-next': minor
+---
+
+Expose the techdocs-backend plugin using the new plugin system
diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json
index 9f7ec8306a..5d8a8cb1ec 100644
--- a/packages/backend-next/package.json
+++ b/packages/backend-next/package.json
@@ -29,6 +29,7 @@
"@backstage/plugin-app-backend": "workspace:^",
"@backstage/plugin-catalog-backend": "workspace:^",
"@backstage/plugin-scaffolder-backend": "workspace:^",
+ "@backstage/plugin-techdocs-backend": "workspace:^",
"@backstage/plugin-todo-backend": "workspace:^"
},
"devDependencies": {
diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts
index 8e29244ebf..0f7af110e9 100644
--- a/packages/backend-next/src/index.ts
+++ b/packages/backend-next/src/index.ts
@@ -19,6 +19,7 @@ import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend/
import { createBackend } from '@backstage/backend-defaults';
import { appPlugin } from '@backstage/plugin-app-backend/alpha';
import { todoPlugin } from '@backstage/plugin-todo-backend';
+import { techdocsPlugin } from '@backstage/plugin-techdocs-backend';
const backend = createBackend();
@@ -26,4 +27,5 @@ backend.add(catalogPlugin());
backend.add(catalogModuleTemplateKind());
backend.add(appPlugin({ appPackageName: 'example-app' }));
backend.add(todoPlugin());
+backend.add(techdocsPlugin());
backend.start();
diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md
index 1f6aa1d66a..fe8db9a135 100644
--- a/plugins/techdocs-backend/api-report.md
+++ b/plugins/techdocs-backend/api-report.md
@@ -5,6 +5,7 @@
```ts
///
+import { BackendFeature } from '@backstage/backend-plugin-api';
import { CatalogApi } from '@backstage/catalog-client';
import { CatalogClient } from '@backstage/catalog-client';
import { Config } from '@backstage/config';
@@ -129,5 +130,8 @@ export type TechDocsCollatorOptions = {
export { TechDocsDocument };
+// @public
+export const techdocsPlugin: () => BackendFeature;
+
export * from '@backstage/plugin-techdocs-node';
```
diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json
index c9fff25b70..6389487eec 100644
--- a/plugins/techdocs-backend/package.json
+++ b/plugins/techdocs-backend/package.json
@@ -34,6 +34,7 @@
},
"dependencies": {
"@backstage/backend-common": "workspace:^",
+ "@backstage/backend-plugin-api": "workspace:^",
"@backstage/catalog-client": "workspace:^",
"@backstage/catalog-model": "workspace:^",
"@backstage/config": "workspace:^",
diff --git a/plugins/techdocs-backend/src/index.ts b/plugins/techdocs-backend/src/index.ts
index dc5d87d1b3..06259d3d3c 100644
--- a/plugins/techdocs-backend/src/index.ts
+++ b/plugins/techdocs-backend/src/index.ts
@@ -37,6 +37,7 @@ export type {
TechDocsCollatorFactoryOptions,
TechDocsCollatorOptions,
} from './search';
+export { techdocsPlugin } from './plugin';
/**
* @deprecated Use directly from @backstage/plugin-techdocs-node
diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts
new file mode 100644
index 0000000000..7cffcc8fbd
--- /dev/null
+++ b/plugins/techdocs-backend/src/plugin.ts
@@ -0,0 +1,95 @@
+/*
+ * 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 {
+ DockerContainerRunner,
+ loggerToWinstonLogger,
+ cacheToPluginCacheManager,
+} from '@backstage/backend-common';
+import {
+ coreServices,
+ createBackendPlugin,
+} from '@backstage/backend-plugin-api';
+
+import {
+ Preparers,
+ Generators,
+ Publisher,
+} from '@backstage/plugin-techdocs-node';
+import Docker from 'dockerode';
+import { createRouter } from './service';
+
+/**
+ * The TechDocs plugin is responsible for serving and building documentation for any entity.
+ * @public
+ */
+export const techdocsPlugin = createBackendPlugin({
+ pluginId: 'techdocs-backend',
+ register(env) {
+ env.registerInit({
+ deps: {
+ config: coreServices.config,
+ logger: coreServices.logger,
+ urlReader: coreServices.urlReader,
+ http: coreServices.httpRouter,
+ discovery: coreServices.discovery,
+ cache: coreServices.cache,
+ },
+ async init({ config, logger, urlReader, http, discovery, cache }) {
+ const winstonLogger = loggerToWinstonLogger(logger);
+ // Preparers are responsible for fetching source files for documentation.
+ const preparers = await Preparers.fromConfig(config, {
+ reader: urlReader,
+ logger: winstonLogger,
+ });
+
+ // Docker client (conditionally) used by the generators, based on techdocs.generators config.
+ const dockerClient = new Docker();
+ const containerRunner = new DockerContainerRunner({ dockerClient });
+
+ // Generators are used for generating documentation sites.
+ const generators = await Generators.fromConfig(config, {
+ logger: winstonLogger,
+ containerRunner,
+ });
+
+ // Publisher is used for
+ // 1. Publishing generated files to storage
+ // 2. Fetching files from storage and passing them to TechDocs frontend.
+ const publisher = await Publisher.fromConfig(config, {
+ logger: winstonLogger,
+ discovery: discovery,
+ });
+
+ // checks if the publisher is working and logs the result
+ await publisher.getReadiness();
+
+ const cacheManager = cacheToPluginCacheManager(cache);
+ http.use(
+ await createRouter({
+ logger: winstonLogger,
+ cache: cacheManager,
+ preparers,
+ generators,
+ publisher,
+ config,
+ discovery,
+ }),
+ );
+ },
+ });
+ },
+});
diff --git a/yarn.lock b/yarn.lock
index 663107e961..6a8317bfce 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8538,6 +8538,7 @@ __metadata:
resolution: "@backstage/plugin-techdocs-backend@workspace:plugins/techdocs-backend"
dependencies:
"@backstage/backend-common": "workspace:^"
+ "@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/catalog-client": "workspace:^"
"@backstage/catalog-model": "workspace:^"
@@ -22870,6 +22871,7 @@ __metadata:
"@backstage/plugin-app-backend": "workspace:^"
"@backstage/plugin-catalog-backend": "workspace:^"
"@backstage/plugin-scaffolder-backend": "workspace:^"
+ "@backstage/plugin-techdocs-backend": "workspace:^"
"@backstage/plugin-todo-backend": "workspace:^"
languageName: unknown
linkType: soft
From c041efd53d64b72db7e217acb70f9d367b54bd35 Mon Sep 17 00:00:00 2001
From: Oleg S <97077423+RobotSail@users.noreply.github.com>
Date: Wed, 8 Mar 2023 15:30:37 -0500
Subject: [PATCH 068/511] exposes the techdocs plugin as an alpha plugin
Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com>
---
.changeset/large-feet-wash.md | 3 +--
packages/backend-next/src/index.ts | 2 +-
plugins/techdocs-backend/alpha-api-report.md | 12 ++++++++++++
plugins/techdocs-backend/api-report.md | 4 ----
plugins/techdocs-backend/package.json | 15 +++++++++++++++
plugins/techdocs-backend/src/alpha.ts | 16 ++++++++++++++++
plugins/techdocs-backend/src/index.ts | 1 -
plugins/techdocs-backend/src/plugin.ts | 4 ++--
8 files changed, 47 insertions(+), 10 deletions(-)
create mode 100644 plugins/techdocs-backend/alpha-api-report.md
create mode 100644 plugins/techdocs-backend/src/alpha.ts
diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md
index 15e3c54b42..d663661725 100644
--- a/.changeset/large-feet-wash.md
+++ b/.changeset/large-feet-wash.md
@@ -1,6 +1,5 @@
---
'@backstage/plugin-techdocs-backend': minor
-'example-backend-next': minor
---
-Expose the techdocs-backend plugin using the new plugin system
+Added alpha export of the `techdocsPlugin` using the new backend system
diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts
index 0f7af110e9..8f8984b192 100644
--- a/packages/backend-next/src/index.ts
+++ b/packages/backend-next/src/index.ts
@@ -19,7 +19,7 @@ import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend/
import { createBackend } from '@backstage/backend-defaults';
import { appPlugin } from '@backstage/plugin-app-backend/alpha';
import { todoPlugin } from '@backstage/plugin-todo-backend';
-import { techdocsPlugin } from '@backstage/plugin-techdocs-backend';
+import { techdocsPlugin } from '@backstage/plugin-techdocs-backend/alpha';
const backend = createBackend();
diff --git a/plugins/techdocs-backend/alpha-api-report.md b/plugins/techdocs-backend/alpha-api-report.md
new file mode 100644
index 0000000000..16db84c216
--- /dev/null
+++ b/plugins/techdocs-backend/alpha-api-report.md
@@ -0,0 +1,12 @@
+## API Report File for "@backstage/plugin-techdocs-backend"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import { BackendFeature } from '@backstage/backend-plugin-api';
+
+// @alpha
+export const techdocsPlugin: () => BackendFeature;
+
+// (No @packageDocumentation comment for this package)
+```
diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md
index fe8db9a135..1f6aa1d66a 100644
--- a/plugins/techdocs-backend/api-report.md
+++ b/plugins/techdocs-backend/api-report.md
@@ -5,7 +5,6 @@
```ts
///
-import { BackendFeature } from '@backstage/backend-plugin-api';
import { CatalogApi } from '@backstage/catalog-client';
import { CatalogClient } from '@backstage/catalog-client';
import { Config } from '@backstage/config';
@@ -130,8 +129,5 @@ export type TechDocsCollatorOptions = {
export { TechDocsDocument };
-// @public
-export const techdocsPlugin: () => BackendFeature;
-
export * from '@backstage/plugin-techdocs-node';
```
diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json
index 6389487eec..1d2f4400eb 100644
--- a/plugins/techdocs-backend/package.json
+++ b/plugins/techdocs-backend/package.json
@@ -10,6 +10,21 @@
"main": "dist/index.cjs.js",
"types": "dist/index.d.ts"
},
+ "exports": {
+ ".": "./src/index.ts",
+ "./alpha": "./src/alpha.ts",
+ "./package.json": "./package.json"
+ },
+ "typesVersions": {
+ "*": {
+ "alpha": [
+ "src/alpha.ts"
+ ],
+ "package.json": [
+ "package.json"
+ ]
+ }
+ },
"backstage": {
"role": "backend-plugin"
},
diff --git a/plugins/techdocs-backend/src/alpha.ts b/plugins/techdocs-backend/src/alpha.ts
new file mode 100644
index 0000000000..1a36c5a1f5
--- /dev/null
+++ b/plugins/techdocs-backend/src/alpha.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { techdocsPlugin } from './plugin';
diff --git a/plugins/techdocs-backend/src/index.ts b/plugins/techdocs-backend/src/index.ts
index 06259d3d3c..dc5d87d1b3 100644
--- a/plugins/techdocs-backend/src/index.ts
+++ b/plugins/techdocs-backend/src/index.ts
@@ -37,7 +37,6 @@ export type {
TechDocsCollatorFactoryOptions,
TechDocsCollatorOptions,
} from './search';
-export { techdocsPlugin } from './plugin';
/**
* @deprecated Use directly from @backstage/plugin-techdocs-node
diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts
index 7cffcc8fbd..4b0ebbe366 100644
--- a/plugins/techdocs-backend/src/plugin.ts
+++ b/plugins/techdocs-backend/src/plugin.ts
@@ -30,11 +30,11 @@ import {
Publisher,
} from '@backstage/plugin-techdocs-node';
import Docker from 'dockerode';
-import { createRouter } from './service';
+import { createRouter } from '@backstage/plugin-techdocs-backend';
/**
* The TechDocs plugin is responsible for serving and building documentation for any entity.
- * @public
+ * @alpha
*/
export const techdocsPlugin = createBackendPlugin({
pluginId: 'techdocs-backend',
From a09223a505fd36574d0b57beb340896eddb12702 Mon Sep 17 00:00:00 2001
From: Oleg S <97077423+RobotSail@users.noreply.github.com>
Date: Thu, 9 Mar 2023 09:52:33 -0500
Subject: [PATCH 069/511] rename pluginId for todo-backend & techdocs-backend
to 'todo' and 'techdocs'
Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com>
---
.changeset/large-feet-wash.md | 3 ++-
plugins/techdocs-backend/src/plugin.ts | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md
index d663661725..2a55aab2c9 100644
--- a/.changeset/large-feet-wash.md
+++ b/.changeset/large-feet-wash.md
@@ -1,5 +1,6 @@
---
'@backstage/plugin-techdocs-backend': minor
+'@backstage/plugin-todo-backend': patch
---
-Added alpha export of the `techdocsPlugin` using the new backend system
+Added alpha export of the `techdocsPlugin` using the new backend system. Renamed the `todoPlugin` pluginId from `todo-backend` to `todo`.
diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts
index 4b0ebbe366..134de2bba6 100644
--- a/plugins/techdocs-backend/src/plugin.ts
+++ b/plugins/techdocs-backend/src/plugin.ts
@@ -37,7 +37,7 @@ import { createRouter } from '@backstage/plugin-techdocs-backend';
* @alpha
*/
export const techdocsPlugin = createBackendPlugin({
- pluginId: 'techdocs-backend',
+ pluginId: 'techdocs',
register(env) {
env.registerInit({
deps: {
From 2f2f5112adad5bd11d923d3aabf850afd00a5e3b Mon Sep 17 00:00:00 2001
From: Oleg S <97077423+RobotSail@users.noreply.github.com>
Date: Thu, 9 Mar 2023 11:23:18 -0500
Subject: [PATCH 070/511] spelling
Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com>
---
.changeset/large-feet-wash.md | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md
index 2a55aab2c9..88a28f9d60 100644
--- a/.changeset/large-feet-wash.md
+++ b/.changeset/large-feet-wash.md
@@ -1,6 +1,5 @@
---
'@backstage/plugin-techdocs-backend': minor
-'@backstage/plugin-todo-backend': patch
---
-Added alpha export of the `techdocsPlugin` using the new backend system. Renamed the `todoPlugin` pluginId from `todo-backend` to `todo`.
+Introduced alpha export of the `techdocsPlugin` using the new backend system.
From 16d3ba42856fa3b69b77edc3edf69bdb73e3146a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 Mar 2023 15:29:35 +0000
Subject: [PATCH 071/511] fix(deps): update dependency terser-webpack-plugin to
v5.3.7
Signed-off-by: Renovate Bot
---
yarn.lock | 44 ++++++++++++++++++++++----------------------
1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index a4ee8b8787..98493dc1c0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -11452,7 +11452,7 @@ __metadata:
languageName: node
linkType: hard
-"@jridgewell/resolve-uri@npm:^3.0.3":
+"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3":
version: 3.1.0
resolution: "@jridgewell/resolve-uri@npm:3.1.0"
checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267
@@ -11476,7 +11476,7 @@ __metadata:
languageName: node
linkType: hard
-"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13":
+"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13":
version: 1.4.14
resolution: "@jridgewell/sourcemap-codec@npm:1.4.14"
checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97
@@ -11493,13 +11493,13 @@ __metadata:
languageName: node
linkType: hard
-"@jridgewell/trace-mapping@npm:^0.3.0, @jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.9":
- version: 0.3.15
- resolution: "@jridgewell/trace-mapping@npm:0.3.15"
+"@jridgewell/trace-mapping@npm:^0.3.0, @jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9":
+ version: 0.3.17
+ resolution: "@jridgewell/trace-mapping@npm:0.3.17"
dependencies:
- "@jridgewell/resolve-uri": ^3.0.3
- "@jridgewell/sourcemap-codec": ^1.4.10
- checksum: 38917e9c2b014d469a9f51c016ed506acbe44dd16ec2f6f99b553ebf3764d22abadbf992f2367b6d2b3511f3eae8ed3a8963f6c1030093fda23efd35ecab2bae
+ "@jridgewell/resolve-uri": 3.1.0
+ "@jridgewell/sourcemap-codec": 1.4.14
+ checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339
languageName: node
linkType: hard
@@ -35412,12 +35412,12 @@ __metadata:
languageName: node
linkType: hard
-"serialize-javascript@npm:^6.0.0":
- version: 6.0.0
- resolution: "serialize-javascript@npm:6.0.0"
+"serialize-javascript@npm:^6.0.1":
+ version: 6.0.1
+ resolution: "serialize-javascript@npm:6.0.1"
dependencies:
randombytes: ^2.1.0
- checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93
+ checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f
languageName: node
linkType: hard
@@ -37095,14 +37095,14 @@ __metadata:
linkType: hard
"terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3":
- version: 5.3.6
- resolution: "terser-webpack-plugin@npm:5.3.6"
+ version: 5.3.7
+ resolution: "terser-webpack-plugin@npm:5.3.7"
dependencies:
- "@jridgewell/trace-mapping": ^0.3.14
+ "@jridgewell/trace-mapping": ^0.3.17
jest-worker: ^27.4.5
schema-utils: ^3.1.1
- serialize-javascript: ^6.0.0
- terser: ^5.14.1
+ serialize-javascript: ^6.0.1
+ terser: ^5.16.5
peerDependencies:
webpack: ^5.1.0
peerDependenciesMeta:
@@ -37112,13 +37112,13 @@ __metadata:
optional: true
uglify-js:
optional: true
- checksum: 8f3448d7fdb0434ce6a0c09d95c462bfd2f4a5a430233d854163337f734a7f5c07c74513d16081e06d4ca33d366d5b1a36f5444219bc41a7403afd6162107bad
+ checksum: 095e699fdeeb553cdf2c6f75f983949271b396d9c201d7ae9fc633c45c1c1ad14c7257ef9d51ccc62213dd3e97f875870ba31550f6d4f1b6674f2615562da7f7
languageName: node
linkType: hard
-"terser@npm:^5.10.0, terser@npm:^5.14.1":
- version: 5.14.2
- resolution: "terser@npm:5.14.2"
+"terser@npm:^5.10.0, terser@npm:^5.16.5":
+ version: 5.16.6
+ resolution: "terser@npm:5.16.6"
dependencies:
"@jridgewell/source-map": ^0.3.2
acorn: ^8.5.0
@@ -37126,7 +37126,7 @@ __metadata:
source-map-support: ~0.5.20
bin:
terser: bin/terser
- checksum: cabb50a640d6c2cfb351e4f43dc7bf7436f649755bb83eb78b2cacda426d5e0979bd44e6f92d713f3ca0f0866e322739b9ced888ebbce6508ad872d08de74fcc
+ checksum: f763a7bcc7b98cb2bfc41434f7b92bfe8a701a12c92ea6049377736c8e6de328240d654a20dfe15ce170fd783491b9873fad9f4cd8fee4f6c6fb8ca407859dee
languageName: node
linkType: hard
From 8b925744164998e0d3bea832dce1f4f7bf7569fa Mon Sep 17 00:00:00 2001
From: afalco
Date: Fri, 10 Mar 2023 09:37:51 -0600
Subject: [PATCH 072/511] Add tests for step timers
Signed-off-by: afalco
---
.../components/TaskSteps/TaskSteps.test.tsx | 51 +++++++++++++++++++
.../next/components/TaskSteps/TaskSteps.tsx | 1 +
2 files changed, 52 insertions(+)
diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx
index 0945843961..cbc87c2d53 100644
--- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx
+++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx
@@ -61,4 +61,55 @@ describe('TaskSteps', () => {
expect(getByText(step.name)).toBeInTheDocument();
}
});
+ it('should only show timer for in progress, failed, and completed steps', async () => {
+ const steps = [
+ {
+ id: '1',
+ name: 'Fail',
+ status: 'failed' as ScaffolderTaskStatus,
+
+ startedAt: Date.now().toLocaleString(),
+ endedAt: Date.now().toLocaleString(),
+ action: 'action1',
+ },
+ {
+ id: '2',
+ name: 'Process',
+ status: 'processing' as ScaffolderTaskStatus,
+ startedAt: Date.now().toLocaleString(),
+ action: 'action2',
+ },
+ {
+ id: '3',
+ name: 'Complete',
+ status: 'completed' as ScaffolderTaskStatus,
+ startedAt: Date.now().toLocaleString(),
+ endedAt: Date.now().toLocaleString(),
+ action: 'action3',
+ },
+ {
+ id: '4',
+ name: 'Skip',
+ status: 'skipped' as ScaffolderTaskStatus,
+ startedAt: Date.now().toLocaleString(),
+ action: 'action4',
+ },
+ {
+ id: '5',
+ name: 'Not Started',
+ status: 'open' as ScaffolderTaskStatus,
+ action: 'action5',
+ },
+ ];
+
+ const screen = await renderInTestApp();
+ const stepLabels = await screen.findAllByTestId('step-label');
+ expect(stepLabels.length).toBe(steps.length);
+ for (let i = 0; i < steps.length; i++) {
+ expect(stepLabels[i].textContent?.startsWith(steps[i].name)).toBe(true);
+ expect(stepLabels[i].textContent?.endsWith('seconds')).toBe(
+ steps[i].status !== 'skipped' && !!steps[i].startedAt,
+ );
+ }
+ });
});
diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx
index 668306fa9e..d783351eca 100644
--- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx
+++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx
@@ -78,6 +78,7 @@ export const TaskSteps = (props: TaskStepsProps) => {
{step.name}
{!isSkipped && }
From 078f46ea3269a61faaaab1d21290741c511d199e Mon Sep 17 00:00:00 2001
From: Dustin Brewer
Date: Fri, 10 Mar 2023 15:45:48 +0000
Subject: [PATCH 073/511] Cleanup building FireHydrant service name
Remove the reduntant check for the annotation, and utilize stringifyEntityRef as recommended
Signed-off-by: Dustin Brewer
---
.../ServiceDetailsCard/ServiceDetailsCard.test.tsx | 4 +++-
plugins/firehydrant/src/components/hooks.test.ts | 2 +-
plugins/firehydrant/src/components/hooks.ts | 9 +++------
3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx
index 20dbb77e86..ce2b1f5391 100644
--- a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx
+++ b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx
@@ -30,7 +30,9 @@ const apis = TestApiRegistry.from([fireHydrantApiRef, mockFireHydrantApi]);
jest.mock('@backstage/plugin-catalog-react', () => ({
useEntity: () => {
- return { entity: { metadata: { name: 'service-example' } } };
+ return {
+ entity: { kind: 'Component', metadata: { name: 'service-example' } },
+ };
},
}));
diff --git a/plugins/firehydrant/src/components/hooks.test.ts b/plugins/firehydrant/src/components/hooks.test.ts
index 2fbf1e2d57..f35d6774ce 100644
--- a/plugins/firehydrant/src/components/hooks.test.ts
+++ b/plugins/firehydrant/src/components/hooks.test.ts
@@ -63,7 +63,7 @@ describe('firehydrant-hooks-getFireHydrantServiceName', () => {
});
it('should return generated service name', () => {
- const expected = 'Component:default/test-fh-name';
+ const expected = 'component:default/test-fh-name';
const e: Entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
diff --git a/plugins/firehydrant/src/components/hooks.ts b/plugins/firehydrant/src/components/hooks.ts
index d9145f13f0..c4055b1724 100644
--- a/plugins/firehydrant/src/components/hooks.ts
+++ b/plugins/firehydrant/src/components/hooks.ts
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { Entity } from '@backstage/catalog-model';
+import { Entity, stringifyEntityRef } from '@backstage/catalog-model';
export const FIREHYDRANT_SERVICE_NAME_ANNOTATION =
'firehydrant.com/service-name';
@@ -21,8 +21,5 @@ export const FIREHYDRANT_SERVICE_NAME_ANNOTATION =
export const isFireHydrantAvailable = (entity: Entity) =>
Boolean(entity.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION]);
export const getFireHydrantServiceName = (entity: Entity) =>
- isFireHydrantAvailable(entity)
- ? entity?.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION] ?? ''
- : `${entity?.kind}:${entity?.metadata?.namespace ?? 'default'}/${
- entity?.metadata?.name
- }`;
+ entity?.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION] ??
+ stringifyEntityRef(entity);
From c5afe933bbbaa6037e42b6516156fc135d11905b Mon Sep 17 00:00:00 2001
From: Dustin Brewer
Date: Fri, 10 Mar 2023 16:00:32 +0000
Subject: [PATCH 074/511] Cleanup query string encoding on services API call
Signed-off-by: Dustin Brewer
---
plugins/firehydrant/src/api/index.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/plugins/firehydrant/src/api/index.ts b/plugins/firehydrant/src/api/index.ts
index 45834d90e9..1cbf10ec9b 100644
--- a/plugins/firehydrant/src/api/index.ts
+++ b/plugins/firehydrant/src/api/index.ts
@@ -81,10 +81,10 @@ export class FireHydrantAPIClient implements FireHydrantAPI {
lookupByName: boolean;
}): Promise {
const queryOpt = options.lookupByName ? 'name' : 'query';
+ const query = new URLSearchParams();
+ query.set(queryOpt, options.serviceName);
const proxyUrl = await this.getApiUrl();
- const response = await fetch(
- `${proxyUrl}/services?${queryOpt}=${options.serviceName}`,
- );
+ const response = await fetch(`${proxyUrl}/services?${query}`);
if (!response.ok) {
throw new Error(
From 21a27f6edc401655c4e5ceab5e11d996a2305fbf Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 Mar 2023 16:11:05 +0000
Subject: [PATCH 075/511] chore(deps): update dependency better-sqlite3 to
v8.2.0
Signed-off-by: Renovate Bot
---
yarn.lock | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 98493dc1c0..b1b60ba15e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -18001,13 +18001,13 @@ __metadata:
linkType: hard
"better-sqlite3@npm:^8.0.0":
- version: 8.1.0
- resolution: "better-sqlite3@npm:8.1.0"
+ version: 8.2.0
+ resolution: "better-sqlite3@npm:8.2.0"
dependencies:
bindings: ^1.5.0
node-gyp: latest
prebuild-install: ^7.1.0
- checksum: 7e6b4c33142f4b2ee2e60d3926b4db682feb0d09554efdaf7bea53cd5bef406ca0a5115ab9b411458daa45ba14973252ebd6853a3cdf94e4fd49cc8291730ade
+ checksum: ab8a00bcc33c4a7467f78fcbb103c784705cf170ecc9c8eb1149a89a2153c03a7f65681064667eb214fa7f555797abd8183380a0396ce04eaf36efef921ce103
languageName: node
linkType: hard
From ed0f26cf82b1ecdb783ca44ae17b3990baf3e8cd Mon Sep 17 00:00:00 2001
From: Paul Schultz
Date: Fri, 10 Mar 2023 10:45:50 -0600
Subject: [PATCH 076/511] Update prism style to vsDark
Signed-off-by: Paul Schultz
---
.../software-templates/testing-scaffolder-alpha.md | 4 ++--
microsite/docusaurus.config.js | 8 +++++++-
microsite/package.json | 1 +
microsite/src/css/customTheme.css | 8 ++++++++
microsite/yarn.lock | 1 +
5 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/docs/features/software-templates/testing-scaffolder-alpha.md b/docs/features/software-templates/testing-scaffolder-alpha.md
index c0b97e897c..1b0368f29c 100644
--- a/docs/features/software-templates/testing-scaffolder-alpha.md
+++ b/docs/features/software-templates/testing-scaffolder-alpha.md
@@ -197,9 +197,9 @@ You will need to change the import for `FieldValidation` to point at the new `re
```ts
/* highlight-remove-next-line */
-- import { FieldValidation } from '@rjsf/core';
+import { FieldValidation } from '@rjsf/core';
/* highlight-add-next-line */
-+ import { FieldValidation } from '@rjsf/utils;
+import { FieldValidation } from '@rjsf/utils;
import { KubernetesValidatorFunctions } from '@backstage/catalog-model';
export const entityNamePickerValidation = (
diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js
index 025c773a9c..8a9fe6fd9b 100644
--- a/microsite/docusaurus.config.js
+++ b/microsite/docusaurus.config.js
@@ -16,6 +16,11 @@
// @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',
@@ -266,10 +271,11 @@ module.exports = {
searchParameters: {},
},
prism: {
+ theme: prismTheme,
magicComments: [
// Extend the default highlight class name
{
- className: 'theme-code-block-highlighted-line',
+ className: 'code-block-highlight-line',
line: 'highlight-next-line',
block: { start: 'highlight-start', end: 'highlight-end' },
},
diff --git a/microsite/package.json b/microsite/package.json
index cb71d5a25a..70b1aa86ad 100644
--- a/microsite/package.json
+++ b/microsite/package.json
@@ -35,6 +35,7 @@
"@swc/core": "^1.3.36",
"clsx": "^1.1.1",
"docusaurus-plugin-sass": "^0.2.3",
+ "prism-react-renderer": "^1.3.5",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"sass": "^1.57.1",
diff --git a/microsite/src/css/customTheme.css b/microsite/src/css/customTheme.css
index 4ba7f1df86..f216762418 100644
--- a/microsite/src/css/customTheme.css
+++ b/microsite/src/css/customTheme.css
@@ -75,4 +75,12 @@
border-left: 3px solid rgba(255, 0, 0, 0.5);
}
+.code-block-highlight-line {
+ background-color: rgba(255, 255, 255, 0.08);
+ display: block;
+ margin: 0 calc(-1 * var(--ifm-pre-padding));
+ padding: 0 var(--ifm-pre-padding);
+ border-left: 3px solid rgb(255, 255, 255, 0.5);
+}
+
/* #endregion */
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index a9db81ead4..a6393e7386 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -3738,6 +3738,7 @@ __metadata:
docusaurus-plugin-sass: ^0.2.3
js-yaml: ^4.1.0
prettier: ^2.6.2
+ prism-react-renderer: ^1.3.5
react: ^17.0.2
react-dom: ^17.0.2
replace: ^1.2.2
From cf90b966989babe15a7656195fcb578772db1e1d Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 Mar 2023 16:48:29 +0000
Subject: [PATCH 077/511] chore(deps): update dependency lint-staged to v13.2.0
Signed-off-by: Renovate Bot
---
yarn.lock | 96 +++++++++++++++++++++++++++++++------------------------
1 file changed, 55 insertions(+), 41 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index b1b60ba15e..cdcd999a2a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -18749,6 +18749,13 @@ __metadata:
languageName: node
linkType: hard
+"chalk@npm:5.2.0":
+ version: 5.2.0
+ resolution: "chalk@npm:5.2.0"
+ checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa
+ languageName: node
+ linkType: hard
+
"chalk@npm:^3.0.0":
version: 3.0.0
resolution: "chalk@npm:3.0.0"
@@ -19430,10 +19437,10 @@ __metadata:
languageName: node
linkType: hard
-"commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.4.1, commander@npm:^9.5.0":
- version: 9.5.0
- resolution: "commander@npm:9.5.0"
- checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade
+"commander@npm:*, commander@npm:^10.0.0":
+ version: 10.0.0
+ resolution: "commander@npm:10.0.0"
+ checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd
languageName: node
linkType: hard
@@ -19486,6 +19493,13 @@ __metadata:
languageName: node
linkType: hard
+"commander@npm:^9.1.0, commander@npm:^9.5.0":
+ version: 9.5.0
+ resolution: "commander@npm:9.5.0"
+ checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade
+ languageName: node
+ linkType: hard
+
"common-ancestor-path@npm:^1.0.1":
version: 1.0.1
resolution: "common-ancestor-path@npm:1.0.1"
@@ -22978,20 +22992,20 @@ __metadata:
languageName: node
linkType: hard
-"execa@npm:^6.1.0":
- version: 6.1.0
- resolution: "execa@npm:6.1.0"
+"execa@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "execa@npm:7.0.0"
dependencies:
cross-spawn: ^7.0.3
get-stream: ^6.0.1
- human-signals: ^3.0.1
+ human-signals: ^4.3.0
is-stream: ^3.0.0
merge-stream: ^2.0.0
npm-run-path: ^5.1.0
onetime: ^6.0.0
signal-exit: ^3.0.7
strip-final-newline: ^3.0.0
- checksum: 1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e
+ checksum: be7c7b6d1e5473f628e46888b0cf8279da483c1a6000dd494a2059cc26591ded57ba46be1c9bdde1ec895e7eb8b18911174aba425cd971d41d140a9405da9a02
languageName: node
linkType: hard
@@ -25287,10 +25301,10 @@ __metadata:
languageName: node
linkType: hard
-"human-signals@npm:^3.0.1":
- version: 3.0.1
- resolution: "human-signals@npm:3.0.1"
- checksum: f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354
+"human-signals@npm:^4.3.0":
+ version: 4.3.0
+ resolution: "human-signals@npm:4.3.0"
+ checksum: 662b976b1063a8afb8fd7fa50bde6975997e17ea6ceba2aad54aacf1dc239a2cd7d14d27b3ceca0c6288627f4b45c56c2c89618455ff52cd9377c02d6328cd7c
languageName: node
linkType: hard
@@ -28301,10 +28315,10 @@ __metadata:
languageName: node
linkType: hard
-"lilconfig@npm:2.0.6, lilconfig@npm:^2.0.3":
- version: 2.0.6
- resolution: "lilconfig@npm:2.0.6"
- checksum: 40a3cd72f103b1be5975f2ac1850810b61d4053e20ab09be8d3aeddfe042187e1ba70b4651a7e70f95efa1642e7dc8b2ae395b317b7d7753b241b43cef7c0f7d
+"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.3":
+ version: 2.1.0
+ resolution: "lilconfig@npm:2.1.0"
+ checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117
languageName: node
linkType: hard
@@ -28344,25 +28358,25 @@ __metadata:
linkType: hard
"lint-staged@npm:^13.0.0":
- version: 13.1.2
- resolution: "lint-staged@npm:13.1.2"
+ version: 13.2.0
+ resolution: "lint-staged@npm:13.2.0"
dependencies:
+ chalk: 5.2.0
cli-truncate: ^3.1.0
- colorette: ^2.0.19
- commander: ^9.4.1
+ commander: ^10.0.0
debug: ^4.3.4
- execa: ^6.1.0
- lilconfig: 2.0.6
- listr2: ^5.0.5
+ execa: ^7.0.0
+ lilconfig: 2.1.0
+ listr2: ^5.0.7
micromatch: ^4.0.5
normalize-path: ^3.0.0
- object-inspect: ^1.12.2
+ object-inspect: ^1.12.3
pidtree: ^0.6.0
string-argv: ^0.3.1
- yaml: ^2.1.3
+ yaml: ^2.2.1
bin:
lint-staged: bin/lint-staged.js
- checksum: f854ad5c88542b8f06e27f3b4046927a4f3d4a451a04e079526559d819a325762268f65bd2df7156bcc0cb5f531f621c42cdb824b403f537c78305adc9e56a54
+ checksum: dcaa8fbbde567eb8ac27230a18b3a22f30c278c524c0e27cf7d4110d662d5d33ed68a585a2e1b05075ef1c262e853f557a5ae046188b723603246d63e6b9f07b
languageName: node
linkType: hard
@@ -28408,16 +28422,16 @@ __metadata:
languageName: node
linkType: hard
-"listr2@npm:^5.0.5":
- version: 5.0.5
- resolution: "listr2@npm:5.0.5"
+"listr2@npm:^5.0.7":
+ version: 5.0.7
+ resolution: "listr2@npm:5.0.7"
dependencies:
cli-truncate: ^2.1.0
colorette: ^2.0.19
log-update: ^4.0.0
p-map: ^4.0.0
rfdc: ^1.3.0
- rxjs: ^7.5.6
+ rxjs: ^7.8.0
through: ^2.3.8
wrap-ansi: ^7.0.0
peerDependencies:
@@ -28425,7 +28439,7 @@ __metadata:
peerDependenciesMeta:
enquirer:
optional: true
- checksum: 71c44eb648405d2725f248747ef8d5e192dd16938ec81df854c4a7e74ff1b3f4c3149461b1cff31c761bfbdf110f7f2603c9957c908294a1c6db299c9168608c
+ checksum: 5c2cb6ba3f7a5cfd548f89405febe73dc937acb6060227198c05da0ed5d5285a8107c61fcc4e33884e3bbdd447411aff7580af396bd22b6a11047ceab4950fab
languageName: node
linkType: hard
@@ -30981,10 +30995,10 @@ __metadata:
languageName: node
linkType: hard
-"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0":
- version: 1.12.2
- resolution: "object-inspect@npm:1.12.2"
- checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2
+"object-inspect@npm:^1.12.2, object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0":
+ version: 1.12.3
+ resolution: "object-inspect@npm:1.12.3"
+ checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db
languageName: node
linkType: hard
@@ -35093,7 +35107,7 @@ __metadata:
languageName: node
linkType: hard
-"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.6, rxjs@npm:^7.8.0":
+"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.0":
version: 7.8.0
resolution: "rxjs@npm:7.8.0"
dependencies:
@@ -39460,10 +39474,10 @@ __metadata:
languageName: node
linkType: hard
-"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3":
- version: 2.1.3
- resolution: "yaml@npm:2.1.3"
- checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7
+"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.2.1":
+ version: 2.2.1
+ resolution: "yaml@npm:2.2.1"
+ checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23
languageName: node
linkType: hard
From 1b9fa3440cd5fa6ae07d5245a87efe8234dc5280 Mon Sep 17 00:00:00 2001
From: Paul Schultz
Date: Fri, 10 Mar 2023 11:03:37 -0600
Subject: [PATCH 078/511] Update README
Signed-off-by: Paul Schultz
---
microsite/README.md | 157 ++++++++++++++++++++++++--------------------
1 file changed, 86 insertions(+), 71 deletions(-)
diff --git a/microsite/README.md b/microsite/README.md
index 723baa1a54..5c1b0c1678 100644
--- a/microsite/README.md
+++ b/microsite/README.md
@@ -1,6 +1,6 @@
# Backstage Documentation
-This folder holds the service and configuration that runs Backstage's documentation hosted at https://backstage.io.
+This folder holds the service and configuration that runs Backstage's documentation hosted at .
It pulls content in from the [root `/docs`](../docs/) folder and builds it into the resulting HTML web site.
@@ -20,13 +20,13 @@ Testing the web site locally is a great way to see what final website will look
## Installation
-```
+```bash
$ yarn install
```
## Local Development
-```
+```bash
$ yarn start
```
@@ -34,7 +34,7 @@ This command starts a local development server and opens up a browser window. Mo
## Build
-```
+```bash
$ yarn build
```
@@ -107,30 +107,30 @@ For more information about blog posts, click [here](https://docusaurus.io/docs/e
1. Create the doc as a new markdown file in `/docs`, example `docs/newly-created-doc.md`:
-```md
----
-id: newly-created-doc
-title: This Doc Needs To Be Edited
----
+ ```md
+ ---
+ id: newly-created-doc
+ title: This Doc Needs To Be Edited
+ ---
-My new content here..
-```
+ My new content here..
+ ```
-1. Refer to that doc's ID in an existing sidebar in `website/sidebars.json`:
+2. Refer to that doc's ID in an existing sidebar in `website/sidebars.json`:
-```javascript
-// Add newly-created-doc to the Getting Started category of docs
-{
- "docs": {
- "Getting Started": [
- "quick-start",
- "newly-created-doc" // new doc here
- ],
- ...
- },
- ...
-}
-```
+ ```javascript
+ // Add newly-created-doc to the Getting Started category of docs
+ {
+ "docs": {
+ "Getting Started": [
+ "quick-start",
+ "newly-created-doc" // new doc here
+ ],
+ ...
+ },
+ ...
+ }
+ ```
For more information about adding new docs, click [here](https://docusaurus.io/docs/en/navigation)
@@ -138,30 +138,30 @@ For more information about adding new docs, click [here](https://docusaurus.io/d
1. Make sure there is a header link to your blog in `website/siteConfig.js`:
-`website/siteConfig.js`
+ `website/siteConfig.js`
-```javascript
-headerLinks: [
- ...
- { blog: true, label: 'Blog' },
- ...
-]
-```
+ ```javascript
+ headerLinks: [
+ ...
+ { blog: true, label: 'Blog' },
+ ...
+ ]
+ ```
2. Create the blog post with the format `YYYY-MM-DD-My-Blog-Post-Title.md` in `website/blog`:
-`website/blog/2018-05-21-New-Blog-Post.md`
+ `website/blog/2018-05-21-New-Blog-Post.md`
-```markdown
----
-author: Frank Li
-authorURL: https://twitter.com/foobarbaz
-authorFBID: 503283835
-title: New Blog Post
----
+ ```markdown
+ ---
+ author: Frank Li
+ authorURL: https://twitter.com/foobarbaz
+ authorFBID: 503283835
+ title: New Blog Post
+ ---
-Lorem Ipsum...
-```
+ Lorem Ipsum...
+ ```
For more information about blog posts, click [here](https://docusaurus.io/docs/en/adding-blog)
@@ -169,43 +169,44 @@ For more information about blog posts, click [here](https://docusaurus.io/docs/e
1. Add links to docs, custom pages or external links by editing the `headerLinks` field of `website/siteConfig.js`:
-`website/siteConfig.js`
+ `website/siteConfig.js`
-```javascript
-{
- headerLinks: [
- ...
- /* you can add docs */
- { doc: 'my-examples', label: 'Examples' },
- /* you can add custom pages */
- { page: 'help', label: 'Help' },
- /* you can add external links */
- { href: 'https://github.com/facebook/docusaurus', label: 'GitHub' },
- ...
- ],
- ...
-}
-```
+ ```javascript
+ {
+ headerLinks: [
+ ...
+ /* you can add docs */
+ { doc: 'my-examples', label: 'Examples' },
+ /* you can add custom pages */
+ { page: 'help', label: 'Help' },
+ /* you can add external links */
+ { href: 'https://github.com/facebook/docusaurus', label: 'GitHub' },
+ ...
+ ],
+ ...
+ }
+ ```
For more information about the navigation bar, click [here](https://docusaurus.io/docs/en/navigation)
### Adding custom pages
1. Docusaurus uses React components to build pages. The components are saved as .js files in `website/pages/en`:
-1. If you want your page to show up in your navigation header, you will need to update `website/siteConfig.js` to add to the `headerLinks` element:
-`website/siteConfig.js`
+2. If you want your page to show up in your navigation header, you will need to update `website/siteConfig.js` to add to the `headerLinks` element:
-```javascript
-{
- headerLinks: [
- ...
- { page: 'my-new-custom-page', label: 'My New Custom Page' },
- ...
- ],
- ...
-}
-```
+ `website/siteConfig.js`
+
+ ```javascript
+ {
+ headerLinks: [
+ ...
+ { page: 'my-new-custom-page', label: 'My New Custom Page' },
+ ...
+ ],
+ ...
+ }
+ ```
Learn more about [Docusaurus custom pages](https://docusaurus.io/docs/en/custom-pages).
@@ -217,3 +218,17 @@ Full documentation can be found on the [Docusaurus website](https://docusaurus.i
- If you want to make images zoomable on click, add the `data-zoomable` attribute to your `img` element.
- In a docs or blog `.md` file, convert `` syntax to `
`
+
+- Code block line highlighting uses [custom magic comments](https://docusaurus.io/docs/markdown-features/code-blocks#custom-magic-comments). Currently, we have the following magic comments:
+ - Highlight line(s)
+ - `highlight-next-line`
+ - `highlight-start`
+ - `highlight-end`
+ - Add line(s)
+ - `highlight-add-next-line`
+ - `highlight-add-start`
+ - `highlight-add-end`
+ - Remove line(s)
+ - `highlight-remove-next-line`
+ - `highlight-remove-start`
+ - `highlight-remove-end`
From b7319793cea6cdeb5d99fb633a02702074191c83 Mon Sep 17 00:00:00 2001
From: Paul Schultz
Date: Fri, 10 Mar 2023 11:04:38 -0600
Subject: [PATCH 079/511] Update README
Signed-off-by: Paul Schultz
---
microsite/README.md | 131 ++++++++++++++++++++++----------------------
1 file changed, 66 insertions(+), 65 deletions(-)
diff --git a/microsite/README.md b/microsite/README.md
index 5c1b0c1678..26c25dc175 100644
--- a/microsite/README.md
+++ b/microsite/README.md
@@ -107,30 +107,30 @@ For more information about blog posts, click [here](https://docusaurus.io/docs/e
1. Create the doc as a new markdown file in `/docs`, example `docs/newly-created-doc.md`:
- ```md
- ---
- id: newly-created-doc
- title: This Doc Needs To Be Edited
- ---
+ ```md
+ ---
+ id: newly-created-doc
+ title: This Doc Needs To Be Edited
+ ---
- My new content here..
- ```
+ My new content here..
+ ```
2. Refer to that doc's ID in an existing sidebar in `website/sidebars.json`:
- ```javascript
- // Add newly-created-doc to the Getting Started category of docs
- {
- "docs": {
- "Getting Started": [
- "quick-start",
- "newly-created-doc" // new doc here
- ],
- ...
- },
- ...
- }
- ```
+ ```javascript
+ // Add newly-created-doc to the Getting Started category of docs
+ {
+ "docs": {
+ "Getting Started": [
+ "quick-start",
+ "newly-created-doc" // new doc here
+ ],
+ ...
+ },
+ ...
+ }
+ ```
For more information about adding new docs, click [here](https://docusaurus.io/docs/en/navigation)
@@ -138,30 +138,30 @@ For more information about adding new docs, click [here](https://docusaurus.io/d
1. Make sure there is a header link to your blog in `website/siteConfig.js`:
- `website/siteConfig.js`
+ `website/siteConfig.js`
- ```javascript
- headerLinks: [
- ...
- { blog: true, label: 'Blog' },
- ...
- ]
- ```
+ ```javascript
+ headerLinks: [
+ ...
+ { blog: true, label: 'Blog' },
+ ...
+ ]
+ ```
2. Create the blog post with the format `YYYY-MM-DD-My-Blog-Post-Title.md` in `website/blog`:
- `website/blog/2018-05-21-New-Blog-Post.md`
+ `website/blog/2018-05-21-New-Blog-Post.md`
- ```markdown
- ---
- author: Frank Li
- authorURL: https://twitter.com/foobarbaz
- authorFBID: 503283835
- title: New Blog Post
- ---
+ ```markdown
+ ---
+ author: Frank Li
+ authorURL: https://twitter.com/foobarbaz
+ authorFBID: 503283835
+ title: New Blog Post
+ ---
- Lorem Ipsum...
- ```
+ Lorem Ipsum...
+ ```
For more information about blog posts, click [here](https://docusaurus.io/docs/en/adding-blog)
@@ -169,23 +169,23 @@ For more information about blog posts, click [here](https://docusaurus.io/docs/e
1. Add links to docs, custom pages or external links by editing the `headerLinks` field of `website/siteConfig.js`:
- `website/siteConfig.js`
+ `website/siteConfig.js`
- ```javascript
- {
- headerLinks: [
- ...
- /* you can add docs */
- { doc: 'my-examples', label: 'Examples' },
- /* you can add custom pages */
- { page: 'help', label: 'Help' },
- /* you can add external links */
- { href: 'https://github.com/facebook/docusaurus', label: 'GitHub' },
- ...
- ],
- ...
- }
- ```
+ ```javascript
+ {
+ headerLinks: [
+ ...
+ /* you can add docs */
+ { doc: 'my-examples', label: 'Examples' },
+ /* you can add custom pages */
+ { page: 'help', label: 'Help' },
+ /* you can add external links */
+ { href: 'https://github.com/facebook/docusaurus', label: 'GitHub' },
+ ...
+ ],
+ ...
+ }
+ ```
For more information about the navigation bar, click [here](https://docusaurus.io/docs/en/navigation)
@@ -195,18 +195,18 @@ For more information about the navigation bar, click [here](https://docusaurus.i
2. If you want your page to show up in your navigation header, you will need to update `website/siteConfig.js` to add to the `headerLinks` element:
- `website/siteConfig.js`
+ `website/siteConfig.js`
- ```javascript
- {
- headerLinks: [
- ...
- { page: 'my-new-custom-page', label: 'My New Custom Page' },
- ...
- ],
- ...
- }
- ```
+ ```javascript
+ {
+ headerLinks: [
+ ...
+ { page: 'my-new-custom-page', label: 'My New Custom Page' },
+ ...
+ ],
+ ...
+ }
+ ```
Learn more about [Docusaurus custom pages](https://docusaurus.io/docs/en/custom-pages).
@@ -217,6 +217,7 @@ Full documentation can be found on the [Docusaurus website](https://docusaurus.i
## Additional notes
- If you want to make images zoomable on click, add the `data-zoomable` attribute to your `img` element.
+
- In a docs or blog `.md` file, convert `` syntax to `
`
- Code block line highlighting uses [custom magic comments](https://docusaurus.io/docs/markdown-features/code-blocks#custom-magic-comments). Currently, we have the following magic comments:
From edecccabe47b23c5c78118ee46def576afbb8e6d Mon Sep 17 00:00:00 2001
From: zjpersc
Date: Fri, 10 Mar 2023 14:01:24 -0600
Subject: [PATCH 080/511] Updating the feature doc for techdocs-cli
Signed-off-by: zjpersc
---
docs/features/techdocs/cli.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md
index b174896d6a..76589de5a8 100644
--- a/docs/features/techdocs/cli.md
+++ b/docs/features/techdocs/cli.md
@@ -200,6 +200,15 @@ Options:
-h, --help display help for command
```
+#### Publishing from behind a proxy
+
+For users attempting to publish TechDocs content behind a proxy, the TechDocs CLI leverages `global-agent` to navigate the proxy to successfully connect to that location. To enable `global-agent`, the following variables need to be set prior to running the techdocs-cli command:
+
+```bash
+export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY}
+export GLOBAL_AGENT_NO_PROXY=${NO_PROXY}
+```
+
### Migrate content for case-insensitive access
Prior to the beta version of TechDocs (`v[0.11.0]`), TechDocs were stored in
From 21e9c235b94da6e4da9925bcc70f9ce0def40efb Mon Sep 17 00:00:00 2001
From: Claire Casey
Date: Fri, 10 Mar 2023 16:25:47 -0500
Subject: [PATCH 081/511] add zod as dependency to specify version
Signed-off-by: Claire Casey
---
.../plugin-authors/03-adding-a-resource-permission-check.md | 2 +-
plugins/example-todo-list-backend/package.json | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md
index e714301ded..d405c2ac4f 100644
--- a/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md
+++ b/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md
@@ -91,7 +91,7 @@ This enables decisions based on characteristics of the resource, but it's import
Install the missing module:
```bash
-$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node zod
+$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node
```
Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append the following code:
diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json
index 5579f748b2..11c7b849e1 100644
--- a/plugins/example-todo-list-backend/package.json
+++ b/plugins/example-todo-list-backend/package.json
@@ -34,7 +34,8 @@
"express-promise-router": "^4.1.0",
"uuid": "^8.3.2",
"winston": "^3.2.1",
- "yn": "^4.0.0"
+ "yn": "^4.0.0",
+ "zod": "~3.18.0"
},
"devDependencies": {
"@backstage/cli": "workspace:^",
From 1b3ab31a2be25f7deda63a2f3449540da550fbd1 Mon Sep 17 00:00:00 2001
From: Bogdan Nechyporenko
Date: Fri, 10 Mar 2023 23:49:46 +0100
Subject: [PATCH 082/511] removed microservice-next leftovers
Signed-off-by: Bogdan Nechyporenko
---
.../src/components/simpleCard/simpleCard.tsx | 17 ----
.../src/pages/on-demand/_onDemandCard.tsx | 66 ----------------
microsite-next/src/pages/on-demand/index.tsx | 78 -------------------
.../src/pages/on-demand/onDemand.module.scss | 44 -----------
.../src/util/truncateDescription.tsx | 11 ---
5 files changed, 216 deletions(-)
delete mode 100644 microsite-next/src/components/simpleCard/simpleCard.tsx
delete mode 100644 microsite-next/src/pages/on-demand/_onDemandCard.tsx
delete mode 100644 microsite-next/src/pages/on-demand/index.tsx
delete mode 100644 microsite-next/src/pages/on-demand/onDemand.module.scss
delete mode 100644 microsite-next/src/util/truncateDescription.tsx
diff --git a/microsite-next/src/components/simpleCard/simpleCard.tsx b/microsite-next/src/components/simpleCard/simpleCard.tsx
deleted file mode 100644
index 77be566f18..0000000000
--- a/microsite-next/src/components/simpleCard/simpleCard.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-
-export interface ICardData {
- header: React.ReactNode;
- body: React.ReactNode;
- footer: React.ReactNode;
-}
-
-export const SimpleCard = ({ header, body, footer }: ICardData) => (
-
-
{header}
-
-
{body}
-
-
{footer}
-
-);
diff --git a/microsite-next/src/pages/on-demand/_onDemandCard.tsx b/microsite-next/src/pages/on-demand/_onDemandCard.tsx
deleted file mode 100644
index e203c80f9a..0000000000
--- a/microsite-next/src/pages/on-demand/_onDemandCard.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import Link from '@docusaurus/Link';
-import { SimpleCard } from '@site/src/components/simpleCard/simpleCard';
-import React from 'react';
-
-export interface IOnDemandData {
- title: string;
- category: string;
- description: string;
- date: string;
- youtubeUrl: string;
- youtubeImgUrl: string;
- rsvpUrl: string;
- eventUrl: string;
-}
-
-export const OnDemandCard = ({
- title,
- category,
- description,
- date,
- youtubeUrl,
- youtubeImgUrl,
- rsvpUrl,
- eventUrl,
-}: IOnDemandData) => (
-
- {title}
-
- on {date}
-
- {category}
-
-
- >
- }
- body={{description}
}
- footer={
- category.toLowerCase() === 'upcoming' ? (
- <>
-
- Event page
-
-
-
- Remind me
-
- >
- ) : (
-
- Watch on YouTube
-
- )
- }
- />
-);
diff --git a/microsite-next/src/pages/on-demand/index.tsx b/microsite-next/src/pages/on-demand/index.tsx
deleted file mode 100644
index 7262005f70..0000000000
--- a/microsite-next/src/pages/on-demand/index.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import Layout from '@theme/Layout';
-import clsx from 'clsx';
-import React from 'react';
-
-import { IOnDemandData, OnDemandCard } from './_onDemandCard';
-import pluginsStyles from './onDemand.module.scss';
-import { truncateDescription } from '@site/src/util/truncateDescription';
-import Link from '@docusaurus/Link';
-
-//#region Plugin data import
-const onDemandContext = require.context(
- '../../../../microsite/data/on-demand',
- false,
- /\.ya?ml/,
-);
-
-const onDemandData = onDemandContext.keys().reduce(
- (acum, id) => {
- const pluginData: IOnDemandData = onDemandContext(id).default;
-
- acum[
- pluginData.category === 'Upcoming' ? 'upcomingEvents' : 'onDemandEvents'
- ].push(truncateDescription(pluginData));
-
- return acum;
- },
- {
- upcomingEvents: [] as IOnDemandData[],
- onDemandEvents: [] as IOnDemandData[],
- },
-);
-//#endregion
-
-const Plugins = () => (
-
-
-
-
-
Community sessions
-
-
- Upcoming events and recorded sessions about updates, demos and
- discussions.
-
-
-
-
- Add an event or recording
-
-
-
-
-
-
Upcoming live events
-
-
- {onDemandData.upcomingEvents.map(eventData => (
-
- ))}
-
-
-
Community on demand
-
-
- {onDemandData.onDemandEvents.map(eventData => (
-
- ))}
-
-
-
-);
-
-export default Plugins;
diff --git a/microsite-next/src/pages/on-demand/onDemand.module.scss b/microsite-next/src/pages/on-demand/onDemand.module.scss
deleted file mode 100644
index fba051ec97..0000000000
--- a/microsite-next/src/pages/on-demand/onDemand.module.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-.onDemandPage {
- :global(.marketplaceBanner) {
- display: flex;
- align-items: center;
- }
-
- :global(.marketplaceContent) {
- flex: 1;
- }
-
- :global(.card) {
- max-width: 100%;
- }
-
- :global(.card .card__header) {
- display: grid;
- row-gap: 0.25rem;
- column-gap: 1rem;
- justify-items: start;
-
- > * {
- margin: 0;
- }
-
- :global(img) {
- width: 250px;
- max-width: 100%;
- justify-self: center;
- }
- }
-
- :global(.card .card__footer) {
- gap: 1rem;
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
- }
-
- :global(.cardsContainer) {
- gap: 1rem;
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
- justify-items: start;
- }
-}
diff --git a/microsite-next/src/util/truncateDescription.tsx b/microsite-next/src/util/truncateDescription.tsx
deleted file mode 100644
index dc661cbd49..0000000000
--- a/microsite-next/src/util/truncateDescription.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-export const maxDescLength = 160;
-
-export const truncateDescription = (
- itemData: T,
-) =>
- itemData.description.length > maxDescLength
- ? {
- ...itemData,
- description: itemData.description.slice(0, maxDescLength) + '...',
- }
- : itemData;
From 03ebad97d224c7a598a87bc897901be98dd7c8fb Mon Sep 17 00:00:00 2001
From: Tracey
Date: Fri, 10 Mar 2023 17:36:40 -0800
Subject: [PATCH 083/511] adding new action confluence to markdown for GitHub
repos onboarded onto techdocs
Signed-off-by: Tracey
---
.../.eslintrc.js | 1 +
.../README.md | 126 +++++++
.../package.json | 49 +++
.../confluence/confluenceToMarkdown.test.ts | 316 ++++++++++++++++++
.../confluence/confluenceToMarkdown.ts | 187 +++++++++++
.../src/actions/confluence/helpers.ts | 142 ++++++++
.../src/actions/confluence/index.ts | 16 +
.../src/actions/index.ts | 16 +
.../src/index.ts | 23 ++
yarn.lock | 107 +++++-
10 files changed, 973 insertions(+), 10 deletions(-)
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts
create mode 100644 plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js b/plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md b/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md
new file mode 100644
index 0000000000..61cc1efe13
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/README.md
@@ -0,0 +1,126 @@
+# @backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn
+
+Welcome to the `transform:confluence-to-markdown` action for the `scaffolder-backend`.
+
+## Getting started
+
+You need to configure the action in your backend:
+
+## From your Backstage root directory
+
+```bash
+# From your Backstage root directory
+yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn
+```
+
+Configure the action:
+(you can check the [docs](https://backstage.io/docs/features/software-templates/writing-custom-actions#registering-custom-actions) to see all options):
+
+```typescript
+// packages/backend/src/plugins/scaffolder.ts
+
+import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend';
+import { ScmIntegrations } from '@backstage/integration';
+import { createConfluenceToMarkdownAction } from '@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn';
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ const catalogClient = new CatalogClient({ discoveryApi: env.discovery });
+ const integrations = ScmIntegrations.fromConfig(env.config);
+
+ const builtInActions = createBuiltinActions({
+ integrations,
+ catalogClient,
+ config: env.config,
+ reader: env.reader,
+ });
+
+ const actions = [
+ ...builtInActions,
+ createConfluenceToMarkdownAction({
+ integrations,
+ config: env.config,
+ reader: env.reader,
+ }),
+ ];
+
+ return createRouter({
+ actions,
+ catalogClient: catalogClient,
+ logger: env.logger,
+ config: env.config,
+ database: env.database,
+ reader: env.reader,
+ });
+}
+```
+
+You will also need an access token for authorization with `Read` permissions. You can create a Personal Access Token (PAT) in confluence and add the PAT to your `app-config.yaml`
+
+```
+confluence:
+ baseUrl: ${CONFLUENCE_BASE_URL}
+ token: ${CONFLUENCE_TOKEN}
+
+```
+
+After that you can use the action in your template:
+
+```
+apiVersion: scaffolder.backstage.io/v1beta3
+kind: Template
+metadata:
+ name: confluence-to-markdown
+ title: Confluence to Markdown
+ description: This template converts a single confluence document to Markdown for Techdocs and adds it to a given GitHub repo.
+ tags:
+ - do-not-use
+ - poc
+spec:
+ owner:
+ type: service
+ parameters:
+ - title: Confluence and Github Repo Information
+ properties:
+ confluenceUrls:
+ type: array
+ description: Urls for confluence doc to be converted to markdown. In format /display// or /pages/viewpage.action?spacekey=&title=
+ items:
+ type: string
+ default: confluence url
+ ui:options:
+ addable: true
+ minItems: 1
+ maxItems: 5
+ repoUrl:
+ type: string
+ title: GitHub url mkdocs.yaml link
+ description: The GitHub repo url to your mkdocs.yaml file. Example
+ steps:
+ - id: create-docs
+ name: Get markdown file created and update markdown.yaml file
+ action: transform:confluence-to-markdown
+ input:
+ confluenceUrls: ${{ parameters.confluenceUrls }}
+ repoUrl: ${{ parameters.repoUrl }}
+ - id: publish
+ name: Publish PR to GitHub
+ action: publish:github:pull-request
+ input:
+ repoUrl: ?repo=${{ steps['create-docs'].output.repo }}&owner=${{ steps['create-docs'].output.owner }}
+ branchName: confluence-to-markdown
+ title: Confluence to Markdown
+ description: PR for converting confluence page to mkdocs
+ - id: merge
+ name: Merge PR
+ action: publish:github:merge-pull-request
+ input:
+ prUrl: ${{ steps['publish'].output.remoteUrl }}
+ forceAdmin: true
+
+```
+
+Replace `` with your GitHub url without `https://`.
+
+You can find a list of all registred actions including their parameters at the /create/actions route in your Backstage application.
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json
new file mode 100644
index 0000000000..cc445108c3
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn",
+ "description": "The confluence-to-markdowwn module for @backstage/plugin-scaffolder-backend",
+ "version": "0.0.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.cjs.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "backend-plugin-module"
+ },
+ "scripts": {
+ "start": "backstage-cli package start",
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "clean": "backstage-cli package clean",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack",
+ "help": "backstage-cli help"
+ },
+ "dependencies": {
+ "@backstage/backend-common": "workspace:^",
+ "@backstage/config": "workspace:^",
+ "@backstage/errors": "workspace:^",
+ "@backstage/integration": "workspace:^",
+ "@backstage/plugin-scaffolder-backend": "workspace:^",
+ "@backstage/plugin-scaffolder-node": "workspace:^",
+ "@backstage/types": "workspace:^",
+ "fs": "^0.0.1-security",
+ "fs-extra": "^11.1.0",
+ "git-url-parse": "^13.1.0",
+ "node-fetch": "2.6.7",
+ "node-html-markdown": "^1.3.0",
+ "yaml": "^2.2.1"
+ },
+ "devDependencies": {
+ "@backstage/cli": "workspace:^",
+ "mock-fs": "^5.2.0",
+ "os": "^0.1.2"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts
new file mode 100644
index 0000000000..6a3a497d99
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.test.ts
@@ -0,0 +1,316 @@
+/*
+ * 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 { PassThrough } from 'stream';
+import { createConfluenceToMarkdownAction } from './confluenceToMarkdown';
+import { getVoidLogger } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { ConfigReader } from '@backstage/config';
+import { ScmIntegrations } from '@backstage/integration';
+import mockFs from 'mock-fs';
+import os from 'os';
+import fetch from 'node-fetch';
+import type { ActionContext } from '@backstage/plugin-scaffolder-node';
+import { readFile, writeFile } from 'fs-extra';
+import { Readable } from 'stream';
+
+jest.mock('node-fetch');
+jest.mock('fs-extra', () => ({
+ mkdirSync: jest.fn(),
+ readFile: jest.fn().mockResolvedValue('File contents'),
+ writeFile: jest.fn().mockImplementation(() => {
+ return Promise.resolve();
+ }),
+ outputFile: jest.fn(),
+ openSync: jest.fn(),
+ createWriteStream: jest.fn().mockReturnValue(new PassThrough()),
+ writeStream: jest.fn(),
+}));
+const { Response } = jest.requireActual('node-fetch');
+
+describe('transform:confluence-to-markdown', () => {
+ const config = new ConfigReader({
+ confluence: {
+ baseUrl: 'https://nodomain.confluence.com/',
+ token: 'fake_token',
+ },
+ });
+
+ const integrations = ScmIntegrations.fromConfig(
+ new ConfigReader({
+ integrations: {
+ github: [{ host: 'github.com', token: 'token' }],
+ },
+ }),
+ );
+
+ let reader: UrlReader;
+ let mockContext: ActionContext<{
+ confluenceUrls: string[];
+ repoUrl: string;
+ }>;
+
+ const logger = getVoidLogger();
+ jest.spyOn(logger, 'info');
+
+ const mockTmpDir = os.tmpdir();
+
+ beforeEach(() => {
+ reader = {
+ readUrl: jest.fn(),
+ readTree: jest.fn().mockResolvedValue({
+ dir: jest.fn(),
+ }),
+ search: jest.fn(),
+ };
+ mockContext = {
+ input: {
+ confluenceUrls: [
+ 'https://nodomain.confluence.com/display/testing/mkdocs',
+ ],
+ repoUrl: 'https://notreal.github.com/space/backstage/mkdocs.yml',
+ },
+ workspacePath: '/tmp',
+ logger,
+ logStream: new PassThrough(),
+ output: jest.fn(),
+ createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir),
+ };
+ mockFs({ [`${mockTmpDir}/src/docs`]: {} });
+ });
+ afterEach(() => {
+ jest.clearAllMocks();
+ mockFs.restore();
+ });
+
+ it('should call confluence to markdown action successfully with results array', async () => {
+ const options = {
+ reader,
+ integrations,
+ config,
+ };
+ const responseBody = {
+ results: [
+ {
+ id: '4444444',
+ type: 'page',
+ title: 'Testing',
+ body: {
+ export_view: {
+ value: 'hello world
',
+ },
+ },
+ },
+ ],
+ };
+ const responseBodyTwo = {
+ results: [
+ {
+ id: '4444444',
+ type: 'attachment',
+ title: 'testing.pdf',
+ metadata: {
+ mediaType: 'application/pdf',
+ },
+ _links: {
+ download: '/download/attachments/4444444/testing.pdf',
+ },
+ },
+ ],
+ };
+
+ (fetch as jest.MockedFunction)
+ .mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBody), {
+ status: 200,
+ statusText: 'OK',
+ }),
+ )
+ .mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBodyTwo), {
+ status: 200,
+ statusText: 'OK',
+ }),
+ )
+ .mockResolvedValueOnce(
+ new Response(Readable.from('Hello world'), {
+ status: 200,
+ statusText: 'OK',
+ }),
+ );
+
+ const mockCreateWriteStream = jest.fn().mockReturnValue({
+ on: jest.fn(),
+ once: jest.fn((_event, callback) => {
+ callback();
+ }),
+ });
+ jest.mock('fs', () => ({
+ openSync: jest.fn(),
+ createWriteStream: jest.fn().mockReturnValue(mockCreateWriteStream),
+ }));
+ const action = createConfluenceToMarkdownAction(options);
+
+ await action.handler(mockContext);
+
+ expect(logger.info).toHaveBeenCalledWith(
+ `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`,
+ );
+ expect(logger.info).toHaveBeenCalledTimes(5);
+
+ expect(fetch).toHaveBeenCalledTimes(3);
+ expect(readFile).toHaveBeenCalledTimes(1);
+ expect(writeFile).toHaveBeenCalledTimes(1);
+ });
+
+ it('should call confluence to markdown action successfully with empty results array', async () => {
+ const options = {
+ reader,
+ integrations,
+ config,
+ };
+ const responseBody = {
+ results: [
+ {
+ id: '4444444',
+ type: 'page',
+ title: 'Testing',
+ body: {
+ export_view: {
+ value: 'hello world
',
+ },
+ },
+ },
+ ],
+ };
+ const responseBodyTwo = {
+ results: [],
+ };
+
+ (fetch as jest.MockedFunction)
+ .mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBody), {
+ status: 200,
+ statusText: 'OK',
+ }),
+ )
+ .mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBodyTwo), {
+ status: 200,
+ statusText: 'OK',
+ }),
+ );
+
+ jest.mock('fs-extra', () => ({
+ readFile: jest.fn().mockResolvedValue('File contents'),
+ }));
+ const action = createConfluenceToMarkdownAction(options);
+
+ await action.handler(mockContext);
+
+ expect(logger.info).toHaveBeenCalledWith(
+ `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`,
+ );
+ expect(logger.info).toHaveBeenCalledTimes(5);
+
+ expect(fetch).toHaveBeenCalledTimes(2);
+ expect(readFile).toHaveBeenCalledTimes(1);
+ expect(writeFile).toHaveBeenCalledTimes(1);
+ });
+
+ it('shoud fail on the first fetch call with response.ok set to false', async () => {
+ const options = {
+ reader,
+ integrations,
+ config,
+ };
+ const responseBody = {};
+ (fetch as jest.MockedFunction).mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBody), {
+ status: 401,
+ statusText: 'npot',
+ ok: false,
+ }),
+ );
+ const action = createConfluenceToMarkdownAction(options);
+ await expect(async () => {
+ await action.handler(mockContext);
+ }).rejects.toThrow('Request failed with 401 Error');
+ });
+
+ it('should return nothing in results from the first api call and fail', async () => {
+ const options = {
+ reader,
+ integrations,
+ config,
+ };
+ const responseBody = {
+ results: [],
+ };
+ (fetch as jest.MockedFunction).mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBody), {
+ status: 200,
+ statusText: 'ok',
+ }),
+ );
+ const action = createConfluenceToMarkdownAction(options);
+ await expect(async () => {
+ await action.handler(mockContext);
+ }).rejects.toThrow(
+ 'Could not find document https://nodomain.confluence.com/display/testing/mkdocs. Please check your input.',
+ );
+ });
+
+ it('should fail on the second fetch call to confluence', async () => {
+ const options = {
+ reader,
+ integrations,
+ config,
+ };
+ const responseBody = {
+ results: [
+ {
+ id: '4444444',
+ type: 'page',
+ title: 'Testing',
+ body: {
+ export_view: {
+ value: 'hello world
',
+ },
+ },
+ },
+ ],
+ };
+ const responseBodyTwo = {};
+
+ (fetch as jest.MockedFunction)
+ .mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBody), {
+ status: 200,
+ statusText: 'OK',
+ }),
+ )
+ .mockResolvedValueOnce(
+ new Response(JSON.stringify(responseBodyTwo), {
+ status: 404,
+ statusText: 'notok',
+ }),
+ );
+ const action = createConfluenceToMarkdownAction(options);
+ await expect(async () => {
+ await action.handler(mockContext);
+ }).rejects.toThrow('Request failed with 404 Error');
+ });
+});
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts
new file mode 100644
index 0000000000..792d1f088b
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts
@@ -0,0 +1,187 @@
+/*
+ * 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 { Config } from '@backstage/config';
+import { UrlReader } from '@backstage/backend-common';
+import { ScmIntegrations } from '@backstage/integration';
+import { createFetchPlainAction } from '@backstage/plugin-scaffolder-backend';
+import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
+import { InputError, ConflictError } from '@backstage/errors';
+import { NodeHtmlMarkdown } from 'node-html-markdown';
+import fs from 'fs-extra';
+import parseGitUrl from 'git-url-parse';
+import {
+ parseFromYaml,
+ readFileAsString,
+ transformToYaml,
+ updateFile,
+ fetchConfluence,
+ getAndWriteAttachments,
+ createConfluenceVariables,
+} from './helpers';
+
+export const createConfluenceToMarkdownAction = (options: {
+ reader: UrlReader;
+ integrations: ScmIntegrations;
+ config: Config;
+}) => {
+ const { config, reader, integrations } = options;
+ const fetchPlainAction = createFetchPlainAction({ reader, integrations });
+ type Obj = {
+ [key: string]: string;
+ };
+
+ return createTemplateAction<{
+ confluenceUrls: string[];
+ repoUrl: string;
+ }>({
+ id: 'transform:confluence-to-markdown',
+ schema: {
+ input: {
+ properties: {
+ confluenceUrls: {
+ type: 'array',
+ title: 'Confluence URL',
+ description:
+ 'Paste your confluence url. Ensure it follows this format: https://{confluence+base+url}/display/{spacekey}/{page+title}',
+ items: {
+ type: 'string',
+ default: 'Confluence URL',
+ },
+ },
+ repoUrl: {
+ type: 'string',
+ title: 'GitHub Repo Url',
+ description:
+ 'mkdocs.yml file location inside the github repo you want to store the document',
+ },
+ },
+ },
+ },
+ async handler(ctx) {
+ const { confluenceUrls, repoUrl } = ctx.input;
+ const parsedRepoUrl = parseGitUrl(`${repoUrl}`);
+ const filePathToMkdocs = parsedRepoUrl.filepath.substring(
+ 0,
+ parsedRepoUrl.filepath.lastIndexOf('/') + 1,
+ );
+ const dirPath = ctx.workspacePath;
+ let productArray: string[][] = [];
+
+ ctx.logger.info(`Fetching the mkdocs.yml catalog from ${repoUrl}`);
+ ctx.logger.info(confluenceUrls);
+ const params = new URL(confluenceUrls[0]);
+ ctx.logger.info(params.searchParams);
+ // This grabs the files from Github
+ const repoFileDir = `${dirPath}/${parsedRepoUrl.filepath}`;
+ await fetchPlainAction.handler({
+ ...ctx,
+ input: {
+ url: `https://${parsedRepoUrl.resource}/${parsedRepoUrl.owner}/${parsedRepoUrl.name}`,
+ targetPath: dirPath,
+ },
+ });
+
+ for (let p = 0; p < confluenceUrls.length; p++) {
+ const confluenceUrl = confluenceUrls[p];
+
+ const { spacekey, title, titleWithSpaces } =
+ await createConfluenceVariables(confluenceUrl);
+ ctx.logger.info(spacekey);
+ ctx.logger.info(title);
+ ctx.logger.info(titleWithSpaces);
+
+ // This calls confluence to get the page html and page id
+ const getConfluenceDoc = await fetchConfluence(
+ `/rest/api/content?title=${title}&spaceKey=${spacekey}&expand=body.export_view`,
+ config,
+ );
+ if (getConfluenceDoc.results.length === 0) {
+ throw new InputError(
+ `Could not find document ${confluenceUrl}. Please check your input.`,
+ );
+ }
+ // This gets attachements for the confluence page if they exist
+ const getDocAttachments = await fetchConfluence(
+ `/rest/api/content/${getConfluenceDoc.results[0].id}/child/attachment`,
+ config,
+ );
+
+ if (getDocAttachments.results.length) {
+ fs.mkdirSync(`${dirPath}/${filePathToMkdocs}docs/img`, {
+ recursive: true,
+ });
+ productArray = await getAndWriteAttachments(
+ getDocAttachments,
+ dirPath,
+ config,
+ filePathToMkdocs,
+ );
+ }
+
+ ctx.logger.info(
+ `starting action for converting ${titleWithSpaces} from Confluence To Markdown`,
+ );
+
+ // This reads mkdocs.yml file
+ const mkdocsFileContent = await readFileAsString(repoFileDir);
+ const mkdocsFile = parseFromYaml(mkdocsFileContent);
+ ctx.logger.info(
+ `Adding new file - ${titleWithSpaces} to the current mkdocs.yml file`,
+ );
+
+ // This modifies the mkdocs.yml file
+ if (mkdocsFile !== undefined && mkdocsFile.hasOwnProperty('nav')) {
+ const { nav } = mkdocsFile;
+ if (!nav.some((i: Obj) => i.hasOwnProperty(titleWithSpaces))) {
+ nav.push({
+ [titleWithSpaces]: `${titleWithSpaces.replace(/\s+/g, '-')}.md`,
+ });
+ mkdocsFile.nav = nav;
+ } else {
+ throw new ConflictError(
+ 'This document looks to exist inside the GitHub repo. Will end the action.',
+ );
+ }
+ }
+ const newTemplateFileContent = transformToYaml(mkdocsFile);
+ await updateFile(newTemplateFileContent, repoFileDir);
+
+ // This grabs the confluence html and converts it to markdown and adds attachments
+ const html = getConfluenceDoc.results[0].body.export_view.value;
+ const markdownToPublish = NodeHtmlMarkdown.translate(html);
+ let newString: string = markdownToPublish;
+ productArray.map((product: string[]) => {
+ const regex = product[1].includes('pdf')
+ ? new RegExp(`(\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi')
+ : new RegExp(`(\\!\\[.*?\\]\\()(.*?${product[0]}.*?)(\\))`, 'gi');
+ newString = newString.replace(regex, `$1./img/${product[1]}$3`);
+ });
+
+ ctx.logger.info(`Adding new file to repo.`);
+ await fs.outputFile(
+ `${dirPath}/${filePathToMkdocs}docs/${titleWithSpaces.replace(
+ /\s+/g,
+ '-',
+ )}.md`,
+ newString,
+ );
+ }
+
+ ctx.output('repo', parsedRepoUrl.name);
+ ctx.output('owner', parsedRepoUrl.owner);
+ },
+ });
+};
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts
new file mode 100644
index 0000000000..d0125b5a0d
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/helpers.ts
@@ -0,0 +1,142 @@
+/*
+ * 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 { Config } from '@backstage/config';
+import { ResponseError, ConflictError, InputError } from '@backstage/errors';
+import fs from 'fs-extra';
+import YAML from 'yaml';
+import fetch, { Response } from 'node-fetch';
+
+interface Links {
+ webui: string;
+ download: string;
+ thumbnail: string;
+ self: string;
+}
+
+interface Metadata {
+ mediaType: string;
+}
+
+export interface Result {
+ id: string;
+ type: string;
+ status: string;
+ title: string;
+ metadata: Metadata;
+ _links: Links;
+}
+
+export interface Results {
+ results: Result[];
+}
+
+export const readFileAsString = async (fileDir: string) => {
+ const content = await fs.readFile(fileDir, 'utf-8');
+ return content.toString();
+};
+
+export const parseFromYaml = (content: string) => {
+ return YAML.parse(content);
+};
+
+export const transformToYaml = (content: any) => {
+ return YAML.stringify(content);
+};
+
+export const updateFile = async (content: string, file: string) => {
+ await fs.writeFile(file, content);
+};
+
+export const fetchConfluence = async (relativeUrl: string, config: Config) => {
+ const baseUrl = config.getString('confluence.baseUrl');
+ const token = config.getString('confluence.token');
+ const response: Response = await fetch(`${baseUrl}${relativeUrl}`, {
+ method: 'GET',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ });
+ if (!response.ok) {
+ throw await ResponseError.fromResponse(response);
+ }
+
+ return response.json() as Promise;
+};
+
+export const getAndWriteAttachments = async (
+ arr: Results,
+ workspace: string,
+ config: Config,
+ mkdocsDir: string,
+) => {
+ const productArr: string[][] = [];
+ const baseUrl = config.getString('confluence.baseUrl');
+ const token = config.getString('confluence.token');
+ await Promise.all(
+ await arr.results.map(async (result: Result) => {
+ const downloadLink = result._links.download;
+ const downloadTitle = result.title.replace(/ /g, '-');
+ if (result.metadata.mediaType !== 'application/gliffy+json') {
+ productArr.push([result.title.replace(/ /g, '%20'), downloadTitle]);
+ }
+
+ const res = await fetch(`${baseUrl}${downloadLink}`, {
+ method: 'GET',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ });
+ // console.log(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`)
+ if (!res.ok) {
+ throw ResponseError.fromResponse(res);
+ } else if (res.body !== null) {
+ fs.openSync(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`, 'w');
+ const writeStream = fs.createWriteStream(
+ `${workspace}/${mkdocsDir}docs/img/${downloadTitle}`,
+ );
+ res.body.pipe(writeStream);
+ await new Promise((resolve, reject) => {
+ writeStream.on('finish', () => {
+ resolve(`${workspace}/${mkdocsDir}docs/img/${downloadTitle}`);
+ });
+ writeStream.on('error', reject);
+ });
+ } else {
+ throw new ConflictError(
+ 'No Body on the response. Can not save images from Confluence Doc',
+ );
+ }
+ }),
+ );
+ return productArr;
+};
+
+export const createConfluenceVariables = async (url: string) => {
+ let spacekey: string | null = null;
+ let title: string | null = null;
+ let titleWithSpaces: string | null = '';
+ const params = new URL(url);
+ if (url.includes('display')) {
+ spacekey = params.pathname.split('/')[2];
+ title = params.pathname.split('/')[3];
+ titleWithSpaces = title?.replace(/\+/g, ' ');
+ return { spacekey, title, titleWithSpaces };
+ }
+ throw new InputError(
+ 'The Url format for Confluence is incorrect. Acceptable format is `/display//`',
+ );
+};
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts
new file mode 100644
index 0000000000..00f00eabda
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { createConfluenceToMarkdownAction } from './confluenceToMarkdown';
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts
new file mode 100644
index 0000000000..3d3a6c73a0
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export * from './confluence';
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts
new file mode 100644
index 0000000000..e38cee3557
--- /dev/null
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/index.ts
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The confluence-to-markdowwn module for @backstage/plugin-scaffolder-backend.
+ *
+ * @packageDocumentation
+ */
+
+export * from './actions';
diff --git a/yarn.lock b/yarn.lock
index b1b60ba15e..3585d449fc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7651,6 +7651,29 @@ __metadata:
languageName: unknown
linkType: soft
+"@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn":
+ version: 0.0.0-use.local
+ resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn@workspace:plugins/scaffolder-backend-module-confluence-to-markdowwn"
+ dependencies:
+ "@backstage/backend-common": "workspace:^"
+ "@backstage/cli": "workspace:^"
+ "@backstage/config": "workspace:^"
+ "@backstage/errors": "workspace:^"
+ "@backstage/integration": "workspace:^"
+ "@backstage/plugin-scaffolder-backend": "workspace:^"
+ "@backstage/plugin-scaffolder-node": "workspace:^"
+ "@backstage/types": "workspace:^"
+ fs: ^0.0.1-security
+ fs-extra: ^11.1.0
+ git-url-parse: ^13.1.0
+ mock-fs: ^5.2.0
+ node-fetch: 2.6.7
+ node-html-markdown: ^1.3.0
+ os: ^0.1.2
+ yaml: ^2.2.1
+ languageName: unknown
+ linkType: soft
+
"@backstage/plugin-scaffolder-backend-module-cookiecutter@workspace:plugins/scaffolder-backend-module-cookiecutter":
version: 0.0.0-use.local
resolution: "@backstage/plugin-scaffolder-backend-module-cookiecutter@workspace:plugins/scaffolder-backend-module-cookiecutter"
@@ -20175,6 +20198,19 @@ __metadata:
languageName: node
linkType: hard
+"css-select@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "css-select@npm:5.1.0"
+ dependencies:
+ boolbase: ^1.0.0
+ css-what: ^6.1.0
+ domhandler: ^5.0.2
+ domutils: ^3.0.1
+ nth-check: ^2.0.1
+ checksum: 2772c049b188d3b8a8159907192e926e11824aea525b8282981f72ba3f349cf9ecd523fdf7734875ee2cb772246c22117fc062da105b6d59afe8dcd5c99c9bda
+ languageName: node
+ linkType: hard
+
"css-to-react-native@npm:^3.0.0":
version: 3.0.0
resolution: "css-to-react-native@npm:3.0.0"
@@ -20229,6 +20265,13 @@ __metadata:
languageName: node
linkType: hard
+"css-what@npm:^6.1.0":
+ version: 6.1.0
+ resolution: "css-what@npm:6.1.0"
+ checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe
+ languageName: node
+ linkType: hard
+
"css.escape@npm:1.5.1, css.escape@npm:^1.5.1":
version: 1.5.1
resolution: "css.escape@npm:1.5.1"
@@ -23898,6 +23941,17 @@ __metadata:
languageName: node
linkType: hard
+"fs-extra@npm:^11.1.0":
+ version: 11.1.0
+ resolution: "fs-extra@npm:11.1.0"
+ dependencies:
+ graceful-fs: ^4.2.0
+ jsonfile: ^6.0.1
+ universalify: ^2.0.0
+ checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f
+ languageName: node
+ linkType: hard
+
"fs-extra@npm:^7.0.1, fs-extra@npm:~7.0.1":
version: 7.0.1
resolution: "fs-extra@npm:7.0.1"
@@ -23955,6 +24009,13 @@ __metadata:
languageName: node
linkType: hard
+"fs@npm:^0.0.1-security":
+ version: 0.0.1-security
+ resolution: "fs@npm:0.0.1-security"
+ checksum: 53c6230e1faae9fa32c1df82c16a84b51b1243d20f3da2b64bd110bb472b73b9185169b703e008356e3cdc92d155088b617d9d39a63b5227a30b3621baad7f5d
+ languageName: node
+ linkType: hard
+
"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2":
version: 2.3.2
resolution: "fsevents@npm:2.3.2"
@@ -24228,7 +24289,7 @@ __metadata:
languageName: node
linkType: hard
-"git-url-parse@npm:^13.0.0":
+"git-url-parse@npm:^13.0.0, git-url-parse@npm:^13.1.0":
version: 13.1.0
resolution: "git-url-parse@npm:13.1.0"
dependencies:
@@ -24900,7 +24961,7 @@ __metadata:
languageName: node
linkType: hard
-"he@npm:^1.2.0":
+"he@npm:1.2.0, he@npm:^1.2.0":
version: 1.2.0
resolution: "he@npm:1.2.0"
bin:
@@ -30598,6 +30659,25 @@ __metadata:
languageName: node
linkType: hard
+"node-html-markdown@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "node-html-markdown@npm:1.3.0"
+ dependencies:
+ node-html-parser: ^6.1.1
+ checksum: 303affd75bf11e92f004047e283aa05da5c8ae8696c1f28f811e9f61762c55b4480e0e5986a9a4b399791485b835380af8ab0554ebf867d6cf9be362abedcf5d
+ languageName: node
+ linkType: hard
+
+"node-html-parser@npm:^6.1.1":
+ version: 6.1.5
+ resolution: "node-html-parser@npm:6.1.5"
+ dependencies:
+ css-select: ^5.1.0
+ he: 1.2.0
+ checksum: b54257b31954be17d473c86a2fede53d5e238708f3d88577c98881c28ab66013fd37044903f6f3cd662b56d882681fb511bca75a80a80b62f7111b32b39eebae
+ languageName: node
+ linkType: hard
+
"node-int64@npm:^0.4.0":
version: 0.4.0
resolution: "node-int64@npm:0.4.0"
@@ -30898,12 +30978,12 @@ __metadata:
languageName: node
linkType: hard
-"nth-check@npm:^2.0.0":
- version: 2.0.1
- resolution: "nth-check@npm:2.0.1"
+"nth-check@npm:^2.0.0, nth-check@npm:^2.0.1":
+ version: 2.1.1
+ resolution: "nth-check@npm:2.1.1"
dependencies:
boolbase: ^1.0.0
- checksum: 5386d035c48438ff304fe687704d93886397349d1bed136de97aeae464caba10e8ffac55a04b215b86b3bc8897f33e0a5aa1045a9d8b2f251ae61b2a3ad3e450
+ checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3
languageName: node
linkType: hard
@@ -31278,6 +31358,13 @@ __metadata:
languageName: node
linkType: hard
+"os@npm:^0.1.2":
+ version: 0.1.2
+ resolution: "os@npm:0.1.2"
+ checksum: dc2d99759eef13f5dc47ddb12c67b9760a7196fd83a35a7aec2d75b82f91163ca1d4e8872238f8c2a35f4cddd5adf5ce6638a234c0563c748d3cd1d69a9f7153
+ languageName: node
+ linkType: hard
+
"ospath@npm:^1.2.2":
version: 1.2.2
resolution: "ospath@npm:1.2.2"
@@ -39460,10 +39547,10 @@ __metadata:
languageName: node
linkType: hard
-"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3":
- version: 2.1.3
- resolution: "yaml@npm:2.1.3"
- checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7
+"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3, yaml@npm:^2.2.1":
+ version: 2.2.1
+ resolution: "yaml@npm:2.2.1"
+ checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23
languageName: node
linkType: hard
From 1b49a18bf8de23e8b702a929935ec97d0f2c80b5 Mon Sep 17 00:00:00 2001
From: Tracey
Date: Fri, 10 Mar 2023 17:41:49 -0800
Subject: [PATCH 084/511] adding changeset
Signed-off-by: Tracey
---
.changeset/new-pigs-jam.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 .changeset/new-pigs-jam.md
diff --git a/.changeset/new-pigs-jam.md b/.changeset/new-pigs-jam.md
new file mode 100644
index 0000000000..ed9c39297a
--- /dev/null
+++ b/.changeset/new-pigs-jam.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend-module-confluence-to-markdowwn': patch
+---
+
+Created new action for converting confluence docs to Markdown, to be pushed to GitHub repos onboarded onto Techdocs
From a231e7e8fef6118723eb4239a963ea6714c00957 Mon Sep 17 00:00:00 2001
From: Tracey
Date: Fri, 10 Mar 2023 18:02:51 -0800
Subject: [PATCH 085/511] removing logs that broke tests
Signed-off-by: Tracey
---
.../src/actions/confluence/confluenceToMarkdown.ts | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts
index 792d1f088b..1ded6e90f3 100644
--- a/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts
+++ b/plugins/scaffolder-backend-module-confluence-to-markdowwn/src/actions/confluence/confluenceToMarkdown.ts
@@ -81,9 +81,7 @@ export const createConfluenceToMarkdownAction = (options: {
let productArray: string[][] = [];
ctx.logger.info(`Fetching the mkdocs.yml catalog from ${repoUrl}`);
- ctx.logger.info(confluenceUrls);
- const params = new URL(confluenceUrls[0]);
- ctx.logger.info(params.searchParams);
+
// This grabs the files from Github
const repoFileDir = `${dirPath}/${parsedRepoUrl.filepath}`;
await fetchPlainAction.handler({
@@ -99,9 +97,6 @@ export const createConfluenceToMarkdownAction = (options: {
const { spacekey, title, titleWithSpaces } =
await createConfluenceVariables(confluenceUrl);
- ctx.logger.info(spacekey);
- ctx.logger.info(title);
- ctx.logger.info(titleWithSpaces);
// This calls confluence to get the page html and page id
const getConfluenceDoc = await fetchConfluence(
From 9ee82deef366c01008485e7a2b22d8f14f77a160 Mon Sep 17 00:00:00 2001
From: Patrik Oldsberg
Date: Sat, 11 Mar 2023 14:01:50 +0100
Subject: [PATCH 086/511] Apply suggestions from code review
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Fredrik Adelöw
Signed-off-by: Patrik Oldsberg
---
GOVERNANCE.md | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
index b2582ecd31..bff9631b93 100644
--- a/GOVERNANCE.md
+++ b/GOVERNANCE.md
@@ -1,6 +1,6 @@
# Project Areas
-The Backstage project is divided into several project areas, each covering particular parts of the project. The main driver for each area is ownership of code in the main Backstage repository, as well as other repositories in the Backstage GitHub organization. Each area has a set of maintainers and repository content that they own. There may be no overlap in ownership between areas, which is defined as multiple owners for a single line in the GitHub code owners file. Each area is represented by a team in the Backstage GitHub organization. Apart from certain project-wide concerns, such as the release process, each area is self-governing and chooses their own ways of working. Project areas may also have special interest groups (SIGs) related to their area, but this is not required.
+The Backstage project is divided into several project areas, each covering particular parts of the project. The main driver for each area is ownership of code in the main Backstage repository, as well as other repositories in the Backstage GitHub organization. Each area has a set of maintainers and repository content that they own. There may be no overlap in ownership between areas, which means that any given line in the GitHub code owners file should have only one owner specified. Each area is represented by a team in the Backstage GitHub organization. Apart from certain project-wide concerns, such as the release process, each area is self-governing and chooses their own ways of working. Project areas may also have special interest groups (SIGs) related to their area, but this is not required.
The project areas as well as their maintainers are listed in the [OWNERS.md](./OWNERS.md) file.
@@ -41,11 +41,11 @@ A Contributor contributes directly to the project and adds value to it. Contribu
- Report and sometimes resolve issues
- Occasionally submit PRs
- Contribute to the documentation
-- Show up at meetings, takes notes
+- Show up at meetings, take notes
- Answer questions from other community members
- Submit feedback on issues and PRs
- Test releases and patches and submit reviews
-- Run or helps run events
+- Run or help run events
- Promote the project in public
## Organization Member
@@ -71,7 +71,7 @@ An Organization Member must meet the responsibilities and has the requirements o
### Becoming an Organization Member
-Open an issue towards https://github.com/backstage/community using the [org membership request template](#TODO).
+Open an issue towards [the community repository](https://github.com/backstage/community) using the [org membership request template](#TODO).
### Privileges
@@ -79,9 +79,9 @@ Open an issue towards https://github.com/backstage/community using the [org memb
## Plugin Maintainer
-A Plugin Maintainer is responsible for maintaining an individual Backstage plugin or module. This includes reviewing contributions and respond to issues towards an individual plugin, as well as keeping the plugin up to date.
+A Plugin Maintainer is responsible for maintaining an individual Backstage plugin or module. This includes reviewing contributions and responding to issues towards an individual plugin, as well as keeping the plugin up to date.
-Plugin Maintainer is a lightweight form of ownership that is primarily reflected though code owners of the plugin packages in the [CODEOWNERS.md](./.github/CODEOWNERS) file. Each plugin can have one or more maintainers. If a plugin becomes a significant part of the Backstage ecosystem, it may be promoted to be a distinct project area instead.
+Plugin Maintainer is a lightweight form of ownership that is primarily reflected though code owners of the plugin packages in the [CODEOWNERS](./.github/CODEOWNERS) file. Each plugin can have one or more maintainers. If a plugin becomes a significant part of the Backstage ecosystem, it may be promoted to be a distinct project area instead.
A Plugin Maintainer has all the rights and responsibilities of an Organization Member.
@@ -90,7 +90,7 @@ A Plugin Maintainer has all the rights and responsibilities of an Organization M
- Review the majority of PRs towards the plugin
- Respond to GitHub issues related to the plugin
- Keep the plugin up-to-date with Backstage libraries and other dependencies
-- Follow the [reviewing guide](https://github.com/backstage/backstage/blob/master/REVIEWING.md)
+- Follow the [reviewing guide](REVIEWING.md)
### Requirements
@@ -117,7 +117,7 @@ A Project Area Maintainer has all the rights and responsibilities of an Organiza
### Responsibilities
- Review PRs towards their project area. Project area maintainers are expected to review at least 20 PRs per year, or the majority of all PRs towards the area
-- Follow the [reviewing guide](https://github.com/backstage/backstage/blob/master/REVIEWING.md)
+- Follow the [reviewing guide](REVIEWING.md)
- Triage and respond to issues related to their project area
- Mentor new project area maintainers
- Write refactoring PRs
@@ -142,7 +142,7 @@ A Project Area Maintainer has all the rights and responsibilities of an Organiza
If you are interested in becoming a project area maintainer, reach out to the existing maintainers for that area. If you wish to become a maintainer for a new area, reach out to the core maintainers.
-Any current project area maintainer or core maintainer may nominate a new project area maintainer by opening a PR towards the [OWNERS.md](https://github.com/backstage/backstage/blob/master/OWNERS.md) file. A majority of the project area maintainers for that area must approve the PR. If there are no existing maintainers for that area, the PR must be approved by a majority of the core maintainers.
+Any current project area maintainer or core maintainer may nominate a new project area maintainer by opening a PR towards the [OWNERS.md](OWNERS.md) file. A majority of the project area maintainers for that area must approve the PR. If there are no existing maintainers for that area, the PR must be approved by a majority of the core maintainers.
## Core Maintainer
@@ -178,7 +178,7 @@ A Core Maintainer have all the rights and responsibilities of a Project Area Mai
### Becoming a Core Maintainer
-Any core maintainer or end user sponsor may nominate a new core maintainer by opening a PR towards the [OWNERS.md](https://github.com/backstage/backstage/blob/master/OWNERS.md) file. Core maintainers must be approved by a majority of the existing core maintainers and end user sponsors.
+Any core maintainer or end user sponsor may nominate a new core maintainer by opening a PR towards the [OWNERS.md](OWNERS.md) file. Core maintainers must be approved by a majority of the existing core maintainers and end user sponsors.
## End User Sponsors
@@ -207,7 +207,7 @@ In all cases in this document where voting is mentioned, the voting process is a
## Inactivity
-It is important for contributors to be and stay active to set an example and show commitment to the project. Inactivity is harmful to the project as it may lead to unexpected delays, contributor attrition, and a lost of trust in the project.
+It is important for contributors to be and stay active to set an example and show commitment to the project. Inactivity is harmful to the project as it may lead to unexpected delays, contributor attrition, and a loss of trust in the project.
Inactivity is measured by periods of no contributions for longer than:
From 09d9c07199e74a9ff5561d8b03a4f2c2e2badea3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 11 Mar 2023 16:49:49 +0000
Subject: [PATCH 087/511] chore(deps): update dependency @tsconfig/docusaurus
to v1.0.7
Signed-off-by: Renovate Bot
---
microsite/yarn.lock | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index a9db81ead4..81b78f043b 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -2756,9 +2756,9 @@ __metadata:
linkType: hard
"@tsconfig/docusaurus@npm:^1.0.6":
- version: 1.0.6
- resolution: "@tsconfig/docusaurus@npm:1.0.6"
- checksum: fb0d7965c01fe64fc6369a72695b903d654bd5fb145f373d707c2bae3c2d828703517d812cef1c041ae44b108f44e52778b9d9837a54fdf782e68e6619a90a4d
+ version: 1.0.7
+ resolution: "@tsconfig/docusaurus@npm:1.0.7"
+ checksum: 8f5b14005d90b2008f10daf03a5edec86d2a7603e5641c579ea936a5c2d165a8c3007a72254fc4c2adb0554d73062f52bb97b30ff818f01c9215957822f3c4db
languageName: node
linkType: hard
From 80a75f03fc950a32ac90f966604293f3ba2234a3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 03:42:21 +0000
Subject: [PATCH 088/511] chore(deps): update react-router monorepo to v6.9.0
Signed-off-by: Renovate Bot
---
yarn.lock | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/yarn.lock b/yarn.lock
index b1b60ba15e..41da512bc6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13152,6 +13152,13 @@ __metadata:
languageName: node
linkType: hard
+"@remix-run/router@npm:1.4.0":
+ version: 1.4.0
+ resolution: "@remix-run/router@npm:1.4.0"
+ checksum: 707dce35a2b8138005cf19e63f6fd3c4da05b4b892e9e9118e8b727c3b95953efe27307ca2df35084044df30fa1fc367cf0bbc98d1ded9020c82e61e6242caaf
+ languageName: node
+ linkType: hard
+
"@repeaterjs/repeater@npm:3.0.4":
version: 3.0.4
resolution: "@repeaterjs/repeater@npm:3.0.4"
@@ -33789,7 +33796,7 @@ __metadata:
languageName: node
linkType: hard
-"react-router-dom-stable@npm:react-router-dom@^6.3.0, react-router-dom@npm:^6.3.0":
+"react-router-dom-stable@npm:react-router-dom@^6.3.0":
version: 6.8.1
resolution: "react-router-dom@npm:6.8.1"
dependencies:
@@ -33802,6 +33809,19 @@ __metadata:
languageName: node
linkType: hard
+"react-router-dom@npm:^6.3.0":
+ version: 6.9.0
+ resolution: "react-router-dom@npm:6.9.0"
+ dependencies:
+ "@remix-run/router": 1.4.0
+ react-router: 6.9.0
+ peerDependencies:
+ react: ">=16.8"
+ react-dom: ">=16.8"
+ checksum: 4d593491ab8db5611feda70002c62902baebb84d5c1c5e5b6172496f31f91130deee132bf4240dea634a88cb86c76d6da348f15b9cd5e5197be455efd88edf72
+ languageName: node
+ linkType: hard
+
"react-router-stable@npm:react-router@^6.3.0, react-router@npm:6.8.1":
version: 6.8.1
resolution: "react-router@npm:6.8.1"
@@ -33813,6 +33833,17 @@ __metadata:
languageName: node
linkType: hard
+"react-router@npm:6.9.0":
+ version: 6.9.0
+ resolution: "react-router@npm:6.9.0"
+ dependencies:
+ "@remix-run/router": 1.4.0
+ peerDependencies:
+ react: ">=16.8"
+ checksum: b2a5f42e042bee7a7f116ca7817b0e58359e5353d84887c9fe7a633d7490c03b1e0ae37cd01830c2a381e3d1e7d501bb4751e53cc3d491e25f36582d3f6e0546
+ languageName: node
+ linkType: hard
+
"react-side-effect@npm:^2.1.0":
version: 2.1.0
resolution: "react-side-effect@npm:2.1.0"
From 86d9e2a7389590b8d56179562ea7f12ef9566917 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 04:27:53 +0000
Subject: [PATCH 089/511] chore(deps): update dependency @types/archiver to
v5.3.2
Signed-off-by: Renovate Bot
---
yarn.lock | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 41da512bc6..ee6c14da1c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -14262,11 +14262,11 @@ __metadata:
linkType: hard
"@types/archiver@npm:^5.1.0, @types/archiver@npm:^5.3.1":
- version: 5.3.1
- resolution: "@types/archiver@npm:5.3.1"
+ version: 5.3.2
+ resolution: "@types/archiver@npm:5.3.2"
dependencies:
- "@types/glob": "*"
- checksum: 1c6babc7f50acf5bf7fa3d5fa76bb68702e4463e6a412d259cdddff611dbbb9832ea4b2f41d675fd95ac1aa8b087daa882423073e41db9e296f14d41f2ea88e6
+ "@types/readdir-glob": "*"
+ checksum: 9db5b4fdc1740fa07d08340ed827598cc6eda97406ac18a06a158670c7124d4120650a3b9cd660e9e39b42f033cf8f052566da32681e8ad91163473df88a3c4c
languageName: node
linkType: hard
@@ -15688,6 +15688,15 @@ __metadata:
languageName: node
linkType: hard
+"@types/readdir-glob@npm:*":
+ version: 1.1.0
+ resolution: "@types/readdir-glob@npm:1.1.0"
+ dependencies:
+ "@types/node": "*"
+ checksum: 98cabfac6beddd3aeb3624e05d57b8dd1354431e436e9e795aaf74ddf2f1c23342d7b8df7586cc3d1374ceeee0d7975638fae97cb1739572d8a4067ebebb91d9
+ languageName: node
+ linkType: hard
+
"@types/recharts@npm:^1.8.14, @types/recharts@npm:^1.8.15":
version: 1.8.23
resolution: "@types/recharts@npm:1.8.23"
From 4a44c97bfa133c4c8920b805ceb22badbc98e30f Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 05:17:32 +0000
Subject: [PATCH 090/511] chore(deps): update dependency aws-sdk-client-mock to
v2.1.1
Signed-off-by: Renovate Bot
---
yarn.lock | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index ee6c14da1c..78ceb0fba1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -17574,13 +17574,13 @@ __metadata:
linkType: hard
"aws-sdk-client-mock@npm:^2.0.0":
- version: 2.1.0
- resolution: "aws-sdk-client-mock@npm:2.1.0"
+ version: 2.1.1
+ resolution: "aws-sdk-client-mock@npm:2.1.1"
dependencies:
"@types/sinon": ^10.0.10
sinon: ^14.0.2
tslib: ^2.1.0
- checksum: c6179c5528709ff1ad7e7308d03c74850fb5b973ca3d63836ca9973ca70de0c3dd7846fcbd3fd02bf4dabe6cae1095683b38c4202878458c8369e7e837962cd2
+ checksum: 8330b88cdaeae401390ece094344ed727db0b007369d862a88afc0a29249828b95cce809faa0c2289c1af99528af0e765b4aba8156b948d01a12299390195cea
languageName: node
linkType: hard
From c8ded0d4192d6d9f60f7ab32b3f4a0b5ebb76b8f Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 06:09:17 +0000
Subject: [PATCH 091/511] chore(deps): update dependency
aws-sdk-client-mock-jest to v2.1.1
Signed-off-by: Renovate Bot
---
yarn.lock | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 78ceb0fba1..d7597a4bfc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -17562,14 +17562,14 @@ __metadata:
linkType: hard
"aws-sdk-client-mock-jest@npm:^2.0.0":
- version: 2.1.0
- resolution: "aws-sdk-client-mock-jest@npm:2.1.0"
+ version: 2.1.1
+ resolution: "aws-sdk-client-mock-jest@npm:2.1.1"
dependencies:
"@types/jest": ^28.1.3
tslib: ^2.1.0
peerDependencies:
- aws-sdk-client-mock: 2.1.0
- checksum: 567e2084d71c90f71e5bfa82f2a4b592fec5ea818cb4edf3586f922454cee4fec1403d4161d3d91a3db3ccebe1db5babe069754d76204c7f6986ab71bafb1084
+ aws-sdk-client-mock: 2.1.1
+ checksum: 4b5ca96bbcaa60ea3ea947821c7ff1f073c1342a12ce5c778b70832bdcc6106e10591e98e09b22c5b0d83dfc6fe554e8a08d5df5cf067a7eaadb804087b891ed
languageName: node
linkType: hard
From e262738b8a0cd43ce4cfea116adc05aef8c9061c Mon Sep 17 00:00:00 2001
From: Adi Krhan
Date: Mon, 13 Mar 2023 09:23:59 +0100
Subject: [PATCH 092/511] Handle token difference in Microsoft provider
Signed-off-by: Adi Krhan
---
.changeset/many-carpets-act.md | 5 +++++
plugins/auth-backend/src/providers/microsoft/provider.ts | 9 ++++++++-
2 files changed, 13 insertions(+), 1 deletion(-)
create mode 100644 .changeset/many-carpets-act.md
diff --git a/.changeset/many-carpets-act.md b/.changeset/many-carpets-act.md
new file mode 100644
index 0000000000..5285eeebbd
--- /dev/null
+++ b/.changeset/many-carpets-act.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Handle difference in expiration time between Microsoft session and Backstage session which caused the Backstage token to be invalid during a time frame.
diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts
index fd2a1529a7..9b14a3c91b 100644
--- a/plugins/auth-backend/src/providers/microsoft/provider.ts
+++ b/plugins/auth-backend/src/providers/microsoft/provider.ts
@@ -50,6 +50,8 @@ import {
import { Logger } from 'winston';
import fetch from 'node-fetch';
+const BACKSTAGE_SESSION_EXPIRATION = 3600;
+
type PrivateInfo = {
refreshToken: string;
};
@@ -145,12 +147,17 @@ export class MicrosoftAuthProvider implements OAuthHandlers {
const { profile } = await this.authHandler(result, this.resolverContext);
+ const expiresInSeconds =
+ result.params.expires_in === undefined
+ ? BACKSTAGE_SESSION_EXPIRATION
+ : Math.min(result.params.expires_in, BACKSTAGE_SESSION_EXPIRATION);
+
const response: OAuthResponse = {
providerInfo: {
idToken: result.params.id_token,
accessToken: result.accessToken,
scope: result.params.scope,
- expiresInSeconds: result.params.expires_in,
+ expiresInSeconds,
},
profile,
};
From 46fe170c05366378f5b25ea016c18aab28a9e65c Mon Sep 17 00:00:00 2001
From: drodil
Date: Mon, 13 Mar 2023 13:16:53 +0200
Subject: [PATCH 093/511] Update .changeset/strong-crews-repeat.md
Co-authored-by: Patrik Oldsberg
Signed-off-by: drodil
---
.changeset/strong-crews-repeat.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.changeset/strong-crews-repeat.md b/.changeset/strong-crews-repeat.md
index 144c1842c6..1e772ae036 100644
--- a/.changeset/strong-crews-repeat.md
+++ b/.changeset/strong-crews-repeat.md
@@ -1,5 +1,5 @@
---
-'@backstage/plugin-shortcuts': minor
+'@backstage/plugin-shortcuts': patch
---
Allow external links to be added as shortcuts
From c630360631f67ac7e05eef99f61391364d6635c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?=
Date: Mon, 13 Mar 2023 13:36:06 +0100
Subject: [PATCH 094/511] catalog-client: getEntitiesByRefs should return
undefined
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Fredrik Adelöw
---
.changeset/tidy-ties-guess.md | 5 +++++
packages/catalog-client/src/CatalogClient.test.ts | 2 +-
packages/catalog-client/src/CatalogClient.ts | 6 ++++--
3 files changed, 10 insertions(+), 3 deletions(-)
create mode 100644 .changeset/tidy-ties-guess.md
diff --git a/.changeset/tidy-ties-guess.md b/.changeset/tidy-ties-guess.md
new file mode 100644
index 0000000000..63247c3819
--- /dev/null
+++ b/.changeset/tidy-ties-guess.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-client': patch
+---
+
+Ensure that `getEntitiesByRefs` returns `undefined` instead of `null` for missing items
diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts
index c235ff1592..53bb55b95f 100644
--- a/packages/catalog-client/src/CatalogClient.test.ts
+++ b/packages/catalog-client/src/CatalogClient.test.ts
@@ -249,7 +249,7 @@ describe('CatalogClient', () => {
{ token },
);
- expect(response).toEqual({ items: [entity, null] });
+ expect(response).toEqual({ items: [entity, undefined] });
});
});
diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts
index 4984d394d4..be4ae6289d 100644
--- a/packages/catalog-client/src/CatalogClient.ts
+++ b/packages/catalog-client/src/CatalogClient.ts
@@ -199,9 +199,11 @@ export class CatalogClient implements CatalogApi {
throw await ResponseError.fromResponse(response);
}
- const { items } = await response.json();
+ const { items } = (await response.json()) as {
+ items: Array;
+ };
- return { items };
+ return { items: items.map(i => i ?? undefined) };
}
/**
From 7af12854970a51f6f88fc9788b8557f4def54d39 Mon Sep 17 00:00:00 2001
From: Heikki Hellgren
Date: Thu, 2 Mar 2023 14:22:31 +0200
Subject: [PATCH 095/511] feat: add scaffolder action to get multiple entities
uses the catalog client getEntitiesByRefs to return the entities for the
template
Signed-off-by: Heikki Hellgren
---
.changeset/sharp-hairs-arrive.md | 5 +
plugins/scaffolder-backend/api-report.md | 3 +-
.../actions/builtin/catalog/fetch.test.ts | 132 +++++++++++++++---
.../actions/builtin/catalog/fetch.ts | 85 ++++++++---
4 files changed, 188 insertions(+), 37 deletions(-)
create mode 100644 .changeset/sharp-hairs-arrive.md
diff --git a/.changeset/sharp-hairs-arrive.md b/.changeset/sharp-hairs-arrive.md
new file mode 100644
index 0000000000..a7f922566a
--- /dev/null
+++ b/.changeset/sharp-hairs-arrive.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Extended scaffolder action `catalog:fetch` to fetch multiple catalog entities by entity references.
diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md
index 293ff7ed29..3a409a39e2 100644
--- a/plugins/scaffolder-backend/api-report.md
+++ b/plugins/scaffolder-backend/api-report.md
@@ -85,7 +85,8 @@ export function createDebugLogAction(): TemplateAction_2<{
export function createFetchCatalogEntityAction(options: {
catalogClient: CatalogApi;
}): TemplateAction_2<{
- entityRef: string;
+ entityRef?: string | undefined;
+ entityRefs?: string[] | undefined;
optional?: boolean | undefined;
}>;
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts
index 52c76c8769..1cce7d66cb 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts
@@ -23,8 +23,11 @@ import { createFetchCatalogEntityAction } from './fetch';
describe('catalog:fetch', () => {
const getEntityByRef = jest.fn();
+ const getEntitiesByRefs = jest.fn();
+
const catalogClient = {
getEntityByRef: getEntityByRef,
+ getEntitiesByRefs: getEntitiesByRefs,
};
const action = createFetchCatalogEntityAction({
@@ -71,25 +74,6 @@ describe('catalog:fetch', () => {
});
});
- it('should return null if entity not in catalog and optional is true', async () => {
- getEntityByRef.mockImplementationOnce(() => {
- throw new Error('Not found');
- });
-
- await action.handler({
- ...mockContext,
- input: {
- entityRef: 'component:default/test',
- optional: true,
- },
- });
-
- expect(getEntityByRef).toHaveBeenCalledWith('component:default/test', {
- token: 'secret',
- });
- expect(mockContext.output).toHaveBeenCalledWith('entity', null);
- });
-
it('should throw error if entity fetch fails from catalog and optional is false', async () => {
getEntityByRef.mockImplementationOnce(() => {
throw new Error('Not found');
@@ -127,4 +111,114 @@ describe('catalog:fetch', () => {
});
expect(mockContext.output).not.toHaveBeenCalled();
});
+
+ it('should return entities from catalog', async () => {
+ getEntitiesByRefs.mockReturnValueOnce({
+ items: [
+ {
+ metadata: {
+ namespace: 'default',
+ name: 'test',
+ },
+ kind: 'Component',
+ } as Entity,
+ ],
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: {
+ entityRefs: ['component:default/test'],
+ },
+ });
+
+ expect(getEntitiesByRefs).toHaveBeenCalledWith(
+ { entityRefs: ['component:default/test'] },
+ {
+ token: 'secret',
+ },
+ );
+ expect(mockContext.output).toHaveBeenCalledWith('entities', [
+ {
+ metadata: {
+ namespace: 'default',
+ name: 'test',
+ },
+ kind: 'Component',
+ },
+ ]);
+ });
+
+ it('should throw error if undefined is returned for some entity', async () => {
+ getEntitiesByRefs.mockReturnValueOnce({
+ items: [
+ {
+ metadata: {
+ namespace: 'default',
+ name: 'test',
+ },
+ kind: 'Component',
+ } as Entity,
+ undefined,
+ ],
+ });
+
+ await expect(
+ action.handler({
+ ...mockContext,
+ input: {
+ entityRefs: ['component:default/test', 'component:default/test2'],
+ optional: false,
+ },
+ }),
+ ).rejects.toThrow('Entity component:default/test2 not found');
+
+ expect(getEntitiesByRefs).toHaveBeenCalledWith(
+ { entityRefs: ['component:default/test', 'component:default/test2'] },
+ {
+ token: 'secret',
+ },
+ );
+ expect(mockContext.output).not.toHaveBeenCalled();
+ });
+
+ it('should return null in case some of the entities not found and optional is true', async () => {
+ getEntitiesByRefs.mockReturnValueOnce({
+ items: [
+ {
+ metadata: {
+ namespace: 'default',
+ name: 'test',
+ },
+ kind: 'Component',
+ } as Entity,
+ undefined,
+ ],
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: {
+ entityRefs: ['component:default/test', 'component:default/test2'],
+ optional: true,
+ },
+ });
+
+ expect(getEntitiesByRefs).toHaveBeenCalledWith(
+ { entityRefs: ['component:default/test', 'component:default/test2'] },
+ {
+ token: 'secret',
+ },
+ );
+ expect(mockContext.output).toHaveBeenCalledWith('entities', [
+ {
+ metadata: {
+ namespace: 'default',
+ name: 'test',
+ },
+ kind: 'Component',
+ },
+ null,
+ ]);
+ });
});
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts
index 17e510ce64..1bcbfa0006 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts
@@ -36,10 +36,26 @@ const examples = [
],
}),
},
+ {
+ description: 'Fetch multiple entities by referencse',
+ example: yaml.stringify({
+ steps: [
+ {
+ action: id,
+ id: 'fetchMultiple',
+ name: 'Fetch catalog entities',
+ input: {
+ entityRefs: ['component:default/name'],
+ },
+ },
+ ],
+ }),
+ },
];
/**
- * Returns entity from the catalog by entity reference.
+ * Returns entity or entities from the catalog by entity reference(s).
+ *
* @public
*/
export function createFetchCatalogEntityAction(options: {
@@ -47,13 +63,17 @@ export function createFetchCatalogEntityAction(options: {
}) {
const { catalogClient } = options;
- return createTemplateAction<{ entityRef: string; optional?: boolean }>({
+ return createTemplateAction<{
+ entityRef?: string;
+ entityRefs?: string[];
+ optional?: boolean;
+ }>({
id,
- description: 'Returns entity from the catalog by entity reference',
+ description:
+ 'Returns entity or entities from the catalog by entity reference(s)',
examples,
schema: {
input: {
- required: ['entityRef'],
type: 'object',
properties: {
entityRef: {
@@ -61,10 +81,15 @@ export function createFetchCatalogEntityAction(options: {
title: 'Entity reference',
description: 'Entity reference of the entity to get',
},
+ entityRefs: {
+ type: 'array',
+ title: 'Entity references',
+ description: 'Entity references of the entities to get',
+ },
optional: {
title: 'Optional',
description:
- 'Permit the entity to optionally exist. Default: false',
+ 'Allow the entity or entities to optionally exist. Default: false',
type: 'boolean',
},
},
@@ -76,29 +101,55 @@ export function createFetchCatalogEntityAction(options: {
title: 'Entity found by the entity reference',
type: 'object',
description:
- 'Object containing same values used in the Entity schema.',
+ 'Object containing same values used in the Entity schema. Only when used with `entityRef` parameter.',
+ },
+ entities: {
+ title: 'Entities found by the entity references',
+ type: 'array',
+ items: { type: 'object' },
+ description:
+ 'Array containing objects with same values used in the Entity schema. Only when used with `entityRefs` parameter.',
},
},
},
},
async handler(ctx) {
- const { entityRef, optional } = ctx.input;
- let entity;
- try {
- entity = await catalogClient.getEntityByRef(entityRef, {
+ const { entityRef, entityRefs, optional } = ctx.input;
+ if (!entityRef && !entityRefs) {
+ if (optional) {
+ return;
+ }
+ throw new Error('Missing entity reference or references');
+ }
+
+ if (entityRef) {
+ const entity = await catalogClient.getEntityByRef(entityRef, {
token: ctx.secrets?.backstageToken,
});
- } catch (e) {
- if (!optional) {
- throw e;
+
+ if (!entity && !optional) {
+ throw new Error(`Entity ${entityRef} not found`);
}
+ ctx.output('entity', entity ?? null);
}
- if (!entity && !optional) {
- throw new Error(`Entity ${entityRef} not found`);
- }
+ if (entityRefs) {
+ const entities = await catalogClient.getEntitiesByRefs(
+ { entityRefs },
+ {
+ token: ctx.secrets?.backstageToken,
+ },
+ );
- ctx.output('entity', entity ?? null);
+ const finalEntities = entities.items.map((e, i) => {
+ if (!e && !optional) {
+ throw new Error(`Entity ${entityRefs[i]} not found`);
+ }
+ return e ?? null;
+ });
+
+ ctx.output('entities', finalEntities);
+ }
},
});
}
From e6ac8e69b5b779444817d32f6782aa93740193b1 Mon Sep 17 00:00:00 2001
From: Alec Jacobs
Date: Mon, 13 Mar 2023 09:27:50 -0700
Subject: [PATCH 096/511] fix(shortcuts): client handles state updates from
storageApi
Signed-off-by: Alec Jacobs
---
.../src/api/LocalStoredShortcuts.test.ts | 3 +-
.../shortcuts/src/api/LocalStoredShortcuts.ts | 54 +++++++++++++------
2 files changed, 41 insertions(+), 16 deletions(-)
diff --git a/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts b/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts
index dbea91863c..86890fc75b 100644
--- a/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts
+++ b/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts
@@ -36,8 +36,9 @@ describe('LocalStoredShortcuts', () => {
resolve();
},
});
- shortcutApi.add(shortcut);
});
+ observerNextHandler.mockClear(); // handler is called with current state to start
+ await shortcutApi.add(shortcut);
expect(observerNextHandler).toHaveBeenCalledTimes(1);
expect(observerNextHandler).toHaveBeenCalledWith(
diff --git a/plugins/shortcuts/src/api/LocalStoredShortcuts.ts b/plugins/shortcuts/src/api/LocalStoredShortcuts.ts
index 65aeb86e3f..44f7364f69 100644
--- a/plugins/shortcuts/src/api/LocalStoredShortcuts.ts
+++ b/plugins/shortcuts/src/api/LocalStoredShortcuts.ts
@@ -16,10 +16,10 @@
import { pageTheme } from '@backstage/theme';
import { v4 as uuid } from 'uuid';
-import { ShortcutApi } from './ShortcutApi';
-import { Shortcut } from '../types';
-import { StorageApi } from '@backstage/core-plugin-api';
-import Observable from 'zen-observable';
+import { ShortcutApi, type Shortcut } from '@backstage/plugin-shortcuts';
+import type { StorageApi } from '@backstage/core-plugin-api';
+import type { Observable } from '@backstage/types';
+import ObservableImpl from 'zen-observable';
/**
* Implementation of the ShortcutApi that uses the StorageApi to store shortcuts.
@@ -27,27 +27,41 @@ import Observable from 'zen-observable';
* @public
*/
export class LocalStoredShortcuts implements ShortcutApi {
- private readonly shortcuts: Observable;
+ private shortcuts: Shortcut[];
+ private readonly subscribers = new Set<
+ ZenObservable.SubscriptionObserver
+ >();
+
+ private readonly observable = new ObservableImpl(subscriber => {
+ // forward the the latest value
+ subscriber.next(this.shortcuts);
+
+ this.subscribers.add(subscriber);
+ return () => {
+ this.subscribers.delete(subscriber);
+ };
+ });
constructor(private readonly storageApi: StorageApi) {
- this.shortcuts = Observable.from(
- this.storageApi.observe$('items'),
- ).map(snapshot => snapshot.value ?? []);
+ this.shortcuts = this.storageApi.snapshot('items').value ?? [];
+ this.storageApi.observe$('items').subscribe({
+ next: next => {
+ this.shortcuts = next.value ?? [];
+ this.notifyChanges();
+ },
+ });
}
- shortcut$() {
- return this.shortcuts;
+ shortcut$(): Observable {
+ return this.observable;
}
get() {
- return Array.from(
- this.storageApi.snapshot('items').value ?? [],
- ).sort((a, b) => (a.title >= b.title ? 1 : -1));
+ return this.shortcuts;
}
async add(shortcut: Omit) {
- const shortcuts = this.get();
- shortcuts.push({ ...shortcut, id: uuid() });
+ const shortcuts = this.sort([...this.get(), { ...shortcut, id: uuid() }]);
await this.storageApi.set('items', shortcuts);
}
@@ -78,4 +92,14 @@ export class LocalStoredShortcuts implements ShortcutApi {
catalog: 'home',
docs: 'documentation',
};
+
+ private sort(shortcuts: Shortcut[]): Shortcut[] {
+ return shortcuts.slice().sort((a, b) => (a.title >= b.title ? 1 : -1));
+ }
+
+ private notifyChanges() {
+ for (const subscription of this.subscribers) {
+ subscription.next(this.shortcuts);
+ }
+ }
}
From 7c38e565d1fba9bb68d93a856d69bafa0c3b1cd7 Mon Sep 17 00:00:00 2001
From: Alec Jacobs
Date: Mon, 13 Mar 2023 09:34:20 -0700
Subject: [PATCH 097/511] docs(changeset): add patch changeset
Signed-off-by: Alec Jacobs
---
.changeset/pink-apples-design.md | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 .changeset/pink-apples-design.md
diff --git a/.changeset/pink-apples-design.md b/.changeset/pink-apples-design.md
new file mode 100644
index 0000000000..411786370a
--- /dev/null
+++ b/.changeset/pink-apples-design.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-shortcuts': patch
+---
+
+Fixed bug in LocalStoredShortcuts client where adding new Shortcut results in replacing entire shortcut list.
+
+Refactored LocalStoredShortcuts client to listen to `storageApi` updates to ensure that local state is always up to date.
From f538b9c5b83a67bf22b587e43d44071e9bfcb35f Mon Sep 17 00:00:00 2001
From: Miguel Alexandre
Date: Mon, 13 Mar 2023 17:59:54 +0100
Subject: [PATCH 098/511] Include the failureMetadata and successMetadata in
TechInsightsApi
Signed-off-by: Miguel Alexandre
---
.changeset/lazy-monkeys-worry.md | 5 ++++
plugins/tech-insights/src/api/types.ts | 37 ++++++++++++++++++++++++++
2 files changed, 42 insertions(+)
create mode 100644 .changeset/lazy-monkeys-worry.md
diff --git a/.changeset/lazy-monkeys-worry.md b/.changeset/lazy-monkeys-worry.md
new file mode 100644
index 0000000000..2c7e2ba4a2
--- /dev/null
+++ b/.changeset/lazy-monkeys-worry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-insights': minor
+---
+
+The Check class now includes the failureMetadata and successMetadata as returned by the runChecks call.
diff --git a/plugins/tech-insights/src/api/types.ts b/plugins/tech-insights/src/api/types.ts
index ac1f2e44ee..aa073dcbc4 100644
--- a/plugins/tech-insights/src/api/types.ts
+++ b/plugins/tech-insights/src/api/types.ts
@@ -22,11 +22,48 @@ import { JsonValue } from '@backstage/types';
* @public
*/
export type Check = {
+ /**
+ * Unique identifier of the check
+ *
+ * Used to identify which checks to use when running checks.
+ */
id: string;
+
+ /**
+ * Type identifier for the check.
+ * Can be used to determine storage options, logical routing to correct FactChecker implementation
+ * or to help frontend render correct component types based on this
+ */
type: string;
+
+ /**
+ * Human readable name of the check, may be displayed in the UI
+ */
name: string;
+
+ /**
+ * Human readable description of the check, may be displayed in the UI
+ */
description: string;
+
+ /**
+ * A collection of string referencing fact rows that a check will be run against.
+ *
+ * References the fact container, aka fact retriever itself which may or may not contain multiple individual facts and values
+ */
factIds: string[];
+
+ /**
+ * Metadata to be returned in case a check has been successfully evaluated
+ * Can contain links, description texts or other actionable items
+ */
+ successMetadata?: Record;
+
+ /**
+ * Metadata to be returned in case a check evaluation has ended in failure
+ * Can contain links, description texts or other actionable items
+ */
+ failureMetadata?: Record;
};
/**
From c5a57d15e29a53a796fbfc27ca018d673b62427e Mon Sep 17 00:00:00 2001
From: Alec Jacobs
Date: Mon, 13 Mar 2023 10:28:38 -0700
Subject: [PATCH 099/511] docs(shortcuts): regen api-report.md
Signed-off-by: Alec Jacobs
---
plugins/shortcuts/api-report.md | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/plugins/shortcuts/api-report.md b/plugins/shortcuts/api-report.md
index 1aa1dea003..19c0035a55 100644
--- a/plugins/shortcuts/api-report.md
+++ b/plugins/shortcuts/api-report.md
@@ -9,24 +9,25 @@ import { ApiRef } from '@backstage/core-plugin-api';
import { BackstagePlugin } from '@backstage/core-plugin-api';
import { IconComponent } from '@backstage/core-plugin-api';
import { Observable } from '@backstage/types';
-import { default as Observable_2 } from 'zen-observable';
-import { StorageApi } from '@backstage/core-plugin-api';
+import { Shortcut as Shortcut_2 } from '@backstage/plugin-shortcuts';
+import { ShortcutApi as ShortcutApi_2 } from '@backstage/plugin-shortcuts';
+import type { StorageApi } from '@backstage/core-plugin-api';
// @public
-export class LocalStoredShortcuts implements ShortcutApi {
+export class LocalStoredShortcuts implements ShortcutApi_2 {
constructor(storageApi: StorageApi);
// (undocumented)
- add(shortcut: Omit): Promise;
+ add(shortcut: Omit): Promise;
// (undocumented)
- get(): Shortcut[];
+ get(): Shortcut_2[];
// (undocumented)
getColor(url: string): string;
// (undocumented)
remove(id: string): Promise;
// (undocumented)
- shortcut$(): Observable_2;
+ shortcut$(): Observable;
// (undocumented)
- update(shortcut: Shortcut): Promise;
+ update(shortcut: Shortcut_2): Promise;
}
// @public (undocumented)
From 2d20ea246518fca3c5de9a517faa82ec422f5c05 Mon Sep 17 00:00:00 2001
From: Alec Jacobs
Date: Mon, 13 Mar 2023 10:47:06 -0700
Subject: [PATCH 100/511] build(shortcuts): move @types/zen-observable to
devDependencies
Signed-off-by: Alec Jacobs
---
plugins/shortcuts/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json
index eb48088934..22c0456342 100644
--- a/plugins/shortcuts/package.json
+++ b/plugins/shortcuts/package.json
@@ -30,7 +30,6 @@
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
- "@types/zen-observable": "^0.8.2",
"react-hook-form": "^7.12.2",
"react-use": "^17.2.4",
"uuid": "^8.3.2",
@@ -49,6 +48,7 @@
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"@types/node": "^16.11.26",
+ "@types/zen-observable": "^0.8.2",
"cross-fetch": "^3.1.5",
"msw": "^1.0.0"
},
From c1ee073a82b5c7294a3f243ad86834c8c4518cb1 Mon Sep 17 00:00:00 2001
From: Andrew Thauer
Date: Mon, 13 Mar 2023 16:06:08 -0400
Subject: [PATCH 101/511] feat: add lastModifiedAt to UrlReader methods
Signed-off-by: Andrew Thauer
---
.changeset/sharp-rings-cry.md | 6 ++
packages/backend-common/api-report.md | 2 +
.../src/reading/AwsS3UrlReader.test.ts | 42 +++++++++-
.../src/reading/AwsS3UrlReader.ts | 30 ++++----
.../src/reading/AzureUrlReader.ts | 1 +
.../reading/BitbucketCloudUrlReader.test.ts | 77 +++++++++++++++++++
.../src/reading/BitbucketCloudUrlReader.ts | 10 ++-
.../src/reading/BitbucketServerUrlReader.ts | 10 ++-
.../src/reading/BitbucketUrlReader.test.ts | 77 +++++++++++++++++++
.../src/reading/BitbucketUrlReader.ts | 10 ++-
.../src/reading/FetchUrlReader.test.ts | 25 +++++-
.../src/reading/FetchUrlReader.ts | 7 ++
.../src/reading/GiteaUrlReader.test.ts | 48 +++++++++++-
.../src/reading/GiteaUrlReader.ts | 4 +
.../src/reading/GithubUrlReader.test.ts | 8 +-
.../src/reading/GithubUrlReader.ts | 8 ++
.../src/reading/GitlabUrlReader.test.ts | 38 ++++++++-
.../src/reading/GitlabUrlReader.ts | 10 ++-
.../src/reading/ReadUrlResponseFactory.ts | 1 +
.../src/reading/tree/ReadableArrayResponse.ts | 1 +
.../reading/tree/TarArchiveResponse.test.ts | 5 ++
.../reading/tree/ZipArchiveResponse.test.ts | 5 ++
.../src/reading/tree/ZipArchiveResponse.ts | 3 +
packages/backend-common/src/reading/types.ts | 7 ++
packages/backend-common/src/reading/util.ts | 23 ++++++
packages/backend-plugin-api/api-report.md | 4 +
.../services/definitions/UrlReaderService.ts | 42 ++++++++++
27 files changed, 477 insertions(+), 27 deletions(-)
create mode 100644 .changeset/sharp-rings-cry.md
create mode 100644 packages/backend-common/src/reading/util.ts
diff --git a/.changeset/sharp-rings-cry.md b/.changeset/sharp-rings-cry.md
new file mode 100644
index 0000000000..9e32a53526
--- /dev/null
+++ b/.changeset/sharp-rings-cry.md
@@ -0,0 +1,6 @@
+---
+'@backstage/backend-common': minor
+'@backstage/backend-plugin-api': minor
+---
+
+Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`.
diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md
index ebdd7315c9..f1d8a74dbe 100644
--- a/packages/backend-common/api-report.md
+++ b/packages/backend-common/api-report.md
@@ -301,6 +301,7 @@ export class FetchUrlReader implements UrlReader {
export type FromReadableArrayOptions = Array<{
data: Readable;
path: string;
+ lastModifiedAt?: Date;
}>;
// @public
@@ -635,6 +636,7 @@ export class ReadUrlResponseFactory {
// @public
export type ReadUrlResponseFactoryFromStreamOptions = {
etag?: string;
+ lastModifiedAt?: Date;
};
// @public
diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
index 0bd4d2636f..b37a052c1d 100644
--- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
+++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts
@@ -297,23 +297,26 @@ describe('AwsS3UrlReader', () => {
),
),
ETag: '123abc',
+ LastModified: new Date('2020-01-01T00:00:00Z'),
});
});
it('returns contents of an object in a bucket via buffer', async () => {
- const { buffer, etag } = await reader.readUrl(
+ const { buffer, etag, lastModifiedAt } = await reader.readUrl(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
expect(etag).toBe('123abc');
+ expect(lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z'));
const response = await buffer();
expect(response.toString().trim()).toBe('site_name: Test');
});
it('returns contents of an object in a bucket via stream', async () => {
- const { buffer, etag } = await reader.readUrl(
+ const { buffer, etag, lastModifiedAt } = await reader.readUrl(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
expect(etag).toBe('123abc');
+ expect(lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z'));
const response = await buffer();
expect(response.toString().trim()).toBe('site_name: Test');
});
@@ -403,6 +406,41 @@ describe('AwsS3UrlReader', () => {
});
});
+ describe('readUrl with lastModifiedAfter', () => {
+ const [{ reader }] = createReader({
+ integrations: {
+ awsS3: [
+ {
+ host: 'amazonaws.com',
+ accessKeyId: 'fake-access-key',
+ secretAccessKey: 'fake-secret-key',
+ },
+ ],
+ },
+ });
+
+ beforeEach(() => {
+ s3Client.reset();
+ const t = new S3ServiceException({
+ name: '304',
+ $fault: 'client',
+ $metadata: { httpStatusCode: 304 },
+ });
+ s3Client.on(GetObjectCommand).rejects(t);
+ });
+
+ it('returns contents of an object in a bucket', async () => {
+ await expect(
+ reader.readUrl!(
+ 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
+ {
+ lastModifiedAfter: new Date('2020-01-01T00:00:00Z'),
+ },
+ ),
+ ).rejects.toThrow(NotModifiedError);
+ });
+ });
+
describe('readTree', () => {
let awsS3UrlReader: AwsS3UrlReader;
diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts
index d06e2d0ad6..4d4c28071f 100644
--- a/packages/backend-common/src/reading/AwsS3UrlReader.ts
+++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts
@@ -41,6 +41,7 @@ import {
ListObjectsV2Command,
ListObjectsV2CommandOutput,
GetObjectCommand,
+ GetObjectCommandInput,
} from '@aws-sdk/client-s3';
import { AbortController } from '@aws-sdk/abort-controller';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
@@ -253,6 +254,8 @@ export class AwsS3UrlReader implements UrlReader {
url: string,
options?: ReadUrlOptions,
): Promise {
+ const { etag, lastModifiedAfter } = options ?? {};
+
try {
const { path, bucket, region } = parseUrl(url, this.integration.config);
const s3Client = await this.buildS3Client(
@@ -262,19 +265,15 @@ export class AwsS3UrlReader implements UrlReader {
);
const abortController = new AbortController();
- let params;
- if (options?.etag) {
- params = {
- Bucket: bucket,
- Key: path,
- IfNoneMatch: options.etag,
- };
- } else {
- params = {
- Bucket: bucket,
- Key: path,
- };
- }
+ const params: GetObjectCommandInput = {
+ Bucket: bucket,
+ Key: path,
+ ...(etag && { IfNoneMatch: etag }),
+ ...(lastModifiedAfter && {
+ IfModifiedSince: lastModifiedAfter,
+ }),
+ };
+
options?.signal?.addEventListener('abort', () => abortController.abort());
const getObjectCommand = new GetObjectCommand(params);
const response = await s3Client.send(getObjectCommand, {
@@ -284,10 +283,10 @@ export class AwsS3UrlReader implements UrlReader {
const s3ObjectData = await this.retrieveS3ObjectData(
response.Body as Readable,
);
- const etag = response.ETag;
return ReadUrlResponseFactory.fromReadable(s3ObjectData, {
- etag: etag,
+ etag: response.ETag,
+ lastModifiedAt: response.LastModified,
});
} catch (e) {
if (e.$metadata && e.$metadata.httpStatusCode === 304) {
@@ -347,6 +346,7 @@ export class AwsS3UrlReader implements UrlReader {
responses.push({
data: s3ObjectData,
path: String(allObjects[i]),
+ lastModifiedAt: response?.LastModified ?? undefined,
});
}
diff --git a/packages/backend-common/src/reading/AzureUrlReader.ts b/packages/backend-common/src/reading/AzureUrlReader.ts
index 08e3917b38..90cf8f29bd 100644
--- a/packages/backend-common/src/reading/AzureUrlReader.ts
+++ b/packages/backend-common/src/reading/AzureUrlReader.ts
@@ -192,6 +192,7 @@ export class AzureUrlReader implements UrlReader {
base: url,
}),
content: file.content,
+ lastModifiedAt: file.lastModifiedAt,
})),
};
}
diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts
index ca6e15a005..c00aeba124 100644
--- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts
+++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts
@@ -156,6 +156,83 @@ describe('BitbucketCloudUrlReader', () => {
expect(buffer.toString()).toBe('foo');
expect(result.etag).toBe('new-etag-value');
});
+
+ it('should be able to readUrl via buffer without If-Modified-Since', async () => {
+ worker.use(
+ rest.get(
+ 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml',
+ (req, res, ctx) => {
+ expect(req.headers.get('If-None-Match')).toBeNull();
+ return res(
+ ctx.status(200),
+ ctx.body('foo'),
+ ctx.set('ETag', 'etag-value'),
+ ctx.set(
+ 'Last-Modified',
+ new Date('2020-01-01T00:00:00Z').toUTCString(),
+ ),
+ );
+ },
+ ),
+ );
+
+ const result = await reader.readUrl(
+ 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml',
+ );
+ const buffer = await result.buffer();
+ expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z'));
+ expect(buffer.toString()).toBe('foo');
+ });
+
+ it('should be throw not modified when If-Modified-Since returns a 304', async () => {
+ worker.use(
+ rest.get(
+ 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml',
+ (req, res, ctx) => {
+ expect(req.headers.get('If-Modified-Since')).toBe(
+ new Date('1999 12 31 23:59:59 GMT').toUTCString(),
+ );
+ return res(ctx.status(304));
+ },
+ ),
+ );
+
+ await expect(
+ reader.readUrl(
+ 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml',
+ { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') },
+ ),
+ ).rejects.toThrow(NotModifiedError);
+ });
+
+ it('should be able to readUrl when If-Modified-Since is before Last-Modified', async () => {
+ worker.use(
+ rest.get(
+ 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml',
+ (req, res, ctx) => {
+ expect(req.headers.get('If-Modified-Since')).toBe(
+ new Date('1999 12 31 23:59:59 GMT').toUTCString(),
+ );
+ return res(
+ ctx.status(200),
+ ctx.set(
+ 'Last-Modified',
+ new Date('2020-01-01T00:00:00Z').toUTCString(),
+ ),
+ ctx.body('foo'),
+ );
+ },
+ ),
+ );
+
+ const result = await reader.readUrl(
+ 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml',
+ { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') },
+ );
+ const buffer = await result.buffer();
+ expect(buffer.toString()).toBe('foo');
+ expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z'));
+ });
});
describe('read', () => {
diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts
index b83e012423..1522b7678d 100644
--- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts
+++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts
@@ -40,6 +40,7 @@ import {
UrlReader,
} from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Cloud.
@@ -80,7 +81,7 @@ export class BitbucketCloudUrlReader implements UrlReader {
url: string,
options?: ReadUrlOptions,
): Promise {
- const { etag, signal } = options ?? {};
+ const { etag, lastModifiedAfter, signal } = options ?? {};
const bitbucketUrl = getBitbucketCloudFileFetchUrl(
url,
this.integration.config,
@@ -95,6 +96,9 @@ export class BitbucketCloudUrlReader implements UrlReader {
headers: {
...requestOptions.headers,
...(etag && { 'If-None-Match': etag }),
+ ...(lastModifiedAfter && {
+ 'If-Modified-Since': lastModifiedAfter.toUTCString(),
+ }),
},
// TODO(freben): The signal cast is there because pre-3.x versions of
// node-fetch have a very slightly deviating AbortSignal type signature.
@@ -115,6 +119,9 @@ export class BitbucketCloudUrlReader implements UrlReader {
if (response.ok) {
return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
etag: response.headers.get('ETag') ?? undefined,
+ lastModifiedAt: parseLastModified(
+ response.headers.get('Last-Modified'),
+ ),
});
}
@@ -184,6 +191,7 @@ export class BitbucketCloudUrlReader implements UrlReader {
base: url,
}),
content: file.content,
+ lastModifiedAt: file.lastModifiedAt,
})),
};
}
diff --git a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts
index a97c3b39bb..2b6b5a1f8f 100644
--- a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts
+++ b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts
@@ -39,6 +39,7 @@ import {
UrlReader,
} from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Server APIs.
@@ -71,7 +72,7 @@ export class BitbucketServerUrlReader implements UrlReader {
url: string,
options?: ReadUrlOptions,
): Promise {
- const { etag, signal } = options ?? {};
+ const { etag, lastModifiedAfter, signal } = options ?? {};
const bitbucketUrl = getBitbucketServerFileFetchUrl(
url,
this.integration.config,
@@ -86,6 +87,9 @@ export class BitbucketServerUrlReader implements UrlReader {
headers: {
...requestOptions.headers,
...(etag && { 'If-None-Match': etag }),
+ ...(lastModifiedAfter && {
+ 'If-Modified-Since': lastModifiedAfter.toUTCString(),
+ }),
},
// TODO(freben): The signal cast is there because pre-3.x versions of
// node-fetch have a very slightly deviating AbortSignal type signature.
@@ -106,6 +110,9 @@ export class BitbucketServerUrlReader implements UrlReader {
if (response.ok) {
return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
etag: response.headers.get('ETag') ?? undefined,
+ lastModifiedAt: parseLastModified(
+ response.headers.get('Last-Modified'),
+ ),
});
}
@@ -175,6 +182,7 @@ export class BitbucketServerUrlReader implements UrlReader {
base: url,
}),
content: file.content,
+ lastModifiedAt: file.lastModifiedAt,
})),
};
}
diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts
index 922480f8e7..15e007d516 100644
--- a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts
+++ b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts
@@ -204,6 +204,83 @@ describe('BitbucketUrlReader', () => {
expect(buffer.toString()).toBe('foo');
expect(result.etag).toBe('new-etag-value');
});
+
+ it('should be able to readUrl via buffer without If-Modified-Since', async () => {
+ worker.use(
+ rest.get(
+ 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml',
+ (req, res, ctx) => {
+ expect(req.headers.get('If-None-Match')).toBeNull();
+ return res(
+ ctx.status(200),
+ ctx.body('foo'),
+ ctx.set('ETag', 'etag-value'),
+ ctx.set(
+ 'Last-Modified',
+ new Date('2020-01-01T00:00:00Z').toUTCString(),
+ ),
+ );
+ },
+ ),
+ );
+
+ const result = await bitbucketProcessor.readUrl(
+ 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml',
+ );
+ const buffer = await result.buffer();
+ expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z'));
+ expect(buffer.toString()).toBe('foo');
+ });
+
+ it('should be throw not modified when If-Modified-Since returns a 304', async () => {
+ worker.use(
+ rest.get(
+ 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml',
+ (req, res, ctx) => {
+ expect(req.headers.get('If-Modified-Since')).toBe(
+ new Date('1999 12 31 23:59:59 GMT').toUTCString(),
+ );
+ return res(ctx.status(304));
+ },
+ ),
+ );
+
+ await expect(
+ bitbucketProcessor.readUrl(
+ 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml',
+ { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') },
+ ),
+ ).rejects.toThrow(NotModifiedError);
+ });
+
+ it('should be able to readUrl when If-Modified-Since is before Last-Modified', async () => {
+ worker.use(
+ rest.get(
+ 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml',
+ (req, res, ctx) => {
+ expect(req.headers.get('If-Modified-Since')).toBe(
+ new Date('1999 12 31 23:59:59 GMT').toUTCString(),
+ );
+ return res(
+ ctx.status(200),
+ ctx.set(
+ 'Last-Modified',
+ new Date('2020-01-01T00:00:00Z').toUTCString(),
+ ),
+ ctx.body('foo'),
+ );
+ },
+ ),
+ );
+
+ const result = await bitbucketProcessor.readUrl(
+ 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml',
+ { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') },
+ );
+ const buffer = await result.buffer();
+ expect(buffer.toString()).toBe('foo');
+ expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z'));
+ });
});
describe('read', () => {
diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.ts b/packages/backend-common/src/reading/BitbucketUrlReader.ts
index 01539594dd..3a34c725c6 100644
--- a/packages/backend-common/src/reading/BitbucketUrlReader.ts
+++ b/packages/backend-common/src/reading/BitbucketUrlReader.ts
@@ -41,6 +41,7 @@ import {
UrlReader,
} from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket v1 and v2 APIs, such
@@ -96,7 +97,7 @@ export class BitbucketUrlReader implements UrlReader {
url: string,
options?: ReadUrlOptions,
): Promise {
- const { etag, signal } = options ?? {};
+ const { etag, lastModifiedAfter, signal } = options ?? {};
const bitbucketUrl = getBitbucketFileFetchUrl(url, this.integration.config);
const requestOptions = getBitbucketRequestOptions(this.integration.config);
@@ -106,6 +107,9 @@ export class BitbucketUrlReader implements UrlReader {
headers: {
...requestOptions.headers,
...(etag && { 'If-None-Match': etag }),
+ ...(lastModifiedAfter && {
+ 'If-Modified-Since': lastModifiedAfter.toUTCString(),
+ }),
},
// TODO(freben): The signal cast is there because pre-3.x versions of
// node-fetch have a very slightly deviating AbortSignal type signature.
@@ -126,6 +130,9 @@ export class BitbucketUrlReader implements UrlReader {
if (response.ok) {
return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
etag: response.headers.get('ETag') ?? undefined,
+ lastModifiedAt: parseLastModified(
+ response.headers.get('Last-Modified'),
+ ),
});
}
@@ -195,6 +202,7 @@ export class BitbucketUrlReader implements UrlReader {
base: url,
}),
content: file.content,
+ lastModifiedAt: file.lastModifiedAt,
})),
};
}
diff --git a/packages/backend-common/src/reading/FetchUrlReader.test.ts b/packages/backend-common/src/reading/FetchUrlReader.test.ts
index e45117a106..ad834c64ef 100644
--- a/packages/backend-common/src/reading/FetchUrlReader.test.ts
+++ b/packages/backend-common/src/reading/FetchUrlReader.test.ts
@@ -45,6 +45,21 @@ describe('FetchUrlReader', () => {
);
}
+ if (
+ req.headers.get('if-modified-since') &&
+ new Date(req.headers.get('if-modified-since') ?? '') <
+ new Date('2021-01-01T00:00:00Z')
+ ) {
+ return res(
+ ctx.status(304),
+ ctx.set('Content-Type', 'text/plain'),
+ ctx.set(
+ 'last-modified',
+ new Date('2021-01-01T00:00:00Z').toUTCString(),
+ ),
+ );
+ }
+
return res(
ctx.status(200),
ctx.set('Content-Type', 'text/plain'),
@@ -192,7 +207,7 @@ describe('FetchUrlReader', () => {
});
describe('readUrl', () => {
- it('should throw NotModified if server responds with 304', async () => {
+ it('should throw NotModified if server responds with 304 from etag', async () => {
await expect(
fetchUrlReader.readUrl('https://backstage.io/some-resource', {
etag: 'foo',
@@ -200,6 +215,14 @@ describe('FetchUrlReader', () => {
).rejects.toThrow(NotModifiedError);
});
+ it('should throw NotModified if server responds with 304 from lastModifiedAfter', async () => {
+ await expect(
+ fetchUrlReader.readUrl('https://backstage.io/some-resource', {
+ lastModifiedAfter: new Date('2020-01-01T00:00:00Z'),
+ }),
+ ).rejects.toThrow(NotModifiedError);
+ });
+
it('should return etag from the response', async () => {
const response = await fetchUrlReader.readUrl(
'https://backstage.io/some-resource',
diff --git a/packages/backend-common/src/reading/FetchUrlReader.ts b/packages/backend-common/src/reading/FetchUrlReader.ts
index 20b78d63c3..90c1cf6c26 100644
--- a/packages/backend-common/src/reading/FetchUrlReader.ts
+++ b/packages/backend-common/src/reading/FetchUrlReader.ts
@@ -26,6 +26,7 @@ import {
} from './types';
import path from 'path';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+import { parseLastModified } from './util';
const isInRange = (num: number, [start, end]: [number, number]) => {
return num >= start && num <= end;
@@ -127,6 +128,9 @@ export class FetchUrlReader implements UrlReader {
response = await fetch(url, {
headers: {
...(options?.etag && { 'If-None-Match': options.etag }),
+ ...(options?.lastModifiedAfter && {
+ 'If-Modified-Since': options.lastModifiedAfter.toUTCString(),
+ }),
},
// TODO(freben): The signal cast is there because pre-3.x versions of
// node-fetch have a very slightly deviating AbortSignal type signature.
@@ -147,6 +151,9 @@ export class FetchUrlReader implements UrlReader {
if (response.ok) {
return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
etag: response.headers.get('ETag') ?? undefined,
+ lastModifiedAt: parseLastModified(
+ response.headers.get('Last-Modified'),
+ ),
});
}
diff --git a/packages/backend-common/src/reading/GiteaUrlReader.test.ts b/packages/backend-common/src/reading/GiteaUrlReader.test.ts
index 6c8722d2e5..1860d9f461 100644
--- a/packages/backend-common/src/reading/GiteaUrlReader.test.ts
+++ b/packages/backend-common/src/reading/GiteaUrlReader.test.ts
@@ -25,7 +25,7 @@ import { UrlReaderPredicateTuple } from './types';
import { DefaultReadTreeResponseFactory } from './tree';
import getRawBody from 'raw-body';
import { GiteaUrlReader } from './GiteaUrlReader';
-import { NotFoundError } from '@backstage/errors';
+import { NotFoundError, NotModifiedError } from '@backstage/errors';
const treeResponseFactory = DefaultReadTreeResponseFactory.create({
config: new ConfigReader({}),
@@ -200,5 +200,51 @@ describe('GiteaUrlReader', () => {
'https://gitea.com/owner/project/src/branch/branch2/LICENSE could not be read as https://gitea.com/api/v1/repos/owner/project/contents/LICENSE?ref=branch2, 500 Error!!!',
);
});
+
+ it('should throw NotModified if server responds with 304 from etag', async () => {
+ worker.use(
+ rest.get(
+ 'https://gitea.com/api/v1/repos/owner/project/contents/LICENSE',
+ (_, res, ctx) => {
+ return res(ctx.set('ETag', 'foo'), ctx.status(304, 'Error!!!'));
+ },
+ ),
+ );
+
+ await expect(
+ giteaProcessor.readUrl(
+ 'https://gitea.com/owner/project/src/branch/branch2/LICENSE',
+ {
+ etag: 'foo',
+ },
+ ),
+ ).rejects.toThrow(NotModifiedError);
+ });
+
+ it('should throw NotModified if server responds with 304 from lastModifiedAfter', async () => {
+ worker.use(
+ rest.get(
+ 'https://gitea.com/api/v1/repos/owner/project/contents/LICENSE',
+ (_, res, ctx) => {
+ return res(
+ ctx.set(
+ 'Last-Modified',
+ new Date('2020-01-01T00:00:00Z').toUTCString(),
+ ),
+ ctx.status(304, 'Error!!!'),
+ );
+ },
+ ),
+ );
+
+ await expect(
+ giteaProcessor.readUrl(
+ 'https://gitea.com/owner/project/src/branch/branch2/LICENSE',
+ {
+ lastModifiedAfter: new Date('2020-01-01T00:00:00Z'),
+ },
+ ),
+ ).rejects.toThrow(NotModifiedError);
+ });
});
});
diff --git a/packages/backend-common/src/reading/GiteaUrlReader.ts b/packages/backend-common/src/reading/GiteaUrlReader.ts
index 1471bab608..34542e878e 100644
--- a/packages/backend-common/src/reading/GiteaUrlReader.ts
+++ b/packages/backend-common/src/reading/GiteaUrlReader.ts
@@ -34,6 +34,7 @@ import {
NotModifiedError,
} from '@backstage/errors';
import { Readable } from 'stream';
+import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for the Gitea v1 api.
@@ -86,6 +87,9 @@ export class GiteaUrlReader implements UrlReader {
Readable.from(Buffer.from(content, 'base64')),
{
etag: response.headers.get('ETag') ?? undefined,
+ lastModifiedAt: parseLastModified(
+ response.headers.get('Last-Modified'),
+ ),
},
);
}
diff --git a/packages/backend-common/src/reading/GithubUrlReader.test.ts b/packages/backend-common/src/reading/GithubUrlReader.test.ts
index 2315d1f9e8..1ee25920f2 100644
--- a/packages/backend-common/src/reading/GithubUrlReader.test.ts
+++ b/packages/backend-common/src/reading/GithubUrlReader.test.ts
@@ -247,7 +247,7 @@ describe('GithubUrlReader', () => {
).rejects.toThrow(/rate limit exceeded/);
});
- it('should return etag from the response', async () => {
+ it('should return etag and last-modified from the response', async () => {
(mockCredentialsProvider.getCredentials as jest.Mock).mockResolvedValue({
headers: {
Authorization: 'bearer blah',
@@ -261,6 +261,11 @@ describe('GithubUrlReader', () => {
return res(
ctx.status(200),
ctx.set('Etag', 'foo'),
+ ctx.set(
+ 'Last-Modified',
+ new Date('2021-01-01T00:00:00Z').toUTCString(),
+ ),
+
ctx.body('bar'),
);
},
@@ -271,6 +276,7 @@ describe('GithubUrlReader', () => {
'https://github.com/backstage/mock/tree/blob/main',
);
expect(response.etag).toBe('foo');
+ expect(response.lastModifiedAt).toEqual(new Date('2021-01-01T00:00:00Z'));
});
});
diff --git a/packages/backend-common/src/reading/GithubUrlReader.ts b/packages/backend-common/src/reading/GithubUrlReader.ts
index d91c35621d..ee781daf0b 100644
--- a/packages/backend-common/src/reading/GithubUrlReader.ts
+++ b/packages/backend-common/src/reading/GithubUrlReader.ts
@@ -40,6 +40,7 @@ import {
ReadUrlResponse,
} from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+import { parseLastModified } from './util';
export type GhRepoResponse =
RestEndpointMethodTypes['repos']['get']['response']['data'];
@@ -109,6 +110,9 @@ export class GithubUrlReader implements UrlReader {
headers: {
...credentials?.headers,
...(options?.etag && { 'If-None-Match': options.etag }),
+ ...(options?.lastModifiedAfter && {
+ 'If-Modified-Since': options.lastModifiedAfter.toUTCString(),
+ }),
Accept: 'application/vnd.github.v3.raw',
},
// TODO(freben): The signal cast is there because pre-3.x versions of
@@ -130,6 +134,9 @@ export class GithubUrlReader implements UrlReader {
if (response.ok) {
return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
etag: response.headers.get('ETag') ?? undefined,
+ lastModifiedAt: parseLastModified(
+ response.headers.get('Last-Modified'),
+ ),
});
}
@@ -290,6 +297,7 @@ export class GithubUrlReader implements UrlReader {
return files.map(file => ({
url: pathToUrl(file.path),
content: file.content,
+ lastModifiedAt: file.lastModifiedAt,
}));
}
diff --git a/packages/backend-common/src/reading/GitlabUrlReader.test.ts b/packages/backend-common/src/reading/GitlabUrlReader.test.ts
index 3751ee868e..d926b2be9b 100644
--- a/packages/backend-common/src/reading/GitlabUrlReader.test.ts
+++ b/packages/backend-common/src/reading/GitlabUrlReader.test.ts
@@ -184,7 +184,7 @@ describe('GitlabUrlReader', () => {
treeResponseFactory,
});
- it('should throw NotModified on HTTP 304', async () => {
+ it('should throw NotModified on HTTP 304 from etag', async () => {
worker.use(
rest.get('*/api/v4/projects/:name', (_, res, ctx) =>
res(ctx.status(200), ctx.json({ id: 12345 })),
@@ -205,13 +205,44 @@ describe('GitlabUrlReader', () => {
).rejects.toThrow(NotModifiedError);
});
- it('should return etag in response', async () => {
+ it('should throw NotModified on HTTP 304 from lastModifiedAt', async () => {
+ worker.use(
+ rest.get('*/api/v4/projects/:name', (_, res, ctx) =>
+ res(ctx.status(200), ctx.json({ id: 12345 })),
+ ),
+ rest.get('*', (req, res, ctx) => {
+ expect(req.headers.get('If-Modified-Since')).toBe(
+ new Date('2019 12 31 23:59:59 GMT').toUTCString(),
+ );
+ return res(ctx.status(304));
+ }),
+ );
+
+ await expect(
+ reader.readUrl!(
+ 'https://gitlab.com/groupA/teams/teamA/subgroupA/repoA/-/blob/branch/my/path/to/file.yaml',
+ {
+ lastModifiedAfter: new Date('2019 12 31 23:59:59 GMT'),
+ },
+ ),
+ ).rejects.toThrow(NotModifiedError);
+ });
+
+ it('should return etag and last-modified in response', async () => {
worker.use(
rest.get('*/api/v4/projects/:name', (_, res, ctx) =>
res(ctx.status(200), ctx.json({ id: 12345 })),
),
rest.get('*', (_req, res, ctx) => {
- return res(ctx.status(200), ctx.set('ETag', '999'), ctx.body('foo'));
+ return res(
+ ctx.status(200),
+ ctx.set('ETag', '999'),
+ ctx.set(
+ 'Last-Modified',
+ new Date('2020 01 01 00:0:00 GMT').toUTCString(),
+ ),
+ ctx.body('foo'),
+ );
}),
);
@@ -219,6 +250,7 @@ describe('GitlabUrlReader', () => {
'https://gitlab.com/groupA/teams/teamA/subgroupA/repoA/-/blob/branch/my/path/to/file.yaml',
);
expect(result.etag).toBe('999');
+ expect(result.lastModifiedAt).toEqual(new Date('2020 01 01 00:0:00 GMT'));
const content = await result.buffer();
expect(content.toString()).toBe('foo');
});
diff --git a/packages/backend-common/src/reading/GitlabUrlReader.ts b/packages/backend-common/src/reading/GitlabUrlReader.ts
index bebc7453d0..df8441c1f7 100644
--- a/packages/backend-common/src/reading/GitlabUrlReader.ts
+++ b/packages/backend-common/src/reading/GitlabUrlReader.ts
@@ -40,6 +40,7 @@ import {
} from './types';
import { trimEnd, trimStart } from 'lodash';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files on GitLab.
@@ -72,7 +73,7 @@ export class GitlabUrlReader implements UrlReader {
url: string,
options?: ReadUrlOptions,
): Promise {
- const { etag, signal } = options ?? {};
+ const { etag, lastModifiedAfter, signal } = options ?? {};
const builtUrl = await this.getGitlabFetchUrl(url);
let response: Response;
@@ -81,6 +82,9 @@ export class GitlabUrlReader implements UrlReader {
headers: {
...getGitLabRequestOptions(this.integration.config).headers,
...(etag && { 'If-None-Match': etag }),
+ ...(lastModifiedAfter && {
+ 'If-Modified-Since': lastModifiedAfter.toUTCString(),
+ }),
},
// TODO(freben): The signal cast is there because pre-3.x versions of
// node-fetch have a very slightly deviating AbortSignal type signature.
@@ -101,6 +105,9 @@ export class GitlabUrlReader implements UrlReader {
if (response.ok) {
return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
etag: response.headers.get('ETag') ?? undefined,
+ lastModifiedAt: parseLastModified(
+ response.headers.get('Last-Modified'),
+ ),
});
}
@@ -247,6 +254,7 @@ export class GitlabUrlReader implements UrlReader {
files: files.map(file => ({
url: this.integration.resolveUrl({ url: `/${file.path}`, base: url }),
content: file.content,
+ lastModifiedAt: file.lastModifiedAt,
})),
};
}
diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts
index 91d1939c24..69b9c6c16a 100644
--- a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts
+++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts
@@ -61,6 +61,7 @@ export class ReadUrlResponseFactory {
return stream;
},
etag: options?.etag,
+ lastModifiedAt: options?.lastModifiedAt,
};
}
diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts
index eabaa3bc56..1429931142 100644
--- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts
+++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts
@@ -63,6 +63,7 @@ export class ReadableArrayResponse implements ReadTreeResponse {
files.push({
path: this.stream[i].path,
content: () => getRawBody(this.stream[i].data),
+ lastModifiedAt: this.stream[i]?.lastModifiedAt,
});
}
}
diff --git a/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts b/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts
index f0cbc6a612..1765a41156 100644
--- a/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts
+++ b/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts
@@ -45,10 +45,12 @@ describe('TarArchiveResponse', () => {
{
path: 'mkdocs.yml',
content: expect.any(Function),
+ lastModifiedAt: undefined,
},
{
path: 'docs/index.md',
content: expect.any(Function),
+ lastModifiedAt: undefined,
},
]);
const contents = await Promise.all(files.map(f => f.content()));
@@ -70,6 +72,7 @@ describe('TarArchiveResponse', () => {
{
path: 'mkdocs.yml',
content: expect.any(Function),
+ lastModifiedAt: undefined,
},
]);
const content = await files[0].content();
@@ -93,10 +96,12 @@ describe('TarArchiveResponse', () => {
{
path: 'mkdocs.yml',
content: expect.any(Function),
+ lastModifiedAt: undefined,
},
{
path: 'docs/index.md',
content: expect.any(Function),
+ lastModifiedAt: undefined,
},
]);
const contents = await Promise.all(files.map(f => f.content()));
diff --git a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts
index e45a25db66..0b010565dd 100644
--- a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts
+++ b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts
@@ -59,10 +59,12 @@ describe('ZipArchiveResponse', () => {
{
path: 'mkdocs.yml',
content: expect.any(Function),
+ lastModifiedAt: expect.any(Date),
},
{
path: 'docs/index.md',
content: expect.any(Function),
+ lastModifiedAt: expect.any(Date),
},
]);
@@ -85,6 +87,7 @@ describe('ZipArchiveResponse', () => {
{
path: 'mkdocs.yml',
content: expect.any(Function),
+ lastModifiedAt: expect.any(Date),
},
]);
const content = await files[0].content();
@@ -108,10 +111,12 @@ describe('ZipArchiveResponse', () => {
{
path: 'mkdocs.yml',
content: expect.any(Function),
+ lastModifiedAt: expect.any(Date),
},
{
path: 'docs/index.md',
content: expect.any(Function),
+ lastModifiedAt: expect.any(Date),
},
]);
const contents = await Promise.all(files.map(f => f.content()));
diff --git a/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts b/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts
index 5a1c5f9688..1e55150310 100644
--- a/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts
+++ b/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts
@@ -146,6 +146,9 @@ export class ZipArchiveResponse implements ReadTreeResponse {
files.push({
path: this.getInnerPath(entry.fileName),
content: async () => await streamToBuffer(content),
+ lastModifiedAt: entry.lastModFileTime
+ ? new Date(entry.lastModFileTime)
+ : undefined,
});
});
diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts
index 35380029e2..7f4d407fd0 100644
--- a/packages/backend-common/src/reading/types.ts
+++ b/packages/backend-common/src/reading/types.ts
@@ -65,6 +65,7 @@ export type ReaderFactory = (options: {
*/
export type ReadUrlResponseFactoryFromStreamOptions = {
etag?: string;
+ lastModifiedAt?: Date;
};
/**
@@ -95,10 +96,16 @@ export type FromReadableArrayOptions = Array<{
* The raw data itself.
*/
data: Readable;
+
/**
* The filepath of the data.
*/
path: string;
+
+ /**
+ * Last modified date of the file contents.
+ */
+ lastModifiedAt?: Date;
}>;
/**
diff --git a/packages/backend-common/src/reading/util.ts b/packages/backend-common/src/reading/util.ts
new file mode 100644
index 0000000000..3d65c2c527
--- /dev/null
+++ b/packages/backend-common/src/reading/util.ts
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export function parseLastModified(value: string | null | undefined) {
+ if (!value) {
+ return undefined;
+ }
+
+ return new Date(value);
+}
diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md
index 5e64502b78..7dc6ae97b3 100644
--- a/packages/backend-plugin-api/api-report.md
+++ b/packages/backend-plugin-api/api-report.md
@@ -359,11 +359,13 @@ export type ReadTreeResponseDirOptions = {
export type ReadTreeResponseFile = {
path: string;
content(): Promise;
+ lastModifiedAt?: Date;
};
// @public
export type ReadUrlOptions = {
etag?: string;
+ lastModifiedAfter?: Date;
signal?: AbortSignal;
};
@@ -372,6 +374,7 @@ export type ReadUrlResponse = {
buffer(): Promise;
stream?(): Readable;
etag?: string;
+ lastModifiedAt?: Date;
};
// @public (undocumented)
@@ -420,6 +423,7 @@ export type SearchResponse = {
export type SearchResponseFile = {
url: string;
content(): Promise;
+ lastModifiedAt?: Date;
};
// @public (undocumented)
diff --git a/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts b/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts
index ef825a7fcd..c189b4a339 100644
--- a/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts
+++ b/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts
@@ -64,6 +64,26 @@ export type ReadUrlOptions = {
*/
etag?: string;
+ /**
+ * A date which can be provided to check whether a
+ * {@link UrlReaderService.readUrl} response has changed since the lastModifiedAt.
+ *
+ * @remarks
+ *
+ * In the {@link UrlReaderService.readUrl} response, an lastModifiedAt is returned
+ * along with data. The lastModifiedAt date represents the last time the data
+ * was modified.
+ *
+ * When an lastModifiedAfter is given in ReadUrlOptions, {@link UrlReaderService.readUrl}
+ * will compare the lastModifiedAfter against the lastModifiedAt of the target. If
+ * the data has not been modified since this date, the {@link UrlReaderService.readUrl}
+ * will throw a {@link @backstage/errors#NotModifiedError} indicating that the
+ * response does not contain any new data. If they do not match,
+ * {@link UrlReaderService.readUrl} will return the rest of the response along with new
+ * lastModifiedAt date.
+ */
+ lastModifiedAfter?: Date;
+
/**
* An abort signal to pass down to the underlying request.
*
@@ -102,6 +122,11 @@ export type ReadUrlResponse = {
* Can be used to compare and cache responses when doing subsequent calls.
*/
etag?: string;
+
+ /**
+ * Last modified date of the file contents.
+ */
+ lastModifiedAt?: Date;
};
/**
@@ -213,8 +238,20 @@ export type ReadTreeResponse = {
* @public
*/
export type ReadTreeResponseFile = {
+ /**
+ * The filepath of the data.
+ */
path: string;
+
+ /**
+ * The binary contents of the file.
+ */
content(): Promise;
+
+ /**
+ * The last modified timestamp of the data.
+ */
+ lastModifiedAt?: Date;
};
/**
@@ -278,4 +315,9 @@ export type SearchResponseFile = {
* The binary contents of the file.
*/
content(): Promise;
+
+ /**
+ * The last modified timestamp of the data.
+ */
+ lastModifiedAt?: Date;
};
From 13226881189232e2b3e77ecd0bc06f03645a7cfe Mon Sep 17 00:00:00 2001
From: Marcus Eide
Date: Thu, 9 Feb 2023 09:09:33 +0100
Subject: [PATCH 102/511] cli: Add admin skeleton command
Signed-off-by: Marcus Eide
---
packages/cli/src/commands/admin/command.ts | 31 ++++++++++++++++++++++
packages/cli/src/commands/admin/index.ts | 17 ++++++++++++
packages/cli/src/commands/index.ts | 8 ++++++
3 files changed, 56 insertions(+)
create mode 100644 packages/cli/src/commands/admin/command.ts
create mode 100644 packages/cli/src/commands/admin/index.ts
diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts
new file mode 100644
index 0000000000..3539ddc40c
--- /dev/null
+++ b/packages/cli/src/commands/admin/command.ts
@@ -0,0 +1,31 @@
+/*
+ * 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 chalk from 'chalk';
+import inquirer from 'inquirer';
+import { Task } from '../../lib/tasks';
+
+export async function command(): Promise {
+ const answers = await inquirer.prompt<{ github: boolean }>([
+ {
+ type: 'confirm',
+ name: 'github',
+ message: chalk.blue('Do you want to set up GitHub Authentication?'),
+ },
+ ]);
+
+ Task.log(answers.github ? 'Ok!' : 'Maybe next time');
+}
diff --git a/packages/cli/src/commands/admin/index.ts b/packages/cli/src/commands/admin/index.ts
new file mode 100644
index 0000000000..4c23ea6e48
--- /dev/null
+++ b/packages/cli/src/commands/admin/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { command } from './command';
diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts
index ddec5c6a4a..2baf1aac9b 100644
--- a/packages/cli/src/commands/index.ts
+++ b/packages/cli/src/commands/index.ts
@@ -25,6 +25,13 @@ const configOption = [
Array(),
] as const;
+export function registerAdminCommand(program: Command) {
+ program
+ .command('admin')
+ .description('Get help setting up your Backstage App.')
+ .action(lazy(() => import('./admin').then(m => m.command)));
+}
+
export function registerRepoCommand(program: Command) {
const command = program
.command('repo [command]')
@@ -360,6 +367,7 @@ export function registerCommands(program: Command) {
registerRepoCommand(program);
registerScriptCommand(program);
registerMigrateCommand(program);
+ registerAdminCommand(program);
program
.command('versions:bump')
From 7af6c36adfea09e08dbb9a95c307e5c2c272e7e8 Mon Sep 17 00:00:00 2001
From: Marcus Eide
Date: Thu, 9 Feb 2023 14:33:17 +0100
Subject: [PATCH 103/511] cli: Expand admin command to setup basic
authenticaton for gihub
Signed-off-by: Marcus Eide
---
packages/cli/src/commands/admin/command.ts | 54 ++++++++++-
packages/cli/src/commands/admin/file.ts | 48 ++++++++++
packages/cli/src/commands/admin/github.ts | 104 +++++++++++++++++++++
3 files changed, 202 insertions(+), 4 deletions(-)
create mode 100644 packages/cli/src/commands/admin/file.ts
create mode 100644 packages/cli/src/commands/admin/github.ts
diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts
index 3539ddc40c..5e8256c14f 100644
--- a/packages/cli/src/commands/admin/command.ts
+++ b/packages/cli/src/commands/admin/command.ts
@@ -17,15 +17,61 @@
import chalk from 'chalk';
import inquirer from 'inquirer';
import { Task } from '../../lib/tasks';
+import { github } from './github';
+import { updateConfigFile, updateEnvFile } from './file';
export async function command(): Promise {
- const answers = await inquirer.prompt<{ github: boolean }>([
+ const answers = await inquirer.prompt<{
+ shouldSetupAuth: boolean;
+ useEnvForSecrets?: boolean;
+ provider?: string;
+ }>([
{
type: 'confirm',
- name: 'github',
- message: chalk.blue('Do you want to set up GitHub Authentication?'),
+ name: 'shouldSetupAuth',
+ message: chalk.blue(
+ 'Do you want to set up Authentication for this project?',
+ ),
+ },
+ {
+ type: 'confirm',
+ name: 'useEnvForSecrets',
+ message:
+ 'Would you like to store sensitive configuration details such as secrets as environment variables? (recommended)',
+ when: ({ shouldSetupAuth }) => shouldSetupAuth,
+ },
+ {
+ type: 'list',
+ name: 'provider',
+ message: 'Please select a provider:',
+ choices: ['github'],
+ when: ({ shouldSetupAuth }) => shouldSetupAuth,
},
]);
- Task.log(answers.github ? 'Ok!' : 'Maybe next time');
+ if (!answers.shouldSetupAuth) {
+ // TODO(eide): Can we add a Task.warning() method?
+ console.log(
+ chalk.yellow(
+ 'If you change your mind, feel free to re-run this command.',
+ ),
+ );
+ process.exit(1);
+ }
+
+ switch (answers.provider) {
+ case 'github': {
+ const { useEnvForSecrets } = answers;
+ const config = await github(useEnvForSecrets);
+ await updateConfigFile(config);
+ if (useEnvForSecrets) {
+ await updateEnvFile(config);
+ }
+ break;
+ }
+ default:
+ throw new Error(`Provider ${answers.provider} not implemented yet.`);
+ }
+
+ Task.log(`Done setting up ${answers.provider}!`);
}
diff --git a/packages/cli/src/commands/admin/file.ts b/packages/cli/src/commands/admin/file.ts
new file mode 100644
index 0000000000..52a55c3776
--- /dev/null
+++ b/packages/cli/src/commands/admin/file.ts
@@ -0,0 +1,48 @@
+/*
+ * 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 * as path from 'path';
+import * as fs from 'fs-extra';
+import yaml from 'yaml';
+import { findPaths } from '@backstage/cli-common';
+import { GithubAuthConfig } from './github';
+
+/* eslint-disable-next-line no-restricted-syntax */
+const { targetRoot } = findPaths(__dirname);
+const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.development.yaml');
+const ENV_CONFIG_FILE = path.join(targetRoot, '.env.development');
+
+// export const readAppConfig = async (file: string) => {
+// return yaml.parse(await fs.readFile(file, 'utf8'));
+// };
+
+export const updateConfigFile = async (config: GithubAuthConfig) => {
+ return await fs.writeFile(
+ APP_CONFIG_FILE,
+ yaml.stringify(config, {
+ indent: 2,
+ }),
+ 'utf8',
+ );
+};
+
+export const updateEnvFile = async (config: GithubAuthConfig) => {
+ const content = `
+AUTH_GITHUB_CLIENT_ID=${config.auth.providers.github.clientId}
+AUTH_GITHUB_CLIENT_SECRET=${config.auth.providers.github.clientId}`;
+
+ return await fs.writeFile(ENV_CONFIG_FILE, content, 'utf8');
+};
diff --git a/packages/cli/src/commands/admin/github.ts b/packages/cli/src/commands/admin/github.ts
new file mode 100644
index 0000000000..5b359ecb33
--- /dev/null
+++ b/packages/cli/src/commands/admin/github.ts
@@ -0,0 +1,104 @@
+/*
+ * 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 chalk from 'chalk';
+import inquirer from 'inquirer';
+import { Task } from '../../lib/tasks';
+
+export type GithubAuthConfig = {
+ auth: {
+ providers: {
+ github: {
+ clientId: string;
+ clientSecret: string;
+ enterpriseInstanceUrl?: string;
+ };
+ };
+ };
+};
+
+export const github = async (
+ useEnvForSecrets?: boolean,
+): Promise => {
+ Task.log(`
+ To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue(
+ 'https://github.com/settings/developers',
+ )}
+ The Homepage URL should point to Backstage's frontend, while the Authorization callback URL will point to the auth backend.
+
+ You can find the full documentation page here: ${chalk.blue(
+ 'https://backstage.io/docs/auth/github/provider',
+ )}
+ `);
+
+ const answers = await inquirer.prompt<{
+ clientSecret: string;
+ clientId: string;
+ hasGithubEnterprise: boolean;
+ enterpriseInstanceUrl?: string;
+ }>([
+ {
+ type: 'input',
+ name: 'clientSecret',
+ message: 'What is your Client Secret?',
+ // TODO(eide): Is there another way to validate?
+ // validate(input) {
+ // if (/([a-f0-9]{40})/g.test(input)) {
+ // return true;
+ // }
+
+ // throw Error('Please provide a valid client secret.');
+ // },
+ },
+ {
+ type: 'input',
+ name: 'clientId',
+ message: 'What is your Client Id?',
+ },
+ {
+ type: 'confirm',
+ name: 'hasGithubEnterprise',
+ message: 'Are you using Github Enterprise?',
+ },
+ {
+ type: 'input',
+ name: 'enterpriseInstanceUrl',
+ message: 'What is your URL for Github Enterprise?',
+ when: ({ hasGithubEnterprise }) => hasGithubEnterprise,
+ validate(input: string) {
+ return Boolean(new URL(input));
+ },
+ },
+ ]);
+
+ return {
+ auth: {
+ providers: {
+ github: {
+ clientId: useEnvForSecrets
+ ? '${AUTH_GITHUB_CLIENT_ID}'
+ : answers.clientId,
+ clientSecret: useEnvForSecrets
+ ? '${AUTH_GITHUB_CLIENT_SECRET}'
+ : answers.clientSecret,
+ ...(answers.hasGithubEnterprise && {
+ enterpriseInstanceUrl: answers.enterpriseInstanceUrl,
+ }),
+ },
+ },
+ },
+ };
+};
From e1754adefa7f34b67d47bfe4b8f504177dbf6540 Mon Sep 17 00:00:00 2001
From: Marcus Eide
Date: Thu, 9 Feb 2023 14:38:42 +0100
Subject: [PATCH 104/511] cli: Set admin command to hidden
Signed-off-by: Marcus Eide
---
packages/cli/src/commands/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts
index 2baf1aac9b..df0689b4b5 100644
--- a/packages/cli/src/commands/index.ts
+++ b/packages/cli/src/commands/index.ts
@@ -27,7 +27,7 @@ const configOption = [
export function registerAdminCommand(program: Command) {
program
- .command('admin')
+ .command('admin', { hidden: true })
.description('Get help setting up your Backstage App.')
.action(lazy(() => import('./admin').then(m => m.command)));
}
From 29534d24534c5aa37ed3b3b2e27fbee4b8b1d15c Mon Sep 17 00:00:00 2001
From: Philipp Hugenroth
Date: Thu, 9 Feb 2023 17:37:44 +0100
Subject: [PATCH 105/511] Add gh-auth
Signed-off-by: Philipp Hugenroth