-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlock-package.js
More file actions
120 lines (105 loc) · 3.63 KB
/
Copy pathlock-package.js
File metadata and controls
120 lines (105 loc) · 3.63 KB
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env node
const fs = require('fs-extra');
const chalk = require('chalk');
const exec = require('child_process').exec;
const ncu = require('npm-check-updates');
const program = require('commander');
const log = console.log;
const error = chalk.bold.red;
const success = chalk.bold.green;
const warn = chalk.bold.yellow;
const excludedDependencies = ['git', 'sassypam'];
program
.version('0.1.0')
.usage('[-u -f]')
.option('-u, --update', 'Check for dependency updates.', checkNPMUpdates)
.option('-f, --file', 'Package.json file path', lockPackageJSONDependencies)
.parse(process.argv);
function lockPackageJSONDependencies() {
getListDependencies()
.then(loadPackageJSONFile)
.then(writeToPackageJSONFile)
.then(result => log(success(result)))
.catch(err => log(error(err)))
}
/**
* Get list of dependencies for package.json
*
* @returns
*/
function getListDependencies() {
return new Promise((resolve, reject) => {
const path = process.argv[3] ? process.argv[3].replace('/package.json', '') : '';
exec(`npm list --depth=0 --json`, { cwd: path }, (err, stdout, stderr) => {
if (err) {
reject(err)
return;
}
const npmList = JSON.parse(stdout);
const dependenciesList = ['dependencies', 'devDependencies'].reduce((list, propName) => {
for (const key in npmList[propName]) {
const hasExclusion = excludedDependencies.some(dep => new RegExp(dep, 'g').test(key));
if (npmList[propName].hasOwnProperty(key) && !hasExclusion) {
const dependencyInfo = npmList[propName][key];
list.push({ name: key, version: dependencyInfo.version })
}
}
return list;
}, []);
resolve(dependenciesList);
});
})
}
/**
* Load package.json file
*
* @param {{versionName:string, name:string, version:string}[]} list
* @return {Promise<{packageJSONFilePath:string, jsonFile:object}>}
*/
function loadPackageJSONFile(list) {
return new Promise((resolve, reject) => {
const packageJSONFilePath = process.argv[3] || 'package.json';
fs.readJSON(packageJSONFilePath)
.then(packageObj => {
const { dependencies, devDependencies } = packageObj
list.forEach(item => {
if (dependencies[item.name]) {
dependencies[item.name] = item.version
} else {
devDependencies[item.name] = item.version
}
})
resolve({ packageJSONFilePath, jsonFile: packageObj })
})
.catch(err => reject(err))
})
}
/**
* Write to package.json
*
* @param {any} { packageJSONFilePath, jsonFile }
*/
function writeToPackageJSONFile({ packageJSONFilePath, jsonFile }) {
return new Promise((resolve, reject) => {
fs.writeJSON(packageJSONFilePath, jsonFile, { spaces: 2 })
.then(result => resolve('package.json file updated'))
.catch(err => reject(err))
})
}
/**
* Check NPM for dependency updates
*
*/
function checkNPMUpdates() {
const path = process.argv[3] || 'package.json';
ncu.run({
// Always specify the path to the package file
packageFile: path,
// Any command-line option can be specified here.
// These are set by default:
silent: true,
jsonUpgraded: true
}).then((upgraded) => {
log(warn('Dependencies to upgrade:'), upgraded);
});
}