diff --git a/packages/cli/e2e-test/cli-e2e-test.js b/packages/cli/e2e-test/cli-e2e-test.js index 8f518762cd..8a3285c544 100644 --- a/packages/cli/e2e-test/cli-e2e-test.js +++ b/packages/cli/e2e-test/cli-e2e-test.js @@ -246,7 +246,7 @@ async function testAppServe(pluginName, appDir) { try { const browser = new Browser(); - await waitForPageWithText(browser, '/', 'Welcome to Backstage'); + await waitForPageWithText(browser, '/', 'Backstage Service Catalog'); await waitForPageWithText( browser, `/${pluginName}`, diff --git a/packages/create-app/templates/default-app/.gitignore b/packages/create-app/templates/default-app/.gitignore new file mode 100644 index 0000000000..3e786d566e --- /dev/null +++ b/packages/create-app/templates/default-app/.gitignore @@ -0,0 +1,33 @@ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Coverage directory generated when running tests with coverage +coverage + +# Dependencies +node_modules/ + +# Node version directives +.nvmrc + +# dotenv environment variables file +.env +.env.test + +# Build output +dist + +# Temporary change files created by Vim +*.swp + +# MkDocs build output +site + +# Local configuration files +*.local.yaml diff --git a/packages/create-app/templates/default-app/app-config.yaml b/packages/create-app/templates/default-app/app-config.yaml index 9fafbf4d76..49c3dc3691 100644 --- a/packages/create-app/templates/default-app/app-config.yaml +++ b/packages/create-app/templates/default-app/app-config.yaml @@ -24,3 +24,33 @@ techdocs: auth: providers: {} + +catalog: + locations: + # Backstage Example Component + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/playback-order-component.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/podcast-api-component.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/queue-proxy-component.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/searcher-component.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/playback-lib-component.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/www-artist-component.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/shuffle-api-component.yaml + + # Backstage Example Templates + - type: github + target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/react-ssr-template/template.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/springboot-grpc-template/template.yaml + - type: github + target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/create-react-app/template.yaml + - type: github + target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml diff --git a/packages/create-app/templates/default-app/packages/app/cypress/integration/app.js b/packages/create-app/templates/default-app/packages/app/cypress/integration/app.js index 6c561a734c..dde26b7b39 100644 --- a/packages/create-app/templates/default-app/packages/app/cypress/integration/app.js +++ b/packages/create-app/templates/default-app/packages/app/cypress/integration/app.js @@ -1,8 +1,6 @@ describe('App', () => { - it('should render the welcome page', () => { + it('should render the catalog', () => { cy.visit('/'); - cy.contains('Welcome to Backstage'); - cy.contains('Getting Started'); - cy.contains('Quick Links'); + cy.contains('Backstage Service Catalog'); }); }); 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 c3de7ada80..57e705d4fc 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 @@ -5,13 +5,14 @@ "dependencies": { "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "4.0.0-alpha.45", "@backstage/cli": "^{{version}}", "@backstage/core": "^{{version}}", + "@backstage/plugin-catalog": "^{{version}}", + "@backstage/plugin-register-component": "^{{version}}", + "@backstage/plugin-scaffolder": "^{{version}}", "@backstage/test-utils": "^{{version}}", "@backstage/theme": "^{{version}}", "history": "^5.0.0", - "plugin-welcome": "0.0.0", "react": "^16.13.1", "react-dom": "^16.13.1", "react-router": "6.0.0-beta.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 b94eab587f..a05924ee00 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 @@ -10,6 +10,7 @@ describe('App', () => { { data: { app: { title: 'Test' }, + backend: { baseUrl: 'http://localhost:7000' }, }, context: 'test', }, 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 8a0aedca2e..c96bd9d05e 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,8 +1,16 @@ -import { createApp } from '@backstage/core'; import React, { FC } from 'react'; +import { + createApp, + AlertDisplay, + OAuthRequestDialog, + SidebarPage, +} from '@backstage/core'; +import { apis } from './apis'; import * as plugins from './plugins'; +import { AppSidebar } from './sidebar'; const app = createApp({ + apis, plugins: Object.values(plugins), }); @@ -12,8 +20,13 @@ const AppRoutes = app.getRoutes(); const App: FC<{}> = () => ( + + - + + + + ); diff --git a/packages/create-app/templates/default-app/packages/app/src/apis.ts b/packages/create-app/templates/default-app/packages/app/src/apis.ts new file mode 100644 index 0000000000..35f3e076d6 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app/src/apis.ts @@ -0,0 +1,53 @@ +import { + ApiRegistry, + alertApiRef, + errorApiRef, + AlertApiForwarder, + ConfigApi, + ErrorApiForwarder, + ErrorAlerter, + oauthRequestApiRef, + OAuthRequestManager, + storageApiRef, + WebStorage, +} from '@backstage/core'; + +import { catalogApiRef, CatalogClient } from '@backstage/plugin-catalog'; + +import { scaffolderApiRef, ScaffolderApi } from '@backstage/plugin-scaffolder'; + +export const apis = (config: ConfigApi) => { + // eslint-disable-next-line no-console + console.log(`Creating APIs for ${config.getString('app.title')}`); + + const backendUrl = config.getString('backend.baseUrl'); + + const builder = ApiRegistry.builder(); + + const alertApi = builder.add(alertApiRef, new AlertApiForwarder()); + const errorApi = builder.add( + errorApiRef, + new ErrorAlerter(alertApi, new ErrorApiForwarder()), + ); + + builder.add(storageApiRef, WebStorage.create({ errorApi })); + builder.add(oauthRequestApiRef, new OAuthRequestManager()); + + builder.add( + catalogApiRef, + new CatalogClient({ + apiOrigin: backendUrl, + basePath: '/catalog', + }), + ); + + builder.add( + scaffolderApiRef, + new ScaffolderApi({ + apiOrigin: backendUrl, + basePath: '/scaffolder/v1', + }), + ); + + return builder.build(); +}; diff --git a/packages/create-app/templates/default-app/packages/app/src/plugins.ts b/packages/create-app/templates/default-app/packages/app/src/plugins.ts index 000bd79f3e..4063fb509b 100644 --- a/packages/create-app/templates/default-app/packages/app/src/plugins.ts +++ b/packages/create-app/templates/default-app/packages/app/src/plugins.ts @@ -1 +1,3 @@ -export { plugin as WelcomePlugin } from 'plugin-welcome'; +export { plugin as CatalogPlugin } from '@backstage/plugin-catalog'; +export { plugin as RegisterComponent } from '@backstage/plugin-register-component'; +export { plugin as ScaffolderPlugin } from '@backstage/plugin-scaffolder'; diff --git a/packages/create-app/templates/default-app/packages/app/src/sidebar.tsx b/packages/create-app/templates/default-app/packages/app/src/sidebar.tsx new file mode 100644 index 0000000000..1ced85cff2 --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app/src/sidebar.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import HomeIcon from '@material-ui/icons/Home'; +import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; +import { + Sidebar, + SidebarItem, + SidebarDivider, + SidebarSpace, + SidebarUserSettings, + SidebarThemeToggle, + SidebarPinButton, +} from '@backstage/core'; + +export const AppSidebar = () => ( + + + {/* Global nav, not org-specific */} + + + {/* End global nav */} + + + + + + + +); diff --git a/packages/create-app/templates/default-app/plugins/welcome/.eslintrc.js b/packages/create-app/templates/default-app/plugins/welcome/.eslintrc.js deleted file mode 100644 index 13573efa9c..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: [require.resolve('@backstage/cli/config/eslint')], -}; diff --git a/packages/create-app/templates/default-app/plugins/welcome/README.md b/packages/create-app/templates/default-app/plugins/welcome/README.md deleted file mode 100644 index e9b9dd0edf..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Title - -Welcome to the welcome plugin! diff --git a/packages/create-app/templates/default-app/plugins/welcome/dev/index.tsx b/packages/create-app/templates/default-app/plugins/welcome/dev/index.tsx deleted file mode 100644 index 6fce113093..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/dev/index.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { createDevApp } from '@backstage/dev-utils'; -import { plugin } from '../src/plugin'; - -createDevApp().registerPlugin(plugin).render(); diff --git a/packages/create-app/templates/default-app/plugins/welcome/package.json.hbs b/packages/create-app/templates/default-app/plugins/welcome/package.json.hbs deleted file mode 100644 index 77e57c1a7c..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/package.json.hbs +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "plugin-welcome", - "version": "0.0.0", - "main": "src/index.ts", - "types": "src/index.ts", - "private": true, - "publishConfig": { - "main": "dist/index.esm.js", - "types": "dist/index.d.ts" - }, - "scripts": { - "build": "backstage-cli plugin:build", - "start": "backstage-cli plugin:serve", - "lint": "backstage-cli lint", - "test": "backstage-cli test", - "diff": "backstage-cli plugin:diff", - "prepack": "backstage-cli prepack", - "postpack": "backstage-cli postpack", - "clean": "backstage-cli clean" - }, - "dependencies": { - "@backstage/core": "^{{version}}", - "@backstage/theme": "^{{version}}", - "@material-ui/core": "^4.9.1", - "@material-ui/icons": "^4.9.1", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-use": "^15.3.3", - "react-router-dom": "6.0.0-beta.0" - }, - "devDependencies": { - "@backstage/cli": "^{{version}}", - "@backstage/dev-utils": "^{{version}}", - "@testing-library/jest-dom": "^5.10.1", - "@testing-library/react": "^10.4.1", - "jest-fetch-mock": "^3.0.3" - }, - "files": [ - "dist" - ] -} diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/components/Timer/Timer.tsx b/packages/create-app/templates/default-app/plugins/welcome/src/components/Timer/Timer.tsx deleted file mode 100644 index 24c79f91ee..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/components/Timer/Timer.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import React, { FC } from 'react'; -import { HeaderLabel } from '@backstage/core'; - -const timeFormat = { hour: '2-digit', minute: '2-digit' }; -const utcOptions = { timeZone: 'UTC', ...timeFormat }; -const nycOptions = { timeZone: 'America/New_York', ...timeFormat }; -const tyoOptions = { timeZone: 'Asia/Tokyo', ...timeFormat }; -const stoOptions = { timeZone: 'Europe/Stockholm', ...timeFormat }; - -const defaultTimes = { - timeNY: '', - timeUTC: '', - timeTYO: '', - timeSTO: '', -}; - -function getTimes() { - const d = new Date(); - const lang = window.navigator.language; - - // Using the browser native toLocaleTimeString instead of huge moment-tz - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString - const timeNY = d.toLocaleTimeString(lang, nycOptions); - const timeUTC = d.toLocaleTimeString(lang, utcOptions); - const timeTYO = d.toLocaleTimeString(lang, tyoOptions); - const timeSTO = d.toLocaleTimeString(lang, stoOptions); - - return { timeNY, timeUTC, timeTYO, timeSTO }; -} - -const HomePageTimer: FC<{}> = () => { - const [{ timeNY, timeUTC, timeTYO, timeSTO }, setTimes] = React.useState( - defaultTimes, - ); - - React.useEffect(() => { - setTimes(getTimes()); - - const intervalId = setInterval(() => { - setTimes(getTimes()); - }, 1000); - - return () => { - clearInterval(intervalId); - }; - }, []); - - return ( - <> - - - - - - ); -}; - -export default HomePageTimer; diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/components/Timer/index.ts b/packages/create-app/templates/default-app/plugins/welcome/src/components/Timer/index.ts deleted file mode 100644 index f1fc55bfe9..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/components/Timer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Timer'; diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/WelcomePage.test.tsx b/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/WelcomePage.test.tsx deleted file mode 100644 index 27e44a3f75..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/WelcomePage.test.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import WelcomePage from './WelcomePage'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; - -describe('WelcomePage', () => { - it('should render', () => { - const rendered = render( - - - , - ); - expect(rendered.baseElement).toBeInTheDocument(); - }); -}); diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/WelcomePage.tsx b/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/WelcomePage.tsx deleted file mode 100644 index 31c1c0f3e2..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/WelcomePage.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import React, { FC } from 'react'; -import { Link as RouterLink } from 'react-router-dom'; -import { - Typography, - Grid, - List, - ListItem, - ListItemText, - Link, -} from '@material-ui/core'; -import Timer from '../Timer'; -import { - Content, - InfoCard, - Header, - Page, - pageTheme, - ContentHeader, - SupportButton, -} from '@backstage/core'; - -const WelcomePage: FC<{}> = () => { - const profile = { givenName: '' }; - - return ( - -
- -
- - - - - - - - - You now have a running instance of Backstage! - - 🎉 - - Let's make sure you get the most out of this platform by walking - you through the basics. - - - The Setup - - - Backstage is put together from three base concepts: the core, - the app and the plugins. - - - - - - - - - - - - - - Try It Out - - - We suggest you either check out the documentation for{' '} - - creating a plugin - {' '} - or have a look in the code for the{' '} - - Home Page - {' '} - in the directory "plugins/home-page/src". - - - - - - Quick Links - - - backstage.io - - - - Create a plugin - - - - - - - -
- ); -}; - -export default WelcomePage; diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/index.ts b/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/index.ts deleted file mode 100644 index b031301e7e..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/components/WelcomePage/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './WelcomePage'; diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/index.ts b/packages/create-app/templates/default-app/plugins/welcome/src/index.ts deleted file mode 100644 index 99edba26c3..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { plugin } from './plugin'; diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/plugin.test.ts b/packages/create-app/templates/default-app/plugins/welcome/src/plugin.test.ts deleted file mode 100644 index f5bf8e68c3..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/plugin.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { plugin } from './plugin'; - -describe('welcome', () => { - it('should export plugin', () => { - expect(plugin).toBeDefined(); - }); -}); diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/plugin.ts b/packages/create-app/templates/default-app/plugins/welcome/src/plugin.ts deleted file mode 100644 index a65fad5348..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/plugin.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createPlugin } from '@backstage/core'; -import WelcomePage from './components/WelcomePage'; - -export const plugin = createPlugin({ - id: 'welcome', - register({ router }) { - router.registerRoute('/', WelcomePage); - }, -}); diff --git a/packages/create-app/templates/default-app/plugins/welcome/src/setupTests.ts b/packages/create-app/templates/default-app/plugins/welcome/src/setupTests.ts deleted file mode 100644 index 7b0828bfa8..0000000000 --- a/packages/create-app/templates/default-app/plugins/welcome/src/setupTests.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom'; diff --git a/packages/create-app/templates/default-app/tsconfig.json b/packages/create-app/templates/default-app/tsconfig.json index 9dbc3bbe27..cccc375f63 100644 --- a/packages/create-app/templates/default-app/tsconfig.json +++ b/packages/create-app/templates/default-app/tsconfig.json @@ -9,6 +9,7 @@ "exclude": ["node_modules"], "compilerOptions": { "outDir": "dist", + "rootDir": ".", "skipLibCheck": true } } diff --git a/tsconfig.json b/tsconfig.json index 1a6128b5c9..7ea674798c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "plugins/*/migrations" ], "compilerOptions": { - "outDir": "dist" + "outDir": "dist", + "rootDir": "." } }