node-power-user 0.0.33 → 0.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -6
- package/src/index.js +0 -432
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-power-user",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.35",
|
|
4
4
|
"description": "Easy tools for every Node.js developer!",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -43,12 +43,8 @@
|
|
|
43
43
|
"table": "^6.8.0",
|
|
44
44
|
"yargs": "^16.2.0"
|
|
45
45
|
},
|
|
46
|
-
"files": [
|
|
47
|
-
"bin/",
|
|
48
|
-
"src/"
|
|
49
|
-
],
|
|
50
46
|
"devDependencies": {
|
|
51
47
|
"mocha": "^8.4.0",
|
|
52
48
|
"prepare-package": "^0.0.16"
|
|
53
49
|
}
|
|
54
|
-
}
|
|
50
|
+
}
|
package/src/index.js
DELETED
|
@@ -1,432 +0,0 @@
|
|
|
1
|
-
// CLI GUIDE:
|
|
2
|
-
// https://www.twilio.com/blog/how-to-build-a-cli-with-node-js
|
|
3
|
-
// https://www.npmjs.com/package/@dkundel/create-project
|
|
4
|
-
|
|
5
|
-
// https://www.sitepoint.com/javascript-command-line-interface-cli-node-js/
|
|
6
|
-
// https://github.com/sitepoint-editors/ginit
|
|
7
|
-
const jetpack = require('fs-jetpack');
|
|
8
|
-
const chalk = require('chalk');
|
|
9
|
-
const _ = require('lodash');
|
|
10
|
-
const inquirer = require('inquirer');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const { spawn, exec } = require('child_process');
|
|
13
|
-
const argv = require('yargs').argv;
|
|
14
|
-
const JSON5 = require('json5');
|
|
15
|
-
const powertools = require('node-powertools');
|
|
16
|
-
const { isEqual } = require('lodash');
|
|
17
|
-
const semverIsEqual = require('semver/functions/eq')
|
|
18
|
-
const semverCoerce = require('semver/functions/coerce')
|
|
19
|
-
const table = require('table').table;
|
|
20
|
-
const ProgressBar = require('cli-progress');
|
|
21
|
-
const Npm = require('npm-api');
|
|
22
|
-
const os = require('os');
|
|
23
|
-
|
|
24
|
-
// const npm = require('npm');
|
|
25
|
-
|
|
26
|
-
function Main() {
|
|
27
|
-
const self = this;
|
|
28
|
-
|
|
29
|
-
self.options = {};
|
|
30
|
-
self.npu_packageJSON = {};
|
|
31
|
-
self.proj_path = null;
|
|
32
|
-
self.proj_packageJSONPath = null;
|
|
33
|
-
self.proj_packageJSON = {};
|
|
34
|
-
self.proj_allDependencies = {};
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
Main.prototype.process = async function (options) {
|
|
39
|
-
const self = this;
|
|
40
|
-
self.options = options || {};
|
|
41
|
-
|
|
42
|
-
// console.log('--process.env', process.env);
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
self.npu_packageJSON = require('../package.json');
|
|
46
|
-
} catch (e) {
|
|
47
|
-
throw new Error(`NPU does not contain a valid package.json file!: \n${e}`);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
try {
|
|
51
|
-
self.proj_path = process.cwd();
|
|
52
|
-
self.proj_packageJSONPath = path.resolve(self.proj_path, './package.json');
|
|
53
|
-
self.proj_packageJSON = require(self.proj_packageJSONPath);
|
|
54
|
-
self.proj_allDependencies.pairs = _.merge({}, self.proj_packageJSON.peerDependencies, self.proj_packageJSON.devDependencies, self.proj_packageJSON.dependencies);
|
|
55
|
-
self.proj_allDependencies.list = Object.keys(self.proj_allDependencies.pairs);
|
|
56
|
-
|
|
57
|
-
} catch (e) {
|
|
58
|
-
self.proj_packageJSON = {
|
|
59
|
-
name: 'Unknown Name',
|
|
60
|
-
version: '0.0.0',
|
|
61
|
-
dependencies: {},
|
|
62
|
-
devDependencies: {},
|
|
63
|
-
peerDependencies: {},
|
|
64
|
-
allDependencies: {},
|
|
65
|
-
}
|
|
66
|
-
console.error(chalk.red(`This project does not contain a valid package.json file!: \n${e}`));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// console.log('---args', args);
|
|
70
|
-
// if (Array.isArray(args)) {
|
|
71
|
-
// for (var i = 0; i < args.length; i++) {
|
|
72
|
-
// self.options[args[i]] = true;
|
|
73
|
-
// }
|
|
74
|
-
// } else {
|
|
75
|
-
// Object.keys(args)
|
|
76
|
-
// .forEach((arg, i) => {
|
|
77
|
-
// self.options[arg] = args[arg];
|
|
78
|
-
// });
|
|
79
|
-
// }
|
|
80
|
-
Object.keys(argv)
|
|
81
|
-
.forEach(arg => {
|
|
82
|
-
self.options[arg] = argv[arg]
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
if (self.options.d || self.options.debug || self.options._.includes('debug') || process.env.NPU_LOG === 'true') {
|
|
86
|
-
console.log('argv', argv);
|
|
87
|
-
console.log('options', self.options);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (self.options.wait || self.options._.includes('wait')) {
|
|
91
|
-
const time = parseInt(typeof self.options.wait === 'number' ? self.options.wait : 1000);
|
|
92
|
-
self.log(chalk.blue(`Waiting ${time}...`));
|
|
93
|
-
await powertools.wait(time);
|
|
94
|
-
self.log(chalk.green(`Done waiting`));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (self.options.v || self.options.version || self.options._.includes('version')) {
|
|
98
|
-
self.log(chalk.blue(`Node Power User is v${chalk.bold(self.npu_packageJSON.version)}`));
|
|
99
|
-
return self.npu_packageJSON.version;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (self.options.pv || self.options.project || self.options['project-version'] || self.options._.includes('project')) {
|
|
103
|
-
self.log(chalk.blue(`The current project (${chalk.bold(self.proj_packageJSON.name)}) is v${chalk.bold(self.proj_packageJSON.version)}`));
|
|
104
|
-
return self.proj_packageJSON.version;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (self.options.lp || self.options.listpackages || self.options['list-packages'] || self.options._.includes('listpackages')) {
|
|
108
|
-
self.log(chalk.blue.bold(`Dependencies:`));
|
|
109
|
-
|
|
110
|
-
Object.keys(self.proj_packageJSON.dependencies || {})
|
|
111
|
-
.forEach((dep, i) => {
|
|
112
|
-
self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.dependencies[dep]}`));
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
self.log(chalk.blue.bold(`\nDev Dependencies:`));
|
|
116
|
-
Object.keys(self.proj_packageJSON.devDependencies || {})
|
|
117
|
-
.forEach((dep, i) => {
|
|
118
|
-
self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
self.log(chalk.blue.bold(`\nPeer Dependencies:`));
|
|
122
|
-
Object.keys(self.proj_packageJSON.peerDependencies || {})
|
|
123
|
-
.forEach((dep, i) => {
|
|
124
|
-
self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.peerDependencies[dep]}`));
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
return {
|
|
128
|
-
dependencies: self.proj_packageJSON.dependencies,
|
|
129
|
-
devDependencies: self.proj_packageJSON.devDependencies,
|
|
130
|
-
peerDependencies: self.proj_packageJSON.peerDependencies,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (self.options.out || self.options.outdated || self.options.match || self.options._.includes('out') || self.options._.includes('outdated') || self.options._.includes('match')) {
|
|
135
|
-
// self.log(chalk.blue.bold(`Outdated:`));
|
|
136
|
-
// self.log(chalk.green(`name: package = installed`));
|
|
137
|
-
|
|
138
|
-
const data = [
|
|
139
|
-
['Package', 'package.json', 'Intalled', 'Latest'],
|
|
140
|
-
];
|
|
141
|
-
|
|
142
|
-
const config = {
|
|
143
|
-
columnDefault: {
|
|
144
|
-
// width: 10,
|
|
145
|
-
},
|
|
146
|
-
header: {
|
|
147
|
-
alignment: 'center',
|
|
148
|
-
content: 'Outdated and mismatched packages',
|
|
149
|
-
},
|
|
150
|
-
}
|
|
151
|
-
const progress = new ProgressBar.SingleBar({}, ProgressBar.Presets.shades_classic);
|
|
152
|
-
progress.start(self.proj_allDependencies.list.length, 0);
|
|
153
|
-
|
|
154
|
-
const response = {};
|
|
155
|
-
|
|
156
|
-
let bumpCommand = '';
|
|
157
|
-
|
|
158
|
-
for (var i = 0; i < self.proj_allDependencies.list.length; i++) {
|
|
159
|
-
progress.update(i);
|
|
160
|
-
const dep = self.proj_allDependencies.list[i];
|
|
161
|
-
const depPair = self.proj_allDependencies.pairs[dep];
|
|
162
|
-
const packageVersion = _coerce(depPair);
|
|
163
|
-
const installedVersion = _coerce(
|
|
164
|
-
_getListVersion(
|
|
165
|
-
(await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`)).split(' ')
|
|
166
|
-
)
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
// console.log('---', dep, depPair, _.get(packageVersion, 'version'), _.get(installedVersion, 'version'));
|
|
170
|
-
|
|
171
|
-
// console.log('---dep', dep, packageVersion, installedVersion);
|
|
172
|
-
const latestVersion = await getLatestVersion(dep);
|
|
173
|
-
const isEqual = _isEqual(installedVersion, packageVersion);
|
|
174
|
-
const isLatest = _isEqual(packageVersion, latestVersion);
|
|
175
|
-
const verbLocal = isEqual ? 'green' : 'yellow';
|
|
176
|
-
const verbRemote = isLatest ? 'green' : 'red';
|
|
177
|
-
|
|
178
|
-
if (!isEqual) {
|
|
179
|
-
bumpCommand += `npm i ${dep}@${installedVersion} && `
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// function _color(array) {
|
|
183
|
-
// array.forEach((item, i) => {
|
|
184
|
-
// array[i] = chalk[verb](item);
|
|
185
|
-
// });
|
|
186
|
-
// return array;
|
|
187
|
-
// }
|
|
188
|
-
// data.push(_color([ dep, packageVersion, installedVersion, latestVersion]))
|
|
189
|
-
|
|
190
|
-
// function _color(s) {
|
|
191
|
-
// return chalk[verb](s);
|
|
192
|
-
// }
|
|
193
|
-
|
|
194
|
-
data.push([
|
|
195
|
-
dep,
|
|
196
|
-
packageVersion,
|
|
197
|
-
chalk[verbLocal](installedVersion),
|
|
198
|
-
chalk[verbRemote](latestVersion),
|
|
199
|
-
])
|
|
200
|
-
|
|
201
|
-
response[dep] = {
|
|
202
|
-
isEqual: isEqual,
|
|
203
|
-
isLatest: isLatest,
|
|
204
|
-
package: packageVersion,
|
|
205
|
-
installed: installedVersion,
|
|
206
|
-
latest: latestVersion,
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
// self.log(chalk.blue.bold(`\nDev Dependencies:`));
|
|
213
|
-
// Object.keys(self.proj_packageJSON.devDependencies || {})
|
|
214
|
-
// .forEach((dep, i) => {
|
|
215
|
-
// self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
|
|
216
|
-
// });
|
|
217
|
-
|
|
218
|
-
progress.stop();
|
|
219
|
-
|
|
220
|
-
console.log(table(data, config));
|
|
221
|
-
|
|
222
|
-
if (bumpCommand) {
|
|
223
|
-
bumpCommand = bumpCommand.replace(/&&\s$/ig, '')
|
|
224
|
-
inquirer.prompt([
|
|
225
|
-
{
|
|
226
|
-
type: 'confirm',
|
|
227
|
-
name: 'bump',
|
|
228
|
-
message: 'Would you like to bump the package.json versions?',
|
|
229
|
-
default: true,
|
|
230
|
-
}
|
|
231
|
-
])
|
|
232
|
-
.then(async (answer) => {
|
|
233
|
-
if (answer.bump) {
|
|
234
|
-
asyncCommand(bumpCommand);
|
|
235
|
-
} else {
|
|
236
|
-
}
|
|
237
|
-
})
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
return response;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
if (self.options.global || self.options.g || self.options._.includes('global')) {
|
|
244
|
-
const parentPath = `/Users/${os.userInfo().username}/.nvm/versions/node`;
|
|
245
|
-
const versions = jetpack.list(parentPath);
|
|
246
|
-
const currentNode = process.versions.node;
|
|
247
|
-
|
|
248
|
-
const response = {};
|
|
249
|
-
|
|
250
|
-
// console.log(chalk.bold.blue('NVM Global Modules'));
|
|
251
|
-
|
|
252
|
-
for (var i = 0; i < versions.length; i++) {
|
|
253
|
-
try {
|
|
254
|
-
const parsed = semverCoerce(versions[i]);
|
|
255
|
-
const lib = path.resolve(parentPath, `v${parsed.version}`, 'lib', 'node_modules');
|
|
256
|
-
|
|
257
|
-
const modules = jetpack.list(lib);
|
|
258
|
-
|
|
259
|
-
const data = [
|
|
260
|
-
['Package', 'package.json', 'latest'],
|
|
261
|
-
];
|
|
262
|
-
|
|
263
|
-
const config = {
|
|
264
|
-
columnDefault: {
|
|
265
|
-
// width: 10,
|
|
266
|
-
},
|
|
267
|
-
header: {
|
|
268
|
-
alignment: 'center',
|
|
269
|
-
content: `Global packages for v${parsed.version}`,
|
|
270
|
-
},
|
|
271
|
-
}
|
|
272
|
-
const progress = new ProgressBar.SingleBar({}, ProgressBar.Presets.shades_classic);
|
|
273
|
-
progress.start(modules.length, 0);
|
|
274
|
-
|
|
275
|
-
response[parsed.version] = {};
|
|
276
|
-
|
|
277
|
-
for (var j = 0; j < modules.length; j++) {
|
|
278
|
-
progress.update(i, 0);
|
|
279
|
-
|
|
280
|
-
const mod = modules[j];
|
|
281
|
-
const packagePath = path.resolve(lib, mod, 'package.json');
|
|
282
|
-
try {
|
|
283
|
-
const package = require(packagePath);
|
|
284
|
-
|
|
285
|
-
const packageVersion = package.version;
|
|
286
|
-
const latestVersion = await getLatestVersion(mod);
|
|
287
|
-
// const isEqual = _isEqual(installedVersion, packageVersion);
|
|
288
|
-
const isLatest = _isEqual(packageVersion, latestVersion);
|
|
289
|
-
// const verbLocal = isEqual ? 'green' : 'yellow';
|
|
290
|
-
const verbRemote = isLatest ? 'green' : 'red';
|
|
291
|
-
|
|
292
|
-
data.push([
|
|
293
|
-
mod,
|
|
294
|
-
packageVersion,
|
|
295
|
-
chalk[verbRemote](latestVersion),
|
|
296
|
-
]);
|
|
297
|
-
|
|
298
|
-
response[parsed.version][mod] = {
|
|
299
|
-
packageVersion: packageVersion,
|
|
300
|
-
latestVersion: latestVersion,
|
|
301
|
-
}
|
|
302
|
-
} catch (e) {
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
progress.stop();
|
|
308
|
-
|
|
309
|
-
console.log(table(data, config));
|
|
310
|
-
|
|
311
|
-
} catch (e) {
|
|
312
|
-
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
return response;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
if (self.options.clean || self.options._.includes('clean')) {
|
|
320
|
-
const NPM_INSTALL_FLAG = self.options['no-optional'] || self.options['nooptional'] ? '--no-optional' : ''
|
|
321
|
-
const NPM_CLEAN = `rm -fr node_modules && rm -fr package-lock.json && npm cache clean --force && npm install ${NPM_INSTALL_FLAG} && npm rb`;
|
|
322
|
-
|
|
323
|
-
self.log(chalk.blue(`Running: ${NPM_CLEAN}...`));
|
|
324
|
-
|
|
325
|
-
return await asyncCommand(NPM_CLEAN)
|
|
326
|
-
.then(r => {
|
|
327
|
-
self.log(chalk.green(`Finished cleaning`));
|
|
328
|
-
})
|
|
329
|
-
.catch(e => {
|
|
330
|
-
self.log(chalk.green(`Error cleaning: ${e}`));
|
|
331
|
-
})
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
if (self.options.bump || self.options._.includes('bump')) {
|
|
335
|
-
return bump(self);
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
Main.prototype.log = function () {
|
|
341
|
-
const self = this;
|
|
342
|
-
|
|
343
|
-
if (self.options.log !== false) {
|
|
344
|
-
console.log(...arguments);
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
|
|
348
|
-
module.exports = Main;
|
|
349
|
-
|
|
350
|
-
function bump(self) {
|
|
351
|
-
const semver = require('semver');
|
|
352
|
-
let level = '';
|
|
353
|
-
const version = self.proj_packageJSON.version;
|
|
354
|
-
// let version = '3.1.0-beta.0';
|
|
355
|
-
let newVersion = [semver.major(version), semver.minor(version), semver.patch(version)];
|
|
356
|
-
let newVersionPost = version.split('-')[1];
|
|
357
|
-
let newVersionString = '';
|
|
358
|
-
|
|
359
|
-
if (self.options.break || self.options.breaking || self.options.major || self.options['3']) {
|
|
360
|
-
level = 'breaking';
|
|
361
|
-
newVersion[0]++;
|
|
362
|
-
newVersion[1] = 0;
|
|
363
|
-
newVersion[2] = 0;
|
|
364
|
-
} else if (self.options.feature || self.options.features || self.options.med || self.options.medium || self.options['2']) {
|
|
365
|
-
level = 'feature';
|
|
366
|
-
newVersion[1]++;
|
|
367
|
-
newVersion[2] = 0;
|
|
368
|
-
} else {
|
|
369
|
-
level = 'patch';
|
|
370
|
-
newVersion[2]++;
|
|
371
|
-
}
|
|
372
|
-
newVersionString = newVersion.join('.') + (newVersionPost ? `-${newVersionPost}` : '');
|
|
373
|
-
|
|
374
|
-
self.proj_packageJSON.version = newVersionString;
|
|
375
|
-
|
|
376
|
-
jetpack.write(self.proj_packageJSONPath, self.proj_packageJSON);
|
|
377
|
-
|
|
378
|
-
self.log(chalk.blue(`Bumped package.json from ${chalk.bold(version)} to ${chalk.bold(newVersionString)}`));
|
|
379
|
-
|
|
380
|
-
return newVersionString;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
async function asyncCommand(command) {
|
|
385
|
-
return new Promise(function(resolve, reject) {
|
|
386
|
-
let cmd = exec(command, function (error, stdout, stderr) {
|
|
387
|
-
if (error) {
|
|
388
|
-
console.error(error);
|
|
389
|
-
return reject(error);
|
|
390
|
-
} else {
|
|
391
|
-
return resolve(stdout);
|
|
392
|
-
}
|
|
393
|
-
});
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
function _coerce(v) {
|
|
398
|
-
try {
|
|
399
|
-
return semverCoerce(v)
|
|
400
|
-
} catch (e) {
|
|
401
|
-
return '0.0.0'
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
function _isEqual(v1, v2) {
|
|
406
|
-
try {
|
|
407
|
-
return semverIsEqual(v1, v2)
|
|
408
|
-
} catch (e) {
|
|
409
|
-
return false;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
function _getListVersion(v) {
|
|
414
|
-
v = v.filter(i => i !== '\n');
|
|
415
|
-
v = v[v.length - 1]
|
|
416
|
-
v = v.split('@');
|
|
417
|
-
return v[v.length - 1]
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
function getLatestVersion(package) {
|
|
421
|
-
return new Promise(function(resolve, reject) {
|
|
422
|
-
const npm = new Npm();
|
|
423
|
-
|
|
424
|
-
npm.repo(package)
|
|
425
|
-
.package()
|
|
426
|
-
.then(function(pkg) {
|
|
427
|
-
resolve(pkg.version);
|
|
428
|
-
}, function(err) {
|
|
429
|
-
resolve('?');
|
|
430
|
-
});
|
|
431
|
-
});
|
|
432
|
-
}
|