UNPKG

@mora/tinypng

Version:

基于 tinypng 封装的一个支持 `nodejs`、`命令行`和`webpack`的图片压缩工具

121 lines (120 loc) 3.86 kB
"use strict"; 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;