compare-files
Version:
Compare files contents
85 lines (61 loc) • 7.04 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _jsYaml = require('js-yaml');
var _jsYaml2 = _interopRequireDefault(_jsYaml);
var _ini = require('ini');
var _ini2 = _interopRequireDefault(_ini);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var read = function read(pathToFile) {
return _fs2.default.readFileSync(pathToFile, 'utf8');
};
var parse = function parse(text, format) {
var parserMap = {
'.json': JSON.parse,
'.yaml': _jsYaml2.default.load,
'.ini': _ini2.default.parse
};
return parserMap[format](text);
};
var buildAST = function buildAST(obj1, obj2) {
var keys = _lodash2.default.union(_lodash2.default.keys(obj1), _lodash2.default.keys(obj2));
var ast = keys.map(function (key) {
var before = obj1[key];
var after = obj2[key];
if (before instanceof Object && after instanceof Object) {
var _node = { key: key, type: 'nested', children: buildAST(before, after) };
return _node;
}
if (before && after) {
if (before === after) {
var _node2 = { key: key, type: 'unchanged', before: before };
return _node2;
}
var oldNode = { key: key, type: 'deleted', before: before };
var newNode = { key: key, type: 'added', after: after };
return [oldNode, newNode];
}
if (!before) {
var _node3 = { key: key, type: 'added', after: after };
return _node3;
}
var node = { key: key, type: 'deleted', before: before };
return node;
});
return ast;
};
var gendiff = function gendiff(pathToFile1, pathToFile2, renderer) {
var fileContent1 = parse(read(pathToFile1), _path2.default.extname(pathToFile1));
var fileContent2 = parse(read(pathToFile2), _path2.default.extname(pathToFile2));
var ast = buildAST(fileContent1, fileContent2);
return renderer(ast);
};
exports.default = gendiff;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJyZWFkIiwicmVhZEZpbGVTeW5jIiwicGF0aFRvRmlsZSIsInBhcnNlIiwidGV4dCIsImZvcm1hdCIsInBhcnNlck1hcCIsIkpTT04iLCJsb2FkIiwiYnVpbGRBU1QiLCJvYmoxIiwib2JqMiIsImtleXMiLCJ1bmlvbiIsImFzdCIsIm1hcCIsImtleSIsImJlZm9yZSIsImFmdGVyIiwiT2JqZWN0Iiwibm9kZSIsInR5cGUiLCJjaGlsZHJlbiIsIm9sZE5vZGUiLCJuZXdOb2RlIiwiZ2VuZGlmZiIsInBhdGhUb0ZpbGUxIiwicGF0aFRvRmlsZTIiLCJyZW5kZXJlciIsImZpbGVDb250ZW50MSIsImV4dG5hbWUiLCJmaWxlQ29udGVudDIiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLE9BQU8sU0FBUEEsSUFBTztBQUFBLFNBQWMsYUFBR0MsWUFBSCxDQUFnQkMsVUFBaEIsRUFBNEIsTUFBNUIsQ0FBZDtBQUFBLENBQWI7O0FBRUEsSUFBTUMsUUFBUSxTQUFSQSxLQUFRLENBQUNDLElBQUQsRUFBT0MsTUFBUCxFQUFrQjtBQUM5QixNQUFNQyxZQUFZO0FBQ2hCLGFBQVNDLEtBQUtKLEtBREU7QUFFaEIsYUFBUyxpQkFBT0ssSUFGQTtBQUdoQixZQUFRLGNBQUlMO0FBSEksR0FBbEI7O0FBTUEsU0FBT0csVUFBVUQsTUFBVixFQUFrQkQsSUFBbEIsQ0FBUDtBQUNELENBUkQ7O0FBVUEsSUFBTUssV0FBVyxTQUFYQSxRQUFXLENBQUNDLElBQUQsRUFBT0MsSUFBUCxFQUFnQjtBQUMvQixNQUFNQyxPQUFPLGlCQUFFQyxLQUFGLENBQVEsaUJBQUVELElBQUYsQ0FBT0YsSUFBUCxDQUFSLEVBQXNCLGlCQUFFRSxJQUFGLENBQU9ELElBQVAsQ0FBdEIsQ0FBYjs7QUFFQSxNQUFNRyxNQUFNRixLQUFLRyxHQUFMLENBQVMsVUFBQ0MsR0FBRCxFQUFTO0FBQzVCLFFBQU1DLFNBQVNQLEtBQUtNLEdBQUwsQ0FBZjtBQUNBLFFBQU1FLFFBQVFQLEtBQUtLLEdBQUwsQ0FBZDs7QUFFQSxRQUFLQyxrQkFBa0JFLE1BQW5CLElBQStCRCxpQkFBaUJDLE1BQXBELEVBQTZEO0FBQzNELFVBQU1DLFFBQU8sRUFBRUosUUFBRixFQUFPSyxNQUFNLFFBQWIsRUFBdUJDLFVBQVViLFNBQVNRLE1BQVQsRUFBaUJDLEtBQWpCLENBQWpDLEVBQWI7QUFDQSxhQUFPRSxLQUFQO0FBQ0Q7QUFDRCxRQUFJSCxVQUFVQyxLQUFkLEVBQXFCO0FBQ25CLFVBQUlELFdBQVdDLEtBQWYsRUFBc0I7QUFDcEIsWUFBTUUsU0FBTyxFQUFFSixRQUFGLEVBQU9LLE1BQU0sV0FBYixFQUEwQkosY0FBMUIsRUFBYjtBQUNBLGVBQU9HLE1BQVA7QUFDRDs7QUFFRCxVQUFNRyxVQUFVLEVBQUVQLFFBQUYsRUFBT0ssTUFBTSxTQUFiLEVBQXdCSixjQUF4QixFQUFoQjtBQUNBLFVBQU1PLFVBQVUsRUFBRVIsUUFBRixFQUFPSyxNQUFNLE9BQWIsRUFBc0JILFlBQXRCLEVBQWhCO0FBQ0EsYUFBTyxDQUFDSyxPQUFELEVBQVVDLE9BQVYsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxDQUFDUCxNQUFMLEVBQWE7QUFDWCxVQUFNRyxTQUFPLEVBQUVKLFFBQUYsRUFBT0ssTUFBTSxPQUFiLEVBQXNCSCxZQUF0QixFQUFiO0FBQ0EsYUFBT0UsTUFBUDtBQUNEO0FBQ0QsUUFBTUEsT0FBTyxFQUFFSixRQUFGLEVBQU9LLE1BQU0sU0FBYixFQUF3QkosY0FBeEIsRUFBYjtBQUNBLFdBQU9HLElBQVA7QUFDRCxHQXhCVyxDQUFaOztBQTBCQSxTQUFPTixHQUFQO0FBQ0QsQ0E5QkQ7O0FBZ0NBLElBQU1XLFVBQVUsU0FBVkEsT0FBVSxDQUFDQyxXQUFELEVBQWNDLFdBQWQsRUFBMkJDLFFBQTNCLEVBQXdDO0FBQ3RELE1BQU1DLGVBQWUxQixNQUFNSCxLQUFLMEIsV0FBTCxDQUFOLEVBQXlCLGVBQUtJLE9BQUwsQ0FBYUosV0FBYixDQUF6QixDQUFyQjtBQUNBLE1BQU1LLGVBQWU1QixNQUFNSCxLQUFLMkIsV0FBTCxDQUFOLEVBQXlCLGVBQUtHLE9BQUwsQ0FBYUgsV0FBYixDQUF6QixDQUFyQjs7QUFFQSxNQUFNYixNQUFNTCxTQUFTb0IsWUFBVCxFQUF1QkUsWUFBdkIsQ0FBWjs7QUFFQSxTQUFPSCxTQUFTZCxHQUFULENBQVA7QUFDRCxDQVBEOztrQkFTZVcsTyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQganN5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGluaSBmcm9tICdpbmknO1xuXG5jb25zdCByZWFkID0gcGF0aFRvRmlsZSA9PiBmcy5yZWFkRmlsZVN5bmMocGF0aFRvRmlsZSwgJ3V0ZjgnKTtcblxuY29uc3QgcGFyc2UgPSAodGV4dCwgZm9ybWF0KSA9PiB7XG4gIGNvbnN0IHBhcnNlck1hcCA9IHtcbiAgICAnLmpzb24nOiBKU09OLnBhcnNlLFxuICAgICcueWFtbCc6IGpzeWFtbC5sb2FkLFxuICAgICcuaW5pJzogaW5pLnBhcnNlLFxuICB9O1xuXG4gIHJldHVybiBwYXJzZXJNYXBbZm9ybWF0XSh0ZXh0KTtcbn07XG5cbmNvbnN0IGJ1aWxkQVNUID0gKG9iajEsIG9iajIpID0+IHtcbiAgY29uc3Qga2V5cyA9IF8udW5pb24oXy5rZXlzKG9iajEpLCBfLmtleXMob2JqMikpO1xuXG4gIGNvbnN0IGFzdCA9IGtleXMubWFwKChrZXkpID0+IHtcbiAgICBjb25zdCBiZWZvcmUgPSBvYmoxW2tleV07XG4gICAgY29uc3QgYWZ0ZXIgPSBvYmoyW2tleV07XG5cbiAgICBpZiAoKGJlZm9yZSBpbnN0YW5jZW9mIE9iamVjdCkgJiYgKGFmdGVyIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHsga2V5LCB0eXBlOiAnbmVzdGVkJywgY2hpbGRyZW46IGJ1aWxkQVNUKGJlZm9yZSwgYWZ0ZXIpIH07XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgaWYgKGJlZm9yZSAmJiBhZnRlcikge1xuICAgICAgaWYgKGJlZm9yZSA9PT0gYWZ0ZXIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHsga2V5LCB0eXBlOiAndW5jaGFuZ2VkJywgYmVmb3JlIH07XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGROb2RlID0geyBrZXksIHR5cGU6ICdkZWxldGVkJywgYmVmb3JlIH07XG4gICAgICBjb25zdCBuZXdOb2RlID0geyBrZXksIHR5cGU6ICdhZGRlZCcsIGFmdGVyIH07XG4gICAgICByZXR1cm4gW29sZE5vZGUsIG5ld05vZGVdO1xuICAgIH1cbiAgICBpZiAoIWJlZm9yZSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHsga2V5LCB0eXBlOiAnYWRkZWQnLCBhZnRlciB9O1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSB7IGtleSwgdHlwZTogJ2RlbGV0ZWQnLCBiZWZvcmUgfTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFzdDtcbn07XG5cbmNvbnN0IGdlbmRpZmYgPSAocGF0aFRvRmlsZTEsIHBhdGhUb0ZpbGUyLCByZW5kZXJlcikgPT4ge1xuICBjb25zdCBmaWxlQ29udGVudDEgPSBwYXJzZShyZWFkKHBhdGhUb0ZpbGUxKSwgcGF0aC5leHRuYW1lKHBhdGhUb0ZpbGUxKSk7XG4gIGNvbnN0IGZpbGVDb250ZW50MiA9IHBhcnNlKHJlYWQocGF0aFRvRmlsZTIpLCBwYXRoLmV4dG5hbWUocGF0aFRvRmlsZTIpKTtcblxuICBjb25zdCBhc3QgPSBidWlsZEFTVChmaWxlQ29udGVudDEsIGZpbGVDb250ZW50Mik7XG5cbiAgcmV0dXJuIHJlbmRlcmVyKGFzdCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZW5kaWZmO1xuIl19