From 323f6b715a238e4c6a0ad224bd12b46372e95d79 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 3 May 2020 12:04:17 +0200 Subject: [PATCH] packages/cli: separate handlers for different template files in diff --- packages/cli/package.json | 2 + .../cli/src/commands/plugin/diff/index.ts | 83 ++++++++++++++++++- yarn.lock | 7 +- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index bc1a349aa3..418e5f9fe2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -29,6 +29,7 @@ "backstage-cli": "bin/backstage-cli" }, "devDependencies": { + "@types/diff": "^4.0.2", "@types/fs-extra": "^8.1.0", "@types/html-webpack-plugin": "^3.2.2", "@types/inquirer": "^6.5.0", @@ -58,6 +59,7 @@ "chokidar": "^3.3.1", "commander": "^4.1.1", "dashify": "^2.0.0", + "diff": "^4.0.2", "eslint-plugin-import": "^2.20.2", "eslint-plugin-monorepo": "^0.2.1", "fork-ts-checker-webpack-plugin": "^4.0.5", diff --git a/packages/cli/src/commands/plugin/diff/index.ts b/packages/cli/src/commands/plugin/diff/index.ts index 7b7a36d17c..3eaa6c0a08 100644 --- a/packages/cli/src/commands/plugin/diff/index.ts +++ b/packages/cli/src/commands/plugin/diff/index.ts @@ -16,10 +16,12 @@ import fs from 'fs-extra'; import { relative as relativePath } from 'path'; -import handlebars from 'handlebars'; +import { diffLines } from 'diff'; +import handlebars, { Template } from 'handlebars'; import recursiveReadDir from 'recursive-readdir'; import { paths } from 'lib/paths'; import { version } from 'lib/version'; +import chalk from 'chalk'; type PluginInfo = { id: string; @@ -121,14 +123,87 @@ async function readTemplate( return templateFiles; } +async function packageJsonHandler(file: TemplateFile) { + if (!file.targetExists) { + throw new Error(`${file.targetPath} doesn't exist`); + } + + console.log(`pkg.json handler: ${file.targetPath}`); + const pkg = JSON.parse(file.templateContents); + console.log('DEBUG: pkg =', pkg); + const targetPkg = JSON.parse(file.targetContents); + console.log('DEBUG: targetPkg =', targetPkg); +} + +async function diffHandler(file: TemplateFile) { + if (!file.targetExists) { + // TODO: prompt to write template file + return; + } + if (file.targetContents === file.templateContents) { + return; + } + + const diffs = diffLines(file.targetContents, file.templateContents); + + for (const diff of diffs) { + if (diff.added) { + process.stdout.write(chalk.green(`+${diff.value}`)); + } else if (diff.removed) { + process.stdout.write(chalk.red(`-${diff.value}`)); + } else { + process.stdout.write(` ${diff.value}`); + } + } +} + +async function skipHandler(file: TemplateFile) { + console.log(`Skipping ${file.targetPath}`); +} + +type FileHandler = { + patterns: Array; + handler: (file: TemplateFile) => Promise; +}; + +const fileHandlers: FileHandler[] = [ + { + patterns: ['package.json'], + handler: packageJsonHandler, + }, + { + patterns: ['.eslintrc.js', 'tsconfig.json'], + handler: diffHandler, + }, + { + patterns: ['README.md', /^^src\//], + handler: skipHandler, + }, +]; + export default async () => { const pluginInfo = await readPluginInfo(); const templateVars = { version, ...pluginInfo }; - console.log('DEBUG: templateVars =', templateVars); const templateDir = paths.resolveOwn('templates/default-plugin'); - console.log('DEBUG: templateDir =', templateDir); const templateFiles = await readTemplate(templateDir, templateVars); - console.log('DEBUG: templateFiles =', templateFiles); + + for (const templateFile of templateFiles) { + const { targetPath } = templateFile; + const fileHandler = fileHandlers.find(handler => + handler.patterns.some(pattern => + typeof pattern === 'string' + ? pattern === targetPath + : pattern.test(targetPath), + ), + ); + if (fileHandler) { + await fileHandler.handler(templateFile); + } else { + throw new Error(`No template file handler found for ${targetPath}`); + } + } + + console.log(`DEBUG: done!`); }; diff --git a/yarn.lock b/yarn.lock index 79eac2cb21..d788ed448a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3915,6 +3915,11 @@ resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== +"@types/diff@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/diff/-/diff-4.0.2.tgz#2e9bb89f9acc3ab0108f0f3dc4dbdcf2fff8a99c" + integrity sha512-mIenTfsIe586/yzsyfql69KRnA75S8SVXQbTLpDejRrjH0QSJcpu3AUOi/Vjnt9IOsXKxPhJfGpQUNMueIU1fQ== + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -8114,7 +8119,7 @@ diff-sequences@^25.1.0: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32" integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw== -diff@^4.0.1: +diff@^4.0.1, diff@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==