@@ -55,12 +55,20 @@ function cpSyncFn(src, dest, opts) {
5555 'node is not recommended' ;
5656 process . emitWarning ( warning , 'TimestampPrecisionWarning' ) ;
5757 }
58- const { srcStat, destStat } = checkPathsSync ( src , dest , opts ) ;
58+ const { srcStat, destStat, skipped } = checkPathsSync ( src , dest , opts ) ;
59+ if ( skipped ) return ;
5960 checkParentPathsSync ( src , srcStat , dest ) ;
60- return handleFilterAndCopy ( destStat , src , dest , opts ) ;
61+ return checkParentDir ( destStat , src , dest , opts ) ;
6162}
6263
6364function checkPathsSync ( src , dest , opts ) {
65+ if ( opts . filter ) {
66+ const shouldCopy = opts . filter ( src , dest ) ;
67+ if ( isPromise ( shouldCopy ) ) {
68+ throw new ERR_INVALID_RETURN_VALUE ( 'boolean' , 'filter' , shouldCopy ) ;
69+ }
70+ if ( ! shouldCopy ) return { __proto__ : null , skipped : true } ;
71+ }
6472 const { srcStat, destStat } = getStatsSync ( src , dest , opts ) ;
6573
6674 if ( destStat ) {
@@ -104,7 +112,7 @@ function checkPathsSync(src, dest, opts) {
104112 code : 'EINVAL' ,
105113 } ) ;
106114 }
107- return { srcStat, destStat } ;
115+ return { __proto__ : null , srcStat, destStat, skipped : false } ;
108116}
109117
110118function getStatsSync ( src , dest , opts ) {
@@ -145,24 +153,12 @@ function checkParentPathsSync(src, srcStat, dest) {
145153 return checkParentPathsSync ( src , srcStat , destParent ) ;
146154}
147155
148- function handleFilterAndCopy ( destStat , src , dest , opts ) {
149- if ( opts . filter ) {
150- const shouldCopy = opts . filter ( src , dest ) ;
151- if ( isPromise ( shouldCopy ) ) {
152- throw new ERR_INVALID_RETURN_VALUE ( 'boolean' , 'filter' , shouldCopy ) ;
153- }
154- if ( ! shouldCopy ) return ;
155- }
156+ function checkParentDir ( destStat , src , dest , opts ) {
156157 const destParent = dirname ( dest ) ;
157158 if ( ! existsSync ( destParent ) ) mkdirSync ( destParent , { recursive : true } ) ;
158159 return getStats ( destStat , src , dest , opts ) ;
159160}
160161
161- function startCopy ( destStat , src , dest , opts ) {
162- if ( opts . filter && ! opts . filter ( src , dest ) ) return ;
163- return getStats ( destStat , src , dest , opts ) ;
164- }
165-
166162function getStats ( destStat , src , dest , opts ) {
167163 const statSyncFn = opts . dereference ? statSync : lstatSync ;
168164 const srcStat = statSyncFn ( src ) ;
@@ -284,9 +280,8 @@ function copyDir(src, dest, opts) {
284280 const { name } = dirent ;
285281 const srcItem = join ( src , name ) ;
286282 const destItem = join ( dest , name ) ;
287- const { destStat } = checkPathsSync ( srcItem , destItem , opts ) ;
288-
289- startCopy ( destStat , srcItem , destItem , opts ) ;
283+ const { destStat, skipped } = checkPathsSync ( srcItem , destItem , opts ) ;
284+ if ( ! skipped ) getStats ( destStat , srcItem , destItem , opts ) ;
290285 }
291286 } finally {
292287 dir . closeSync ( ) ;
0 commit comments