docs/releases/v1.37.0-next.2-changelog.md
Upgrade Helper: https://backstage.github.io/upgrade-helper/?to=1.37.0-next.2
12f8e01: BREAKING: The default DiscoveryApi implementation has been switched to use FrontendHostDiscovery, which adds support for the discovery.endpoints configuration.
This is marked as a breaking change because it will cause any existing discovery.endpoints configuration to be picked up and used, which may break existing setups.
For example, consider the following configuration:
app:
baseUrl: https://backstage.acme.org
backend:
baseUrl: https://backstage.internal.acme.org
discovery:
endpoints:
- target: https://catalog.internal.acme.org/api/{{pluginId}}
plugins: [catalog]
This will now cause requests from the frontend towards the catalog plugin to be routed to https://catalog.internal.acme.org/api/catalog, but this might not be reachable from the frontend. To fix this, you should update the discovery.endpoints configuration to only override the internal URL of the plugin:
discovery:
endpoints:
- target:
internal: https://catalog.internal.acme.org/api/{{pluginId}}
plugins: [catalog]
5b70679: BREAKING: ESLint warnings no longer trigger system exit codes like errors do.
Set the max number of warnings to -1 during linting to enable the gradual adoption of new ESLint rules. To restore the previous behavior, include the --max-warnings 0 flag in the backstage-cli <repo|package> lint command.
esbuild from 0.24.2 to 0.25.0index entries in the typesVersions map, which could cause /index to be added when automatically adding imports.--scope option for the new command that could cause plugins to have backstage-backstage-plugin in their name.$file, $env, and $include. Any other key that begins with a `# @backstage/config-loader will now be passed through as is.FetchApi will now also take configuration under discovery.endpoints into consideration when deciding whether to include credentials or not.discovery.endpoints configuration no longer requires both internal and external target when using the object form, instead falling back to the default.@backstage/ExtensionOverrides and @backstage/BackstagePlugin types.entityPage option to convertLegacyApp, which you can read more about in the app migration docs.5.8.abcdf44: BREAKING: The returned object from createSpecializedApp no longer contains a createRoot() method, and it instead now contains apis and tree.
You can replace existing usage of app.createRoot() with the following:
const root = tree.root.instance?.getData(coreExtensionData.reactElement);
8250ffe: BREAKING: Dropped support for the removed opaque @backstage/ExtensionOverrides and @backstage/BackstagePlugin types.
extensionFactoryMiddleware to either createApp() or createSpecializedApp().@backstage/ExtensionOverrides and @backstage/BackstagePlugin types.extensionFactoryMiddleware to either createApp() or createSpecializedApp().createSpecializedApp.createApp is now exposed via the discoverAvailableFeatures and resolveAsyncFeatures functions respectively.ExtensionOverrides and FrontendFeature types.createExtensionDataRef where the ID is passed directly.DialogApi, which can be used to show dialogs in the React tree that can collect input from the user.ExtensionMiddlewareFactory type.createFrontendPlugin is now sorted alphabetically by ID in the TypeScript type.setupRequestMockHandlers which was replaced by registerMswTestHooks.initialRouteEntries option to renderInTestApp.renderInTestApp helper now provides a default mock config with mock values for both app.baseUrl and backend.baseUrl.createSpecializedApp.247a40b: Now a custom entity page header can be passed as input to the default entity page.
93533bd: The order in which group tabs appear on the entity page has been changed.
Previously, entity contents determined the order in which groups were rendered, so a group was rendered as soon as its first entity content was detected.
Groups are now rendered first by default based on their order in the app-config.yaml file:
app:
extensions:
- page:catalog/entity:
+ config:
+ groups:
+ # this will be the first tab of the default entity page
+ - deployment:
+ title: Deployment
+ # this will be the second tab of the default entiy page
+ - documentation:
+ title: Documentation
If you wish to place a normal tab before a group, you must add the tab to a group and place the group in the order you wish it to appear on the entity page (groups that contains only one tab are rendered as normal tabs).
app:
extensions:
- page:catalog/entity:
config:
groups:
+ # Example placing the overview tab first
+ - overview:
+ title: Overview
- deployment:
title: Deployment
# this will be the second tab of the default entiy page
- documentation:
title: Documentation
- entity-content:catalog/overview:
+ config:
+ group: 'overview'
expiry-map dependency.7f57365: Add support for a new entity predicate syntax when defining filters related to the blueprints exported via /alpha for the new frontend system. For more information, see the entity filters documentation.
247a40b: Introduces a new EntityHeaderBlueprint that allows you to override the default entity page header.
import { EntityHeaderBlueprint } from '@backstage/plugin-catalog-react/alpha';
EntityHeaderBlueprint.make({
name: 'my-default-header',
params: {
loader: () =>
import('./MyDefaultHeader').then(m => <m.MyDefaultHeader />),
},
});
createTemplateAction type, and convert catalog:fetch action to new way of defining actions.esbuild from 0.24.2 to 0.25.01a58846: DEPRECATION: We've deprecated the old way of defining actions using createTemplateAction with raw JSONSchema and type parameters, as well as using zod through an import. You can now use the new format to define createTemplateActions with zod provided by the framework. This change also removes support for logStream in the context as well as moving the logger to an instance of LoggerService.
Before:
createTemplateAction<{ repoUrl: string }, { test: string }>({
id: 'test',
schema: {
input: {
type: 'object',
required: ['repoUrl'],
properties: {
repoUrl: { type: 'string' },
},
},
output: {
type: 'object',
required: ['test'],
properties: {
test: { type: 'string' },
},
},
},
handler: async ctx => {
ctx.logStream.write('blob');
},
});
// or
createTemplateAction({
id: 'test',
schema: {
input: z.object({
repoUrl: z.string(),
}),
output: z.object({
test: z.string(),
}),
},
handler: async ctx => {
ctx.logStream.write('something');
},
});
After:
createTemplateAction({
id: 'test',
schema: {
input: {
repoUrl: d => d.string(),
},
output: {
test: d => d.string(),
},
},
handler: async ctx => {
// you can just use ctx.logger.log('...'), or if you really need a log stream you can do this:
const logStream = new PassThrough();
logStream.on('data', chunk => {
ctx.logger.info(chunk.toString());
});
},
});
createTemplateAction kindsdiscovery.endpoints configuration no longer requires both internal and external target when using the object form, instead falling back to the default.@types/jest to devDependencies.@types/jest to devDependencies.DialogApi.README.mdREADME.mdREADME.md@backstage/plugin-catalog-backend to prevent duplicate path keys in entity search if only casing is different.PermissionsRegistryService.config.d.ts for ldapOrg being incorrect. The documentation says a single
object or an array are accepted, but the definition only allows an object.addHttpPostBodyParser to events extension to allow body parse customization. This feature will enhance flexibility in handling HTTP POST requests in event-related operations.addHttpPostBodyParser to events extension to allow body parse customization. This feature will enhance flexibility in handling HTTP POST requests in event-related operations.bitbucketCloud:branchRestriction:create to allow users to create bitbucket cloud branch restrictions in templatesjsonschemaundefined to some parameters for createOrUpdateEnvironment as these values are not always supported in different plans of GitHubflatted to 3.3.3.