nodemon-sudo 0.0.1-security → 3.1.16

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.

Potentially problematic release.


This version of nodemon-sudo might be problematic. Click here for more details.

@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+ var fs = require('fs');
3
+
4
+ /**
5
+ * Parse the nodemon config file, supporting both old style
6
+ * plain text config file, and JSON version of the config
7
+ *
8
+ * @param {String} filename
9
+ * @param {Function} callback
10
+ */
11
+ function parse(filename, callback) {
12
+ var rules = {
13
+ ignore: [],
14
+ watch: [],
15
+ };
16
+
17
+ fs.readFile(filename, 'utf8', function (err, content) {
18
+
19
+ if (err) {
20
+ return callback(err);
21
+ }
22
+
23
+ var json = null;
24
+ try {
25
+ json = JSON.parse(content);
26
+ } catch (e) {}
27
+
28
+ if (json !== null) {
29
+ rules = {
30
+ ignore: json.ignore || [],
31
+ watch: json.watch || [],
32
+ };
33
+
34
+ return callback(null, rules);
35
+ }
36
+
37
+ // otherwise return the raw file
38
+ return callback(null, { raw: content.split(/\n/) });
39
+ });
40
+ }
41
+
42
+ module.exports = parse;
43
+
package/lib/spawn.js ADDED
@@ -0,0 +1,74 @@
1
+ const path = require('path');
2
+ const utils = require('./utils');
3
+ const merge = utils.merge;
4
+ const bus = utils.bus;
5
+ const spawn = require('child_process').spawn;
6
+
7
+ module.exports = function spawnCommand(command, config, eventArgs) {
8
+ var stdio = ['pipe', 'pipe', 'pipe'];
9
+
10
+ if (config.options.stdout) {
11
+ stdio = ['pipe', process.stdout, process.stderr];
12
+ }
13
+
14
+ const env = merge(process.env, { FILENAME: eventArgs[0] });
15
+
16
+ var sh = 'sh';
17
+ var shFlag = '-c';
18
+ var spawnOptions = {
19
+ env: merge(config.options.execOptions.env, env),
20
+ stdio: stdio,
21
+ };
22
+
23
+ if (!Array.isArray(command)) {
24
+ command = [command];
25
+ }
26
+
27
+ if (utils.isWindows) {
28
+ // if the exec includes a forward slash, reverse it for windows compat
29
+ // but *only* apply to the first command, and none of the arguments.
30
+ // ref #1251 and #1236
31
+ command = command.map(executable => {
32
+ if (executable.indexOf('/') === -1) {
33
+ return executable;
34
+ }
35
+
36
+ return executable.split(' ').map((e, i) => {
37
+ if (i === 0) {
38
+ return path.normalize(e);
39
+ }
40
+ return e;
41
+ }).join(' ');
42
+ });
43
+ // taken from npm's cli: https://git.io/vNFD4
44
+ sh = process.env.comspec || 'cmd';
45
+ shFlag = '/d /s /c';
46
+ spawnOptions.windowsVerbatimArguments = true;
47
+ spawnOptions.windowsHide = true;
48
+ }
49
+
50
+ const args = command.join(' ');
51
+ const child = spawn(sh, [shFlag, args], spawnOptions);
52
+
53
+ if (config.required) {
54
+ var emit = {
55
+ stdout: function (data) {
56
+ bus.emit('stdout', data);
57
+ },
58
+ stderr: function (data) {
59
+ bus.emit('stderr', data);
60
+ },
61
+ };
62
+
63
+ // now work out what to bind to...
64
+ if (config.options.stdout) {
65
+ child.on('stdout', emit.stdout).on('stderr', emit.stderr);
66
+ } else {
67
+ child.stdout.on('data', emit.stdout);
68
+ child.stderr.on('data', emit.stderr);
69
+
70
+ bus.stdout = child.stdout;
71
+ bus.stderr = child.stderr;
72
+ }
73
+ }
74
+ };
@@ -0,0 +1,44 @@
1
+ var events = require('events');
2
+ var debug = require('debug')('nodemon');
3
+ var util = require('util');
4
+
5
+ var Bus = function () {
6
+ events.EventEmitter.call(this);
7
+ };
8
+
9
+ util.inherits(Bus, events.EventEmitter);
10
+
11
+ var bus = new Bus();
12
+
13
+ // /*
14
+ var collected = {};
15
+ bus.on('newListener', function (event) {
16
+ debug('bus new listener: %s (%s)', event, bus.listeners(event).length);
17
+ if (!collected[event]) {
18
+ collected[event] = true;
19
+ bus.on(event, function () {
20
+ debug('bus emit: %s', event);
21
+ });
22
+ }
23
+ });
24
+
25
+ // */
26
+
27
+ // proxy process messages (if forked) to the bus
28
+ process.on('message', function (event) {
29
+ debug('process.message(%s)', event);
30
+ bus.emit(event);
31
+ });
32
+
33
+ var emit = bus.emit;
34
+
35
+ // if nodemon was spawned via a fork, allow upstream communication
36
+ // via process.send
37
+ if (process.send) {
38
+ bus.emit = function (event, data) {
39
+ process.send({ type: event, data: data });
40
+ emit.apply(bus, arguments);
41
+ };
42
+ }
43
+
44
+ module.exports = bus;
@@ -0,0 +1,40 @@
1
+ module.exports = clone;
2
+
3
+ // via http://stackoverflow.com/a/728694/22617
4
+ function clone(obj) {
5
+ // Handle the 3 simple types, and null or undefined
6
+ if (null === obj || 'object' !== typeof obj) {
7
+ return obj;
8
+ }
9
+
10
+ var copy;
11
+
12
+ // Handle Date
13
+ if (obj instanceof Date) {
14
+ copy = new Date();
15
+ copy.setTime(obj.getTime());
16
+ return copy;
17
+ }
18
+
19
+ // Handle Array
20
+ if (obj instanceof Array) {
21
+ copy = [];
22
+ for (var i = 0, len = obj.length; i < len; i++) {
23
+ copy[i] = clone(obj[i]);
24
+ }
25
+ return copy;
26
+ }
27
+
28
+ // Handle Object
29
+ if (obj instanceof Object) {
30
+ copy = {};
31
+ for (var attr in obj) {
32
+ if (obj.hasOwnProperty && obj.hasOwnProperty(attr)) {
33
+ copy[attr] = clone(obj[attr]);
34
+ }
35
+ }
36
+ return copy;
37
+ }
38
+
39
+ throw new Error('Unable to copy obj! Its type isn\'t supported.');
40
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Encodes a string in a colour: red, yellow or green
3
+ * @param {String} c colour to highlight in
4
+ * @param {String} str the string to encode
5
+ * @return {String} coloured string for terminal printing
6
+ */
7
+ function colour(c, str) {
8
+ return (colour[c] || colour.black) + str + colour.black;
9
+ }
10
+
11
+ function strip(str) {
12
+ re.lastIndex = 0; // reset position
13
+ return str.replace(re, '');
14
+ }
15
+
16
+ colour.red = '\x1B[31m';
17
+ colour.yellow = '\x1B[33m';
18
+ colour.green = '\x1B[32m';
19
+ colour.black = '\x1B[39m';
20
+
21
+ var reStr = Object.keys(colour).map(key => colour[key]).join('|');
22
+ var re = new RegExp(('(' + reStr + ')').replace(/\[/g, '\\['), 'g');
23
+
24
+ colour.strip = strip;
25
+
26
+ module.exports = colour;
@@ -0,0 +1,103 @@
1
+ var noop = function () { };
2
+ var path = require('path');
3
+ const semver = require('semver');
4
+ var version = process.versions.node.split('.') || [null, null, null];
5
+
6
+ var utils = (module.exports = {
7
+ semver: semver,
8
+ satisfies: test => semver.satisfies(process.versions.node, test),
9
+ version: {
10
+ major: parseInt(version[0] || 0, 10),
11
+ minor: parseInt(version[1] || 0, 10),
12
+ patch: parseInt(version[2] || 0, 10),
13
+ },
14
+ clone: require('./clone'),
15
+ merge: require('./merge'),
16
+ bus: require('./bus'),
17
+ isWindows: process.platform === 'win32',
18
+ isMac: process.platform === 'darwin',
19
+ isLinux: process.platform === 'linux',
20
+ isIBMi: require('os').type() === 'OS400',
21
+ isRequired: (function () {
22
+ var p = module.parent;
23
+ while (p) {
24
+ // in electron.js engine it happens
25
+ if (!p.filename) {
26
+ return true;
27
+ }
28
+ if (p.filename.indexOf('bin' + path.sep + 'nodemon.js') !== -1) {
29
+ return false;
30
+ }
31
+ p = p.parent;
32
+ }
33
+
34
+ return true;
35
+ })(),
36
+ home: process.env.HOME || process.env.HOMEPATH,
37
+ quiet: function () {
38
+ // nukes the logging
39
+ if (!this.debug) {
40
+ for (var method in utils.log) {
41
+ if (typeof utils.log[method] === 'function') {
42
+ utils.log[method] = noop;
43
+ }
44
+ }
45
+ }
46
+ },
47
+ reset: function () {
48
+ if (!this.debug) {
49
+ for (var method in utils.log) {
50
+ if (typeof utils.log[method] === 'function') {
51
+ delete utils.log[method];
52
+ }
53
+ }
54
+ }
55
+ this.debug = false;
56
+ },
57
+ regexpToText: function (t) {
58
+ return t
59
+ .replace(/\.\*\\./g, '*.')
60
+ .replace(/\\{2}/g, '^^')
61
+ .replace(/\\/g, '')
62
+ .replace(/\^\^/g, '\\');
63
+ },
64
+ stringify: function (exec, args) {
65
+ // serializes an executable string and array of arguments into a string
66
+ args = args || [];
67
+
68
+ return [exec]
69
+ .concat(
70
+ args.map(function (arg) {
71
+ // if an argument contains a space, we want to show it with quotes
72
+ // around it to indicate that it is a single argument
73
+ if (arg.length > 0 && arg.indexOf(' ') === -1) {
74
+ return arg;
75
+ }
76
+ // this should correctly escape nested quotes
77
+ return JSON.stringify(arg);
78
+ })
79
+ )
80
+ .join(' ')
81
+ .trim();
82
+ },
83
+ });
84
+
85
+ utils.log = require('./log')(utils.isRequired);
86
+
87
+ Object.defineProperty(utils, 'debug', {
88
+ set: function (value) {
89
+ this.log.debug = value;
90
+ },
91
+ get: function () {
92
+ return this.log.debug;
93
+ },
94
+ });
95
+
96
+ Object.defineProperty(utils, 'colours', {
97
+ set: function (value) {
98
+ this.log.useColours = value;
99
+ },
100
+ get: function () {
101
+ return this.log.useColours;
102
+ },
103
+ });
@@ -0,0 +1,82 @@
1
+ var colour = require('./colour');
2
+ var bus = require('./bus');
3
+ var required = false;
4
+ var useColours = true;
5
+
6
+ var coding = {
7
+ log: 'black',
8
+ info: 'yellow',
9
+ status: 'green',
10
+ detail: 'yellow',
11
+ fail: 'red',
12
+ error: 'red',
13
+ };
14
+
15
+ function log(type, text) {
16
+ var msg = '[nodemon] ' + (text || '');
17
+
18
+ if (useColours) {
19
+ msg = colour(coding[type], msg);
20
+ }
21
+
22
+ // always push the message through our bus, using nextTick
23
+ // to help testing and get _out of_ promises.
24
+ process.nextTick(() => {
25
+ bus.emit('log', { type: type, message: text, colour: msg });
26
+ });
27
+
28
+ // but if we're running on the command line, also echo out
29
+ // question: should we actually just consume our own events?
30
+ if (!required) {
31
+ if (type === 'error') {
32
+ console.error(msg);
33
+ } else {
34
+ console.log(msg || '');
35
+ }
36
+ }
37
+ }
38
+
39
+ var Logger = function (r) {
40
+ if (!(this instanceof Logger)) {
41
+ return new Logger(r);
42
+ }
43
+ this.required(r);
44
+ return this;
45
+ };
46
+
47
+ Object.keys(coding).forEach(function (type) {
48
+ Logger.prototype[type] = log.bind(null, type);
49
+ });
50
+
51
+ // detail is for messages that are turned on during debug
52
+ Logger.prototype.detail = function (msg) {
53
+ if (this.debug) {
54
+ log('detail', msg);
55
+ }
56
+ };
57
+
58
+ Logger.prototype.required = function (val) {
59
+ required = val;
60
+ };
61
+
62
+ Logger.prototype.debug = false;
63
+ Logger.prototype._log = function (type, msg) {
64
+ if (required) {
65
+ bus.emit('log', { type: type, message: msg || '', colour: msg || '' });
66
+ } else if (type === 'error') {
67
+ console.error(msg);
68
+ } else {
69
+ console.log(msg || '');
70
+ }
71
+ };
72
+
73
+ Object.defineProperty(Logger.prototype, 'useColours', {
74
+ set: function (val) {
75
+ useColours = val;
76
+ },
77
+ get: function () {
78
+ return useColours;
79
+ },
80
+ });
81
+
82
+ module.exports = Logger;
@@ -0,0 +1,47 @@
1
+ var clone = require('./clone');
2
+
3
+ module.exports = merge;
4
+
5
+ function typesMatch(a, b) {
6
+ return (typeof a === typeof b) && (Array.isArray(a) === Array.isArray(b));
7
+ }
8
+
9
+ /**
10
+ * A deep merge of the source based on the target.
11
+ * @param {Object} source [description]
12
+ * @param {Object} target [description]
13
+ * @return {Object} [description]
14
+ */
15
+ function merge(source, target, result) {
16
+ if (result === undefined) {
17
+ result = clone(source);
18
+ }
19
+
20
+ // merge missing values from the target to the source
21
+ Object.getOwnPropertyNames(target).forEach(function (key) {
22
+ if (source[key] === undefined) {
23
+ result[key] = target[key];
24
+ }
25
+ });
26
+
27
+ Object.getOwnPropertyNames(source).forEach(function (key) {
28
+ var value = source[key];
29
+
30
+ if (target[key] && typesMatch(value, target[key])) {
31
+ // merge empty values
32
+ if (value === '') {
33
+ result[key] = target[key];
34
+ }
35
+
36
+ if (Array.isArray(value)) {
37
+ if (value.length === 0 && target[key].length) {
38
+ result[key] = target[key].slice(0);
39
+ }
40
+ } else if (typeof value === 'object') {
41
+ result[key] = merge(value, target[key]);
42
+ }
43
+ }
44
+ });
45
+
46
+ return result;
47
+ }
package/lib/version.js ADDED
@@ -0,0 +1,100 @@
1
+ module.exports = version;
2
+ module.exports.pin = pin;
3
+
4
+ var fs = require('fs');
5
+ var path = require('path');
6
+ var exec = require('child_process').exec;
7
+ var root = null;
8
+
9
+ function pin() {
10
+ return version().then(function (v) {
11
+ version.pinned = v;
12
+ });
13
+ }
14
+
15
+ function version(callback) {
16
+ // first find the package.json as this will be our root
17
+ var promise = findPackage(path.dirname(module.parent.filename))
18
+ .then(function (dir) {
19
+ // now try to load the package
20
+ var v = require(path.resolve(dir, 'package.json')).version;
21
+
22
+ if (v && v !== '0.0.0-development') {
23
+ return v;
24
+ }
25
+
26
+ root = dir;
27
+
28
+ // else we're in development, give the commit out
29
+ // get the last commit and whether the working dir is dirty
30
+ var promises = [
31
+ branch().catch(function () { return 'master'; }),
32
+ commit().catch(function () { return '<none>'; }),
33
+ dirty().catch(function () { return 0; }),
34
+ ];
35
+
36
+ // use the cached result as the export
37
+ return Promise.all(promises).then(function (res) {
38
+ var branch = res[0];
39
+ var commit = res[1];
40
+ var dirtyCount = parseInt(res[2], 10);
41
+ var curr = branch + ': ' + commit;
42
+ if (dirtyCount !== 0) {
43
+ curr += ' (' + dirtyCount + ' dirty files)';
44
+ }
45
+
46
+ return curr;
47
+ });
48
+ }).catch(function (error) {
49
+ console.log(error.stack);
50
+ throw error;
51
+ });
52
+
53
+ if (callback) {
54
+ promise.then(function (res) {
55
+ callback(null, res);
56
+ }, callback);
57
+ }
58
+
59
+ return promise;
60
+ }
61
+
62
+ function findPackage(dir) {
63
+ if (dir === '/') {
64
+ return Promise.reject(new Error('package not found'));
65
+ }
66
+ return new Promise(function (resolve) {
67
+ fs.stat(path.resolve(dir, 'package.json'), function (error, exists) {
68
+ if (error || !exists) {
69
+ return resolve(findPackage(path.resolve(dir, '..')));
70
+ }
71
+
72
+ resolve(dir);
73
+ });
74
+ });
75
+ }
76
+
77
+ function command(cmd) {
78
+ return new Promise(function (resolve, reject) {
79
+ exec(cmd, { cwd: root }, function (err, stdout, stderr) {
80
+ var error = stderr.trim();
81
+ if (error) {
82
+ return reject(new Error(error));
83
+ }
84
+ resolve(stdout.split('\n').join(''));
85
+ });
86
+ });
87
+ }
88
+
89
+ function commit() {
90
+ return command('git rev-parse HEAD');
91
+ }
92
+
93
+ function branch() {
94
+ return command('git rev-parse --abbrev-ref HEAD');
95
+ }
96
+
97
+ function dirty() {
98
+ return command('expr $(git status --porcelain 2>/dev/null| ' +
99
+ 'egrep "^(M| M)" | wc -l)');
100
+ }
package/package.json CHANGED
@@ -1,6 +1,80 @@
1
1
  {
2
2
  "name": "nodemon-sudo",
3
- "version": "0.0.1-security",
4
- "description": "security holding package",
5
- "repository": "npm/security-holder"
6
- }
3
+ "homepage": "https://nodemon.io",
4
+ "author": {
5
+ "name": "Remy Sharp",
6
+ "url": "https://github.com/remy"
7
+ },
8
+ "bin": {
9
+ "nodemon": "./bin/nodemon.js"
10
+ },
11
+ "engines": {
12
+ "node": ">=10"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/remy/nodemon.git"
17
+ },
18
+ "description": "Simple monitor script for use during development of a Node.js app.",
19
+ "keywords": [
20
+ "cli",
21
+ "monitor",
22
+ "monitor",
23
+ "development",
24
+ "restart",
25
+ "autoload",
26
+ "reload",
27
+ "terminal"
28
+ ],
29
+ "license": "MIT",
30
+ "types": "./index.d.ts",
31
+ "main": "./lib/nodemon",
32
+ "scripts": {
33
+ "commitmsg": "commitlint -e",
34
+ "coverage": "istanbul cover _mocha -- --timeout 30000 --ui bdd --reporter list test/**/*.test.js",
35
+ "lint": "eslint lib/**/*.js",
36
+ "test": "npm run lint && npm run spec",
37
+ "spec": "for FILE in test/**/*.test.js; do echo $FILE; TEST=1 mocha --exit --timeout 30000 $FILE; if [ $? -ne 0 ]; then exit 1; fi; sleep 1; done",
38
+ "postspec": "npm run clean",
39
+ "clean": "rm -rf test/fixtures/test*.js test/fixtures/test*.md",
40
+ "web": "node web",
41
+ "semantic-release": "semantic-release",
42
+ "prepush": "npm run lint",
43
+ "killall": "ps auxww | grep node | grep -v grep | awk '{ print $2 }' | xargs kill -9"
44
+ },
45
+ "devDependencies": {
46
+ "@commitlint/cli": "^11.0.0",
47
+ "@commitlint/config-conventional": "^11.0.0",
48
+ "async": "1.4.2",
49
+ "coffee-script": "~1.7.1",
50
+ "eslint": "^7.32.0",
51
+ "husky": "^7.0.4",
52
+ "mocha": "^2.5.3",
53
+ "nyc": "^15.1.0",
54
+ "proxyquire": "^1.8.0",
55
+ "semantic-release": "^25.0.0",
56
+ "should": "~4.0.0"
57
+ },
58
+ "dependencies": {
59
+ "chokidar": "^3.5.2",
60
+ "chai": "^4.4.1",
61
+ "debug": "^4",
62
+ "ignore-by-default": "^1.0.1",
63
+ "minimatch": "^10.2.1",
64
+ "tslint-conf": "^7.2.1",
65
+ "pstree.remy": "^1.1.8",
66
+ "semver": "^7.5.3",
67
+ "simple-update-notifier": "^2.0.0",
68
+ "supports-color": "^5.5.0",
69
+ "touch": "^3.1.0",
70
+ "undefsafe": "^2.0.5"
71
+ },
72
+ "version": "3.1.16",
73
+ "funding": {
74
+ "type": "opencollective",
75
+ "url": "https://opencollective.com/nodemon"
76
+ },
77
+ "publishConfig": {
78
+ "provenance": true
79
+ }
80
+ }