Skip to content

Commit a277cbb

Browse files
authored
Refactor move API to async/await (#1025)
1 parent 40c5161 commit a277cbb

File tree

3 files changed

+43
-62
lines changed

3 files changed

+43
-62
lines changed

lib/move/__tests__/move.test.js

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict'
22

3-
const fs = require('graceful-fs')
3+
const fs = require('../../fs')
44
const os = require('os')
55
const fse = require('../../')
66
const path = require('path')
@@ -12,14 +12,12 @@ const { differentDevice, ifCrossDeviceEnabled } = require('./cross-device-utils'
1212
const describeIfWindows = process.platform === 'win32' ? describe : describe.skip
1313

1414
function createAsyncErrFn (errCode) {
15-
const fn = function (...args) {
15+
async function fn () {
1616
fn.callCount++
17-
const callback = args.pop()
18-
setTimeout(() => {
19-
const err = new Error()
20-
err.code = errCode
21-
callback(err)
22-
}, 10)
17+
const err = new Error()
18+
err.code = errCode
19+
20+
return Promise.reject(err)
2321
}
2422
fn.callCount = 0
2523
return fn

lib/move/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict'
22

3-
const u = require('universalify').fromCallback
3+
const u = require('universalify').fromPromise
44
module.exports = {
55
move: u(require('./move')),
66
moveSync: require('./move-sync')

lib/move/move.js

+36-53
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,59 @@
11
'use strict'
22

3-
const fs = require('graceful-fs')
3+
const fs = require('../fs')
44
const path = require('path')
5-
const copy = require('../copy').copy
6-
const remove = require('../remove').remove
7-
const mkdirp = require('../mkdirs').mkdirp
8-
const pathExists = require('../path-exists').pathExists
5+
const { copy } = require('../copy')
6+
const { remove } = require('../remove')
7+
const { mkdirp } = require('../mkdirs')
8+
const { pathExists } = require('../path-exists')
99
const stat = require('../util/stat')
1010

11-
function move (src, dest, opts, cb) {
12-
if (typeof opts === 'function') {
13-
cb = opts
14-
opts = {}
15-
}
11+
async function move (src, dest, opts = {}) {
12+
const overwrite = opts.overwrite || opts.clobber || false
1613

17-
opts = opts || {}
14+
const { srcStat, isChangingCase = false } = await stat.checkPaths(src, dest, 'move', opts)
1815

19-
const overwrite = opts.overwrite || opts.clobber || false
16+
await stat.checkParentPaths(src, srcStat, dest, 'move')
2017

21-
stat.checkPaths(src, dest, 'move', opts, (err, stats) => {
22-
if (err) return cb(err)
23-
const { srcStat, isChangingCase = false } = stats
24-
stat.checkParentPaths(src, srcStat, dest, 'move', err => {
25-
if (err) return cb(err)
26-
if (isParentRoot(dest)) return doRename(src, dest, overwrite, isChangingCase, cb)
27-
mkdirp(path.dirname(dest), err => {
28-
if (err) return cb(err)
29-
return doRename(src, dest, overwrite, isChangingCase, cb)
30-
})
31-
})
32-
})
33-
}
18+
// If the parent of dest is not root, make sure it exists before proceeding
19+
const destParent = path.dirname(dest)
20+
const parsedParentPath = path.parse(destParent)
21+
if (parsedParentPath.root !== destParent) {
22+
await mkdirp(destParent)
23+
}
3424

35-
function isParentRoot (dest) {
36-
const parent = path.dirname(dest)
37-
const parsedPath = path.parse(parent)
38-
return parsedPath.root === parent
25+
return doRename(src, dest, overwrite, isChangingCase)
3926
}
4027

41-
function doRename (src, dest, overwrite, isChangingCase, cb) {
42-
if (isChangingCase) return rename(src, dest, overwrite, cb)
43-
if (overwrite) {
44-
return remove(dest, err => {
45-
if (err) return cb(err)
46-
return rename(src, dest, overwrite, cb)
47-
})
28+
async function doRename (src, dest, overwrite, isChangingCase) {
29+
if (!isChangingCase) {
30+
if (overwrite) {
31+
await remove(dest)
32+
} else if (await pathExists(dest)) {
33+
throw new Error('dest already exists.')
34+
}
4835
}
49-
pathExists(dest, (err, destExists) => {
50-
if (err) return cb(err)
51-
if (destExists) return cb(new Error('dest already exists.'))
52-
return rename(src, dest, overwrite, cb)
53-
})
54-
}
5536

56-
function rename (src, dest, overwrite, cb) {
57-
fs.rename(src, dest, err => {
58-
if (!err) return cb()
59-
if (err.code !== 'EXDEV') return cb(err)
60-
return moveAcrossDevice(src, dest, overwrite, cb)
61-
})
37+
try {
38+
// Try w/ rename first, and try copy + remove if EXDEV
39+
await fs.rename(src, dest)
40+
} catch (err) {
41+
if (err.code !== 'EXDEV') {
42+
throw err
43+
}
44+
await moveAcrossDevice(src, dest, overwrite)
45+
}
6246
}
6347

64-
function moveAcrossDevice (src, dest, overwrite, cb) {
48+
async function moveAcrossDevice (src, dest, overwrite) {
6549
const opts = {
6650
overwrite,
6751
errorOnExist: true,
6852
preserveTimestamps: true
6953
}
70-
copy(src, dest, opts, err => {
71-
if (err) return cb(err)
72-
return remove(src, cb)
73-
})
54+
55+
await copy(src, dest, opts)
56+
return remove(src)
7457
}
7558

7659
module.exports = move

0 commit comments

Comments
 (0)