diff --git a/.eslintignore b/.eslintignore index 256e583..92c7d7c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,4 +3,5 @@ coverage/** build/** docs/** node_modules/** -src/diff2html-templates.js +src/diff2html-templates.* +typings/** diff --git a/.gitignore b/.gitignore index 05edf8a..7bf2904 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,4 @@ bower_components/ /docs/ /dist/ /build/ -/src/diff2html-templates.js +/src/diff2html-templates.* diff --git a/README.md b/README.md index c5f5840..01022db 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ The HTML output accepts a Javascript object with configuration. Possible options - `matchingMaxComparisons`: perform at most this much comparisons for line matching a block of changes, default is `2500` - `maxLineSizeInBlockForComparison`: maximum number os characters of the bigger line in a block to apply comparison, default is `200` - `maxLineLengthHighlight`: only perform diff changes highlight if lines are smaller than this, default is `10000` - - `templates`: object with previously compiled templates to replace parts of the html + - `compiledTemplates`: object with previously compiled templates to replace parts of the html - `rawTemplates`: object with raw not compiled templates to replace parts of the html - `renderNothingWhenEmpty`: render nothing if the diff shows no change in its comparison: `true` or `false`, default is `false` > For more information regarding the possible templates look into [src/templates](https://github.com/rtfpessoa/diff2html/tree/master/src/templates) diff --git a/package.json b/package.json index f307b84..89b0f8f 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "coverage": "jest --collectCoverage", "coverage-html": "yarn run coverage && open ./coverage/index.html", "codacy": "cat ./coverage/lcov.info | codacy-coverage", - "build": "rm -rf build; yarn run build-scripts && yarn run build-css && yarn run build-templates && yarn run build-library && yarn run build-browser-bundle && yarn run build-website", + "build": "rm -rf build docs; yarn run build-scripts && yarn run build-css && yarn run build-templates && yarn run build-library && yarn run build-browser-bundle && yarn run build-website", "build-scripts": "tsc -p tsconfig.scripts.json", "build-css": "./scripts/build-css.sh", "build-templates": "./scripts/build-templates.sh", @@ -57,23 +57,22 @@ "fs": false }, "dependencies": { - "diff": "^4.0.1", - "hogan.js": "^3.0.2", - "merge": "^1.2.1", - "whatwg-fetch": "^3.0.0" + "diff": "4.0.1", + "hogan.js": "3.0.2" }, "devDependencies": { - "@types/hogan.js": "^3.0.0", + "@types/diff": "4.0.2", + "@types/highlight.js": "9.12.3", "@types/jest": "24.0.18", - "@types/mkdirp": "^0.5.2", - "@types/node": "^12.7.2", - "@types/nopt": "^3.0.29", + "@types/mkdirp": "0.5.2", + "@types/node": "12.7.2", + "@types/nopt": "3.0.29", "@typescript-eslint/eslint-plugin": "2.0.0", "@typescript-eslint/parser": "2.0.0", - "autoprefixer": "^9.6.0", - "browserify": "^16.5.0", - "clean-css-cli": "^4.3.0", - "codacy-coverage": "^3.4.0", + "autoprefixer": "9.6.0", + "browserify": "16.5.0", + "clean-css-cli": "4.3.0", + "codacy-coverage": "3.4.0", "eslint": "6.2.2", "eslint-config-prettier": "6.1.0", "eslint-config-standard": "14.0.1", @@ -81,17 +80,19 @@ "eslint-plugin-jest": "22.15.2", "eslint-plugin-node": "9.1.0", "eslint-plugin-prettier": "3.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.1", - "fast-html-parser": "^1.0.1", + "eslint-plugin-promise": "4.2.1", + "eslint-plugin-standard": "4.0.1", + "fast-html-parser": "1.0.1", + "highlight.js": "9.15.10", "jest": "24.9.0", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "postcss-cli": "^6.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "postcss-cli": "6.1.3", "prettier": "1.18.2", - "terser": "^4.3.8", - "ts-jest": "24.0.2", - "typescript": "^3.6.3" + "terser": "4.3.8", + "ts-jest": "24.1.0", + "typescript": "3.6.4", + "whatwg-fetch": "3.0.0" }, "resolutions": { "lodash": "4.17.15" diff --git a/scripts/build-templates.sh b/scripts/build-templates.sh index e8f2ce4..6b8fdb0 100755 --- a/scripts/build-templates.sh +++ b/scripts/build-templates.sh @@ -5,6 +5,6 @@ set -e SCRIPT_DIRECTORY="$( cd "$( dirname "$0" )" && pwd )" node ${SCRIPT_DIRECTORY}/../build/scripts/hulk.js \ - --wrapper node \ - --variable 'browserTemplates' \ - ${SCRIPT_DIRECTORY}/../src/templates/*.mustache > ${SCRIPT_DIRECTORY}/../src/diff2html-templates.js + --wrapper ts \ + --variable 'defaultTemplates' \ + ${SCRIPT_DIRECTORY}/../src/templates/*.mustache > ${SCRIPT_DIRECTORY}/../src/diff2html-templates.ts diff --git a/scripts/hulk.ts b/scripts/hulk.ts index b668fb6..f078abe 100755 --- a/scripts/hulk.ts +++ b/scripts/hulk.ts @@ -19,7 +19,7 @@ import * as path from "path"; import * as fs from "fs"; import * as hogan from "hogan.js"; -import * as nopt from "nopt"; +import nopt from "nopt"; import * as mkderp from "mkdirp"; const options = nopt( @@ -52,10 +52,9 @@ function cyan(text: string): string { } function extractFiles(files: string[]): string[] { - const usage = ` - ${cyan( - "USAGE:" - )} hulk [--wrapper wrapper] [--outputdir outputdir] [--namespace namespace] [--variable variable] FILES + const usage = `${cyan( + "USAGE:" + )} hulk [--wrapper wrapper] [--outputdir outputdir] [--namespace namespace] [--variable variable] FILES ${cyan("OPTIONS:")} [-w, --wrapper] :: wraps the template (i.e. amd) [-o, --outputdir] :: outputs the templates as individual files to a directory @@ -130,6 +129,8 @@ function wrap(file: string, name: string, openedFile: string): string { // If we have a template per file the export will expose the template directly return options.outputdir ? `global.${objectStmt};\nmodule.exports = ${objectAccessor};` : `global.${objectStmt}`; + case "ts": + return `// @ts-ignore\n${objectStmt}`; default: return objectStmt; } @@ -141,19 +142,18 @@ function prepareOutput(content: string): string { case "amd": return content; case "node": - return ( - "(function() {\n" + - "if (!!!global." + - variableName + - ") global." + - variableName + - " = {};\n" + - 'var Hogan = require("hogan.js");' + - content + - "\n" + - (!options.outputdir ? "module.exports = global." + variableName + ";\n" : "") + - "})();" - ); + return `(function() { +if (!!!global.${variableName}) global.${variableName} = {}; +var Hogan = require("hogan.js"); +${content} +${!options.outputdir ? `module.exports = global.${variableName};\n` : ""})();`; + + case "ts": + return `import * as Hogan from "hogan.js"; +type CompiledTemplates = { [name: string]: Hogan.Template }; +export const ${variableName}: CompiledTemplates = {}; +${content}`; + default: return "if (!!!" + variableName + ") var " + variableName + " = {};\n" + content; } @@ -181,7 +181,9 @@ const templates = extractFiles(options.argv.remain) if (!options.outputdir) return cleanFileContents; - return fs.writeFileSync(path.join(options.outputdir, `${name}.js`), prepareOutput(cleanFileContents)); + const fileExtension = options.wrapper === "ts" ? "ts" : "js"; + + return fs.writeFileSync(path.join(options.outputdir, `${name}.${fileExtension}`), prepareOutput(cleanFileContents)); }) .filter(templateContents => typeof templateContents !== "undefined"); diff --git a/src/__tests__/diff-parser-tests.js b/src/__tests__/diff-parser-tests.ts similarity index 53% rename from src/__tests__/diff-parser-tests.js rename to src/__tests__/diff-parser-tests.ts index c0de992..34a8db3 100644 --- a/src/__tests__/diff-parser-tests.js +++ b/src/__tests__/diff-parser-tests.ts @@ -1,19 +1,19 @@ -const DiffParser = require("../diff-parser.js").DiffParser; +import { parse } from "../diff-parser"; -function checkDiffSample(diff) { - const result = DiffParser.generateDiffJson(diff); +function checkDiffSample(diff: string): void { + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(1).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("sample").toEqual(file1.oldName); - expect("sample").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(1); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("sample"); + expect(file1.newName).toEqual("sample"); + expect(file1.blocks.length).toEqual(1); } -describe("DiffParser", function() { - describe("generateDiffJson", function() { - it("should parse unix with \n diff", function() { +describe("DiffParser", () => { + describe("generateDiffJson", () => { + it("should parse unix with \n diff", () => { const diff = "diff --git a/sample b/sample\n" + "index 0000001..0ddf2ba\n" + @@ -25,7 +25,7 @@ describe("DiffParser", function() { checkDiffSample(diff); }); - it("should parse windows with \r\n diff", function() { + it("should parse windows with \r\n diff", () => { const diff = "diff --git a/sample b/sample\r\n" + "index 0000001..0ddf2ba\r\n" + @@ -37,7 +37,7 @@ describe("DiffParser", function() { checkDiffSample(diff); }); - it("should parse old os x with \r diff", function() { + it("should parse old os x with \r diff", () => { const diff = "diff --git a/sample b/sample\r" + "index 0000001..0ddf2ba\r" + @@ -49,7 +49,7 @@ describe("DiffParser", function() { checkDiffSample(diff); }); - it("should parse mixed eols diff", function() { + it("should parse mixed eols diff", () => { const diff = "diff --git a/sample b/sample\n" + "index 0000001..0ddf2ba\r\n" + @@ -61,7 +61,7 @@ describe("DiffParser", function() { checkDiffSample(diff); }); - it("should parse diff with special characters", function() { + it("should parse diff with special characters", () => { const diff = 'diff --git "a/bla with \ttab.scala" "b/bla with \ttab.scala"\n' + "index 4c679d7..e9bd385 100644\n" + @@ -72,17 +72,17 @@ describe("DiffParser", function() { "+cenas com ananas\n" + "+bananas"; - const result = DiffParser.generateDiffJson(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(2).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("bla with \ttab.scala").toEqual(file1.oldName); - expect("bla with \ttab.scala").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(2); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("bla with \ttab.scala"); + expect(file1.newName).toEqual("bla with \ttab.scala"); + expect(file1.blocks.length).toEqual(1); }); - it("should parse diff with prefix", function() { + it("should parse diff with prefix", () => { const diff = 'diff --git "\tbla with \ttab.scala" "\tbla with \ttab.scala"\n' + "index 4c679d7..e9bd385 100644\n" + @@ -93,17 +93,17 @@ describe("DiffParser", function() { "+cenas com ananas\n" + "+bananas"; - const result = DiffParser.generateDiffJson(diff, { srcPrefix: "\t", dstPrefix: "\t" }); + const result = parse(diff, { srcPrefix: "\t", dstPrefix: "\t" }); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(2).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("bla with \ttab.scala").toEqual(file1.oldName); - expect("bla with \ttab.scala").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(2); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("bla with \ttab.scala"); + expect(file1.newName).toEqual("bla with \ttab.scala"); + expect(file1.blocks.length).toEqual(1); }); - it("should parse diff with deleted file", function() { + it("should parse diff with deleted file", () => { const diff = "diff --git a/src/var/strundefined.js b/src/var/strundefined.js\n" + "deleted file mode 100644\n" + @@ -111,26 +111,26 @@ describe("DiffParser", function() { "--- a/src/var/strundefined.js\n" + "+++ /dev/null\n" + "@@ -1,3 +0,0 @@\n" + - "-define(function() {\n" + + "-define(() => {\n" + "- return typeof undefined;\n" + "-});\n"; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(false).toEqual(file1.isCombined); - expect(0).toEqual(file1.addedLines); - expect(3).toEqual(file1.deletedLines); - expect("src/var/strundefined.js").toEqual(file1.oldName); - expect("/dev/null").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(true).toEqual(file1.isDeleted); - expect("04e16b0").toEqual(file1.checksumBefore); - expect("0000000").toEqual(file1.checksumAfter); + expect(file1.isCombined).toEqual(false); + expect(file1.addedLines).toEqual(0); + expect(file1.deletedLines).toEqual(3); + expect(file1.oldName).toEqual("src/var/strundefined.js"); + expect(file1.newName).toEqual("/dev/null"); + expect(file1.blocks.length).toEqual(1); + expect(file1.isDeleted).toEqual(true); + expect(file1.checksumBefore).toEqual("04e16b0"); + expect(file1.checksumAfter).toEqual("0000000"); }); - it("should parse diff with new file", function() { + it("should parse diff with new file", () => { const diff = "diff --git a/test.js b/test.js\n" + "new file mode 100644\n" + @@ -144,23 +144,23 @@ describe("DiffParser", function() { "+\n" + "+console.log(parser.parsePatchDiffResult(text, patchLineList));\n"; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(false).toEqual(file1.isCombined); - expect(5).toEqual(file1.addedLines); - expect(0).toEqual(file1.deletedLines); - expect("/dev/null").toEqual(file1.oldName); - expect("test.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(true).toEqual(file1.isNew); - expect("100644").toEqual(file1.newFileMode); - expect("0000000").toEqual(file1.checksumBefore); - expect("e1e22ec").toEqual(file1.checksumAfter); + expect(file1.isCombined).toEqual(false); + expect(file1.addedLines).toEqual(5); + expect(file1.deletedLines).toEqual(0); + expect(file1.oldName).toEqual("/dev/null"); + expect(file1.newName).toEqual("test.js"); + expect(file1.blocks.length).toEqual(1); + expect(file1.isNew).toEqual(true); + expect(file1.newFileMode).toEqual("100644"); + expect(file1.checksumBefore).toEqual("0000000"); + expect(file1.checksumAfter).toEqual("e1e22ec"); }); - it("should parse diff with nested diff", function() { + it("should parse diff with nested diff", () => { const diff = "diff --git a/src/offset.js b/src/offset.js\n" + "index cc6ffb4..fa51f18 100644\n" + @@ -174,22 +174,22 @@ describe("DiffParser", function() { "+\n" + "+console.log(parser.parsePatchDiffResult(text, patchLineList));\n"; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(false).toEqual(file1.isCombined); - expect(6).toEqual(file1.addedLines); - expect(0).toEqual(file1.deletedLines); - expect("src/offset.js").toEqual(file1.oldName); - expect("src/offset.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(6).toEqual(file1.blocks[0].lines.length); - expect("cc6ffb4").toEqual(file1.checksumBefore); - expect("fa51f18").toEqual(file1.checksumAfter); + expect(file1.isCombined).toEqual(false); + expect(file1.addedLines).toEqual(6); + expect(file1.deletedLines).toEqual(0); + expect(file1.oldName).toEqual("src/offset.js"); + expect(file1.newName).toEqual("src/offset.js"); + expect(file1.blocks.length).toEqual(1); + expect(file1.blocks[0].lines.length).toEqual(6); + expect(file1.checksumBefore).toEqual("cc6ffb4"); + expect(file1.checksumAfter).toEqual("fa51f18"); }); - it("should parse diff with multiple blocks", function() { + it("should parse diff with multiple blocks", () => { const diff = "diff --git a/src/attributes/classes.js b/src/attributes/classes.js\n" + "index c617824..c8d1393 100644\n" + @@ -217,23 +217,23 @@ describe("DiffParser", function() { " // store className if set\n" + ' dataPriv.set( this, "__className__", this.className );\n'; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(false).toEqual(file1.isCombined); - expect(2).toEqual(file1.addedLines); - expect(3).toEqual(file1.deletedLines); - expect("src/attributes/classes.js").toEqual(file1.oldName); - expect("src/attributes/classes.js").toEqual(file1.newName); - expect(2).toEqual(file1.blocks.length); - expect(11).toEqual(file1.blocks[0].lines.length); - expect(8).toEqual(file1.blocks[1].lines.length); - expect("c617824").toEqual(file1.checksumBefore); - expect("c8d1393").toEqual(file1.checksumAfter); + expect(file1.isCombined).toEqual(false); + expect(file1.addedLines).toEqual(2); + expect(file1.deletedLines).toEqual(3); + expect(file1.oldName).toEqual("src/attributes/classes.js"); + expect(file1.newName).toEqual("src/attributes/classes.js"); + expect(file1.blocks.length).toEqual(2); + expect(file1.blocks[0].lines.length).toEqual(11); + expect(file1.blocks[1].lines.length).toEqual(8); + expect(file1.checksumBefore).toEqual("c617824"); + expect(file1.checksumAfter).toEqual("c8d1393"); }); - it("should parse diff with multiple files", function() { + it("should parse diff with multiple files", () => { const diff = "diff --git a/src/core/init.js b/src/core/init.js\n" + "index e49196a..50f310c 100644\n" + @@ -260,33 +260,33 @@ describe("DiffParser", function() { ' "./var/hasOwn",\n' + ' "./var/slice",\n'; - const result = DiffParser.generateDiffJson(diff); - expect(2).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(2); const file1 = result[0]; - expect(false).toEqual(file1.isCombined); - expect(1).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("src/core/init.js").toEqual(file1.oldName); - expect("src/core/init.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(8).toEqual(file1.blocks[0].lines.length); - expect("e49196a").toEqual(file1.checksumBefore); - expect("50f310c").toEqual(file1.checksumAfter); + expect(file1.isCombined).toEqual(false); + expect(file1.addedLines).toEqual(1); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("src/core/init.js"); + expect(file1.newName).toEqual("src/core/init.js"); + expect(file1.blocks.length).toEqual(1); + expect(file1.blocks[0].lines.length).toEqual(8); + expect(file1.checksumBefore).toEqual("e49196a"); + expect(file1.checksumAfter).toEqual("50f310c"); const file2 = result[1]; - expect(false).toEqual(file2.isCombined); - expect(0).toEqual(file2.addedLines); - expect(1).toEqual(file2.deletedLines); - expect("src/event.js").toEqual(file2.oldName); - expect("src/event.js").toEqual(file2.newName); - expect(1).toEqual(file2.blocks.length); - expect(6).toEqual(file2.blocks[0].lines.length); - expect("7336f4d").toEqual(file2.checksumBefore); - expect("6183f70").toEqual(file2.checksumAfter); + expect(file2.isCombined).toEqual(false); + expect(file2.addedLines).toEqual(0); + expect(file2.deletedLines).toEqual(1); + expect(file2.oldName).toEqual("src/event.js"); + expect(file2.newName).toEqual("src/event.js"); + expect(file2.blocks.length).toEqual(1); + expect(file2.blocks[0].lines.length).toEqual(6); + expect(file2.checksumBefore).toEqual("7336f4d"); + expect(file2.checksumAfter).toEqual("6183f70"); }); - it("should parse combined diff", function() { + it("should parse combined diff", () => { const diff = "diff --combined describe.c\n" + "index fabadb8,cc95eb0..4866510\n" + @@ -316,62 +316,62 @@ describe("DiffParser", function() { " initialized = 1;\n" + " for_each_ref(get_name);\n"; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(true).toEqual(file1.isCombined); + expect(file1.isCombined).toEqual(true); expect(9).toEqual(file1.addedLines); expect(2).toEqual(file1.deletedLines); - expect("describe.c").toEqual(file1.oldName); - expect("describe.c").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(22).toEqual(file1.blocks[0].lines.length); - expect(["4866510", "cc95eb0"].sort()).toEqual(file1.checksumBefore.sort()); - expect("fabadb8").toEqual(file1.checksumAfter); + expect(file1.oldName).toEqual("describe.c"); + expect(file1.newName).toEqual("describe.c"); + expect(file1.blocks.length).toEqual(1); + expect(file1.blocks[0].lines.length).toEqual(22); + expect(file1.checksumBefore).toEqual(["cc95eb0", "4866510"]); + expect(file1.checksumAfter).toEqual("fabadb8"); }); - it("should parse diffs with copied files", function() { + it("should parse diffs with copied files", () => { const diff = "diff --git a/index.js b/more-index.js\n" + "dissimilarity index 5%\n" + "copy from index.js\n" + "copy to more-index.js\n"; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(0).toEqual(file1.addedLines); - expect(0).toEqual(file1.deletedLines); - expect("index.js").toEqual(file1.oldName); - expect("more-index.js").toEqual(file1.newName); - expect(0).toEqual(file1.blocks.length); - expect(true).toEqual(file1.isCopy); - expect("5").toEqual(file1.changedPercentage); + expect(file1.addedLines).toEqual(0); + expect(file1.deletedLines).toEqual(0); + expect(file1.oldName).toEqual("index.js"); + expect(file1.newName).toEqual("more-index.js"); + expect(file1.blocks.length).toEqual(0); + expect(file1.isCopy).toEqual(true); + expect(file1.changedPercentage).toEqual(5); }); - it("should parse diffs with moved files", function() { + it("should parse diffs with moved files", () => { const diff = "diff --git a/more-index.js b/other-index.js\n" + "similarity index 86%\n" + "rename from more-index.js\n" + "rename to other-index.js\n"; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(0).toEqual(file1.addedLines); - expect(0).toEqual(file1.deletedLines); - expect("more-index.js").toEqual(file1.oldName); - expect("other-index.js").toEqual(file1.newName); - expect(0).toEqual(file1.blocks.length); - expect(true).toEqual(file1.isRename); - expect("86").toEqual(file1.unchangedPercentage); + expect(file1.addedLines).toEqual(0); + expect(file1.deletedLines).toEqual(0); + expect(file1.oldName).toEqual("more-index.js"); + expect(file1.newName).toEqual("other-index.js"); + expect(file1.blocks.length).toEqual(0); + expect(file1.isRename).toEqual(true); + expect(file1.unchangedPercentage).toEqual(86); }); - it("should parse diffs correct line numbers", function() { + it("should parse diffs correct line numbers", () => { const diff = "diff --git a/sample b/sample\n" + "index 0000001..0ddf2ba\n" + @@ -381,23 +381,23 @@ describe("DiffParser", function() { "-test\n" + "+test1r\n"; - const result = DiffParser.generateDiffJson(diff); - expect(1).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(1); const file1 = result[0]; - expect(1).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("sample").toEqual(file1.oldName); - expect("sample").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(2).toEqual(file1.blocks[0].lines.length); - expect(1).toEqual(file1.blocks[0].lines[0].oldNumber); - expect(null).toEqual(file1.blocks[0].lines[0].newNumber); - expect(null).toEqual(file1.blocks[0].lines[1].oldNumber); - expect(1).toEqual(file1.blocks[0].lines[1].newNumber); + expect(file1.addedLines).toEqual(1); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("sample"); + expect(file1.newName).toEqual("sample"); + expect(file1.blocks.length).toEqual(1); + expect(file1.blocks[0].lines.length).toEqual(2); + expect(file1.blocks[0].lines[0].oldNumber).toEqual(1); + expect(file1.blocks[0].lines[0].newNumber).toBeUndefined(); + expect(file1.blocks[0].lines[1].oldNumber).toBeUndefined(); + expect(file1.blocks[0].lines[1].newNumber).toEqual(1); }); - it("should parse unified non git diff and strip timestamps off the headers", function() { + it("should parse unified non git diff and strip timestamps off the headers", () => { const diffs = [ // 2 hours ahead of GMT "--- a/sample.js 2016-10-25 11:37:14.000000000 +0200\n" + @@ -416,42 +416,42 @@ describe("DiffParser", function() { ]; diffs.forEach(function(diff) { - const result = DiffParser.generateDiffJson(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(2).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("sample.js").toEqual(file1.oldName); - expect("sample.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(2); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("sample.js"); + expect(file1.newName).toEqual("sample.js"); + expect(file1.blocks.length).toEqual(1); const linesContent = file1.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual(["-test", "+test1r", "+test2r"]); + expect(["-test", "+test1r", "+test2r"]).toEqual(linesContent); }); }); - it("should parse unified non git diff", function() { + it("should parse unified non git diff", () => { const diff = "--- a/sample.js\n" + "+++ b/sample.js\n" + "@@ -1 +1,2 @@\n" + "-test\n" + "+test1r\n" + "+test2r\n"; - const result = DiffParser.generateDiffJson(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(2).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("sample.js").toEqual(file1.oldName); - expect("sample.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(2); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("sample.js"); + expect(file1.newName).toEqual("sample.js"); + expect(file1.blocks.length).toEqual(1); const linesContent = file1.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual(["-test", "+test1r", "+test2r"]); + expect(["-test", "+test1r", "+test2r"]).toEqual(linesContent); }); - it("should parse unified diff with multiple hunks and files", function() { + it("should parse unified diff with multiple hunks and files", () => { const diff = "--- sample.js\n" + "+++ sample.js\n" + @@ -464,40 +464,40 @@ describe("DiffParser", function() { "@@ -1 +1,2 @@\n" + "+test1"; - const result = DiffParser.generateDiffJson(diff); - expect(2).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(2); const file1 = result[0]; - expect(1).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("sample.js").toEqual(file1.oldName); - expect("sample.js").toEqual(file1.newName); - expect(2).toEqual(file1.blocks.length); + expect(file1.addedLines).toEqual(1); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("sample.js"); + expect(file1.newName).toEqual("sample.js"); + expect(file1.blocks.length).toEqual(2); const linesContent1 = file1.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent1).toEqual(["-test"]); + expect(["-test"]).toEqual(linesContent1); const linesContent2 = file1.blocks[1].lines.map(function(line) { return line.content; }); - expect(linesContent2).toEqual(["+test"]); + expect(["+test"]).toEqual(linesContent2); const file2 = result[1]; - expect(1).toEqual(file2.addedLines); - expect(0).toEqual(file2.deletedLines); - expect("sample1.js").toEqual(file2.oldName); - expect("sample1.js").toEqual(file2.newName); - expect(1).toEqual(file2.blocks.length); + expect(file2.addedLines).toEqual(1); + expect(file2.deletedLines).toEqual(0); + expect(file2.oldName).toEqual("sample1.js"); + expect(file2.newName).toEqual("sample1.js"); + expect(file2.blocks.length).toEqual(1); const linesContent = file2.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual(["+test1"]); + expect(["+test1"]).toEqual(linesContent); }); - it("should parse diff with --- and +++ in the context lines", function() { + it("should parse diff with --- and +++ in the context lines", () => { const diff = "--- sample.js\n" + "+++ sample.js\n" + @@ -512,40 +512,40 @@ describe("DiffParser", function() { "+++ 2\n" + "++++ 2"; - const result = DiffParser.generateDiffJson(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(3).toEqual(file1.addedLines); - expect(3).toEqual(file1.deletedLines); - expect("sample.js").toEqual(file1.oldName); - expect("sample.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(3); + expect(file1.deletedLines).toEqual(3); + expect(file1.oldName).toEqual("sample.js"); + expect(file1.newName).toEqual("sample.js"); + expect(file1.blocks.length).toEqual(1); const linesContent = file1.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual([" test", " ", "-- 1", "--- 1", "---- 1", " ", "++ 2", "+++ 2", "++++ 2"]); + expect([" test", " ", "-- 1", "--- 1", "---- 1", " ", "++ 2", "+++ 2", "++++ 2"]).toEqual(linesContent); }); - it("should parse diff without proper hunk headers", function() { + it("should parse diff without proper hunk headers", () => { const diff = "--- sample.js\n" + "+++ sample.js\n" + "@@ @@\n" + " test"; - const result = DiffParser.generateDiffJson(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(0).toEqual(file1.addedLines); - expect(0).toEqual(file1.deletedLines); - expect("sample.js").toEqual(file1.oldName); - expect("sample.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(0); + expect(file1.deletedLines).toEqual(0); + expect(file1.oldName).toEqual("sample.js"); + expect(file1.newName).toEqual("sample.js"); + expect(file1.blocks.length).toEqual(1); const linesContent = file1.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual([" test"]); + expect([" test"]).toEqual(linesContent); }); - it("should parse binary file diff", function() { + it("should parse binary file diff", () => { const diff = "diff --git a/last-changes-config.png b/last-changes-config.png\n" + "index 322248b..56fc1f2 100644\n" + @@ -553,19 +553,19 @@ describe("DiffParser", function() { "+++ b/last-changes-config.png\n" + "Binary files differ"; - const result = DiffParser.generateDiffJson(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(0).toEqual(file1.addedLines); - expect(0).toEqual(file1.deletedLines); - expect("last-changes-config.png").toEqual(file1.oldName); - expect("last-changes-config.png").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(0).toEqual(file1.blocks[0].lines.length); - expect("Binary files differ").toEqual(file1.blocks[0].header); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(0); + expect(file1.deletedLines).toEqual(0); + expect(file1.oldName).toEqual("last-changes-config.png"); + expect(file1.newName).toEqual("last-changes-config.png"); + expect(file1.blocks.length).toEqual(1); + expect(file1.blocks[0].lines.length).toEqual(0); + expect(file1.blocks[0].header).toEqual("Binary files differ"); }); - it("should parse diff with --find-renames", function() { + it("should parse diff with --find-renames", () => { const diff = "diff --git a/src/test-bar.js b/src/test-baz.js\n" + "similarity index 98%\n" + @@ -581,22 +581,22 @@ describe("DiffParser", function() { " }\n" + " "; - const result = DiffParser.generateDiffJson(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(1).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("src/test-bar.js").toEqual(file1.oldName); - expect("src/test-baz.js").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(5).toEqual(file1.blocks[0].lines.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(1); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("src/test-bar.js"); + expect(file1.newName).toEqual("src/test-baz.js"); + expect(file1.blocks.length).toEqual(1); + expect(file1.blocks[0].lines.length).toEqual(5); const linesContent = file1.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual([" function foo() {", '-var bar = "Whoops!";', '+var baz = "Whoops!";', " }", " "]); + expect([" function foo() {", '-var bar = "Whoops!";', '+var baz = "Whoops!";', " }", " "]).toEqual(linesContent); }); - it("should parse diff with prefix 2", function() { + it("should parse diff with prefix 2", () => { const diff = 'diff --git "\tTest.scala" "\tScalaTest.scala"\n' + "similarity index 88%\n" + @@ -640,36 +640,36 @@ describe("DiffParser", function() { " }\n" + " "; - const result = DiffParser.generateDiffJson(diff, { srcPrefix: "\t", dstPrefix: "\t" }); - expect(3).toEqual(result.length); + const result = parse(diff, { srcPrefix: "\t", dstPrefix: "\t" }); + expect(result.length).toEqual(3); const file1 = result[0]; - expect(2).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("Test.scala").toEqual(file1.oldName); - expect("ScalaTest.scala").toEqual(file1.newName); - expect(2).toEqual(file1.blocks.length); - expect(8).toEqual(file1.blocks[0].lines.length); - expect(7).toEqual(file1.blocks[1].lines.length); + expect(file1.addedLines).toEqual(2); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("Test.scala"); + expect(file1.newName).toEqual("ScalaTest.scala"); + expect(file1.blocks.length).toEqual(2); + expect(file1.blocks[0].lines.length).toEqual(8); + expect(file1.blocks[1].lines.length).toEqual(7); const file2 = result[1]; - expect("/dev/null").toEqual(file2.oldName); - expect("tardis.png").toEqual(file2.newName); + expect(file2.oldName).toEqual("/dev/null"); + expect(file2.newName).toEqual("tardis.png"); const file3 = result[2]; - expect(1).toEqual(file3.addedLines); - expect(1).toEqual(file3.deletedLines); - expect("src/test-bar.js").toEqual(file3.oldName); - expect("src/test-baz.js").toEqual(file3.newName); - expect(1).toEqual(file3.blocks.length); - expect(5).toEqual(file3.blocks[0].lines.length); + expect(file3.addedLines).toEqual(1); + expect(file3.deletedLines).toEqual(1); + expect(file3.oldName).toEqual("src/test-bar.js"); + expect(file3.newName).toEqual("src/test-baz.js"); + expect(file3.blocks.length).toEqual(1); + expect(file3.blocks[0].lines.length).toEqual(5); const linesContent = file3.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual([" function foo() {", '-var bar = "Whoops!";', '+var baz = "Whoops!";', " }", " "]); + expect([" function foo() {", '-var bar = "Whoops!";', '+var baz = "Whoops!";', " }", " "]).toEqual(linesContent); }); - it("should parse binary with content", function() { + it("should parse binary with content", () => { const diff = "diff --git a/favicon.png b/favicon.png\n" + "deleted file mode 100644\n" + @@ -703,26 +703,26 @@ describe("DiffParser", function() { " }\n" + " "; - const result = DiffParser.generateDiffJson(diff); - expect(2).toEqual(result.length); + const result = parse(diff); + expect(result.length).toEqual(2); const file1 = result[0]; - expect("favicon.png").toEqual(file1.oldName); - expect("favicon.png").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); - expect(0).toEqual(file1.blocks[0].lines.length); + expect(file1.oldName).toEqual("favicon.png"); + expect(file1.newName).toEqual("favicon.png"); + expect(file1.blocks.length).toEqual(1); + expect(file1.blocks[0].lines.length).toEqual(0); const file2 = result[1]; - expect(1).toEqual(file2.addedLines); - expect(1).toEqual(file2.deletedLines); - expect("src/test-bar.js").toEqual(file2.oldName); - expect("src/test-baz.js").toEqual(file2.newName); - expect(1).toEqual(file2.blocks.length); - expect(5).toEqual(file2.blocks[0].lines.length); + expect(file2.addedLines).toEqual(1); + expect(file2.deletedLines).toEqual(1); + expect(file2.oldName).toEqual("src/test-bar.js"); + expect(file2.newName).toEqual("src/test-baz.js"); + expect(file2.blocks.length).toEqual(1); + expect(file2.blocks[0].lines.length).toEqual(5); const linesContent = file2.blocks[0].lines.map(function(line) { return line.content; }); - expect(linesContent).toEqual([" function foo() {", '-var bar = "Whoops!";', '+var baz = "Whoops!";', " }", " "]); + expect([" function foo() {", '-var bar = "Whoops!";', '+var baz = "Whoops!";', " }", " "]).toEqual(linesContent); }); }); }); diff --git a/src/__tests__/diff2html-tests.js b/src/__tests__/diff2html-tests.ts similarity index 85% rename from src/__tests__/diff2html-tests.js rename to src/__tests__/diff2html-tests.ts index 04810e7..e859b05 100644 --- a/src/__tests__/diff2html-tests.js +++ b/src/__tests__/diff2html-tests.ts @@ -1,4 +1,5 @@ -const Diff2Html = require("../diff2html.js").Diff2Html; +import { parse, html } from "../diff2html"; +import { DiffFile, LineType } from "../render-utils"; const diffExample1 = "diff --git a/sample b/sample\n" + @@ -9,27 +10,27 @@ const diffExample1 = "-test\n" + "+test1\n"; -const jsonExample1 = [ +const jsonExample1: DiffFile[] = [ { blocks: [ { lines: [ { content: "-test", - type: "d2h-del", + type: LineType.DELETE, oldNumber: 1, - newNumber: null + newNumber: undefined }, { content: "+test1", - type: "d2h-ins", - oldNumber: null, + type: LineType.INSERT, + oldNumber: undefined, newNumber: 1 } ], - oldStartLine: "1", - oldStartLine2: null, - newStartLine: "1", + oldStartLine: 1, + oldStartLine2: undefined, + newStartLine: 1, header: "@@ -1 +1 @@" } ], @@ -38,9 +39,10 @@ const jsonExample1 = [ checksumBefore: "0000001", checksumAfter: "0ddf2ba", oldName: "sample", - language: undefined, newName: "sample", - isCombined: false + language: "", + isCombined: false, + isGitDiff: true } ]; @@ -183,9 +185,9 @@ const htmlSideExample1 = const htmlSideExample1WithFilesSummary = filesExample1 + htmlSideExample1; -describe("Diff2Html", function() { - describe("getJsonFromDiff", function() { - it("should parse simple diff to json", function() { +describe("Diff2Html", () => { + describe("getJsonFromDiff", () => { + it("should parse simple diff to json", () => { const diff = "diff --git a/sample b/sample\n" + "index 0000001..0ddf2ba\n" + @@ -194,19 +196,19 @@ describe("Diff2Html", function() { "@@ -1 +1 @@\n" + "-test\n" + "+test1\n"; - const result = Diff2Html.getJsonFromDiff(diff); + const result = parse(diff); const file1 = result[0]; - expect(1).toEqual(result.length); - expect(1).toEqual(file1.addedLines); - expect(1).toEqual(file1.deletedLines); - expect("sample").toEqual(file1.oldName); - expect("sample").toEqual(file1.newName); - expect(1).toEqual(file1.blocks.length); + expect(result.length).toEqual(1); + expect(file1.addedLines).toEqual(1); + expect(file1.deletedLines).toEqual(1); + expect(file1.oldName).toEqual("sample"); + expect(file1.newName).toEqual("sample"); + expect(file1.blocks.length).toEqual(1); }); // Test case for issue #49 - it("should parse diff with added EOF", function() { + it("should parse diff with added EOF", () => { const diff = "diff --git a/sample.scala b/sample.scala\n" + "index b583263..8b2fc3e 100644\n" + @@ -223,67 +225,67 @@ describe("Diff2Html", function() { "+ IndexLock, RepositoryError, NotValidRepo, PullRequestNotMergeable, BranchError,\n" + "+ PluginError, CodeParserError, EngineError = Value\n" + "+}\n"; - const result = Diff2Html.getJsonFromDiff(diff); + const result = parse(diff); - expect(50).toEqual(result[0].blocks[0].lines[0].oldNumber); - expect(50).toEqual(result[0].blocks[0].lines[0].newNumber); + expect(result[0].blocks[0].lines[0].oldNumber).toEqual(50); + expect(result[0].blocks[0].lines[0].newNumber).toEqual(50); - expect(51).toEqual(result[0].blocks[0].lines[1].oldNumber); - expect(51).toEqual(result[0].blocks[0].lines[1].newNumber); + expect(result[0].blocks[0].lines[1].oldNumber).toEqual(51); + expect(result[0].blocks[0].lines[1].newNumber).toEqual(51); - expect(52).toEqual(result[0].blocks[0].lines[2].oldNumber); - expect(52).toEqual(result[0].blocks[0].lines[2].newNumber); + expect(result[0].blocks[0].lines[2].oldNumber).toEqual(52); + expect(result[0].blocks[0].lines[2].newNumber).toEqual(52); - expect(53).toEqual(result[0].blocks[0].lines[3].oldNumber); - expect(null).toEqual(result[0].blocks[0].lines[3].newNumber); + expect(result[0].blocks[0].lines[3].oldNumber).toEqual(53); + expect(result[0].blocks[0].lines[3].newNumber).toBeUndefined(); - expect(54).toEqual(result[0].blocks[0].lines[4].oldNumber); - expect(null).toEqual(result[0].blocks[0].lines[4].newNumber); + expect(result[0].blocks[0].lines[4].oldNumber).toEqual(54); + expect(result[0].blocks[0].lines[4].newNumber).toBeUndefined(); - expect(null).toEqual(result[0].blocks[0].lines[5].oldNumber); - expect(53).toEqual(result[0].blocks[0].lines[5].newNumber); + expect(result[0].blocks[0].lines[5].oldNumber).toBeUndefined(); + expect(result[0].blocks[0].lines[5].newNumber).toEqual(53); - expect(null).toEqual(result[0].blocks[0].lines[6].oldNumber); - expect(54).toEqual(result[0].blocks[0].lines[6].newNumber); + expect(result[0].blocks[0].lines[6].oldNumber).toBeUndefined(); + expect(result[0].blocks[0].lines[6].newNumber).toEqual(54); - expect(null).toEqual(result[0].blocks[0].lines[7].oldNumber); - expect(55).toEqual(result[0].blocks[0].lines[7].newNumber); + expect(result[0].blocks[0].lines[7].oldNumber).toBeUndefined(); + expect(result[0].blocks[0].lines[7].newNumber).toEqual(55); - expect(null).toEqual(result[0].blocks[0].lines[8].oldNumber); - expect(56).toEqual(result[0].blocks[0].lines[8].newNumber); + expect(result[0].blocks[0].lines[8].oldNumber).toBeUndefined(); + expect(result[0].blocks[0].lines[8].newNumber).toEqual(56); }); - it("should generate pretty line by line html from diff", function() { - const result = Diff2Html.getPrettyHtmlFromDiff(diffExample1); - expect(htmlLineExample1).toEqual(result); + it("should generate pretty line by line html from diff", () => { + const result = html(diffExample1); + expect(result).toEqual(htmlLineExample1); }); - it("should generate pretty line by line html from json", function() { - const result = Diff2Html.getPrettyHtmlFromJson(jsonExample1); - expect(htmlLineExample1).toEqual(result); + it("should generate pretty line by line html from json", () => { + const result = html(jsonExample1); + expect(result).toEqual(htmlLineExample1); }); - it("should generate pretty diff with files summary", function() { - const result = Diff2Html.getPrettyHtmlFromDiff(diffExample1, { showFiles: true }); - expect(htmlLineExample1WithFilesSummary).toEqual(result); + it("should generate pretty diff with files summary", () => { + const result = html(diffExample1, { showFiles: true }); + expect(result).toEqual(htmlLineExample1WithFilesSummary); }); - it("should generate pretty side by side html from diff", function() { - const result = Diff2Html.getPrettySideBySideHtmlFromDiff(diffExample1); - expect(htmlSideExample1).toEqual(result); + it("should generate pretty side by side html from diff", () => { + const result = html(diffExample1, { outputFormat: "side-by-side" }); + expect(result).toEqual(htmlSideExample1); }); - it("should generate pretty side by side html from json", function() { - const result = Diff2Html.getPrettySideBySideHtmlFromJson(jsonExample1); - expect(htmlSideExample1).toEqual(result); + it("should generate pretty side by side html from json", () => { + const result = html(jsonExample1, { outputFormat: "side-by-side" }); + expect(result).toEqual(htmlSideExample1); }); - it("should generate pretty side by side html from diff 2", function() { - const result = Diff2Html.getPrettySideBySideHtmlFromDiff(diffExample1, { showFiles: true }); - expect(htmlSideExample1WithFilesSummary).toEqual(result); + it("should generate pretty side by side html from diff 2", () => { + const result = html(diffExample1, { outputFormat: "side-by-side", showFiles: true }); + expect(result).toEqual(htmlSideExample1WithFilesSummary); }); - it("should generate pretty side by side html from diff with html on headers", function() { + it("should generate pretty side by side html from diff with html on headers", () => { const diffExample2 = "diff --git a/CHANGELOG.md b/CHANGELOG.md\n" + "index fc3e3f4..b486d10 100644\n" + @@ -516,8 +518,8 @@ describe("Diff2Html", function() { "\n" + ""; - const result = Diff2Html.getPrettyHtmlFromDiff(diffExample2); - expect(result).toEqual(htmlExample2); + const result = html(diffExample2); + expect(htmlExample2).toEqual(result); }); }); }); diff --git a/src/__tests__/file-list-printer-tests.js b/src/__tests__/file-list-printer-tests.ts similarity index 81% rename from src/__tests__/file-list-printer-tests.js rename to src/__tests__/file-list-printer-tests.ts index 9361474..102c11f 100644 --- a/src/__tests__/file-list-printer-tests.js +++ b/src/__tests__/file-list-printer-tests.ts @@ -1,17 +1,30 @@ -const FileListPrinter = require("../file-list-printer.js").FileListPrinter; +import { render } from "../file-list-renderer"; +import HoganJsUtils from "../hoganjs-utils"; -describe("FileListPrinter", function() { - describe("generateFileList", function() { - it("should expose old and new files to templates", function() { +describe("FileListPrinter", () => { + describe("generateFileList", () => { + it("should expose old and new files to templates", () => { + const hoganUtils = new HoganJsUtils({ + rawTemplates: { + "file-summary-wrapper": "{{{files}}}", + "file-summary-line": "{{oldName}}, {{newName}}, {{fileName}}" + } + }); const files = [ { - addedlines: 12, - deletedlines: 41, + isCombined: false, + isGitDiff: false, + blocks: [], + addedLines: 12, + deletedLines: 41, language: "js", oldName: "my/file/name.js", newName: "my/file/name.js" }, { + isCombined: false, + isGitDiff: false, + blocks: [], addedLines: 12, deletedLines: 41, language: "js", @@ -19,6 +32,9 @@ describe("FileListPrinter", function() { newName: "my/file/name2.js" }, { + isCombined: false, + isGitDiff: false, + blocks: [], addedLines: 12, deletedLines: 0, language: "js", @@ -27,6 +43,9 @@ describe("FileListPrinter", function() { isNew: true }, { + isCombined: false, + isGitDiff: false, + blocks: [], addedLines: 0, deletedLines: 41, language: "js", @@ -36,26 +55,23 @@ describe("FileListPrinter", function() { } ]; - const fileListPrinter = new FileListPrinter({ - rawTemplates: { - "file-summary-wrapper": "{{{files}}}", - "file-summary-line": "{{oldName}}, {{newName}}, {{fileName}}" - } - }); - - const fileHtml = fileListPrinter.generateFileList(files); + const fileHtml = render(files, hoganUtils); const expected = "my/file/name.js, my/file/name.js, my/file/name.js\n" + "my/file/name1.js, my/file/name2.js, my/file/{name1.js → name2.js}\n" + "dev/null, my/file/name.js, my/file/name.js\n" + "my/file/name.js, dev/null, my/file/name.js"; - expect(expected).toEqual(fileHtml); + expect(fileHtml).toEqual(expected); }); - it("should work for all kinds of files", function() { + it("should work for all kinds of files", () => { + const hoganUtils = new HoganJsUtils({}); const files = [ { + isCombined: false, + isGitDiff: false, + blocks: [], addedLines: 12, deletedLines: 41, language: "js", @@ -63,6 +79,9 @@ describe("FileListPrinter", function() { newName: "my/file/name.js" }, { + isCombined: false, + isGitDiff: false, + blocks: [], addedLines: 12, deletedLines: 41, language: "js", @@ -70,6 +89,9 @@ describe("FileListPrinter", function() { newName: "my/file/name2.js" }, { + isCombined: false, + isGitDiff: false, + blocks: [], addedLines: 12, deletedLines: 0, language: "js", @@ -78,6 +100,9 @@ describe("FileListPrinter", function() { isNew: true }, { + isCombined: false, + isGitDiff: false, + blocks: [], addedLines: 0, deletedLines: 41, language: "js", @@ -87,8 +112,7 @@ describe("FileListPrinter", function() { } ]; - const fileListPrinter = new FileListPrinter(); - const fileHtml = fileListPrinter.generateFileList(files); + const fileHtml = render(files, hoganUtils); const expected = '
{{myName}}
"); - - const config = { templates: { "generic-empty-diff": emptyDiffTemplate } }; - const hoganUtils = new (require("../hoganjs-utils.js")).HoganJsUtils(config); - const result = hoganUtils.render("generic", "empty-diff", { myName: "Rodrigo Fernandes" }); - expect("Rodrigo Fernandes
").toEqual(result); - }); - - it("should allow templates to be overridden with uncompiled templates", function() { - const emptyDiffTemplate = "{{myName}}
"; - - const config = { rawTemplates: { "generic-empty-diff": emptyDiffTemplate } }; - const hoganUtils = new (require("../hoganjs-utils.js")).HoganJsUtils(config); - const result = hoganUtils.render("generic", "empty-diff", { myName: "Rodrigo Fernandes" }); - expect("Rodrigo Fernandes
").toEqual(result); - }); - - it("should allow templates to be overridden giving priority to compiled templates", function() { - const emptyDiffTemplate = HoganJsUtils.compile("{{myName}}
"); - const emptyDiffTemplateUncompiled = "Not used!
"; - - const config = { - templates: { "generic-empty-diff": emptyDiffTemplate }, - rawTemplates: { "generic-empty-diff": emptyDiffTemplateUncompiled } - }; - const hoganUtils = new (require("../hoganjs-utils.js")).HoganJsUtils(config); - const result = hoganUtils.render("generic", "empty-diff", { myName: "Rodrigo Fernandes" }); - expect("Rodrigo Fernandes
").toEqual(result); - }); - }); -}); diff --git a/src/__tests__/hogan-cache-tests.ts b/src/__tests__/hogan-cache-tests.ts new file mode 100644 index 0000000..d292bab --- /dev/null +++ b/src/__tests__/hogan-cache-tests.ts @@ -0,0 +1,66 @@ +import HoganJsUtils from "../hoganjs-utils"; +import { CSSLineClass } from "../render-utils"; + +describe("HoganJsUtils", () => { + describe("render", () => { + const emptyDiffHtml = + "{{myName}}
"); + const hoganJsUtils = new HoganJsUtils({ compiledTemplates: { "generic-empty-diff": emptyDiffTemplate } }); + + const result = hoganJsUtils.render("generic", "empty-diff", { myName: "Rodrigo Fernandes" }); + expect(result).toEqual("Rodrigo Fernandes
"); + }); + + it("should allow templates to be overridden with uncompiled templates", () => { + const emptyDiffTemplate = "{{myName}}
"; + const hoganJsUtils = new HoganJsUtils({ rawTemplates: { "generic-empty-diff": emptyDiffTemplate } }); + + const result = hoganJsUtils.render("generic", "empty-diff", { myName: "Rodrigo Fernandes" }); + expect(result).toEqual("Rodrigo Fernandes
"); + }); + + it("should allow templates to be overridden giving priority to raw templates", () => { + const emptyDiffTemplate = HoganJsUtils.compile("Not used!
"); + const emptyDiffTemplateUncompiled = "{{myName}}
"; + const hoganJsUtils = new HoganJsUtils({ + compiledTemplates: { "generic-empty-diff": emptyDiffTemplate }, + rawTemplates: { "generic-empty-diff": emptyDiffTemplateUncompiled } + }); + + const result = hoganJsUtils.render("generic", "empty-diff", { myName: "Rodrigo Fernandes" }); + expect(result).toEqual("Rodrigo Fernandes
"); + }); + }); +}); diff --git a/src/__tests__/line-by-line-tests.js b/src/__tests__/line-by-line-tests.ts similarity index 70% rename from src/__tests__/line-by-line-tests.js rename to src/__tests__/line-by-line-tests.ts index 60b5836..0c840bd 100644 --- a/src/__tests__/line-by-line-tests.js +++ b/src/__tests__/line-by-line-tests.ts @@ -1,10 +1,13 @@ -const LineByLinePrinter = require("../line-by-line-printer.js").LineByLinePrinter; +import LineByLineRenderer from "../line-by-line-renderer"; +import HoganJsUtils from "../hoganjs-utils"; +import { LineType, CSSLineClass, DiffLine, DiffFile } from "../render-utils"; -describe("LineByLinePrinter", function() { - describe("_generateEmptyDiff", function() { - it("should return an empty diff", function() { - const lineByLinePrinter = new LineByLinePrinter({}); - const fileHtml = lineByLinePrinter._generateEmptyDiff(); +describe("LineByLineRenderer", () => { + describe("_generateEmptyDiff", () => { + it("should return an empty diff", () => { + const hoganUtils = new HoganJsUtils({}); + const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {}); + const fileHtml = lineByLineRenderer.generateEmptyDiff(); const expected = "