@aminya/minijson
Version:
Minify JSON files blazing fast, removing comments/whitespace.
90 lines • 10.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.minifyFiles = minifyFiles;
exports.spawnMinijson = spawnMinijson;
exports.minifyString = minifyString;
const child_process_1 = require("child_process");
const fs_1 = require("fs");
const promises_1 = require("fs/promises");
const path_1 = require("path");
/**
* Minify all the given JSON files in place. It minifies the files in parallel.
*
* @param files An array of paths to the files
* @param hasComment A boolean to support comments in json. Default `true`.
* @returns {Promise<void>} Returns a void promise that resolves when all the files are minified
* @throws {Promise<string | Error>} The promise is rejected with the reason for failure
*/
async function minifyFiles(files, hasComment = true) {
try {
const filesNum = files.length;
if (filesNum === 0) {
return Promise.resolve();
}
await spawnMinijson([...files, hasComment ? "--comment=true" : "--comment=false"]);
}
catch (e) {
console.error(e, "Falling back to jsonminify");
await minifyFilesFallback(files);
}
}
/**
* Spawn minijson with the given arguments
*
* @param args An array of arguments
* @returns {Promise<string>} Returns a promise that resolves to stdout output string when the operation finishes
* @throws {Promise<string | Error>} The promise is rejected with the reason for failure
*/
function spawnMinijson(args) {
return new Promise((resolve, reject) => {
try {
(0, child_process_1.execFile)(minijsonBin, args, (err, stdout, stderr) => {
console.error(stderr);
console.log(stdout);
if (err) {
reject(err);
}
if (stderr !== "") {
reject(stderr);
}
resolve(stdout);
});
}
catch (execErr) {
reject(execErr);
}
});
}
async function minifyFilesFallback(files) {
const jsonminify = require("jsonminify");
await Promise.all(files.map(async (file) => {
const jsonString = await (0, promises_1.readFile)(file, "utf8");
const minifiedJsonString = jsonminify(jsonString);
await (0, promises_1.writeFile)(file, minifiedJsonString);
}));
return;
}
/**
* Minify the given JSON string
*
* @param jsonString The json string you want to minify
* @param hasComment A boolean to support comments in json. Default `true`.
* @returns {Promise<string>} The minified json string
* @throws {Promise<string | Error>} The promise is rejected with the reason for failure
*/
async function minifyString(jsonString, hasComment = true) {
const args = ["--str", jsonString];
if (hasComment) {
args.push("--comment");
}
// trim is needed due to using stdout for interop
return (await spawnMinijson(args)).trim();
}
const exeExtention = process.platform === "win32" ? ".exe" : "";
const binName = `minijson${exeExtention}`;
const minijsonBin = (0, path_1.join)(__dirname, `${process.platform}-${process.arch}`, binName);
// chmod as executable on non-windows
if (process.platform !== "win32") {
(0, fs_1.chmodSync)(minijsonBin, 0o755);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vZGUvbGliLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsa0NBWUM7QUFTRCxzQ0FtQkM7QUFzQkQsb0NBT0M7QUFsRkQsaURBQXdDO0FBQ3hDLDJCQUE4QjtBQUM5QiwwQ0FBaUQ7QUFDakQsK0JBQTJCO0FBRTNCOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsV0FBVyxDQUFDLEtBQXdCLEVBQUUsVUFBVSxHQUFHLElBQUk7SUFDM0UsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtRQUM3QixJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMxQixDQUFDO1FBRUQsTUFBTSxhQUFhLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7SUFDcEYsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixhQUFhLENBQUMsSUFBYztJQUMxQyxPQUFPLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzdDLElBQUksQ0FBQztZQUNILElBQUEsd0JBQVEsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDbEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFFbkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDUixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2IsQ0FBQztnQkFDRCxJQUFJLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNoQixDQUFDO2dCQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNqQixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFBQyxPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLG1CQUFtQixDQUFDLEtBQXdCO0lBQ3pELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUN4QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQy9DLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBVyxDQUFBO1FBQzNELE1BQU0sSUFBQSxvQkFBUyxFQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQzNDLENBQUMsQ0FBQyxDQUNILENBQUE7SUFDRCxPQUFNO0FBQ1IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUFDLFVBQWtCLEVBQUUsVUFBVSxHQUFHLElBQUk7SUFDdEUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDbEMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUNELGlEQUFpRDtJQUNqRCxPQUFPLENBQUMsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUMzQyxDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0FBQy9ELE1BQU0sT0FBTyxHQUFHLFdBQVcsWUFBWSxFQUFFLENBQUE7QUFFekMsTUFBTSxXQUFXLEdBQUcsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFFbkYscUNBQXFDO0FBQ3JDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztJQUNqQyxJQUFBLGNBQVMsRUFBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IHsgY2htb2RTeW5jIH0gZnJvbSBcImZzXCJcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCJcblxuLyoqXG4gKiBNaW5pZnkgYWxsIHRoZSBnaXZlbiBKU09OIGZpbGVzIGluIHBsYWNlLiBJdCBtaW5pZmllcyB0aGUgZmlsZXMgaW4gcGFyYWxsZWwuXG4gKlxuICogQHBhcmFtIGZpbGVzIEFuIGFycmF5IG9mIHBhdGhzIHRvIHRoZSBmaWxlc1xuICogQHBhcmFtIGhhc0NvbW1lbnQgQSBib29sZWFuIHRvIHN1cHBvcnQgY29tbWVudHMgaW4ganNvbi4gRGVmYXVsdCBgdHJ1ZWAuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmV0dXJucyBhIHZvaWQgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIHRoZSBmaWxlcyBhcmUgbWluaWZpZWRcbiAqIEB0aHJvd3Mge1Byb21pc2U8c3RyaW5nIHwgRXJyb3I+fSBUaGUgcHJvbWlzZSBpcyByZWplY3RlZCB3aXRoIHRoZSByZWFzb24gZm9yIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pbmlmeUZpbGVzKGZpbGVzOiByZWFkb25seSBzdHJpbmdbXSwgaGFzQ29tbWVudCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlc051bSA9IGZpbGVzLmxlbmd0aFxuICAgIGlmIChmaWxlc051bSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgYXdhaXQgc3Bhd25NaW5panNvbihbLi4uZmlsZXMsIGhhc0NvbW1lbnQgPyBcIi0tY29tbWVudD10cnVlXCIgOiBcIi0tY29tbWVudD1mYWxzZVwiXSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZSwgXCJGYWxsaW5nIGJhY2sgdG8ganNvbm1pbmlmeVwiKVxuICAgIGF3YWl0IG1pbmlmeUZpbGVzRmFsbGJhY2soZmlsZXMpXG4gIH1cbn1cblxuLyoqXG4gKiBTcGF3biBtaW5panNvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gc3Rkb3V0IG91dHB1dCBzdHJpbmcgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVzXG4gKiBAdGhyb3dzIHtQcm9taXNlPHN0cmluZyB8IEVycm9yPn0gVGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCB0aGUgcmVhc29uIGZvciBmYWlsdXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF3bk1pbmlqc29uKGFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZShtaW5panNvbkJpbiwgYXJncywgKGVyciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihzdGRlcnIpXG4gICAgICAgIGNvbnNvbGUubG9nKHN0ZG91dClcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyICE9PSBcIlwiKSB7XG4gICAgICAgICAgcmVqZWN0KHN0ZGVycilcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHN0ZG91dClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXhlY0Vycikge1xuICAgICAgcmVqZWN0KGV4ZWNFcnIpXG4gICAgfVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBtaW5pZnlGaWxlc0ZhbGxiYWNrKGZpbGVzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICBjb25zdCBqc29ubWluaWZ5ID0gcmVxdWlyZShcImpzb25taW5pZnlcIilcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBqc29uU3RyaW5nID0gYXdhaXQgcmVhZEZpbGUoZmlsZSwgXCJ1dGY4XCIpXG4gICAgICBjb25zdCBtaW5pZmllZEpzb25TdHJpbmcgPSBqc29ubWluaWZ5KGpzb25TdHJpbmcpIGFzIHN0cmluZ1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGUsIG1pbmlmaWVkSnNvblN0cmluZylcbiAgICB9KSxcbiAgKVxuICByZXR1cm5cbn1cblxuLyoqXG4gKiBNaW5pZnkgdGhlIGdpdmVuIEpTT04gc3RyaW5nXG4gKlxuICogQHBhcmFtIGpzb25TdHJpbmcgVGhlIGpzb24gc3RyaW5nIHlvdSB3YW50IHRvIG1pbmlmeVxuICogQHBhcmFtIGhhc0NvbW1lbnQgQSBib29sZWFuIHRvIHN1cHBvcnQgY29tbWVudHMgaW4ganNvbi4gRGVmYXVsdCBgdHJ1ZWAuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgbWluaWZpZWQganNvbiBzdHJpbmdcbiAqIEB0aHJvd3Mge1Byb21pc2U8c3RyaW5nIHwgRXJyb3I+fSBUaGUgcHJvbWlzZSBpcyByZWplY3RlZCB3aXRoIHRoZSByZWFzb24gZm9yIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pbmlmeVN0cmluZyhqc29uU3RyaW5nOiBzdHJpbmcsIGhhc0NvbW1lbnQgPSB0cnVlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYXJncyA9IFtcIi0tc3RyXCIsIGpzb25TdHJpbmddXG4gIGlmIChoYXNDb21tZW50KSB7XG4gICAgYXJncy5wdXNoKFwiLS1jb21tZW50XCIpXG4gIH1cbiAgLy8gdHJpbSBpcyBuZWVkZWQgZHVlIHRvIHVzaW5nIHN0ZG91dCBmb3IgaW50ZXJvcFxuICByZXR1cm4gKGF3YWl0IHNwYXduTWluaWpzb24oYXJncykpLnRyaW0oKVxufVxuXG5jb25zdCBleGVFeHRlbnRpb24gPSBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIi5leGVcIiA6IFwiXCJcbmNvbnN0IGJpbk5hbWUgPSBgbWluaWpzb24ke2V4ZUV4dGVudGlvbn1gXG5cbmNvbnN0IG1pbmlqc29uQmluID0gam9pbihfX2Rpcm5hbWUsIGAke3Byb2Nlc3MucGxhdGZvcm19LSR7cHJvY2Vzcy5hcmNofWAsIGJpbk5hbWUpXG5cbi8vIGNobW9kIGFzIGV4ZWN1dGFibGUgb24gbm9uLXdpbmRvd3NcbmlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSBcIndpbjMyXCIpIHtcbiAgY2htb2RTeW5jKG1pbmlqc29uQmluLCAwbzc1NSlcbn1cbiJdfQ==