diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 53cad8b9d7..c5d5092410 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -267,7 +267,7 @@ describe('tasks', () => { }); describe('templatingTask', () => { - it('should generate a project and populate context parameters', async () => { + it('should generate a project populating context parameters', async () => { const templateDir = resolvePath(__dirname, '../../templates/default-app'); const destinationDir = 'templatedApp'; const context = { @@ -291,20 +291,6 @@ describe('tasks', () => { fs.readFile('templatedApp/packages/backend/package.json', 'utf-8'), ).resolves.toContain('sqlite3"'); }); - - it('should generate a project and skip excluded directories', async () => { - const templateDir = resolvePath(__dirname, '../../templates/default-app'); - const destinationDir = 'templatedApp'; - const context = { name: 'Backstage', dbTypeSqlite: true }; - const excludedDirs = ['packages/app-next']; - await templatingTask(templateDir, destinationDir, context, excludedDirs); - expect(fs.existsSync('templatedApp/packages/app/package.json')).toBe( - true, - ); - expect(fs.existsSync('templatedApp/packages/app-next/package.json')).toBe( - false, - ); - }); }); describe('readGitConfig', () => { diff --git a/packages/create-app/templates/default-app/packages/app-next/.eslintignore b/packages/create-app/templates/default-app/packages/app-next/.eslintignore new file mode 100644 index 0000000000..a48cf0de7a --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/.eslintignore @@ -0,0 +1 @@ +public diff --git a/packages/create-app/templates/default-app/packages/app-next/.eslintrc.js.hbs b/packages/create-app/templates/default-app/packages/app-next/.eslintrc.js.hbs new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/.eslintrc.js.hbs @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/create-app/templates/default-app/packages/app-next/e2e-tests/app.test.ts b/packages/create-app/templates/default-app/packages/app-next/e2e-tests/app.test.ts new file mode 100644 index 0000000000..839ff883de --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/e2e-tests/app.test.ts @@ -0,0 +1,27 @@ +/* + * Copyright 2020 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 { test, expect } from '@playwright/test'; + +test('App should render the welcome page', async ({ page }) => { + await page.goto('/'); + + const enterButton = page.getByRole('button', { name: 'Enter' }); + await expect(enterButton).toBeVisible(); + await enterButton.click(); + + await expect(page.getByText('My Company Catalog')).toBeVisible(); +}); diff --git a/packages/create-app/templates/default-app/packages/app-next/package.json.hbs b/packages/create-app/templates/default-app/packages/app-next/package.json.hbs new file mode 100644 index 0000000000..0a0458cbc2 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/package.json.hbs @@ -0,0 +1,49 @@ +{ + "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/frontend-defaults": "^{{version '@backstage/app-defaults'}}", + "@backstage/plugin-catalog": "^{{version '@backstage/plugin-catalog'}}", + "react": "^18.0.2", + "react-dom": "^18.0.2", + "react-router": "^6.3.0", + "react-router-dom": "^6.3.0" + }, + "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/default-app/packages/app-next/public/android-chrome-192x192.png b/packages/create-app/templates/default-app/packages/app-next/public/android-chrome-192x192.png new file mode 100644 index 0000000000..eec0ae25b9 Binary files /dev/null and b/packages/create-app/templates/default-app/packages/app-next/public/android-chrome-192x192.png differ diff --git a/packages/create-app/templates/default-app/packages/app-next/public/apple-touch-icon.png b/packages/create-app/templates/default-app/packages/app-next/public/apple-touch-icon.png new file mode 100644 index 0000000000..3158830ac7 Binary files /dev/null and b/packages/create-app/templates/default-app/packages/app-next/public/apple-touch-icon.png differ diff --git a/packages/create-app/templates/default-app/packages/app-next/public/favicon-16x16.png b/packages/create-app/templates/default-app/packages/app-next/public/favicon-16x16.png new file mode 100644 index 0000000000..58cf61a35e Binary files /dev/null and b/packages/create-app/templates/default-app/packages/app-next/public/favicon-16x16.png differ diff --git a/packages/create-app/templates/default-app/packages/app-next/public/favicon-32x32.png b/packages/create-app/templates/default-app/packages/app-next/public/favicon-32x32.png new file mode 100644 index 0000000000..c0915ece75 Binary files /dev/null and b/packages/create-app/templates/default-app/packages/app-next/public/favicon-32x32.png differ diff --git a/packages/create-app/templates/default-app/packages/app-next/public/favicon.ico b/packages/create-app/templates/default-app/packages/app-next/public/favicon.ico new file mode 100644 index 0000000000..5e45e5dfbd Binary files /dev/null and b/packages/create-app/templates/default-app/packages/app-next/public/favicon.ico differ diff --git a/packages/create-app/templates/default-app/packages/app-next/public/index.html b/packages/create-app/templates/default-app/packages/app-next/public/index.html new file mode 100644 index 0000000000..18da7c4773 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/public/index.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + <%= config.getOptionalString('app.title') ?? 'Backstage' %> + + + +
+ + + diff --git a/packages/create-app/templates/default-app/packages/app-next/public/manifest.json b/packages/create-app/templates/default-app/packages/app-next/public/manifest.json new file mode 100644 index 0000000000..4a7c1b4ec4 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Backstage", + "name": "Backstage", + "icons": [ + { + "src": "favicon.ico", + "sizes": "48x48", + "type": "image/png" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/packages/create-app/templates/default-app/packages/app-next/public/robots.txt b/packages/create-app/templates/default-app/packages/app-next/public/robots.txt new file mode 100644 index 0000000000..01b0f9a107 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/public/robots.txt @@ -0,0 +1,2 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * diff --git a/packages/create-app/templates/default-app/packages/app-next/public/safari-pinned-tab.svg b/packages/create-app/templates/default-app/packages/app-next/public/safari-pinned-tab.svg new file mode 100644 index 0000000000..0f500b3002 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/public/safari-pinned-tab.svg @@ -0,0 +1 @@ +Created by potrace 1.11, written by Peter Selinger 2001-2013 \ No newline at end of file diff --git a/packages/create-app/templates/default-app/packages/app-next/src/App.test.tsx b/packages/create-app/templates/default-app/packages/app-next/src/App.test.tsx new file mode 100644 index 0000000000..98e7a6438d --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/src/App.test.tsx @@ -0,0 +1,28 @@ +import { render, waitFor } from '@testing-library/react'; +import App from './App'; + +describe('App', () => { + it('should render', async () => { + process.env = { + NODE_ENV: 'test', + APP_CONFIG: [ + { + data: { + app: { title: 'Test' }, + backend: { baseUrl: 'http://localhost:7007' }, + techdocs: { + storageUrl: 'http://localhost:7007/api/techdocs/static/docs', + }, + }, + context: 'test', + }, + ] as any, + }; + + const rendered = render(App.createRoot()); + + await waitFor(() => { + expect(rendered.baseElement).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/create-app/templates/default-app/packages/app-next/src/App.tsx b/packages/create-app/templates/default-app/packages/app-next/src/App.tsx new file mode 100644 index 0000000000..9607e9a101 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/src/App.tsx @@ -0,0 +1,9 @@ +import { createApp } from '@backstage/frontend-defaults'; +import catalogPlugin from '@backstage/plugin-catalog/alpha'; + +export default createApp({ + features: [ + catalogPlugin, + ], +}); + diff --git a/packages/create-app/templates/default-app/packages/app-next/src/index.tsx b/packages/create-app/templates/default-app/packages/app-next/src/index.tsx new file mode 100644 index 0000000000..ac9e52bdc1 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/src/index.tsx @@ -0,0 +1,6 @@ +import '@backstage/cli/asset-types'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import '@backstage/ui/css/styles.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render(App.createRoot()); diff --git a/packages/create-app/templates/default-app/packages/app-next/src/modules/app.tsx b/packages/create-app/templates/default-app/packages/app-next/src/modules/app.tsx new file mode 100644 index 0000000000..8c90362dd8 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/src/modules/app.tsx @@ -0,0 +1,16 @@ +import { coreExtensionData, createFrontendModule } from "@backstage/frontend-plugin-api"; +import appPlugin from "@backstage/plugin-app"; + +export const appModule = createFrontendModule({ + pluginId: 'app', + extensions: [ + appPlugin.getExtension('app/nav').override({ + factory: () => [ + coreExtensionData.reactElement( + // todo: sidebar +
+ ) + ] + }) + ] +}) \ No newline at end of file diff --git a/packages/create-app/templates/default-app/packages/app-next/src/setupTests.ts b/packages/create-app/templates/default-app/packages/app-next/src/setupTests.ts new file mode 100644 index 0000000000..7b0828bfa8 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app-next/src/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom';