const path = require('path'); const fs = require('fs'); let { hashElement } = require('folder-hash'); /** * 文件对比 * entry {string} 要对比的文件路径 * include {array} 要对比的文件格式 以数组形式 */ class contrast { constructor(options) { this.entry = options.entry; this.include = options.include || ['*.md']; this.fileHash = null; this.oldHash = null; this.differentHash = null; this.outPath = path.join( './cache', options.entry .split(path.sep) .pop() .replace(/(\.md|\.js)/, '') + '.cache' ); } run() { let _that = this; return new Promise((reslove, reject) => { _that.start().then((res) => { this.getCache().then( (out) => { _that.compare(); _that.record(); reslove(_that.differentHash); }, (err) => { reslove(_that.fileHash); _that.record(); } ); }); }); } start() { let _that = this; return new Promise((reslove, reject) => { hashElement(_that.entry, { folders: { exclude: ['.*', 'node_modules', 'test_coverage', '__test__', 'img', 'svg'] }, files: { include: _that.include }, matchBasename: true, }).then((res) => { //获取当前hash _that.fileHash = _that.arraydownGrade(res); if (_that.fileHash) { reslove(_that.fileHash); } else { reject('err'); } }); }); } arraydownGrade(ay) { let arys = {}; let paths = ''; function downGrade(data) { if (data.children && data.children.constructor == Array) { paths = data.name; data.children.map((item) => { downGrade(item); }); } else { let key = data.name.replace(/(\.md|\.js)/, ''); if (key == 'doc') { arys[paths] = data.hash; } else { arys[key] = data.hash; } } } downGrade(ay); return arys; } /** * 获取本地hash记录 */ getCache() { let _that = this; return new Promise((reslove, reject) => { fs.readFile(this.outPath, 'utf8', (err, data) => { if (!err) { _that.oldHash = JSON.parse(data); reslove(); } else { console.error('There are no cached files in your locality'); reject(); } }); }); } compare() { let fileHash = this.fileHash; let oldHash = this.oldHash; let differenthash = {}; for (let newkey in fileHash) { if (oldHash[newkey]) { if (oldHash[newkey] != fileHash[newkey]) { differenthash[newkey] = fileHash[newkey]; } } else { differenthash[newkey] = fileHash[newkey]; } } this.differentHash = differenthash; } record() { let _that = this; this.ishasOutFile('./cache').then((res) => { fs.writeFile(_that.outPath, JSON.stringify(_that.fileHash), 'utf8', (err, res) => {}); }); } ishasOutFile(outPath) { return new Promise((resolve, reject) => { fs.stat(outPath, (err, res) => { if (err) { fs.mkdir(outPath, (err) => { if (err) { reject(err); } else { resolve(true); } }); } else { resolve(true); } }); }); } } module.exports = contrast;