|
import * as fs from 'fs'; |
|
import { resolve, sep } from 'path'; |
|
import resolvePath from '../utils/resolvePath'; |
|
|
|
function walk ( dir, callback ) { |
|
let results = []; |
|
|
|
fs.readdir( dir, ( err, files ) => { |
|
if ( err ) return callback( err ); |
|
|
|
let pending = files.length; |
|
if ( !pending ) return callback( null, results ); |
|
|
|
files.forEach( file => { |
|
file = resolve( dir, file ); |
|
|
|
fs.stat( file, ( err, stats ) => { |
|
if ( stats && stats.isDirectory() ) { |
|
walk( file, ( err, res ) => { |
|
results = results.concat( res ); |
|
if ( !--pending ) callback( null, results ); |
|
}); |
|
} else { |
|
results.push( file ); |
|
if ( !--pending ) callback( null, results ); |
|
} |
|
}); |
|
}); |
|
}); |
|
}; |
|
|
|
export function lsr () { |
|
const basedir = resolvePath( arguments ); |
|
|
|
return new Promise( ( fulfil, reject ) => { |
|
walk( basedir, function ( err, result ) { |
|
if ( err ) return reject( err ); |
|
|
|
|
|
const index = basedir.length + 1; |
|
let i = result.length; |
|
while ( i-- ) { |
|
result[i] = result[i].substring( index ); |
|
} |
|
|
|
fulfil( result ); |
|
}); |
|
}); |
|
} |
|
|
|
export function lsrSync () { |
|
const basedir = resolvePath( arguments ); |
|
|
|
let result = []; |
|
|
|
function processdir ( dir ) { |
|
fs.readdirSync( dir ).forEach( file => { |
|
const filepath = dir + sep + file; |
|
|
|
if ( fs.statSync( filepath ).isDirectory() ) { |
|
processdir( filepath ); |
|
} else { |
|
result.push( filepath.replace( basedir + sep, '' ) ); |
|
} |
|
}); |
|
} |
|
|
|
processdir( basedir ); |
|
return result; |
|
} |