mirror of
https://github.com/SrIzan10/nodemon.git
synced 2026-05-01 10:55:09 +00:00
147 lines
3.1 KiB
JavaScript
147 lines
3.1 KiB
JavaScript
'use strict';
|
|
var fork = require('child_process').fork,
|
|
path = require('path'),
|
|
appjs = path.resolve(__dirname, 'fixtures', 'app.js'),
|
|
assert = require('assert'),
|
|
port = 8000,
|
|
appcoffee = path.resolve(__dirname, 'fixtures', 'app.coffee');
|
|
|
|
function asCLI(cmd) {
|
|
return {
|
|
exec: 'bin/nodemon.js',
|
|
// make nodemon verbose so we can check the filters being applied
|
|
args: ('-V ' + (cmd || '')).trim().split(' ')
|
|
};
|
|
}
|
|
|
|
function match(str, key) {
|
|
return str.indexOf(key) !== -1;
|
|
}
|
|
|
|
function monitorForChange(str) {
|
|
var watch = false;
|
|
return function (line) {
|
|
if (match(line, 'files triggering change check: nodemonCheckFsWatch')) {
|
|
watch = false;
|
|
} else if (match(line, 'files triggering change check:')) {
|
|
watch = true;
|
|
}
|
|
|
|
if (watch) {
|
|
if (match(line, str)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
function run(cmd, callbacks) {
|
|
var cli = typeof cmd === 'string' ? asCLI(cmd) : cmd;
|
|
port++;
|
|
process.env.PORT = port;
|
|
var proc = fork(cli.exec, cli.args, {
|
|
env: process.env,
|
|
cwd: process.cwd(),
|
|
encoding: 'utf8',
|
|
silent: true,
|
|
});
|
|
|
|
proc.stderr.setEncoding('utf8');
|
|
proc.stdout.setEncoding('utf8');
|
|
|
|
if (callbacks.output) {
|
|
proc.stdout.on('data', callbacks.output);
|
|
}
|
|
if (callbacks.restart) {
|
|
proc.stdout.on('data', function (data) {
|
|
if (match(data, 'restarting due to changes')) {
|
|
callbacks.restart(null, data);
|
|
}
|
|
});
|
|
}
|
|
if (callbacks.error) {
|
|
proc.stderr.on('data', function (error) {
|
|
error = error.toString().trim();
|
|
|
|
if (process.env.TRAVIS && error === 'User defined signal 2') {
|
|
// swallow the SIGUSR2 - it should never hit the stderr, but for some
|
|
// reason, travis sees it and causes our tests to fail, so we swallow
|
|
// if this specific error bubbles out
|
|
} else {
|
|
callbacks.error(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
return proc;
|
|
}
|
|
|
|
function cleanup(p, done, err) {
|
|
// as above
|
|
if (process.env.TRAVIS && err &&
|
|
err.message.indexOf('User defined signal 2') === 0) {
|
|
err = null;
|
|
}
|
|
if (p) {
|
|
p.once('exit', function () {
|
|
p = null;
|
|
done(err);
|
|
});
|
|
p.send('quit');
|
|
} else {
|
|
done(err);
|
|
}
|
|
}
|
|
|
|
function Plan(count, done) {
|
|
this.done = done;
|
|
this.count = count;
|
|
}
|
|
|
|
Plan.prototype.assert = function() {
|
|
assert.apply(null, arguments);
|
|
// console.log(arguments[1]);
|
|
|
|
if (this.count === 0) {
|
|
assert(false, 'Too many assertions called via "' + arguments[1] + '"');
|
|
} else {
|
|
this.count--;
|
|
}
|
|
|
|
if (this.count === 0) {
|
|
this.done();
|
|
}
|
|
};
|
|
|
|
function getTriggerCount(msg) {
|
|
var changes = msg.split(/\n/).shift();
|
|
changes = changes.replace(/\s*/gm, '').slice(-5).split('/');
|
|
return changes.pop();
|
|
}
|
|
|
|
function isRunning(pid) {
|
|
try {
|
|
process.kill(pid, 0)
|
|
return true
|
|
} catch (error) {
|
|
if (error.code && error.code === 'ESRCH') return false
|
|
throw error
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
getTriggerCount: getTriggerCount,
|
|
Plan: Plan,
|
|
asCLI: asCLI,
|
|
match: match,
|
|
run: run,
|
|
cleanup: cleanup,
|
|
appjs: appjs,
|
|
appcoffee: appcoffee,
|
|
monitorForChange: monitorForChange,
|
|
port: port,
|
|
isRunning: isRunning
|
|
};
|