UNPKG

@aminya/minijson

Version:

Minify JSON files blazing fast, removing comments/whitespace.

90 lines 10.4 kB
"use strict"; 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==