@mora/tinypng
Version:
基于 tinypng 封装的一个支持 `nodejs`、`命令行`和`webpack`的图片压缩工具
121 lines (120 loc) • 3.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var crypto = require("crypto");
var findup = require("mora-scripts/libs/fs/findup");
var path = require("path");
var fs = require("fs-extra");
var logUpdate = require("log-update");
var NET_FILE_REGEXP = /^\w+:\/\//;
var SVG_FILE_REGEXP = /\.svg$/i;
var homeDir = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME'];
var pkgRoot = (function () {
try {
return path.dirname(findup.pkg());
}
catch (e) {
return process.cwd();
}
})();
function hash(data, algorithm) {
if (algorithm === void 0) { algorithm = 'md5'; }
var hash = crypto.createHash(algorithm);
hash.update(data);
return hash.digest('hex');
}
exports.hash = hash;
function getConfigFromFile(defaultConfigFileName, configFile) {
var result = {};
if (configFile) {
result = require(configFile);
result.configDir = path.dirname(configFile);
}
else {
[process.cwd(), pkgRoot, homeDir].some(function (dir) {
try {
result = require(path.join(dir, defaultConfigFileName));
result.configDir = dir;
return true;
}
catch (e) { }
});
}
return result;
}
function parseConfigResize(resize) {
if (typeof resize !== 'string')
return resize;
var _a = resize.split(/\s*|\s*/), method = _a[0], width = _a[1], heigth = _a[2];
var result = {};
result.method = method;
if (width)
result.width = parseInt(width, 10);
if (heigth)
result.heigth = parseInt(heigth, 10);
return result;
}
function getConfig(options) {
if (options === void 0) { options = {}; }
var config = getConfigFromFile('tinypng-config', options.config);
Object.keys(options).forEach(function (key) {
if (options.hasOwnProperty(key) && options[key] !== undefined)
config[key] = options[key];
});
Object.keys(config).forEach(function (key) {
if (config.configDir && /(Dir|File)$/.test(key))
config[key] = path.resolve(config.configDir, config[key]);
});
if (config.resize)
config.resize = parseConfigResize(config.resize);
if (typeof config.tokens === 'string')
config.tokens = config.tokens ? config.tokens.split(',') : [];
return config;
}
exports.getConfig = getConfig;
function isNetFile(file) {
return NET_FILE_REGEXP.test(file);
}
exports.isNetFile = isNetFile;
function isSvgFile(file) {
return SVG_FILE_REGEXP.test(file);
}
exports.isSvgFile = isSvgFile;
function writeFileSync(filepath, buffer) {
fs.ensureDirSync(path.dirname(filepath));
fs.writeFileSync(filepath, buffer);
}
exports.writeFileSync = writeFileSync;
function runProgressTasks(tasks, callback, _a) {
var _b = _a === void 0 ? {} : _a, _c = _b.indent, indent = _c === void 0 ? '' : _c, _d = _b.quiet, quiet = _d === void 0 ? false : _d;
var total = tasks.length;
if (total === 0)
return callback();
var frames = ['-', '\\', '|', '/'];
var frameIndex = 0;
var finishedCount = 0;
var sid;
var refresh = function () {
if (!quiet) {
logUpdate(indent + "processing " + finishedCount + "/" + total + " " + frames[frameIndex = ++frameIndex % frames.length]);
}
};
var done = function () {
if (!quiet) {
logUpdate.clear();
clearInterval(sid);
}
callback();
};
if (!quiet)
sid = setInterval(refresh, 80);
var next = function (name) {
finishedCount++;
refresh();
if (finishedCount === total) {
quiet ? done() : setTimeout(done, 100);
}
};
tasks.forEach(function (task) { return task(next); });
refresh();
}
exports.runProgressTasks = runProgressTasks;