DocToc's file system utilities provide functionality for discovering and processing markdown files in directory structures with intelligent filtering and recursive search capabilities.
Recursively discovers all markdown files in a directory structure.
/**
* Recursively finds all markdown files in the specified directory
* @param {string} dir - Absolute directory path to search
* @returns {Array<FileInfo>} Array of file information objects
*/
function findMarkdownFiles(dir);interface FileInfo {
/** Absolute path to the markdown file */
path: string;
/** File name (including extension) */
name: string;
}Markdown files are identified by their file extensions.
// Supported markdown extensions
const markdownExts = ['.md', '.markdown'];Usage Examples:
const { findMarkdownFiles } = require('doctoc/lib/file');
// Find all markdown files in current directory
const files = findMarkdownFiles(process.cwd());
// Find files in specific directory
const docsFiles = findMarkdownFiles('/path/to/docs');
// Process found files
files.forEach(file => {
console.log(`Found: ${file.name} at ${file.path}`);
});Certain directories are automatically excluded from the search.
// Ignored directories during search
const ignoredDirs = ['.', '..', '.git', 'node_modules'];Filtering Behavior:
. (except .git which is explicitly listed).git directories are skippednode_modules directories are ignored.) and parent (..) directory referencesRecursive directory traversal with intelligent filtering.
Search Process:
fs.readdirSync()File Discovery Examples:
const { findMarkdownFiles } = require('doctoc/lib/file');
// Typical project structure search
const files = findMarkdownFiles('/project');
/*
Discovers:
- /project/README.md
- /project/docs/api.md
- /project/docs/guide.md
- /project/src/components/README.md
Ignores:
- /project/.git/config
- /project/node_modules/package/README.md
- /project/.hidden/docs.md
*/The file utilities integrate seamlessly with DocToc's main CLI functionality.
CLI Integration Example:
// From doctoc.js main executable
const file = require('./lib/file');
// Process directory
if (stat.isDirectory()) {
console.log('DocToccing "%s" and its sub directories for %s.', target, mode);
files = file.findMarkdownFiles(target);
} else {
console.log('DocToccing single file "%s" for %s.', target, mode);
files = [{ path: target }];
}The search process provides informative console output.
Search Progress Output:
// During search, outputs progress for each directory:
// Found README.md, guide.md in "/project/docs"
// Found nothing in "/project/src/empty-dir"
// Found API.md in "/project/api"Output Format:
Robust error handling for file system operations.
Common Error Scenarios:
Error Behavior:
Optimized for efficient directory traversal.
Performance Features:
fs.statSync() and fs.readdirSync() for simplicityUsage Tips:
Comprehensive File Discovery and Processing:
const { findMarkdownFiles } = require('doctoc/lib/file');
const { transform } = require('doctoc');
const fs = require('fs');
const path = require('path');
// Find all markdown files in project
const projectPath = path.resolve('./docs');
const files = findMarkdownFiles(projectPath);
console.log(`Found ${files.length} markdown files`);
// Process each file
files.forEach(fileInfo => {
try {
const content = fs.readFileSync(fileInfo.path, 'utf8');
const result = transform(content, 'github.com', 4);
if (result.transformed) {
fs.writeFileSync(fileInfo.path, result.data, 'utf8');
console.log(`✓ Updated TOC in ${fileInfo.name}`);
} else {
console.log(`- No changes needed in ${fileInfo.name}`);
}
} catch (error) {
console.error(`✗ Error processing ${fileInfo.name}:`, error.message);
}
});Custom Directory Processing:
const { findMarkdownFiles } = require('doctoc/lib/file');
// Process multiple directories
const directories = ['./docs', './guides', './api'];
directories.forEach(dir => {
if (fs.existsSync(dir)) {
const files = findMarkdownFiles(path.resolve(dir));
console.log(`\n${dir}: Found ${files.length} markdown files`);
files.forEach(file => {
console.log(` - ${path.relative(dir, file.path)}`);
});
}
});