require-dir-watch
Version:
Reimport the files from a directory when they are being updated.
98 lines (82 loc) • 3.19 kB
JavaScript
;
var fs = require("fs");
var path = require("path");
/**
* requireDirWatch
* Reimport the files from a directory when they are being updated.
*
* @name requireDirWatch
* @function
* @param {String} directoryPath The directory to watch.
* @param {Object} [options] Configuration options.
* @param {Function} [options.onError] A callback function to handle errors.
* @param {Function} [options.onCreate] A callback function when a file is created.
* @param {Function} [options.onUpdate] A callback function when a file is updated.
* @param {Function} [options.onDelete] A callback function when a file is deleted.
* @return {Object} An object with file base names as keys and their exports as values.
*/
module.exports = function requireDirWatch(directoryPath) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _options$onError = options.onError,
onError = _options$onError === undefined ? console.error : _options$onError,
onCreate = options.onCreate,
onUpdate = options.onUpdate,
onDelete = options.onDelete;
if (!fs.existsSync(directoryPath) || !fs.statSync(directoryPath).isDirectory()) {
throw new Error("Invalid directory path");
}
var exportsMap = {};
function loadFile(filePath) {
var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
try {
var ext = path.extname(filePath);
if (ext !== ".js" && ext !== ".json") return;
var baseName = path.basename(filePath, ext);
delete require.cache[require.resolve(filePath)];
exportsMap[baseName] = require(filePath);
if (isNew && onCreate) onCreate(baseName, exportsMap[baseName]);else if (onUpdate) onUpdate(baseName, exportsMap[baseName]);
} catch (err) {
onError(err);
}
}
function unloadFile(filePath) {
try {
var ext = path.extname(filePath);
if (ext !== ".js" && ext !== ".json") return;
var baseName = path.basename(filePath, ext);
delete require.cache[require.resolve(filePath)];
delete exportsMap[baseName];
if (onDelete) onDelete(baseName);
} catch (err) {
onError(err);
}
}
function init() {
try {
fs.readdirSync(directoryPath).forEach(function (file) {
loadFile(path.join(directoryPath, file), true);
});
} catch (err) {
onError(err);
}
}
fs.watch(directoryPath, function (eventType, filename) {
if (!filename) return;
var filePath = path.join(directoryPath, filename);
try {
if (eventType === "rename") {
if (fs.existsSync(filePath)) {
loadFile(filePath, true);
} else {
unloadFile(filePath);
}
} else if (eventType === "change") {
loadFile(filePath);
}
} catch (err) {
onError(err);
}
});
init();
return exportsMap;
};