

























@@ -481,12 +481,15 @@ export function resolveExtensionApiAlias(params: LoaderModuleResolveParams = {})
481481}
482482483483const MAX_PLUGIN_LOADER_ALIAS_CACHE_ENTRIES = 512;
484+const JITI_NORMALIZED_ALIAS_SYMBOL = Symbol.for("pathe:normalizedAlias");
485+const JITI_ALIAS_ROOT_SENTINELS = new Set<string | undefined>(["/", "\\", undefined]);
484486485487// Memoize loader alias/config by effective resolution context so repeated
486488// loader setup avoids rebuilding the same filesystem-derived map and cache key.
487489// Include cwd/env inputs because the fallback root and private QA alias
488490// surfaces depend on them.
489491const aliasMapCache = new Map<string, Record<string, string>>();
492+const normalizedJitiAliasMapCache = new Map<string, Record<string, string>>();
490493const pluginLoaderJitiConfigCache = new Map<
491494string,
492495{
@@ -510,6 +513,54 @@ function setBoundedCacheValue<T>(cache: Map<string, T>, key: string, value: T) {
510513}
511514}
512515516+function hasJitiNormalizedAliasMarker(aliasMap: Record<string, string>) {
517+return Boolean((aliasMap as Record<symbol, unknown>)[JITI_NORMALIZED_ALIAS_SYMBOL]);
518+}
519+520+function createJitiAliasContentCacheKey(aliasMap: Record<string, string>) {
521+return JSON.stringify(
522+Object.entries(aliasMap).toSorted(([left], [right]) => left.localeCompare(right)),
523+);
524+}
525+526+function normalizePluginLoaderAliasMapForJiti(
527+aliasMap: Record<string, string>,
528+): Record<string, string> {
529+if (hasJitiNormalizedAliasMarker(aliasMap)) {
530+return aliasMap;
531+}
532+const cacheKey = createJitiAliasContentCacheKey(aliasMap);
533+const cached = normalizedJitiAliasMapCache.get(cacheKey);
534+if (cached) {
535+return cached;
536+}
537+const normalizedAliasMap = Object.fromEntries(
538+Object.entries(aliasMap).toSorted(
539+([left], [right]) => right.split("/").length - left.split("/").length,
540+),
541+);
542+for (const aliasKey in normalizedAliasMap) {
543+for (const candidateKey in normalizedAliasMap) {
544+if (
545+candidateKey === aliasKey ||
546+aliasKey.startsWith(candidateKey) ||
547+!normalizedAliasMap[aliasKey]?.startsWith(candidateKey) ||
548+!JITI_ALIAS_ROOT_SENTINELS.has(normalizedAliasMap[aliasKey]?.[candidateKey.length])
549+) {
550+continue;
551+}
552+normalizedAliasMap[aliasKey] =
553+normalizedAliasMap[candidateKey] + normalizedAliasMap[aliasKey].slice(candidateKey.length);
554+}
555+}
556+Object.defineProperty(normalizedAliasMap, JITI_NORMALIZED_ALIAS_SYMBOL, {
557+value: true,
558+enumerable: false,
559+});
560+setBoundedCacheValue(normalizedJitiAliasMapCache, cacheKey, normalizedAliasMap);
561+return normalizedAliasMap;
562+}
563+513564function buildPluginLoaderAliasMapCacheKey(params: {
514565modulePath: string;
515566argv1?: string;
@@ -626,15 +677,17 @@ export function resolvePluginRuntimeModulePath(
626677}
627678628679export function buildPluginLoaderJitiOptions(aliasMap: Record<string, string>) {
680+const hasAliases = Object.keys(aliasMap).length > 0;
681+const jitiAliasMap = hasAliases ? normalizePluginLoaderAliasMapForJiti(aliasMap) : aliasMap;
629682return {
630683interopDefault: true,
631684// Prefer Node's native sync ESM loader for built dist/*.js modules so
632685// bundled plugins and plugin-sdk subpaths stay on the canonical module graph.
633686tryNative: true,
634687extensions: [".ts", ".tsx", ".mts", ".cts", ".mtsx", ".ctsx", ".js", ".mjs", ".cjs", ".json"],
635- ...(Object.keys(aliasMap).length > 0
688+ ...(hasAliases
636689 ? {
637-alias: aliasMap,
690+alias: jitiAliasMap,
638691}
639692 : {}),
640693};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。