@mockyeah/server
Version:
A powerful service mocking, recording, and playback utility.
67 lines (52 loc) • 1.5 kB
JavaScript
const _ = require('lodash');
const chokidar = require('chokidar');
const clearModule = require('clear-module');
const restart = app => {
const { suitesDir, fixturesDir } = app.config;
app.log(['watch'], 'restarting');
clearModule.match(new RegExp(suitesDir));
clearModule.match(new RegExp(fixturesDir));
const wasPlayingSuites = app.locals.playingSuites;
const wasPlayingAll = app.locals.playingAll;
app.reset();
if (wasPlayingAll) {
app.playAll();
} else {
wasPlayingSuites.forEach(name => {
app.play(name);
});
}
};
const makeWatch = app => {
const { suitesDir, fixturesDir } = app.config;
let first = true;
const debounced = _.debounce(() => {
if (first) {
first = false;
return;
}
restart(app);
}, 500);
const watch = callback =>
new Promise((resolve, reject) => {
const watcher = chokidar.watch([suitesDir, fixturesDir]);
watcher.on('ready', err => {
if (callback) callback(err);
if (err) reject(err);
else resolve();
});
watcher.on('error', err => {
app.log(['watch', 'error'], err && err.message);
if (callback) callback(err);
reject(err);
});
watcher.on('all', debounced);
app.log('watch', 'started watching');
app.locals.watcher = watcher;
});
return watch;
};
// Exposed only for testing.
// eslint-disable-next-line no-underscore-dangle
makeWatch.__restart = restart;
module.exports = makeWatch;