RSS Git Download  Clone
Raw Blame History
const fs = require('fs');
const path = require('path');

function readdirRecursive(startDir) {

    let readDirQueue = [],
        fileList = [];

    function readDir(dir) {

        function getItemList(readDir) {

            return new Promise((resolve,reject) => {

                fs.readdir(readDir,(err,itemList) => {

                    if (err) {
                        return reject();
                    }

                    // resolve with parent path added to each item
                    resolve(itemList.map((item) => path.resolve(readDir,item)));
                });
            });
        }

        function getItemListStat(itemList) {

            function getStat(itemPath) {

                return new Promise((resolve,reject) => {

                    fs.stat(itemPath,(err,stat) => {

                        if (err) {
                            return reject();
                        }

                        // resolve with item path and if directory
                        resolve({itemPath,isDirectory: stat.isDirectory()});
                    });
                });
            }

            // stat all items in list
            return Promise.all(itemList.map(getStat));
        }

        function processItemList(itemList) {

            for (let {itemPath,isDirectory} of itemList) {
                // if directory add to queue
                if (isDirectory) {
                    readDirQueue.push(itemPath);
                    continue;
                }

                // add file to list
                fileList.push(itemPath);
            }

            // if queue, process next item recursive
            if (readDirQueue.length > 0) {
                return readDir(readDirQueue.shift());
            }

            // finished - return file list
            return fileList;
        }

        // read item list from directory, stat each item then walk result
        return getItemList(dir)
            .then(getItemListStat)
            .then(processItemList);
    }

    // commence reading at the top
    return readDir(startDir);
}

module.exports = readdirRecursive