node-power-user 0.0.24 → 0.0.27
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/README.md +1 -0
- package/dist/index.js +164 -8
- package/package.json +3 -1
- package/src/index.js +164 -8
package/README.md
CHANGED
|
@@ -48,6 +48,7 @@ Note: you may have to run cli commands with `npx npu <command>` if you install t
|
|
|
48
48
|
* `npu bump 2`: Bump the middle number (`minor` version).
|
|
49
49
|
* `npu bump 3`: Bump the first number (`major` version).
|
|
50
50
|
* `npu outdated`: Compare the versions of installed modules to those in your package.json
|
|
51
|
+
* `npu global`: List all global packages for all versions of Node.js on your machine (must use NVM)
|
|
51
52
|
|
|
52
53
|
## Final Words
|
|
53
54
|
If you are still having difficulty, we would love for you to post a question to [the Node Power User issues page](https://github.com/itw-creative-works/node-power-user/issues). It is much easier to answer questions that include your code and relevant files! So if you can provide them, we'd be extremely grateful (and more likely to help you find the answer!)
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,10 @@ const JSON5 = require('json5');
|
|
|
15
15
|
const { isEqual } = require('lodash');
|
|
16
16
|
const semverIsEqual = require('semver/functions/eq')
|
|
17
17
|
const semverCoerce = require('semver/functions/coerce')
|
|
18
|
+
const table = require('table').table;
|
|
19
|
+
const Npm = require('npm-api');
|
|
20
|
+
const os = require('os');
|
|
21
|
+
|
|
18
22
|
// const npm = require('npm');
|
|
19
23
|
|
|
20
24
|
function Main() {
|
|
@@ -101,13 +105,31 @@ const self = this;
|
|
|
101
105
|
}
|
|
102
106
|
|
|
103
107
|
if (self.options.out || self.options.outdated || self.options.match || self.options['-o'] || self.options['--outdated'] || self.options['--match']) {
|
|
104
|
-
self.log(chalk.blue.bold(`Outdated:`));
|
|
105
|
-
self.log(chalk.green(`name: package = installed`));
|
|
108
|
+
// self.log(chalk.blue.bold(`Outdated:`));
|
|
109
|
+
// self.log(chalk.green(`name: package = installed`));
|
|
110
|
+
|
|
111
|
+
const data = [
|
|
112
|
+
['Package', 'package.json', 'Intalled', 'Latest'],
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
const config = {
|
|
116
|
+
columnDefault: {
|
|
117
|
+
width: 10,
|
|
118
|
+
},
|
|
119
|
+
header: {
|
|
120
|
+
alignment: 'center',
|
|
121
|
+
content: 'Outdated and mismatched packages',
|
|
122
|
+
},
|
|
123
|
+
}
|
|
106
124
|
|
|
107
125
|
const response = {};
|
|
126
|
+
|
|
127
|
+
const depKeys = Object.keys(self.proj_packageJSON.dependencies || {});
|
|
128
|
+
|
|
129
|
+
let bumpCommand = '';
|
|
108
130
|
|
|
109
|
-
|
|
110
|
-
|
|
131
|
+
for (var i = 0; i < depKeys.length; i++) {
|
|
132
|
+
const dep = depKeys[i];
|
|
111
133
|
const packageVersion = _coerce(self.proj_packageJSON.dependencies[dep]);
|
|
112
134
|
const installedVersion = _coerce(
|
|
113
135
|
_getVersion(
|
|
@@ -115,31 +137,151 @@ const self = this;
|
|
|
115
137
|
.split(' ')[1]
|
|
116
138
|
)
|
|
117
139
|
);
|
|
140
|
+
const latestVersion = await getLatestVersion(dep);
|
|
118
141
|
const isEqual = _isEqual(installedVersion, packageVersion);
|
|
119
|
-
const
|
|
142
|
+
const isLatest = _isEqual(packageVersion, latestVersion);
|
|
143
|
+
const verbLocal = isEqual ? 'green' : 'yellow';
|
|
144
|
+
const verbRemote = isLatest ? 'green' : 'red';
|
|
145
|
+
|
|
146
|
+
if (!isEqual) {
|
|
147
|
+
bumpCommand += `npm i ${dep}@${installedVersion} && `
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// function _color(array) {
|
|
151
|
+
// array.forEach((item, i) => {
|
|
152
|
+
// array[i] = chalk[verb](item);
|
|
153
|
+
// });
|
|
154
|
+
// return array;
|
|
155
|
+
// }
|
|
156
|
+
// data.push(_color([ dep, packageVersion, installedVersion, latestVersion]))
|
|
157
|
+
|
|
158
|
+
// function _color(s) {
|
|
159
|
+
// return chalk[verb](s);
|
|
160
|
+
// }
|
|
161
|
+
|
|
162
|
+
data.push([
|
|
163
|
+
dep,
|
|
164
|
+
packageVersion,
|
|
165
|
+
chalk[verbLocal](installedVersion),
|
|
166
|
+
chalk[verbRemote](latestVersion),
|
|
167
|
+
])
|
|
120
168
|
|
|
121
169
|
response[dep] = {
|
|
122
170
|
isEqual: isEqual,
|
|
171
|
+
isLatest: isLatest,
|
|
123
172
|
package: packageVersion,
|
|
124
173
|
installed: installedVersion,
|
|
174
|
+
latest: latestVersion,
|
|
125
175
|
}
|
|
126
176
|
|
|
127
|
-
self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
|
|
128
|
-
}
|
|
177
|
+
// self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
|
|
178
|
+
};
|
|
129
179
|
|
|
130
180
|
// self.log(chalk.blue.bold(`\nDev Dependencies:`));
|
|
131
181
|
// Object.keys(self.proj_packageJSON.devDependencies || {})
|
|
132
182
|
// .forEach((dep, i) => {
|
|
133
183
|
// self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
|
|
134
|
-
// });
|
|
184
|
+
// });
|
|
185
|
+
|
|
186
|
+
console.log(table(data, config));
|
|
187
|
+
|
|
188
|
+
if (bumpCommand) {
|
|
189
|
+
bumpCommand = bumpCommand.replace(/&&\s$/ig, '')
|
|
190
|
+
inquirer.prompt([
|
|
191
|
+
{
|
|
192
|
+
type: 'confirm',
|
|
193
|
+
name: 'bump',
|
|
194
|
+
message: 'Would you like to bump the package.json versions?',
|
|
195
|
+
default: true,
|
|
196
|
+
}
|
|
197
|
+
])
|
|
198
|
+
.then(async (answer) => {
|
|
199
|
+
if (answer.bump) {
|
|
200
|
+
asyncCommand(bumpCommand);
|
|
201
|
+
} else {
|
|
202
|
+
}
|
|
203
|
+
})
|
|
204
|
+
}
|
|
135
205
|
|
|
136
206
|
return response;
|
|
137
207
|
}
|
|
138
208
|
|
|
209
|
+
if (self.options.global || self.options['-g'] || self.options['--global']) {
|
|
210
|
+
const parentPath = `/Users/${os.userInfo().username}/.nvm/versions/node`;
|
|
211
|
+
const versions = jetpack.list(parentPath);
|
|
212
|
+
const currentNode = process.versions.node;
|
|
213
|
+
|
|
214
|
+
const response = {};
|
|
215
|
+
|
|
216
|
+
// console.log(chalk.bold.blue('NVM Global Modules'));
|
|
217
|
+
|
|
218
|
+
for (var i = 0; i < versions.length; i++) {
|
|
219
|
+
try {
|
|
220
|
+
const parsed = semverCoerce(versions[i]);
|
|
221
|
+
const lib = path.resolve(parentPath, `v${parsed.version}`, 'lib', 'node_modules');
|
|
222
|
+
|
|
223
|
+
const modules = jetpack.list(lib);
|
|
224
|
+
|
|
225
|
+
const data = [
|
|
226
|
+
['Package', 'package.json', 'latest'],
|
|
227
|
+
];
|
|
228
|
+
|
|
229
|
+
const config = {
|
|
230
|
+
columnDefault: {
|
|
231
|
+
width: 10,
|
|
232
|
+
},
|
|
233
|
+
header: {
|
|
234
|
+
alignment: 'center',
|
|
235
|
+
content: `Global packages for v${parsed.version}`,
|
|
236
|
+
},
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
response[parsed.version] = {};
|
|
240
|
+
|
|
241
|
+
for (var j = 0; j < modules.length; j++) {
|
|
242
|
+
const mod = modules[j];
|
|
243
|
+
const packagePath = path.resolve(lib, mod, 'package.json');
|
|
244
|
+
try {
|
|
245
|
+
const package = require(packagePath);
|
|
246
|
+
|
|
247
|
+
const packageVersion = package.version;
|
|
248
|
+
const latestVersion = await getLatestVersion(mod);
|
|
249
|
+
// const isEqual = _isEqual(installedVersion, packageVersion);
|
|
250
|
+
const isLatest = _isEqual(packageVersion, latestVersion);
|
|
251
|
+
// const verbLocal = isEqual ? 'green' : 'yellow';
|
|
252
|
+
const verbRemote = isLatest ? 'green' : 'red';
|
|
253
|
+
|
|
254
|
+
data.push([
|
|
255
|
+
mod,
|
|
256
|
+
packageVersion,
|
|
257
|
+
chalk[verbRemote](latestVersion),
|
|
258
|
+
]);
|
|
259
|
+
|
|
260
|
+
response[parsed.version][mod] = {
|
|
261
|
+
packageVersion: packageVersion,
|
|
262
|
+
latestVersion: latestVersion,
|
|
263
|
+
}
|
|
264
|
+
} catch (e) {
|
|
265
|
+
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
console.log(table(data, config));
|
|
270
|
+
|
|
271
|
+
} catch (e) {
|
|
272
|
+
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return response;
|
|
277
|
+
}
|
|
278
|
+
|
|
139
279
|
if (self.options.clean) {
|
|
140
280
|
const NPM_INSTALL_FLAG = self.options['--no-optional'] || self.options['-no-optional'] || self.options['no-optional'] ? '--no-optional' : ''
|
|
141
281
|
const NPM_CLEAN = `rm -fr node_modules && rm -fr package-lock.json && npm cache clean --force && npm install ${NPM_INSTALL_FLAG} && npm rb`;
|
|
282
|
+
|
|
142
283
|
self.log(chalk.blue(`Running: ${NPM_CLEAN}...`));
|
|
284
|
+
|
|
143
285
|
return await asyncCommand(NPM_CLEAN)
|
|
144
286
|
.then(r => {
|
|
145
287
|
self.log(chalk.green(`Finished cleaning`));
|
|
@@ -233,3 +375,17 @@ function _getVersion(v) {
|
|
|
233
375
|
v = v.split('@');
|
|
234
376
|
return v[v.length - 1]
|
|
235
377
|
}
|
|
378
|
+
|
|
379
|
+
function getLatestVersion(package) {
|
|
380
|
+
return new Promise(function(resolve, reject) {
|
|
381
|
+
const npm = new Npm();
|
|
382
|
+
|
|
383
|
+
npm.repo(package)
|
|
384
|
+
.package()
|
|
385
|
+
.then(function(pkg) {
|
|
386
|
+
resolve(pkg.version);
|
|
387
|
+
}, function(err) {
|
|
388
|
+
resolve('?');
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-power-user",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.27",
|
|
4
4
|
"description": "Easy tools for every Node.js developer!",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -35,7 +35,9 @@
|
|
|
35
35
|
"json5": "^2.2.1",
|
|
36
36
|
"keychain": "^1.3.0",
|
|
37
37
|
"lodash": "^4.17.21",
|
|
38
|
+
"npm-api": "^1.0.1",
|
|
38
39
|
"semver": "^7.3.7",
|
|
40
|
+
"table": "^6.8.0",
|
|
39
41
|
"yargs": "^16.2.0"
|
|
40
42
|
},
|
|
41
43
|
"files": [
|
package/src/index.js
CHANGED
|
@@ -15,6 +15,10 @@ const JSON5 = require('json5');
|
|
|
15
15
|
const { isEqual } = require('lodash');
|
|
16
16
|
const semverIsEqual = require('semver/functions/eq')
|
|
17
17
|
const semverCoerce = require('semver/functions/coerce')
|
|
18
|
+
const table = require('table').table;
|
|
19
|
+
const Npm = require('npm-api');
|
|
20
|
+
const os = require('os');
|
|
21
|
+
|
|
18
22
|
// const npm = require('npm');
|
|
19
23
|
|
|
20
24
|
function Main() {
|
|
@@ -101,13 +105,31 @@ const self = this;
|
|
|
101
105
|
}
|
|
102
106
|
|
|
103
107
|
if (self.options.out || self.options.outdated || self.options.match || self.options['-o'] || self.options['--outdated'] || self.options['--match']) {
|
|
104
|
-
self.log(chalk.blue.bold(`Outdated:`));
|
|
105
|
-
self.log(chalk.green(`name: package = installed`));
|
|
108
|
+
// self.log(chalk.blue.bold(`Outdated:`));
|
|
109
|
+
// self.log(chalk.green(`name: package = installed`));
|
|
110
|
+
|
|
111
|
+
const data = [
|
|
112
|
+
['Package', 'package.json', 'Intalled', 'Latest'],
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
const config = {
|
|
116
|
+
columnDefault: {
|
|
117
|
+
width: 10,
|
|
118
|
+
},
|
|
119
|
+
header: {
|
|
120
|
+
alignment: 'center',
|
|
121
|
+
content: 'Outdated and mismatched packages',
|
|
122
|
+
},
|
|
123
|
+
}
|
|
106
124
|
|
|
107
125
|
const response = {};
|
|
126
|
+
|
|
127
|
+
const depKeys = Object.keys(self.proj_packageJSON.dependencies || {});
|
|
128
|
+
|
|
129
|
+
let bumpCommand = '';
|
|
108
130
|
|
|
109
|
-
|
|
110
|
-
|
|
131
|
+
for (var i = 0; i < depKeys.length; i++) {
|
|
132
|
+
const dep = depKeys[i];
|
|
111
133
|
const packageVersion = _coerce(self.proj_packageJSON.dependencies[dep]);
|
|
112
134
|
const installedVersion = _coerce(
|
|
113
135
|
_getVersion(
|
|
@@ -115,31 +137,151 @@ const self = this;
|
|
|
115
137
|
.split(' ')[1]
|
|
116
138
|
)
|
|
117
139
|
);
|
|
140
|
+
const latestVersion = await getLatestVersion(dep);
|
|
118
141
|
const isEqual = _isEqual(installedVersion, packageVersion);
|
|
119
|
-
const
|
|
142
|
+
const isLatest = _isEqual(packageVersion, latestVersion);
|
|
143
|
+
const verbLocal = isEqual ? 'green' : 'yellow';
|
|
144
|
+
const verbRemote = isLatest ? 'green' : 'red';
|
|
145
|
+
|
|
146
|
+
if (!isEqual) {
|
|
147
|
+
bumpCommand += `npm i ${dep}@${installedVersion} && `
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// function _color(array) {
|
|
151
|
+
// array.forEach((item, i) => {
|
|
152
|
+
// array[i] = chalk[verb](item);
|
|
153
|
+
// });
|
|
154
|
+
// return array;
|
|
155
|
+
// }
|
|
156
|
+
// data.push(_color([ dep, packageVersion, installedVersion, latestVersion]))
|
|
157
|
+
|
|
158
|
+
// function _color(s) {
|
|
159
|
+
// return chalk[verb](s);
|
|
160
|
+
// }
|
|
161
|
+
|
|
162
|
+
data.push([
|
|
163
|
+
dep,
|
|
164
|
+
packageVersion,
|
|
165
|
+
chalk[verbLocal](installedVersion),
|
|
166
|
+
chalk[verbRemote](latestVersion),
|
|
167
|
+
])
|
|
120
168
|
|
|
121
169
|
response[dep] = {
|
|
122
170
|
isEqual: isEqual,
|
|
171
|
+
isLatest: isLatest,
|
|
123
172
|
package: packageVersion,
|
|
124
173
|
installed: installedVersion,
|
|
174
|
+
latest: latestVersion,
|
|
125
175
|
}
|
|
126
176
|
|
|
127
|
-
self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
|
|
128
|
-
}
|
|
177
|
+
// self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
|
|
178
|
+
};
|
|
129
179
|
|
|
130
180
|
// self.log(chalk.blue.bold(`\nDev Dependencies:`));
|
|
131
181
|
// Object.keys(self.proj_packageJSON.devDependencies || {})
|
|
132
182
|
// .forEach((dep, i) => {
|
|
133
183
|
// self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
|
|
134
|
-
// });
|
|
184
|
+
// });
|
|
185
|
+
|
|
186
|
+
console.log(table(data, config));
|
|
187
|
+
|
|
188
|
+
if (bumpCommand) {
|
|
189
|
+
bumpCommand = bumpCommand.replace(/&&\s$/ig, '')
|
|
190
|
+
inquirer.prompt([
|
|
191
|
+
{
|
|
192
|
+
type: 'confirm',
|
|
193
|
+
name: 'bump',
|
|
194
|
+
message: 'Would you like to bump the package.json versions?',
|
|
195
|
+
default: true,
|
|
196
|
+
}
|
|
197
|
+
])
|
|
198
|
+
.then(async (answer) => {
|
|
199
|
+
if (answer.bump) {
|
|
200
|
+
asyncCommand(bumpCommand);
|
|
201
|
+
} else {
|
|
202
|
+
}
|
|
203
|
+
})
|
|
204
|
+
}
|
|
135
205
|
|
|
136
206
|
return response;
|
|
137
207
|
}
|
|
138
208
|
|
|
209
|
+
if (self.options.global || self.options['-g'] || self.options['--global']) {
|
|
210
|
+
const parentPath = `/Users/${os.userInfo().username}/.nvm/versions/node`;
|
|
211
|
+
const versions = jetpack.list(parentPath);
|
|
212
|
+
const currentNode = process.versions.node;
|
|
213
|
+
|
|
214
|
+
const response = {};
|
|
215
|
+
|
|
216
|
+
// console.log(chalk.bold.blue('NVM Global Modules'));
|
|
217
|
+
|
|
218
|
+
for (var i = 0; i < versions.length; i++) {
|
|
219
|
+
try {
|
|
220
|
+
const parsed = semverCoerce(versions[i]);
|
|
221
|
+
const lib = path.resolve(parentPath, `v${parsed.version}`, 'lib', 'node_modules');
|
|
222
|
+
|
|
223
|
+
const modules = jetpack.list(lib);
|
|
224
|
+
|
|
225
|
+
const data = [
|
|
226
|
+
['Package', 'package.json', 'latest'],
|
|
227
|
+
];
|
|
228
|
+
|
|
229
|
+
const config = {
|
|
230
|
+
columnDefault: {
|
|
231
|
+
width: 10,
|
|
232
|
+
},
|
|
233
|
+
header: {
|
|
234
|
+
alignment: 'center',
|
|
235
|
+
content: `Global packages for v${parsed.version}`,
|
|
236
|
+
},
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
response[parsed.version] = {};
|
|
240
|
+
|
|
241
|
+
for (var j = 0; j < modules.length; j++) {
|
|
242
|
+
const mod = modules[j];
|
|
243
|
+
const packagePath = path.resolve(lib, mod, 'package.json');
|
|
244
|
+
try {
|
|
245
|
+
const package = require(packagePath);
|
|
246
|
+
|
|
247
|
+
const packageVersion = package.version;
|
|
248
|
+
const latestVersion = await getLatestVersion(mod);
|
|
249
|
+
// const isEqual = _isEqual(installedVersion, packageVersion);
|
|
250
|
+
const isLatest = _isEqual(packageVersion, latestVersion);
|
|
251
|
+
// const verbLocal = isEqual ? 'green' : 'yellow';
|
|
252
|
+
const verbRemote = isLatest ? 'green' : 'red';
|
|
253
|
+
|
|
254
|
+
data.push([
|
|
255
|
+
mod,
|
|
256
|
+
packageVersion,
|
|
257
|
+
chalk[verbRemote](latestVersion),
|
|
258
|
+
]);
|
|
259
|
+
|
|
260
|
+
response[parsed.version][mod] = {
|
|
261
|
+
packageVersion: packageVersion,
|
|
262
|
+
latestVersion: latestVersion,
|
|
263
|
+
}
|
|
264
|
+
} catch (e) {
|
|
265
|
+
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
console.log(table(data, config));
|
|
270
|
+
|
|
271
|
+
} catch (e) {
|
|
272
|
+
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return response;
|
|
277
|
+
}
|
|
278
|
+
|
|
139
279
|
if (self.options.clean) {
|
|
140
280
|
const NPM_INSTALL_FLAG = self.options['--no-optional'] || self.options['-no-optional'] || self.options['no-optional'] ? '--no-optional' : ''
|
|
141
281
|
const NPM_CLEAN = `rm -fr node_modules && rm -fr package-lock.json && npm cache clean --force && npm install ${NPM_INSTALL_FLAG} && npm rb`;
|
|
282
|
+
|
|
142
283
|
self.log(chalk.blue(`Running: ${NPM_CLEAN}...`));
|
|
284
|
+
|
|
143
285
|
return await asyncCommand(NPM_CLEAN)
|
|
144
286
|
.then(r => {
|
|
145
287
|
self.log(chalk.green(`Finished cleaning`));
|
|
@@ -233,3 +375,17 @@ function _getVersion(v) {
|
|
|
233
375
|
v = v.split('@');
|
|
234
376
|
return v[v.length - 1]
|
|
235
377
|
}
|
|
378
|
+
|
|
379
|
+
function getLatestVersion(package) {
|
|
380
|
+
return new Promise(function(resolve, reject) {
|
|
381
|
+
const npm = new Npm();
|
|
382
|
+
|
|
383
|
+
npm.repo(package)
|
|
384
|
+
.package()
|
|
385
|
+
.then(function(pkg) {
|
|
386
|
+
resolve(pkg.version);
|
|
387
|
+
}, function(err) {
|
|
388
|
+
resolve('?');
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
}
|