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.
- package/.prettierrc.json +3 -0
- package/LICENSE +21 -0
- package/README.md +437 -3
- package/bin/nodemon.js +16 -0
- package/bin/windows-kill.exe +0 -0
- package/doc/cli/authors.txt +8 -0
- package/doc/cli/config.txt +44 -0
- package/doc/cli/help.txt +29 -0
- package/doc/cli/logo.txt +20 -0
- package/doc/cli/options.txt +36 -0
- package/doc/cli/topics.txt +8 -0
- package/doc/cli/usage.txt +3 -0
- package/doc/cli/whoami.txt +9 -0
- package/index.d.ts +124 -0
- package/jsconfig.json +7 -0
- package/lib/cli/index.js +49 -0
- package/lib/cli/parse.js +230 -0
- package/lib/config/command.js +43 -0
- package/lib/config/defaults.js +34 -0
- package/lib/config/exec.js +240 -0
- package/lib/config/index.js +93 -0
- package/lib/config/load.js +225 -0
- package/lib/help/index.js +27 -0
- package/lib/index.js +1 -0
- package/lib/monitor/index.js +4 -0
- package/lib/monitor/match.js +288 -0
- package/lib/monitor/run.js +562 -0
- package/lib/monitor/signals.js +34 -0
- package/lib/monitor/watch.js +244 -0
- package/lib/nodemon.js +317 -0
- package/lib/rules/add.js +89 -0
- package/lib/rules/index.js +53 -0
- package/lib/rules/parse.js +43 -0
- package/lib/spawn.js +74 -0
- package/lib/utils/bus.js +44 -0
- package/lib/utils/clone.js +40 -0
- package/lib/utils/colour.js +26 -0
- package/lib/utils/index.js +103 -0
- package/lib/utils/log.js +82 -0
- package/lib/utils/merge.js +47 -0
- package/lib/version.js +100 -0
- package/package.json +78 -4
|
@@ -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,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
package/lib/cli/index.js
ADDED
|
@@ -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
|
+
};
|
package/lib/cli/parse.js
ADDED
|
@@ -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;
|