From 2283fd92fc0c71163f447dc21fc32cb7656215dd Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 27 Oct 2020 17:03:13 +0100 Subject: [PATCH 1/6] create-app: decouple versions --- packages/create-app/package.json | 24 ++++++ packages/create-app/src/createApp.ts | 4 +- packages/create-app/src/lib/tasks.ts | 15 +++- packages/create-app/src/versions.ts | 82 +++++++++++++++++++ .../templates/default-app/package.json.hbs | 2 +- .../default-app/packages/app/package.json.hbs | 32 ++++---- .../packages/backend/package.json.hbs | 20 ++--- 7 files changed, 149 insertions(+), 30 deletions(-) create mode 100644 packages/create-app/src/versions.ts diff --git a/packages/create-app/package.json b/packages/create-app/package.json index ff9e1fa636..0dd8897d0b 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -37,6 +37,30 @@ "recursive-readdir": "^2.2.2" }, "devDependencies": { + "@backstage/backend-common": "^0.1.1-alpha.25", + "@backstage/catalog-model": "^0.1.1-alpha.25", + "@backstage/cli": "^0.1.1-alpha.25", + "@backstage/config": "^0.1.1-alpha.25", + "@backstage/core": "^0.1.1-alpha.25", + "@backstage/plugin-api-docs": "^0.1.1-alpha.25", + "@backstage/plugin-auth-backend": "^0.1.1-alpha.25", + "@backstage/plugin-catalog": "^0.1.1-alpha.25", + "@backstage/plugin-catalog-backend": "^0.1.1-alpha.25", + "@backstage/plugin-circleci": "^0.1.1-alpha.25", + "@backstage/plugin-explore": "^0.1.1-alpha.25", + "@backstage/plugin-github-actions": "^0.1.1-alpha.25", + "@backstage/plugin-lighthouse": "^0.1.1-alpha.25", + "@backstage/plugin-proxy-backend": "^0.1.1-alpha.25", + "@backstage/plugin-register-component": "^0.1.1-alpha.25", + "@backstage/plugin-rollbar-backend": "^0.1.1-alpha.25", + "@backstage/plugin-scaffolder": "^0.1.1-alpha.25", + "@backstage/plugin-scaffolder-backend": "^0.1.1-alpha.25", + "@backstage/plugin-tech-radar": "^0.1.1-alpha.25", + "@backstage/plugin-techdocs": "^0.1.1-alpha.25", + "@backstage/plugin-techdocs-backend": "^0.1.1-alpha.25", + "@backstage/plugin-user-settings": "^0.1.1-alpha.25", + "@backstage/test-utils": "^0.1.1-alpha.25", + "@backstage/theme": "^0.1.1-alpha.25", "@types/fs-extra": "^9.0.1", "@types/inquirer": "^7.3.1", "@types/ora": "^3.2.0", diff --git a/packages/create-app/src/createApp.ts b/packages/create-app/src/createApp.ts index 83e052c91b..c0874d4032 100644 --- a/packages/create-app/src/createApp.ts +++ b/packages/create-app/src/createApp.ts @@ -22,7 +22,7 @@ import inquirer, { Answers, Question } from 'inquirer'; import { exec as execCb } from 'child_process'; import { resolve as resolvePath } from 'path'; import { findPaths } from '@backstage/cli-common'; -import { version } from '../package.json'; +import { versions } from './versions'; import os from 'os'; import { Task, templatingTask } from './lib/tasks'; @@ -133,7 +133,7 @@ export default async (cmd: Command): Promise => { await createTemporaryAppFolder(tempDir); Task.section('Preparing files'); - await templatingTask(templateDir, tempDir, { ...answers, version }); + await templatingTask(templateDir, tempDir, answers, versions); Task.section('Moving to final location'); await moveApp(tempDir, appDir, answers.name); diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts index 0753301b78..73db175709 100644 --- a/packages/create-app/src/lib/tasks.ts +++ b/packages/create-app/src/lib/tasks.ts @@ -68,6 +68,7 @@ export async function templatingTask( templateDir: string, destinationDir: string, context: any, + versions: { [name: string]: string }, ) { const files = await recursive(templateDir).catch(error => { throw new Error(`Failed to read template directory: ${error.message}`); @@ -83,7 +84,19 @@ export async function templatingTask( const template = await fs.readFile(file); const compiled = handlebars.compile(template.toString()); - const contents = compiled({ name: basename(destination), ...context }); + const contents = compiled( + { name: basename(destination), ...context }, + { + helpers: { + version(name: string) { + if (versions[name]) { + return versions[name]; + } + throw new Error(`No version available for package ${name}`); + }, + }, + }, + ); await fs.writeFile(destination, contents).catch(error => { throw new Error( diff --git a/packages/create-app/src/versions.ts b/packages/create-app/src/versions.ts new file mode 100644 index 0000000000..ed03903469 --- /dev/null +++ b/packages/create-app/src/versions.ts @@ -0,0 +1,82 @@ +/* + * Copyright 2020 Spotify AB + * + * 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. + */ + +/* eslint-disable import/no-extraneous-dependencies,monorepo/no-internal-import */ + +/* +This is a list of all packages used by the template. If dependencies are added or removed, +this list should be updated as well. + +The list, and the accompanying devDependencies entries, are here to ensure correct versioning +and bumping of this package. Without this list the version would not be bumped unless we +manually trigger a release. + +This does not create an actual dependency on these packages and does not bring in any code. +Rollup will extract the value of the version field in each package at build time without +leaving any imports in place. +*/ + +import { version as backendCommon } from '@backstage/backend-common/package.json'; +import { version as catalogModel } from '@backstage/catalog-model/package.json'; +import { version as cli } from '@backstage/cli/package.json'; +import { version as config } from '@backstage/config/package.json'; +import { version as core } from '@backstage/core/package.json'; +import { version as pluginApiDocs } from '@backstage/plugin-api-docs/package.json'; +import { version as pluginAuthBackend } from '@backstage/plugin-auth-backend/package.json'; +import { version as pluginCatalog } from '@backstage/plugin-catalog/package.json'; +import { version as pluginCatalogBackend } from '@backstage/plugin-catalog-backend/package.json'; +import { version as pluginCircleci } from '@backstage/plugin-circleci/package.json'; +import { version as pluginExplore } from '@backstage/plugin-explore/package.json'; +import { version as pluginGithubActions } from '@backstage/plugin-github-actions/package.json'; +import { version as pluginLighthouse } from '@backstage/plugin-lighthouse/package.json'; +import { version as pluginProxyBackend } from '@backstage/plugin-proxy-backend/package.json'; +import { version as pluginRegisterComponent } from '@backstage/plugin-register-component/package.json'; +import { version as pluginRollbarBackend } from '@backstage/plugin-rollbar-backend/package.json'; +import { version as pluginScaffolder } from '@backstage/plugin-scaffolder/package.json'; +import { version as pluginScaffolderBackend } from '@backstage/plugin-scaffolder-backend/package.json'; +import { version as pluginTechRadar } from '@backstage/plugin-tech-radar/package.json'; +import { version as pluginTechdocs } from '@backstage/plugin-techdocs/package.json'; +import { version as pluginTechdocsBackend } from '@backstage/plugin-techdocs-backend/package.json'; +import { version as pluginUserSettings } from '@backstage/plugin-user-settings/package.json'; +import { version as testUtils } from '@backstage/test-utils/package.json'; +import { version as theme } from '@backstage/theme/package.json'; + +export const versions = { + '@backstage/backend-common': backendCommon, + '@backstage/catalog-model': catalogModel, + '@backstage/cli': cli, + '@backstage/config': config, + '@backstage/core': core, + '@backstage/plugin-api-docs': pluginApiDocs, + '@backstage/plugin-auth-backend': pluginAuthBackend, + '@backstage/plugin-catalog': pluginCatalog, + '@backstage/plugin-catalog-backend': pluginCatalogBackend, + '@backstage/plugin-circleci': pluginCircleci, + '@backstage/plugin-explore': pluginExplore, + '@backstage/plugin-github-actions': pluginGithubActions, + '@backstage/plugin-lighthouse': pluginLighthouse, + '@backstage/plugin-proxy-backend': pluginProxyBackend, + '@backstage/plugin-register-component': pluginRegisterComponent, + '@backstage/plugin-rollbar-backend': pluginRollbarBackend, + '@backstage/plugin-scaffolder': pluginScaffolder, + '@backstage/plugin-scaffolder-backend': pluginScaffolderBackend, + '@backstage/plugin-tech-radar': pluginTechRadar, + '@backstage/plugin-techdocs': pluginTechdocs, + '@backstage/plugin-techdocs-backend': pluginTechdocsBackend, + '@backstage/plugin-user-settings': pluginUserSettings, + '@backstage/test-utils': testUtils, + '@backstage/theme': theme, +}; diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 27606640f3..b9fb0f3744 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -26,7 +26,7 @@ ] }, "devDependencies": { - "@backstage/cli": "^{{version}}", + "@backstage/cli": "^{{version '@backstage/cli'}}", "@spotify/prettier-config": "^7.0.0", "lerna": "^3.20.2", "prettier": "^1.19.1" 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 103e75f6e0..fd0d5cbf36 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 @@ -6,22 +6,22 @@ "dependencies": { "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.9.1", - "@backstage/cli": "^{{version}}", - "@backstage/core": "^{{version}}", - "@backstage/plugin-api-docs": "^{{version}}", - "@backstage/plugin-catalog": "^{{version}}", - "@backstage/plugin-register-component": "^{{version}}", - "@backstage/plugin-scaffolder": "^{{version}}", - "@backstage/plugin-techdocs": "^{{version}}", - "@backstage/catalog-model": "^{{version}}", - "@backstage/plugin-circleci": "^{{version}}", - "@backstage/plugin-explore": "^{{version}}", - "@backstage/plugin-lighthouse": "^{{version}}", - "@backstage/plugin-tech-radar": "^{{version}}", - "@backstage/plugin-github-actions": "^{{version}}", - "@backstage/plugin-user-settings": "^{{version}}", - "@backstage/test-utils": "^{{version}}", - "@backstage/theme": "^{{version}}", + "@backstage/cli": "^{{version '@backstage/cli'}}", + "@backstage/core": "^{{version '@backstage/core'}}", + "@backstage/plugin-api-docs": "^{{version '@backstage/plugin-api-docs'}}", + "@backstage/plugin-catalog": "^{{version '@backstage/plugin-catalog'}}", + "@backstage/plugin-register-component": "^{{version '@backstage/plugin-register-component'}}", + "@backstage/plugin-scaffolder": "^{{version '@backstage/plugin-scaffolder'}}", + "@backstage/plugin-techdocs": "^{{version '@backstage/plugin-techdocs'}}", + "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}", + "@backstage/plugin-circleci": "^{{version '@backstage/plugin-circleci'}}", + "@backstage/plugin-explore": "^{{version '@backstage/plugin-explore'}}", + "@backstage/plugin-lighthouse": "^{{version '@backstage/plugin-lighthouse'}}", + "@backstage/plugin-tech-radar": "^{{version '@backstage/plugin-tech-radar'}}", + "@backstage/plugin-github-actions": "^{{version '@backstage/plugin-github-actions'}}", + "@backstage/plugin-user-settings": "^{{version '@backstage/plugin-user-settings'}}", + "@backstage/test-utils": "^{{version '@backstage/test-utils'}}", + "@backstage/theme": "^{{version '@backstage/theme'}}", "history": "^5.0.0", "react": "^16.13.1", "react-dom": "^16.13.1", diff --git a/packages/create-app/templates/default-app/packages/backend/package.json.hbs b/packages/create-app/templates/default-app/packages/backend/package.json.hbs index 7f811e3739..dde04868b9 100644 --- a/packages/create-app/templates/default-app/packages/backend/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/backend/package.json.hbs @@ -17,15 +17,15 @@ "migrate:create": "knex migrate:make -x ts" }, "dependencies": { - "@backstage/backend-common": "^{{version}}", - "@backstage/catalog-model": "^{{version}}", - "@backstage/config": "^{{version}}", - "@backstage/plugin-auth-backend": "^{{version}}", - "@backstage/plugin-catalog-backend": "^{{version}}", - "@backstage/plugin-proxy-backend": "^{{version}}", - "@backstage/plugin-rollbar-backend": "^{{version}}", - "@backstage/plugin-scaffolder-backend": "^{{version}}", - "@backstage/plugin-techdocs-backend": "^{{version}}", + "@backstage/backend-common": "^{{version '@backstage/backend-common'}}", + "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}", + "@backstage/config": "^{{version '@backstage/config'}}", + "@backstage/plugin-auth-backend": "^{{version '@backstage/plugin-auth-backend'}}", + "@backstage/plugin-catalog-backend": "^{{version '@backstage/plugin-catalog-backend'}}", + "@backstage/plugin-proxy-backend": "^{{version '@backstage/plugin-proxy-backend'}}", + "@backstage/plugin-rollbar-backend": "^{{version '@backstage/plugin-rollbar-backend'}}", + "@backstage/plugin-scaffolder-backend": "^{{version '@backstage/plugin-scaffolder-backend'}}", + "@backstage/plugin-techdocs-backend": "^{{version '@backstage/plugin-techdocs-backend'}}", "@octokit/rest": "^18.0.0", "@gitbeaker/node": "^23.5.0", "dockerode": "^3.2.0", @@ -41,7 +41,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^{{version}}", + "@backstage/cli": "^{{version '@backstage/cli'}}", "@types/dockerode": "^2.5.32", "@types/express": "^4.17.6", "@types/express-serve-static-core": "^4.17.5", From 2711b9da42d62f61bfbe951f5918827138a58337 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 27 Oct 2020 18:22:21 +0100 Subject: [PATCH 2/6] cli: decouple template versions from cli version --- packages/cli/package.json | 7 ++++ .../commands/create-plugin/createPlugin.ts | 26 ++++++++------- packages/cli/src/commands/plugin/diff.ts | 14 +++----- packages/cli/src/lib/diff/read.ts | 12 ++++++- packages/cli/src/lib/tasks.test.ts | 16 +++++++--- packages/cli/src/lib/tasks.ts | 15 ++++++++- packages/cli/src/lib/version.ts | 32 +++++++++++++++++++ .../default-backend-plugin/package.json.hbs | 8 ++--- .../templates/default-plugin/package.json.hbs | 12 +++---- 9 files changed, 105 insertions(+), 37 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 8a330d861b..89c0520b59 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -108,6 +108,13 @@ "yn": "^4.0.0" }, "devDependencies": { + "@backstage/backend-common": "^0.1.1-alpha.25", + "@backstage/cli": "^0.1.1-alpha.25", + "@backstage/config": "^0.1.1-alpha.25", + "@backstage/core": "^0.1.1-alpha.25", + "@backstage/dev-utils": "^0.1.1-alpha.25", + "@backstage/test-utils": "^0.1.1-alpha.25", + "@backstage/theme": "^0.1.1-alpha.25", "@types/diff": "^4.0.2", "@types/fs-extra": "^9.0.1", "@types/html-webpack-plugin": "^3.2.2", diff --git a/packages/cli/src/commands/create-plugin/createPlugin.ts b/packages/cli/src/commands/create-plugin/createPlugin.ts index 057e36ceb9..b603e732b8 100644 --- a/packages/cli/src/commands/create-plugin/createPlugin.ts +++ b/packages/cli/src/commands/create-plugin/createPlugin.ts @@ -28,8 +28,8 @@ import { getCodeownersFilePath, } from '../../lib/codeowners'; import { paths } from '../../lib/paths'; +import { versions } from '../../lib/version'; import { Task, templatingTask } from '../../lib/tasks'; -import { version as backstageVersion } from '../../lib/version'; const exec = promisify(execCb); @@ -243,7 +243,7 @@ export default async (cmd: Command) => { ? paths.resolveTargetRoot('plugins', pluginId) : paths.resolveTargetRoot(pluginId); const ownerIds = parseOwnerIds(answers.owner); - const { version } = isMonoRepo + const { version: pluginVersion } = isMonoRepo ? await fs.readJson(paths.resolveTargetRoot('lerna.json')) : { version: '0.1.0' }; @@ -259,14 +259,18 @@ export default async (cmd: Command) => { Task.section('Preparing files'); - await templatingTask(templateDir, tempDir, { - ...answers, - version, - backstageVersion, - name, - privatePackage, - npmRegistry, - }); + await templatingTask( + templateDir, + tempDir, + { + ...answers, + pluginVersion, + name, + privatePackage, + npmRegistry, + }, + versions, + ); Task.section('Moving to final location'); await movePlugin(tempDir, pluginDir, pluginId); @@ -276,7 +280,7 @@ export default async (cmd: Command) => { if ((await fs.pathExists(appPackage)) && !cmd.backend) { Task.section('Adding plugin as dependency in app'); - await addPluginDependencyToApp(paths.targetRoot, name, version); + await addPluginDependencyToApp(paths.targetRoot, name, pluginVersion); Task.section('Import plugin in app'); await addPluginToApp(paths.targetRoot, pluginId, name); diff --git a/packages/cli/src/commands/plugin/diff.ts b/packages/cli/src/commands/plugin/diff.ts index 012c061f74..416d67869b 100644 --- a/packages/cli/src/commands/plugin/diff.ts +++ b/packages/cli/src/commands/plugin/diff.ts @@ -25,13 +25,12 @@ import { yesPromptFunc, } from '../../lib/diff'; import { paths } from '../../lib/paths'; -import { version as backstageVersion } from '../../lib/version'; export type PluginData = { id: string; name: string; privatePackage: string; - version: string; + pluginVersion: string; npmRegistry: string; }; @@ -62,10 +61,7 @@ export default async (cmd: Command) => { } const data = await readPluginData(); - const templateFiles = await diffTemplateFiles('default-plugin', { - backstageVersion, - ...data, - }); + const templateFiles = await diffTemplateFiles('default-plugin', data); await handleAllFiles(fileHandlers, templateFiles, promptFunc); await finalize(); }; @@ -74,13 +70,13 @@ export default async (cmd: Command) => { async function readPluginData(): Promise { let name: string; let privatePackage: string; - let version: string; + let pluginVersion: string; let npmRegistry: string; try { const pkg = require(paths.resolveTarget('package.json')); name = pkg.name; privatePackage = pkg.private; - version = pkg.version; + pluginVersion = pkg.version; const scope = name.split('/')[0]; if (`${scope}:registry` in pkg.publishConfig) { const registryURL = pkg.publishConfig[`${scope}:registry`]; @@ -102,5 +98,5 @@ async function readPluginData(): Promise { const id = pluginIdMatch[1]; - return { id, name, privatePackage, version, npmRegistry }; + return { id, name, privatePackage, pluginVersion, npmRegistry }; } diff --git a/packages/cli/src/lib/diff/read.ts b/packages/cli/src/lib/diff/read.ts index 75e1b86d24..a4a7355d2d 100644 --- a/packages/cli/src/lib/diff/read.ts +++ b/packages/cli/src/lib/diff/read.ts @@ -24,6 +24,7 @@ import handlebars from 'handlebars'; import recursiveReadDir from 'recursive-readdir'; import { paths } from '../paths'; import { FileDiff } from './types'; +import { versions } from '../../lib/version'; export type TemplatedFile = { path: string; @@ -40,7 +41,16 @@ async function readTemplateFile( return contents; } - return handlebars.compile(contents)(templateVars); + return handlebars.compile(contents)(templateVars, { + helpers: { + version(name: string) { + if (versions[name]) { + return versions[name]; + } + throw new Error(`No version available for package ${name}`); + }, + }, + }); } async function readTemplate( diff --git a/packages/cli/src/lib/tasks.test.ts b/packages/cli/src/lib/tasks.test.ts index d80fcbe9b0..a42902c60b 100644 --- a/packages/cli/src/lib/tasks.test.ts +++ b/packages/cli/src/lib/tasks.test.ts @@ -33,7 +33,8 @@ describe('templatingTask', () => { // Files content const testFileContent = 'testing'; - const testVersionFileContent = 'version: {{version}}'; + const testVersionFileContent = + "version: {{pluginVersion}} {{version 'mock-pkg'}}"; mockFs({ [tmplDir]: { @@ -45,15 +46,20 @@ describe('templatingTask', () => { [destDir]: {}, }); - await templatingTask(tmplDir, destDir, { - version: '0.0.0', - }); + await templatingTask( + tmplDir, + destDir, + { + version: '0.0.0', + }, + { 'mock-pkg': '0.1.2' }, + ); await expect( fs.readFile(resolvePath(destDir, 'test.txt'), 'utf8'), ).resolves.toBe(testFileContent); await expect( fs.readFile(resolvePath(destDir, 'sub/version.txt'), 'utf8'), - ).resolves.toBe('version: 0.0.0'); + ).resolves.toBe('version: 0.0.0 0.1.2'); }); }); diff --git a/packages/cli/src/lib/tasks.ts b/packages/cli/src/lib/tasks.ts index 80dc1a5ed7..4b92c6b9cb 100644 --- a/packages/cli/src/lib/tasks.ts +++ b/packages/cli/src/lib/tasks.ts @@ -69,6 +69,7 @@ export async function templatingTask( templateDir: string, destinationDir: string, context: any, + versions: { [name: string]: string }, ) { const files = await recursive(templateDir).catch(error => { throw new Error(`Failed to read template directory: ${error.message}`); @@ -85,7 +86,19 @@ export async function templatingTask( const template = await fs.readFile(file); const compiled = handlebars.compile(template.toString()); - const contents = compiled({ name: basename(destination), ...context }); + const contents = compiled( + { name: basename(destination), ...context }, + { + helpers: { + version(name: string) { + if (versions[name]) { + return versions[name]; + } + throw new Error(`No version available for package ${name}`); + }, + }, + }, + ); await fs.writeFile(destination, contents).catch(error => { throw new Error( diff --git a/packages/cli/src/lib/version.ts b/packages/cli/src/lib/version.ts index 24734b87cc..5cc3eb7fbb 100644 --- a/packages/cli/src/lib/version.ts +++ b/packages/cli/src/lib/version.ts @@ -17,6 +17,38 @@ import fs from 'fs-extra'; import { paths } from './paths'; +/* eslint-disable import/no-extraneous-dependencies,monorepo/no-internal-import */ +/* +This is a list of all packages used by the templates. If dependencies are added or removed, +this list should be updated as well. + +The list, and the accompanying devDependencies entries, are here to ensure correct versioning +and bumping of this package. Without this list the version would not be bumped unless we +manually trigger a release. + +This does not create an actual dependency on these packages and does not bring in any code. +Rollup will extract the value of the version field in each package at build time without +leaving any imports in place. +*/ + +import { version as backendCommon } from '@backstage/backend-common/package.json'; +import { version as cli } from '@backstage/cli/package.json'; +import { version as config } from '@backstage/config/package.json'; +import { version as core } from '@backstage/core/package.json'; +import { version as devUtils } from '@backstage/dev-utils/package.json'; +import { version as testUtils } from '@backstage/test-utils/package.json'; +import { version as theme } from '@backstage/theme/package.json'; + +export const versions: { [name: string]: string } = { + '@backstage/backend-common': backendCommon, + '@backstage/cli': cli, + '@backstage/config': config, + '@backstage/core': core, + '@backstage/dev-utils': devUtils, + '@backstage/test-utils': testUtils, + '@backstage/theme': theme, +}; + export function findVersion() { const pkgContent = fs.readFileSync(paths.resolveOwn('package.json'), 'utf8'); return JSON.parse(pkgContent).version; diff --git a/packages/cli/templates/default-backend-plugin/package.json.hbs b/packages/cli/templates/default-backend-plugin/package.json.hbs index 1a73515622..b762bb9645 100644 --- a/packages/cli/templates/default-backend-plugin/package.json.hbs +++ b/packages/cli/templates/default-backend-plugin/package.json.hbs @@ -1,6 +1,6 @@ { "name": "{{name}}", - "version": "{{version}}", + "version": "{{pluginVersion}}", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,8 +23,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^{{backstageVersion}}", - "@backstage/config": "^{{backstageVersion}}", + "@backstage/backend-common": "^{{version '@backstage/backend-common'}}", + "@backstage/config": "^{{version '@backstage/config'}}", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^3.0.3", @@ -33,7 +33,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^{{backstageVersion}}", + "@backstage/cli": "^{{version '@backstage/cli'}}", "@types/supertest": "^2.0.8", "supertest": "^4.0.2", "msw": "^0.21.2" diff --git a/packages/cli/templates/default-plugin/package.json.hbs b/packages/cli/templates/default-plugin/package.json.hbs index 41f942fb79..a3f924408a 100644 --- a/packages/cli/templates/default-plugin/package.json.hbs +++ b/packages/cli/templates/default-plugin/package.json.hbs @@ -1,6 +1,6 @@ { "name": "{{name}}", - "version": "{{version}}", + "version": "{{pluginVersion}}", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,8 +24,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core": "^{{backstageVersion}}", - "@backstage/theme": "^{{backstageVersion}}", + "@backstage/core": "^{{version '@backstage/core'}}", + "@backstage/theme": "^{{version '@backstage/theme'}}", "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -34,9 +34,9 @@ "react-use": "^15.3.3" }, "devDependencies": { - "@backstage/cli": "^{{backstageVersion}}", - "@backstage/dev-utils": "^{{backstageVersion}}", - "@backstage/test-utils": "^{{backstageVersion}}", + "@backstage/cli": "^{{version '@backstage/cli'}}", + "@backstage/dev-utils": "^{{version '@backstage/dev-utils'}}", + "@backstage/test-utils": "^{{version '@backstage/test-utils'}}", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^10.4.1", "@testing-library/user-event": "^12.0.7", From 0efbdfbbb861d52d0e1331bb3e42377132d6c94b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 27 Oct 2020 19:09:08 +0100 Subject: [PATCH 3/6] cli,create-app: refactor package versions handling + fix tasks test --- packages/cli/src/commands/create-plugin/createPlugin.ts | 4 ++-- packages/cli/src/lib/diff/read.ts | 8 ++++---- packages/cli/src/lib/tasks.test.ts | 2 +- packages/cli/src/lib/version.ts | 2 +- packages/create-app/src/createApp.ts | 3 +-- packages/create-app/src/lib/tasks.ts | 8 ++++---- packages/create-app/src/{ => lib}/versions.ts | 2 +- 7 files changed, 14 insertions(+), 15 deletions(-) rename packages/create-app/src/{ => lib}/versions.ts (99%) diff --git a/packages/cli/src/commands/create-plugin/createPlugin.ts b/packages/cli/src/commands/create-plugin/createPlugin.ts index b603e732b8..f54a62f613 100644 --- a/packages/cli/src/commands/create-plugin/createPlugin.ts +++ b/packages/cli/src/commands/create-plugin/createPlugin.ts @@ -28,7 +28,7 @@ import { getCodeownersFilePath, } from '../../lib/codeowners'; import { paths } from '../../lib/paths'; -import { versions } from '../../lib/version'; +import { packageVersions } from '../../lib/version'; import { Task, templatingTask } from '../../lib/tasks'; const exec = promisify(execCb); @@ -269,7 +269,7 @@ export default async (cmd: Command) => { privatePackage, npmRegistry, }, - versions, + packageVersions, ); Task.section('Moving to final location'); diff --git a/packages/cli/src/lib/diff/read.ts b/packages/cli/src/lib/diff/read.ts index a4a7355d2d..d37dfe4b03 100644 --- a/packages/cli/src/lib/diff/read.ts +++ b/packages/cli/src/lib/diff/read.ts @@ -24,7 +24,7 @@ import handlebars from 'handlebars'; import recursiveReadDir from 'recursive-readdir'; import { paths } from '../paths'; import { FileDiff } from './types'; -import { versions } from '../../lib/version'; +import { packageVersions } from '../../lib/version'; export type TemplatedFile = { path: string; @@ -43,9 +43,9 @@ async function readTemplateFile( return handlebars.compile(contents)(templateVars, { helpers: { - version(name: string) { - if (versions[name]) { - return versions[name]; + version(name: keyof typeof packageVersions) { + if (name in packageVersions) { + return packageVersions[name]; } throw new Error(`No version available for package ${name}`); }, diff --git a/packages/cli/src/lib/tasks.test.ts b/packages/cli/src/lib/tasks.test.ts index a42902c60b..88d8050290 100644 --- a/packages/cli/src/lib/tasks.test.ts +++ b/packages/cli/src/lib/tasks.test.ts @@ -50,7 +50,7 @@ describe('templatingTask', () => { tmplDir, destDir, { - version: '0.0.0', + pluginVersion: '0.0.0', }, { 'mock-pkg': '0.1.2' }, ); diff --git a/packages/cli/src/lib/version.ts b/packages/cli/src/lib/version.ts index 5cc3eb7fbb..b2b793717d 100644 --- a/packages/cli/src/lib/version.ts +++ b/packages/cli/src/lib/version.ts @@ -39,7 +39,7 @@ import { version as devUtils } from '@backstage/dev-utils/package.json'; import { version as testUtils } from '@backstage/test-utils/package.json'; import { version as theme } from '@backstage/theme/package.json'; -export const versions: { [name: string]: string } = { +export const packageVersions = { '@backstage/backend-common': backendCommon, '@backstage/cli': cli, '@backstage/config': config, diff --git a/packages/create-app/src/createApp.ts b/packages/create-app/src/createApp.ts index c0874d4032..775d53dfdc 100644 --- a/packages/create-app/src/createApp.ts +++ b/packages/create-app/src/createApp.ts @@ -22,7 +22,6 @@ import inquirer, { Answers, Question } from 'inquirer'; import { exec as execCb } from 'child_process'; import { resolve as resolvePath } from 'path'; import { findPaths } from '@backstage/cli-common'; -import { versions } from './versions'; import os from 'os'; import { Task, templatingTask } from './lib/tasks'; @@ -133,7 +132,7 @@ export default async (cmd: Command): Promise => { await createTemporaryAppFolder(tempDir); Task.section('Preparing files'); - await templatingTask(templateDir, tempDir, answers, versions); + await templatingTask(templateDir, tempDir, answers); Task.section('Moving to final location'); await moveApp(tempDir, appDir, answers.name); diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts index 73db175709..b615692830 100644 --- a/packages/create-app/src/lib/tasks.ts +++ b/packages/create-app/src/lib/tasks.ts @@ -20,6 +20,7 @@ import handlebars from 'handlebars'; import ora from 'ora'; import { basename, dirname } from 'path'; import recursive from 'recursive-readdir'; +import { packageVersions } from './versions'; const TASK_NAME_MAX_LENGTH = 14; @@ -68,7 +69,6 @@ export async function templatingTask( templateDir: string, destinationDir: string, context: any, - versions: { [name: string]: string }, ) { const files = await recursive(templateDir).catch(error => { throw new Error(`Failed to read template directory: ${error.message}`); @@ -88,9 +88,9 @@ export async function templatingTask( { name: basename(destination), ...context }, { helpers: { - version(name: string) { - if (versions[name]) { - return versions[name]; + version(name: keyof typeof packageVersions) { + if (name in packageVersions) { + return packageVersions[name]; } throw new Error(`No version available for package ${name}`); }, diff --git a/packages/create-app/src/versions.ts b/packages/create-app/src/lib/versions.ts similarity index 99% rename from packages/create-app/src/versions.ts rename to packages/create-app/src/lib/versions.ts index ed03903469..196e0004c1 100644 --- a/packages/create-app/src/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -54,7 +54,7 @@ import { version as pluginUserSettings } from '@backstage/plugin-user-settings/p import { version as testUtils } from '@backstage/test-utils/package.json'; import { version as theme } from '@backstage/theme/package.json'; -export const versions = { +export const packageVersions = { '@backstage/backend-common': backendCommon, '@backstage/catalog-model': catalogModel, '@backstage/cli': cli, From 24c05700829d17708a34c9c9711002bd359bc055 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 27 Oct 2020 19:12:16 +0100 Subject: [PATCH 4/6] e2e-test: update to provide version lookup helper to template --- packages/e2e-test/src/commands/run.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts index 905cb20d52..be00b99e54 100644 --- a/packages/e2e-test/src/commands/run.ts +++ b/packages/e2e-test/src/commands/run.ts @@ -84,11 +84,23 @@ async function buildDistWorkspace(workspaceName: string, rootDir: string) { const path = paths.resolveOwnRoot(pkgJsonPath); const pkgTemplate = await fs.readFile(path, 'utf8'); const { dependencies = {}, devDependencies = {} } = JSON.parse( - handlebars.compile(pkgTemplate)({ - version: '0.0.0', - privatePackage: true, - scopeName: '@backstage', - }), + handlebars.compile(pkgTemplate)( + { + privatePackage: true, + scopeName: '@backstage', + }, + { + helpers: { + version(name: string) { + const pkg = require(`${name}/package.json`); + if (!pkg) { + throw new Error(`No version available for package ${name}`); + } + return pkg.version; + }, + }, + }, + ), ); Array() From 41ad8904a3a81af3b84de3b0951245b56bbbbb73 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 28 Oct 2020 01:04:22 +0100 Subject: [PATCH 5/6] cli: fix a derpendency --- packages/cli/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 89c0520b59..74fc2d0968 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -109,7 +109,6 @@ }, "devDependencies": { "@backstage/backend-common": "^0.1.1-alpha.25", - "@backstage/cli": "^0.1.1-alpha.25", "@backstage/config": "^0.1.1-alpha.25", "@backstage/core": "^0.1.1-alpha.25", "@backstage/dev-utils": "^0.1.1-alpha.25", From 1e7af7c07e7ce19f36947e73cbf4e29ec79e0e42 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 28 Oct 2020 01:18:03 +0100 Subject: [PATCH 6/6] cli,create-app: bump dev deps --- packages/cli/package.json | 12 ++++---- packages/create-app/package.json | 48 ++++++++++++++++---------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 74fc2d0968..668ec5e000 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -108,12 +108,12 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/backend-common": "^0.1.1-alpha.25", - "@backstage/config": "^0.1.1-alpha.25", - "@backstage/core": "^0.1.1-alpha.25", - "@backstage/dev-utils": "^0.1.1-alpha.25", - "@backstage/test-utils": "^0.1.1-alpha.25", - "@backstage/theme": "^0.1.1-alpha.25", + "@backstage/backend-common": "^0.1.1-alpha.26", + "@backstage/config": "^0.1.1-alpha.26", + "@backstage/core": "^0.1.1-alpha.26", + "@backstage/dev-utils": "^0.1.1-alpha.26", + "@backstage/test-utils": "^0.1.1-alpha.26", + "@backstage/theme": "^0.1.1-alpha.26", "@types/diff": "^4.0.2", "@types/fs-extra": "^9.0.1", "@types/html-webpack-plugin": "^3.2.2", diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 0dd8897d0b..bb321dc504 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -37,30 +37,30 @@ "recursive-readdir": "^2.2.2" }, "devDependencies": { - "@backstage/backend-common": "^0.1.1-alpha.25", - "@backstage/catalog-model": "^0.1.1-alpha.25", - "@backstage/cli": "^0.1.1-alpha.25", - "@backstage/config": "^0.1.1-alpha.25", - "@backstage/core": "^0.1.1-alpha.25", - "@backstage/plugin-api-docs": "^0.1.1-alpha.25", - "@backstage/plugin-auth-backend": "^0.1.1-alpha.25", - "@backstage/plugin-catalog": "^0.1.1-alpha.25", - "@backstage/plugin-catalog-backend": "^0.1.1-alpha.25", - "@backstage/plugin-circleci": "^0.1.1-alpha.25", - "@backstage/plugin-explore": "^0.1.1-alpha.25", - "@backstage/plugin-github-actions": "^0.1.1-alpha.25", - "@backstage/plugin-lighthouse": "^0.1.1-alpha.25", - "@backstage/plugin-proxy-backend": "^0.1.1-alpha.25", - "@backstage/plugin-register-component": "^0.1.1-alpha.25", - "@backstage/plugin-rollbar-backend": "^0.1.1-alpha.25", - "@backstage/plugin-scaffolder": "^0.1.1-alpha.25", - "@backstage/plugin-scaffolder-backend": "^0.1.1-alpha.25", - "@backstage/plugin-tech-radar": "^0.1.1-alpha.25", - "@backstage/plugin-techdocs": "^0.1.1-alpha.25", - "@backstage/plugin-techdocs-backend": "^0.1.1-alpha.25", - "@backstage/plugin-user-settings": "^0.1.1-alpha.25", - "@backstage/test-utils": "^0.1.1-alpha.25", - "@backstage/theme": "^0.1.1-alpha.25", + "@backstage/backend-common": "^0.1.1-alpha.26", + "@backstage/catalog-model": "^0.1.1-alpha.26", + "@backstage/cli": "^0.1.1-alpha.26", + "@backstage/config": "^0.1.1-alpha.26", + "@backstage/core": "^0.1.1-alpha.26", + "@backstage/plugin-api-docs": "^0.1.1-alpha.26", + "@backstage/plugin-auth-backend": "^0.1.1-alpha.26", + "@backstage/plugin-catalog": "^0.1.1-alpha.26", + "@backstage/plugin-catalog-backend": "^0.1.1-alpha.26", + "@backstage/plugin-circleci": "^0.1.1-alpha.26", + "@backstage/plugin-explore": "^0.1.1-alpha.26", + "@backstage/plugin-github-actions": "^0.1.1-alpha.26", + "@backstage/plugin-lighthouse": "^0.1.1-alpha.26", + "@backstage/plugin-proxy-backend": "^0.1.1-alpha.26", + "@backstage/plugin-register-component": "^0.1.1-alpha.26", + "@backstage/plugin-rollbar-backend": "^0.1.1-alpha.26", + "@backstage/plugin-scaffolder": "^0.1.1-alpha.26", + "@backstage/plugin-scaffolder-backend": "^0.1.1-alpha.26", + "@backstage/plugin-tech-radar": "^0.1.1-alpha.26", + "@backstage/plugin-techdocs": "^0.1.1-alpha.26", + "@backstage/plugin-techdocs-backend": "^0.1.1-alpha.26", + "@backstage/plugin-user-settings": "^0.1.1-alpha.26", + "@backstage/test-utils": "^0.1.1-alpha.26", + "@backstage/theme": "^0.1.1-alpha.26", "@types/fs-extra": "^9.0.1", "@types/inquirer": "^7.3.1", "@types/ora": "^3.2.0",