






















@@ -1,10 +1,7 @@
11import fs from "node:fs/promises";
22import path from "node:path";
33import { normalizeEnvVarKey } from "../infra/host-env-security.js";
4-import {
5-normalizeLowercaseStringOrEmpty,
6-normalizeOptionalString,
7-} from "../shared/string-coerce.js";
4+import { normalizeOptionalString } from "../shared/string-coerce.js";
85import { resolveLaunchAgentPlistPath } from "./launchd.js";
96import { isBunRuntime, isNodeRuntime } from "./runtime-binary.js";
107import {
@@ -19,6 +16,7 @@ import {
1916hasInlineEnvironmentSource,
2017isEnvironmentFileOnlySource,
2118} from "./service-managed-env.js";
19+import { isNonMinimalServicePathEntry, normalizeServicePathEntry } from "./service-path-policy.js";
2220import type { GatewayServiceEnvironmentValueSource } from "./service-types.js";
2321import { resolveSystemdUserUnitPath } from "./systemd.js";
2422@@ -385,15 +383,6 @@ function getPathModule(platform: NodeJS.Platform) {
385383return platform === "win32" ? path.win32 : path.posix;
386384}
387385388-function normalizePathEntry(entry: string, platform: NodeJS.Platform): string {
389-const pathModule = getPathModule(platform);
390-const normalized = pathModule.normalize(entry).replaceAll("\\", "/");
391-if (platform === "win32") {
392-return normalizeLowercaseStringOrEmpty(normalized);
393-}
394-return normalized;
395-}
396-397386function getEquivalentMinimalPathEntries(
398387entry: string,
399388platform: NodeJS.Platform,
@@ -410,7 +399,7 @@ function getEquivalentMinimalPathEntries(
410399if (!equivalent) {
411400return [];
412401}
413-const normalizedEquivalent = normalizePathEntry(equivalent, platform);
402+const normalizedEquivalent = normalizeServicePathEntry(equivalent, platform);
414403return normalizedExpected.has(normalizedEquivalent) ? [equivalent] : [];
415404}
416405@@ -442,15 +431,17 @@ function auditGatewayServicePath(
442431.split(getPathModule(platform).delimiter)
443432.map((entry) => entry.trim())
444433.filter(Boolean);
445-const normalizedParts = new Set(parts.map((entry) => normalizePathEntry(entry, platform)));
446-const normalizedExpected = new Set(expected.map((entry) => normalizePathEntry(entry, platform)));
434+const normalizedParts = new Set(parts.map((entry) => normalizeServicePathEntry(entry, platform)));
435+const normalizedExpected = new Set(
436+expected.map((entry) => normalizeServicePathEntry(entry, platform)),
437+);
447438const missing = expected.filter((entry) => {
448-const normalized = normalizePathEntry(entry, platform);
439+const normalized = normalizeServicePathEntry(entry, platform);
449440if (normalizedParts.has(normalized)) {
450441return false;
451442}
452443return !getEquivalentMinimalPathEntries(entry, platform, normalizedExpected).some(
453-(equivalent) => normalizedParts.has(normalizePathEntry(equivalent, platform)),
444+(equivalent) => normalizedParts.has(normalizeServicePathEntry(equivalent, platform)),
454445);
455446});
456447if (missing.length > 0) {
@@ -462,23 +453,11 @@ function auditGatewayServicePath(
462453}
463454464455const nonMinimal = parts.filter((entry) => {
465-const normalized = normalizePathEntry(entry, platform);
456+const normalized = normalizeServicePathEntry(entry, platform);
466457if (normalizedExpected.has(normalized)) {
467458return false;
468459}
469-return (
470-normalized.includes("/.nvm/") ||
471-normalized.includes("/.fnm/") ||
472-normalized.includes("/.volta/") ||
473-normalized.includes("/.asdf/") ||
474-normalized.includes("/.n/") ||
475-normalized.includes("/.nodenv/") ||
476-normalized.includes("/.nodebrew/") ||
477-normalized.includes("/nvs/") ||
478-normalized.includes("/.local/share/pnpm/") ||
479-normalized.includes("/pnpm/") ||
480-normalized.endsWith("/pnpm")
481-);
460+return isNonMinimalServicePathEntry(normalized, platform);
482461});
483462if (nonMinimal.length > 0) {
484463issues.push({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。