Merge remote-tracking branch 'origin/master' into feature/add-commit-hash-for-scaffolder

Signed-off-by: Lukas Fruntke (external expert on behalf of DB Netz) <lukas.fruntke-extern@deutschebahn.com>
This commit is contained in:
Lukas Fruntke (external expert on behalf of DB Netz)
2023-04-17 10:13:31 +02:00
805 changed files with 24884 additions and 4808 deletions
+28
View File
@@ -1,5 +1,33 @@
# @backstage/plugin-adr-backend
## 0.3.2-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-adr-common@0.2.8-next.1
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-search-common@1.2.3-next.0
## 0.3.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.0
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-adr-common@0.2.8-next.0
- @backstage/plugin-search-common@1.2.3-next.0
## 0.3.2-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
"version": "0.3.2-next.1",
"version": "0.3.2-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-adr-common
## 0.2.8-next.1
### Patch Changes
- 77aa3a4d47e: use path attribute to fetch files instead of name and update the UI to navigate over subdirectories
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-search-common@1.2.3-next.0
## 0.2.8-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-adr-common",
"description": "Common functionalities for the adr plugin",
"version": "0.2.8-next.0",
"version": "0.2.8-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+1 -1
View File
@@ -77,7 +77,7 @@ export type AdrFilePathFilterFn = (path: string) => boolean;
* @public
*/
export const madrFilePathFilter: AdrFilePathFilterFn = (path: string) =>
/^\d{4}-.+\.md$/.test(path);
/^(?:.*\/)?\d{4}-.+\.md$/.test(path);
/**
* ADR indexable document interface
+31
View File
@@ -1,5 +1,36 @@
# @backstage/plugin-adr
## 0.4.2-next.3
### Patch Changes
- 77aa3a4d47e: use path attribute to fetch files instead of name and update the UI to navigate over subdirectories
- Updated dependencies
- @backstage/plugin-adr-common@0.2.8-next.1
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/integration-react@1.1.12-next.3
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-search-common@1.2.3-next.0
- @backstage/plugin-search-react@1.5.2-next.3
## 0.4.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/integration-react@1.1.12-next.2
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-adr-common@0.2.8-next.0
- @backstage/plugin-search-common@1.2.3-next.0
- @backstage/plugin-search-react@1.5.2-next.2
## 0.4.2-next.1
### Patch Changes
+3
View File
@@ -10,6 +10,7 @@ import { AdrFilePathFilterFn } from '@backstage/plugin-adr-common';
import { ApiRef } from '@backstage/core-plugin-api';
import { BackstagePlugin } from '@backstage/core-plugin-api';
import { DiscoveryApi } from '@backstage/core-plugin-api';
import { FetchApi } from '@backstage/core-plugin-api';
import { isAdrAvailable } from '@backstage/plugin-adr-common';
import { ReactNode } from 'react';
import { ResultHighlight } from '@backstage/plugin-search-common';
@@ -37,6 +38,8 @@ export class AdrClient implements AdrApi {
export interface AdrClientOptions {
// (undocumented)
discoveryApi: DiscoveryApi;
// (undocumented)
fetchApi: FetchApi;
}
// @public
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
"version": "0.4.2-next.1",
"version": "0.4.2-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,6 +35,7 @@
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.61",
"@types/react": "^16.13.1 || ^17.0.0",
"lodash": "^4.17.21",
"react-markdown": "^8.0.0",
"react-use": "^17.2.4",
"remark-gfm": "^3.0.1"
+5 -2
View File
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { DiscoveryApi } from '@backstage/core-plugin-api';
import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
import { AdrApi, AdrListResult, AdrReadResult } from './types';
/**
@@ -24,6 +24,7 @@ import { AdrApi, AdrListResult, AdrReadResult } from './types';
*/
export interface AdrClientOptions {
discoveryApi: DiscoveryApi;
fetchApi: FetchApi;
}
const readEndpoint = 'file';
@@ -36,9 +37,11 @@ const listEndpoint = 'list';
*/
export class AdrClient implements AdrApi {
private readonly discoveryApi: DiscoveryApi;
private readonly fetchApi: FetchApi;
constructor(options: AdrClientOptions) {
this.discoveryApi = options.discoveryApi;
this.fetchApi = options.fetchApi;
}
private async fetchAdrApi<T>(endpoint: string, fileUrl: string): Promise<T> {
@@ -47,7 +50,7 @@ export class AdrClient implements AdrApi {
fileUrl,
)}`;
const result = await fetch(targetUrl);
const result = await this.fetchApi.fetch(targetUrl);
const data = await result.json();
if (!result.ok) {
@@ -16,9 +16,14 @@
import React, { useEffect, useState } from 'react';
import { Link, useSearchParams } from 'react-router-dom';
import useAsync from 'react-use/lib/useAsync';
import groupBy from 'lodash/groupBy';
import {
Content,
ContentHeader,
InfoCard,
MissingAnnotationEmptyState,
Progress,
SupportButton,
@@ -35,27 +40,119 @@ import {
} from '@backstage/plugin-adr-common';
import { useEntity } from '@backstage/plugin-catalog-react';
import {
Box,
Chip,
Collapse,
Grid,
List,
ListItem,
ListItemIcon,
ListItemText,
makeStyles,
Theme,
Typography,
} from '@material-ui/core';
import ExpandLess from '@material-ui/icons/ExpandLess';
import ExpandMore from '@material-ui/icons/ExpandMore';
import FolderIcon from '@material-ui/icons/Folder';
import { adrApiRef, AdrFileInfo } from '../../api';
import { rootRouteRef } from '../../routes';
import { AdrContentDecorator, AdrReader } from '../AdrReader';
import { adrApiRef } from '../../api';
import useAsync from 'react-use/lib/useAsync';
const useStyles = makeStyles((theme: Theme) => ({
adrMenu: {
backgroundColor: theme.palette.background.paper,
},
adrContainerTitle: {
color: theme.palette.grey[700],
marginBottom: theme.spacing(1),
},
adrChip: {
position: 'absolute',
right: 0,
},
}));
const AdrListContainer = (props: {
adrs: AdrFileInfo[];
selectedAdr: string;
title: string;
}) => {
const { adrs, selectedAdr, title } = props;
const classes = useStyles();
const rootLink = useRouteRef(rootRouteRef);
const [open, setOpen] = React.useState(true);
const getChipColor = (status: string) => {
switch (status) {
case 'accepted':
return 'primary';
case 'rejected':
case 'deprecated':
return 'secondary';
default:
return 'default';
}
};
const handleClick = () => {
setOpen(!open);
};
return (
<>
{title && (
<ListItem
button
className={classes.adrContainerTitle}
onClick={handleClick}
>
<ListItemIcon>
<FolderIcon />
</ListItemIcon>
<ListItemText primary={title} />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
)}
<Collapse in={open} timeout="auto" unmountOnExit>
<List dense>
{adrs.map((adr, idx) => (
<ListItem
button
component={Link}
key={idx}
selected={selectedAdr === adr.path}
to={`${rootLink()}?record=${adr.path}`}
>
<ListItemText
primary={adr.title ?? adr?.name.replace(/\.md$/, '')}
primaryTypographyProps={{
style: { whiteSpace: 'normal' },
}}
secondary={
<Box>
{adr.date}
{adr.status && (
<Chip
color={getChipColor(adr.status)}
label={adr.status}
size="small"
variant="outlined"
className={classes.adrChip}
/>
)}
</Box>
}
/>
</ListItem>
))}
</List>
</Collapse>
</>
);
};
/**
* Component for browsing ADRs on an entity page.
* @public
@@ -67,10 +164,7 @@ export const EntityAdrContent = (props: {
const { contentDecorators, filePathFilterFn } = props;
const classes = useStyles();
const { entity } = useEntity();
const rootLink = useRouteRef(rootRouteRef);
const [adrList, setAdrList] = useState<
{ name: string; title?: string; status?: string; date?: string }[]
>([]);
const [adrList, setAdrList] = useState<AdrFileInfo[]>([]);
const [searchParams, setSearchParams] = useSearchParams();
const scmIntegrations = useApi(scmIntegrationsApiRef);
const adrApi = useApi(adrApiRef);
@@ -82,10 +176,15 @@ export const EntityAdrContent = (props: {
}, [entity, scmIntegrations]);
const selectedAdr =
adrList.find(adr => adr.name === searchParams.get('record'))?.name ?? '';
adrList.find(adr => adr.path === searchParams.get('record'))?.path ?? '';
const adrSubDirectoryFunc = (adr: AdrFileInfo) => {
return adr.path.split('/').slice(0, -1).join('/');
};
useEffect(() => {
if (adrList.length && !selectedAdr) {
searchParams.set('record', adrList[0].name);
searchParams.set('record', adrList[0].path);
setSearchParams(searchParams, { replace: true });
}
});
@@ -95,29 +194,20 @@ export const EntityAdrContent = (props: {
return;
}
const adrs = value.data
.filter(
(item: { type: string; name: string }) =>
item.type === 'file' &&
(filePathFilterFn
? filePathFilterFn(item.name)
: madrFilePathFilter(item.name)),
)
.map(({ name, title, status, date }) => ({ name, title, status, date }));
const adrs: AdrFileInfo[] = value.data.filter(
(item: AdrFileInfo) =>
item.type === 'file' &&
(filePathFilterFn
? filePathFilterFn(item.path)
: madrFilePathFilter(item.path)),
);
setAdrList(adrs);
}, [filePathFilterFn, value]);
const getChipColor = (status: string) => {
switch (status) {
case 'accepted':
return 'primary';
case 'rejected' || 'deprecated':
return 'secondary';
default:
return 'default';
}
};
const adrListGrouped = Object.entries(
groupBy(adrList, adrSubDirectoryFunc),
).sort();
return (
<Content>
@@ -141,33 +231,18 @@ export const EntityAdrContent = (props: {
(adrList.length ? (
<Grid container direction="row">
<Grid item xs={3}>
<List className={classes.adrMenu} dense>
{adrList.map((adr, idx) => (
<ListItem
key={idx}
button
component={Link}
to={`${rootLink()}?record=${adr.name}`}
selected={selectedAdr === adr.name}
>
<ListItemText
primaryTypographyProps={{
style: { whiteSpace: 'normal' },
}}
primary={adr.title ?? adr?.name.replace(/\.md$/, '')}
secondary={adr.date}
<InfoCard>
<List className={classes.adrMenu} dense>
{adrListGrouped.map(([title, adrs], idx) => (
<AdrListContainer
adrs={adrs}
key={idx}
selectedAdr={selectedAdr}
title={title}
/>
{adr.status && (
<Chip
label={adr.status}
size="small"
variant="outlined"
color={getChipColor(adr.status)}
/>
)}
</ListItem>
))}
</List>
))}
</List>
</InfoCard>
</Grid>
<Grid item xs={9}>
<AdrReader adr={selectedAdr} decorators={contentDecorators} />
+4 -2
View File
@@ -20,6 +20,7 @@ import {
createPlugin,
createRoutableExtension,
discoveryApiRef,
fetchApiRef,
} from '@backstage/core-plugin-api';
import { createSearchResultListItemExtension } from '@backstage/plugin-search-react';
import { rootRouteRef } from './routes';
@@ -36,9 +37,10 @@ export const adrPlugin = createPlugin({
api: adrApiRef,
deps: {
discoveryApi: discoveryApiRef,
fetchApi: fetchApiRef,
},
factory({ discoveryApi }) {
return new AdrClient({ discoveryApi });
factory({ discoveryApi, fetchApi }) {
return new AdrClient({ discoveryApi, fetchApi });
},
}),
],
+8
View File
@@ -1,5 +1,13 @@
# @backstage/plugin-airbrake-backend
## 0.2.17-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/config@1.0.7
## 0.2.17-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake-backend",
"version": "0.2.17-next.1",
"version": "0.2.17-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+26
View File
@@ -1,5 +1,31 @@
# @backstage/plugin-airbrake
## 0.3.17-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/dev-utils@1.0.14-next.3
- @backstage/test-utils@1.3.0-next.3
- @backstage/theme@0.2.19-next.0
## 0.3.17-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/dev-utils@1.0.14-next.2
- @backstage/test-utils@1.3.0-next.2
- @backstage/theme@0.2.19-next.0
## 0.3.17-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake",
"version": "0.3.17-next.1",
"version": "0.3.17-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+22
View File
@@ -1,5 +1,27 @@
# @backstage/plugin-allure
## 0.1.33-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/theme@0.2.19-next.0
## 0.1.33-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/theme@0.2.19-next.0
## 0.1.33-next.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-allure",
"description": "A Backstage plugin that integrates with Allure",
"version": "0.1.33-next.1",
"version": "0.1.33-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+20
View File
@@ -1,5 +1,25 @@
# @backstage/plugin-analytics-module-ga
## 0.1.28-next.3
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.0-next.3
- @backstage/config@1.0.7
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/theme@0.2.19-next.0
## 0.1.28-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/config@1.0.7
- @backstage/theme@0.2.19-next.0
## 0.1.28-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-analytics-module-ga",
"version": "0.1.28-next.1",
"version": "0.1.28-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+16
View File
@@ -1,5 +1,21 @@
# @backstage/plugin-apache-airflow
## 0.2.10-next.3
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
## 0.2.10-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/core-plugin-api@1.5.1-next.1
## 0.2.10-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-apache-airflow",
"version": "0.2.10-next.1",
"version": "0.2.10-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+24
View File
@@ -1,5 +1,29 @@
# @backstage/plugin-api-docs
## 0.9.2-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-catalog@1.10.0-next.3
## 0.9.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-catalog@1.10.0-next.2
## 0.9.2-next.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-api-docs",
"description": "A Backstage plugin that helps represent API entities in the frontend",
"version": "0.9.2-next.1",
"version": "0.9.2-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -64,6 +64,7 @@ describe('DefaultApiExplorerPage', () => {
}),
getLocationByRef: () =>
Promise.resolve({ id: 'id', type: 'url', target: 'url' }),
getEntitiesByRefs: () => Promise.resolve({ items: [] }),
getEntityByRef: async entityRef => {
return {
apiVersion: 'backstage.io/v1alpha1',
+18
View File
@@ -1,5 +1,23 @@
# @backstage/plugin-apollo-explorer
## 0.1.10-next.3
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/theme@0.2.19-next.0
## 0.1.10-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/theme@0.2.19-next.0
## 0.1.10-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-apollo-explorer",
"version": "0.1.10-next.1",
"version": "0.1.10-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-app-backend
## 0.3.44-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/config-loader@1.1.9
- @backstage/types@1.0.2
## 0.3.44-next.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-app-backend",
"description": "A Backstage backend plugin that serves the Backstage frontend app",
"version": "0.3.44-next.1",
"version": "0.3.44-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+41
View File
@@ -1,5 +1,46 @@
# @backstage/plugin-auth-backend
## 0.18.2-next.3
### Patch Changes
- 475abd1dc3f: The `microsoft` (i.e. Azure) auth provider now supports negotiating tokens for
Azure resources besides Microsoft Graph (e.g. AKS, Virtual Machines, Machine
Learning Services, etc.). When the `/frame/handler` endpoint is called with an
authorization code for a non-Microsoft Graph scope, the user profile will not be
fetched. Similarly no user profile or photo data will be fetched by the backend
if the `/refresh` endpoint is called with the `scope` query parameter strictly
containing scopes for resources besides Microsoft Graph.
Furthermore, the `offline_access` scope will be requested by default, even when
it is not mentioned in the argument to `getAccessToken`. This means that any
Azure access token can be automatically refreshed, even if the user has not
signed in via Azure.
- 6a900951336: Add common identify resolvers for `oidc` auth provider.
- a0ef1ec7349: Export Azure Easy Auth provider so it can actually be used.
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/types@1.0.2
- @backstage/plugin-auth-node@0.2.13-next.2
## 0.18.2-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.0
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/types@1.0.2
- @backstage/plugin-auth-node@0.2.13-next.2
## 0.18.2-next.1
### Patch Changes
+23 -1
View File
@@ -229,6 +229,12 @@ export const defaultAuthProviderFactories: {
[providerId: string]: AuthProviderFactory;
};
// @public (undocumented)
export type EasyAuthResult = {
fullProfile: Profile;
accessToken?: string;
};
// @public (undocumented)
export const encodeState: (state: OAuthState) => string;
@@ -641,7 +647,10 @@ export const providers: Readonly<{
}
| undefined,
) => AuthProviderFactory;
resolvers: never;
resolvers: Readonly<{
emailLocalPartMatchingUserEntityName: () => SignInResolver<unknown>;
emailMatchingUserEntityProfileEmail: () => SignInResolver<unknown>;
}>;
}>;
okta: Readonly<{
create: (
@@ -694,6 +703,19 @@ export const providers: Readonly<{
nameIdMatchingUserEntityName(): SignInResolver<SamlAuthResult>;
}>;
}>;
easyAuth: Readonly<{
create: (
options?:
| {
authHandler?: AuthHandler<EasyAuthResult> | undefined;
signIn: {
resolver: SignInResolver<EasyAuthResult>;
};
}
| undefined,
) => AuthProviderFactory;
resolvers: never;
}>;
}>;
// @public (undocumented)
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend",
"description": "A Backstage backend plugin that handles authentication",
"version": "0.18.2-next.1",
"version": "0.18.2-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -15,4 +15,4 @@
*/
export { easyAuth } from './provider';
export type { EasyAuthResponse } from './provider';
export type { EasyAuthResult } from './provider';
@@ -38,6 +38,7 @@ type Options = {
resolverContext: AuthResolverContext;
};
/** @public */
export type EasyAuthResult = {
fullProfile: Profile;
accessToken?: string;
@@ -15,6 +15,7 @@
*/
export type { AwsAlbResult } from './aws-alb';
export type { EasyAuthResult } from './azure-easyauth';
export type {
BitbucketOAuthResult,
BitbucketPassportProfile,
@@ -0,0 +1,90 @@
/*
* 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 { FakeMicrosoftAPI } from './fake';
describe('FakeMicrosoftAPI', () => {
const api = new FakeMicrosoftAPI();
describe('#token', () => {
it('exchanges auth codes', () => {
const { access_token } = api.token(
new URLSearchParams({
grant_type: 'authorization_code',
code: api.generateAuthCode('User.Read'),
}),
);
expect(api.tokenHasScope(access_token, 'User.Read')).toBe(true);
});
it('supports scopes for the first requested audience only', () => {
const { access_token } = api.token(
new URLSearchParams({
grant_type: 'authorization_code',
code: api.generateAuthCode('someaudience/somescope User.Read'),
}),
);
expect(api.tokenHasScope(access_token, 'User.Read')).toBe(false);
});
it('special openid scopes do not count towards the 1-audience limit', () => {
const { access_token } = api.token(
new URLSearchParams({
grant_type: 'authorization_code',
code: api.generateAuthCode('openid offline_access User.Read'),
}),
);
expect(api.tokenHasScope(access_token, 'User.Read')).toBe(true);
});
it('refreshes tokens', () => {
const { access_token } = api.token(
new URLSearchParams({
grant_type: 'refresh_token',
refresh_token: api.generateRefreshToken(
'email openid profile User.Read',
),
}),
);
expect(
api.tokenHasScope(access_token, 'email openid profile User.Read'),
).toBe(true);
});
it('requires `openid` scope for ID token', () => {
const { id_token } = api.token(
new URLSearchParams({
grant_type: 'authorization_code',
code: api.generateAuthCode('User.Read'),
}),
);
expect(id_token).toBeUndefined();
});
it('requires `offline_access` scope for refresh token', () => {
const { refresh_token } = api.token(
new URLSearchParams({
grant_type: 'authorization_code',
code: api.generateAuthCode('User.Read'),
}),
);
expect(refresh_token).toBeUndefined();
});
});
});
@@ -0,0 +1,126 @@
/*
* 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 { decodeJwt } from 'jose';
type Claims = { aud: string; scp: string };
export class FakeMicrosoftAPI {
generateAccessToken(scope: string): string {
return this.tokenWithClaims(this.allClaimsForScope(scope)).access_token;
}
generateAuthCode(scope: string): string {
return this.encodeClaims(this.allClaimsForScope(scope));
}
generateRefreshToken(scope: string): string {
return this.encodeClaims(this.allClaimsForScope(scope));
}
token(formData: URLSearchParams): {
access_token: string;
scope: string;
refresh_token?: string;
id_token?: string;
} {
const scopeParameter = formData.get('scope');
const claims =
(scopeParameter && this.allClaimsForScope(scopeParameter)) ??
formData.get('grant_type') === 'refresh_token'
? this.decodeClaims(formData.get('refresh_token')!)
: this.decodeClaims(formData.get('code')!);
return {
...this.tokenWithClaims(claims),
...(this.hasScope(claims, 'offline_access') && {
refresh_token: this.encodeClaims(claims),
}),
...(this.hasScope(claims, 'openid') && {
id_token: 'header.e30K.microsoft',
}),
};
}
tokenHasScope(token: string, scope: string): boolean {
const { aud, scp } = decodeJwt(token);
return this.hasScope({ aud: aud as string, scp: scp as string }, scope);
}
private tokenWithClaims(claims: Claims): {
access_token: string;
scope: string;
} {
const filteredClaims = {
...claims,
scp: claims.scp
.split(' ')
.filter(s => s !== 'offline_access')
.join(' '),
};
return {
access_token: `header.${Buffer.from(
JSON.stringify(filteredClaims),
).toString('base64')}.signature`,
scope: this.scopeFromClaims(filteredClaims),
};
}
private allClaimsForScope(scope: string): Claims {
const scopes = scope.split(' ').map(this.parseScope);
const firstAudience = scopes
.map(({ aud }) => aud)
.find(aud => aud !== 'openid');
return {
aud: firstAudience ?? '00000003-0000-0000-c000-000000000000',
scp: scopes
.filter(({ aud }) => aud === 'openid' || aud === firstAudience)
.map(({ scp }) => scp)
.join(' '),
};
}
// auth codes and refresh tokens in this fake system are base64-encoded JSON
// strings of claims
private encodeClaims(claims: Claims): string {
return Buffer.from(JSON.stringify(claims)).toString('base64');
}
private decodeClaims(encoded: string): Claims {
return JSON.parse(Buffer.from(encoded, 'base64').toString());
}
private hasScope(claims: Claims, scope: string): boolean {
return this.scopeFromClaims(claims).includes(scope);
}
private parseScope(s: string): Claims {
if (s.includes('/')) {
const [aud, scp] = s.split('/');
return { aud, scp };
}
switch (s) {
case 'email':
case 'openid':
case 'offline_access':
case 'profile': {
return { aud: 'openid', scp: s };
}
default:
return { aud: '00000003-0000-0000-c000-000000000000', scp: s };
}
}
private scopeFromClaims(claims: Claims): string {
return claims.scp
.split(' ')
.map(this.parseScope)
.map(({ aud, scp }) =>
aud === 'openid' ||
claims.aud === '00000003-0000-0000-c000-000000000000'
? scp
: `${claims.aud}/${scp}`,
)
.join(' ');
}
}
@@ -14,145 +14,423 @@
* limitations under the License.
*/
import { MicrosoftAuthProvider } from './provider';
import * as helpers from '../../lib/passport/PassportStrategyHelper';
import { OAuthResult } from '../../lib/oauth';
import { microsoft } from './provider';
import { getVoidLogger } from '@backstage/backend-common';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { AuthResolverContext } from '../types';
import { AuthProviderRouteHandlers, AuthResolverContext } from '../types';
import express from 'express';
import crypto from 'crypto';
import { FakeMicrosoftAPI } from './__testUtils__/fake';
jest.mock('../../lib/passport/PassportStrategyHelper', () => {
return {
executeFrameHandlerStrategy: jest.fn(),
};
});
describe('MicrosoftAuthProvider', () => {
const nonce = 'AAAAAAAAAAAAAAAAAAAAAA=='; // 16 bytes of zeros in base64
const state = Buffer.from(
`nonce=${encodeURIComponent(nonce)}&env=development`,
).toString('hex');
const mockFrameHandler = jest.spyOn(
helpers,
'executeFrameHandlerStrategy',
) as unknown as jest.MockedFunction<
() => Promise<{ result: OAuthResult; privateInfo: any }>
>;
const server = setupServer();
const microsoftApi = new FakeMicrosoftAPI();
let provider: AuthProviderRouteHandlers;
let response: jest.Mocked<express.Response>;
const mockResult = {
result: {
fullProfile: {
emails: [
{
type: 'work',
value: 'conrad@example.com',
},
],
displayName: 'Conrad',
name: {
familyName: 'Ribas',
givenName: 'Francisco',
setupRequestMockHandlers(server);
beforeEach(() => {
provider = microsoft.create({
signIn: {
resolver: microsoft.resolvers.emailMatchingUserEntityAnnotation(),
},
id: 'conrad',
provider: 'microsoft',
photos: [
{
value: 'some-data',
})({
providerId: 'microsoft',
globalConfig: {
baseUrl: 'http://backstage.test/api/auth',
appUrl: 'http://backstage.test',
isOriginAllowed: _ => true,
},
config: new ConfigReader({
development: {
tenantId: 'tenantId',
clientId: 'clientId',
clientSecret: 'clientSecret',
},
],
},
params: {
id_token: 'idToken',
scope: 'scope',
expires_in: 123,
},
accessToken: 'accessToken',
},
privateInfo: {
refreshToken: 'wacka',
},
};
}),
logger: getVoidLogger(),
resolverContext: {
issueToken: jest.fn(),
findCatalogUser: jest.fn(),
signInWithCatalogUser: _ =>
Promise.resolve({
token: 'header.e30K.backstage',
}),
} as AuthResolverContext,
}) as AuthProviderRouteHandlers;
const server = setupServer();
setupRequestMockHandlers(server);
const setupHandlers = () => {
server.use(
rest.get(
'https://graph.microsoft.com/v1.0/me/photos/*',
async (_, res, ctx) => {
const imageBuffer = new Uint8Array([104, 111, 119, 100, 121]).buffer;
server.use(
rest.post(
'https://login.microsoftonline.com/tenantId/oauth2/v2.0/token',
async (req, res, ctx) => {
return res(
ctx.json({
...microsoftApi.token(new URLSearchParams(await req.text())),
token_type: 'Bearer',
expires_in: 123,
ext_expires_in: 123,
}),
);
},
),
rest.get('https://graph.microsoft.com/v1.0/me/', (req, res, ctx) => {
if (
!microsoftApi.tokenHasScope(
req.headers.get('authorization')!.replace(/^Bearer /, ''),
'User.Read',
)
) {
return res(ctx.status(403));
}
return res(
ctx.set('Content-Length', imageBuffer.byteLength.toString()),
ctx.set('Content-Type', 'image/jpeg'),
ctx.body(imageBuffer),
ctx.json({
id: 'conrad',
displayName: 'Conrad',
surname: 'Ribas',
givenName: 'Francisco',
mail: 'conrad@example.com',
}),
);
},
),
);
};
describe('createMicrosoftProvider', () => {
it('should auth', async () => {
setupHandlers();
const provider = new MicrosoftAuthProvider({
logger: getVoidLogger(),
resolverContext: {} as AuthResolverContext,
authHandler: async ({ fullProfile }) => ({
profile: {
email: fullProfile.emails![0]!.value,
displayName: fullProfile.displayName,
picture: 'http://microsoft.com/lols',
},
}),
clientId: 'mock',
clientSecret: 'mock',
callbackUrl: 'mock',
rest.get(
'https://graph.microsoft.com/v1.0/me/photos/*',
async (req, res, ctx) => {
if (
!microsoftApi.tokenHasScope(
req.headers.get('authorization')!.replace(/^Bearer /, ''),
'User.Read',
)
) {
return res(ctx.status(403));
}
const imageBuffer = new Uint8Array([104, 111, 119, 100, 121]).buffer;
return res(
ctx.set('Content-Length', imageBuffer.byteLength.toString()),
ctx.set('Content-Type', 'image/jpeg'),
ctx.body(imageBuffer),
);
},
),
);
response = {
cookie: jest.fn(),
end: jest.fn(),
json: jest.fn(),
setHeader: jest.fn(),
status: jest.fn(),
} as unknown as jest.Mocked<express.Response>;
response.status.mockReturnValue(response);
});
describe('#start', () => {
const randomBytes = jest.spyOn(
crypto,
'randomBytes',
) as unknown as jest.MockedFunction<(size: number) => Buffer>;
afterEach(() => {
randomBytes.mockRestore();
});
mockFrameHandler.mockResolvedValueOnce(mockResult);
const { response } = await provider.handler({} as any);
expect(response).toEqual({
providerInfo: {
accessToken: 'accessToken',
expiresInSeconds: 123,
idToken: 'idToken',
scope: 'scope',
},
profile: {
email: 'conrad@example.com',
displayName: 'Conrad',
picture: 'http://microsoft.com/lols',
},
it('redirects to authorize URL', async () => {
randomBytes.mockReturnValue(Buffer.from(nonce, 'base64'));
await provider.start(
{
query: {
env: 'development',
scope: 'email openid profile User.Read',
},
} as unknown as express.Request,
response,
);
expect(response.setHeader).toHaveBeenCalledWith(
'Location',
'https://login.microsoftonline.com/tenantId/oauth2/v2.0/authorize' +
'?response_type=code' +
`&redirect_uri=${encodeURIComponent(
'http://backstage.test/api/auth/microsoft/handler/frame',
)}` +
`&scope=${encodeURIComponent('email openid profile User.Read')}` +
`&state=${state}` +
'&client_id=clientId',
);
});
});
it('should return the base64 encoded photo data of the profile', async () => {
setupHandlers();
const provider = new MicrosoftAuthProvider({
logger: getVoidLogger(),
resolverContext: {} as AuthResolverContext,
authHandler: async ({ fullProfile }) => ({
profile: {
email: fullProfile.emails![0]!.value,
displayName: fullProfile.displayName,
picture: 'http://microsoft.com/lols',
},
}),
clientId: 'mock',
clientSecret: 'mock',
callbackUrl: 'mock',
// define resolver to return user `info` for photo validation
signInResolver: async (info, _) => {
return {
id: 'user.name',
token: 'token',
info: info,
};
},
describe('#handle', () => {
it('returns provider info and profile with photo data', async () => {
await provider.frameHandler(
{
query: {
env: 'development',
code: microsoftApi.generateAuthCode(
'email openid profile User.Read',
),
state,
},
cookies: {
'microsoft-nonce': nonce,
},
} as unknown as express.Request,
response,
);
expect(response.end).toHaveBeenCalledWith(
expect.stringContaining(
encodeURIComponent(
JSON.stringify({
type: 'authorization_response',
response: {
providerInfo: {
accessToken: microsoftApi.generateAccessToken(
'email openid profile User.Read',
),
scope: 'email openid profile User.Read',
expiresInSeconds: 123,
idToken: 'header.e30K.microsoft',
},
profile: {
email: 'conrad@example.com',
picture: 'data:image/jpeg;base64,aG93ZHk=',
displayName: 'Conrad',
},
backstageIdentity: {
token: 'header.e30K.backstage',
identity: { type: 'user', ownershipEntityRefs: [] },
},
},
}),
),
),
);
});
it('returns access token for non-microsoft graph scope', async () => {
await provider.frameHandler(
{
query: {
env: 'development',
code: microsoftApi.generateAuthCode('aks-audience/user.read'),
state,
},
cookies: {
'microsoft-nonce': nonce,
},
} as unknown as express.Request,
response,
);
expect(response.end).toHaveBeenCalledWith(
expect.stringContaining(
encodeURIComponent(
JSON.stringify({
type: 'authorization_response',
response: {
providerInfo: {
accessToken: microsoftApi.generateAccessToken(
'aks-audience/user.read',
),
scope: 'aks-audience/user.read',
expiresInSeconds: 123,
},
profile: {},
},
}),
),
),
);
});
it('sets refresh token', async () => {
await provider.frameHandler(
{
query: {
env: 'development',
code: microsoftApi.generateAuthCode(
'email offline_access openid profile User.Read',
),
state,
},
cookies: {
'microsoft-nonce': nonce,
},
} as unknown as express.Request,
response,
);
expect(response.cookie).toHaveBeenCalledWith(
'microsoft-refresh-token',
microsoftApi.generateRefreshToken(
'email offline_access openid profile User.Read',
),
{
domain: 'backstage.test',
httpOnly: true,
maxAge: 86400000000,
path: '/api/auth/microsoft',
sameSite: 'lax',
secure: false,
},
);
});
it('omits photo data when fetching it fails', async () => {
server.use(
rest.get('https://graph.microsoft.com/v1.0/me/photos/*', (_, res) =>
res.networkError('remote hung up'),
),
);
await provider.frameHandler(
{
query: {
env: 'development',
code: microsoftApi.generateAuthCode(
'email openid profile User.Read',
),
state,
},
cookies: {
'microsoft-nonce': nonce,
},
} as unknown as express.Request,
response,
);
expect(response.end).toHaveBeenCalledWith(
expect.stringContaining(
encodeURIComponent(
JSON.stringify({
type: 'authorization_response',
response: {
providerInfo: {
accessToken: microsoftApi.generateAccessToken(
'email openid profile User.Read',
),
scope: 'email openid profile User.Read',
expiresInSeconds: 123,
idToken: 'header.e30K.microsoft',
},
profile: {
email: 'conrad@example.com',
displayName: 'Conrad',
},
backstageIdentity: {
token: 'header.e30K.backstage',
identity: { type: 'user', ownershipEntityRefs: [] },
},
},
}),
),
),
);
});
});
describe('#refresh', () => {
it('returns provider info and profile with photo data', async () => {
await provider.refresh!(
{
query: {
env: 'development',
scope: 'email openid profile User.Read',
},
header: jest.fn(_ => 'XMLHttpRequest'),
cookies: {
'microsoft-refresh-token': microsoftApi.generateRefreshToken(
'email openid profile User.Read',
),
},
get: jest.fn(),
} as unknown as express.Request,
response,
);
expect(response.json).toHaveBeenCalledWith(
expect.objectContaining({
providerInfo: {
accessToken: microsoftApi.generateAccessToken(
'email openid profile User.Read',
),
scope: 'email openid profile User.Read',
expiresInSeconds: 123,
idToken: 'header.e30K.microsoft',
},
profile: {
email: 'conrad@example.com',
picture: 'data:image/jpeg;base64,aG93ZHk=',
displayName: 'Conrad',
},
}),
);
});
it('returns access token for non-microsoft graph scope', async () => {
await provider.refresh!(
{
query: {
env: 'development',
scope: 'aks-audience/user.read',
},
header: jest.fn(_ => 'XMLHttpRequest'),
cookies: {
'microsoft-refresh-token': microsoftApi.generateRefreshToken(
'aks-audience/user.read',
),
},
get: jest.fn(),
} as unknown as express.Request,
response,
);
expect(response.json).toHaveBeenCalledWith({
providerInfo: {
accessToken: microsoftApi.generateAccessToken(
'aks-audience/user.read',
),
expiresInSeconds: 123,
scope: 'aks-audience/user.read',
},
profile: {},
});
});
it('returns backstage identity', async () => {
await provider.refresh!(
{
query: {
env: 'development',
scope: 'email openid profile User.Read',
},
header: jest.fn(_ => 'XMLHttpRequest'),
cookies: {
'microsoft-refresh-token': microsoftApi.generateRefreshToken(
'email openid profile User.Read',
),
},
get: jest.fn(),
} as unknown as express.Request,
response,
);
expect(response.json).toHaveBeenCalledWith(
expect.objectContaining({
backstageIdentity: expect.objectContaining({
token: 'header.e30K.backstage',
}),
}),
);
});
mockFrameHandler.mockResolvedValueOnce(mockResult);
const { response } = await provider.handler({} as any);
const overloadedIdentity = response.backstageIdentity as any;
const photo = overloadedIdentity.info.result.fullProfile.photos[0];
expect(photo.value).toEqual('data:image/jpeg;base64,aG93ZHk=');
});
});
@@ -49,6 +49,8 @@ import {
} from '../resolvers';
import { Logger } from 'winston';
import fetch from 'node-fetch';
import { decodeJwt } from 'jose';
import { Profile as PassportProfile } from 'passport';
const BACKSTAGE_SESSION_EXPIRATION = 3600;
@@ -86,6 +88,12 @@ export class MicrosoftAuthProvider implements OAuthHandlers {
authorizationURL: options.authorizationUrl,
tokenURL: options.tokenUrl,
passReqToCallback: false,
skipUserProfile: (
accessToken: string,
done: (err: unknown, skip: boolean) => void,
) => {
done(null, this.skipUserProfile(accessToken));
},
},
(
accessToken: any,
@@ -99,6 +107,17 @@ export class MicrosoftAuthProvider implements OAuthHandlers {
);
}
private skipUserProfile = (accessToken: string): boolean => {
const { aud, scp } = decodeJwt(accessToken);
const hasGraphReadScope =
aud === '00000003-0000-0000-c000-000000000000' &&
(scp as string)
.split(' ')
.map(s => s.toLowerCase())
.includes('user.read');
return !hasGraphReadScope;
};
async start(req: OAuthStartRequest): Promise<OAuthStartResponse> {
return await executeRedirectStrategy(req, this._strategy, {
scope: req.scope,
@@ -126,53 +145,62 @@ export class MicrosoftAuthProvider implements OAuthHandlers {
req.scope,
);
const fullProfile = await executeFetchUserProfileStrategy(
this._strategy,
accessToken,
);
return {
response: await this.handleResult({
fullProfile,
params,
accessToken,
...(!this.skipUserProfile(accessToken) && {
fullProfile: await executeFetchUserProfileStrategy(
this._strategy,
accessToken,
),
}),
}),
refreshToken,
};
}
private async handleResult(result: OAuthResult) {
const photo = await this.getUserPhoto(result.accessToken);
result.fullProfile.photos = photo ? [{ value: photo }] : undefined;
const { profile } = await this.authHandler(result, this.resolverContext);
private async handleResult(result: {
fullProfile?: PassportProfile;
params: {
id_token?: string;
scope: string;
expires_in: number;
};
accessToken: string;
refreshToken?: string;
}): Promise<OAuthResponse> {
let profile = {};
if (result.fullProfile) {
const photo = await this.getUserPhoto(result.accessToken);
result.fullProfile.photos = photo ? [{ value: photo }] : undefined;
({ profile } = await this.authHandler(
result as OAuthResult,
this.resolverContext,
));
}
const expiresInSeconds =
result.params.expires_in === undefined
? BACKSTAGE_SESSION_EXPIRATION
: Math.min(result.params.expires_in, BACKSTAGE_SESSION_EXPIRATION);
const response: OAuthResponse = {
return {
providerInfo: {
idToken: result.params.id_token,
accessToken: result.accessToken,
scope: result.params.scope,
expiresInSeconds,
...{ idToken: result.params.id_token },
},
profile,
...(result.fullProfile &&
this.signInResolver && {
backstageIdentity: await this.signInResolver(
{ result: result as OAuthResult, profile },
this.resolverContext,
),
}),
};
if (this.signInResolver) {
response.backstageIdentity = await this.signInResolver(
{
result,
profile,
},
this.resolverContext,
);
}
return response;
}
private async getUserPhoto(accessToken: string): Promise<string | undefined> {
@@ -236,7 +264,7 @@ export const microsoft = createAuthProviderIntegration({
const authHandler: AuthHandler<OAuthResult> = options?.authHandler
? options.authHandler
: async ({ fullProfile, params }) => ({
profile: makeProfileInfo(fullProfile, params.id_token),
profile: makeProfileInfo(fullProfile ?? {}, params.id_token),
});
const provider = new MicrosoftAuthProvider({
@@ -44,6 +44,10 @@ import {
SignInResolver,
} from '../types';
import { createAuthProviderIntegration } from '../createAuthProviderIntegration';
import {
commonByEmailLocalPartResolver,
commonByEmailResolver,
} from '../resolvers';
type PrivateInfo = {
refreshToken?: string;
@@ -255,4 +259,14 @@ export const oidc = createAuthProviderIntegration({
});
});
},
resolvers: {
/**
* Looks up the user by matching their email local part to the entity name.
*/
emailLocalPartMatchingUserEntityName: () => commonByEmailLocalPartResolver,
/**
* Looks up the user by matching their email to the entity email.
*/
emailMatchingUserEntityProfileEmail: () => commonByEmailResolver,
},
});
@@ -32,6 +32,7 @@ import { onelogin } from './onelogin';
import { saml } from './saml';
import { AuthProviderFactory } from './types';
import { bitbucketServer } from './bitbucketServer';
import { easyAuth } from './azure-easyauth';
/**
* All built-in auth provider integrations.
@@ -56,6 +57,7 @@ export const providers = Object.freeze({
okta,
onelogin,
saml,
easyAuth,
});
/**
@@ -73,6 +75,7 @@ export const defaultAuthProviderFactories: {
okta: okta.create(),
auth0: auth0.create(),
microsoft: microsoft.create(),
easyAuth: easyAuth.create(),
oauth2: oauth2.create(),
oidc: oidc.create(),
onelogin: onelogin.create(),
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-node
## 0.2.13-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
## 0.2.13-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-node",
"version": "0.2.13-next.1",
"version": "0.2.13-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-devops-backend
## 0.3.23-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/config@1.0.7
- @backstage/plugin-azure-devops-common@0.3.0
## 0.3.23-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops-backend",
"version": "0.3.23-next.1",
"version": "0.3.23-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+26
View File
@@ -1,5 +1,31 @@
# @backstage/plugin-azure-devops
## 0.2.8-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/errors@1.1.5
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-azure-devops-common@0.3.0
## 0.2.8-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/errors@1.1.5
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-azure-devops-common@0.3.0
## 0.2.8-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops",
"version": "0.2.8-next.1",
"version": "0.2.8-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-sites-backend
## 0.1.6-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/config@1.0.7
- @backstage/plugin-azure-sites-common@0.1.0
## 0.1.6-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-sites-backend",
"version": "0.1.6-next.1",
"version": "0.1.6-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+24
View File
@@ -1,5 +1,29 @@
# @backstage/plugin-azure-sites
## 0.1.6-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-azure-sites-common@0.1.0
## 0.1.6-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-azure-sites-common@0.1.0
## 0.1.6-next.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-sites",
"version": "0.1.6-next.1",
"version": "0.1.6-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+22
View File
@@ -1,5 +1,27 @@
# @backstage/plugin-badges-backend
## 0.1.38-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
## 0.1.38-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.0
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
## 0.1.38-next.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges-backend",
"description": "A Backstage backend plugin that generates README badges for your entities",
"version": "0.1.38-next.1",
"version": "0.1.38-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+24
View File
@@ -1,5 +1,29 @@
# @backstage/plugin-badges
## 0.2.41-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/errors@1.1.5
- @backstage/theme@0.2.19-next.0
## 0.2.41-next.2
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/errors@1.1.5
- @backstage/theme@0.2.19-next.0
## 0.2.41-next.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges",
"description": "A Backstage plugin that generates README badges for your entities",
"version": "0.2.41-next.1",
"version": "0.2.41-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-bazaar-backend
## 0.2.7-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/plugin-auth-node@0.2.13-next.2
## 0.2.7-next.1
### Patch Changes
@@ -0,0 +1,37 @@
/*
* Copyright 2022 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// @ts-check
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.up = async function up(knex) {
await knex.schema.alterTable('metadata', table => {
table.text('docs').comment('The link to the project docs (optional)');
});
};
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = async function down(knex) {
await knex.schema.alterTable('metadata', table => {
table.dropColumn('docs');
});
};
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar-backend",
"version": "0.2.7-next.1",
"version": "0.2.7-next.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,6 +29,7 @@ const bazaarProject: any = {
endDate: null,
size: 'small',
responsible: 'r',
docs: '',
};
jest.setTimeout(60_000);
@@ -75,6 +76,7 @@ describe('DatabaseHandler', () => {
end_date: bazaarProject.endDate,
size: bazaarProject.size,
responsible: bazaarProject.responsible,
docs: bazaarProject.docs,
});
// Add a member to the project
@@ -94,6 +96,7 @@ describe('DatabaseHandler', () => {
expect(res[0].end_date).toEqual(null);
expect(res[0].size).toEqual('small');
expect(res[0].responsible).toEqual('r');
expect(res[0].docs).toEqual('');
expect(
res[0].members_count === '1' || res[0].members_count === 1,
).toBeTruthy();
@@ -61,6 +61,7 @@ export class DatabaseHandler {
'metadata.start_date',
'metadata.end_date',
'metadata.responsible',
'metadata.docs',
];
async getMembers(id: string) {
@@ -120,6 +121,7 @@ export class DatabaseHandler {
entityRef,
community,
description,
docs,
status,
size,
startDate,
@@ -133,6 +135,7 @@ export class DatabaseHandler {
entity_ref: entityRef,
community,
description,
docs,
status,
updated_at: new Date().toISOString(),
size,
@@ -150,6 +153,7 @@ export class DatabaseHandler {
entityRef,
community,
description,
docs,
status,
size,
startDate,
@@ -162,6 +166,7 @@ export class DatabaseHandler {
entity_ref: entityRef,
description,
community,
docs,
status,
updated_at: new Date().toISOString(),
size,
+30
View File
@@ -1,5 +1,35 @@
# @backstage/plugin-bazaar
## 0.2.7-next.3
### Patch Changes
- Updated dependencies
- @backstage/cli@0.22.6-next.3
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/catalog-client@1.4.1-next.1
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/errors@1.1.5
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-catalog@1.10.0-next.3
## 0.2.7-next.2
### Patch Changes
- Updated dependencies
- @backstage/cli@0.22.6-next.2
- @backstage/catalog-client@1.4.1-next.0
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/errors@1.1.5
- @backstage/theme@0.2.19-next.0
- @backstage/plugin-catalog@1.10.0-next.2
## 0.2.7-next.1
### Patch Changes
+1
View File
@@ -127,6 +127,7 @@ The other fields are:
- project - link Bazaar project to existing entity in the catalog
- community link - link to where the project members can communicate, e.g. Teams or Discord link
- docs link - link to visit the documentation of the project
- start date
- end date
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar",
"version": "0.2.7-next.1",
"version": "0.2.7-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -45,6 +45,7 @@ export const AddProjectDialog = ({
title: '',
community: '',
description: '',
docs: '',
status: 'proposed' as Status,
size: 'medium' as Size,
responsible: '',
@@ -26,6 +26,7 @@ import ChatIcon from '@material-ui/icons/Chat';
import PersonAddIcon from '@material-ui/icons/PersonAdd';
import DashboardIcon from '@material-ui/icons/Dashboard';
import LinkOffIcon from '@material-ui/icons/LinkOff';
import Description from '@material-ui/icons/Description';
import { EditProjectDialog } from '../EditProjectDialog';
import { useApi, identityApiRef } from '@backstage/core-plugin-api';
import { BazaarProject, Member } from '../../types';
@@ -128,6 +129,12 @@ export const EntityBazaarInfoContent = ({
href: bazaarProject?.community,
disabled: bazaarProject?.community === '' || !isMember,
},
{
label: 'Docs',
icon: <Description />,
href: bazaarProject?.docs,
disabled: bazaarProject?.docs === null || bazaarProject?.docs === '',
},
];
const handleEditClose = () => {
@@ -34,6 +34,7 @@ import InsertLinkIcon from '@material-ui/icons/InsertLink';
import DashboardIcon from '@material-ui/icons/Dashboard';
import CloseIcon from '@material-ui/icons/Close';
import LinkOffIcon from '@material-ui/icons/LinkOff';
import Description from '@material-ui/icons/Description';
import { EditProjectDialog } from '../EditProjectDialog';
import ExitToAppIcon from '@material-ui/icons/ExitToApp';
import {
@@ -197,6 +198,13 @@ export const HomePageBazaarInfoCard = ({
href: bazaarProject.value?.community,
disabled: !bazaarProject.value?.community || !isMember,
},
{
label: 'Docs',
icon: <Description />,
href: bazaarProject.value?.docs,
disabled:
bazaarProject.value?.docs === null || bazaarProject.value?.docs === '',
},
];
const handleUnlinkSubmit = async () => {
@@ -30,7 +30,7 @@ type Rules = {
};
type Props = {
inputType: 'description' | 'community' | 'responsible' | 'title';
inputType: 'description' | 'community' | 'responsible' | 'title' | 'docs';
error?: FieldError | undefined;
control: Control<FormValues, object>;
helperText?: string;
@@ -144,6 +144,18 @@ export const ProjectDialog = ({
placeholder="Community link to e.g. Teams or Discord"
/>
<InputField
error={errors.docs}
control={control}
rules={{
required: false,
pattern: RegExp('^(https?)://'),
}}
inputType="docs"
helperText="Please enter a link starting with http/https"
placeholder="Project docs link"
/>
<DoubleDateSelector setValue={setValue} control={control} />
</DialogContent>
+2
View File
@@ -39,6 +39,7 @@ export type BazaarProject = {
startDate?: string | null;
endDate?: string | null;
responsible: string;
docs: string;
};
export type FormValues = {
@@ -50,4 +51,5 @@ export type FormValues = {
startDate?: string | null;
endDate?: string | null;
responsible: string;
docs: string;
};
+1
View File
@@ -30,6 +30,7 @@ export const parseBazaarProject = (metadata: any): BazaarProject => {
startDate: metadata.start_date,
endDate: metadata.end_date,
responsible: metadata.responsible,
docs: metadata.docs,
} as BazaarProject;
};
+23
View File
@@ -1,5 +1,28 @@
# @backstage/plugin-bitrise
## 0.1.44-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.5.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/core-components@0.13.0-next.3
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/theme@0.2.19-next.0
## 0.1.44-next.2
### Patch Changes
- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`.
- Updated dependencies
- @backstage/core-components@0.12.6-next.2
- @backstage/plugin-catalog-react@1.4.1-next.2
- @backstage/core-plugin-api@1.5.1-next.1
- @backstage/catalog-model@1.2.1
- @backstage/theme@0.2.19-next.0
## 0.1.44-next.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-bitrise",
"description": "A Backstage plugin that integrates towards Bitrise",
"version": "0.1.44-next.1",
"version": "0.1.44-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,39 @@
# @backstage/plugin-catalog-backend-module-aws
## 0.1.18-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.1
- @backstage/plugin-catalog-node@1.3.5-next.3
- @backstage/plugin-kubernetes-common@0.6.2-next.2
## 0.1.18-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
- @backstage/plugin-kubernetes-common@0.6.2-next.1
## 0.1.18-next.1
### Patch Changes
@@ -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.18-next.1",
"version": "0.1.18-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,38 @@
# @backstage/plugin-catalog-backend-module-azure
## 0.1.15-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.1
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.1.15-next.2
### Patch Changes
- 62a725e3a94: Use the `LocationSpec` type from the `catalog-common` package in place of the deprecated `LocationSpec` from the `catalog-node` package.
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.1.15-next.1
### Patch Changes
@@ -8,7 +8,7 @@ import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
import { EntityProvider } from '@backstage/plugin-catalog-node';
import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import { Logger } from 'winston';
import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { ScmIntegrationRegistry } from '@backstage/integration';
@@ -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.15-next.1",
"version": "0.1.15-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -52,6 +52,7 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/integration": "workspace:^",
"@backstage/plugin-catalog-common": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
"@backstage/types": "workspace:^",
"lodash": "^4.17.21",
@@ -16,7 +16,7 @@
import { getVoidLogger } from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { LocationSpec } from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import {
AzureDevOpsDiscoveryProcessor,
parseUrl,
@@ -22,9 +22,9 @@ import {
import {
CatalogProcessor,
CatalogProcessorEmit,
LocationSpec,
processingResult,
} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import { Logger } from 'winston';
import { codeSearch } from '../lib';
@@ -20,9 +20,9 @@ import { AzureIntegration, ScmIntegrations } from '@backstage/integration';
import {
EntityProvider,
EntityProviderConnection,
LocationSpec,
locationSpecToLocationEntity,
} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
import { readAzureDevOpsConfigs } from './config';
import { Logger } from 'winston';
import { AzureDevOpsConfig } from './types';
@@ -1,5 +1,39 @@
# @backstage/plugin-catalog-backend-module-bitbucket-cloud
## 0.1.11-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-client@1.4.1-next.1
- @backstage/config@1.0.7
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0
- @backstage/plugin-catalog-common@1.0.13-next.1
- @backstage/plugin-catalog-node@1.3.5-next.3
- @backstage/plugin-events-node@0.2.5-next.2
## 0.1.11-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.0
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0
- @backstage/plugin-catalog-common@1.0.13-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
- @backstage/plugin-events-node@0.2.5-next.2
## 0.1.11-next.1
### Patch Changes
@@ -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.11-next.1",
"version": "0.1.11-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,33 @@
# @backstage/plugin-catalog-backend-module-bitbucket-server
## 0.1.9-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.1.9-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.1.9-next.1
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-server",
"version": "0.1.9-next.1",
"version": "0.1.9-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,33 @@
# @backstage/plugin-catalog-backend-module-bitbucket
## 0.2.11-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.2.11-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.2.11-next.1
### Patch Changes
@@ -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.11-next.1",
"version": "0.2.11-next.3",
"deprecated": true,
"main": "src/index.ts",
"types": "src/index.ts",
@@ -1,5 +1,33 @@
# @backstage/plugin-catalog-backend-module-gerrit
## 0.1.12-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.1.12-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.1.12-next.1
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-gerrit",
"version": "0.1.12-next.1",
"version": "0.1.12-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,43 @@
# @backstage/plugin-catalog-backend-module-github
## 0.2.7-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.9.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-client@1.4.1-next.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.1
- @backstage/plugin-catalog-node@1.3.5-next.3
- @backstage/plugin-events-node@0.2.5-next.2
## 0.2.7-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.8.1-next.2
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-client@1.4.1-next.0
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
- @backstage/plugin-events-node@0.2.5-next.2
## 0.2.7-next.1
### Patch Changes
@@ -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.7-next.1",
"version": "0.2.7-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,35 @@
# @backstage/plugin-catalog-backend-module-gitlab
## 0.2.0-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.2.0-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.2.0-next.1
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-gitlab",
"description": "A Backstage catalog backend module that helps integrate towards GitLab",
"version": "0.2.0-next.1",
"version": "0.2.0-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,37 @@
# @backstage/plugin-catalog-backend-module-incremental-ingestion
## 0.3.1-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.9.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/plugin-catalog-node@1.3.5-next.3
- @backstage/plugin-events-node@0.2.5-next.2
- @backstage/plugin-permission-common@0.7.5-next.0
## 0.3.1-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.8.1-next.2
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/plugin-catalog-node@1.3.5-next.2
- @backstage/plugin-events-node@0.2.5-next.2
- @backstage/plugin-permission-common@0.7.5-next.0
## 0.3.1-next.1
### Patch Changes
@@ -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.1-next.1",
"version": "0.3.1-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,31 @@
# @backstage/plugin-catalog-backend-module-ldap
## 0.5.11-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.1
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.5.11-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.5.11-next.1
### Patch Changes
@@ -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.11-next.1",
"version": "0.5.11-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,31 @@
# @backstage/plugin-catalog-backend-module-msgraph
## 0.5.3-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/plugin-catalog-common@1.0.13-next.1
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.5.3-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/plugin-catalog-common@1.0.13-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.5.3-next.1
### Patch Changes
@@ -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.3-next.1",
"version": "0.5.3-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,33 @@
# @backstage/plugin-catalog-backend-module-openapi
## 0.1.10-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.9.0-next.3
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/config@1.0.7
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.1
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.1.10-next.2
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-backend@1.8.1-next.2
- @backstage/backend-common@0.18.4-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/integration@1.4.4-next.0
- @backstage/types@1.0.2
- @backstage/plugin-catalog-common@1.0.13-next.0
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.1.10-next.1
### Patch Changes
@@ -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.10-next.1",
"version": "0.1.10-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,33 @@
# @backstage/plugin-catalog-backend-module-puppetdb
## 0.1.1-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.3.0-next.0
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/types@1.0.2
- @backstage/plugin-catalog-node@1.3.5-next.3
## 0.1.1-next.2
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.18.4-next.2
- @backstage/backend-plugin-api@0.5.1-next.2
- @backstage/backend-tasks@0.5.1-next.2
- @backstage/catalog-model@1.2.1
- @backstage/config@1.0.7
- @backstage/errors@1.1.5
- @backstage/types@1.0.2
- @backstage/plugin-catalog-node@1.3.5-next.2
## 0.1.1-next.1
### Patch Changes

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