diff --git a/.changeset/angry-eels-watch.md b/.changeset/angry-eels-watch.md
new file mode 100644
index 0000000000..cd252d5558
--- /dev/null
+++ b/.changeset/angry-eels-watch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-rollbar-backend': patch
+---
+
+Moved `@backstage/test-utils` to `devDependencies`.
diff --git a/.changeset/chatty-gifts-fry.md b/.changeset/chatty-gifts-fry.md
new file mode 100644
index 0000000000..25f0a70bd9
--- /dev/null
+++ b/.changeset/chatty-gifts-fry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Replaces the usage of `got` with `node-fetch` in the `getUserPhoto` method of the Microsoft provider
diff --git a/.changeset/chatty-wombats-buy.md b/.changeset/chatty-wombats-buy.md
new file mode 100644
index 0000000000..aa743a6a71
--- /dev/null
+++ b/.changeset/chatty-wombats-buy.md
@@ -0,0 +1,24 @@
+---
+'@backstage/create-app': patch
+---
+
+removed inline and internal CSS from index.html
+
+To make this change to an existing app, apply the following changes to the `packages/app/public/index.html` file:
+
+Remove internal style
+
+```diff
+-
+```
+
+Remove inline style from the body tag
+
+```diff
+-
++
+```
diff --git a/.changeset/config.json b/.changeset/config.json
index 067dcb5f9f..283caa6ac4 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -2,7 +2,7 @@
"$schema": "https://unpkg.com/@changesets/config@1.3.0/schema.json",
"changelog": "./backstage-changelog.js",
"commit": false,
- "linked": [["*"]],
+ "linked": [],
"access": "public",
"baseBranch": "master",
"updateInternalDependencies": "patch",
diff --git a/.changeset/curly-bugs-stare.md b/.changeset/curly-bugs-stare.md
new file mode 100644
index 0000000000..88e1d86e84
--- /dev/null
+++ b/.changeset/curly-bugs-stare.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-cost-insights': patch
+---
+
+Fixed an accidental re-export of `@backstage/test-utils` that broke this plugin in the most recent release.
diff --git a/.changeset/curly-pillows-provide.md b/.changeset/curly-pillows-provide.md
new file mode 100644
index 0000000000..e6a218233b
--- /dev/null
+++ b/.changeset/curly-pillows-provide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/test-utils': patch
+---
+
+JSON serialize and freeze values stored by the `MockStorageApi`.
diff --git a/.changeset/cyan-goats-confess.md b/.changeset/cyan-goats-confess.md
new file mode 100644
index 0000000000..0ba500dc7f
--- /dev/null
+++ b/.changeset/cyan-goats-confess.md
@@ -0,0 +1,5 @@
+---
+'@backstage/techdocs-common': patch
+---
+
+Bump `@azure/identity` from `^1.5.0` to `^2.0.1`.
diff --git a/.changeset/dar-jag-gar.md b/.changeset/dar-jag-gar.md
new file mode 100644
index 0000000000..5989614101
--- /dev/null
+++ b/.changeset/dar-jag-gar.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+In-memory cache clients instantiated from the same cache manager now share the same memory space.
diff --git a/.changeset/eleven-pianos-fail.md b/.changeset/eleven-pianos-fail.md
new file mode 100644
index 0000000000..5b0aa76ae9
--- /dev/null
+++ b/.changeset/eleven-pianos-fail.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Fixed bug on refresh token on Okta provider, now it gets the refresh token and it sends it into providerInfo
diff --git a/.changeset/fluffy-toys-tease.md b/.changeset/fluffy-toys-tease.md
new file mode 100644
index 0000000000..f20eaebb2c
--- /dev/null
+++ b/.changeset/fluffy-toys-tease.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-insights': minor
+---
+
+fixes api auth in tech-insights plugin
diff --git a/.changeset/light-singers-double.md b/.changeset/light-singers-double.md
new file mode 100644
index 0000000000..e21017373d
--- /dev/null
+++ b/.changeset/light-singers-double.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Fix issue with plugin:serve for Plugins not using Lerna monorepo.
diff --git a/.changeset/long-waves-hear.md b/.changeset/long-waves-hear.md
new file mode 100644
index 0000000000..8decec294b
--- /dev/null
+++ b/.changeset/long-waves-hear.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+remove inline CSS from serve_index.html
diff --git a/.changeset/lucky-bats-reflect.md b/.changeset/lucky-bats-reflect.md
new file mode 100644
index 0000000000..ad3171382e
--- /dev/null
+++ b/.changeset/lucky-bats-reflect.md
@@ -0,0 +1,9 @@
+---
+'@backstage/backend-common': patch
+'@backstage/plugin-catalog': patch
+'@backstage/plugin-catalog-backend': patch
+'@backstage/plugin-scaffolder': patch
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Uptake changes to the GitHub Credentials Provider interface.
diff --git a/.changeset/modern-buses-protect.md b/.changeset/modern-buses-protect.md
new file mode 100644
index 0000000000..2aed52eca0
--- /dev/null
+++ b/.changeset/modern-buses-protect.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-catalog-react': patch
+---
+
+When a user has zero owned entities when viewing an entity kind in the catalog
+page, it will be automatically redirected to see all the entities. Furthermore,
+for the kind User and Group there are no longer the owned selector.
diff --git a/.changeset/neat-insects-ring.md b/.changeset/neat-insects-ring.md
new file mode 100644
index 0000000000..a46b6d44e3
--- /dev/null
+++ b/.changeset/neat-insects-ring.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-techdocs': patch
+---
+
+Add the techdocs.sanitizer.allowedIframeHosts config.
+This config allows all iframes which have the host of the attribute src in the 'allowedIframehosts' list to be displayed in the documentation.
diff --git a/.changeset/new-tips-shop.md b/.changeset/new-tips-shop.md
new file mode 100644
index 0000000000..3ab4e817d0
--- /dev/null
+++ b/.changeset/new-tips-shop.md
@@ -0,0 +1,5 @@
+---
+'@techdocs/cli': patch
+---
+
+remove internal and inline CSS from index.html
diff --git a/.changeset/plenty-flies-repair.md b/.changeset/plenty-flies-repair.md
new file mode 100644
index 0000000000..7e9690a7f3
--- /dev/null
+++ b/.changeset/plenty-flies-repair.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-rollbar-backend': patch
+---
+
+Replace the usage of `axios` with `node-fetch` in the Rollbar API
diff --git a/.changeset/poor-zoos-invent.md b/.changeset/poor-zoos-invent.md
new file mode 100644
index 0000000000..a1c87bd3ad
--- /dev/null
+++ b/.changeset/poor-zoos-invent.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-scaffolder': patch
+'@backstage/plugin-scaffolder-backend': patch
+'@backstage/plugin-scaffolder-common': patch
+---
+
+Support navigating back to pre-filled templates to update inputs of scaffolder tasks for resubmission
diff --git a/.changeset/seven-tomatoes-smash.md b/.changeset/seven-tomatoes-smash.md
new file mode 100644
index 0000000000..98ae643738
--- /dev/null
+++ b/.changeset/seven-tomatoes-smash.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs-backend': patch
+---
+
+Add support for API auth in DefaultTechDocsCollator
diff --git a/.changeset/short-schools-heal.md b/.changeset/short-schools-heal.md
new file mode 100644
index 0000000000..3976ea3a0c
--- /dev/null
+++ b/.changeset/short-schools-heal.md
@@ -0,0 +1,13 @@
+---
+'@backstage/integration': minor
+---
+
+Create an interface for the GitHub credentials provider in order to support providing implementations.
+
+We have changed the name of the `GithubCredentialsProvider` to `SingleInstanceGithubCredentialsProvider`.
+
+`GithubCredentialsProvider` is now an interface that maybe implemented to provide a custom mechanism to retrieve GitHub credentials.
+
+In a later release we will support configuring URL readers, scaffolder tasks, and processors with customer GitHub credentials providers.
+
+If you want to uptake this release, you will need to replace all references to `GithubCredentialsProvider.create` with `SingleInstanceGithubCredentialsProvider.create`.
diff --git a/.changeset/slimy-snakes-drop.md b/.changeset/slimy-snakes-drop.md
new file mode 100644
index 0000000000..0e1d378454
--- /dev/null
+++ b/.changeset/slimy-snakes-drop.md
@@ -0,0 +1,41 @@
+---
+'@backstage/create-app': patch
+---
+
+Add a `scheduler` to the plugin environment, which can schedule collaborative tasks across backends. To apply the same change in your backend, follow the steps below.
+
+First install the package:
+
+```shell
+# From the Backstage repository root
+cd packages/backend
+yarn add @backstage/backend-tasks
+```
+
+Add the scheduler to your plugin environment type:
+
+```diff
+ // In packages/backend/src/types.ts
++import { PluginTaskScheduler } from '@backstage/backend-tasks';
+
+ export type PluginEnvironment = {
++ scheduler: PluginTaskScheduler;
+```
+
+And finally make sure to add such an instance to each plugin's environment:
+
+```diff
+ // In packages/backend/src/index.ts
++import { TaskScheduler } from '@backstage/backend-tasks';
+
+ function makeCreateEnv(config: Config) {
+ // ...
++ const taskScheduler = TaskScheduler.fromConfig(config);
+
+ return (plugin: string): PluginEnvironment => {
+ // ...
++ const scheduler = taskScheduler.forPlugin(plugin);
+ return {
++ scheduler,
+ // ...
+```
diff --git a/.changeset/slimy-socks-pump.md b/.changeset/slimy-socks-pump.md
new file mode 100644
index 0000000000..f7252340f1
--- /dev/null
+++ b/.changeset/slimy-socks-pump.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-insights': patch
+---
+
+Export `techInsightsApiRef` and associated types.
diff --git a/.changeset/small-points-allow.md b/.changeset/small-points-allow.md
new file mode 100644
index 0000000000..2228fc8883
--- /dev/null
+++ b/.changeset/small-points-allow.md
@@ -0,0 +1,5 @@
+---
+'@backstage/config-loader': patch
+---
+
+Bump `typescript-json-schema` from `^0.51.0` to `^0.52.0`.
diff --git a/.changeset/spicy-moons-poke.md b/.changeset/spicy-moons-poke.md
new file mode 100644
index 0000000000..cc39d629bf
--- /dev/null
+++ b/.changeset/spicy-moons-poke.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-insights-backend-module-jsonfc': patch
+---
+
+ability to add custom operators
diff --git a/.changeset/tame-ways-prove.md b/.changeset/tame-ways-prove.md
new file mode 100644
index 0000000000..4f625d0a05
--- /dev/null
+++ b/.changeset/tame-ways-prove.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Add option to build command for minifying the generated code
diff --git a/.changeset/twenty-hornets-train.md b/.changeset/twenty-hornets-train.md
new file mode 100644
index 0000000000..957bfd00da
--- /dev/null
+++ b/.changeset/twenty-hornets-train.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Enforce cookie SSL protection when in production for auth-backend sessions
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index ed4b61099f..a587419d50 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -42,3 +42,5 @@
/.changeset/search-* @backstage/techdocs-core
/.changeset/techdocs-* @backstage/techdocs-core
/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-core
+/plugins/apache-airflow @backstage/reviewers @cmpadden
+/plugins/newrelic-dashboard @backstage/reviewers @mufaddal7
diff --git a/.github/labeler.yml b/.github/labeler.yml
new file mode 100644
index 0000000000..f141107482
--- /dev/null
+++ b/.github/labeler.yml
@@ -0,0 +1,24 @@
+catalog:
+ - plugins/catalog/**/*
+ - plugins/catalog-*/**/*
+ - packages/catalog-*/**/*
+scaffolder:
+ - plugins/scaffolder/**/*
+ - plugins/scaffolder-*/**/*
+search:
+ - plugins/search/**/*
+ - plugins/search-*/**/*
+ - packages/search-*/**/*
+docs-like-code:
+ - plugins/techdocs/**/*
+ - plugins/techdocs-*/**/*
+ - packages/techdocs-*/**/*
+documentation:
+ - docs/**/*
+microsite:
+ - microsite/**/*
+auth:
+ - plugins/auth-backend/**/*
+ - packages/core-app-api/src/apis/implementations/auth/**/*
+ - packages/core-app-api/src/lib/Auth*/**/*
+ - packages/core-plugin-api/src/apis/definitions/auth.ts
diff --git a/.github/styles/vocab.txt b/.github/styles/vocab.txt
index 4ec62923d8..8199855c9e 100644
--- a/.github/styles/vocab.txt
+++ b/.github/styles/vocab.txt
@@ -12,6 +12,7 @@ Atlassian
automations
autoscaling
Autoscaling
+autoselect
Avro
backrub
Bigtable
@@ -53,6 +54,7 @@ configs
const
cookiecutter
cron
+cronjobs
css
Datadog
dataflow
@@ -90,10 +92,12 @@ Figma
firehydrant
FireHydrant
Firekube
+Firestore
Fiverr
gitbeaker
GitHub
GitLab
+Gource
Grafana
graphql
GraphQL
@@ -187,6 +191,7 @@ OAuth
octokit
oidc
Okta
+Oldsberg
onboarding
Onboarding
OpenShift
@@ -194,6 +199,8 @@ orgs
pagerduty
pageview
parallelization
+Patrik
+Peloton
plantuml
Platformize
Podman
@@ -293,6 +300,7 @@ truthy
typeahead
ui
unbreak
+Unconference
unmanaged
unregister
unregistration
@@ -304,6 +312,7 @@ utils
validator
validators
varchar
+Wayfair
Weaveworks
Webpack
winston
@@ -316,4 +325,3 @@ Zalando
Zhou
zoomable
zsh
-Firestore
diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml
new file mode 100644
index 0000000000..dc7127ab0d
--- /dev/null
+++ b/.github/workflows/label.yml
@@ -0,0 +1,12 @@
+name: 'Pull Request Labeler'
+on:
+ - pull_request_target
+
+jobs:
+ triage:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/labeler@v3
+ with:
+ repo-token: '${{ secrets.GITHUB_TOKEN }}'
+ sync-labels: true
diff --git a/ADOPTERS.md b/ADOPTERS.md
index 43e7fba68b..32dff321ca 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -75,3 +75,6 @@
| [Telstra](https://www.telstra.com.au) | [@kiranpatel11](https://github.com/kiranpatel11), [JasonC](https://github.com/JasonC17) | Primary usage: software catalog and templates Emerging usage : TechDocs, Explore Ecosystem, TechRadar, etc |
| [Mosaico](https://www.mosaico.com.br/) | [Wédney Yuri](https://github.com/wedneyyuri),[@tino.milton](https://github.com/miltonjacomini) | A centralized service catalog of our documentation for our service engineers. |
| [Mox Bank](https://www.mox.com/) | [Nick Laqua](https://github.com/nick-laqua-dragon), [Gauthier Roebroeck](https://github.com/gauthier-roebroeck-mox) | "Single pane of glass" developer portal for providing a best-in-class developer experience to our product teams and making Mox the best tech environment in Hongkong 🥰🚀 |
+| [Keyloop](https://www.keyloop.com/) | [Andre Wanlin](https://github.com/awanlin) | Future-motive Developer Portal to help our teams create technology to make everything about buying and owning a car better. 🚗 |
+| [Simply Business](https://sbtech.simplybusiness.co.uk/) | [@addersuk](https://github.com/addersuk), [@LightningStairs](https://github.com/LightningStairs), [@punitcse](https://github.com/punitcse), [@moltenice](https://github.com/moltenice) | Central developer portal to access everything a developer needs such as docs, internal service catalog, and the ability to quickly create a new service from a template. Internally developed Backstage plugins allow us to customise the experience to how we work. |
+| [Overwolf](https://www.overwolf.com) | [@tomwolfgang](https://github.com/tomwolfgang) | Dev portal - software catalog, tech-docs, scaffolding |
diff --git a/README.md b/README.md
index 1078631926..3e91cfe7c3 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,10 @@
# [Backstage](https://backstage.io)
+> 🎄 The maintainers will be taking a break over the holidays from week beginning 20th Dec. The Repository and Discord may be quieter than usual. We will be back next year, rested and restored, on Jan. 3. 🎄
+
+> 🎅 Happy holidays and a Happy New Year to all, and especially those that have made this year special for Backstage! 🎅
+
[](https://opensource.org/licenses/Apache-2.0)
[](https://www.cncf.io/projects)
[](https://github.com/backstage/backstage/actions?query=workflow%3A%22Main+Master+Build%22)
diff --git a/app-config.yaml b/app-config.yaml
index 6cd05f44e8..2837d97d2f 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -74,6 +74,11 @@ proxy:
headers:
X-Api-Key: ${NEW_RELIC_REST_API_KEY}
+ '/newrelic/api':
+ target: https://api.newrelic.com
+ headers:
+ X-Api-Key: ${NEW_RELIC_USER_KEY}
+
'/pagerduty':
target: https://api.pagerduty.com
headers:
diff --git a/contrib/chart/backstage/Chart.yaml b/contrib/chart/backstage/Chart.yaml
index 8aeab9be3e..9154368475 100644
--- a/contrib/chart/backstage/Chart.yaml
+++ b/contrib/chart/backstage/Chart.yaml
@@ -5,7 +5,7 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
-version: 0.1.1
+version: 0.1.2
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
diff --git a/contrib/chart/backstage/templates/ingress.yaml b/contrib/chart/backstage/templates/ingress.yaml
index 9340467800..3ec4990561 100644
--- a/contrib/chart/backstage/templates/ingress.yaml
+++ b/contrib/chart/backstage/templates/ingress.yaml
@@ -40,7 +40,7 @@ spec:
servicePort: 80
{{/* Route the backend inside the same hostname as the frontend when they are the same */}}
{{- if eq $frontendUrl.host $backendUrl.host}}
- - path: /api
+ - path: /api/
backend:
serviceName: {{ include "backend.serviceName" . }}
servicePort: 80
diff --git a/docs/api/utility-apis.md b/docs/api/utility-apis.md
index 14920513af..9ebcfc0945 100644
--- a/docs/api/utility-apis.md
+++ b/docs/api/utility-apis.md
@@ -128,8 +128,8 @@ the core APIs. The core APIs are the ones exported by
[configApiRef](../reference/core-plugin-api.configapiref.md).
The core APIs are loaded for any app created with
-[createApp](../reference/core-app-api.createapp.md) from
-[@backstage/core-plugin-api](../reference/core-plugin-api.md), which means that
+[createApp](../reference/app-defaults.createapp.md) from
+[@backstage/core-plugin-api](../reference/app-defaults.md), which means that
there is no step that needs to be taken to include these APIs in an app.
### Plugin APIs
@@ -168,7 +168,7 @@ Lastly, the app itself is the final point where APIs can be added, and what has
the final say in what APIs will be loaded at runtime. The app may override the
factories for any of the core or plugin APIs, with the exception of the config,
app theme, and identity APIs. These are static APIs that are tied into the
-[createApp](../reference/core-app-api.createapp.md) implementation, and
+[createApp](../reference/app-defaults.createapp.md) implementation, and
therefore not possible to override.
Overriding APIs is useful for apps that want to switch out behavior to tailor it
@@ -313,7 +313,7 @@ The common development environment for plugins is included in
[createDevApp](../reference/dev-utils.createdevapp.md) function creates an
application with implementations for all core APIs already present. Contrary to
the method for wiring up Utility API implementations in an app created with
-[createApp](../reference/core-app-api.createapp.md),
+[createApp](../reference/app-defaults.createapp.md),
[createDevApp](../reference/dev-utils.createdevapp.md) uses automatic dependency
injection. This is to make it possible to replace any API implementation, and
having that be reflected in dependents of that API.
diff --git a/docs/architecture-decisions/adr000-template.md b/docs/architecture-decisions/adr000-template.md
index 5e6edd8dba..f16ae7d39f 100644
--- a/docs/architecture-decisions/adr000-template.md
+++ b/docs/architecture-decisions/adr000-template.md
@@ -1,6 +1,7 @@
---
id: adrs-adr000
-title: ADR000: [TITLE]
+title: 'ADR000: [TITLE]'
+# prettier-ignore
description: Architecture Decision Record (ADR) for [TITLE] [DESCRIPTION]
---
diff --git a/docs/architecture-decisions/adr001-add-adr-log.md b/docs/architecture-decisions/adr001-add-adr-log.md
index 872b3311a5..d1bf0f83f5 100644
--- a/docs/architecture-decisions/adr001-add-adr-log.md
+++ b/docs/architecture-decisions/adr001-add-adr-log.md
@@ -1,6 +1,7 @@
---
id: adrs-adr001
-title: ADR001: Architecture Decision Record (ADR) log
+title: 'ADR001: Architecture Decision Record (ADR) log'
+# prettier-ignore
description: Architecture Decision Record (ADR) logs as a reference point for the team
---
diff --git a/docs/architecture-decisions/adr002-default-catalog-file-format.md b/docs/architecture-decisions/adr002-default-catalog-file-format.md
index 013e2cbf39..d0a657fe46 100644
--- a/docs/architecture-decisions/adr002-default-catalog-file-format.md
+++ b/docs/architecture-decisions/adr002-default-catalog-file-format.md
@@ -1,6 +1,7 @@
---
id: adrs-adr002
-title: ADR002: Default Software Catalog File Format
+title: 'ADR002: Default Software Catalog File Format'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Default Software Catalog File Format
---
diff --git a/docs/architecture-decisions/adr003-avoid-default-exports.md b/docs/architecture-decisions/adr003-avoid-default-exports.md
index 878d0d701c..34e5cd5411 100644
--- a/docs/architecture-decisions/adr003-avoid-default-exports.md
+++ b/docs/architecture-decisions/adr003-avoid-default-exports.md
@@ -1,6 +1,7 @@
---
id: adrs-adr003
-title: ADR003: Avoid Default Exports and Prefer Named Exports
+title: 'ADR003: Avoid Default Exports and Prefer Named Exports'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Avoid Default Exports and Prefer Named Exports
---
diff --git a/docs/architecture-decisions/adr004-module-export-structure.md b/docs/architecture-decisions/adr004-module-export-structure.md
index e6e378da9d..95d0f27811 100644
--- a/docs/architecture-decisions/adr004-module-export-structure.md
+++ b/docs/architecture-decisions/adr004-module-export-structure.md
@@ -1,6 +1,7 @@
---
id: adrs-adr004
-title: ADR004: Module Export Structure
+title: 'ADR004: Module Export Structure'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Module Export Structure
---
diff --git a/docs/architecture-decisions/adr005-catalog-core-entities.md b/docs/architecture-decisions/adr005-catalog-core-entities.md
index 83196c12e2..1206d9e83d 100644
--- a/docs/architecture-decisions/adr005-catalog-core-entities.md
+++ b/docs/architecture-decisions/adr005-catalog-core-entities.md
@@ -1,6 +1,7 @@
---
id: adrs-adr005
-title: ADR005: Catalog Core Entities
+title: 'ADR005: Catalog Core Entities'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Catalog Core Entities
---
diff --git a/docs/architecture-decisions/adr006-avoid-react-fc.md b/docs/architecture-decisions/adr006-avoid-react-fc.md
index eecb4ad87a..ea43cb215d 100644
--- a/docs/architecture-decisions/adr006-avoid-react-fc.md
+++ b/docs/architecture-decisions/adr006-avoid-react-fc.md
@@ -1,6 +1,7 @@
---
id: adrs-adr006
-title: ADR006: Avoid React.FC and React.SFC
+title: 'ADR006: Avoid React.FC and React.SFC'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Avoid React.FC and React.SFC
---
diff --git a/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md b/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md
index 68394de17c..a61bb78787 100644
--- a/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md
+++ b/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md
@@ -1,6 +1,7 @@
---
id: adrs-adr007
-title: ADR007: Use MSW to mock http requests
+title: 'ADR007: Use MSW to mock http requests'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Use MSW to mock http requests
---
diff --git a/docs/architecture-decisions/adr008-default-catalog-file-name.md b/docs/architecture-decisions/adr008-default-catalog-file-name.md
index 6794dc87cc..fca65c8355 100644
--- a/docs/architecture-decisions/adr008-default-catalog-file-name.md
+++ b/docs/architecture-decisions/adr008-default-catalog-file-name.md
@@ -1,6 +1,7 @@
---
id: adrs-adr008
-title: ADR008: Default Catalog File Name
+title: 'ADR008: Default Catalog File Name'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Default Catalog File Name
---
diff --git a/docs/architecture-decisions/adr009-entity-references.md b/docs/architecture-decisions/adr009-entity-references.md
index a6fe3ee583..254ae7ac1d 100644
--- a/docs/architecture-decisions/adr009-entity-references.md
+++ b/docs/architecture-decisions/adr009-entity-references.md
@@ -1,6 +1,7 @@
---
id: adrs-adr009
-title: ADR009: Entity References
+title: 'ADR009: Entity References'
+# prettier-ignore
description: Architecture Decision Record (ADR) log on Entity References
---
diff --git a/docs/architecture-decisions/adr010-luxon-date-library.md b/docs/architecture-decisions/adr010-luxon-date-library.md
index 43f18f0f69..65cabd256c 100644
--- a/docs/architecture-decisions/adr010-luxon-date-library.md
+++ b/docs/architecture-decisions/adr010-luxon-date-library.md
@@ -1,6 +1,7 @@
---
id: adrs-adr010
-title: ADR010: Use the Luxon Date Library
+title: 'ADR010: Use the Luxon Date Library'
+# prettier-ignore
description: Architecture Decision Record (ADR) for Luxon Date Library
---
diff --git a/docs/architecture-decisions/adr011-plugin-package-structure.md b/docs/architecture-decisions/adr011-plugin-package-structure.md
index 374a3ed546..363cae01a5 100644
--- a/docs/architecture-decisions/adr011-plugin-package-structure.md
+++ b/docs/architecture-decisions/adr011-plugin-package-structure.md
@@ -1,6 +1,7 @@
---
id: adrs-adr011
-title: ADR011: Plugin Package Structure
+title: 'ADR011: Plugin Package Structure'
+# prettier-ignore
description: Architecture Decision Record (ADR) for Plugin Package Structure
---
diff --git a/docs/architecture-decisions/adr012-use-luxon-locale-and-date-presets.md b/docs/architecture-decisions/adr012-use-luxon-locale-and-date-presets.md
index 0893c105f4..25bb6c1833 100644
--- a/docs/architecture-decisions/adr012-use-luxon-locale-and-date-presets.md
+++ b/docs/architecture-decisions/adr012-use-luxon-locale-and-date-presets.md
@@ -1,6 +1,7 @@
---
id: adrs-adr012
-title: ADR012: Use Luxon.toLocaleString and date/time presets
+title: 'ADR012: Use Luxon.toLocaleString and date/time presets'
+# prettier-ignore
description: Architecture Decision Record (ADR) for using Luxon's toLocaleString method and date/time presets for displaying dates and times
---
diff --git a/docs/architecture-decisions/adr013-use-node-fetch.md b/docs/architecture-decisions/adr013-use-node-fetch.md
new file mode 100644
index 0000000000..d802988ae4
--- /dev/null
+++ b/docs/architecture-decisions/adr013-use-node-fetch.md
@@ -0,0 +1,71 @@
+---
+id: adrs-adr013
+title: 'ADR013: Proper use of HTTP fetching libraries'
+# prettier-ignore
+description: Architecture Decision Record (ADR) for the proper use of fetchApiRef, node-fetch, and cross-fetch for data fetching.
+---
+
+## Context
+
+Using multiple HTTP packages for data fetching increases the complexity and the
+support burden of keeping said package up to date.
+
+## Decision
+
+Backend (node) packages should use the `node-fetch` package for HTTP data
+fetching. Example:
+
+```ts
+import fetch from 'node-fetch';
+import { ResponseError } from '@backstage/errors';
+
+const response = await fetch('https://example.com/api/v1/users.json');
+if (!response.ok) {
+ throw await ResponseError.fromResponse(response);
+}
+const users = await response.json();
+```
+
+Frontend plugins and packages should prefer to use the
+[`fetchApiRef`](https://backstage.io/docs/reference/core-plugin-api.fetchapiref).
+It uses `cross-fetch` internally. Example:
+
+```ts
+import { useApi } from '@backstage/core-plugin-api';
+const { fetch } = useApi(fetchApiRef);
+
+const response = await fetch('https://example.com/api/v1/users.json');
+if (!response.ok) {
+ throw await ResponseError.fromResponse(response);
+}
+const users = await response.json();
+```
+
+Isomorphic packages should have a dependency on the `cross-fetch` package for
+mocking and type definitions. Preferably, classes and functions in isomorphic
+packages should accept an argument of type `typeof fetch` to let callers supply
+their preferred implementation of `fetch`. This lets them adorn the calls with
+auth or other information, and track metrics etc, in a cross-platform way.
+Example:
+
+```ts
+import crossFetch from 'cross-fetch';
+
+export class MyClient {
+ private readonly fetch: typeof crossFetch;
+
+ constructor(options: { fetch?: typeof crossFetch }) {
+ this.fetch = options.fetch || crossFetch;
+ }
+
+ async users() {
+ return await this.fetch('https://example.com/api/v1/users.json');
+ }
+}
+```
+
+## Consequences
+
+We will gradually transition away from third party packages such as `axios`,
+`got` and others. Once we have transitioned to `node-fetch` we will add lint
+rules to enforce this decision.
diff --git a/docs/architecture-decisions/index.md b/docs/architecture-decisions/index.md
index f852170b1e..15d1b0e9d5 100644
--- a/docs/architecture-decisions/index.md
+++ b/docs/architecture-decisions/index.md
@@ -2,6 +2,7 @@
id: adrs-overview
title: Architecture Decision Records (ADR)
sidebar_label: Overview
+# prettier-ignore
description: Overview of Architecture Decision Records (ADR)
---
diff --git a/docs/assets/getting-started/b-existing-1.png b/docs/assets/getting-started/b-existing-1.png
new file mode 100644
index 0000000000..40562ac29c
Binary files /dev/null and b/docs/assets/getting-started/b-existing-1.png differ
diff --git a/docs/assets/getting-started/b-existing-2.png b/docs/assets/getting-started/b-existing-2.png
new file mode 100644
index 0000000000..b1a9a83037
Binary files /dev/null and b/docs/assets/getting-started/b-existing-2.png differ
diff --git a/docs/assets/getting-started/b-existing-3.png b/docs/assets/getting-started/b-existing-3.png
new file mode 100644
index 0000000000..cad6894d86
Binary files /dev/null and b/docs/assets/getting-started/b-existing-3.png differ
diff --git a/docs/assets/getting-started/b-existing-4.png b/docs/assets/getting-started/b-existing-4.png
new file mode 100644
index 0000000000..33ebe353b5
Binary files /dev/null and b/docs/assets/getting-started/b-existing-4.png differ
diff --git a/docs/assets/getting-started/b-scaffold-1.png b/docs/assets/getting-started/b-scaffold-1.png
new file mode 100644
index 0000000000..094b104b7c
Binary files /dev/null and b/docs/assets/getting-started/b-scaffold-1.png differ
diff --git a/docs/assets/getting-started/b-scaffold-2.png b/docs/assets/getting-started/b-scaffold-2.png
new file mode 100644
index 0000000000..db66b83a26
Binary files /dev/null and b/docs/assets/getting-started/b-scaffold-2.png differ
diff --git a/docs/assets/getting-started/b-scaffold-3.png b/docs/assets/getting-started/b-scaffold-3.png
new file mode 100644
index 0000000000..b98ec2d8e3
Binary files /dev/null and b/docs/assets/getting-started/b-scaffold-3.png differ
diff --git a/docs/assets/getting-started/gh-oauth.png b/docs/assets/getting-started/gh-oauth.png
new file mode 100644
index 0000000000..dbe89c4070
Binary files /dev/null and b/docs/assets/getting-started/gh-oauth.png differ
diff --git a/docs/assets/getting-started/gh-pat.png b/docs/assets/getting-started/gh-pat.png
new file mode 100644
index 0000000000..a5b8079225
Binary files /dev/null and b/docs/assets/getting-started/gh-pat.png differ
diff --git a/docs/auth/microsoft/provider.md b/docs/auth/microsoft/provider.md
index 1e24235f1a..ef79127223 100644
--- a/docs/auth/microsoft/provider.md
+++ b/docs/auth/microsoft/provider.md
@@ -48,6 +48,6 @@ The Microsoft provider is a structure with three configuration keys:
## Adding the provider to the Backstage frontend
-To add the provider to the frontend, add the `microsoftAuthApi` reference and
+To add the provider to the frontend, add the `microsoftAuthApiRef` reference and
`SignInPage` component as shown in
[Adding the provider to the sign-in page](../index.md#adding-the-provider-to-the-sign-in-page).
diff --git a/docs/conf/writing.md b/docs/conf/writing.md
index 7945d6c980..a4da1e3df0 100644
--- a/docs/conf/writing.md
+++ b/docs/conf/writing.md
@@ -67,7 +67,7 @@ production build.
## Configuration Files
-It is possible to have multiple configuration files (bundled and/or remote),
+It is possible to have multiple configuration files (bundled and/or remote\*),
both to support different environments, but also to define configuration that is
local to specific packages. The configuration files to load are selected using a
`--config ` flag, and it is possible to load any number of
@@ -77,6 +77,9 @@ root when running the backend, you would use `--config ../../my-config.yaml`,
and for config file on a config server you would use
`--config https://some.domain.io/app-config.yaml`
+**Note**: In case URLs are passed, it is also needed to set the remote option in
+the loadBackendConfig call.
+
If no `config` flags are specified, the default behavior is to load
`app-config.yaml` and, if it exists, `app-config.local.yaml` from the repo root.
In the provided project setup, `app-config.local.yaml` is `.gitignore`'d, making
diff --git a/docs/features/kubernetes/configuration.md b/docs/features/kubernetes/configuration.md
index 07a12f54a0..32ab830322 100644
--- a/docs/features/kubernetes/configuration.md
+++ b/docs/features/kubernetes/configuration.md
@@ -264,6 +264,12 @@ following objects:
- horizontalpodautoscalers
- ingresses
+The following RBAC permissions are required on the batch API group for the
+following objects:
+
+- jobs
+- cronjobs
+
## Surfacing your Kubernetes components as part of an entity
There are two ways to surface your Kubernetes components as part of an entity.
diff --git a/docs/features/software-templates/writing-custom-field-extensions.md b/docs/features/software-templates/writing-custom-field-extensions.md
index ebb7af4398..fab2e1e2cb 100644
--- a/docs/features/software-templates/writing-custom-field-extensions.md
+++ b/docs/features/software-templates/writing-custom-field-extensions.md
@@ -26,7 +26,7 @@ You can create your own Field Extension by using the
`API` like below:
```tsx
-//packages/app/scaffolder/MyCustomExtension/MyCustomExtension.tsx
+//packages/app/src/scaffolder/MyCustomExtension/MyCustomExtension.tsx
import React from 'react';
import { FieldProps, FieldValidation } from '@rjsf/core';
import FormControl from '@material-ui/core/FormControl';
@@ -68,7 +68,7 @@ export const myCustomValidation = (
```
```tsx
-// packages/app/scaffolder/MyCustomExtension/extensions.ts
+// packages/app/src/scaffolder/MyCustomExtension/extensions.ts
/*
This is where the magic happens and creates the custom field extension.
@@ -94,7 +94,7 @@ export const MyCustomFieldExtension = plugin.provide(
```
```tsx
-// packages/app/scaffolder/MyCustomExtension/index.ts
+// packages/app/src/scaffolder/MyCustomExtension/index.ts
export { MyCustomFieldExtension } from './extension';
```
@@ -102,7 +102,7 @@ export { MyCustomFieldExtension } from './extension';
Once all these files are in place, you then need to provide your custom
extension to the `scaffolder` plugin.
-You do this in `packages/app/App.tsx`. You need to provide the
+You do this in `packages/app/src/App.tsx`. You need to provide the
`customFieldExtensions` as children to the `ScaffolderPage`.
```tsx
@@ -118,7 +118,7 @@ const routes = (
Should look something like this instead:
```tsx
-import { MyCustomFieldExtension } from './scafffolder/MyCustomExtension';
+import { MyCustomFieldExtension } from './scaffolder/MyCustomExtension';
const routes = (
...
diff --git a/docs/features/techdocs/configuring-ci-cd.md b/docs/features/techdocs/configuring-ci-cd.md
index 0dec7ec24e..96d841eadf 100644
--- a/docs/features/techdocs/configuring-ci-cd.md
+++ b/docs/features/techdocs/configuring-ci-cd.md
@@ -10,7 +10,7 @@ TechDocs reads the static generated documentation files from a cloud storage
bucket (GCS, AWS S3, etc.). The documentation site is generated on the CI/CD
workflow associated with the repository containing the documentation files. This
document explains the steps needed to generate docs on CI and publish to a cloud
-storage using [`techdocs-cli`](https://github.com/backstage/techdocs-cli).
+storage using [`techdocs-cli`](./cli.md).
The steps here target all kinds of CI providers (GitHub Actions, CircleCI,
Jenkins, etc.). Specific tools for individual providers will also be made
@@ -40,9 +40,8 @@ techdocs-cli publish --publisher-type awsS3 --storage-name --
That's it!
-Take a look at
-[`techdocs-cli` README](https://github.com/backstage/techdocs-cli) for the
-complete command reference, details, and options.
+Take a look at [`techdocs-cli`](./cli.md) for the complete command reference,
+details, and options.
## Steps
@@ -74,7 +73,7 @@ Install [`npx`](https://www.npmjs.com/package/npx) to use it for running
`techdocs-cli`. Or you can install using `npm install -g @techdocs/cli`.
We are going to use the
-[`techdocs-cli generate`](https://github.com/backstage/techdocs-cli#generate-techdocs-site-from-a-documentation-project)
+[`techdocs-cli generate`](./cli.md#generate-techdocs-site-from-a-documentation-project)
command in this step.
```sh
@@ -93,8 +92,7 @@ necessary authentication environment variables.
- [AWS authentication](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-node-credentials-environment.html)
And then run the
-[`techdocs-cli publish`](https://github.com/backstage/techdocs-cli#publish-generated-techdocs-sites)
-command.
+[`techdocs-cli publish`](./cli.md#publish-generated-techdocs-sites) command.
```sh
npx @techdocs/cli publish --publisher-type --storage-name --entity --directory ./site
diff --git a/docs/features/techdocs/how-to-guides.md b/docs/features/techdocs/how-to-guides.md
index 8ff486af37..d9a8ffb93a 100644
--- a/docs/features/techdocs/how-to-guides.md
+++ b/docs/features/techdocs/how-to-guides.md
@@ -421,3 +421,24 @@ folder (/docs) or replace the content in this file.
> on how you have configured your `template.yaml`
Done! You now have support for TechDocs in your own software template!
+
+## how to enable iframes in TechDocs
+
+Techdocs uses the [DOMPurify](https://github.com/cure53/DOMPurify) to sanitizes
+HTML and prevents XSS attacks
+
+It's possible to allow some iframes based on a list of allowed hosts. To do
+this, add the allowed hosts in the `techdocs.sanitizer.allowedIframeHosts`
+configuration of your `app-config.yaml`
+
+E.g.
+
+```yaml
+techdocs:
+ sanitizer:
+ allowedIframeHosts:
+ - drive.google.com
+```
+
+This way, all iframes where the host of src attribute is in the
+`sanitizer.allowedIframeHosts` list will be displayed
diff --git a/docs/getting-started/app-custom-theme.md b/docs/getting-started/app-custom-theme.md
index 241ae7ef03..a4ca0771df 100644
--- a/docs/getting-started/app-custom-theme.md
+++ b/docs/getting-started/app-custom-theme.md
@@ -54,7 +54,7 @@ For example, adding the theme that we created in the previous section can be
done like this:
```ts
-import { createApp } from '@backstage/core-app-api';
+import { createApp } from '@backstage/app-defaults';
const app = createApp({
apis: ...,
diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md
new file mode 100644
index 0000000000..55285e7f4e
--- /dev/null
+++ b/docs/getting-started/configuration.md
@@ -0,0 +1,311 @@
+---
+id: configuration
+title: Getting Started, configuring Backstage
+description: Getting started with your initial Backstage configuration
+---
+
+This is part two of the Getting Started documentation of Backstage. The steps in
+this tutorial assume you've installed Backstage app from the npm repository,
+like in the [Getting Started guide](./index.md) and want to configure Backstage.
+
+At the end of this tutorial, you can expect:
+
+- Backstage to use a PostgreSQL database
+- You'll authenticate using one of the auth providers
+- The Backstage GitHub integration to be configured
+- You're able to use Software Templates
+
+### Prerequisites
+
+- Access to a Linux-based operating system, such as Linux, MacOS or
+ [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/)
+- An account with elevated rights to install prerequisites on your operating
+ system
+- If the database is not hosted on the same server as the Backstage app, the
+ PostgreSQL port needs to be accessible (the default is 5432 or 5433)
+
+### Install and configure PostgreSQL
+
+These instructions can be skipped if you already have a PostgreSQL server
+installed and created a schema and user. The example below is for Linux, but
+luckily there's detailed instructions on how to
+[install PostgreSQL](https://www.postgresql.org/download/) to help you get
+started.
+
+```shell
+sudo apt-get install postgresql
+```
+
+Test if your database is working:
+
+```shell
+sudo -u postgres psql
+```
+
+You should see a very welcoming message, like:
+
+```shell
+psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
+Type "help" for help.
+
+postgres=#
+```
+
+For this tutorial we're going to use the existing postgres user. The next step
+is to set the password for this user:
+
+```shell
+postgres=# ALTER USER postgres PASSWORD 'secret';
+```
+
+That's enough database administration to get started. Type `\q`, followed by
+pressing the enter key. Then again type `exit` and press enter. Next, you need
+to install and configure the client.
+
+Stop Backstage, and go to the root directory of your freshly installed Backstage
+App. Use the following commands to start the PostgreSQL client installation:
+
+```shell
+# From your Backstage root directory
+cd packages/backend
+yarn add pg
+```
+
+Use your favorite editor to open `app-config.yaml` and add your PostgreSQL
+configuration. in the root directory of your Backstage app using the credentials
+from the previous steps.
+
+```diff
+backend:
+ database:
+- client: sqlite3
+- connection: ':memory:'
++ # config options: https://node-postgres.com/api/client
++ client: pg
++ connection:
++ host: ${POSTGRES_HOST}
++ port: ${POSTGRES_PORT}
++ user: ${POSTGRES_USER}
++ password: ${POSTGRES_PASSWORD}
++ # https://node-postgres.com/features/ssl
++ #ssl: require # see https://www.postgresql.org/docs/current/libpq-ssl.html Table 33.1. SSL Mode Descriptions (e.g. require)
++ #ca: # if you have a CA file and want to verify it you can uncomment this section
++ #$file: /ca/server.crt
+```
+
+You'll use the connection details from the previous step. You can either set the
+`POSTGRES_` environment variables prior to launching Backstage, or remove the
+`${...}` values and set actual values in this configuration file.
+
+The default port for PostgreSQL is `5432` or `5433`, and the host name could be
+`127.0.0.1` if installed locally. A word of caution: In general, using
+connection details in a configuration file is not recommended.
+
+Start the Backstage app:
+
+```shell
+yarn dev
+```
+
+After Backstage is completely started you'll notice the catalog is populated
+with the information, still coming from the configuration files. If you add a
+new component, or register an existing one it will be saved in the database.
+Later in this tutorial you'll add a service, and you can test if it's persistent
+as advertised.
+
+If you want to read more about the database configuration, here's some helpful
+links:
+
+- [Configuring Plugin Databases](../tutorials/configuring-plugin-databases.md#privileges)
+- [Read more about Knex](http://knexjs.org/), which is the library we use for
+ the database backend
+
+### Setting up authentication
+
+There's multiple authentication providers available for you to use with
+Backstage, feel free to follow
+[the instructions for adding authentication](../auth/).
+
+For this tutorial we choose to use GitHub, a free service most of you might be
+familiar with. For other options, see
+[the auth provider documentation](../auth/github/provider.md#create-an-oauth-app-on-github).
+
+Go to
+[https://github.com/settings/applications/new](https://github.com/settings/applications/new)
+to create your OAuth App. The `Homepage URL` should point to Backstage's
+frontend, in our tutorial it would be `http://127.0.0.1:3000`. The
+`Authorization callback URL` will point to the auth backend, which will most
+likely be `http://127.0.0.1:7007/api/auth/github/handler/frame`.
+
+
+
+
+
+Take note of the `Client ID` and the `Client Secret`. Open `app-config.yaml`,
+and add your `clientId` and `clientSecret` to this file. It should end up
+looking like this:
+
+```yaml
+auth:
+ # see https://backstage.io/docs/auth/ to learn about auth providers
+ environment: development
+ providers:
+ github:
+ development:
+ clientId: YOUR CLIENT ID
+ clientSecret: YOUR CLIENT SECRET
+```
+
+Backstage will re-read the configuration. If there's no errors, that's great! We
+can continue with the last part of the configuration. The next step is needed to
+change the sign-in page, this you actually need to add in the source code.
+
+Open `packages/app/src/App.tsx` and below the last `import` line, add:
+
+```typescript
+import { githubAuthApiRef } from '@backstage/core-plugin-api';
+import { SignInProviderConfig, SignInPage } from '@backstage/core-components';
+
+const githubProvider: SignInProviderConfig = {
+ id: 'github-auth-provider',
+ title: 'GitHub',
+ message: 'Sign in using GitHub',
+ apiRef: githubAuthApiRef,
+};
+```
+
+Search for `const app = createApp({` in this file, and below `apis,` add:
+
+```typescript
+components: {
+ SignInPage: props => (
+
+ ),
+ },
+```
+
+That should be it. You can stop your Backstage App. When you start it again and
+go to your Backstage portal in your browser, you should have your login prompt!
+
+To learn more about Authentication in Backstage, there's the following docs you
+could read:
+
+- [Adding Authentication](../auth/)
+- [Adding a new Authentication Provider](../auth/add-auth-provider.md)
+- [Using authentication and identity](../auth/using-auth.md)
+- [Using organizational data from GitHub](../integrations/github/org.md)
+
+### Setting up a GitHub Integration
+
+The GitHub integration supports loading catalog entities from GitHub or GitHub
+Enterprise. Entities can be added to static catalog configuration, registered
+with the catalog-import plugin, or discovered from a GitHub organization. Users
+and Groups can also be loaded from an organization. While using GitHub Apps
+might be the best way to set up integrations, for this tutorial you'll use a
+Personal Access Token.
+
+Create your Personal Access Token by opening the
+[the GitHub token creation page](https://github.com/settings/tokens/new). Use a
+name to identify this token and put it in the notes field. Choose a number of
+days for expiration. If you have a hard time picking a number, we suggest to go
+for 7 days, it's a lucky number.
+
+
+
+
+
+Set the scope to your likings. For this tutorial, selecting "repo" should be
+enough.
+
+In the `app-config.yaml`, search for `integrations:` and add your token, like we
+did in below example:
+
+```yaml
+integrations:
+ github:
+ - host: github.com
+ token: ghp_urtokendeinfewinfiwebfweb
+```
+
+That's settled. This information will be leveraged by other plugins.
+
+Some helpful links, for if you want to learn more about:
+
+- [Other available integrations](../integrations/)
+- [Using GitHub Apps instead of a Personal Access Token](../plugins/github-apps.md#docsNav)
+
+### Explore what we've done so far
+
+## Login to Backstage and check profile
+
+Open your Backstage frontend. You should see your login screen if you're not
+logged in yet. As soon as you've logged in, go to Settings, you'll see your
+profile. Hopefully you'll recognize the profile picture and name on your screen,
+otherwise something went terribly wrong.
+
+## Register an existing component
+
+- Register a new component, by going to `create` and choose
+ `Register existing component`
+
+
+
+
+
+- As URL use `https://github.com/backstage/demo/blob/master/catalog-info.yaml`.
+ This is used by our [demo site](https://demo.backstage.io).
+
+
+
+
+- Hit `Analyze` and review the changes. Apply them if correct
+
+
+
+
+
+- You should receive a message that your entities have been added.
+- If you go back to `Home`, you should be able to find `demo`. You should be
+ able to click it and see the details
+
+## Create a new component using a software template
+
+- Go to `create` and choose to create a website with the `React SSR Template`
+- Type in a name, let's use `tutorial`
+- Select the group `group-a` which will own this new website, and go to the next
+ step
+
+
+
+
+
+- For the location, we're going to use the default
+- As owner, type your GitHub username
+- For the repository name, type `tutorial`. Go to the next step
+
+
+
+
+
+- Review the details of this new service, and press `Create` if you want to
+ deploy it like this.
+ - You can follow along with the progress, and as soon as every step is
+ finished, you can take a look at your new service
+
+Achievement unlocked. You've set up an installation of the core Backstage App,
+made it persistent, and configured it so you are now able to use software
+templates.
+
+Let us know how your experience was: [on discord](https://discord.gg/EBHEGzX),
+file issues for any
+[feature](https://github.com/backstage/backstage/issues/new?labels=help+wanted&template=feature_template.md)
+or
+[plugin suggestions](https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME),
+or
+[bugs](https://github.com/backstage/backstage/issues/new?labels=bug&template=bug_template.md)
+you have, and feel free to
+[contribute](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md)!
diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md
index 42b334c62b..a622313739 100644
--- a/docs/getting-started/index.md
+++ b/docs/getting-started/index.md
@@ -87,14 +87,11 @@ carry on with the database steps.
-The most common next steps are to move to a persistent database, configure
-authentication, and add a plugin:
+In the next part of this tutorial, you'll learn how to change to a persistent
+database, configure authentication, and add your first integration. Continue
+with [getting started: Configuring Backstage](configuration.md).
-- [Switching from SQLite to PostgresQL](https://backstage.io/docs/tutorials/switching-sqlite-postgres)
-- [Setting up Authentication](https://backstage.io/docs/auth/)
-- [Adding a plugin](https://backstage.io/docs/getting-started/configure-app-with-plugins)
-
-Congratulations! That should be it. Let us know how it went:
+Share your experiences, comments, or suggestions with us:
[on discord](https://discord.gg/EBHEGzX), file issues for any
[feature](https://github.com/backstage/backstage/issues/new?labels=help+wanted&template=feature_template.md)
or
diff --git a/docs/local-dev/cli-commands.md b/docs/local-dev/cli-commands.md
index 318b37f34e..412e3c4598 100644
--- a/docs/local-dev/cli-commands.md
+++ b/docs/local-dev/cli-commands.md
@@ -434,7 +434,8 @@ Usage: backstage-cli build [options]
Options:
--outputs <formats> List of formats to output [types,cjs,esm]
- -h, --help display help for command
+ --minify Minify the generated code
+ -h, --help display help for command
```
## lint
diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md
index fa34ca3d9a..4fde1662eb 100644
--- a/docs/overview/roadmap.md
+++ b/docs/overview/roadmap.md
@@ -65,11 +65,6 @@ cycle will vary based on maintainer schedules.
The following features are planned for release:
-- **Composable homepage:** We’re seeing lots of interest from the community in
- reusable components to build a homepage experience where users can easily
- surface what they might find useful to start their tasks. Check out the
- [milestone](https://github.com/backstage/backstage/milestone/34) for further
- details.
- **Improved responsiveness:** Check out the
[RFC here](https://github.com/backstage/backstage/issues/6318) for further
details on how to improve the responsiveness for Backstage's UI.
@@ -120,23 +115,6 @@ The following features are planned for release:
strong caching mechanism. The current version often requires fetching a
relevant amount of data, especially at scale.
-### Search
-
-The following features are planned for release:
-
-- ElasticSearch integration: Add ElasticSearch to the Search Platform as the
- underlying search engine. Check out the
- [milestone here](https://github.com/backstage/backstage/milestone/27) for
- further details.
-
-### TechDocs
-
-The following features are planned for release:
-
-- **TechDocs beta release:** Fix remaining bugs to get TechDocs to Beta. Check
- out the [milestone here](https://github.com/backstage/backstage/milestone/29)
- for further details.
-
## Future work
The following feature list doesn’t represent a commitment to develop and the
@@ -165,11 +143,6 @@ the maintainers’ radar, with clear interest expressed by the community.
bottleneck many concurrent projects created simultaneously.
- **API discovery and documentation:** Add better support for the
[gRPC](https://grpc.io/).
-- **Adding TechDocs search to the Search Platform:** Having this capability in
- place will provide a better and new major version of the Search Platform
- (v3.0). You can refer to the
- [milestone here](https://github.com/backstage/backstage/milestone/28) for
- further details.
- **TechDocs GA release:** Work toward enhancements necessary to get TechDocs to
general availability. Check out the
[milestone here](https://github.com/backstage/backstage/milestone/30) for
@@ -179,6 +152,10 @@ the maintainers’ radar, with clear interest expressed by the community.
Read more about the completed (and released) features for reference.
+- [[Search] ElasticSearch integration](https://backstage.io/docs/features/search/search-engines#elasticsearch)
+- [[Search] TechDocs search capabilities](https://backstage.io/docs/features/search/how-to-guides#how-to-index-techdocs-documents)
+- [TechDocs Beta](https://backstage.spotify.com/blog/product-updates/techdocs-beta-has-landed)
+- [[Home] Composable homepage](https://github.com/backstage/backstage/milestone/34)
- [[Search] Out-of-the-Box Implementation (Alpha)](https://github.com/backstage/backstage/milestone/26)
- [Deploy a product demo at `demo.backstage.io`](https://demo.backstage.io)
- [Kubernetes plugin - v1](https://github.com/backstage/backstage/tree/master/plugins/kubernetes)
diff --git a/docs/overview/what-is-backstage.md b/docs/overview/what-is-backstage.md
index 1d9310541a..1197c37cc7 100644
--- a/docs/overview/what-is-backstage.md
+++ b/docs/overview/what-is-backstage.md
@@ -15,6 +15,8 @@ high-quality code quickly — without compromising autonomy.
Backstage unifies all your infrastructure tooling, services, and documentation
to create a streamlined development environment from end to end.
+
+
Out of the box, Backstage includes:
- [Backstage Software Catalog](../features/software-catalog/index.md) for
diff --git a/docs/plugins/composability.md b/docs/plugins/composability.md
index 33568ac561..05af512f92 100644
--- a/docs/plugins/composability.md
+++ b/docs/plugins/composability.md
@@ -368,7 +368,7 @@ The following is an example of creation and usage of a parameterized route:
```tsx
// Creation of a parameterized route
const myRouteRef = createRouteRef({
- title: 'My Named Route',
+ id: 'myroute',
params: ['name']
})
diff --git a/docs/tutorials/backend-to-backend-auth.md b/docs/tutorials/backend-to-backend-auth.md
index 3cb72a4827..cd73a95c89 100644
--- a/docs/tutorials/backend-to-backend-auth.md
+++ b/docs/tutorials/backend-to-backend-auth.md
@@ -22,6 +22,10 @@ resulting value.
node -p 'require("crypto").randomBytes(24).toString("base64")'
```
+**NOTE**: For ease of development, we auto-generate a key for you if you haven't
+configured a secret in dev mode. You _must set your own secret_ in order for
+backend-to-backend authentication to work in production.
+
Requests originating from a backend plugin can be authenticated by decorating
them with a backend token. Backend tokens can be generated using a
`TokenManager`, which can be passed to plugin backends via the
@@ -43,7 +47,7 @@ function makeCreateEnv(config: Config) {
const cacheManager = CacheManager.fromConfig(config);
const databaseManager = DatabaseManager.fromConfig(config);
- const tokenManager = ServerTokenManager.noop();
-+ const tokenManager = ServerTokenManager.fromConfig(config);
++ const tokenManager = ServerTokenManager.fromConfig(config, { logger: root });
```
With this `tokenManager`, you can then generate a server token for requests:
diff --git a/docs/tutorials/journey.md b/docs/tutorials/journey.md
index 249507ddf0..126bb5ae0d 100644
--- a/docs/tutorials/journey.md
+++ b/docs/tutorials/journey.md
@@ -48,7 +48,6 @@ that implements the `OAuthApi` type, it's now working in the frontend too.
```ts
const spotifyAuthApiRef = createApiRef({
id: 'core.auth.spotify',
- description: 'Provides authentication towards Spotify APIs',
});
```
diff --git a/docs/tutorials/using-backstage-proxy-within-plugin.md b/docs/tutorials/using-backstage-proxy-within-plugin.md
index b0c6bef8ef..771aa7a652 100644
--- a/docs/tutorials/using-backstage-proxy-within-plugin.md
+++ b/docs/tutorials/using-backstage-proxy-within-plugin.md
@@ -99,7 +99,6 @@ export interface MyAwesomeApi {
export const myAwesomeApiRef = createApiRef({
id: 'plugin.my-awesome-api.service',
- description: 'Example API definition',
});
```
diff --git a/microsite/blog/2021-12-20-backstage-wrapped-2021.md b/microsite/blog/2021-12-20-backstage-wrapped-2021.md
new file mode 100644
index 0000000000..2a6234a9f6
--- /dev/null
+++ b/microsite/blog/2021-12-20-backstage-wrapped-2021.md
@@ -0,0 +1,145 @@
+---
+title: Backstage Wrapped 2021
+author: Lee Mills, Spotify
+authorURL: https://github.com/leemills83
+authorImageURL: https://avatars1.githubusercontent.com/u/1236238?s=460&v=4
+---
+
+
+
+What a year 2021 has been for the Backstage project and community. As the year comes to a close, we can look back at some of the happenings, the successes, and welcome all the newcomers to our growing community.
+
+In a year that has had its fair share of ups and downs, this community has been something that has brought me so much in the support you provide each other, your eagerness, passion, and willingness to share. Thank you to all of you for creating such a great community, and welcome to everyone joining us. I can’t wait to meet you all and see what great things we can create together in the new year.
+
+In 2021 we’ve seen the project and community grow in every dimension, reaching over 75 public adopters, over 500 contributors from around the world all bringing new ideas and perspectives. We’ve had so many of you sharing and demoing your hard work in our monthly community sessions, added new plugins, built new features and really started to see Backstage have an impact for engineering teams across so many of our users.
+
+Now let’s hear from the maintainers and look at the stats!
+
+
+
+## The community grew…and grew
+
+This year, Netflix, [Expedia][metrics], Wayfair, Peloton, [Box][10], [DAZN][dazn], TELUS, and Unity all officially joined the community — along with more than 50 other public [adopters][md]. Contributors grew by leaps and bounds, too.
+
+Patrik Oldsberg ([@Rugvip][rugvip]):
+
+> It’s been awesome to see the engagement by the community grow even more in 2021, especially the way people within the community support each other. Thanks to our growing number of stable, experienced, and knowledgeable contributors it’s now possible to get help in places like Discord anytime, day or night.
+
+### More adopters, more contributors
+
+
+
+In January, Backstage had 17 public adopters. By September, [we had 50][50]. And the curve only got steeper from there.
+
+- **75+ public adopters**
+- **500+ contributors**
+- **4,000+ Discord members**
+- **9,000+ PRs & issues**
+
+### A very busy repo
+
+Along with the growth in contributors, PRs, and issues, our active, thriving community has crossed (or is just about to cross) other big milestones on GitHub, too.
+
+- **Nearly 2,000 forks**
+- **20,000+ commits**
+- **14,000+ GitHub stars**
+
+### Where in the world is the Backstage community?
+
+Watch the visualization below to see where in the world all those contributions came from this past year.
+
+
+
+### What does 9,000 contributions look like?
+
+
+
+Can you spot your name in the video above?
+
+Picking up from the end of 2020, the video shows every single contribution to the Backstage source code over this past year. The visualization was built using [Gource.io][gource]:
+
+> Software projects are displayed by Gource as an animated tree with the root directory of the project at its centre. Directories appear as branches with files as leaves. Developers can be seen working on the tree at the times they contributed to the project.
+
+And if your name isn’t in there, it’s never too late to get started [contributing][contributing] — so that you too can become a bright, sparkling, laser-beam-shooting spider-node thing in 2022!
+
+## Other 2021 milestones
+
+As the community grew, so did the product — with the addition of new features as well as important performance and stability improvements to the core.
+
+Ben Lambert ([@benjdlambert][blam]):
+
+> We’ve had a lot of priorities this year. Our first priority was rebuilding the catalog to make it more efficient. Then, toward the later part of the year, we’ve been stabilizing the core with deprecations and API changes ahead of our 1.0 release of the Core Framework next year.
+>
+> It’s been a super productive year for us all as Core Maintainers, and the product has come on leaps and bounds with the help of everyone involved in the project!
+
+### New features
+
+These new features were built with the community, and made with customization and extensibility in mind.
+
+- **Kubernetes Service Monitoring ([RFC][k8s])**
+- **Search Platform ([Alpha][search])**
+- **Composable Homepage ([README][home])**
+- **Authorization Framework ([RFC][auth])**
+
+### Major stability updates
+
+As we get the ball rolling for [CNCF Incubation][cncf], we’ve been busy updating, refining, documenting, deprecating, and stabilizing the core.
+
+- **Software Templates ([Beta][scaffolder])**
+- **TechDocs ([Beta][techdocs])**
+- **API Reference ([docs][api])**
+
+### 50+ open source plugins
+
+We reached [50+ plugins][plugins] built by the community this year, including official plugins (**Snyk**, **FireHydrant**), highly requested plugins (**PagerDuty**, **Prometheus**), and plugins based on new ideas and functionality (**XCMetrics**, **[Tech Insights][techrfc]**) — all tailor-made for Backstage.
+
+### In the spotlight
+
+This year Backstage was center stage at both community-organized events and at major conferences.
+
+- **New (and [expanded][09]) Community Sessions**
+- **Backstage Users Unconference + [Open Mic][openmic]**
+- **KubeCon + CloudNativeCon [Europe][europe] & [North America][na]**
+- **GitHub Universe 2021 [Keynote][day2]**
+
+Find more talks, podcasts, blog posts, and Backstage in the news [here][news].
+
+## Goodbye, 2021. Hello, 2022!
+
+Lastly, thanks to everyone in the global Backstage community who contributed to the open source project in 2021.
+
+This was the first year Spotify hosted [Backstage Community Sessions][meetups], and it’s been a great source of inspiration, motivation, and joy getting to know all the people behind the contributions. We look forward to seeing all your faces again in 2022 — and hopefully many new ones as well.
+
+Until then, [grab this Backstage Zoom background][zoom] to use at the next Community Session.
+
+
+
+See you then! Happy holidays from everyone on the Backstage team at Spotify!
+
+[metrics]: https://backstage.spotify.com/blog/measuring-backstage-proof-of-value-at-expedia/
+[10]: https://backstage.spotify.com/blog/community-session/10-box-and-spotify-paid-plugins/
+[dazn]: https://backstage.spotify.com/blog/adopter-spotlight/dazn/
+[md]: https://github.com/backstage/backstage/blob/master/ADOPTERS.md
+[rugvip]: https://github.com/Rugvip
+[50]: https://backstage.io/blog/2021/09/30/50-public-adopters
+[gource]: https://gource.io
+[contributing]: https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md
+[blam]: https://github.com/benjdlambert
+[k8s]: https://github.com/backstage/backstage/issues/2857
+[search]: https://backstage.io/blog/2021/06/24/announcing-backstage-search-platform
+[home]: https://github.com/backstage/backstage/blob/master/plugins/home/README.md
+[auth]: https://backstage.spotify.com/blog/authorization-framework-rfc/
+[scaffolder]: https://backstage.io/blog/2021/07/26/software-templates-are-now-in-beta
+[techdocs]: https://backstage.io/blog/2021/09/16/the-techdocs-beta-has-landed
+[api]: https://backstage.io/docs/reference/
+[cncf]: https://github.com/cncf/toc/pull/717
+[plugins]: https://backstage.io/plugins
+[techrfc]: https://github.com/backstage/backstage/issues/7576
+[09]: https://backstage.spotify.com/blog/community-session/09-prometheus-homepage-templates/
+[openmic]: https://backstage-openmic.com
+[europe]: https://www.youtube.com/watch?v=aIURaocR5D8
+[na]: https://backstage.spotify.com/blog/kubecon-na-2021/
+[day2]: https://www.youtube.com/watch?v=7yQJlYvpoYs&t=269s
+[news]: https://github.com/backstage/community#newsletters
+[meetups]: https://github.com/backstage/community#meetups
+[zoom]: https://drive.google.com/file/d/14wOPXEBZ5Qmi29ms4Sqp1m56dM0AIHbB/view?usp=sharing
diff --git a/microsite/blog/assets/21-12-20/Backstage-background-02-2021.png b/microsite/blog/assets/21-12-20/Backstage-background-02-2021.png
new file mode 100644
index 0000000000..bf3c72ba70
Binary files /dev/null and b/microsite/blog/assets/21-12-20/Backstage-background-02-2021.png differ
diff --git a/microsite/blog/assets/21-12-20/backstage-wrapped-2021.png b/microsite/blog/assets/21-12-20/backstage-wrapped-2021.png
new file mode 100644
index 0000000000..6ac5d5f67c
Binary files /dev/null and b/microsite/blog/assets/21-12-20/backstage-wrapped-2021.png differ
diff --git a/microsite/blog/assets/21-12-20/public-backstage-adopters-2021.png b/microsite/blog/assets/21-12-20/public-backstage-adopters-2021.png
new file mode 100644
index 0000000000..aac981d5f9
Binary files /dev/null and b/microsite/blog/assets/21-12-20/public-backstage-adopters-2021.png differ
diff --git a/microsite/data/plugins/azure-pipelines.yaml b/microsite/data/plugins/azure-pipelines.yaml
new file mode 100644
index 0000000000..c591591478
--- /dev/null
+++ b/microsite/data/plugins/azure-pipelines.yaml
@@ -0,0 +1,9 @@
+---
+title: 'Azure Pipelines'
+author: Keyloop
+authorUrl: https://keyloop.com/
+category: CI/CD
+description: Easily view your Azure Pipelines within the Software Catalog
+documentation: https://github.com/backstage/backstage/blob/master/plugins/azure-devops/README.md
+iconUrl: img/azure-pipelines.svg
+npmPackageName: '@backstage/plugin-azure-devops'
diff --git a/microsite/data/plugins/newrelic-dashboard.yaml b/microsite/data/plugins/newrelic-dashboard.yaml
new file mode 100644
index 0000000000..c314d4c458
--- /dev/null
+++ b/microsite/data/plugins/newrelic-dashboard.yaml
@@ -0,0 +1,15 @@
+---
+title: New Relic Dashboard
+author: '@mufaddal7'
+authorUrl: https://github.com/mufaddal7
+category: Monitoring
+description: Easily view your New Relic Dashboards in Backstage, via real-time snapshots of your dashboards
+documentation: https://github.com/backstage/backstage/tree/master/plugins/newrelic-dashboard
+iconUrl: https://newrelic.com/themes/custom/curio/assets/mediakit/NR_logo_Horizontal_Rev.svg
+npmPackageName: '@backstage/plugin-newrelic-dashboard'
+tags:
+ - performance
+ - monitoring
+ - errors
+ - alerting
+ - dashboards
diff --git a/microsite/sidebars.json b/microsite/sidebars.json
index 89eb282d14..6c4c5261d9 100644
--- a/microsite/sidebars.json
+++ b/microsite/sidebars.json
@@ -14,6 +14,7 @@
],
"Getting Started": [
"getting-started/index",
+ "getting-started/configuration",
"getting-started/create-an-app",
"getting-started/running-backstage-locally",
{
@@ -270,7 +271,8 @@
"tutorials/migrating-away-from-core",
"tutorials/configuring-plugin-databases",
"tutorials/switching-sqlite-postgres",
- "tutorials/using-backstage-proxy-within-plugin"
+ "tutorials/using-backstage-proxy-within-plugin",
+ "tutorials/backend-to-backend-auth"
],
"Architecture Decision Records (ADRs)": [
"architecture-decisions/adrs-overview",
@@ -285,7 +287,8 @@
"architecture-decisions/adrs-adr009",
"architecture-decisions/adrs-adr010",
"architecture-decisions/adrs-adr011",
- "architecture-decisions/adrs-adr012"
+ "architecture-decisions/adrs-adr012",
+ "architecture-decisions/adrs-adr013"
],
"FAQ": ["FAQ"]
}
diff --git a/microsite/static/img/azure-pipelines.svg b/microsite/static/img/azure-pipelines.svg
new file mode 100644
index 0000000000..d60daf69e5
--- /dev/null
+++ b/microsite/static/img/azure-pipelines.svg
@@ -0,0 +1,5 @@
+
diff --git a/mkdocs.yml b/mkdocs.yml
index 2eed377819..81dad55b84 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -64,6 +64,7 @@ nav:
- Backstage Search:
- Overview: 'features/search/README.md'
- Getting Started: 'features/search/getting-started.md'
+ - Getting Started, configuring Backstage: 'features/search/configuration.md'
- Concepts: 'features/search/concepts.md'
- Search Architecture: 'features/search/architecture.md'
- Search Engines: 'features/search/search-engines.md'
@@ -185,6 +186,8 @@ nav:
- ADR009 - Entity References: 'architecture-decisions/adr009-entity-references.md'
- ADR010 - Luxon Date Library: 'architecture-decisions/adr010-luxon-date-library.md'
- ADR011 - Plugin Package Structure: 'architecture-decisions/adr011-plugin-package-structure.md'
+ - ADR012 - Plugin Package Structure: 'architecture-decisions/adr012-use-luxon-locale-and-date-presets.md'
+ - ADR013 - Plugin Package Structure: 'architecture-decisions/adr013-use-node-fetch.md'
- Support:
- Backstage Project Structure: 'support/project-structure.md'
- Glossary: glossary.md
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index b9a84d500c..751b758984 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/app-defaults
+## 0.1.3
+
+### Patch Changes
+
+- 7927005152: Add `FetchApi` and related `fetchApiRef` which implement fetch, with an added Backstage token header when available.
+- 1e49c23eb7: Added an instance of PermissionApi to the apis included by default in createApp.
+- 68f8b10ccd: - Removed deprecation configuration option `theme` from `AppTheme` of the `AppThemeApi`
+ - Removed reference to `theme` in the `app-defaults` default `AppTheme`
+ - Removed logic in `AppThemeProvider` that creates `ThemeProvider` from `appTheme.theme`
+- Updated dependencies
+ - @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.2
+
## 0.1.2
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index fc1bca2104..89d83ae91f 100644
--- a/packages/app-defaults/package.json
+++ b/packages/app-defaults/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
- "version": "0.1.2",
+ "version": "0.1.3",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,9 +29,10 @@
"clean": "backstage-cli clean"
},
"dependencies": {
- "@backstage/core-components": "^0.8.0",
- "@backstage/core-app-api": "^0.2.0",
- "@backstage/core-plugin-api": "^0.3.0",
+ "@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/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
@@ -41,8 +42,8 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.10.1",
- "@backstage/test-utils": "^0.1.24",
+ "@backstage/cli": "^0.10.3",
+ "@backstage/test-utils": "^0.2.0",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
"@types/jest": "^26.0.7",
diff --git a/packages/app-defaults/src/defaults/apis.ts b/packages/app-defaults/src/defaults/apis.ts
index d3c76d52bd..f26c298fb1 100644
--- a/packages/app-defaults/src/defaults/apis.ts
+++ b/packages/app-defaults/src/defaults/apis.ts
@@ -34,6 +34,8 @@ import {
OneLoginAuth,
UnhandledErrorForwarder,
AtlassianAuth,
+ createFetchApi,
+ FetchMiddlewares,
} from '@backstage/core-app-api';
import {
@@ -42,6 +44,8 @@ import {
analyticsApiRef,
errorApiRef,
discoveryApiRef,
+ fetchApiRef,
+ identityApiRef,
oauthRequestApiRef,
googleAuthApiRef,
githubAuthApiRef,
@@ -58,6 +62,10 @@ import {
bitbucketAuthApiRef,
atlassianAuthApiRef,
} from '@backstage/core-plugin-api';
+import {
+ permissionApiRef,
+ IdentityPermissionApi,
+} from '@backstage/plugin-permission-react';
export const apis = [
createApiFactory({
@@ -92,6 +100,27 @@ export const apis = [
deps: { errorApi: errorApiRef },
factory: ({ errorApi }) => WebStorage.create({ errorApi }),
}),
+ createApiFactory({
+ api: fetchApiRef,
+ deps: {
+ configApi: configApiRef,
+ identityApi: identityApiRef,
+ discoveryApi: discoveryApiRef,
+ },
+ factory: ({ configApi, identityApi, discoveryApi }) => {
+ return createFetchApi({
+ middleware: [
+ FetchMiddlewares.resolvePluginProtocol({
+ discoveryApi,
+ }),
+ FetchMiddlewares.injectIdentityAuth({
+ identityApi,
+ config: configApi,
+ }),
+ ],
+ });
+ },
+ }),
createApiFactory({
api: oauthRequestApiRef,
deps: {},
@@ -271,4 +300,14 @@ export const apis = [
});
},
}),
+ createApiFactory({
+ api: permissionApiRef,
+ deps: {
+ discovery: discoveryApiRef,
+ identity: identityApiRef,
+ config: configApiRef,
+ },
+ factory: ({ config, discovery, identity }) =>
+ IdentityPermissionApi.create({ config, discovery, identity }),
+ }),
];
diff --git a/packages/app-defaults/src/defaults/components.tsx b/packages/app-defaults/src/defaults/components.tsx
index 139bea4862..93a5d9cd50 100644
--- a/packages/app-defaults/src/defaults/components.tsx
+++ b/packages/app-defaults/src/defaults/components.tsx
@@ -73,7 +73,7 @@ const DefaultErrorBoundaryFallback = ({
};
/**
- * Creates a set of default components to pass along to {@link @backstage/core-app-api#createApp}.
+ * Creates a set of default components to pass along to {@link @backstage/core-app-api#createSpecializedApp}.
*
* @public
*/
diff --git a/packages/app-defaults/src/defaults/themes.tsx b/packages/app-defaults/src/defaults/themes.tsx
index 90a4a0f47f..397c160168 100644
--- a/packages/app-defaults/src/defaults/themes.tsx
+++ b/packages/app-defaults/src/defaults/themes.tsx
@@ -28,7 +28,6 @@ export const themes: AppTheme[] = [
title: 'Light Theme',
variant: 'light',
icon: ,
- theme: lightTheme,
Provider: ({ children }) => (
{children}
@@ -40,7 +39,6 @@ export const themes: AppTheme[] = [
title: 'Dark Theme',
variant: 'dark',
icon: ,
- theme: darkTheme,
Provider: ({ children }) => (
{children}
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index d1055a54bf..5465c6b9e7 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,52 @@
# example-app
+## 0.2.58
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search@0.5.2
+ - @backstage/app-defaults@0.1.3
+ - @backstage/core-app-api@0.3.0
+ - @backstage/core-plugin-api@0.4.0
+ - @backstage/plugin-user-settings@0.3.14
+ - @backstage/plugin-scaffolder@0.11.15
+ - @backstage/plugin-catalog-react@0.6.8
+ - @backstage/plugin-kubernetes@0.5.2
+ - @backstage/core-components@0.8.2
+ - @backstage/cli@0.10.3
+ - @backstage/plugin-tech-radar@0.5.0
+ - @backstage/plugin-tech-insights@0.1.2
+ - @backstage/plugin-org@0.3.32
+ - @backstage/plugin-catalog@0.7.5
+ - @backstage/plugin-newrelic-dashboard@0.1.1
+ - @backstage/plugin-home@0.4.8
+ - @backstage/plugin-circleci@0.2.32
+ - @backstage/plugin-cloudbuild@0.2.30
+ - @backstage/plugin-github-actions@0.4.28
+ - @backstage/plugin-jenkins@0.5.15
+ - @backstage/plugin-lighthouse@0.2.32
+ - @backstage/plugin-sentry@0.3.31
+ - @backstage/plugin-apache-airflow@0.1.1
+ - @backstage/plugin-api-docs@0.6.19
+ - @backstage/plugin-azure-devops@0.1.8
+ - @backstage/plugin-badges@0.2.17
+ - @backstage/plugin-catalog-graph@0.2.4
+ - @backstage/plugin-catalog-import@0.7.6
+ - @backstage/plugin-code-coverage@0.1.20
+ - @backstage/plugin-cost-insights@0.11.14
+ - @backstage/plugin-explore@0.3.23
+ - @backstage/plugin-gcp-projects@0.3.11
+ - @backstage/plugin-graphiql@0.2.25
+ - @backstage/plugin-kafka@0.2.23
+ - @backstage/plugin-newrelic@0.3.11
+ - @backstage/plugin-pagerduty@0.3.20
+ - @backstage/plugin-rollbar@0.3.21
+ - @backstage/plugin-shortcuts@0.1.16
+ - @backstage/plugin-techdocs@0.12.11
+ - @backstage/plugin-todo@0.1.17
+ - @backstage/integration-react@0.1.16
+
## 0.2.57
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index a9e8e8ddc8..1dd48eb7bd 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,57 +1,58 @@
{
"name": "example-app",
- "version": "0.2.57",
+ "version": "0.2.58",
"private": true,
"bundled": true,
"dependencies": {
- "@backstage/app-defaults": "^0.1.2",
+ "@backstage/app-defaults": "^0.1.3",
"@backstage/catalog-model": "^0.9.8",
- "@backstage/cli": "^0.10.2",
- "@backstage/core-app-api": "^0.2.1",
- "@backstage/core-components": "^0.8.1",
- "@backstage/core-plugin-api": "^0.3.1",
- "@backstage/integration-react": "^0.1.15",
- "@backstage/plugin-api-docs": "^0.6.18",
- "@backstage/plugin-azure-devops": "^0.1.7",
- "@backstage/plugin-apache-airflow": "^0.1.0",
- "@backstage/plugin-badges": "^0.2.16",
- "@backstage/plugin-catalog": "^0.7.4",
- "@backstage/plugin-catalog-graph": "^0.2.3",
- "@backstage/plugin-catalog-import": "^0.7.5",
- "@backstage/plugin-catalog-react": "^0.6.7",
- "@backstage/plugin-circleci": "^0.2.31",
- "@backstage/plugin-cloudbuild": "^0.2.29",
- "@backstage/plugin-code-coverage": "^0.1.19",
- "@backstage/plugin-cost-insights": "^0.11.13",
- "@backstage/plugin-explore": "^0.3.22",
- "@backstage/plugin-gcp-projects": "^0.3.10",
- "@backstage/plugin-github-actions": "^0.4.27",
- "@backstage/plugin-graphiql": "^0.2.24",
- "@backstage/plugin-home": "^0.4.7",
- "@backstage/plugin-jenkins": "^0.5.14",
- "@backstage/plugin-kafka": "^0.2.22",
- "@backstage/plugin-kubernetes": "^0.5.1",
- "@backstage/plugin-lighthouse": "^0.2.31",
- "@backstage/plugin-newrelic": "^0.3.10",
- "@backstage/plugin-org": "^0.3.31",
- "@backstage/plugin-pagerduty": "0.3.19",
- "@backstage/plugin-rollbar": "^0.3.20",
- "@backstage/plugin-scaffolder": "^0.11.14",
- "@backstage/plugin-search": "^0.5.1",
- "@backstage/plugin-sentry": "^0.3.30",
- "@backstage/plugin-shortcuts": "^0.1.15",
- "@backstage/plugin-tech-radar": "^0.4.13",
- "@backstage/plugin-techdocs": "^0.12.10",
- "@backstage/plugin-todo": "^0.1.16",
- "@backstage/plugin-user-settings": "^0.3.13",
+ "@backstage/cli": "^0.10.3",
+ "@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-api-docs": "^0.6.19",
+ "@backstage/plugin-azure-devops": "^0.1.8",
+ "@backstage/plugin-apache-airflow": "^0.1.1",
+ "@backstage/plugin-badges": "^0.2.17",
+ "@backstage/plugin-catalog": "^0.7.5",
+ "@backstage/plugin-catalog-graph": "^0.2.4",
+ "@backstage/plugin-catalog-import": "^0.7.6",
+ "@backstage/plugin-catalog-react": "^0.6.8",
+ "@backstage/plugin-circleci": "^0.2.32",
+ "@backstage/plugin-cloudbuild": "^0.2.30",
+ "@backstage/plugin-code-coverage": "^0.1.20",
+ "@backstage/plugin-cost-insights": "^0.11.14",
+ "@backstage/plugin-explore": "^0.3.23",
+ "@backstage/plugin-gcp-projects": "^0.3.11",
+ "@backstage/plugin-github-actions": "^0.4.28",
+ "@backstage/plugin-graphiql": "^0.2.25",
+ "@backstage/plugin-home": "^0.4.8",
+ "@backstage/plugin-jenkins": "^0.5.15",
+ "@backstage/plugin-kafka": "^0.2.23",
+ "@backstage/plugin-kubernetes": "^0.5.2",
+ "@backstage/plugin-lighthouse": "^0.2.32",
+ "@backstage/plugin-newrelic": "^0.3.11",
+ "@backstage/plugin-newrelic-dashboard": "^0.1.1",
+ "@backstage/plugin-org": "^0.3.32",
+ "@backstage/plugin-pagerduty": "0.3.20",
+ "@backstage/plugin-rollbar": "^0.3.21",
+ "@backstage/plugin-scaffolder": "^0.11.15",
+ "@backstage/plugin-search": "^0.5.2",
+ "@backstage/plugin-sentry": "^0.3.31",
+ "@backstage/plugin-shortcuts": "^0.1.16",
+ "@backstage/plugin-tech-radar": "^0.5.0",
+ "@backstage/plugin-techdocs": "^0.12.11",
+ "@backstage/plugin-todo": "^0.1.17",
+ "@backstage/plugin-user-settings": "^0.3.14",
"@backstage/search-common": "^0.2.0",
- "@backstage/plugin-tech-insights": "^0.1.1",
+ "@backstage/plugin-tech-insights": "^0.1.2",
"@backstage/theme": "^0.2.14",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"@octokit/rest": "^18.5.3",
- "@roadiehq/backstage-plugin-github-insights": "^1.1.23",
+ "@roadiehq/backstage-plugin-github-insights": "^1.2.2",
"@roadiehq/backstage-plugin-github-pull-requests": "^1.0.13",
"@roadiehq/backstage-plugin-travis-ci": "^1.0.11",
"history": "^5.0.0",
@@ -65,7 +66,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
- "@backstage/test-utils": "^0.1.24",
+ "@backstage/test-utils": "^0.2.0",
"@rjsf/core": "^3.2.1",
"@testing-library/cypress": "^8.0.2",
"@testing-library/jest-dom": "^5.10.1",
diff --git a/packages/app/public/index.html b/packages/app/public/index.html
index d86f09f0b0..885fb6c228 100644
--- a/packages/app/public/index.html
+++ b/packages/app/public/index.html
@@ -42,18 +42,12 @@
href="<%= publicPath %>/safari-pinned-tab.svg"
color="#5bbad5"
/>
-
- <%= app.title %>
+ <%= config.getString('app.title') %>
- <% if (app.googleAnalyticsTrackingId && typeof
- app.googleAnalyticsTrackingId==='string' ) { %>
+ <% if (config.has('app.googleAnalyticsTrackingId')) { %>
- <% } %> <% if (app.datadogRum.clientToken && app.datadogRum.applicationId )
- { %>
+ <% } %> <% if (config.has('app.datadogRum')) { %>
+ ```
+
+ ```diff
+ - gtag('config', '<%= app.googleAnalyticsTrackingId %>');
+ + gtag(
+ + 'config',
+ + '<%= config.getString("app.googleAnalyticsTrackingId") %>',
+ + );
+ ```
+
## 0.4.8
### Patch Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 7a6c7ad551..810df43f47 100644
--- a/packages/create-app/package.json
+++ b/packages/create-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
- "version": "0.4.8",
+ "version": "0.4.9",
"private": false,
"publishConfig": {
"access": "public"
@@ -49,6 +49,7 @@
},
"peerDependencies": {
"@backstage/backend-common": "*",
+ "@backstage/backend-tasks": "*",
"@backstage/catalog-client": "*",
"@backstage/catalog-model": "*",
"@backstage/cli": "*",
diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts
index 6c85652c64..3765422923 100644
--- a/packages/create-app/src/lib/versions.ts
+++ b/packages/create-app/src/lib/versions.ts
@@ -32,6 +32,7 @@ leaving any imports in place.
import { version as appDefaults } from '../../../app-defaults/package.json';
import { version as backendCommon } from '../../../backend-common/package.json';
+import { version as backendTasks } from '../../../backend-tasks/package.json';
import { version as catalogClient } from '../../../catalog-client/package.json';
import { version as catalogModel } from '../../../catalog-model/package.json';
import { version as cli } from '../../../cli/package.json';
@@ -71,6 +72,7 @@ import { version as pluginUserSettings } from '../../../../plugins/user-settings
export const packageVersions = {
'@backstage/app-defaults': appDefaults,
'@backstage/backend-common': backendCommon,
+ '@backstage/backend-tasks': backendTasks,
'@backstage/catalog-client': catalogClient,
'@backstage/catalog-model': catalogModel,
'@backstage/cli': cli,
diff --git a/packages/create-app/templates/default-app/packages/app/public/index.html b/packages/create-app/templates/default-app/packages/app/public/index.html
index b93896c6da..a936c73602 100644
--- a/packages/create-app/templates/default-app/packages/app/public/index.html
+++ b/packages/create-app/templates/default-app/packages/app/public/index.html
@@ -42,17 +42,11 @@
href="<%= publicPath %>/safari-pinned-tab.svg"
color="#5bbad5"
/>
-
- <%= app.title %>
- <% if (app.googleAnalyticsTrackingId && typeof app.googleAnalyticsTrackingId
- === 'string') { %>
+ <%= config.getString('app.title') %>
+ <% if (config.has('app.googleAnalyticsTrackingId')) { %>
<% } %>
-
+