1
- import fs from "fs" ;
2
- import path from "path" ;
1
+ import fs from "fs/promises" ;
3
2
import prompts from "prompts" ;
4
3
5
4
async function prompt ( action , target ) {
@@ -13,34 +12,31 @@ async function prompt(action, target) {
13
12
return input === "YES" || input === "yes" || input === "Y" || input === "y" ;
14
13
}
15
14
16
- export async function copyFolderRecursiveSync ( srcDir , dstDir , y = false ) {
17
- let src ;
18
- let dst ;
19
-
20
- return fs . readdirSync ( srcDir ) . reduce ( async ( accPromise , file ) => {
21
- await accPromise ;
22
- src = path . join ( srcDir , file ) ;
23
- dst = path . join ( dstDir , file ) ;
24
-
25
- const stat = fs . statSync ( src ) ;
26
- if ( stat && stat . isDirectory ( ) ) {
27
- if ( ! fs . existsSync ( dst ) ) {
28
- fs . mkdirSync ( dst ) ;
29
- }
15
+ async function getStatOrNullIfMissed ( path ) {
16
+ try {
17
+ return await fs . stat ( path ) ;
18
+ } catch ( error ) {
19
+ if ( error . code === "ENOENT" ) return null ;
20
+ throw error ;
21
+ }
22
+ }
30
23
31
- await copyFolderRecursiveSync ( src , dst , y ) ;
32
- } else if ( ! fs . existsSync ( dst ) ) {
33
- fs . writeFileSync ( dst , fs . readFileSync ( src ) ) ;
34
- } else if ( y || ( await prompt ( "overwrite" , dst ) ) ) {
35
- fs . writeFileSync ( dst , fs . readFileSync ( src ) ) ;
36
- }
37
- } , Promise . resolve ( ) ) ;
24
+ export async function copyFolderRecursive ( srcDir , dstDir , y = false ) {
25
+ return fs . cp ( srcDir , dstDir , {
26
+ recursive : true ,
27
+ async filter ( _src , dest ) {
28
+ if ( y ) return true ;
29
+ const stat = await getStatOrNullIfMissed ( dest ) ;
30
+ if ( stat == null ) return true ;
31
+ if ( stat . isDirectory ( ) ) return true ;
32
+ return await prompt ( "overwrite" , dest ) ;
33
+ } ,
34
+ } ) ;
38
35
}
39
36
40
37
export async function deleteWithPrompt ( target , y = false ) {
41
- if ( fs . existsSync ( target ) ) {
42
- if ( y || ( await prompt ( "delete" , target ) ) ) {
43
- fs . rmSync ( target , { recursive : true } ) ;
44
- }
38
+ if ( ( await getStatOrNullIfMissed ( target ) ) == null ) return ;
39
+ if ( y || ( await prompt ( "delete" , target ) ) ) {
40
+ await fs . rm ( target , { recursive : true } ) ;
45
41
}
46
42
}
0 commit comments