'use strict'; const fs = require('fs'); const path = require('path'); // Prevent caching of this module so module.parent is always accurate. delete require.cache[__filename]; const parentFile = module.parent && module.parent.filename; const parentDirectory = path.dirname(parentFile || '.'); // The default file extensions used by `require()`. const fileExtensions = new Set(['.js', '.json', '.node']); module.exports = (directory, options) => { directory = path.resolve(parentDirectory, directory || ''); options = { camelize: true, fileExtensions, ...options }; let files; try { files = fs.readdirSync(directory); } catch (_) { return {}; } const done = new Set(); const returnValue = {}; for (const fileExtension of options.fileExtensions) { for (const file of files) { const filenameStem = path.basename(file).replace(/\.\w+$/, ''); const fullPath = path.join(directory, file); if (done.has(filenameStem) || fullPath === parentFile || path.extname(file) !== fileExtension || filenameStem[0] === '_' || filenameStem[0] === '.') { continue; } const exportKey = options.camelize ? filenameStem.replace(/-(\w)/g, (m, p1) => p1.toUpperCase()) : filenameStem; returnValue[exportKey] = require(fullPath); done.add(filenameStem); } } return returnValue; };