node-power-user 0.0.24 → 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 +164 -8
  2. package/package.json +3 -1
  3. package/src/index.js +164 -8
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
- 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
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 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
+ ])
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.24",
3
+ "version": "0.0.25",
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
- 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
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 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
+ ])
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
+ }