Merge branch 'feature/entitytypePicker_sort' of https://github.com/matdtr/backstage into feature/entitytypePicker_sort

This commit is contained in:
Mattia
2024-12-16 22:59:59 +01:00
1493 changed files with 51653 additions and 9407 deletions
+67
View File
@@ -1,5 +1,72 @@
# @backstage/plugin-api-docs
## 0.12.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.26.0-next.2
- @backstage/core-compat-api@0.3.4-next.2
- @backstage/plugin-catalog-react@1.14.3-next.2
- @backstage/catalog-model@1.7.2-next.0
- @backstage/core-components@0.16.2-next.2
- @backstage/core-plugin-api@1.10.2-next.0
- @backstage/frontend-plugin-api@0.9.3-next.2
- @backstage/plugin-catalog-common@1.1.2-next.0
- @backstage/plugin-permission-react@0.4.29-next.0
## 0.12.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.14.3-next.1
- @backstage/core-components@0.16.2-next.1
- @backstage/plugin-catalog@1.25.2-next.1
- @backstage/catalog-model@1.7.1
- @backstage/core-compat-api@0.3.4-next.1
- @backstage/core-plugin-api@1.10.1
- @backstage/frontend-plugin-api@0.9.3-next.1
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-permission-react@0.4.28
## 0.12.2-next.0
### Patch Changes
- 11babd9: Fix link styling in ProvidedApisCard component so it aligns with other card components.
- Updated dependencies
- @backstage/plugin-catalog-react@1.14.3-next.0
- @backstage/frontend-plugin-api@0.9.3-next.0
- @backstage/catalog-model@1.7.1
- @backstage/core-compat-api@0.3.4-next.0
- @backstage/core-components@0.16.2-next.0
- @backstage/core-plugin-api@1.10.1
- @backstage/plugin-catalog@1.25.2-next.0
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-permission-react@0.4.28
## 0.12.0
### Minor Changes
- 6836522: Added support for pagination in api-docs plugin - DefaultApiExplorerPage
### Patch Changes
- 11f57de: bump `@asyncapi/react-component` to latest `2.x`
- 3cd1dee: Uses theme values to style the API definition schema so that theme overrides apply.
- Updated dependencies
- @backstage/plugin-catalog@1.25.0
- @backstage/plugin-catalog-react@1.14.1
- @backstage/core-components@0.16.0
- @backstage/catalog-model@1.7.1
- @backstage/core-compat-api@0.3.2
- @backstage/core-plugin-api@1.10.1
- @backstage/frontend-plugin-api@0.9.1
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-permission-react@0.4.28
## 0.11.12-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-api-docs",
"version": "0.11.12-next.3",
"version": "0.12.2-next.2",
"description": "A Backstage plugin that helps represent API entities in the frontend",
"backstage": {
"role": "frontend-plugin",
@@ -84,12 +84,14 @@ export const ProvidedApisCard = (props: {
This {entity.kind.toLocaleLowerCase('en-US')} does not provide any
APIs.
</Typography>
<Link
to="https://backstage.io/docs/features/software-catalog/descriptor-format#specprovidesapis-optional"
externalLinkIcon
>
Learn how to change this
</Link>
<Typography variant="body2">
<Link
to="https://backstage.io/docs/features/software-catalog/descriptor-format#specprovidesapis-optional"
externalLinkIcon
>
Learn how to change this
</Link>
</Typography>
</div>
}
columns={columns}
+60
View File
@@ -1,5 +1,65 @@
# @backstage/plugin-app-backend
## 0.4.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-app-node@0.1.28-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/config-loader@1.9.3-next.1
- @backstage/config@1.3.1-next.0
- @backstage/types@1.2.0
## 0.4.3-next.1
### Patch Changes
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/config-loader@1.9.3-next.0
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
- @backstage/plugin-app-node@0.1.28-next.1
## 0.4.3-next.0
### Patch Changes
- 74c3f2a: Fixed a bug where config would not be injected on the `/` and `/index.html` paths.
- d66fa80: Fix root route handling when query parameters are present
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/config@1.3.0
- @backstage/config-loader@1.9.2
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
- @backstage/plugin-app-node@0.1.28-next.0
## 0.4.0
### Minor Changes
- 815b702: Configuration is no longer injected into static assets if a `index.html.tmpl` file is present.
### Patch Changes
- 815b702: The `index.html` templating is now done and served from memory rather than written to the filesystem. This means that you can now use config injection with a read-only filesystem, and you no longer need to use the `app.disableConfigInjection` flag.
- Updated dependencies
- @backstage/config@1.3.0
- @backstage/types@1.2.0
- @backstage/config-loader@1.9.2
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/errors@1.2.5
- @backstage/plugin-app-node@0.1.27
## 0.3.77-next.2
### Patch Changes
+1 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app-backend",
"version": "0.3.77-next.2",
"version": "0.4.3-next.2",
"description": "A Backstage backend plugin that serves the Backstage frontend app",
"backstage": {
"role": "backend-plugin",
@@ -83,7 +83,6 @@
"@backstage/cli": "workspace:^",
"@backstage/types": "workspace:^",
"@types/supertest": "^2.0.8",
"node-fetch": "^2.7.0",
"supertest": "^7.0.0"
},
"configSchema": "config.d.ts"
@@ -24,13 +24,12 @@ import { InjectOptions } from './types';
*/
export async function injectConfig(
options: InjectOptions,
): Promise<string | undefined> {
// In order to minimize the potential impact when rolling out the new config
// injection, we use both methods for a few releases. This allows the frontend
// app to be behind the backend by a version or two, but temporarily increases
// config injection overhead.
// TODO(Rugvip): After the 1.32 release we can stop calling the static injection if the HTML one is successful
await injectConfigIntoHtml(options);
): Promise<{ injectedPath?: string | undefined; indexHtmlContent?: Buffer }> {
const indexHtmlContent = await injectConfigIntoHtml(options);
if (indexHtmlContent) {
return { indexHtmlContent };
}
return injectConfigIntoStatic(options);
const injectedPath = await injectConfigIntoStatic(options);
return { injectedPath };
}
@@ -38,25 +38,22 @@ describe('injectConfigIntoHtml', () => {
mockDir.setContent({
'index.html.tmpl': "<html><%= config.getNumber('x') %></html>",
});
await injectConfigIntoHtml({
const result = await injectConfigIntoHtml({
...baseOptions,
appConfigs: [{ context: 'mock', data: { x: 1 } }],
});
expect(mockDir.content()).toMatchObject({
'index.html': '<html>1</html>',
});
expect(result?.toString('utf8')).toBe('<html>1</html>');
});
it('should inject config', async () => {
mockDir.setContent({
'index.html.tmpl': '<html><head></head></html>',
});
await injectConfigIntoHtml({
const result = await injectConfigIntoHtml({
...baseOptions,
appConfigs: [{ context: 'mock', data: { x: 1 } }],
});
expect(mockDir.content()).toMatchObject({
'index.html': `<html><head>
expect(result?.toString('utf8')).toBe(`<html><head>
<script type="backstage.io/config">
[
{
@@ -67,15 +64,14 @@ describe('injectConfigIntoHtml', () => {
}
]
</script>
</head></html>`,
});
</head></html>`);
});
it('should trim script tag endings from injected config', async () => {
mockDir.setContent({
'index.html.tmpl': '<html><head></head></html>',
});
await injectConfigIntoHtml({
const result = await injectConfigIntoHtml({
...baseOptions,
appConfigs: [
{
@@ -84,8 +80,7 @@ describe('injectConfigIntoHtml', () => {
},
],
});
expect(mockDir.content()).toMatchObject({
'index.html': `<html><head>
expect(result?.toString('utf8')).toBe(`<html><head>
<script type="backstage.io/config">
[
{
@@ -96,7 +91,6 @@ describe('injectConfigIntoHtml', () => {
}
]
</script>
</head></html>`,
});
</head></html>`);
});
});
@@ -25,13 +25,13 @@ const HTML_TEMPLATE_NAME = 'index.html.tmpl';
/** @internal */
export async function injectConfigIntoHtml(
options: InjectOptions,
): Promise<boolean> {
): Promise<Buffer | undefined> {
const { rootDir, appConfigs } = options;
const templatePath = resolvePath(rootDir, HTML_TEMPLATE_NAME);
if (!(await fs.exists(templatePath))) {
return false;
return undefined;
}
const templateContent = await fs.readFile(
@@ -67,13 +67,7 @@ ${JSON.stringify(appConfigs, null, 2)
</head>`,
);
await fs.writeFile(
resolvePath(rootDir, 'index.html'),
indexHtmlContentWithConfig,
'utf8',
);
return true;
return Buffer.from(indexHtmlContentWithConfig, 'utf8');
}
export function resolvePublicPath(config: Config) {
@@ -14,7 +14,6 @@
* limitations under the License.
*/
import fetch from 'node-fetch';
import {
createMockDirectory,
mockServices,
@@ -34,7 +33,11 @@ overridePackagePathResolution({
createRootLogger();
describe('appPlugin', () => {
beforeEach(() => {
afterEach(() => {
mockDir.clear();
});
it('boots', async () => {
mockDir.setContent({
'package.json': '{}',
dist: {
@@ -42,9 +45,7 @@ describe('appPlugin', () => {
'index.html': 'winning',
},
});
});
it('boots', async () => {
const { server } = await startTestBackend({
features: [
appPlugin,
@@ -67,4 +68,61 @@ describe('appPlugin', () => {
fetch(`http://localhost:${server.port()}`).then(res => res.text()),
).resolves.toBe('winning');
});
it('injects config into index.html', async () => {
mockDir.setContent({
'package.json': '{}',
dist: {
static: {},
'index.html': '<html><head></head></html>',
'index.html.tmpl': '<html><head></head></html>',
},
});
const { server } = await startTestBackend({
features: [
appPlugin,
mockServices.rootConfig.factory({
data: {
app: {
disableStaticFallbackCache: true,
},
},
}),
],
});
const baseUrl = `http://localhost:${server.port()}`;
const withInjectedConfig = `<html><head>
<script type="backstage.io/config">
[]
</script>
</head></html>`;
await expect(fetch(`${baseUrl}`).then(res => res.text())).resolves.toBe(
withInjectedConfig,
);
await expect(
fetch(`${baseUrl}?foo=bar`).then(res => res.text()),
).resolves.toBe(withInjectedConfig);
await expect(
fetch(`${baseUrl}/index.html`).then(res => res.text()),
).resolves.toBe(withInjectedConfig);
await expect(
fetch(`${baseUrl}/index.html?foo=bar`).then(res => res.text()),
).resolves.toBe(withInjectedConfig);
await expect(
fetch(`${baseUrl}/api/app/some/html5/route`).then(res => res.text()),
).resolves.toBe(withInjectedConfig);
await expect(
fetch(`${baseUrl}/api/app/some/html5/route?foo=bar`).then(res =>
res.text(),
),
).resolves.toBe(withInjectedConfig);
});
});
+28 -10
View File
@@ -267,7 +267,7 @@ async function createEntryPointRouter({
}) {
const staticDir = resolvePath(rootDir, 'static');
const injectedConfigPath =
const injectResult =
appConfigs &&
(await injectConfig({ appConfigs, logger, rootDir, staticDir }));
@@ -278,7 +278,7 @@ async function createEntryPointRouter({
staticRouter.use(
express.static(staticDir, {
setHeaders: (res, path) => {
if (path === injectedConfigPath) {
if (injectResult?.injectedPath === path) {
res.setHeader('Cache-Control', CACHE_CONTROL_REVALIDATE_CACHE);
} else {
res.setHeader('Cache-Control', CACHE_CONTROL_MAX_CACHE);
@@ -302,7 +302,17 @@ async function createEntryPointRouter({
staticRouter.use(notFoundHandler());
router.use('/static', staticRouter);
router.use(
const rootRouter = Router();
rootRouter.use((req, _res, next) => {
// Make sure / and /index.html are handled by the HTML5 route below
if (req.path === '/' || req.path === '/index.html') {
next('router');
} else {
next();
}
});
rootRouter.use(
express.static(rootDir, {
setHeaders: (res, path) => {
// The Cache-Control header instructs the browser to not cache html files since it might
@@ -315,15 +325,23 @@ async function createEntryPointRouter({
},
}),
);
router.use(rootRouter);
// HTML5 routing
router.get('/*', (_req, res) => {
res.sendFile(resolvePath(rootDir, 'index.html'), {
headers: {
// The Cache-Control header instructs the browser to not cache the index.html since it might
// link to static assets from recently deployed versions.
'cache-control': CACHE_CONTROL_NO_CACHE,
},
});
if (injectResult?.indexHtmlContent) {
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.setHeader('Cache-Control', CACHE_CONTROL_NO_CACHE);
res.send(injectResult.indexHtmlContent);
} else {
res.sendFile(resolvePath(rootDir, 'index.html'), {
headers: {
// The Cache-Control header instructs the browser to not cache the index.html since it might
// link to static assets from recently deployed versions.
'cache-control': CACHE_CONTROL_NO_CACHE,
},
});
}
});
return router;
+32
View File
@@ -1,5 +1,37 @@
# @backstage/plugin-app-node
## 0.1.28-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/config-loader@1.9.3-next.1
## 0.1.28-next.1
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.9.3-next.0
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.1.28-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/config-loader@1.9.2
## 0.1.27
### Patch Changes
- Updated dependencies
- @backstage/config-loader@1.9.2
- @backstage/backend-plugin-api@1.0.2
## 0.1.27-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app-node",
"version": "0.1.27-next.2",
"version": "0.1.28-next.2",
"description": "Node.js library for the app plugin",
"backstage": {
"role": "node-library",
+37
View File
@@ -1,5 +1,42 @@
# @backstage/plugin-app-visualizer
## 0.1.14-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.16.2-next.2
- @backstage/core-plugin-api@1.10.2-next.0
- @backstage/frontend-plugin-api@0.9.3-next.2
## 0.1.14-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.16.2-next.1
- @backstage/core-plugin-api@1.10.1
- @backstage/frontend-plugin-api@0.9.3-next.1
## 0.1.14-next.0
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.9.3-next.0
- @backstage/core-components@0.16.2-next.0
- @backstage/core-plugin-api@1.10.1
## 0.1.12
### Patch Changes
- e586e77: New `devDependency` for local development setup.
- Updated dependencies
- @backstage/core-components@0.16.0
- @backstage/core-plugin-api@1.10.1
- @backstage/frontend-plugin-api@0.9.1
## 0.1.12-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app-visualizer",
"version": "0.1.12-next.3",
"version": "0.1.14-next.2",
"description": "Visualizes the Backstage app structure",
"backstage": {
"role": "frontend-plugin",
+50
View File
@@ -1,5 +1,55 @@
# @backstage/plugin-app
## 0.1.4-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.16.2-next.2
- @backstage/core-plugin-api@1.10.2-next.0
- @backstage/frontend-plugin-api@0.9.3-next.2
- @backstage/integration-react@1.2.2-next.1
- @backstage/theme@0.6.3-next.0
- @backstage/plugin-permission-react@0.4.29-next.0
## 0.1.4-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.16.2-next.1
- @backstage/core-plugin-api@1.10.1
- @backstage/frontend-plugin-api@0.9.3-next.1
- @backstage/integration-react@1.2.2-next.0
- @backstage/theme@0.6.3-next.0
- @backstage/plugin-permission-react@0.4.28
## 0.1.4-next.0
### Patch Changes
- e5fa018: The OAuth 2 client implementations will now attempt to refresh the session when the existing session doesn't have the required scopes. The previous behavior was to only try to refresh the session of it was missing, and otherwise directly request a new session. This fixes an issue where some auth providers will not return access tokens with certain scopes unless explicitly requested, leading to an auth popup even if the underlying session already had been granted the requested scopes.
- 5f04976: Fixed a bug that caused missing code in published packages.
- Updated dependencies
- @backstage/frontend-plugin-api@0.9.3-next.0
- @backstage/theme@0.6.3-next.0
- @backstage/core-components@0.16.2-next.0
- @backstage/core-plugin-api@1.10.1
- @backstage/integration-react@1.2.2-next.0
- @backstage/plugin-permission-react@0.4.28
## 0.1.2
### Patch Changes
- Updated dependencies
- @backstage/theme@0.6.1
- @backstage/core-components@0.16.0
- @backstage/core-plugin-api@1.10.1
- @backstage/frontend-plugin-api@0.9.1
- @backstage/integration-react@1.2.1
- @backstage/plugin-permission-react@0.4.28
## 0.1.2-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app",
"version": "0.1.2-next.2",
"version": "0.1.4-next.2",
"backstage": {
"role": "frontend-plugin",
"pluginId": "app",
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-atlassian-provider
## 0.3.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.3.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.3.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.3.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.3.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-atlassian-provider",
"version": "0.3.2-next.2",
"version": "0.3.3-next.2",
"description": "The atlassian-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-auth0-provider
## 0.1.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.1.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.1.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.1.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.1.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-auth0-provider",
"version": "0.1.2-next.2",
"version": "0.1.3-next.2",
"description": "The auth0-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,51 @@
# @backstage/plugin-auth-backend-module-aws-alb-provider
## 0.3.1-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-auth-backend@0.24.1-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.3.1-next.1
### Patch Changes
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-auth-backend@0.24.1-next.1
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/errors@1.2.5
## 0.3.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/errors@1.2.5
- @backstage/plugin-auth-backend@0.24.1-next.0
## 0.3.0
### Minor Changes
- 75168e3: **BREAKING**: The AWS ALB `fullProfile` will no longer have the its username or email converted to lowercase. This is to ensure unique handling of the users. You may need to update and configure a custom sign-in resolver or profile transform as a result.
### Patch Changes
- 5d74716: Remove unused backend-common dependency
- Updated dependencies
- @backstage/plugin-auth-backend@0.24.0
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/errors@1.2.5
## 0.3.0-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-aws-alb-provider",
"version": "0.3.0-next.2",
"version": "0.3.1-next.2",
"description": "The aws-alb provider module for the Backstage auth backend.",
"backstage": {
"role": "backend-plugin-module",
@@ -42,8 +42,7 @@
"@backstage/plugin-auth-backend": "workspace:^",
"@backstage/plugin-auth-node": "workspace:^",
"jose": "^5.0.0",
"node-cache": "^5.1.2",
"node-fetch": "^2.7.0"
"node-cache": "^5.1.2"
},
"devDependencies": {
"@backstage/backend-test-utils": "workspace:^",
@@ -13,11 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { KeyObject } from 'crypto';
import * as crypto from 'crypto';
import { JWTHeaderParameters, decodeJwt } from 'jose';
import NodeCache from 'node-cache';
import fetch from 'node-fetch';
import { PassportProfile, ProfileInfo } from '@backstage/plugin-auth-node';
import { AuthenticationError } from '@backstage/errors';
@@ -1,5 +1,45 @@
# @backstage/plugin-auth-backend-module-azure-easyauth-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/catalog-model@1.7.2-next.0
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-azure-easyauth-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The azure-easyauth-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-bitbucket-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-bitbucket-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The bitbucket-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,38 @@
# @backstage/plugin-auth-backend-module-bitbucket-server-provider
## 0.1.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.1.3-next.1
### Patch Changes
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.1.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.1.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.1.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-bitbucket-server-provider",
"version": "0.1.2-next.2",
"version": "0.1.3-next.2",
"description": "The bitbucket-server-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -36,7 +36,6 @@
"dependencies": {
"@backstage/backend-plugin-api": "workspace:^",
"@backstage/plugin-auth-node": "workspace:^",
"node-fetch": "^2.7.0",
"passport": "^0.7.0",
"passport-oauth2": "^1.6.1"
},
@@ -14,7 +14,6 @@
* limitations under the License.
*/
import fetch from 'node-fetch';
import { PassportProfile } from '@backstage/plugin-auth-node';
export async function fetchProfile(options: {
@@ -1,5 +1,48 @@
# @backstage/plugin-auth-backend-module-cloudflare-access-provider
## 0.3.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/config@1.3.1-next.0
## 0.3.3-next.1
### Patch Changes
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
## 0.3.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
## 0.3.2
### Patch Changes
- d52d7f9: Support ISO and ms string forms of durations in config too
- 4e58bc7: Upgrade to uuid v11 internally
- Updated dependencies
- @backstage/config@1.3.0
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/errors@1.2.5
## 0.3.2-next.2
### Patch Changes
@@ -42,7 +42,7 @@ export interface Config {
/**
* The backstage token expiration.
*/
backstageTokenExpiration?: HumanDuration;
backstageTokenExpiration?: HumanDuration | string;
};
};
}
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-cloudflare-access-provider",
"version": "0.3.2-next.2",
"version": "0.3.3-next.2",
"description": "The cloudflare-access-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -39,8 +39,7 @@
"@backstage/errors": "workspace:^",
"@backstage/plugin-auth-node": "workspace:^",
"express": "^4.18.2",
"jose": "^5.0.0",
"node-fetch": "^2.7.0"
"jose": "^5.0.0"
},
"devDependencies": {
"@backstage/backend-defaults": "workspace:^",
@@ -23,7 +23,6 @@ import {
} from '@backstage/errors';
import express from 'express';
import { createRemoteJWKSet, jwtVerify } from 'jose';
import fetch, { Headers } from 'node-fetch';
import {
CACHE_PREFIX,
CF_JWT_HEADER,
@@ -87,8 +86,7 @@ export class AuthHelper {
// Only throw if both are not provided by Cloudflare Access since either
// can be used.
throw new AuthenticationError(
`Missing ${this.jwtHeaderName} and
${this.authorizationCookieName} from Cloudflare Access`,
`Missing ${this.jwtHeaderName} and ${this.authorizationCookieName} from Cloudflare Access`,
);
}
@@ -1,5 +1,45 @@
# @backstage/plugin-auth-backend-module-gcp-iap-provider
## 0.3.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/types@1.2.0
## 0.3.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
## 0.3.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
## 0.3.2
### Patch Changes
- Updated dependencies
- @backstage/types@1.2.0
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/errors@1.2.5
## 0.3.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-gcp-iap-provider",
"version": "0.3.2-next.2",
"version": "0.3.3-next.2",
"description": "A GCP IAP auth provider module for the Backstage auth backend",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-github-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-github-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The github-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-gitlab-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-gitlab-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The gitlab-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,39 @@
# @backstage/plugin-auth-backend-module-google-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.2.3-next.1
### Patch Changes
- 79b055a: Pass through `includeGrantedScopes` in order to persist scopes across refresh calls
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.2.2
### Patch Changes
- b833660: Fix visibility of config for use in front end code
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-google-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "A Google auth provider module for the Backstage auth backend",
"backstage": {
"role": "backend-plugin-module",
@@ -73,6 +73,7 @@ export const googleAuthenticator = createOAuthAuthenticator({
return helper.start(input, {
accessType: 'offline',
prompt: 'consent',
includeGrantedScopes: 'true',
});
},
@@ -67,6 +67,7 @@ describe('authModuleGoogleProvider', () => {
prompt: 'consent',
response_type: 'code',
client_id: 'my-client-id',
include_granted_scopes: 'true',
redirect_uri: `http://localhost:${server.port()}/api/auth/google/handler/frame`,
state: expect.any(String),
scope:
@@ -1,5 +1,46 @@
# @backstage/plugin-auth-backend-module-guest-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/catalog-model@1.7.2-next.0
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.2.2
### Patch Changes
- 5d74716: Remove unused backend-common dependency
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-guest-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The guest-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,38 @@
# @backstage/plugin-auth-backend-module-microsoft-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.2.3-next.1
### Patch Changes
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-microsoft-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The microsoft-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -38,7 +38,6 @@
"@backstage/plugin-auth-node": "workspace:^",
"express": "^4.18.2",
"jose": "^5.0.0",
"node-fetch": "^2.7.0",
"passport-microsoft": "^1.0.0"
},
"devDependencies": {
@@ -16,7 +16,6 @@
import { PassportProfile } from '@backstage/plugin-auth-node';
import { decodeJwt } from 'jose';
import fetch from 'node-fetch';
import { Strategy as MicrosoftStrategy } from 'passport-microsoft';
export class ExtendedMicrosoftStrategy extends MicrosoftStrategy {
@@ -103,9 +102,9 @@ export class ExtendedMicrosoftStrategy extends MicrosoftStrategy {
},
},
);
const data = await res.buffer();
const data = await res.arrayBuffer();
return `data:image/jpeg;base64,${data.toString('base64')}`;
return `data:image/jpeg;base64,${Buffer.from(data).toString('base64')}`;
} catch (error) {
return undefined;
}
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-oauth2-provider
## 0.3.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.3.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.3.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.3.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.3.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-oauth2-provider",
"version": "0.3.2-next.2",
"version": "0.3.3-next.2",
"description": "The oauth2-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,41 @@
# @backstage/plugin-auth-backend-module-oauth2-proxy-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/errors@1.2.5
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/errors@1.2.5
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/errors@1.2.5
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The oauth2-proxy-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,42 @@
# @backstage/plugin-auth-backend-module-oidc-provider
## 0.3.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-backend@0.24.1-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.3.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-backend@0.24.1-next.1
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.3.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/plugin-auth-backend@0.24.1-next.0
## 0.3.2
### Patch Changes
- 5d74716: Remove unused backend-common dependency
- Updated dependencies
- @backstage/plugin-auth-backend@0.24.0
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.3.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-oidc-provider",
"version": "0.3.2-next.2",
"version": "0.3.3-next.2",
"description": "The oidc-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-okta-provider
## 0.1.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.1.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.1.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.1.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.1.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-okta-provider",
"version": "0.1.2-next.2",
"version": "0.1.3-next.2",
"description": "The okta-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,37 @@
# @backstage/plugin-auth-backend-module-onelogin-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-onelogin-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The onelogin-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,41 @@
# @backstage/plugin-auth-backend-module-pinniped-provider
## 0.2.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/config@1.3.1-next.0
## 0.2.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/config@1.3.0
## 0.2.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/config@1.3.0
## 0.2.2
### Patch Changes
- Updated dependencies
- @backstage/config@1.3.0
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
## 0.2.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-pinniped-provider",
"version": "0.2.2-next.2",
"version": "0.2.3-next.2",
"description": "The pinniped-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,41 @@
# @backstage/plugin-auth-backend-module-vmware-cloud-provider
## 0.4.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/catalog-model@1.7.2-next.0
## 0.4.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/catalog-model@1.7.1
## 0.4.2-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/catalog-model@1.7.1
## 0.4.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-node@0.5.4
- @backstage/backend-plugin-api@1.0.2
- @backstage/catalog-model@1.7.1
## 0.4.1-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider",
"version": "0.4.1-next.2",
"version": "0.4.2-next.2",
"description": "The vmware-cloud-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
+133
View File
@@ -1,5 +1,138 @@
# @backstage/plugin-auth-backend
## 0.24.1-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.2
- @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.2
- @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.2
- @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.2
- @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.2
- @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.2
- @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.2
- @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.2
- @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.2
- @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.2
- @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.2
- @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.2
- @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.2
- @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.2
- @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.2
- @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.2
- @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.2
- @backstage/plugin-auth-node@0.5.5-next.2
- @backstage/plugin-catalog-node@1.15.0-next.2
- @backstage/catalog-client@1.9.0-next.2
- @backstage/catalog-model@1.7.2-next.0
- @backstage/config@1.3.1-next.0
- @backstage/types@1.2.0
## 0.24.1-next.1
### Patch Changes
- c907440: Improved error forwarding for OAuth refresh endpoints
- 40518ab: Fix issue with `jwks` endpoint returning invalid data with `firestore`
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-auth-node@0.5.5-next.1
- @backstage/plugin-catalog-node@1.15.0-next.1
- @backstage/catalog-client@1.9.0-next.1
- @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.1
- @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.1
- @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.1
- @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.1
- @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.1
- @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.1
- @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.1
- @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.1
- @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.1
- @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.1
- @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.1
- @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.1
- @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.1
- @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.1
- @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.1
- @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.1
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
## 0.24.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-auth-node@0.5.5-next.0
- @backstage/catalog-client@1.8.1-next.0
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
- @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.0
- @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.0
- @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.0
- @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.0
- @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.0
- @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.0
- @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.0
- @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.0
- @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.0
- @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.0
- @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.0
- @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.0
- @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.0
- @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.0
- @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.0
- @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.0
- @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.0
- @backstage/plugin-catalog-node@1.14.1-next.0
## 0.24.0
### Minor Changes
- 75168e3: **BREAKING**: The AWS ALB `fullProfile` will no longer have the its username or email converted to lowercase. This is to ensure unique handling of the users. You may need to update and configure a custom sign-in resolver or profile transform as a result.
### Patch Changes
- d52d7f9: Support ISO and ms string forms of durations in config too
- 4e58bc7: Upgrade to uuid v11 internally
- Updated dependencies
- @backstage/catalog-client@1.8.0
- @backstage/config@1.3.0
- @backstage/plugin-auth-backend-module-google-provider@0.2.2
- @backstage/types@1.2.0
- @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.0
- @backstage/plugin-auth-node@0.5.4
- @backstage/plugin-catalog-node@1.14.0
- @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.2
- @backstage/backend-plugin-api@1.0.2
- @backstage/plugin-auth-backend-module-oidc-provider@0.3.2
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
- @backstage/plugin-auth-backend-module-atlassian-provider@0.3.2
- @backstage/plugin-auth-backend-module-auth0-provider@0.1.2
- @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.2
- @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.2
- @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.2
- @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.2
- @backstage/plugin-auth-backend-module-github-provider@0.2.2
- @backstage/plugin-auth-backend-module-gitlab-provider@0.2.2
- @backstage/plugin-auth-backend-module-microsoft-provider@0.2.2
- @backstage/plugin-auth-backend-module-oauth2-provider@0.3.2
- @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.2
- @backstage/plugin-auth-backend-module-okta-provider@0.1.2
- @backstage/plugin-auth-backend-module-onelogin-provider@0.2.2
## 0.24.0-next.2
### Patch Changes
+1 -1
View File
@@ -143,7 +143,7 @@ export interface Config {
/**
* The backstage token expiration.
*/
backstageTokenExpiration?: HumanDuration;
backstageTokenExpiration?: HumanDuration | string;
};
/**
* Additional app origins to allow for authenticating
+1 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend",
"version": "0.24.0-next.2",
"version": "0.24.1-next.2",
"description": "A Backstage backend plugin that handles authentication",
"backstage": {
"role": "backend-plugin",
@@ -89,7 +89,6 @@
"minimatch": "^9.0.0",
"morgan": "^1.10.0",
"node-cache": "^5.1.2",
"node-fetch": "^2.7.0",
"openid-client": "^5.2.1",
"passport": "^0.7.0",
"passport-auth0": "^1.4.3",
@@ -24,7 +24,9 @@ import {
} from './FirestoreKeyStore';
import { AnyJWK } from './types';
const data = jest.fn().mockReturnValue('data');
const data = jest
.fn()
.mockReturnValue({ key: { kid: 'something' }, kid: 'something' });
const toDate = jest.fn().mockReturnValue('date');
const get = jest.fn().mockReturnValue({
docs: [{ data, createTime: { toDate } }],
@@ -145,7 +147,7 @@ describe('FirestoreKeyStore', () => {
expect(firestoreMock.doc).toHaveBeenCalledWith(key.kid);
expect(firestoreMock.set).toHaveBeenCalledWith({
kid: key.kid,
key: JSON.stringify(key),
key,
});
});
@@ -180,7 +182,26 @@ describe('FirestoreKeyStore', () => {
expect(data).toHaveBeenCalledTimes(1);
expect(toDate).toHaveBeenCalledTimes(1);
expect(items).toMatchObject({
items: [{ key: 'data', createdAt: 'date' }],
items: [{ key: { kid: 'something' }, createdAt: 'date' }],
});
});
it('supports older string versions of the keys', async () => {
data.mockReturnValue({
key: JSON.stringify({ kid: 'something' }),
kid: 'something',
});
const keyStore = await FirestoreKeyStore.create(firestoreSettings);
const items = await keyStore.listKeys();
expect(setTimeout).toHaveBeenCalledTimes(1);
expect(firestoreMock.collection).toHaveBeenCalledWith(path);
expect(firestoreMock.get).toHaveBeenCalledTimes(1);
expect(data).toHaveBeenCalledTimes(1);
expect(toDate).toHaveBeenCalledTimes(1);
expect(items).toMatchObject({
items: [{ key: { kid: 'something' }, createdAt: 'date' }],
});
});
});
@@ -75,13 +75,10 @@ export class FirestoreKeyStore implements KeyStore {
async addKey(key: AnyJWK): Promise<void> {
await this.withTimeout<WriteResult>(
this.database
.collection(this.path)
.doc(key.kid)
.set({
kid: key.kid,
key: JSON.stringify(key),
}),
this.database.collection(this.path).doc(key.kid).set({
kid: key.kid,
key: key,
}),
);
}
@@ -91,10 +88,14 @@ export class FirestoreKeyStore implements KeyStore {
);
return {
items: keys.docs.map(key => ({
key: key.data() as AnyJWK,
createdAt: key.createTime.toDate(),
})),
items: keys.docs.map(doc => {
const { key } = doc.data();
return {
createdAt: doc.createTime.toDate(),
key: typeof key === 'string' ? JSON.parse(key) : key,
};
}),
};
}
@@ -272,28 +272,63 @@ describe('PassportStrategyHelper', () => {
);
});
it('should reject with an error if refresh failed', async () => {
class MyCustomOAuth2Error {
getOAuthAccessToken(
_refreshToken: string,
_options: any,
callback: Function,
) {
callback(new Error('Unknown error'));
}
}
it('should forward simple errors', async () => {
class MyCustomRefreshTokenSuccess extends passport.Strategy {
_oauth2 = new MyCustomOAuth2Error();
_oauth2 = new (class {
getOAuthAccessToken(_r: string, _o: any, cb: Function) {
cb(new Error('Unknown error'));
}
})();
}
const mockStrategy = new MyCustomRefreshTokenSuccess();
const refreshTokenPromise = executeRefreshTokenStrategy(
mockStrategy,
'REFRESH_TOKEN',
'a',
await expect(
executeRefreshTokenStrategy(
new MyCustomRefreshTokenSuccess(),
'REFRESH_TOKEN',
'a',
),
).rejects.toThrow(
'Failed to refresh access token; caused by Error: Unknown error',
);
await expect(refreshTokenPromise).rejects.toThrow(
'Failed to refresh access token Error: Unknown error',
});
it('should forward string errors', async () => {
class MyCustomRefreshTokenSuccess extends passport.Strategy {
_oauth2 = new (class {
getOAuthAccessToken(_r: string, _o: any, cb: Function) {
cb('some silly string error');
}
})();
}
await expect(
executeRefreshTokenStrategy(
new MyCustomRefreshTokenSuccess(),
'REFRESH_TOKEN',
'a',
),
).rejects.toThrow(
"Failed to refresh access token; caused by unknown error 'some silly string error'",
);
});
it('should forward object errors', async () => {
class MyCustomRefreshTokenSuccess extends passport.Strategy {
_oauth2 = new (class {
getOAuthAccessToken(_r: string, _o: any, cb: Function) {
cb({ name: 'SomeError', message: 'some message' });
}
})();
}
await expect(
executeRefreshTokenStrategy(
new MyCustomRefreshTokenSuccess(),
'REFRESH_TOKEN',
'a',
),
).rejects.toThrow(
'Failed to refresh access token; caused by SomeError: some message',
);
});
@@ -21,6 +21,7 @@ import { InternalOAuthError } from 'passport-oauth2';
import { ProfileInfo } from '@backstage/plugin-auth-node';
import { PassportProfile } from './types';
import { OAuthStartResponse } from '../../providers/types';
import { ForwardedError } from '@backstage/errors';
export type PassportDoneCallback<Res, Private = never> = (
err?: Error,
@@ -66,7 +67,10 @@ export const makeProfileInfo = (
displayName = decoded.name;
}
} catch (e) {
throw new Error(`Failed to parse id token and get profile info, ${e}`);
throw new ForwardedError(
`Failed to parse id token and get profile info`,
e,
);
}
}
@@ -176,7 +180,7 @@ export const executeRefreshTokenStrategy = async (
params: any,
) => {
if (err) {
reject(new Error(`Failed to refresh access token ${err.toString()}`));
reject(new ForwardedError(`Failed to refresh access token`, err));
}
if (!accessToken) {
reject(
+53
View File
@@ -1,5 +1,58 @@
# @backstage/plugin-auth-node
## 0.5.5-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/catalog-client@1.9.0-next.2
- @backstage/catalog-model@1.7.2-next.0
- @backstage/config@1.3.1-next.0
- @backstage/types@1.2.0
## 0.5.5-next.1
### Patch Changes
- c907440: Improved error forwarding for OAuth refresh endpoints
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/catalog-client@1.9.0-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
## 0.5.5-next.0
### Patch Changes
- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`.
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/catalog-client@1.8.1-next.0
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/types@1.2.0
## 0.5.4
### Patch Changes
- a0a9a4a: Browsers silently drop cookies that exceed 4KB, which can be problematic for refresh tokens and other large cookies.This update ensures that large cookies, like refresh tokens, are not dropped by browsers, maintaining the integrity of the authentication process. The changes include both the implementation of the cookie splitting logic and corresponding tests to validate the new functionality.
- 4e58bc7: Upgrade to uuid v11 internally
- Updated dependencies
- @backstage/catalog-client@1.8.0
- @backstage/config@1.3.0
- @backstage/types@1.2.0
- @backstage/backend-plugin-api@1.0.2
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.5.4-next.2
### Patch Changes
+2 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-node",
"version": "0.5.4-next.2",
"version": "0.5.5-next.2",
"backstage": {
"role": "node-library",
"pluginId": "auth",
@@ -44,12 +44,11 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/types": "workspace:^",
"@types/express": "*",
"@types/express": "^4.17.6",
"@types/passport": "^1.0.3",
"express": "^4.17.1",
"jose": "^5.0.0",
"lodash": "^4.17.21",
"node-fetch": "^2.7.0",
"passport": "^0.7.0",
"winston": "^3.2.1",
"zod": "^3.22.4",
@@ -19,6 +19,7 @@ import { decodeJwt } from 'jose';
import { Strategy } from 'passport';
import { PassportProfile } from './types';
import { ProfileInfo } from '../types';
import { ForwardedError } from '@backstage/errors';
// Re-declared here to avoid direct dependency on passport-oauth2
/** @internal */
@@ -76,7 +77,10 @@ export class PassportHelpers {
displayName = decoded.name;
}
} catch (e) {
throw new Error(`Failed to parse id token and get profile info, ${e}`);
throw new ForwardedError(
`Failed to parse id token and get profile info`,
e,
);
}
}
@@ -191,9 +195,7 @@ export class PassportHelpers {
params: any,
) => {
if (err) {
reject(
new Error(`Failed to refresh access token ${err.toString()}`),
);
reject(new ForwardedError(`Failed to refresh access token`, err));
}
if (!accessToken) {
reject(
+36
View File
@@ -1,5 +1,41 @@
# @backstage/plugin-auth-react
## 0.1.10-next.2
### Patch Changes
- Updated dependencies
- @backstage/errors@1.2.6-next.0
- @backstage/core-components@0.16.2-next.2
- @backstage/core-plugin-api@1.10.2-next.0
## 0.1.10-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.16.2-next.1
- @backstage/core-plugin-api@1.10.1
- @backstage/errors@1.2.5
## 0.1.10-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.16.2-next.0
- @backstage/core-plugin-api@1.10.1
- @backstage/errors@1.2.5
## 0.1.8
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.16.0
- @backstage/core-plugin-api@1.10.1
- @backstage/errors@1.2.5
## 0.1.8-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-react",
"version": "0.1.8-next.2",
"version": "0.1.10-next.2",
"description": "Web library for the auth plugin",
"backstage": {
"role": "web-library",
@@ -1,5 +1,27 @@
# @backstage/plugin-bitbucket-cloud-common
## 0.2.26-next.1
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.0-next.1
## 0.2.26-next.0
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.0-next.0
## 0.2.25
### Patch Changes
- 23f1da2: Updated dependency `ts-morph` to `^24.0.0`.
- Updated dependencies
- @backstage/integration@1.15.2
## 0.2.25-next.0
### Patch Changes
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bitbucket-cloud-common",
"version": "0.2.25-next.0",
"version": "0.2.26-next.1",
"description": "Common functionalities for bitbucket-cloud plugins",
"backstage": {
"role": "common-library",
@@ -1,5 +1,70 @@
# @backstage/plugin-catalog-backend-module-aws
## 0.4.6-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.6.0-next.2
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-catalog-node@1.15.0-next.2
- @backstage/catalog-model@1.7.2-next.0
- @backstage/config@1.3.1-next.0
- @backstage/integration@1.16.0-next.1
- @backstage/integration-aws-node@0.1.14-next.0
- @backstage/plugin-catalog-common@1.1.2-next.0
- @backstage/plugin-kubernetes-common@0.9.1-next.0
## 0.4.6-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.6.0-next.1
- @backstage/plugin-catalog-node@1.15.0-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/integration@1.16.0-next.0
- @backstage/integration-aws-node@0.1.13
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-kubernetes-common@0.9.0
## 0.4.6-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.6.0-next.0
- @backstage/integration@1.16.0-next.0
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/integration-aws-node@0.1.13
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-catalog-node@1.14.1-next.0
- @backstage/plugin-kubernetes-common@0.9.0
## 0.4.5
### Patch Changes
- 4e58bc7: Upgrade to uuid v11 internally
- Updated dependencies
- @backstage/config@1.3.0
- @backstage/backend-defaults@0.5.3
- @backstage/integration-aws-node@0.1.13
- @backstage/plugin-kubernetes-common@0.9.0
- @backstage/plugin-catalog-node@1.14.0
- @backstage/backend-plugin-api@1.0.2
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
- @backstage/integration@1.15.2
- @backstage/plugin-catalog-common@1.1.1
## 0.4.5-next.3
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-aws",
"version": "0.4.5-next.3",
"version": "0.4.6-next.2",
"description": "A Backstage catalog backend module that helps integrate towards AWS",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,55 @@
# @backstage/plugin-catalog-backend-module-azure
## 0.3.0-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-catalog-node@1.15.0-next.2
- @backstage/config@1.3.1-next.0
- @backstage/integration@1.16.0-next.1
- @backstage/plugin-catalog-common@1.1.2-next.0
## 0.3.0-next.1
### Patch Changes
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-catalog-node@1.15.0-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/config@1.3.0
- @backstage/integration@1.16.0-next.0
- @backstage/plugin-catalog-common@1.1.1
## 0.3.0-next.0
### Minor Changes
- 277092a: Added the Azure Blob Storage as catalog entity provider to import all the desired entities from storage account provided in app-config.yaml
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.0-next.0
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/config@1.3.0
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-catalog-node@1.14.1-next.0
## 0.2.4
### Patch Changes
- 4e58bc7: Upgrade to uuid v11 internally
- Updated dependencies
- @backstage/config@1.3.0
- @backstage/plugin-catalog-node@1.14.0
- @backstage/backend-plugin-api@1.0.2
- @backstage/integration@1.15.2
- @backstage/plugin-catalog-common@1.1.1
## 0.2.4-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-azure",
"version": "0.2.4-next.2",
"version": "0.3.0-next.2",
"description": "A Backstage catalog backend module that helps integrate towards Azure",
"backstage": {
"role": "backend-plugin-module",
@@ -51,12 +51,13 @@
"test": "backstage-cli package test"
},
"dependencies": {
"@azure/identity": "^4.0.0",
"@azure/storage-blob": "^12.5.0",
"@backstage/backend-plugin-api": "workspace:^",
"@backstage/config": "workspace:^",
"@backstage/integration": "workspace:^",
"@backstage/plugin-catalog-common": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"node-fetch": "^2.7.0",
"uuid": "^11.0.0"
},
"devDependencies": {
@@ -56,6 +56,6 @@ export class AzureDevOpsEntityProvider implements EntityProvider {
}
// @public
const catalogModuleAzureDevOpsEntityProvider: BackendFeature;
export default catalogModuleAzureDevOpsEntityProvider;
const catalogModuleAzureEntityProvider: BackendFeature;
export default catalogModuleAzureEntityProvider;
```
@@ -14,7 +14,6 @@
* limitations under the License.
*/
import fetch from 'node-fetch';
import {
AzureDevOpsCredentialsProvider,
AzureIntegrationConfig,
@@ -17,8 +17,11 @@
import { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend-plugin-api';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { catalogModuleAzureDevOpsEntityProvider } from './catalogModuleAzureDevOpsEntityProvider';
import { AzureDevOpsEntityProvider } from '../providers';
import { catalogModuleAzureEntityProvider } from './catalogModuleAzureDevOpsEntityProvider';
import {
AzureBlobStorageEntityProvider,
AzureDevOpsEntityProvider,
} from '../providers';
describe('catalogModuleAzureDevOpsEntityProvider', () => {
it('should register provider at the catalog extension point', async () => {
@@ -58,7 +61,7 @@ describe('catalogModuleAzureDevOpsEntityProvider', () => {
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
features: [
catalogModuleAzureDevOpsEntityProvider,
catalogModuleAzureEntityProvider,
mockServices.rootConfig.factory({ data: config }),
mockServices.logger.factory(),
scheduler.factory,
@@ -73,4 +76,63 @@ describe('catalogModuleAzureDevOpsEntityProvider', () => {
);
expect(runner).not.toHaveBeenCalled();
});
it('should register azure blob storage provider at the catalog extension point', async () => {
let addedProviders: Array<AzureBlobStorageEntityProvider> | undefined;
let usedSchedule: SchedulerServiceTaskScheduleDefinition | undefined;
const extensionPoint = {
addEntityProvider: (providers: any) => {
addedProviders = providers;
},
};
const runner = jest.fn();
const scheduler = mockServices.scheduler.mock({
createScheduledTaskRunner(schedule) {
usedSchedule = schedule;
return { run: runner };
},
});
const config = {
integrations: {
azureBlobStorage: [
{
accountName: 'test',
accountKey: 'test',
},
],
},
catalog: {
providers: {
azureBlob: {
containerName: 'test',
accountName: 'test',
schedule: {
frequency: 'P1M',
timeout: 'PT3M',
},
},
},
},
};
await startTestBackend({
extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]],
features: [
catalogModuleAzureEntityProvider,
mockServices.rootConfig.factory({ data: config }),
mockServices.logger.factory(),
scheduler.factory,
],
});
expect(usedSchedule?.frequency).toEqual({ months: 1 });
expect(usedSchedule?.timeout).toEqual({ minutes: 3 });
expect(addedProviders?.length).toEqual(1);
expect(addedProviders?.pop()?.getProviderName()).toEqual(
'azureBlobStorage-provider:default',
);
expect(runner).not.toHaveBeenCalled();
});
});
@@ -19,16 +19,19 @@ import {
createBackendModule,
} from '@backstage/backend-plugin-api';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { AzureDevOpsEntityProvider } from '../providers';
import {
AzureBlobStorageEntityProvider,
AzureDevOpsEntityProvider,
} from '../providers';
/**
* Registers the AzureDevOpsEntityProvider with the catalog processing extension point.
*
* @public
*/
export const catalogModuleAzureDevOpsEntityProvider = createBackendModule({
export const catalogModuleAzureEntityProvider = createBackendModule({
pluginId: 'catalog',
moduleId: 'azure-dev-ops-entity-provider',
moduleId: 'azure-providers',
register(env) {
env.registerInit({
deps: {
@@ -38,12 +41,25 @@ export const catalogModuleAzureDevOpsEntityProvider = createBackendModule({
scheduler: coreServices.scheduler,
},
async init({ config, catalog, logger, scheduler }) {
catalog.addEntityProvider(
AzureDevOpsEntityProvider.fromConfig(config, {
logger,
scheduler,
}),
);
// Check for Azure Blob Storage provider configuration and register it
if (config.has('catalog.providers.azureBlob')) {
catalog.addEntityProvider(
AzureBlobStorageEntityProvider.fromConfig(config, {
logger,
scheduler,
}),
);
}
// Check for Azure DevOps provider configuration and register it
if (config.has('catalog.providers.azureDevOps')) {
catalog.addEntityProvider(
AzureDevOpsEntityProvider.fromConfig(config, {
logger,
scheduler,
}),
);
}
},
});
},
@@ -14,4 +14,4 @@
* limitations under the License.
*/
export { catalogModuleAzureDevOpsEntityProvider as default } from './catalogModuleAzureDevOpsEntityProvider';
export { catalogModuleAzureEntityProvider as default } from './catalogModuleAzureDevOpsEntityProvider';
@@ -0,0 +1,238 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
SchedulerService,
SchedulerServiceTaskRunner,
SchedulerServiceTaskInvocationDefinition,
} from '@backstage/backend-plugin-api';
import { ConfigReader } from '@backstage/config';
import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { AzureBlobStorageEntityProvider } from './AzureBlobStorageEntityProvider';
import { mockServices } from '@backstage/backend-test-utils';
class PersistingTaskRunner implements SchedulerServiceTaskRunner {
private tasks: SchedulerServiceTaskInvocationDefinition[] = [];
getTasks() {
return this.tasks;
}
run(task: SchedulerServiceTaskInvocationDefinition): Promise<void> {
this.tasks.push(task);
return Promise.resolve(undefined);
}
}
const blobs = ['key1.yaml', 'key2.yaml', 'key3.yaml', 'key4.yaml'];
const createBlobList = (blobsArray: string[]) => {
return blobsArray.map(blob => ({
name: blob,
}));
};
// Mocking Azure Storage Blob Library
jest.mock('@azure/storage-blob', () => {
return {
BlobServiceClient: jest.fn().mockImplementation(() => ({
url: 'https://myaccount.blob.core.windows.net/',
getContainerClient: jest.fn().mockImplementation(() => ({
// eslint-disable-next-line func-names
listBlobsFlat: jest.fn(async function* () {
yield* createBlobList(blobs);
}),
})),
})),
};
});
const logger = mockServices.logger.mock();
describe('AzureBlobStorageEntityProvider', () => {
const containerName = 'container-1';
const accountName = 'myaccount';
const expectMutation = async (
providerId: string,
providerConfig: object,
expectedBaseUrl: string,
integrationConfig?: object,
scheduleInConfig?: boolean,
) => {
const config = new ConfigReader({
integrations: {
azureBlobStorage: integrationConfig ? [integrationConfig] : [],
},
catalog: {
providers: {
azureBlob: {
[providerId]: providerConfig,
},
},
},
});
const schedulingConfig: Record<string, any> = {};
const normalizedExpectedBaseUrl = expectedBaseUrl.endsWith('/')
? expectedBaseUrl
: `${expectedBaseUrl}/`;
const schedule = new PersistingTaskRunner();
const entityProviderConnection: EntityProviderConnection = {
applyMutation: jest.fn(),
refresh: jest.fn(),
};
if (scheduleInConfig) {
schedulingConfig.scheduler = {
createScheduledTaskRunner: (_: any) => schedule,
} as unknown as SchedulerService;
} else {
schedulingConfig.schedule = schedule;
}
const provider = AzureBlobStorageEntityProvider.fromConfig(config, {
...schedulingConfig,
logger,
})[0];
expect(provider.getProviderName()).toEqual(
`azureBlobStorage-provider:${providerId}`,
);
try {
await provider.connect(entityProviderConnection);
} catch (error) {
console.error('Error during provider connection:', error);
}
const taskDef = schedule.getTasks()[0];
expect(taskDef.id).toEqual(
`azureBlobStorage-provider:${providerId}:refresh`,
);
await (taskDef.fn as () => Promise<void>)();
const expectedEntities = blobs.map(blob => {
const url = encodeURI(`${normalizedExpectedBaseUrl}${blob}`);
return {
entity: {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Location',
metadata: {
annotations: {
'backstage.io/managed-by-location': `url:${url}`,
'backstage.io/managed-by-origin-location': `url:${url}`,
},
name: expect.stringMatching(/generated-[a-f0-9]{40}/),
},
spec: {
presence: 'required',
target: `${url}`,
type: 'url',
},
},
locationKey: `azureBlobStorage-provider:${providerId}`,
};
});
expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({
type: 'full',
entities: expectedEntities,
});
};
// eslint-disable-next-line jest/expect-expect
it('apply full update on scheduled execution', async () => {
return expectMutation(
'staticContainer',
{
containerName,
accountName,
},
'https://myaccount.blob.core.windows.net/container-1/',
{
accountName: 'myaccount',
},
);
});
// eslint-disable-next-line jest/expect-expect
it('apply full update no prefix', async () => {
return expectMutation(
'staticContainerNoPrefix',
{
containerName,
accountName,
schedule: {
frequency: { minutes: 30 },
timeout: { minutes: 3 },
},
},
'https://myaccount.blob.core.windows.net/container-1/',
{
host: 'blob.core.windows.net',
accountName: 'myaccount',
},
);
});
it('fail without schedule and scheduler', () => {
const config = new ConfigReader({
catalog: {
providers: {
azureBlob: {
test: {
accountName: 'myaccount',
containerName: 'container-1',
prefix: 'sub/dir/',
},
},
},
},
});
expect(() =>
AzureBlobStorageEntityProvider.fromConfig(config, {
logger,
}),
).toThrow('Either schedule or scheduler must be provided');
});
it('fail with scheduler but no schedule config', () => {
const scheduler = {
createScheduledTaskRunner: (_: any) => jest.fn(),
} as unknown as SchedulerService;
const config = new ConfigReader({
catalog: {
providers: {
azureBlob: {
test: {
containerName: 'container-1',
prefix: 'sub/dir/',
accountName: 'myaccount',
},
},
},
},
});
expect(() =>
AzureBlobStorageEntityProvider.fromConfig(config, {
logger,
scheduler,
}),
).toThrow(
'No schedule provided neither via code nor config for AzureBlobStorageEntityProvider:test.',
);
});
});
@@ -0,0 +1,241 @@
/*
* 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 {
AnonymousCredential,
BlobServiceClient,
ContainerClient,
StorageSharedKeyCredential,
} from '@azure/storage-blob';
import { Config } from '@backstage/config';
import {
LoggerService,
SchedulerService,
SchedulerServiceTaskRunner,
} from '@backstage/backend-plugin-api';
import {
EntityProvider,
EntityProviderConnection,
locationSpecToLocationEntity,
} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import * as uuid from 'uuid';
import { readAzureBlobStorageConfigs } from './config';
import {
AzureBlobStorageIntergation,
DefaultAzureCredentialsManager,
ScmIntegrations,
} from '@backstage/integration';
import { TokenCredential } from '@azure/identity';
import { AzureBlobStorageConfig } from './types';
/**
* Provider which discovers catalog files within an Azure Storage accounts.
*
* Use `AzureBlobStorageEntityProvider.fromConfig(...)` to create instances.
*
* @public
*/
export class AzureBlobStorageEntityProvider implements EntityProvider {
private readonly logger: LoggerService;
private connection?: EntityProviderConnection;
private blobServiceClient?: BlobServiceClient;
private readonly scheduleFn: () => Promise<void>;
static fromConfig(
configRoot: Config,
options: {
logger: LoggerService;
schedule?: SchedulerServiceTaskRunner;
scheduler?: SchedulerService;
},
): AzureBlobStorageEntityProvider[] {
const providerConfigs = readAzureBlobStorageConfigs(configRoot);
const scmIntegration = ScmIntegrations.fromConfig(configRoot);
const credentialsProvider =
DefaultAzureCredentialsManager.fromIntegrations(scmIntegration);
if (!options.schedule && !options.scheduler) {
throw new Error('Either schedule or scheduler must be provided.');
}
return providerConfigs.map(providerConfig => {
const integration = scmIntegration.azureBlobStorage
.list()
.filter(
azureIntegration =>
azureIntegration.config.accountName === providerConfig.accountName,
)[0];
if (!options.schedule && !providerConfig.schedule) {
throw new Error(
`No schedule provided neither via code nor config for AzureBlobStorageEntityProvider:${providerConfig.id}.`,
);
}
if (!integration) {
throw new Error(
`There is no Azure blob storage integration for account. Please add a configuration entry for it under integrations.azureBlobStorage`,
);
}
const taskRunner =
options.schedule ??
options.scheduler!.createScheduledTaskRunner(providerConfig.schedule!);
return new AzureBlobStorageEntityProvider(
providerConfig,
integration,
credentialsProvider,
options.logger,
taskRunner,
);
});
}
private constructor(
private readonly config: AzureBlobStorageConfig,
private readonly integration: AzureBlobStorageIntergation,
private readonly credentialsProvider: DefaultAzureCredentialsManager,
logger: LoggerService,
schedule: SchedulerServiceTaskRunner,
) {
this.logger = logger.child({ target: this.getProviderName() });
this.scheduleFn = this.createScheduleFn(schedule);
}
private createScheduleFn(
taskRunner: SchedulerServiceTaskRunner,
): () => Promise<void> {
return async () => {
const taskId = `${this.getProviderName()}:refresh`;
return taskRunner.run({
id: taskId,
fn: async () => {
const logger = this.logger.child({
class: AzureBlobStorageEntityProvider.prototype.constructor.name,
taskId,
taskInstanceId: uuid.v4(),
});
try {
await this.refresh(logger);
} catch (error) {
logger.error(
`${this.getProviderName()} refresh failed, ${error}`,
error,
);
}
},
});
};
}
getProviderName(): string {
return `azureBlobStorage-provider:${this.config.id}`;
}
async connect(connection: EntityProviderConnection): Promise<void> {
this.connection = connection;
let credential:
| TokenCredential
| StorageSharedKeyCredential
| AnonymousCredential;
if (this.integration.config.accountKey) {
credential = new StorageSharedKeyCredential(
this.integration.config.accountName as string,
this.integration.config.accountKey as string,
); // StorageSharedKeyCredential is only allowed in node.js runtime not in browser
} else {
credential = await this.credentialsProvider.getCredentials(
this.integration.config.accountName as string,
);
}
let blobServiceClientUrl: string;
if (this.integration.config.endpoint) {
if (this.integration.config.sasToken) {
blobServiceClientUrl = `${this.integration.config.endpoint}?${this.integration.config.sasToken}`;
} else {
blobServiceClientUrl = `${this.integration.config.endpoint}`;
}
} else {
blobServiceClientUrl = `https://${this.integration.config.accountName}.${this.integration.config.host}`;
}
this.blobServiceClient = new BlobServiceClient(
blobServiceClientUrl,
credential,
);
await this.scheduleFn();
}
async refresh(logger: LoggerService) {
if (!this.connection) {
throw new Error('Not initialized');
}
logger.info('Discovering Azure Blob Storage blobs');
const keys = await this.listAllBlobKeys();
logger.info(`Discovered ${keys.length} Azure Blob Storage blobs`);
const locations = keys.map(key => this.createLocationSpec(key));
await this.connection.applyMutation({
type: 'full',
entities: locations.map(location => {
return {
locationKey: this.getProviderName(),
entity: locationSpecToLocationEntity({ location }),
};
}),
});
logger.info(
`Committed ${locations.length} Locations for Azure Blob Storage blobs`,
);
}
private async listAllBlobKeys(): Promise<string[]> {
const keys: string[] = [];
const containerClient = this.blobServiceClient?.getContainerClient(
this.config.containerName,
);
for await (const blob of (
containerClient as ContainerClient
).listBlobsFlat()) {
if (blob.name) {
keys.push(blob.name);
}
}
return keys;
}
private createLocationSpec(key: string): LocationSpec {
return {
type: 'url',
target: this.createObjectUrl(key),
presence: 'required',
};
}
private createObjectUrl(key: string): string {
const endpoint = this.blobServiceClient?.url;
return `${endpoint}${this.config.containerName}/${key}`;
}
}
@@ -15,7 +15,7 @@
*/
import { ConfigReader } from '@backstage/config';
import { readAzureDevOpsConfigs } from './config';
import { readAzureBlobStorageConfigs, readAzureDevOpsConfigs } from './config';
describe('readAzureDevOpsConfigs', () => {
it('reads all provider configs and set default values', () => {
@@ -106,3 +106,74 @@ describe('readAzureDevOpsConfigs', () => {
});
});
});
describe('readAzureBlobStorageConfigs', () => {
it('reads single and multiple Azure Blob Storage provider configs', () => {
const provider1 = {
accountName: 'account-1',
containerName: 'container-1',
schedule: {
frequency: 'PT30M',
timeout: {
minutes: 3,
},
},
};
const provider2 = {
accountName: 'account-1',
containerName: 'container-2',
};
const configSingle = {
catalog: {
providers: {
azureBlob: provider2,
},
},
};
const configMulti = {
catalog: {
providers: {
azureBlob: {
provider1,
provider2,
},
},
},
};
// Single provider case
const actualSingle = readAzureBlobStorageConfigs(
new ConfigReader(configSingle),
);
expect(actualSingle).toHaveLength(1);
expect(actualSingle[0]).toEqual({
id: 'default',
accountName: 'account-1',
containerName: 'container-2',
schedule: undefined, // no schedule provided in this case
});
// Multiple providers case
const actualMulti = readAzureBlobStorageConfigs(
new ConfigReader(configMulti),
);
expect(actualMulti).toHaveLength(2);
expect(actualMulti[0]).toEqual({
id: 'provider1',
accountName: 'account-1',
containerName: 'container-1',
schedule: {
...provider1.schedule,
frequency: { minutes: 30 },
},
});
expect(actualMulti[1]).toEqual({
id: 'provider2',
accountName: 'account-1',
containerName: 'container-2',
schedule: undefined, // no schedule provided
});
});
});
@@ -16,7 +16,9 @@
import { readSchedulerServiceTaskScheduleDefinitionFromConfig } from '@backstage/backend-plugin-api';
import { Config } from '@backstage/config';
import { AzureDevOpsConfig } from './types';
import { AzureDevOpsConfig, AzureBlobStorageConfig } from './types';
const DEFAULT_PROVIDER_ID = 'default';
export function readAzureDevOpsConfigs(config: Config): AzureDevOpsConfig[] {
const configs: AzureDevOpsConfig[] = [];
@@ -61,3 +63,52 @@ function readAzureDevOpsConfig(id: string, config: Config): AzureDevOpsConfig {
schedule,
};
}
export function readAzureBlobStorageConfigs(
config: Config,
): AzureBlobStorageConfig[] {
const configs: AzureBlobStorageConfig[] = [];
const providerConfigs = config.getOptionalConfig(
'catalog.providers.azureBlob',
);
if (!providerConfigs) {
return configs;
}
if (providerConfigs.has('containerName')) {
// simple/single config variant
configs.push(
readAzureBlobStorageConfig(DEFAULT_PROVIDER_ID, providerConfigs),
);
return configs;
}
for (const id of providerConfigs.keys()) {
configs.push(readAzureBlobStorageConfig(id, providerConfigs.getConfig(id)));
}
return configs;
}
function readAzureBlobStorageConfig(
id: string,
config: Config,
): AzureBlobStorageConfig {
const containerName = config.getString('containerName');
const accountName = config.getString('accountName');
const schedule = config.has('schedule')
? readSchedulerServiceTaskScheduleDefinitionFromConfig(
config.getConfig('schedule'),
)
: undefined;
return {
id,
containerName,
accountName,
schedule,
};
}
@@ -15,3 +15,4 @@
*/
export { AzureDevOpsEntityProvider } from './AzureDevOpsEntityProvider';
export { AzureBlobStorageEntityProvider } from './AzureBlobStorageEntityProvider';
@@ -26,3 +26,10 @@ export type AzureDevOpsConfig = {
path: string;
schedule?: SchedulerServiceTaskScheduleDefinition;
};
export type AzureBlobStorageConfig = {
id: string;
containerName: string;
accountName: string;
schedule?: SchedulerServiceTaskScheduleDefinition;
};
@@ -1,5 +1,54 @@
# @backstage/plugin-catalog-backend-module-backstage-openapi
## 0.4.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/backend-openapi-utils@0.4.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-catalog-node@1.15.0-next.2
- @backstage/catalog-model@1.7.2-next.0
- @backstage/config@1.3.1-next.0
## 0.4.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.15.0-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/backend-openapi-utils@0.3.1-next.1
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
## 0.4.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/backend-openapi-utils@0.3.1-next.0
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/plugin-catalog-node@1.14.1-next.0
## 0.4.2
### Patch Changes
- 4e58bc7: Upgrade to uuid v11 internally
- Updated dependencies
- @backstage/config@1.3.0
- @backstage/plugin-catalog-node@1.14.0
- @backstage/backend-plugin-api@1.0.2
- @backstage/backend-openapi-utils@0.3.0
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
## 0.4.2-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-backstage-openapi",
"version": "0.4.2-next.2",
"version": "0.4.3-next.2",
"backstage": {
"role": "backend-plugin-module",
"pluginId": "catalog",
@@ -1,5 +1,67 @@
# @backstage/plugin-catalog-backend-module-bitbucket-cloud
## 0.4.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/plugin-catalog-node@1.15.0-next.2
- @backstage/plugin-events-node@0.4.6-next.2
- @backstage/catalog-client@1.9.0-next.2
- @backstage/catalog-model@1.7.2-next.0
- @backstage/config@1.3.1-next.0
- @backstage/integration@1.16.0-next.1
- @backstage/plugin-bitbucket-cloud-common@0.2.26-next.1
- @backstage/plugin-catalog-common@1.1.2-next.0
## 0.4.3-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-node@1.15.0-next.1
- @backstage/catalog-client@1.9.0-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/integration@1.16.0-next.0
- @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-events-node@0.4.6-next.1
## 0.4.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.0-next.0
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/plugin-events-node@0.4.6-next.0
- @backstage/catalog-client@1.8.1-next.0
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
- @backstage/plugin-catalog-common@1.1.1
- @backstage/plugin-catalog-node@1.14.1-next.0
## 0.4.2
### Patch Changes
- 4e58bc7: Upgrade to uuid v11 internally
- f6b4b8a: Implemented discovery on project-level to shift Bitbucket Cloud API limits
- Updated dependencies
- @backstage/catalog-client@1.8.0
- @backstage/config@1.3.0
- @backstage/plugin-events-node@0.4.5
- @backstage/plugin-bitbucket-cloud-common@0.2.25
- @backstage/plugin-catalog-node@1.14.0
- @backstage/backend-plugin-api@1.0.2
- @backstage/catalog-model@1.7.1
- @backstage/integration@1.15.2
- @backstage/plugin-catalog-common@1.1.1
## 0.4.2-next.3
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud",
"version": "0.4.2-next.3",
"version": "0.4.3-next.2",
"description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,59 @@
# @backstage/plugin-catalog-backend-module-bitbucket-server
## 0.3.0-next.2
### Minor Changes
- 3f34ea9: Throttles Bitbucket Server API calls
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@1.1.0-next.2
- @backstage/errors@1.2.6-next.0
- @backstage/plugin-catalog-node@1.15.0-next.2
- @backstage/catalog-model@1.7.2-next.0
- @backstage/config@1.3.1-next.0
- @backstage/integration@1.16.0-next.1
## 0.2.5-next.1
### Patch Changes
- 5c9cc05: Use native fetch instead of node-fetch
- Updated dependencies
- @backstage/plugin-catalog-node@1.15.0-next.1
- @backstage/backend-plugin-api@1.1.0-next.1
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/integration@1.16.0-next.0
## 0.2.5-next.0
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.0-next.0
- @backstage/backend-plugin-api@1.0.3-next.0
- @backstage/catalog-model@1.7.1
- @backstage/config@1.3.0
- @backstage/errors@1.2.5
- @backstage/plugin-catalog-node@1.14.1-next.0
## 0.2.4
### Patch Changes
- 4e58bc7: Upgrade to uuid v11 internally
- Updated dependencies
- @backstage/config@1.3.0
- @backstage/plugin-catalog-node@1.14.0
- @backstage/backend-plugin-api@1.0.2
- @backstage/catalog-model@1.7.1
- @backstage/errors@1.2.5
- @backstage/integration@1.15.2
## 0.2.4-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-server",
"version": "0.2.4-next.2",
"version": "0.3.0-next.2",
"backstage": {
"role": "backend-plugin-module",
"pluginId": "catalog",
@@ -56,8 +56,7 @@
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@types/node-fetch": "^2.5.12",
"node-fetch": "^2.7.0",
"p-throttle": "^4.1.1",
"uuid": "^11.0.0"
},
"devDependencies": {
@@ -11,7 +11,6 @@ import { EntityProvider } from '@backstage/plugin-catalog-node';
import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-node';
import { LoggerService } from '@backstage/backend-plugin-api';
import { Response as Response_2 } from 'node-fetch';
import { SchedulerService } from '@backstage/backend-plugin-api';
import { SchedulerServiceTaskRunner } from '@backstage/backend-plugin-api';
@@ -27,7 +26,7 @@ export class BitbucketServerClient {
projectKey: string;
repo: string;
path: string;
}): Promise<Response_2>;
}): Promise<Response>;
// (undocumented)
getRepository(options: {
projectKey: string;

Some files were not shown because too many files have changed in this diff Show More