diff --git a/.changeset/breezy-ways-try.md b/.changeset/breezy-ways-try.md
deleted file mode 100644
index 15e831a673..0000000000
--- a/.changeset/breezy-ways-try.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-'@backstage/cli': minor
----
-
-Switch from `ts-jest` to `@sucrase/jest-plugin`, improving performance and aligning transpilation with bundling.
-
-In order to switch back to `ts-jest`, install `ts-jest@^26.4.3` as a dependency in the root of your repo and add the following in the root `package.json`:
-
-```json
-"jest": {
- "globals": {
- "ts-jest": {
- "isolatedModules": true
- }
- },
- "transform": {
- "\\.esm\\.js$": "@backstage/cli/config/jestEsmTransform.js",
- "\\.(js|jsx|ts|tsx)$": "ts-jest",
- "\\.(bmp|gif|jpg|jpeg|png|frag|xml|svg)$": "@backstage/cli/config/jestFileTransform.js",
- "\\.(yaml)$": "yaml-jest"
- }
-}
-```
-
-Note that this will override the default jest transforms included with the `@backstage/cli`.
-
-It is possible that some test code needs a small migration as a result of this change, which stems from a difference in how `sucrase` and `ts-jest` transform module re-exports.
-
-Consider the following code:
-
-```ts
-import * as utils from './utils';
-
-jest.spyOn(utils, 'myUtility').mockReturnValue(3);
-```
-
-If the `./utils` import for example refers to an index file that in turn re-exports from `./utils/myUtility`, you would have to change the code to the following to work around the fact that the exported object from `./utils` ends up not having configurable properties, thus breaking `jest.spyOn`.
-
-```ts
-import * as utils from './utils/myUtility';
-
-jest.spyOn(utils, 'myUtility').mockReturnValue(3);
-```
diff --git a/.changeset/catalog-search-item.md b/.changeset/catalog-search-item.md
deleted file mode 100644
index c1a12ec161..0000000000
--- a/.changeset/catalog-search-item.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-A `` component is now available for use in custom Search Experiences.
diff --git a/.changeset/chilly-owls-punch.md b/.changeset/chilly-owls-punch.md
new file mode 100644
index 0000000000..35fb581a81
--- /dev/null
+++ b/.changeset/chilly-owls-punch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Exports `CatalogLayout` and `CreateComponentButton` for catalog customization.
diff --git a/.changeset/clean-frogs-brake.md b/.changeset/clean-frogs-brake.md
new file mode 100644
index 0000000000..ccbe551853
--- /dev/null
+++ b/.changeset/clean-frogs-brake.md
@@ -0,0 +1,10 @@
+---
+'@backstage/create-app': patch
+---
+
+Adding .DS_Store pattern to .gitignore in Scaffolded Backstage App. To migrate an existing app that pattern should be added manually.
+
+```diff
++# macOS
++.DS_Store
+```
diff --git a/.changeset/cuddly-yaks-sneeze.md b/.changeset/cuddly-yaks-sneeze.md
deleted file mode 100644
index 47d24d1cdb..0000000000
--- a/.changeset/cuddly-yaks-sneeze.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-api': patch
----
-
-Improve forwards compatibility with `@backstage/core-app-api` and `@backstage/core-plugin-api` by re-using route reference types and factory methods from `@backstage/core-plugin-api`.
diff --git a/.changeset/cyan-suns-chew.md b/.changeset/cyan-suns-chew.md
deleted file mode 100644
index 95d51c23fe..0000000000
--- a/.changeset/cyan-suns-chew.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cost-insights': patch
----
-
-Move `canvas` package to `devDependencies`.
diff --git a/.changeset/dull-poets-learn.md b/.changeset/dull-poets-learn.md
new file mode 100644
index 0000000000..b504c0c6a3
--- /dev/null
+++ b/.changeset/dull-poets-learn.md
@@ -0,0 +1,52 @@
+---
+'@backstage/plugin-catalog-backend': patch
+'@backstage/create-app': patch
+---
+
+This release enables the new catalog processing engine which is a major milestone for the catalog!
+
+This update makes processing more scalable across multiple instances, adds support for deletions and ui flagging of entities that are no longer referenced by a location.
+
+**Changes Required** to `catalog.ts`
+
+```diff
+-import { useHotCleanup } from '@backstage/backend-common';
+ import {
+ CatalogBuilder,
+- createRouter,
+- runPeriodically
++ createRouter
+ } from '@backstage/plugin-catalog-backend';
+ import { Router } from 'express';
+ import { PluginEnvironment } from '../types';
+
+ export default async function createPlugin(env: PluginEnvironment): Promise {
+- const builder = new CatalogBuilder(env);
++ const builder = await CatalogBuilder.create(env);
+ const {
+ entitiesCatalog,
+ locationsCatalog,
+- higherOrderOperation,
++ locationService,
++ processingEngine,
+ locationAnalyzer,
+ } = await builder.build();
+
+- useHotCleanup(
+- module,
+- runPeriodically(() => higherOrderOperation.refreshAllLocations(), 100000),
+- );
++ await processingEngine.start();
+
+ return await createRouter({
+ entitiesCatalog,
+ locationsCatalog,
+- higherOrderOperation,
++ locationService,
+ locationAnalyzer,
+ logger: env.logger,
+ config: env.config,
+```
+
+As this is a major internal change we have taken some precaution by still allowing the old catalog to be enabled by keeping your `catalog.ts` in it's current state.
+If you encounter any issues and have to revert to the previous catalog engine make sure to raise an issue immediately as the old catalog engine is deprecated and will be removed in a future release.
diff --git a/.changeset/early-baboons-double.md b/.changeset/early-baboons-double.md
deleted file mode 100644
index efbf0f559e..0000000000
--- a/.changeset/early-baboons-double.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-app-api': patch
----
-
-Fixes a type bug where supplying all app icons to `createApp` was required, rather than just a partial list.
diff --git a/.changeset/eight-doors-melt.md b/.changeset/eight-doors-melt.md
deleted file mode 100644
index 7a44216746..0000000000
--- a/.changeset/eight-doors-melt.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Updated the `@gitbeaker/node` dependency past the broken one without a `dist` folder.
-
-See [this issue](https://github.com/jdalrymple/gitbeaker/issues/1861) for more details.
-
-If you get build errors that look like the following in your Backstage instance, you may want to also bump all of your `@gitbeaker/*` dependencies to at least `^30.2.0`.
-
-```
-node:internal/modules/cjs/loader:356
- throw err;
- ^
-
-Error: Cannot find module '/path/to/project/node_modules/@gitbeaker/node/dist/index.js'. Please verify that the package.json has a valid "main" entry
- at tryPackage (node:internal/modules/cjs/loader:348:19)
- at Function.Module._findPath (node:internal/modules/cjs/loader:561:18)
- at Function.Module._resolveFilename (node:internal/modules/cjs/loader:926:27)
- at Function.Module._load (node:internal/modules/cjs/loader:773:27)
- at Module.require (node:internal/modules/cjs/loader:1012:19)
- at require (node:internal/modules/cjs/helpers:93:18)
- at Object. (/path/to/project/test.js:4:18)
- at Module._compile (node:internal/modules/cjs/loader:1108:14)
- at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
- at Module.load (node:internal/modules/cjs/loader:988:32) {
- code: 'MODULE_NOT_FOUND',
- path: '/path/to/project/node_modules/@gitbeaker/node/package.json',
- requestPath: '@gitbeaker/node'
-}
-```
-
-you could also consider pinning the version to an older one in your `package.json` either root or `packages/backend/package.json`, before the breakage occurred.
-
-```json
-"resolutions": {
- "**/@gitbeaker/node": "29.2.4",
- "**/@gitbeaker/core": "29.2.4",
- "**/@gitbeaker/requester-utils": "29.2.4"
-}
-```
-
-Be aware that this is only required short term until we can release our updated versions of `@backstage/plugin-scaffolder-backend`.
diff --git a/.changeset/empty-berries-melt.md b/.changeset/empty-berries-melt.md
deleted file mode 100644
index ab1125262a..0000000000
--- a/.changeset/empty-berries-melt.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Restructure the next catalog types and files a bit
diff --git a/.changeset/fair-points-grin.md b/.changeset/fair-points-grin.md
new file mode 100644
index 0000000000..5c5b21b610
--- /dev/null
+++ b/.changeset/fair-points-grin.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Provide a more clear error message when database connection fails.
diff --git a/.changeset/fast-trees-arrive.md b/.changeset/fast-trees-arrive.md
new file mode 100644
index 0000000000..f74b6c1c9a
--- /dev/null
+++ b/.changeset/fast-trees-arrive.md
@@ -0,0 +1,24 @@
+---
+'@backstage/cli': patch
+---
+
+Make `yarn dev` in newly created backend plugins respect the `PLUGIN_PORT` environment variable.
+
+You can achieve the same in your created backend plugins by making sure to properly call the port and CORS methods on your service builder. Typically in a file named `src/service/standaloneServer.ts` inside your backend plugin package, replace the following:
+
+```ts
+const service = createServiceBuilder(module)
+ .enableCors({ origin: 'http://localhost:3000' })
+ .addRouter('/my-plugin', router);
+```
+
+With something like the following:
+
+```ts
+let service = createServiceBuilder(module)
+ .setPort(options.port)
+ .addRouter('/my-plugin', router);
+if (options.enableCors) {
+ service = service.enableCors({ origin: 'http://localhost:3000' });
+}
+```
diff --git a/.changeset/few-cats-type.md b/.changeset/few-cats-type.md
deleted file mode 100644
index 45a59d5ada..0000000000
--- a/.changeset/few-cats-type.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-'@backstage/core-app-api': patch
-'@backstage/core-components': patch
-'@backstage/core-plugin-api': patch
----
-
-This change adds automatic error boundaries around extensions.
-
-This means that all exposed parts of a plugin are wrapped in a general error boundary component, that is plugin aware. The default design for the error box is borrowed from `@backstage/errors`. To override the default "fallback", one must provide a component named `ErrorBoundaryFallback` to `createApp`, like so:
-
-```ts
-const app = createApp({
- components: {
- ErrorBoundaryFallback: props => {
- // a custom fallback component
- return (
- <>
-
Oops.
-
- The plugin {props.plugin.getId()} failed with {props.error.message}
-
-
- >
- );
- },
- },
-});
-```
-
-The props here include:
-
-- `error`. An `Error` object or something that inherits it that represents the error that was thrown from any inner component.
-- `resetError`. A callback that will simply attempt to mount the children of the error boundary again.
-- `plugin`. A `BackstagePlugin` that can be used to look up info to be presented in the error message. For instance, you may want to keep a map of your internal plugins and team names or slack channels and present these when an error occurs. Typically, you'll do that by getting the plugin ID with `plugin.getId()`.
diff --git a/.changeset/fresh-vans-nail.md b/.changeset/fresh-vans-nail.md
new file mode 100644
index 0000000000..64af4ee60b
--- /dev/null
+++ b/.changeset/fresh-vans-nail.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-splunk-on-call': patch
+---
+
+Added config schema to expose `splunkOnCall.eventsRestEndpoint` config option to the frontend
diff --git a/.changeset/funny-toys-talk.md b/.changeset/funny-toys-talk.md
new file mode 100644
index 0000000000..6e6a779ab8
--- /dev/null
+++ b/.changeset/funny-toys-talk.md
@@ -0,0 +1,5 @@
+---
+'@backstage/codemods': patch
+---
+
+Fix execution of `jscodeshift` on windows.
diff --git a/.changeset/fuzzy-jobs-relate.md b/.changeset/fuzzy-jobs-relate.md
new file mode 100644
index 0000000000..6828d6c3c0
--- /dev/null
+++ b/.changeset/fuzzy-jobs-relate.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Switches the default catalog processing engine to use a batched streaming task execution strategy for higher parallelism.
diff --git a/.changeset/giant-snakes-watch.md b/.changeset/giant-snakes-watch.md
deleted file mode 100644
index 553518b678..0000000000
--- a/.changeset/giant-snakes-watch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-test-utils': patch
----
-
-Skip running docker tests unless in CI
diff --git a/.changeset/gorgeous-pumas-tickle.md b/.changeset/gorgeous-pumas-tickle.md
new file mode 100644
index 0000000000..2f653fae84
--- /dev/null
+++ b/.changeset/gorgeous-pumas-tickle.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Rely on `SELECT ... FOR UPDATE SKIP LOCKED` where available in order to speed up processing item acquisition and reduce work duplication.
diff --git a/.changeset/healthy-windows-dance.md b/.changeset/healthy-windows-dance.md
new file mode 100644
index 0000000000..1015fb63c3
--- /dev/null
+++ b/.changeset/healthy-windows-dance.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Use the correct parameter to create a public repository in Bitbucket Server for the v2 templates
diff --git a/.changeset/heavy-terms-vanish.md b/.changeset/heavy-terms-vanish.md
deleted file mode 100644
index 90a1b31e53..0000000000
--- a/.changeset/heavy-terms-vanish.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-github-actions': patch
----
-
-Add missing token on job list call to GitHub API
diff --git a/.changeset/hip-trees-heal.md b/.changeset/hip-trees-heal.md
deleted file mode 100644
index 422402dcee..0000000000
--- a/.changeset/hip-trees-heal.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-'@backstage/backend-common': patch
----
-
-Omits the `upgrade-insecure-requests` Content-Security-Policy directive by default, to prevent automatic HTTPS request upgrading for HTTP-deployed Backstage sites.
-
-If you previously disabled this using `false` in your `app-config.yaml`, this line is no longer necessary:
-
-```diff
-backend:
- csp:
-- upgrade-insecure-requests: false
-```
-
-To keep the existing behavior of `upgrade-insecure-requests` Content-Security-Policy being _enabled_, add the key with an empty array as the value in your `app-config.yaml`:
-
-```diff
-backend:
-+ csp:
-+ upgrade-insecure-requests: []
-```
-
-Read more on [upgrade-insecure-requests here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests).
diff --git a/.changeset/honest-rabbits-divide.md b/.changeset/honest-rabbits-divide.md
new file mode 100644
index 0000000000..bf4b457383
--- /dev/null
+++ b/.changeset/honest-rabbits-divide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs': patch
+---
+
+Fix the link to the documentation page when no owned documents are displayed
diff --git a/.changeset/khaki-dancers-admire.md b/.changeset/khaki-dancers-admire.md
deleted file mode 100644
index 7c5c61aa90..0000000000
--- a/.changeset/khaki-dancers-admire.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-'@backstage/catalog-model': patch
-'@backstage/plugin-scaffolder': patch
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Introduce conditional steps in scaffolder templates.
-
-A step can now include an `if` property that only executes a step if the
-condition is truthy. The condition can include handlebar templates.
-
-```yaml
-- id: register
- if: '{{ not parameters.dryRun }}'
- name: Register
- action: catalog:register
- input:
- repoContentsUrl: '{{ steps.publish.output.repoContentsUrl }}'
- catalogInfoPath: '/catalog-info.yaml'
-```
-
-Also introduces a `not` helper in handlebar templates that allows to negate
-boolean expressions.
diff --git a/.changeset/kind-tools-kneel.md b/.changeset/kind-tools-kneel.md
new file mode 100644
index 0000000000..6296ac7011
--- /dev/null
+++ b/.changeset/kind-tools-kneel.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Make refresh interval configurable for the `NextCatalogBuilder` using `.setRefreshIntervalSeconds()`.
+
+Change `DefaultProcessingDatabase` constructor to accept an options object instead of individual arguments.
diff --git a/.changeset/slimy-games-brake.md b/.changeset/lazy-cougars-rule.md
similarity index 53%
rename from .changeset/slimy-games-brake.md
rename to .changeset/lazy-cougars-rule.md
index a8fafb09f3..cc6ec91bd5 100644
--- a/.changeset/slimy-games-brake.md
+++ b/.changeset/lazy-cougars-rule.md
@@ -2,4 +2,4 @@
'@backstage/plugin-scaffolder-backend': patch
---
-Add `debug:log` action for debugging.
+Adds support to enable LFS for hosted Bitbucket
diff --git a/.changeset/long-socks-fold.md b/.changeset/long-socks-fold.md
deleted file mode 100644
index 23a7811685..0000000000
--- a/.changeset/long-socks-fold.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/integration-react': patch
-'@backstage/plugin-catalog': patch
----
-
-Move `ScmIntegrationIcon` from `@backstage/plugin-catalog` to
-`@backstage/integration-react` and make it customizable using
-`app.getSystemIcon()`.
diff --git a/.changeset/modern-ladybugs-perform.md b/.changeset/modern-ladybugs-perform.md
deleted file mode 100644
index 182b0899db..0000000000
--- a/.changeset/modern-ladybugs-perform.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': minor
----
-
-Scaffolding a repository in Bitbucket will now use the apiBaseUrl if it is provided instead of only the host parameter
diff --git a/.changeset/nice-spoons-try.md b/.changeset/nice-spoons-try.md
new file mode 100644
index 0000000000..c0992fa05e
--- /dev/null
+++ b/.changeset/nice-spoons-try.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-import': patch
+---
+
+Fix a react warning in ``.
diff --git a/.changeset/nine-hornets-wave.md b/.changeset/nine-hornets-wave.md
deleted file mode 100644
index 7eab7fadc5..0000000000
--- a/.changeset/nine-hornets-wave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder': patch
----
-
-Provide a link to the template source on the `TemplateCard`.
diff --git a/.changeset/old-crabs-jump.md b/.changeset/old-crabs-jump.md
deleted file mode 100644
index 9441f3aeb7..0000000000
--- a/.changeset/old-crabs-jump.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependencies
diff --git a/.changeset/olive-singers-sparkle.md b/.changeset/olive-singers-sparkle.md
deleted file mode 100644
index 14e45867a0..0000000000
--- a/.changeset/olive-singers-sparkle.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-plugin-api': patch
----
-
-Apply fixes to the extension creation API that were mistakenly applied to `@backstage/core-app-api` instead.
diff --git a/.changeset/perfect-toes-search.md b/.changeset/perfect-toes-search.md
deleted file mode 100644
index 65aceb6f08..0000000000
--- a/.changeset/perfect-toes-search.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-'@backstage/create-app': patch
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Migrating old `backstage.io/v1alpha1` templates to `backstage.io/v1beta2`
-
-Deprecating the `create-react-app` Template. We're planning on removing the `create-react-app` templater, as it's been a little tricky to support and takes 15mins to run in a container. We've currently cached a copy of the output for `create-react-app` and ship that under our sample templates folder. If you want to continue using it, we suggest copying the template out of there and putting it in your own repository as it will be removed in upcoming releases.
-
-We also recommend removing this entry from your `app-config.yaml` if it exists:
-
-```diff
-- - type: url
-- target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/create-react-app/template.yaml
-- rules:
-- - allow: [Template]
-```
diff --git a/.changeset/pink-bags-tickle.md b/.changeset/pink-bags-tickle.md
deleted file mode 100644
index 9c600459e7..0000000000
--- a/.changeset/pink-bags-tickle.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-app-api': patch
----
-
-Deprecate and disable the extension creation methods, which were added to this package by mistake and should only exist within `@backstage/core-plugin-api`.
diff --git a/.changeset/pink-llamas-sniff.md b/.changeset/pink-llamas-sniff.md
new file mode 100644
index 0000000000..98addd691c
--- /dev/null
+++ b/.changeset/pink-llamas-sniff.md
@@ -0,0 +1,12 @@
+---
+'@backstage/plugin-app-backend': patch
+'@backstage/plugin-badges-backend': patch
+'@backstage/plugin-catalog-backend': patch
+'@backstage/plugin-code-coverage-backend': patch
+'@backstage/plugin-proxy-backend': patch
+'@backstage/plugin-rollbar-backend': patch
+'@backstage/plugin-search-backend': patch
+'@backstage/plugin-techdocs-backend': patch
+---
+
+Make `yarn dev` respect the `PLUGIN_PORT` environment variable.
diff --git a/.changeset/pretty-dryers-turn.md b/.changeset/pretty-dryers-turn.md
deleted file mode 100644
index 9b80d8f6b7..0000000000
--- a/.changeset/pretty-dryers-turn.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog': patch
-'@backstage/plugin-catalog-react': patch
----
-
-Expose `getEntitySourceLocation`, `getEntityMetadataViewUrl`, and
-`getEntityMetadataEditUrl` from `@backstage/plugin-catalog-react`.
diff --git a/.changeset/purple-papayas-exist.md b/.changeset/purple-papayas-exist.md
new file mode 100644
index 0000000000..4c77558476
--- /dev/null
+++ b/.changeset/purple-papayas-exist.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-user-settings': patch
+---
+
+Fix a bug that prevented changing themes on the user settings page when the theme `id` didn't match exactly the theme `variant`.
diff --git a/.changeset/real-bulldogs-greet.md b/.changeset/real-bulldogs-greet.md
deleted file mode 100644
index 49d8a65d54..0000000000
--- a/.changeset/real-bulldogs-greet.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/catalog-client': patch
-'@backstage/plugin-catalog-import': patch
----
-
-Display preview result final step.
diff --git a/.changeset/search-cross-the-goal.md b/.changeset/search-cross-the-goal.md
deleted file mode 100644
index 580b28ac23..0000000000
--- a/.changeset/search-cross-the-goal.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/search-common': patch
-'@backstage/plugin-search-backend-node': patch
-'@backstage/plugin-search': patch
----
-
-The ` set of components exported by the Search Plugin are now updated to use the Search Backend API. These will be made available as the default non-"next" versions in a follow-up release.
-
-The interfaces for decorators and collators in the Search Backend have also seen minor, breaking revisions ahead of a general release. If you happen to be building on top of these interfaces, check and update your implementations accordingly. The APIs will be considered more stable in a follow-up release.
diff --git a/.changeset/sharp-candles-type.md b/.changeset/sharp-candles-type.md
new file mode 100644
index 0000000000..259e2151c0
--- /dev/null
+++ b/.changeset/sharp-candles-type.md
@@ -0,0 +1,5 @@
+---
+'@backstage/config-loader': patch
+---
+
+Removed workaround for breaking change in typescript 4.3 and bump `typescript-json-schema` instead. This should again allow the usage of `@items.visibility ` to set the visibility of array items.
diff --git a/.changeset/shiny-hotels-tell.md b/.changeset/shiny-hotels-tell.md
deleted file mode 100644
index 7443a8d639..0000000000
--- a/.changeset/shiny-hotels-tell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-github-deployments': patch
----
-
-Add deployment statuses to the GithubDeployments plugin
diff --git a/.changeset/silent-lions-collect.md b/.changeset/silent-lions-collect.md
deleted file mode 100644
index 76747871ef..0000000000
--- a/.changeset/silent-lions-collect.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-app-api': patch
----
-
-Update `createApp` options to allow plugins with unknown output types in order to improve forwards and backwards compatibility.
diff --git a/.changeset/sour-brooms-dream.md b/.changeset/sour-brooms-dream.md
deleted file mode 100644
index 4cb5a0e584..0000000000
--- a/.changeset/sour-brooms-dream.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fix error message formatting in the packaging process.
-
-error.errors can be undefined which will lead to a TypeError, swallowing the actual error message in the process.
-
-For instance, if you break your tsconfig.json with invalid syntax, backstage-cli will not be able to build anything and it will be very hard to find out why because the underlying error message is hidden behind a TypeError.
diff --git a/.changeset/strange-chicken-explain.md b/.changeset/strange-chicken-explain.md
deleted file mode 100644
index 0b2dffbccb..0000000000
--- a/.changeset/strange-chicken-explain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-A new card that shows components that depend on the active component
diff --git a/.changeset/famous-rockets-share.md b/.changeset/tall-bears-taste.md
similarity index 51%
rename from .changeset/famous-rockets-share.md
rename to .changeset/tall-bears-taste.md
index 8b5a216fc9..050c47867c 100644
--- a/.changeset/famous-rockets-share.md
+++ b/.changeset/tall-bears-taste.md
@@ -2,4 +2,4 @@
'@backstage/core-components': patch
---
-Use app.title for helmet in header
+Add title prop in SupportButton component
diff --git a/.changeset/tame-hotels-itch.md b/.changeset/tame-hotels-itch.md
deleted file mode 100644
index 2ae7b005a6..0000000000
--- a/.changeset/tame-hotels-itch.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/backend-common': patch
-'@backstage/integration': patch
----
-
-Download archives as compressed tar files for Bitbucket to keep executable permissions.
diff --git a/.changeset/techdocs-metal-clouds-work.md b/.changeset/techdocs-metal-clouds-work.md
new file mode 100644
index 0000000000..64d18dcc02
--- /dev/null
+++ b/.changeset/techdocs-metal-clouds-work.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs': patch
+---
+
+Adding support for user owned document filter for TechDocs custom Homepage
diff --git a/.changeset/thick-donkeys-carry.md b/.changeset/thick-donkeys-carry.md
new file mode 100644
index 0000000000..41cd319654
--- /dev/null
+++ b/.changeset/thick-donkeys-carry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Migrate from the `command-exists-promise` dependency to `command-exists`.
diff --git a/.changeset/thirty-turkeys-sing.md b/.changeset/thirty-turkeys-sing.md
new file mode 100644
index 0000000000..07b3aaa8b7
--- /dev/null
+++ b/.changeset/thirty-turkeys-sing.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-model': patch
+---
+
+Removed unused `typescript-json-schema` dependency.
diff --git a/.changeset/tough-ravens-change.md b/.changeset/tough-ravens-change.md
new file mode 100644
index 0000000000..f0567655a6
--- /dev/null
+++ b/.changeset/tough-ravens-change.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Use the correct parameter to create a public repository in Bitbucket Server.
diff --git a/.changeset/tricky-goats-boil.md b/.changeset/tricky-goats-boil.md
deleted file mode 100644
index 36d5806d8e..0000000000
--- a/.changeset/tricky-goats-boil.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Update gitbeaker past the broken version without a dist folder
diff --git a/.changeset/violet-birds-lay.md b/.changeset/violet-birds-lay.md
new file mode 100644
index 0000000000..841603058f
--- /dev/null
+++ b/.changeset/violet-birds-lay.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-proxy-backend': patch
+---
+
+Bump http-proxy-middleware from 0.19.2 to 2.0.0
diff --git a/.changeset/warm-bikes-warn.md b/.changeset/warm-bikes-warn.md
deleted file mode 100644
index a0f6fa73af..0000000000
--- a/.changeset/warm-bikes-warn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-Exported AboutCard contents and utility functions
diff --git a/.changeset/wild-wasps-turn.md b/.changeset/wild-wasps-turn.md
deleted file mode 100644
index 2bdb0d832d..0000000000
--- a/.changeset/wild-wasps-turn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-proxy-backend': patch
----
-
-Fixed proxy requests to the base URL of routes without a trailing slash redirecting to the `target` with the full path appended.
diff --git a/.changeset/yellow-schools-matter.md b/.changeset/yellow-schools-matter.md
new file mode 100644
index 0000000000..15a65a7bcb
--- /dev/null
+++ b/.changeset/yellow-schools-matter.md
@@ -0,0 +1,6 @@
+---
+'@backstage/core': patch
+'@backstage/core-components': patch
+---
+
+Use the Backstage `Link` component in the `Button`
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 206c1a7883..fda500ed02 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -4,7 +4,7 @@
# The last matching pattern takes precedence.
# https://help.github.com/articles/about-codeowners/
-* @backstage/maintainers
+* @backstage/reviewers
/docs/features/techdocs @backstage/techdocs-core
/docs/features/search @backstage/techdocs-core
/docs/assets/search @backstage/techdocs-core
diff --git a/.github/workflows/master-win.yml b/.github/workflows/master-win.yml
index 3850146388..c61ee4798b 100644
--- a/.github/workflows/master-win.yml
+++ b/.github/workflows/master-win.yml
@@ -53,6 +53,10 @@ jobs:
- name: verify type dependencies
run: yarn lint:type-deps
+ # The core packages need to be built for the codemods tests to work
+ - name: build core packages
+ run: lerna run --scope @backstage/core-* build
+
- name: test
run: yarn lerna -- run test
env:
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
index 0ab8d8390d..936c27c7cf 100644
--- a/GOVERNANCE.md
+++ b/GOVERNANCE.md
@@ -36,9 +36,33 @@ To become a maintainer you need to demonstrate the following:
If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of the sponsors and maintainers per the voting process below.
+# Reviewers
+
+The project also contains a team called [@backstage/reviewers](https://github.com/orgs/backstage/teams/reviewers). This is the team of people who are the fallback in [`CODEOWNERS`](./.github/CODEOWNERS). This team will typically contain the maintainers, and a small number of additional people who are permitted to approve and merge pull requests. The purpose of this group is to offload some of the review work from the maintainers, simplifying and speeding up the review process for contributors.
+
+This responsibility is distinct from the maintainer role. A reviewer must not approve and merge changes that have a level of impact that a maintainer should oversee; see below for clarification. For that class of changes, a reviewer can still review the pull request thoroughly without approving it (e.g. with a comment on the pull request), and is expected to notify `@backstage/maintainers` for final approval. Note that it is best to not use the GitHub review approve functionality for this, since that would let Hall of Fame members self-merge the pull request before maintainers get the chance to look at it.
+
+The following is a non-exhaustive list of types of change, for which a reviewer should defer final decision and merge to a maintainer:
+
+- A larger refactoring that significantly affects the structure of/between packages
+- Changes that settle or alter the trajectory of contested ongoing topics in issues or elsewhere
+- Changes that affect the [Architecture Decision Records](./docs/architecture-decisions)
+- Changes to APIs that have large customer impact, such as the core APIs in `@backstage/core-*` packages, or significant `@backstage/cli` changes.
+- Pull requests whose build checks are not passing fully
+- Additions and removals of entire packages
+- Releases (e.g. pull requests titled `Version Packages`)
+
+A maintainer may suggest an addition to the reviewers team by opening a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. Prospective reviewers are not expected to do this themselves, but should rather ask a maintainer to sponsor their addition. All of the maintainers and sponsors are called to vote on the addition (see the section below about voting). If the vote passes, the pull request can be approved and merged, and the corresponding addition to the GitHub team can be made.
+
+A reviewer can elect to remove themselves from the reviewers group by opening, or asking a maintainer to open, a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. A maintainer will approve and merge the pull request, and the corresponding removal from the GitHub team can be made.
+
+A maintainer can call on the other maintainers and sponsors for a vote to remove a reviewer (see the section below about conflict resolution and voting). If the vote passes, a maintainer creates a pull request that modifies [`OWNERS.md`](./OWNERS.md) accordingly. After approval by another maintainer, the pull request can be merged, and the corresponding removal from the GitHub team can be made.
+
# Conflict resolution and voting
-In general, we prefer that technical issues and maintainer membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting. The voting process is a simple majority in which each sponsor receives two votes and each maintainer receives one vote.
+In general, we prefer that technical issues and membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting.
+
+In all cases in this document where voting is mentioned, the voting process is a simple majority in which each sponsor receives two votes and each maintainer receives one vote. If such a majority is reached, the vote is said to have _passed_.
# Adding new projects to the Backstage GitHub organization
diff --git a/OWNERS.md b/OWNERS.md
index cdbc234183..6615046540 100644
--- a/OWNERS.md
+++ b/OWNERS.md
@@ -16,6 +16,18 @@ This page lists all active sponsors and maintainers.
- Ben Lambert ([benjdlambert](https://github.com/benjdlambert)) (Discord: @blam)
- Johan Haals ([jhaals](https://github.com/jhaals)) (Discord: @jhaals)
+# Reviewers
+
+See [`GOVERNANCE.md`](./GOVERNANCE.md) for details about how the reviewers team
+works.
+
+- Patrik Oldsberg ([rugvip](https://github.com/rugvip)) (Discord: @Rugvip)
+- Fredrik Adelöw ([freben](https://github.com/freben)) (Discord: @freben)
+- Ben Lambert ([benjdlambert](https://github.com/benjdlambert)) (Discord: @blam)
+- Johan Haals ([jhaals](https://github.com/jhaals)) (Discord: @jhaals)
+- Himanshu Mishra ([OrkoHunter](https://github.com/OrkoHunter)) (Discord: @OrkoHunter)
+- Tim Hansen ([timbonicus](https://github.com/timbonicus)) (Discord: @timbonicus)
+
# Emeritus maintainers
- Stefan Ålund ([stefanalund](https://github.com/stefanalund)) (Discord: @stalund)
diff --git a/docs/plugins/backend-plugin.md b/docs/plugins/backend-plugin.md
index 4480cd69e3..7a57cefa9c 100644
--- a/docs/plugins/backend-plugin.md
+++ b/docs/plugins/backend-plugin.md
@@ -111,3 +111,42 @@ curl localhost:7000/api/carmen/health
```
This should return `{"status":"ok"}` like before. Success!
+
+## Making Use of a Database
+
+The Backstage backend comes with a builtin facility for SQL database access.
+Most plugins that have persistence needs will choose to make use of this
+facility, so that Backstage operators can manage database needs uniformly.
+
+As part of the environment object that is passed to your `createPlugin`
+function, there is a `database` field. You can use that to get a
+[Knex](http://knexjs.org/) connection object.
+
+```ts
+// in packages/backend/src/plugins/carmen.ts
+export default async function createPlugin(env: PluginEnvironment) {
+ const db: Knex = await env.database.getClient();
+
+ // You will then pass this client into your actual plugin implementation
+ // code, maybe similar to the following:
+ const model = new CarmenDatabaseModel(db);
+ return await createRouter({
+ model: model,
+ logger: env.logger,
+ });
+}
+```
+
+You may note that the `getClient` call has no parameters. This is because all
+plugin database needs are configured under the `backend.database` config key of
+your `app-config.yaml`. The framework may even make sure behind the scenes that
+the logical database is created automatically if it doesn't exist, based on
+rules that the Backstage operator decides on.
+
+The framework does not handle database schema migrations for you, however. The
+builtin plugins in the main repo have chosen to use the Knex library to manage
+schema migrations as well, but you can do so in any manner that you see fit.
+
+See the [Knex library documentation](http://knexjs.org/) for examples and
+details on how to write schema migrations and perform SQL queries against your
+database..
diff --git a/microsite/data/plugins/gke-usage.yaml b/microsite/data/plugins/gke-usage.yaml
new file mode 100644
index 0000000000..42d3e3a287
--- /dev/null
+++ b/microsite/data/plugins/gke-usage.yaml
@@ -0,0 +1,15 @@
+---
+title: GKE Usage
+author: BESTSELLER
+authorUrl: bestsellerit.com
+category: Discovery
+description: This plugin will show you the cost and resource usage of your application within GKE.
+documentation: https://github.com/BESTSELLER/backstage-plugin-gkeusage/blob/master/README.md
+iconUrl: https://bestsellerit.com/img/google-container-engine_avatar.svg
+npmPackageName: '@bestsellerit/backstage-plugin-gkeusage'
+tags:
+ - gke
+ - cost
+ - google
+ - usage
+ - metering
diff --git a/microsite/package.json b/microsite/package.json
index 3112bbfe17..1894e37d84 100644
--- a/microsite/package.json
+++ b/microsite/package.json
@@ -20,7 +20,7 @@
"docusaurus": "^2.0.0-alpha.70",
"js-yaml": "^4.1.0",
"prettier": "^2.3.1",
- "yarn-lock-check": "^1.0.4"
+ "yarn-lock-check": "^1.0.5"
},
"prettier": "@spotify/prettier-config"
}
diff --git a/microsite/siteConfig.js b/microsite/siteConfig.js
index 5d61e55bc1..ea78fb462a 100644
--- a/microsite/siteConfig.js
+++ b/microsite/siteConfig.js
@@ -92,10 +92,8 @@ const siteConfig = {
cleanUrl: true,
// Open Graph and Twitter card images.
- ogImage:
- 'logo_assets/png/Backstage_Identity_Assets_Artwork_RGB_04_Icon_Teal.png',
- twitterImage:
- 'logo_assets/png/Backstage_Identity_Assets_Artwork_RGB_04_Icon_Teal.png',
+ ogImage: 'img/sharing-opengraph.png',
+ twitterImage: 'img/twitter-summary.png',
// For sites with a sizable amount of content, set collapsible to true.
// Expand/collapse the links and subcategories under categories.
diff --git a/microsite/static/img/cortex.png b/microsite/static/img/cortex.png
index 6a45d0ca06..d16b3f9c32 100644
Binary files a/microsite/static/img/cortex.png and b/microsite/static/img/cortex.png differ
diff --git a/microsite/static/img/sharing-opengraph.png b/microsite/static/img/sharing-opengraph.png
new file mode 100644
index 0000000000..7d304f81ed
Binary files /dev/null and b/microsite/static/img/sharing-opengraph.png differ
diff --git a/microsite/static/img/twitter-summary.png b/microsite/static/img/twitter-summary.png
new file mode 100644
index 0000000000..7330b071ee
Binary files /dev/null and b/microsite/static/img/twitter-summary.png differ
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index 6f71394265..a89235bf98 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -9,13 +9,6 @@
dependencies:
"@babel/highlight" "^7.0.0"
-"@babel/code-frame@^7.0.0":
- version "7.12.13"
- resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
- integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
- dependencies:
- "@babel/highlight" "^7.12.13"
-
"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11":
version "7.12.11"
resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
@@ -227,11 +220,6 @@
resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
-"@babel/helper-validator-identifier@^7.14.0":
- version "7.14.0"
- resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288"
- integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==
-
"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11":
version "7.12.11"
resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f"
@@ -265,15 +253,6 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/highlight@^7.12.13":
- version "7.14.0"
- resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf"
- integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==
- dependencies:
- "@babel/helper-validator-identifier" "^7.14.0"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
-
"@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7":
version "7.12.11"
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79"
@@ -942,29 +921,11 @@
dependencies:
"@types/node" "*"
-"@types/glob@^7.1.3":
- version "7.1.3"
- resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
- integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
- dependencies:
- "@types/minimatch" "*"
- "@types/node" "*"
-
-"@types/minimatch@*":
- version "3.0.4"
- resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21"
- integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==
-
"@types/node@*":
version "14.14.20"
resolved "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz#f7974863edd21d1f8a494a73e8e2b3658615c340"
integrity sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==
-"@types/node@^15.6.1":
- version "15.9.0"
- resolved "https://registry.npmjs.org/@types/node/-/node-15.9.0.tgz#0b7f6c33ca5618fe329a9d832b478b4964d325a8"
- integrity sha512-AR1Vq1Ei1GaA5FjKL5PBqblTZsL5M+monvGSZwe6sSIdGiuu7Xr/pNwWJY+0ZQuN8AapD/XMB5IzBAyYRFbocA==
-
"@types/q@^1.5.1":
version "1.5.4"
resolved "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
@@ -1449,11 +1410,6 @@ buffer@^5.2.1:
base64-js "^1.3.1"
ieee754 "^1.1.13"
-builtin-modules@^1.1.1:
- version "1.1.1"
- resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
- integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
-
bytes@1:
version "1.0.0"
resolved "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
@@ -1567,7 +1523,7 @@ caw@^2.0.0, caw@^2.0.1:
tunnel-agent "^0.6.0"
url-to-options "^1.0.1"
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1758,7 +1714,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
-commander@^2.12.1, commander@^2.8.1:
+commander@^2.8.1:
version "2.20.3"
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -2230,11 +2186,6 @@ diacritics-map@^0.1.0:
resolved "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz#6dfc0ff9d01000a2edf2865371cac316e94977af"
integrity sha1-bfwP+dAQAKLt8oZTccrDFulJd68=
-diff@^4.0.1:
- version "4.0.2"
- resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
- integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-
dir-glob@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
@@ -3091,19 +3042,7 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-glob@^7.0.0, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.1:
- version "7.1.6"
- resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.1.1, glob@^7.1.7:
+glob@^7.0.0, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@^7.1.7, glob@~7.1.1:
version "7.1.7"
resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
@@ -3638,13 +3577,6 @@ is-core-module@^2.1.0:
dependencies:
has "^1.0.3"
-is-core-module@^2.2.0:
- version "2.4.0"
- resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
- integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
- dependencies:
- has "^1.0.3"
-
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -4457,7 +4389,7 @@ mixin-deep@^1.1.3, mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
-mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1:
+mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -5681,14 +5613,6 @@ resolve@^1.1.6, resolve@^1.10.0:
is-core-module "^2.1.0"
path-parse "^1.0.6"
-resolve@^1.3.2:
- version "1.20.0"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
- integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
- dependencies:
- is-core-module "^2.2.0"
- path-parse "^1.0.6"
-
responselike@1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
@@ -6437,37 +6361,11 @@ truncate-html@^1.0.3:
"@types/cheerio" "^0.22.8"
cheerio "0.22.0"
-tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
+tslib@^1.9.0, tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslint@^6.1.3:
- version "6.1.3"
- resolved "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904"
- integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- builtin-modules "^1.1.1"
- chalk "^2.3.0"
- commander "^2.12.1"
- diff "^4.0.1"
- glob "^7.1.1"
- js-yaml "^3.13.1"
- minimatch "^3.0.4"
- mkdirp "^0.5.3"
- resolve "^1.3.2"
- semver "^5.3.0"
- tslib "^1.13.0"
- tsutils "^2.29.0"
-
-tsutils@^2.29.0:
- version "2.29.0"
- resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
- integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
- dependencies:
- tslib "^1.8.1"
-
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@@ -6493,11 +6391,6 @@ typedarray@^0.0.6:
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-typescript@^4.3.2:
- version "4.3.2"
- resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805"
- integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==
-
unbzip2-stream@^1.0.9:
version "1.4.3"
resolved "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
@@ -6767,18 +6660,14 @@ yargs@^2.3.0:
dependencies:
wordwrap "0.0.2"
-yarn-lock-check@^1.0.4:
- version "1.0.4"
- resolved "https://registry.npmjs.org/yarn-lock-check/-/yarn-lock-check-1.0.4.tgz#a0373de051be0c8442d8933070df7a45595263b4"
- integrity sha512-Gj0wRN85c4OPZUlE7WsQ0a1COv38uyeWWR0YAvJr2Vxw1f32bwK19xySjUZlxt9o4QopJkd8g6x6CLv81OHwYg==
+yarn-lock-check@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/yarn-lock-check/-/yarn-lock-check-1.0.5.tgz#69d9516385f3ff010d0e2b0e87fbbd9bb1ffecaf"
+ integrity sha512-dxmV4LpIBrRAPbPg+klyGvqdVo3Y6PgJs6ERJYXf0HSEst7klDmvKKqQUtk+wrIRCoMDIVIzSUTZsuC4zr/tFQ==
dependencies:
- "@types/glob" "^7.1.3"
- "@types/node" "^15.6.1"
"@yarnpkg/lockfile" "^1.1.0"
glob "^7.1.7"
ini "^2.0.0"
- tslint "^6.1.3"
- typescript "^4.3.2"
yauzl@^2.4.2:
version "2.10.0"
diff --git a/package.json b/package.json
index 6a663c877e..c0887d7f05 100644
--- a/package.json
+++ b/package.json
@@ -68,7 +68,7 @@
"prettier": "^2.2.1",
"recursive-readdir": "^2.2.2",
"shx": "^0.3.2",
- "yarn-lock-check": "^1.0.4"
+ "yarn-lock-check": "^1.0.5"
},
"prettier": "@spotify/prettier-config",
"lint-staged": {
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 7f9e9e554d..c200104775 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,35 @@
# example-app
+## 0.2.32
+
+### Patch Changes
+
+- Updated dependencies [9cd3c533c]
+- Updated dependencies [db1c8f93b]
+- Updated dependencies [9d906c7a1]
+- Updated dependencies [9bdd2cca8]
+- Updated dependencies [27a9b503a]
+- Updated dependencies [f4e3ac5ce]
+- Updated dependencies [9b4010965]
+- Updated dependencies [7f7443308]
+- Updated dependencies [7028ee1ca]
+- Updated dependencies [70bc30c5b]
+- Updated dependencies [db1c8f93b]
+- Updated dependencies [5aff84759]
+- Updated dependencies [21e8ebef5]
+- Updated dependencies [4fbb00707]
+- Updated dependencies [d5ad47bbb]
+ - @backstage/cli@0.7.0
+ - @backstage/plugin-catalog@0.6.2
+ - @backstage/plugin-cost-insights@0.10.2
+ - @backstage/plugin-github-actions@0.4.9
+ - @backstage/catalog-model@0.8.2
+ - @backstage/plugin-scaffolder@0.9.8
+ - @backstage/integration-react@0.1.3
+ - @backstage/plugin-catalog-react@0.2.2
+ - @backstage/plugin-catalog-import@0.5.9
+ - @backstage/plugin-search@0.4.0
+
## 0.2.31
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index 03d87dc243..1b0b3aa22c 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,25 +1,25 @@
{
"name": "example-app",
- "version": "0.2.31",
+ "version": "0.2.32",
"private": true,
"bundled": true,
"dependencies": {
- "@backstage/catalog-model": "^0.8.1",
- "@backstage/cli": "^0.6.14",
+ "@backstage/catalog-model": "^0.8.2",
+ "@backstage/cli": "^0.7.0",
"@backstage/core": "^0.7.12",
- "@backstage/integration-react": "^0.1.2",
+ "@backstage/integration-react": "^0.1.3",
"@backstage/plugin-api-docs": "^0.4.15",
"@backstage/plugin-badges": "^0.2.2",
- "@backstage/plugin-catalog": "^0.6.1",
- "@backstage/plugin-catalog-import": "^0.5.8",
- "@backstage/plugin-catalog-react": "^0.2.1",
+ "@backstage/plugin-catalog": "^0.6.2",
+ "@backstage/plugin-catalog-import": "^0.5.9",
+ "@backstage/plugin-catalog-react": "^0.2.2",
"@backstage/plugin-circleci": "^0.2.15",
"@backstage/plugin-cloudbuild": "^0.2.16",
"@backstage/plugin-code-coverage": "^0.1.4",
- "@backstage/plugin-cost-insights": "^0.10.1",
+ "@backstage/plugin-cost-insights": "^0.10.2",
"@backstage/plugin-explore": "^0.3.6",
"@backstage/plugin-gcp-projects": "^0.2.6",
- "@backstage/plugin-github-actions": "^0.4.8",
+ "@backstage/plugin-github-actions": "^0.4.9",
"@backstage/plugin-graphiql": "^0.2.11",
"@backstage/plugin-jenkins": "^0.4.4",
"@backstage/plugin-kafka": "^0.2.8",
@@ -29,8 +29,8 @@
"@backstage/plugin-org": "^0.3.14",
"@backstage/plugin-pagerduty": "0.3.5",
"@backstage/plugin-rollbar": "^0.3.6",
- "@backstage/plugin-scaffolder": "^0.9.7",
- "@backstage/plugin-search": "^0.3.7",
+ "@backstage/plugin-scaffolder": "^0.9.8",
+ "@backstage/plugin-search": "^0.4.0",
"@backstage/plugin-sentry": "^0.3.11",
"@backstage/plugin-shortcuts": "^0.1.2",
"@backstage/plugin-tech-radar": "^0.4.0",
diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md
index 728d8fabcd..6256697036 100644
--- a/packages/backend-common/CHANGELOG.md
+++ b/packages/backend-common/CHANGELOG.md
@@ -1,5 +1,33 @@
# @backstage/backend-common
+## 0.8.2
+
+### Patch Changes
+
+- 92963779b: Omits the `upgrade-insecure-requests` Content-Security-Policy directive by default, to prevent automatic HTTPS request upgrading for HTTP-deployed Backstage sites.
+
+ If you previously disabled this using `false` in your `app-config.yaml`, this line is no longer necessary:
+
+ ```diff
+ backend:
+ csp:
+ - upgrade-insecure-requests: false
+ ```
+
+ To keep the existing behavior of `upgrade-insecure-requests` Content-Security-Policy being _enabled_, add the key with an empty array as the value in your `app-config.yaml`:
+
+ ```diff
+ backend:
+ + csp:
+ + upgrade-insecure-requests: []
+ ```
+
+ Read more on [upgrade-insecure-requests here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests).
+
+- eda9dbd5f: Download archives as compressed tar files for Bitbucket to keep executable permissions.
+- Updated dependencies [eda9dbd5f]
+ - @backstage/integration@0.5.6
+
## 0.8.1
### Patch Changes
diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json
index 4de9c36c8c..fc57ee59a8 100644
--- a/packages/backend-common/package.json
+++ b/packages/backend-common/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
- "version": "0.8.1",
+ "version": "0.8.2",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -33,7 +33,7 @@
"@backstage/config": "^0.1.5",
"@backstage/config-loader": "^0.6.2",
"@backstage/errors": "^0.1.1",
- "@backstage/integration": "^0.5.3",
+ "@backstage/integration": "^0.5.6",
"@google-cloud/storage": "^5.8.0",
"@octokit/rest": "^18.5.3",
"@types/cors": "^2.8.6",
@@ -76,7 +76,7 @@
}
},
"devDependencies": {
- "@backstage/cli": "^0.6.12",
+ "@backstage/cli": "^0.7.0",
"@backstage/test-utils": "^0.1.12",
"@types/archiver": "^5.1.0",
"@types/compression": "^1.7.0",
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
new file mode 100644
index 0000000000..c2078fd0bc
--- /dev/null
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -0,0 +1,14 @@
+# @backstage/backend-test-utils
+
+## 0.1.2
+
+### Patch Changes
+
+- 0711954a9: Skip running docker tests unless in CI
+- Updated dependencies [9cd3c533c]
+- Updated dependencies [92963779b]
+- Updated dependencies [7f7443308]
+- Updated dependencies [21e8ebef5]
+- Updated dependencies [eda9dbd5f]
+ - @backstage/cli@0.7.0
+ - @backstage/backend-common@0.8.2
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index 95276651ca..c4ff5603f3 100644
--- a/packages/backend-test-utils/package.json
+++ b/packages/backend-test-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
- "version": "0.1.1",
+ "version": "0.1.2",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -30,8 +30,8 @@
"clean": "backstage-cli clean"
},
"dependencies": {
- "@backstage/backend-common": "^0.8.0",
- "@backstage/cli": "^0.6.10",
+ "@backstage/backend-common": "^0.8.2",
+ "@backstage/cli": "^0.7.0",
"@backstage/config": "^0.1.5",
"knex": "^0.95.1",
"mysql2": "^2.2.5",
@@ -41,7 +41,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
- "@backstage/cli": "^0.6.10",
+ "@backstage/cli": "^0.7.0",
"jest": "^26.0.1"
},
"files": [
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 4a8fd1b86f..65d28457d0 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,31 @@
# example-backend
+## 0.2.32
+
+### Patch Changes
+
+- Updated dependencies [9c63be545]
+- Updated dependencies [92963779b]
+- Updated dependencies [27a9b503a]
+- Updated dependencies [66c6bfebd]
+- Updated dependencies [55a253de2]
+- Updated dependencies [70bc30c5b]
+- Updated dependencies [db1c8f93b]
+- Updated dependencies [5aff84759]
+- Updated dependencies [f26e6008f]
+- Updated dependencies [eda9dbd5f]
+- Updated dependencies [4f8cf50fe]
+- Updated dependencies [875809a59]
+ - @backstage/plugin-catalog-backend@0.10.2
+ - @backstage/backend-common@0.8.2
+ - @backstage/catalog-model@0.8.2
+ - @backstage/plugin-scaffolder-backend@0.12.0
+ - @backstage/catalog-client@0.3.13
+ - @backstage/plugin-search-backend-node@0.2.0
+ - @backstage/plugin-search-backend@0.2.0
+ - @backstage/plugin-proxy-backend@0.2.9
+ - example-app@0.2.32
+
## 0.2.30
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index be843e4d38..f4f304d714 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.2.30",
+ "version": "0.2.32",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -27,30 +27,30 @@
"migrate:create": "knex migrate:make -x ts"
},
"dependencies": {
- "@backstage/backend-common": "^0.8.0",
- "@backstage/catalog-client": "^0.3.12",
- "@backstage/catalog-model": "^0.8.0",
+ "@backstage/backend-common": "^0.8.2",
+ "@backstage/catalog-client": "^0.3.13",
+ "@backstage/catalog-model": "^0.8.2",
"@backstage/config": "^0.1.5",
"@backstage/plugin-app-backend": "^0.3.13",
"@backstage/plugin-auth-backend": "^0.3.12",
"@backstage/plugin-badges-backend": "^0.1.6",
- "@backstage/plugin-catalog-backend": "^0.10.0",
+ "@backstage/plugin-catalog-backend": "^0.10.2",
"@backstage/plugin-code-coverage-backend": "^0.1.6",
"@backstage/plugin-graphql-backend": "^0.1.8",
"@backstage/plugin-kubernetes-backend": "^0.3.8",
"@backstage/plugin-kafka-backend": "^0.2.6",
- "@backstage/plugin-proxy-backend": "^0.2.8",
+ "@backstage/plugin-proxy-backend": "^0.2.9",
"@backstage/plugin-rollbar-backend": "^0.1.11",
- "@backstage/plugin-scaffolder-backend": "^0.11.4",
- "@backstage/plugin-search-backend": "^0.1.5",
- "@backstage/plugin-search-backend-node": "^0.1.3",
+ "@backstage/plugin-scaffolder-backend": "^0.12.0",
+ "@backstage/plugin-search-backend": "^0.2.0",
+ "@backstage/plugin-search-backend-node": "^0.2.0",
"@backstage/plugin-techdocs-backend": "^0.8.2",
"@backstage/plugin-todo-backend": "^0.1.6",
"@gitbeaker/node": "^30.2.0",
"@octokit/rest": "^18.5.3",
"azure-devops-node-api": "^10.1.1",
"dockerode": "^3.2.1",
- "example-app": "^0.2.30",
+ "example-app": "^0.2.32",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"knex": "^0.95.1",
@@ -60,7 +60,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
- "@backstage/cli": "^0.6.13",
+ "@backstage/cli": "^0.7.0",
"@types/dockerode": "^3.2.1",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5"
diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts
index 63a3e53c81..57afe4fefd 100644
--- a/packages/backend/src/plugins/catalog.ts
+++ b/packages/backend/src/plugins/catalog.ts
@@ -14,13 +14,9 @@
* limitations under the License.
*/
-import { useHotCleanup } from '@backstage/backend-common';
import {
CatalogBuilder,
createRouter,
- NextCatalogBuilder,
- runPeriodically,
- createNextRouter,
} from '@backstage/plugin-catalog-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
@@ -28,50 +24,20 @@ import { PluginEnvironment } from '../types';
export default async function createPlugin(
env: PluginEnvironment,
): Promise {
- /*
- * ** WARNING **
- * DO NOT enable the experimental catalog, it will brick your database migrations.
- * This is solely for internal backstage development.
- */
- if (process.env.EXPERIMENTAL_CATALOG === '1') {
- const builder = new NextCatalogBuilder(env);
- const {
- entitiesCatalog,
- locationAnalyzer,
- processingEngine,
- locationService,
- } = await builder.build();
-
- // TODO(jhaals): run and manage in background.
- await processingEngine.start();
-
- return await createNextRouter({
- entitiesCatalog,
- locationAnalyzer,
- locationService,
- logger: env.logger,
- config: env.config,
- });
- }
-
- const builder = new CatalogBuilder(env);
+ const builder = await CatalogBuilder.create(env);
const {
entitiesCatalog,
- locationsCatalog,
- higherOrderOperation,
locationAnalyzer,
+ processingEngine,
+ locationService,
} = await builder.build();
- useHotCleanup(
- module,
- runPeriodically(() => higherOrderOperation.refreshAllLocations(), 100000),
- );
+ await processingEngine.start();
return await createRouter({
entitiesCatalog,
- locationsCatalog,
- higherOrderOperation,
locationAnalyzer,
+ locationService,
logger: env.logger,
config: env.config,
});
diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md
index e1ef7b759b..847924b67b 100644
--- a/packages/catalog-client/CHANGELOG.md
+++ b/packages/catalog-client/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/catalog-client
+## 0.3.13
+
+### Patch Changes
+
+- 70bc30c5b: Display preview result final step.
+- Updated dependencies [27a9b503a]
+ - @backstage/catalog-model@0.8.2
+
## 0.3.12
### Patch Changes
diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json
index 0cf8d7d1b8..c366374bf5 100644
--- a/packages/catalog-client/package.json
+++ b/packages/catalog-client/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-client",
- "version": "0.3.12",
+ "version": "0.3.13",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -29,13 +29,13 @@
"clean": "backstage-cli clean"
},
"dependencies": {
- "@backstage/catalog-model": "^0.8.0",
+ "@backstage/catalog-model": "^0.8.2",
"@backstage/config": "^0.1.5",
"@backstage/errors": "^0.1.1",
"cross-fetch": "^3.0.6"
},
"devDependencies": {
- "@backstage/cli": "^0.6.13",
+ "@backstage/cli": "^0.7.0",
"@types/jest": "^26.0.7",
"msw": "^0.21.2"
},
diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md
index 94b4662a97..df350ff288 100644
--- a/packages/catalog-model/CHANGELOG.md
+++ b/packages/catalog-model/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/catalog-model
+## 0.8.2
+
+### Patch Changes
+
+- 27a9b503a: Introduce conditional steps in scaffolder templates.
+
+ A step can now include an `if` property that only executes a step if the
+ condition is truthy. The condition can include handlebar templates.
+
+ ```yaml
+ - id: register
+ if: '{{ not parameters.dryRun }}'
+ name: Register
+ action: catalog:register
+ input:
+ repoContentsUrl: '{{ steps.publish.output.repoContentsUrl }}'
+ catalogInfoPath: '/catalog-info.yaml'
+ ```
+
+ Also introduces a `not` helper in handlebar templates that allows to negate
+ boolean expressions.
+
## 0.8.1
### Patch Changes
diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json
index edcffaa691..f9d7483dda 100644
--- a/packages/catalog-model/package.json
+++ b/packages/catalog-model/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-model",
- "version": "0.8.1",
+ "version": "0.8.2",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -35,13 +35,12 @@
"@types/yup": "^0.29.8",
"ajv": "^7.0.3",
"json-schema": "^0.3.0",
- "typescript-json-schema": "^0.49.0",
"lodash": "^4.17.15",
"uuid": "^8.0.0",
"yup": "^0.29.3"
},
"devDependencies": {
- "@backstage/cli": "^0.6.14",
+ "@backstage/cli": "^0.7.0",
"@types/express": "^4.17.6",
"@types/jest": "^26.0.7",
"@types/lodash": "^4.14.151",
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index da06bfea17..8eae37ef56 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,58 @@
# @backstage/cli
+## 0.7.0
+
+### Minor Changes
+
+- 9cd3c533c: Switch from `ts-jest` to `@sucrase/jest-plugin`, improving performance and aligning transpilation with bundling.
+
+ In order to switch back to `ts-jest`, install `ts-jest@^26.4.3` as a dependency in the root of your repo and add the following in the root `package.json`:
+
+ ```json
+ "jest": {
+ "globals": {
+ "ts-jest": {
+ "isolatedModules": true
+ }
+ },
+ "transform": {
+ "\\.esm\\.js$": "@backstage/cli/config/jestEsmTransform.js",
+ "\\.(js|jsx|ts|tsx)$": "ts-jest",
+ "\\.(bmp|gif|jpg|jpeg|png|frag|xml|svg)$": "@backstage/cli/config/jestFileTransform.js",
+ "\\.(yaml)$": "yaml-jest"
+ }
+ }
+ ```
+
+ Note that this will override the default jest transforms included with the `@backstage/cli`.
+
+ It is possible that some test code needs a small migration as a result of this change, which stems from a difference in how `sucrase` and `ts-jest` transform module re-exports.
+
+ Consider the following code:
+
+ ```ts
+ import * as utils from './utils';
+
+ jest.spyOn(utils, 'myUtility').mockReturnValue(3);
+ ```
+
+ If the `./utils` import for example refers to an index file that in turn re-exports from `./utils/myUtility`, you would have to change the code to the following to work around the fact that the exported object from `./utils` ends up not having configurable properties, thus breaking `jest.spyOn`.
+
+ ```ts
+ import * as utils from './utils/myUtility';
+
+ jest.spyOn(utils, 'myUtility').mockReturnValue(3);
+ ```
+
+### Patch Changes
+
+- 7f7443308: Updated dependencies
+- 21e8ebef5: Fix error message formatting in the packaging process.
+
+ error.errors can be undefined which will lead to a TypeError, swallowing the actual error message in the process.
+
+ For instance, if you break your tsconfig.json with invalid syntax, backstage-cli will not be able to build anything and it will be very hard to find out why because the underlying error message is hidden behind a TypeError.
+
## 0.6.14
### Patch Changes
diff --git a/packages/cli/package.json b/packages/cli/package.json
index a8df1014fb..f633e410ea 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
- "version": "0.6.14",
+ "version": "0.7.0",
"private": false,
"publishConfig": {
"access": "public"
@@ -94,8 +94,8 @@
"react-hot-loader": "^4.12.21",
"recursive-readdir": "^2.2.2",
"replace-in-file": "^6.0.0",
- "rollup": "2.33.x",
- "rollup-plugin-dts": "^2.0.1",
+ "rollup": "2.44.x",
+ "rollup-plugin-dts": "^3.0.1",
"rollup-plugin-esbuild": "2.6.x",
"rollup-plugin-peer-deps-external": "^2.2.2",
"rollup-plugin-postcss": "^4.0.0",
@@ -118,7 +118,7 @@
"yn": "^4.0.0"
},
"devDependencies": {
- "@backstage/backend-common": "^0.8.1",
+ "@backstage/backend-common": "^0.8.2",
"@backstage/config": "^0.1.5",
"@backstage/core": "^0.7.12",
"@backstage/dev-utils": "^0.1.17",
@@ -139,7 +139,7 @@
"@types/rollup-plugin-postcss": "^2.0.0",
"@types/tar": "^4.0.3",
"@types/webpack": "^4.41.7",
- "@types/webpack-dev-server": "3.11.0",
+ "@types/webpack-dev-server": "^3.11.0",
"@types/yarnpkg__lockfile": "^1.1.4",
"del": "^5.1.0",
"mock-fs": "^4.13.0",
diff --git a/packages/cli/templates/default-backend-plugin/src/service/standaloneServer.ts.hbs b/packages/cli/templates/default-backend-plugin/src/service/standaloneServer.ts.hbs
index 6e38965246..765b6aa0d0 100644
--- a/packages/cli/templates/default-backend-plugin/src/service/standaloneServer.ts.hbs
+++ b/packages/cli/templates/default-backend-plugin/src/service/standaloneServer.ts.hbs
@@ -34,9 +34,12 @@ export async function startStandaloneServer(
logger,
});
- const service = createServiceBuilder(module)
- .enableCors({ origin: 'http://localhost:3000' })
+ let service = createServiceBuilder(module)
+ .setPort(options.port)
.addRouter('/{{id}}', router);
+ if (options.enableCors) {
+ service = service.enableCors({ origin: 'http://localhost:3000' });
+ }
return await service.start().catch(err => {
logger.error(err);
diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md
new file mode 100644
index 0000000000..9f2ae5d214
--- /dev/null
+++ b/packages/codemods/CHANGELOG.md
@@ -0,0 +1,15 @@
+# @backstage/codemods
+
+## 0.1.1
+
+### Patch Changes
+
+- Updated dependencies [9bca2a252]
+- Updated dependencies [e47336ea4]
+- Updated dependencies [75b8537ce]
+- Updated dependencies [da8cba44f]
+- Updated dependencies [da8cba44f]
+- Updated dependencies [9bca2a252]
+ - @backstage/core-app-api@0.1.2
+ - @backstage/core-components@0.1.2
+ - @backstage/core-plugin-api@0.1.2
diff --git a/packages/codemods/package.json b/packages/codemods/package.json
index 16f2e522a7..2ce0172b75 100644
--- a/packages/codemods/package.json
+++ b/packages/codemods/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/codemods",
"description": "A collection of codemods for Backstage projects",
- "version": "0.1.0",
+ "version": "0.1.1",
"private": true,
"homepage": "https://backstage.io",
"repository": {
diff --git a/packages/codemods/src/action.ts b/packages/codemods/src/action.ts
index 46e50ead77..c3eba8aecc 100644
--- a/packages/codemods/src/action.ts
+++ b/packages/codemods/src/action.ts
@@ -18,6 +18,7 @@ import { relative as relativePath } from 'path';
import { spawn } from 'child_process';
import { Command } from 'commander';
import { findPaths } from '@backstage/cli-common';
+import { platform } from 'os';
import { ExitCodeError } from './errors';
// eslint-disable-next-line no-restricted-syntax
@@ -50,8 +51,18 @@ export function createCodemodAction(name: string) {
console.log(`Running jscodeshift with these arguments: ${args.join(' ')}`);
- const jscodeshiftScript = require.resolve('.bin/jscodeshift');
- const child = spawn(process.argv0, [jscodeshiftScript, ...args], {
+ let command;
+ if (platform() === 'win32') {
+ command = 'jscodeshift';
+ } else {
+ // jscodeshift ships a slightly broken bin script with windows
+ // line endings so we need to execute it using node rather than
+ // letting the `#!/usr/bin/env node` take care of it
+ command = process.argv0;
+ args.unshift(require.resolve('.bin/jscodeshift'));
+ }
+
+ const child = spawn(command, args, {
stdio: 'inherit',
shell: true,
env: {
diff --git a/packages/codemods/src/tests/core-imports.test.ts b/packages/codemods/src/tests/core-imports.test.ts
index 90bc217d3e..e5924156b6 100644
--- a/packages/codemods/src/tests/core-imports.test.ts
+++ b/packages/codemods/src/tests/core-imports.test.ts
@@ -25,7 +25,8 @@ function runTransform(source: string) {
stats: () => undefined,
report: () => undefined,
};
- return coreImportTransform({ source, file: 'test.ts' }, api);
+ const result = coreImportTransform({ source, file: 'test.ts' }, api);
+ return result?.split('\r\n').join('\n');
}
describe('core-imports', () => {
diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json
index de0adb4a4a..a9a309428a 100644
--- a/packages/config-loader/package.json
+++ b/packages/config-loader/package.json
@@ -37,7 +37,7 @@
"fs-extra": "^9.0.0",
"json-schema": "^0.3.0",
"json-schema-merge-allof": "^0.8.1",
- "typescript-json-schema": "^0.49.0",
+ "typescript-json-schema": "^0.50.1",
"yaml": "^1.9.2",
"yup": "^0.29.3"
},
diff --git a/packages/config-loader/src/lib/schema/collect.test.ts b/packages/config-loader/src/lib/schema/collect.test.ts
index 94fe2154c1..488c8b5fc6 100644
--- a/packages/config-loader/src/lib/schema/collect.test.ts
+++ b/packages/config-loader/src/lib/schema/collect.test.ts
@@ -28,6 +28,15 @@ const mockSchema = {
},
};
+// We need to load in actual TS libraries when using mock-fs.
+// This lookup is to allow the `typescript` dependency to exist either
+// at top level or inside node_modules of typescript-json-schema
+const typescriptModuleDir = path.dirname(
+ require.resolve('typescript/package.json', {
+ paths: [require.resolve('typescript-json-schema')],
+ }),
+);
+
describe('collectConfigSchemas', () => {
afterEach(() => {
mockFs.restore();
@@ -157,9 +166,7 @@ describe('collectConfigSchemas', () => {
},
},
// TypeScript compilation needs to load some real files inside the typescript dir
- '../../node_modules/typescript': (mockFs as any).load(
- '../../node_modules/typescript',
- ),
+ [typescriptModuleDir]: (mockFs as any).load(typescriptModuleDir),
});
await expect(collectConfigSchemas(['a', 'b', 'c'])).resolves.toEqual([
@@ -218,9 +225,7 @@ describe('collectConfigSchemas', () => {
},
},
// TypeScript compilation needs to load some real files inside the typescript dir
- '../../node_modules/typescript': (mockFs as any).load(
- '../../node_modules/typescript',
- ),
+ [typescriptModuleDir]: (mockFs as any).load(typescriptModuleDir),
});
await expect(collectConfigSchemas(['a'])).rejects.toThrow(
diff --git a/packages/config-loader/src/lib/schema/collect.ts b/packages/config-loader/src/lib/schema/collect.ts
index 5baada2d6f..e12a4c9309 100644
--- a/packages/config-loader/src/lib/schema/collect.ts
+++ b/packages/config-loader/src/lib/schema/collect.ts
@@ -168,23 +168,6 @@ function compileTsSchemas(paths: string[]) {
},
[path.split(sep).join('/')], // Unix paths are expected for all OSes here
) as JsonObject | null;
-
- // This is a workaround for an API change in TypeScript 4.3 where doc comments no
- // longer are represented by a single string, but instead an array of objects.
- // This isn't handled by typescript-json-schema so we do the conversion here instead.
- value = JSON.parse(JSON.stringify(value), (key, prop) => {
- if (key === 'visibility' && Array.isArray(prop)) {
- const text = prop[0]?.text;
- if (!text) {
- const propStr = JSON.stringify(prop);
- throw new Error(
- `Failed conversion of visibility schema, got ${propStr}`,
- );
- }
- return text;
- }
- return prop;
- });
} catch (error) {
if (error.message !== 'type Config not found') {
throw error;
diff --git a/packages/core-api/CHANGELOG.md b/packages/core-api/CHANGELOG.md
index c06e2b6789..2282976d74 100644
--- a/packages/core-api/CHANGELOG.md
+++ b/packages/core-api/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/core-api
+## 0.2.22
+
+### Patch Changes
+
+- 9bca2a252: Improve forwards compatibility with `@backstage/core-app-api` and `@backstage/core-plugin-api` by re-using route reference types and factory methods from `@backstage/core-plugin-api`.
+- Updated dependencies [75b8537ce]
+- Updated dependencies [da8cba44f]
+ - @backstage/core-plugin-api@0.1.2
+
## 0.2.21
### Patch Changes
diff --git a/packages/core-api/package.json b/packages/core-api/package.json
index 1c3e707a29..1eaeeb24b1 100644
--- a/packages/core-api/package.json
+++ b/packages/core-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-api",
"description": "Internal Core API used by Backstage plugins and apps",
- "version": "0.2.21",
+ "version": "0.2.22",
"private": false,
"publishConfig": {
"access": "public",
@@ -30,7 +30,7 @@
},
"dependencies": {
"@backstage/config": "^0.1.4",
- "@backstage/core-plugin-api": "^0.1.1",
+ "@backstage/core-plugin-api": "^0.1.2",
"@backstage/theme": "^0.2.8",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -43,7 +43,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
- "@backstage/cli": "^0.6.14",
+ "@backstage/cli": "^0.7.0",
"@backstage/test-utils": "^0.1.13",
"@backstage/test-utils-core": "^0.1.1",
"@testing-library/jest-dom": "^5.10.1",
diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md
index f98cf7eeb1..4d7b7541d0 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,48 @@
# @backstage/core-app-api
+## 0.1.2
+
+### Patch Changes
+
+- 9bca2a252: Fixes a type bug where supplying all app icons to `createApp` was required, rather than just a partial list.
+- 75b8537ce: This change adds automatic error boundaries around extensions.
+
+ This means that all exposed parts of a plugin are wrapped in a general error boundary component, that is plugin aware. The default design for the error box is borrowed from `@backstage/errors`. To override the default "fallback", one must provide a component named `ErrorBoundaryFallback` to `createApp`, like so:
+
+ ```ts
+ const app = createApp({
+ components: {
+ ErrorBoundaryFallback: props => {
+ // a custom fallback component
+ return (
+ <>
+
Oops.
+
+ The plugin {props.plugin.getId()} failed with{' '}
+ {props.error.message}
+
+
+ >
+ );
+ },
+ },
+ });
+ ```
+
+ The props here include:
+
+ - `error`. An `Error` object or something that inherits it that represents the error that was thrown from any inner component.
+ - `resetError`. A callback that will simply attempt to mount the children of the error boundary again.
+ - `plugin`. A `BackstagePlugin` that can be used to look up info to be presented in the error message. For instance, you may want to keep a map of your internal plugins and team names or slack channels and present these when an error occurs. Typically, you'll do that by getting the plugin ID with `plugin.getId()`.
+
+- da8cba44f: Deprecate and disable the extension creation methods, which were added to this package by mistake and should only exist within `@backstage/core-plugin-api`.
+- 9bca2a252: Update `createApp` options to allow plugins with unknown output types in order to improve forwards and backwards compatibility.
+- Updated dependencies [e47336ea4]
+- Updated dependencies [75b8537ce]
+- Updated dependencies [da8cba44f]
+ - @backstage/core-components@0.1.2
+ - @backstage/core-plugin-api@0.1.2
+
## 0.1.1
### Patch Changes
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index ddb598ce9b..9298a53ea4 100644
--- a/packages/core-app-api/package.json
+++ b/packages/core-app-api/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
- "version": "0.1.1",
+ "version": "0.1.2",
"private": false,
"publishConfig": {
"access": "public",
@@ -29,9 +29,9 @@
"clean": "backstage-cli clean"
},
"dependencies": {
- "@backstage/core-components": "^0.1.1",
+ "@backstage/core-components": "^0.1.2",
"@backstage/config": "^0.1.3",
- "@backstage/core-plugin-api": "^0.1.1",
+ "@backstage/core-plugin-api": "^0.1.2",
"@backstage/theme": "^0.2.8",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
@@ -44,7 +44,7 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
- "@backstage/cli": "^0.6.14",
+ "@backstage/cli": "^0.7.0",
"@backstage/test-utils": "^0.1.13",
"@backstage/test-utils-core": "^0.1.1",
"@testing-library/jest-dom": "^5.10.1",
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index 93941494c8..83e5bad9f5 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,44 @@
# @backstage/core-components
+## 0.1.2
+
+### Patch Changes
+
+- e47336ea4: Use app.title for helmet in header
+- 75b8537ce: This change adds automatic error boundaries around extensions.
+
+ This means that all exposed parts of a plugin are wrapped in a general error boundary component, that is plugin aware. The default design for the error box is borrowed from `@backstage/errors`. To override the default "fallback", one must provide a component named `ErrorBoundaryFallback` to `createApp`, like so:
+
+ ```ts
+ const app = createApp({
+ components: {
+ ErrorBoundaryFallback: props => {
+ // a custom fallback component
+ return (
+ <>
+
Oops.
+
+ The plugin {props.plugin.getId()} failed with{' '}
+ {props.error.message}
+
+
+ >
+ );
+ },
+ },
+ });
+ ```
+
+ The props here include:
+
+ - `error`. An `Error` object or something that inherits it that represents the error that was thrown from any inner component.
+ - `resetError`. A callback that will simply attempt to mount the children of the error boundary again.
+ - `plugin`. A `BackstagePlugin` that can be used to look up info to be presented in the error message. For instance, you may want to keep a map of your internal plugins and team names or slack channels and present these when an error occurs. Typically, you'll do that by getting the plugin ID with `plugin.getId()`.
+
+- Updated dependencies [75b8537ce]
+- Updated dependencies [da8cba44f]
+ - @backstage/core-plugin-api@0.1.2
+
## 0.1.1
### Patch Changes
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index 1ce4adf2b7..42a98b859a 100644
--- a/packages/core-components/package.json
+++ b/packages/core-components/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
- "version": "0.1.1",
+ "version": "0.1.2",
"private": false,
"publishConfig": {
"access": "public",
@@ -30,7 +30,7 @@
},
"dependencies": {
"@backstage/config": "^0.1.5",
- "@backstage/core-plugin-api": "^0.1.1",
+ "@backstage/core-plugin-api": "^0.1.2",
"@backstage/errors": "^0.1.1",
"@backstage/theme": "^0.2.8",
"@material-ui/core": "^4.11.0",
@@ -70,8 +70,8 @@
"zen-observable": "^0.8.15"
},
"devDependencies": {
- "@backstage/core-app-api": "^0.1.1",
- "@backstage/cli": "^0.6.14",
+ "@backstage/core-app-api": "^0.1.2",
+ "@backstage/cli": "^0.7.0",
"@backstage/test-utils": "^0.1.13",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^11.2.5",
diff --git a/packages/core-components/src/components/Button/Button.tsx b/packages/core-components/src/components/Button/Button.tsx
index ca45b3da7f..c678b9a9db 100644
--- a/packages/core-components/src/components/Button/Button.tsx
+++ b/packages/core-components/src/components/Button/Button.tsx
@@ -14,17 +14,19 @@
* limitations under the License.
*/
-import React, { ComponentProps } from 'react';
-import { Button as MaterialButton } from '@material-ui/core';
-import { Link as RouterLink } from 'react-router-dom';
+import {
+ Button as MaterialButton,
+ ButtonProps as MaterialButtonProps,
+} from '@material-ui/core';
+import React from 'react';
+import { Link, LinkProps } from '../Link';
-type Props = ComponentProps &
- ComponentProps;
+type Props = MaterialButtonProps & Omit;
/**
* Thin wrapper on top of material-ui's Button component
* Makes the Button to utilise react-router
*/
export const Button = React.forwardRef((props, ref) => (
-
+
));
diff --git a/packages/core-components/src/components/SupportButton/SupportButton.test.tsx b/packages/core-components/src/components/SupportButton/SupportButton.test.tsx
index 6d6b9fd477..7c6cab99c1 100644
--- a/packages/core-components/src/components/SupportButton/SupportButton.test.tsx
+++ b/packages/core-components/src/components/SupportButton/SupportButton.test.tsx
@@ -21,8 +21,9 @@ import {
RenderResult,
waitFor,
fireEvent,
+ screen,
} from '@testing-library/react';
-import { wrapInTestApp } from '@backstage/test-utils';
+import { wrapInTestApp, renderInTestApp } from '@backstage/test-utils';
import { SupportButton } from './SupportButton';
const SUPPORT_BUTTON_ID = 'support-button';
@@ -41,6 +42,12 @@ describe('', () => {
);
});
+ it('supports passing a title', async () => {
+ await renderInTestApp();
+ fireEvent.click(screen.getByTestId(SUPPORT_BUTTON_ID));
+ expect(screen.getByText('Custom title')).toBeInTheDocument();
+ });
+
it('shows popover on click', async () => {
let renderResult: RenderResult;
diff --git a/packages/core-components/src/components/SupportButton/SupportButton.tsx b/packages/core-components/src/components/SupportButton/SupportButton.tsx
index 6c6de8abe3..96cc308f74 100644
--- a/packages/core-components/src/components/SupportButton/SupportButton.tsx
+++ b/packages/core-components/src/components/SupportButton/SupportButton.tsx
@@ -24,19 +24,18 @@ import {
ListItem,
ListItemIcon,
ListItemText,
+ Typography,
makeStyles,
Popover,
} from '@material-ui/core';
-import React, {
- Fragment,
- MouseEventHandler,
- PropsWithChildren,
- useState,
-} from 'react';
+import React, { Fragment, MouseEventHandler, useState } from 'react';
import { SupportItem, SupportItemLink, useSupportConfig } from '../../hooks';
import { Link } from '../Link';
-type Props = {};
+type SupportButtonProps = {
+ title?: string;
+ children?: React.ReactNode;
+};
const useStyles = makeStyles({
popoverList: {
@@ -78,7 +77,7 @@ const SupportListItem = ({ item }: { item: SupportItem }) => {
);
};
-export const SupportButton = ({ children }: PropsWithChildren) => {
+export const SupportButton = ({ title, children }: SupportButtonProps) => {
const { items } = useSupportConfig();
const [popoverOpen, setPopoverOpen] = useState(false);
@@ -121,13 +120,20 @@ export const SupportButton = ({ children }: PropsWithChildren) => {
onClose={popoverCloseHandler}
>
+ {title && (
+
+ {title}
+
+ )}
{React.Children.map(children, (child, i) => (
-
+
{child}
))}
{items &&
- items.map((item, i) => )}
+ items.map((item, i) => (
+
+ ))}