1
1
'use strict'
2
2
3
- const fs = require ( 'graceful- fs' )
3
+ const fs = require ( '../ fs' )
4
4
const path = require ( 'path' )
5
+ const util = require ( 'util' )
5
6
const atLeastNode = require ( 'at-least-node' )
6
7
7
8
const nodeSupportsBigInt = atLeastNode ( '10.5.0' )
9
+ const stat = ( file ) => nodeSupportsBigInt ? fs . stat ( file , { bigint : true } ) : fs . stat ( file )
10
+ const statSync = ( file ) => nodeSupportsBigInt ? fs . statSync ( file , { bigint : true } ) : fs . statSync ( file )
8
11
9
- function getStats ( src , dest , cb ) {
10
- if ( nodeSupportsBigInt ) {
11
- fs . stat ( src , { bigint : true } , ( err , srcStat ) => {
12
- if ( err ) return cb ( err )
13
- fs . stat ( dest , { bigint : true } , ( err , destStat ) => {
14
- if ( err ) {
15
- if ( err . code === 'ENOENT' ) return cb ( null , { srcStat, destStat : null } )
16
- return cb ( err )
17
- }
18
- return cb ( null , { srcStat, destStat } )
19
- } )
12
+ function getStats ( src , dest ) {
13
+ return Promise . all ( [
14
+ stat ( src ) ,
15
+ stat ( dest ) . catch ( err => {
16
+ if ( err . code === 'ENOENT' ) return null
17
+ throw err
20
18
} )
21
- } else {
22
- fs . stat ( src , ( err , srcStat ) => {
23
- if ( err ) return cb ( err )
24
- fs . stat ( dest , ( err , destStat ) => {
25
- if ( err ) {
26
- if ( err . code === 'ENOENT' ) return cb ( null , { srcStat, destStat : null } )
27
- return cb ( err )
28
- }
29
- return cb ( null , { srcStat, destStat } )
30
- } )
31
- } )
32
- }
19
+ ] ) . then ( ( [ srcStat , destStat ] ) => ( { srcStat, destStat } ) )
33
20
}
34
21
35
22
function getStatsSync ( src , dest ) {
36
- let srcStat , destStat
37
- if ( nodeSupportsBigInt ) {
38
- srcStat = fs . statSync ( src , { bigint : true } )
39
- } else {
40
- srcStat = fs . statSync ( src )
41
- }
23
+ let destStat
24
+ const srcStat = statSync ( src )
42
25
try {
43
- if ( nodeSupportsBigInt ) {
44
- destStat = fs . statSync ( dest , { bigint : true } )
45
- } else {
46
- destStat = fs . statSync ( dest )
47
- }
26
+ destStat = statSync ( dest )
48
27
} catch ( err ) {
49
28
if ( err . code === 'ENOENT' ) return { srcStat, destStat : null }
50
29
throw err
@@ -53,7 +32,7 @@ function getStatsSync (src, dest) {
53
32
}
54
33
55
34
function checkPaths ( src , dest , funcName , cb ) {
56
- getStats ( src , dest , ( err , stats ) => {
35
+ util . callbackify ( getStats ) ( src , dest , ( err , stats ) => {
57
36
if ( err ) return cb ( err )
58
37
const { srcStat, destStat } = stats
59
38
if ( destStat && areIdentical ( srcStat , destStat ) ) {
@@ -85,29 +64,18 @@ function checkParentPaths (src, srcStat, dest, funcName, cb) {
85
64
const srcParent = path . resolve ( path . dirname ( src ) )
86
65
const destParent = path . resolve ( path . dirname ( dest ) )
87
66
if ( destParent === srcParent || destParent === path . parse ( destParent ) . root ) return cb ( )
88
- if ( nodeSupportsBigInt ) {
89
- fs . stat ( destParent , { bigint : true } , ( err , destStat ) => {
90
- if ( err ) {
91
- if ( err . code === 'ENOENT' ) return cb ( )
92
- return cb ( err )
93
- }
94
- if ( areIdentical ( srcStat , destStat ) ) {
95
- return cb ( new Error ( errMsg ( src , dest , funcName ) ) )
96
- }
97
- return checkParentPaths ( src , srcStat , destParent , funcName , cb )
98
- } )
99
- } else {
100
- fs . stat ( destParent , ( err , destStat ) => {
101
- if ( err ) {
102
- if ( err . code === 'ENOENT' ) return cb ( )
103
- return cb ( err )
104
- }
105
- if ( areIdentical ( srcStat , destStat ) ) {
106
- return cb ( new Error ( errMsg ( src , dest , funcName ) ) )
107
- }
108
- return checkParentPaths ( src , srcStat , destParent , funcName , cb )
109
- } )
67
+ const callback = ( err , destStat ) => {
68
+ if ( err ) {
69
+ if ( err . code === 'ENOENT' ) return cb ( )
70
+ return cb ( err )
71
+ }
72
+ if ( areIdentical ( srcStat , destStat ) ) {
73
+ return cb ( new Error ( errMsg ( src , dest , funcName ) ) )
74
+ }
75
+ return checkParentPaths ( src , srcStat , destParent , funcName , cb )
110
76
}
77
+ if ( nodeSupportsBigInt ) fs . stat ( destParent , { bigint : true } , callback )
78
+ else fs . stat ( destParent , callback )
111
79
}
112
80
113
81
function checkParentPathsSync ( src , srcStat , dest , funcName ) {
@@ -116,11 +84,7 @@ function checkParentPathsSync (src, srcStat, dest, funcName) {
116
84
if ( destParent === srcParent || destParent === path . parse ( destParent ) . root ) return
117
85
let destStat
118
86
try {
119
- if ( nodeSupportsBigInt ) {
120
- destStat = fs . statSync ( destParent , { bigint : true } )
121
- } else {
122
- destStat = fs . statSync ( destParent )
123
- }
87
+ destStat = statSync ( destParent )
124
88
} catch ( err ) {
125
89
if ( err . code === 'ENOENT' ) return
126
90
throw err
0 commit comments