autoreload-gulp
Version:
Reloads gulp process when gulpfile.js or an imported relative dependency change
94 lines (73 loc) • 2.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _gulp = require('gulp');
var _gulp2 = _interopRequireDefault(_gulp);
var _child_process = require('child_process');
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _psTree = require('ps-tree');
var _psTree2 = _interopRequireDefault(_psTree);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var deepKill = function (pid, _signal, _callback) {
const signal = _signal || 'SIGKILL';
const callback = _callback || function () {};
(0, _psTree2.default)(pid, function (err, children) {
[pid].concat(children.map(function (p) {
return p.PID;
})).forEach(function (tpid) {
try {
process.kill(tpid, signal);
} catch (ex) {}
});
callback();
});
};
const autoreload = (task, gulpDir) => {
return () => {
var p;
function checkGulpDir(dir) {
return new Promise((resolve, reject) => {
_fs2.default.stat(dir, function (err, stats) {
if (err) {
return reject(err);
}
if (!stats.isDirectory()) {
return reject(new Error(`${dir} is not a directory!`));
} else {
resolve(dir);
}
});
});
}
function spawnChild(done) {
if (p) {
deepKill(p.pid);
}
p = (0, _child_process.spawn)('gulp', [task], { stdio: 'inherit' });
if (done) {
done();
}
}
function swapResolution(promise) {
// (A\/B)° = A°/\B°
return new Promise((resolve, reject) => Promise.resolve(promise).then(reject, resolve));
}
function any(promises) {
return swapResolution(Promise.all(promises.map(swapResolution)));
};
const promise = gulpDir ? Promise.resolve(gulpDir) : any(['gulp', 'gulp-tasks', 'gulp_tasks'].map(checkGulpDir));
return promise.then(dir => {
_gulp2.default.watch(['gulpfile.js', 'gulpfile.babel.js', _path2.default.join(dir, '**/*.js')], spawnChild);
spawnChild();
}, err => {
_gulp2.default.watch(['gulpfile.js', 'gulpfile.babel.js'], spawnChild);
spawnChild();
});
};
};
exports.default = autoreload;
module.exports = exports.default;