|
import { sep } from 'path'; |
|
import * as fs from 'graceful-fs'; |
|
import mkdirp from 'mkdirp'; |
|
import resolvePathAndOptions from '../utils/resolvePathAndOptions'; |
|
|
|
export function copydir () { |
|
const { resolvedPath: src, options: readOptions } = resolvePathAndOptions( arguments ); |
|
|
|
return { |
|
to () { |
|
const { resolvedPath: dest, options: writeOptions } = resolvePathAndOptions( arguments ); |
|
|
|
function copydir ( src, dest, cb ) { |
|
mkdirp( dest, err => { |
|
if ( err ) return cb( err ); |
|
|
|
fs.readdir( src, ( err, files ) => { |
|
if ( err ) return cb( err ); |
|
|
|
let remaining = files.length; |
|
|
|
if ( !remaining ) return cb(); |
|
|
|
function check ( err ) { |
|
if ( err ) { |
|
return cb( err ); |
|
} |
|
|
|
if ( !--remaining ) { |
|
cb(); |
|
} |
|
} |
|
|
|
files.forEach( function ( filename ) { |
|
const srcpath = src + sep + filename; |
|
const destpath = dest + sep + filename; |
|
|
|
fs.stat( srcpath, ( err, stats ) => { |
|
var readStream, writeStream; |
|
|
|
if ( stats.isDirectory() ) { |
|
return copydir( srcpath, destpath, check ); |
|
} |
|
|
|
readStream = fs.createReadStream( srcpath, readOptions ); |
|
writeStream = fs.createWriteStream( destpath, writeOptions ); |
|
|
|
readStream.on( 'error', cb ); |
|
writeStream.on( 'error', cb ); |
|
|
|
writeStream.on( 'close', check ); |
|
|
|
readStream.pipe( writeStream ); |
|
}); |
|
}); |
|
}); |
|
}); |
|
} |
|
|
|
return new Promise( ( fulfil, reject ) => { |
|
copydir( src, dest, err => { |
|
if ( err ) { |
|
reject( err ); |
|
} else { |
|
fulfil(); |
|
} |
|
}); |
|
}); |
|
} |
|
}; |
|
} |
|
|
|
export function copydirSync () { |
|
const { resolvedPath: src, options: readOptions } = resolvePathAndOptions( arguments ); |
|
|
|
return { |
|
to () { |
|
const { resolvedPath: dest, options: writeOptions } = resolvePathAndOptions( arguments ); |
|
|
|
function copydir ( src, dest ) { |
|
mkdirp.sync( dest ); |
|
|
|
fs.readdirSync( src ).forEach( filename => { |
|
const srcpath = src + sep + filename; |
|
const destpath = dest + sep + filename; |
|
|
|
if ( fs.statSync( srcpath ).isDirectory() ) { |
|
return copydir( srcpath, destpath ); |
|
} |
|
|
|
const data = fs.readFileSync( srcpath, readOptions ); |
|
fs.writeFileSync( destpath, data, writeOptions ); |
|
}); |
|
} |
|
|
|
copydir( src, dest ); |
|
} |
|
}; |
|
} |