Merge branch 'master' into mob/auth-origins

This commit is contained in:
Samira Mokaram
2021-08-12 13:43:45 +02:00
231 changed files with 5122 additions and 1051 deletions
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/backend-test-utils': patch
---
Make sure that the unique databases names generated by `TestDatabases.create()`
don't collide.
-18
View File
@@ -1,18 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Expose a new composable `TechDocsIndexPage` and a `DefaultTechDocsHome` with support for starring docs and filtering on owned, starred, owner, and tags.
You can migrate to the new UI view by making the following changes in your `App.tsx`:
```diff
- <Route path="/docs" element={<TechdocsPage />} />
+ <Route path="/docs" element={<TechDocsIndexPage />}>
+ <DefaultTechDocsHome />
+ </Route>
+ <Route
+ path="/docs/:namespace/:kind/:name/*"
+ element={<TechDocsReaderPage />}
+ />
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/backend-common': patch
---
Use a more informative error message when URL reading isn't allowed due to no reader matching the target URL.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Adds ability to send an ExternalId with the assume role request to AWS
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-scaffolder': patch
---
Added UI Schema support for array items for example, support EntityPicker within an array field
-22
View File
@@ -1,22 +0,0 @@
---
'@backstage/plugin-scaffolder': patch
---
- Adds a new field `EntityNamePicker` that can be used in scaffolder templates to accept and validate an entity name. This field is registered by default, and can be used in templates by setting the `ui:field` property to `EntityNamePicker`. If you've customized your scaffolder field extensions, you can include this one by adding it when registering the scaffolder route:
```diff
import {
ScaffolderFieldExtensions,
+ EntityNamePickerFieldExtension,
} from '@backstage/plugin-scaffolder';
<Route path="/create" element={<ScaffolderPage />}>
<ScaffolderFieldExtensions>
{/* ...custom field extensions... */}
+ <EntityNamePickerFieldExtension />
</ScaffolderFieldExtensions>
</Route>;
```
- Adds a new generic field `TextValuePicker` to be used when writing custom field extensions that use a standard UI with custom validation. An example of doing this can be found in `packages/app/src/components/scaffolder/customScaffolderExtensions.tsx`.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core-app-api': patch
---
Add support for serving the app with a base path other than `/`, which is enabled by including the path in `app.baseUrl`.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-sonarqube': minor
---
Use IdentityApi to provide Auth Token for SonarQubeClient Api calls
-25
View File
@@ -1,25 +0,0 @@
---
'@backstage/core-app-api': patch
'@backstage/core-components': patch
'@backstage/core-plugin-api': patch
'@backstage/dev-utils': patch
'@backstage/test-utils': patch
'@backstage/test-utils-core': patch
'@backstage/plugin-api-docs': patch
'@backstage/plugin-catalog': patch
'@backstage/plugin-catalog-import': patch
'@backstage/plugin-catalog-react': patch
'@backstage/plugin-cost-insights': patch
'@backstage/plugin-explore': patch
'@backstage/plugin-git-release-manager': patch
'@backstage/plugin-lighthouse': patch
'@backstage/plugin-pagerduty': patch
'@backstage/plugin-rollbar': patch
'@backstage/plugin-scaffolder': patch
'@backstage/plugin-search': patch
'@backstage/plugin-sentry': patch
'@backstage/plugin-tech-radar': patch
'@backstage/plugin-techdocs': patch
---
Switched `@types/react` dependency to request `*` rather than a specific version.
-12
View File
@@ -1,12 +0,0 @@
---
'@backstage/create-app': patch
---
Updated the index page redirect to work with apps served on a different base path than `/`.
To apply this change to an existing app, remove the `/` prefix from the target route in the `Navigate` element in `packages/app/src/App.tsx`:
```diff
-<Navigate key="/" to="/catalog" />
+<Navigate key="/" to="catalog" />
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-xcmetrics': patch
---
Enable browsing detailed build information such as host configuration, errors, warnings, metadata and a timeline for all targets
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/integration': patch
---
Adds an allow list of GitHub installations
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-techdocs': patch
---
Switch `EventSource` implementation with header support from a Node.js API-based one to an XHR-based one.
-18
View File
@@ -1,18 +0,0 @@
---
'@backstage/create-app': patch
---
Use new composable `TechDocsIndexPage` and `DefaultTechDocsHome`
Make the following changes to your `App.tsx` to migrate existing apps:
```diff
- <Route path="/docs" element={<TechdocsPage />} />
+ <Route path="/docs" element={<TechDocsIndexPage />}>
+ <DefaultTechDocsHome />
+ </Route>
+ <Route
+ path="/docs/:namespace/:kind/:name/*"
+ element={<TechDocsReaderPage />}
+ />
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-search-backend-module-elasticsearch': patch
---
Fix to allow optionally reading `auth` parameter for custom hosted ElasticSearch instances. Also remove `bearer` auth config since it's currently unsupported.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/plugin-search-backend-module-pg': patch
---
Add `plugin-search-backend-module-pg` providing a postgres based search engine.
See the [README of `search-backend-module-pg`](https://github.com/backstage/backstage/blob/master/plugins/search-backend-module-pg/README.md) for usage instructions.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/integration': patch
---
Remove repo restriction from GitHub credentials provider
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/cli': patch
'@backstage/create-app': patch
---
Migrate to using `webpack@5` 🎉
-34
View File
@@ -1,34 +0,0 @@
---
'@backstage/create-app': patch
---
Add a complete prettier setup to the created project. Prettier used to only be added as a dependency to create apps, but there wasn't a complete setup included that makes it easy to run prettier. That has now changed, and the new `prettier:check` command can be used to check the formatting of the files in your created project.
To apply this change to an existing app, a couple of changes need to be made.
Create a `.prettierignore` file at the root of your repository with the following contents:
```
dist
dist-types
coverage
.vscode
```
Next update the root `package.json` by bumping the prettier version and adding the new `prettier:check` command:
```diff
"scripts": {
...
+ "prettier:check": "prettier --check .",
...
},
...
"dependencies": {
...
- "prettier": "^1.19.1"
+ "prettier": "^2.3.2"
}
```
Finally run `yarn prettier --write .` on your project to update the existing formatting.
-12
View File
@@ -1,12 +0,0 @@
---
'@backstage/create-app': patch
---
Removed the `/` prefix in the catalog `SidebarItem` element, as it is no longer needed.
To apply this change to an existing app, remove the `/` prefix from the catalog and any other sidebar items in `packages/app/src/components/Root/Root.ts`:
```diff
-<SidebarItem icon={HomeIcon} to="/catalog" text="Home" />
+<SidebarItem icon={HomeIcon} to="catalog" text="Home" />
```
-12
View File
@@ -1,12 +0,0 @@
---
'@backstage/create-app': patch
---
Switched `@types/react-dom` dependency to of the app package to request `*` rather than a specific version.
To apply this change to an existing app, change the following in `packages/app/package.json`:
```diff
- "@types/react-dom": "^16.9.8",
+ "@types/react-dom": "*",
```
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-api-docs': patch
---
Support deep linking in OpenAPI definitions.
-6
View File
@@ -1,6 +0,0 @@
---
'@backstage/plugin-catalog': patch
'@backstage/plugin-catalog-react': patch
---
Move and rename `FavoriteEntity` component to `catalog-react`
@@ -1,19 +0,0 @@
---
'@backstage/techdocs-common': patch
---
Stale TechDocs content (files that had previously been published but which have
since been removed) is now removed from storage at publish-time. This is now
supported by the following publishers:
- Google GCS
- AWS S3
- Azure Blob Storage
You may need to apply a greater level of permissions (e.g. the ability to
delete objects in your storage provider) to any credentials/accounts used by
the TechDocs CLI or TechDocs backend in order for this change to take effect.
For more details, see [#6132][issue-ref].
[issue-ref]: https://github.com/backstage/backstage/issues/6132
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/core-components': patch
---
Fix for `SidebarItem` matching the active route too broadly.
+3
View File
@@ -15,6 +15,7 @@ Avro
backrub
Bigtable
Billett
Bitbucket
Bitrise
Blackbox
bool
@@ -84,6 +85,8 @@ facto
failover
Fargate
Figma
firehydrant
FireHydrant
Firekube
Fiverr
gitbeaker
+1 -1
View File
@@ -109,7 +109,7 @@ jobs:
run: node scripts/verify-links.js
- name: prettier
run: yarn prettier:check
run: yarn prettier:check '!ADOPTERS.md'
- name: lock
run: yarn lock:check
+54
View File
@@ -0,0 +1,54 @@
name: Prettier
on:
push:
branches:
- master
jobs:
autofix-markdown:
name: Autofix Markdown files using Prettier
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
# Fetch changes to previous commit - required for 'only_changed' in Prettier action
fetch-depth: 0
# Beginning of yarn setup, keep in sync between all workflows, see ci.yml
- name: use node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: cache all node_modules
id: cache-modules
uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
- name: find location of global yarn cache
id: yarn-cache
if: steps.cache-modules.outputs.cache-hit != 'true'
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: cache global yarn cache
uses: actions/cache@v2
if: steps.cache-modules.outputs.cache-hit != 'true'
with:
path: ${{ steps.yarn-cache.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: yarn install
run: yarn install --frozen-lockfile
# End of yarn setup
- name: Run Prettier on ADOPTERS.md
uses: creyD/prettier_action@v3.1
with:
# Modifies commit only if prettier autofixed the ADOPTERS.md
prettier_options: --config docs/prettier.config.js --write ADOPTERS.md
only_changed: true
commit_message: 'Autofix ADOPTERS.md using Prettier'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+5
View File
@@ -152,6 +152,11 @@ integrations:
- host: bitbucket.org
username: ${BITBUCKET_USERNAME}
appPassword: ${BITBUCKET_APP_PASSWORD}
### Example for how to add your bitbucket server instance using the API:
# - host: server.bitbucket.com
# apiBaseUrl: server.bitbucket.com
# username: ${BITBUCKET_SERVER_USERNAME}
# appPassword: ${BITBUCKET_SERVER_APP_PASSWORD}
azure:
- host: dev.azure.com
token: ${AZURE_TOKEN}
@@ -8,7 +8,6 @@
# simply copies in the build output into the image. If you want to also perform
# the build itself inside docker, use Dockerfile.build in this folder instead.
# USAGE:
#
# - Copy this file and the "docker" folder from this directory to your project
@@ -23,7 +22,7 @@
#
# yarn install
# yarn tsc
# yarn build --config <config1> --config <config2> ...
# yarn workspace app build --config <config1> --config <config2> ...
# docker build -t backstage-frontend -f Dockerfile.hostbuild .
@@ -38,4 +37,3 @@ COPY docker/default.conf.template /etc/nginx/templates/default.conf.template
COPY docker/inject-config.sh /docker-entrypoint.d/40-inject-config.sh
ENV PORT 80
+42
View File
@@ -111,6 +111,48 @@ export default async function createPlugin({
...
```
## Resolving membership through the catalog
If you want to provide additional claims through Sign-In resolvers but still
have the software catalog handle group (and transitive group) membership, you
can do this using the `CatalogIdentityClient` provided as context to Sign-In
resolvers:
```ts
export default async function createPlugin({
...
}: PluginEnvironment): Promise<Router> {
return await createRouter({
...
providerFactories: {
google: createGoogleProvider({
signIn: {
resolver: async ({ profile: { email } }, ctx) => {
const [sub] = email?.split('@') ?? '';
// Fetch from an external system that returns entity claims like:
// ['user:default/breanna.davison', ...]
const ent = await externalSystemClient.getUsernames(email);
// Resolve group membership from the Backstage catalog
const fullEnt = await ctx.catalogIdentityClient.resolveCatalogMembership({
entityRefs: [sub].concat(ent),
logger: ctx.logger,
});
const token = await ctx.tokenIssuer.issueToken({
claims: { sub, ent: fullEnt },
});
return { sub, token };
},
},
}),
...
```
The `resolveCatalogMembership` method will retrieve the referenced entities from
the catalog, if possible, and check for
[memberOf](../features/software-catalog/well-known-relations.md#memberof-and-hasmember)
relations to add additional entity claims.
## AuthHandler
Similar to a custom sign-in resolver, you can also write a custom auth handler
Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 18 KiB

+28
View File
@@ -1,5 +1,33 @@
# example-app
## 0.2.41
### Patch Changes
- Updated dependencies
- @backstage/plugin-cost-insights@0.11.4
- @backstage/plugin-github-actions@0.4.16
- @backstage/plugin-jenkins@0.5.3
- @backstage/plugin-kubernetes@0.4.11
- @backstage/plugin-pagerduty@0.3.11
- @backstage/plugin-scaffolder@0.11.0
- @backstage/plugin-sentry@0.3.18
- @backstage/plugin-techdocs@0.10.4
- @backstage/core-app-api@0.1.8
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
- @backstage/plugin-api-docs@0.6.6
- @backstage/plugin-catalog@0.6.11
- @backstage/plugin-catalog-import@0.5.17
- @backstage/plugin-catalog-react@0.4.2
- @backstage/plugin-explore@0.3.13
- @backstage/plugin-lighthouse@0.2.23
- @backstage/plugin-rollbar@0.3.12
- @backstage/plugin-search@0.4.7
- @backstage/plugin-tech-radar@0.4.5
- @backstage/cli@0.7.8
- @backstage/integration-react@0.1.7
## 0.2.40
### Patch Changes
+24 -24
View File
@@ -1,42 +1,42 @@
{
"name": "example-app",
"version": "0.2.40",
"version": "0.2.41",
"private": true,
"bundled": true,
"dependencies": {
"@backstage/catalog-model": "^0.9.0",
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/integration-react": "^0.1.6",
"@backstage/plugin-api-docs": "^0.6.5",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/integration-react": "^0.1.7",
"@backstage/plugin-api-docs": "^0.6.6",
"@backstage/plugin-badges": "^0.2.7",
"@backstage/plugin-catalog": "^0.6.10",
"@backstage/plugin-catalog-import": "^0.5.16",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/plugin-catalog": "^0.6.11",
"@backstage/plugin-catalog-import": "^0.5.17",
"@backstage/plugin-catalog-react": "^0.4.2",
"@backstage/plugin-circleci": "^0.2.21",
"@backstage/plugin-cloudbuild": "^0.2.21",
"@backstage/plugin-code-coverage": "^0.1.9",
"@backstage/plugin-cost-insights": "^0.11.3",
"@backstage/plugin-explore": "^0.3.12",
"@backstage/plugin-cost-insights": "^0.11.4",
"@backstage/plugin-explore": "^0.3.13",
"@backstage/plugin-gcp-projects": "^0.3.2",
"@backstage/plugin-github-actions": "^0.4.15",
"@backstage/plugin-github-actions": "^0.4.16",
"@backstage/plugin-graphiql": "^0.2.14",
"@backstage/plugin-jenkins": "^0.5.2",
"@backstage/plugin-jenkins": "^0.5.3",
"@backstage/plugin-kafka": "^0.2.13",
"@backstage/plugin-kubernetes": "^0.4.10",
"@backstage/plugin-lighthouse": "^0.2.22",
"@backstage/plugin-kubernetes": "^0.4.11",
"@backstage/plugin-lighthouse": "^0.2.23",
"@backstage/plugin-newrelic": "^0.3.2",
"@backstage/plugin-org": "^0.3.19",
"@backstage/plugin-pagerduty": "0.3.10",
"@backstage/plugin-rollbar": "^0.3.11",
"@backstage/plugin-scaffolder": "^0.10.3",
"@backstage/plugin-search": "^0.4.6",
"@backstage/plugin-sentry": "^0.3.17",
"@backstage/plugin-pagerduty": "0.3.11",
"@backstage/plugin-rollbar": "^0.3.12",
"@backstage/plugin-scaffolder": "^0.11.0",
"@backstage/plugin-search": "^0.4.7",
"@backstage/plugin-sentry": "^0.3.18",
"@backstage/plugin-shortcuts": "^0.1.6",
"@backstage/plugin-tech-radar": "^0.4.4",
"@backstage/plugin-techdocs": "^0.10.3",
"@backstage/plugin-tech-radar": "^0.4.5",
"@backstage/plugin-techdocs": "^0.10.4",
"@backstage/plugin-todo": "^0.1.7",
"@backstage/plugin-user-settings": "^0.3.3",
"@backstage/search-common": "^0.1.3",
@@ -60,7 +60,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/test-utils": "^0.1.16",
"@backstage/test-utils": "^0.1.17",
"@rjsf/core": "^3.0.0",
"@testing-library/cypress": "^7.0.1",
"@testing-library/jest-dom": "^5.10.1",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/backend-common
## 0.8.9
### Patch Changes
- f7ce7c565: Use a more informative error message when URL reading isn't allowed due to no reader matching the target URL.
- ce1958021: Pass on credentials to the integrations package, so that it can properly pick the API route when using GitHub apps based auth
- Updated dependencies
- @backstage/integration@0.6.0
## 0.8.8
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.8.8",
"version": "0.8.9",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -33,7 +33,7 @@
"@backstage/config": "^0.1.6",
"@backstage/config-loader": "^0.6.6",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.9",
"@backstage/integration": "^0.6.0",
"@google-cloud/storage": "^5.8.0",
"@octokit/rest": "^18.5.3",
"@types/cors": "^2.8.6",
@@ -76,8 +76,8 @@
}
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/test-utils": "^0.1.15",
"@backstage/cli": "^0.7.8",
"@backstage/test-utils": "^0.1.17",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
"@types/concat-stream": "^1.6.0",
@@ -91,15 +91,20 @@ export class GithubUrlReader implements UrlReader {
url: string,
options?: ReadUrlOptions,
): Promise<ReadUrlResponse> {
const ghUrl = getGitHubFileFetchUrl(url, this.integration.config);
const { headers } = await this.deps.credentialsProvider.getCredentials({
const credentials = await this.deps.credentialsProvider.getCredentials({
url,
});
const ghUrl = getGitHubFileFetchUrl(
url,
this.integration.config,
credentials,
);
let response: Response;
try {
response = await fetch(ghUrl.toString(), {
response = await fetch(ghUrl, {
headers: {
...headers,
...credentials?.headers,
...(options?.etag && { 'If-None-Match': options.etag }),
Accept: 'application/vnd.github.v3.raw',
},
+10
View File
@@ -1,5 +1,15 @@
# @backstage/backend-test-utils
## 0.1.5
### Patch Changes
- 524045758: Make sure that the unique databases names generated by `TestDatabases.create()`
don't collide.
- Updated dependencies
- @backstage/backend-common@0.8.9
- @backstage/cli@0.7.8
## 0.1.4
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
"version": "0.1.4",
"version": "0.1.5",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -30,8 +30,8 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.8.5",
"@backstage/cli": "^0.7.1",
"@backstage/backend-common": "^0.8.9",
"@backstage/cli": "^0.7.8",
"@backstage/config": "^0.1.5",
"knex": "^0.95.1",
"mysql2": "^2.2.5",
@@ -41,7 +41,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.7.1",
"@backstage/cli": "^0.7.8",
"jest": "^26.0.1"
},
"files": [
+19
View File
@@ -1,5 +1,24 @@
# example-backend
## 0.2.41
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-backend@0.3.20
- @backstage/integration@0.6.0
- @backstage/plugin-scaffolder-backend@0.15.0
- @backstage/backend-common@0.8.9
- @backstage/plugin-kubernetes-backend@0.3.14
- @backstage/plugin-search-backend-module-elasticsearch@0.0.2
- @backstage/plugin-search-backend-module-pg@0.1.1
- @backstage/plugin-catalog-backend@0.13.2
- @backstage/plugin-code-coverage-backend@0.1.9
- @backstage/plugin-scaffolder-backend-module-rails@0.1.4
- @backstage/plugin-techdocs-backend@0.9.2
- @backstage/plugin-todo-backend@0.1.9
- example-app@0.2.41
## 0.2.38
### Patch Changes
+15 -15
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.38",
"version": "0.2.41",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -27,35 +27,35 @@
"migrate:create": "knex migrate:make -x ts"
},
"dependencies": {
"@backstage/backend-common": "^0.8.7",
"@backstage/backend-common": "^0.8.9",
"@backstage/catalog-client": "^0.3.17",
"@backstage/catalog-model": "^0.9.0",
"@backstage/config": "^0.1.5",
"@backstage/integration": "^0.5.8",
"@backstage/integration": "^0.6.0",
"@backstage/plugin-app-backend": "^0.3.15",
"@backstage/plugin-auth-backend": "^0.3.18",
"@backstage/plugin-auth-backend": "^0.3.20",
"@backstage/plugin-badges-backend": "^0.1.8",
"@backstage/plugin-catalog-backend": "^0.13.0",
"@backstage/plugin-code-coverage-backend": "^0.1.8",
"@backstage/plugin-catalog-backend": "^0.13.2",
"@backstage/plugin-code-coverage-backend": "^0.1.9",
"@backstage/plugin-graphql-backend": "^0.1.8",
"@backstage/plugin-jenkins-backend": "^0.1.2",
"@backstage/plugin-kubernetes-backend": "^0.3.11",
"@backstage/plugin-kubernetes-backend": "^0.3.14",
"@backstage/plugin-kafka-backend": "^0.2.8",
"@backstage/plugin-proxy-backend": "^0.2.9",
"@backstage/plugin-rollbar-backend": "^0.1.13",
"@backstage/plugin-scaffolder-backend": "^0.14.1",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.1.3",
"@backstage/plugin-scaffolder-backend": "^0.15.0",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.1.4",
"@backstage/plugin-search-backend": "^0.2.3",
"@backstage/plugin-search-backend-node": "^0.4.0",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.0.1",
"@backstage/plugin-search-backend-module-pg": "^0.1.0",
"@backstage/plugin-techdocs-backend": "^0.9.0",
"@backstage/plugin-todo-backend": "^0.1.8",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.0.2",
"@backstage/plugin-search-backend-module-pg": "^0.1.1",
"@backstage/plugin-techdocs-backend": "^0.9.2",
"@backstage/plugin-todo-backend": "^0.1.9",
"@gitbeaker/node": "^30.2.0",
"@octokit/rest": "^18.5.3",
"azure-devops-node-api": "^10.2.2",
"dockerode": "^3.2.1",
"example-app": "^0.2.37",
"example-app": "^0.2.41",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"knex": "^0.95.1",
@@ -65,7 +65,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.7.5",
"@backstage/cli": "^0.7.8",
"@types/dockerode": "^3.2.1",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5"
+6
View File
@@ -1,5 +1,11 @@
# @backstage/cli
## 0.7.8
### Patch Changes
- c4ef9181a: Migrate to using `webpack@5` 🎉
## 0.7.7
### Patch Changes
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
"version": "0.7.7",
"version": "0.7.8",
"private": false,
"publishConfig": {
"access": "public"
@@ -118,13 +118,13 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/backend-common": "^0.8.8",
"@backstage/backend-common": "^0.8.9",
"@backstage/config": "^0.1.6",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@backstage/theme": "^0.2.9",
"@types/diff": "^5.0.0",
"@types/express": "^4.17.6",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/codemods
## 0.1.9
### Patch Changes
- Updated dependencies
- @backstage/core-app-api@0.1.8
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
## 0.1.8
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/codemods",
"description": "A collection of codemods for Backstage projects",
"version": "0.1.8",
"version": "0.1.9",
"private": false,
"publishConfig": {
"access": "public",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/core-app-api
## 0.1.8
### Patch Changes
- 362657623: Add support for serving the app with a base path other than `/`, which is enabled by including the path in `app.baseUrl`.
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- Updated dependencies
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
## 0.1.7
### Patch Changes
+6 -6
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
"version": "0.1.7",
"version": "0.1.8",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core-components": "^0.3.0",
"@backstage/core-components": "^0.3.1",
"@backstage/config": "^0.1.6",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -44,9 +44,9 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/test-utils": "^0.1.16",
"@backstage/test-utils-core": "^0.1.1",
"@backstage/cli": "^0.7.8",
"@backstage/test-utils": "^0.1.17",
"@backstage/test-utils-core": "^0.1.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^3.4.2",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/core-components
## 0.3.1
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- 55a5dbd54: Fix for `SidebarItem` matching the active route too broadly.
- Updated dependencies
- @backstage/core-plugin-api@0.1.6
## 0.3.0
### Minor Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
"version": "0.3.0",
"version": "0.3.1",
"private": false,
"publishConfig": {
"access": "public",
@@ -30,7 +30,7 @@
},
"dependencies": {
"@backstage/config": "^0.1.6",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/errors": "^0.1.1",
"@backstage/theme": "^0.2.9",
"@material-table/core": "^3.1.0",
@@ -70,9 +70,9 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/core-app-api": "^0.1.7",
"@backstage/cli": "^0.7.7",
"@backstage/test-utils": "^0.1.16",
"@backstage/core-app-api": "^0.1.8",
"@backstage/cli": "^0.7.8",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+6
View File
@@ -1,5 +1,11 @@
# @backstage/core-plugin-api
## 0.1.6
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
## 0.1.5
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-plugin-api",
"description": "Core API used by Backstage plugins",
"version": "0.1.5",
"version": "0.1.6",
"private": false,
"publishConfig": {
"access": "public",
@@ -41,10 +41,10 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/test-utils": "^0.1.16",
"@backstage/test-utils-core": "^0.1.1",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/test-utils": "^0.1.17",
"@backstage/test-utils-core": "^0.1.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^3.4.2",
+78
View File
@@ -1,5 +1,83 @@
# @backstage/create-app
## 0.3.35
### Patch Changes
- 362ea5a72: Updated the index page redirect to work with apps served on a different base path than `/`.
To apply this change to an existing app, remove the `/` prefix from the target route in the `Navigate` element in `packages/app/src/App.tsx`:
```diff
-<Navigate key="/" to="/catalog" />
+<Navigate key="/" to="catalog" />
```
- 80582cbec: Use new composable `TechDocsIndexPage` and `DefaultTechDocsHome`
Make the following changes to your `App.tsx` to migrate existing apps:
```diff
- <Route path="/docs" element={<TechdocsPage />} />
+ <Route path="/docs" element={<TechDocsIndexPage />}>
+ <DefaultTechDocsHome />
+ </Route>
+ <Route
+ path="/docs/:namespace/:kind/:name/*"
+ element={<TechDocsReaderPage />}
+ />
```
- c4ef9181a: Migrate to using `webpack@5` 🎉
- 56c773909: Add a complete prettier setup to the created project. Prettier used to only be added as a dependency to create apps, but there wasn't a complete setup included that makes it easy to run prettier. That has now changed, and the new `prettier:check` command can be used to check the formatting of the files in your created project.
To apply this change to an existing app, a couple of changes need to be made.
Create a `.prettierignore` file at the root of your repository with the following contents:
```
dist
dist-types
coverage
.vscode
```
Next update the root `package.json` by bumping the prettier version and adding the new `prettier:check` command:
```diff
"scripts": {
...
+ "prettier:check": "prettier --check .",
...
},
...
"dependencies": {
...
- "prettier": "^1.19.1"
+ "prettier": "^2.3.2"
}
```
Finally run `yarn prettier --write .` on your project to update the existing formatting.
- 9f8f8dd6b: Removed the `/` prefix in the catalog `SidebarItem` element, as it is no longer needed.
To apply this change to an existing app, remove the `/` prefix from the catalog and any other sidebar items in `packages/app/src/components/Root/Root.ts`:
```diff
-<SidebarItem icon={HomeIcon} to="/catalog" text="Home" />
+<SidebarItem icon={HomeIcon} to="catalog" text="Home" />
```
- 56c773909: Switched `@types/react-dom` dependency to of the app package to request `*` rather than a specific version.
To apply this change to an existing app, change the following in `packages/app/package.json`:
```diff
- "@types/react-dom": "^16.9.8",
+ "@types/react-dom": "*",
```
## 0.3.34
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "Create app package for Backstage",
"version": "0.3.34",
"version": "0.3.35",
"private": false,
"publishConfig": {
"access": "public"
+13
View File
@@ -1,5 +1,18 @@
# @backstage/dev-utils
## 0.2.6
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- Updated dependencies
- @backstage/core-app-api@0.1.8
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
- @backstage/test-utils@0.1.17
- @backstage/plugin-catalog-react@0.4.2
- @backstage/integration-react@0.1.7
## 0.2.5
### Patch Changes
+8 -8
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/dev-utils",
"description": "Utilities for developing Backstage plugins.",
"version": "0.2.5",
"version": "0.2.6",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,13 +29,13 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core-app-api": "^0.1.7",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-app-api": "^0.1.8",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/catalog-model": "^0.9.0",
"@backstage/integration-react": "^0.1.6",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/test-utils": "^0.1.16",
"@backstage/integration-react": "^0.1.7",
"@backstage/plugin-catalog-react": "^0.4.2",
"@backstage/test-utils": "^0.1.17",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -50,7 +50,7 @@
"react-router-dom": "6.0.0-beta.0"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/cli": "^0.7.8",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
+9
View File
@@ -1,5 +1,14 @@
# @backstage/integration-react
## 0.1.7
### Patch Changes
- Updated dependencies
- @backstage/integration@0.6.0
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
## 0.1.6
### Patch Changes
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration-react",
"version": "0.1.6",
"version": "0.1.7",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -21,9 +21,9 @@
},
"dependencies": {
"@backstage/config": "^0.1.6",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/integration": "^0.5.9",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/integration": "^0.6.0",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -33,9 +33,9 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+14
View File
@@ -1,5 +1,19 @@
# @backstage/integration
## 0.6.0
### Minor Changes
- ce1958021: `getGitHubFileFetchUrl` and `getGitHubRequestOptions` now require a `credentials` argument. This is needed to address an issue where the raw route was chosen by the `UrlReader` when using GitHub Apps based auth.
Deprecated the `getGitHubRequestOptions` function, which is no longer used internally.
### Patch Changes
- 8bedb75ae: Update Luxon dependency to 2.x
- 68af4d556: Adds an allow list of GitHub installations
- 5fd31c2f4: Remove repo restriction from GitHub credentials provider
## 0.5.9
### Patch Changes
+4 -2
View File
@@ -165,20 +165,23 @@ export function getBitbucketRequestOptions(
// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
// Warning: (ae-forgotten-export) The symbol "GithubCredentials" needs to be exported by the entry point index.d.ts
// Warning: (ae-missing-release-tag) "getGitHubFileFetchUrl" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public
export function getGitHubFileFetchUrl(
url: string,
config: GitHubIntegrationConfig,
credentials: GithubCredentials,
): string;
// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
// Warning: (ae-missing-release-tag) "getGitHubRequestOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public
// @public @deprecated
export function getGitHubRequestOptions(
config: GitHubIntegrationConfig,
credentials: GithubCredentials,
): RequestInit;
// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
@@ -228,7 +231,6 @@ export class GithubCredentialsProvider {
// Warning: (tsdoc-escape-right-brace) The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag
// Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@"
// Warning: (tsdoc-malformed-inline-tag) Expecting a TSDoc tag starting with "{@"
// Warning: (ae-forgotten-export) The symbol "GithubCredentials" needs to be exported by the entry point index.d.ts
getCredentials(opts: { url: string }): Promise<GithubCredentials>;
}
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration",
"version": "0.5.9",
"version": "0.6.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -34,12 +34,12 @@
"git-url-parse": "~11.4.4",
"@octokit/rest": "^18.5.3",
"@octokit/auth-app": "^3.4.0",
"luxon": "^1.25.0"
"luxon": "^2.0.2"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/cli": "^0.7.8",
"@backstage/config-loader": "^0.6.6",
"@backstage/test-utils": "^0.1.13",
"@backstage/test-utils": "^0.1.17",
"@types/jest": "^26.0.7",
"@types/luxon": "^1.25.0",
"msw": "^0.29.0"
@@ -250,11 +250,7 @@ export class GithubCredentialsProvider {
}
return {
headers: token
? {
Authorization: `Bearer ${token}`,
}
: undefined,
headers: token ? { Authorization: `Bearer ${token}` } : undefined,
token,
type,
};
+39 -4
View File
@@ -16,8 +16,25 @@
import { GitHubIntegrationConfig } from './config';
import { getGitHubFileFetchUrl, getGitHubRequestOptions } from './core';
import { GithubCredentials } from './GithubCredentialsProvider';
describe('github core', () => {
const appCredentials: GithubCredentials = {
type: 'app',
token: 'A',
headers: {},
};
const tokenCredentials: GithubCredentials = {
type: 'token',
token: 'A',
headers: {},
};
const noCredentials: GithubCredentials = {
type: 'token',
};
describe('getGitHubRequestOptions', () => {
it('inserts a token when needed', () => {
const withToken: GitHubIntegrationConfig = {
@@ -30,10 +47,12 @@ describe('github core', () => {
rawBaseUrl: '',
};
expect(
(getGitHubRequestOptions(withToken).headers as any).Authorization,
(getGitHubRequestOptions(withToken, appCredentials).headers as any)
.Authorization,
).toEqual('token A');
expect(
(getGitHubRequestOptions(withoutToken).headers as any).Authorization,
(getGitHubRequestOptions(withoutToken, noCredentials).headers as any)
.Authorization,
).toBeUndefined();
});
});
@@ -41,7 +60,7 @@ describe('github core', () => {
describe('getGitHubFileFetchUrl', () => {
it('rejects targets that do not look like URLs', () => {
const config: GitHubIntegrationConfig = { host: '', apiBaseUrl: '' };
expect(() => getGitHubFileFetchUrl('a/b', config)).toThrow(
expect(() => getGitHubFileFetchUrl('a/b', config, noCredentials)).toThrow(
/Incorrect URL: a\/b/,
);
});
@@ -55,14 +74,16 @@ describe('github core', () => {
getGitHubFileFetchUrl(
'https://github.com/a/b/blob/branchname/path/to/c.yaml',
config,
appCredentials,
),
).toEqual(
'https://api.github.com/repos/a/b/contents/path/to/c.yaml?ref=branchname',
);
expect(
getGitHubFileFetchUrl(
'https://ghe.mycompany.net/a/b/blob/branchname/path/to/c.yaml',
'https://github.com/a/b/blob/branchname/path/to/c.yaml',
config,
tokenCredentials,
),
).toEqual(
'https://api.github.com/repos/a/b/contents/path/to/c.yaml?ref=branchname',
@@ -78,6 +99,16 @@ describe('github core', () => {
getGitHubFileFetchUrl(
'https://ghe.mycompany.net/a/b/blob/branchname/path/to/c.yaml',
config,
appCredentials,
),
).toEqual(
'https://ghe.mycompany.net/api/v3/repos/a/b/contents/path/to/c.yaml?ref=branchname',
);
expect(
getGitHubFileFetchUrl(
'https://ghe.mycompany.net/a/b/blob/branchname/path/to/c.yaml',
config,
tokenCredentials,
),
).toEqual(
'https://ghe.mycompany.net/api/v3/repos/a/b/contents/path/to/c.yaml?ref=branchname',
@@ -93,6 +124,7 @@ describe('github core', () => {
getGitHubFileFetchUrl(
'https://github.com/a/b/tree/branchname/path/to/c.yaml',
config,
tokenCredentials,
),
).toEqual(
'https://api.github.com/repos/a/b/contents/path/to/c.yaml?ref=branchname',
@@ -108,6 +140,7 @@ describe('github core', () => {
getGitHubFileFetchUrl(
'https://ghe.mycompany.net/a/b/tree/branchname/path/to/c.yaml',
config,
tokenCredentials,
),
).toEqual(
'https://ghe.mycompany.net/api/v3/repos/a/b/contents/path/to/c.yaml?ref=branchname',
@@ -123,6 +156,7 @@ describe('github core', () => {
getGitHubFileFetchUrl(
'https://github.com/a/b/blob/branchname/path/to/c.yaml',
config,
tokenCredentials,
),
).toEqual(
'https://raw.githubusercontent.com/a/b/branchname/path/to/c.yaml',
@@ -138,6 +172,7 @@ describe('github core', () => {
getGitHubFileFetchUrl(
'https://ghe.mycompany.net/a/b/blob/branchname/path/to/c.yaml',
config,
tokenCredentials,
),
).toEqual('https://ghe.mycompany.net/raw/a/b/branchname/path/to/c.yaml');
});
+14 -6
View File
@@ -16,6 +16,7 @@
import parseGitUrl from 'git-url-parse';
import { GitHubIntegrationConfig } from './config';
import { GithubCredentials } from './GithubCredentialsProvider';
/**
* Given a URL pointing to a file on a provider, returns a URL that is suitable
@@ -32,6 +33,7 @@ import { GitHubIntegrationConfig } from './config';
export function getGitHubFileFetchUrl(
url: string,
config: GitHubIntegrationConfig,
credentials: GithubCredentials,
): string {
try {
const { owner, name, ref, filepathtype, filepath } = parseGitUrl(url);
@@ -49,7 +51,7 @@ export function getGitHubFileFetchUrl(
}
const pathWithoutSlash = filepath.replace(/^\//, '');
if (chooseEndpoint(config) === 'api') {
if (chooseEndpoint(config, credentials) === 'api') {
return `${config.apiBaseUrl}/repos/${owner}/${name}/contents/${pathWithoutSlash}?ref=${ref}`;
}
return `${config.rawBaseUrl}/${owner}/${name}/${ref}/${pathWithoutSlash}`;
@@ -61,25 +63,31 @@ export function getGitHubFileFetchUrl(
/**
* Gets the request options necessary to make requests to a given provider.
*
* @deprecated This function is no longer used internally
* @param config The relevant provider config
*/
export function getGitHubRequestOptions(
config: GitHubIntegrationConfig,
credentials: GithubCredentials,
): RequestInit {
const headers: HeadersInit = {};
if (chooseEndpoint(config) === 'api') {
if (chooseEndpoint(config, credentials) === 'api') {
headers.Accept = 'application/vnd.github.v3.raw';
}
if (config.token) {
headers.Authorization = `token ${config.token}`;
if (credentials.token) {
headers.Authorization = `token ${credentials.token}`;
}
return { headers };
}
export function chooseEndpoint(config: GitHubIntegrationConfig): 'api' | 'raw' {
if (config.apiBaseUrl && (config.token || !config.rawBaseUrl)) {
export function chooseEndpoint(
config: GitHubIntegrationConfig,
credentials: GithubCredentials,
): 'api' | 'raw' {
if (config.apiBaseUrl && (credentials.token || !config.rawBaseUrl)) {
return 'api';
}
return 'raw';
+24
View File
@@ -1,5 +1,29 @@
# @backstage/techdocs-common
## 0.8.1
### Patch Changes
- bc405be6e: Stale TechDocs content (files that had previously been published but which have
since been removed) is now removed from storage at publish-time. This is now
supported by the following publishers:
- Google GCS
- AWS S3
- Azure Blob Storage
You may need to apply a greater level of permissions (e.g. the ability to
delete objects in your storage provider) to any credentials/accounts used by
the TechDocs CLI or TechDocs backend in order for this change to take effect.
For more details, see [#6132][issue-ref].
[issue-ref]: https://github.com/backstage/backstage/issues/6132
- Updated dependencies
- @backstage/integration@0.6.0
- @backstage/backend-common@0.8.9
## 0.8.0
### Minor Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/techdocs-common",
"description": "Common functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli",
"version": "0.8.0",
"version": "0.8.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -38,11 +38,11 @@
"dependencies": {
"@azure/identity": "^1.5.0",
"@azure/storage-blob": "^12.5.0",
"@backstage/backend-common": "^0.8.8",
"@backstage/backend-common": "^0.8.9",
"@backstage/catalog-model": "^0.9.0",
"@backstage/config": "^0.1.6",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.9",
"@backstage/integration": "^0.6.0",
"@google-cloud/storage": "^5.6.0",
"@types/express": "^4.17.6",
"aws-sdk": "^2.840.0",
@@ -58,7 +58,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/cli": "^0.7.8",
"@types/fs-extra": "^9.0.5",
"@types/js-yaml": "^4.0.0",
"@types/mime-types": "^2.1.0",
+7
View File
@@ -0,0 +1,7 @@
# @backstage/test-utils-core
## 0.1.2
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/test-utils-core",
"description": "Utilities to test Backstage core",
"version": "0.1.1",
"version": "0.1.2",
"private": false,
"publishConfig": {
"access": "public",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/test-utils
## 0.1.17
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- Updated dependencies
- @backstage/core-app-api@0.1.8
- @backstage/core-plugin-api@0.1.6
- @backstage/test-utils-core@0.1.2
## 0.1.16
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/test-utils",
"description": "Utilities to test Backstage plugins and apps.",
"version": "0.1.16",
"version": "0.1.17",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core-app-api": "^0.1.6",
"@backstage/core-plugin-api": "^0.1.4",
"@backstage/test-utils-core": "^0.1.1",
"@backstage/core-app-api": "^0.1.8",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/test-utils-core": "^0.1.2",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@testing-library/jest-dom": "^5.10.1",
@@ -46,7 +46,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/cli": "^0.7.6",
"@backstage/cli": "^0.7.8",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
+12
View File
@@ -1,5 +1,17 @@
# @backstage/plugin-api-docs
## 0.6.6
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- 0383314c9: Support deep linking in OpenAPI definitions.
- Updated dependencies
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
- @backstage/plugin-catalog@0.6.11
- @backstage/plugin-catalog-react@0.4.2
## 0.6.5
### Patch Changes
+9 -9
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-api-docs",
"version": "0.6.5",
"version": "0.6.6",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -31,10 +31,10 @@
"dependencies": {
"@asyncapi/react-component": "^0.23.0",
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/plugin-catalog": "^0.6.10",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/plugin-catalog": "^0.6.11",
"@backstage/plugin-catalog-react": "^0.4.2",
"@backstage/theme": "^0.2.9",
"@material-icons/font": "^1.0.2",
"@material-ui/core": "^4.12.2",
@@ -52,10 +52,10 @@
"swagger-ui-react": "^3.37.2"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-auth-backend
## 0.3.20
### Patch Changes
- 29f7cfffb: Added `resolveCatalogMembership` utility to query the catalog for additional authentication claims within sign-in resolvers.
- 8bedb75ae: Update Luxon dependency to 2.x
- bfe0ff93f: Add Sign In and Handler resolver for Okta provider
- Updated dependencies
- @backstage/backend-common@0.8.9
- @backstage/test-utils@0.1.17
## 0.3.19
### Patch Changes
+22
View File
@@ -98,6 +98,13 @@ export const createMicrosoftProvider: (
options?: MicrosoftProviderOptions | undefined,
) => AuthProviderFactory;
// Warning: (ae-missing-release-tag) "createOktaProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export const createOktaProvider: (
_options?: OktaProviderOptions | undefined,
) => AuthProviderFactory;
// Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
@@ -303,6 +310,21 @@ export type OAuthState = {
env: string;
};
// Warning: (ae-missing-release-tag) "oktaEmailSignInResolver" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export const oktaEmailSignInResolver: SignInResolver<OAuthResult>;
// Warning: (ae-missing-release-tag) "OktaProviderOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export type OktaProviderOptions = {
authHandler?: AuthHandler<OAuthResult>;
signIn?: {
resolver?: SignInResolver<OAuthResult>;
};
};
// Warning: (ae-missing-release-tag) "postMessageResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend",
"version": "0.3.19",
"version": "0.3.20",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,12 +29,12 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.8.7",
"@backstage/backend-common": "^0.8.9",
"@backstage/catalog-client": "^0.3.18",
"@backstage/catalog-model": "^0.9.0",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@backstage/test-utils": "^0.1.16",
"@backstage/test-utils": "^0.1.17",
"@types/express": "^4.17.6",
"@types/passport": "^1.0.3",
"compression": "^1.7.4",
@@ -50,7 +50,7 @@
"jose": "^1.27.1",
"jwt-decode": "^3.1.0",
"knex": "^0.95.1",
"luxon": "^1.25.0",
"luxon": "^2.0.2",
"minimatch": "^3.0.3",
"morgan": "^1.10.0",
"node-cache": "^5.1.2",
@@ -69,7 +69,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.7.6",
"@backstage/cli": "^0.7.8",
"@types/body-parser": "^1.19.0",
"@types/cookie-parser": "^1.4.2",
"@types/express-session": "^1.17.2",
@@ -15,7 +15,11 @@
*/
import { CatalogApi } from '@backstage/catalog-client';
import { UserEntity } from '@backstage/catalog-model';
import {
RELATION_MEMBER_OF,
UserEntity,
UserEntityV1alpha1,
} from '@backstage/catalog-model';
import { TokenIssuer } from '../../identity';
import { CatalogIdentityClient } from './CatalogIdentityClient';
@@ -37,12 +41,12 @@ describe('CatalogIdentityClient', () => {
afterEach(() => jest.resetAllMocks());
it('passes through the correct search params', async () => {
it('findUser passes through the correct search params', async () => {
catalogApi.getEntities.mockResolvedValueOnce({ items: [{} as UserEntity] });
tokenIssuer.issueToken.mockResolvedValue('my-token');
const client = new CatalogIdentityClient({
catalogApi: catalogApi,
tokenIssuer: tokenIssuer,
catalogApi,
tokenIssuer,
});
await client.findUser({ annotations: { key: 'value' } });
@@ -62,4 +66,88 @@ describe('CatalogIdentityClient', () => {
},
});
});
it('resolveCatalogMembership resolves membership', async () => {
const mockUsers: Array<UserEntityV1alpha1> = [
{
apiVersion: 'backstage.io/v1beta1',
kind: 'User',
metadata: {
name: 'inigom',
},
spec: {
memberOf: ['team-a'],
},
relations: [
{
type: RELATION_MEMBER_OF,
target: {
kind: 'Group',
namespace: 'default',
name: 'team-a',
},
},
],
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'User',
metadata: {
name: 'mpatinkin',
namespace: 'reality',
},
spec: {
memberOf: ['screen-actors-guild'],
},
relations: [
{
type: RELATION_MEMBER_OF,
target: {
kind: 'Group',
namespace: 'reality',
name: 'screen-actors-guild',
},
},
],
},
];
catalogApi.getEntities.mockResolvedValueOnce({ items: mockUsers });
const client = new CatalogIdentityClient({
catalogApi,
tokenIssuer,
});
const claims = await client.resolveCatalogMembership({
entityRefs: ['inigom', 'User:default/imontoya', 'User:reality/mpatinkin'],
});
expect(catalogApi.getEntities).toHaveBeenCalledWith({
filter: [
{
kind: 'user',
'metadata.namespace': 'default',
'metadata.name': 'inigom',
},
{
kind: 'user',
'metadata.namespace': 'default',
'metadata.name': 'imontoya',
},
{
kind: 'user',
'metadata.namespace': 'reality',
'metadata.name': 'mpatinkin',
},
],
});
expect(claims).toMatchObject([
'user:default/inigom',
'user:default/imontoya',
'user:reality/mpatinkin',
'group:default/team-a',
'group:reality/screen-actors-guild',
]);
});
});
@@ -14,15 +14,27 @@
* limitations under the License.
*/
import { Logger } from 'winston';
import { ConflictError, NotFoundError } from '@backstage/errors';
import { CatalogApi } from '@backstage/catalog-client';
import { UserEntity } from '@backstage/catalog-model';
import {
EntityName,
parseEntityRef,
RELATION_MEMBER_OF,
stringifyEntityRef,
UserEntity,
} from '@backstage/catalog-model';
import { TokenIssuer } from '../../identity';
type UserQuery = {
annotations: Record<string, string>;
};
type MemberClaimQuery = {
entityRefs: string[];
logger?: Logger;
};
/**
* A catalog client tailored for reading out identity data from the catalog.
*/
@@ -64,4 +76,62 @@ export class CatalogIdentityClient {
return items[0] as UserEntity;
}
/**
* Resolve additional entity claims from the catalog, using the passed-in entity names. Designed
* to be used within a `signInResolver` where additional entity claims might be provided, but
* group membership and transient group membership lean on imported catalog relations.
*
* Returns a superset of the entity names that can be passed directly to `issueToken` as `ent`.
*/
async resolveCatalogMembership({
entityRefs,
logger,
}: MemberClaimQuery): Promise<string[]> {
const resolvedEntityRefs = entityRefs
.map((ref: string) => {
try {
const parsedRef = parseEntityRef(ref.toLocaleLowerCase('en-US'), {
defaultKind: 'user',
defaultNamespace: 'default',
});
return parsedRef;
} catch {
logger?.warn(`Failed to parse entityRef from ${ref}, ignoring`);
return null;
}
})
.filter((ref): ref is EntityName => ref !== null);
const filter = resolvedEntityRefs.map(ref => ({
kind: ref.kind,
'metadata.namespace': ref.namespace,
'metadata.name': ref.name,
}));
const entities = await this.catalogApi
.getEntities({ filter })
.then(r => r.items);
if (entityRefs.length !== entities.length) {
const foundEntityNames = entities.map(stringifyEntityRef);
const missingEntityNames = resolvedEntityRefs
.map(stringifyEntityRef)
.filter(s => !foundEntityNames.includes(s));
logger?.debug(`Entities not found for refs ${missingEntityNames.join()}`);
}
const memberOf = entities.flatMap(
e =>
e!.relations
?.filter(r => r.type === RELATION_MEMBER_OF)
.map(r => r.target) ?? [],
);
const newEntityRefs = [
...new Set(resolvedEntityRefs.concat(memberOf).map(stringifyEntityRef)),
];
logger?.debug(`Found catalog membership: ${newEntityRefs.join()}`);
return newEntityRefs;
}
}
@@ -16,6 +16,7 @@
export * from './google';
export * from './microsoft';
export * from './okta';
export { factories as defaultAuthProviderFactories } from './factories';
// Export the minimal interface required for implementing a
@@ -14,5 +14,5 @@
* limitations under the License.
*/
export { createOktaProvider } from './provider';
export { createOktaProvider, oktaEmailSignInResolver } from './provider';
export type { OktaProviderOptions } from './provider';
@@ -0,0 +1,105 @@
/*
* Copyright 2020 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 { OktaAuthProvider } from './provider';
import * as helpers from '../../lib/passport/PassportStrategyHelper';
import { OAuthResult } from '../../lib/oauth';
import { getVoidLogger } from '@backstage/backend-common';
import { TokenIssuer } from '../../identity/types';
import { CatalogIdentityClient } from '../../lib/catalog';
const mockFrameHandler = jest.spyOn(
helpers,
'executeFrameHandlerStrategy',
) as unknown as jest.MockedFunction<
() => Promise<{ result: OAuthResult; privateInfo: any }>
>;
describe('createOktaProvider', () => {
it('should auth', async () => {
const tokenIssuer = {
issueToken: jest.fn(),
listPublicKeys: jest.fn(),
};
const catalogIdentityClient = {
findUser: jest.fn(),
};
const provider = new OktaAuthProvider({
logger: getVoidLogger(),
catalogIdentityClient:
catalogIdentityClient as unknown as CatalogIdentityClient,
tokenIssuer: tokenIssuer as unknown as TokenIssuer,
authHandler: async ({ fullProfile }) => ({
profile: {
email: fullProfile.emails![0]!.value,
displayName: fullProfile.displayName,
},
}),
audience: 'http://example.com',
clientId: 'mock',
clientSecret: 'mock',
callbackUrl: 'mock',
});
mockFrameHandler.mockResolvedValueOnce({
result: {
fullProfile: {
emails: [
{
type: 'work',
value: 'conrad@example.com',
},
],
displayName: 'Conrad',
name: {
familyName: 'Ribas',
givenName: 'Francisco',
},
id: 'conrad',
provider: 'okta',
photos: [
{
value: 'some-data',
},
],
},
params: {
id_token: 'idToken',
scope: 'scope',
expires_in: 123,
},
accessToken: 'accessToken',
},
privateInfo: {
refreshToken: 'wacka',
},
});
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',
},
});
});
});
@@ -35,8 +35,16 @@ import {
executeFetchUserProfileStrategy,
PassportDoneCallback,
} from '../../lib/passport';
import { RedirectInfo, AuthProviderFactory } from '../types';
import {
AuthProviderFactory,
AuthHandler,
RedirectInfo,
SignInResolver,
} from '../types';
import { StateStore } from 'passport-oauth2';
import { CatalogIdentityClient, getEntityClaims } from '../../lib/catalog';
import { TokenIssuer } from '../../identity';
import { Logger } from 'winston';
type PrivateInfo = {
refreshToken: string;
@@ -44,10 +52,20 @@ type PrivateInfo = {
export type OktaAuthProviderOptions = OAuthProviderOptions & {
audience: string;
signInResolver?: SignInResolver<OAuthResult>;
authHandler: AuthHandler<OAuthResult>;
tokenIssuer: TokenIssuer;
catalogIdentityClient: CatalogIdentityClient;
logger: Logger;
};
export class OktaAuthProvider implements OAuthHandlers {
private readonly _strategy: any;
private readonly _signInResolver?: SignInResolver<OAuthResult>;
private readonly _authHandler: AuthHandler<OAuthResult>;
private readonly _tokenIssuer: TokenIssuer;
private readonly _catalogIdentityClient: CatalogIdentityClient;
private readonly _logger: Logger;
/**
* Due to passport-okta-oauth forcing options.state = true,
@@ -67,6 +85,12 @@ export class OktaAuthProvider implements OAuthHandlers {
};
constructor(options: OktaAuthProviderOptions) {
this._signInResolver = options.signInResolver;
this._authHandler = options.authHandler;
this._tokenIssuer = options.tokenIssuer;
this._catalogIdentityClient = options.catalogIdentityClient;
this._logger = options.logger;
this._strategy = new OktaStrategy(
{
clientID: options.clientId,
@@ -117,18 +141,8 @@ export class OktaAuthProvider implements OAuthHandlers {
PrivateInfo
>(req, this._strategy);
const profile = makeProfileInfo(result.fullProfile, result.params.id_token);
return {
response: await this.populateIdentity({
profile,
providerInfo: {
idToken: result.params.id_token,
accessToken: result.accessToken,
scope: result.params.scope,
expiresInSeconds: result.params.expires_in,
},
}),
response: await this.handleResult(result),
refreshToken: privateInfo.refreshToken,
};
}
@@ -144,52 +158,157 @@ export class OktaAuthProvider implements OAuthHandlers {
this._strategy,
accessToken,
);
const profile = makeProfileInfo(fullProfile, params.id_token);
return this.populateIdentity({
providerInfo: {
accessToken,
idToken: params.id_token,
expiresInSeconds: params.expires_in,
scope: params.scope,
},
profile,
return this.handleResult({
fullProfile,
params,
accessToken,
refreshToken: req.refreshToken,
});
}
private async populateIdentity(
response: OAuthResponse,
): Promise<OAuthResponse> {
const { profile } = response;
private async handleResult(result: OAuthResult) {
const { profile } = await this._authHandler(result);
if (!profile.email) {
throw new Error('Okta profile contained no email');
const response: OAuthResponse = {
providerInfo: {
idToken: result.params.id_token,
accessToken: result.accessToken,
scope: result.params.scope,
expiresInSeconds: result.params.expires_in,
},
profile,
};
if (this._signInResolver) {
response.backstageIdentity = await this._signInResolver(
{
result,
profile,
},
{
tokenIssuer: this._tokenIssuer,
catalogIdentityClient: this._catalogIdentityClient,
logger: this._logger,
},
);
}
// TODO(Rugvip): Hardcoded to the local part of the email for now
const id = profile.email.split('@')[0];
return { ...response, backstageIdentity: { id } };
return response;
}
}
export type OktaProviderOptions = {};
export const oktaEmailSignInResolver: SignInResolver<OAuthResult> = async (
info,
ctx,
) => {
const { profile } = info;
if (!profile.email) {
throw new Error('Okta profile contained no email');
}
const entity = await ctx.catalogIdentityClient.findUser({
annotations: {
'okta.com/email': profile.email,
},
});
const claims = getEntityClaims(entity);
const token = await ctx.tokenIssuer.issueToken({ claims });
return { id: entity.metadata.name, entity, token };
};
export const oktaDefaultSignInResolver: SignInResolver<OAuthResult> = async (
info,
ctx,
) => {
const { profile } = info;
if (!profile.email) {
throw new Error('Okta profile contained no email');
}
// TODO(Rugvip): Hardcoded to the local part of the email for now
const userId = profile.email.split('@')[0];
const token = await ctx.tokenIssuer.issueToken({
claims: { sub: userId, ent: [`user:default/${userId}`] },
});
return { id: userId, token };
};
export type OktaProviderOptions = {
/**
* The profile transformation function used to verify and convert the auth response
* into the profile that will be presented to the user.
*/
authHandler?: AuthHandler<OAuthResult>;
/**
* Configure sign-in for this provider, without it the provider can not be used to sign users in.
*/
/**
* Maps an auth result to a Backstage identity for the user.
*
* Set to `'email'` to use the default email-based sign in resolver, which will search
* the catalog for a single user entity that has a matching `okta.com/email` annotation.
*/
signIn?: {
resolver?: SignInResolver<OAuthResult>;
};
};
export const createOktaProvider = (
_options?: OktaProviderOptions,
): AuthProviderFactory => {
return ({ providerId, globalConfig, config, tokenIssuer }) =>
return ({
providerId,
globalConfig,
config,
tokenIssuer,
catalogApi,
logger,
}) =>
OAuthEnvironmentHandler.mapConfig(config, envConfig => {
const clientId = envConfig.getString('clientId');
const clientSecret = envConfig.getString('clientSecret');
const audience = envConfig.getString('audience');
const callbackUrl = `${globalConfig.baseUrl}/${providerId}/handler/frame`;
const catalogIdentityClient = new CatalogIdentityClient({
catalogApi,
tokenIssuer,
});
const authHandler: AuthHandler<OAuthResult> = _options?.authHandler
? _options.authHandler
: async ({ fullProfile, params }) => ({
profile: makeProfileInfo(fullProfile, params.id_token),
});
const signInResolverFn =
_options?.signIn?.resolver ?? oktaDefaultSignInResolver;
const signInResolver: SignInResolver<OAuthResult> = info =>
signInResolverFn(info, {
catalogIdentityClient,
tokenIssuer,
logger,
});
const provider = new OktaAuthProvider({
audience,
clientId,
clientSecret,
callbackUrl,
authHandler,
signInResolver,
tokenIssuer,
catalogIdentityClient,
logger,
});
return OAuthAdapter.fromConfig(globalConfig, provider, {
+6 -6
View File
@@ -21,8 +21,8 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/errors": "^0.1.1",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/theme": "^0.2.9",
@@ -35,10 +35,10 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-bitrise
## 0.1.10
### Patch Changes
- 8bedb75ae: Update Luxon dependency to 2.x
- Updated dependencies
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
- @backstage/plugin-catalog-react@0.4.2
## 0.1.9
### Patch Changes
+9 -9
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bitrise",
"version": "0.1.9",
"version": "0.1.10",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -21,16 +21,16 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/plugin-catalog-react": "^0.4.2",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
"cross-fetch": "^3.0.6",
"lodash": "^4.17.21",
"luxon": "^1.26.0",
"luxon": "^2.0.2",
"qs": "^6.9.6",
"react": "^16.13.1",
"react-dom": "^16.13.1",
@@ -38,10 +38,10 @@
"recharts": "^1.8.5"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+8
View File
@@ -1,5 +1,13 @@
# @backstage/plugin-catalog-backend
## 0.13.2
### Patch Changes
- Updated dependencies
- @backstage/integration@0.6.0
- @backstage/backend-common@0.8.9
## 0.13.1
### Patch Changes
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend",
"version": "0.13.1",
"version": "0.13.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,12 +29,12 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.8.6",
"@backstage/backend-common": "^0.8.9",
"@backstage/catalog-client": "^0.3.18",
"@backstage/catalog-model": "^0.9.0",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.8",
"@backstage/integration": "^0.6.0",
"@backstage/plugin-search-backend-node": "^0.4.0",
"@backstage/search-common": "^0.1.2",
"@octokit/graphql": "^4.5.8",
@@ -61,9 +61,9 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.4",
"@backstage/cli": "^0.7.6",
"@backstage/test-utils": "^0.1.16",
"@backstage/backend-test-utils": "^0.1.5",
"@backstage/cli": "^0.7.8",
"@backstage/test-utils": "^0.1.17",
"@types/core-js": "^2.5.4",
"@types/git-url-parse": "^9.0.0",
"@types/lodash": "^4.14.151",
+12
View File
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-import
## 0.5.17
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- Updated dependencies
- @backstage/integration@0.6.0
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
- @backstage/plugin-catalog-react@0.4.2
- @backstage/integration-react@0.1.7
## 0.5.16
### Patch Changes
+10 -10
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-import",
"version": "0.5.16",
"version": "0.5.17",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -32,11 +32,11 @@
"dependencies": {
"@backstage/catalog-client": "^0.3.18",
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/integration": "^0.5.9",
"@backstage/integration-react": "^0.1.6",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/integration": "^0.6.0",
"@backstage/integration-react": "^0.1.7",
"@backstage/plugin-catalog-react": "^0.4.2",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -54,10 +54,10 @@
"yaml": "^1.10.0"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^3.3.0",
+12
View File
@@ -1,5 +1,17 @@
# @backstage/plugin-catalog-react
## 0.4.2
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- a440d3b38: Move and rename `FavoriteEntity` component to `catalog-react`
- Updated dependencies
- @backstage/integration@0.6.0
- @backstage/core-app-api@0.1.8
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
## 0.4.1
### Patch Changes
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-react",
"version": "0.4.1",
"version": "0.4.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,10 +30,10 @@
"dependencies": {
"@backstage/catalog-client": "^0.3.18",
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-app-api": "^0.1.7",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/integration": "^0.5.9",
"@backstage/core-app-api": "^0.1.8",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/integration": "^0.6.0",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
@@ -47,9 +47,9 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^3.3.0",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-catalog
## 0.6.11
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- a440d3b38: Move and rename `FavoriteEntity` component to `catalog-react`
- Updated dependencies
- @backstage/integration@0.6.0
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
- @backstage/plugin-catalog-react@0.4.2
- @backstage/integration-react@0.1.7
## 0.6.10
### Patch Changes
+10 -10
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog",
"version": "0.6.10",
"version": "0.6.11",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -32,12 +32,12 @@
"dependencies": {
"@backstage/catalog-client": "^0.3.18",
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.9",
"@backstage/integration-react": "^0.1.6",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/integration": "^0.6.0",
"@backstage/integration-react": "^0.1.7",
"@backstage/plugin-catalog-react": "^0.4.2",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -54,10 +54,10 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^3.3.0",
+6 -6
View File
@@ -32,8 +32,8 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
@@ -50,10 +50,10 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+6 -6
View File
@@ -31,8 +31,8 @@
},
"dependencies": {
"@backstage/catalog-model": "^0.9.0",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
@@ -48,10 +48,10 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
@@ -1,5 +1,13 @@
# @backstage/plugin-code-coverage-backend
## 0.1.9
### Patch Changes
- Updated dependencies
- @backstage/integration@0.6.0
- @backstage/backend-common@0.8.9
## 0.1.8
### Patch Changes
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-code-coverage-backend",
"version": "0.1.8",
"version": "0.1.9",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -19,12 +19,12 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.8.5",
"@backstage/backend-common": "^0.8.9",
"@backstage/catalog-client": "^0.3.16",
"@backstage/catalog-model": "^0.9.0",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"@backstage/integration": "^0.5.8",
"@backstage/integration": "^0.6.0",
"@types/express": "^4.17.6",
"cross-fetch": "^3.0.6",
"express": "^4.17.1",
@@ -36,7 +36,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.7.1",
"@backstage/cli": "^0.7.8",
"@types/express-xml-bodyparser": "^0.3.2",
"@types/supertest": "^2.0.8",
"msw": "^0.29.0",
+6 -6
View File
@@ -22,8 +22,8 @@
"dependencies": {
"@backstage/catalog-model": "^0.9.0",
"@backstage/config": "^0.1.6",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/errors": "^0.1.1",
"@backstage/plugin-catalog-react": "^0.4.1",
"@backstage/theme": "^0.2.9",
@@ -40,10 +40,10 @@
"recharts": "^1.8.5"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+6 -6
View File
@@ -21,8 +21,8 @@
},
"dependencies": {
"@backstage/config": "^0.1.6",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/errors": "^0.1.1",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
@@ -35,10 +35,10 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-cost-insights
## 0.11.4
### Patch Changes
- 8bedb75ae: Update Luxon dependency to 2.x
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- Updated dependencies
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
## 0.11.3
### Patch Changes
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-cost-insights",
"version": "0.11.3",
"version": "0.11.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -31,8 +31,8 @@
},
"dependencies": {
"@backstage/config": "^0.1.6",
"@backstage/core-components": "^0.3.0",
"@backstage/core-plugin-api": "^0.1.5",
"@backstage/core-components": "^0.3.1",
"@backstage/core-plugin-api": "^0.1.6",
"@backstage/theme": "^0.2.9",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -42,7 +42,7 @@
"@types/recharts": "^1.8.14",
"classnames": "^2.2.6",
"history": "^5.0.0",
"luxon": "^1.26.0",
"luxon": "^2.0.2",
"pluralize": "^8.0.0",
"qs": "^6.9.4",
"react": "^16.13.1",
@@ -54,10 +54,10 @@
"yup": "^0.29.3"
},
"devDependencies": {
"@backstage/cli": "^0.7.7",
"@backstage/core-app-api": "^0.1.7",
"@backstage/dev-utils": "^0.2.5",
"@backstage/test-utils": "^0.1.16",
"@backstage/cli": "^0.7.8",
"@backstage/core-app-api": "^0.1.8",
"@backstage/dev-utils": "^0.2.6",
"@backstage/test-utils": "^0.1.17",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-explore
## 0.3.13
### Patch Changes
- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version.
- Updated dependencies
- @backstage/core-components@0.3.1
- @backstage/core-plugin-api@0.1.6
- @backstage/plugin-catalog-react@0.4.2
## 0.3.12
### Patch Changes

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