UNPKG

require-dir-watch

Version:

Reimport the files from a directory when they are being updated.

98 lines (82 loc) 3.19 kB
"use strict"; 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; };