You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.4 KiB
JavaScript

'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.sync = sync;
var _child_process = require('child_process');
var _fs = require('fs');
var _path = require('path');
var _md5Hex = require('md5-hex');
var _md5Hex2 = _interopRequireDefault(_md5Hex);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function tryReadFileSync(file) {
try {
return (0, _fs.readFileSync)(file);
} catch (err) {
return null;
}
}
var TEN_MEBIBYTE = 1024 * 1024 * 10;
var git = {
tryGetRef: function (dir, head) {
var m = /^ref: (.+)$/.exec(head.toString('utf8').trim());
if (!m) return null;
return tryReadFileSync((0, _path.join)(dir, '.git', m[1]));
},
tryGetDiff: function (dir) {
if (!_child_process.execFileSync) return null;
try {
// Attempt to get consistent output no matter the platform. Diff both
// staged and unstaged changes.
return (0, _child_process.execFileSync)('git', ['--no-pager', 'diff', 'HEAD', '--no-color', '--no-ext-diff'], {
cwd: dir,
maxBuffer: TEN_MEBIBYTE,
env: _extends({}, process.env, {
// Force the GIT_DIR to prevent git from diffing a parent repository
// in case the directory isn't actually a repository.
GIT_DIR: (0, _path.join)(dir, '.git')
}),
// Ignore stderr.
stdio: ['ignore', 'pipe', 'ignore']
});
} catch (err) {
return null;
}
}
};
function addPackageData(inputs, path) {
var dir = (0, _fs.statSync)(path).isDirectory() ? path : (0, _path.dirname)(path);
inputs.push(dir);
var pkg = (0, _fs.readFileSync)((0, _path.join)(dir, 'package.json'));
inputs.push(pkg);
var head = tryReadFileSync((0, _path.join)(dir, '.git', 'HEAD'));
if (head) {
inputs.push(head);
var packed = tryReadFileSync((0, _path.join)(dir, '.git', 'packed-refs'));
if (packed) inputs.push(packed);
var ref = git.tryGetRef(dir, head);
if (ref) inputs.push(ref);
var diff = git.tryGetDiff(dir);
if (diff) inputs.push(diff);
}
}
function computeHash(paths, pepper, salt) {
var inputs = [];
if (pepper) inputs.push(pepper);
if (typeof salt !== 'undefined') {
if (Buffer.isBuffer(salt) || typeof salt === 'string') {
inputs.push(salt);
} else if (typeof salt === 'object' && salt !== null) {
inputs.push(JSON.stringify(salt));
} else {
throw new TypeError('Salt must be an Array, Buffer, Object or string');
}
}
for (var i = 0; i < paths.length; i++) {
addPackageData(inputs, paths[i]);
}
return (0, _md5Hex2.default)(inputs);
}
var ownHash = null;
function sync(paths, salt) {
if (!ownHash) {
// Memoize the hash for package-hash itself.
ownHash = new Buffer(computeHash([__dirname]), 'hex');
}
if (paths === __dirname && typeof salt === 'undefined') {
// Special case that allow the pepper value to be obtained. Mainly here for
// testing purposes.
return ownHash.toString('hex');
}
if (Array.isArray(paths)) {
return computeHash(paths, ownHash, salt);
} else {
return computeHash([paths], ownHash, salt);
}
}
//# sourceMappingURL=index.js.map