/
Config.js
82 lines (68 loc) · 1.67 KB
/
Config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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;
}