diff --git a/package.json b/package.json index eb61021a8..d91f99a30 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "chalk": "^2.3.0", "chokidar": "^2.0.4", "concat-stream": "^1.6.0", - "disparity": "^2.0.0", + "diff": "^4.0.1", "doctrine-temporary-fork": "2.1.0", "get-port": "^4.0.0", "git-url-parse": "^10.0.1", diff --git a/src/commands/readme.js b/src/commands/readme.js index a7591b8d3..11e81d351 100644 --- a/src/commands/readme.js +++ b/src/commands/readme.js @@ -5,7 +5,7 @@ const documentation = require('../'); const sharedOptions = require('./shared_options'); const inject = require('mdast-util-inject'); const chalk = require('chalk'); -const disparity = require('disparity'); +const diff = require('diff'); const getReadmeFile = require('../get-readme-file'); module.exports.command = 'readme [input..]'; @@ -94,22 +94,48 @@ module.exports.handler = function readme(argv) { .process(readmeContent) ) .then(file => { - const diffOutput = disparity.unified(readmeContent, file.contents, { - paths: [argv.readmeFile, argv.readmeFile] - }); - if (!diffOutput.length) { + const diffRaw = diff.createPatch( + '', + readmeContent, + file.contents, + '', + '' + ); + if (!diffRaw.length) { log(`${argv.readmeFile} is up to date.`); process.exit(0); } + // Replace diff headers with real values + const cleanedDiff = diffRaw + .replace(/^([^\n]+)\n([^\n]+)\n/m, '') + .replace(/^---.*/gm, `--- ${argv.readmeFile}\tremoved`) + .replace(/^\+\+\+.*/gm, `+++ ${argv.readmeFile}\tadded`); + + // Includes newlines for easier joins + const diffLines = cleanedDiff.split(/^/m); + const diffHeader = diffLines + .slice(0, 2) + .join('') + .replace(/[^\n\r]+/g, chalk.yellow('$&')); + const diffBody = diffLines + .slice(2) + .join('') + .replace(/^-[^\n\r]*/gm, chalk.red('$&')) + .replace(/^\+[^\n\r]*/gm, chalk.green('$&')) + .replace(/^@@.+@@/gm, chalk.magenta('$&')); + if (argv.d) { log( chalk.bold(`${argv.readmeFile} needs the following updates:`), - `\n${diffOutput}` + `\n${diffHeader}${diffBody}` ); process.exit(1); } else { - log(chalk.bold(`Updating ${argv.readmeFile}`), `\n${diffOutput}`); + log( + chalk.bold(`Updating ${argv.readmeFile}`), + `\n${diffHeader}${diffBody}` + ); } fs.writeFileSync(argv.readmeFile, file.contents); diff --git a/yarn.lock b/yarn.lock index 5c6b223de..284f472b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -930,7 +930,7 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-styles@^2.0.1, ansi-styles@^2.2.1: +ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2070,20 +2070,14 @@ detective@^4.0.0: acorn "^5.2.1" defined "^1.0.0" -diff@^1.3.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" - diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" -disparity@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/disparity/-/disparity-2.0.0.tgz#57ddacb47324ae5f58d2cc0da886db4ce9eeb718" - dependencies: - ansi-styles "^2.0.1" - diff "^1.3.2" +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== doctrine-temporary-fork@2.1.0: version "2.1.0"