























@@ -13,10 +13,14 @@ import {
1313} from "./service-env.js";
14141515describe("getMinimalServicePathParts - Linux user directories", () => {
16+const allExist = (): boolean => true;
17+const noneExist = (): boolean => false;
18+1619it("includes user bin directories when HOME is set on Linux", () => {
1720const result = getMinimalServicePathParts({
1821platform: "linux",
1922home: "/home/testuser",
23+existsSync: allExist,
2024});
21252226// Should include all common user bin directories
@@ -53,6 +57,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
5357const result = getMinimalServicePathParts({
5458platform: "linux",
5559home: "/home/testuser",
60+existsSync: allExist,
5661});
57625863const userDirIndex = result.indexOf("/home/testuser/.local/bin");
@@ -68,6 +73,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
6873platform: "linux",
6974home: "/home/testuser",
7075extraDirs: ["/custom/bin"],
76+existsSync: allExist,
7177});
72787379const extraDirIndex = result.indexOf("/custom/bin");
@@ -91,6 +97,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
9197NVM_DIR: "/opt/nvm",
9298FNM_DIR: "/opt/fnm",
9399},
100+existsSync: allExist,
94101});
9510296103expect(result).toContain("/opt/pnpm");
@@ -107,6 +114,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
107114const result = getMinimalServicePathParts({
108115platform: "darwin",
109116home: "/Users/testuser",
117+existsSync: allExist,
110118});
111119112120// Should include common user bin directories
@@ -138,6 +146,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
138146NVM_DIR: "/Users/testuser/.nvm",
139147PNPM_HOME: "/Users/testuser/Library/pnpm",
140148},
149+existsSync: allExist,
141150});
142151143152// fnm uses aliases/default/bin (not current)
@@ -152,6 +161,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
152161const result = getMinimalServicePathParts({
153162platform: "darwin",
154163home: "/Users/testuser",
164+existsSync: allExist,
155165});
156166157167// fnm on macOS defaults to ~/Library/Application Support/fnm
@@ -169,18 +179,105 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
169179const result = getMinimalServicePathParts({
170180platform: "win32",
171181home: "C:\\Users\\testuser",
182+existsSync: allExist,
172183});
173184174185// Windows returns empty array (uses existing PATH)
175186expect(result).toEqual([]);
176187});
188+189+it("omits hard-coded version-manager fallbacks on Linux when missing", () => {
190+const result = getMinimalServicePathParts({
191+platform: "linux",
192+home: "/home/testuser",
193+existsSync: noneExist,
194+});
195+196+expect(result).toContain("/home/testuser/.local/bin");
197+expect(result).toContain("/home/testuser/.npm-global/bin");
198+expect(result).toContain("/home/testuser/bin");
199+expect(result).toContain("/home/testuser/.nix-profile/bin");
200+expect(result).not.toContain("/home/testuser/.volta/bin");
201+expect(result).not.toContain("/home/testuser/.asdf/shims");
202+expect(result).not.toContain("/home/testuser/.bun/bin");
203+expect(result).not.toContain("/home/testuser/.nvm/current/bin");
204+expect(result).not.toContain("/home/testuser/.local/share/fnm/aliases/default/bin");
205+expect(result).not.toContain("/home/testuser/.local/share/fnm/current/bin");
206+expect(result).not.toContain("/home/testuser/.fnm/aliases/default/bin");
207+expect(result).not.toContain("/home/testuser/.fnm/current/bin");
208+expect(result).not.toContain("/home/testuser/.local/share/pnpm");
209+});
210+211+it("omits hard-coded version-manager fallbacks on macOS when missing", () => {
212+const result = getMinimalServicePathParts({
213+platform: "darwin",
214+home: "/Users/testuser",
215+existsSync: noneExist,
216+});
217+218+expect(result).toContain("/Users/testuser/.local/bin");
219+expect(result).toContain("/Users/testuser/.npm-global/bin");
220+expect(result).toContain("/Users/testuser/bin");
221+expect(result).toContain("/Users/testuser/.nix-profile/bin");
222+expect(result).not.toContain("/Users/testuser/.volta/bin");
223+expect(result).not.toContain("/Users/testuser/.asdf/shims");
224+expect(result).not.toContain("/Users/testuser/.bun/bin");
225+expect(result).not.toContain(
226+"/Users/testuser/Library/Application Support/fnm/aliases/default/bin",
227+);
228+expect(result).not.toContain("/Users/testuser/.fnm/aliases/default/bin");
229+expect(result).not.toContain("/Users/testuser/Library/pnpm");
230+expect(result).not.toContain("/Users/testuser/.local/share/pnpm");
231+});
232+233+it("keeps env-configured roots when fallback directories are missing", () => {
234+const result = getMinimalServicePathPartsFromEnv({
235+platform: "linux",
236+env: {
237+HOME: "/home/testuser",
238+PNPM_HOME: "/opt/pnpm",
239+VOLTA_HOME: "/opt/volta",
240+BUN_INSTALL: "/opt/bun",
241+ASDF_DATA_DIR: "/opt/asdf",
242+NVM_DIR: "/opt/nvm",
243+FNM_DIR: "/opt/fnm",
244+},
245+existsSync: noneExist,
246+});
247+248+expect(result).toContain("/opt/pnpm");
249+expect(result).toContain("/opt/volta/bin");
250+expect(result).toContain("/opt/bun/bin");
251+expect(result).toContain("/opt/asdf/shims");
252+expect(result).toContain("/opt/nvm/current/bin");
253+expect(result).toContain("/opt/fnm/aliases/default/bin");
254+expect(result).toContain("/opt/fnm/current/bin");
255+});
256+257+it("emits only existing hard-coded version-manager fallbacks", () => {
258+const exists = (candidate: string) =>
259+candidate === "/home/testuser/.volta/bin" ||
260+candidate === "/home/testuser/.local/share/fnm/aliases/default/bin";
261+const result = getMinimalServicePathParts({
262+platform: "linux",
263+home: "/home/testuser",
264+existsSync: exists,
265+});
266+267+expect(result).toContain("/home/testuser/.volta/bin");
268+expect(result).toContain("/home/testuser/.local/share/fnm/aliases/default/bin");
269+expect(result).not.toContain("/home/testuser/.bun/bin");
270+expect(result).not.toContain("/home/testuser/.asdf/shims");
271+expect(result).not.toContain("/home/testuser/.fnm/aliases/default/bin");
272+});
177273});
178274179275describe("getMinimalServicePathParts - Nix Home Manager", () => {
180276it("falls back to default Nix profile when NIX_PROFILES is absent on Linux", () => {
181277const result = getMinimalServicePathParts({
182278platform: "linux",
183279home: "/home/testuser",
280+existsSync: () => true,
184281});
185282186283expect(result).toContain("/home/testuser/.nix-profile/bin");
@@ -190,6 +287,7 @@ describe("getMinimalServicePathParts - Nix Home Manager", () => {
190287const result = getMinimalServicePathParts({
191288platform: "darwin",
192289home: "/Users/testuser",
290+existsSync: () => true,
193291});
194292195293expect(result).toContain("/Users/testuser/.nix-profile/bin");
@@ -202,6 +300,7 @@ describe("getMinimalServicePathParts - Nix Home Manager", () => {
202300HOME: "/home/testuser",
203301NIX_PROFILES: "/nix/var/nix/profiles/default /home/testuser/.nix-profile",
204302},
303+existsSync: () => true,
205304});
206305207306const userIdx = result.indexOf("/home/testuser/.nix-profile/bin");
@@ -218,6 +317,7 @@ describe("getMinimalServicePathParts - Nix Home Manager", () => {
218317HOME: "/Users/testuser",
219318NIX_PROFILES: "/nix/var/nix/profiles/default /Users/testuser/.nix-profile",
220319},
320+existsSync: () => true,
221321});
222322223323const userIdx = result.indexOf("/Users/testuser/.nix-profile/bin");
@@ -234,6 +334,7 @@ describe("getMinimalServicePathParts - Nix Home Manager", () => {
234334HOME: "/home/testuser",
235335NIX_PROFILES: "/nix/var/nix/profiles/per-user/testuser/profile",
236336},
337+existsSync: () => true,
237338});
238339239340expect(result).toContain("/nix/var/nix/profiles/per-user/testuser/profile/bin");
@@ -246,6 +347,7 @@ describe("getMinimalServicePathParts - Nix Home Manager", () => {
246347HOME: "/Users/testuser",
247348NIX_PROFILES: "/nix/var/nix/profiles/per-user/testuser/profile",
248349},
350+existsSync: () => true,
249351});
250352251353expect(result).toContain("/nix/var/nix/profiles/per-user/testuser/profile/bin");
@@ -259,6 +361,7 @@ describe("getMinimalServicePathParts - Nix Home Manager", () => {
259361NIX_PROFILES:
260362"/nix/var/nix/profiles/default /nix/var/nix/profiles/per-user/testuser/custom /home/testuser/.nix-profile",
261363},
364+existsSync: () => true,
262365});
263366264367const userIdx = result.indexOf("/home/testuser/.nix-profile/bin");
@@ -299,6 +402,7 @@ describe("buildMinimalServicePath", () => {
299402const result = buildMinimalServicePath({
300403platform: "linux",
301404env: { HOME: "/home/alice" },
405+existsSync: () => true,
302406});
303407const parts = splitPath(result, "linux");
304408@@ -332,6 +436,7 @@ describe("buildMinimalServicePath", () => {
332436const result = buildMinimalServicePath({
333437platform: "linux",
334438env: { HOME: "/home/bob" },
439+existsSync: () => true,
335440});
336441const parts = splitPath(result, "linux");
337442@@ -366,6 +471,7 @@ describe("buildMinimalServicePath", () => {
366471platform: "linux",
367472extraDirs: ["/home/alice/.nvm/versions/node/v22.22.0/bin"],
368473env: { HOME: "/home/alice" },
474+existsSync: () => true,
369475});
370476const parts = splitPath(result, "linux");
371477此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。