diff --git a/.changeset/cold-tomatoes-vanish.md b/.changeset/cold-tomatoes-vanish.md deleted file mode 100644 index 1ffd701e9b..0000000000 --- a/.changeset/cold-tomatoes-vanish.md +++ /dev/null @@ -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. diff --git a/docs/tooling/cli/02-build-system.md b/docs/tooling/cli/02-build-system.md index ced3385b1e..1bcf7ad30c 100644 --- a/docs/tooling/cli/02-build-system.md +++ b/docs/tooling/cli/02-build-system.md @@ -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: diff --git a/packages/app-next-example-extensions/.eslintrc.js b/packages/app-next-example-extensions/.eslintrc.js deleted file mode 100644 index e2a53a6ad2..0000000000 --- a/packages/app-next-example-extensions/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/app-next-example-extensions/README.md b/packages/app-next-example-extensions/README.md deleted file mode 100644 index 0c875f419d..0000000000 --- a/packages/app-next-example-extensions/README.md +++ /dev/null @@ -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. diff --git a/packages/app-next-example-extensions/api-report.md b/packages/app-next-example-extensions/api-report.md deleted file mode 100644 index 987e61e067..0000000000 --- a/packages/app-next-example-extensions/api-report.md +++ /dev/null @@ -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) -``` diff --git a/packages/app-next-example-extensions/catalog-info.yaml b/packages/app-next-example-extensions/catalog-info.yaml deleted file mode 100644 index 32acdd0317..0000000000 --- a/packages/app-next-example-extensions/catalog-info.yaml +++ /dev/null @@ -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 diff --git a/packages/app-next-example-extensions/package.json b/packages/app-next-example-extensions/package.json deleted file mode 100644 index 23a29dc549..0000000000 --- a/packages/app-next-example-extensions/package.json +++ /dev/null @@ -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" - } -} diff --git a/packages/app-next-example-extensions/src/dummy.test.ts b/packages/app-next-example-extensions/src/dummy.test.ts deleted file mode 100644 index 0744a7f13d..0000000000 --- a/packages/app-next-example-extensions/src/dummy.test.ts +++ /dev/null @@ -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); - }); -}); diff --git a/packages/app-next-example-extensions/src/extensions/ScmAuthApi.ts b/packages/app-next-example-extensions/src/extensions/ScmAuthApi.ts deleted file mode 100644 index 5896ff960a..0000000000 --- a/packages/app-next-example-extensions/src/extensions/ScmAuthApi.ts +++ /dev/null @@ -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(), -}); diff --git a/packages/app-next-example-extensions/src/extensions/SignInPage.tsx b/packages/app-next-example-extensions/src/extensions/SignInPage.tsx deleted file mode 100644 index 06bbbd45fb..0000000000 --- a/packages/app-next-example-extensions/src/extensions/SignInPage.tsx +++ /dev/null @@ -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 => ( - - )), -}); diff --git a/packages/app-next-example-extensions/src/extensions/index.ts b/packages/app-next-example-extensions/src/extensions/index.ts deleted file mode 100644 index d1845405af..0000000000 --- a/packages/app-next-example-extensions/src/extensions/index.ts +++ /dev/null @@ -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'; diff --git a/packages/app-next-example-extensions/src/index.ts b/packages/app-next-example-extensions/src/index.ts deleted file mode 100644 index aa61e9181a..0000000000 --- a/packages/app-next-example-extensions/src/index.ts +++ /dev/null @@ -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), -}); diff --git a/packages/app-next-example-extensions/src/setupTests.ts b/packages/app-next-example-extensions/src/setupTests.ts deleted file mode 100644 index 91af6695ac..0000000000 --- a/packages/app-next-example-extensions/src/setupTests.ts +++ /dev/null @@ -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'; diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 2d0d4290e9..a12371a135 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -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", diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index 9ac0b6e335..b57c680474 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -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( } /> @@ -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 }) { diff --git a/packages/app-next-example-extensions/src/extensions/HomePage.tsx b/packages/app-next/src/HomePage.tsx similarity index 84% rename from packages/app-next-example-extensions/src/extensions/HomePage.tsx rename to packages/app-next/src/HomePage.tsx index 395c4e81dd..d6ee5cbb04 100644 --- a/packages/app-next-example-extensions/src/extensions/HomePage.tsx +++ b/packages/app-next/src/HomePage.tsx @@ -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 = ( ); - -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' }; - }, -}); diff --git a/packages/app-next-example-extensions/src/extensions/NotFoundErrorPage.tsx b/packages/app-next/src/examples/notFoundErrorPageExtension.tsx similarity index 94% rename from packages/app-next-example-extensions/src/extensions/NotFoundErrorPage.tsx rename to packages/app-next/src/examples/notFoundErrorPageExtension.tsx index e37b0966c6..f5108c6c15 100644 --- a/packages/app-next-example-extensions/src/extensions/NotFoundErrorPage.tsx +++ b/packages/app-next/src/examples/notFoundErrorPageExtension.tsx @@ -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 ( CustomNotFoundErrorPage }, }); diff --git a/packages/app-next/src/index-public-experimental.tsx b/packages/app-next/src/index-public-experimental.tsx index c2825203be..56bc698ffd 100644 --- a/packages/app-next/src/index-public-experimental.tsx +++ b/packages/app-next/src/index-public-experimental.tsx @@ -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], }), ], }); diff --git a/packages/app-next-example-extensions/src/extensions/ScmIntegrationApi.ts b/packages/app-next/src/overrides/SignInPage.tsx similarity index 63% rename from packages/app-next-example-extensions/src/extensions/ScmIntegrationApi.ts rename to packages/app-next/src/overrides/SignInPage.tsx index 022f1e599e..364a749293 100644 --- a/packages/app-next-example-extensions/src/extensions/ScmIntegrationApi.ts +++ b/packages/app-next/src/overrides/SignInPage.tsx @@ -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 => , +}); + +export const signInPageOverrides = createExtensionOverrides({ + extensions: [signInPage], }); diff --git a/packages/cli-node/api-report.md b/packages/cli-node/api-report.md index e6c081fd9b..9f7e525048 100644 --- a/packages/cli-node/api-report.md +++ b/packages/cli-node/api-report.md @@ -154,7 +154,6 @@ export type PackageRole = | 'node-library' | 'common-library' | 'frontend-plugin' - | 'frontend-extensions' | 'frontend-plugin-module' | 'backend-plugin' | 'backend-plugin-module'; diff --git a/packages/cli-node/src/roles/PackageRoles.ts b/packages/cli-node/src/roles/PackageRoles.ts index 0a7e6142cf..70b62e2479 100644 --- a/packages/cli-node/src/roles/PackageRoles.ts +++ b/packages/cli-node/src/roles/PackageRoles.ts @@ -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', diff --git a/packages/cli-node/src/roles/types.ts b/packages/cli-node/src/roles/types.ts index 1cd374f1e7..d6eff04541 100644 --- a/packages/cli-node/src/roles/types.ts +++ b/packages/cli-node/src/roles/types.ts @@ -27,7 +27,6 @@ export type PackageRole = | 'node-library' | 'common-library' | 'frontend-plugin' - | 'frontend-extensions' | 'frontend-plugin-module' | 'backend-plugin' | 'backend-plugin-module'; diff --git a/packages/cli/config/eslint-factory.js b/packages/cli/config/eslint-factory.js index 7a55ad464f..96d8478ec0 100644 --- a/packages/cli/config/eslint-factory.js +++ b/packages/cli/config/eslint-factory.js @@ -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, { diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index 8c97516667..bef7b76f96 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -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': diff --git a/packages/cli/src/commands/repo/fix.ts b/packages/cli/src/commands/repo/fix.ts index d670552bbc..a55440c53f 100644 --- a/packages/cli/src/commands/repo/fix.ts +++ b/packages/cli/src/commands/repo/fix.ts @@ -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; diff --git a/packages/cli/src/commands/start/command.ts b/packages/cli/src/commands/start/command.ts index 12631b75b5..aa46b717bb 100644 --- a/packages/cli/src/commands/start/command.ts +++ b/packages/cli/src/commands/start/command.ts @@ -46,7 +46,6 @@ export async function command(opts: OptionValues): Promise { }); 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 diff --git a/packages/cli/src/lib/bundler/packageDetection.ts b/packages/cli/src/lib/bundler/packageDetection.ts index fe362b196d..0c357fe79e 100644 --- a/packages/cli/src/lib/bundler/packageDetection.ts +++ b/packages/cli/src/lib/bundler/packageDetection.ts @@ -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; diff --git a/packages/eslint-plugin/rules/no-undeclared-imports.js b/packages/eslint-plugin/rules/no-undeclared-imports.js index 76331939df..d2c92ccb8a 100644 --- a/packages/eslint-plugin/rules/no-undeclared-imports.js +++ b/packages/eslint-plugin/rules/no-undeclared-imports.js @@ -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': diff --git a/scripts/list-no-top-level-material-ui-4-imports.js b/scripts/list-no-top-level-material-ui-4-imports.js index fc2fc6c92e..a963b0c0b2 100644 --- a/scripts/list-no-top-level-material-ui-4-imports.js +++ b/scripts/list-no-top-level-material-ui-4-imports.js @@ -25,11 +25,7 @@ async function main() { for (const pkg of packages) { pkgRole = pkg.packageJson.backstage?.role; - if ( - pkgRole === 'frontend-plugin' || - pkgRole === 'web-library' || - pkgRole === 'frontend-extensions' - ) { + if (pkgRole === 'frontend-plugin' || pkgRole === 'web-library') { const depKeys = Object.keys(pkg.packageJson.dependencies); if (depKeys.findIndex(d => d.includes('@material-ui')) !== -1) { const eslintrcPath = join(pkg.dir, '.eslintrc.js'); diff --git a/scripts/verify-local-dependencies.js b/scripts/verify-local-dependencies.js index 2d38e8dc07..963bc40c9c 100755 --- a/scripts/verify-local-dependencies.js +++ b/scripts/verify-local-dependencies.js @@ -41,12 +41,7 @@ const roleRules = [ }, { sourceRole: ['backend-plugin', 'node-library', 'backend-plugin-module'], - targetRole: [ - 'frontend-plugin', - 'web-library', - 'frontend-plugin-module', - 'frontend-extensions', - ], + targetRole: ['frontend-plugin', 'web-library'], message: `Package SOURCE_NAME with backend role SOURCE_ROLE has a dependency on package TARGET_NAME with frontend role TARGET_ROLE, which is not permitted`, }, { @@ -54,8 +49,6 @@ const roleRules = [ targetRole: [ 'frontend-plugin', 'web-library', - 'frontend-plugin-module', - 'frontend-extensions', 'backend-plugin', 'node-library', 'backend-plugin-module', @@ -64,11 +57,7 @@ const roleRules = [ }, { sourceRole: ['frontend-plugin', 'web-library'], - targetRole: [ - 'frontend-plugin', - 'frontend-plugin-module', - 'frontend-extensions', - ], + targetRole: 'frontend-plugin', except: [ // TODO(freben): Address these '@backstage/plugin-api-docs', diff --git a/yarn.lock b/yarn.lock index 642d989841..1fc4a0e56a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10222,34 +10222,6 @@ __metadata: languageName: node linkType: hard -"@internal/app-next-example-extensions@workspace:^, @internal/app-next-example-extensions@workspace:packages/app-next-example-extensions": - version: 0.0.0-use.local - resolution: "@internal/app-next-example-extensions@workspace:packages/app-next-example-extensions" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-app-api": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/dev-utils": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@backstage/integration-react": "workspace:^" - "@backstage/plugin-home": "workspace:^" - "@backstage/test-utils": "workspace:^" - "@backstage/theme": "workspace:^" - "@material-ui/core": ^4.9.13 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": ^4.0.0-alpha.61 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^15.0.0 - "@testing-library/user-event": ^14.0.0 - msw: ^1.0.0 - react-use: ^17.2.4 - 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 - languageName: unknown - linkType: soft - "@internal/plugin-todo-list-backend@workspace:plugins/example-todo-list-backend": version: 0.0.0-use.local resolution: "@internal/plugin-todo-list-backend@workspace:plugins/example-todo-list-backend" @@ -26970,7 +26942,6 @@ __metadata: "@backstage/plugin-user-settings": "workspace:^" "@backstage/test-utils": "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