npm-upgrade
Version:
Interactive CLI utility to easily update outdated NPM dependencies
83 lines (82 loc) • 2.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _isObjectLike2 = _interopRequireDefault(require("lodash/isObjectLike"));
var _each2 = _interopRequireDefault(require("lodash/each"));
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
var _isEqual2 = _interopRequireDefault(require("lodash/isEqual"));
var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
var _assign2 = _interopRequireDefault(require("lodash/assign"));
var _path = require("path");
var _fs = require("fs");
var _del = _interopRequireDefault(require("del"));
var _detectIndent = _interopRequireDefault(require("detect-indent"));
var _packageUtils = require("./packageUtils");
const PROJECT_CONFIG_FILENAME = '.npm-upgrade.json';
const path = Symbol('path');
const storedData = Symbol('storedData');
const read = Symbol('read');
const getData = Symbol('getData');
class Config {
constructor(opts) {
const {
projectRoot
} = opts || {};
this[path] = (0, _path.resolve)(projectRoot || process.cwd(), PROJECT_CONFIG_FILENAME);
this[storedData] = this[read]();
(0, _assign2.default)(this, (0, _cloneDeep2.default)(this[storedData]));
}
save() {
const data = this[getData]();
if ((0, _isEqual2.default)(data, this[storedData])) return;
try {
if ((0, _isEmpty2.default)(data)) {
this.remove();
} else {
const {
source: packageSource
} = (0, _packageUtils.loadPackageJson)();
const {
indent
} = (0, _detectIndent.default)(packageSource);
(0, _fs.writeFileSync)(this[path], JSON.stringify(data, null, indent));
}
} catch (err) {
err.message = `Unable to update npm-upgrade config file: ${err.message}`;
throw err;
}
}
remove() {
return _del.default.sync(this[path]);
}
[read]() {
try {
return require(this[path]);
} catch (err) {
return {};
}
}
[getData]() {
const data = {
...this
};
return cleanDeep(data);
}
}
exports.default = Config;
function cleanDeep(obj) {
(0, _each2.default)(obj, (val, key) => {
if ((0, _isObjectLike2.default)(val)) {
cleanDeep(val);
if ((0, _isEmpty2.default)(val)) {
delete obj[key];
}
} else if (val === null || val === undefined) {
delete obj[key];
}
});
return obj;
}