node-power-user 0.0.22 → 0.0.25

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.
Files changed (3) hide show
  1. package/dist/index.js +194 -15
  2. package/package.json +6 -4
  3. package/src/index.js +194 -15
package/dist/index.js CHANGED
@@ -13,6 +13,12 @@ const { spawn, exec } = require('child_process');
13
13
  const argv = require('yargs').argv;
14
14
  const JSON5 = require('json5');
15
15
  const { isEqual } = require('lodash');
16
+ const semverIsEqual = require('semver/functions/eq')
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
+
16
22
  // const npm = require('npm');
17
23
 
18
24
  function Main() {
@@ -99,45 +105,183 @@ const self = this;
99
105
  }
100
106
 
101
107
  if (self.options.out || self.options.outdated || self.options.match || self.options['-o'] || self.options['--outdated'] || self.options['--match']) {
102
- self.log(chalk.blue.bold(`Match:`));
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
+ }
103
124
 
104
125
  const response = {};
105
- const isEqualFn = require('semver/functions/eq')
106
- const coerceFn = require('semver/functions/coerce')
126
+
127
+ const depKeys = Object.keys(self.proj_packageJSON.dependencies || {});
128
+
129
+ let bumpCommand = '';
107
130
 
108
- Object.keys(self.proj_packageJSON.dependencies || {})
109
- .forEach(async (dep, i) => {
110
- const packageVersion = coerceFn(self.proj_packageJSON.dependencies[dep]);
111
- const installedVersion = coerceFn(
112
- (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
113
- .split(' ')[1]
114
- .split('@')[1]
131
+ for (var i = 0; i < depKeys.length; i++) {
132
+ const dep = depKeys[i];
133
+ const packageVersion = _coerce(self.proj_packageJSON.dependencies[dep]);
134
+ const installedVersion = _coerce(
135
+ _getVersion(
136
+ (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
137
+ .split(' ')[1]
138
+ )
115
139
  );
116
- const isEqual = isEqualFn(installedVersion, packageVersion);
117
- const verb = isEqual ? 'green' : 'yellow'
140
+ const latestVersion = await getLatestVersion(dep);
141
+ const isEqual = _isEqual(installedVersion, packageVersion);
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
+ ])
118
168
 
119
169
  response[dep] = {
120
170
  isEqual: isEqual,
171
+ isLatest: isLatest,
121
172
  package: packageVersion,
122
173
  installed: installedVersion,
174
+ latest: latestVersion,
123
175
  }
124
176
 
125
- self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
126
- });
177
+ // self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
178
+ };
127
179
 
128
180
  // self.log(chalk.blue.bold(`\nDev Dependencies:`));
129
181
  // Object.keys(self.proj_packageJSON.devDependencies || {})
130
182
  // .forEach((dep, i) => {
131
183
  // self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
132
- // });
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
+ }
133
205
 
134
206
  return response;
135
207
  }
136
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
+
137
279
  if (self.options.clean) {
138
280
  const NPM_INSTALL_FLAG = self.options['--no-optional'] || self.options['-no-optional'] || self.options['no-optional'] ? '--no-optional' : ''
139
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
+
140
283
  self.log(chalk.blue(`Running: ${NPM_CLEAN}...`));
284
+
141
285
  return await asyncCommand(NPM_CLEAN)
142
286
  .then(r => {
143
287
  self.log(chalk.green(`Finished cleaning`));
@@ -210,3 +354,38 @@ async function asyncCommand(command) {
210
354
  });
211
355
  });
212
356
  }
357
+
358
+ function _coerce(v) {
359
+ try {
360
+ return semverCoerce(v)
361
+ } catch (e) {
362
+ return '0.0.0'
363
+ }
364
+ }
365
+
366
+ function _isEqual(v1, v2) {
367
+ try {
368
+ return semverIsEqual(v1, v2)
369
+ } catch (e) {
370
+ return false;
371
+ }
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.22",
3
+ "version": "0.0.25",
4
4
  "description": "Easy tools for every Node.js developer!",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -11,7 +11,7 @@
11
11
  "scripts": {
12
12
  "test": "npm run prepare && ./node_modules/mocha/bin/mocha test/ --recursive --timeout=10000",
13
13
  "start": "npm run prepare && node -e 'new (require(`./dist/index.js`))().process()'",
14
- "prepare": "node -e 'require(`prepare-package`)'"
14
+ "prepare": "node -e 'require(`prepare-package`)()'"
15
15
  },
16
16
  "repository": {
17
17
  "type": "git",
@@ -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": [
@@ -44,6 +46,6 @@
44
46
  ],
45
47
  "devDependencies": {
46
48
  "mocha": "^8.4.0",
47
- "prepare-package": "^0.0.13"
49
+ "prepare-package": "^0.0.16"
48
50
  }
49
- }
51
+ }
package/src/index.js CHANGED
@@ -13,6 +13,12 @@ const { spawn, exec } = require('child_process');
13
13
  const argv = require('yargs').argv;
