node-power-user 1.0.2 → 1.0.6

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/bin/npu CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  const argv = require('yargs').argv;
3
- const Main = new (require('../dist/index.js'))(argv);
3
+ const cli = new (require('../dist/cli.js'))(argv);
4
4
  (async function() {
5
5
  'use strict';
6
- await Main.process(argv);
6
+ await cli.process(argv);
7
7
  }());
package/dist/cli.js ADDED
@@ -0,0 +1,64 @@
1
+ // Libraries
2
+ const path = require('path');
3
+ const jetpack = require('fs-jetpack');
4
+
5
+ // Command Aliases
6
+ const DEFAULT = 'version';
7
+ const ALIASES = {
8
+ bump: ['-b', '--bump'],
9
+ clean: ['-c', '--clean'],
10
+ global: ['-g', '--global'],
11
+ outdated: ['-o', 'out', '--outdated'],
12
+ packages: ['-p', 'pack', '--packages'],
13
+ version: ['-v', '--version'],
14
+ sync: ['-s', '--sync'],
15
+ };
16
+
17
+ // Function to resolve command name from aliases
18
+ function resolveCommand(command) {
19
+ console.log('---1 command', command);
20
+ for (const [key, aliases] of Object.entries(ALIASES)) {
21
+ console.log('---2 key, aliases', key, aliases);
22
+
23
+ if (command === key || aliases.includes(command)) {
24
+ console.log('---3');
25
+ return key;
26
+ }
27
+ }
28
+
29
+ // Default to original command if no alias is found
30
+ console.log('---4');
31
+ return command;
32
+ }
33
+
34
+ // Main Function
35
+ function Main() {}
36
+
37
+ Main.prototype.process = async function (options) {
38
+ // Determine the command (use default if not provided)
39
+ console.log('---options', options);
40
+
41
+ const inputCommand = options._[0] || DEFAULT;
42
+ const command = resolveCommand(inputCommand);
43
+
44
+ try {
45
+ // Get the command file path
46
+ const commandFile = path.join(__dirname, 'commands', `${command}.js`);
47
+
48
+ // Check if the command file exists
49
+ if (!jetpack.exists(commandFile)) {
50
+ throw new Error(`Error: Command "${command}" not found.`);
51
+ }
52
+
53
+ // Execute the command
54
+ const Command = require(commandFile);
55
+ await Command(options);
56
+ } catch (e) {
57
+ console.error(`Error executing command "${command}": ${e.message}`);
58
+
59
+ // Exit with error
60
+ throw e;
61
+ }
62
+ };
63
+
64
+ module.exports = Main;
@@ -0,0 +1,40 @@
1
+ // Libraries
2
+ const logger = new (require('../lib/logger'))('node-power-user');
3
+ const path = require('path');
4
+ const jetpack = require('fs-jetpack');
5
+ const version = require('wonderful-version');
6
+
7
+ // Load package
8
+ const package = jetpack.read(path.join(__dirname, '../../', 'package.json'), 'json');
9
+ const project = jetpack.read(path.join(process.cwd(), 'package.json'), 'json');
10
+
11
+ // Module
12
+ module.exports = async function (options) {
13
+ // Determine bump level
14
+ const ver = project.version;
15
+ let newVer;
16
+
17
+ // Log
18
+ // logger.log(`Current version: ${ver}`, options);
19
+
20
+ // Bump
21
+ if (options.major || options._.includes('major')) {
22
+ newVer = version.increment(ver, 'major');
23
+ } else if (options.minor || options._.includes('minor')) {
24
+ newVer = version.increment(ver, 'minor');
25
+ } else {
26
+ newVer = version.increment(ver, 'patch');
27
+ }
28
+
29
+ // Update package.json
30
+ project.version = newVer;
31
+
32
+ // Write package.json
33
+ jetpack.write(path.join(process.cwd(), 'package.json'), project);
34
+
35
+ // Log
36
+ logger.log(`Bumped version: ${logger.format.bold(ver)} ==> ${logger.format.bold(newVer)}`);
37
+
38
+ // Return new version
39
+ return newVer;
40
+ };
@@ -0,0 +1,33 @@
1
+ // Libraries
2
+ const logger = new (require('../lib/logger'))('node-power-user');
3
+ const path = require('path');
4
+ const jetpack = require('fs-jetpack');
5
+ const { execute } = require('node-powertools');
6
+
7
+ // Load package.json files
8
+ const package = jetpack.read(path.join(__dirname, '../../', 'package.json'), 'json');
9
+ const project = jetpack.read(path.join(process.cwd(), 'package.json'), 'json');
10
+
11
+ // Module
12
+ module.exports = async function (options) {
13
+ // Define cleanup command
14
+ const command = `rm -rf node_modules && rm -rf package-lock.json && npm cache clean --force`;
15
+
16
+ // Log initial state
17
+ logger.log(`Cleaning project: ${logger.format.bold(project.name)} (v${project.version})`);
18
+
19
+ try {
20
+ // Run cleanup commands
21
+ await execute(command, { log: true });
22
+
23
+ // Log success
24
+ logger.log(logger.format.green('Cleanup completed successfully!'));
25
+
26
+ return true;
27
+ } catch (e) {
28
+ // Log failure
29
+ logger.error(`Cleanup failed`, e.stack);
30
+
31
+ return false;
32
+ }
33
+ };
@@ -0,0 +1,99 @@
1
+ // Libraries
2
+ const logger = new (require('../lib/logger'))('node-power-user');
3
+ const path = require('path');
4
+ const os = require('os');
5
+ const jetpack = require('fs-jetpack');
6
+ const version = require('wonderful-version');
7
+ const { table } = require('table');
8
+ const ProgressBar = require('cli-progress');
9
+ const Npm = require('npm-api');
10
+ const chalk = require('chalk');
11
+
12
+ const npm = new Npm();
13
+
14
+ // Module
15
+ module.exports = async function (options) {
16
+ // Define global modules path
17
+ const parentPath = `/Users/${os.userInfo().username}/.nvm/versions/node`;
18
+ const versions = jetpack.list(parentPath) || [];
19
+ const response = {};
20
+
21
+ // Log start
22
+ logger.log(`Checking global modules for ${logger.format.bold(versions.length)} Node.js versions...`);
23
+
24
+ // Loop through Node.js versions
25
+ for (const ver of versions) {
26
+ try {
27
+ // Quick check if ver starts with a dot
28
+ if (ver.startsWith('.')) {
29
+ continue;
30
+ }
31
+
32
+ // Clean
33
+ const cleaned = version.clean(ver);
34
+ const libPath = path.resolve(parentPath, `v${cleaned}`, 'lib', 'node_modules');
35
+ const modules = jetpack.list(libPath) || [];
36
+
37
+ // Log version being checked
38
+ logger.log(`Checking global modules for Node v${logger.format.bold(cleaned)}...`);
39
+
40
+ // Skip if no global modules found
41
+ if (!modules.length) {
42
+ logger.warn(`No global modules found for Node v${logger.format.bold(cleaned)}.`);
43
+ continue;
44
+ }
45
+
46
+ // Initialize progress bar
47
+ const progress = new ProgressBar.SingleBar({}, ProgressBar.Presets.shades_classic);
48
+ progress.start(modules.length, 0);
49
+
50
+ // Initialize data
51
+ response[cleaned] = {};
52
+ const data = [['Name', 'Package', 'Latest']];
53
+
54
+ // Loop through modules
55
+ for (const mod of modules) {
56
+ const packagePath = path.resolve(libPath, mod, 'package.json');
57
+ try {
58
+ const packageJson = require(packagePath);
59
+ const packageVersion = packageJson.version;
60
+
61
+ // Fetch the latest version from npm
62
+ let latestVersion = await npm.repo(mod).package().then(pkg => pkg.version).catch(() => '?');
63
+
64
+ // Determine version color-coding
65
+ const isLatest = packageVersion === latestVersion;
66
+ const verb = isLatest ? 'green' : 'red';
67
+
68
+ // Add to response and table data
69
+ data.push([
70
+ mod,
71
+ packageVersion,
72
+ chalk[verb](latestVersion)
73
+ ]);
74
+ response[cleaned][mod] = {
75
+ version: packageVersion,
76
+ latest: latestVersion
77
+ };
78
+ } catch (e) {}
79
+
80
+ progress.increment();
81
+ }
82
+
83
+ // Stop progress bar
84
+ progress.stop();
85
+
86
+ // Display results
87
+ console.log(table(data));
88
+
89
+ } catch (e) {
90
+ logger.error(`Error processing Node v${ver}:`, e.stack);
91
+ }
92
+ }
93
+
94
+ // Log completion
95
+ logger.log(logger.format.green('Global module check completed successfully!'));
96
+
97
+ // Return response
98
+ return response;
99
+ };
@@ -0,0 +1,100 @@
1
+ // Libraries
2
+ const logger = new (require('../lib/logger'))('node-power-user');
3
+ const chalk = require('chalk');
4
+ const { table } = require('table');
5
+ const ProgressBar = require('cli-progress');
6
+ const Npm = require('npm-api');
7
+ const version = require('wonderful-version');
8
+ const jetpack = require('fs-jetpack');
9
+ const path = require('path');
10
+
11
+ const npm = new Npm();
12
+
13
+ // Load package.json
14
+ const projectPath = process.cwd();
15
+ const projectJson = jetpack.read(path.join(projectPath, 'package.json'), 'json') || {};
16
+
17
+ // Module
18
+ module.exports = async function (options) {
19
+ // Combine all dependencies
20
+ const allDependencies = Object.assign(
21
+ {},
22
+ projectJson.dependencies,
23
+ projectJson.devDependencies,
24
+ projectJson.peerDependencies
25
+ );
26
+
27
+ // Check if there are any dependencies
28
+ if (Object.keys(allDependencies).length === 0) {
29
+ logger.warn('No dependencies found in package.json.');
30
+ return {};
31
+ }
32
+
33
+ // Log start
34
+ logger.log(`Checking outdated dependencies for ${logger.format.bold(projectJson.name || 'Unknown Project')}...`);
35
+
36
+ // Initialize data table
37
+ const data = [['Name', 'Package', 'Installed', 'Latest']];
38
+ const progress = new ProgressBar.SingleBar({}, ProgressBar.Presets.shades_classic);
39
+ progress.start(Object.keys(allDependencies).length, 0);
40
+
41
+ const response = {};
42
+
43
+ // Loop through dependencies
44
+ for (const dep of Object.keys(allDependencies)) {
45
+ try {
46
+ progress.increment();
47
+
48
+ // Get version info
49
+ const packageVersion = version.clean(allDependencies[dep]); // Version from package.json
50
+ const installedPackagePath = path.join(projectPath, 'node_modules', dep, 'package.json');
51
+
52
+ let installedVersion = '?';
53
+ if (jetpack.exists(installedPackagePath)) {
54
+ const installedJson = jetpack.read(installedPackagePath, 'json');
55
+ installedVersion = installedJson?.version ? version.clean(installedJson.version) : '?';
56
+ }
57
+
58
+ // Get latest published version
59
+ const latestVersion = await npm.repo(dep).package().then(pkg => version.clean(pkg.version)).catch(() => '?');
60
+
61
+ // Check version statuses
62
+ const isInstalledCurrent = version.is(installedVersion, '==', packageVersion);
63
+ const isUpToDate = version.is(packageVersion, '>=', latestVersion);
64
+
65
+ // Format version colors
66
+ const installedColor = isInstalledCurrent ? 'green' : 'yellow';
67
+ const latestColor = isUpToDate ? 'green' : 'red';
68
+
69
+ // Store response data
70
+ response[dep] = {
71
+ package: packageVersion,
72
+ installed: installedVersion,
73
+ latest: latestVersion,
74
+ isInstalledCurrent,
75
+ isUpToDate
76
+ };
77
+
78
+ // Add row to table
79
+ data.push([
80
+ dep,
81
+ packageVersion,
82
+ chalk[installedColor](installedVersion),
83
+ chalk[latestColor](latestVersion)
84
+ ]);
85
+ } catch (e) {
86
+ logger.error(`Error checking ${dep}: ${e.message}`);
87
+ }
88
+ }
89
+
90
+ // Stop progress bar
91
+ progress.stop();
92
+
93
+ // Display table
94
+ console.log(table(data));
95
+
96
+ // Log completion
97
+ logger.log(logger.format.green('Outdated package check completed successfully!'));
98
+
99
+ return response;
100
+ };
@@ -0,0 +1,58 @@
1
+ // Libraries
2
+ const logger = new (require('../lib/logger'))('node-power-user');
3
+ const path = require('path');
4
+ const jetpack = require('fs-jetpack');
5
+ const chalk = require('chalk');
6
+ const { table } = require('table');
7
+
8
+ // Load package.json
9
+ const projectPath = process.cwd();
10
+ const projectJson = jetpack.read(path.join(projectPath, 'package.json'), 'json') || {};
11
+
12
+ // Module
13
+ module.exports = async function (options) {
14
+ // Log start
15
+ logger.log(`Listing dependencies for ${logger.format.bold(projectJson.name || 'Unknown Project')} (v${projectJson.version || '0.0.0'})...`);
16
+
17
+ // Initialize response
18
+ const response = {
19
+ dependencies: {},
20
+ devDependencies: {},
21
+ peerDependencies: {}
22
+ };
23
+
24
+ // Initialize table data
25
+ const data = [['name', 'Version']];
26
+
27
+ // Helper function to process dependencies
28
+ const processDeps = (deps, type, label) => {
29
+ if (!deps || Object.keys(deps).length === 0) return;
30
+
31
+ // Insert a separator row if the table already has data
32
+ if (data.length > 1) data.push([label, chalk.gray('───────')]);
33
+
34
+ Object.entries(deps).forEach(([pkg, version]) => {
35
+ data.push([pkg, version]);
36
+ response[type][pkg] = version;
37
+ });
38
+ };
39
+
40
+ // Process dependencies
41
+ processDeps(projectJson.dependencies, 'dependencies', 'Dependencies');
42
+ processDeps(projectJson.devDependencies, 'devDependencies', 'Dev Dependencies');
43
+ processDeps(projectJson.peerDependencies, 'peerDependencies', 'Peer Dependencies');
44
+
45
+ // Check if the table has any data
46
+ if (data.length === 1) {
47
+ logger.warn('No dependencies found in package.json.');
48
+ return response;
49
+ }
50
+
51
+ // Display table
52
+ console.log(table(data));
53
+
54
+ // Log completion
55
+ logger.log(logger.format.green('Package listing completed successfully!'));
56
+
57
+ return response;
58
+ };
@@ -0,0 +1,64 @@
1
+ // Libraries
2
+ const logger = new (require('../lib/logger'))('node-power-user');
3
+ const path = require('path');
4
+ const jetpack = require('fs-jetpack');
5
+ const { execute } = require('node-powertools');
6
+ const inquirer = require('@inquirer/prompts');
7
+
8
+ // Load package.json files
9
+ const package = jetpack.read(path.join(__dirname, '../../', 'package.json'), 'json');
10
+ const project = jetpack.read(path.join(process.cwd(), 'package.json'), 'json');
11
+
12
+ // Module
13
+ module.exports = async function (options) {
14
+ // Collect answers using the new @inquirer/prompts methods
15
+ const message = await ask({
16
+ message: 'Enter a commit message',
17
+ default: 'Update',
18
+ value: options.message,
19
+ multiline: false,
20
+ });
21
+
22
+ // Define cleanup command
23
+ const command = `git pull && git add . && git commit -m "${message}" && git push origin`;
24
+
25
+ // Log initial state
26
+ logger.log(`Syncing repo...`);
27
+
28
+ try {
29
+ // Run cleanup commands
30
+ await execute(command, { log: true });
31
+
32
+ // Log success
33
+ logger.log(logger.format.green('Sync completed successfully!'));
34
+
35
+ return true;
36
+ } catch (e) {
37
+ // Log failure
38
+ logger.error(`Sync failed`, e.stack);
39
+
40
+ return false;
41
+ }
42
+ };
43
+
44
+ function ask(options) {
45
+ options = options || {};
46
+
47
+ // If a value is provided, return it
48
+ if (typeof options.value !== 'undefined') {
49
+ return options.value;
50
+ }
51
+
52
+ // Check if multuiline is enabled
53
+ if (options.multiline) {
54
+ return inquirer.editor({
55
+ message: options.message,
56
+ default: options.default,
57
+ });
58
+ }
59
+
60
+ return inquirer.input({
61
+ message: options.message,
62
+ default: options.default,
63
+ });
64
+ }
@@ -0,0 +1,13 @@
1
+ // Libraries
2
+ const logger = new (require('../lib/logger'))('node-power-user');
3
+ const path = require('path');
4
+ const jetpack = require('fs-jetpack');
5
+
6
+ // Load package
7
+ const package = jetpack.read(path.join(__dirname, '../../', 'package.json'), 'json');
8
+ const project = jetpack.read(path.join(process.cwd(), 'package.json'), 'json');
9
+
10
+ module.exports = async function (options) {
11
+ // Log version
12
+ console.log(package.version);
13
+ };
@@ -0,0 +1,56 @@
1
+ // Libraries
2
+ const chalk = require('chalk');
3
+
4
+ // Logger class
5
+ function Logger(name) {
6
+ const self = this;
7
+
8
+ // Properties
9
+ self.name = name;
10
+ }
11
+
12
+ // Loop through log, error, warn, and info and make methods that log to console with the name and time [xx:xx:xx] name: message
13
+ ['log', 'error', 'warn', 'info'].forEach((method) => {
14
+ Logger.prototype[method] = function () {
15
+ // Get time
16
+ const time = new Date().toLocaleTimeString('en-US', {
17
+ hour12: false,
18
+ hour: '2-digit',
19
+ minute: '2-digit',
20
+ second: '2-digit'
21
+ });
22
+
23
+ // Determine color based on method
24
+ let color;
25
+ switch (method) {
26
+ case 'warn':
27
+ color = chalk.yellow;
28
+ break;
29
+ case 'error':
30
+ color = chalk.red;
31
+ break;
32
+ default:
33
+ color = (text) => text; // No color
34
+ }
35
+
36
+ // Convert arguments to array and prepend time and name
37
+ const args = [`[${chalk.magenta(time)}] '${chalk.cyan(this.name)}':`, ...Array.from(arguments).map(arg => {
38
+ return typeof arg === 'string'
39
+ ? color(arg)
40
+ : (
41
+ arg instanceof Error
42
+ ? color(arg.stack)
43
+ : arg
44
+ );
45
+ })];
46
+
47
+ // Log
48
+ console[method].apply(console, args);
49
+ };
50
+ });
51
+
52
+ // Export chalk as color
53
+ Logger.prototype.format = chalk;
54
+
55
+ // Export
56
+ module.exports = Logger;
package/package.json CHANGED
@@ -1,13 +1,8 @@
1
1
  {
2
2
  "name": "node-power-user",
3
- "version": "1.0.2",
3
+ "version": "1.0.6",
4
4
  "description": "Easy tools for every Node.js developer!",
5
5
  "main": "dist/index.js",
6
- "bin": {
7
- "npu": "bin/npu",
8
- "node-power-user": "bin/npu",
9
- "nodepoweruser": "bin/npu"
10
- },
11
6
  "scripts": {
12
7
  "test": "npm run prepare && ./node_modules/mocha/bin/mocha test/ --recursive --timeout=10000",
13
8
  "start": "npm run prepare && ./bin/npu",
@@ -15,6 +10,11 @@
15
10
  "prepare": "node -e \"require('prepare-package')()\"",
16
11
  "prepare:watch": "nodemon -w ./src -e '*' --exec 'npm run prepare'"
17
12
  },
13
+ "bin": {
14
+ "npu": "bin/npu",
15
+ "node-power-user": "bin/npu",
16
+ "nodepoweruser": "bin/npu"
17
+ },
18
18
  "repository": {
19
19
  "type": "git",
20
20
  "url": "git+https://github.com/itw-creative-works/node-power-user.git"
@@ -36,22 +36,23 @@
36
36
  "replace": {}
37
37
  },
38
38
  "dependencies": {
39
+ "@inquirer/prompts": "^7.3.1",
39
40
  "chalk": "^4.1.2",
40
41
  "cli-progress": "^3.12.0",
41
42
  "fs-jetpack": "^4.3.1",
42
43
  "inquirer": "^8.2.6",
43
- "itwcw-package-analytics": "^1.0.4",
44
+ "itwcw-package-analytics": "^1.0.6",
44
45
  "json5": "^2.2.3",
45
46
  "keychain": "^1.5.0",
46
47
  "lodash": "^4.17.21",
47
- "node-powertools": "^1.4.4",
48
+ "node-powertools": "^2.1.5",
48
49
  "npm-api": "^1.0.1",
49
- "semver": "^7.6.2",
50
- "table": "^6.8.2",
50
+ "table": "^6.9.0",
51
+ "wonderful-version": "^1.3.2",
51
52
  "yargs": "^16.2.0"
52
53
  },
53
54
  "devDependencies": {
54
55
  "mocha": "^8.4.0",
55
- "prepare-package": "^1.1.12"
56
+ "prepare-package": "^1.1.14"
56
57
  }
57
- }
58
+ }