mirror of
https://github.com/S2-/minifyfromhtml.git
synced 2025-08-03 20:30:04 +02:00
238 lines
6.2 KiB
JavaScript
238 lines
6.2 KiB
JavaScript
"use strict";
|
|
|
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }
|
|
|
|
const fs = require("fs");
|
|
|
|
const path = require("path");
|
|
|
|
const readdir = require("fs-readdir-recursive");
|
|
|
|
const promisify = require("util.promisify");
|
|
|
|
const mkdirp = promisify(require("mkdirp"));
|
|
|
|
const minify = require("./");
|
|
|
|
const EXTENSIONS = [".js", ".mjs"];
|
|
const readFileAsync = promisify(fs.readFile);
|
|
const writeFileAsync = promisify(fs.writeFile);
|
|
const lstat = promisify(fs.lstat);
|
|
|
|
class MinifyFileError extends Error {
|
|
constructor(message, {
|
|
file
|
|
}) {
|
|
super(message);
|
|
this.file = file;
|
|
}
|
|
|
|
} // set defaults
|
|
|
|
|
|
const readFile = file => readFileAsync(file, {
|
|
encoding: "utf-8"
|
|
});
|
|
|
|
const writeFile = (file, data) => writeFileAsync(file, data, {
|
|
encoding: "utf-8"
|
|
});
|
|
|
|
function isJsFile(file) {
|
|
return EXTENSIONS.some(ext => path.extname(file) === ext);
|
|
}
|
|
|
|
function isDir(_x) {
|
|
return _isDir.apply(this, arguments);
|
|
}
|
|
|
|
function _isDir() {
|
|
_isDir = _asyncToGenerator(function* (p) {
|
|
try {
|
|
return (yield lstat(p)).isDirectory();
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
});
|
|
return _isDir.apply(this, arguments);
|
|
}
|
|
|
|
function isFile(_x2) {
|
|
return _isFile.apply(this, arguments);
|
|
} // the async keyword simply exists to denote we are returning a promise
|
|
// even though we don't use await inside it
|
|
|
|
|
|
function _isFile() {
|
|
_isFile = _asyncToGenerator(function* (p) {
|
|
try {
|
|
return (yield lstat(p)).isFile();
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
});
|
|
return _isFile.apply(this, arguments);
|
|
}
|
|
|
|
function readStdin() {
|
|
return _readStdin.apply(this, arguments);
|
|
}
|
|
|
|
function _readStdin() {
|
|
_readStdin = _asyncToGenerator(function* () {
|
|
let code = "";
|
|
const stdin = process.stdin;
|
|
return new Promise(resolve => {
|
|
stdin.setEncoding("utf8");
|
|
stdin.on("readable", () => {
|
|
const chunk = process.stdin.read();
|
|
if (chunk !== null) code += chunk;
|
|
});
|
|
stdin.on("end", () => {
|
|
resolve(code);
|
|
});
|
|
});
|
|
});
|
|
return _readStdin.apply(this, arguments);
|
|
}
|
|
|
|
function handleStdin(_x3, _x4) {
|
|
return _handleStdin.apply(this, arguments);
|
|
}
|
|
|
|
function _handleStdin() {
|
|
_handleStdin = _asyncToGenerator(function* (outputFilename, options) {
|
|
const _minify = minify((yield readStdin()), options),
|
|
code = _minify.code;
|
|
|
|
if (outputFilename) {
|
|
yield writeFile(outputFilename, code);
|
|
} else {
|
|
process.stdout.write(code);
|
|
}
|
|
});
|
|
return _handleStdin.apply(this, arguments);
|
|
}
|
|
|
|
function handleFile(_x5, _x6, _x7) {
|
|
return _handleFile.apply(this, arguments);
|
|
}
|
|
|
|
function _handleFile() {
|
|
_handleFile = _asyncToGenerator(function* (filename, outputFilename, options) {
|
|
const _minify2 = minify((yield readFile(filename)), options),
|
|
code = _minify2.code;
|
|
|
|
if (outputFilename) {
|
|
yield writeFile(outputFilename, code);
|
|
} else {
|
|
process.stdout.write(code);
|
|
}
|
|
});
|
|
return _handleFile.apply(this, arguments);
|
|
}
|
|
|
|
function handleFiles(_x8, _x9, _x10) {
|
|
return _handleFiles.apply(this, arguments);
|
|
}
|
|
|
|
function _handleFiles() {
|
|
_handleFiles = _asyncToGenerator(function* (files, outputDir, options) {
|
|
if (!outputDir) {
|
|
throw new TypeError(`outputDir is falsy. Got "${outputDir}"`);
|
|
}
|
|
|
|
return Promise.all(files.map(file => {
|
|
const outputFilename = path.join(outputDir, path.basename(file));
|
|
return mkdirp(path.dirname(outputFilename)).then(() => handleFile(file, outputFilename, options)).catch(e => Promise.reject(new MinifyFileError(e.message, {
|
|
file
|
|
})));
|
|
}));
|
|
});
|
|
return _handleFiles.apply(this, arguments);
|
|
}
|
|
|
|
function handleDir(_x11, _x12, _x13) {
|
|
return _handleDir.apply(this, arguments);
|
|
}
|
|
|
|
function _handleDir() {
|
|
_handleDir = _asyncToGenerator(function* (dir, outputDir, options) {
|
|
if (!outputDir) {
|
|
throw new TypeError(`outputDir is falsy`);
|
|
} // relative paths
|
|
|
|
|
|
const files = readdir(dir);
|
|
return Promise.all(files.filter(file => isJsFile(file)).map(file => {
|
|
const outputFilename = path.join(outputDir, file);
|
|
const inputFilename = path.join(dir, file);
|
|
return mkdirp(path.dirname(outputFilename)).then(() => handleFile(inputFilename, outputFilename, options)).catch(e => Promise.reject(new MinifyFileError(e.message, {
|
|
file: inputFilename
|
|
})));
|
|
}));
|
|
});
|
|
return _handleDir.apply(this, arguments);
|
|
}
|
|
|
|
function handleArgs(_x14, _x15, _x16) {
|
|
return _handleArgs.apply(this, arguments);
|
|
}
|
|
|
|
function _handleArgs() {
|
|
_handleArgs = _asyncToGenerator(function* (args, outputDir, options) {
|
|
const files = [];
|
|
const dirs = [];
|
|
|
|
if (!Array.isArray(args)) {
|
|
throw new TypeError(`Expected Array. Got ${JSON.stringify(args)}`);
|
|
}
|
|
|
|
var _iteratorNormalCompletion = true;
|
|
var _didIteratorError = false;
|
|
var _iteratorError = undefined;
|
|
|
|
try {
|
|
for (var _iterator = args[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
const arg = _step.value;
|
|
|
|
if (yield isFile(arg)) {
|
|
files.push(arg);
|
|
} else if (yield isDir(arg)) {
|
|
dirs.push(arg);
|
|
} else {
|
|
throw new TypeError(`Input "${arg}" is neither a file nor a directory.`);
|
|
}
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError = true;
|
|
_iteratorError = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
_iterator.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError) {
|
|
throw _iteratorError;
|
|
}
|
|
}
|
|
}
|
|
|
|
return Promise.all([handleFiles(files, outputDir, options), ...dirs.map(dir => handleDir(dir, outputDir, options))]);
|
|
});
|
|
return _handleArgs.apply(this, arguments);
|
|
}
|
|
|
|
module.exports = {
|
|
handleFile,
|
|
handleStdin,
|
|
handleFiles,
|
|
handleDir,
|
|
handleArgs,
|
|
isFile,
|
|
isDir,
|
|
isJsFile,
|
|
readFile,
|
|
writeFile
|
|
}; |