Merge branch 'master' into blam/bump-graphql-dependencies
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -21,6 +21,7 @@ export type ConfigSchemaProcessingOptions = {
|
||||
visibility?: ConfigVisibility[];
|
||||
valueTransform?: TransformFunc<any>;
|
||||
withFilteredKeys?: boolean;
|
||||
withDeprecatedKeys?: boolean;
|
||||
};
|
||||
|
||||
// @public (undocumented)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -13,6 +13,10 @@ export type AppConfig = {
|
||||
context: string;
|
||||
data: JsonObject_2;
|
||||
filteredKeys?: string[];
|
||||
deprecatedKeys?: {
|
||||
key: string;
|
||||
description: string;
|
||||
}[];
|
||||
};
|
||||
|
||||
// @public
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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!,
|
||||
|
||||
@@ -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 }[];
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"@backstage/types": "^0.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@backstage/cli": "^0.10.0"
|
||||
"@backstage/cli": "^0.11.0"
|
||||
},
|
||||
"jest": {
|
||||
"roots": [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
"@material-ui/core": "^4.12.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@backstage/cli": "^0.10.0"
|
||||
"@backstage/cli": "^0.11.0"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user