Browse Source

Allow copy's filter to return a Promise

ci/travis-osximage
RyanZim 7 years ago
parent
commit
9732252b94
  1. 2
      docs/copy.md
  2. 13
      lib/copy/__tests__/copy.test.js
  3. 11
      lib/copy/copy.js

2
docs/copy.md

@ -9,7 +9,7 @@ Copy a file or directory. The directory can have contents. Like `cp -r`.
- `errorOnExist` `<boolean>`: when `overwrite` is `false` and the destination exists, throw an error. Default is `false`. - `errorOnExist` `<boolean>`: when `overwrite` is `false` and the destination exists, throw an error. Default is `false`.
- `dereference` `<boolean>`: dereference symlinks, default is `false`. - `dereference` `<boolean>`: dereference symlinks, default is `false`.
- `preserveTimestamps` `<boolean>`: will set last modification and access times to the ones of the original source files, default is `false`. - `preserveTimestamps` `<boolean>`: will set last modification and access times to the ones of the original source files, default is `false`.
- `filter` `<Function>`: Function to filter copied files. Return `true` to include, `false` to exclude. - `filter` `<Function>`: Function to filter copied files. Return `true` to include, `false` to exclude. Can also return a `Promise` that resolves to `true` or `false` (or pass in an `async` function).
- `callback` `<Function>` - `callback` `<Function>`
## Example: ## Example:

13
lib/copy/__tests__/copy.test.js

@ -249,6 +249,19 @@ describe('fs-extra', () => {
}) })
}) })
it('allows filter fn to return a promise', done => {
const srcFile1 = path.join(TEST_DIR, '1.css')
fs.writeFileSync(srcFile1, '')
const destFile1 = path.join(TEST_DIR, 'dest1.css')
const filter = s => Promise.resolve(s.split('.').pop() !== 'css')
fse.copy(srcFile1, destFile1, filter, err => {
assert(!err)
assert(!fs.existsSync(destFile1))
done()
})
})
it('should apply filter recursively', done => { it('should apply filter recursively', done => {
const FILES = 2 const FILES = 2
// Don't match anything that ends with a digit higher than 0: // Don't match anything that ends with a digit higher than 0:

11
lib/copy/copy.js

@ -13,7 +13,7 @@ function copy (src, dest, opts, cb) {
if (typeof opts === 'function' && !cb) { if (typeof opts === 'function' && !cb) {
cb = opts cb = opts
opts = {} opts = {}
} else if (typeof opts === 'function' || opts instanceof RegExp) { } else if (typeof opts === 'function') {
opts = {filter: opts} opts = {filter: opts}
} }
@ -49,8 +49,13 @@ function copy (src, dest, opts, cb) {
} }
function startCopy (src, dest, opts, cb) { function startCopy (src, dest, opts, cb) {
if (opts.filter && !opts.filter(src, dest)) return cb() if (opts.filter) {
return getStats(src, dest, opts, cb) Promise.resolve(opts.filter(src, dest))
.then(include => {
if (include) getStats(src, dest, opts, cb)
else cb()
}, error => cb(error))
} else getStats(src, dest, opts, cb)
} }
function getStats (src, dest, opts, cb) { function getStats (src, dest, opts, cb) {

Loading…
Cancel
Save