Skip to content

Commit

Permalink
Merge pull request #518 from jprichardson/async-filter
Browse files Browse the repository at this point in the history
Allow copy's filter to return a Promise
  • Loading branch information
RyanZim committed Nov 14, 2017
2 parents 03fba97 + 9732252 commit 935e189
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 4 deletions.
2 changes: 1 addition & 1 deletion docs/copy.md
Expand Up @@ -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`.
- `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`.
- `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>`

## Example:
Expand Down
13 changes: 13 additions & 0 deletions lib/copy/__tests__/copy.test.js
Expand Up @@ -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 => {
const FILES = 2
// Don't match anything that ends with a digit higher than 0:
Expand Down
11 changes: 8 additions & 3 deletions lib/copy/copy.js
Expand Up @@ -13,7 +13,7 @@ function copy (src, dest, opts, cb) {
if (typeof opts === 'function' && !cb) {
cb = opts
opts = {}
} else if (typeof opts === 'function' || opts instanceof RegExp) {
} else if (typeof opts === 'function') {
opts = {filter: opts}
}

Expand Down Expand Up @@ -49,8 +49,13 @@ function copy (src, dest, opts, cb) {
}

function startCopy (src, dest, opts, cb) {
if (opts.filter && !opts.filter(src, dest)) return cb()
return getStats(src, dest, opts, cb)
if (opts.filter) {
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) {
Expand Down

0 comments on commit 935e189

Please sign in to comment.