Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.
npx @tessl/cli install tessl/npm-require-directory@2.1.0Recursively iterates over specified directory, require()ing each file, and returning a nested hash structure containing those modules. Enables automatic loading and organizing of multiple modules from a directory hierarchy without manually requiring each file.
npm install require-directoryconst requireDirectory = require('require-directory');const requireDirectory = require('require-directory');
// Require all files from current directory
const modules = requireDirectory(module);
// Require all files from a specific directory
const routes = requireDirectory(module, './routes');
// With options - only JavaScript files, no recursion
const controllers = requireDirectory(module, './controllers', {
extensions: ['js'],
recurse: false
});Recursively processes a directory structure, requiring each file and building a nested hash structure that mirrors the directory layout.
/**
* Recursively requires all files in a directory and returns nested hash structure
* @param {Object} module - The module object (typically 'module')
* @param {string} [path] - Path to directory (defaults to module's directory)
* @param {Object} [options] - Configuration options
* @returns {Object} Nested hash structure containing required modules
*/
function requireDirectory(module, path, options);Parameters:
module (required): The module object, typically pass modulepath (optional): String path to directory to require from. If omitted, uses the directory containing the calling moduleoptions (optional): Configuration object for controlling behaviorReturns: Object containing nested hash structure where:
Control file processing, filtering, and transformation behavior.
interface RequireDirectoryOptions {
/** Array of file extensions to process */
extensions?: string[];
/** Whether to recursively process subdirectories */
recurse?: boolean;
/** Function to transform object keys */
rename?: (name: string, joined: string, filename: string) => string;
/** Function to transform loaded modules - return value used if truthy, otherwise original object */
visit?: (obj: any, joined: string, filename: string) => any;
/** RegExp or function to whitelist files */
include?: RegExp | ((path: string, filename: string) => boolean);
/** RegExp or function to blacklist files */
exclude?: RegExp | ((path: string, filename: string) => boolean);
}Option Details:
extensions: Array of file extensions to include (default: ['js', 'json', 'coffee'])recurse: Boolean controlling recursive directory processing (default: true)rename: Function to transform object keys, receives (name, joined, filename)visit: Function to transform loaded modules, receives (obj, joined, filename). Return value is used if truthy, otherwise original object is keptinclude: RegExp or function to whitelist specific filesexclude: RegExp or function to blacklist specific filesUsage Examples:
// Custom extensions
const modules = requireDirectory(module, './lib', {
extensions: ['js', 'ts']
});
// No recursion
const topLevel = requireDirectory(module, './routes', {
recurse: false
});
// File filtering with RegExp
const jsOnly = requireDirectory(module, './src', {
include: /\.js$/
});
// File filtering with function
const filtered = requireDirectory(module, './controllers', {
exclude: (path, filename) => filename.startsWith('test')
});
// Key transformation
const uppercased = requireDirectory(module, './models', {
rename: (name) => name.toUpperCase()
});
// Module transformation
const wrapped = requireDirectory(module, './middleware', {
visit: (obj) => {
// Wrap functions with logging
if (typeof obj === 'function') {
return (...args) => {
console.log('Calling:', obj.name);
return obj(...args);
};
}
return obj;
}
});Access the default configuration object used by requireDirectory.
/**
* Default options object used by requireDirectory
*/
const defaults: RequireDirectoryOptions;The defaults object contains:
const defaults = {
extensions: ['js', 'json', 'coffee'],
recurse: true,
rename: function(name) { return name; },
visit: function(obj) { return obj; }
};Usage:
// Access default options
const defaultOpts = requireDirectory.defaults;
// Modify defaults for all subsequent calls
requireDirectory.defaults.extensions = ['js', 'ts'];/**
* Configuration options for requireDirectory function
*/
interface RequireDirectoryOptions {
/** File extensions to process (default: ['js', 'json', 'coffee']) */
extensions?: string[];
/** Enable recursive directory processing (default: true) */
recurse?: boolean;
/** Transform function for object keys */
rename?: (name: string, joined: string, filename: string) => string;
/** Transform function for loaded modules */
visit?: (obj: any, joined: string, filename: string) => any;
/** RegExp pattern or function to include specific files */
include?: RegExp | ((path: string, filename: string) => boolean);
/** RegExp pattern or function to exclude specific files */
exclude?: RegExp | ((path: string, filename: string) => boolean);
}
/**
* Filter function signature for include/exclude options
*/
type FilterFunction = (path: string, filename: string) => boolean;
/**
* Rename function signature for transforming object keys
*/
type RenameFunction = (name: string, joined: string, filename: string) => string;
/**
* Visit function signature for transforming loaded modules
* Return value is used if truthy, otherwise original object is kept
*/
type VisitFunction = (obj: any, joined: string, filename: string) => any;module.require() internally for proper relative path resolution// Route organization pattern
// routes/index.js
module.exports = requireDirectory(module);
// app.js
const routes = require('./routes');
app.get('/', routes.home);
app.get('/users', routes.users.list);
// Controller loading with transformation
const controllers = requireDirectory(module, './controllers', {
visit: (controller) => {
// Auto-bind methods to controller instance
if (typeof controller === 'object') {
Object.getOwnPropertyNames(Object.getPrototypeOf(controller))
.filter(name => typeof controller[name] === 'function')
.forEach(name => controller[name] = controller[name].bind(controller));
}
return controller;
}
});
// Development vs production file loading
const middleware = requireDirectory(module, './middleware', {
exclude: process.env.NODE_ENV === 'production' ? /dev\.js$/ : /prod\.js$/
});