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,36 @@
1
+
2
+ Configuration
3
+ --config <file> .......... alternate nodemon.json config file to use
4
+ --exitcrash .............. exit on crash, allows nodemon to work with other watchers
5
+ -i, --ignore ............. ignore specific files or directories
6
+ --no-colors .............. disable color output
7
+ --signal <signal> ........ use specified kill signal instead of default (ex. SIGTERM)
8
+ -w, --watch path ......... watch directory "dir" or files. use once for each
9
+ directory or file to watch
10
+ --no-update-notifier ..... opt-out of update version check
11
+
12
+ Execution
13
+ -C, --on-change-only ..... execute script on change only, not startup
14
+ --cwd <dir> .............. change into <dir> before running the script
15
+ -e, --ext ................ extensions to look for, ie. "js,pug,hbs"
16
+ -I, --no-stdin ........... nodemon passes stdin directly to child process
17
+ --spawn .................. force nodemon to use spawn (over fork) [node only]
18
+ -x, --exec app ........... execute script with "app", ie. -x "python -v"
19
+ -- <your args> ........... to tell nodemon stop slurping arguments
20
+
21
+ Watching
22
+ -d, --delay n ............ debounce restart for "n" seconds
23
+ -L, --legacy-watch ....... use polling to watch for changes (typically needed
24
+ when watching over a network/Docker)
25
+ -P, --polling-interval ... combined with -L, milliseconds to poll for (default 100)
26
+
27
+ Information
28
+ --dump ................... print full debug configuration
29
+ -h, --help ............... default help
30
+ --help <topic> ........... help on a specific feature. Try "--help topics"
31
+ -q, --quiet .............. minimise nodemon messages to start/stop only
32
+ -v, --version ............ current nodemon version
33
+ -V, --verbose ............ show detail on what is causing restarts
34
+
35
+
36
+ > Note that any unrecognised arguments are passed to the executing command.
@@ -0,0 +1,8 @@
1
+
2
+ options .................. show all available nodemon options
3
+ config ................... default config options using nodemon.json
4
+ authors .................. contributors to this project
5
+ logo ..................... <3
6
+ whoami ................... I, AM, NODEMON \o/
7
+
8
+ Please support https://github.com/remy/nodemon/
@@ -0,0 +1,3 @@
1
+ Usage: nodemon [nodemon options] [script.js] [args]
2
+
3
+ See "nodemon --help" for more.
@@ -0,0 +1,9 @@
1
+ __/\\\\\_____/\\\_______/\\\\\_______/\\\\\\\\\\\\_____/\\\\\\\\\\\\\\\__/\\\\____________/\\\\_______/\\\\\_______/\\\\\_____/\\\_
2
+ _\/\\\\\\___\/\\\_____/\\\///\\\____\/\\\////////\\\__\/\\\///////////__\/\\\\\\________/\\\\\\_____/\\\///\\\____\/\\\\\\___\/\\\_
3
+ _\/\\\/\\\__\/\\\___/\\\/__\///\\\__\/\\\______\//\\\_\/\\\_____________\/\\\//\\\____/\\\//\\\___/\\\/__\///\\\__\/\\\/\\\__\/\\\_
4
+ _\/\\\//\\\_\/\\\__/\\\______\//\\\_\/\\\_______\/\\\_\/\\\\\\\\\\\_____\/\\\\///\\\/\\\/_\/\\\__/\\\______\//\\\_\/\\\//\\\_\/\\\_
5
+ _\/\\\\//\\\\/\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/\\\///////______\/\\\__\///\\\/___\/\\\_\/\\\_______\/\\\_\/\\\\//\\\\/\\\_
6
+ _\/\\\_\//\\\/\\\_\//\\\______/\\\__\/\\\_______\/\\\_\/\\\_____________\/\\\____\///_____\/\\\_\//\\\______/\\\__\/\\\_\//\\\/\\\_
7
+ _\/\\\__\//\\\\\\__\///\\\__/\\\____\/\\\_______/\\\__\/\\\_____________\/\\\_____________\/\\\__\///\\\__/\\\____\/\\\__\//\\\\\\_
8
+ _\/\\\___\//\\\\\____\///\\\\\/_____\/\\\\\\\\\\\\/___\/\\\\\\\\\\\\\\\_\/\\\_____________\/\\\____\///\\\\\/_____\/\\\___\//\\\\\_
9
+ _\///_____\/////_______\/////_______\////////////_____\///////////////__\///______________\///_______\/////_______\///_____\/////__
package/index.d.ts ADDED
@@ -0,0 +1,124 @@
1
+ import type { WatchOptions } from 'chokidar';
2
+
3
+ export type NodemonEventHandler =
4
+ | 'start'
5
+ | 'crash'
6
+ | 'exit'
7
+ | 'quit'
8
+ | 'restart'
9
+ | 'config:update'
10
+ | 'log'
11
+ | 'readable'
12
+ | 'stdout'
13
+ | 'stderr';
14
+
15
+ export type NodemonEventListener = {
16
+ on(event: 'start' | 'crash' | 'readable', listener: () => void): Nodemon;
17
+ on(event: 'log', listener: (e: NodemonEventLog) => void): Nodemon;
18
+ on(event: 'stdout' | 'stderr', listener: (e: string) => void): Nodemon;
19
+ on(event: 'restart', listener: (files?: string[]) => void): Nodemon;
20
+ on(event: 'quit', listener: (e?: NodemonEventQuit) => void): Nodemon;
21
+ on(event: 'exit', listener: (e?: number) => void): Nodemon;
22
+ on(
23
+ event: 'config:update',
24
+ listener: (e?: NodemonEventConfig) => void,
25
+ ): Nodemon;
26
+ };
27
+
28
+ export type NodemonEventLog = {
29
+ /**
30
+ - detail: what you get with nodemon --verbose.
31
+ - status: subprocess starting, restarting.
32
+ - fail: is the subprocess crashing.
33
+ - error: is a nodemon system error.
34
+ */
35
+ type: 'detail' | 'log' | 'status' | 'error' | 'fail';
36
+ /** the plain text message */
37
+ message: string;
38
+ /** contains the terminal escape codes to add colour, plus the "[nodemon]" prefix */
39
+ colour: string;
40
+ };
41
+
42
+ export type NodemonEventQuit = 143 | 130;
43
+
44
+ export type NodemonEventConfig = {
45
+ run: boolean;
46
+ system: {
47
+ cwd: string;
48
+ };
49
+ required: boolean;
50
+ dirs: string[];
51
+ timeout: number;
52
+ options: NodemonConfig;
53
+ lastStarted: number;
54
+ loaded: string[];
55
+ load: (
56
+ settings: NodemonSettings,
57
+ ready: (config: NodemonEventConfig) => void,
58
+ ) => void;
59
+ reset: () => void;
60
+ };
61
+
62
+ export interface NodemonExecOptions {
63
+ script: string;
64
+ scriptPosition?: number;
65
+ args?: string[];
66
+ ext?: string; // "js,mjs" etc (should really support an array of strings, but I don't think it does right now)
67
+ exec?: string; // node, python, etc
68
+ execArgs?: string[]; // args passed to node, etc,
69
+ nodeArgs?: string[]; // args passed to node, etc,
70
+ }
71
+
72
+ export interface NodemonConfig {
73
+ /** restartable defaults to "rs" as a string the user enters */
74
+ restartable?: false | string;
75
+ colours?: boolean;
76
+ execMap?: { [key: string]: string };
77
+ ignoreRoot?: string[];
78
+ watch?: string[];
79
+ ignore?: string[];
80
+ stdin?: boolean;
81
+ runOnChangeOnly?: boolean;
82
+ verbose?: boolean;
83
+ signal?: string;
84
+ stdout?: boolean;
85
+ watchOptions?: WatchOptions;
86
+ help?: string;
87
+ version?: boolean;
88
+ cwd?: string;
89
+ dump?: boolean;
90
+ delay?: number;
91
+ monitor?: string[];
92
+ spawn?: boolean;
93
+ noUpdateNotifier?: boolean;
94
+ legacyWatch?: boolean;
95
+ pollingInterval?: number;
96
+ /** @deprecated as this is "on" by default */
97
+ js?: boolean;
98
+ quiet?: boolean;
99
+ configFile?: string;
100
+ exitCrash?: boolean;
101
+ execOptions?: NodemonExecOptions;
102
+ }
103
+
104
+ export interface NodemonSettings extends NodemonConfig, NodemonExecOptions {
105
+ events?: Record<string, string>;
106
+ env?: Record<string, string>;
107
+ }
108
+
109
+ export type Nodemon = {
110
+ (settings: NodemonSettings): Nodemon;
111
+ removeAllListeners(event: NodemonEventHandler): Nodemon;
112
+ emit(type: NodemonEventHandler, event?: any): Nodemon;
113
+ reset(callback: Function): Nodemon;
114
+ restart(): Nodemon;
115
+ config: NodemonSettings;
116
+ } & NodemonEventListener & {
117
+ [K in keyof NodemonEventListener as 'addListener']: NodemonEventListener[K];
118
+ } & {
119
+ [K in keyof NodemonEventListener as 'once']: NodemonEventListener[K];
120
+ };
121
+
122
+ declare const nodemon: Nodemon;
123
+
124
+ export = nodemon;
package/jsconfig.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "compilerOptions": {
3
+ "typeRoots": ["./index.d.ts", "./node_modules/@types"],
4
+ "checkJs": true
5
+ },
6
+ "exclude": ["node_modules"]
7
+ }
@@ -0,0 +1,49 @@
1
+ var parse = require('./parse');
2
+
3
+ /**
4
+ * Converts a string to command line args, in particular
5
+ * groups together quoted values.
6
+ * This is a utility function to allow calling nodemon as a required
7
+ * library, but with the CLI args passed in (instead of an object).
8
+ *
9
+ * @param {String} string
10
+ * @return {Array}
11
+ */
12
+ function stringToArgs(string) {
13
+ var args = [];
14
+
15
+ var parts = string.split(' ');
16
+ var length = parts.length;
17
+ var i = 0;
18
+ var open = false;
19
+ var grouped = '';
20
+ var lead = '';
21
+
22
+ for (; i < length; i++) {
23
+ lead = parts[i].substring(0, 1);
24
+ if (lead === '"' || lead === '\'') {
25
+ open = lead;
26
+ grouped = parts[i].substring(1);
27
+ } else if (open && parts[i].slice(-1) === open) {
28
+ open = false;
29
+ grouped += ' ' + parts[i].slice(0, -1);
30
+ args.push(grouped);
31
+ } else if (open) {
32
+ grouped += ' ' + parts[i];
33
+ } else {
34
+ args.push(parts[i]);
35
+ }
36
+ }
37
+
38
+ return args;
39
+ }
40
+
41
+ module.exports = {
42
+ parse: function (argv) {
43
+ if (typeof argv === 'string') {
44
+ argv = stringToArgs(argv);
45
+ }
46
+
47
+ return parse(argv);
48
+ },
49
+ };
@@ -0,0 +1,230 @@
1
+ /*
2
+
3
+ nodemon is a utility for node, and replaces the use of the executable
4
+ node. So the user calls `nodemon foo.js` instead.
5
+
6
+ nodemon can be run in a number of ways:
7
+
8
+ `nodemon` - tries to use package.json#main property to run
9
+ `nodemon` - if no package, looks for index.js
10
+ `nodemon app.js` - runs app.js
11
+ `nodemon --arg app.js --apparg` - eats arg1, and runs app.js with apparg
12
+ `nodemon --apparg` - as above, but passes apparg to package.json#main (or
13
+ index.js)
14
+ `nodemon --debug app.js
15
+
16
+ */
17
+
18
+ var fs = require('fs');
19
+ var path = require('path');
20
+ var existsSync = fs.existsSync || path.existsSync;
21
+
22
+ module.exports = parse;
23
+
24
+ /**
25
+ * Parses the command line arguments `process.argv` and returns the
26
+ * nodemon options, the user script and the executable script.
27
+ *
28
+ * @param {Array<string> | string} argv full process arguments, including `node` leading arg
29
+ * @return {Object} { options, script, args }
30
+ */
31
+ function parse(argv) {
32
+ if (typeof argv === 'string') {
33
+ argv = argv.split(' ');
34
+ }
35
+
36
+ var eat = function (i, args) {
37
+ if (i <= args.length) {
38
+ return args.splice(i + 1, 1).pop();
39
+ }
40
+ };
41
+
42
+ var args = argv.slice(2);
43
+ var script = null;
44
+ var nodemonOptions = { scriptPosition: null };
45
+
46
+ var nodemonOpt = nodemonOption.bind(null, nodemonOptions);
47
+ var lookForArgs = true;
48
+
49
+ // move forward through the arguments
50
+ for (var i = 0; i < args.length; i++) {
51
+ // if the argument looks like a file, then stop eating
52
+ if (!script) {
53
+ if (args[i] === '.' || existsSync(args[i])) {
54
+ script = args.splice(i, 1).pop();
55
+
56
+ // we capture the position of the script because we'll reinsert it in
57
+ // the right place in run.js:command (though I'm not sure we should even
58
+ // take it out of the array in the first place, but this solves passing
59
+ // arguments to the exec process for now).
60
+ nodemonOptions.scriptPosition = i;
61
+ i--;
62
+ continue;
63
+ }
64
+ }
65
+
66
+ if (lookForArgs) {
67
+ // respect the standard way of saying: hereafter belongs to my script
68
+ if (args[i] === '--') {
69
+ args.splice(i, 1);
70
+ nodemonOptions.scriptPosition = i;
71
+ // cycle back one argument, as we just ate this one up
72
+ i--;
73
+
74
+ // ignore all further nodemon arguments
75
+ lookForArgs = false;
76
+
77
+ // move to the next iteration
78
+ continue;
79
+ }
80
+
81
+ if (nodemonOpt(args[i], eat.bind(null, i, args)) !== false) {
82
+ args.splice(i, 1);
83
+ // cycle back one argument, as we just ate this one up
84
+ i--;
85
+ }
86
+ }
87
+ }
88
+
89
+ nodemonOptions.script = script;
90
+ nodemonOptions.args = args;
91
+
92
+ return nodemonOptions;
93
+ }
94
+
95
+
96
+ /**
97
+ * Given an argument (ie. from process.argv), sets nodemon
98
+ * options and can eat up the argument value
99
+ *
100
+ * @param {import('../..').NodemonSettings} options object that will be updated
101
+ * @param {String} arg current argument from argv
102
+ * @param {Function} eatNext the callback to eat up the next argument in argv
103
+ * @return {Boolean} false if argument was not a nodemon arg
104
+ */
105
+ function nodemonOption(options, arg, eatNext) {
106
+ // line separation on purpose to help legibility
107
+ if (arg === '--help' || arg === '-h' || arg === '-?') {
108
+ var help = eatNext();
109
+ options.help = help ? help : true;
110
+ } else
111
+
112
+ if (arg === '--version' || arg === '-v') {
113
+ options.version = true;
114
+ } else
115
+
116
+ if (arg === '--no-update-notifier') {
117
+ options.noUpdateNotifier = true;
118
+ } else
119
+
120
+ if (arg === '--spawn') {
121
+ options.spawn = true;
122
+ } else
123
+
124
+ if (arg === '--dump') {
125
+ options.dump = true;
126
+ } else
127
+
128
+ if (arg === '--verbose' || arg === '-V') {
129
+ options.verbose = true;
130
+ } else
131
+
132
+ if (arg === '--legacy-watch' || arg === '-L') {
133
+ options.legacyWatch = true;
134
+ } else
135
+
136
+ if (arg === '--polling-interval' || arg === '-P') {
137
+ options.pollingInterval = parseInt(eatNext(), 10);
138
+ } else
139
+
140
+ // Depricated as this is "on" by default
141
+ if (arg === '--js') {
142
+ options.js = true;
143
+ } else
144
+
145
+ if (arg === '--quiet' || arg === '-q') {
146
+ options.quiet = true;
147
+ } else
148
+
149
+ if (arg === '--config') {
150
+ options.configFile = eatNext();
151
+ } else
152
+
153
+ if (arg === '--watch' || arg === '-w') {
154
+ if (!options.watch) { options.watch = []; }
155
+ options.watch.push(eatNext());
156
+ } else
157
+
158
+ if (arg === '--ignore' || arg === '-i') {
159
+ if (!options.ignore) { options.ignore = []; }
160
+ options.ignore.push(eatNext());
161
+ } else
162
+
163
+ if (arg === '--exitcrash') {
164
+ options.exitCrash = true;
165
+ } else
166
+
167
+ if (arg === '--delay' || arg === '-d') {
168
+ options.delay = parseDelay(eatNext());
169
+ } else
170
+
171
+ if (arg === '--exec' || arg === '-x') {
172
+ options.exec = eatNext();
173
+ } else
174
+
175
+ if (arg === '--no-stdin' || arg === '-I') {
176
+ options.stdin = false;
177
+ } else
178
+
179
+ if (arg === '--on-change-only' || arg === '-C') {
180
+ options.runOnChangeOnly = true;
181
+ } else
182
+
183
+ if (arg === '--ext' || arg === '-e') {
184
+ options.ext = eatNext();
185
+ } else
186
+
187
+ if (arg === '--no-colours' || arg === '--no-colors') {
188
+ options.colours = false;
189
+ } else
190
+
191
+ if (arg === '--signal' || arg === '-s') {
192
+ options.signal = eatNext();
193
+ } else
194
+
195
+ if (arg === '--cwd') {
196
+ options.cwd = eatNext();
197
+
198
+ // go ahead and change directory. This is primarily for nodemon tools like
199
+ // grunt-nodemon - we're doing this early because it will affect where the
200
+ // user script is searched for.
201
+ process.chdir(path.resolve(options.cwd));
202
+ } else {
203
+
204
+ // this means we didn't match
205
+ return false;
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Given an argument (ie. from nodemonOption()), will parse and return the
211
+ * equivalent millisecond value or 0 if the argument cannot be parsed
212
+ *
213
+ * @param {String} value argument value given to the --delay option
214
+ * @return {Number} millisecond equivalent of the argument
215
+ */
216
+ function parseDelay(value) {
217
+ var millisPerSecond = 1000;
218
+ var millis = 0;
219
+
220
+ if (value.match(/^\d*ms$/)) {
221
+ // Explicitly parse for milliseconds when using ms time specifier
222
+ millis = parseInt(value, 10);
223
+ } else {
224
+ // Otherwise, parse for seconds, with or without time specifier then convert
225
+ millis = parseFloat(value) * millisPerSecond;
226
+ }
227
+
228
+ return isNaN(millis) ? 0 : millis;
229
+ }
230
+
@@ -0,0 +1,43 @@
1
+ module.exports = command;
2
+
3
+ /**
4
+ * command constructs the executable command to run in a shell including the
5
+ * user script, the command arguments.
6
+ *
7
+ * @param {Object} settings Object as:
8
+ * { execOptions: {
9
+ * exec: String,
10
+ * [script: String],
11
+ * [scriptPosition: Number],
12
+ * [execArgs: Array<string>]
13
+ * }
14
+ * }
15
+ * @return {Object} an object with the node executable and the
16
+ * arguments to the command
17
+ */
18
+ function command(settings) {
19
+ var options = settings.execOptions;
20
+ var executable = options.exec;
21
+ var args = [];
22
+
23
+ // after "executable" go the exec args (like --debug, etc)
24
+ if (options.execArgs) {
25
+ [].push.apply(args, options.execArgs);
26
+ }
27
+
28
+ // then goes the user's script arguments
29
+ if (options.args) {
30
+ [].push.apply(args, options.args);
31
+ }
32
+
33
+ // after the "executable" goes the user's script
34
+ if (options.script) {
35
+ args.splice((options.scriptPosition || 0) +
36
+ options.execArgs.length, 0, options.script);
37
+ }
38
+
39
+ return {
40
+ executable: executable,
41
+ args: args,
42
+ };
43
+ }
@@ -0,0 +1,34 @@
1
+ var ignoreRoot = require('ignore-by-default').directories();
2
+
3
+ // default options for config.options
4
+ const defaults = {
5
+ restartable: 'rs',
6
+ colours: true,
7
+ execMap: {
8
+ py: 'python',
9
+ rb: 'ruby',
10
+ ts: 'ts-node',
11
+ // more can be added here such as ls: lsc - but please ensure it's cross
12
+ // compatible with linux, mac and windows, or make the default.js
13
+ // dynamically append the `.cmd` for node based utilities
14
+ },
15
+ ignoreRoot: ignoreRoot.map((_) => `**/${_}/**`),
16
+ watch: ['*.*'],
17
+ stdin: true,
18
+ runOnChangeOnly: false,
19
+ verbose: false,
20
+ signal: 'SIGUSR2',
21
+ // 'stdout' refers to the default behaviour of a required nodemon's child,
22
+ // but also includes stderr. If this is false, data is still dispatched via
23
+ // nodemon.on('stdout/stderr')
24
+ stdout: true,
25
+ watchOptions: {},
26
+ };
27
+
28
+ const nodeOptions = process.env.NODE_OPTIONS || ''; // ?
29
+
30
+ if (/--(loader|import)\b/.test(nodeOptions)) {
31
+ delete defaults.execMap.ts;
32
+ }
33
+
34
+ module.exports = defaults;