38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
import { resolve } from "node:path";
|
|
import { existsSync } from "node:fs";
|
|
import { rm } from "node:fs/promises";
|
|
import { spawn } from "node:child_process";
|
|
// OneDrive marks directories as Windows reparse points, which Next's Node
|
|
// cleanup may mistake for links. Use native PowerShell for this build cache.
|
|
const root = resolve("."),
|
|
target = resolve(root, ".next");
|
|
if (target !== resolve(root, ".next") || !target.startsWith(root))
|
|
throw new Error("Unsafe build cache target");
|
|
if (existsSync(target)) {
|
|
if (process.platform === "win32")
|
|
await new Promise((accept, reject) => {
|
|
const escaped = target.replaceAll("'", "''");
|
|
const child = spawn(
|
|
"powershell.exe",
|
|
[
|
|
"-NoProfile",
|
|
"-NonInteractive",
|
|
"-Command",
|
|
`Remove-Item -LiteralPath '${escaped}' -Recurse -Force -ErrorAction Stop`,
|
|
],
|
|
{ stdio: "inherit", windowsHide: true },
|
|
);
|
|
child.on("exit", (code) =>
|
|
code === 0
|
|
? accept()
|
|
: reject(
|
|
new Error(
|
|
"Could not clear the Next build cache. Stop the dev server first.",
|
|
),
|
|
),
|
|
);
|
|
child.on("error", reject);
|
|
});
|
|
else await rm(target, { recursive: true, force: true });
|
|
}
|