fmtjson
Version:
Format json files.
203 lines (160 loc) • 14 kB
JavaScript
/**
* Format json files.
* @function fmtjson
* @param {string|string[]} filename - Filename patterns to format.
* @param {object} [options] - Optional settings.
* @param {number} [options.indent=2] - Number of indent.
* @param {boolean} [options.sort=false] - Sort properties.
* @param {string} [options.mode='644'] - File permission.
* @param {string} [options.cwd=process.cwd()] - Current working path
* @returns {Promise}
*/
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
var argx = require('argx');
var aglob = require('aglob');
var _require = require('asfs'),
readFileAsync = _require.readFileAsync;
var path = require('path');
var _require2 = require('os'),
EOL = _require2.EOL;
var sortProperties = require('./sort_properties');
var writeout = require('writeout');
/** @lends fmtjson */
function fmtjson(_x, _x2) {
return _fmtjson.apply(this, arguments);
}
function _fmtjson() {
_fmtjson = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(src, options) {
var args,
_options,
_options$indent,
indent,
_options$sort,
sort,
_options$mode,
mode,
_options$cwd,
cwd,
_options$ignore,
ignore,
filenames,
results,
_iterator,
_step,
filename,
oldContent,
data,
newContent,
changed,
result,
_args = arguments;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
args = argx(_args);
if (!args.pop('function')) {
_context.next = 3;
break;
}
throw new Error('Callback is not supported now. Use promise interface instead.');
case 3:
src = args.shift('string|array');
options = args.pop('object') || {};
_options = options, _options$indent = _options.indent, indent = _options$indent === void 0 ? 2 : _options$indent, _options$sort = _options.sort, sort = _options$sort === void 0 ? false : _options$sort, _options$mode = _options.mode, mode = _options$mode === void 0 ? '644' : _options$mode, _options$cwd = _options.cwd, cwd = _options$cwd === void 0 ? process.cwd() : _options$cwd, _options$ignore = _options.ignore, ignore = _options$ignore === void 0 ? [] : _options$ignore;
_context.next = 8;
return aglob(src, {
cwd: cwd,
ignore: ignore
});
case 8:
filenames = _context.sent;
results = [];
_iterator = _createForOfIteratorHelper(filenames);
_context.prev = 11;
_iterator.s();
case 13:
if ((_step = _iterator.n()).done) {
_context.next = 33;
break;
}
filename = _step.value;
_context.next = 17;
return readFileAsync(filename);
case 17:
oldContent = _context.sent;
data = JSON.parse(oldContent);
if (sort) {
data = sortProperties(data);
}
newContent = JSON.stringify(data, null, indent) + EOL;
changed = String(oldContent) !== String(newContent);
result = void 0;
if (!changed) {
_context.next = 29;
break;
}
_context.next = 26;
return writeout(filename, newContent, {
mode: mode,
force: true
});
case 26:
result = {
filename: filename,
mode: mode,
changed: true
};
_context.next = 30;
break;
case 29:
result = {
filename: filename,
changed: false
};
case 30:
results.push(result);
case 31:
_context.next = 13;
break;
case 33:
_context.next = 38;
break;
case 35:
_context.prev = 35;
_context.t0 = _context["catch"](11);
_iterator.e(_context.t0);
case 38:
_context.prev = 38;
_iterator.f();
return _context.finish(38);
case 41:
return _context.abrupt("return", _mergeResults(results));
case 42:
case "end":
return _context.stop();
}
}
}, _callee, null, [[11, 35, 38, 41]]);
}));
return _fmtjson.apply(this, arguments);
}
function _mergeResults(results) {
var changed = {};
results.forEach(function (result) {
if (result.changed) {
var filename = path.relative(process.cwd(), result.filename);
changed[filename] = result;
}
});
return changed;
}
fmtjson.sortProperties = sortProperties;
module.exports = fmtjson;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZtdGpzb24uanMiXSwibmFtZXMiOlsiYXJneCIsInJlcXVpcmUiLCJhZ2xvYiIsInJlYWRGaWxlQXN5bmMiLCJwYXRoIiwiRU9MIiwic29ydFByb3BlcnRpZXMiLCJ3cml0ZW91dCIsImZtdGpzb24iLCJzcmMiLCJvcHRpb25zIiwiYXJncyIsInBvcCIsIkVycm9yIiwic2hpZnQiLCJpbmRlbnQiLCJzb3J0IiwibW9kZSIsImN3ZCIsInByb2Nlc3MiLCJpZ25vcmUiLCJmaWxlbmFtZXMiLCJyZXN1bHRzIiwiZmlsZW5hbWUiLCJvbGRDb250ZW50IiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsIm5ld0NvbnRlbnQiLCJzdHJpbmdpZnkiLCJjaGFuZ2VkIiwiU3RyaW5nIiwicmVzdWx0IiwiZm9yY2UiLCJwdXNoIiwiX21lcmdlUmVzdWx0cyIsImZvckVhY2giLCJyZWxhdGl2ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztBQVdBOzs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLElBQUksR0FBR0MsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsSUFBTUMsS0FBSyxHQUFHRCxPQUFPLENBQUMsT0FBRCxDQUFyQjs7ZUFDMEJBLE9BQU8sQ0FBQyxNQUFELEM7SUFBekJFLGEsWUFBQUEsYTs7QUFDUixJQUFNQyxJQUFJLEdBQUdILE9BQU8sQ0FBQyxNQUFELENBQXBCOztnQkFDZ0JBLE9BQU8sQ0FBQyxJQUFELEM7SUFBZkksRyxhQUFBQSxHOztBQUNSLElBQU1DLGNBQWMsR0FBR0wsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQU1NLFFBQVEsR0FBR04sT0FBTyxDQUFDLFVBQUQsQ0FBeEI7QUFFQTs7O1NBQ2VPLE87Ozs7OzJGQUFmLGlCQUF1QkMsR0FBdkIsRUFBNEJDLE9BQTVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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QUFHLEVBQWhCO0FBQ0FSLEVBQUFBLE9BQU8sQ0FBQ2MsT0FBUixDQUFnQixVQUFDSixNQUFELEVBQVk7QUFDMUIsUUFBSUEsTUFBTSxDQUFDRixPQUFYLEVBQW9CO0FBQ2xCLFVBQU1QLFFBQVEsR0FBR25CLElBQUksQ0FBQ2lDLFFBQUwsQ0FBY2xCLE9BQU8sQ0FBQ0QsR0FBUixFQUFkLEVBQTZCYyxNQUFNLENBQUNULFFBQXBDLENBQWpCO0FBQ0FPLE1BQUFBLE9BQU8sQ0FBQ1AsUUFBRCxDQUFQLEdBQW9CUyxNQUFwQjtBQUNEO0FBQ0YsR0FMRDtBQU1BLFNBQU9GLE9BQVA7QUFDRDs7QUFFRHRCLE9BQU8sQ0FBQ0YsY0FBUixHQUF5QkEsY0FBekI7QUFFQWdDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQi9CLE9BQWpCIiwic291cmNlUm9vdCI6Ii4uLy4uL2xpYiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9ybWF0IGpzb24gZmlsZXMuXG4gKiBAZnVuY3Rpb24gZm10anNvblxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGZpbGVuYW1lIC0gRmlsZW5hbWUgcGF0dGVybnMgdG8gZm9ybWF0LlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmluZGVudD0yXSAtIE51bWJlciBvZiBpbmRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNvcnQ9ZmFsc2VdIC0gU29ydCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1vZGU9JzY0NCddIC0gRmlsZSBwZXJtaXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmN3ZD1wcm9jZXNzLmN3ZCgpXSAtIEN1cnJlbnQgd29ya2luZyBwYXRoXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGFyZ3ggPSByZXF1aXJlKCdhcmd4JylcbmNvbnN0IGFnbG9iID0gcmVxdWlyZSgnYWdsb2InKVxuY29uc3QgeyByZWFkRmlsZUFzeW5jIH0gPSByZXF1aXJlKCdhc2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHsgRU9MIH0gPSByZXF1aXJlKCdvcycpXG5jb25zdCBzb3J0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4vc29ydF9wcm9wZXJ0aWVzJylcbmNvbnN0IHdyaXRlb3V0ID0gcmVxdWlyZSgnd3JpdGVvdXQnKVxuXG4vKiogQGxlbmRzIGZtdGpzb24gKi9cbmFzeW5jIGZ1bmN0aW9uIGZtdGpzb24oc3JjLCBvcHRpb25zKSB7XG4gIGNvbnN0IGFyZ3MgPSBhcmd4KGFyZ3VtZW50cylcbiAgaWYgKGFyZ3MucG9wKCdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsYmFjayBpcyBub3Qgc3VwcG9ydGVkIG5vdy4gVXNlIHByb21pc2UgaW50ZXJmYWNlIGluc3RlYWQuJylcbiAgfVxuICBzcmMgPSBhcmdzLnNoaWZ0KCdzdHJpbmd8YXJyYXknKVxuICBvcHRpb25zID0gYXJncy5wb3AoJ29iamVjdCcpIHx8IHt9XG5cbiAgbGV0IHtcbiAgICBpbmRlbnQgPSAyLFxuICAgIHNvcnQgPSBmYWxzZSxcbiAgICBtb2RlID0gJzY0NCcsXG4gICAgY3dkID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBpZ25vcmUgPSBbXVxuICB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IGZpbGVuYW1lcyA9IGF3YWl0IGFnbG9iKHNyYywgeyBjd2QsIGlnbm9yZSB9KVxuICBjb25zdCByZXN1bHRzID0gW11cbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlbmFtZXMpIHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlbmFtZSlcbiAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2Uob2xkQ29udGVudClcbiAgICBpZiAoc29ydCkge1xuICAgICAgZGF0YSA9IHNvcnRQcm9wZXJ0aWVzKGRhdGEpXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBpbmRlbnQpICsgRU9MXG4gICAgY29uc3QgY2hhbmdlZCA9IFN0cmluZyhvbGRDb250ZW50KSAhPT0gU3RyaW5nKG5ld0NvbnRlbnQpXG4gICAgbGV0IHJlc3VsdFxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICBhd2FpdCB3cml0ZW91dChmaWxlbmFtZSwgbmV3Q29udGVudCwge1xuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgfSlcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGNoYW5nZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgY2hhbmdlZDogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0cy5wdXNoKHJlc3VsdClcbiAgfVxuICByZXR1cm4gX21lcmdlUmVzdWx0cyhyZXN1bHRzKVxufVxuXG5mdW5jdGlvbiBfbWVyZ2VSZXN1bHRzKHJlc3VsdHMpIHtcbiAgY29uc3QgY2hhbmdlZCA9IHt9XG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5jaGFuZ2VkKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzdWx0LmZpbGVuYW1lKVxuICAgICAgY2hhbmdlZFtmaWxlbmFtZV0gPSByZXN1bHRcbiAgICB9XG4gIH0pXG4gIHJldHVybiBjaGFuZ2VkXG59XG5cbmZtdGpzb24uc29ydFByb3BlcnRpZXMgPSBzb3J0UHJvcGVydGllc1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZtdGpzb25cbiJdfQ==