Merge branch 'master' into blam/bump-graphql-dependencies

This commit is contained in:
Ben Lambert
2022-01-14 05:44:16 +01:00
committed by GitHub
339 changed files with 4723 additions and 1759 deletions
+10
View File
@@ -1,5 +1,15 @@
# @backstage/app-defaults
## 0.1.4
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.4
- @backstage/core-plugin-api@0.5.0
- @backstage/core-app-api@0.4.0
- @backstage/plugin-permission-react@0.2.2
## 0.1.3
### Patch Changes
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
"version": "0.1.3",
"version": "0.1.4",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,10 +29,10 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/core-components": "^0.8.2",
"@backstage/core-app-api": "^0.3.0",
"@backstage/core-plugin-api": "^0.4.0",
"@backstage/plugin-permission-react": "^0.2.0",
"@backstage/core-components": "^0.8.4",
"@backstage/core-app-api": "^0.4.0",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/plugin-permission-react": "^0.2.2",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -42,8 +42,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.3",
"@backstage/test-utils": "^0.2.0",
"@backstage/cli": "^0.11.0",
"@backstage/test-utils": "^0.2.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@types/jest": "^26.0.7",
+50
View File
@@ -1,5 +1,55 @@
# example-app
## 0.2.60
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.4
- @backstage/cli@0.11.0
- @backstage/plugin-tech-insights@0.1.5
- @backstage/plugin-gocd@0.1.1
- @backstage/core-plugin-api@0.5.0
- @backstage/plugin-org@0.3.34
- @backstage/plugin-home@0.4.10
- @backstage/plugin-azure-devops@0.1.10
- @backstage/plugin-apache-airflow@0.1.3
- @backstage/plugin-catalog-import@0.7.9
- @backstage/plugin-catalog-react@0.6.11
- @backstage/plugin-code-coverage@0.1.22
- @backstage/plugin-cost-insights@0.11.17
- @backstage/plugin-jenkins@0.5.17
- @backstage/plugin-scaffolder@0.11.18
- @backstage/plugin-techdocs@0.12.14
- @backstage/plugin-kubernetes@0.5.4
- @backstage/plugin-pagerduty@0.3.22
- @backstage/plugin-api-docs@0.6.22
- @backstage/core-app-api@0.4.0
- @backstage/plugin-airbrake@0.1.0
- @backstage/app-defaults@0.1.4
- @backstage/catalog-model@0.9.9
- @backstage/integration-react@0.1.18
- @backstage/plugin-badges@0.2.19
- @backstage/plugin-catalog@0.7.8
- @backstage/plugin-catalog-graph@0.2.6
- @backstage/plugin-circleci@0.2.34
- @backstage/plugin-cloudbuild@0.2.32
- @backstage/plugin-explore@0.3.25
- @backstage/plugin-gcp-projects@0.3.13
- @backstage/plugin-github-actions@0.4.31
- @backstage/plugin-graphiql@0.2.27
- @backstage/plugin-kafka@0.2.25
- @backstage/plugin-lighthouse@0.2.34
- @backstage/plugin-newrelic@0.3.13
- @backstage/plugin-newrelic-dashboard@0.1.3
- @backstage/plugin-rollbar@0.3.23
- @backstage/plugin-search@0.5.5
- @backstage/plugin-sentry@0.3.33
- @backstage/plugin-shortcuts@0.1.19
- @backstage/plugin-tech-radar@0.5.2
- @backstage/plugin-todo@0.1.18
- @backstage/plugin-user-settings@0.3.16
## 0.2.59
### Patch Changes
+46 -46
View File
@@ -1,54 +1,54 @@
{
"name": "example-app",
"version": "0.2.59",
"version": "0.2.60",
"private": true,
"bundled": true,
"dependencies": {
"@backstage/app-defaults": "^0.1.3",
"@backstage/catalog-model": "^0.9.8",
"@backstage/cli": "^0.10.5",
"@backstage/core-app-api": "^0.3.1",
"@backstage/core-components": "^0.8.3",
"@backstage/core-plugin-api": "^0.4.1",
"@backstage/integration-react": "^0.1.16",
"@backstage/plugin-airbrake": "^0.0.0",
"@backstage/plugin-api-docs": "^0.6.21",
"@backstage/plugin-azure-devops": "^0.1.9",
"@backstage/plugin-apache-airflow": "^0.1.2",
"@backstage/plugin-badges": "^0.2.18",
"@backstage/plugin-catalog": "^0.7.7",
"@backstage/plugin-catalog-graph": "^0.2.5",
"@backstage/plugin-catalog-import": "^0.7.8",
"@backstage/plugin-catalog-react": "^0.6.10",
"@backstage/plugin-circleci": "^0.2.33",
"@backstage/plugin-cloudbuild": "^0.2.31",
"@backstage/plugin-code-coverage": "^0.1.21",
"@backstage/plugin-cost-insights": "^0.11.16",
"@backstage/plugin-explore": "^0.3.24",
"@backstage/plugin-gcp-projects": "^0.3.12",
"@backstage/plugin-github-actions": "^0.4.30",
"@backstage/plugin-gocd": "^0.1.0",
"@backstage/plugin-graphiql": "^0.2.26",
"@backstage/plugin-home": "^0.4.9",
"@backstage/plugin-jenkins": "^0.5.16",
"@backstage/plugin-kafka": "^0.2.24",
"@backstage/plugin-kubernetes": "^0.5.3",
"@backstage/plugin-lighthouse": "^0.2.33",
"@backstage/plugin-newrelic": "^0.3.12",
"@backstage/plugin-newrelic-dashboard": "^0.1.2",
"@backstage/plugin-org": "^0.3.33",
"@backstage/plugin-pagerduty": "0.3.21",
"@backstage/plugin-rollbar": "^0.3.22",
"@backstage/plugin-scaffolder": "^0.11.17",
"@backstage/plugin-search": "^0.5.4",
"@backstage/plugin-sentry": "^0.3.32",
"@backstage/plugin-shortcuts": "^0.1.18",
"@backstage/plugin-tech-radar": "^0.5.1",
"@backstage/plugin-techdocs": "^0.12.13",
"@backstage/plugin-todo": "^0.1.17",
"@backstage/plugin-user-settings": "^0.3.15",
"@backstage/app-defaults": "^0.1.4",
"@backstage/catalog-model": "^0.9.9",
"@backstage/cli": "^0.11.0",
"@backstage/core-app-api": "^0.4.0",
"@backstage/core-components": "^0.8.4",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/integration-react": "^0.1.18",
"@backstage/plugin-airbrake": "^0.1.0",
"@backstage/plugin-api-docs": "^0.6.22",
"@backstage/plugin-azure-devops": "^0.1.10",
"@backstage/plugin-apache-airflow": "^0.1.3",
"@backstage/plugin-badges": "^0.2.19",
"@backstage/plugin-catalog": "^0.7.8",
"@backstage/plugin-catalog-graph": "^0.2.6",
"@backstage/plugin-catalog-import": "^0.7.9",
"@backstage/plugin-catalog-react": "^0.6.11",
"@backstage/plugin-circleci": "^0.2.34",
"@backstage/plugin-cloudbuild": "^0.2.32",
"@backstage/plugin-code-coverage": "^0.1.22",
"@backstage/plugin-cost-insights": "^0.11.17",
"@backstage/plugin-explore": "^0.3.25",
"@backstage/plugin-gcp-projects": "^0.3.13",
"@backstage/plugin-github-actions": "^0.4.31",
"@backstage/plugin-gocd": "^0.1.1",
"@backstage/plugin-graphiql": "^0.2.27",
"@backstage/plugin-home": "^0.4.10",
"@backstage/plugin-jenkins": "^0.5.17",
"@backstage/plugin-kafka": "^0.2.25",
"@backstage/plugin-kubernetes": "^0.5.4",
"@backstage/plugin-lighthouse": "^0.2.34",
"@backstage/plugin-newrelic": "^0.3.13",
"@backstage/plugin-newrelic-dashboard": "^0.1.3",
"@backstage/plugin-org": "^0.3.34",
"@backstage/plugin-pagerduty": "0.3.22",
"@backstage/plugin-rollbar": "^0.3.23",
"@backstage/plugin-scaffolder": "^0.11.18",
"@backstage/plugin-search": "^0.5.5",
"@backstage/plugin-sentry": "^0.3.33",
"@backstage/plugin-shortcuts": "^0.1.19",
"@backstage/plugin-tech-radar": "^0.5.2",
"@backstage/plugin-techdocs": "^0.12.14",
"@backstage/plugin-todo": "^0.1.18",
"@backstage/plugin-user-settings": "^0.3.16",
"@backstage/search-common": "^0.2.0",
"@backstage/plugin-tech-insights": "^0.1.4",
"@backstage/plugin-tech-insights": "^0.1.5",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -68,7 +68,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
"@backstage/test-utils": "^0.2.0",
"@backstage/test-utils": "^0.2.2",
"@rjsf/core": "^3.2.1",
"@testing-library/cypress": "^8.0.2",
"@testing-library/jest-dom": "^5.10.1",
+16
View File
@@ -1,5 +1,21 @@
# @backstage/backend-common
## 0.10.3
### Patch Changes
- 5b406daabe: build(deps-dev): bump `http-errors` from 1.8.0 to 2.0.0
- 5333451def: Cleaned up API exports
- db5310e25e: bump `logform` to use fixed version of `color` dependency
- 7946418729: Switched to using `@manypkg/get-packages` to list monorepo packages, which provides better support for different kind of monorepo setups.
- 3b4d8caff6: The GithubUrlReader is switched to use the DefaultGithubCredentialsProvider
- f77bd5c8ff: Clean up API reports
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/integration@0.7.1
- @backstage/errors@0.2.0
- @backstage/config-loader@0.9.2
## 0.10.2
### Patch Changes
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.10.2",
"version": "0.10.3",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -30,10 +30,10 @@
},
"dependencies": {
"@backstage/cli-common": "^0.1.6",
"@backstage/config": "^0.1.11",
"@backstage/config-loader": "^0.9.1",
"@backstage/errors": "^0.1.5",
"@backstage/integration": "^0.7.0",
"@backstage/config": "^0.1.12",
"@backstage/config-loader": "^0.9.2",
"@backstage/errors": "^0.2.0",
"@backstage/integration": "^0.7.1",
"@backstage/types": "^0.1.1",
"@google-cloud/storage": "^5.8.0",
"@manypkg/get-packages": "^1.1.3",
@@ -81,8 +81,8 @@
}
},
"devDependencies": {
"@backstage/cli": "^0.10.5",
"@backstage/test-utils": "^0.2.1",
"@backstage/cli": "^0.11.0",
"@backstage/test-utils": "^0.2.2",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
"@types/concat-stream": "^1.6.0",
+4 -1
View File
@@ -39,7 +39,10 @@ const updateRedactionList = (
configs: AppConfig[],
logger: Logger,
) => {
const secretAppConfigs = schema.process(configs, { visibility: ['secret'] });
const secretAppConfigs = schema.process(configs, {
visibility: ['secret'],
withDeprecatedKeys: true,
});
const secretConfig = ConfigReader.fromConfigs(secretAppConfigs);
const values = new Set<string>();
const data = secretConfig.get();
+9
View File
@@ -1,5 +1,14 @@
# @backstage/backend-tasks
## 0.1.3
### Patch Changes
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/backend-common@0.10.3
- @backstage/errors@0.2.0
## 0.1.2
### Patch Changes
+6 -6
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
"version": "0.1.2",
"version": "0.1.3",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.10.2",
"@backstage/config": "^0.1.11",
"@backstage/errors": "^0.1.4",
"@backstage/backend-common": "^0.10.3",
"@backstage/config": "^0.1.12",
"@backstage/errors": "^0.2.0",
"@backstage/types": "^0.1.1",
"@types/luxon": "^2.0.4",
"knex": "^0.95.1",
@@ -43,8 +43,8 @@
"zod": "^3.9.5"
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.11",
"@backstage/cli": "^0.10.5",
"@backstage/backend-test-utils": "^0.1.13",
"@backstage/cli": "^0.11.0",
"jest": "^26.0.1",
"wait-for-expect": "^3.0.2"
},
+10
View File
@@ -1,5 +1,15 @@
# @backstage/backend-test-utils
## 0.1.13
### Patch Changes
- b1bc55405e: Bump `testcontainers` dependency to version `8.1.2`
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/backend-common@0.10.3
- @backstage/cli@0.11.0
## 0.1.12
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
"version": "0.1.12",
"version": "0.1.13",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -30,9 +30,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/backend-common": "^0.10.1",
"@backstage/cli": "^0.10.4",
"@backstage/config": "^0.1.9",
"@backstage/backend-common": "^0.10.3",
"@backstage/cli": "^0.11.0",
"@backstage/config": "^0.1.12",
"knex": "^0.95.1",
"mysql2": "^2.2.5",
"pg": "^8.3.0",
@@ -41,7 +41,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.4",
"@backstage/cli": "^0.11.0",
"jest": "^26.0.1"
},
"files": [
+30
View File
@@ -1,5 +1,35 @@
# example-backend
## 0.2.60
### Patch Changes
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/plugin-scaffolder-backend@0.15.20
- @backstage/integration@0.7.1
- @backstage/backend-common@0.10.3
- @backstage/plugin-todo-backend@0.1.18
- @backstage/plugin-catalog-backend@0.20.0
- @backstage/plugin-tech-insights-backend@0.1.5
- @backstage/plugin-permission-node@0.3.0
- @backstage/plugin-auth-backend@0.6.2
- @backstage/plugin-code-coverage-backend@0.1.19
- @backstage/plugin-search-backend-node@0.4.4
- @backstage/plugin-techdocs-backend@0.12.3
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.5
- @backstage/plugin-permission-backend@0.3.0
- @backstage/plugin-graphql-backend@0.1.11
- @backstage/plugin-kubernetes-backend@0.4.3
- example-app@0.2.60
- @backstage/backend-tasks@0.1.3
- @backstage/catalog-client@0.5.4
- @backstage/catalog-model@0.9.9
- @backstage/plugin-badges-backend@0.1.15
- @backstage/plugin-kafka-backend@0.2.14
- @backstage/plugin-permission-common@0.3.1
- @backstage/plugin-scaffolder-backend-module-rails@0.2.3
## 0.2.59
### Patch Changes
+26 -26
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.59",
"version": "0.2.60",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -24,43 +24,43 @@
"migrate:create": "knex migrate:make -x ts"
},
"dependencies": {
"@backstage/backend-common": "^0.10.1",
"@backstage/backend-tasks": "^0.1.0",
"@backstage/catalog-client": "^0.5.3",
"@backstage/catalog-model": "^0.9.8",
"@backstage/config": "^0.1.10",
"@backstage/integration": "^0.7.0",
"@backstage/backend-common": "^0.10.3",
"@backstage/backend-tasks": "^0.1.3",
"@backstage/catalog-client": "^0.5.4",
"@backstage/catalog-model": "^0.9.9",
"@backstage/config": "^0.1.12",
"@backstage/integration": "^0.7.1",
"@backstage/plugin-app-backend": "^0.3.21",
"@backstage/plugin-auth-backend": "^0.6.0",
"@backstage/plugin-auth-backend": "^0.6.2",
"@backstage/plugin-azure-devops-backend": "^0.2.6",
"@backstage/plugin-badges-backend": "^0.1.14",
"@backstage/plugin-catalog-backend": "^0.19.4",
"@backstage/plugin-code-coverage-backend": "^0.1.18",
"@backstage/plugin-graphql-backend": "^0.1.10",
"@backstage/plugin-badges-backend": "^0.1.15",
"@backstage/plugin-catalog-backend": "^0.20.0",
"@backstage/plugin-code-coverage-backend": "^0.1.19",
"@backstage/plugin-graphql-backend": "^0.1.11",
"@backstage/plugin-jenkins-backend": "^0.1.10",
"@backstage/plugin-kubernetes-backend": "^0.4.1",
"@backstage/plugin-kafka-backend": "^0.2.13",
"@backstage/plugin-permission-backend": "^0.2.3",
"@backstage/plugin-permission-common": "^0.3.0",
"@backstage/plugin-permission-node": "^0.2.3",
"@backstage/plugin-kubernetes-backend": "^0.4.3",
"@backstage/plugin-kafka-backend": "^0.2.14",
"@backstage/plugin-permission-backend": "^0.3.0",
"@backstage/plugin-permission-common": "^0.3.1",
"@backstage/plugin-permission-node": "^0.3.0",
"@backstage/plugin-proxy-backend": "^0.2.15",
"@backstage/plugin-rollbar-backend": "^0.1.18",
"@backstage/plugin-scaffolder-backend": "^0.15.19",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.2.2",
"@backstage/plugin-scaffolder-backend": "^0.15.20",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.2.3",
"@backstage/plugin-search-backend": "^0.3.0",
"@backstage/plugin-search-backend-node": "^0.4.2",
"@backstage/plugin-search-backend-node": "^0.4.4",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.0.7",
"@backstage/plugin-search-backend-module-pg": "^0.2.3",
"@backstage/plugin-techdocs-backend": "^0.12.2",
"@backstage/plugin-tech-insights-backend": "^0.1.4",
"@backstage/plugin-techdocs-backend": "^0.12.3",
"@backstage/plugin-tech-insights-backend": "^0.1.5",
"@backstage/plugin-tech-insights-node": "^0.1.2",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.4",
"@backstage/plugin-todo-backend": "^0.1.17",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.5",
"@backstage/plugin-todo-backend": "^0.1.18",
"@gitbeaker/node": "^34.6.0",
"@octokit/rest": "^18.5.3",
"azure-devops-node-api": "^11.0.1",
"dockerode": "^3.3.1",
"example-app": "^0.2.58",
"example-app": "^0.2.60",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"express-prom-bundle": "^6.3.6",
@@ -72,7 +72,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.10.4",
"@backstage/cli": "^0.11.0",
"@types/dockerode": "^3.3.0",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5"
+8
View File
@@ -1,5 +1,13 @@
# @backstage/catalog-client
## 0.5.4
### Patch Changes
- Updated dependencies
- @backstage/errors@0.2.0
- @backstage/catalog-model@0.9.9
## 0.5.3
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/catalog-client",
"description": "An isomorphic client for the catalog backend",
"version": "0.5.3",
"version": "0.5.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,12 +30,12 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/catalog-model": "^0.9.7",
"@backstage/errors": "^0.1.4",
"@backstage/catalog-model": "^0.9.9",
"@backstage/errors": "^0.2.0",
"cross-fetch": "^3.0.6"
},
"devDependencies": {
"@backstage/cli": "^0.10.3",
"@backstage/cli": "^0.11.0",
"@types/jest": "^26.0.7",
"msw": "^0.35.0"
},
+8
View File
@@ -1,5 +1,13 @@
# @backstage/catalog-model
## 0.9.9
### Patch Changes
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/errors@0.2.0
## 0.9.8
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/catalog-model",
"description": "Types and validators that help describe the model of a Backstage Catalog",
"version": "0.9.8",
"version": "0.9.9",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,8 +30,8 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.11",
"@backstage/errors": "^0.1.4",
"@backstage/config": "^0.1.12",
"@backstage/errors": "^0.2.0",
"@backstage/types": "^0.1.1",
"@types/json-schema": "^7.0.5",
"@types/yup": "^0.29.13",
@@ -42,7 +42,7 @@
"yup": "^0.32.9"
},
"devDependencies": {
"@backstage/cli": "^0.10.2",
"@backstage/cli": "^0.11.0",
"@types/jest": "^26.0.7",
"@types/lodash": "^4.14.151",
"yaml": "^1.9.2"
+39
View File
@@ -1,5 +1,44 @@
# @backstage/cli
## 0.11.0
### Minor Changes
- 14e980acee: ESLint upgraded to version 8 and all it's plugins updated to newest version.
If you use any custom plugins for ESLint please check compatibility.
```diff
- "@typescript-eslint/eslint-plugin": "^v4.33.0",
- "@typescript-eslint/parser": "^v4.28.3",
+ "@typescript-eslint/eslint-plugin": "^5.9.0",
+ "@typescript-eslint/parser": "^5.9.0",
- "eslint": "^7.30.0",
+ "eslint": "^8.6.0",
- "eslint-plugin-import": "^2.20.2",
- "eslint-plugin-jest": "^24.1.0",
- "eslint-plugin-jsx-a11y": "^6.2.1",
+ "eslint-plugin-import": "^2.25.4",
+ "eslint-plugin-jest": "^25.3.4",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
- "eslint-plugin-react": "^7.12.4",
- "eslint-plugin-react-hooks": "^4.0.0",
+ "eslint-plugin-react": "^7.28.0",
+ "eslint-plugin-react-hooks": "^4.3.0",
```
Please consult changelogs from packages if you find any problems.
### Patch Changes
- f302d24d34: Switch Webpack minification to use `esbuild` instead of `terser`.
- bee7082094: Update `config/eslint.js` to forbid imports of `@material-ui/icons/` as well.
- 7946418729: Switched to using `@manypkg/get-packages` to list monorepo packages, which provides better support for different kind of monorepo setups.
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/errors@0.2.0
- @backstage/config-loader@0.9.2
## 0.10.5
### Patch Changes
+11 -11
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
"version": "0.10.5",
"version": "0.11.0",
"private": false,
"publishConfig": {
"access": "public"
@@ -29,9 +29,9 @@
},
"dependencies": {
"@backstage/cli-common": "^0.1.6",
"@backstage/config": "^0.1.11",
"@backstage/config-loader": "^0.9.1",
"@backstage/errors": "^0.1.5",
"@backstage/config": "^0.1.12",
"@backstage/config-loader": "^0.9.2",
"@backstage/errors": "^0.2.0",
"@backstage/types": "^0.1.1",
"@hot-loader/react-dom": "^16.13.0",
"@manypkg/get-packages": "^1.1.3",
@@ -115,13 +115,13 @@
"yn": "^4.0.0"
},
"devDependencies": {
"@backstage/backend-common": "^0.10.2",
"@backstage/config": "^0.1.11",
"@backstage/core-components": "^0.8.3",
"@backstage/core-plugin-api": "^0.4.1",
"@backstage/core-app-api": "^0.3.1",
"@backstage/dev-utils": "^0.2.16",
"@backstage/test-utils": "^0.2.1",
"@backstage/backend-common": "^0.10.3",
"@backstage/config": "^0.1.12",
"@backstage/core-components": "^0.8.4",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/core-app-api": "^0.4.0",
"@backstage/dev-utils": "^0.2.17",
"@backstage/test-utils": "^0.2.2",
"@backstage/theme": "^0.2.14",
"@types/diff": "^5.0.0",
"@types/express": "^4.17.6",
@@ -23,5 +23,6 @@ export default async (cmd: Command) => {
fromPackage: cmd.package,
mockEnv: cmd.lax,
fullVisibility: !cmd.frontend,
withDeprecatedKeys: cmd.deprecated,
});
};
+1
View File
@@ -193,6 +193,7 @@ export function registerCommands(program: CommanderStatic) {
)
.option('--lax', 'Do not require environment variables to be set')
.option('--frontend', 'Only validate the frontend configuration')
.option('--deprecated', 'Output deprecated configuration settings')
.option(...configOption)
.description(
'Validate that the given configuration loads and matches schema',
+2
View File
@@ -30,6 +30,7 @@ type Options = {
fromPackage?: string;
mockEnv?: boolean;
withFilteredKeys?: boolean;
withDeprecatedKeys?: boolean;
fullVisibility?: boolean;
};
@@ -91,6 +92,7 @@ export async function loadCliConfig(options: Options) {
? ['frontend', 'backend', 'secret']
: ['frontend'],
withFilteredKeys: options.withFilteredKeys,
withDeprecatedKeys: options.withDeprecatedKeys,
});
const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs);
+9
View File
@@ -1,5 +1,14 @@
# @backstage/codemods
## 0.1.29
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.8.4
- @backstage/core-plugin-api@0.5.0
- @backstage/core-app-api@0.4.0
## 0.1.28
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/codemods",
"description": "A collection of codemods for Backstage projects",
"version": "0.1.28",
"version": "0.1.29",
"private": false,
"publishConfig": {
"access": "public",
+8
View File
@@ -1,5 +1,13 @@
# @backstage/config-loader
## 0.9.2
### Patch Changes
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/errors@0.2.0
## 0.9.1
### Patch Changes
+1
View File
@@ -21,6 +21,7 @@ export type ConfigSchemaProcessingOptions = {
visibility?: ConfigVisibility[];
valueTransform?: TransformFunc<any>;
withFilteredKeys?: boolean;
withDeprecatedKeys?: boolean;
};
// @public (undocumented)
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/config-loader",
"description": "Config loading functionality used by Backstage backend, and CLI",
"version": "0.9.1",
"version": "0.9.2",
"private": false,
"publishConfig": {
"access": "public",
@@ -31,8 +31,8 @@
},
"dependencies": {
"@backstage/cli-common": "^0.1.6",
"@backstage/config": "^0.1.11",
"@backstage/errors": "^0.1.4",
"@backstage/config": "^0.1.12",
"@backstage/errors": "^0.2.0",
"@backstage/types": "^0.1.1",
"@types/json-schema": "^7.0.6",
"ajv": "^7.0.3",
@@ -182,10 +182,10 @@ function compileTsSchemas(paths: string[]) {
program,
// All schemas should export a `Config` symbol
'Config',
// This enables usage of @visibility is doc comments
// This enables usage of @visibility and @deprecated in doc comments
{
required: true,
validationKeywords: ['visibility'],
validationKeywords: ['visibility', 'deprecated'],
},
[path.split(sep).join('/')], // Unix paths are expected for all OSes here
) as JsonObject | null;
@@ -40,6 +40,7 @@ describe('compileConfigSchemas', () => {
],
visibilityByDataPath: new Map(),
visibilityBySchemaPath: new Map(),
deprecationByDataPath: new Map(),
});
expect(validate([{ data: { b: 'b' }, context: 'test' }])).toEqual({
errors: [
@@ -53,6 +54,7 @@ describe('compileConfigSchemas', () => {
],
visibilityByDataPath: new Map(),
visibilityBySchemaPath: new Map(),
deprecationByDataPath: new Map(),
});
});
@@ -112,6 +114,7 @@ describe('compileConfigSchemas', () => {
'/properties/d/items': 'frontend',
}),
),
deprecationByDataPath: new Map(),
});
});
@@ -137,4 +140,34 @@ describe('compileConfigSchemas', () => {
"Config schema visibility is both 'frontend' and 'secret' for properties/a/visibility",
);
});
it('should discover deprecations', () => {
const validate = compileConfigSchemas([
{
path: 'a1',
value: {
type: 'object',
properties: {
a: { type: 'string', deprecated: 'deprecation reason for a' },
b: { type: 'string', deprecated: 'deprecation reason for b' },
c: { type: 'string' },
},
},
},
]);
expect(
validate([
{ data: { a: 'a', b: 'b', c: 'c', d: ['d'] }, context: 'test' },
]),
).toEqual({
deprecationByDataPath: new Map(
Object.entries({
'/a': 'deprecation reason for a',
'/b': 'deprecation reason for b',
}),
),
visibilityByDataPath: new Map(),
visibilityBySchemaPath: new Map(),
});
});
});
@@ -40,6 +40,7 @@ export function compileConfigSchemas(
// output during validation. We work around this by having this extra piece
// of state that we reset before each validation.
const visibilityByDataPath = new Map<string, ConfigVisibility>();
const deprecationByDataPath = new Map<string, string>();
const ajv = new Ajv({
allErrors: true,
@@ -47,28 +48,48 @@ export function compileConfigSchemas(
schemas: {
'https://backstage.io/schema/config-v1': true,
},
}).addKeyword({
keyword: 'visibility',
metaSchema: {
type: 'string',
enum: CONFIG_VISIBILITIES,
},
compile(visibility: ConfigVisibility) {
return (_data, context) => {
if (context?.dataPath === undefined) {
return false;
}
if (visibility && visibility !== 'backend') {
})
.addKeyword({
keyword: 'visibility',
metaSchema: {
type: 'string',
enum: CONFIG_VISIBILITIES,
},
compile(visibility: ConfigVisibility) {
return (_data, context) => {
if (context?.dataPath === undefined) {
return false;
}
if (visibility && visibility !== 'backend') {
const normalizedPath = context.dataPath.replace(
/\['?(.*?)'?\]/g,
(_, segment) => `/${segment}`,
);
visibilityByDataPath.set(normalizedPath, visibility);
}
return true;
};
},
})
.removeKeyword('deprecated') // remove `deprecated` keyword so that we can implement our own compiler
.addKeyword({
keyword: 'deprecated',
metaSchema: { type: 'string' },
compile(deprecationDescription: string) {
return (_data, context) => {
if (context?.dataPath === undefined) {
return false;
}
const normalizedPath = context.dataPath.replace(
/\['?(.*?)'?\]/g,
(_, segment) => `/${segment}`,
);
visibilityByDataPath.set(normalizedPath, visibility);
}
return true;
};
},
});
// create mapping of deprecation description and data path of property
deprecationByDataPath.set(normalizedPath, deprecationDescription);
return true;
};
},
});
for (const schema of schemas) {
try {
@@ -79,6 +100,7 @@ export function compileConfigSchemas(
}
const merged = mergeConfigSchemas(schemas.map(_ => _.value));
const validate = ajv.compile(merged);
const visibilityBySchemaPath = new Map<string, ConfigVisibility>();
@@ -94,17 +116,20 @@ export function compileConfigSchemas(
visibilityByDataPath.clear();
const valid = validate(config);
if (!valid) {
return {
errors: validate.errors ?? [],
visibilityByDataPath: new Map(visibilityByDataPath),
visibilityBySchemaPath,
deprecationByDataPath,
};
}
return {
visibilityByDataPath: new Map(visibilityByDataPath),
visibilityBySchemaPath,
deprecationByDataPath,
};
};
}
@@ -64,6 +64,13 @@ const visibility = new Map<string, ConfigVisibility>(
}),
);
const deprecations = new Map<string, string>(
Object.entries({
'/arr': 'deprecated array',
'/objB/never': 'deprecated nested property',
}),
);
describe('filterByVisibility', () => {
test.each<[ConfigVisibility[], JsonObject]>([
[
@@ -185,9 +192,34 @@ describe('filterByVisibility', () => {
[['frontend', 'backend', 'secret'], { data, filteredKeys: [] }],
])('should filter correctly with %p', (filter, expected) => {
expect(
filterByVisibility(data, filter, visibility, undefined, true),
filterByVisibility(
data,
filter,
visibility,
deprecations,
undefined,
true,
false,
),
).toEqual(expected);
});
it('should include deprecated keys regardless of visibility', () => {
expect(
filterByVisibility(
data,
[],
visibility,
deprecations,
undefined,
true,
true,
).deprecatedKeys,
).toEqual([
{ key: 'arr', description: 'deprecated array' },
{ key: 'objB.never', description: 'deprecated nested property' },
]);
});
});
describe('filterErrorsByVisibility', () => {
@@ -30,10 +30,17 @@ export function filterByVisibility(
data: JsonObject,
includeVisibilities: ConfigVisibility[],
visibilityByDataPath: Map<string, ConfigVisibility>,
deprecationByDataPath: Map<string, string>,
transformFunc?: TransformFunc<number | string | boolean>,
withFilteredKeys?: boolean,
): { data: JsonObject; filteredKeys?: string[] } {
withDeprecatedKeys?: boolean,
): {
data: JsonObject;
filteredKeys?: string[];
deprecatedKeys?: { key: string; description: string }[];
} {
const filteredKeys = new Array<string>();
const deprecatedKeys = new Array<{ key: string; description: string }>();
function transform(
jsonVal: JsonValue,
@@ -44,6 +51,12 @@ export function filterByVisibility(
visibilityByDataPath.get(visibilityPath) ?? DEFAULT_CONFIG_VISIBILITY;
const isVisible = includeVisibilities.includes(visibility);
// deprecated keys are added regardless of visibility indicator
const deprecation = deprecationByDataPath.get(visibilityPath);
if (deprecation) {
deprecatedKeys.push({ key: filterPath, description: deprecation });
}
if (typeof jsonVal !== 'object') {
if (isVisible) {
if (transformFunc) {
@@ -109,6 +122,7 @@ export function filterByVisibility(
return {
filteredKeys: withFilteredKeys ? filteredKeys : undefined,
deprecatedKeys: withDeprecatedKeys ? deprecatedKeys : undefined,
data: (transform(data, '', '') as JsonObject) ?? {},
};
}
@@ -62,7 +62,10 @@ describe('loadConfigSchema', () => {
expect(schema.process(configs)).toEqual(configs);
expect(schema.process(configs, { visibility: ['frontend'] })).toEqual([
{ data: { key1: 'a' }, context: 'test' },
{
data: { key1: 'a' },
context: 'test',
},
]);
expect(
schema.process(configs, {
@@ -71,7 +74,11 @@ describe('loadConfigSchema', () => {
withFilteredKeys: true,
}),
).toEqual([
{ data: { key1: 'X' }, context: 'test', filteredKeys: ['key2'] },
{
data: { key1: 'X' },
context: 'test',
filteredKeys: ['key2'],
},
]);
expect(
schema.process(configs, {
@@ -79,14 +86,21 @@ describe('loadConfigSchema', () => {
withFilteredKeys: true,
}),
).toEqual([
{ data: { key1: 'X', key2: 'X' }, context: 'test', filteredKeys: [] },
{
data: { key1: 'X', key2: 'X' },
context: 'test',
filteredKeys: [],
},
]);
const serialized = schema.serialize();
const schema2 = await loadConfigSchema({ serialized });
expect(schema2.process(configs, { visibility: ['frontend'] })).toEqual([
{ data: { key1: 'a' }, context: 'test' },
{
data: { key1: 'a' },
context: 'test',
},
]);
expect(() =>
schema2.process([...configs, { data: { key1: 3 }, context: 'test2' }]),
@@ -131,7 +145,10 @@ describe('loadConfigSchema', () => {
'Config validation failed, Config should be number { type=number } at /key2',
);
expect(schema.process(configs, { visibility: ['frontend'] })).toEqual([
{ data: { key1: 'a' }, context: 'test' },
{
data: { key1: 'a' },
context: 'test',
},
]);
expect(() => schema.process(configs, { visibility: ['secret'] })).toThrow(
'Config validation failed, Config should be number { type=number } at /key2',
@@ -179,7 +196,12 @@ describe('loadConfigSchema', () => {
];
expect(
schema.process(mkConfig({ x: 1 }), { visibility: ['frontend'] }),
).toEqual([{ data: { nested: [{}] }, context: 'test' }]);
).toEqual([
{
data: { nested: [{}] },
context: 'test',
},
]);
expect(() => schema.process(mkConfig({ y: 1 }))).toThrow(
'Config validation failed, Config should be string { type=string } at /nested/0/y',
);
@@ -190,10 +212,20 @@ describe('loadConfigSchema', () => {
);
expect(
schema.process(mkConfig({ x: 'a' }), { visibility: ['frontend'] }),
).toEqual([{ data: { nested: [{}] }, context: 'test' }]);
).toEqual([
{
data: { nested: [{}] },
context: 'test',
},
]);
expect(
schema.process(mkConfig({ y: 'aaa' }), { visibility: ['frontend'] }),
).toEqual([{ data: { nested: [{ y: 'aaa' }] }, context: 'test' }]);
).toEqual([
{
data: { nested: [{ y: 'aaa' }] },
context: 'test',
},
]);
expect(() =>
schema.process(mkConfig({ y: 'aaaa' }), { visibility: ['frontend'] }),
).toThrow(
@@ -82,7 +82,7 @@ export async function loadConfigSchema(
return {
process(
configs: AppConfig[],
{ visibility, valueTransform, withFilteredKeys } = {},
{ visibility, valueTransform, withFilteredKeys, withDeprecatedKeys } = {},
): AppConfig[] {
const result = validate(configs);
@@ -105,8 +105,10 @@ export async function loadConfigSchema(
data,
visibility,
result.visibilityByDataPath,
result.deprecationByDataPath,
valueTransform,
withFilteredKeys,
withDeprecatedKeys,
),
}));
} else if (valueTransform) {
@@ -116,8 +118,10 @@ export async function loadConfigSchema(
data,
Array.from(CONFIG_VISIBILITIES),
result.visibilityByDataPath,
result.deprecationByDataPath,
valueTransform,
withFilteredKeys,
withDeprecatedKeys,
),
}));
}
@@ -81,6 +81,13 @@ type ValidationResult = {
* The path in the key uses the form `/properties/<key>/items/additionalProperties/<leaf-key>`
*/
visibilityBySchemaPath: Map<string, ConfigVisibility>;
/**
* The deprecated options that were discovered during validation.
*
* The path in the key uses the form `/<key>/<sub-key>/<array-index>/<leaf-key>`
*/
deprecationByDataPath: Map<string, string>;
};
/**
@@ -124,6 +131,13 @@ export type ConfigSchemaProcessingOptions = {
* Default: `false`.
*/
withFilteredKeys?: boolean;
/**
* Whether or not to include the `deprecatedKeys` property in the output `AppConfig`s.
*
* Default: `true`.
*/
withDeprecatedKeys?: boolean;
};
/**
+6
View File
@@ -1,5 +1,11 @@
# @backstage/config
## 0.1.12
### Patch Changes
- f5343e7c1a: The `ConfigReader#get` method now always returns a deep clone of the configuration data.
## 0.1.11
### Patch Changes
+4
View File
@@ -13,6 +13,10 @@ export type AppConfig = {
context: string;
data: JsonObject_2;
filteredKeys?: string[];
deprecatedKeys?: {
key: string;
description: string;
}[];
};
// @public
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/config",
"description": "Config API used by Backstage core, backend, and CLI",
"version": "0.1.11",
"version": "0.1.12",
"private": false,
"publishConfig": {
"access": "public",
@@ -34,7 +34,7 @@
"lodash": "^4.17.21"
},
"devDependencies": {
"@backstage/test-utils": "^0.2.0",
"@backstage/test-utils": "^0.2.2",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
+13 -1
View File
@@ -83,9 +83,21 @@ export class ConfigReader implements Config {
// Merge together all configs into a single config with recursive fallback
// readers, giving the first config object in the array the lowest priority.
return configs.reduce<ConfigReader>(
(previousReader, { data, context, filteredKeys }) => {
(previousReader, { data, context, filteredKeys, deprecatedKeys }) => {
const reader = new ConfigReader(data, context, previousReader);
reader.filteredKeys = filteredKeys;
if (deprecatedKeys) {
for (const { key, description } of deprecatedKeys) {
// eslint-disable-next-line no-console
console.warn(
`The configuration key '${key}' of ${context} is deprecated and may be removed soon. ${
description || ''
}`,
);
}
}
return reader;
},
undefined!,
+6
View File
@@ -36,6 +36,12 @@ export type AppConfig = {
* This can be used to warn the user if they try to read any of these keys.
*/
filteredKeys?: string[];
/**
* A list of deprecated keys that were found in the configuration when it was loaded.
*
* This can be used to warn the user if they are using deprecated properties.
*/
deprecatedKeys?: { key: string; description: string }[];
};
/**
+17
View File
@@ -1,5 +1,22 @@
# @backstage/core-app-api
## 0.4.0
### Minor Changes
- e2eb92c109: Removed previously deprecated `ApiRegistry` export.
### Patch Changes
- 34442cd5cf: Fixed an issue where valid SAML and GitHub sessions would be considered invalid and not be stored.
Deprecated the `SamlSession` and `GithubSession` types.
- 784d8078ab: Removed direct and transitive MUI dependencies.
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/core-plugin-api@0.5.0
## 0.3.1
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
"version": "0.3.1",
"version": "0.4.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,8 +29,8 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.11",
"@backstage/core-plugin-api": "^0.4.1",
"@backstage/config": "^0.1.12",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/types": "^0.1.1",
"@backstage/version-bridge": "^0.1.1",
"@types/prop-types": "^15.7.3",
@@ -45,8 +45,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.5",
"@backstage/test-utils": "^0.2.0",
"@backstage/cli": "^0.11.0",
"@backstage/test-utils": "^0.2.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^7.0.2",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/core-components
## 0.8.4
### Patch Changes
- 6415189d99: Add a `ProxiedSignInPage` that can be used e.g. for GCP IAP and AWS ALB
- de2396da24: Create a short delay when `<SidebarSubmenu/>` is opened
- 5333451def: Cleaned up API exports
- e2eb92c109: Updated `ResponseErrorPanel` to not use the deprecated `data` property of `ResponseError`.
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/core-plugin-api@0.5.0
- @backstage/errors@0.2.0
## 0.8.3
### Patch Changes
+10
View File
@@ -752,6 +752,16 @@ export function Progress(
props: PropsWithChildren<LinearProgressProps>,
): JSX.Element;
// @public
export const ProxiedSignInPage: (
props: ProxiedSignInPageProps,
) => JSX.Element | null;
// @public
export type ProxiedSignInPageProps = SignInPageProps & {
provider: string;
};
// Warning: (ae-missing-release-tag) "Ranker" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public
+13 -10
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
"version": "0.8.3",
"version": "0.8.4",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.11",
"@backstage/core-plugin-api": "^0.4.1",
"@backstage/errors": "^0.1.5",
"@backstage/config": "^0.1.12",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/errors": "^0.2.0",
"@backstage/theme": "^0.2.14",
"@material-table/core": "^3.1.0",
"@material-ui/core": "^4.12.2",
@@ -58,13 +58,14 @@
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-sparklines": "^1.7.0",
"react-syntax-highlighter": "^15.4.3",
"react-syntax-highlighter": "^15.4.5",
"react-text-truncate": "^0.16.0",
"react-use": "^17.2.4",
"react-virtualized-auto-sizer": "^1.0.6",
"react-window": "^1.8.6",
"remark-gfm": "^2.0.0",
"zen-observable": "^0.8.15"
"zen-observable": "^0.8.15",
"zod": "^3.11.6"
},
"peerDependencies": {
"@types/react": "^16.13.1 || ^17.0.0",
@@ -72,9 +73,9 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/core-app-api": "^0.3.1",
"@backstage/cli": "^0.10.5",
"@backstage/test-utils": "^0.2.0",
"@backstage/core-app-api": "^0.4.0",
"@backstage/cli": "^0.11.0",
"@backstage/test-utils": "^0.2.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^7.0.2",
@@ -92,7 +93,9 @@
"@types/react-syntax-highlighter": "^13.5.2",
"@types/react-virtualized-auto-sizer": "^1.0.1",
"@types/react-window": "^1.8.5",
"@types/zen-observable": "^0.8.0"
"@types/zen-observable": "^0.8.0",
"cross-fetch": "^3.0.6",
"msw": "^0.35.0"
},
"files": [
"dist"
@@ -0,0 +1,166 @@
/*
* Copyright 2022 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { setupRequestMockHandlers } from '@backstage/test-utils';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import {
DEFAULTS,
ProxiedSignInIdentity,
tokenToExpiry,
} from './ProxiedSignInIdentity';
const validBackstageTokenExpClaim = 1641216199;
const validBackstageToken =
'eyJhbGciOiJFUzI1NiIsImtpZCI6ImMxNTMzNDRiLWZjYzktNGIwOS1iN2ZhLTU3ZmM5MDhjMjBiNiJ9.eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjcwMDcvYXBpL2F1dGgiLCJzdWIiOiJmcmViZW4iLCJhdWQiOiJiYWNrc3RhZ2UiLCJpYXQiOjE2NDEyMTI1OTksImV4cCI6MTY0MTIxNjE5OSwiZW50IjpbInVzZXI6ZGVmYXVsdC9mcmViZW4iXX0.4nOTmPHPwhzaKTzikgUsHcszfcP-JamcojMnRfyfsKhyHCCEywe6uLFlvvmK5NbaX5Z7IIji-kg7bxKU58kwoQ';
describe('ProxiedSignInIdentity', () => {
describe('tokenToExpiry', () => {
beforeEach(() => jest.useFakeTimers('modern'));
afterEach(() => jest.useRealTimers());
it('handles undefined', async () => {
expect(tokenToExpiry(undefined)).toEqual(
new Date(Date.now() + DEFAULTS.defaultTokenExpiryMillis),
);
});
it('handles a valid token', async () => {
expect(tokenToExpiry(validBackstageToken)).toEqual(
new Date(
validBackstageTokenExpClaim * 1000 - DEFAULTS.tokenExpiryMarginMillis,
),
);
});
it('handles a token that has no exp', async () => {
const [a, _b, c] = validBackstageToken.split('.');
const botched = `${a}.${btoa(JSON.stringify({}))}.${c}`;
expect(tokenToExpiry(botched)).toEqual(
new Date(new Date(Date.now() + DEFAULTS.defaultTokenExpiryMillis)),
);
});
});
describe('ProxiedSignInIdentity', () => {
beforeEach(() => jest.useFakeTimers('modern'));
afterEach(() => jest.useRealTimers());
const worker = setupServer();
setupRequestMockHandlers(worker);
it('runs the happy path', async () => {
const getBaseUrl = jest.fn();
const serverCalled = jest.fn();
function makeToken() {
const iat = Math.floor(Date.now() / 1000);
const exp = iat + 3600;
return {
providerInfo: {
stuff: 1,
},
profile: {
email: 'e',
displayName: 'd',
picture: 'p',
},
backstageIdentity: {
token: [
'eyJhbGciOiJFUzI1NiIsImtpZCI6ImMxNTMzNDRiLWZjYzktNGIwOS1iN2ZhLTU3ZmM5MDhjMjBiNiJ9',
btoa(
JSON.stringify({
iss: 'http://localhost:7007/api/auth',
sub: 'user:default/freben',
aud: 'backstage',
iat,
exp,
ent: ['group:default/my-team'],
}),
).replace(/=/g, ''),
'4nOTmPHPwhzaKTzikgUsHcszfcP-JamcojMnRfyfsKhyHCCEywe6uLFlvvmK5NbaX5Z7IIji-kg7bxKU58kwoQ',
].join('.'),
identity: {
type: 'user',
userEntityRef: 'k:ns/ue',
ownershipEntityRefs: ['k:ns/oe'],
},
},
};
}
worker.events.on('request:match', serverCalled);
worker.use(
rest.get('http://example.com/api/auth/foo/refresh', (_, res, ctx) =>
res(
ctx.status(200),
ctx.set('Content-Type', 'application/json'),
ctx.json(makeToken()),
),
),
);
const identity = new ProxiedSignInIdentity({
provider: 'foo',
discoveryApi: { getBaseUrl },
});
getBaseUrl.mockResolvedValue('http://example.com/api/auth');
await identity.start(); // should not throw
expect(getBaseUrl).toBeCalledTimes(1);
expect(getBaseUrl).lastCalledWith('auth');
expect(serverCalled).toBeCalledTimes(1);
// All information should now be available
await expect(identity.getBackstageIdentity()).resolves.toEqual({
type: 'user',
userEntityRef: 'k:ns/ue',
ownershipEntityRefs: ['k:ns/oe'],
});
await expect(identity.getIdToken()).resolves.toEqual(expect.any(String));
await expect(identity.getCredentials()).resolves.toEqual({
token: expect.any(String),
});
await expect(identity.getProfileInfo()).resolves.toEqual({
email: 'e',
displayName: 'd',
picture: 'p',
});
expect(identity.getUserId()).toBe('ue');
expect(identity.getProfile()).toEqual({
email: 'e',
displayName: 'd',
picture: 'p',
});
await identity.getSessionAsync(); // no need to fetch again just yet
expect(serverCalled).toBeCalledTimes(1);
// Use a fairly large margin (1000) since the iat and exp are clamped to
// full seconds, but the "local current time" isn't
jest.advanceTimersByTime(
3600 * 1000 - DEFAULTS.tokenExpiryMarginMillis - 1000,
);
await identity.getSessionAsync(); // still no need to fetch again
expect(serverCalled).toBeCalledTimes(1);
jest.advanceTimersByTime(1001);
await identity.getSessionAsync(); // now the expiry has passed
expect(serverCalled).toBeCalledTimes(2);
});
});
});
@@ -0,0 +1,214 @@
/*
* Copyright 2021 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
BackstageUserIdentity,
discoveryApiRef,
IdentityApi,
ProfileInfo,
} from '@backstage/core-plugin-api';
import { ResponseError } from '@backstage/errors';
import { ProxiedSession, proxiedSessionSchema } from './types';
export const DEFAULTS = {
// The amount of time between token refreshes, if we fail to get an actual
// value out of the exp claim
defaultTokenExpiryMillis: 5 * 60 * 1000,
// The amount of time before the actual expiry of the Backstage token, that we
// shall start trying to get a new one
tokenExpiryMarginMillis: 5 * 60 * 1000,
} as const;
// When the token expires, with some margin
export function tokenToExpiry(jwtToken: string | undefined): Date {
const fallback = new Date(Date.now() + DEFAULTS.defaultTokenExpiryMillis);
if (!jwtToken) {
return fallback;
}
const [_header, rawPayload, _signature] = jwtToken.split('.');
const payload = JSON.parse(atob(rawPayload));
if (typeof payload.exp !== 'number') {
return fallback;
}
return new Date(payload.exp * 1000 - DEFAULTS.tokenExpiryMarginMillis);
}
type ProxiedSignInIdentityOptions = {
provider: string;
discoveryApi: typeof discoveryApiRef.T;
};
type State =
| {
type: 'empty';
}
| {
type: 'fetching';
promise: Promise<ProxiedSession>;
previous: ProxiedSession | undefined;
}
| {
type: 'active';
session: ProxiedSession;
expiresAt: Date;
}
| {
type: 'failed';
error: Error;
};
/**
* An identity API that gets the user auth information solely based on a
* provider's `/refresh` endpoint.
*/
export class ProxiedSignInIdentity implements IdentityApi {
private readonly options: ProxiedSignInIdentityOptions;
private readonly abortController: AbortController;
private state: State;
constructor(options: ProxiedSignInIdentityOptions) {
this.options = options;
this.abortController = new AbortController();
this.state = { type: 'empty' };
}
async start() {
// Try to make a first fetch, bubble up any errors to the caller
await this.getSessionAsync();
}
/** {@inheritdoc @backstage/core-plugin-api#IdentityApi.getUserId} */
getUserId(): string {
const { backstageIdentity } = this.getSessionSync();
const ref = backstageIdentity.identity.userEntityRef;
const match = /^([^:/]+:)?([^:/]+\/)?([^:/]+)$/.exec(ref);
if (!match) {
throw new TypeError(`Invalid user entity reference "${ref}"`);
}
return match[3];
}
/** {@inheritdoc @backstage/core-plugin-api#IdentityApi.getIdToken} */
async getIdToken(): Promise<string | undefined> {
const session = await this.getSessionAsync();
return session.backstageIdentity.token;
}
/** {@inheritdoc @backstage/core-plugin-api#IdentityApi.getProfile} */
getProfile(): ProfileInfo {
const session = this.getSessionSync();
return session.profile;
}
/** {@inheritdoc @backstage/core-plugin-api#IdentityApi.getProfileInfo} */
async getProfileInfo(): Promise<ProfileInfo> {
const session = await this.getSessionAsync();
return session.profile;
}
/** {@inheritdoc @backstage/core-plugin-api#IdentityApi.getBackstageIdentity} */
async getBackstageIdentity(): Promise<BackstageUserIdentity> {
const session = await this.getSessionAsync();
return session.backstageIdentity.identity;
}
/** {@inheritdoc @backstage/core-plugin-api#IdentityApi.getCredentials} */
async getCredentials(): Promise<{ token?: string | undefined }> {
const session = await this.getSessionAsync();
return {
token: session.backstageIdentity.token,
};
}
/** {@inheritdoc @backstage/core-plugin-api#IdentityApi.signOut} */
async signOut(): Promise<void> {
this.abortController.abort();
}
getSessionSync(): ProxiedSession {
if (this.state.type === 'active') {
return this.state.session;
} else if (this.state.type === 'fetching' && this.state.previous) {
return this.state.previous;
}
throw new Error('No session available. Try reloading your browser page.');
}
async getSessionAsync(): Promise<ProxiedSession> {
if (this.state.type === 'fetching') {
return this.state.promise;
} else if (
this.state.type === 'active' &&
new Date() < this.state.expiresAt
) {
return this.state.session;
}
const previous =
this.state.type === 'active' ? this.state.session : undefined;
const promise = this.fetchSession().then(
session => {
this.state = {
type: 'active',
session,
expiresAt: tokenToExpiry(session.backstageIdentity.token),
};
return session;
},
error => {
this.state = {
type: 'failed',
error,
};
throw error;
},
);
this.state = {
type: 'fetching',
promise,
previous,
};
return promise;
}
async fetchSession(): Promise<ProxiedSession> {
const baseUrl = await this.options.discoveryApi.getBaseUrl('auth');
// Note that we do not use the fetchApi here, since this all happens before
// sign-in completes so there can be no automatic token injection and
// similar.
const response = await fetch(
`${baseUrl}/${this.options.provider}/refresh`,
{
signal: this.abortController.signal,
headers: { 'x-requested-with': 'XMLHttpRequest' },
credentials: 'include',
},
);
if (!response.ok) {
throw await ResponseError.fromResponse(response);
}
return proxiedSessionSchema.parse(await response.json());
}
}
@@ -0,0 +1,82 @@
/*
* Copyright 2021 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
discoveryApiRef,
SignInPageProps,
useApi,
} from '@backstage/core-plugin-api';
import React from 'react';
import useAsync from 'react-use/lib/useAsync';
import { ErrorPanel } from '../../components/ErrorPanel';
import { Progress } from '../../components/Progress';
import { ProxiedSignInIdentity } from './ProxiedSignInIdentity';
/**
* Props for {@link ProxiedSignInPage}.
*
* @public
*/
export type ProxiedSignInPageProps = SignInPageProps & {
/**
* The provider to use, e.g. "gcp-iap" or "aws-alb". This must correspond to
* a properly configured auth provider ID in the auth backend.
*/
provider: string;
};
/**
* A sign-in page that has no user interface of its own. Instead, it relies on
* sign-in being performed by a reverse authenticating proxy that Backstage is
* deployed behind, and leverages its session handling.
*
* @remarks
*
* This sign-in page is useful when you are using products such as Google
* Identity-Aware Proxy or AWS Application Load Balancer or similar, to front
* your Backstage installation. This sign-in page implementation will silently
* and regularly punch through the proxy to the auth backend to refresh your
* frontend session information, without requiring user interaction.
*
* @public
*/
export const ProxiedSignInPage = (props: ProxiedSignInPageProps) => {
const discoveryApi = useApi(discoveryApiRef);
const { loading, error } = useAsync(async () => {
const identity = new ProxiedSignInIdentity({
provider: props.provider,
discoveryApi,
});
await identity.start();
props.onSignInSuccess(identity);
}, []);
if (loading) {
return <Progress />;
} else if (error) {
return (
<ErrorPanel
title="You do not appear to be signed in. Please try reloading the browser page."
error={error}
/>
);
}
return null;
};
@@ -0,0 +1,18 @@
/*
* Copyright 2021 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export { ProxiedSignInPage } from './ProxiedSignInPage';
export type { ProxiedSignInPageProps } from './ProxiedSignInPage';
@@ -0,0 +1,45 @@
/*
* Copyright 2021 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { TypeOf } from 'zod';
import { ProxiedSession, proxiedSessionSchema } from './types';
describe('types', () => {
const responseData: ProxiedSession = {
providerInfo: {
stuff: 1,
},
profile: {
email: 'e',
displayName: 'd',
picture: 'p',
},
backstageIdentity: {
token: 't',
identity: {
type: 'user',
userEntityRef: 'k:ns/ue',
ownershipEntityRefs: ['k:ns/oe'],
},
},
};
it('has a compatible schema type', () => {
function f(_b: TypeOf<typeof proxiedSessionSchema>) {}
f(responseData); // no tsc errors
expect(proxiedSessionSchema.parse(responseData)).toEqual(responseData);
});
});
@@ -0,0 +1,50 @@
/*
* Copyright 2021 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
BackstageIdentityResponse,
ProfileInfo,
} from '@backstage/core-plugin-api';
import { z } from 'zod';
export const proxiedSessionSchema = z.object({
providerInfo: z.object({}).catchall(z.unknown()).optional(),
profile: z.object({
email: z.string().optional(),
displayName: z.string().optional(),
picture: z.string().optional(),
}),
backstageIdentity: z.object({
token: z.string(),
identity: z.object({
type: z.literal('user'),
userEntityRef: z.string(),
ownershipEntityRefs: z.array(z.string()),
}),
}),
});
/**
* Generic session information for proxied sign-in providers, e.g. common
* reverse authenticating proxy implementations.
*
* @public
*/
export type ProxiedSession = {
providerInfo?: { [key: string]: unknown };
profile: ProfileInfo;
backstageIdentity: Omit<BackstageIdentityResponse, 'id'>;
};
@@ -26,6 +26,7 @@ export * from './HomepageTimer';
export * from './InfoCard';
export * from './ItemCard';
export * from './Page';
export * from './ProxiedSignInPage';
export * from './Sidebar';
export * from './SignInPage';
export * from './TabbedCard';
@@ -15,3 +15,4 @@
*/
import '@testing-library/jest-dom';
import 'cross-fetch/polyfill';
+15
View File
@@ -1,5 +1,20 @@
# @backstage/core-plugin-api
## 0.5.0
### Minor Changes
- 784d8078ab: Removed the deprecated `OldIconComponent` type.
- e2eb92c109: Removed previously deprecated exports: `PluginHooks`, `PluginOutput`, and `FeatureFlagOutput`.
The deprecated `register` method of `PluginConfig` has been removed, as well as the deprecated `output` method of `BackstagePlugin`.
### Patch Changes
- 784d8078ab: Removed direct and transitive MUI dependencies.
- Updated dependencies
- @backstage/config@0.1.12
## 0.4.1
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-plugin-api",
"description": "Core API used by Backstage plugins",
"version": "0.4.1",
"version": "0.5.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,7 +29,7 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.11",
"@backstage/config": "^0.1.12",
"@backstage/types": "^0.1.1",
"@backstage/version-bridge": "^0.1.1",
"history": "^5.0.0",
@@ -43,9 +43,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.5",
"@backstage/core-app-api": "^0.3.1",
"@backstage/test-utils": "^0.2.0",
"@backstage/cli": "^0.11.0",
"@backstage/core-app-api": "^0.4.0",
"@backstage/test-utils": "^0.2.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^7.0.2",
+62
View File
@@ -1,5 +1,67 @@
# @backstage/create-app
## 0.4.12
### Patch Changes
- 5333451def: Cleaned up API exports
- cd529c4094: Add permissions to create-app's PluginEnvironment
`CatalogEnvironment` now has a `permissions` field, which means that a permission client must now be provided as part of `PluginEnvironment`. To apply these changes to an existing app, add the following to the `makeCreateEnv` function in `packages/backend/src/index.ts`:
```diff
// packages/backend/src/index.ts
+ import { ServerPermissionClient } from '@backstage/plugin-permission-node';
function makeCreateEnv(config: Config) {
...
+ const permissions = ServerPerimssionClient.fromConfig(config, {
+ discovery,
+ tokenManager,
+ });
root.info(`Created UrlReader ${reader}`);
return (plugin: string): PluginEnvironment => {
...
return {
logger,
cache,
database,
config,
reader,
discovery,
tokenManager,
scheduler,
+ permissions,
};
}
}
```
And add a permissions field to the `PluginEnvironment` type in `packages/backend/src/types.ts`:
```diff
// packages/backend/src/types.ts
+ import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
export type PluginEnvironment = {
...
+ permissions: PermissionAuthorizer;
};
```
[`@backstage/plugin-permission-common`](https://www.npmjs.com/package/@backstage/plugin-permission-common) and [`@backstage/plugin-permission-node`](https://www.npmjs.com/package/@backstage/plugin-permission-node) will need to be installed as dependencies:
```diff
// packages/backend/package.json
+ "@backstage/plugin-permission-common": "...",
+ "@backstage/plugin-permission-node": "...",
```
## 0.4.11
## 0.4.10
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
"version": "0.4.11",
"version": "0.4.12",
"private": false,
"publishConfig": {
"access": "public"
+14
View File
@@ -1,5 +1,19 @@
# @backstage/dev-utils
## 0.2.17
### Patch Changes
- Updated dependencies
- @backstage/test-utils@0.2.2
- @backstage/core-components@0.8.4
- @backstage/core-plugin-api@0.5.0
- @backstage/plugin-catalog-react@0.6.11
- @backstage/core-app-api@0.4.0
- @backstage/app-defaults@0.1.4
- @backstage/catalog-model@0.9.9
- @backstage/integration-react@0.1.18
## 0.2.16
### Patch Changes
+10 -10
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/dev-utils",
"description": "Utilities for developing Backstage plugins.",
"version": "0.2.16",
"version": "0.2.17",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,14 +29,14 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/app-defaults": "^0.1.3",
"@backstage/core-app-api": "^0.3.1",
"@backstage/core-components": "^0.8.3",
"@backstage/core-plugin-api": "^0.4.1",
"@backstage/catalog-model": "^0.9.7",
"@backstage/integration-react": "^0.1.16",
"@backstage/plugin-catalog-react": "^0.6.10",
"@backstage/test-utils": "^0.2.0",
"@backstage/app-defaults": "^0.1.4",
"@backstage/core-app-api": "^0.4.0",
"@backstage/core-components": "^0.8.4",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/catalog-model": "^0.9.9",
"@backstage/integration-react": "^0.1.18",
"@backstage/plugin-catalog-react": "^0.6.11",
"@backstage/test-utils": "^0.2.2",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -55,7 +55,7 @@
"react-dom": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.5",
"@backstage/cli": "^0.11.0",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
+1 -1
View File
@@ -25,7 +25,7 @@
},
"devDependencies": {
"@backstage/cli-common": "^0.1.1",
"@backstage/errors": "^0.1.4",
"@backstage/errors": "^0.2.0",
"@types/fs-extra": "^9.0.1",
"@types/node": "^14.14.32",
"@types/puppeteer": "^5.4.4",
@@ -1,5 +1,22 @@
# embedded-techdocs-app
## 0.2.59
### Patch Changes
- Updated dependencies
- @backstage/test-utils@0.2.2
- @backstage/config@0.1.12
- @backstage/core-components@0.8.4
- @backstage/cli@0.11.0
- @backstage/core-plugin-api@0.5.0
- @backstage/plugin-techdocs@0.12.14
- @backstage/core-app-api@0.4.0
- @backstage/app-defaults@0.1.4
- @backstage/catalog-model@0.9.9
- @backstage/integration-react@0.1.18
- @backstage/plugin-catalog@0.7.8
## 0.2.58
### Patch Changes
+13 -13
View File
@@ -1,20 +1,20 @@
{
"name": "embedded-techdocs-app",
"version": "0.2.58",
"version": "0.2.59",
"private": true,
"bundled": true,
"dependencies": {
"@backstage/app-defaults": "^0.1.3",
"@backstage/catalog-model": "^0.9.7",
"@backstage/cli": "^0.10.3",
"@backstage/config": "^0.1.10",
"@backstage/core-app-api": "^0.3.0",
"@backstage/core-components": "^0.8.2",
"@backstage/core-plugin-api": "^0.4.0",
"@backstage/integration-react": "^0.1.16",
"@backstage/plugin-catalog": "^0.7.5",
"@backstage/plugin-techdocs": "^0.12.11",
"@backstage/test-utils": "^0.2.0",
"@backstage/app-defaults": "^0.1.4",
"@backstage/catalog-model": "^0.9.9",
"@backstage/cli": "^0.11.0",
"@backstage/config": "^0.1.12",
"@backstage/core-app-api": "^0.4.0",
"@backstage/core-components": "^0.8.4",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/integration-react": "^0.1.18",
"@backstage/plugin-catalog": "^0.7.8",
"@backstage/plugin-techdocs": "^0.12.14",
"@backstage/test-utils": "^0.2.2",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -26,7 +26,7 @@
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.10.3",
"@backstage/cli": "^0.11.0",
"@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/errors
## 0.2.0
### Minor Changes
- e2eb92c109: Removed the deprecated exports `ErrorResponse` and `parseErrorResponse`.
Removed the deprecated `constructor` and the deprecated `data` property of `ResponseError`.
## 0.1.5
### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/errors",
"description": "Common utilities for error handling within Backstage",
"version": "0.1.5",
"version": "0.2.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,7 +35,7 @@
"serialize-error": "^8.0.1"
},
"devDependencies": {
"@backstage/cli": "^0.10.0",
"@backstage/cli": "^0.11.0",
"@types/jest": "^26.0.7"
},
"files": [
+10
View File
@@ -1,5 +1,15 @@
# @backstage/integration-react
## 0.1.18
### Patch Changes
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/integration@0.7.1
- @backstage/core-components@0.8.4
- @backstage/core-plugin-api@0.5.0
## 0.1.17
### Patch Changes
+8 -8
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration-react",
"description": "Frontend package for managing integrations towards external systems",
"version": "0.1.17",
"version": "0.1.18",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -21,10 +21,10 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.11",
"@backstage/core-components": "^0.8.2",
"@backstage/core-plugin-api": "^0.4.0",
"@backstage/integration": "^0.7.0",
"@backstage/config": "^0.1.12",
"@backstage/core-components": "^0.8.4",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/integration": "^0.7.1",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -35,9 +35,9 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.4",
"@backstage/dev-utils": "^0.2.15",
"@backstage/test-utils": "^0.2.1",
"@backstage/cli": "^0.11.0",
"@backstage/dev-utils": "^0.2.17",
"@backstage/test-utils": "^0.2.2",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^13.1.8",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/integration
## 0.7.1
### Patch Changes
- 3b4d8caff6: Adds a new GitHub credentials provider (DefaultGithubCredentialsProvider). It handles multiple app configurations. It looks up the app configuration based on the url.
- 5333451def: Cleaned up API exports
- Updated dependencies
- @backstage/config@0.1.12
## 0.7.0
### Minor Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration",
"description": "Helpers for managing integrations towards external systems",
"version": "0.7.0",
"version": "0.7.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -30,7 +30,7 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.11",
"@backstage/config": "^0.1.12",
"cross-fetch": "^3.0.6",
"git-url-parse": "^11.6.0",
"@octokit/rest": "^18.5.3",
@@ -39,9 +39,9 @@
"lodash": "^4.17.21"
},
"devDependencies": {
"@backstage/cli": "^0.10.4",
"@backstage/config-loader": "^0.9.1",
"@backstage/test-utils": "^0.2.1",
"@backstage/cli": "^0.11.0",
"@backstage/config-loader": "^0.9.2",
"@backstage/test-utils": "^0.2.2",
"@types/jest": "^26.0.7",
"@types/luxon": "^2.0.4",
"msw": "^0.35.0"
+1 -1
View File
@@ -39,7 +39,7 @@
"@backstage/types": "^0.1.1"
},
"devDependencies": {
"@backstage/cli": "^0.10.0"
"@backstage/cli": "^0.11.0"
},
"jest": {
"roots": [
+9
View File
@@ -1,5 +1,14 @@
# storybook
## 0.2.1
### Patch Changes
- Updated dependencies
- @backstage/test-utils@0.2.2
- @backstage/core-plugin-api@0.5.0
- @backstage/core-app-api@0.4.0
## 0.2.0
### Patch Changes
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "storybook",
"version": "0.2.0",
"version": "0.2.1",
"description": "Storybook build for components package",
"private": true,
"scripts": {
@@ -9,9 +9,9 @@
},
"dependencies": {
"@backstage/theme": "^0.2.0",
"@backstage/test-utils": "^0.2.1",
"@backstage/core-app-api": "^0.3.1",
"@backstage/core-plugin-api": "^0.4.1",
"@backstage/test-utils": "^0.2.2",
"@backstage/core-app-api": "^0.4.0",
"@backstage/core-plugin-api": "^0.5.0",
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
+6 -6
View File
@@ -32,7 +32,7 @@
"techdocs-cli": "bin/techdocs-cli"
},
"devDependencies": {
"@backstage/cli": "^0.10.4",
"@backstage/cli": "^0.11.0",
"@types/commander": "^2.12.2",
"@types/fs-extra": "^9.0.6",
"@types/http-proxy": "^1.17.4",
@@ -41,7 +41,7 @@
"@types/react-dev-utils": "^9.0.4",
"@types/serve-handler": "^6.1.0",
"@types/webpack-env": "^1.15.3",
"embedded-techdocs-app": "0.2.58",
"embedded-techdocs-app": "0.2.59",
"find-process": "^1.4.5",
"nodemon": "^2.0.2",
"ts-node": "^10.0.0"
@@ -56,10 +56,10 @@
"ext": "ts"
},
"dependencies": {
"@backstage/backend-common": "^0.10.1",
"@backstage/catalog-model": "^0.9.7",
"@backstage/config": "^0.1.10",
"@backstage/techdocs-common": "^0.11.2",
"@backstage/backend-common": "^0.10.3",
"@backstage/catalog-model": "^0.9.9",
"@backstage/config": "^0.1.12",
"@backstage/techdocs-common": "^0.11.3",
"@types/dockerode": "^3.3.0",
"commander": "^6.1.0",
"dockerode": "^3.3.1",
+12
View File
@@ -1,5 +1,17 @@
# @backstage/techdocs-common
## 0.11.3
### Patch Changes
- 5333451def: Cleaned up API exports
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/integration@0.7.1
- @backstage/backend-common@0.10.3
- @backstage/errors@0.2.0
- @backstage/catalog-model@0.9.9
## 0.11.2
### Patch Changes
+7 -7
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.11.2",
"version": "0.11.3",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -38,12 +38,12 @@
"dependencies": {
"@azure/identity": "^2.0.1",
"@azure/storage-blob": "^12.5.0",
"@backstage/backend-common": "^0.10.1",
"@backstage/catalog-model": "^0.9.7",
"@backstage/config": "^0.1.11",
"@backstage/errors": "^0.1.5",
"@backstage/backend-common": "^0.10.3",
"@backstage/catalog-model": "^0.9.9",
"@backstage/config": "^0.1.12",
"@backstage/errors": "^0.2.0",
"@backstage/search-common": "^0.2.1",
"@backstage/integration": "^0.7.0",
"@backstage/integration": "^0.7.1",
"@google-cloud/storage": "^5.6.0",
"@trendyol-js/openstack-swift-sdk": "^0.0.5",
"@types/express": "^4.17.6",
@@ -60,7 +60,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.10.4",
"@backstage/cli": "^0.11.0",
"@types/fs-extra": "^9.0.5",
"@types/js-yaml": "^4.0.0",
"@types/mime-types": "^2.1.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/test-utils
## 0.2.2
### Patch Changes
- 2d3fd91e33: Add new `MockConfigApi` as a more discoverable and leaner method for mocking configuration.
- Updated dependencies
- @backstage/config@0.1.12
- @backstage/core-plugin-api@0.5.0
- @backstage/core-app-api@0.4.0
## 0.2.1
### Patch Changes
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/test-utils",
"description": "Utilities to test Backstage plugins and apps.",
"version": "0.2.1",
"version": "0.2.2",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
"@backstage/config": "^0.1.11",
"@backstage/core-app-api": "^0.3.0",
"@backstage/core-plugin-api": "^0.4.0",
"@backstage/config": "^0.1.12",
"@backstage/core-app-api": "^0.4.0",
"@backstage/core-plugin-api": "^0.5.0",
"@backstage/theme": "^0.2.14",
"@backstage/types": "^0.1.1",
"@material-ui/core": "^4.12.2",
@@ -48,7 +48,7 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.4",
"@backstage/cli": "^0.11.0",
"@types/jest": "^26.0.7",
"@types/node": "^14.14.32"
},
+1 -1
View File
@@ -31,7 +31,7 @@
"@material-ui/core": "^4.12.2"
},
"devDependencies": {
"@backstage/cli": "^0.10.0"
"@backstage/cli": "^0.11.0"
},
"files": [
"dist"
+1 -1
View File
@@ -31,7 +31,7 @@
},
"dependencies": {},
"devDependencies": {
"@backstage/cli": "^0.10.0",
"@backstage/cli": "^0.11.0",
"@types/zen-observable": "^0.8.0",
"zen-observable": "^0.8.15"
},
+1 -1
View File
@@ -33,7 +33,7 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.10.1",
"@backstage/cli": "^0.11.0",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@testing-library/react-hooks": "^7.0.2"