Source: apc-abstract/lib/file/readdir_recursive_sync.js

/**
 * Read a directory recursive synchronically.
 * @function lib.file.readdirRecursiveSync
 * @param {string} dirname - Directory name to read.
 * @returns {function} filenames - Filenames relative to the directory.
 * @author Taka Okunishi
 *
 */
var fs = require('fs'),
    path = require('path');

exports = module.exports = function (dirname) {
    return fs.readdirSync(dirname)
        .map(function (filename) {
            return path.resolve(dirname, filename);
        })
        .filter(function (filename) {
            return fs.existsSync(filename);
        })
        .map(function (filename) {
            var isDir = fs.statSync(filename).isDirectory();
            if (isDir) {
                var subDirname = filename;
                return exports(subDirname).map(function (filename) {
                    return path.relative(dirname, path.resolve(subDirname, filename));
                });
            } else {
                return path.relative(dirname, filename);
            }
        })
        .reduce(function (a, b) {
            return a.concat(b);
        }, []);
};