UNPKG

npm-upgrade

Version:

Interactive CLI utility to easily update outdated NPM dependencies

83 lines (68 loc) 1.71 kB
import {resolve} from 'path'; import {writeFileSync} from 'fs'; import del from 'del'; import _ from 'lodash'; import detectIndent from 'detect-indent'; import {loadPackageJson} from './packageUtils'; const PROJECT_CONFIG_FILENAME = '.npm-upgrade.json'; const path = Symbol('path'); const storedData = Symbol('storedData'); const read = Symbol('read'); const getData = Symbol('getData'); export default class Config { constructor(opts) { const {projectRoot} = opts || {}; this[path] = resolve(projectRoot || process.cwd(), PROJECT_CONFIG_FILENAME); this[storedData] = this[read](); _.assign( this, _.cloneDeep(this[storedData]) ); } save() { const data = this[getData](); if (_.isEqual(data, this[storedData])) return; try { if (_.isEmpty(data)) { this.remove(); } else { const {source: packageSource} = loadPackageJson(); const {indent} = detectIndent(packageSource); 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.sync(this[path]); } [read]() { try { return require(this[path]); } catch (err) { return {}; } } [getData]() { const data = {...this}; return cleanDeep(data); } } function cleanDeep(obj) { _.each(obj, (val, key) => { if (_.isObjectLike(val)) { cleanDeep(val); if (_.isEmpty(val)) { delete obj[key]; } } else if (val === null || val === undefined) { delete obj[key]; } }); return obj; }