History

fix: Windows compatibility across postinstall, desktop, plugins, and scripts (#211)

* fix: Windows compatibility across postinstall, desktop, plugins, and scripts * fix: clean script gracefully skips locked files on Windows * test(file-secrets): add vitest coverage for xdgDataHome Exports `xdgDataHome` and adds 9 parametrized vitest cases covering: - XDG_DATA_HOME override (all platforms, with whitespace trimming) - posix $HOME/.local/share fallback + default when HOME is unset - win32 LOCALAPPDATA → APPDATA → USERPROFILE\AppData\Local chain Replaces the ad-hoc scripts/_test-windows.mjs verification script, which was never wired into CI and re-implemented the logic inline instead of testing the real code. * fix(desktop): guard registry PATH update against parse failures If `reg query HKCU\Environment /v Path` exits non-zero for any reason other than 'value not present' (exit 1), or if the output doesn't match the expected `Path REG(_EXPAND)?_SZ <value>` shape, bail out instead of writing. Previously a parse failure would silently treat current PATH as empty and overwrite it with only the executor bin dir. ---------

Tito committed 7 months ago

Commit 800fcc01 parent a3fa7c19 files · +223 −16Browse files

Showing the changes to scripts (1 of 9 files). Show all

Unified · Split

scripts/clean.ts+60−0
@@ -0,0 +1,60 @@
1#!/usr/bin/env bun
2import fs from "node:fs";
3import path from "node:path";
4import { fileURLToPath } from "node:url";
5
6const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
7
8const rootTargets = ["node_modules", ".turbo", ".astro", "dist"];
9for (const name of rootTargets) {
10 const p = path.join(root, name);
11 if (fs.existsSync(p)) {
12 try {
13 fs.rmSync(p, { recursive: true, force: true });
14 console.log("removed", p);
15 } catch (e: any) {
16 console.warn("skipped (in use?):", p, "-", e.message);
17 }
18 }
19}
20
21const nestedTargets = new Set(["node_modules", "dist", ".turbo", ".output", ".astro"]);
22const nestedGlobs = /\.tsbuildinfo$/;
23const searchRoots = ["apps", "packages"];
24const maxDepth = 5;
25
26function clean(dir: string, depth: number) {
27 if (depth > maxDepth) return;
28 let entries: fs.Dirent[];
29 try {
30 entries = fs.readdirSync(dir, { withFileTypes: true });
31 } catch {
32 return;
33 }
34 for (const entry of entries) {
35 const full = path.join(dir, entry.name);
36 if (entry.isDirectory()) {
37 if (nestedTargets.has(entry.name)) {
38 try {
39 fs.rmSync(full, { recursive: true, force: true });
40 console.log("removed", full);
41 } catch (e: any) {
42 console.warn("skipped (in use?):", full, "-", e.message);
43 }
44 } else {
45 clean(full, depth + 1);
46 }
47 } else if (entry.isFile() && nestedGlobs.test(entry.name)) {
48 try {
49 fs.rmSync(full, { force: true });
50 console.log("removed", full);
51 } catch (e: any) {
52 console.warn("skipped (in use?):", full, "-", e.message);
53 }
54 }
55 }
56}
57
58for (const dir of searchRoots) {
59 clean(path.join(root, dir), 1);
60}