14
14
  const JSON5 = require('json5');
15
15
  const { isEqual } = require('lodash');
16
+ const semverIsEqual = require('semver/functions/eq')
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
+
16
22
  // const npm = require('npm');
17
23
 
18
24
  function Main() {
@@ -99,45 +105,183 @@ const self = this;
99
105
  }
100
106
 
101
107
  if (self.options.out || self.options.outdated || self.options.match || self.options['-o'] || self.options['--outdated'] || self.options['--match']) {
102
- self.log(chalk.blue.bold(`Match:`));
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
+ }
103
124
 
104
125
  const response = {};
105
- const isEqualFn = require('semver/functions/eq')
106
- const coerceFn = require('semver/functions/coerce')
126
+
127
+ const depKeys = Object.keys(self.proj_packageJSON.dependencies || {});
128
+
129
+ let bumpCommand = '';
107
130
 
108
- Object.keys(self.proj_packageJSON.dependencies || {})
109
- .forEach(async (dep, i) => {
110
- const packageVersion = coerceFn(self.proj_packageJSON.dependencies[dep]);
111
- const installedVersion = coerceFn(
112
- (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
113
- .split(' ')[1]
114
- .split('@')[1]
131
+ for (var i = 0; i < depKeys.length; i++) {
132
+ const dep = depKeys[i];
133
+ const packageVersion = _coerce(self.proj_packageJSON.dependencies[dep]);
134
+ const installedVersion = _coerce(
135
+ _getVersion(
136
+ (await asyncCommand(`npm list ${dep} --depth=0 | grep ${dep}`))
137
+ .split(' ')[1]
138
+ )
115
139
  );
116
- const isEqual = isEqualFn(installedVersion, packageVersion);
117
- const verb = isEqual ? 'green' : 'yellow'
140
+ const latestVersion = await getLatestVersion(dep);
141
+ const isEqual = _isEqual(installedVersion, packageVersion);
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
+ ])
118
168
 
119
169
  response[dep] = {
120
170
  isEqual: isEqual,
171
+ isLatest: isLatest,
121
172
  package: packageVersion,
122
173
  installed: installedVersion,
174
+ latest: latestVersion,
123
175
  }
124
176
 
125
- self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
126
- });
177
+ // self.log(chalk[verb](`${dep}: ${packageVersion} = ${installedVersion}`));
178
+ };
127
179
 
128
180
  // self.log(chalk.blue.bold(`\nDev Dependencies:`));
129
181
  // Object.keys(self.proj_packageJSON.devDependencies || {})
130
182
  // .forEach((dep, i) => {
131
183
  // self.log(chalk.blue(`${dep} @ ${self.proj_packageJSON.devDependencies[dep]}`));
132
- // });
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
+ }
133
205
 
134
206
  return response;
135
207
  }
136
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
+
137
279
  if (self.options.clean) {
138
280
  const NPM_INSTALL_FLAG = self.options['--no-optional'] || self.options['-no-optional'] || self.options['no-optional'] ? '--no-optional' : ''
139
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
+
140
283
  self.log(chalk.blue(`Running: ${NPM_CLEAN}...`));
284
+
141
285
  return await asyncCommand(NPM_CLEAN)
142
286
  .then(r => {
143
287
  self.log(chalk.green(`Finished cleaning`));
@@ -210,3 +354,38 @@ async function asyncCommand(command) {
210
354
  });
211
355
  });
212
356
  }
357
+
358
+ function _coerce(v) {
359
+ try {
360
+ return semverCoerce(v)
361
+ } catch (e) {
362
+ return '0.0.0'
363
+ }
364
+ }
365
+
366
+ function _isEqual(v1, v2) {
367
+ try {
368
+ return semverIsEqual(v1, v2)
369
+ } catch (e) {
370
+ return false;
371
+ }
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
+ }