diff --git a/.changeset/1724.md b/.changeset/1724.md
new file mode 100644
index 0000000000..2ac03f94e9
--- /dev/null
+++ b/.changeset/1724.md
@@ -0,0 +1,27 @@
+---
+'@backstage/cli': minor
+'@backstage/plugin-api-docs': minor
+'@backstage/plugin-app-backend': minor
+'@backstage/plugin-auth-backend': minor
+'@backstage/plugin-catalog-graphql': minor
+'@backstage/plugin-catalog': minor
+'@backstage/plugin-circleci': minor
+'@backstage/plugin-explore': minor
+'@backstage/plugin-gcp-projects': minor
+'@backstage/plugin-github-actions': minor
+'@backstage/plugin-gitops-profiles': minor
+'@backstage/plugin-graphiql': minor
+'@backstage/plugin-jenkins': minor
+'@backstage/plugin-kubernetes': minor
+'@backstage/plugin-lighthouse': minor
+'@backstage/plugin-newrelic': minor
+'@backstage/plugin-register-component': minor
+'@backstage/plugin-rollbar': minor
+'@backstage/plugin-scaffolder': minor
+'@backstage/plugin-sentry': minor
+'@backstage/plugin-tech-radar': minor
+'@backstage/plugin-techdocs': minor
+'@backstage/plugin-welcome': minor
+---
+
+Create backend plugin through CLI
diff --git a/.changeset/2284.md b/.changeset/2284.md
new file mode 100644
index 0000000000..655cc5a3e8
--- /dev/null
+++ b/.changeset/2284.md
@@ -0,0 +1,11 @@
+---
+'@backstage/core-api': minor
+'@backstage/core': minor
+'@backstage/plugin-auth-backend': minor
+---
+
+Add SAML login to backstage
+
+
+
+
diff --git a/.changeset/2515.md b/.changeset/2515.md
new file mode 100644
index 0000000000..32f5edd6b7
--- /dev/null
+++ b/.changeset/2515.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-cloudbuild': minor
+---
+
+Releasing Google Cloud Build Plugin
diff --git a/.changeset/2532.md b/.changeset/2532.md
new file mode 100644
index 0000000000..14307f6c08
--- /dev/null
+++ b/.changeset/2532.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-model': minor
+---
+
+Add handling and docs for entity references
diff --git a/.changeset/2535.md b/.changeset/2535.md
new file mode 100644
index 0000000000..bd28f3ce03
--- /dev/null
+++ b/.changeset/2535.md
@@ -0,0 +1,14 @@
+---
+'@backstage/core': patch
+'@backstage/theme': patch
+---
+
+Fix banner position and color
+
+This PR closes: #2245
+
+The "fixed" props added to control the position of the banner. When it is set to true the banner will be shown in bottom of that page and the width will be based on the content of the message.
+
+
+
+
diff --git a/.changeset/2541.md b/.changeset/2541.md
new file mode 100644
index 0000000000..1ba29da040
--- /dev/null
+++ b/.changeset/2541.md
@@ -0,0 +1,5 @@
+---
+'@backstage/theme': minor
+---
+
+Tweak dark mode colors
diff --git a/.changeset/2543.md b/.changeset/2543.md
new file mode 100644
index 0000000000..00311ade45
--- /dev/null
+++ b/.changeset/2543.md
@@ -0,0 +1,9 @@
+---
+'@backstage/plugin-scaffolder-backend': minor
+---
+
+Add Azure DevOps support to the scaffolder backend
+
+This adds support for Azure DevOps to the scaffolder (preparer & publisher). I thought I should get this in there now since #2426 has been merged. I had a previous PR with only the preparer but I closed that in favor of this one.
+
+I stayed with the 'azure/api' structure but I guess we should try and go the same way as with GitHub here #2501
diff --git a/.changeset/2562.md b/.changeset/2562.md
new file mode 100644
index 0000000000..716f370ad9
--- /dev/null
+++ b/.changeset/2562.md
@@ -0,0 +1,7 @@
+---
+'@backstage/create-app': minor
+'@backstage/plugin-auth-backend': minor
+'@backstage/plugin-techdocs-backend': minor
+---
+
+Change the default backend plugin mount point to /api
diff --git a/.changeset/2563.md b/.changeset/2563.md
new file mode 100644
index 0000000000..318d5cf5ef
--- /dev/null
+++ b/.changeset/2563.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-github-actions': minor
+---
+
+Adds a widget to show recent git workflow runs to the github actions plugin. The default setting is the last 5 runs across all branches but both branch and the number of runs are configurable.
diff --git a/.changeset/2565.md b/.changeset/2565.md
new file mode 100644
index 0000000000..92253101ee
--- /dev/null
+++ b/.changeset/2565.md
@@ -0,0 +1,59 @@
+---
+'@backstage/core-api': patch
+---
+
+Add initial RouteRefRegistry
+
+Starting out some work to bring routing back and working as part of the work towards finalizing #1536
+
+This is some of the groundwork of an experiment we're working on to enable routing via RouteRefs, while letting the app itself look something like this:
+
+```jsx
+const App = () => (
+
+
+
+ {' '}
+ // catalogRouteRef
+
+
+
+
+
+
+ // statusRouteRef
+
+
+
+
+
+
+
+
+
+ // sentryRouteRef
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+```
+
+As part of inverting the composition of the app, route refs and routing in general was somewhat broken, intentionally. Right now it's not really possible to easily route to different parts of the app from a plugin, or even different parts of the plugin that are not within the same router.
+
+The core part of the experiment is to construct a map of ApiRef[] -> path overrides. Each key in the map is the list of route refs to traversed to reach a leaf in the routing tree, and the value is the path override at that point. For example, the above tree would add entries like [techDocsRouteRef] -> '/docs', and [entityRouteRef, apiDocsRouteRef] -> '/api'. By mapping out the entire app in this structure, the idea is that we can navigate to any point in the app using RouteRefs.
+
+The RouteRefRegistry is an implementation of such a map, and the idea is to add it in master to make it a bit easier to experiment and iterate. This is not an exposed API at this point.
+
+We've explored a couple of alternatives for how to enable routing, but it's boiled down to either a solution centred around the route map mentioned above, or treating all routes as static and globally unique, with no room for flexibility, customization or conflicts between different plugins. We're starting out pursuing this options đ. We also expect that a the app-wide routing table will make things like dynamic loading a lot cleaner, as there would be a much more clear handoff between the main chunk and dynamic chunks.
diff --git a/.changeset/2575.md b/.changeset/2575.md
new file mode 100644
index 0000000000..b08f50ed13
--- /dev/null
+++ b/.changeset/2575.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core': minor
+---
+
+Fix dense in Structured Metadata Table
diff --git a/.changeset/2586.md b/.changeset/2586.md
new file mode 100644
index 0000000000..568adb8a3e
--- /dev/null
+++ b/.changeset/2586.md
@@ -0,0 +1,6 @@
+---
+'@backstage/catalog-model': minor
+'@backstage/plugin-catalog-backend': minor
+---
+
+Entirely case insensitive read path of entities
diff --git a/.changeset/2587.md b/.changeset/2587.md
new file mode 100644
index 0000000000..910de1ca04
--- /dev/null
+++ b/.changeset/2587.md
@@ -0,0 +1,9 @@
+---
+'@backstage/catalog-model': minor
+---
+
+Add the User & Group entities
+
+A user describes a person, such as an employee, a contractor, or similar. Users belong to Group entities in the catalog.
+
+A group describes an organizational entity, such as for example a team, a business unit, or a loose collection of people in an interest group. Members of these groups are modeled in the catalog as kind User.
diff --git a/.changeset/2597.md b/.changeset/2597.md
new file mode 100644
index 0000000000..9db25e8d0e
--- /dev/null
+++ b/.changeset/2597.md
@@ -0,0 +1,6 @@
+---
+'@backstage/catalog-model': minor
+'@backstage/plugin-catalog-backend': minor
+---
+
+Add ApiDefinitionAtLocationProcessor that allows to load a API definition from another location
diff --git a/.changeset/2598.md b/.changeset/2598.md
new file mode 100644
index 0000000000..03e10e7db8
--- /dev/null
+++ b/.changeset/2598.md
@@ -0,0 +1,11 @@
+---
+'@backstage/plugin-techdocs': minor
+---
+
+Add a message if techdocs takes long time to load
+
+Fixes #2416.
+
+The UI after the change should look like this:
+
+
diff --git a/.changeset/2600.md b/.changeset/2600.md
new file mode 100644
index 0000000000..6fc9775fa1
--- /dev/null
+++ b/.changeset/2600.md
@@ -0,0 +1,19 @@
+---
+'@backstage/plugin-techdocs-backend': minor
+'@backstage/plugin-proxy-backend': minor
+'@backstage/plugin-auth-backend': minor
+'@backstage/create-app': minor
+'@backstage/backend-common': minor
+---
+
+Add service discovery interface and implement for single host deployments
+
+Fixes #1847, #2596
+
+Went with an interface similar to the frontend DiscoveryApi, since it's dead simple but still provides a lot of flexibility in the implementation.
+
+Also ended up with two different methods, one for internal endpoint discovery and one for external. The two use-cases are explained a bit more in the docs, but basically it's service-to-service vs callback URLs.
+
+This did get me thinking about uniqueness and that we're heading towards a global namespace for backend plugin IDs. That's probably fine, but if we're happy with that we should leverage it a bit more to simplify the backend setup. For example we'd have each plugin provide its own ID and not manually mount on paths in the backend.
+
+Draft until we're happy with the implementation, then I can add more docs and changelog entry. Also didn't go on a thorough hunt for places where discovery can be used, but I don't think there are many since it's been pretty awkward to do service-to-service communication.
diff --git a/.changeset/2603.md b/.changeset/2603.md
new file mode 100644
index 0000000000..c24d2ea033
--- /dev/null
+++ b/.changeset/2603.md
@@ -0,0 +1,8 @@
+---
+'@backstage/backend-common': minor
+'@backstage/create-app': minor
+---
+
+Make CSP configurable to fix app-backend served app not being able to fetch
+
+See discussion [here on discord](https://discordapp.com/channels/687207715902193673/687235481154617364/758721460163575850)
diff --git a/.changeset/2606.md b/.changeset/2606.md
new file mode 100644
index 0000000000..f6059e7705
--- /dev/null
+++ b/.changeset/2606.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Move auth provider router creation to router
diff --git a/.changeset/2609.md b/.changeset/2609.md
new file mode 100644
index 0000000000..6bb8ab7a40
--- /dev/null
+++ b/.changeset/2609.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Sync scaffolded backend with example
diff --git a/.changeset/2610.md b/.changeset/2610.md
new file mode 100644
index 0000000000..92ec8dcc0c
--- /dev/null
+++ b/.changeset/2610.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-circleci': minor
+---
+
+Refactor to use DiscoveryApi
diff --git a/.changeset/2611.md b/.changeset/2611.md
new file mode 100644
index 0000000000..cbf3129038
--- /dev/null
+++ b/.changeset/2611.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Remove discovery api override
diff --git a/.changeset/2612.md b/.changeset/2612.md
new file mode 100644
index 0000000000..bf093d8f77
--- /dev/null
+++ b/.changeset/2612.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-jenkins': patch
+---
+
+Refactor to use DiscoveryApi
diff --git a/.changeset/2613.md b/.changeset/2613.md
new file mode 100644
index 0000000000..cf8c1a155a
--- /dev/null
+++ b/.changeset/2613.md
@@ -0,0 +1,12 @@
+---
+'@backstage/plugin-auth-backend': minor
+---
+
+Initial implementation of catalog user lookup
+
+This adds a basic catalog client + method for the Google provider to look up users in the catalog. It expects to find a single user entity in the catalog with a google.com/email annotation that matches the email of the Google profile.
+
+Right now it falls back to the old behavior of splitting the email, since I don't wanna break the sign-in flow for existing apps, not yet anyway x).
+
+- Added "@backstage/catalog-model@^0.1.1-alpha.23" as a dependency
+- Added "node-fetch@^2.6.1" as a dependency
diff --git a/.changeset/2614.md b/.changeset/2614.md
new file mode 100644
index 0000000000..7e2660bc80
--- /dev/null
+++ b/.changeset/2614.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': minor
+---
+
+Default to using internal scope for new plugins
diff --git a/.changeset/2615.md b/.changeset/2615.md
new file mode 100644
index 0000000000..412b8127c4
--- /dev/null
+++ b/.changeset/2615.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': minor
+---
+
+Use localhost to fall back to IPv4 if IPv6 isn't available
diff --git a/.changeset/2616.md b/.changeset/2616.md
new file mode 100644
index 0000000000..9a70c0e79f
--- /dev/null
+++ b/.changeset/2616.md
@@ -0,0 +1,7 @@
+---
+'@backstage/create-app': minor
+---
+
+Remove identity-backend
+
+Not used, and we're heading down the route of identities in the catalog
diff --git a/.changeset/2623.md b/.changeset/2623.md
new file mode 100644
index 0000000000..abd5ce7a4c
--- /dev/null
+++ b/.changeset/2623.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-catalog': minor
+---
+
+Created EntityNotFound component for catalog which displays the 404 page when entity is not found.
+
+Fixes #2266
diff --git a/.changeset/2624.md b/.changeset/2624.md
new file mode 100644
index 0000000000..dcfc800713
--- /dev/null
+++ b/.changeset/2624.md
@@ -0,0 +1,17 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Make title meaningful after component creation
+
+Fixes #2458.
+
+After the change, the UX should look like this:
+
+### If the component creation was successful:
+
+
+
+### If the component creation failed:
+
+
diff --git a/.changeset/2625-catalog-backend.md b/.changeset/2625-catalog-backend.md
new file mode 100644
index 0000000000..bcd49dddb2
--- /dev/null
+++ b/.changeset/2625-catalog-backend.md
@@ -0,0 +1,9 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Add codeowners processor
+
+- Add `codeowners-utils@^1.0.2` as a dependency
+- Add `core-js@^3.6.5` as a dependency
+- Added new CodeOwnersProcessor
diff --git a/.changeset/2625-cli.md b/.changeset/2625-cli.md
new file mode 100644
index 0000000000..c5a5437b69
--- /dev/null
+++ b/.changeset/2625-cli.md
@@ -0,0 +1,7 @@
+---
+'@backstage/cli': patch
+---
+
+Add codeowners processor
+
+- Include ESNext.Promise in TypeScript compilation
diff --git a/.changeset/2628.md b/.changeset/2628.md
new file mode 100644
index 0000000000..0ac36d456a
--- /dev/null
+++ b/.changeset/2628.md
@@ -0,0 +1,22 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+This feature works the same as \$secret does in config - it allows programmatic substitution of values into a document.
+
+This is particularly useful e.g. for API type entities where you do not want to repeat your entire API spec document inside the catalog-info.yaml file. For those cases, you can instead do something like
+
+```
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: my-federated-service
+spec:
+ type: graphql
+ definition:
+ $text: ./schema.graphql
+```
+
+The textual content of that file will be injected as the value of definition, during each refresh loop. Both relative and absolute paths are supported, as well as any HTTP/HTTPS URL pointing to a service that returns the relevant data.
+
+The initial version supports injection of text file data, and structured data from JSON and YAML files. You can add any handler of your own in addition to these.
diff --git a/.changeset/2630.md b/.changeset/2630.md
new file mode 100644
index 0000000000..933204e292
--- /dev/null
+++ b/.changeset/2630.md
@@ -0,0 +1,9 @@
+---
+'@backstage/create-app': minor
+'@backstage/plugin-catalog-backend': minor
+---
+
+Allow node v14 and add to master build matrix
+
+- Upgrade sqlite3@^5.0.0 in @backstage/plugin-catalog-backend
+- Add Node 14 to engines in @backstage/create-app
diff --git a/.changeset/2637.md b/.changeset/2637.md
new file mode 100644
index 0000000000..9d368634b6
--- /dev/null
+++ b/.changeset/2637.md
@@ -0,0 +1,21 @@
+---
+'@backstage/plugin-cost-insights': minor
+'@backstage/plugin-explore': minor
+---
+
+This PR adds Spotify's Cost Insights Tool. Cost Insights explains costs from cloud services in an understandable way, using software terms familiar to your engineers. This tool helps you and your team make trade-offs between cost optimization efforts and your other priorities.
+
+Cost Insights features:
+
+Daily cost graph by team or billing account
+Cost comparison against configurable business metrics
+Insights panels for configurable cloud products your company uses
+Cost alerts and recommendations
+Selectable time periods for month over month, or quarter over quarter cost comparison
+Conversion of cost growth into average engineer cost (configurable) to help optimization trade-off decisions
+
+
+
+This PR adds the Cost Insights frontend React plugin with a defined CostInsightsApi. We include an example client with static data in the expected format. This API should talk with a cloud billing backend that aggregates billing data from your cloud provider.
+
+Fixes #688 đĩ
diff --git a/.changeset/2639.md b/.changeset/2639.md
new file mode 100644
index 0000000000..e6a623088e
--- /dev/null
+++ b/.changeset/2639.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': minor
+---
+
+Upgrade dependency `esbuild@0.7.7`
diff --git a/.changeset/2641.md b/.changeset/2641.md
new file mode 100644
index 0000000000..3b06358e81
--- /dev/null
+++ b/.changeset/2641.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+Simplify the read function in processors
diff --git a/.changeset/2656.md b/.changeset/2656.md
new file mode 100644
index 0000000000..e253b6b1f6
--- /dev/null
+++ b/.changeset/2656.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': minor
+---
+
+Lookup user in Google Auth Provider
diff --git a/.changeset/2657.md b/.changeset/2657.md
new file mode 100644
index 0000000000..9aa645d65f
--- /dev/null
+++ b/.changeset/2657.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core': minor
+---
+
+Added EmptyState component
diff --git a/.changeset/2660.md b/.changeset/2660.md
new file mode 100644
index 0000000000..758d523f07
--- /dev/null
+++ b/.changeset/2660.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-api-docs': patch
+---
+
+Resolve some dark mode styling issues in asyncAPI specs
diff --git a/.changeset/2661.md b/.changeset/2661.md
new file mode 100644
index 0000000000..e73b0abf26
--- /dev/null
+++ b/.changeset/2661.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core': patch
+---
+
+Fixed banner component position in DismissableBanner component
diff --git a/.changeset/2669-catalog-backend.md b/.changeset/2669-catalog-backend.md
new file mode 100644
index 0000000000..32ee5c0f4d
--- /dev/null
+++ b/.changeset/2669-catalog-backend.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+Add the ability to import users from GitHub Organization into the catalog.
+
+The token needs to have the scopes `user:email`, `read:user`, and `read:org`.
diff --git a/.changeset/2669-catalog-model.md b/.changeset/2669-catalog-model.md
new file mode 100644
index 0000000000..b9a2841a1b
--- /dev/null
+++ b/.changeset/2669-catalog-model.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-model': minor
+---
+
+Add the ability to import users from GitHub Organization into the catalog.
diff --git a/.changeset/2669-create-app.md b/.changeset/2669-create-app.md
new file mode 100644
index 0000000000..e7075ffeb8
--- /dev/null
+++ b/.changeset/2669-create-app.md
@@ -0,0 +1,7 @@
+---
+'@backstage/create-app': minor
+---
+
+Add the ability to import users from GitHub Organization into the catalog.
+
+The token needs to have the scopes `user:email`, `read:user`, and `read:org`.
diff --git a/.changeset/2674.md b/.changeset/2674.md
new file mode 100644
index 0000000000..15a7a0e849
--- /dev/null
+++ b/.changeset/2674.md
@@ -0,0 +1,12 @@
+---
+'@backstage/backend-common': minor
+'@backstage/create-app': minor
+---
+
+Auto-create plugin databases
+
+Relates to #1598.
+
+This creates databases for plugins before handing off control to plugins.
+
+The list of plugins currently need to be hard-coded depending on the installed plugins. A later PR will properly refactor the code to provide a factory pattern where plugins specify what they need, and Knex instances will be provided based on the input.
diff --git a/.changeset/2686.md b/.changeset/2686.md
new file mode 100644
index 0000000000..8831c1309b
--- /dev/null
+++ b/.changeset/2686.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Update SSR template to pass CI
diff --git a/.changeset/2689.md b/.changeset/2689.md
new file mode 100644
index 0000000000..be75dd261b
--- /dev/null
+++ b/.changeset/2689.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Upgrade dependency rollup-plugin-typescript2 to ^0.27.3
diff --git a/.changeset/2722.md b/.changeset/2722.md
new file mode 100644
index 0000000000..69642b5797
--- /dev/null
+++ b/.changeset/2722.md
@@ -0,0 +1,11 @@
+---
+'@backstage/plugin-api-docs': minor
+---
+
+There were some missing features and markdown was not rendered properly, but this is fixed now.
+
+Details:
+
+- [`asyncapi/asyncapi-react#149`](https://github.com/asyncapi/asyncapi-react/pull/149) - fix: improve markdown rendering of nested fields
+- [`asyncapi/asyncapi-react#150`](https://github.com/asyncapi/asyncapi-react/pull/150) - feat: display the description of channels and operations
+- [`asyncapi/asyncapi-react#153`](https://github.com/asyncapi/asyncapi-react/pull/153) - fix: let the list of `enums` break into multiple lines
diff --git a/.changeset/README.md b/.changeset/README.md
new file mode 100644
index 0000000000..4f3b76b096
--- /dev/null
+++ b/.changeset/README.md
@@ -0,0 +1,8 @@
+# Changesets
+
+Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
+with multi-package repos, or single-package repos to help you version and publish your code. You can
+find the full documentation for it [in our repository](https://github.com/changesets/changesets)
+
+We have a quick list of common questions to get you started engaging with this project in
+[our documentation](https://github.com/changesets/changesets/blob/master/docs/common-questions.md)
diff --git a/.changeset/config.json b/.changeset/config.json
new file mode 100644
index 0000000000..c7c4f11e57
--- /dev/null
+++ b/.changeset/config.json
@@ -0,0 +1,58 @@
+{
+ "$schema": "https://unpkg.com/@changesets/config@1.3.0/schema.json",
+ "changelog": "@changesets/cli/changelog",
+ "commit": false,
+ "linked": [
+ [
+ "example-app",
+ "@backstage/backend-common",
+ "example-backend",
+ "@backstage/catalog-model",
+ "@backstage/cli-common",
+ "@backstage/cli",
+ "@backstage/config-loader",
+ "@backstage/config",
+ "@backstage/core-api",
+ "@backstage/core",
+ "@backstage/create-app",
+ "@backstage/dev-utils",
+ "docgen",
+ "e2e-test",
+ "storybook",
+ "@techdocs/cli",
+ "@backstage/test-utils-core",
+ "@backstage/test-utils",
+ "@backstage/theme",
+ "@backstage/plugin-api-docs",
+ "@backstage/plugin-app-backend",
+ "@backstage/plugin-auth-backend",
+ "@backstage/plugin-catalog-backend",
+ "@backstage/plugin-catalog",
+ "@backstage/plugin-circleci",
+ "@backstage/plugin-gcp-projects",
+ "@backstage/plugin-github-actions",
+ "@backstage/plugin-gitops-profiles",
+ "@backstage/plugin-graphiql",
+ "@backstage/plugin-graphql-backend",
+ "@backstage/plugin-jenkins",
+ "@backstage/plugin-lighthouse",
+ "@backstage/plugin-newrelic",
+ "@backstage/plugin-proxy-backend",
+ "@backstage/plugin-register-component",
+ "@backstage/plugin-rollbar-backend",
+ "@backstage/plugin-rollbar",
+ "@backstage/plugin-scaffolder-backend",
+ "@backstage/plugin-scaffolder",
+ "@backstage/plugin-sentry-backend",
+ "@backstage/plugin-sentry",
+ "@backstage/plugin-tech-radar",
+ "@backstage/plugin-techdocs-backend",
+ "@backstage/plugin-techdocs",
+ "@backstage/plugin-welcome"
+ ]
+ ],
+ "access": "public",
+ "baseBranch": "master",
+ "updateInternalDependencies": "patch",
+ "ignore": []
+}
diff --git a/.changeset/create-app-url-reader-update.md b/.changeset/create-app-url-reader-update.md
new file mode 100644
index 0000000000..eb2e538b77
--- /dev/null
+++ b/.changeset/create-app-url-reader-update.md
@@ -0,0 +1,6 @@
+---
+'example-backend': patch
+'@backstage/create-app': patch
+---
+
+Bump @backstage/catalog-backend and pass the now required UrlReader interface to the plugin
diff --git a/.changeset/metal-fishes-learn.md b/.changeset/metal-fishes-learn.md
new file mode 100644
index 0000000000..d22af83ca0
--- /dev/null
+++ b/.changeset/metal-fishes-learn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': minor
+---
+
+The default mount point for backend plugins have been changed to /api. These changes are done in the backend package itself, so it is recommended that you sync up existing backend packages with this new pattern.
diff --git a/.changeset/new-url-reader.md b/.changeset/new-url-reader.md
new file mode 100644
index 0000000000..94758c5bc1
--- /dev/null
+++ b/.changeset/new-url-reader.md
@@ -0,0 +1,12 @@
+---
+'@backstage/backend-common': patch
+---
+
+Added new UrlReader interface for reading opaque data from URLs with different providers.
+
+This new URL reading system is intended as a replacement for the various integrations towards
+external systems in the catalog, scaffolder, and techdocs. It is configured via a new top-level
+config section called 'integrations'.
+
+Along with the UrlReader interface is a new UrlReaders class, which exposes static factory
+methods for instantiating readers that can read from many different integrations simultaneously.
diff --git a/.changeset/short-secrets.md b/.changeset/short-secrets.md
new file mode 100644
index 0000000000..72cb059979
--- /dev/null
+++ b/.changeset/short-secrets.md
@@ -0,0 +1,5 @@
+---
+'@backstage/config-loader': minor
+---
+
+Added support for new shorthand when defining secrets, where `$env: ENV` can be used instead of `$secret: { env: ENV }` etc.
diff --git a/.changeset/url-reader-processor.md b/.changeset/url-reader-processor.md
new file mode 100644
index 0000000000..40fef3c106
--- /dev/null
+++ b/.changeset/url-reader-processor.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+The catalog backend UrlReaderProcessor now uses a UrlReader from @backstage/backend-common, which must now be supplied to the constructor.
diff --git a/.codecov.yml b/.codecov.yml
index bbe2ee8e93..1b8e770b59 100644
--- a/.codecov.yml
+++ b/.codecov.yml
@@ -6,3 +6,15 @@ coverage:
default:
threshold: 0% # Ref: https://docs.codecov.io/docs/codecovyml-reference#coveragestatus
target: auto
+
+# Since Backstage is a mono repo, flags here help in getting the code coverage of individual packages.
+# Documentation: https://docs.codecov.io/docs/flags
+flags:
+ core:
+ paths:
+ - packages/core/
+ carryforward: true
+ core-api:
+ paths:
+ - packages/core-api/
+ carryforward: true
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index de0655cdbc..3df1031034 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -6,6 +6,8 @@
* @spotify/backstage-core
/docs/features/techdocs @spotify/techdocs-core
+/plugins/cost-insights @spotify/silver-lining
+/plugins/cloudbuild @trivago/ebarrios
/plugins/techdocs @spotify/techdocs-core
/plugins/techdocs-backend @spotify/techdocs-core
/packages/techdocs-cli @spotify/techdocs-core
diff --git a/.github/styles/vocab.txt b/.github/styles/vocab.txt
new file mode 100644
index 0000000000..21045f04dd
--- /dev/null
+++ b/.github/styles/vocab.txt
@@ -0,0 +1,203 @@
+abc
+Apdex
+api
+Api
+apis
+args
+asciidoc
+async
+Avro
+backrub
+Balachandran
+Bigtable
+Blackbox
+bool
+boolean
+Chai
+changeset
+changesets
+Changesets
+changset
+chanwit
+Chanwit
+cisphobia
+cissexist
+classname
+cli
+cncf
+codeblocks
+Codecov
+codehilite
+Codehilite
+codeowners
+config
+Config
+configs
+const
+cookiecutter
+css
+dariddler
+deadnaming
+destructured
+dev
+devs
+discoverability
+Discoverability
+dls
+docgen
+Dockerfile
+Dockerize
+dockerode
+Docusaurus
+eg
+Ek
+env
+Env
+eslint
+facto
+failover
+Figma
+Firekube
+Fredrik
+github
+Github
+Gitlab
+graphql
+graphviz
+Hackathons
+haproxy
+heroku
+Hostname
+http
+https
+img
+incentivised
+inlinehilite
+interop
+javascript
+Javascript
+jq
+js
+json
+jsx
+Kaewkasi
+Knex
+kubectl
+kubernetes
+learnings
+lerna
+Lerna
+magiclink
+mailto
+Malus
+md
+microsite
+middleware
+minikube
+Minikube
+misgendering
+mkdocs
+Mkdocs
+monorepo
+Monorepo
+monorepos
+msw
+namespace
+Namespaces
+neuro
+newrelic
+nginx
+Niklas
+nohoist
+nonces
+npm
+nvm
+oauth
+Oauth
+Okta
+Oldsberg
+onboarding
+Onboarding
+pagerduty
+Patrik
+Phoen
+plantuml
+Pomaceous
+postgres
+pre
+prebaked
+preconfigured
+Preprarer
+Prerequisities
+productional
+Protobuf
+proxying
+Proxying
+pygments
+pymdownx
+Raghunandan
+rankdir
+readme
+Readme
+Redash
+repo
+Repo
+repos
+rerender
+rollbar
+Rollbar
+Rollup
+Rosaceae
+rst
+rsync
+ruleset
+sam
+scaffolded
+scaffolder
+Scaffolder
+semlas
+Serverless
+Sinon
+smartsymobls
+sparklines
+Spotifiers
+spotify
+Spotify
+squidfunk
+src
+subkey
+superfences
+Superfences
+talkdesk
+Talkdesk
+tasklist
+techdocs
+templated
+templater
+Templater
+templaters
+Templaters
+Thauer
+theres
+toc
+tolerations
+Tolerations
+toolsets
+touchpoints
+ui
+upvote
+url
+utils
+validators
+Voi
+Wealthsimple
+Weaveworks
+xyz
+yaml
+Zalando
+Zhou
+Billett
+cloudbuild
+Grafana
+Iain
+Snyk
diff --git a/.github/workflows/changeset.yml b/.github/workflows/changeset.yml
new file mode 100644
index 0000000000..ac7872ea93
--- /dev/null
+++ b/.github/workflows/changeset.yml
@@ -0,0 +1,19 @@
+name: Changeset
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ create-release-pr:
+ name: Create Changeset PR
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - name: Install Dependencies
+ run: yarn --frozen-lockfile
+ - name: Create Release Pull Request
+ uses: changesets/action@master
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/chromatic-storybook-test.yml b/.github/workflows/chromatic-storybook-test.yml
index 0bcaf400d0..bb14e1c38b 100644
--- a/.github/workflows/chromatic-storybook-test.yml
+++ b/.github/workflows/chromatic-storybook-test.yml
@@ -26,7 +26,7 @@ jobs:
uses: actions/cache@v2
with:
path: '**/node_modules'
- key: ${{ runner.os }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
+ key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
- name: find location of global yarn cache
id: yarn-cache
if: steps.cache-modules.outputs.cache-hit != 'true'
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c8c92c57ff..65e092676d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -10,7 +10,7 @@ jobs:
strategy:
matrix:
- node-version: [12.x]
+ node-version: [12.x, 14.x]
env:
CI: true
@@ -37,7 +37,7 @@ jobs:
path: '**/node_modules'
# We use both yarn.lock and package.json as cache keys to ensure that
# changes to local monorepo packages bust the cache.
- key: ${{ runner.os }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
+ key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
# If we get a cache hit for node_modules, there's no need to bring in the global
# yarn cache or run yarn install, as all dependencies will be installed already.
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
new file mode 100644
index 0000000000..2fafd3756d
--- /dev/null
+++ b/.github/workflows/codeql-analysis.yml
@@ -0,0 +1,71 @@
+# For most projects, this workflow file will not need changing; you simply need
+# to commit it to your repository.
+#
+# You may wish to alter this file to override the set of languages analyzed,
+# or to provide custom queries or build logic.
+name: 'CodeQL'
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [master]
+ schedule:
+ - cron: '0 8 * * 6'
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ # Override automatic language detection by changing the below list
+ # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
+ language: ['javascript']
+ # Learn more...
+ # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ with:
+ # We must fetch at least the immediate parents so that if this is
+ # a pull request then we can checkout the head.
+ fetch-depth: 2
+
+ # If this run was triggered by a pull request event, then checkout
+ # the head of the pull request instead of the merge commit.
+ - run: git checkout HEAD^2
+ if: ${{ github.event_name == 'pull_request' }}
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v1
+ with:
+ languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+ # queries: ./path/to/local/query, your-org/your-repo/queries@main
+
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
+ # If this step fails, then you should remove it and run the build manually (see below)
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v1
+
+ # âšī¸ Command-line programs to run using the OS shell.
+ # đ https://git.io/JvXDl
+
+ # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines
+ # and modify them (or add more) to build your code if your project
+ # uses a compiled language
+
+ #- run: |
+ # make bootstrap
+ # make release
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v1
diff --git a/.github/workflows/docs-quality-checker.yml b/.github/workflows/docs-quality-checker.yml
new file mode 100644
index 0000000000..45cf1dafe3
--- /dev/null
+++ b/.github/workflows/docs-quality-checker.yml
@@ -0,0 +1,18 @@
+name: Check Markdown files quality
+
+on:
+ pull_request:
+ branches: [master]
+ paths:
+ - '**.md'
+
+jobs:
+ check-all-files:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: documentation quality check
+ uses: errata-ai/vale-action@v1.3.0
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/e2e-win.yml b/.github/workflows/e2e-win.yml
index 5bab1b1299..c48d779962 100644
--- a/.github/workflows/e2e-win.yml
+++ b/.github/workflows/e2e-win.yml
@@ -17,7 +17,7 @@ jobs:
strategy:
matrix:
os: [windows-latest]
- node-version: [12.x]
+ node-version: [12.x, 14.x]
env:
CI: true
@@ -31,6 +31,8 @@ jobs:
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
+ - name: Add msbuild to PATH
+ uses: microsoft/setup-msbuild@v1.0.1
- name: yarn install
run: yarn install --frozen-lockfile
diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index 69bd8393c8..e280bf59a3 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -26,7 +26,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
- node-version: [12.x]
+ node-version: [12.x, 14.x]
env:
CI: true
@@ -47,7 +47,7 @@ jobs:
uses: actions/cache@v2
with:
path: '**/node_modules'
- key: ${{ runner.os }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
+ key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
- name: find location of global yarn cache
id: yarn-cache
if: steps.cache-modules.outputs.cache-hit != 'true'
diff --git a/.github/workflows/master-win.yml b/.github/workflows/master-win.yml
index 3f65cf9aec..c103583052 100644
--- a/.github/workflows/master-win.yml
+++ b/.github/workflows/master-win.yml
@@ -10,7 +10,7 @@ jobs:
strategy:
matrix:
- node-version: [12.x]
+ node-version: [12.x, 14.x]
env:
CI: true
diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml
index f99c266241..f5029bf836 100644
--- a/.github/workflows/master.yml
+++ b/.github/workflows/master.yml
@@ -10,7 +10,7 @@ jobs:
strategy:
matrix:
- node-version: [12.x]
+ node-version: [12.x, 14.x]
env:
CI: true
@@ -30,7 +30,7 @@ jobs:
uses: actions/cache@v2
with:
path: '**/node_modules'
- key: ${{ runner.os }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
+ key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
- name: find location of global yarn cache
id: yarn-cache
if: steps.cache-modules.outputs.cache-hit != 'true'
@@ -63,15 +63,20 @@ jobs:
run: |
yarn lerna -- run test -- --coverage
bash <(curl -s https://codecov.io/bash)
+ # Upload code coverage for some specific flags. Also see .codecov.yml
+ bash <(curl -s https://codecov.io/bash) -f packages/core/coverage/* -F core
+ bash <(curl -s https://codecov.io/bash) -f packages/core-api/coverage/* -F core-api
# Publishes current version of packages that are not already present in the registry
- name: publish
+ if: matrix.node-version == '12.x'
run: yarn lerna -- publish from-package --yes
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
# Tags the commit with the version in the core package if the tag doesn't exist
- uses: Klemensas/action-autotag@1.2.3
+ if: matrix.node-version == '12.x'
with:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
package_root: 'packages/core'
diff --git a/.github/workflows/microsite-build-check.yml b/.github/workflows/microsite-build-check.yml
index ff290b71e4..8a2fa99ed2 100644
--- a/.github/workflows/microsite-build-check.yml
+++ b/.github/workflows/microsite-build-check.yml
@@ -13,7 +13,7 @@ jobs:
strategy:
matrix:
- node-version: [12.x]
+ node-version: [12.x, 14.x]
env:
CI: true
@@ -33,6 +33,10 @@ jobs:
run: yarn install --frozen-lockfile
working-directory: microsite
+ - name: prettier
+ run: yarn prettier:check
+ working-directory: microsite
+
- name: build microsite
run: yarn build
working-directory: microsite
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
new file mode 100644
index 0000000000..335bd80109
--- /dev/null
+++ b/.github/workflows/nightly.yml
@@ -0,0 +1,77 @@
+name: Nightly Snapshot Release
+
+on:
+ schedule:
+ - cron: '0 2 * * *' # run at 2 AM UTC
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [14.x]
+
+ env:
+ CI: true
+ NODE_OPTIONS: --max-old-space-size=4096
+
+ steps:
+ - uses: actions/checkout@v2
+
+ # Beginning of yarn setup, keep in sync between all workflows, see ci.yml
+ - name: use node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ registry-url: https://registry.npmjs.org/ # Needed for auth
+ - name: cache all node_modules
+ id: cache-modules
+ uses: actions/cache@v2
+ with:
+ path: '**/node_modules'
+ key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
+ - name: find location of global yarn cache
+ id: yarn-cache
+ if: steps.cache-modules.outputs.cache-hit != 'true'
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+ - name: cache global yarn cache
+ uses: actions/cache@v2
+ if: steps.cache-modules.outputs.cache-hit != 'true'
+ with:
+ path: ${{ steps.yarn-cache.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+ - name: yarn install
+ run: yarn install --frozen-lockfile
+ # End of yarn setup
+
+ # No verification done here, only build & publish. If the master branch
+ # is broken we will see that from those builds, but we still want to push nightly
+ # builds since upgrading to them is a manual process anyway.
+
+ - name: tsc
+ run: yarn tsc
+ - name: build
+ run: yarn build
+
+ # Prepares a nightly release version of any package with pending changesets
+ - name: prepare nightly release
+ run: yarn changeset version --snapshot nightly
+
+ # Publishes the nightly release to NPM, by using tag we make sure the release is
+ # not flagged as the latest release, which means that people will not get this
+ # version of the package unless requested explicitly
+ - name: publish nightly release
+ run: yarn changeset publish --tag nightly
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: Discord notification
+ if: ${{ failure() }}
+ uses: Ilshidur/action-discord@0.2.0
+ env:
+ DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
+ with:
+ args: 'Nightly build failed https://github.com/{{GITHUB_REPOSITORY}}/actions/runs/{{GITHUB_RUN_ID}}'
diff --git a/.github/workflows/scaffolder.yml b/.github/workflows/scaffolder.yml
deleted file mode 100644
index bbfd52009d..0000000000
--- a/.github/workflows/scaffolder.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-name: Scaffolder
-
-on:
- pull_request:
- paths:
- - '.github/workflows/scaffolder.yml'
- - './plugins/scaffolder-backend/scripts'
- push:
- branches: [master]
-jobs:
- build:
- runs-on: ${{ matrix.os }}
-
- strategy:
- matrix:
- os: [ubuntu-latest]
- python-version: [3.7]
-
- name: Build Container
- steps:
- - uses: actions/checkout@v2
- # Build Docker Image
- - name: Build and push Docker images
- uses: docker/build-push-action@v1.1.0
- with:
- path: plugins/scaffolder-backend/scripts
- dockerfile: plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile
- registry: docker.pkg.github.com
- repository: ${{ github.repository }}/cookiecutter
- username: ${{ github.actor }}
- password: ${{ github.token }}
- tag_with_ref: true
- push: true
diff --git a/.imgbotconfig b/.imgbotconfig
new file mode 100644
index 0000000000..f337e087dc
--- /dev/null
+++ b/.imgbotconfig
@@ -0,0 +1,5 @@
+{
+ "ignoredFiles": [
+ "docs/assets/**/*.svg"
+ ]
+}
diff --git a/.prettierignore b/.prettierignore
index 9e75b74eee..4b1acbb594 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,6 +1,6 @@
.yarn
dist
-microsite/build
+microsite
coverage
*.hbs
templates
diff --git a/.vale.ini b/.vale.ini
new file mode 100644
index 0000000000..fd1ea53b0d
--- /dev/null
+++ b/.vale.ini
@@ -0,0 +1,4 @@
+StylesPath = .github/styles
+
+[*.md]
+BasedOnStyles = Vale
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cf68fad6bd..1860a4de6f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,36 @@ If you encounter issues while upgrading to a newer version, don't hesitate to re
> Collect changes for the next release below
+## v0.1.1-alpha.24
+
+### Backend (example-backend, or backends created with @backstage/create-app)
+
+- The default mount point for backend plugins have been changed to `/api`. These changes are done in the backend package itself, so it is recommended that you sync up existing backend packages with this new pattern. [#2562](https://github.com/spotify/backstage/pull/2562)
+- A service discovery mechanism for backend plugins has been added, and is now a requirement for several backend plugins. See [packages/backend/src/index.ts](./packages/backend/src/index.ts) for how to set it up using `SingleHostDiscovery` from `@backstage/backend-common`. Note that the default base path for plugins is set to `/api` to that change, but it can be set to use the old behavior via the `basePath` option. [#2600](https://github.com/spotify/backstage/pull/2600)
+
+### @backstage/auth-backend
+
+- The default mount path of backend plugins was changed to `/api/:pluginId`, and as part of that it was needed to enable configuration of the base path of the auth backend, so that it can construct redirect URLs correctly. Note that you will also need to reconfigure any allowed redirect URLs to include `/api` if you switch to the new recommended pattern. [#2562](https://github.com/spotify/backstage/pull/2562)
+- The auth backend now requires an implementation of `PluginEndpointDiscovery` from `@backstage/backend-common` to be passed in as `discovery`. See the changes to `@backstage/backend`.
+
+### @backstage/proxy-backend
+
+- The proxy backend now requires an implementation of `PluginEndpointDiscovery` from `@backstage/backend-common` to be passed in as `discovery`. See the changes to `@backstage/backend`.
+
+### @backstage/techdocs-backend
+
+- The TechDocs backend now requires an implementation of `PluginEndpointDiscovery` from `@backstage/backend-common` to be passed in as `discovery`. See the changes to `@backstage/backend`.
+
+### @backstage/plugin-identity-backend
+
+- This plugin was removed, remove it from your backend if it's there. [#2616](https://github.com/spotify/backstage/pull/2616)
+
+## v0.1.1-alpha.23
+
+### @backstage/core
+
+- Renamed `SessionStateApi` to `SessionApi` and `logout` to `signOut`. Custom implementations of the `SingInPage` app-component will need to rename their `logout` function. The different auth provider items for the `UserSettingsMenu` have been consolidated into a single `ProviderSettingsItem`, meaning you need to replace existing usages of `OAuthProviderSettings` and `OIDCProviderSettings`. [#2555](https://github.com/spotify/backstage/pull/2555).
+
## v0.1.1-alpha.22
### @backstage/core
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0d6a8db50c..85834076d4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -28,10 +28,14 @@ What kind of plugins should/could be created? Some inspiration from the 120+ plu
## Suggesting a plugin
-If you start developing a plugin that you aim to release as open source, we suggest that you create a new [new Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development.
+If you start developing a plugin that you aim to release as open source, we suggest that you create a [new Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development.
You can also use this process if you have an idea for a good plugin but you hope that someone else will pick up the work.
+## Adding Non-code Contributions
+
+Since there is such a large landscape of possible development, build, and deployment environments, we welcome community contributions in these areas in the [`/contrib`](https://github.com/spotify/backstage/tree/master/contrib) folder of the project. This is an excellent place to put things that help out the community at large, but which may not fit within the scope of the core product to support natively. Here, you will find Helm charts, alternative Docker images, and much more.
+
## Write Documentation
The current documentation is very limited. Help us make the `/docs` folder come alive.
@@ -72,6 +76,23 @@ If you're contributing to the backend or CLI tooling, be mindful of cross-platfo
Also be sure to skim through our [ADRs](https://github.com/spotify/backstage/tree/master/docs/architecture-decisions) to see if they cover what you're working on. In particular [ADR006: Avoid React.FC and React.SFC](https://github.com/spotify/backstage/blob/master/docs/architecture-decisions/adr006-avoid-react-fc.md) is one to look out for.
+If there are any updates in `markdown` file please make sure to run `yarn run lint:docs`. Though it is checked on `lint-staged`. It is required to install [vale](https://docs.errata.ai/vale/install) separately and make sure it is accessed by global command.
+
+# Creating Changesets
+
+We use [changesets](https://github.com/atlassian/changesets) to help us prepare releases. It helps us make sure that every package affected by a change gets a proper version number and an entry in its `CHANGELOG.md`. To make the process of generating releases easy. it helps when contributors include changesets with their pull requests.
+
+## To create a changeset
+
+1. Run `yarn changeset`
+2. Select which packages you want to include a changeset for
+3. Select impact of change that you're introducing (minor, major or patch)
+4. Add generated changset to Git
+5. Push the commit with your changeset to the branch associated with your PR
+6. Accept our gratitude for making the release process easier on the maintainer
+
+For more information, checkout [adding a changeset](https://github.com/atlassian/changesets/blob/master/docs/adding-a-changeset.md) documentation in changesets repository.
+
# Code of Conduct
This project adheres to the [Spotify FOSS Code of Conduct][code-of-conduct]. By participating, you are expected to honor this code.
diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md
index be77f0d4de..1aebbeb0eb 100644
--- a/DEPLOYMENT.md
+++ b/DEPLOYMENT.md
@@ -4,7 +4,7 @@
Deploying to heroku is relatively easy following these steps.
-First, make sure you have the [heroku CLI installed](https://devcenter.heroku.com/articles/heroku-cli) and log into it as well as loging into Heroku's [container registry](https://devcenter.heroku.com/articles/container-registry-and-runtime).
+First, make sure you have the [heroku CLI installed](https://devcenter.heroku.com/articles/heroku-cli) and log into it as well as login into Heroku's [container registry](https://devcenter.heroku.com/articles/container-registry-and-runtime).
```bash
$ heroku login
diff --git a/README.md b/README.md
index 9ef09aee06..e05c1eb16e 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,8 @@ Out of the box, Backstage includes:
For more information go to [backstage.io](https://backstage.io) or join our [Discord chatroom](https://discord.gg/EBHEGzX).
+đ Backstage is a CNCF Sandbox project. Read the announcement [here](https://backstage.io/blog/2020/09/23/backstage-cncf-sandbox).
+
## Project roadmap
A detailed project roadmap, including already delivered milestones, is available [here](https://backstage.io/docs/overview/roadmap).
@@ -51,11 +53,9 @@ Check out [the documentation](https://backstage.io/docs/getting-started) on how
- [Code of Conduct](CODE_OF_CONDUCT.md) - This is how we roll
- [Adopters](ADOPTERS.md) - Companies already using Backstage
- [Blog](https://backstage.io/blog/) - Announcements and updates
-- [Newsletter](https://mailchi.mp/spotify/backstage-community)
+- [Newsletter](https://mailchi.mp/spotify/backstage-community) - Subscribe to our email newsletter
- Give us a star âī¸ - If you are using Backstage or think it is an interesting project, we would love a star â¤ī¸
-Or, if you are an open source developer and are interested in joining our team, please reach out to [foss-opportunities@spotify.com ](mailto:foss-opportunities@spotify.com)
-
## License
Copyright 2020 Spotify AB.
diff --git a/app-config.development.yaml b/app-config.development.yaml
index da274ba1a8..817847c6d6 100644
--- a/app-config.development.yaml
+++ b/app-config.development.yaml
@@ -9,3 +9,5 @@ backend:
origin: http://localhost:3000
methods: [GET, POST, PUT, DELETE]
credentials: true
+ csp:
+ connect-src: ["'self'", 'http:', 'https:']
diff --git a/app-config.yaml b/app-config.yaml
index 60ecb813f7..d670771a31 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -9,32 +9,37 @@ backend:
database:
client: sqlite3
connection: ':memory:'
+ csp:
+ connect-src: ["'self'", 'https:']
# See README.md in the proxy-backend plugin for information on the configuration format
proxy:
'/circleci/api':
target: https://circleci.com/api/v1.1
- changeOrigin: true
- pathRewrite:
- '^/proxy/circleci/api/': '/'
headers:
Circle-Token:
- $secret:
- env: CIRCLECI_AUTH_TOKEN
+ $env: CIRCLECI_AUTH_TOKEN
'/jenkins/api':
target: http://localhost:8080
headers:
Authorization:
- $secret:
- env: JENKINS_BASIC_AUTH_HEADER
+ $env: JENKINS_BASIC_AUTH_HEADER
+
+ '/travisci/api':
+ target: https://api.travis-ci.com
+ changeOrigin: true
+ headers:
+ Authorization:
+ $env: TRAVISCI_AUTH_TOKEN
+ travis-api-version: 3
organization:
name: Spotify
techdocs:
- storageUrl: http://localhost:7000/techdocs/static/docs
- requestUrl: http://localhost:7000/techdocs/docs
+ storageUrl: http://localhost:7000/api/techdocs/static/docs
+ requestUrl: http://localhost:7000/api/techdocs
generators:
techdocs: 'docker'
@@ -44,8 +49,7 @@ sentry:
rollbar:
organization: spotify
accountToken:
- $secret:
- env: ROLLBAR_ACCOUNT_TOKEN
+ $env: ROLLBAR_ACCOUNT_TOKEN
newrelic:
api:
@@ -55,157 +59,194 @@ newrelic:
lighthouse:
baseUrl: http://localhost:3003
+kubernetes:
+ clusterLocatorMethod: 'configMultiTenant'
+ clusters: []
+
+integrations:
+ github:
+ - host: github.com
+ token:
+ $env: GITHUB_PRIVATE_TOKEN
+ ### Example for how to add your GitHub Enterprise instance using the API:
+ # - host: ghe.example.net
+ # apiBaseUrl: https://ghe.example.net/api/v3
+ # token:
+ # $env: GHE_PRIVATE_TOKEN
+ ### Example for how to add your GitHub Enterprise instance using raw HTTP fetches (token is optional):
+ # - host: ghe.example.net
+ # rawBaseUrl: https://ghe.example.net/raw
+ # token:
+ # $env: GHE_PRIVATE_TOKEN
+ gitlab:
+ - host: gitlab.com
+ token:
+ $env: GITLAB_PRIVATE_TOKEN
+ bitbucket:
+ - host: bitbucket.org
+ username:
+ $env: BITBUCKET_USERNAME
+ appPassword:
+ $env: BITBUCKET_APP_PASSWORD
+ azure:
+ - host: dev.azure.com
+ token:
+ $env: AZURE_PRIVATE_TOKEN
+
catalog:
rules:
- - allow: [Component, API, Group, Template, Location]
+ - allow: [Component, API, Group, User, Template, Location]
+
processors:
- github:
+ githubOrg:
providers:
- target: https://github.com
token:
- $secret:
- env: GITHUB_PRIVATE_TOKEN
+ $env: GITHUB_PRIVATE_TOKEN
#### Example for how to add your GitHub Enterprise instance using the API:
# - target: https://ghe.example.net
# apiBaseUrl: https://ghe.example.net/api/v3
# token:
- # $secret:
- # env: GHE_PRIVATE_TOKEN
- #### Example for how to add your GitHub Enterprise instance using raw HTTP fetches (token is optional):
- # - target: https://ghe.example.net
- # rawBaseUrl: https://ghe.example.net/raw
- # token:
- # $secret:
- # env: GHE_PRIVATE_TOKEN
- bitbucketApi:
- username:
- $secret:
- env: BITBUCKET_USERNAME
- appPassword:
- $secret:
- env: BITBUCKET_APP_PASSWORD
- gitlabApi:
- privateToken:
- $secret:
- env: GITLAB_PRIVATE_TOKEN
- azureApi:
- privateToken:
- $secret:
- env: AZURE_PRIVATE_TOKEN
+ # $env: GHE_PRIVATE_TOKEN
+ ldapOrg:
+ ### Example for how to add your enterprise LDAP server
+ # providers:
+ # - target: ldaps://ds.example.net
+ # bind:
+ # dn: uid=ldap-reader-user,ou=people,ou=example,dc=example,dc=net
+ # secret: { $secret: { env: LDAP_SECRET } }
+ # users:
+ # dn: ou=people,ou=example,dc=example,dc=net
+ # options:
+ # filter: (uid=*)
+ # map:
+ # description: l
+ # groups:
+ # dn: ou=access,ou=groups,ou=example,dc=example,dc=net
+ # options:
+ # filter: (&(objectClass=some-group-class)(!(groupType=email)))
locations:
# Backstage example components
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/all-components.yaml
-
# Example component for github-actions
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/plugins/github-actions/examples/sample.yaml
-
# Example component for techdocs
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/plugins/techdocs-backend/examples/documented-component/documented-component.yaml
-
# Backstage example APIs
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/all-apis.yaml
-
# Backstage example templates
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/all-templates.yaml
scaffolder:
github:
token:
- $secret:
- env: GITHUB_ACCESS_TOKEN
+ $env: GITHUB_ACCESS_TOKEN
visibility: public # or 'internal' or 'private'
gitlab:
api:
baseUrl: https://gitlab.com
token:
- $secret:
- env: GITLAB_ACCESS_TOKEN
+ $env: GITLAB_ACCESS_TOKEN
+ azure:
+ baseUrl: https://dev.azure.com/{your-organization}
+ api:
+ token:
+ $env: AZURE_PRIVATE_TOKEN
auth:
providers:
google:
development:
clientId:
- $secret:
- env: AUTH_GOOGLE_CLIENT_ID
+ $env: AUTH_GOOGLE_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_GOOGLE_CLIENT_SECRET
+ $env: AUTH_GOOGLE_CLIENT_SECRET
github:
development:
clientId:
- $secret:
- env: AUTH_GITHUB_CLIENT_ID
+ $env: AUTH_GITHUB_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_GITHUB_CLIENT_SECRET
+ $env: AUTH_GITHUB_CLIENT_SECRET
enterpriseInstanceUrl:
- $secret:
- env: AUTH_GITHUB_ENTERPRISE_INSTANCE_URL
+ $env: AUTH_GITHUB_ENTERPRISE_INSTANCE_URL
gitlab:
development:
clientId:
- $secret:
- env: AUTH_GITLAB_CLIENT_ID
+ $env: AUTH_GITLAB_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_GITLAB_CLIENT_SECRET
+ $env: AUTH_GITLAB_CLIENT_SECRET
audience:
- $secret:
- env: GITLAB_BASE_URL
+ $env: GITLAB_BASE_URL
saml:
entryPoint: 'http://localhost:7001/'
issuer: 'passport-saml'
okta:
development:
clientId:
- $secret:
- env: AUTH_OKTA_CLIENT_ID
+ $env: AUTH_OKTA_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_OKTA_CLIENT_SECRET
+ $env: AUTH_OKTA_CLIENT_SECRET
audience:
- $secret:
- env: AUTH_OKTA_AUDIENCE
+ $env: AUTH_OKTA_AUDIENCE
oauth2:
development:
clientId:
- $secret:
- env: AUTH_OAUTH2_CLIENT_ID
+ $env: AUTH_OAUTH2_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_OAUTH2_CLIENT_SECRET
+ $env: AUTH_OAUTH2_CLIENT_SECRET
authorizationUrl:
- $secret:
- env: AUTH_OAUTH2_AUTH_URL
+ $env: AUTH_OAUTH2_AUTH_URL
tokenUrl:
- $secret:
- env: AUTH_OAUTH2_TOKEN_URL
+ $env: AUTH_OAUTH2_TOKEN_URL
auth0:
development:
clientId:
- $secret:
- env: AUTH_AUTH0_CLIENT_ID
+ $env: AUTH_AUTH0_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_AUTH0_CLIENT_SECRET
+ $env: AUTH_AUTH0_CLIENT_SECRET
domain:
- $secret:
- env: AUTH_AUTH0_DOMAIN
+ $env: AUTH_AUTH0_DOMAIN
microsoft:
development:
clientId:
- $secret:
- env: AUTH_MICROSOFT_CLIENT_ID
+ $env: AUTH_MICROSOFT_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_MICROSOFT_CLIENT_SECRET
+ $env: AUTH_MICROSOFT_CLIENT_SECRET
tenantId:
- $secret:
- env: AUTH_MICROSOFT_TENANT_ID
+ $env: AUTH_MICROSOFT_TENANT_ID
+costInsights:
+ engineerCost: 200000
+ products:
+ computeEngine:
+ name: Compute Engine
+ icon: compute
+ cloudDataflow:
+ name: Cloud Dataflow
+ icon: data
+ cloudStorage:
+ name: Cloud Storage
+ icon: storage
+ bigQuery:
+ name: Big Query
+ icon: search
+ metrics:
+ dailyCost:
+ name: Your Company's Daily Cost
+ DAU:
+ name: Cost Per DAU
+homepage:
+ clocks:
+ - label: UTC
+ timzone: UTC
+ - label: NYC
+ timezone: 'America/New_York'
+ - label: STO
+ timezone: 'Europe/Stockholm'
+ - label: TYO
+ timezone: 'Asia/Tokyo'
diff --git a/backstage_overview.png b/backstage_overview.png
deleted file mode 100644
index 6c939c127c..0000000000
Binary files a/backstage_overview.png and /dev/null differ
diff --git a/contrib/docker/multi-stage-frontend/Dockerfile b/contrib/docker/multi-stage-frontend/Dockerfile
index 0c492478d1..3190687c52 100644
--- a/contrib/docker/multi-stage-frontend/Dockerfile
+++ b/contrib/docker/multi-stage-frontend/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:12 AS build
+FROM node:12-buster AS build
RUN mkdir /app
COPY . /app
diff --git a/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md b/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md
new file mode 100644
index 0000000000..855608c8b1
--- /dev/null
+++ b/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md
@@ -0,0 +1,58 @@
+### Source repo: https://github.com/johnson-jesse/simple-backstage-app-plugin
+
+ExampleComponent.tsx reference
+
+```tsx
+import React, { FC } from 'react';
+import { Typography, Grid } from '@material-ui/core';
+import {
+ InfoCard,
+ Header,
+ Page,
+ pageTheme,
+ Content,
+ ContentHeader,
+ HeaderLabel,
+ SupportButton,
+ identityApiRef,
+} from '@backstage/core';
+import { useApi } from '@backstage/core-api';
+import ExampleFetchComponent from '../ExampleFetchComponent';
+
+const ExampleComponent: FC<{}> = () => {
+ const identityApi = useApi(identityApiRef);
+ const userId = identityApi.getUserId();
+ const profile = identityApi.getProfile();
+
+ return (
+
+
+
+
+
+
+
+ A description of your plugin goes here.
+
+
+
+
+
+ {`${profile.displayName} | ${profile.email}`}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ExampleComponent;
+```
diff --git a/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md b/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md
new file mode 100644
index 0000000000..08d14e8c4c
--- /dev/null
+++ b/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md
@@ -0,0 +1,111 @@
+### Source repo: https://github.com/johnson-jesse/simple-backstage-app-plugin
+
+ExampleFetchComponent.tsx reference
+
+```tsx
+import React, { FC } from 'react';
+import { useAsync } from 'react-use';
+import Alert from '@material-ui/lab/Alert';
+import {
+ Table,
+ TableColumn,
+ Progress,
+ githubAuthApiRef,
+} from '@backstage/core';
+import { useApi } from '@backstage/core-api';
+import { graphql } from '@octokit/graphql';
+
+const query = `{
+ viewer {
+ repositories(first: 100) {
+ totalCount
+ nodes {
+ name
+ createdAt
+ description
+ diskUsage
+ isFork
+ }
+ pageInfo {
+ endCursor
+ hasNextPage
+ }
+ }
+ }
+}`;
+
+type Node = {
+ name: string;
+ createdAt: string;
+ description: string;
+ diskUsage: number;
+ isFork: boolean;
+};
+
+type Viewer = {
+ repositories: {
+ totalCount: number;
+ nodes: Node[];
+ pageInfo: {
+ endCursor: string;
+ hasNextPage: boolean;
+ };
+ };
+};
+
+type DenseTableProps = {
+ viewer: Viewer;
+};
+
+export const DenseTable: FC = ({ viewer }) => {
+ const columns: TableColumn[] = [
+ { title: 'Name', field: 'name' },
+ { title: 'Created', field: 'createdAt' },
+ { title: 'Description', field: 'description' },
+ { title: 'Disk Usage', field: 'diskUsage' },
+ { title: 'Fork', field: 'isFork' },
+ ];
+
+ return (
+
+ );
+};
+
+export default ExampleFetchComponent;
+```
diff --git a/docs/FAQ.md b/docs/FAQ.md
index b4c4970ff8..355cf97880 100644
--- a/docs/FAQ.md
+++ b/docs/FAQ.md
@@ -86,7 +86,7 @@ well-known tech and a large flora of components.
### What technology does Backstage use?
-The code base is a large-scale React application that uses TypeScript. For
+The codebase is a large-scale React application that uses TypeScript. For
[Phase 2](https://github.com/spotify/backstage#project-roadmap), we plan to use
Node.js and GraphQL.
@@ -132,20 +132,19 @@ to see if it already exists or is in the works. If no one's thought of it yet,
great! Open a new issue as
[a plugin suggestion](https://github.com/spotify/backstage/issues/new/choose)
and describe what your plugin will do. This will help coordinate our
-contributors' efforts and avoid duplicating existing functionality. In the
-future, we will create
-[a plugin gallery](https://github.com/spotify/backstage/issues/260) where people
-can browse and search for all available plugins.
+contributors' efforts and avoid duplicating existing functionality.
+
+You can browse and search for all available plugins in the
+[Plugin Marketplace](https://backstage.io/plugins).
### Which plugin is used the most at Spotify?
By far, our most-used plugin is our TechDocs plugin, which we use for creating
technical documentation. Our philosophy at Spotify is to treat "docs like code",
where you write documentation using the same workflow as you write your code.
-This makes it easier to create, find, and update documentation. We hope to
-release
-[the open source version](https://github.com/spotify/backstage/issues/687) in
-the future. (See also:
+This makes it easier to create, find, and update documentation.
+[TechDocs is now open source.](https://backstage.io/docs/features/techdocs/techdocs-overview)
+(See also:
"[Will Spotify's internal plugins be open sourced, too?](#will-spotifys-internal-plugins-be-open-sourced-too)"
above)
@@ -205,7 +204,7 @@ Please report sensitive security issues via Spotify's
### Does Backstage collect any information that is shared with Spotify?
No. Backstage does not collect any telemetry from any third party using the
-platform. Spotify, and the open source community, does have access to
+platform. Spotify, and the open source community, do have access to
[GitHub Insights](https://github.com/features/insights), which contains
information such as contributors, commits, traffic, and dependencies. Backstage
is an open platform, but you are in control of your own data. You control who
diff --git a/docs/api/utility-apis.md b/docs/api/utility-apis.md
index d192cbd6ee..1ebf2ae88b 100644
--- a/docs/api/utility-apis.md
+++ b/docs/api/utility-apis.md
@@ -97,7 +97,7 @@ app, and the app itself.
### Core APIs
-Starting with the Backstage core library, it provides implementation for all of
+Starting with the Backstage core library, it provides implementations for all of
the core APIs. The core APIs are the ones exported by `@backstage/core`, such as
the `errorApiRef` and `configApiRef`. You can find a full list of them
[here](../reference/utility-apis/README.md).
@@ -113,7 +113,7 @@ While doing so they should usually also provide default implementations of their
own APIs, for example, the `catalog` plugin exports `catalogApiRef`, and also
supplies a default `ApiFactory` of that API using the `CatalogClient`. There is
one restriction to plugin-provided API Factories: plugins may not supply
-factories for core APIs, trying to do so will cause the app to crash.
+factories for core APIs, trying to do so will cause the app to refuse to start.
Plugins supply their APIs through the `apis` option of `createPlugin`, for
example:
@@ -248,8 +248,8 @@ directly tied to React.
The indirection provided by Utility APIs also makes it straightforward to test
components that depend on APIs, and to provide a standard common development
environment for plugins. A proper test wrapper with mocked API implementations
-is not yet ready, but it will provided as a part of `@backstage/test-utils`. It
-will provide mocked variants of APIs, with additional methods for asserting a
+is not yet ready, but it will be provided as a part of `@backstage/test-utils`.
+It will provide mocked variants of APIs, with additional methods for asserting a
component's interaction with the API.
The common development environment for plugins is included in
diff --git a/docs/architecture-decisions/adr002-default-catalog-file-format.md b/docs/architecture-decisions/adr002-default-catalog-file-format.md
index f4fd3a1158..d831581d5b 100644
--- a/docs/architecture-decisions/adr002-default-catalog-file-format.md
+++ b/docs/architecture-decisions/adr002-default-catalog-file-format.md
@@ -22,7 +22,7 @@ This ADR describes the default format of these descriptor files.
### Inspiration
-Internally at Spotify, a home grown software catalog system is used heavily and
+Internally at Spotify, a homegrown software catalog system is used heavily and
forms a core part of Backstage and other important pieces of the infrastructure.
The user experience, learnings and certain pieces of metadata from that catalog
are being carried over to the open source effort.
@@ -40,7 +40,7 @@ triggers from the version control system, etc.
Each file describes one or more entities in accordance with the
[Backstage System Model](https://github.com/spotify/backstage/issues/390). All
-of these entities have a common stucture and nomenclature, and they are stored
+of these entities have a common structure and nomenclature, and they are stored
in the software catalog from which they then can be queried.
Entities have distinct names, and they may reference each other by those names.
diff --git a/docs/architecture-decisions/adr003-avoid-default-exports.md b/docs/architecture-decisions/adr003-avoid-default-exports.md
index 8634a19632..d08bc6a882 100644
--- a/docs/architecture-decisions/adr003-avoid-default-exports.md
+++ b/docs/architecture-decisions/adr003-avoid-default-exports.md
@@ -44,7 +44,7 @@ A summary:
name each.
Using named exports helps prevent needing to rename symbols, which has myriad
-benefts. A few are:
+benefits. A few are:
- IDE tools like "Find All References" and "Go To Definition" function
- Manual codebase searching ("grep", etc) is easier with a unique symbol
diff --git a/docs/architecture-decisions/adr004-module-export-structure.md b/docs/architecture-decisions/adr004-module-export-structure.md
index 12408abac1..14c94c4ed1 100644
--- a/docs/architecture-decisions/adr004-module-export-structure.md
+++ b/docs/architecture-decisions/adr004-module-export-structure.md
@@ -22,8 +22,8 @@ or
We currently do not use any pattern for how to structure exports. There is a mix
of package-level re-exports deep into the directory tree, shallow re-exports for
each directory, exports using `*` and explicit lists of each symbol, etc. The
-mix and lack of predictability makes it difficult to reason about the boundaries
-of a module, and for example knowing whether is is safe to export a symbol in a
+mix and lack of predictability make it difficult to reason about the boundaries
+of a module, and for example knowing whether it is safe to export a symbol in a
given file.
## Decision
diff --git a/docs/architecture-decisions/adr006-avoid-react-fc.md b/docs/architecture-decisions/adr006-avoid-react-fc.md
index bea36712d7..96f594daf7 100644
--- a/docs/architecture-decisions/adr006-avoid-react-fc.md
+++ b/docs/architecture-decisions/adr006-avoid-react-fc.md
@@ -13,7 +13,7 @@ with next to no benefits in combination with a few downsides.
The main reasons were:
- **children props** were implicitly added
-- **Generic Type** were not supported on children
+- **Generic Type** was not supported on children
Read more about the removal in
[this PR](https://github.com/facebook/create-react-app/pull/8177).
@@ -25,7 +25,7 @@ should be avoided in our codebase when adding new code.
Here is an example:
-```ts
+```typescript
/* Avoid this: */
type BadProps = { text: string };
const BadComponent: FC = ({ text, children }) => (
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 6b18f67d40..045588f505 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
@@ -11,7 +11,7 @@ tests, unit tests to e2e tests always have their own implementation of mocking
these requests. There's been traction in the outer community towards using this
library to mock network requests by using an express style declaration for
routes. react-testing-library suggests using this library instead of mocking
-fetch directly wether this be in a browser or in node.
+fetch directly whether this be in a browser or in node.
https://github.com/mswjs/msw
diff --git a/docs/architecture-decisions/adr008-default-catalog-file-name.md b/docs/architecture-decisions/adr008-default-catalog-file-name.md
index c57d10c0b1..d4716318bc 100644
--- a/docs/architecture-decisions/adr008-default-catalog-file-name.md
+++ b/docs/architecture-decisions/adr008-default-catalog-file-name.md
@@ -7,7 +7,7 @@ description: Architecture Decision Record (ADR) log on Default Catalog File Name
## Background
While the spec for the catalog file format is well described in
-[ADR002](./adr002-default-catalog-file-format.md), guidance was note provided as
+[ADR002](./adr002-default-catalog-file-format.md), guidance was not provided as
to the name of the catalog file.
Following discussion in
@@ -23,4 +23,4 @@ catalog-info.yaml
```
This name is a default, **not a requirement**. The catalog file will work with
-Backstage irregardless of its name.
+Backstage regardless of its name.
diff --git a/docs/architecture-decisions/adr009-entity-references.md b/docs/architecture-decisions/adr009-entity-references.md
new file mode 100644
index 0000000000..8b7984ea49
--- /dev/null
+++ b/docs/architecture-decisions/adr009-entity-references.md
@@ -0,0 +1,69 @@
+---
+id: adrs-adr009
+title: ADR009: Entity References
+description: Architecture Decision Record (ADR) log on Entity References
+---
+
+## Background
+
+While the spec for the catalog file format is well described in
+[ADR002](./adr002-default-catalog-file-format.md), guidance was not provided as
+to how one is expected to express references to other entities in the catalog.
+There was also some confusion on how to reference entities in URLs in the
+Backstage frontend.
+
+Following discussion in
+[Issue 1947](https://github.com/spotify/backstage/issues/1947), a decision was
+made.
+
+## Entity References in YAML files
+
+The textual format, as written by humans, to reference entities by name is on
+the following form, where square brackets denote optionality:
+
+```
+[:][/]
+```
+
+That is, it is composed of between one and three parts in this specific order,
+without any additional encoding, with those exact separator characters.
+Optionality of `kind` and `namespace` are contextual, and they may or may not
+have default contextual fallback values.
+
+When that format is insufficient or when machine made interchange formats wish
+to express such relations in a more expressive form, a nested structure on the
+following form can be used:
+
+```yaml
+kind:
+namespace:
+name:
+```
+
+Of these, only `name` is always required. Optionality of `kind` and `namespace`
+are contextual, and they may or may not have default contextual fallback values.
+All other possible key values in this structure are reserved for future use.
+
+A system or user wanting to express a full entity name that is always valid,
+shall supply the entire triplet whether using the string form or the compound
+form.
+
+A full description of the format can be found
+[in the documentation](https://backstage.io/docs/features/software-catalog/references).
+
+## Entity References in URLs
+
+Where entities are referenced by name in the Backstage frontend, the URL
+containing the reference shall take the following form:
+
+```
+:namespace/:kind/:name
+```
+
+All three parts are required under all circumstances. The default value for the
+`namespace` in the catalog is the string `"default"`, if the entity does not
+specify one explicitly in `metadata.namespace`.
+
+This means that we do not encourage the string form of entity references to be
+used as a single URL segment, due to the use of URL-unsafe characters leading to
+possible risk, confusion, and uglier URLs.
diff --git a/docs/assets/architecture-decisions/catalog-core-entities.png b/docs/assets/architecture-decisions/catalog-core-entities.png
index b0c7cb4575..b7f238708f 100644
Binary files a/docs/assets/architecture-decisions/catalog-core-entities.png and b/docs/assets/architecture-decisions/catalog-core-entities.png differ
diff --git a/docs/assets/architecture-overview/circle-ci.png b/docs/assets/architecture-overview/circle-ci.png
index c5695196f1..48aebc9200 100644
Binary files a/docs/assets/architecture-overview/circle-ci.png and b/docs/assets/architecture-overview/circle-ci.png differ
diff --git a/docs/assets/architecture-overview/core-vs-plugin-components-highlighted.png b/docs/assets/architecture-overview/core-vs-plugin-components-highlighted.png
index 7d08fc5e36..f0a8e8871d 100644
Binary files a/docs/assets/architecture-overview/core-vs-plugin-components-highlighted.png and b/docs/assets/architecture-overview/core-vs-plugin-components-highlighted.png differ
diff --git a/docs/assets/architecture-overview/lighthouse-plugin-architecture.png b/docs/assets/architecture-overview/lighthouse-plugin-architecture.png
index 0da5d6f042..0d67bcf19b 100644
Binary files a/docs/assets/architecture-overview/lighthouse-plugin-architecture.png and b/docs/assets/architecture-overview/lighthouse-plugin-architecture.png differ
diff --git a/docs/assets/architecture-overview/lighthouse-plugin.png b/docs/assets/architecture-overview/lighthouse-plugin.png
index 9692fc0833..0b9d0ccc8a 100644
Binary files a/docs/assets/architecture-overview/lighthouse-plugin.png and b/docs/assets/architecture-overview/lighthouse-plugin.png differ
diff --git a/docs/assets/architecture-overview/tech-radar-plugin-architecture.png b/docs/assets/architecture-overview/tech-radar-plugin-architecture.png
index d55be5ee82..417a2764a1 100644
Binary files a/docs/assets/architecture-overview/tech-radar-plugin-architecture.png and b/docs/assets/architecture-overview/tech-radar-plugin-architecture.png differ
diff --git a/docs/assets/architecture-overview/tech-radar-plugin.png b/docs/assets/architecture-overview/tech-radar-plugin.png
index dbf39b6c63..062227ac80 100644
Binary files a/docs/assets/architecture-overview/tech-radar-plugin.png and b/docs/assets/architecture-overview/tech-radar-plugin.png differ
diff --git a/docs/assets/auth/oauth-popup-flow.svg b/docs/assets/auth/oauth-popup-flow.svg
index 2132903783..4a6e76ed21 100644
--- a/docs/assets/auth/oauth-popup-flow.svg
+++ b/docs/assets/auth/oauth-popup-flow.svg
@@ -1,50 +1,50 @@
\ No newline at end of file
+-->
diff --git a/docs/assets/contributorheader.png b/docs/assets/contributorheader.png
index 53d1027d85..64d0cb4cff 100644
Binary files a/docs/assets/contributorheader.png and b/docs/assets/contributorheader.png differ
diff --git a/docs/assets/dls/DLS.png b/docs/assets/dls/DLS.png
index 94214e4650..f84b94857d 100644
Binary files a/docs/assets/dls/DLS.png and b/docs/assets/dls/DLS.png differ
diff --git a/docs/assets/dls/designheader-updated.png b/docs/assets/dls/designheader-updated.png
index 56c5a56abb..39aded2252 100644
Binary files a/docs/assets/dls/designheader-updated.png and b/docs/assets/dls/designheader-updated.png differ
diff --git a/docs/assets/dls/designheader.png b/docs/assets/dls/designheader.png
index e9ace5c2e7..8f160039df 100644
Binary files a/docs/assets/dls/designheader.png and b/docs/assets/dls/designheader.png differ
diff --git a/docs/assets/dls/running-storybook.png b/docs/assets/dls/running-storybook.png
index 6cf1ded4b9..ce9422b99d 100644
Binary files a/docs/assets/dls/running-storybook.png and b/docs/assets/dls/running-storybook.png differ
diff --git a/docs/assets/dls/storybook-page.png b/docs/assets/dls/storybook-page.png
index 113f96e589..58470feaff 100644
Binary files a/docs/assets/dls/storybook-page.png and b/docs/assets/dls/storybook-page.png differ
diff --git a/docs/assets/getting-started/create-app_output.png b/docs/assets/getting-started/create-app_output.png
index caa39ec6d2..875ad05122 100644
Binary files a/docs/assets/getting-started/create-app_output.png and b/docs/assets/getting-started/create-app_output.png differ
diff --git a/docs/assets/getting-started/create-plugin_output.png b/docs/assets/getting-started/create-plugin_output.png
index f048a9f5fc..47231c2079 100644
Binary files a/docs/assets/getting-started/create-plugin_output.png and b/docs/assets/getting-started/create-plugin_output.png differ
diff --git a/docs/assets/headline.png b/docs/assets/headline.png
index 83d7b14f21..fef99a269f 100644
Binary files a/docs/assets/headline.png and b/docs/assets/headline.png differ
diff --git a/docs/assets/my-plugin_screenshot.png b/docs/assets/my-plugin_screenshot.png
index 0b2817fa1e..4f2849a691 100644
Binary files a/docs/assets/my-plugin_screenshot.png and b/docs/assets/my-plugin_screenshot.png differ
diff --git a/docs/assets/pop.png b/docs/assets/pop.png
index 441126f33c..614136b501 100644
Binary files a/docs/assets/pop.png and b/docs/assets/pop.png differ
diff --git a/docs/assets/software-catalog/bsc-edit.png b/docs/assets/software-catalog/bsc-edit.png
index d1ac1f52e5..f3a7daa1dd 100644
Binary files a/docs/assets/software-catalog/bsc-edit.png and b/docs/assets/software-catalog/bsc-edit.png differ
diff --git a/docs/assets/software-catalog/bsc-register-1.png b/docs/assets/software-catalog/bsc-register-1.png
index 117b2ea8ea..0e33c173fb 100644
Binary files a/docs/assets/software-catalog/bsc-register-1.png and b/docs/assets/software-catalog/bsc-register-1.png differ
diff --git a/docs/assets/software-catalog/bsc-register-2.png b/docs/assets/software-catalog/bsc-register-2.png
index fd1ea7b998..de71141ba0 100644
Binary files a/docs/assets/software-catalog/bsc-register-2.png and b/docs/assets/software-catalog/bsc-register-2.png differ
diff --git a/docs/assets/software-catalog/bsc-search.png b/docs/assets/software-catalog/bsc-search.png
index 8e417cb076..042e6055e0 100644
Binary files a/docs/assets/software-catalog/bsc-search.png and b/docs/assets/software-catalog/bsc-search.png differ
diff --git a/docs/assets/software-catalog/bsc-starred.png b/docs/assets/software-catalog/bsc-starred.png
index 27db19c842..c9721c27a2 100644
Binary files a/docs/assets/software-catalog/bsc-starred.png and b/docs/assets/software-catalog/bsc-starred.png differ
diff --git a/docs/assets/software-catalog/service-catalog-home.png b/docs/assets/software-catalog/service-catalog-home.png
index 742748632e..1d2e8ed317 100644
Binary files a/docs/assets/software-catalog/service-catalog-home.png and b/docs/assets/software-catalog/service-catalog-home.png differ
diff --git a/docs/assets/software-catalog/software-model-core-entities.png b/docs/assets/software-catalog/software-model-core-entities.png
index b718b7527c..60cb283802 100644
Binary files a/docs/assets/software-catalog/software-model-core-entities.png and b/docs/assets/software-catalog/software-model-core-entities.png differ
diff --git a/docs/assets/software-templates/added-to-the-catalog-list.png b/docs/assets/software-templates/added-to-the-catalog-list.png
index 4b544e51c1..c73c33ede3 100644
Binary files a/docs/assets/software-templates/added-to-the-catalog-list.png and b/docs/assets/software-templates/added-to-the-catalog-list.png differ
diff --git a/docs/assets/software-templates/complete.png b/docs/assets/software-templates/complete.png
index eee14fae0e..2a8de0ba1e 100644
Binary files a/docs/assets/software-templates/complete.png and b/docs/assets/software-templates/complete.png differ
diff --git a/docs/assets/software-templates/create.png b/docs/assets/software-templates/create.png
index 8a2e92b9f4..8123780cd3 100644
Binary files a/docs/assets/software-templates/create.png and b/docs/assets/software-templates/create.png differ
diff --git a/docs/assets/software-templates/failed.png b/docs/assets/software-templates/failed.png
index bca8c72d6a..4cb7ce84cc 100644
Binary files a/docs/assets/software-templates/failed.png and b/docs/assets/software-templates/failed.png differ
diff --git a/docs/assets/software-templates/go-to-catalog.png b/docs/assets/software-templates/go-to-catalog.png
index ae16230a02..ea03295846 100644
Binary files a/docs/assets/software-templates/go-to-catalog.png and b/docs/assets/software-templates/go-to-catalog.png differ
diff --git a/docs/assets/software-templates/running.png b/docs/assets/software-templates/running.png
index 208376e059..681c3702f7 100644
Binary files a/docs/assets/software-templates/running.png and b/docs/assets/software-templates/running.png differ
diff --git a/docs/assets/software-templates/template-picked-2.png b/docs/assets/software-templates/template-picked-2.png
index 685e356ee8..a1737c8e00 100644
Binary files a/docs/assets/software-templates/template-picked-2.png and b/docs/assets/software-templates/template-picked-2.png differ
diff --git a/docs/assets/software-templates/template-picked.png b/docs/assets/software-templates/template-picked.png
index 1094acec4a..79b1e260e0 100644
Binary files a/docs/assets/software-templates/template-picked.png and b/docs/assets/software-templates/template-picked.png differ
diff --git a/docs/assets/techdocs/documentation-template.png b/docs/assets/techdocs/documentation-template.png
index 1f44ad27c6..7539f1f6f4 100644
Binary files a/docs/assets/techdocs/documentation-template.png and b/docs/assets/techdocs/documentation-template.png differ
diff --git a/docs/assets/techdocs/techdocs_big_picture.png b/docs/assets/techdocs/techdocs_big_picture.png
index ffe437180f..8b8f7a2338 100644
Binary files a/docs/assets/techdocs/techdocs_big_picture.png and b/docs/assets/techdocs/techdocs_big_picture.png differ
diff --git a/docs/assets/utility-apis-fig1.svg b/docs/assets/utility-apis-fig1.svg
index 47123299c7..3261de88a8 100644
--- a/docs/assets/utility-apis-fig1.svg
+++ b/docs/assets/utility-apis-fig1.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/docs/auth/add-auth-provider.md b/docs/auth/add-auth-provider.md
index c5f7645a49..56586cbfc6 100644
--- a/docs/auth/add-auth-provider.md
+++ b/docs/auth/add-auth-provider.md
@@ -229,9 +229,10 @@ name.
### Test the new provider
-You can `curl -i localhost:7000/auth/providerA/start` and which should provide a
-`302` redirect with a `Location` header. Paste the url from that header into a
-web browser and you should be able to trigger the authorization flow.
+You can `curl -i localhost:7000/api/auth/providerA/start` and which should
+provide a `302` redirect with a `Location` header. Paste the url from that
+header into a web browser and you should be able to trigger the authorization
+flow.
---
diff --git a/docs/auth/auth-backend-classes.md b/docs/auth/auth-backend-classes.md
index 4ccee8ede9..9dc677b439 100644
--- a/docs/auth/auth-backend-classes.md
+++ b/docs/auth/auth-backend-classes.md
@@ -67,26 +67,21 @@ auth:
google:
development:
clientId:
- $secret:
- env: AUTH_GOOGLE_CLIENT_ID
+ $env: AUTH_GOOGLE_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_GOOGLE_CLIENT_SECRET
+ $env: AUTH_GOOGLE_CLIENT_SECRET
github:
development:
clientId:
- $secret:
- env: AUTH_GITHUB_CLIENT_ID
+ $env: AUTH_GITHUB_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_GITHUB_CLIENT_SECRET
+ $env: AUTH_GITHUB_CLIENT_SECRET
enterpriseInstanceUrl:
- $secret:
- env: AUTH_GITHUB_ENTERPRISE_INSTANCE_URL
+ $env: AUTH_GITHUB_ENTERPRISE_INSTANCE_URL
gitlab:
development:
clientId:
- $secret:
+ $env:
...
```
diff --git a/docs/auth/index.md b/docs/auth/index.md
index 0fa8de3280..d7fb5d8c59 100644
--- a/docs/auth/index.md
+++ b/docs/auth/index.md
@@ -6,7 +6,7 @@ description: Documentation on User Authentication and Authorization in Backstage
## Summary
-The purpose of the Auth APIs in Backstage are to identify the user, and to
+The purpose of the Auth APIs in Backstage is to identify the user, and to
provide a way for plugins to request access to 3rd party services on behalf of
the user (OAuth). This documentation focuses on the implementation of that
solution and how to extend it. For documentation on how to consume the Auth APIs
@@ -35,6 +35,13 @@ full list of providers, see the
### Identity - WIP
+> NOTE: Identity management and the `SignInPage` in Backstage is NOT a method
+> for blocking access for unauthorized users, that either requires additional
+> backend implementation or a separate service like Google's Identity-Aware
+> Proxy. The identity system only serves to provide a personalized experience
+> and access to a Backstage Identity Token, which can be passed to backend
+> plugins.
+
Identity management is still work in progress, but there are already a couple of
pieces in place that can be used.
diff --git a/docs/auth/oauth.md b/docs/auth/oauth.md
index e90b7b665a..178b99b153 100644
--- a/docs/auth/oauth.md
+++ b/docs/auth/oauth.md
@@ -52,7 +52,7 @@ in a new popup window that is opened by the app. By using a popup-based flow it
is possible to request authentication at any point in the app, without requiring
a redirect. Because of this there is no need to ask for all scopes upfront, or
interrupt the app with a redirect and forcing plugin authors to take care in
-restoring state after a redirect has been make. All in all it makes it much
+restoring state after a redirect has been made. All in all it makes it much
easier to make authenticated requests inside a plugin.
## OAuth Flow
@@ -67,7 +67,7 @@ Component and APIs can request Access or ID Tokens from any available Auth
provider. If there already exists a cached fresh token that covers (at least)
the requested scopes, it will be returned immediately. If the OAuth provider
implements token refreshes, this check will also trigger a token refresh attempt
-if no session is a available.
+if no session is available.
If new scopes are requested, or the user is not yet logged in with that
provider, a dialog is shown informing the user that they need to log in with the
diff --git a/docs/conf/index.md b/docs/conf/index.md
index 83eff50a7d..e1dfc30582 100644
--- a/docs/conf/index.md
+++ b/docs/conf/index.md
@@ -18,7 +18,8 @@ allowing for customization.
Configuration is stored in `app-config.yaml` files, with support for suffixes
such as `app-config.production.yaml` to override values for specific
environments. The configuration files themselves contain plain YAML, but with
-support for loading in secrets from various sources using a `$secret` key.
+support for loading in secrets from various sources using for example `$env` and
+`$file` keys.
It is also possible to supply configuration through environment variables, for
example `APP_CONFIG_app_baseUrl=https://staging.example.com`. However these
diff --git a/docs/conf/writing.md b/docs/conf/writing.md
index 6d338e586d..5564e780bb 100644
--- a/docs/conf/writing.md
+++ b/docs/conf/writing.md
@@ -90,18 +90,17 @@ order:
## Secrets
-Secrets are supported via a special `$secret` key, which in turn provides a
-number of different ways to read in secrets. To load a configuration value as a
-secret, supply an object with a single `$secret` key, and within that supply an
-object that describes how the secret is loaded. For example, the following will
-read the config key `backend.mySecretKey` from the environment variable
-`MY_SECRET_KEY`:
+Secrets are supported via a special secret keys that are prefixed with `$`,
+which in turn provides a number of different ways to read in secrets. To load a
+configuration value as a secret, supply an object with one of the special secret
+keys, for example `$env` or `$file`. A full list of supported secret keys can be
+found below. For example, the following will read the config key
+`backend.mySecretKey` from the environment variable `MY_SECRET_KEY`:
```yaml
backend:
mySecretKey:
- $secret:
- env: MY_SECRET_KEY
+ $env: MY_SECRET_KEY
```
With the above configuration, calling `config.getString('backend.mySecretKey')`
@@ -123,8 +122,7 @@ This reads a secret from an environment variable. For example, the following
config loads the secret from the `MY_SECRET` env var.
```yaml
-$secret:
- env: MY_SECRET
+$env: MY_SECRET
```
### File Secrets
@@ -135,22 +133,19 @@ following reads the contents of `my-secret.txt` relative to the config file
itself:
```yaml
-$secret:
- file: ./my-secret.txt
+$file: ./my-secret.txt
```
### Data File Secrets
This reads secrets from a path within a JSON-like data file. The file path
-behaves similar to file secrets, but in addition a `path` is used to point to a
-specific value inside the file. Supported file extensions are `.json`, `.yaml`,
-and `.yml`. For example, the following would read out `my-secret-key` from
-`my-secrets.json`:
+behaves similar to file secrets, but with the addition of a url fragment that is
+used to point to a specific value inside the file. Supported file extensions are
+`.json`, `.yaml`, and `.yml`. For example, the following would read out
+`my-secret-key` from `my-secrets.json`:
```yaml
-$secret:
- data: ./my-secrets.json
- path: deployment.key
+$data: ./my-secrets.json#deployment.key
# my-secrets.json
{
diff --git a/docs/features/software-catalog/configuration.md b/docs/features/software-catalog/configuration.md
index c98bd73ca3..46de2d3d67 100644
--- a/docs/features/software-catalog/configuration.md
+++ b/docs/features/software-catalog/configuration.md
@@ -11,36 +11,50 @@ tasks, such as reading raw entity data from a remote source, parsing it,
transforming it, and validating it. These processors are configured under the
`catalog.processors` key.
-### Processor: github
+### Processor: url
-The `github` processor is responsible for fetching entity data from files on
-GitHub or GitHub Enterprise. The configuration for this processor lives under
-`catalog.processors.github`. Example:
+The `url` processor is responsible for fetching entity data from files in any
+external provider like GitHub, GitLab, Bitbucket, etc. The configuration of this
+processor lives under the top-level `integrations` key, as it is used by other
+parts of Backstage too.
```yaml
-catalog:
- processors:
- github:
- providers:
- - target: https://github.com
- token:
- $secret:
- env: GITHUB_PRIVATE_TOKEN
- - target: https://ghe.example.net
- apiBaseUrl: https://ghe.example.net/api/v3
- rawBaseUrl: https://ghe.example.net/raw
- token:
- $secret:
- env: GHE_PRIVATE_TOKEN
+integrations:
+ github:
+ - host: github.com
+ token:
+ $env: GITHUB_TOKEN
+ - host: ghe.example.net
+ apiBaseUrl: https://ghe.example.net/api/v3
+ rawBaseUrl: https://ghe.example.net/raw
+ token:
+ $env: GHE_TOKEN
+ gitlab:
+ - host: gitlab.com
+ token:
+ $env: GITLAB_TOKEN
+ bitbucket:
+ - host: bitbucket.org
+ username:
+ $env: BITBUCKET_USERNAME
+ appPassword:
+ $env: BITBUCKET_APP_PASSWORD
+ azure:
+ - host: dev.azure.com
+ token:
+ $env: AZURE_TOKEN
```
-The main subkey is `providers`, where you can list the various GitHub compatible
-providers you want to be able to fetch data from. Each entry is a structure with
-up to four elements:
+Each key under `integrations` is a separate configuration for each external
+provider. The providers each have their own configuration, so let's look at the
+GitHub section as an example.
-- `target` (required): The string prefix of the location target that you want to
- match on, with no trailing slash. For GitHub, it should be exactly
- `https://github.com`.
+Directly under the `github` key is a list of provider configurations, where you
+can list the various GitHub compatible providers you want to be able to fetch
+data from. Each entry is a structure with up to four elements:
+
+- `host` (optional): The host of the location target that you want to match on.
+ The default host is `github.com`.
- `token` (optional): An authentication token as expected by GitHub. If
supplied, it will be passed along with all calls to this provider, both API
and raw. If it is not supplied, anonymous access will be used.
@@ -74,7 +88,7 @@ the catalog under the `catalog.locations` key, for example:
```yaml
catalog:
locations:
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
```
@@ -97,7 +111,7 @@ catalog:
- allow: [Component, API, Location, Template]
locations:
- - type: github
+ - type: url
target: https://github.com/org/example/blob/master/org-data.yaml
rules:
- allow: [Group]
diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md
index 301d80630c..0c50e3669a 100644
--- a/docs/features/software-catalog/descriptor-format.md
+++ b/docs/features/software-catalog/descriptor-format.md
@@ -22,6 +22,8 @@ humans. However, the structure and semantics is the same in both cases.
- [Kind: Component](#kind-component)
- [Kind: Template](#kind-template)
- [Kind: API](#kind-api)
+- [Kind: Group](#kind-group)
+- [Kind: User](#kind-user)
## Overall Shape Of An Entity
@@ -571,3 +573,167 @@ group of people in an organizational structure.
The definition of the API, based on the format defined by `spec.type`. This
field is required.
+
+## Kind: Group
+
+Describes the following entity kind:
+
+| Field | Value |
+| ------------ | ----------------------- |
+| `apiVersion` | `backstage.io/v1alpha1` |
+| `kind` | `Group` |
+
+A group describes an organizational entity, such as for example a team, a
+business unit, or a loose collection of people in an interest group. Members of
+these groups are modeled in the catalog as kind [`User`](#kind-user).
+
+Descriptor files for this kind may look as follows.
+
+```yaml
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: infrastructure
+ description: The infra business unit
+spec:
+ type: business-unit
+ parent: ops
+ ancestors: [ops, global-synergies, acme-corp]
+ children: [backstage, other]
+ descendants: [backstage, other, team-a, team-b, team-c, team-d]
+```
+
+In addition to the [common envelope metadata](#common-to-all-kinds-the-metadata)
+shape, this kind has the following structure.
+
+### `apiVersion` and `kind` [required]
+
+Exactly equal to `backstage.io/v1alpha1` and `Group`, respectively.
+
+### `spec.type` [required]
+
+The type of group as a string, e.g. `team`. There is currently no enforced set
+of values for this field, so it is left up to the adopting organization to
+choose a nomenclature that matches their org hierarchy.
+
+Some common values for this field could be:
+
+- `team`
+- `business-unit`
+- `product-area`
+- `root` - as a common virtual root of the hierarchy, if desired
+
+### `spec.parent` [optional]
+
+The immediate parent group in the hierarchy, if any. Not all groups must have a
+parent; the catalog supports multi-root hierarchies. Groups may however not have
+more than one parent.
+
+This field is an
+[entity reference](https://backstage.io/docs/features/software-catalog/references),
+with the default kind `Group` and the default namespace equal to the same
+namespace as the user. Only `Group` entities may be referenced. Most commonly,
+this field points to a group in the same namespace, so in those cases it is
+sufficient to enter only the `metadata.name` field of that group.
+
+### `spec.ancestors` [required]
+
+The recursive list of parents up the hierarchy, by stepping through parents one
+by one. The list must be present, but may be empty if `parent` is not present.
+The first entry in the list is equal to `parent`, and then the following ones
+are progressively farther up the hierarchy.
+
+The entries of this array are
+[entity references](https://backstage.io/docs/features/software-catalog/references),
+with the default kind `Group` and the default namespace equal to the same
+namespace as the user. Only `Group` entities may be referenced. Most commonly,
+these entries point to groups in the same namespace, so in those cases it is
+sufficient to enter only the `metadata.name` field of those groups.
+
+### `spec.children` [required]
+
+The immediate child groups of this group in the hierarchy (whose `parent` field
+points to this group). The list must be present, but may be empty if there are
+no child groups. The items are not guaranteed to be ordered in any particular
+way.
+
+The entries of this array are
+[entity references](https://backstage.io/docs/features/software-catalog/references),
+with the default kind `Group` and the default namespace equal to the same
+namespace as the user. Only `Group` entities may be referenced. Most commonly,
+these entries point to groups in the same namespace, so in those cases it is
+sufficient to enter only the `metadata.name` field of those groups.
+
+### `spec.descendants` [required]
+
+The immediate and recursive child groups of this group in the hierarchy
+(children, and children's children, etc.). The list must be present, but may be
+empty if there are no child groups. The items are not guaranteed to be ordered
+in any particular way.
+
+The entries of this array are
+[entity references](https://backstage.io/docs/features/software-catalog/references),
+with the default kind `Group` and the default namespace equal to the same
+namespace as the user. Only `Group` entities may be referenced. Most commonly,
+these entries point to groups in the same namespace, so in those cases it is
+sufficient to enter only the `metadata.name` field of those groups.
+
+## Kind: User
+
+Describes the following entity kind:
+
+| Field | Value |
+| ------------ | ----------------------- |
+| `apiVersion` | `backstage.io/v1alpha1` |
+| `kind` | `User` |
+
+A user describes a person, such as an employee, a contractor, or similar. Users
+belong to [`Group`](#kind-group) entities in the catalog.
+
+These catalog user entries are connected to the way that authentication within
+the Backstage ecosystem works. See the [auth](https://backstage.io/docs/auth)
+section of the docs for a discussion of these concepts.
+
+Descriptor files for this kind may look as follows.
+
+```yaml
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: jdoe
+spec:
+ profile:
+ displayName: Jenny Doe
+ email: jenny-doe@example.com
+ picture: https://example.com/staff/jenny-with-party-hat.jpeg
+ memberOf: [team-b, employees]
+```
+
+In addition to the [common envelope metadata](#common-to-all-kinds-the-metadata)
+shape, this kind has the following structure.
+
+### `apiVersion` and `kind` [required]
+
+Exactly equal to `backstage.io/v1alpha1` and `User`, respectively.
+
+### `spec.profile` [optional]
+
+Optional profile information about the user, mainly for display purposes. All
+fields of this structure are also optional. The email would be a primary email
+of some form, that the user may wish to be used for contacting them. The picture
+is expected to be a URL pointing to an image that's representative of the user,
+and that a browser could fetch and render on a profile page or similar.
+
+### `spec.memberOf` [required]
+
+The list of groups that the user is a direct member of (i.e., no transitive
+memberships are listed here). The list must be present, but may be empty if the
+user is not member of any groups. The items are not guaranteed to be ordered in
+any particular way.
+
+The entries of this array are
+[entity references](https://backstage.io/docs/features/software-catalog/references),
+with the default kind `Group` and the default namespace equal to the same
+namespace as the user. Only `Group` entities may be referenced. Most commonly,
+these entries point to groups in the same namespace, so in those cases it is
+sufficient to enter only the `metadata.name` field of those groups.
diff --git a/docs/features/software-catalog/extending-the-model.md b/docs/features/software-catalog/extending-the-model.md
index 4e8a357ea7..b045660202 100644
--- a/docs/features/software-catalog/extending-the-model.md
+++ b/docs/features/software-catalog/extending-the-model.md
@@ -16,11 +16,9 @@ Backstage natively supports tracking of the following component

Since these types are likely not the only kind of software you will want to
-track in Backstage, it is possible to
-
-It is possible to add your own software types that fits your organization's data
-model. Inside Spotify our model has grown significantly over the years, and now
-includes ML models, Apps, data pipelines and many more.
+track in Backstage, it is possible to add your own software types that fit your
+organization's data model. Inside Spotify our model has grown significantly over
+the years, and now includes ML models, Apps, data pipelines and many more.
## Adding a new type
@@ -30,7 +28,7 @@ catalog.
## The Other type
It might be tempting to put software that doesn't fit into any of the existing
-types into Other. There are a few reasons why we advice against this; firstly,
+types into Other. There are a few reasons why we advise against this; firstly,
we have found that it is preferred to match the conceptual model that your
engineers have when describing your software. Secondly, Backstage helps your
engineers manage their software by integrating the infrastructure tooling
diff --git a/docs/features/software-catalog/index.md b/docs/features/software-catalog/index.md
index 49a490d78b..4ba83146db 100644
--- a/docs/features/software-catalog/index.md
+++ b/docs/features/software-catalog/index.md
@@ -84,13 +84,13 @@ registered in the catalog.
### Static catalog configuration
In addition to manually registering components, it is also possible to register
-components though [static configuration](../../conf/index.md). For example, the
+components through [static configuration](../../conf/index.md). For example, the
above example can be added using the following configuration:
```yaml
catalog:
locations:
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
```
diff --git a/docs/features/software-catalog/installation.md b/docs/features/software-catalog/installation.md
index a825020eb6..26990033aa 100644
--- a/docs/features/software-catalog/installation.md
+++ b/docs/features/software-catalog/installation.md
@@ -166,21 +166,21 @@ our example templates through static configuration. Add the following to the
catalog:
locations:
# Backstage Example Component
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/playback-order-component.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/podcast-api-component.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/queue-proxy-component.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/searcher-component.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/playback-lib-component.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/www-artist-component.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/shuffle-api-component.yaml
```
diff --git a/docs/features/software-catalog/references.md b/docs/features/software-catalog/references.md
new file mode 100644
index 0000000000..e438ddc977
--- /dev/null
+++ b/docs/features/software-catalog/references.md
@@ -0,0 +1,104 @@
+---
+id: references
+title: Entity References
+description: How to express references between entities
+---
+
+Entities commonly have a need to reference other entities. For example, a
+[Component](descriptor-format.md#kind-component) entity may want to declare who
+its owner is by mentioning a Group or User entity, and a User entity may want to
+declare what Group entities it is a member of. This article describes how to
+write those references in your yaml entity declaration files.
+
+Each entity in the catalog is uniquely identified by the triplet of its
+[kind](descriptor-format.md#apiversion-and-kind-required),
+[namespace](descriptor-format.md#namespace-optional), and
+[name](descriptor-format.md#name-required). But that's a lot to type out
+manually, and in a lot of circumstances, both the kind and the namespace are
+fixed, or possible to deduce, or could have sane default values. So in order to
+help the writer, the catalog has a few tricks up its sleeve.
+
+Each reference can be expressed in one of two ways: as a compact string, or as a
+compound reference structure.
+
+## String References
+
+This is the most common alternative, that should be used in almost all
+circumstances.
+
+The string is on the form `[:][/]`, that is, it is
+composed of between one and three parts in this specific order, without any
+additional encoding:
+
+- Optionally, the kind, followed by a colon
+- Optionally, the namespace, followed by a forward slash
+- The name
+
+The name is always required. Depending on the context, you may be able to leave
+out the kind and/or namespace. If you do, it is contextual what values will be
+used, and the relevant documentation should specify which rule applies where.
+All strings are case insensitive.
+
+```yaml
+# Example:
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: petstore
+ namespace: external-systems
+ description: Petstore
+spec:
+ type: service
+ lifecycle: experimental
+ owner: group:pet-managers
+ implementsApis:
+ - petstore
+ - internal/streetlights
+ - hello-world
+```
+
+The field `spec.owner` is a reference. In this case, the string
+`group:pet-managers` was given by the user. That means that the kind is `Group`,
+the namespace is left out, and the name is `pet-managers`. In this context, the
+namespace was chosen to fall back to the value `default` by the code that parsed
+the reference, so the end result is that we expect to find another entity in the
+catalog that is of kind `Group`, namespace `default` (which, actually, also can
+be left out in its own yaml file because that's the default value there too),
+and name `pet-managers`.
+
+The entries in `implementsApis` are also references. In this case, none of them
+needs to specify a kind since we know from the context that that's the only kind
+that's supported here. The second entry specifies a namespace but the other ones
+don't, and in this context, the default is to refer to the same namespace as the
+originating entity (`external-systems` here). So the three references
+essentially expand to `api:external-systems/petstore`,
+`api:internal/streetlights`, and `api:external-systems/hello-world`. We expect
+there to exist three API kind entities in the catalog matching those references.
+
+## Compound References
+
+This is a more verbose version of a reference, where each part of the
+kind-namespace-name triplet is expressed as a field in a structure. This format
+can be used where necessary, such as if either of the three elements contains
+colons or forward slashes. Avoid using it where possible, since it is harder to
+read and write for humans.
+
+```yaml
+# Example:
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: petstore
+ description: Petstore
+spec:
+ type: service
+ lifecycle: experimental
+ owner:
+ kind: Group
+ name: aegis-imports/pet-managers
+```
+
+In this example, the `spec.owner` has been broken apart since the name was
+complex. The kind happened to be written with an uppercase letter G, which also
+works. The namespace was left out just like in the string version above, which
+is handled identically.
diff --git a/docs/features/software-catalog/well-known-annotations.md b/docs/features/software-catalog/well-known-annotations.md
index ba5b491e07..757e0461a9 100644
--- a/docs/features/software-catalog/well-known-annotations.md
+++ b/docs/features/software-catalog/well-known-annotations.md
@@ -41,6 +41,27 @@ expecting a two-item array out of it. The format of the target part is
type-dependent and could conceivably even be an empty string, but the separator
colon is always present.
+### backstage.io/definition-at-location
+
+```yaml
+# Example
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: petstore
+ annotations:
+ backstage.io/definition-at-location: 'url:https://petstore.swagger.io/v2/swagger.json'
+spec:
+ type: openapi
+```
+
+This annotation allows to fetch an API definition from another location, instead
+of wrapping the API definition inside the definition field. This allows to
+easily consume existing API definition. The definition is fetched during
+ingestion by a processor and included in the entity. It is updated on every
+refresh. The annotation contains a location reference string that contains the
+location processor type and the target.
+
### backstage.io/techdocs-ref
```yaml
@@ -79,13 +100,50 @@ metadata:
```
The value of this annotation is the so-called slug that identifies a project on
-[GitHub](https://github.com) that is related to this entity. It is on the format
+[GitHub](https://github.com) (either the public one, or a private GitHub
+Enterprise installation) that is related to this entity. It is on the format
`/`, and is the same as can be seen in the URL location
bar of the browser when viewing that project.
Specifying this annotation will enable GitHub related features in Backstage for
that entity.
+### github.com/team-slug
+
+```yaml
+# Example:
+metadata:
+ annotations:
+ github.com/team-slug: spotify/backstage-core
+```
+
+The value of this annotation is the so-called slug that identifies a team on
+[GitHub](https://github.com) (either the public one, or a private GitHub
+Enterprise installation) that is related to this entity. It is on the format
+`/`, and is the same as can be seen in the URL location bar
+of the browser when viewing that team.
+
+This annotation can be used on a [Group entity](descriptor-format.md#kind-group)
+to note that it originated from that team on GitHub.
+
+### github.com/user-login
+
+```yaml
+# Example:
+metadata:
+ annotations:
+ github.com/user-login: freben
+```
+
+The value of this annotation is the so-called login that identifies a user on
+[GitHub](https://github.com) (either the public one, or a private GitHub
+Enterprise installation) that is related to this entity. It is on the format
+``, and is the same as can be seen in the URL location bar of the
+browser when viewing that user.
+
+This annotation can be used on a [User entity](descriptor-format.md#kind-user)
+to note that it originated from that user on GitHub.
+
### sentry.io/project-slug
```yaml
@@ -121,6 +179,21 @@ fallback (`rollbar.organization` followed by `organization.name`).
Specifying this annotation may enable Rollbar related features in Backstage for
that entity.
+### backstage.io/ldap-rdn, backstage.io/ldap-uuid, backstage.io/ldap-dn
+
+```yaml
+# Example:
+metadata:
+ annotations:
+ backstage.io/ldap-rdn: my-team
+ backstage.io/ldap-uuid: c57e8ba2-6cc4-1039-9ebc-d5f241a7ca21
+ backstage.io/ldap-dn: cn=my-team,ou=access,ou=groups,ou=spotify,dc=spotify,dc=net
+```
+
+The value of these annotations are the corresponding attributes that were found
+when ingestion the entity from LDAP. Not all of them may be present, depending
+on what attributes that the server presented at ingestion time.
+
## Deprecated Annotations
The following annotations are deprecated, and only listed here to aid in
diff --git a/docs/features/software-templates/adding-templates.md b/docs/features/software-templates/adding-templates.md
index fad5c68e41..5a4e0049ab 100644
--- a/docs/features/software-templates/adding-templates.md
+++ b/docs/features/software-templates/adding-templates.md
@@ -5,7 +5,7 @@ description: Documentation on Adding your own Templates
---
Templates are stored in the **Service Catalog** under a kind `Template`. The
-minimum that the a template skeleton needs is a `template.yaml` but it would be
+minimum that the template skeleton needs is a `template.yaml` but it would be
good to also have some files in there that can be templated in.
A simple `template.yaml` definition might look something like this:
@@ -30,7 +30,7 @@ spec:
templater: cookiecutter
# what does this template create
type: website
- # if the template is not in the current directory where this definition is kept then specfiy
+ # if the template is not in the current directory where this definition is kept then specify
path: './template'
# the schema for the form which is displayed in the frontend.
# should follow JSON schema for forms: https://jsonforms.io/
@@ -66,7 +66,7 @@ for example
```yaml
catalog:
locations:
- - type: github
+ - type: url
target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml
rules:
- allow: [Template]
@@ -88,7 +88,7 @@ running:
```sh
curl \
--location \
- --request POST 'localhost:7000/catalog/locations' \
+ --request POST 'localhost:7000/api/catalog/locations' \
--header 'Content-Type: application/json' \
--data-raw "{\"type\": \"file\", \"target\": \"${YOUR PATH HERE}/template.yaml\"}"
```
@@ -98,7 +98,7 @@ If loading from a Git location, you can run the following
```sh
curl \
--location \
- --request POST 'localhost:7000/catalog/locations' \
+ --request POST 'localhost:7000/api/catalog/locations' \
--header 'Content-Type: application/json' \
--data-raw "{\"type\": \"github\", \"target\": \"https://${YOUR GITHUB REPO}blob/master/${PATH TO FOLDER}/template.yaml\"}"
```
@@ -107,7 +107,7 @@ This should then have added the catalog, and also should now be listed under the
create page at http://localhost:3000/create.
The `type` field which is chosen in the request to add the `template.yaml` to
-the Service Catalog here, will be come the `PreparerKey` which will be used to
+the Service Catalog here, will become the `PreparerKey` which will be used to
select the `Preparer` when creating a job.
### Adding form values in the Scaffolder Wizard
diff --git a/docs/features/software-templates/extending/create-your-own-preparer.md b/docs/features/software-templates/extending/create-your-own-preparer.md
index 14c75b0ffb..80287c6ce1 100644
--- a/docs/features/software-templates/extending/create-your-own-preparer.md
+++ b/docs/features/software-templates/extending/create-your-own-preparer.md
@@ -17,7 +17,7 @@ location protocols:
These two are added to the `PreparersBuilder` and then passed into the
`createRouter` function of the `@spotify/plugin-scaffolder-backend`
-An full example backend can be found
+A full example backend can be found
[here](https://github.com/spotify/backstage/blob/d91c10f654475a60829fa33a5c81018e517a319a/packages/backend/src/plugins/scaffolder.ts),
but it looks something like the following
@@ -88,7 +88,7 @@ Some good examples exist here:
- https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/prepare/file.ts
- https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/prepare/github.ts
-### Registerinng your own Preparer
+### Registering your own Preparer
You can register the preparer that you have created with the `PreparerBuilder`
by using the `PreparerKey` from the Catalog, for example like this:
@@ -98,4 +98,4 @@ const preparers = new Preparers();
preparers.register('gcs', new GoogleCloudStoragePreparer());
```
-And then pass this in to the `createRouter` function.
+And then pass this into the `createRouter` function.
diff --git a/docs/features/software-templates/extending/create-your-own-publisher.md b/docs/features/software-templates/extending/create-your-own-publisher.md
index 25d7bcf676..ecb097f9d9 100644
--- a/docs/features/software-templates/extending/create-your-own-publisher.md
+++ b/docs/features/software-templates/extending/create-your-own-publisher.md
@@ -8,10 +8,10 @@ Publishers are responsible for pushing and storing the templated skeleton after
the values have been templated by the `Templater`. See
[Create your own templater](./create-your-own-templater.md) for more info.
-They receive a directory or location where the templater has sucessfully run and
-is now ready to store somewhere. They also are given some other options which
-are sent from the frontend, such as the `storePath` which is a string of where
-the frontend thinks we should save this templated folder.
+They receive a directory or location where the templater has successfully run
+and is now ready to store somewhere. They also are given some other options
+which are sent from the frontend, such as the `storePath` which is a string of
+where the frontend thinks we should save this templated folder.
Currently we provide the following `publishers`:
diff --git a/docs/features/software-templates/extending/create-your-own-templater.md b/docs/features/software-templates/extending/create-your-own-templater.md
index 36c362b9c3..d4a6eef5d2 100644
--- a/docs/features/software-templates/extending/create-your-own-templater.md
+++ b/docs/features/software-templates/extending/create-your-own-templater.md
@@ -147,4 +147,4 @@ const templaters = new Templaters();
templaters.register('handlebars', new HandlebarsTemplater());
```
-And then pass this in to the `createRouter` function.
+And then pass this into the `createRouter` function.
diff --git a/docs/features/software-templates/extending/index.md b/docs/features/software-templates/extending/index.md
index 02d27a5725..944bf0e3ca 100644
--- a/docs/features/software-templates/extending/index.md
+++ b/docs/features/software-templates/extending/index.md
@@ -11,13 +11,13 @@ You're at the right place.
This guide is going to take you through how the Scaffolder in Backstage works.
We'll dive into some jargon and run through what's going on in the backend to be
able to create these templates. There's also more guides that you might find
-useful at the bottom of this document. At it's core, theres 3 simple stages.
+useful at the bottom of this document. At its core, there are 3 simple stages.
1. Pick a skeleton
2. Template some variables into the skeleton
3. Send the templated skeleton somewhere
-These three steps are translated to the folllowing stages under the hood in the
+These three steps are translated to the following stages under the hood in the
scaffolder that you will need to know:
1. Prepare
@@ -38,7 +38,7 @@ the router to pick the correct `Preparer` to run for the `Template` entity.
**Templater** - The templater is responsible for actually running the chosen
templater on top of the previously returned temporary directory from the
-**Preprarer**. We advise making these Docker containers as it can keep all
+**Preparer**. We advise making these Docker containers as it can keep all
dependencies--for example Cookiecutter--self contained and not a dependency on
the host machine.
@@ -82,7 +82,7 @@ Once that has been posted, a job will be setup with different stages, and the
job processor will complete each stage before moving onto the next stage, whilst
collecting logs and mutating the running job.
-Here's some futher reading that you might find useful:
+Here's some further reading that you might find useful:
- [Adding your own Template](../adding-templates.md)
- [Creating your own Templater](./create-your-own-templater.md)
diff --git a/docs/features/software-templates/installation.md b/docs/features/software-templates/installation.md
index 5453c4befa..60f73ad0c3 100644
--- a/docs/features/software-templates/installation.md
+++ b/docs/features/software-templates/installation.md
@@ -94,7 +94,7 @@ import {
GitlabPublisher,
CreateReactAppTemplater,
Templaters,
- RepoVisilityOptions,
+ RepoVisibilityOptions,
} from '@backstage/plugin-scaffolder-backend';
import { Octokit } from '@octokit/rest';
import { Gitlab } from '@gitbeaker/node';
@@ -126,7 +126,7 @@ export default async function createPlugin({
const githubToken = config.getString('scaffolder.github.token');
const repoVisibility = config.getString(
'scaffolder.github.visibility',
- ) as RepoVisilityOptions;
+ ) as RepoVisibilityOptions;
const githubClient = new Octokit({ auth: githubToken });
const githubPublisher = new GithubPublisher({
@@ -191,13 +191,13 @@ our example templates through static configuration. Add the following to the
catalog:
locations:
# Backstage Example Templates
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/react-ssr-template/template.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/springboot-grpc-template/template.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/create-react-app/template.yaml
- - type: github
+ - type: url
target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml
```
@@ -217,6 +217,11 @@ The Github access token is retrieved from environment variables via the config.
The config file needs to specify what environment variable the token is
retrieved from. Your config should have the following objects.
+You can configure who can see the new repositories that the scaffolder creates
+by specifying `visibility` option. Valid options are `public`, `private` and
+`internal`. `internal` options is for GitHub Enterprise clients, which means
+public within the organization.
+
#### Gitlab
For Gitlab, we currently support the configuration of the GitLab publisher and
@@ -227,21 +232,31 @@ instance:
scaffolder:
github:
token:
- $secret:
- env: GITHUB_ACCESS_TOKEN
+ $env: GITHUB_ACCESS_TOKEN
visibility: public # or 'internal' or 'private'
gitlab:
api:
baseUrl: https://gitlab.com
token:
- $secret:
- env: SCAFFOLDER_GITLAB_PRIVATE_TOKEN
+ $env: SCAFFOLDER_GITLAB_PRIVATE_TOKEN
```
-You can configure who can see the new repositories that the scaffolder creates
-by specifying `visibility` option. Valid options are `public`, `private` and
-`internal`. `internal` options is for GitHub Enterprise clients, which means
-public within the organization.
+#### Azure DevOps
+
+For Azure DevOps we support both the preparer and publisher stage with the
+configuration of a private access token (PAT). For the publisher it's also
+required to define the base URL for the client to connect to the service. This
+will hopefully support on-prem installations as well but that has not been
+verified.
+
+```yaml
+scaffolder:
+ azure:
+ baseUrl: https://dev.azure.com/{your-organization}
+ api:
+ token:
+ $env: AZURE_PRIVATE_TOKEN
+```
### Running the Backend
diff --git a/docs/features/techdocs/FAQ.md b/docs/features/techdocs/FAQ.md
index 5d6c9136d9..e81e9d82c7 100644
--- a/docs/features/techdocs/FAQ.md
+++ b/docs/features/techdocs/FAQ.md
@@ -11,14 +11,15 @@ This page answers frequently asked questions about [TechDocs](README.md).
- [What static site generator is TechDocs using?](#what-static-site-generator-is-techdocs-using)
- [What is the mkdocs-techdocs-core plugin?](#what-is-the-mkdocs-techdocs-core-plugin)
-- [Does TechDocs support file formats other than Markdown (e.g. rst, asciidoc)?](#does-techdocs-support-file-formats-other-than-markdown-eg-rst-asciidoc-)
+- [Does TechDocs support file formats other than Markdown (e.g. RST, AsciiDoc)?](#does-techdocs-support-file-formats-other-than-markdown-eg-rst-asciidoc-)
#### What static site generator is TechDocs using?
TechDocs is using [MkDocs](https://www.mkdocs.org/) to build project
documentation under the hood. Documentation built with the
[techdocs-container](https://github.com/spotify/backstage/blob/master/packages/techdocs-container/README.md)
-is using the MkDocs Material Theme.
+is using the MkDocs
+[Material Theme](https://github.com/squidfunk/mkdocs-material).
#### What is the mkdocs-techdocs-core plugin?
@@ -29,9 +30,9 @@ plugins (e.g.
[MkDocs Monorepo Plugin](https://github.com/spotify/mkdocs-monorepo-plugin)) as
well as a selection of Python Markdown extensions that TechDocs supports.
-#### Does TechDocs support file formats other than Markdown (e.g. rst, asciidoc) ?
+#### Does TechDocs support file formats other than Markdown (e.g. RST, AsciiDoc) ?
Not right now. We are currently using MkDocs to generate the documentation from
-source. So, they have to be in Markdown format. However, in future we want to
-support other alternatives to MkDocs. That will make it possible to use other
-file formats.
+source, so the files have to be in Markdown format. However, in the future we
+want to support other static site generators which will make it possible to use
+other file formats.
diff --git a/docs/features/techdocs/README.md b/docs/features/techdocs/README.md
index aa97506edb..cec5b63cc7 100644
--- a/docs/features/techdocs/README.md
+++ b/docs/features/techdocs/README.md
@@ -33,16 +33,17 @@ about TechDocs and the philosophy in its
## Project roadmap
-| Version | Description |
-| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
-| [TechDocs V.0 â ][v0] | Read docs in Backstage - Enable anyone to get a reader experience working in Backstage. [See V.0 Use Cases.](#techdocs-v0) |
-| [TechDocs V.1 â ][v1] | TechDocs end to end (alpha) - Alpha of TechDocs that you can use end to end - and contribute to. [See V.1 Use Cases.](#techdocs-v1) |
-| [TechDocs V.2 đŽâ][v2] | Platform stability and compatibility improvements. [See V.2 Use Cases.](#techdocs-v2) |
-| TechDocs V.3 đŽâ | Widget Architecture - TechDocs widget architecture available, so the community can create their own customized features. |
+| Version | Description |
+| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [TechDocs V.0 â ][v0] | Read docs in Backstage - Enable anyone to get a reader experience working in Backstage. [See V.0 Use Cases.](#techdocs-v0) |
+| [TechDocs V.1 â ][v1] | TechDocs end to end (alpha) - Alpha of TechDocs that you can use end to end - and contribute to. [See V.1 Use Cases.](#techdocs-v1) |
+| [TechDocs V.2 đŽâ][v2] | Easy adoption of TechDocs (whatever environment you have) [See V.2 Use Cases.](#techdocs-v2) |
+| [TechDocs V.3 đŽâ][v3] | Build a widget (plugin) framework so that contributors can easily contribute features to TechDocs - that others can use. [See V.3 Use Cases.](#techdocs-v3) |
[v0]: https://github.com/spotify/backstage/milestone/15
[v1]: https://github.com/spotify/backstage/milestone/16
-[v2]: https://github.com/spotify/backstage/milestone/17
+[v2]: https://github.com/spotify/backstage/milestone/22
+[v3]: https://github.com/spotify/backstage/milestone/17
@@ -59,26 +60,39 @@ about TechDocs and the philosophy in its
- As a user I can run TechDocs locally and read documentation.
- As a user I can create a docs folder in my entity project and add a reference
in the entity configuration file (of the owning entity) to my documentation.
- - Backstage will automatically build my documentation and serve it in
- TechDocs.
- - Documentation will be displayed under the docs tab in the service catalog.
+- Backstage will automatically build my documentation and serve it in TechDocs.
+- Documentation will be displayed under the docs tab in the service catalog.
- As a user I can create a docs only repository that will be standalone from any
other service.
- As a user I can choose my own storage solution for the documentation (as
example GCS/AWS/Azure etc)
- As a user I can define my own API to interface my own documentation solution.
-#### TechDocs V.2
-
-Platform stability and compatibility improvements
+Extra platform stability and compatibility improvements:
- As a user I can define the metadata generated for my documentation.
- As a user I will be able to browse metadata from within my documentation in
Backstage.
+#### TechDocs V.2
+
+We have a TechDocs that works end-to-end. The next step is to make it super easy
+for companies to adopt. This involves (something like) the following work items.
+
+- âSolidifyâ work and âMkdocs stabilizationâ work that has come out of our Q3
+ end-to-end work.
+- Improve/simplify the get up and running process.
+- Introduce doc template Software Templates.
+- Enable companies to choose their own storage (S3 for example).
+- Enable companies to choose their own source code hosting provider (GitHub,
+ GitLab, and so).
+- Share how to plug in TechDocs to your own CI.
+
#### TechDocs V.3
-more to come...
+Build a widget (plugin) framework so that contributors can easily contribute
+features to TechDocs - that others can use. And, also, so that we can easily
+migrate Spotify's existing TechDocs features to open source.
## Structure
diff --git a/docs/features/techdocs/concepts.md b/docs/features/techdocs/concepts.md
index f13f9933f5..13144f8df0 100644
--- a/docs/features/techdocs/concepts.md
+++ b/docs/features/techdocs/concepts.md
@@ -25,7 +25,14 @@ MkDocs.
[TechDocs Container](https://github.com/spotify/backstage/blob/master/packages/techdocs-container/README.md)
-### TechDocs publisher (coming soon)
+### TechDocs publisher
+
+The `techdocs-backend` plugin currently comes with one publisher -
+`LocalPublish`.
+
+[TechDocs Backend](https://github.com/spotify/backstage/tree/master/plugins/techdocs-backend)
+
+More standalone publishers will come in the near future...
### TechDocs CLI
diff --git a/docs/features/techdocs/getting-started.md b/docs/features/techdocs/getting-started.md
index b9d215fd8a..2e5c8d000d 100644
--- a/docs/features/techdocs/getting-started.md
+++ b/docs/features/techdocs/getting-started.md
@@ -13,7 +13,7 @@ If you haven't setup Backstage already, start
## Installing TechDocs
TechDocs is provided with the Backstage application by default. If you want to
-set up TechDocs manually, keep follow the instructions below.
+set up TechDocs manually, keep following the instructions below.
### Adding the package
@@ -57,8 +57,8 @@ The default storage and request URLs:
```yaml
techdocs:
- storageUrl: http://localhost:7000/techdocs/static/docs
- requestUrl: http://localhost:7000/techdocs/docs
+ storageUrl: http://localhost:7000/api/techdocs/static/docs
+ requestUrl: http://localhost:7000/api/techdocs/docs
```
If you want `techdocs-backend` to manage building and publishing, you want
diff --git a/docs/features/techdocs/troubleshooting.md b/docs/features/techdocs/troubleshooting.md
new file mode 100644
index 0000000000..3a9b2fcfd0
--- /dev/null
+++ b/docs/features/techdocs/troubleshooting.md
@@ -0,0 +1,10 @@
+---
+id: troubleshooting
+title: Troubleshooting TechDocs
+sidebar_label: Troubleshooting
+description: Troubleshooting for TechDocs
+---
+
+- TechDocs will fail to clone your docs if you have a git config which overrides
+ the `https` protocol with `ssh` or something else. Make sure to remove your
+ git config locally when you try TechDocs.
diff --git a/docs/getting-started/create-an-app.md b/docs/getting-started/create-an-app.md
index 452e90add5..9be0e24452 100644
--- a/docs/getting-started/create-an-app.md
+++ b/docs/getting-started/create-an-app.md
@@ -38,6 +38,34 @@ app-folder is the name that was provided when prompted.
Inside that directory, it will generate all the files and folder structure
needed for you to run your app.
+### Troubleshooting
+
+The create app command doesn't always work as expected, this is a collection of
+some of the commonly encountered issues and solutions.
+
+#### Couldn't find any versions for "file-saver"
+
+You may encounter the following error message:
+
+```text
+Couldn't find any versions for "file-saver" that matches "eligrey-FileSaver.js-1.3.8.tar.gz-art-external"
+```
+
+This is likely because you have a globally configured NPM proxy, which breaks
+the installation of the `material-table` dependency. This is a known issue and
+being worked on in `material-table`, but for now you can work around it using
+the following:
+
+```bash
+NPM_CONFIG_REGISTRY=https://registry.npmjs.org npx @backstage/create-app
+```
+
+#### Can't find Python executable "python"
+
+The install process may also fail if no Python installation is available. Python
+is commonly available in most systems already, but if it isn't you can head for
+example [here](https://www.python.org/downloads/) to install it.
+
### General folder structure
Below is a simplified layout of the files and folders generated when creating an
@@ -46,6 +74,7 @@ app.
```
app
âââ app-config.yaml
+âââ catalog-info.yaml
âââ lerna.json
âââ package.json
âââ packages
@@ -55,6 +84,9 @@ app
- **app-config.yaml**: Main configuration file for the app. See
[Configuration](https://backstage.io/docs/conf/) for more information.
+- **catalog-info.yaml**: Catalog Entities descriptors. See
+ [Descriptor Format of Catalog Entities](https://backstage.io/docs/features/software-catalog/descriptor-format)
+ to get started.
- **lerna.json**: Contains information about workspaces and other lerna
configuration needed for the monorepo setup.
- **package.json**: Root package.json for the project. _Note: Be sure that you
diff --git a/docs/getting-started/development-environment.md b/docs/getting-started/development-environment.md
index 154a959f85..aa9aa0bde1 100644
--- a/docs/getting-started/development-environment.md
+++ b/docs/getting-started/development-environment.md
@@ -88,3 +88,17 @@ yarn create-plugin # Create a new plugin
> See
> [package.json](https://github.com/spotify/backstage/blob/master/package.json)
> for other yarn commands/options.
+
+## Local configuration
+
+Backstage allows you to specify the configuration used while running the
+application on your computer. Local configuration is read from
+`app-config.local.yaml`. This file is ignored by Git, which means that you can
+safely use it to reference secrets like GitHub tokens without worrying about
+these secrets, inadvertently ending up in the Git repository. You do not need to
+copy everything from the default config to the local config.
+`app-config.local.yaml` will be merged with `app-config.yaml` and overwrite the
+default app configs.
+
+You can learn more about the local configuration in
+[Static Configuration in Backstage](../conf/) section.
diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md
index a9ac770f90..4ca2f431a7 100644
--- a/docs/getting-started/index.md
+++ b/docs/getting-started/index.md
@@ -24,9 +24,11 @@ Requests towards this repo.
Backstage provides the `@backstage/create-app` package to scaffold standalone
instances of Backstage. You will need to have
[NodeJS](https://nodejs.org/en/download/) Active LTS Release installed
-(currently v12), and [yarn](https://classic.yarnpkg.com/en/docs/install). You
-will also need to have [Docker](https://docs.docker.com/engine/install/)
-installed to use some features like Software Templates and TechDocs.
+(currently v12), [yarn](https://classic.yarnpkg.com/en/docs/install) and
+[Python](https://www.python.org/downloads/) (although you likely have it
+already). You will also need to have
+[Docker](https://docs.docker.com/engine/install/) installed to use some features
+like Software Templates and TechDocs.
Using `npx` you can then run the following to create an app in a chosen
subdirectory of your current working directory:
diff --git a/docs/getting-started/running-backstage-locally.md b/docs/getting-started/running-backstage-locally.md
index a0cf10998e..6e6c8b2733 100644
--- a/docs/getting-started/running-backstage-locally.md
+++ b/docs/getting-started/running-backstage-locally.md
@@ -42,7 +42,7 @@ of GitHub and run an initial build.
```bash
# Start from your local development folder
-git clone git@github.com:spotify/backstage.git
+git clone --depth 1 git@github.com:spotify/backstage.git
cd backstage
# Fetch our dependencies and run an initial build
diff --git a/docs/openapi/definitions/auth.yaml b/docs/openapi/definitions/auth.yaml
index eb96d434c2..cb736fd2a9 100644
--- a/docs/openapi/definitions/auth.yaml
+++ b/docs/openapi/definitions/auth.yaml
@@ -6,10 +6,10 @@ info:
**Provided by `@backstage/auth-backend`.**
- The purpose of the Auth APIs in Backstage are to identify the user, and to provide a way for plugins
+ The purpose of the Auth APIs in Backstage are to identify the user, and to provide a way for plugins
to request access to 3rd party services on behalf of that user.
- The API is supplied with a list of providers - such as `Google` or `Github` - and will add the endpoints
+ The API is supplied with a list of providers - such as `Google` or `Github` - and will add the endpoints
described below to each of those providers.
Read more about [User Authentication and Authorization in Backstage](https://github.com/spotify/backstage/blob/master/docs/auth/overview.md).
@@ -21,7 +21,7 @@ externalDocs:
description: Backstage official documentation
url: https://github.com/spotify/backstage/blob/master/docs/README.md
servers:
- - url: http://localhost:7000/auth/
+ - url: http://localhost:7000/api/auth/
tags:
- name: provider
description: List of endpoints per provider
diff --git a/docs/overview/architecture-overview.md b/docs/overview/architecture-overview.md
index f2c6dad61f..8edf3e9e4c 100644
--- a/docs/overview/architecture-overview.md
+++ b/docs/overview/architecture-overview.md
@@ -4,6 +4,23 @@ title: Architecture overview
description: Documentation on Architecture overview
---
+## Terminology
+
+Backstage is constructed out of three parts. We separate Backstage in this way
+because we see three groups of contributors that work with Backstage in three
+different ways.
+
+- Core - Base functionality built by core developers in the open source project.
+- App - The app is an instance of a Backstage app that is deployed and tweaked.
+ The app ties together core functionality with additional plugins. The app is
+ built and maintained by app developers, usually a productivity team within a
+ company.
+- Plugins - Additional functionality to make your Backstage app useful for your
+ company. Plugins can be specific to a company or open sourced and reusable. At
+ Spotify we have over 100 plugins built by over 50 different teams. It has been
+ very powerful to get contributions from various infrastructure teams added
+ into a single unified developer experience.
+
## Overview
The following diagram shows how Backstage might look when deployed inside a
diff --git a/docs/overview/architecture-terminology.md b/docs/overview/architecture-terminology.md
deleted file mode 100644
index 092ca7fb01..0000000000
--- a/docs/overview/architecture-terminology.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-id: architecture-terminology
-title: Architecture terminology
-description: Documentation on Architecture terminology
----
-
-Backstage is constructed out of three parts. We separate Backstage in this way
-because we see three groups of contributors that work with Backstage in three
-different ways.
-
-- Core - Base functionality built by core devs in the open source project.
-- App - The app is an instance of a Backstage app that is deployed and tweaked.
- The app ties together core functionality with additional plugins. The app is
- built and maintained by app developers, usually a productivity team within a
- company.
-- Plugins - Additional functionality to make your Backstage app useful for your
- company. Plugins can be specific to a company or open sourced and reusable. At
- Spotify we have over 100 plugins built by over 50 different teams. It has been
- very powerful to get contributions from various infrastructure teams added
- into a single unified developer experience.
diff --git a/docs/overview/background.md b/docs/overview/background.md
index 486260bac3..aca46614c2 100644
--- a/docs/overview/background.md
+++ b/docs/overview/background.md
@@ -1,7 +1,8 @@
---
id: background
title: The Spotify Story
-description: Documentation on Background and Story behind making of Backstage
+description: Backstage was born out of necessity at Spotify. We found that as we grew, our
+infrastructure was becoming more fragmented, our engineers less productive.
---
Backstage was born out of necessity at Spotify. We found that as we grew, our
@@ -29,3 +30,9 @@ building a new microservice using an automated template in Backstage. Create,
maintain, and find the documentation for all that software in Backstage.
One place for everything. Accessible to everyone.
+
+Backstage was originally built by Spotify and then donated to the CNCF.
+Backstage is currently in the Sandbox phase. Read the announcement
+[here](https://backstage.io/blog/2020/09/23/backstage-cncf-sandbox).
+
+
diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md
index d6c1d2d641..1c90916fb5 100644
--- a/docs/overview/roadmap.md
+++ b/docs/overview/roadmap.md
@@ -27,10 +27,11 @@ We have divided the project into three high-level _phases_:
With a single catalog, Backstage makes it easy for a team to manage ten
services â and makes it possible for your company to manage thousands of them.
-- đ **Phase 3:** Ecosystem (later) - Everyone's infrastructure stack is
- different. By fostering a vibrant community of contributors we hope to provide
- an ecosystem of Open Source plugins/integrations that allows you to pick the
- tools that match your stack.
+- đ **Phase 3:** Ecosystem (ongoing, see
+ [Plugin Marketplace](https://backstage.io/plugins)) - Everyone's
+ infrastructure stack is different. By fostering a vibrant community of
+ contributors we hope to provide an ecosystem of Open Source
+ plugins/integrations that allows you to pick the tools that match your stack.
## Detailed roadmap
@@ -53,31 +54,24 @@ guidelines to get started.
it much easier to see how a plugin can be built that integrates with the
Backstage Service Catalog.
+- **[Kubernetes support](https://github.com/spotify/backstage/milestone/20)** -
+ Native support for Kubernetes, making it easier for developers to see and
+ manage their services running in k8s.
+
+- **[Helm charts](https://github.com/spotify/backstage/issues/2540)** - Provide
+ Helm charts for easy deployments of Backstage and its subsystems on
+ Kubernetes.
+
+- **[Backstage platform is stable](https://github.com/spotify/backstage/milestone/19)** -
+ The platform APIs and features are stable and can be depended on for
+ production use. After this plugins will require little to no maintenance.
+
- **Backstage Design System** - By providing design guidelines for common plugin
layouts together, rich set of reusable UI components
([Storybook](https://backstage.io/storybook)) and Figma design resources. The
Design System will make it easy to design and build plugins that are
consistent across the platform -- supporting both developers and designers.
-- **[TechDocs v1](https://github.com/spotify/backstage/milestone/16)** - Our
- docs-like-code feature TechDocs working end to end.
-
-- **[Initial GraphQL API](https://github.com/spotify/backstage/milestone/13)** -
- A GraphQL API will open up the rich metadata provided by Backstage in a single
- query. Plugins can easily query this API as well as extend the model where
- needed.
-
-- **Production deployments** - Provide instructions and default configurations
- (e.g. through Helm charts) for easy deployments of Backstage and its
- subsystems on Kubernetes.
-
-- **Cloud Cost Insights plugin (from Spotify)** - Spotify teams are fully
- responsible for their own software, including the cost of the cloud resources
- they use. By making our internal cost insights plugin available as open source
- you will also be able to treat cost as an engineering problem, and make it
- easy for your engineers to see their spend and where there's opportunity to
- reduce waste.
-
- Further improvements to platform documentation
### Plugins
@@ -96,10 +90,6 @@ Chances are that someone will jump in and help build it.
### Future work đŽ
-- **[Backstage platform is stable](https://github.com/spotify/backstage/milestone/19)** -
- The platform APIs and features are stable and can be depended on for
- production use. After this plugins will require little to no maintenance.
-
- **Deploy a product demo at `demo.backstage.io`** - Deploy a typical Backstage
deployment available publicly so that people can click around and get a feel
for the product without having to install anything.
@@ -118,8 +108,16 @@ Chances are that someone will jump in and help build it.
[AWS](https://github.com/spotify/backstage/issues/290),
[Azure](https://github.com/spotify/backstage/issues/348) and others.
+- **[Initial GraphQL API](https://github.com/spotify/backstage/milestone/13)** -
+ A GraphQL API will open up the rich metadata provided by Backstage in a single
+ query. Plugins can easily query this API as well as extend the model where
+ needed.
+
### Completed milestones â
+- [Cost Insights plugin đ¸](https://engineering.atspotify.com/2020/09/29/managing-clouds-from-the-ground-up-cost-engineering-at-spotify/)
+- [Donate Backstage to the CNCF đ](https://backstage.io/blog/2020/09/23/backstage-cncf-sandbox)
+- [TechDocs v1](https://backstage.io/blog/2020/09/08/announcing-tech-docs)
- [Plugin marketplace](https://backstage.io/plugins)
- [Improved and move documentation to backstage.io](https://backstage.io/docs/overview/what-is-backstage)
- [Backstage Service Catalog (alpha)](https://backstage.io/blog/2020/06/22/backstage-service-catalog-alpha)
diff --git a/docs/overview/support.md b/docs/overview/support.md
index 6e00c17fab..12bc7cfaf9 100644
--- a/docs/overview/support.md
+++ b/docs/overview/support.md
@@ -13,10 +13,7 @@ description: Support and Community Details and Links
- [FAQ](../FAQ.md) - Frequently Asked Questions
- [Code of Conduct](../../CODE_OF_CONDUCT.md) - This is how we roll
- [Blog](https://backstage.io/blog/) - Announcements and updates
-- [Newsletter](https://mailchi.mp/spotify/backstage-community)
+- [Newsletter](https://mailchi.mp/spotify/backstage-community) - Subscribe to
+ our email newsletter
- Give us a star âī¸ - If you are using Backstage or think it is an interesting
project, we would love a star â¤ī¸
-
-Or, if you are an open source developer and are interested in joining our team,
-please reach out to
-[foss-opportunities@spotify.com ](mailto:foss-opportunities@spotify.com)
diff --git a/docs/overview/what-is-backstage.md b/docs/overview/what-is-backstage.md
index 0d16943c9b..3d41c714ee 100644
--- a/docs/overview/what-is-backstage.md
+++ b/docs/overview/what-is-backstage.md
@@ -1,7 +1,7 @@
---
id: what-is-backstage
title: What is Backstage?
-description: Backsatge is an open platform for building developer portals.
+description: Backstage is an open platform for building developer portals.
Powered by a centralized service catalog, Backstage restores order to your microservices and infrastructure
---
@@ -33,7 +33,14 @@ Out of the box, Backstage includes:
[open source plugins](https://github.com/spotify/backstage/tree/master/plugins)
that further expand Backstageâs customizability and functionality
-### Benefits
+## Backstage and the CNCF
+
+Backstage is a CNCF Sandbox project. Read the announcement
+[here](https://backstage.io/blog/2020/09/23/backstage-cncf-sandbox).
+
+
+
+## Benefits
- For _engineering managers_, it allows you to maintain standards and best
practices across the organization, and can help you manage your whole tech
diff --git a/docs/plugins/existing-plugins.md b/docs/plugins/existing-plugins.md
index c1fbda379a..3c1ccb6438 100644
--- a/docs/plugins/existing-plugins.md
+++ b/docs/plugins/existing-plugins.md
@@ -4,12 +4,15 @@ title: Existing plugins
description: Lists of existing open source plugins
---
-## Open source plugins
+## The Plugin Marketplace
-The full list of open source plugins can be found
-[here](https://github.com/spotify/backstage/tree/master/plugins).
+Open source plugins that you can add to your Backstage deployment can be found
+at:
-## Plugin gallery
+https://backstage.io/plugins
-TODO: In the future we would like to have something similar to
-https://grafana.com/grafana/plugins
+
+
+## Links
+
+- [[blog] The Plugin Marketplace is open](https://backstage.io/blog/2020/09/30/plugin-marketplace)
diff --git a/docs/plugins/index.md b/docs/plugins/index.md
index 8a61aeee80..8836c1cd42 100644
--- a/docs/plugins/index.md
+++ b/docs/plugins/index.md
@@ -9,7 +9,7 @@ Backstage is a single-page application composed of a set of plugins.
Our goal for the plugin ecosystem is that the definition of a plugin is flexible
enough to allow you to expose pretty much any kind of infrastructure or software
development tool as a plugin in Backstage. By following strong
-[design guidelines](../dls/design.md) we ensure the the overall user experience
+[design guidelines](../dls/design.md) we ensure the overall user experience
stays consistent between plugins.

@@ -21,7 +21,7 @@ To create a plugin, follow the steps outlined [here](create-a-plugin.md).
## Suggesting a plugin
If you start developing a plugin that you aim to release as open source, we
-suggest that you create a new
+suggest that you create a
[new Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME).
This helps the community know what plugins are in development.
diff --git a/docs/plugins/proxying.md b/docs/plugins/proxying.md
index 2f809ffd10..3d9aa90447 100644
--- a/docs/plugins/proxying.md
+++ b/docs/plugins/proxying.md
@@ -23,7 +23,7 @@ const proxyEnv = useHotMemoize(module, () => createEnv('proxy'));
const service = createServiceBuilder(module)
.loadConfig(configReader)
/** ... other routers ... */
- .addRouter('/proxy', await proxy(proxyEnv, '/proxy'));
+ .addRouter('/proxy', await proxy(proxyEnv));
```
## Configuration
@@ -41,15 +41,14 @@ proxy:
target: http://larger.example.com:8080/svc.v1
headers:
Authorization:
- $secret:
- env: EXAMPLE_AUTH_HEADER
+ $env: EXAMPLE_AUTH_HEADER
```
Each key under the proxy configuration entry is a route to match, below the
prefix that the proxy plugin is mounted on. It must start with a slash. For
example, if the backend mounts the proxy plugin as `/proxy`, the above
configuration will lead to the proxy acting on backend requests to
-`/proxy/simple-example/...` and `/proxy/larger-example/v1/...`.
+`/api/proxy/simple-example/...` and `/api/proxy/larger-example/v1/...`.
The value inside each route is either a simple URL string, or an object on the
format accepted by
@@ -74,6 +73,6 @@ except with the following caveats for convenience:
commonly useful value.
- If `pathRewrite` is not specified, it is set to a single rewrite that removes
the entire prefix and route. In the above example, a rewrite of
- `'^/proxy/larger-example/v1/': '/'` is added. That means that a request to
- `/proxy/larger-example/v1/some/path` will be translated to a request to
+ `'^/api/proxy/larger-example/v1/': '/'` is added. That means that a request to
+ `/api/proxy/larger-example/v1/some/path` will be translated to a request to
`http://larger.example.com:8080/svc.v1/some/path`.
diff --git a/docs/plugins/publishing.md b/docs/plugins/publishing.md
index 0ed85e8cdc..fbeab6340c 100644
--- a/docs/plugins/publishing.md
+++ b/docs/plugins/publishing.md
@@ -21,6 +21,9 @@ out a new branch that you will use for the release, e.g.
$ git checkout -b new-release
```
+First bump the `CHANGELOG.md` in the root of the repo and commit. You bump it by
+adding a header for the new version just below the `## Next Release` one.
+
Then, from the root of the repo, run
```sh
diff --git a/docs/plugins/structure-of-a-plugin.md b/docs/plugins/structure-of-a-plugin.md
index f061d2f4a8..ee0a27cde2 100644
--- a/docs/plugins/structure-of-a-plugin.md
+++ b/docs/plugins/structure-of-a-plugin.md
@@ -84,7 +84,7 @@ structure our plugins. There are usually one or multiple page components and
next to them you can split up the UI in as many components as you feel like.
We have the `ExamplePage` to show an example Backstage page component. The
-`ExampleFetchComponent` show cases the common task of making an async request to
+`ExampleFetchComponent` showcases the common task of making an async request to
a public API and plot the response data in a table using Material-UI components.
You may tweak these components, rename them and/or replace them completely.
diff --git a/docs/plugins/testing.md b/docs/plugins/testing.md
index 696f8b1368..c6e1599786 100644
--- a/docs/plugins/testing.md
+++ b/docs/plugins/testing.md
@@ -32,7 +32,7 @@ working on.
## Naming Test Files
-Tests should be name `[filename].test.js`.
+Tests should be named `[filename].test.js`.
For example, the tests for **`Link.js`** exist in the file **`Link.test.js`**.
@@ -54,7 +54,7 @@ TODO.
# Writing Unit Tests
-The following principles are good guides to determining if you are writing high
+The following principles are good guides for determining if you are writing high
quality frontend unit tests.
## Bad Unit Test Principle
@@ -166,11 +166,11 @@ because it fulfills all the principles above:
â **Fulfills Input/Output Principle**: Verifies the output changes when the
input changes
-â **Fufills Blackbox Principle**: Does not verify _how_ the ``
+â **Fulfills Blackbox Principle**: Does not verify _how_ the ``
component is mounted, just that it is mounted in response to the input.
â **Fulfills Scalability Principle**: If we decide to refactor the entire way
-the loading indicator is displayed the test still works without touching it.
+the loading indicator has displayed the test still works without touching it.
â **Fulfills Broken Functionality Principle**: this test verifies the
functionality (displaying an indicator) is working, rather than how it is
diff --git a/docs/reference/utility-apis/AlertApi.md b/docs/reference/utility-apis/AlertApi.md
index d000a6d6a2..6219f520f5 100644
--- a/docs/reference/utility-apis/AlertApi.md
+++ b/docs/reference/utility-apis/AlertApi.md
@@ -1,7 +1,7 @@
# AlertApi
The AlertApi type is defined at
-[packages/core-api/src/apis/definitions/AlertApi.ts:29](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/AlertApi.ts#L29).
+[packages/core-api/src/apis/definitions/AlertApi.ts:29](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AlertApi.ts#L29).
The following Utility API implements this type: [alertApiRef](./README.md#alert)
@@ -38,7 +38,7 @@ export type AlertMessage = {
Defined at
-[packages/core-api/src/apis/definitions/AlertApi.ts:19](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/AlertApi.ts#L19).
+[packages/core-api/src/apis/definitions/AlertApi.ts:19](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AlertApi.ts#L19).
Referenced by: [post](#post), [alert\$](#alert).
@@ -67,13 +67,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
Referenced by: [alert\$](#alert).
### Observer
-This file contains non-react related core types used throught Backstage.
+This file contains non-react related core types used through Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -86,7 +86,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -109,6 +109,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/AppThemeApi.md b/docs/reference/utility-apis/AppThemeApi.md
index e7d5296ceb..eb35eb38ef 100644
--- a/docs/reference/utility-apis/AppThemeApi.md
+++ b/docs/reference/utility-apis/AppThemeApi.md
@@ -1,7 +1,7 @@
# AppThemeApi
The AppThemeApi type is defined at
-[packages/core-api/src/apis/definitions/AppThemeApi.ts:50](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/AppThemeApi.ts#L50).
+[packages/core-api/src/apis/definitions/AppThemeApi.ts:50](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AppThemeApi.ts#L50).
The following Utility API implements this type:
[appThemeApiRef](./README.md#apptheme)
@@ -76,7 +76,7 @@ export type AppTheme = {
Defined at
-[packages/core-api/src/apis/definitions/AppThemeApi.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/AppThemeApi.ts#L24).
+[packages/core-api/src/apis/definitions/AppThemeApi.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AppThemeApi.ts#L24).
Referenced by: [getInstalledThemes](#getinstalledthemes).
@@ -87,7 +87,7 @@ export type BackstagePalette = Palette & Palette
Defined at
-[packages/theme/src/types.ts:70](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/theme/src/types.ts#L70).
+[packages/theme/src/types.ts:70](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/theme/src/types.ts#L70).
Referenced by: [BackstageTheme](#backstagetheme).
@@ -100,7 +100,7 @@ export interface BackstageTheme extends Theme {
Defined at
-[packages/theme/src/types.ts:73](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/theme/src/types.ts#L73).
+[packages/theme/src/types.ts:73](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/theme/src/types.ts#L73).
Referenced by: [AppTheme](#apptheme).
@@ -129,13 +129,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
Referenced by: [activeThemeId\$](#activethemeid).
### Observer
-This file contains non-react related core types used throught Backstage.
+This file contains non-react related core types used through Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -148,7 +148,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -204,7 +204,7 @@ type PaletteAdditions = {
Defined at
-[packages/theme/src/types.ts:23](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/theme/src/types.ts#L23).
+[packages/theme/src/types.ts:23](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/theme/src/types.ts#L23).
Referenced by: [BackstagePalette](#backstagepalette).
@@ -227,6 +227,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/BackstageIdentityApi.md b/docs/reference/utility-apis/BackstageIdentityApi.md
index 87318ecff5..529b73c576 100644
--- a/docs/reference/utility-apis/BackstageIdentityApi.md
+++ b/docs/reference/utility-apis/BackstageIdentityApi.md
@@ -1,7 +1,7 @@
# BackstageIdentityApi
The BackstageIdentityApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:144](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L144).
+[packages/core-api/src/apis/definitions/auth.ts:134](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L134).
The following Utility APIs implement this type:
@@ -15,6 +15,8 @@ The following Utility APIs implement this type:
- [microsoftAuthApiRef](./README.md#microsoftauth)
+- [oauth2ApiRef](./README.md#oauth2)
+
- [oktaAuthApiRef](./README.md#oktaauth)
## Members
@@ -66,7 +68,7 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getBackstageIdentity](#getbackstageidentity).
@@ -87,6 +89,6 @@ export type BackstageIdentity = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:157](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L157).
+[packages/core-api/src/apis/definitions/auth.ts:147](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L147).
Referenced by: [getBackstageIdentity](#getbackstageidentity).
diff --git a/docs/reference/utility-apis/Config.md b/docs/reference/utility-apis/Config.md
index 9374fb9962..b54e122c03 100644
--- a/docs/reference/utility-apis/Config.md
+++ b/docs/reference/utility-apis/Config.md
@@ -1,7 +1,7 @@
# Config
The Config type is defined at
-[packages/config/src/types.ts:32](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/config/src/types.ts#L32).
+[packages/config/src/types.ts:32](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L32).
The following Utility API implements this type:
[configApiRef](./README.md#config)
@@ -140,7 +140,7 @@ export type Config = {
Defined at
-[packages/config/src/types.ts:32](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/config/src/types.ts#L32).
+[packages/config/src/types.ts:32](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L32).
Referenced by: [getConfig](#getconfig), [getOptionalConfig](#getoptionalconfig),
[getConfigArray](#getconfigarray),
@@ -153,7 +153,7 @@ export type JsonArray = JsonValue[]
Defined at
-[packages/config/src/types.ts:18](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/config/src/types.ts#L18).
+[packages/config/src/types.ts:18](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L18).
Referenced by: [JsonValue](#jsonvalue).
@@ -164,7 +164,7 @@ export type JsonObject = { [key in string]?: JsonValue
Defined at
-[packages/config/src/types.ts:17](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/config/src/types.ts#L17).
+[packages/config/src/types.ts:17](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L17).
Referenced by: [JsonValue](#jsonvalue).
@@ -181,7 +181,7 @@ export type JsonValue =
Defined at
-[packages/config/src/types.ts:19](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/config/src/types.ts#L19).
+[packages/config/src/types.ts:19](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L19).
Referenced by: [get](#get), [getOptional](#getoptional),
[JsonObject](#jsonobject), [JsonArray](#jsonarray), [Config](#config).
diff --git a/docs/reference/utility-apis/DiscoveryApi.md b/docs/reference/utility-apis/DiscoveryApi.md
index 39902789cd..24371c1729 100644
--- a/docs/reference/utility-apis/DiscoveryApi.md
+++ b/docs/reference/utility-apis/DiscoveryApi.md
@@ -1,7 +1,7 @@
# DiscoveryApi
The DiscoveryApi type is defined at
-[packages/core-api/src/apis/definitions/DiscoveryApi.ts:30](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L30).
+[packages/core-api/src/apis/definitions/DiscoveryApi.ts:30](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L30).
The following Utility API implements this type:
[discoveryApiRef](./README.md#discovery)
diff --git a/docs/reference/utility-apis/ErrorApi.md b/docs/reference/utility-apis/ErrorApi.md
index c05f060ec3..762d2016d5 100644
--- a/docs/reference/utility-apis/ErrorApi.md
+++ b/docs/reference/utility-apis/ErrorApi.md
@@ -1,7 +1,7 @@
# ErrorApi
The ErrorApi type is defined at
-[packages/core-api/src/apis/definitions/ErrorApi.ts:53](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/ErrorApi.ts#L53).
+[packages/core-api/src/apis/definitions/ErrorApi.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L53).
The following Utility API implements this type: [errorApiRef](./README.md#error)
@@ -41,7 +41,7 @@ type Error = {
Defined at
-[packages/core-api/src/apis/definitions/ErrorApi.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/ErrorApi.ts#L24).
+[packages/core-api/src/apis/definitions/ErrorApi.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L24).
Referenced by: [post](#post), [error\$](#error).
@@ -58,7 +58,7 @@ export type ErrorContext = {
Defined at
-[packages/core-api/src/apis/definitions/ErrorApi.ts:33](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/ErrorApi.ts#L33).
+[packages/core-api/src/apis/definitions/ErrorApi.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L33).
Referenced by: [post](#post), [error\$](#error).
@@ -87,13 +87,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
Referenced by: [error\$](#error).
### Observer
-This file contains non-react related core types used throught Backstage.
+This file contains non-react related core types used through Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -106,7 +106,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -129,6 +129,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/FeatureFlagsApi.md b/docs/reference/utility-apis/FeatureFlagsApi.md
index 5efdb176a4..8fbcb794fb 100644
--- a/docs/reference/utility-apis/FeatureFlagsApi.md
+++ b/docs/reference/utility-apis/FeatureFlagsApi.md
@@ -1,7 +1,7 @@
# FeatureFlagsApi
The FeatureFlagsApi type is defined at
-[packages/core-api/src/apis/definitions/FeatureFlagsApi.ts:41](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L41).
+[packages/core-api/src/apis/definitions/FeatureFlagsApi.ts:41](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L41).
The following Utility API implements this type:
[featureFlagsApiRef](./README.md#featureflags)
diff --git a/docs/reference/utility-apis/IdentityApi.md b/docs/reference/utility-apis/IdentityApi.md
index 4e37ad5300..5ee5c582b6 100644
--- a/docs/reference/utility-apis/IdentityApi.md
+++ b/docs/reference/utility-apis/IdentityApi.md
@@ -1,7 +1,7 @@
# IdentityApi
The IdentityApi type is defined at
-[packages/core-api/src/apis/definitions/IdentityApi.ts:22](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/IdentityApi.ts#L22).
+[packages/core-api/src/apis/definitions/IdentityApi.ts:22](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/IdentityApi.ts#L22).
The following Utility API implements this type:
[identityApiRef](./README.md#identity)
@@ -40,12 +40,12 @@ identity, such as a demo user or mocked user for e2e tests.
getIdToken(): Promise<string | undefined>
-### logout()
+### signOut()
-Log out the current user
+Sign out the current user
## Supporting types
@@ -76,6 +76,6 @@ export type ProfileInfo = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:172](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L172).
+[packages/core-api/src/apis/definitions/auth.ts:162](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L162).
Referenced by: [getProfile](#getprofile).
diff --git a/docs/reference/utility-apis/OAuthApi.md b/docs/reference/utility-apis/OAuthApi.md
index e73d5f645f..a489db76c5 100644
--- a/docs/reference/utility-apis/OAuthApi.md
+++ b/docs/reference/utility-apis/OAuthApi.md
@@ -1,7 +1,7 @@
# OAuthApi
The OAuthApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:67](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L67).
+[packages/core-api/src/apis/definitions/auth.ts:67](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L67).
The following Utility APIs implement this type:
@@ -50,14 +50,6 @@ getAccessToken(
): Promise<string>
-### logout()
-
-Log out the user's session. This will reload the page.
-
-
-logout(): Promise<void>
-
-
## Supporting types
These types are part of the API declaration, but may not be unique to this API.
@@ -90,7 +82,7 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getAccessToken](#getaccesstoken).
@@ -116,6 +108,6 @@ export type OAuthScope = string | string[]
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:38](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L38).
+[packages/core-api/src/apis/definitions/auth.ts:38](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L38).
Referenced by: [getAccessToken](#getaccesstoken).
diff --git a/docs/reference/utility-apis/OAuthRequestApi.md b/docs/reference/utility-apis/OAuthRequestApi.md
index c6b9e09189..1328aabeec 100644
--- a/docs/reference/utility-apis/OAuthRequestApi.md
+++ b/docs/reference/utility-apis/OAuthRequestApi.md
@@ -1,7 +1,7 @@
# OAuthRequestApi
The OAuthRequestApi type is defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:99](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L99).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:99](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L99).
The following Utility API implements this type:
[oauthRequestApiRef](./README.md#oauthrequest)
@@ -11,7 +11,8 @@ The following Utility API implements this type:
### createAuthRequester()
A utility for showing login popups or similar things, and merging together
-multiple requests for different scopes into one request that inclues all scopes.
+multiple requests for different scopes into one request that includes all
+scopes.
The passed in options provide information about the login provider, and how to
handle auth requests.
@@ -30,7 +31,7 @@ createAuthRequester<AuthResponse>(
### authRequest\$()
-Observers panding auth requests. The returned observable will emit all current
+Observers pending auth requests. The returned observable will emit all current
active auth request, at most one for each created auth requester.
Each request has its own info about the login provider, forwarded from the auth
@@ -72,7 +73,7 @@ export type AuthProvider = {
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:27](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L27).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:27](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L27).
Referenced by: [AuthRequesterOptions](#authrequesteroptions),
[PendingAuthRequest](#pendingauthrequest).
@@ -96,7 +97,7 @@ export type AuthRequester<AuthResponse> = (
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:66](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L66).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:66](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L66).
Referenced by: [createAuthRequester](#createauthrequester).
@@ -121,7 +122,7 @@ export type AuthRequesterOptions<AuthResponse> = {
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:43](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L43).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:43](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L43).
Referenced by: [createAuthRequester](#createauthrequester).
@@ -150,13 +151,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
Referenced by: [authRequest\$](#authrequest).
### Observer
-This file contains non-react related core types used throught Backstage.
+This file contains non-react related core types used through Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -169,7 +170,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -204,7 +205,7 @@ export type PendingAuthRequest = {
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:77](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L77).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:77](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L77).
Referenced by: [authRequest\$](#authrequest).
@@ -227,6 +228,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/OpenIdConnectApi.md b/docs/reference/utility-apis/OpenIdConnectApi.md
index 41a3247af6..efd79593d6 100644
--- a/docs/reference/utility-apis/OpenIdConnectApi.md
+++ b/docs/reference/utility-apis/OpenIdConnectApi.md
@@ -1,7 +1,7 @@
# OpenIdConnectApi
The OpenIdConnectApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:104](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L104).
+[packages/core-api/src/apis/definitions/auth.ts:99](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L99).
The following Utility APIs implement this type:
@@ -34,14 +34,6 @@ user rejects the login request.
getIdToken(options?: AuthRequestOptions): Promise<string>
-### logout()
-
-Log out the user's session. This will reload the page.
-
-
-logout(): Promise<void>
-
-
## Supporting types
These types are part of the API declaration, but may not be unique to this API.
@@ -74,6 +66,6 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getIdToken](#getidtoken).
diff --git a/docs/reference/utility-apis/ProfileInfoApi.md b/docs/reference/utility-apis/ProfileInfoApi.md
index 09c0f88f83..402b5ba504 100644
--- a/docs/reference/utility-apis/ProfileInfoApi.md
+++ b/docs/reference/utility-apis/ProfileInfoApi.md
@@ -1,7 +1,7 @@
# ProfileInfoApi
The ProfileInfoApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:127](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L127).
+[packages/core-api/src/apis/definitions/auth.ts:117](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L117).
The following Utility APIs implement this type:
@@ -65,7 +65,7 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getProfile](#getprofile).
@@ -93,6 +93,6 @@ export type ProfileInfo = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:172](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L172).
+[packages/core-api/src/apis/definitions/auth.ts:162](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L162).
Referenced by: [getProfile](#getprofile).
diff --git a/docs/reference/utility-apis/README.md b/docs/reference/utility-apis/README.md
index cfdc3b6ef8..71931a5d5a 100644
--- a/docs/reference/utility-apis/README.md
+++ b/docs/reference/utility-apis/README.md
@@ -12,7 +12,7 @@ Used to report alerts and forward them to the app
Implemented type: [AlertApi](./AlertApi.md)
ApiRef:
-[alertApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/AlertApi.ts#L41)
+[alertApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AlertApi.ts#L41)
### appTheme
@@ -21,7 +21,7 @@ API Used to configure the app theme, and enumerate options
Implemented type: [AppThemeApi](./AppThemeApi.md)
ApiRef:
-[appThemeApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/AppThemeApi.ts#L74)
+[appThemeApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AppThemeApi.ts#L74)
### auth0Auth
@@ -29,11 +29,10 @@ Provides authentication towards Auth0 APIs
Implemented types: [OpenIdConnectApi](./OpenIdConnectApi.md),
[ProfileInfoApi](./ProfileInfoApi.md),
-[BackstageIdentityApi](./BackstageIdentityApi.md),
-[SessionStateApi](./SessionStateApi.md)
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[auth0AuthApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L273)
+[auth0AuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L275)
### config
@@ -42,7 +41,7 @@ Used to access runtime configuration
Implemented type: [Config](./Config.md)
ApiRef:
-[configApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/ConfigApi.ts#L22)
+[configApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ConfigApi.ts#L22)
### discovery
@@ -51,7 +50,7 @@ Provides service discovery of backend plugins
Implemented type: [DiscoveryApi](./DiscoveryApi.md)
ApiRef:
-[discoveryApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L44)
+[discoveryApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L44)
### error
@@ -60,7 +59,7 @@ Used to report errors and forward them to the app
Implemented type: [ErrorApi](./ErrorApi.md)
ApiRef:
-[errorApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/ErrorApi.ts#L65)
+[errorApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L65)
### featureFlags
@@ -69,7 +68,7 @@ Used to toggle functionality in features across Backstage
Implemented type: [FeatureFlagsApi](./FeatureFlagsApi.md)
ApiRef:
-[featureFlagsApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L58)
+[featureFlagsApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L58)
### githubAuth
@@ -77,11 +76,10 @@ Provides authentication towards GitHub APIs
Implemented types: [OAuthApi](./OAuthApi.md),
[ProfileInfoApi](./ProfileInfoApi.md),
-[BackstageIdentityApi](./BackstageIdentityApi.md),
-[SessionStateApi](./SessionStateApi.md)
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[githubAuthApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L230)
+[githubAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L232)
### gitlabAuth
@@ -89,11 +87,10 @@ Provides authentication towards GitLab APIs
Implemented types: [OAuthApi](./OAuthApi.md),
[ProfileInfoApi](./ProfileInfoApi.md),
-[BackstageIdentityApi](./BackstageIdentityApi.md),
-[SessionStateApi](./SessionStateApi.md)
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[gitlabAuthApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L260)
+[gitlabAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L262)
### googleAuth
@@ -102,11 +99,10 @@ Provides authentication towards Google APIs and identities
Implemented types: [OAuthApi](./OAuthApi.md),
[OpenIdConnectApi](./OpenIdConnectApi.md),
[ProfileInfoApi](./ProfileInfoApi.md),
-[BackstageIdentityApi](./BackstageIdentityApi.md),
-[SessionStateApi](./SessionStateApi.md)
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[googleAuthApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L213)
+[googleAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L215)
### identity
@@ -115,7 +111,7 @@ Provides access to the identity of the signed in user
Implemented type: [IdentityApi](./IdentityApi.md)
ApiRef:
-[identityApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/IdentityApi.ts#L54)
+[identityApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/IdentityApi.ts#L54)
### microsoftAuth
@@ -124,11 +120,10 @@ Provides authentication towards Microsoft APIs and identities
Implemented types: [OAuthApi](./OAuthApi.md),
[OpenIdConnectApi](./OpenIdConnectApi.md),
[ProfileInfoApi](./ProfileInfoApi.md),
-[BackstageIdentityApi](./BackstageIdentityApi.md),
-[SessionStateApi](./SessionStateApi.md)
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[microsoftAuthApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L287)
+[microsoftAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L289)
### oauth2
@@ -136,10 +131,11 @@ Example of how to use oauth2 custom provider
Implemented types: [OAuthApi](./OAuthApi.md),
[OpenIdConnectApi](./OpenIdConnectApi.md),
-[ProfileInfoApi](./ProfileInfoApi.md), [SessionStateApi](./SessionStateApi.md)
+[ProfileInfoApi](./ProfileInfoApi.md),
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[oauth2ApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L301)
+[oauth2ApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L303)
### oauthRequest
@@ -148,7 +144,7 @@ An API for implementing unified OAuth flows in Backstage
Implemented type: [OAuthRequestApi](./OAuthRequestApi.md)
ApiRef:
-[oauthRequestApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L130)
+[oauthRequestApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L130)
### oktaAuth
@@ -157,11 +153,10 @@ Provides authentication towards Okta APIs
Implemented types: [OAuthApi](./OAuthApi.md),
[OpenIdConnectApi](./OpenIdConnectApi.md),
[ProfileInfoApi](./ProfileInfoApi.md),
-[BackstageIdentityApi](./BackstageIdentityApi.md),
-[SessionStateApi](./SessionStateApi.md)
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[oktaAuthApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L243)
+[oktaAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L245)
### storage
@@ -170,4 +165,4 @@ Provides the ability to store data which is unique to the user
Implemented type: [StorageApi](./StorageApi.md)
ApiRef:
-[storageApiRef](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/StorageApi.ts#L68)
+[storageApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L68)
diff --git a/docs/reference/utility-apis/SessionApi.md b/docs/reference/utility-apis/SessionApi.md
new file mode 100644
index 0000000000..e7a9e58c59
--- /dev/null
+++ b/docs/reference/utility-apis/SessionApi.md
@@ -0,0 +1,138 @@
+# SessionApi
+
+The SessionApi type is defined at
+[packages/core-api/src/apis/definitions/auth.ts:190](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L190).
+
+The following Utility APIs implement this type:
+
+- [auth0AuthApiRef](./README.md#auth0auth)
+
+- [githubAuthApiRef](./README.md#githubauth)
+
+- [gitlabAuthApiRef](./README.md#gitlabauth)
+
+- [googleAuthApiRef](./README.md#googleauth)
+
+- [microsoftAuthApiRef](./README.md#microsoftauth)
+
+- [oauth2ApiRef](./README.md#oauth2)
+
+- [oktaAuthApiRef](./README.md#oktaauth)
+
+## Members
+
+### signIn()
+
+Sign in with a minimum set of permissions.
+
+
+signIn(): Promise<void>
+
+
+### signOut()
+
+Sign out from the current session. This will reload the page.
+
+
+signOut(): Promise<void>
+
+
+### sessionState\$()
+
+Observe the current state of the auth session. Emits the current state on
+subscription.
+
+
+
+## Supporting types
+
+These types are part of the API declaration, but may not be unique to this API.
+
+### Observable
+
+Observable sequence of values and errors, see TC39.
+
+https://github.com/tc39/proposal-observable
+
+This is used as a common return type for observable values and can be created
+using many different observable implementations, such as zen-observable or
+RxJS 5.
+
+
+export type Observable<T> = {
+ /**
+ * Subscribes to this observable to start receiving new values.
+ */
+ subscribe(observer: Observer<T>): Subscription;
+ subscribe(
+ onNext: (value: T) => void,
+ onError?: (error: Error) => void,
+ onComplete?: () => void,
+ ): Subscription;
+}
+
+
+Defined at
+[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
+
+Referenced by: [sessionState\$](#sessionstate).
+
+### Observer
+
+This file contains non-react related core types used through Backstage.
+
+Observer interface for consuming an Observer, see TC39.
+
+
+
+Defined at
+[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
+
+Referenced by: [Observable](#observable).
+
+### SessionState
+
+Session state values passed to subscribers of the SessionApi.
+
+
+
+Defined at
+[packages/core-api/src/apis/definitions/auth.ts:182](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L182).
+
+Referenced by: [sessionState\$](#sessionstate).
+
+### Subscription
+
+Subscription returned when subscribing to an Observable, see TC39.
+
+
+export type Subscription = {
+ /**
+ * Cancels the subscription
+ */
+ unsubscribe(): void;
+
+ /**
+ * Value indicating whether the subscription is closed.
+ */
+ readonly closed: Boolean;
+}
+
+
+Defined at
+[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
+
+Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/SessionStateApi.md b/docs/reference/utility-apis/SessionStateApi.md
index c1821f2381..81f25aa349 100644
--- a/docs/reference/utility-apis/SessionStateApi.md
+++ b/docs/reference/utility-apis/SessionStateApi.md
@@ -62,7 +62,7 @@ Referenced by: [sessionState\$](#sessionstate).
### Observer
-This file contains non-react related core types used throught Backstage.
+This file contains non-react related core types used through Backstage.
Observer interface for consuming an Observer, see TC39.
diff --git a/docs/reference/utility-apis/StorageApi.md b/docs/reference/utility-apis/StorageApi.md
index bee52935da..e7d5131ff9 100644
--- a/docs/reference/utility-apis/StorageApi.md
+++ b/docs/reference/utility-apis/StorageApi.md
@@ -1,7 +1,7 @@
# StorageApi
The StorageApi type is defined at
-[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
+[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
The following Utility API implements this type:
[storageApiRef](./README.md#storage)
@@ -35,7 +35,7 @@ remove(key: string): Promise<void>
### set()
-Save persistant data, and emit messages to anyone that is using observe\$ for
+Save persistent data, and emit messages to anyone that is using observe\$ for
this key
@@ -79,13 +79,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
Referenced by: [observe\$](#observe), [StorageApi](#storageapi).
### Observer
-This file contains non-react related core types used throught Backstage.
+This file contains non-react related core types used through Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -98,7 +98,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -129,7 +129,7 @@ export interface StorageApi {
remove(key: string): Promise<void>;
/**
- * Save persistant data, and emit messages to anyone that is using observe$ for this key
+ * Save persistent data, and emit messages to anyone that is using observe$ for this key
*
* @param {String} key Unique key associated with the data.
*/
@@ -144,7 +144,7 @@ export interface StorageApi {
Defined at
-[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
+[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
Referenced by: [forBucket](#forbucket).
@@ -158,7 +158,7 @@ export type StorageValueChange<T = any> = {
Defined at
-[packages/core-api/src/apis/definitions/StorageApi.ts:21](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/StorageApi.ts#L21).
+[packages/core-api/src/apis/definitions/StorageApi.ts:21](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L21).
Referenced by: [observe\$](#observe), [StorageApi](#storageapi).
@@ -181,6 +181,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/tutorials/journey.md b/docs/tutorials/journey.md
index 24765e8531..908d7fc61b 100644
--- a/docs/tutorials/journey.md
+++ b/docs/tutorials/journey.md
@@ -134,7 +134,7 @@ work.
# 5. The First User
At this point the only things that anyone that wants to use Sam's plugin needs
-to do is to add
+to do are to add
https://raw.githubusercontent.com/sam/backstage-spotify-theme/master/annotation.json#/sam.wise/spotify-track-id
to their catalog schema, import and add the `PlayerWidget` on the desired entity
template pages, and make sure they're providing Spotify auth.
@@ -145,7 +145,7 @@ select a theme tune when creating a new component. Sam jumps on the idea and
adds a new creation hook that is exported by the plugin. The hook can be
installed either in a single, all, or component templates that match a label. It
adds a field as a part of the component creation process with a nice search box
-that allow users to search for a track that they want to use as the theme tune.
+that allows users to search for a track that they want to use as the theme tune.
# 6. Return to the Repo
@@ -203,7 +203,7 @@ backend plugin also extends the common GraphQL schema with a mutation that
updates the track ID in the database.
On the frontend the Pull Request doesn't change much. It defines the save action
-the was previously using the `RepoApi` in it's own API.
+the was previously using the `RepoApi` in its own API.
```ts
type ThemeTuneStorageApi = {
@@ -247,7 +247,7 @@ once an internal concern of the plugin is now becoming a standard in the
community.
In order to standardize the annotation in Backstage, Sam submits a Pull Request
-to the Backstage Core repo. The request suggest a new well-known metadata
+to the Backstage Core repo. The request suggests a new well-known metadata
annotation called `spotify.com/track-id`, with the same schema definition as
Sam's label, and refers to Sam's own plugin and the `spotify-album-art` plugin
as existing usages. The Backstage maintainers merge the Pull Request, after
diff --git a/docs/tutorials/quickstart-app-auth.md b/docs/tutorials/quickstart-app-auth.md
index 2615e37633..8f6b35617b 100644
--- a/docs/tutorials/quickstart-app-auth.md
+++ b/docs/tutorials/quickstart-app-auth.md
@@ -11,10 +11,11 @@ title: Monorepo App Setup With Authentication
> own environment. It starts with a skeleton install and verifying of the
> monorepo's functionality. Next, GitHub authentication is added and tested.
>
-> This document assumes you have NodeJS 12 active along with Yarn. Please note,
-> that at the time of this writing, the current version is 0.1.1-alpha.21. This
-> guide can still be used with future versions, just, verify as you go. If you
-> run into issues, you can compare your setup with mine here >
+> This document assumes you have NodeJS 12 active along with Yarn and Python.
+> Please note, that at the time of this writing, the current version is
+> 0.1.1-alpha.21. This guide can still be used with future versions, just,
+> verify as you go. If you run into issues, you can compare your setup with mine
+> here >
> [simple-backstage-app](https://github.com/johnson-jesse/simple-backstage-app).
# The Skeleton Application
@@ -71,15 +72,12 @@ auth:
github:
development:
clientId:
- $secret:
- env: AUTH_GITHUB_CLIENT_ID
+ $env: AUTH_GITHUB_CLIENT_ID
clientSecret:
- $secret:
- env: AUTH_GITHUB_CLIENT_SECRET
+ $env: AUTH_GITHUB_CLIENT_SECRET
## uncomment the following three lines if using enterprise
# enterpriseInstanceUrl:
- # $secret:
- # env: AUTH_GITHUB_ENTERPRISE_INSTANCE_URL
+ # $env: AUTH_GITHUB_ENTERPRISE_INSTANCE_URL
```
2. Set environment variables in whatever fashion is easiest for you. I chose to
@@ -115,7 +113,7 @@ export AUTH_GITHUB_CLIENT_SECRET=xxx
> Log into http://github.com
> Navigate to (Settings > Developer Settings > OAuth Apps > New OAuth App)[https://github.com/settings/applications/new]
> Set Homepage URL = http://localhost:3000
-> Set Callback URL = http://localhost:7000/auth/github
+> Set Callback URL = http://localhost:7000/api/auth/github
> Click [Register application]
> On the next page, copy and paste your new Client ID and Client Secret to the environment variables above, `AUTH_GITHUB_CLIENT_ID` & `AUTH_GITHUB_CLIENT_SECRET`
> Don't forget to `source` that profile file again if necessary.
@@ -155,42 +153,11 @@ const app = createApp({
});
```
-6. Open and change _root > packages > app > src >_ `apis.ts` as follows
+7. Start the backend and frontend as before
-```ts
-// Add the following imports to the existing list from core
-import { githubAuthApiRef, GithubAuth } from '@backstage/core';
-```
-
-7. In the same file, change the builder block for oauthRequestApiRef as follows
-
-_from:_
-
-```ts
-builder.add(oauthRequestApiRef, new OAuthRequestManager());
-```
-
-_to:_
-
-```ts
-const oauthRequestApi = builder.add(
- oauthRequestApiRef,
- new OAuthRequestManager(),
-);
-
-builder.add(
- githubAuthApiRef,
- GithubAuth.create({
- discoveryApi,
- oauthRequestApi,
- }),
-);
-```
-
-> Start the backend and frontend as before. When the browser loads, you should
-> be presented with a login page for GitHub. Login as usual with your GitHub
-> account. If this is your first time, you will be asked to authorize and then
-> are redirected to the catalog page if all is well.
+When the browser loads, you should be presented with a login page for GitHub.
+Login as usual with your GitHub account. If this is your first time, you will be
+asked to authorize and then are redirected to the catalog page if all is well.
# Where to go from here
diff --git a/docs/tutorials/quickstart-app-plugin.md b/docs/tutorials/quickstart-app-plugin.md
index 28efb2a007..9f571b0c9a 100644
--- a/docs/tutorials/quickstart-app-plugin.md
+++ b/docs/tutorials/quickstart-app-plugin.md
@@ -20,10 +20,11 @@ title: Adding Custom Plugin to Existing Monorepo App
> functionality, extend the Sidebar to make our life easy. Finally, we add
> custom code to display GitHub repository information.
>
-> This document assumes you have NodeJS 12 active along with Yarn. Please note,
-> that at the time of this writing, the current version is 0.1.1-alpha.21. This
-> guide can still be used with future versions, just, verify as you go. If you
-> run into issues, you can compare your setup with mine here >
+> This document assumes you have NodeJS 12 active along with Yarn and Python.
+> Please note, that at the time of this writing, the current version is
+> 0.1.1-alpha.21. This guide can still be used with future versions, just,
+> verify as you go. If you run into issues, you can compare your setup with mine
+> here >
> [simple-backstage-app-plugin](https://github.com/johnson-jesse/simple-backstage-app-plugin).
# The Skeleton Plugin
@@ -34,7 +35,7 @@ title: Adding Custom Plugin to Existing Monorepo App
1. When the process finishes, let's start the backend:
`yarn --cwd packages/backend start`
1. If you see errors starting, refer to
- [Auth Configuration](https://github.com/johnson-jesse/simple-backstage-app/blob/master/README.md#the-auth-configuration)
+ [Auth Configuration](https://backstage.io/docs/tutorials/quickstart-app-auth#the-auth-configuration)
for more information on environment variables.
1. And now the frontend, from a new terminal window and the root of your
project: `yarn start`
@@ -119,67 +120,10 @@ If everything is saved, you should see your name, id, and email on the
github-playground page. Our data accessed is synchronous. So we just grab and
go.
+https://github.com/spotify/backstage/tree/master/contrib
+
6. Here is the entire file for reference
-Complete ExampleComponent.tsx
-
-
+ [ExampleComponent.tsx](https://github.com/spotify/backstage/tree/master/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md)
# The Wipe
@@ -188,7 +132,7 @@ changes, let's start by wiping this component clean.
1. Start by opening
`root: plugins > github-playground > src > components > ExampleFetchComponent > ExampleFetchComponent.tsx`
-1. Replace everyting in the file with the following:
+1. Replace everything in the file with the following:
```tsx
import React, { FC } from 'react';
@@ -267,7 +211,7 @@ type Viewer = {
};
```
-# The Tabel Model
+# The Table Model
Using Backstage's own component library, let's define a custom table. This
component will get used if we have data to display.
@@ -329,8 +273,8 @@ const { value, loading, error } = useAsync(async (): Promise => {
}, []);
```
-4. The resolved data is conventiently destructured with value containing our
- Viewer type. loading as a boolean, self explainatory. And error which is
+4. The resolved data is conveniently destructured with `value` containing our
+ Viewer type. `loading` as a boolean, self explanatory. And `error` which is
present only if necessary. So let's use those as the first 3 of 4 multi
return statements.
5. Add the _if return_ blocks below our async block
@@ -358,123 +302,10 @@ return (
8. After saving that, and given we don't have any errors, you should see a table
with basic information on your repositories.
9. Here is the entire file for reference
-Complete ExampleFetchComponent.tsx
-
-
-
-10. We finished! If there are no errors, you should see your own GitHub
- repoistory information displayed in a basic table. If you run into issues,
- you can compare the repo that backs this documdnt,
+ [ExampleFetchComponent.tsx](https://github.com/spotify/backstage/tree/master/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md)
+10. We finished! You should see your own GitHub repository's information
+ displayed in a basic table. If you run into issues, you can compare the repo
+ that backs this document,
[simple-backstage-app-plugin](https://github.com/johnson-jesse/simple-backstage-app-plugin)
# Where to go from here
@@ -482,6 +313,6 @@ export default ExampleFetchComponent;
> Break apart ExampleFetchComponent into smaller logical parts contained in
> their own files. Rename your components to something other than ExampleXxx.
>
-> You might be real proud of a plugin you develop. Follow this next tutorial for
-> an in-depth look at publishing and including that for the entire Backstage
+> You might be really proud of a plugin you develop. Follow this next tutorial
+> for an in-depth look at publishing and including that for the entire Backstage
> community. [TODO](#).
diff --git a/lerna.json b/lerna.json
index a018b1a289..7d514abb97 100644
--- a/lerna.json
+++ b/lerna.json
@@ -2,5 +2,5 @@
"packages": ["packages/*", "plugins/*"],
"npmClient": "yarn",
"useWorkspaces": true,
- "version": "0.1.1-alpha.22"
+ "version": "0.1.1-alpha.24"
}
diff --git a/microsite/.prettierignore b/microsite/.prettierignore
new file mode 100644
index 0000000000..378eac25d3
--- /dev/null
+++ b/microsite/.prettierignore
@@ -0,0 +1 @@
+build
diff --git a/microsite/blog/2020-09-23-backstage-cncf-sandbox.md b/microsite/blog/2020-09-23-backstage-cncf-sandbox.md
new file mode 100644
index 0000000000..bcfd7c6245
--- /dev/null
+++ b/microsite/blog/2020-09-23-backstage-cncf-sandbox.md
@@ -0,0 +1,21 @@
+---
+title: Backstage has been accepted into the CNCF Sandbox
+author: Stefan à lund
+authorURL: https://twitter.com/stalund
+---
+
+**TL;DR** The Cloud Native Computing Foundation (CNCF) announced that Backstage can begin incubating as an early stage project in the [CNCF Sandbox](https://www.cncf.io/sandbox-projects/). Released open source in March, the platform is built around an advanced service catalog and is designed to streamline software development from end to end.
+
+
+
+
+
+Backstage garnered quite a bit of interest from developers and organizations when it was first announced, and community interest continues to grow as plugins and new features are added with the open source community. We released the open source version of Backstage âearlyâ. That was intentional. Because even though weâve been using Backstage internally for years, we wanted the open source version to be developed with input and contributions from the community. And thatâs exactly the product thatâs going into the [CNCF Sandbox](https://www.cncf.io/sandbox-projects/) today.
+
+Backstageâs ability to simplify tooling and standardize engineering practices has attracted interest from other major tech companies, as well as airlines, auto manufacturers, investment firms, and global retailers. We know that Backstage solves a problem â infrastructure complexity â thatâs common to a lot of large and growing companies today. But different companies work differently, use particular toolsets, and have unique use cases. By making Backstage open source, we can build it with people working inside a variety of engineering organizations all over the world. It makes for a better product that serves a wider group of users (beyond that of Spotifyâs) and their needs.
+
+The Backstage community is healthy and growing quickly. Over [130 people](https://github.com/spotify/backstage/graphs/contributors) have contributed to the project, and roughly 40% of pull requests are now coming from external, non-Spotify, contributors. With companies now deciding to [adopt Backstage](https://github.com/spotify/backstage/blob/master/ADOPTERS.md) we are also seeing a shift in the kinds of contributions we are getting from the community. It is truly amazing to see contributions to core parts of the platform as well as significant functionality additions through working [plugins](https://backstage.io/plugins).
+
+Weâre excited to embark on this journey with the CNCF community. Thereâs so much great tech being built here, and itâs about time we share it to build even greater products, together. Entering into the CNCF Sandbox is just the first step. We are committed to working with the community to bring Backstage through the Incubation step, and finally all the way to becoming a Graduated, top-level project.
+
+Thanks to everyone for your support so far. We hope you [join us](https://mailchi.mp/spotify/backstage-community) in this next chapter of Backstage's journey. If you have questions or feedback, feel free to [email](mailto:alund@spotify.com) me directly.
diff --git a/microsite/blog/2020-09-30-backstage-design-system.md b/microsite/blog/2020-09-30-backstage-design-system.md
new file mode 100644
index 0000000000..4faea98782
--- /dev/null
+++ b/microsite/blog/2020-09-30-backstage-design-system.md
@@ -0,0 +1,107 @@
+---
+title: How to design for Backstage (even if youâre not a designer)
+author: Kat Zhou
+authorURL: http://twitter.com/katherinemzhou
+---
+
+
+
+We are excited to launch the Backstage Design System, which includes a [Figma UI kit](https://www.figma.com/community/file/850673348101741100), a rich set of [reusable code components](http://backstage.io/storybook) on Storybook, and [Guidelines](https://backstage.io/docs/dls/design) for designers and developers as they build plugins for Backstage.
+
+
+
+## Not just the way it looks
+
+We see great design as one of the secret weapons of Backstage. Design should never be an afterthought â we believe an elegant, cohesive UX is vital to what makes Backstage such a productive, end-to-end development environment.
+
+Backstage keeps engineers from getting lost inside the complexity of your infrastructure by bringing order to your software ecosystem (through the [service catalog](https://backstage.io/blog/2020/06/22/backstage-service-catalog-alpha)) and providing an abstraction layer on top of it. How that abstraction layer works is essential to how Backstage works. So weâve spent time figuring out how to make great design in Backstage easier to achieve for both designers and non-designers alike.
+
+Since making Backstage open source, weâve been able to host design studios and user interviews with teams outside Spotify to get feedback and collaborate on a design system, together. (And weâre always keen on collaborating with more organizations.)
+
+
+_Screenshot of our design studio for Backstage Search, which included stakeholders inside and outside of Spotify._
+
+As Backstage has gained traction, weâve seen the importance of creating a scalable and coherent design system. Itâs through the shared guidelines of our design system that we are able to maintain a unified ecosystem of plugins for our users, globally. Letâs get started by taking a closer look at the different design components of a plugin.
+
+## Anatomy of a plugin
+
+
+
+Plugins are what provide the feature functionality in Backstage, allowing you to customize it to fit your infrastructure. They are integrated into Backstage's frontend, so that no matter what tool or service is being accessed, users are guaranteed a seamless experience.
+
+As you begin to [build your own plugins](https://backstage.io/docs/plugins/), we encourage you to explore the [open source plugins](https://backstage.io/plugins) we have available in Backstage, as reference. The anatomy of a plugin is simple. In the example below, weâve highlighted a few of the standard components you should consider when designing your plugin.
+
+
+
+1. **Tabs.** Want to include multiple pages in your plugin? Use our tab component so users can easily navigate through your plugin.
+2. **Title.** Plugin pages should always have a title. Subheads are optional. Typically, the âstarâ icon is included in the overview tab, which allows the user to favorite the plugin, adding it to the side navigation.
+3. **Cards.** Use the card components to display different kinds of content and functionality. You can follow our 12-column, responsive grid system to arrange the cards.
+4. **Support.** There should always be a support button (tertiary style, with icon). There can also be a primary action button as well as a secondary one.
+5. **Header.** Use the Backstage header to allow for users to easily understand what theyâre looking at. You can include an optional subhead as well as other information. The color varies depending on the type of plugin youâve built (stand-alone tool, service, app, website, etc.).
+
+Now that weâve familiarized ourselves with the basic parts of a plugin, letâs take a look at some of the tools and resources that make designing plugins even easier.
+
+## Tools and resources
+
+The quickest way to start is by duplicating our [Figma UI kit](https://www.figma.com/community/file/850673348101741100), then clicking on the Create a Plugin page on the left-hand side to grab some templates. Feel free to experiment and play around! Figma is a fantastic, multiplayer tool that allows for designers and developers to co-create components and share specs with ease. Weâre excited to see what you design and develop.
+
+As youâre designing and building your plugins, make sure to take advantage of these helpful resources.
+
+
+
+
+### [Figma Community](https://www.figma.com/@backstage)
+
+We are thrilled to be using [Figma Community](https://www.figma.com/@backstage) to share our design assets. You can duplicate our UI kit and design your own plugin for Backstage. Figma Community is currently in beta, so this is a neat opportunity to be testing out a new way of working. At the moment, it doesnât support auto-updating of duplicated files, so weâll be announcing new versions of our UI kit on Discord in the #design channel.
+
+
+
+### [Storybook](https://backstage.io/storybook/)
+
+You can view (and grab) our [reusable components on Storybook](https://backstage.io/storybook/). If youâd like to help build up our design system, you can also help us add components that weâve designed to Storybook as well. We post newly designed components and patterns to GitHub as issues, where contributors can pick them up and add them to our Storybook so theyâre available for the rest of the Backstage community.
+
+
+
+### [Guidelines](https://backstage.io/docs/dls/design)
+
+To keep up with our latest design guidelines, go to [Designing for Backstage](https://backstage.io/docs/dls/design). Youâll find more how-toâs and you can also learn more about our design philosophy and practices there. Down the line, we plan on including more in-depth component rules in this section (i.e., dos/donâts, use cases, etc.).
+
+
+
+### [GitHub](https://github.com/spotify/backstage)
+
+Join in on the action [at spotify/backstage on GitHub](https://github.com/spotify/backstage) by submitting issues and opening pull requests for all things related to components and patterns in Backstage.
+
+
+
+### [Discord](https://discord.com/invite/MUpMjP2)
+
+All design questions should be directed to the [#design](https://discord.com/channels/687207715902193673/696709358544879716) channel in [Discord](https://discord.com/invite/MUpMjP2).
+
+## What's next for Backstage design
+
+There are a lot of exciting things that weâre envisioning for Backstage and open source design at Spotify. These include:
+
+- Expanding our Backstage Design System by building on the UI kit and component library in Figma and Storybook
+
+* Collaborating with more of our amazing contributors to ensure our Backstage Design System works for everyone
+
+* Featuring rad plugins that folks have created, using our design system, in our Figma Community space
+
+* Building up our Guidelines by continuing to creating robust design documentation
+
+* Ensuring that we maintain accessible practices throughout our experience
+
+
+
+## Get involved
+
+Designing in the open needs to be democratic and participatory, which is why we invite you to join in on the fun! There are a couple things you can do to get involved, such as:
+
+- **Build with us!** Are there components/plugins that youâd like to see in Backstage? Feel free to create an example/prototype of what youâre envisioning and create a UX component issue in our GitHub repo.
+
+- **Chat with us!** If you have questions, ideas, or puppy GIFs, feel free to reach out to us on Discord in the #design channel.
+
+- **Share with us!** One of our priorities is making Backstage more accessible, and we need your help. If youâve got A11Y insights and ideas on how we can improve our product, please let us know!
+
+- **Work with us!** We are hiring for product designers to work on Backstage. We strongly stand for breaking traditional pipelines and elevating our caliber by hiring the best folks who are underrepresented minorities in tech today. Keen on joining? Know someone who has a knack for open source design and design systems? Send a direct message to @katz on Discord!
diff --git a/microsite/blog/2020-09-30-plugin-marketplace.md b/microsite/blog/2020-09-30-plugin-marketplace.md
new file mode 100644
index 0000000000..b7a799097f
--- /dev/null
+++ b/microsite/blog/2020-09-30-plugin-marketplace.md
@@ -0,0 +1,43 @@
+---
+title: The Plugin Marketplace is open
+author: Stefan à lund
+authorURL: https://twitter.com/stalund
+---
+
+Backstage has an ambitious goal: to provide engineers with the best possible developer experience.
+
+A great developer experience leads to happy, creative, and productive engineers. Our belief is that engineers should not have to be experts in various infrastructure tools or disciplines (e.g., machine learning or backend) to be productive. Infrastructure should be abstracted away, so that developers can spend more cycles building and testing, quickly and safely. Backstage unifies all your infrastructure tooling, services, and documentation to create a streamlined development environment from end to end.
+
+Now you may be thinking, âYeah, sure, that sounds nice and all, but how does Backstage actually abstract away infrastructure?â The short answer: [plugins](https://backstage.io/plugins).
+
+
+
+
+
+Think of plugins as a mini version of an infrastructure tool or service â just the parts you need, made quick and easy. The advantage of using a Backstage plugin instead of a toolâs dedicated UI is that all your infrastructure is packaged into a âsingle pane of glassâ instead of being spread out like independently built âislandsâ. Once you grow your infrastructure portfolio, the complexity really starts to add up. The Backstage plugin model allows you to add more tools without increasing the cognitive load for your users.
+
+Our goal for the plugin ecosystem is that anything can be a plugin. The definition of a plugin is flexible enough to allow you to expose pretty much any kind of infrastructure or software development tool as a plugin in Backstage. By following clear [design guidelines](https://backstage.io/blog/2020/09/30/backstage-design-system) we ensure the overall user experience stays consistent between plugins. If we all do our job well, the end user of Backstage does not see the boundaries between plugins. They are interacting with one consistent product â with many features.
+
+## Building an ecosystem
+
+Imagine a not-so-distant future where you walk up to Backstage, install it in your environment, and then choose from a gallery of existing, open source plugins that serve and match whatever infrastructure and software development needs you have inside your company. That means you can get started with Backstage and see the gains of improved productivity within days, not months. That is our vision for the Backstage plugin ecosystem.
+
+Running services on Kubernetes? Thereâs a plugin for that. Using Snyk for security scanning? Thereâs a plugin for that. Grafana, DataDog, or Rollbar for monitoring? Thereâs a plugin for that. Using Jenkins, CircleCI, GitHub Actions, or Travis CI? Pick the CI plugin of your choice. You get the picture. Regardless of your stack, thereâs a plugin that you can use.
+
+Like this vision? So do we! But we canât do it alone. Weâll need your help. For this vision to come true, we need to foster a community where many companies and individual developers build and contribute their plugins. Having been [accepted into the CNCF Sandbox](https://backstage.io/blog/2020/09/23/backstage-cncf-sandbox) provides us with the groundwork and guidance to broaden the community even faster.
+
+This grand vision is actually not that far off. Already today there is a growing ecosystem of Backstage plugins. To highlight all the amazing work that has been done by the community, and make it easier for Backstage adopters to see what plugins are available, we now have a Plugin Marketplace: [https://backstage.io/plugins](https://backstage.io/plugins)
+
+
+
+## Creating and suggesting new plugins
+
+Not all plugins you need will be open source. Every company has their own homegrown tooling. Building internal plugins lets you tailor your version of Backstage to be a perfect fit for your infrastructure and software development needs. If you end up [building plugins](https://backstage.io/docs/plugins/create-a-plugin) that could be useful for other companies, please consider releasing them as open source and [add them to the Marketplace](https://backstage.io/docs/plugins/add-to-marketplace).
+
+If you start developing a plugin that you aim to release as open source, we suggest that you create a [new plugin Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development and opens up opportunities for collaboration. You can also use this process if you have an idea for a good plugin, but you need help building it.
+
+We are really excited to see all the amazing plugins that have already been built, and look forward to seeing even more ideas and collaboration as the Backstage community continues to grow.
+
+What plugins would you like to see in the Plugin Marketplace? [Tell us](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME)!
+
+_Special shout-out to community member [Iain Billett](https://github.com/iain-b) from Roadie for helping build and contribute the [Plugin Marketplace page](https://backstage.io/plugins) (as his first PR no less!)._
diff --git a/microsite/blog/assets/2/screen.gif b/microsite/blog/assets/2/screen.gif
index a0d52a23b4..f790d639cc 100644
Binary files a/microsite/blog/assets/2/screen.gif and b/microsite/blog/assets/2/screen.gif differ
diff --git a/microsite/blog/assets/20-05-20/Service_Catalog_MVP.png b/microsite/blog/assets/20-05-20/Service_Catalog_MVP.png
index 4a50f17d15..386b195ea9 100644
Binary files a/microsite/blog/assets/20-05-20/Service_Catalog_MVP.png and b/microsite/blog/assets/20-05-20/Service_Catalog_MVP.png differ
diff --git a/microsite/blog/assets/20-05-20/Service_Catalog_MVP_service.png b/microsite/blog/assets/20-05-20/Service_Catalog_MVP_service.png
index 8067f665c9..1a48b1900c 100644
Binary files a/microsite/blog/assets/20-05-20/Service_Catalog_MVP_service.png and b/microsite/blog/assets/20-05-20/Service_Catalog_MVP_service.png differ
diff --git a/microsite/blog/assets/20-05-20/tabs.png b/microsite/blog/assets/20-05-20/tabs.png
index 4a5b11f6fe..71516b6846 100644
Binary files a/microsite/blog/assets/20-05-20/tabs.png and b/microsite/blog/assets/20-05-20/tabs.png differ
diff --git a/microsite/blog/assets/20-07-01/auth-landing.png b/microsite/blog/assets/20-07-01/auth-landing.png
index e00f4c2e43..064802c90f 100644
Binary files a/microsite/blog/assets/20-07-01/auth-landing.png and b/microsite/blog/assets/20-07-01/auth-landing.png differ
diff --git a/microsite/blog/assets/20-07-01/auth-sidebar.png b/microsite/blog/assets/20-07-01/auth-sidebar.png
index b089ab6c0a..7c72a96ab5 100644
Binary files a/microsite/blog/assets/20-07-01/auth-sidebar.png and b/microsite/blog/assets/20-07-01/auth-sidebar.png differ
diff --git a/microsite/blog/assets/2020-08-05/cards.png b/microsite/blog/assets/2020-08-05/cards.png
index 4779618b92..a3e038ce1a 100644
Binary files a/microsite/blog/assets/2020-08-05/cards.png and b/microsite/blog/assets/2020-08-05/cards.png differ
diff --git a/microsite/blog/assets/2020-08-05/catalog.png b/microsite/blog/assets/2020-08-05/catalog.png
index e9c0c65ade..b1f3680511 100644
Binary files a/microsite/blog/assets/2020-08-05/catalog.png and b/microsite/blog/assets/2020-08-05/catalog.png differ
diff --git a/microsite/blog/assets/2020-08-05/create-component.png b/microsite/blog/assets/2020-08-05/create-component.png
index 4d815393fc..7f0c630d58 100644
Binary files a/microsite/blog/assets/2020-08-05/create-component.png and b/microsite/blog/assets/2020-08-05/create-component.png differ
diff --git a/microsite/blog/assets/2020-08-05/template-form.png b/microsite/blog/assets/2020-08-05/template-form.png
index 5805243f59..0643a7f3e8 100644
Binary files a/microsite/blog/assets/2020-08-05/template-form.png and b/microsite/blog/assets/2020-08-05/template-form.png differ
diff --git a/microsite/blog/assets/2020-08-05/templates.png b/microsite/blog/assets/2020-08-05/templates.png
index e350d463f6..af76121a72 100644
Binary files a/microsite/blog/assets/2020-08-05/templates.png and b/microsite/blog/assets/2020-08-05/templates.png differ
diff --git a/microsite/blog/assets/3/audit-list.png b/microsite/blog/assets/3/audit-list.png
index 84b64f976a..df18b9923f 100644
Binary files a/microsite/blog/assets/3/audit-list.png and b/microsite/blog/assets/3/audit-list.png differ
diff --git a/microsite/blog/assets/3/audit-view.png b/microsite/blog/assets/3/audit-view.png
index a2e9716cf4..df5f5691b0 100644
Binary files a/microsite/blog/assets/3/audit-view.png and b/microsite/blog/assets/3/audit-view.png differ
diff --git a/microsite/blog/assets/3/create-audit.png b/microsite/blog/assets/3/create-audit.png
index cb28de73a4..2b22d66b18 100644
Binary files a/microsite/blog/assets/3/create-audit.png and b/microsite/blog/assets/3/create-audit.png differ
diff --git a/microsite/blog/assets/3/lead-copy.png b/microsite/blog/assets/3/lead-copy.png
index fbf247eec8..8476461909 100644
Binary files a/microsite/blog/assets/3/lead-copy.png and b/microsite/blog/assets/3/lead-copy.png differ
diff --git a/microsite/blog/assets/3/lead.png b/microsite/blog/assets/3/lead.png
index 4b60c4961c..639b5b4a9e 100644
Binary files a/microsite/blog/assets/3/lead.png and b/microsite/blog/assets/3/lead.png differ
diff --git a/microsite/blog/assets/4/create-app.png b/microsite/blog/assets/4/create-app.png
index 52dcc13097..5ff683e5d0 100644
Binary files a/microsite/blog/assets/4/create-app.png and b/microsite/blog/assets/4/create-app.png differ
diff --git a/microsite/blog/assets/4/welcome.png b/microsite/blog/assets/4/welcome.png
index 5de0d57098..e217fda699 100644
Binary files a/microsite/blog/assets/4/welcome.png and b/microsite/blog/assets/4/welcome.png differ
diff --git a/microsite/blog/assets/5/lead.png b/microsite/blog/assets/5/lead.png
index 657268fc09..615cf4d349 100644
Binary files a/microsite/blog/assets/5/lead.png and b/microsite/blog/assets/5/lead.png differ
diff --git a/microsite/blog/assets/6/header.png b/microsite/blog/assets/6/header.png
index 6908e40dbc..3c39971d36 100644
Binary files a/microsite/blog/assets/6/header.png and b/microsite/blog/assets/6/header.png differ
diff --git a/microsite/blog/assets/Backstage-mural-DS.png b/microsite/blog/assets/Backstage-mural-DS.png
new file mode 100644
index 0000000000..6e2021a37c
Binary files /dev/null and b/microsite/blog/assets/Backstage-mural-DS.png differ
diff --git a/microsite/blog/assets/announcing-techdocs/discover1.png b/microsite/blog/assets/announcing-techdocs/discover1.png
index 5b23e64b43..33869b4d64 100644
Binary files a/microsite/blog/assets/announcing-techdocs/discover1.png and b/microsite/blog/assets/announcing-techdocs/discover1.png differ
diff --git a/microsite/blog/assets/announcing-techdocs/discover2.png b/microsite/blog/assets/announcing-techdocs/discover2.png
index 3737ee68db..e7ed8d39fe 100644
Binary files a/microsite/blog/assets/announcing-techdocs/discover2.png and b/microsite/blog/assets/announcing-techdocs/discover2.png differ
diff --git a/microsite/blog/assets/announcing-techdocs/docs-in-backstage.png b/microsite/blog/assets/announcing-techdocs/docs-in-backstage.png
index f3b724ff4f..ee8b4dead0 100644
Binary files a/microsite/blog/assets/announcing-techdocs/docs-in-backstage.png and b/microsite/blog/assets/announcing-techdocs/docs-in-backstage.png differ
diff --git a/microsite/blog/assets/announcing-techdocs/feedback-loop1.png b/microsite/blog/assets/announcing-techdocs/feedback-loop1.png
index 4e2d0de5df..d78144bded 100644
Binary files a/microsite/blog/assets/announcing-techdocs/feedback-loop1.png and b/microsite/blog/assets/announcing-techdocs/feedback-loop1.png differ
diff --git a/microsite/blog/assets/announcing-techdocs/feedback-loop2.png b/microsite/blog/assets/announcing-techdocs/feedback-loop2.png
index 516780e3ac..5177451c9e 100644
Binary files a/microsite/blog/assets/announcing-techdocs/feedback-loop2.png and b/microsite/blog/assets/announcing-techdocs/feedback-loop2.png differ
diff --git a/microsite/blog/assets/announcing-techdocs/github-issues.png b/microsite/blog/assets/announcing-techdocs/github-issues.png
index 3d5f3465c0..dfe345bd0a 100644
Binary files a/microsite/blog/assets/announcing-techdocs/github-issues.png and b/microsite/blog/assets/announcing-techdocs/github-issues.png differ
diff --git a/microsite/blog/assets/announcing-techdocs/metrics.png b/microsite/blog/assets/announcing-techdocs/metrics.png
index b332a65b0d..58e63951bf 100644
Binary files a/microsite/blog/assets/announcing-techdocs/metrics.png and b/microsite/blog/assets/announcing-techdocs/metrics.png differ
diff --git a/microsite/blog/assets/backstage-DS-header.png b/microsite/blog/assets/backstage-DS-header.png
new file mode 100644
index 0000000000..2637bcc2a3
Binary files /dev/null and b/microsite/blog/assets/backstage-DS-header.png differ
diff --git a/microsite/blog/assets/backstage-discord-DS.png b/microsite/blog/assets/backstage-discord-DS.png
new file mode 100644
index 0000000000..bfee45ff18
Binary files /dev/null and b/microsite/blog/assets/backstage-discord-DS.png differ
diff --git a/microsite/blog/assets/backstage-figma1-DS.png b/microsite/blog/assets/backstage-figma1-DS.png
new file mode 100644
index 0000000000..c2c32a00cb
Binary files /dev/null and b/microsite/blog/assets/backstage-figma1-DS.png differ
diff --git a/microsite/blog/assets/backstage-figma2-ds.png b/microsite/blog/assets/backstage-figma2-ds.png
new file mode 100644
index 0000000000..d5e4fa7d9d
Binary files /dev/null and b/microsite/blog/assets/backstage-figma2-ds.png differ
diff --git a/microsite/blog/assets/backstage-github-ds.png b/microsite/blog/assets/backstage-github-ds.png
new file mode 100644
index 0000000000..297056de6b
Binary files /dev/null and b/microsite/blog/assets/backstage-github-ds.png differ
diff --git a/microsite/blog/assets/backstage-guide-DS.png b/microsite/blog/assets/backstage-guide-DS.png
new file mode 100644
index 0000000000..4d57201010
Binary files /dev/null and b/microsite/blog/assets/backstage-guide-DS.png differ
diff --git a/microsite/blog/assets/backstage-guidelines-ds.png b/microsite/blog/assets/backstage-guidelines-ds.png
new file mode 100644
index 0000000000..3176a694db
Binary files /dev/null and b/microsite/blog/assets/backstage-guidelines-ds.png differ
diff --git a/microsite/blog/assets/backstage-storybook-ds.png b/microsite/blog/assets/backstage-storybook-ds.png
new file mode 100644
index 0000000000..94d255b154
Binary files /dev/null and b/microsite/blog/assets/backstage-storybook-ds.png differ
diff --git a/microsite/blog/assets/backstage-world-DS.png b/microsite/blog/assets/backstage-world-DS.png
new file mode 100644
index 0000000000..354bf62829
Binary files /dev/null and b/microsite/blog/assets/backstage-world-DS.png differ
diff --git a/microsite/blog/assets/blog_1.png b/microsite/blog/assets/blog_1.png
index f8c3516fa7..7667c54538 100644
Binary files a/microsite/blog/assets/blog_1.png and b/microsite/blog/assets/blog_1.png differ
diff --git a/microsite/blog/assets/cncf-sandbox/cncf.png b/microsite/blog/assets/cncf-sandbox/cncf.png
new file mode 100644
index 0000000000..2edfeb9c8e
Binary files /dev/null and b/microsite/blog/assets/cncf-sandbox/cncf.png differ
diff --git a/microsite/blog/assets/illustration.svg b/microsite/blog/assets/illustration.svg
index 50e865ed4f..bba49c0449 100644
--- a/microsite/blog/assets/illustration.svg
+++ b/microsite/blog/assets/illustration.svg
@@ -1,104 +1 @@
-
+
\ No newline at end of file
diff --git a/microsite/blog/assets/marketplace.png b/microsite/blog/assets/marketplace.png
new file mode 100644
index 0000000000..01132b6aa2
Binary files /dev/null and b/microsite/blog/assets/marketplace.png differ
diff --git a/microsite/core/Footer.js b/microsite/core/Footer.js
index 761862c1fc..8e3c4c086d 100644
--- a/microsite/core/Footer.js
+++ b/microsite/core/Footer.js
@@ -51,6 +51,7 @@ class Footer extends React.Component {
Subscribe to our newsletter
+ CNCF Sandbox
Open source plugins that you can add to your Backstage deployment.
Learn how to build a plugin.
@@ -39,7 +39,7 @@ const Plugins = () => (
className="PluginAddNewButton ButtonFilled"
href={addPluginDocsLink}
>
- Add to marketplace
+ Add to Marketplace
+);
diff --git a/packages/core/src/components/EmptyState/EmptyState.test.tsx b/packages/core/src/components/EmptyState/EmptyState.test.tsx
new file mode 100644
index 0000000000..c5bc7a9876
--- /dev/null
+++ b/packages/core/src/components/EmptyState/EmptyState.test.tsx
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * 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 React from 'react';
+import { EmptyState } from './EmptyState';
+import { renderWithEffects, wrapInTestApp } from '@backstage/test-utils';
+import { Button } from '@material-ui/core';
+
+describe('', () => {
+ it('render EmptyState component with type annotaion is missing', async () => {
+ const rendered = await renderWithEffects(
+ wrapInTestApp(
+ DOCS}
+ />,
+ ),
+ );
+ expect(
+ rendered.getByText('Your plugin is missing an annotation'),
+ ).toBeInTheDocument();
+ expect(rendered.getByLabelText('button')).toBeInTheDocument();
+ expect(rendered.getByTestId('missingAnnotation')).toBeInTheDocument();
+ });
+});
diff --git a/packages/core/src/components/EmptyState/EmptyState.tsx b/packages/core/src/components/EmptyState/EmptyState.tsx
new file mode 100644
index 0000000000..4469c3ce86
--- /dev/null
+++ b/packages/core/src/components/EmptyState/EmptyState.tsx
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * 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 React from 'react';
+import { makeStyles, Typography, Grid } from '@material-ui/core';
+import { EmptyStateImage } from './EmptyStateImage';
+import Background from './assets/Background.svg';
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing(2, 0, 0, 0),
+ },
+ action: {
+ marginTop: theme.spacing(2),
+ },
+ imageContainer: {
+ position: 'relative',
+ },
+ backgroundImage: {
+ position: 'absolute',
+ width: '100%',
+ },
+}));
+
+type Props = {
+ title: string;
+ description?: string;
+ missing: 'field' | 'info' | 'content' | 'data';
+ action?: JSX.Element;
+};
+
+export const EmptyState = ({ title, description, missing, action }: Props) => {
+ const classes = useStyles();
+ return (
+
+
+
+ {title}
+
+
+ {description}
+
+
+ {action}
+
+
+
+
+
+
+
+ );
+};
diff --git a/packages/core/src/components/EmptyState/EmptyStateImage.tsx b/packages/core/src/components/EmptyState/EmptyStateImage.tsx
new file mode 100644
index 0000000000..49598ae6db
--- /dev/null
+++ b/packages/core/src/components/EmptyState/EmptyStateImage.tsx
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * 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 React from 'react';
+import missingAnnotation from './assets/missingAnnotation.svg';
+import noInformation from './assets/noInformation.svg';
+import createComponent from './assets/createComponent.svg';
+import noBuild from './assets/noBuild.svg';
+import { makeStyles } from '@material-ui/core';
+
+type Props = {
+ missing: 'field' | 'info' | 'content' | 'data';
+};
+
+const useStyles = makeStyles({
+ generalImg: {
+ width: '75%',
+ zIndex: 2,
+ position: 'absolute',
+ left: '50%',
+ top: '50%',
+ transform: 'translate(-50%, 15%)',
+ },
+});
+
+export const EmptyStateImage = ({ missing }: Props) => {
+ const classes = useStyles();
+ switch (missing) {
+ case 'field':
+ return (
+
+ );
+ case 'info':
+ return (
+
+ );
+ case 'content':
+ return (
+
+ );
+ case 'data':
+ return (
+
+ );
+ default:
+ return null;
+ }
+};
diff --git a/packages/core/src/components/EmptyState/MissingAnnotationEmptyState.tsx b/packages/core/src/components/EmptyState/MissingAnnotationEmptyState.tsx
new file mode 100644
index 0000000000..d8847fdf47
--- /dev/null
+++ b/packages/core/src/components/EmptyState/MissingAnnotationEmptyState.tsx
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * 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 React from 'react';
+import { Button, makeStyles, Typography } from '@material-ui/core';
+import { BackstageTheme } from '@backstage/theme';
+import { EmptyState } from './EmptyState';
+import { CodeSnippet } from '../CodeSnippet';
+
+const COMPONENT_YAML = `# Example
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: example
+ description: example.com
+ annotations:
+ ANNOTATION: value
+spec:
+ type: website
+ lifecycle: production
+ owner: guest
+`;
+
+type Props = {
+ annotation: string;
+};
+
+const useStyles = makeStyles(theme => ({
+ code: {
+ borderRadius: 6,
+ margin: `${theme.spacing(2)}px 0px`,
+ background: theme.palette.type === 'dark' ? '#444' : '#fff',
+ },
+}));
+
+export const MissingAnnotationEmptyState = ({ annotation }: Props) => {
+ const classes = useStyles();
+ return (
+
+
+ Add the annotation to your component YAML as shown in the
+ highlighted example below:
+
+
+
+
+
+ >
+ }
+ />
+ );
+};
diff --git a/packages/core/src/components/EmptyState/assets/Background.svg b/packages/core/src/components/EmptyState/assets/Background.svg
new file mode 100644
index 0000000000..ce9aae6739
--- /dev/null
+++ b/packages/core/src/components/EmptyState/assets/Background.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/core/src/components/EmptyState/assets/createComponent.svg b/packages/core/src/components/EmptyState/assets/createComponent.svg
new file mode 100644
index 0000000000..bb8b50e1ef
--- /dev/null
+++ b/packages/core/src/components/EmptyState/assets/createComponent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/core/src/components/EmptyState/assets/missingAnnotation.svg b/packages/core/src/components/EmptyState/assets/missingAnnotation.svg
new file mode 100644
index 0000000000..39534656fa
--- /dev/null
+++ b/packages/core/src/components/EmptyState/assets/missingAnnotation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/core/src/components/EmptyState/assets/noBuild.svg b/packages/core/src/components/EmptyState/assets/noBuild.svg
new file mode 100644
index 0000000000..ef45e1c736
--- /dev/null
+++ b/packages/core/src/components/EmptyState/assets/noBuild.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/core/src/components/EmptyState/assets/noInformation.svg b/packages/core/src/components/EmptyState/assets/noInformation.svg
new file mode 100644
index 0000000000..9a1c230e97
--- /dev/null
+++ b/packages/core/src/components/EmptyState/assets/noInformation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/core/src/components/EmptyState/index.ts b/packages/core/src/components/EmptyState/index.ts
new file mode 100644
index 0000000000..2e2a88be94
--- /dev/null
+++ b/packages/core/src/components/EmptyState/index.ts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * 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 { EmptyState } from './EmptyState';
+export { MissingAnnotationEmptyState } from './MissingAnnotationEmptyState';
diff --git a/packages/core/src/components/ProgressBars/Gauge.stories.tsx b/packages/core/src/components/ProgressBars/Gauge.stories.tsx
new file mode 100644
index 0000000000..6599b0f768
--- /dev/null
+++ b/packages/core/src/components/ProgressBars/Gauge.stories.tsx
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * 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 React from 'react';
+import { Gauge } from './Gauge';
+
+const containerStyle = { width: 300 };
+
+export default {
+ title: 'Gauge',
+ component: Gauge,
+};
+
+export const Default = () => (
+
+);
diff --git a/packages/core/src/components/ProgressBars/GaugeProgress.test.jsx b/packages/core/src/components/ProgressBars/Gauge.test.jsx
similarity index 82%
rename from packages/core/src/components/ProgressBars/GaugeProgress.test.jsx
rename to packages/core/src/components/ProgressBars/Gauge.test.jsx
index 778abdf12c..709de7b0c4 100644
--- a/packages/core/src/components/ProgressBars/GaugeProgress.test.jsx
+++ b/packages/core/src/components/ProgressBars/Gauge.test.jsx
@@ -17,32 +17,32 @@
import React from 'react';
import { render } from '@testing-library/react';
import { wrapInTestApp } from '@backstage/test-utils';
-import { GaugeProgress, getProgressColor } from './GaugeProgress';
+import { Gauge, getProgressColor } from './Gauge';
-describe('', () => {
+describe('', () => {
it('renders without exploding', () => {
const { getByText } = render(
- wrapInTestApp(),
+ wrapInTestApp(),
);
getByText('10%');
});
it('handles fractional prop', () => {
const { getByText } = render(
- wrapInTestApp(),
+ wrapInTestApp(),
);
getByText('10%');
});
it('handles max prop', () => {
const { getByText } = render(
- wrapInTestApp(),
+ wrapInTestApp(),
);
getByText('1%');
});
it('handles unit prop', () => {
const { getByText } = render(
- wrapInTestApp(),
+ wrapInTestApp(),
);
getByText('10m');
});
diff --git a/packages/core/src/components/ProgressBars/GaugeProgress.tsx b/packages/core/src/components/ProgressBars/Gauge.tsx
similarity index 98%
rename from packages/core/src/components/ProgressBars/GaugeProgress.tsx
rename to packages/core/src/components/ProgressBars/Gauge.tsx
index 14776ed431..4c339bf8e1 100644
--- a/packages/core/src/components/ProgressBars/GaugeProgress.tsx
+++ b/packages/core/src/components/ProgressBars/Gauge.tsx
@@ -77,7 +77,7 @@ export function getProgressColor(
return palette.status.ok;
}
-export const GaugeProgress: FC = props => {
+export const Gauge: FC = props => {
const classes = useStyles(props);
const theme = useTheme();
const { value, fractional, inverse, unit, max } = {
diff --git a/packages/core/src/components/ProgressBars/GaugeCard.tsx b/packages/core/src/components/ProgressBars/GaugeCard.tsx
index fc7055f705..4eb4b2e075 100644
--- a/packages/core/src/components/ProgressBars/GaugeCard.tsx
+++ b/packages/core/src/components/ProgressBars/GaugeCard.tsx
@@ -18,7 +18,7 @@ import React, { FC } from 'react';
import { makeStyles } from '@material-ui/core';
import { InfoCard } from '../../layout/InfoCard';
import { BottomLinkProps } from '../../layout/BottomLink';
-import { GaugeProgress } from './GaugeProgress';
+import { Gauge } from './Gauge';
type Props = {
title: string;
@@ -48,7 +48,7 @@ export const GaugeCard: FC = props => {
deepLink={deepLink}
variant={variant}
>
-
+
);
diff --git a/packages/core/src/components/ProgressBars/LinearGauge.tsx b/packages/core/src/components/ProgressBars/LinearGauge.tsx
index 73163b345f..2b8e77838d 100644
--- a/packages/core/src/components/ProgressBars/LinearGauge.tsx
+++ b/packages/core/src/components/ProgressBars/LinearGauge.tsx
@@ -19,7 +19,7 @@ import { Tooltip, useTheme } from '@material-ui/core';
// @ts-ignore
import { Line } from 'rc-progress';
import { BackstageTheme } from '@backstage/theme';
-import { getProgressColor } from './GaugeProgress';
+import { getProgressColor } from './Gauge';
type Props = {
/**
diff --git a/packages/core/src/components/ProgressBars/index.ts b/packages/core/src/components/ProgressBars/index.ts
index c7131c8831..4463aea29b 100644
--- a/packages/core/src/components/ProgressBars/index.ts
+++ b/packages/core/src/components/ProgressBars/index.ts
@@ -15,5 +15,5 @@
*/
export { GaugeCard } from './GaugeCard';
-export { GaugeProgress } from './GaugeProgress';
+export { Gauge } from './Gauge';
export { LinearGauge } from './LinearGauge';
diff --git a/packages/core/src/components/StructuredMetadataTable/MetadataTable.tsx b/packages/core/src/components/StructuredMetadataTable/MetadataTable.tsx
index 1d863db764..b34e535a00 100644
--- a/packages/core/src/components/StructuredMetadataTable/MetadataTable.tsx
+++ b/packages/core/src/components/StructuredMetadataTable/MetadataTable.tsx
@@ -71,13 +71,7 @@ export const MetadataTable = ({
dense?: boolean;
children: React.ReactNode;
}) => (
-
- {!dense && (
-
-
-
-
- )}
+
{children}
);
diff --git a/packages/core/src/components/StructuredMetadataTable/README.md b/packages/core/src/components/StructuredMetadataTable/README.md
index 452d32490f..60952e5e34 100644
--- a/packages/core/src/components/StructuredMetadataTable/README.md
+++ b/packages/core/src/components/StructuredMetadataTable/README.md
@@ -23,7 +23,7 @@ The component itself only handles the display area, so you can use standard JS t
This will step through each of the keys and based on their types display them in a logical way.
-### Primatives
+### Primitives
Any non complex value will be displayed using `{value}` which will just output the value as text.
diff --git a/packages/core/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx b/packages/core/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx
index bdf0f65375..9db7385872 100644
--- a/packages/core/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx
+++ b/packages/core/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx
@@ -56,3 +56,16 @@ export const Default = () => (
);
+
+export const NotDenseTable = () => (
+
+
+