Merge branch 'backstage:master' into add-catalog-permissions

This commit is contained in:
Kashish Mittal
2024-08-13 11:24:20 -04:00
committed by GitHub
362 changed files with 5546 additions and 715 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': patch
---
Add an extra bit of height to the EntityPicker dropdown to make it clear there are more options to select from, and to remove the scroll bar when there is less than 10 options
-7
View File
@@ -1,7 +0,0 @@
---
'@backstage/cli-node': patch
'@backstage/cli': patch
'@backstage/eslint-plugin': patch
---
Added support for the `frontend-extensions` role, which is used in conjunction with the new frontend system to ship extensions to your apps.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
---
Add ability to set the initial commit message when initializing a repository using the scaffolder action.
+20
View File
@@ -0,0 +1,20 @@
---
'@backstage/frontend-plugin-api': patch
---
Support overriding of plugin extensions using the new `plugin.withOverrides` method.
```tsx
import homePlugin from '@backstage/plugin-home';
export default homePlugin.withOverrides({
extensions: [
homePage.getExtension('page:home').override({
*factory(originalFactory) {
yield* originalFactory();
yield coreExtensionData.reactElement(<h1>My custom home page</h1>);
},
}),
],
});
```
+32
View File
@@ -191,8 +191,10 @@
},
"changesets": [
"angry-dolphins-camp",
"big-countries-wait",
"big-eagles-grab",
"blue-pumas-cheer",
"breezy-cats-kiss",
"breezy-jeans-tie",
"breezy-rings-fly",
"bright-donkeys-buy",
@@ -200,6 +202,7 @@
"calm-crabs-drop",
"chilly-days-peel",
"chilly-trains-sleep",
"clean-kids-applaud",
"clever-pans-brake",
"cool-insects-remember",
"cool-schools-vanish",
@@ -217,20 +220,27 @@
"fair-pumas-hang",
"fast-bulldogs-relax",
"few-wasps-hug",
"five-mangos-agree",
"flat-papayas-push",
"flat-plums-grow",
"forty-ties-agree",
"forty-ties-disagree",
"fresh-timers-walk",
"friendly-cherries-applaud",
"friendly-chicken-cry",
"friendly-feet-refuse",
"funny-bears-sort",
"funny-wolves-learn",
"gentle-dryers-smile",
"good-steaks-report",
"green-planets-reflect",
"grumpy-owls-suffer",
"healthy-fireants-jump",
"healthy-timers-divide",
"heavy-numbers-love",
"hip-fishes-guess",
"hip-hairs-exist",
"itchy-experts-tie",
"khaki-lamps-peel",
"late-games-protect",
"light-pianos-exercise",
@@ -243,6 +253,7 @@
"mighty-dolls-retire",
"mighty-geckos-kiss",
"modern-parrots-protect",
"modern-poems-mate",
"neat-bears-divide",
"neat-gifts-join",
"neat-socks-cheer",
@@ -253,27 +264,38 @@
"nine-seahorses-relate",
"ninety-icons-smile",
"odd-books-share",
"old-tools-smell",
"olive-books-sort",
"orange-gifts-protect",
"perfect-cars-jam",
"pink-gorillas-brake",
"plenty-tools-exist",
"popular-panthers-hear",
"purple-carrots-crash",
"quick-roses-juggle",
"rare-foxes-compete",
"real-lizards-sit",
"red-radios-promise",
"renovate-147ac48",
"renovate-f04beb1",
"rich-mugs-dress",
"selfish-bees-think",
"seven-days-film",
"seven-eggs-admire",
"shaggy-dodos-applaud",
"shaggy-mugs-return",
"shy-games-poke",
"shy-waves-share",
"silly-candles-sin",
"silly-cycles-tan",
"silly-scissors-turn",
"silver-pillows-begin",
"six-mails-smell",
"six-rats-kick",
"sixty-kiwis-poke",
"slow-ducks-rush",
"slow-ligers-drum",
"slow-rocks-end",
"slow-toes-jog",
"small-bottles-cough",
"small-ears-poke",
@@ -284,28 +306,38 @@
"spicy-planets-provide",
"spotty-planets-accept",
"strange-papayas-beg",
"strong-chicken-kiss",
"strong-otters-compete",
"stupid-dots-relate",
"sweet-oranges-buy",
"swift-kings-sparkle",
"tall-snakes-fix",
"tasty-ads-rescue",
"ten-penguins-roll",
"thick-hotels-know",
"thick-squids-drive",
"thin-carrots-eat",
"thirty-adults-grab",
"thirty-paws-hope",
"tiny-dodos-prove-2",
"tiny-dodos-prove",
"tiny-oranges-pretend",
"tough-goats-hang",
"tough-lies-repair",
"tricky-ducks-juggle",
"tricky-rules-destroy",
"two-emus-work",
"violet-jokes-wave",
"warm-monkeys-marry",
"weak-jobs-joke",
"wicked-bobcats-teach",
"wild-eggs-exist",
"wise-spiders-walk",
"witty-bears-behave",
"witty-geese-battle",
"witty-queens-run",
"witty-timers-marry",
"young-birds-push",
"young-games-visit",
"young-peaches-shake"
]
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated dependency `@module-federation/enhanced` to `0.3.1`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend-module-cloudflare-access-provider': minor
---
Support for Cloudflare Custom Headers and Custom Cookie Auth Name
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-api-docs': patch
'@backstage/plugin-catalog': patch
---
Add `tableOptions` to all tables and additionally `title` to API tables.
+6
View File
@@ -32,6 +32,12 @@ auth:
serviceTokens:
- token: '1uh2fh19efvfh129f1f919u21f2f19jf2.access'
subject: 'bot-user@your-company.com'
# You can customize the header name that contains the jwt token, by default
# cf-access-jwt-assertion is used
jwtHeaderName: <my-header>
# You can customize the authorization cookie name, by default
# CF_Authorization is used
authorizationCookieName: <MY_CAUTHORIZATION_COOKIE_NAME>
# This picks what sign in resolver(s) you want to use.
signIn:
resolvers:
@@ -50,7 +50,7 @@ components need to be in a known machine-readable format so we can build further
tooling and analysis on top.
APIs have a visibility: they are either public (making them available for any
other component to consume), restricted (only available to an allowlisted set of
other component to consume), restricted (only available to an allowed set of
consumers), or private (only available within their system). As public APIs are
going to be the primary way interaction between components, Backstage supports
documenting, indexing and searching all APIs so we can browse them as
+1 -1
View File
@@ -203,7 +203,7 @@ techdocs:
# (Optional) The time (in milliseconds) that the TechDocs backend will wait
# for a cache service to respond before continuing on as though the cached
# object was not found (e.g. when the cache sercice is unavailable). The
# object was not found (e.g. when the cache service is unavailable). The
# default value is 1000
readTimeout: 500
```
File diff suppressed because it is too large Load Diff
+12 -13
View File
@@ -93,19 +93,18 @@ defined in the `package.json` of each package like this:
These are the available roles that are currently supported by the Backstage build system:
| Role | Description | Example |
| ---------------------- | ----------------------------------------------------------------------------- | -------------------------------------------- |
| frontend | Bundled frontend application | `packages/app` |
| backend | Bundled backend application | `packages/backend` |
| cli | Package used as a command-line interface | `@backstage/cli`, `@backstage/codemods` |
| web-library | Web library for use by other packages | `@backstage/plugin-catalog-react` |
| node-library | Node.js library for use by other packages | `@backstage/plugin-techdocs-node` |
| common-library | Isomorphic library for use by other packages | `@backstage/plugin-permission-common` |
| frontend-plugin | Backstage frontend plugin | `@backstage/plugin-scaffolder` |
| frontend-extensions | Extensions (customizations, private additions etc) for the Backstage frontend | Typically only appears in adopter repos |
| frontend-plugin-module | Backstage frontend plugin module | `@backstage/plugin-analytics-module-ga` |
| backend-plugin | Backstage backend plugin | `@backstage/plugin-auth-backend` |
| backend-plugin-module | Backstage backend plugin module | `@backstage/plugin-search-backend-module-pg` |
| Role | Description | Example |
| ---------------------- | -------------------------------------------- | -------------------------------------------- |
| frontend | Bundled frontend application | `packages/app` |
| backend | Bundled backend application | `packages/backend` |
| cli | Package used as a command-line interface | `@backstage/cli`, `@backstage/codemods` |
| web-library | Web library for use by other packages | `@backstage/plugin-catalog-react` |
| node-library | Node.js library for use by other packages | `@backstage/plugin-techdocs-node` |
| common-library | Isomorphic library for use by other packages | `@backstage/plugin-permission-common` |
| frontend-plugin | Backstage frontend plugin | `@backstage/plugin-scaffolder` |
| frontend-plugin-module | Backstage frontend plugin module | `@backstage/plugin-analytics-module-ga` |
| backend-plugin | Backstage backend plugin | `@backstage/plugin-auth-backend` |
| backend-plugin-module | Backstage backend plugin module | `@backstage/plugin-search-backend-module-pg` |
Most of the steps that we cover below have an accompanying command that is intended to be used as a package script. The commands are all available under the `backstage-cli package` category, and many of the commands will behave differently depending on the role of the package. The commands are intended to be used like this:
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "root",
"version": "1.30.0-next.3",
"version": "1.30.0-next.4",
"private": true,
"repository": {
"type": "git",
@@ -1 +0,0 @@
module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
@@ -1,3 +0,0 @@
# app-next-example-extensions
This is just an example of how extensions can be bundled up for adding into your Backstage frontend app.
@@ -1,26 +0,0 @@
## API Report File for "@internal/app-next-example-extensions"
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { AnyExtensionDataRef } from '@backstage/frontend-plugin-api';
import { ExtensionDefinition } from '@backstage/frontend-plugin-api';
import { ExtensionOverrides } from '@backstage/frontend-plugin-api';
// @public (undocumented)
const _default: ExtensionOverrides;
export default _default;
// @public (undocumented)
export const SignInPage: ExtensionDefinition<
{},
{},
AnyExtensionDataRef,
{},
string | undefined,
string | undefined,
string | undefined
>;
// (No @packageDocumentation comment for this package)
```
@@ -1,9 +0,0 @@
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: internal-app-next-example-extensions
title: '@internal/app-next-example-extensions'
spec:
lifecycle: experimental
type: backstage-frontend-extensions
owner: maintainers
@@ -1,60 +0,0 @@
{
"name": "@internal/app-next-example-extensions",
"version": "0.0.0",
"backstage": {
"role": "frontend-extensions"
},
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
"types": "dist/index.d.ts"
},
"private": true,
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage",
"directory": "packages/app-next-example-extensions"
},
"license": "Apache-2.0",
"sideEffects": false,
"main": "src/index.ts",
"types": "src/index.ts",
"files": [
"dist"
],
"scripts": {
"build": "backstage-cli package build",
"clean": "backstage-cli package clean",
"lint": "backstage-cli package lint",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"start": "backstage-cli package start",
"test": "backstage-cli package test"
},
"dependencies": {
"@backstage/core-components": "workspace:^",
"@backstage/frontend-plugin-api": "workspace:^",
"@backstage/integration-react": "workspace:^",
"@backstage/plugin-home": "workspace:^",
"@backstage/theme": "workspace:^",
"@material-ui/core": "^4.9.13",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "^4.0.0-alpha.61",
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "workspace:^",
"@backstage/core-app-api": "workspace:^",
"@backstage/dev-utils": "workspace:^",
"@backstage/test-utils": "workspace:^",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^15.0.0",
"@testing-library/user-event": "^14.0.0",
"msw": "^1.0.0"
},
"peerDependencies": {
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
}
}
@@ -1,21 +0,0 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
describe('dummy', () => {
it('succeeds', () => {
expect(true).toBe(true);
});
});
@@ -1,22 +0,0 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createApiExtension } from '@backstage/frontend-plugin-api';
import { ScmAuth } from '@backstage/integration-react';
export const ScmAuthApi = createApiExtension({
factory: ScmAuth.createDefaultApiFactory(),
});
@@ -1,29 +0,0 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import React from 'react';
import { createSignInPageExtension } from '@backstage/frontend-plugin-api';
/**
* @public
*/
export const SignInPage = createSignInPageExtension({
name: 'guest',
loader: () =>
import('@backstage/core-components').then(m => props => (
<m.SignInPage {...props} providers={['guest']} />
)),
});
@@ -1,21 +0,0 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export { HomePage } from './HomePage';
export { NotFoundErrorPage } from './NotFoundErrorPage';
export { ScmAuthApi } from './ScmAuthApi';
export { ScmIntegrationApi } from './ScmIntegrationApi';
export { SignInPage } from './SignInPage';
@@ -1,24 +0,0 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createExtensionOverrides } from '@backstage/frontend-plugin-api';
import * as extensions from './extensions';
export { SignInPage } from './extensions/SignInPage';
export default createExtensionOverrides({
extensions: Object.values(extensions),
});
@@ -1,17 +0,0 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import '@testing-library/jest-dom';
@@ -1,5 +1,13 @@
# app-next-example-plugin
## 0.0.14-next.3
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.7.0-next.3
- @backstage/core-components@0.14.10-next.0
## 0.0.14-next.2
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "app-next-example-plugin",
"version": "0.0.14-next.2",
"version": "0.0.14-next.3",
"description": "Backstage internal example plugin",
"backstage": {
"role": "frontend-plugin",
+43
View File
@@ -1,5 +1,48 @@
# example-app-next
## 0.0.14-next.4
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder@1.24.0-next.3
- @backstage/frontend-plugin-api@0.7.0-next.3
- @backstage/plugin-notifications@0.3.0-next.1
- @backstage/cli@0.27.0-next.4
- @backstage/plugin-techdocs@1.10.8-next.3
- @backstage/plugin-api-docs@0.11.8-next.3
- @backstage/plugin-catalog@1.22.0-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/core-compat-api@0.2.8-next.3
- @backstage/frontend-app-api@0.7.5-next.3
- @backstage/plugin-app-visualizer@0.1.9-next.3
- @backstage/plugin-catalog-graph@0.4.8-next.4
- @backstage/plugin-catalog-import@0.12.2-next.3
- @backstage/plugin-catalog-react@1.12.3-next.3
- @backstage/plugin-home@0.7.9-next.3
- @backstage/plugin-kubernetes@0.11.13-next.3
- @backstage/plugin-org@0.6.28-next.3
- @backstage/plugin-search@1.4.15-next.3
- @backstage/plugin-search-react@1.7.14-next.3
- @backstage/plugin-user-settings@0.8.11-next.3
- @backstage/app-defaults@1.5.10-next.2
- @backstage/config@1.2.0
- @backstage/core-app-api@1.14.2-next.0
- @backstage/core-components@0.14.10-next.0
- @backstage/core-plugin-api@1.9.3
- @backstage/integration-react@1.1.30-next.0
- @backstage/theme@0.5.6
- @backstage/plugin-auth-react@0.1.5-next.0
- @backstage/plugin-catalog-common@1.0.26-next.2
- @backstage/plugin-catalog-unprocessed-entities@0.2.7-next.1
- @backstage/plugin-kubernetes-cluster@0.0.14-next.3
- @backstage/plugin-permission-react@0.4.25-next.1
- @backstage/plugin-scaffolder-react@1.11.0-next.3
- @backstage/plugin-search-common@1.2.14-next.1
- @backstage/plugin-signals@0.0.9-next.0
- @backstage/plugin-techdocs-module-addons-contrib@1.1.13-next.1
- @backstage/plugin-techdocs-react@1.2.7-next.1
## 0.0.14-next.3
### Patch Changes
+1 -2
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.14-next.3",
"version": "0.0.14-next.4",
"private": true,
"repository": {
"type": "git",
@@ -49,7 +49,6 @@
"@backstage/plugin-techdocs-react": "workspace:^",
"@backstage/plugin-user-settings": "workspace:^",
"@backstage/theme": "workspace:^",
"@internal/app-next-example-extensions": "workspace:^",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.61",
+52 -3
View File
@@ -17,16 +17,33 @@
import React from 'react';
import { createApp } from '@backstage/frontend-app-api';
import { pagesPlugin } from './examples/pagesPlugin';
import notFoundErrorPage from './examples/notFoundErrorPageExtension';
import userSettingsPlugin from '@backstage/plugin-user-settings/alpha';
import homePlugin from '@backstage/plugin-home/alpha';
import homePlugin, {
titleExtensionDataRef,
} from '@backstage/plugin-home/alpha';
import {
coreExtensionData,
createExtension,
createApiExtension,
createExtensionOverrides,
} from '@backstage/frontend-plugin-api';
import techdocsPlugin from '@backstage/plugin-techdocs/alpha';
import appVisualizerPlugin from '@backstage/plugin-app-visualizer';
import { homePage } from './HomePage';
import { convertLegacyApp } from '@backstage/core-compat-api';
import { FlatRoutes } from '@backstage/core-app-api';
import { Route } from 'react-router';
import { CatalogImportPage } from '@backstage/plugin-catalog-import';
import { createApiFactory, configApiRef } from '@backstage/core-plugin-api';
import {
ScmAuth,
ScmIntegrationsApi,
scmIntegrationsApiRef,
} from '@backstage/integration-react';
import kubernetesPlugin from '@backstage/plugin-kubernetes/alpha';
import extensions from '@internal/app-next-example-extensions';
import { signInPageOverrides } from './overrides/SignInPage';
/*
@@ -57,6 +74,30 @@ TODO:
/* app.tsx */
const homePageExtension = createExtension({
name: 'myhomepage',
attachTo: { id: 'page:home', input: 'props' },
output: {
children: coreExtensionData.reactElement,
title: titleExtensionDataRef,
},
factory() {
return { children: homePage, title: 'just a title' };
},
});
const scmAuthExtension = createApiExtension({
factory: ScmAuth.createDefaultApiFactory(),
});
const scmIntegrationApi = createApiExtension({
factory: createApiFactory({
api: scmIntegrationsApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi),
}),
});
const collectedLegacyPlugins = convertLegacyApp(
<FlatRoutes>
<Route path="/catalog-import" element={<CatalogImportPage />} />
@@ -71,8 +112,16 @@ const app = createApp({
homePlugin,
appVisualizerPlugin,
kubernetesPlugin,
extensions,
signInPageOverrides,
...collectedLegacyPlugins,
createExtensionOverrides({
extensions: [
homePageExtension,
scmAuthExtension,
scmIntegrationApi,
notFoundErrorPage,
],
}),
],
/* Handled through config instead */
// bindRoutes({ bind }) {
@@ -29,11 +29,6 @@ import {
import { Content, Header, Page } from '@backstage/core-components';
import React from 'react';
import HomeIcon from '@material-ui/icons/Home';
import {
coreExtensionData,
createExtension,
} from '@backstage/frontend-plugin-api';
import { titleExtensionDataRef } from '@backstage/plugin-home/alpha';
const clockConfigs: ClockConfig[] = [
{
@@ -116,15 +111,3 @@ export const homePage = (
</Content>
</Page>
);
export const HomePage = createExtension({
name: 'myhomepage',
attachTo: { id: 'page:home', input: 'props' },
output: {
children: coreExtensionData.reactElement,
title: titleExtensionDataRef,
},
factory() {
return { children: homePage, title: 'just a title' };
},
});
@@ -23,7 +23,7 @@ import Box from '@material-ui/core/Box';
import Typography from '@material-ui/core/Typography';
import { Button } from '@backstage/core-components';
function CustomNotFoundErrorPage() {
export function CustomNotFoundErrorPage() {
return (
<Box
component="article"
@@ -51,7 +51,7 @@ function CustomNotFoundErrorPage() {
);
}
export const NotFoundErrorPage = createComponentExtension({
export default createComponentExtension({
ref: coreComponentRefs.notFoundErrorPage,
loader: { sync: () => CustomNotFoundErrorPage },
});
@@ -18,7 +18,7 @@ import React from 'react';
import ReactDOM from 'react-dom/client';
import { CookieAuthRedirect } from '@backstage/plugin-auth-react';
import { createApp } from '@backstage/frontend-app-api';
import { SignInPage } from '@internal/app-next-example-extensions';
import { signInPageOverrides } from './overrides/SignInPage';
import {
coreExtensionData,
createExtension,
@@ -39,8 +39,9 @@ const authRedirectExtension = createExtension({
const app = createApp({
features: [
signInPageOverrides,
createExtensionOverrides({
extensions: [SignInPage, authRedirectExtension],
extensions: [authRedirectExtension],
}),
],
});
@@ -14,20 +14,18 @@
* limitations under the License.
*/
import React from 'react';
import { SignInPage } from '@backstage/core-components';
import {
configApiRef,
createApiExtension,
createApiFactory,
createExtensionOverrides,
createSignInPageExtension,
} from '@backstage/frontend-plugin-api';
import {
ScmIntegrationsApi,
scmIntegrationsApiRef,
} from '@backstage/integration-react';
export const ScmIntegrationApi = createApiExtension({
factory: createApiFactory({
api: scmIntegrationsApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi),
}),
const signInPage = createSignInPageExtension({
name: 'guest',
loader: async () => props => <SignInPage {...props} providers={['guest']} />,
});
export const signInPageOverrides = createExtensionOverrides({
extensions: [signInPage],
});
+41
View File
@@ -1,5 +1,46 @@
# example-app
## 0.2.100-next.4
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder@1.24.0-next.3
- @backstage/plugin-notifications@0.3.0-next.1
- @backstage/cli@0.27.0-next.4
- @backstage/plugin-techdocs@1.10.8-next.3
- @backstage/plugin-api-docs@0.11.8-next.3
- @backstage/plugin-catalog@1.22.0-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/frontend-app-api@0.7.5-next.3
- @backstage/plugin-catalog-graph@0.4.8-next.4
- @backstage/plugin-catalog-import@0.12.2-next.3
- @backstage/plugin-catalog-react@1.12.3-next.3
- @backstage/plugin-devtools@0.1.17-next.3
- @backstage/plugin-home@0.7.9-next.3
- @backstage/plugin-kubernetes@0.11.13-next.3
- @backstage/plugin-org@0.6.28-next.3
- @backstage/plugin-search@1.4.15-next.3
- @backstage/plugin-search-react@1.7.14-next.3
- @backstage/plugin-user-settings@0.8.11-next.3
- @backstage/app-defaults@1.5.10-next.2
- @backstage/config@1.2.0
- @backstage/core-app-api@1.14.2-next.0
- @backstage/core-components@0.14.10-next.0
- @backstage/core-plugin-api@1.9.3
- @backstage/integration-react@1.1.30-next.0
- @backstage/theme@0.5.6
- @backstage/plugin-auth-react@0.1.5-next.0
- @backstage/plugin-catalog-common@1.0.26-next.2
- @backstage/plugin-catalog-unprocessed-entities@0.2.7-next.1
- @backstage/plugin-kubernetes-cluster@0.0.14-next.3
- @backstage/plugin-permission-react@0.4.25-next.1
- @backstage/plugin-scaffolder-react@1.11.0-next.3
- @backstage/plugin-search-common@1.2.14-next.1
- @backstage/plugin-signals@0.0.9-next.0
- @backstage/plugin-techdocs-module-addons-contrib@1.1.13-next.1
- @backstage/plugin-techdocs-react@1.2.7-next.1
## 0.2.100-next.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.100-next.3",
"version": "0.2.100-next.4",
"backstage": {
"role": "frontend"
},
+17
View File
@@ -1,5 +1,22 @@
# @backstage/backend-app-api
## 0.8.1-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/backend-common@0.23.4-next.3
- @backstage/backend-tasks@0.5.28-next.3
- @backstage/cli-common@0.1.14
- @backstage/cli-node@0.2.7
- @backstage/config@1.2.0
- @backstage/config-loader@1.9.0-next.2
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
- @backstage/plugin-auth-node@0.5.0-next.3
- @backstage/plugin-permission-node@0.8.1-next.3
## 0.8.1-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-app-api",
"version": "0.8.1-next.2",
"version": "0.8.1-next.3",
"description": "Core API used by Backstage backend apps",
"backstage": {
"role": "node-library"
+17
View File
@@ -1,5 +1,22 @@
# @backstage/backend-common
## 0.23.4-next.3
### Patch Changes
- ddde5fe: Internal type refactor.
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/backend-dev-utils@0.1.4
- @backstage/cli-common@0.1.14
- @backstage/config@1.2.0
- @backstage/config-loader@1.9.0-next.2
- @backstage/errors@1.2.4
- @backstage/integration@1.14.0-next.0
- @backstage/integration-aws-node@0.1.12
- @backstage/types@1.1.1
- @backstage/plugin-auth-node@0.5.0-next.3
## 0.23.4-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-common",
"version": "0.23.4-next.2",
"version": "0.23.4-next.3",
"description": "Common functionality library for Backstage backends",
"backstage": {
"role": "node-library"
+21
View File
@@ -1,5 +1,26 @@
# @backstage/backend-defaults
## 0.4.2-next.3
### Patch Changes
- 81f930a: use formatted query to prevent chance of SQL-injection
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/backend-common@0.23.4-next.3
- @backstage/backend-app-api@0.8.1-next.3
- @backstage/backend-dev-utils@0.1.4
- @backstage/cli-common@0.1.14
- @backstage/config@1.2.0
- @backstage/config-loader@1.9.0-next.2
- @backstage/errors@1.2.4
- @backstage/integration@1.14.0-next.0
- @backstage/integration-aws-node@0.1.12
- @backstage/types@1.1.1
- @backstage/plugin-auth-node@0.5.0-next.3
- @backstage/plugin-events-node@0.3.9-next.3
- @backstage/plugin-permission-node@0.8.1-next.3
## 0.4.2-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
"version": "0.4.2-next.2",
"version": "0.4.2-next.3",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
@@ -1,5 +1,31 @@
# @backstage/backend-dynamic-feature-service
## 0.2.16-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/backend-common@0.23.4-next.3
- @backstage/backend-app-api@0.8.1-next.3
- @backstage/backend-tasks@0.5.28-next.3
- @backstage/cli-common@0.1.14
- @backstage/cli-node@0.2.7
- @backstage/config@1.2.0
- @backstage/config-loader@1.9.0-next.2
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
- @backstage/plugin-app-node@0.1.23-next.3
- @backstage/plugin-auth-node@0.5.0-next.3
- @backstage/plugin-catalog-backend@1.24.1-next.3
- @backstage/plugin-events-backend@0.3.10-next.3
- @backstage/plugin-events-node@0.3.9-next.3
- @backstage/plugin-permission-common@0.8.1-next.1
- @backstage/plugin-permission-node@0.8.1-next.3
- @backstage/plugin-scaffolder-node@0.4.9-next.3
- @backstage/plugin-search-backend-node@1.2.28-next.3
- @backstage/plugin-search-common@1.2.14-next.1
## 0.2.16-next.2
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-dynamic-feature-service",
"description": "Backstage dynamic feature service",
"version": "0.2.16-next.2",
"version": "0.2.16-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+41
View File
@@ -1,5 +1,46 @@
# example-backend-legacy
## 0.2.101-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder-backend-module-gitlab@0.4.5-next.3
- @backstage/plugin-techdocs-backend@1.10.10-next.3
- @backstage/backend-common@0.23.4-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/plugin-scaffolder-backend@1.23.1-next.3
- @backstage/backend-tasks@0.5.28-next.3
- @backstage/catalog-client@1.6.6-next.0
- @backstage/config@1.2.0
- @backstage/integration@1.14.0-next.0
- @backstage/plugin-app-backend@0.3.72-next.3
- @backstage/plugin-auth-backend@0.22.10-next.3
- @backstage/plugin-auth-node@0.5.0-next.3
- @backstage/plugin-catalog-backend@1.24.1-next.3
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.3
- @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.3
- @backstage/plugin-catalog-node@1.12.5-next.3
- @backstage/plugin-devtools-backend@0.3.9-next.3
- @backstage/plugin-events-backend@0.3.10-next.3
- @backstage/plugin-events-node@0.3.9-next.3
- @backstage/plugin-kubernetes-backend@0.18.4-next.3
- @backstage/plugin-permission-backend@0.5.47-next.3
- @backstage/plugin-permission-common@0.8.1-next.1
- @backstage/plugin-permission-node@0.8.1-next.3
- @backstage/plugin-proxy-backend@0.5.4-next.3
- @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.24-next.3
- @backstage/plugin-scaffolder-backend-module-rails@0.4.40-next.3
- @backstage/plugin-search-backend@1.5.15-next.3
- @backstage/plugin-search-backend-module-catalog@0.1.29-next.3
- @backstage/plugin-search-backend-module-elasticsearch@1.5.4-next.3
- @backstage/plugin-search-backend-module-explore@0.1.29-next.3
- @backstage/plugin-search-backend-module-pg@0.5.33-next.3
- @backstage/plugin-search-backend-module-techdocs@0.1.28-next.3
- @backstage/plugin-search-backend-node@1.2.28-next.3
- @backstage/plugin-signals-backend@0.1.9-next.3
- @backstage/plugin-signals-node@0.1.9-next.3
## 0.2.101-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend-legacy",
"version": "0.2.101-next.2",
"version": "0.2.101-next.3",
"backstage": {
"role": "backend"
},
@@ -1,5 +1,13 @@
# @backstage/backend-openapi-utils
## 0.1.16-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/errors@1.2.4
## 0.1.16-next.2
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-openapi-utils",
"description": "OpenAPI typescript support.",
"version": "0.1.16-next.2",
"version": "0.1.16-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/backend-plugin-api
## 0.8.0-next.3
### Patch Changes
- ddde5fe: Fixed a type issue where plugin and modules depending on multiton services would not receive the correct type.
- Updated dependencies
- @backstage/cli-common@0.1.14
- @backstage/config@1.2.0
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
- @backstage/plugin-auth-node@0.5.0-next.3
- @backstage/plugin-permission-common@0.8.1-next.1
## 0.8.0-next.2
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-plugin-api",
"version": "0.8.0-next.2",
"version": "0.8.0-next.3",
"description": "Core API used by Backstage backend plugins",
"backstage": {
"role": "node-library"
+11
View File
@@ -1,5 +1,16 @@
# @backstage/backend-tasks
## 0.5.28-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/backend-common@0.23.4-next.3
- @backstage/config@1.2.0
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
## 0.5.28-next.2
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
"version": "0.5.28-next.2",
"version": "0.5.28-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+14
View File
@@ -1,5 +1,19 @@
# @backstage/backend-test-utils
## 0.4.5-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/backend-defaults@0.4.2-next.3
- @backstage/backend-app-api@0.8.1-next.3
- @backstage/config@1.2.0
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
- @backstage/plugin-auth-node@0.5.0-next.3
- @backstage/plugin-events-node@0.3.9-next.3
## 0.4.5-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
"version": "0.4.5-next.2",
"version": "0.4.5-next.3",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
+37
View File
@@ -1,5 +1,42 @@
# example-backend
## 0.0.29-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder-backend-module-github@0.4.1-next.3
- @backstage/plugin-notifications-backend@0.3.4-next.3
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/plugin-techdocs-backend@1.10.10-next.3
- @backstage/backend-defaults@0.4.2-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/plugin-scaffolder-backend@1.23.1-next.3
- @backstage/backend-tasks@0.5.28-next.3
- @backstage/plugin-app-backend@0.3.72-next.3
- @backstage/plugin-auth-backend@0.22.10-next.3
- @backstage/plugin-auth-backend-module-github-provider@0.1.20-next.3
- @backstage/plugin-auth-backend-module-guest-provider@0.1.9-next.3
- @backstage/plugin-auth-node@0.5.0-next.3
- @backstage/plugin-catalog-backend@1.24.1-next.3
- @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.6-next.3
- @backstage/plugin-catalog-backend-module-openapi@0.1.41-next.3
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.21-next.3
- @backstage/plugin-catalog-backend-module-unprocessed@0.4.10-next.3
- @backstage/plugin-devtools-backend@0.3.9-next.3
- @backstage/plugin-kubernetes-backend@0.18.4-next.3
- @backstage/plugin-permission-backend@0.5.47-next.3
- @backstage/plugin-permission-backend-module-allow-all-policy@0.1.20-next.3
- @backstage/plugin-permission-common@0.8.1-next.1
- @backstage/plugin-permission-node@0.8.1-next.3
- @backstage/plugin-proxy-backend@0.5.4-next.3
- @backstage/plugin-search-backend@1.5.15-next.3
- @backstage/plugin-search-backend-module-catalog@0.1.29-next.3
- @backstage/plugin-search-backend-module-explore@0.1.29-next.3
- @backstage/plugin-search-backend-module-techdocs@0.1.28-next.3
- @backstage/plugin-search-backend-node@1.2.28-next.3
- @backstage/plugin-signals-backend@0.1.9-next.3
## 0.0.29-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.0.29-next.2",
"version": "0.0.29-next.3",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
+8
View File
@@ -1,5 +1,13 @@
# @backstage/catalog-client
## 1.6.6-next.0
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.6.0-next.0
- @backstage/errors@1.2.4
## 1.6.5
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-client",
"version": "1.6.5",
"version": "1.6.6-next.0",
"description": "An isomorphic client for the catalog backend",
"backstage": {
"role": "common-library"
+12
View File
@@ -1,5 +1,17 @@
# @backstage/catalog-model
## 1.6.0-next.0
### Minor Changes
- 34fa803: Introduce an optional spec.type attribute on the Domain and System entity kinds
### Patch Changes
- Updated dependencies
- @backstage/errors@1.2.4
- @backstage/types@1.1.1
## 1.5.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-model",
"version": "1.5.0",
"version": "1.6.0-next.0",
"description": "Types and validators that help describe the model of a Backstage Catalog",
"backstage": {
"role": "common-library"
-1
View File
@@ -154,7 +154,6 @@ export type PackageRole =
| 'node-library'
| 'common-library'
| 'frontend-plugin'
| 'frontend-extensions'
| 'frontend-plugin-module'
| 'backend-plugin'
| 'backend-plugin-module';
@@ -53,11 +53,6 @@ const packageRoleInfos: PackageRoleInfo[] = [
platform: 'web',
output: ['types', 'esm'],
},
{
role: 'frontend-extensions',
platform: 'web',
output: ['types', 'esm'],
},
{
role: 'frontend-plugin-module',
platform: 'web',
-1
View File
@@ -27,7 +27,6 @@ export type PackageRole =
| 'node-library'
| 'common-library'
| 'frontend-plugin'
| 'frontend-extensions'
| 'frontend-plugin-module'
| 'backend-plugin'
| 'backend-plugin-module';
+18
View File
@@ -1,5 +1,23 @@
# @backstage/cli
## 0.27.0-next.4
### Patch Changes
- 6d898d8: Switched the `process` polyfill to use `require.resolve` for greater compatability.
- 2ced236: Updated dependency `@module-federation/enhanced` to `0.3.1`
- Updated dependencies
- @backstage/catalog-model@1.6.0-next.0
- @backstage/cli-common@0.1.14
- @backstage/cli-node@0.2.7
- @backstage/config@1.2.0
- @backstage/config-loader@1.9.0-next.2
- @backstage/errors@1.2.4
- @backstage/eslint-plugin@0.1.8
- @backstage/integration@1.14.0-next.0
- @backstage/release-manifests@0.0.11
- @backstage/types@1.1.1
## 0.27.0-next.3
### Patch Changes
-1
View File
@@ -200,7 +200,6 @@ function createConfigForRole(dir, role, extraConfig = {}) {
case 'web-library':
case 'frontend':
case 'frontend-plugin':
case 'frontend-extensions':
case 'frontend-plugin-module':
case 'frontend-dynamic-container':
return createConfig(dir, {
-1
View File
@@ -54,7 +54,6 @@ function getRoleConfig(role) {
case 'web-library':
case 'common-library':
case 'frontend-plugin':
case 'frontend-extensions':
case 'frontend-plugin-module':
return { testEnvironment: require.resolve('jest-environment-jsdom') };
case 'cli':
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli",
"version": "0.27.0-next.3",
"version": "0.27.0-next.4",
"description": "CLI for developing Backstage plugins and apps",
"backstage": {
"role": "cli"
@@ -53,7 +53,7 @@
"@backstage/release-manifests": "workspace:^",
"@backstage/types": "workspace:^",
"@manypkg/get-packages": "^1.1.3",
"@module-federation/enhanced": "^0.1.19",
"@module-federation/enhanced": "^0.3.5",
"@octokit/graphql": "^5.0.0",
"@octokit/graphql-schema": "^13.7.0",
"@octokit/oauth-app": "^4.2.0",
-3
View File
@@ -246,8 +246,6 @@ function guessPluginId(role: PackageRole, pkgName: string): string | undefined {
case 'frontend':
case 'frontend-plugin':
return pkgName.match(/plugin-(.*)/)?.[1];
case 'frontend-extensions':
return undefined;
case 'frontend-plugin-module':
return pkgName.match(/plugin-(.*)-module-/)?.[1];
case 'backend-plugin':
@@ -366,7 +364,6 @@ export function fixPluginPackages(
role === 'common-library' ||
role === 'web-library' ||
role === 'node-library' ||
role === 'frontend-extensions' ||
role === 'frontend-plugin-module' // TODO(Rugvip): Remove this once frontend modules are required to have a plugin ID
) {
return;
@@ -46,7 +46,6 @@ export async function command(opts: OptionValues): Promise<void> {
});
case 'web-library':
case 'frontend-plugin':
case 'frontend-extensions':
case 'frontend-plugin-module':
return startFrontend({ entry: 'dev/index', ...options });
case 'frontend-dynamic-container' as PackageRole: // experimental
@@ -84,11 +84,9 @@ async function detectPackages(
{ paths: [targetPath] },
));
if (
[
'frontend-plugin',
'frontend-extensions',
'frontend-plugin-module',
].includes(depPackageJson.backstage?.role ?? '')
['frontend-plugin', 'frontend-plugin-module'].includes(
depPackageJson.backstage?.role ?? '',
)
) {
// Include alpha entry point if available. If there's no default export it will be ignored
const exp = depPackageJson.exports;
+9
View File
@@ -1,5 +1,14 @@
# @backstage/core-compat-api
## 0.2.8-next.3
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.7.0-next.3
- @backstage/core-plugin-api@1.9.3
- @backstage/version-bridge@1.0.8
## 0.2.8-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-compat-api",
"version": "0.2.8-next.2",
"version": "0.2.8-next.3",
"backstage": {
"role": "web-library"
},
+8
View File
@@ -1,5 +1,13 @@
# @backstage/create-app
## 0.5.18-next.4
### Patch Changes
- bfeba46: Included permission config and enabled it out of the box
- Updated dependencies
- @backstage/cli-common@0.1.14
## 0.5.18-next.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
"version": "0.5.18-next.3",
"version": "0.5.18-next.4",
"publishConfig": {
"access": "public"
},
+14
View File
@@ -1,5 +1,19 @@
# @backstage/dev-utils
## 1.0.37-next.3
### Patch Changes
- Updated dependencies
- @backstage/catalog-model@1.6.0-next.0
- @backstage/plugin-catalog-react@1.12.3-next.3
- @backstage/app-defaults@1.5.10-next.2
- @backstage/core-app-api@1.14.2-next.0
- @backstage/core-components@0.14.10-next.0
- @backstage/core-plugin-api@1.9.3
- @backstage/integration-react@1.1.30-next.0
- @backstage/theme@0.5.6
## 1.0.37-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/dev-utils",
"version": "1.0.37-next.2",
"version": "1.0.37-next.3",
"description": "Utilities for developing Backstage plugins.",
"backstage": {
"role": "web-library"
+9
View File
@@ -1,5 +1,14 @@
# e2e-test
## 0.2.19-next.4
### Patch Changes
- Updated dependencies
- @backstage/create-app@0.5.18-next.4
- @backstage/cli-common@0.1.14
- @backstage/errors@1.2.4
## 0.2.19-next.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "e2e-test",
"description": "E2E test for verifying Backstage packages",
"version": "0.2.19-next.3",
"version": "0.2.19-next.4",
"private": true,
"backstage": {
"role": "cli"
@@ -48,7 +48,6 @@ function getExpectedDepType(
case 'common-library':
case 'web-library':
case 'frontend-plugin':
case 'frontend-extensions':
case 'frontend-plugin-module':
case 'node-library':
case 'backend-plugin':
+15
View File
@@ -1,5 +1,20 @@
# @backstage/frontend-app-api
## 0.7.5-next.3
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.7.0-next.3
- @backstage/config@1.2.0
- @backstage/core-app-api@1.14.2-next.0
- @backstage/core-components@0.14.10-next.0
- @backstage/core-plugin-api@1.9.3
- @backstage/errors@1.2.4
- @backstage/theme@0.5.6
- @backstage/types@1.1.1
- @backstage/version-bridge@1.0.8
## 0.7.5-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-app-api",
"version": "0.7.5-next.2",
"version": "0.7.5-next.3",
"backstage": {
"role": "web-library"
},
+60
View File
@@ -1,5 +1,65 @@
# @backstage/frontend-plugin-api
## 0.7.0-next.3
### Patch Changes
- 6f72c2b: Fixing issue with extension blueprints `inputs` merging.
- 99abb6b: Support overriding of plugin extensions using the new `plugin.withOverrides` method.
```tsx
import homePlugin from '@backstage/plugin-home';
export default homePlugin.withOverrides({
extensions: [
homePage.getExtension('page:home').override({
*factory(originalFactory) {
yield* originalFactory();
yield coreExtensionData.reactElement(<h1>My custom home page</h1>);
},
}),
],
});
```
- a65cfc8: Add support for accessing extensions definitions provided by a plugin via `plugin.getExtension(...)`. For this to work the extensions must be defined using the v2 format, typically using an extension blueprint.
- 34f1b2a: Support merging of `inputs` in extension blueprints, but stop merging `output`. In addition, the original factory in extension blueprints now returns a data container that both provides access to the returned data, but can also be forwarded as output.
- 2d21599: Added support for being able to override extension definitions.
```tsx
const TestCard = EntityCardBlueprint.make({
...
});
TestCard.override({
// override attachment points
attachTo: { id: 'something-else', input: 'overridden' },
// extend the config schema
config: {
schema: {
newConfig: z => z.string().optional(),
}
},
// override factory
*factory(originalFactory, { inputs, config }){
const originalOutput = originalFactory();
yield coreExentsionData.reactElement(
<Wrapping>
{originalOutput.get(coreExentsionData.reactElement)}
</Wrapping>
);
}
});
```
- Updated dependencies
- @backstage/core-components@0.14.10-next.0
- @backstage/core-plugin-api@1.9.3
- @backstage/types@1.1.1
- @backstage/version-bridge@1.0.8
## 0.7.0-next.2
### Minor Changes
@@ -356,6 +356,10 @@ export interface BackstagePlugin<
readonly id: string;
// (undocumented)
readonly routes: TRoutes;
// (undocumented)
withOverrides(options: {
extensions: Array<ExtensionDefinition<any, any>>;
}): BackstagePlugin<TRoutes, TExternalRoutes, TExtensionMap>;
}
export { BackstageUserIdentity };
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-plugin-api",
"version": "0.7.0-next.2",
"version": "0.7.0-next.3",
"backstage": {
"role": "web-library"
},
@@ -767,35 +767,37 @@ describe('createExtension', () => {
opt: inputs.opt?.get(testDataRef1) ?? 'none',
single: inputs.single.get(testDataRef1),
singleOpt: inputs.single.get(testDataRef2) ?? 'none',
multi: inputs.multi.map(i => i.get(testDataRef1)).join(','),
multi: inputs.multi
.map(i => `${i.node.spec.id}=${i.get(testDataRef1)}`)
.join(','),
}),
];
},
});
const optExt = createExtension({
name: 'opt',
name: 'o',
attachTo: { id: 'subject', input: 'opt' },
output: [testDataRef1],
factory: () => [testDataRef1('orig-opt')],
});
const singleExt = createExtension({
name: 'single',
name: 's',
attachTo: { id: 'subject', input: 'single' },
output: [testDataRef1, testDataRef2.optional()],
factory: () => [testDataRef1('orig-single')],
});
const multi1Ext = createExtension({
name: 'multi1',
name: 'm1',
attachTo: { id: 'subject', input: 'multi' },
output: [testDataRef1],
factory: () => [testDataRef1('orig-multi1')],
});
const multi2Ext = createExtension({
name: 'multi2',
name: 'm2',
attachTo: { id: 'subject', input: 'multi' },
output: [testDataRef1],
factory: () => [testDataRef1('orig-multi2')],
@@ -812,7 +814,7 @@ describe('createExtension', () => {
opt: 'orig-opt',
single: 'orig-single',
singleOpt: 'none',
multi: 'orig-multi1,orig-multi2',
multi: 'm1=orig-multi1,m2=orig-multi2',
});
// All values provided
@@ -839,7 +841,7 @@ describe('createExtension', () => {
opt: 'opt',
single: 'single',
singleOpt: 'singleOpt',
multi: 'multi1,multi2',
multi: 'm1=multi1,m2=multi2',
});
// Minimal values provided
@@ -888,7 +890,7 @@ describe('createExtension', () => {
opt: 'orig-opt',
single: 'orig-single',
singleOpt: 'none',
multi: 'orig-multi1,orig-multi2',
multi: 'm1=orig-multi1,m2=orig-multi2',
});
// Forward inputs separately
@@ -915,7 +917,61 @@ describe('createExtension', () => {
opt: 'orig-opt',
single: 'orig-single',
singleOpt: 'none',
multi: 'orig-multi1,orig-multi2',
multi: 'm1=orig-multi1,m2=orig-multi2',
});
// Reordering inputs
expect(
createExtensionTester(
subject.override({
factory(originalFactory, { inputs }) {
return originalFactory({
inputs: {
opt: inputs.opt,
single: inputs.single,
multi: [inputs.multi[1], inputs.multi[0]],
},
});
},
}),
)
.add(optExt)
.add(singleExt)
.add(multi1Ext)
.add(multi2Ext)
.data(outputRef),
).toEqual({
opt: 'orig-opt',
single: 'orig-single',
singleOpt: 'none',
multi: 'm2=orig-multi2,m1=orig-multi1',
});
// Filter out inputs
expect(
createExtensionTester(
subject.override({
factory(originalFactory, { inputs }) {
return originalFactory({
inputs: {
opt: inputs.opt,
single: inputs.single,
multi: inputs.multi.filter(i => i.node.spec.id.endsWith('2')),
},
});
},
}),
)
.add(optExt)
.add(singleExt)
.add(multi1Ext)
.add(multi2Ext)
.data(outputRef),
).toEqual({
opt: 'orig-opt',
single: 'orig-single',
singleOpt: 'none',
multi: 'm2=orig-multi2',
});
// Overriding based on original input
@@ -946,7 +1002,7 @@ describe('createExtension', () => {
opt: 'none',
single: 'override-orig-single',
singleOpt: 'new-singleOpt',
multi: 'override-orig-multi1,override-orig-multi2',
multi: 'm1=override-orig-multi1,m2=override-orig-multi2',
});
// Mismatched input override length
@@ -972,6 +1028,29 @@ describe('createExtension', () => {
`"Failed to instantiate extension 'subject', override data provided for input 'multi' must match the length of the original inputs"`,
);
// Mix forward and data override
expect(() =>
createExtensionTester(
subject.override({
factory(originalFactory, { inputs }) {
return originalFactory({
inputs: {
...inputs,
multi: [inputs.multi[0], [testDataRef1('multi2')]],
},
});
},
}),
)
.add(optExt)
.add(singleExt)
.add(multi1Ext)
.add(multi2Ext)
.data(outputRef),
).toThrowErrorMatchingInlineSnapshot(
`"Failed to instantiate extension 'subject', override data for input 'multi' may not mix forwarded inputs with data overrides"`,
);
// Required input not provided
expect(() =>
createExtensionTester(
@@ -148,7 +148,28 @@ describe('createPlugin', () => {
});
expect(plugin).toBeDefined();
expect(plugin.getExtension('test/1')).toBe(Extension1);
expect(plugin.getExtension('test/1')).toMatchInlineSnapshot(`
{
"$$type": "@backstage/ExtensionDefinition",
"attachTo": {
"id": "test/output",
"input": "names",
},
"configSchema": undefined,
"disabled": false,
"factory": [Function],
"inputs": {},
"kind": undefined,
"name": "1",
"namespace": "test",
"output": [
[Function],
],
"override": [Function],
"toString": [Function],
"version": "v2",
}
`);
// @ts-expect-error
expect(plugin.getExtension('nonexistent')).toBeUndefined();
@@ -250,4 +271,68 @@ describe('createPlugin', () => {
}),
).toThrow("Plugin 'test' provided duplicate extensions: test/2, test/3");
});
describe('overrides', () => {
it('should return a plugin instance with the correct namespace', () => {
const plugin = createPlugin({
id: 'test',
extensions: [Extension1, Extension2],
});
expect(plugin.getExtension('test/1')).toMatchInlineSnapshot(`
{
"$$type": "@backstage/ExtensionDefinition",
"attachTo": {
"id": "test/output",
"input": "names",
},
"configSchema": undefined,
"disabled": false,
"factory": [Function],
"inputs": {},
"kind": undefined,
"name": "1",
"namespace": "test",
"output": [
[Function],
],
"override": [Function],
"toString": [Function],
"version": "v2",
}
`);
});
it('should allow overriding extensions that have a matching ID, while keeping old extensions that do not have overlapping IDs', async () => {
const plugin = createPlugin({
id: 'test',
extensions: [Extension1, Extension2, outputExtension],
});
await renderWithEffects(
createTestAppRoot({
features: [
plugin.withOverrides({
extensions: [
plugin.getExtension('test/1').override({
factory() {
return [nameExtensionDataRef('overridden')];
},
}),
],
}),
],
config: {
app: {
extensions: [{ 'app/root': false }],
},
},
}),
);
await expect(
screen.findByText('Names: extension-2, overridden'),
).resolves.toBeInTheDocument();
});
});
});
@@ -78,7 +78,7 @@ export function createPlugin<
for (const def of options.extensions ?? []) {
const ext = resolveExtensionDefinition(def, { namespace: options.id });
extensions.push(ext);
extensionDefinitionsById.set(ext.id, def);
extensionDefinitionsById.set(ext.id, { ...def, namespace: options.id });
}
if (extensions.length !== extensionDefinitionsById.size) {
@@ -110,6 +110,23 @@ export function createPlugin<
toString() {
return `Plugin{id=${options.id}}`;
},
withOverrides(overrides) {
const overriddenExtensionIds = new Set(
overrides.extensions.map(
e => resolveExtensionDefinition(e, { namespace: options.id }).id,
),
);
const nonOverriddenExtensions = (options.extensions ?? []).filter(
e =>
!overriddenExtensionIds.has(
resolveExtensionDefinition(e, { namespace: options.id }).id,
),
);
return createPlugin({
...options,
extensions: [...nonOverriddenExtensions, ...overrides.extensions],
});
},
} as InternalBackstagePlugin<TRoutes, TExternalRoutes>;
}
@@ -129,7 +129,7 @@ export function resolveInputOverrides(
);
}
newInputs[name] = Object.assign(providedContainer, {
name: (originalInput as ResolvedExtensionInput<any>).node,
node: (originalInput as ResolvedExtensionInput<any>).node,
}) as any;
}
} else {
@@ -139,23 +139,40 @@ export function resolveInputOverrides(
`override data provided for input '${name}' must be an array`,
);
}
if (
originalInput.length !== providedData.length &&
providedData.length > 0
) {
throw new Error(
`override data provided for input '${name}' must match the length of the original inputs`,
);
// Regular inputs can be overridden in two different ways:
// 1) Forward a subset of the original inputs in a new order
// 2) Provide new data for each original input
// First check if all inputs are being removed
if (providedData.length === 0) {
newInputs[name] = [];
} else {
// Check how many of the provided data items have a node property, i.e. is a forwarded input
const withNodesCount = providedData.filter(d => 'node' in d).length;
if (withNodesCount === 0) {
if (originalInput.length !== providedData.length) {
throw new Error(
`override data provided for input '${name}' must match the length of the original inputs`,
);
}
newInputs[name] = providedData.map((data, i) => {
const providedContainer = createExtensionDataContainer(
data as Iterable<ExtensionDataValue<any, any>>,
declaredInput.extensionData,
);
return Object.assign(providedContainer, {
node: (originalInput[i] as ResolvedExtensionInput<any>).node,
}) as any;
});
} else if (withNodesCount === providedData.length) {
newInputs[name] = providedData as any;
} else {
throw new Error(
`override data for input '${name}' may not mix forwarded inputs with data overrides`,
);
}
}
newInputs[name] = providedData.map((data, i) => {
const providedContainer = createExtensionDataContainer(
data as Iterable<ExtensionDataValue<any, any>>,
declaredInput.extensionData,
);
return Object.assign(providedContainer, {
name: (originalInput[i] as ResolvedExtensionInput<any>).node,
}) as any;
});
}
}
return newInputs;
@@ -51,6 +51,9 @@ export interface BackstagePlugin<
readonly routes: TRoutes;
readonly externalRoutes: TExternalRoutes;
getExtension<TId extends keyof TExtensionMap>(id: TId): TExtensionMap[TId];
withOverrides(options: {
extensions: Array<ExtensionDefinition<any, any>>;
}): BackstagePlugin<TRoutes, TExternalRoutes, TExtensionMap>;
}
/** @public */
+48
View File
@@ -1,5 +1,53 @@
# @backstage/frontend-test-utils
## 0.1.12-next.3
### Patch Changes
- 2d21599: Added support for being able to override extension definitions.
```tsx
const TestCard = EntityCardBlueprint.make({
...
});
TestCard.override({
// override attachment points
attachTo: { id: 'something-else', input: 'overridden' },
// extend the config schema
config: {
schema: {
newConfig: z => z.string().optional(),
}
},
// override factory
*factory(originalFactory, { inputs, config }){
const originalOutput = originalFactory();
yield coreExentsionData.reactElement(
<Wrapping>
{originalOutput.get(coreExentsionData.reactElement)}
</Wrapping>
);
}
});
```
- 264e10f: Deprecate existing `ExtensionCreators` in favour of their new Blueprint counterparts.
- 264e10f: Refactor `.make` method on Blueprints into two different methods, `.make` and `.makeWithOverrides`.
When using `createExtensionBlueprint` you can define parameters for the factory function, if you wish to take advantage of these parameters you should use `.make` when creating an extension instance of a Blueprint. If you wish to override more things other than the standard `attachTo`, `name`, `namespace` then you should use `.makeWithOverrides` instead.
`.make` is reserved for simple creation of extension instances from Blueprints using higher level parameters, whereas `.makeWithOverrides` is lower level and you have more control over the final extension.
- Updated dependencies
- @backstage/frontend-plugin-api@0.7.0-next.3
- @backstage/frontend-app-api@0.7.5-next.3
- @backstage/config@1.2.0
- @backstage/test-utils@1.5.10-next.2
- @backstage/types@1.1.1
## 0.1.12-next.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-test-utils",
"version": "0.1.12-next.2",
"version": "0.1.12-next.3",
"backstage": {
"role": "web-library"
},
+12
View File
@@ -1,5 +1,17 @@
# @backstage/repo-tools
## 0.9.5-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-plugin-api@0.8.0-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/cli-common@0.1.14
- @backstage/cli-node@0.2.7
- @backstage/config-loader@1.9.0-next.2
- @backstage/errors@1.2.4
## 0.9.5-next.2
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/repo-tools",
"description": "CLI for Backstage repo tooling ",
"version": "0.9.5-next.2",
"version": "0.9.5-next.3",
"publishConfig": {
"access": "public"
},
@@ -1,5 +1,24 @@
# techdocs-cli-embedded-app
## 0.2.99-next.4
### Patch Changes
- Updated dependencies
- @backstage/cli@0.27.0-next.4
- @backstage/plugin-techdocs@1.10.8-next.3
- @backstage/plugin-catalog@1.22.0-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/app-defaults@1.5.10-next.2
- @backstage/config@1.2.0
- @backstage/core-app-api@1.14.2-next.0
- @backstage/core-components@0.14.10-next.0
- @backstage/core-plugin-api@1.9.3
- @backstage/integration-react@1.1.30-next.0
- @backstage/test-utils@1.5.10-next.2
- @backstage/theme@0.5.6
- @backstage/plugin-techdocs-react@1.2.7-next.1
## 0.2.99-next.3
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "techdocs-cli-embedded-app",
"version": "0.2.99-next.3",
"version": "0.2.99-next.4",
"private": true,
"backstage": {
"role": "frontend"
+11
View File
@@ -1,5 +1,16 @@
# @techdocs/cli
## 1.8.17-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.4.2-next.3
- @backstage/plugin-techdocs-node@1.12.9-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/cli-common@0.1.14
- @backstage/config@1.2.0
## 1.8.17-next.2
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@techdocs/cli",
"description": "Utility CLI for managing TechDocs sites in Backstage.",
"version": "1.8.17-next.2",
"version": "1.8.17-next.3",
"publishConfig": {
"access": "public"
},
+16
View File
@@ -1,5 +1,21 @@
# @backstage/plugin-api-docs
## 0.11.8-next.3
### Patch Changes
- 6582799: Add `tableOptions` to all tables and additionally `title` to API tables.
- Updated dependencies
- @backstage/frontend-plugin-api@0.7.0-next.3
- @backstage/plugin-catalog@1.22.0-next.3
- @backstage/catalog-model@1.6.0-next.0
- @backstage/core-compat-api@0.2.8-next.3
- @backstage/plugin-catalog-react@1.12.3-next.3
- @backstage/core-components@0.14.10-next.0
- @backstage/core-plugin-api@1.9.3
- @backstage/plugin-catalog-common@1.0.26-next.2
- @backstage/plugin-permission-react@0.4.25-next.1
## 0.11.8-next.2
### Patch Changes
+13
View File
@@ -16,6 +16,7 @@ import { JSX as JSX_2 } from 'react';
import { default as React_2 } from 'react';
import { RouteRef } from '@backstage/core-plugin-api';
import { TableColumn } from '@backstage/core-components';
import { TableOptions } from '@backstage/core-components';
import { TableProps } from '@backstage/core-components';
import { UserListFilterKind } from '@backstage/plugin-catalog-react';
@@ -88,7 +89,9 @@ export type AsyncApiDefinitionWidgetProps = {
// @public (undocumented)
export const ConsumedApisCard: (props: {
variant?: InfoCardVariants;
title?: string;
columns?: TableColumn<ApiEntity>[];
tableOptions?: TableOptions;
}) => React_2.JSX.Element;
// @public (undocumented)
@@ -118,7 +121,9 @@ export const EntityApiDefinitionCard: () => JSX_2.Element;
// @public (undocumented)
export const EntityConsumedApisCard: (props: {
variant?: InfoCardVariants | undefined;
title?: string | undefined;
columns?: TableColumn<ApiEntity>[] | undefined;
tableOptions?: TableOptions<{}> | undefined;
}) => JSX_2.Element;
// @public (undocumented)
@@ -129,13 +134,17 @@ export const EntityConsumingComponentsCard: (props: {
// @public (undocumented)
export const EntityHasApisCard: (props: {
variant?: InfoCardVariants | undefined;
title?: string | undefined;
columns?: TableColumn<ApiEntity>[] | undefined;
tableOptions?: TableOptions<{}> | undefined;
}) => JSX_2.Element;
// @public (undocumented)
export const EntityProvidedApisCard: (props: {
variant?: InfoCardVariants | undefined;
title?: string | undefined;
columns?: TableColumn<ApiEntity>[] | undefined;
tableOptions?: TableOptions<{}> | undefined;
}) => JSX_2.Element;
// @public (undocumented)
@@ -156,7 +165,9 @@ export type GraphQlDefinitionWidgetProps = {
// @public (undocumented)
export const HasApisCard: (props: {
variant?: InfoCardVariants;
title?: string;
columns?: TableColumn<ApiEntity>[];
tableOptions?: TableOptions;
}) => React_2.JSX.Element;
// @public (undocumented)
@@ -185,7 +196,9 @@ export type PlainApiDefinitionWidgetProps = {
// @public (undocumented)
export const ProvidedApisCard: (props: {
variant?: InfoCardVariants;
title?: string;
columns?: TableColumn<ApiEntity>[];
tableOptions?: TableOptions;
}) => React_2.JSX.Element;
// @public (undocumented)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-api-docs",
"version": "0.11.8-next.2",
"version": "0.11.8-next.3",
"description": "A Backstage plugin that helps represent API entities in the frontend",
"backstage": {
"role": "frontend-plugin",

Some files were not shown because too many files have changed in this diff Show More