From 25418372e03b14d8e6d3e85eb118c5f8a43fdaba Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 18 Mar 2026 17:25:01 +0100 Subject: [PATCH 1/8] create-app: rename template directories Rename `next-app` to `default-app` and `default-app` to `legacy-app` to better reflect their roles. Signed-off-by: Patrik Oldsberg Made-with: Cursor Signed-off-by: Patrik Oldsberg Made-with: Cursor Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .changeset/rename-create-app-templates.md | 5 + .gitignore | 2 +- packages/create-app/src/createApp.test.ts | 6 +- packages/create-app/src/createApp.ts | 4 +- packages/create-app/src/lib/tasks.test.ts | 2 +- .../templates/default-app/app-config.yaml.hbs | 15 +++ .../templates/default-app/package.json | 1 + .../templates/default-app/package.json.hbs | 15 +-- .../packages/app/e2e-tests/app.test.ts | 4 +- .../default-app/packages/app/package.json.hbs | 48 ++++---- .../default-app/packages/app/src/App.test.tsx | 2 +- .../default-app/packages/app/src/App.tsx | 115 +----------------- .../default-app/packages/app/src/index.tsx | 2 +- .../packages/app/src/modules/nav/LogoFull.tsx | 0 .../packages/app/src/modules/nav/LogoIcon.tsx | 0 .../packages/app/src/modules/nav/Sidebar.tsx | 0 .../app/src/modules/nav/SidebarLogo.tsx | 0 .../packages/app/src/modules/nav/index.ts | 0 .../templates/default-app/yarn.lock | 13 +- .../{next-app => legacy-app}/.dockerignore | 0 .../{next-app => legacy-app}/.eslintignore | 0 .../{next-app => legacy-app}/.eslintrc.js.hbs | 0 .../{next-app => legacy-app}/.gitignore.hbs | 0 .../{next-app => legacy-app}/.prettierignore | 0 .../.yarn/releases/yarn-4.4.1.cjs | 0 .../{next-app => legacy-app}/.yarnrc.yml.hbs | 0 .../{next-app => legacy-app}/README.md | 0 .../app-config.local.yaml | 0 .../app-config.production.yaml | 0 .../app-config.yaml.hbs | 9 -- .../backstage.json.hbs | 0 .../catalog-info.yaml.hbs | 0 .../examples/entities.yaml | 0 .../examples/org.yaml | 0 .../template/content/catalog-info.yaml | 0 .../examples/template/content/index.js | 0 .../examples/template/content/package.json | 0 .../examples/template/template.yaml | 0 .../templates/legacy-app/package.json | 1 + .../{next-app => legacy-app}/package.json.hbs | 15 ++- .../packages/README.md | 0 .../packages/app/.eslintignore | 0 .../packages/app/.eslintrc.js.hbs | 0 .../packages/app/e2e-tests/app.test.ts | 8 +- .../legacy-app/packages/app/package.json.hbs | 76 ++++++++++++ .../app/public/android-chrome-192x192.png | Bin .../packages/app/public/apple-touch-icon.png | Bin .../packages/app/public/favicon-16x16.png | Bin .../packages/app/public/favicon-32x32.png | Bin .../packages/app/public/favicon.ico | Bin .../packages/app/public/index.html | 0 .../packages/app/public/manifest.json | 0 .../packages/app/public/robots.txt | 0 .../packages/app/public/safari-pinned-tab.svg | 0 .../packages/app/src/App.test.tsx | 2 +- .../legacy-app/packages/app/src/App.tsx | 112 +++++++++++++++++ .../packages/app/src/apis.ts | 0 .../app/src/components/Root/LogoFull.tsx | 0 .../app/src/components/Root/LogoIcon.tsx | 0 .../packages/app/src/components/Root/Root.tsx | 0 .../packages/app/src/components/Root/index.ts | 0 .../app/src/components/catalog/EntityPage.tsx | 0 .../app/src/components/search/SearchPage.tsx | 0 .../packages/app/src/index.tsx | 2 +- .../packages/app/src/setupTests.ts | 0 .../packages/backend/.eslintrc.js.hbs | 0 .../packages/backend/Dockerfile | 0 .../packages/backend/README.md | 0 .../packages/backend/package.json.hbs | 0 .../packages/backend/src/index.ts | 0 .../playwright.config.ts | 0 .../plugins/README.md | 0 .../{next-app => legacy-app}/tsconfig.json | 0 .../{next-app => legacy-app}/yarn.lock | 0 .../next-app/packages/app/package.json.hbs | 72 ----------- .../next-app/packages/app/src/App.tsx | 7 -- packages/e2e-test/src/commands/runCommand.ts | 6 +- 77 files changed, 282 insertions(+), 262 deletions(-) create mode 100644 .changeset/rename-create-app-templates.md create mode 100644 packages/create-app/templates/default-app/package.json rename packages/create-app/templates/{next-app => default-app}/packages/app/src/modules/nav/LogoFull.tsx (100%) rename packages/create-app/templates/{next-app => default-app}/packages/app/src/modules/nav/LogoIcon.tsx (100%) rename packages/create-app/templates/{next-app => default-app}/packages/app/src/modules/nav/Sidebar.tsx (100%) rename packages/create-app/templates/{next-app => default-app}/packages/app/src/modules/nav/SidebarLogo.tsx (100%) rename packages/create-app/templates/{next-app => default-app}/packages/app/src/modules/nav/index.ts (100%) rename packages/create-app/templates/{next-app => legacy-app}/.dockerignore (100%) rename packages/create-app/templates/{next-app => legacy-app}/.eslintignore (100%) rename packages/create-app/templates/{next-app => legacy-app}/.eslintrc.js.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/.gitignore.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/.prettierignore (100%) rename packages/create-app/templates/{next-app => legacy-app}/.yarn/releases/yarn-4.4.1.cjs (100%) rename packages/create-app/templates/{next-app => legacy-app}/.yarnrc.yml.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/README.md (100%) rename packages/create-app/templates/{default-app => legacy-app}/app-config.local.yaml (100%) rename packages/create-app/templates/{next-app => legacy-app}/app-config.production.yaml (100%) rename packages/create-app/templates/{next-app => legacy-app}/app-config.yaml.hbs (95%) rename packages/create-app/templates/{next-app => legacy-app}/backstage.json.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/catalog-info.yaml.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/examples/entities.yaml (100%) rename packages/create-app/templates/{next-app => legacy-app}/examples/org.yaml (100%) rename packages/create-app/templates/{next-app => legacy-app}/examples/template/content/catalog-info.yaml (100%) rename packages/create-app/templates/{next-app => legacy-app}/examples/template/content/index.js (100%) rename packages/create-app/templates/{next-app => legacy-app}/examples/template/content/package.json (100%) rename packages/create-app/templates/{next-app => legacy-app}/examples/template/template.yaml (100%) create mode 100644 packages/create-app/templates/legacy-app/package.json rename packages/create-app/templates/{next-app => legacy-app}/package.json.hbs (69%) rename packages/create-app/templates/{next-app => legacy-app}/packages/README.md (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/.eslintignore (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/.eslintrc.js.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/e2e-tests/app.test.ts (79%) create mode 100644 packages/create-app/templates/legacy-app/packages/app/package.json.hbs rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/android-chrome-192x192.png (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/apple-touch-icon.png (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/favicon-16x16.png (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/favicon-32x32.png (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/favicon.ico (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/index.html (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/manifest.json (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/robots.txt (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/public/safari-pinned-tab.svg (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/src/App.test.tsx (92%) create mode 100644 packages/create-app/templates/legacy-app/packages/app/src/App.tsx rename packages/create-app/templates/{default-app => legacy-app}/packages/app/src/apis.ts (100%) rename packages/create-app/templates/{default-app => legacy-app}/packages/app/src/components/Root/LogoFull.tsx (100%) rename packages/create-app/templates/{default-app => legacy-app}/packages/app/src/components/Root/LogoIcon.tsx (100%) rename packages/create-app/templates/{default-app => legacy-app}/packages/app/src/components/Root/Root.tsx (100%) rename packages/create-app/templates/{default-app => legacy-app}/packages/app/src/components/Root/index.ts (100%) rename packages/create-app/templates/{default-app => legacy-app}/packages/app/src/components/catalog/EntityPage.tsx (100%) rename packages/create-app/templates/{default-app => legacy-app}/packages/app/src/components/search/SearchPage.tsx (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/src/index.tsx (64%) rename packages/create-app/templates/{next-app => legacy-app}/packages/app/src/setupTests.ts (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/backend/.eslintrc.js.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/backend/Dockerfile (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/backend/README.md (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/backend/package.json.hbs (100%) rename packages/create-app/templates/{next-app => legacy-app}/packages/backend/src/index.ts (100%) rename packages/create-app/templates/{next-app => legacy-app}/playwright.config.ts (100%) rename packages/create-app/templates/{next-app => legacy-app}/plugins/README.md (100%) rename packages/create-app/templates/{next-app => legacy-app}/tsconfig.json (100%) rename packages/create-app/templates/{next-app => legacy-app}/yarn.lock (100%) delete mode 100644 packages/create-app/templates/next-app/packages/app/package.json.hbs delete mode 100644 packages/create-app/templates/next-app/packages/app/src/App.tsx diff --git a/.changeset/rename-create-app-templates.md b/.changeset/rename-create-app-templates.md new file mode 100644 index 0000000000..3e46b2e0db --- /dev/null +++ b/.changeset/rename-create-app-templates.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Renamed the built-in template directories from `next-app` to `default-app` and `default-app` to `legacy-app`. diff --git a/.gitignore b/.gitignore index e93a77b462..b3bb98901d 100644 --- a/.gitignore +++ b/.gitignore @@ -148,7 +148,7 @@ site # Local configuration files *.local.yaml -!packages/create-app/templates/default-app/app-config.local.yaml +!packages/create-app/templates/legacy-app/app-config.local.yaml # Sensitive credentials *-credentials.yaml diff --git a/packages/create-app/src/createApp.test.ts b/packages/create-app/src/createApp.test.ts index a032f9bb3b..06a0e7df05 100644 --- a/packages/create-app/src/createApp.test.ts +++ b/packages/create-app/src/createApp.test.ts @@ -69,7 +69,7 @@ describe('command entrypoint', () => { expect(tryInitGitRepositoryMock).toHaveBeenCalled(); expect(templatingMock).toHaveBeenCalled(); expect(templatingMock.mock.lastCall?.[0]).toEqual( - findOwnPaths(__dirname).resolve('templates/next-app'), + findOwnPaths(__dirname).resolve('templates/default-app'), ); expect(templatingMock.mock.lastCall?.[1]).toContain( path.join(tmpdir(), 'MyApp'), @@ -85,7 +85,7 @@ describe('command entrypoint', () => { expect(tryInitGitRepositoryMock).toHaveBeenCalled(); expect(templatingMock).toHaveBeenCalled(); expect(templatingMock.mock.lastCall?.[0]).toEqual( - findOwnPaths(__dirname).resolve('templates/next-app'), + findOwnPaths(__dirname).resolve('templates/default-app'), ); expect(templatingMock.mock.lastCall?.[1]).toEqual('myDirectory'); expect(buildAppMock).toHaveBeenCalled(); @@ -98,7 +98,7 @@ describe('command entrypoint', () => { expect(tryInitGitRepositoryMock).toHaveBeenCalled(); expect(templatingMock).toHaveBeenCalled(); expect(templatingMock.mock.lastCall?.[0]).toEqual( - findOwnPaths(__dirname).resolve('templates/default-app'), + findOwnPaths(__dirname).resolve('templates/legacy-app'), ); expect(templatingMock.mock.lastCall?.[1]).toContain( path.join(tmpdir(), 'MyApp'), diff --git a/packages/create-app/src/createApp.ts b/packages/create-app/src/createApp.ts index 68c27d3a1a..21a7cf272c 100644 --- a/packages/create-app/src/createApp.ts +++ b/packages/create-app/src/createApp.ts @@ -67,8 +67,8 @@ export default async (opts: OptionValues): Promise => { /* eslint-disable-next-line no-restricted-syntax */ const ownPaths = findOwnPaths(__dirname); const builtInTemplate = opts.legacy - ? ownPaths.resolve('templates/default-app') - : ownPaths.resolve('templates/next-app'); + ? ownPaths.resolve('templates/legacy-app') + : ownPaths.resolve('templates/default-app'); // Use `--template-path` argument as template when specified. Otherwise, use the default template. const templateDir = opts.templatePath diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 50f9d18e26..15b7d59ed7 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -276,7 +276,7 @@ describe('tasks', () => { describe('templatingTask', () => { it('should generate a project populating context parameters', async () => { - const templateDir = resolvePath(__dirname, '../../templates/default-app'); + const templateDir = resolvePath(__dirname, '../../templates/legacy-app'); const destinationDir = 'templatedApp'; const context = { name: 'SuperCoolBackstageInstance', diff --git a/packages/create-app/templates/default-app/app-config.yaml.hbs b/packages/create-app/templates/default-app/app-config.yaml.hbs index 867871ca1e..58a48a3e95 100644 --- a/packages/create-app/templates/default-app/app-config.yaml.hbs +++ b/packages/create-app/templates/default-app/app-config.yaml.hbs @@ -2,6 +2,21 @@ app: title: Scaffolded Backstage App baseUrl: http://localhost:3000 + # Enable all packages by default, this will discover packages from packages/app/package.json + packages: all + + extensions: + # Disable the nav items that we're manually rendering in packages/app/src/modules/nav/Sidebar.tsx + - nav-item:search: false + - nav-item:user-settings: false + - nav-item:catalog: false + - nav-item:scaffolder: false + + # Configure the catalog index page to be the root page, this is normally mounted on /catalog + - page:catalog: + config: + path: / + organization: name: My Company diff --git a/packages/create-app/templates/default-app/package.json b/packages/create-app/templates/default-app/package.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/packages/create-app/templates/default-app/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 836ecccac5..6e2d899860 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -27,20 +27,7 @@ "new": { "globals": { "license": "UNLICENSED" - }, - "templates": [ - "@backstage/cli-module-new/templates/legacy-frontend-plugin", - "@backstage/cli-module-new/templates/backend-plugin", - "@backstage/cli-module-new/templates/backend-plugin-module", - "@backstage/cli-module-new/templates/plugin-web-library", - "@backstage/cli-module-new/templates/plugin-node-library", - "@backstage/cli-module-new/templates/plugin-common-library", - "@backstage/cli-module-new/templates/web-library", - "@backstage/cli-module-new/templates/node-library", - "@backstage/cli-module-new/templates/cli-module", - "@backstage/cli-module-new/templates/catalog-provider-module", - "@backstage/cli-module-new/templates/scaffolder-backend-module" - ] + } } } }, diff --git a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts index 839ff883de..187e124bfa 100644 --- a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts +++ b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts @@ -23,5 +23,7 @@ test('App should render the welcome page', async ({ page }) => { await expect(enterButton).toBeVisible(); await enterButton.click(); - await expect(page.getByText('My Company Catalog')).toBeVisible(); + const nav = page.getByRole('navigation'); + await expect(nav.getByRole('link', { name: 'Catalog' })).toBeVisible(); + await expect(page.getByRole('link', { name: 'APIs' })).toBeVisible(); }); diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs index 392a00200b..54672f6afa 100644 --- a/packages/create-app/templates/default-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs @@ -14,33 +14,29 @@ "lint": "backstage-cli package lint" }, "dependencies": { - "@backstage/app-defaults": "^{{version '@backstage/app-defaults'}}", - "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}", - "@backstage/cli": "^{{version '@backstage/cli'}}", - "@backstage/core-app-api": "^{{version '@backstage/core-app-api'}}", - "@backstage/core-components": "^{{version '@backstage/core-components'}}", - "@backstage/core-plugin-api": "^{{version '@backstage/core-plugin-api'}}", - "@backstage/integration-react": "^{{version '@backstage/integration-react'}}", - "@backstage/plugin-api-docs": "^{{version '@backstage/plugin-api-docs'}}", - "@backstage/plugin-catalog": "^{{version '@backstage/plugin-catalog'}}", - "@backstage/plugin-catalog-common": "^{{version '@backstage/plugin-catalog-common'}}", - "@backstage/plugin-catalog-graph": "^{{version '@backstage/plugin-catalog-graph'}}", - "@backstage/plugin-catalog-import": "^{{version '@backstage/plugin-catalog-import'}}", - "@backstage/plugin-catalog-react": "^{{version '@backstage/plugin-catalog-react'}}", - "@backstage/plugin-kubernetes": "^{{version '@backstage/plugin-kubernetes'}}", + "@backstage/cli": "^{{ version '@backstage/cli'}}", + "@backstage/core-components": "^{{ version '@backstage/core-components'}}", + "@backstage/core-plugin-api": "^{{ version '@backstage/core-plugin-api'}}", + "@backstage/frontend-defaults": "^{{ version '@backstage/frontend-defaults'}}", + "@backstage/frontend-plugin-api": "^{{ version '@backstage/frontend-plugin-api'}}", + "@backstage/integration-react": "^{{ version '@backstage/integration-react'}}", + "@backstage/plugin-api-docs": "^{{ version '@backstage/plugin-api-docs'}}", + "@backstage/plugin-app-react": "^{{ version '@backstage/plugin-app-react'}}", + "@backstage/plugin-app-visualizer": "^{{ version '@backstage/plugin-app-visualizer'}}", + "@backstage/plugin-auth": "^{{ version '@backstage/plugin-auth'}}", + "@backstage/plugin-catalog": "^{{ version '@backstage/plugin-catalog'}}", + "@backstage/plugin-catalog-graph": "^{{ version '@backstage/plugin-catalog-graph'}}", + "@backstage/plugin-catalog-import": "^{{ version '@backstage/plugin-catalog-import'}}", + "@backstage/plugin-kubernetes": "^{{ version '@backstage/plugin-kubernetes'}}", "@backstage/plugin-notifications": "^{{ version '@backstage/plugin-notifications'}}", - "@backstage/plugin-org": "^{{version '@backstage/plugin-org'}}", - "@backstage/plugin-permission-react": "^{{version '@backstage/plugin-permission-react'}}", - "@backstage/plugin-scaffolder": "^{{version '@backstage/plugin-scaffolder'}}", - "@backstage/plugin-search": "^{{version '@backstage/plugin-search'}}", - "@backstage/plugin-search-react": "^{{version '@backstage/plugin-search-react'}}", + "@backstage/plugin-org": "^{{ version '@backstage/plugin-org'}}", + "@backstage/plugin-scaffolder": "^{{ version '@backstage/plugin-scaffolder'}}", + "@backstage/plugin-search": "^{{ version '@backstage/plugin-search'}}", "@backstage/plugin-signals": "^{{ version '@backstage/plugin-signals'}}", - "@backstage/plugin-techdocs": "^{{version '@backstage/plugin-techdocs'}}", - "@backstage/plugin-techdocs-module-addons-contrib": "^{{version '@backstage/plugin-techdocs-module-addons-contrib'}}", - "@backstage/plugin-techdocs-react": "^{{version '@backstage/plugin-techdocs-react'}}", - "@backstage/plugin-user-settings": "^{{version '@backstage/plugin-user-settings'}}", - "@backstage/theme": "^{{version '@backstage/theme'}}", - "@backstage/ui": "^{{version '@backstage/ui'}}", + "@backstage/plugin-techdocs": "^{{ version '@backstage/plugin-techdocs'}}", + "@backstage/plugin-techdocs-module-addons-contrib": "^{{ version '@backstage/plugin-techdocs-module-addons-contrib'}}", + "@backstage/plugin-user-settings": "^{{ version '@backstage/plugin-user-settings'}}", + "@backstage/ui": "^{{ version '@backstage/ui'}}", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "react": "^18.0.2", @@ -49,7 +45,7 @@ "react-router-dom": "^6.30.2" }, "devDependencies": { - "@backstage/test-utils": "^{{version '@backstage/test-utils'}}", + "@backstage/frontend-test-utils": "^{{ version '@backstage/frontend-test-utils'}}", "@playwright/test": "^1.32.3", "@testing-library/dom": "^9.0.0", "@testing-library/jest-dom": "^6.0.0", diff --git a/packages/create-app/templates/default-app/packages/app/src/App.test.tsx b/packages/create-app/templates/default-app/packages/app/src/App.test.tsx index b6ca21d422..98e7a6438d 100644 --- a/packages/create-app/templates/default-app/packages/app/src/App.test.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/App.test.tsx @@ -19,7 +19,7 @@ describe('App', () => { ] as any, }; - const rendered = render(); + const rendered = render(App.createRoot()); await waitFor(() => { expect(rendered.baseElement).toBeInTheDocument(); diff --git a/packages/create-app/templates/default-app/packages/app/src/App.tsx b/packages/create-app/templates/default-app/packages/app/src/App.tsx index bb9c98eff8..c0206fec07 100644 --- a/packages/create-app/templates/default-app/packages/app/src/App.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/App.tsx @@ -1,112 +1,7 @@ -import { Navigate, Route } from 'react-router-dom'; -import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs'; -import { - CatalogEntityPage, - CatalogIndexPage, - catalogPlugin, -} from '@backstage/plugin-catalog'; -import { - CatalogImportPage, - catalogImportPlugin, -} from '@backstage/plugin-catalog-import'; -import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; -import { orgPlugin } from '@backstage/plugin-org'; -import { SearchPage } from '@backstage/plugin-search'; -import { - TechDocsIndexPage, - techdocsPlugin, - TechDocsReaderPage, -} from '@backstage/plugin-techdocs'; -import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; -import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; -import { UserSettingsPage } from '@backstage/plugin-user-settings'; -import { apis } from './apis'; -import { entityPage } from './components/catalog/EntityPage'; -import { searchPage } from './components/search/SearchPage'; -import { Root } from './components/Root'; +import { createApp } from '@backstage/frontend-defaults'; +import catalogPlugin from '@backstage/plugin-catalog/alpha'; +import { navModule } from './modules/nav'; -import { - AlertDisplay, - OAuthRequestDialog, - SignInPage, -} from '@backstage/core-components'; -import { createApp } from '@backstage/app-defaults'; -import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; -import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; -import { RequirePermission } from '@backstage/plugin-permission-react'; -import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; -import { NotificationsPage } from '@backstage/plugin-notifications'; -import { SignalsDisplay } from '@backstage/plugin-signals'; - -const app = createApp({ - apis, - bindRoutes({ bind }) { - bind(catalogPlugin.externalRoutes, { - createComponent: scaffolderPlugin.routes.root, - viewTechDoc: techdocsPlugin.routes.docRoot, - createFromTemplate: scaffolderPlugin.routes.selectedTemplate, - }); - bind(apiDocsPlugin.externalRoutes, { - registerApi: catalogImportPlugin.routes.importPage, - }); - bind(scaffolderPlugin.externalRoutes, { - registerComponent: catalogImportPlugin.routes.importPage, - viewTechDoc: techdocsPlugin.routes.docRoot, - }); - bind(orgPlugin.externalRoutes, { - catalogIndex: catalogPlugin.routes.catalogIndex, - }); - }, - components: { - SignInPage: props => , - }, +export default createApp({ + features: [catalogPlugin, navModule], }); - -const routes = ( - - } /> - } /> - } - > - {entityPage} - - } /> - } - > - - - - - } /> - } /> - - - - } - /> - }> - {searchPage} - - } /> - } /> - } /> - -); - -export default app.createRoot( - <> - - - - - {routes} - - , -); diff --git a/packages/create-app/templates/default-app/packages/app/src/index.tsx b/packages/create-app/templates/default-app/packages/app/src/index.tsx index 46f31902f4..ac9e52bdc1 100644 --- a/packages/create-app/templates/default-app/packages/app/src/index.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/index.tsx @@ -3,4 +3,4 @@ import ReactDOM from 'react-dom/client'; import App from './App'; import '@backstage/ui/css/styles.css'; -ReactDOM.createRoot(document.getElementById('root')!).render(); +ReactDOM.createRoot(document.getElementById('root')!).render(App.createRoot()); diff --git a/packages/create-app/templates/next-app/packages/app/src/modules/nav/LogoFull.tsx b/packages/create-app/templates/default-app/packages/app/src/modules/nav/LogoFull.tsx similarity index 100% rename from packages/create-app/templates/next-app/packages/app/src/modules/nav/LogoFull.tsx rename to packages/create-app/templates/default-app/packages/app/src/modules/nav/LogoFull.tsx diff --git a/packages/create-app/templates/next-app/packages/app/src/modules/nav/LogoIcon.tsx b/packages/create-app/templates/default-app/packages/app/src/modules/nav/LogoIcon.tsx similarity index 100% rename from packages/create-app/templates/next-app/packages/app/src/modules/nav/LogoIcon.tsx rename to packages/create-app/templates/default-app/packages/app/src/modules/nav/LogoIcon.tsx diff --git a/packages/create-app/templates/next-app/packages/app/src/modules/nav/Sidebar.tsx b/packages/create-app/templates/default-app/packages/app/src/modules/nav/Sidebar.tsx similarity index 100% rename from packages/create-app/templates/next-app/packages/app/src/modules/nav/Sidebar.tsx rename to packages/create-app/templates/default-app/packages/app/src/modules/nav/Sidebar.tsx diff --git a/packages/create-app/templates/next-app/packages/app/src/modules/nav/SidebarLogo.tsx b/packages/create-app/templates/default-app/packages/app/src/modules/nav/SidebarLogo.tsx similarity index 100% rename from packages/create-app/templates/next-app/packages/app/src/modules/nav/SidebarLogo.tsx rename to packages/create-app/templates/default-app/packages/app/src/modules/nav/SidebarLogo.tsx diff --git a/packages/create-app/templates/next-app/packages/app/src/modules/nav/index.ts b/packages/create-app/templates/default-app/packages/app/src/modules/nav/index.ts similarity index 100% rename from packages/create-app/templates/next-app/packages/app/src/modules/nav/index.ts rename to packages/create-app/templates/default-app/packages/app/src/modules/nav/index.ts diff --git a/packages/create-app/templates/default-app/yarn.lock b/packages/create-app/templates/default-app/yarn.lock index 5ad7fe233d..f70eb08d6d 100644 --- a/packages/create-app/templates/default-app/yarn.lock +++ b/packages/create-app/templates/default-app/yarn.lock @@ -1 +1,12 @@ -# intentionally left empty +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10 + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + languageName: unknown + linkType: soft diff --git a/packages/create-app/templates/next-app/.dockerignore b/packages/create-app/templates/legacy-app/.dockerignore similarity index 100% rename from packages/create-app/templates/next-app/.dockerignore rename to packages/create-app/templates/legacy-app/.dockerignore diff --git a/packages/create-app/templates/next-app/.eslintignore b/packages/create-app/templates/legacy-app/.eslintignore similarity index 100% rename from packages/create-app/templates/next-app/.eslintignore rename to packages/create-app/templates/legacy-app/.eslintignore diff --git a/packages/create-app/templates/next-app/.eslintrc.js.hbs b/packages/create-app/templates/legacy-app/.eslintrc.js.hbs similarity index 100% rename from packages/create-app/templates/next-app/.eslintrc.js.hbs rename to packages/create-app/templates/legacy-app/.eslintrc.js.hbs diff --git a/packages/create-app/templates/next-app/.gitignore.hbs b/packages/create-app/templates/legacy-app/.gitignore.hbs similarity index 100% rename from packages/create-app/templates/next-app/.gitignore.hbs rename to packages/create-app/templates/legacy-app/.gitignore.hbs diff --git a/packages/create-app/templates/next-app/.prettierignore b/packages/create-app/templates/legacy-app/.prettierignore similarity index 100% rename from packages/create-app/templates/next-app/.prettierignore rename to packages/create-app/templates/legacy-app/.prettierignore diff --git a/packages/create-app/templates/next-app/.yarn/releases/yarn-4.4.1.cjs b/packages/create-app/templates/legacy-app/.yarn/releases/yarn-4.4.1.cjs similarity index 100% rename from packages/create-app/templates/next-app/.yarn/releases/yarn-4.4.1.cjs rename to packages/create-app/templates/legacy-app/.yarn/releases/yarn-4.4.1.cjs diff --git a/packages/create-app/templates/next-app/.yarnrc.yml.hbs b/packages/create-app/templates/legacy-app/.yarnrc.yml.hbs similarity index 100% rename from packages/create-app/templates/next-app/.yarnrc.yml.hbs rename to packages/create-app/templates/legacy-app/.yarnrc.yml.hbs diff --git a/packages/create-app/templates/next-app/README.md b/packages/create-app/templates/legacy-app/README.md similarity index 100% rename from packages/create-app/templates/next-app/README.md rename to packages/create-app/templates/legacy-app/README.md diff --git a/packages/create-app/templates/default-app/app-config.local.yaml b/packages/create-app/templates/legacy-app/app-config.local.yaml similarity index 100% rename from packages/create-app/templates/default-app/app-config.local.yaml rename to packages/create-app/templates/legacy-app/app-config.local.yaml diff --git a/packages/create-app/templates/next-app/app-config.production.yaml b/packages/create-app/templates/legacy-app/app-config.production.yaml similarity index 100% rename from packages/create-app/templates/next-app/app-config.production.yaml rename to packages/create-app/templates/legacy-app/app-config.production.yaml diff --git a/packages/create-app/templates/next-app/app-config.yaml.hbs b/packages/create-app/templates/legacy-app/app-config.yaml.hbs similarity index 95% rename from packages/create-app/templates/next-app/app-config.yaml.hbs rename to packages/create-app/templates/legacy-app/app-config.yaml.hbs index f5fbee4130..756c7e1568 100644 --- a/packages/create-app/templates/next-app/app-config.yaml.hbs +++ b/packages/create-app/templates/legacy-app/app-config.yaml.hbs @@ -2,15 +2,6 @@ app: title: Scaffolded Backstage App baseUrl: http://localhost:3000 - # Enable all packages by default, this will discover packages from packages/app/package.json - packages: all - - extensions: - # Configure the catalog index page to be the root page, this is normally mounted on /catalog - - page:catalog: - config: - path: / - organization: name: My Company diff --git a/packages/create-app/templates/next-app/backstage.json.hbs b/packages/create-app/templates/legacy-app/backstage.json.hbs similarity index 100% rename from packages/create-app/templates/next-app/backstage.json.hbs rename to packages/create-app/templates/legacy-app/backstage.json.hbs diff --git a/packages/create-app/templates/next-app/catalog-info.yaml.hbs b/packages/create-app/templates/legacy-app/catalog-info.yaml.hbs similarity index 100% rename from packages/create-app/templates/next-app/catalog-info.yaml.hbs rename to packages/create-app/templates/legacy-app/catalog-info.yaml.hbs diff --git a/packages/create-app/templates/next-app/examples/entities.yaml b/packages/create-app/templates/legacy-app/examples/entities.yaml similarity index 100% rename from packages/create-app/templates/next-app/examples/entities.yaml rename to packages/create-app/templates/legacy-app/examples/entities.yaml diff --git a/packages/create-app/templates/next-app/examples/org.yaml b/packages/create-app/templates/legacy-app/examples/org.yaml similarity index 100% rename from packages/create-app/templates/next-app/examples/org.yaml rename to packages/create-app/templates/legacy-app/examples/org.yaml diff --git a/packages/create-app/templates/next-app/examples/template/content/catalog-info.yaml b/packages/create-app/templates/legacy-app/examples/template/content/catalog-info.yaml similarity index 100% rename from packages/create-app/templates/next-app/examples/template/content/catalog-info.yaml rename to packages/create-app/templates/legacy-app/examples/template/content/catalog-info.yaml diff --git a/packages/create-app/templates/next-app/examples/template/content/index.js b/packages/create-app/templates/legacy-app/examples/template/content/index.js similarity index 100% rename from packages/create-app/templates/next-app/examples/template/content/index.js rename to packages/create-app/templates/legacy-app/examples/template/content/index.js diff --git a/packages/create-app/templates/next-app/examples/template/content/package.json b/packages/create-app/templates/legacy-app/examples/template/content/package.json similarity index 100% rename from packages/create-app/templates/next-app/examples/template/content/package.json rename to packages/create-app/templates/legacy-app/examples/template/content/package.json diff --git a/packages/create-app/templates/next-app/examples/template/template.yaml b/packages/create-app/templates/legacy-app/examples/template/template.yaml similarity index 100% rename from packages/create-app/templates/next-app/examples/template/template.yaml rename to packages/create-app/templates/legacy-app/examples/template/template.yaml diff --git a/packages/create-app/templates/legacy-app/package.json b/packages/create-app/templates/legacy-app/package.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/packages/create-app/templates/legacy-app/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/create-app/templates/next-app/package.json.hbs b/packages/create-app/templates/legacy-app/package.json.hbs similarity index 69% rename from packages/create-app/templates/next-app/package.json.hbs rename to packages/create-app/templates/legacy-app/package.json.hbs index 6e2d899860..836ecccac5 100644 --- a/packages/create-app/templates/next-app/package.json.hbs +++ b/packages/create-app/templates/legacy-app/package.json.hbs @@ -27,7 +27,20 @@ "new": { "globals": { "license": "UNLICENSED" - } + }, + "templates": [ + "@backstage/cli-module-new/templates/legacy-frontend-plugin", + "@backstage/cli-module-new/templates/backend-plugin", + "@backstage/cli-module-new/templates/backend-plugin-module", + "@backstage/cli-module-new/templates/plugin-web-library", + "@backstage/cli-module-new/templates/plugin-node-library", + "@backstage/cli-module-new/templates/plugin-common-library", + "@backstage/cli-module-new/templates/web-library", + "@backstage/cli-module-new/templates/node-library", + "@backstage/cli-module-new/templates/cli-module", + "@backstage/cli-module-new/templates/catalog-provider-module", + "@backstage/cli-module-new/templates/scaffolder-backend-module" + ] } } }, diff --git a/packages/create-app/templates/next-app/packages/README.md b/packages/create-app/templates/legacy-app/packages/README.md similarity index 100% rename from packages/create-app/templates/next-app/packages/README.md rename to packages/create-app/templates/legacy-app/packages/README.md diff --git a/packages/create-app/templates/next-app/packages/app/.eslintignore b/packages/create-app/templates/legacy-app/packages/app/.eslintignore similarity index 100% rename from packages/create-app/templates/next-app/packages/app/.eslintignore rename to packages/create-app/templates/legacy-app/packages/app/.eslintignore diff --git a/packages/create-app/templates/next-app/packages/app/.eslintrc.js.hbs b/packages/create-app/templates/legacy-app/packages/app/.eslintrc.js.hbs similarity index 100% rename from packages/create-app/templates/next-app/packages/app/.eslintrc.js.hbs rename to packages/create-app/templates/legacy-app/packages/app/.eslintrc.js.hbs diff --git a/packages/create-app/templates/next-app/packages/app/e2e-tests/app.test.ts b/packages/create-app/templates/legacy-app/packages/app/e2e-tests/app.test.ts similarity index 79% rename from packages/create-app/templates/next-app/packages/app/e2e-tests/app.test.ts rename to packages/create-app/templates/legacy-app/packages/app/e2e-tests/app.test.ts index d8dbc1faa8..839ff883de 100644 --- a/packages/create-app/templates/next-app/packages/app/e2e-tests/app.test.ts +++ b/packages/create-app/templates/legacy-app/packages/app/e2e-tests/app.test.ts @@ -23,11 +23,5 @@ test('App should render the welcome page', async ({ page }) => { await expect(enterButton).toBeVisible(); await enterButton.click(); - const nav = page.getByRole('navigation'); - await expect( - nav.getByRole('link', { name: 'Catalog', exact: true }), - ).toBeVisible(); - await expect( - page.getByRole('link', { name: 'APIs', exact: true }), - ).toBeVisible(); + await expect(page.getByText('My Company Catalog')).toBeVisible(); }); diff --git a/packages/create-app/templates/legacy-app/packages/app/package.json.hbs b/packages/create-app/templates/legacy-app/packages/app/package.json.hbs new file mode 100644 index 0000000000..392a00200b --- /dev/null +++ b/packages/create-app/templates/legacy-app/packages/app/package.json.hbs @@ -0,0 +1,76 @@ +{ + "name": "app", + "version": "0.0.0", + "private": true, + "bundled": true, + "backstage": { + "role": "frontend" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "test": "backstage-cli package test", + "lint": "backstage-cli package lint" + }, + "dependencies": { + "@backstage/app-defaults": "^{{version '@backstage/app-defaults'}}", + "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}", + "@backstage/cli": "^{{version '@backstage/cli'}}", + "@backstage/core-app-api": "^{{version '@backstage/core-app-api'}}", + "@backstage/core-components": "^{{version '@backstage/core-components'}}", + "@backstage/core-plugin-api": "^{{version '@backstage/core-plugin-api'}}", + "@backstage/integration-react": "^{{version '@backstage/integration-react'}}", + "@backstage/plugin-api-docs": "^{{version '@backstage/plugin-api-docs'}}", + "@backstage/plugin-catalog": "^{{version '@backstage/plugin-catalog'}}", + "@backstage/plugin-catalog-common": "^{{version '@backstage/plugin-catalog-common'}}", + "@backstage/plugin-catalog-graph": "^{{version '@backstage/plugin-catalog-graph'}}", + "@backstage/plugin-catalog-import": "^{{version '@backstage/plugin-catalog-import'}}", + "@backstage/plugin-catalog-react": "^{{version '@backstage/plugin-catalog-react'}}", + "@backstage/plugin-kubernetes": "^{{version '@backstage/plugin-kubernetes'}}", + "@backstage/plugin-notifications": "^{{ version '@backstage/plugin-notifications'}}", + "@backstage/plugin-org": "^{{version '@backstage/plugin-org'}}", + "@backstage/plugin-permission-react": "^{{version '@backstage/plugin-permission-react'}}", + "@backstage/plugin-scaffolder": "^{{version '@backstage/plugin-scaffolder'}}", + "@backstage/plugin-search": "^{{version '@backstage/plugin-search'}}", + "@backstage/plugin-search-react": "^{{version '@backstage/plugin-search-react'}}", + "@backstage/plugin-signals": "^{{ version '@backstage/plugin-signals'}}", + "@backstage/plugin-techdocs": "^{{version '@backstage/plugin-techdocs'}}", + "@backstage/plugin-techdocs-module-addons-contrib": "^{{version '@backstage/plugin-techdocs-module-addons-contrib'}}", + "@backstage/plugin-techdocs-react": "^{{version '@backstage/plugin-techdocs-react'}}", + "@backstage/plugin-user-settings": "^{{version '@backstage/plugin-user-settings'}}", + "@backstage/theme": "^{{version '@backstage/theme'}}", + "@backstage/ui": "^{{version '@backstage/ui'}}", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "react": "^18.0.2", + "react-dom": "^18.0.2", + "react-router": "^6.30.2", + "react-router-dom": "^6.30.2" + }, + "devDependencies": { + "@backstage/test-utils": "^{{version '@backstage/test-utils'}}", + "@playwright/test": "^1.32.3", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", + "@types/react-dom": "*", + "cross-env": "^7.0.0" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "files": [ + "dist" + ] +} diff --git a/packages/create-app/templates/next-app/packages/app/public/android-chrome-192x192.png b/packages/create-app/templates/legacy-app/packages/app/public/android-chrome-192x192.png similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/android-chrome-192x192.png rename to packages/create-app/templates/legacy-app/packages/app/public/android-chrome-192x192.png diff --git a/packages/create-app/templates/next-app/packages/app/public/apple-touch-icon.png b/packages/create-app/templates/legacy-app/packages/app/public/apple-touch-icon.png similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/apple-touch-icon.png rename to packages/create-app/templates/legacy-app/packages/app/public/apple-touch-icon.png diff --git a/packages/create-app/templates/next-app/packages/app/public/favicon-16x16.png b/packages/create-app/templates/legacy-app/packages/app/public/favicon-16x16.png similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/favicon-16x16.png rename to packages/create-app/templates/legacy-app/packages/app/public/favicon-16x16.png diff --git a/packages/create-app/templates/next-app/packages/app/public/favicon-32x32.png b/packages/create-app/templates/legacy-app/packages/app/public/favicon-32x32.png similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/favicon-32x32.png rename to packages/create-app/templates/legacy-app/packages/app/public/favicon-32x32.png diff --git a/packages/create-app/templates/next-app/packages/app/public/favicon.ico b/packages/create-app/templates/legacy-app/packages/app/public/favicon.ico similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/favicon.ico rename to packages/create-app/templates/legacy-app/packages/app/public/favicon.ico diff --git a/packages/create-app/templates/next-app/packages/app/public/index.html b/packages/create-app/templates/legacy-app/packages/app/public/index.html similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/index.html rename to packages/create-app/templates/legacy-app/packages/app/public/index.html diff --git a/packages/create-app/templates/next-app/packages/app/public/manifest.json b/packages/create-app/templates/legacy-app/packages/app/public/manifest.json similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/manifest.json rename to packages/create-app/templates/legacy-app/packages/app/public/manifest.json diff --git a/packages/create-app/templates/next-app/packages/app/public/robots.txt b/packages/create-app/templates/legacy-app/packages/app/public/robots.txt similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/robots.txt rename to packages/create-app/templates/legacy-app/packages/app/public/robots.txt diff --git a/packages/create-app/templates/next-app/packages/app/public/safari-pinned-tab.svg b/packages/create-app/templates/legacy-app/packages/app/public/safari-pinned-tab.svg similarity index 100% rename from packages/create-app/templates/next-app/packages/app/public/safari-pinned-tab.svg rename to packages/create-app/templates/legacy-app/packages/app/public/safari-pinned-tab.svg diff --git a/packages/create-app/templates/next-app/packages/app/src/App.test.tsx b/packages/create-app/templates/legacy-app/packages/app/src/App.test.tsx similarity index 92% rename from packages/create-app/templates/next-app/packages/app/src/App.test.tsx rename to packages/create-app/templates/legacy-app/packages/app/src/App.test.tsx index 98e7a6438d..b6ca21d422 100644 --- a/packages/create-app/templates/next-app/packages/app/src/App.test.tsx +++ b/packages/create-app/templates/legacy-app/packages/app/src/App.test.tsx @@ -19,7 +19,7 @@ describe('App', () => { ] as any, }; - const rendered = render(App.createRoot()); + const rendered = render(); await waitFor(() => { expect(rendered.baseElement).toBeInTheDocument(); diff --git a/packages/create-app/templates/legacy-app/packages/app/src/App.tsx b/packages/create-app/templates/legacy-app/packages/app/src/App.tsx new file mode 100644 index 0000000000..bb9c98eff8 --- /dev/null +++ b/packages/create-app/templates/legacy-app/packages/app/src/App.tsx @@ -0,0 +1,112 @@ +import { Navigate, Route } from 'react-router-dom'; +import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs'; +import { + CatalogEntityPage, + CatalogIndexPage, + catalogPlugin, +} from '@backstage/plugin-catalog'; +import { + CatalogImportPage, + catalogImportPlugin, +} from '@backstage/plugin-catalog-import'; +import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; +import { orgPlugin } from '@backstage/plugin-org'; +import { SearchPage } from '@backstage/plugin-search'; +import { + TechDocsIndexPage, + techdocsPlugin, + TechDocsReaderPage, +} from '@backstage/plugin-techdocs'; +import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; +import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; +import { UserSettingsPage } from '@backstage/plugin-user-settings'; +import { apis } from './apis'; +import { entityPage } from './components/catalog/EntityPage'; +import { searchPage } from './components/search/SearchPage'; +import { Root } from './components/Root'; + +import { + AlertDisplay, + OAuthRequestDialog, + SignInPage, +} from '@backstage/core-components'; +import { createApp } from '@backstage/app-defaults'; +import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; +import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; +import { RequirePermission } from '@backstage/plugin-permission-react'; +import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; +import { NotificationsPage } from '@backstage/plugin-notifications'; +import { SignalsDisplay } from '@backstage/plugin-signals'; + +const app = createApp({ + apis, + bindRoutes({ bind }) { + bind(catalogPlugin.externalRoutes, { + createComponent: scaffolderPlugin.routes.root, + viewTechDoc: techdocsPlugin.routes.docRoot, + createFromTemplate: scaffolderPlugin.routes.selectedTemplate, + }); + bind(apiDocsPlugin.externalRoutes, { + registerApi: catalogImportPlugin.routes.importPage, + }); + bind(scaffolderPlugin.externalRoutes, { + registerComponent: catalogImportPlugin.routes.importPage, + viewTechDoc: techdocsPlugin.routes.docRoot, + }); + bind(orgPlugin.externalRoutes, { + catalogIndex: catalogPlugin.routes.catalogIndex, + }); + }, + components: { + SignInPage: props => , + }, +}); + +const routes = ( + + } /> + } /> + } + > + {entityPage} + + } /> + } + > + + + + + } /> + } /> + + + + } + /> + }> + {searchPage} + + } /> + } /> + } /> + +); + +export default app.createRoot( + <> + + + + + {routes} + + , +); diff --git a/packages/create-app/templates/default-app/packages/app/src/apis.ts b/packages/create-app/templates/legacy-app/packages/app/src/apis.ts similarity index 100% rename from packages/create-app/templates/default-app/packages/app/src/apis.ts rename to packages/create-app/templates/legacy-app/packages/app/src/apis.ts diff --git a/packages/create-app/templates/default-app/packages/app/src/components/Root/LogoFull.tsx b/packages/create-app/templates/legacy-app/packages/app/src/components/Root/LogoFull.tsx similarity index 100% rename from packages/create-app/templates/default-app/packages/app/src/components/Root/LogoFull.tsx rename to packages/create-app/templates/legacy-app/packages/app/src/components/Root/LogoFull.tsx diff --git a/packages/create-app/templates/default-app/packages/app/src/components/Root/LogoIcon.tsx b/packages/create-app/templates/legacy-app/packages/app/src/components/Root/LogoIcon.tsx similarity index 100% rename from packages/create-app/templates/default-app/packages/app/src/components/Root/LogoIcon.tsx rename to packages/create-app/templates/legacy-app/packages/app/src/components/Root/LogoIcon.tsx diff --git a/packages/create-app/templates/default-app/packages/app/src/components/Root/Root.tsx b/packages/create-app/templates/legacy-app/packages/app/src/components/Root/Root.tsx similarity index 100% rename from packages/create-app/templates/default-app/packages/app/src/components/Root/Root.tsx rename to packages/create-app/templates/legacy-app/packages/app/src/components/Root/Root.tsx diff --git a/packages/create-app/templates/default-app/packages/app/src/components/Root/index.ts b/packages/create-app/templates/legacy-app/packages/app/src/components/Root/index.ts similarity index 100% rename from packages/create-app/templates/default-app/packages/app/src/components/Root/index.ts rename to packages/create-app/templates/legacy-app/packages/app/src/components/Root/index.ts diff --git a/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx b/packages/create-app/templates/legacy-app/packages/app/src/components/catalog/EntityPage.tsx similarity index 100% rename from packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx rename to packages/create-app/templates/legacy-app/packages/app/src/components/catalog/EntityPage.tsx diff --git a/packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx b/packages/create-app/templates/legacy-app/packages/app/src/components/search/SearchPage.tsx similarity index 100% rename from packages/create-app/templates/default-app/packages/app/src/components/search/SearchPage.tsx rename to packages/create-app/templates/legacy-app/packages/app/src/components/search/SearchPage.tsx diff --git a/packages/create-app/templates/next-app/packages/app/src/index.tsx b/packages/create-app/templates/legacy-app/packages/app/src/index.tsx similarity index 64% rename from packages/create-app/templates/next-app/packages/app/src/index.tsx rename to packages/create-app/templates/legacy-app/packages/app/src/index.tsx index ac9e52bdc1..46f31902f4 100644 --- a/packages/create-app/templates/next-app/packages/app/src/index.tsx +++ b/packages/create-app/templates/legacy-app/packages/app/src/index.tsx @@ -3,4 +3,4 @@ import ReactDOM from 'react-dom/client'; import App from './App'; import '@backstage/ui/css/styles.css'; -ReactDOM.createRoot(document.getElementById('root')!).render(App.createRoot()); +ReactDOM.createRoot(document.getElementById('root')!).render(); diff --git a/packages/create-app/templates/next-app/packages/app/src/setupTests.ts b/packages/create-app/templates/legacy-app/packages/app/src/setupTests.ts similarity index 100% rename from packages/create-app/templates/next-app/packages/app/src/setupTests.ts rename to packages/create-app/templates/legacy-app/packages/app/src/setupTests.ts diff --git a/packages/create-app/templates/next-app/packages/backend/.eslintrc.js.hbs b/packages/create-app/templates/legacy-app/packages/backend/.eslintrc.js.hbs similarity index 100% rename from packages/create-app/templates/next-app/packages/backend/.eslintrc.js.hbs rename to packages/create-app/templates/legacy-app/packages/backend/.eslintrc.js.hbs diff --git a/packages/create-app/templates/next-app/packages/backend/Dockerfile b/packages/create-app/templates/legacy-app/packages/backend/Dockerfile similarity index 100% rename from packages/create-app/templates/next-app/packages/backend/Dockerfile rename to packages/create-app/templates/legacy-app/packages/backend/Dockerfile diff --git a/packages/create-app/templates/next-app/packages/backend/README.md b/packages/create-app/templates/legacy-app/packages/backend/README.md similarity index 100% rename from packages/create-app/templates/next-app/packages/backend/README.md rename to packages/create-app/templates/legacy-app/packages/backend/README.md diff --git a/packages/create-app/templates/next-app/packages/backend/package.json.hbs b/packages/create-app/templates/legacy-app/packages/backend/package.json.hbs similarity index 100% rename from packages/create-app/templates/next-app/packages/backend/package.json.hbs rename to packages/create-app/templates/legacy-app/packages/backend/package.json.hbs diff --git a/packages/create-app/templates/next-app/packages/backend/src/index.ts b/packages/create-app/templates/legacy-app/packages/backend/src/index.ts similarity index 100% rename from packages/create-app/templates/next-app/packages/backend/src/index.ts rename to packages/create-app/templates/legacy-app/packages/backend/src/index.ts diff --git a/packages/create-app/templates/next-app/playwright.config.ts b/packages/create-app/templates/legacy-app/playwright.config.ts similarity index 100% rename from packages/create-app/templates/next-app/playwright.config.ts rename to packages/create-app/templates/legacy-app/playwright.config.ts diff --git a/packages/create-app/templates/next-app/plugins/README.md b/packages/create-app/templates/legacy-app/plugins/README.md similarity index 100% rename from packages/create-app/templates/next-app/plugins/README.md rename to packages/create-app/templates/legacy-app/plugins/README.md diff --git a/packages/create-app/templates/next-app/tsconfig.json b/packages/create-app/templates/legacy-app/tsconfig.json similarity index 100% rename from packages/create-app/templates/next-app/tsconfig.json rename to packages/create-app/templates/legacy-app/tsconfig.json diff --git a/packages/create-app/templates/next-app/yarn.lock b/packages/create-app/templates/legacy-app/yarn.lock similarity index 100% rename from packages/create-app/templates/next-app/yarn.lock rename to packages/create-app/templates/legacy-app/yarn.lock diff --git a/packages/create-app/templates/next-app/packages/app/package.json.hbs b/packages/create-app/templates/next-app/packages/app/package.json.hbs deleted file mode 100644 index 54672f6afa..0000000000 --- a/packages/create-app/templates/next-app/packages/app/package.json.hbs +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "app", - "version": "0.0.0", - "private": true, - "bundled": true, - "backstage": { - "role": "frontend" - }, - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "test": "backstage-cli package test", - "lint": "backstage-cli package lint" - }, - "dependencies": { - "@backstage/cli": "^{{ version '@backstage/cli'}}", - "@backstage/core-components": "^{{ version '@backstage/core-components'}}", - "@backstage/core-plugin-api": "^{{ version '@backstage/core-plugin-api'}}", - "@backstage/frontend-defaults": "^{{ version '@backstage/frontend-defaults'}}", - "@backstage/frontend-plugin-api": "^{{ version '@backstage/frontend-plugin-api'}}", - "@backstage/integration-react": "^{{ version '@backstage/integration-react'}}", - "@backstage/plugin-api-docs": "^{{ version '@backstage/plugin-api-docs'}}", - "@backstage/plugin-app-react": "^{{ version '@backstage/plugin-app-react'}}", - "@backstage/plugin-app-visualizer": "^{{ version '@backstage/plugin-app-visualizer'}}", - "@backstage/plugin-auth": "^{{ version '@backstage/plugin-auth'}}", - "@backstage/plugin-catalog": "^{{ version '@backstage/plugin-catalog'}}", - "@backstage/plugin-catalog-graph": "^{{ version '@backstage/plugin-catalog-graph'}}", - "@backstage/plugin-catalog-import": "^{{ version '@backstage/plugin-catalog-import'}}", - "@backstage/plugin-kubernetes": "^{{ version '@backstage/plugin-kubernetes'}}", - "@backstage/plugin-notifications": "^{{ version '@backstage/plugin-notifications'}}", - "@backstage/plugin-org": "^{{ version '@backstage/plugin-org'}}", - "@backstage/plugin-scaffolder": "^{{ version '@backstage/plugin-scaffolder'}}", - "@backstage/plugin-search": "^{{ version '@backstage/plugin-search'}}", - "@backstage/plugin-signals": "^{{ version '@backstage/plugin-signals'}}", - "@backstage/plugin-techdocs": "^{{ version '@backstage/plugin-techdocs'}}", - "@backstage/plugin-techdocs-module-addons-contrib": "^{{ version '@backstage/plugin-techdocs-module-addons-contrib'}}", - "@backstage/plugin-user-settings": "^{{ version '@backstage/plugin-user-settings'}}", - "@backstage/ui": "^{{ version '@backstage/ui'}}", - "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "react": "^18.0.2", - "react-dom": "^18.0.2", - "react-router": "^6.30.2", - "react-router-dom": "^6.30.2" - }, - "devDependencies": { - "@backstage/frontend-test-utils": "^{{ version '@backstage/frontend-test-utils'}}", - "@playwright/test": "^1.32.3", - "@testing-library/dom": "^9.0.0", - "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^14.0.0", - "@testing-library/user-event": "^14.0.0", - "@types/react-dom": "*", - "cross-env": "^7.0.0" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "files": [ - "dist" - ] -} diff --git a/packages/create-app/templates/next-app/packages/app/src/App.tsx b/packages/create-app/templates/next-app/packages/app/src/App.tsx deleted file mode 100644 index c0206fec07..0000000000 --- a/packages/create-app/templates/next-app/packages/app/src/App.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { createApp } from '@backstage/frontend-defaults'; -import catalogPlugin from '@backstage/plugin-catalog/alpha'; -import { navModule } from './modules/nav'; - -export default createApp({ - features: [catalogPlugin, navModule], -}); diff --git a/packages/e2e-test/src/commands/runCommand.ts b/packages/e2e-test/src/commands/runCommand.ts index 22d0867c4b..a99cee005f 100644 --- a/packages/e2e-test/src/commands/runCommand.ts +++ b/packages/e2e-test/src/commands/runCommand.ts @@ -35,9 +35,9 @@ const ownPaths = findOwnPaths(__dirname); const templatePackagePaths = [ 'packages/cli-module-new/templates/frontend-plugin/package.json.hbs', - 'packages/create-app/templates/next-app/package.json.hbs', - 'packages/create-app/templates/next-app/packages/app/package.json.hbs', - 'packages/create-app/templates/next-app/packages/backend/package.json.hbs', + 'packages/create-app/templates/default-app/package.json.hbs', + 'packages/create-app/templates/default-app/packages/app/package.json.hbs', + 'packages/create-app/templates/default-app/packages/backend/package.json.hbs', ]; export async function runCommand(opts: OptionValues) { From 83624f080b15ea6b3fa88bb166ed51e97a09582c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 18 Mar 2026 17:55:51 +0100 Subject: [PATCH 2/8] Fix broken doc link after template directory rename Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/create-app/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index dca18849c3..d2d898996d 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -7024,7 +7024,7 @@ The `.fromConfig` of the `DefaultCatalogCollator` also now takes a `tokenManager To apply this change to an existing plugin, it is important that all plugins that you are using have already been migrated. In this case the most crucial piece is that no entity page cards of contents may require the `entity` prop, and they must instead consume the entity from context using `useEntity`. - Since this change is large with a lot of repeated changes, we'll describe a couple of common cases rather than the entire change. If your entity pages are unchanged from the `create-app` template, you can also just bring in the latest version directly from the [template itself](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx). + Since this change is large with a lot of repeated changes, we'll describe a couple of common cases rather than the entire change. If your entity pages are unchanged from the `create-app` template, you can also just bring in the latest version directly from the [template itself](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/legacy-app/packages/app/src/components/catalog/EntityPage.tsx). The first step of the change is to change the `packages/app/src/components/catalog/EntityPage.tsx` export to `entityPage` rather than `EntityPage`. This will require an update to `App.tsx`, which is the only change we need to do outside of `EntityPage.tsx`: From d312841559d8075a018e17d1dfaaa494ce7ec822 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 18 Mar 2026 21:18:11 +0100 Subject: [PATCH 3/8] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Patrik Oldsberg --- packages/create-app/src/lib/tasks.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 15b7d59ed7..50f9d18e26 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -276,7 +276,7 @@ describe('tasks', () => { describe('templatingTask', () => { it('should generate a project populating context parameters', async () => { - const templateDir = resolvePath(__dirname, '../../templates/legacy-app'); + const templateDir = resolvePath(__dirname, '../../templates/default-app'); const destinationDir = 'templatedApp'; const context = { name: 'SuperCoolBackstageInstance', From 491297557ea8b7560bf68f3bc509ef66f225a47a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 18 Mar 2026 21:56:10 +0100 Subject: [PATCH 4/8] Add missing package versions to test mock for default-app template The test was updated to use the default-app template (renamed from next-app), but the mock version list was missing packages that this template requires such as @backstage/core-compat-api, @backstage/frontend-defaults, @backstage/frontend-plugin-api, and others. Also sorted the mock entries alphabetically. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/create-app/src/lib/tasks.test.ts | 60 +++++++++++++---------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 50f9d18e26..c16a818187 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -49,42 +49,36 @@ jest.mock('child_process'); jest.mock('./versions', () => ({ packageVersions: { root: '1.2.3', - '@backstage/cli': '1.0.0', - '@backstage/cli-defaults': '1.0.0', + '@backstage/app-defaults': '1.0.0', '@backstage/backend-defaults': '1.0.0', '@backstage/backend-tasks': '1.0.0', - '@backstage/catalog-model': '1.0.0', '@backstage/catalog-client': '1.0.0', + '@backstage/catalog-model': '1.0.0', + '@backstage/cli': '1.0.0', + '@backstage/cli-defaults': '1.0.0', '@backstage/config': '1.0.0', - '@backstage/plugin-app-backend': '1.0.0', - '@backstage/plugin-auth-backend': '1.0.0', - '@backstage/plugin-auth-node': '1.0.0', - '@backstage/plugin-auth-backend-module-github-provider': '1.0.0', - '@backstage/plugin-auth-backend-module-guest-provider': '1.0.0', - '@backstage/plugin-catalog-backend': '1.0.0', - '@backstage/plugin-catalog-backend-module-logs': '1.0.0', - '@backstage/plugin-catalog-backend-module-scaffolder-entity-model': '1.0.0', - '@backstage/plugin-permission-common': '1.0.0', - '@backstage/plugin-permission-node': '1.0.0', - '@backstage/plugin-permission-backend': '1.0.0', - '@backstage/plugin-permission-backend-module-allow-all-policy': '1.0.0', - '@backstage/plugin-proxy-backend': '1.0.0', - '@backstage/plugin-scaffolder-backend': '1.0.0', - '@backstage/plugin-search-backend': '1.0.0', - '@backstage/plugin-search-backend-module-catalog': '1.0.0', - '@backstage/plugin-search-backend-module-pg': '1.0.0', - '@backstage/plugin-search-backend-module-techdocs': '1.0.0', - '@backstage/plugin-search-backend-node': '1.0.0', - '@backstage/plugin-techdocs-backend': '1.0.0', - '@backstage/app-defaults': '1.0.0', '@backstage/core-app-api': '1.0.0', + '@backstage/core-compat-api': '1.0.0', '@backstage/core-components': '1.0.0', '@backstage/core-plugin-api': '1.0.0', '@backstage/e2e-test-utils': '1.0.0', + '@backstage/frontend-defaults': '1.0.0', + '@backstage/frontend-plugin-api': '1.0.0', + '@backstage/frontend-test-utils': '1.0.0', '@backstage/integration-react': '1.0.0', '@backstage/plugin-api-docs': '1.0.0', + '@backstage/plugin-app-backend': '1.0.0', + '@backstage/plugin-app-react': '1.0.0', + '@backstage/plugin-app-visualizer': '1.0.0', '@backstage/plugin-auth': '1.0.0', + '@backstage/plugin-auth-backend': '1.0.0', + '@backstage/plugin-auth-backend-module-github-provider': '1.0.0', + '@backstage/plugin-auth-backend-module-guest-provider': '1.0.0', + '@backstage/plugin-auth-node': '1.0.0', '@backstage/plugin-catalog': '1.0.0', + '@backstage/plugin-catalog-backend': '1.0.0', + '@backstage/plugin-catalog-backend-module-logs': '1.0.0', + '@backstage/plugin-catalog-backend-module-scaffolder-entity-model': '1.0.0', '@backstage/plugin-catalog-common': '1.0.0', '@backstage/plugin-catalog-graph': '1.0.0', '@backstage/plugin-catalog-import': '1.0.0', @@ -95,20 +89,32 @@ jest.mock('./versions', () => ({ '@backstage/plugin-notifications': '1.0.0', '@backstage/plugin-notifications-backend': '1.0.0', '@backstage/plugin-org': '1.0.0', + '@backstage/plugin-permission-backend': '1.0.0', + '@backstage/plugin-permission-backend-module-allow-all-policy': '1.0.0', + '@backstage/plugin-permission-common': '1.0.0', + '@backstage/plugin-permission-node': '1.0.0', + '@backstage/plugin-permission-react': '1.0.0', + '@backstage/plugin-proxy-backend': '1.0.0', '@backstage/plugin-scaffolder': '1.0.0', + '@backstage/plugin-scaffolder-backend': '1.0.0', '@backstage/plugin-scaffolder-backend-module-github': '1.0.0', '@backstage/plugin-scaffolder-backend-module-notifications': '1.0.0', - '@backstage/plugin-permission-react': '1.0.0', '@backstage/plugin-search': '1.0.0', + '@backstage/plugin-search-backend': '1.0.0', + '@backstage/plugin-search-backend-module-catalog': '1.0.0', + '@backstage/plugin-search-backend-module-pg': '1.0.0', + '@backstage/plugin-search-backend-module-techdocs': '1.0.0', + '@backstage/plugin-search-backend-node': '1.0.0', '@backstage/plugin-search-react': '1.0.0', '@backstage/plugin-signals': '1.0.0', '@backstage/plugin-signals-backend': '1.0.0', '@backstage/plugin-techdocs': '1.0.0', - '@backstage/plugin-techdocs-react': '1.0.0', + '@backstage/plugin-techdocs-backend': '1.0.0', '@backstage/plugin-techdocs-module-addons-contrib': '1.0.0', + '@backstage/plugin-techdocs-react': '1.0.0', '@backstage/plugin-user-settings': '1.0.0', - '@backstage/theme': '1.0.0', '@backstage/test-utils': '1.0.0', + '@backstage/theme': '1.0.0', '@backstage/ui': '1.0.0', }, })); From f746ec202a11c24a7e813124953850ec361f8678 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 20 Mar 2026 09:30:06 +0100 Subject: [PATCH 5/8] e2e-test: fix crash when app has no devDependencies Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/e2e-test/src/commands/runCommand.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/e2e-test/src/commands/runCommand.ts b/packages/e2e-test/src/commands/runCommand.ts index a99cee005f..eeb8798776 100644 --- a/packages/e2e-test/src/commands/runCommand.ts +++ b/packages/e2e-test/src/commands/runCommand.ts @@ -344,7 +344,9 @@ async function overrideModuleResolutions(appDir: string, workspaceDir: string) { pkgJson.dependencies[name] = `file:${pkgPath}`; pkgJson.resolutions[name] = `file:${pkgPath}`; - delete pkgJson.devDependencies[name]; + if (pkgJson.devDependencies) { + delete pkgJson.devDependencies[name]; + } } } fs.writeJson(pkgJsonPath, pkgJson, { spaces: 2 }); From 02a0f0dfa0629cace0356ab0d3bfb3c181ff0927 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 30 Mar 2026 17:50:58 +0200 Subject: [PATCH 6/8] Use exact match for sidebar link assertions in E2E template test Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .../default-app/packages/app/e2e-tests/app.test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts index 187e124bfa..d8dbc1faa8 100644 --- a/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts +++ b/packages/create-app/templates/default-app/packages/app/e2e-tests/app.test.ts @@ -24,6 +24,10 @@ test('App should render the welcome page', async ({ page }) => { await enterButton.click(); const nav = page.getByRole('navigation'); - await expect(nav.getByRole('link', { name: 'Catalog' })).toBeVisible(); - await expect(page.getByRole('link', { name: 'APIs' })).toBeVisible(); + await expect( + nav.getByRole('link', { name: 'Catalog', exact: true }), + ).toBeVisible(); + await expect( + page.getByRole('link', { name: 'APIs', exact: true }), + ).toBeVisible(); }); From 7fc1a406d264b3add8225794e10755364551ead7 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 30 Mar 2026 18:36:30 +0200 Subject: [PATCH 7/8] Increase E2E timeouts for default-app template The new frontend system app takes longer to compile and render on Windows CI runners. Switch from port-based to URL-based server readiness detection and increase expect timeout to 30s to avoid flaky failures on slow runners. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .../create-app/templates/default-app/playwright.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/create-app/templates/default-app/playwright.config.ts b/packages/create-app/templates/default-app/playwright.config.ts index 0dc740b466..967bf1b847 100644 --- a/packages/create-app/templates/default-app/playwright.config.ts +++ b/packages/create-app/templates/default-app/playwright.config.ts @@ -24,7 +24,7 @@ export default defineConfig({ timeout: 60_000, expect: { - timeout: 5_000, + timeout: 30_000, }, // Run your local dev server before starting the tests @@ -33,9 +33,9 @@ export default defineConfig({ : [ { command: 'yarn start app', - port: 3000, + url: 'http://localhost:3000', reuseExistingServer: true, - timeout: 60_000, + timeout: 120_000, }, { command: 'yarn start backend', From 6541cbfc5855f1ce681fc36ed6dfbb27d685cd1b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 30 Mar 2026 18:53:29 +0200 Subject: [PATCH 8/8] Remove stray package.json from create-app templates These empty `{}` files were accidentally committed during the template directory rename and override the properly templated package.json generated from package.json.hbs, causing E2E tests to fail. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/create-app/templates/default-app/package.json | 1 - packages/create-app/templates/legacy-app/package.json | 1 - 2 files changed, 2 deletions(-) delete mode 100644 packages/create-app/templates/default-app/package.json delete mode 100644 packages/create-app/templates/legacy-app/package.json diff --git a/packages/create-app/templates/default-app/package.json b/packages/create-app/templates/default-app/package.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/create-app/templates/default-app/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/create-app/templates/legacy-app/package.json b/packages/create-app/templates/legacy-app/package.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/create-app/templates/legacy-app/package.json +++ /dev/null @@ -1 +0,0 @@ -{}