Skip to content

Commit 9f8ccce

Browse files
authored
refactor: use fs.cp instead of own implementation (#515)
1 parent 9a66b74 commit 9f8ccce

File tree

2 files changed

+28
-35
lines changed

2 files changed

+28
-35
lines changed

src/init/init.js

+5-8
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import fs from "fs";
22
import path from "path";
33
import { exec } from "promisify-child-process";
44
import { print } from "../utils/utils.js";
5-
import {
6-
copyFolderRecursiveSync,
7-
deleteWithPrompt,
8-
} from "../utils/fs-utils.js";
5+
import { copyFolderRecursive, deleteWithPrompt } from "../utils/fs-utils.js";
96
import { fileURLToPath } from "url";
107
import { readFile } from "fs/promises";
118

@@ -40,7 +37,7 @@ async function patchForNextRelease(folder, y) {
4037

4138
const fileSource = `${__dirname}${constants.nextArtifactsDir}`;
4239

43-
await copyFolderRecursiveSync(fileSource, folder, y);
40+
await copyFolderRecursive(fileSource, folder, y);
4441
}
4542

4643
function checkNodeVersion() {
@@ -117,11 +114,11 @@ async function installDependencies(folder, update = false) {
117114
async function setupArtifacts(folder) {
118115
print("===== creating project file and directory structure =====");
119116

120-
await copyFolderRecursiveSync(
117+
await copyFolderRecursive(
121118
`${__dirname}${constants.updateArtifactsDir}`,
122119
path.join(constants.artifactsDest, folder),
123120
);
124-
await copyFolderRecursiveSync(
121+
await copyFolderRecursive(
125122
`${__dirname}${constants.artifactsDir}`,
126123
path.join(constants.artifactsDest, folder),
127124
);
@@ -137,7 +134,7 @@ async function updateArtifacts(folder, y) {
137134
await deleteWithPrompt(artifact, y);
138135
}, Promise.resolve());
139136

140-
await copyFolderRecursiveSync(fileSource, folder, y);
137+
await copyFolderRecursive(fileSource, folder, y);
141138
}
142139

143140
export default { run };

src/utils/fs-utils.js

+23-27
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import fs from "fs";
2-
import path from "path";
1+
import fs from "fs/promises";
32
import prompts from "prompts";
43

54
async function prompt(action, target) {
@@ -13,34 +12,31 @@ async function prompt(action, target) {
1312
return input === "YES" || input === "yes" || input === "Y" || input === "y";
1413
}
1514

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+
}
3023

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+
});
3835
}
3936

4037
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 });
4541
}
4642
}

0 commit comments

Comments
 (0)