node-power-user 0.0.23 → 0.0.26

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 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,44 +105,183 @@ 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
- Object.keys(self.proj_packageJSON.dependencies || {})
110
- .forEach(async (dep, i) => {
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
- (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
114
- .split(' ')[1]
115
- .split('@')[1]
135
+ _getVersion(
136
+ (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
137
+ .split(' ')[1]
138
+ )
116
139
  );
140
+ const latestVersion = await getLatestVersion(dep);
117
141
  const isEqual = _isEqual(installedVersion, packageVersion);
118
- const verb = isEqual ? 'green' : 'yellow'
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
+ ])
119
168
 
120
169
  response[dep] = {
121
170
  isEqual: isEqual,
171
+ isLatest: isLatest,
122
172
  package: packageVersion,
123
173
  installed: installedVersion,
174
+ latest: latestVersion,
124
175
  }
125
176
 
126
- self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
127
- });
177
+ // self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
178
+ };
128
179
 
129
180
  // self.log(chalk.blue.bold(`\nDev Dependencies:`));
130
181
  // Object.keys(self.proj_packageJSON.devDependencies || {})
131
182
  // .forEach((dep, i) => {
132
183
  // self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
133
- // });
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
+ }
134
205
 
135
206
  return response;
136
207
  }
137
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
+
138
279
  if (self.options.clean) {
139
280
  const NPM_INSTALL_FLAG = self.options['--no-optional'] || self.options['-no-optional'] || self.options['no-optional'] ? '--no-optional' : ''
140
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
+
141
283
  self.log(chalk.blue(`Running: ${NPM_CLEAN}...`));
284
+
142
285
  return await asyncCommand(NPM_CLEAN)
143
286
  .then(r => {
144
287
  self.log(chalk.green(`Finished cleaning`));
@@ -227,3 +370,22 @@ function _isEqual(v1, v2) {
227
370
  return false;
228
371
  }
229
372
  }
373
+
374
+ function _getVersion(v) {
375
+ v = v.split('@');
376
+ return v[v.length - 1]
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.23",
3
+ "version": "0.0.26",
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": [
@@ -46,4 +48,4 @@
46
48
  "mocha": "^8.4.0",
47
49
  "prepare-package": "^0.0.16"
48
50
  }
49
- }
51
+ }
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,44 +105,183 @@ 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
- Object.keys(self.proj_packageJSON.dependencies || {})
110
- .forEach(async (dep, i) => {
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
- (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
114
- .split(' ')[1]
115
- .split('@')[1]
135
+ _getVersion(
136
+ (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
137
+ .split(' ')[1]
138
+ )
116
139
  );
140
+ const latestVersion = await getLatestVersion(dep);
117
141
  const isEqual = _isEqual(installedVersion, packageVersion);
118
- const verb = isEqual ? 'green' : 'yellow'
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
+ ])
119
168
 
120
169
  response[dep] = {
121
170
  isEqual: isEqual,
171
+ isLatest: isLatest,
122
172
  package: packageVersion,
123
173
  installed: installedVersion,
174
+ latest: latestVersion,
124
175
  }
125
176
 
126
- self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
127
- });
177
+ // self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
178
+ };
128
179
 
129
180
  // self.log(chalk.blue.bold(`\nDev Dependencies:`));
130
181
  // Object.keys(self.proj_packageJSON.devDependencies || {})
131
182
  // .forEach((dep, i) => {
132
183
  // self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
133
- // });
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
+ }
134
205
 
135
206
  return response;
136
207
  }
137
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
+
138
279
  if (self.options.clean) {
139
280
  const NPM_INSTALL_FLAG = self.options['--no-optional'] || self.options['-no-optional'] || self.options['no-optional'] ? '--no-optional' : ''
140
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
+
141
283
  self.log(chalk.blue(`Running: ${NPM_CLEAN}...`));
284
+
142
285
  return await asyncCommand(NPM_CLEAN)
143
286
  .then(r => {
144
287
  self.log(chalk.green(`Finished cleaning`));
@@ -227,3 +370,22 @@ function _isEqual(v1, v2) {
227
370
  return false;
228
371
  }
229
372
  }
373
+
374
+ function _getVersion(v) {
375
+ v = v.split('@');
376
+ return v[v.length - 1]
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
+ }