99 lines
2.3 KiB
JavaScript
99 lines
2.3 KiB
JavaScript
|
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 );
|
||
|
}
|
||
|
};
|
||
|
}
|