deps-conflict-resolver 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils/logger.ts","../src/utils/lru-cache.ts","../src/utils/fs.ts","../src/core/environment-detector.ts","../src/utils/version-spec.ts","../src/core/workspace-detector.ts","../src/utils/semver.ts","../src/core/npm-registry.ts","../src/core/dependency-analyzer.ts","../src/core/alias-manager.ts","../src/core/package-installer.ts","../src/core/resolver.ts"],"names":["require","join","fs","logger","readFileSync","parseYaml","semver"],"mappings":"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","file":"index.js","sourcesContent":["import type { PackageManagerType } from './types/index';\n\n/**\n * 默认的 NPM registry 地址\n */\nexport const DEFAULT_NPM_REGISTRY = 'https://registry.npmjs.org';\n\n/**\n * Lock 文件与包管理器的映射\n */\nexport const LOCK_FILE_MAP = {\n 'pnpm-lock.yaml': 'pnpm',\n 'yarn.lock': 'yarn',\n 'package-lock.json': 'npm',\n 'npm-shrinkwrap.json': 'npm',\n} as const satisfies Record<string, PackageManagerType>;\n\n/**\n * NPM registry 请求默认超时时间(毫秒)\n */\nexport const DEFAULT_NPM_REGISTRY_TIMEOUT_MS = 10000;\n","/**\n * 日志级别\n */\nexport enum LogLevel {\n SILENT = 0,\n DEBUG = 1 << 0, // 0001\n INFO = 1 << 1, // 0010\n WARN = 1 << 2, // 0100\n ERROR = 1 << 3, // 1000\n ALL = DEBUG | INFO | WARN | ERROR, // 1111\n}\n\n/**\n * 日志配置\n */\ninterface LoggerConfig {\n /**\n * 日志级别(可选:不传则使用全局默认级别)\n */\n level?: LogLevel;\n prefix: string;\n}\n\n/**\n * 全局日志级别(默认显示 INFO、WARN、ERROR)\n * - 用于让不同子模块创建出来的 logger 能共享同一套 level 配置\n * - 避免 \"入口开启 debug,但子模块 logger 仍然是 INFO\" 的问题\n * - 使用位运算组合,例如:LogLevel.DEBUG | LogLevel.ERROR 只显示调试和错误\n */\nconst DEFAULT_GLOBAL_LEVEL: LogLevel = LogLevel.INFO | LogLevel.WARN | LogLevel.ERROR;\nlet __GLOBAL_LEVEL__: LogLevel = DEFAULT_GLOBAL_LEVEL;\n\n/**\n * 重置全局日志级别(主要用于测试隔离)\n */\nexport function resetGlobalLogLevel(): void {\n __GLOBAL_LEVEL__ = DEFAULT_GLOBAL_LEVEL;\n}\n\n/**\n * 日志工具类\n */\nexport class Logger {\n private prefix: string;\n private levelOverride?: LogLevel;\n\n constructor(config: Partial<LoggerConfig> = {}) {\n this.prefix = config.prefix ?? '[deps-conflict-resolver]';\n this.levelOverride = config.level;\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n // 约定:库内的日志级别是“全局开关”\n // 这样只需要在入口(resolver/vite/webpack)设置一次,就能影响所有子模块 logger。\n __GLOBAL_LEVEL__ = level;\n // 当前 logger 也应该跟随全局配置,而不是固定为局部 override\n this.levelOverride = undefined;\n }\n\n private getEffectiveLevel(): LogLevel {\n return this.levelOverride ?? __GLOBAL_LEVEL__;\n }\n\n /**\n * 调试日志\n */\n debug(...args: unknown[]): void {\n if (this.getEffectiveLevel() & LogLevel.DEBUG) {\n console.debug(this.formatPrefix('DEBUG'), ...args);\n }\n }\n\n /**\n * 信息日志\n */\n info(...args: unknown[]): void {\n if (this.getEffectiveLevel() & LogLevel.INFO) {\n console.info(this.formatPrefix('INFO'), ...args);\n }\n }\n\n /**\n * 警告日志\n */\n warn(...args: unknown[]): void {\n if (this.getEffectiveLevel() & LogLevel.WARN) {\n console.warn(this.formatPrefix('WARN'), ...args);\n }\n }\n\n /**\n * 错误日志\n */\n error(...args: unknown[]): void {\n if (this.getEffectiveLevel() & LogLevel.ERROR) {\n console.error(this.formatPrefix('ERROR'), ...args);\n }\n }\n\n /**\n * 格式化前缀\n */\n private formatPrefix(level: string): string {\n return `${this.prefix} [${level}]`;\n }\n}\n\n/**\n * 创建带有子前缀的日志实例\n */\nexport function createLogger(subPrefix: string, debug = false): Logger {\n return new Logger({\n prefix: `[deps-conflict-resolver:${subPrefix}]`,\n // debug=true 时强制当前 logger 输出所有日志;否则使用全局级别(默认 INFO/WARN/ERROR)\n level: debug ? LogLevel.ALL : undefined,\n });\n}\n","/**\n * 一个轻量的 LRU 缓存封装(基于 Map 的插入顺序实现)。\n *\n * 设计目标:\n * - 足够简单:只支持最常用的 get/set/clear\n * - 可控容量:maxEntries 超限时淘汰最旧条目\n * - 泛型友好:支持缓存 null 等值\n */\n\nexport interface LruCacheOptions {\n /**\n * 最大缓存条目数\n * - <= 0:等价于禁用缓存(set 不生效,get 永远 miss)\n */\n maxEntries: number;\n}\n\nexport class LruCache<K, V> {\n private map = new Map<K, V>();\n private maxEntries: number;\n\n constructor(options: LruCacheOptions) {\n this.maxEntries = options.maxEntries;\n }\n\n /**\n * 当前缓存条目数\n */\n get size(): number {\n return this.map.size;\n }\n\n /**\n * 获取最大条目数\n */\n getMaxEntries(): number {\n return this.maxEntries;\n }\n\n /**\n * 动态调整最大条目数\n * - 调小会立即触发淘汰\n */\n setMaxEntries(maxEntries: number): void {\n this.maxEntries = maxEntries;\n if (this.maxEntries <= 0) {\n this.map.clear();\n return;\n }\n this.trim();\n }\n\n clear(): void {\n this.map.clear();\n }\n\n has(key: K): boolean {\n return this.map.has(key);\n }\n\n /**\n * 获取并刷新 LRU 顺序(命中后会变成“最近使用”)\n */\n get(key: K): V | undefined {\n if (this.maxEntries <= 0) {\n return undefined;\n }\n\n if (!this.map.has(key)) {\n return undefined;\n }\n\n const value = this.map.get(key) as V;\n // 刷新顺序\n this.map.delete(key);\n this.map.set(key, value);\n return value;\n }\n\n /**\n * 写入并刷新 LRU 顺序\n */\n set(key: K, value: V): void {\n if (this.maxEntries <= 0) {\n return;\n }\n\n // 刷新顺序:先删后加\n if (this.map.has(key)) {\n this.map.delete(key);\n }\n this.map.set(key, value);\n\n this.trim();\n }\n\n delete(key: K): boolean {\n return this.map.delete(key);\n }\n\n private trim(): void {\n if (this.maxEntries <= 0) return;\n while (this.map.size > this.maxEntries) {\n const iter = this.map.keys().next();\n if (iter.done) break;\n this.map.delete(iter.value);\n }\n }\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { createRequire } from 'module';\nimport { pathToFileURL } from 'url';\nimport type { PackageJson } from '../types/index';\nimport { LruCache } from './lru-cache';\n\n/**\n * 从 startDir 开始向上遍历父目录(包含 startDir 与根目录)\n * 用于统一实现“向上查找”的逻辑,避免各处重复 while 循环。\n */\nexport function* iterateParentDirs(startDir: string): Generator<string> {\n let currentDir = startDir;\n\n while (true) {\n yield currentDir;\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n break; // 到达根目录\n }\n\n currentDir = parentDir;\n }\n}\n\n/**\n * package.json 读取缓存,避免重复 IO 操作\n */\nconst DEFAULT_PACKAGE_JSON_CACHE_MAX_ENTRIES = 5000;\nconst packageJsonCache = new LruCache<string, PackageJson | null>({\n maxEntries: DEFAULT_PACKAGE_JSON_CACHE_MAX_ENTRIES,\n});\n\n/**\n * require() 实例缓存(按 baseDir)\n * - findPackagePath 会频繁 createRequire,缓存可显著减少开销\n */\ntype RequireFn = ReturnType<typeof createRequire>;\n\nconst DEFAULT_REQUIRE_CACHE_MAX_ENTRIES = 200;\nconst requireCache = new LruCache<string, RequireFn>({\n maxEntries: DEFAULT_REQUIRE_CACHE_MAX_ENTRIES,\n});\n\n/**\n * 包路径解析缓存(按 baseDir + packageName)\n * - 缓存 null,避免重复探测\n */\nconst DEFAULT_PACKAGE_PATH_CACHE_MAX_ENTRIES = 20000;\nconst packagePathCache = new LruCache<string, string | null>({\n maxEntries: DEFAULT_PACKAGE_PATH_CACHE_MAX_ENTRIES,\n});\n\n/**\n * 清理 package.json 缓存,释放内存\n */\nexport function clearPackageJsonCache(): void {\n packageJsonCache.clear();\n packagePathCache.clear();\n requireCache.clear();\n}\n\n/**\n * 同步读取 JSON 文件(性能更好,减少事件循环开销)\n */\nfunction readJsonFileSync<T = unknown>(filePath: string): T | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * 检查文件是否存在\n */\nexport function fileExists(filePath: string): boolean {\n return existsSync(filePath);\n}\n\n/**\n * 读取 package.json(带缓存)\n * 使用同步读取以减少事件循环开销\n */\nexport function readPackageJsonCached(dir: string): PackageJson | null {\n const pkgPath = join(dir, 'package.json');\n\n const cached = packageJsonCache.get(pkgPath);\n if (cached !== undefined) {\n return cached;\n }\n\n // 使用同步读取,性能更好\n const result = readJsonFileSync<PackageJson>(pkgPath);\n // 缓存结果(包含 null,避免重复 IO 探测)\n packageJsonCache.set(pkgPath, result);\n return result;\n}\n\n/**\n * 查找项目根目录(通过向上查找 package.json)\n */\nexport function findProjectRoot(startDir: string): string | null {\n for (const dir of iterateParentDirs(startDir)) {\n if (fileExists(join(dir, 'package.json'))) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * 查找 node_modules 中的包路径\n * 使用 require.resolve 机制来正确处理各种包管理器(npm, yarn, pnpm)的依赖结构\n */\nexport function findPackagePath(packageName: string, baseDir: string): string | null {\n const cacheKey = `${baseDir}\\0${packageName}`;\n const cached = packagePathCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n try {\n // 使用 createRequire 创建一个基于 baseDir 的 require 函数\n // 这样可以正确处理 ESM 和 CJS,以及各种包管理器的依赖结构\n let require = requireCache.get(baseDir);\n if (!require) {\n const baseUrl = pathToFileURL(join(baseDir, 'package.json')).href;\n require = createRequire(baseUrl);\n requireCache.set(baseDir, require);\n }\n\n // 解析包的 package.json 路径,然后获取其目录\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n const resolved = dirname(pkgJsonPath);\n packagePathCache.set(cacheKey, resolved);\n return resolved;\n } catch {\n // 如果 require.resolve 失败,回退到手动查找\n // 这处理了一些边缘情况,比如包没有正确导出 package.json\n const resolved = findPackagePathFallback(packageName, baseDir);\n packagePathCache.set(cacheKey, resolved);\n return resolved;\n }\n}\n\n/**\n * 回退的包路径查找方法\n * 当 require.resolve 失败时使用(例如包没有导出 package.json)\n */\nfunction findPackagePathFallback(packageName: string, baseDir: string): string | null {\n // 处理作用域包\n const packagePath = join(baseDir, 'node_modules', packageName);\n\n if (fileExists(packagePath)) {\n return packagePath;\n }\n\n // 向上查找\n for (const dir of iterateParentDirs(baseDir)) {\n const candidatePath = join(dir, 'node_modules', packageName);\n if (fileExists(candidatePath)) {\n return candidatePath;\n }\n }\n\n return null;\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { createLogger } from '../utils/logger';\nimport { fileExists, iterateParentDirs, readPackageJsonCached } from '../utils/fs';\nimport { DEFAULT_NPM_REGISTRY, LOCK_FILE_MAP } from '../constants';\nimport type { PackageManagerType, PackageManagerDetectionResult } from '../types/index';\n\nconst logger = createLogger('environment-detector');\n\n/**\n * 环境检测器\n * 负责检测项目使用的包管理器和 registry\n */\nexport class EnvironmentDetector {\n private projectRoot: string;\n private detectionResult: PackageManagerDetectionResult | null = null;\n private registryCache: string | null = null;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n /**\n * 获取检测到的包管理器类型\n */\n async getPackageManager(): Promise<PackageManagerType> {\n const result = await this.detect();\n return result.packageManager;\n }\n\n /**\n * 获取检测到的 registry\n */\n async getRegistry(): Promise<string> {\n if (this.registryCache) {\n return this.registryCache;\n }\n\n const result = await this.detect();\n this.registryCache = await this.detectRegistry(result.packageManager);\n return this.registryCache;\n }\n\n /**\n * 获取指定包管理器的 registry(兼容旧 API)\n */\n async getRegistryForPackageManager(packageManager: PackageManagerType): Promise<string> {\n return this.detectRegistry(packageManager);\n }\n\n /**\n * 获取完整的检测结果\n */\n async getDetectionResult(): Promise<PackageManagerDetectionResult> {\n return this.detect();\n }\n\n /**\n * 重置缓存,强制重新检测\n */\n reset(): void {\n this.detectionResult = null;\n this.registryCache = null;\n }\n\n /**\n * 更新项目根目录\n */\n setProjectRoot(projectRoot: string): void {\n this.projectRoot = projectRoot;\n this.reset();\n }\n\n /**\n * 检测项目使用的包管理器\n *\n * 检测优先级:\n * 1. package.json 中的 packageManager 字段(如 \"pnpm@8.0.0\")- 向上遍历查找\n * 2. lock 文件存在 - 向上遍历查找(支持 monorepo)\n * 3. 默认为 npm\n */\n private detect(): Promise<PackageManagerDetectionResult> {\n if (this.detectionResult) {\n return Promise.resolve(this.detectionResult);\n }\n\n for (const currentDir of iterateParentDirs(this.projectRoot)) {\n // 1. 检查 package.json 中的 packageManager 字段\n const pkgJsonPath = join(currentDir, 'package.json');\n if (fileExists(pkgJsonPath)) {\n const pkgJson = readPackageJsonCached(currentDir);\n // eslint(type): 在某些 eslint type-checking 场景下会把可选链结果推断为 any,做一次显式标注避免 no-unsafe 报错\n const pmField: string | undefined = pkgJson?.packageManager;\n if (pmField) {\n const pm = this.parsePackageManagerField(pmField);\n if (pm) {\n logger.debug(`Detected package manager from package.json: ${pm} (at ${currentDir})`);\n this.detectionResult = {\n packageManager: pm,\n detectedFrom: 'packageJson',\n rootDir: currentDir,\n };\n return Promise.resolve(this.detectionResult);\n }\n }\n }\n\n // 2. 检查 lock 文件\n for (const [lockFile, pm] of Object.entries(LOCK_FILE_MAP)) {\n if (fileExists(join(currentDir, lockFile))) {\n logger.debug(\n `Detected package manager from lock file: ${pm} (${lockFile} at ${currentDir})`,\n );\n this.detectionResult = {\n packageManager: pm,\n detectedFrom: 'lockfile',\n rootDir: currentDir,\n };\n return Promise.resolve(this.detectionResult);\n }\n }\n }\n\n // 3. 默认使用 npm\n logger.debug('No lock file found, defaulting to npm');\n this.detectionResult = {\n packageManager: 'npm',\n detectedFrom: 'default',\n };\n return Promise.resolve(this.detectionResult);\n }\n\n /**\n * 解析 package.json 中的 packageManager 字段\n * 格式如:pnpm@8.0.0, yarn@3.2.0, npm@9.0.0\n */\n private parsePackageManagerField(value: string): PackageManagerType | null {\n const match = value.match(/^(npm|yarn|pnpm)(@|$)/);\n if (match) {\n return match[1] as PackageManagerType;\n }\n return null;\n }\n\n /**\n * 检测项目使用的 registry\n *\n * 检测优先级:\n * 1. 项目级 .npmrc(向上遍历,覆盖 monorepo 子包场景)\n * 2. 用户级 .npmrc\n * 3. 包管理器特定配置\n * 4. 默认 registry\n */\n private async detectRegistry(packageManager: PackageManagerType): Promise<string> {\n const defaultRegistry = DEFAULT_NPM_REGISTRY;\n\n // 1. 从 projectRoot 向上遍历查找 .npmrc(覆盖 monorepo 子包场景)\n for (const dir of iterateParentDirs(this.projectRoot)) {\n const npmrcPath = join(dir, '.npmrc');\n if (fileExists(npmrcPath)) {\n const registry = await this.parseRegistryFromNpmrc(npmrcPath);\n if (registry) {\n logger.debug(`Detected registry from .npmrc: ${registry} (at ${dir})`);\n return registry;\n }\n }\n }\n\n // 2. 检查用户级配置\n const homeDir = process.env.HOME ?? process.env.USERPROFILE ?? '';\n if (homeDir) {\n // 检查 .npmrc\n const userNpmrc = join(homeDir, '.npmrc');\n if (fileExists(userNpmrc)) {\n const registry = await this.parseRegistryFromNpmrc(userNpmrc);\n if (registry) {\n logger.debug(`Detected registry from user .npmrc: ${registry}`);\n return registry;\n }\n }\n\n // 检查 pnpm 配置(如果是 pnpm)\n if (packageManager === 'pnpm') {\n const pnpmConfig = join(homeDir, '.pnpmrc');\n if (fileExists(pnpmConfig)) {\n const registry = await this.parseRegistryFromNpmrc(pnpmConfig);\n if (registry) {\n logger.debug(`Detected registry from .pnpmrc: ${registry}`);\n return registry;\n }\n }\n }\n\n // 检查 yarn 配置(如果是 yarn)\n if (packageManager === 'yarn') {\n const yarnrc = join(this.projectRoot, '.yarnrc.yml');\n if (fileExists(yarnrc)) {\n const registry = await this.parseRegistryFromYarnrc(yarnrc);\n if (registry) {\n logger.debug(`Detected registry from .yarnrc.yml: ${registry}`);\n return registry;\n }\n }\n }\n }\n\n logger.debug(`Using default registry: ${defaultRegistry}`);\n return defaultRegistry;\n }\n\n /**\n * 从 .npmrc 文件解析 registry\n */\n private async parseRegistryFromNpmrc(filePath: string): Promise<string | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n // 跳过注释和空行\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith(';')) {\n continue;\n }\n\n // 匹配 registry=xxx 或 registry = xxx\n const match = trimmed.match(/^registry\\s*=\\s*(.+)$/i);\n if (match?.[1]) {\n return match[1].trim().replace(/[\"']/g, '');\n }\n }\n } catch {\n // 忽略读取错误\n }\n\n return null;\n }\n\n /**\n * 从 .yarnrc.yml 文件解析 registry\n */\n private async parseRegistryFromYarnrc(filePath: string): Promise<string | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n // 匹配 npmRegistryServer: xxx\n const match = trimmed.match(/^npmRegistryServer:\\s*[\"']?(.+?)[\"']?\\s*$/);\n if (match?.[1]) {\n return match[1];\n }\n }\n } catch {\n // 忽略读取错误\n }\n\n return null;\n }\n}\n\n/**\n * 创建环境检测器实例\n */\nexport function createEnvironmentDetector(projectRoot: string): EnvironmentDetector {\n return new EnvironmentDetector(projectRoot);\n}\n","/**\n * 版本规格/协议相关的小工具\n */\n\n/** 匹配 npm:package@version 格式(支持 scoped package) */\nconst NPM_ALIAS_PATTERN = /^npm:(@?[^@]+)@(.+)$/;\n\n/**\n * 解析 npm 别名格式 (npm:package@version)\n * @returns [targetPackage, versionSpec] 或 null\n */\nexport function parseNpmAlias(versionSpec: string): [string, string] | null {\n const match = versionSpec.match(NPM_ALIAS_PATTERN);\n if (match?.[1] && match?.[2]) {\n return [match[1], match[2]];\n }\n return null;\n}\n","import { readFileSync } from 'fs';\nimport { join, relative } from 'path';\nimport { parse as parseYaml } from 'yaml';\nimport { createLogger } from '../utils/logger';\nimport { fileExists, iterateParentDirs, readPackageJsonCached } from '../utils/fs';\nimport { parseNpmAlias } from '../utils/version-spec';\nimport type {\n PnpmWorkspaceConfig,\n WorkspaceDetectionResult,\n CatalogResolution,\n WorkspaceAliasInfo,\n} from '../types/index';\n\nconst logger = createLogger('workspace-detector');\n\n/** 版本协议类型 */\ntype VersionProtocol = 'catalog' | 'workspace' | 'npm' | 'file' | 'link' | 'portal' | 'normal';\n\n/** 协议前缀到类型的映射 */\nconst PROTOCOL_PREFIXES: Record<string, VersionProtocol> = {\n 'catalog:': 'catalog',\n 'workspace:': 'workspace',\n 'npm:': 'npm',\n 'file:': 'file',\n 'link:': 'link',\n 'portal:': 'portal',\n};\n\n/**\n * 从依赖对象中提取指定包的别名\n */\nfunction extractAliasesFromDeps(\n deps: Record<string, string> | undefined,\n targetPackage: string,\n definedIn: string,\n existingAliases: Set<string>,\n): WorkspaceAliasInfo[] {\n if (!deps) return [];\n\n const aliases: WorkspaceAliasInfo[] = [];\n\n for (const [aliasName, versionSpec] of Object.entries(deps)) {\n if (typeof versionSpec !== 'string') continue;\n if (existingAliases.has(aliasName)) continue;\n\n const parsed = parseNpmAlias(versionSpec);\n if (parsed && parsed[0] === targetPackage) {\n aliases.push({\n aliasName,\n targetPackage,\n versionSpec: parsed[1],\n definedIn,\n isWorkspaceRoot: true,\n });\n existingAliases.add(aliasName);\n\n logger.debug(`Found alias: ${aliasName} -> ${targetPackage}@${parsed[1]} (in ${definedIn})`);\n }\n }\n\n return aliases;\n}\n\n/**\n * Workspace 检测器\n * 负责检测 monorepo 结构、解析 catalog 协议、查找 workspace 级别别名\n */\nexport class WorkspaceDetector {\n private projectRoot: string;\n private detectionResult: WorkspaceDetectionResult | null = null;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n /**\n * 获取 workspace 检测结果\n */\n detect(): Promise<WorkspaceDetectionResult> {\n if (this.detectionResult) {\n return Promise.resolve(this.detectionResult);\n }\n\n this.detectionResult = this.detectWorkspace();\n return Promise.resolve(this.detectionResult);\n }\n\n /**\n * 重置缓存\n */\n reset(): void {\n this.detectionResult = null;\n }\n\n /**\n * 解析 catalog: 协议的版本\n * @param packageName 包名\n * @param versionSpec 版本规格(如 \"catalog:\" 或 \"catalog:react17\")\n */\n async resolveCatalogVersion(\n packageName: string,\n versionSpec: string,\n ): Promise<CatalogResolution> {\n const result: CatalogResolution = {\n original: versionSpec,\n resolved: null,\n catalogName: 'default',\n success: false,\n };\n\n // 解析 catalog 名称\n if (versionSpec === 'catalog:' || versionSpec === 'catalog:default') {\n result.catalogName = 'default';\n } else if (versionSpec.startsWith('catalog:')) {\n result.catalogName = versionSpec.slice('catalog:'.length);\n } else {\n // 不是 catalog 协议\n return result;\n }\n\n // 确保 workspace 信息已检测\n const workspace = await this.detect();\n if (!workspace.isMonorepo || !workspace.workspaceRoot) {\n logger.warn(`Cannot resolve catalog: protocol - not in a monorepo`);\n return result;\n }\n\n // 从 catalog 中查找版本\n if (result.catalogName === 'default') {\n // 默认 catalog\n const version = workspace.catalog?.[packageName];\n if (version) {\n result.resolved = version;\n result.success = true;\n logger.debug(`Resolved ${packageName} from default catalog: ${version}`);\n }\n } else {\n // 命名 catalog\n const namedCatalog = workspace.catalogs?.[result.catalogName];\n if (namedCatalog) {\n const version = namedCatalog[packageName];\n if (version) {\n result.resolved = version;\n result.success = true;\n logger.debug(`Resolved ${packageName} from catalog:${result.catalogName}: ${version}`);\n }\n }\n }\n\n if (!result.success) {\n logger.warn(`Package \"${packageName}\" not found in catalog:${result.catalogName}`);\n }\n\n return result;\n }\n\n /**\n * 解析版本规格(支持各种特殊协议)\n * @param packageName 包名\n * @param versionSpec 版本规格\n * @returns 解析后的普通版本范围,或 null(如无法解析)\n */\n async resolveVersionSpec(packageName: string, versionSpec: string): Promise<string | null> {\n const protocol = this.getVersionProtocol(versionSpec);\n\n switch (protocol) {\n case 'catalog': {\n const resolution = await this.resolveCatalogVersion(packageName, versionSpec);\n return resolution.resolved;\n }\n case 'workspace':\n case 'file':\n case 'link':\n case 'portal':\n // 这些协议无法确定具体版本,返回 * 让其匹配任何版本\n return '*';\n case 'npm': {\n const parsed = parseNpmAlias(versionSpec);\n return parsed?.[1] ?? null;\n }\n default:\n // 普通版本号或范围\n return versionSpec;\n }\n }\n\n /**\n * 判断版本规格的协议类型\n */\n getVersionProtocol(versionSpec: string): VersionProtocol {\n for (const [prefix, protocol] of Object.entries(PROTOCOL_PREFIXES)) {\n if (versionSpec.startsWith(prefix)) {\n return protocol;\n }\n }\n\n return 'normal';\n }\n\n /**\n * 从 workspace 根目录和 catalog 中查找已存在的别名\n */\n async findWorkspaceAliases(targetPackage: string): Promise<WorkspaceAliasInfo[]> {\n const workspace = await this.detect();\n\n if (!workspace.isMonorepo || !workspace.workspaceRoot) {\n return [];\n }\n\n const existingAliases = new Set<string>();\n const aliases: WorkspaceAliasInfo[] = [];\n const catalogPath = join(workspace.workspaceRoot, 'pnpm-workspace.yaml');\n\n // 1. 从 catalog 中查找别名(pnpm workspace 特有)\n if (workspace.workspaceType === 'pnpm') {\n // 检查默认 catalog\n aliases.push(\n ...extractAliasesFromDeps(workspace.catalog, targetPackage, catalogPath, existingAliases),\n );\n\n // 检查命名 catalogs\n if (workspace.catalogs) {\n for (const catalog of Object.values(workspace.catalogs)) {\n aliases.push(\n ...extractAliasesFromDeps(catalog, targetPackage, catalogPath, existingAliases),\n );\n }\n }\n }\n\n // 2. 从 workspace 根目录的 package.json 查找别名\n const rootPkgPath = join(workspace.workspaceRoot, 'package.json');\n const rootPkgJson = readPackageJsonCached(workspace.workspaceRoot);\n if (rootPkgJson) {\n aliases.push(\n ...extractAliasesFromDeps(\n rootPkgJson.dependencies,\n targetPackage,\n rootPkgPath,\n existingAliases,\n ),\n ...extractAliasesFromDeps(\n rootPkgJson.devDependencies,\n targetPackage,\n rootPkgPath,\n existingAliases,\n ),\n );\n }\n\n return aliases;\n }\n\n /**\n * 获取 workspace 根目录\n */\n async getWorkspaceRoot(): Promise<string | null> {\n const result = await this.detect();\n return result.workspaceRoot;\n }\n\n /**\n * 检测 workspace\n */\n private detectWorkspace(): WorkspaceDetectionResult {\n for (const dir of iterateParentDirs(this.projectRoot)) {\n // 尝试检测各种 workspace 类型\n const result = this.tryDetectWorkspaceAt(dir);\n if (result) {\n return result;\n }\n }\n\n // 不在 monorepo 中\n return {\n isMonorepo: false,\n workspaceRoot: null,\n workspaceType: 'none',\n };\n }\n\n /**\n * 尝试在指定目录检测 workspace\n */\n private tryDetectWorkspaceAt(dir: string): WorkspaceDetectionResult | null {\n // 1. 检查 pnpm-workspace.yaml(pnpm monorepo)\n const pnpmWorkspacePath = join(dir, 'pnpm-workspace.yaml');\n if (fileExists(pnpmWorkspacePath)) {\n const config = this.parsePnpmWorkspaceYaml(pnpmWorkspacePath);\n logger.debug(`Detected pnpm workspace at: ${dir}`);\n\n return {\n isMonorepo: true,\n workspaceRoot: dir,\n currentProjectPath: relative(dir, this.projectRoot) || '.',\n workspaceType: 'pnpm',\n catalog: config.catalog,\n catalogs: config.catalogs,\n };\n }\n\n // 2. 检查 package.json 中的 workspaces 字段(yarn/npm workspaces)\n const pkgJson = readPackageJsonCached(dir);\n if (pkgJson?.workspaces) {\n const isYarn = fileExists(join(dir, 'yarn.lock'));\n const workspaceType = isYarn ? 'yarn' : 'npm';\n logger.debug(`Detected ${workspaceType} workspace at: ${dir}`);\n\n return {\n isMonorepo: true,\n workspaceRoot: dir,\n currentProjectPath: relative(dir, this.projectRoot) || '.',\n workspaceType,\n };\n }\n\n // 3. 检查 lerna.json\n if (fileExists(join(dir, 'lerna.json'))) {\n logger.debug(`Detected lerna workspace at: ${dir}`);\n\n return {\n isMonorepo: true,\n workspaceRoot: dir,\n currentProjectPath: relative(dir, this.projectRoot) || '.',\n workspaceType: 'lerna',\n };\n }\n\n return null;\n }\n\n /**\n * 解析 pnpm-workspace.yaml\n */\n private parsePnpmWorkspaceYaml(filePath: string): PnpmWorkspaceConfig {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const parsed = parseYaml(content) as PnpmWorkspaceConfig | null;\n return parsed ?? {};\n } catch (error) {\n logger.warn(`Failed to parse pnpm-workspace.yaml: ${String(error)}`);\n return {};\n }\n }\n}\n\n/**\n * 创建 Workspace 检测器实例\n */\nexport function createWorkspaceDetector(projectRoot: string): WorkspaceDetector {\n return new WorkspaceDetector(projectRoot);\n}\n","import semver from 'semver';\n\n/**\n * 检查版本是否满足版本范围\n */\nexport function satisfies(version: string, range: string): boolean {\n try {\n return semver.satisfies(version, range, { includePrerelease: false });\n } catch {\n return false;\n }\n}\n\n/**\n * 比较两个版本\n * @returns -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2;无法解析时视为相等\n */\nexport function compare(v1: string, v2: string): -1 | 0 | 1 {\n try {\n return semver.compare(v1, v2);\n } catch {\n return 0;\n }\n}\n\n/**\n * 找出满足所有版本范围的版本(交集)\n * @param versions 可用版本列表\n * @param ranges 版本范围列表\n * @returns 满足所有范围的版本列表\n */\nexport function findIntersection(versions: string[], ranges: string[]): string[] {\n if (ranges.length === 0) return versions;\n\n return versions.filter(version => {\n return ranges.every(range => satisfies(version, range));\n });\n}\n\n/**\n * 从版本列表中找出满足所有范围的最新版本\n */\nexport function findBestVersion(versions: string[], ranges: string[]): string | null {\n const satisfyingVersions = findIntersection(versions, ranges);\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // 浅拷贝后排序,避免修改传入的 versions 数组\n const sorted = [...satisfyingVersions].sort((a, b) => compare(b, a));\n return sorted[0] ?? null;\n}\n\n/**\n * 检查两个版本范围是否有交集\n */\nexport function rangesIntersect(range1: string, range2: string): boolean {\n try {\n const intersection = semver.intersects(range1, range2);\n return intersection;\n } catch {\n return false;\n }\n}\n\n/**\n * 生成 npm 别名安装字符串\n */\nexport function createAliasInstallSpec(\n alias: string,\n packageName: string,\n version: string,\n): string {\n return `${alias}@npm:${packageName}@${version}`;\n}\n\n/**\n * 生成别名名称\n * 例如 vue + 2.6.14 -> vue2\n */\nexport function generateAliasName(packageName: string, version: string): string {\n let major: number;\n try {\n major = semver.major(version);\n } catch {\n // 非标准版本号:取第一段数字,兜底为 0\n const m = version.match(/^(\\d+)/);\n major = m ? Number(m[1]) : 0;\n }\n const cleanName = packageName.replace(/^@/, '').replace(/\\//g, '-');\n return `${cleanName}${major}`;\n}\n","import type { NpmPackageInfo } from '../types/index';\nimport { createLogger } from '../utils/logger';\nimport { DEFAULT_NPM_REGISTRY, DEFAULT_NPM_REGISTRY_TIMEOUT_MS } from '../constants';\n\nconst logger = createLogger('npm-registry');\n\n/**\n * NPM 注册表缓存\n */\nconst packageCache = new Map<string, NpmPackageInfo>();\n\nexport function clearNpmRegistryCache(): void {\n packageCache.clear();\n}\n\n/**\n * 默认的 NPM 注册表地址\n */\n\n/**\n * 带超时的 fetch\n */\nasync function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeout = DEFAULT_NPM_REGISTRY_TIMEOUT_MS,\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * 从 NPM 注册表获取包信息\n */\nasync function fetchPackageInfo(\n packageName: string,\n registry = DEFAULT_NPM_REGISTRY,\n): Promise<NpmPackageInfo | null> {\n // 检查缓存\n const cacheKey = `${registry}:${packageName}`;\n const cached = packageCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n try {\n // 处理作用域包的 URL 编码\n const encodedName = packageName.startsWith('@')\n ? `@${encodeURIComponent(packageName.slice(1))}`\n : packageName;\n\n const url = `${registry}/${encodedName}`;\n logger.debug(`Fetching package info from: ${url}`);\n\n const response = await fetchWithTimeout(url, {\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n logger.warn(`Package not found: ${packageName}`);\n return null;\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n name: string;\n versions: Record<\n string,\n {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n }\n >;\n 'dist-tags': Record<string, string>;\n };\n\n const packageInfo: NpmPackageInfo = {\n name: data.name,\n versions: Object.keys(data.versions),\n versionDetails: data.versions,\n distTags: data['dist-tags'],\n };\n\n // 缓存时只保留版本列表和 distTags,丢弃庞大的 versionDetails 以节省内存\n const cacheEntry: NpmPackageInfo = {\n name: packageInfo.name,\n versions: packageInfo.versions,\n versionDetails: {},\n distTags: packageInfo.distTags,\n };\n packageCache.set(cacheKey, cacheEntry);\n\n return packageInfo;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n logger.error(\n `Timeout fetching package info for ${packageName} (>${DEFAULT_NPM_REGISTRY_TIMEOUT_MS}ms)`,\n );\n } else {\n logger.error(`Failed to fetch package info for ${packageName}:`, error);\n }\n return null;\n }\n}\n\n/**\n * 获取包的所有可用版本\n */\nexport async function fetchAllVersions(\n packageName: string,\n registry = DEFAULT_NPM_REGISTRY,\n): Promise<string[]> {\n const info = await fetchPackageInfo(packageName, registry);\n return info?.versions ?? [];\n}\n","import type {\n DependencyInfo,\n PackageJson,\n PeerConflict,\n DependencyPath,\n ResolvedOptions,\n AnalysisResult,\n AliasMapping,\n WorkspaceAliasInfo,\n} from '../types/index';\nimport { createLogger } from '../utils/logger';\nimport { readPackageJsonCached, findPackagePath, clearPackageJsonCache } from '../utils/fs';\nimport type { InstalledPackageInfo } from '../types';\nimport { createWorkspaceDetector, WorkspaceDetector } from './workspace-detector';\nimport {\n satisfies,\n findBestVersion,\n generateAliasName,\n createAliasInstallSpec,\n rangesIntersect,\n} from '../utils/semver';\nimport { parseNpmAlias } from '../utils/version-spec';\nimport { fetchAllVersions, clearNpmRegistryCache } from './npm-registry';\n\nconst logger = createLogger('dependency-analyzer');\n\n/**\n * 依赖分析器\n * 负责分析依赖树、找出 peer 依赖冲突\n */\n/**\n * 已存在的别名信息(从 package.json 的 npm: 协议解析得到)\n */\ninterface ExistingAliasInfo {\n /** 别名名称(package.json 中的 key) */\n aliasName: string;\n /** 目标包的真实名称(npm: 后面的包名) */\n targetPackage: string;\n /** 版本规格(npm: 后面的版本范围) */\n versionSpec: string;\n /** 已安装的版本(从 node_modules 读取) */\n installedVersion: string | null;\n}\n\nexport class DependencyAnalyzer {\n private options: ResolvedOptions;\n /** 主项目声明的依赖(解析后的版本,catalog: 等协议已转换) */\n private declaredDeps: Record<string, string>;\n /** 主项目声明的原始依赖(未解析,保留 catalog: 等协议) */\n private rawDeclaredDeps: Record<string, string>;\n /** 分析结果:存储有 peer 依赖的包信息 */\n private analyzedDependencies: Map<string, DependencyInfo> = new Map();\n /** 已访问的包名(使用包名,同一个包只分析一次) */\n private visitedPackages: Set<string> = new Set();\n /** 已安装包的信息缓存(按需填充,避免扫描整个 node_modules) */\n private installedPackageCache: Map<string, InstalledPackageInfo> = new Map();\n /**\n * 已存在的别名映射:真实包名 -> 别名信息列表\n * 从 package.json 的 npm:package@version 格式解析得到\n * 这是最准确的别名识别方式\n */\n private existingAliasesMap: Map<string, ExistingAliasInfo[]> = new Map();\n /** Workspace 检测器(用于 catalog 协议解析和 workspace 别名查找) */\n private workspaceDetector: WorkspaceDetector;\n /** Workspace 级别的别名缓存 */\n private workspaceAliasesCache: Map<string, WorkspaceAliasInfo[]> = new Map();\n /** workspace 根目录 package.json 声明的依赖(dependencies/devDependencies),用于“声明判断”合并 */\n private workspaceRootDeclaredDeps: Record<string, string> = {};\n /** 是否已加载 workspaceRootDeclaredDeps */\n private workspaceRootDeclaredLoaded = false;\n\n constructor(\n options: ResolvedOptions,\n mainPackageJson: PackageJson,\n /** 可选:预填充的已安装包信息(主要用于测试) */\n installedDeps?: Map<string, InstalledPackageInfo>,\n ) {\n this.options = options;\n this.rawDeclaredDeps = {\n ...mainPackageJson.dependencies,\n ...mainPackageJson.devDependencies,\n };\n // 初始时 declaredDeps 与 rawDeclaredDeps 相同,后续会在 analyze 中解析 catalog 协议\n this.declaredDeps = { ...this.rawDeclaredDeps };\n\n // 初始化 workspace 检测器\n this.workspaceDetector = createWorkspaceDetector(options.projectRoot);\n\n // 解析 package.json 中的 npm: 协议别名\n this.parseExistingAliases();\n\n // 如果提供了 installedDeps,预填充到缓存中\n if (installedDeps) {\n for (const [name, info] of installedDeps) {\n this.installedPackageCache.set(name, info);\n }\n }\n }\n\n /**\n * 统一封装:在指定 baseDir 下解析包安装路径并读取 package.json\n * - 用于收敛 findPackagePath + readPackageJsonCached 的重复逻辑\n * - 返回 { packagePath: null } 表示无法 resolve 到该包\n * - 返回 { packagePath, pkgJson: null } 表示找到了目录但 package.json 无法读取/解析\n */\n private resolvePackageJson(\n packageName: string,\n baseDir: string,\n ): { packagePath: string | null; pkgJson: PackageJson | null } {\n const packagePath = findPackagePath(packageName, baseDir);\n if (!packagePath) {\n return { packagePath: null, pkgJson: null };\n }\n\n const pkgJson = readPackageJsonCached(packagePath);\n return { packagePath, pkgJson };\n }\n\n /**\n * 加载 workspace 根目录 package.json 声明的依赖(dependencies/devDependencies)\n *\n * 目的:在 monorepo/workspace 场景下,“主工程声明”需要合并当前包与 workspace 根的声明,\n * 与 WorkspaceDetector 的 workspaceRoot 判断逻辑保持一致。\n */\n private async ensureWorkspaceRootDeclaredDepsLoaded(): Promise<void> {\n if (this.workspaceRootDeclaredLoaded) {\n return;\n }\n this.workspaceRootDeclaredLoaded = true;\n\n const workspaceRoot = await this.workspaceDetector.getWorkspaceRoot();\n if (!workspaceRoot || workspaceRoot === this.options.projectRoot) {\n return;\n }\n\n const rootPkgJson = readPackageJsonCached(workspaceRoot);\n if (!rootPkgJson) {\n return;\n }\n\n this.workspaceRootDeclaredDeps = {\n ...rootPkgJson.dependencies,\n ...rootPkgJson.devDependencies,\n };\n }\n\n /**\n * 判断某个包是否在“主工程”声明(dependencies/devDependencies)\n *\n * 默认行为(与 workspace 判断逻辑一致):\n * - 非 workspace:只看当前 projectRoot 的 package.json\n * - workspace/monorepo:合并 projectRoot + workspaceRoot 两处 package.json 的声明\n */\n private isDeclaredInMainProject(packageName: string): boolean {\n return (\n Object.prototype.hasOwnProperty.call(this.declaredDeps, packageName) ||\n Object.prototype.hasOwnProperty.call(this.workspaceRootDeclaredDeps, packageName)\n );\n }\n\n /**\n * 解析 package.json 中的 npm: 协议别名\n * 格式:aliasName: \"npm:realPackage@version\"\n * 这是识别别名最准确的方式\n */\n private parseExistingAliases(): void {\n for (const [aliasName, versionSpec] of Object.entries(this.declaredDeps)) {\n if (typeof versionSpec !== 'string') continue;\n\n // 解析 npm:package@version 格式(支持 scoped packages: npm:@scope/package@version)\n const parsed = parseNpmAlias(versionSpec);\n if (parsed) {\n const [targetPackage, version] = parsed;\n\n const aliasInfo: ExistingAliasInfo = {\n aliasName,\n targetPackage,\n versionSpec: version,\n installedVersion: null, // 稍后在需要时填充\n };\n\n const existing = this.existingAliasesMap.get(targetPackage) ?? [];\n existing.push(aliasInfo);\n this.existingAliasesMap.set(targetPackage, existing);\n\n logger.debug(`Found npm alias: ${aliasName} -> ${targetPackage}@${version}`);\n }\n }\n\n if (this.existingAliasesMap.size > 0) {\n logger.debug(`Found ${this.existingAliasesMap.size} npm: protocol aliases`);\n }\n }\n\n /**\n * 获取别名的已安装版本(懒加载)\n */\n private getAliasInstalledVersion(aliasName: string): string | null {\n // 先检查缓存\n const cached = this.installedPackageCache.get(aliasName);\n if (cached) {\n return cached.version;\n }\n\n // 查找并读取 package.json\n const { packagePath, pkgJson } = this.resolvePackageJson(aliasName, this.options.projectRoot);\n if (packagePath && pkgJson?.version) {\n // 缓存信息\n this.installedPackageCache.set(aliasName, {\n name: aliasName,\n version: pkgJson.version,\n path: packagePath,\n isAlias: true,\n realName: pkgJson.name,\n });\n return pkgJson.version;\n }\n\n return null;\n }\n\n /**\n * 解析所有 catalog: 协议的依赖版本\n * 将 catalog:xxx 转换为实际的版本范围\n */\n private async resolveCatalogDependencies(): Promise<void> {\n for (const [pkgName, versionSpec] of Object.entries(this.rawDeclaredDeps)) {\n if (typeof versionSpec !== 'string') continue;\n\n // 检查是否是 catalog 协议\n if (versionSpec.startsWith('catalog:')) {\n const resolved = await this.workspaceDetector.resolveVersionSpec(pkgName, versionSpec);\n if (resolved) {\n this.declaredDeps[pkgName] = resolved;\n logger.debug(`Resolved catalog dependency: ${pkgName} \"${versionSpec}\" -> \"${resolved}\"`);\n } else {\n logger.warn(`Failed to resolve catalog dependency: ${pkgName}@${versionSpec}`);\n }\n }\n // 检查是否是 workspace 协议\n else if (versionSpec.startsWith('workspace:')) {\n const resolved = await this.workspaceDetector.resolveVersionSpec(pkgName, versionSpec);\n if (resolved) {\n this.declaredDeps[pkgName] = resolved;\n logger.debug(\n `Resolved workspace dependency: ${pkgName} \"${versionSpec}\" -> \"${resolved}\"`,\n );\n }\n }\n }\n }\n\n /**\n * 分析依赖并找出冲突\n */\n async analyze(): Promise<AnalysisResult> {\n logger.info('Starting dependency analysis...');\n\n try {\n // 0. 解析 catalog: 协议的依赖版本\n await this.resolveCatalogDependencies();\n\n // 0.1 预加载 workspaceRoot 的声明依赖(用于后续“已声明”判断合并)\n await this.ensureWorkspaceRootDeclaredDepsLoaded();\n\n // 1. 从用户指定的依赖开始,递归分析所有子依赖(deps + peerDeps)\n // 构建完整依赖树用于后续重定向判断\n for (const depName of this.options.dependencies) {\n this.analyzeDependencyRecursive(depName, []);\n }\n\n // 2. 只收集第一层依赖的 peer 依赖(用于冲突检测)\n // 不分析子依赖的 peerDeps,只有第一层的冲突才需要别名安装\n const peerDepsMap = this.collectFirstLevelPeerDependencies();\n\n // 3. 分析冲突(只检测与主工程已声明依赖的版本冲突)\n const peerConflicts = await this.analyzePeerConflicts(peerDepsMap);\n\n // 4. 生成别名映射(只为需要安装别名的冲突生成)\n // 会收集完整依赖树用于重定向判断\n const aliasMappings = await this.generateAliasMappings(peerConflicts);\n\n // 5. 找出缺失的 peer 依赖(仅记录,不自动安装)\n const missingFirstLevelPeers = this.findMissingFirstLevelPeers(peerDepsMap);\n\n const conflictsNeedingAlias = peerConflicts.filter(c => c.needsAlias).length;\n logger.info(\n `Analysis complete. Found ${conflictsNeedingAlias} first-level peer conflicts needing alias, ` +\n `${missingFirstLevelPeers.length} missing peers (not auto-installing). ` +\n `Analyzed ${this.analyzedDependencies.size} packages, visited ${this.visitedPackages.size} packages total.`,\n );\n\n return {\n analyzedDependencies: this.analyzedDependencies,\n peerConflicts,\n aliasMappings,\n missingFirstLevelPeers,\n };\n } finally {\n // 清理缓存,释放内存\n clearPackageJsonCache();\n clearNpmRegistryCache();\n }\n }\n\n /**\n * 递归分析单个依赖及其所有子依赖\n */\n private analyzeDependencyRecursive(\n packageName: string,\n dependencyPath: string[],\n ): DependencyInfo | null {\n // 使用包名作为 visited 键,同一个包只分析一次\n if (this.visitedPackages.has(packageName)) {\n logger.debug(`Skipping already visited package: ${packageName}`);\n return this.analyzedDependencies.get(packageName) ?? null;\n }\n\n // 使用显式栈替代递归,避免超大依赖树导致的调用栈溢出\n let rootInfo: DependencyInfo | null = null;\n const stack: Array<{ name: string; path: string[] }> = [\n { name: packageName, path: dependencyPath },\n ];\n\n while (stack.length > 0) {\n const item = stack.pop();\n if (!item) break;\n\n const name = item.name;\n const path = item.path;\n\n if (this.visitedPackages.has(name)) {\n continue;\n }\n this.visitedPackages.add(name);\n\n const { packagePath, pkgJson } = this.resolvePackageJson(name, this.options.projectRoot);\n if (!packagePath) {\n logger.debug(`Package not found: ${name}`);\n continue;\n }\n if (!pkgJson) {\n logger.debug(`Could not read package.json for: ${name}`);\n continue;\n }\n\n // 缓存已安装包的信息(按需填充)\n this.cacheInstalledPackageInfo(name, packagePath, pkgJson);\n\n logger.debug(`Analyzing ${name}@${pkgJson.version}`);\n\n const depInfo: DependencyInfo = {\n name,\n version: pkgJson.version ?? 'unknown',\n dependencyPath: [...path],\n dependencies: pkgJson.dependencies ?? {},\n peerDependencies: pkgJson.peerDependencies ?? {},\n peerDependenciesMeta: pkgJson.peerDependenciesMeta,\n };\n\n // 始终存储包信息,以便后续查找普通依赖中的冲突\n this.analyzedDependencies.set(name, depInfo);\n\n if (name === packageName) {\n rootInfo = depInfo;\n }\n\n const currentPath = [...path, name];\n const depsToCheck = [\n ...Object.keys(pkgJson.dependencies ?? {}),\n ...Object.keys(pkgJson.peerDependencies ?? {}),\n ];\n\n for (const depName of depsToCheck) {\n if (this.visitedPackages.has(depName)) {\n continue;\n }\n stack.push({ name: depName, path: currentPath });\n }\n }\n\n return rootInfo;\n }\n\n /**\n * 缓存已安装包的信息(用于后续查找别名等)\n */\n private cacheInstalledPackageInfo(\n packageName: string,\n packagePath: string,\n pkgJson: PackageJson,\n ): void {\n if (this.installedPackageCache.has(packageName)) {\n return;\n }\n\n const info: InstalledPackageInfo = {\n name: packageName,\n version: pkgJson.version ?? 'unknown',\n path: packagePath,\n };\n\n // 检查是否是别名安装\n if (pkgJson.name && pkgJson.name !== packageName) {\n info.isAlias = true;\n info.realName = pkgJson.name;\n }\n\n // 检查 package.json 中的声明(npm: 协议)\n const declaredSpec = this.declaredDeps[packageName];\n if (typeof declaredSpec === 'string' && declaredSpec.startsWith('npm:')) {\n info.isAlias = true;\n const parsed = parseNpmAlias(declaredSpec);\n if (parsed) {\n info.realName = parsed[0];\n }\n }\n\n this.installedPackageCache.set(packageName, info);\n }\n\n /**\n * 收集第一层依赖的 peer 依赖\n * 只分析用户指定的 dependencies 的直接 peerDependencies,不分析子依赖的 peerDependencies\n *\n * 注意:虽然只收集第一层的 peer 依赖用于冲突检测和别名安装,\n * 但依赖树仍然会被完整构建,用于后续的重定向判断\n */\n private collectFirstLevelPeerDependencies(): Map<string, DependencyPath[]> {\n const peerDepsMap = new Map<string, DependencyPath[]>();\n\n // 只遍历第一层依赖(用户指定的 dependencies)\n for (const depName of this.options.dependencies) {\n const depInfo = this.analyzedDependencies.get(depName);\n if (!depInfo) continue;\n\n const peerDeps = depInfo.peerDependencies;\n const peerMeta = depInfo.peerDependenciesMeta ?? {};\n\n for (const [peerName, peerRange] of Object.entries(peerDeps)) {\n const isOptional = peerMeta[peerName]?.optional === true;\n\n const existing = peerDepsMap.get(peerName) ?? [];\n existing.push({\n path: [depName],\n requiredRange: peerRange,\n });\n peerDepsMap.set(peerName, existing);\n\n logger.debug(\n `Found first-level peer dependency: ${peerName}@${peerRange} required by ${depName}${isOptional ? ' (optional)' : ''}`,\n );\n }\n }\n\n return peerDepsMap;\n }\n\n /**\n * 分析 peer 依赖冲突\n * 只有当主工程已安装某个依赖,且 peerDeps 要求的版本不兼容时,才需要别名\n */\n private async analyzePeerConflicts(\n peerDepsMap: Map<string, DependencyPath[]>,\n ): Promise<PeerConflict[]> {\n const conflicts: PeerConflict[] = [];\n\n for (const [packageName, requestedBy] of peerDepsMap) {\n // 仅当主工程声明了该 peer 包时,才认为“主工程版本”有意义并允许自动安装别名。\n // 否则:即使 node_modules 可 resolve 到该包(例如 pnpm peer/hoist 带来的间接可见),也应当视为“未声明”,只提示 missing,不触发安装。\n const isDeclared = this.isDeclaredInMainProject(packageName);\n\n // 获取主工程已安装的版本(从 node_modules 读取实际版本)\n // 只有声明过的包才会参与冲突判定\n const mainVersion = isDeclared ? this.getMainProjectVersion(packageName) : null;\n const isInstalled = mainVersion !== null;\n\n // 检查每个请求是否与已安装版本冲突\n let hasConflict = false;\n const conflictingRanges: DependencyPath[] = [];\n const satisfiedRanges: DependencyPath[] = [];\n\n for (const request of requestedBy) {\n // 解析 peerDep 的版本范围(支持 catalog: 等协议)\n const resolvedRange =\n (await this.workspaceDetector.resolveVersionSpec(packageName, request.requiredRange)) ??\n request.requiredRange;\n\n if (mainVersion && satisfies(mainVersion, resolvedRange)) {\n satisfiedRanges.push(request);\n } else {\n conflictingRanges.push({\n ...request,\n requiredRange: resolvedRange, // 使用解析后的版本范围\n });\n // 只有当包在主工程中“已声明且已安装”时,才标记为冲突\n // 未声明:不算冲突,交由 missing peers 提示\n // 未安装:不算冲突,属于缺失\n if (isDeclared && isInstalled) {\n hasConflict = true;\n }\n }\n }\n\n // needsAlias 的条件:\n // 1. 主工程已声明该包(isDeclared = true)\n // 2. 包实际已安装(isInstalled = true)\n // 2. 存在与已安装版本不兼容的 peerDep 请求(conflictingRanges.length > 0)\n const needsAlias = isDeclared && isInstalled && hasConflict && conflictingRanges.length > 0;\n\n if (needsAlias) {\n logger.info(\n `Peer conflict: ${packageName}@${mainVersion} - ${conflictingRanges.length} incompatible ranges`,\n );\n }\n\n conflicts.push({\n packageName,\n mainProjectVersion: mainVersion,\n requiredRange: this.mergeRequiredRanges(requestedBy),\n requestedBy,\n conflictingRanges, // 只记录冲突的范围\n hasConflict,\n needsAlias,\n });\n }\n\n return conflicts;\n }\n\n /**\n * 获取已安装的包版本(从 node_modules 读取实际版本)\n * 返回 null 表示包未安装\n */\n private getMainProjectVersion(packageName: string): string | null {\n // 先检查已缓存的安装信息\n const cached = this.installedPackageCache.get(packageName);\n if (cached) {\n return cached.version;\n }\n\n // 尝试按需查找包(从 node_modules 读取实际安装的版本)\n const { packagePath, pkgJson } = this.resolvePackageJson(packageName, this.options.projectRoot);\n if (packagePath && pkgJson?.version) {\n // 缓存安装信息\n this.installedPackageCache.set(packageName, {\n name: packageName,\n version: pkgJson.version,\n path: packagePath,\n });\n return pkgJson.version;\n }\n\n // 包未安装,返回 null\n // 注意:不返回 package.json 中声明的版本范围,因为那不是实际安装的版本\n return null;\n }\n\n /**\n * 合并多个版本范围为描述字符串\n */\n private mergeRequiredRanges(requests: DependencyPath[]): string {\n const ranges = [...new Set(requests.map(r => r.requiredRange))];\n return ranges.join(' || ');\n }\n\n /**\n * 生成别名映射\n */\n private async generateAliasMappings(conflicts: PeerConflict[]): Promise<AliasMapping[]> {\n const aliasMappings: AliasMapping[] = [];\n\n // 按包名分组需要别名的冲突\n const aliasNeeded = conflicts.filter(c => c.needsAlias);\n\n // 收集所有冲突包的名称\n const allConflictPackageNames = aliasNeeded.map(c => c.packageName);\n\n // 对于每个需要别名的包\n for (const conflict of aliasNeeded) {\n const mappings = await this.createAliasMappingsForConflict(conflict, allConflictPackageNames);\n aliasMappings.push(...mappings);\n }\n\n return aliasMappings;\n }\n\n /**\n * 为单个冲突创建别名映射\n */\n private async createAliasMappingsForConflict(\n conflict: PeerConflict,\n allConflictPackageNames: string[],\n ): Promise<AliasMapping[]> {\n const { packageName, conflictingRanges } = conflict;\n\n // 1. 按范围兼容性分组\n const rangeGroups = this.groupRangesByCompatibility(conflictingRanges);\n\n logger.info(`Creating alias for \"${packageName}\": ${rangeGroups.length} version groups`);\n\n // 输出 workspace 检测结果(使用 info 级别以便用户看到)\n const workspaceRoot = await this.workspaceDetector.getWorkspaceRoot();\n if (workspaceRoot) {\n logger.info(` Workspace root detected: ${workspaceRoot}`);\n const wsAliases = await this.findWorkspaceAliasesForPackage(packageName);\n if (wsAliases.length > 0) {\n logger.info(` Found ${wsAliases.length} workspace alias(es) for ${packageName}:`);\n for (const a of wsAliases) {\n logger.info(\n ` - ${a.aliasName}: npm:${packageName}@${a.versionSpec} (defined in: ${a.definedIn})`,\n );\n }\n } else {\n logger.info(\n ` No workspace aliases found for ${packageName} (expected npm:${packageName}@version format in root package.json)`,\n );\n }\n } else {\n logger.info(` Not in a monorepo workspace`);\n }\n\n // 输出当前项目已有的本地别名\n const localAliases = this.existingAliasesMap.get(packageName);\n if (localAliases && localAliases.length > 0) {\n logger.info(` Found ${localAliases.length} local alias(es) for ${packageName}:`);\n for (const a of localAliases) {\n logger.info(\n ` - ${a.aliasName}: npm:${packageName}@${a.versionSpec} (installed: ${a.installedVersion ?? 'not installed'})`,\n );\n }\n }\n\n // 2. 获取远程版本列表(只获取一次)\n const versions = await fetchAllVersions(packageName, this.options.registry);\n if (versions.length === 0) {\n logger.warn(`No versions found for ${packageName}`);\n return [];\n }\n\n // 3. 获取已存在的别名(用于复用和避免命名冲突)\n const existingAliasNames = await this.getExistingAliasNames(packageName);\n // 记录这次已使用的别名,避免重复使用\n const usedAliasNames = new Set<string>();\n\n const mappings: AliasMapping[] = [];\n\n // 4. 为每组创建别名映射\n for (let i = 0; i < rangeGroups.length; i++) {\n const group = rangeGroups[i];\n if (!group || group.length === 0) continue;\n\n const groupRanges = [...new Set(group.map(r => r.requiredRange))];\n\n logger.debug(` Group ${i + 1}: ${groupRanges.join(', ')}`);\n\n const mapping = await this.createAliasMappingForGroup(\n packageName,\n group,\n groupRanges,\n versions,\n existingAliasNames,\n usedAliasNames,\n allConflictPackageNames,\n );\n\n if (mapping) {\n mappings.push(mapping);\n // 记录已使用的别名名称\n usedAliasNames.add(mapping.aliasName);\n }\n }\n\n return mappings;\n }\n\n /**\n * 按范围兼容性分组\n * 有交集的范围放在一组,互斥的分开\n */\n private groupRangesByCompatibility(requests: DependencyPath[]): DependencyPath[][] {\n const groups: DependencyPath[][] = [];\n\n for (const request of requests) {\n let added = false;\n\n // 尝试加入现有组\n for (const group of groups) {\n // 检查是否与组内所有范围都有交集\n const canJoin = group.every(existing =>\n rangesIntersect(existing.requiredRange, request.requiredRange),\n );\n\n if (canJoin) {\n group.push(request);\n added = true;\n break;\n }\n }\n\n // 没有合适的组,创建新组\n if (!added) {\n groups.push([request]);\n }\n }\n\n return groups;\n }\n\n /**\n * 为一个兼容组创建别名映射\n */\n private async createAliasMappingForGroup(\n packageName: string,\n group: DependencyPath[],\n groupRanges: string[],\n versions: string[],\n existingAliasNames: Set<string>,\n usedAliasNames: Set<string>,\n allConflictPackageNames: string[],\n ): Promise<AliasMapping | null> {\n // 1. 先检查是否有现有别名可复用(包括 workspace 级别)\n const existingAlias = await this.findExistingAliasForRanges(\n packageName,\n groupRanges,\n usedAliasNames,\n );\n\n if (existingAlias) {\n logger.debug(\n ` Reusing: ${existingAlias.name}@${existingAlias.version}${existingAlias.isWorkspaceAlias ? ' (workspace)' : ''}`,\n );\n\n return this.buildAliasMapping(\n packageName,\n existingAlias.name,\n existingAlias.version,\n '', // 不需要安装\n group,\n allConflictPackageNames,\n );\n }\n\n // 2. 找到满足该组所有范围的最佳版本\n const bestVersion = findBestVersion(versions, groupRanges);\n\n if (!bestVersion) {\n logger.warn(\n ` No version satisfies all ranges [${groupRanges.join(', ')}] for ${packageName}`,\n );\n return null;\n }\n\n // 3. 生成新的别名名称\n const combinedExisting = new Set([...existingAliasNames, ...usedAliasNames]);\n const aliasName = this.generateUniqueAliasName(packageName, bestVersion, combinedExisting);\n const installSpec = createAliasInstallSpec(aliasName, packageName, bestVersion);\n\n logger.info(` New alias: ${aliasName}@${bestVersion}`);\n\n return this.buildAliasMapping(\n packageName,\n aliasName,\n bestVersion,\n installSpec,\n group,\n allConflictPackageNames,\n );\n }\n\n /**\n * 构建 AliasMapping 对象\n */\n private buildAliasMapping(\n packageName: string,\n aliasName: string,\n version: string,\n installSpec: string,\n group: DependencyPath[],\n allConflictPackageNames: string[],\n ): AliasMapping {\n // usedBy 包含声明 peerDependency 的包路径\n const usedBy = group.map(r => r.path.join('>'));\n\n // 收集 usedBy 中第一层包作为起点\n const usedByRoots = [\n ...new Set(group.map(r => r.path[0]).filter((p): p is string => p !== undefined)),\n ];\n\n // 只收集 peerDependencies 链路上的包用于重定向\n // dependencies 中的引用不需要重定向,由包管理器的正常解析处理\n // 排除所有冲突包,防止主工程的这些包引用被错误重定向\n const allDependents = this.collectAllRelatedPackages(usedByRoots, allConflictPackageNames);\n\n return {\n originalName: packageName,\n aliasName,\n installSpec,\n resolvedVersion: version,\n usedBy,\n allDependents,\n };\n }\n\n /**\n * 查找满足指定范围的现有别名(排除已使用的)\n * 优先查找当前项目的别名,然后查找 workspace 级别的别名\n */\n private async findExistingAliasForRanges(\n packageName: string,\n ranges: string[],\n excludeAliases: Set<string>,\n ): Promise<{\n name: string;\n version: string;\n isWorkspaceAlias?: boolean;\n } | null> {\n logger.debug(\n ` Searching for existing alias for ${packageName} satisfying ranges: [${ranges.join(', ')}]`,\n );\n\n // 1. 先查找当前项目 package.json 中的别名\n const npmAliases = this.existingAliasesMap.get(packageName);\n\n if (npmAliases && npmAliases.length > 0) {\n logger.debug(` Checking ${npmAliases.length} local alias(es)...`);\n for (const alias of npmAliases) {\n // 跳过已使用的别名\n if (excludeAliases.has(alias.aliasName)) {\n logger.debug(` Skip ${alias.aliasName}: already used`);\n continue;\n }\n\n // 获取或更新已安装版本\n if (alias.installedVersion === null) {\n alias.installedVersion = this.getAliasInstalledVersion(alias.aliasName);\n }\n\n if (!alias.installedVersion) {\n logger.debug(` Skip ${alias.aliasName}: not installed`);\n continue;\n }\n\n // 检查版本是否满足所有范围\n const allSatisfied = ranges.every(range => satisfies(alias.installedVersion!, range));\n\n if (allSatisfied) {\n logger.info(` Reusing local alias: ${alias.aliasName}@${alias.installedVersion}`);\n return { name: alias.aliasName, version: alias.installedVersion };\n } else {\n logger.debug(\n ` Skip ${alias.aliasName}@${alias.installedVersion}: version doesn't satisfy all ranges`,\n );\n }\n }\n }\n\n // 2. 查找 workspace 级别的别名\n const workspaceAliases = await this.findWorkspaceAliasesForPackage(packageName);\n const workspaceRoot = await this.workspaceDetector.getWorkspaceRoot();\n\n if (workspaceAliases.length > 0) {\n logger.debug(` Checking ${workspaceAliases.length} workspace alias(es)...`);\n }\n\n for (const wsAlias of workspaceAliases) {\n // 跳过已使用的别名\n if (excludeAliases.has(wsAlias.aliasName)) {\n logger.debug(` Skip ${wsAlias.aliasName}: already used`);\n continue;\n }\n\n // 尝试从 workspace 根目录获取已安装版本(pnpm 模式下依赖安装在根目录)\n let installedVersion: string | null = null;\n\n if (workspaceRoot) {\n const { packagePath, pkgJson } = this.resolvePackageJson(wsAlias.aliasName, workspaceRoot);\n if (packagePath) {\n installedVersion = pkgJson?.version ?? null;\n logger.debug(\n ` Found ${wsAlias.aliasName} installed at workspace root: ${installedVersion}`,\n );\n }\n }\n\n // 如果找不到,尝试从当前项目查找(可能是 hoisted 或软链接)\n if (!installedVersion) {\n installedVersion = this.getAliasInstalledVersion(wsAlias.aliasName);\n if (installedVersion) {\n logger.debug(` Found ${wsAlias.aliasName} installed at project: ${installedVersion}`);\n }\n }\n\n // 如果已安装,用实际版本检查\n if (installedVersion) {\n const allSatisfied = ranges.every(range => satisfies(installedVersion, range));\n if (allSatisfied) {\n logger.info(` Reusing workspace alias: ${wsAlias.aliasName}@${installedVersion}`);\n return {\n name: wsAlias.aliasName,\n version: installedVersion,\n isWorkspaceAlias: true,\n };\n } else {\n logger.debug(\n ` Skip ${wsAlias.aliasName}@${installedVersion}: version doesn't satisfy all ranges`,\n );\n }\n continue;\n }\n\n // 如果未安装,用声明的版本范围检查是否有交集\n // 这适用于别名尚未安装但声明了的情况\n const declaredSpec = wsAlias.versionSpec;\n if (declaredSpec) {\n logger.debug(\n ` Checking ${wsAlias.aliasName} (declared: ${declaredSpec}) - not installed yet`,\n );\n // 检查声明的版本范围与需求范围是否有交集\n const hasIntersection = ranges.every(range => rangesIntersect(declaredSpec, range));\n if (hasIntersection) {\n logger.info(\n ` Can reuse workspace alias: ${wsAlias.aliasName} (declared: ${declaredSpec})`,\n );\n return {\n name: wsAlias.aliasName,\n version: declaredSpec,\n isWorkspaceAlias: true,\n };\n } else {\n logger.debug(\n ` Skip ${wsAlias.aliasName}: declared range ${declaredSpec} doesn't intersect with [${ranges.join(', ')}]`,\n );\n }\n }\n }\n\n logger.debug(` No existing alias found for ${packageName}`);\n return null;\n }\n\n /**\n * 查找 workspace 级别的别名(带缓存)\n */\n private async findWorkspaceAliasesForPackage(packageName: string): Promise<WorkspaceAliasInfo[]> {\n // 检查缓存\n if (this.workspaceAliasesCache.has(packageName)) {\n return this.workspaceAliasesCache.get(packageName)!;\n }\n\n // 从 workspace 检测器获取别名\n const aliases = await this.workspaceDetector.findWorkspaceAliases(packageName);\n this.workspaceAliasesCache.set(packageName, aliases);\n\n return aliases;\n }\n\n /**\n * 生成唯一的别名名称,避免与已存在的别名冲突\n */\n private generateUniqueAliasName(\n packageName: string,\n version: string,\n existingNames: Set<string>,\n ): string {\n const baseName = `${this.options.aliasPrefix}${generateAliasName(packageName, version)}`;\n\n // 如果基础名称不冲突,直接使用\n if (!existingNames.has(baseName)) {\n return baseName;\n }\n\n // 否则添加后缀直到找到唯一名称\n // 使用更完整的版本号作为后缀\n const versionSuffix = version.replace(/\\./g, '-');\n const nameWithVersion = `${this.options.aliasPrefix}${packageName.replace(/^@/, '').replace(/\\//g, '-')}-${versionSuffix}`;\n\n if (!existingNames.has(nameWithVersion)) {\n return nameWithVersion;\n }\n\n // 最后尝试数字后缀\n let counter = 2;\n while (existingNames.has(`${baseName}-${counter}`)) {\n counter++;\n }\n\n return `${baseName}-${counter}`;\n }\n\n /**\n * 获取包的所有已存在的别名名称(不管版本是否符合)\n * 用于生成新别名时避免命名冲突\n *\n * 包含当前项目和 workspace 级别的别名\n */\n private async getExistingAliasNames(packageName: string): Promise<Set<string>> {\n const names = new Set<string>();\n\n // 1. 从当前项目 package.json 的 npm: 协议解析的别名中获取\n const npmAliases = this.existingAliasesMap.get(packageName);\n if (npmAliases) {\n for (const alias of npmAliases) {\n names.add(alias.aliasName);\n }\n }\n\n // 2. 从 workspace 级别获取别名名称\n const workspaceAliases = await this.findWorkspaceAliasesForPackage(packageName);\n for (const wsAlias of workspaceAliases) {\n names.add(wsAlias.aliasName);\n }\n\n return names;\n }\n\n /**\n * 递归收集指定包的所有子依赖(dependencies + peerDependencies)\n *\n * 用于构建 allDependents 列表,这些包引用冲突依赖时都需要做重定向解析\n *\n * 逻辑说明:\n * - 冲突检测:只检测第一层依赖的 peerDependencies 与主工程的冲突\n * - 重定向范围:声明冲突 peerDep 的包及其所有子依赖都需要重定向\n * 因为这些子依赖内部引用冲突包时,也需要解析到别名版本\n *\n * 性能优化:优先从 analyzedDependencies 内存数据中读取,避免重复磁盘 I/O\n */\n private collectAllSubDependenciesRecursive(\n packageName: string,\n visited: Set<string>,\n collected: Set<string>,\n baseDir: string,\n ): void {\n const stack: Array<{ name: string; baseDir: string }> = [{ name: packageName, baseDir }];\n\n while (stack.length > 0) {\n const item = stack.pop();\n if (!item) break;\n\n const name = item.name;\n const currentBaseDir = item.baseDir;\n\n collected.add(name);\n\n // 优先从已分析的内存数据中读取依赖信息,避免重复 resolvePackageJson 磁盘 I/O\n const analyzed = this.analyzedDependencies.get(name);\n if (analyzed) {\n if (visited.has(name)) {\n continue;\n }\n visited.add(name);\n\n for (const depName of Object.keys(analyzed.dependencies)) {\n stack.push({ name: depName, baseDir: currentBaseDir });\n }\n for (const peerName of Object.keys(analyzed.peerDependencies)) {\n stack.push({ name: peerName, baseDir: currentBaseDir });\n }\n continue;\n }\n\n // 内存中没有:回退到磁盘查找\n const { packagePath, pkgJson } = this.resolvePackageJson(name, currentBaseDir);\n if (!packagePath) {\n logger.debug(\n `Package not found for dependency collection: ${name} (from ${currentBaseDir})`,\n );\n continue;\n }\n\n if (visited.has(packagePath)) {\n continue;\n }\n visited.add(packagePath);\n\n if (!pkgJson) {\n continue;\n }\n\n const deps = pkgJson.dependencies ?? {};\n const peerDeps = pkgJson.peerDependencies ?? {};\n\n for (const depName of Object.keys(deps)) {\n stack.push({ name: depName, baseDir: packagePath });\n }\n for (const peerName of Object.keys(peerDeps)) {\n stack.push({ name: peerName, baseDir: packagePath });\n }\n }\n }\n\n /**\n * 收集多个包的所有子依赖(用于 allDependents)\n * 包括 dependencies 和 peerDependencies 递归下去的所有包\n */\n collectAllRelatedPackages(packageNames: string[], excludePackages: string[] = []): string[] {\n const collected = new Set<string>();\n const visited = new Set<string>();\n const excludeSet = new Set(excludePackages);\n\n for (const pkgName of packageNames) {\n this.collectAllSubDependenciesRecursive(\n pkgName,\n visited,\n collected,\n this.options.projectRoot,\n );\n }\n\n // 从结果中移除需要排除的包\n // 这是必要的,因为 peerDependencies 中会包含冲突的目标包名(如 \"vue\")\n // 如果不排除,会导致主工程的 vue 引用也被错误重定向\n for (const excludePkg of excludeSet) {\n collected.delete(excludePkg);\n }\n\n return Array.from(collected);\n }\n\n /**\n * 找出第一层依赖中缺失的 peer 依赖(无冲突)\n * 复用 collectFirstLevelPeerDependencies 已收集的 peerDepsMap,避免重复遍历\n */\n private findMissingFirstLevelPeers(peerDepsMap: Map<string, DependencyPath[]>): Array<{\n packageName: string;\n requiredRange: string;\n requestedBy: string;\n }> {\n const missing: Array<{\n packageName: string;\n requiredRange: string;\n requestedBy: string;\n }> = [];\n\n for (const [peerName, requests] of peerDepsMap) {\n // missing 的定义:主工程未声明该 peer 依赖\n // 注意:node_modules 可 resolve 到 ≠ 已声明(pnpm 的 peer/hoist 场景会误导)\n if (this.isDeclaredInMainProject(peerName)) {\n continue;\n }\n\n // 过滤掉 optional 的请求\n for (const request of requests) {\n const requestedBy = request.path[0];\n if (!requestedBy) continue;\n\n const depInfo = this.analyzedDependencies.get(requestedBy);\n const isOptional = depInfo?.peerDependenciesMeta?.[peerName]?.optional === true;\n if (isOptional) {\n continue;\n }\n\n // 未声明:缺失(不自动安装,只提示)\n missing.push({\n packageName: peerName,\n requiredRange: request.requiredRange,\n requestedBy,\n });\n }\n }\n\n return missing;\n }\n}\n\n/**\n * 创建依赖分析器实例\n */\nexport function createDependencyAnalyzer(options: ResolvedOptions): DependencyAnalyzer {\n const mainPackageJson = readPackageJsonCached(options.projectRoot);\n if (!mainPackageJson) {\n throw new Error(`Could not read package.json at ${options.projectRoot}`);\n }\n\n // 不预先扫描 node_modules,按需查找包\n return new DependencyAnalyzer(options, mainPackageJson);\n}\n","import type {\n AliasMapping,\n ResolvedOptions,\n AliasPathMapping,\n AnalysisResult,\n} from '../types/index';\nimport { createLogger } from '../utils/logger';\nimport { findPackagePath } from '../utils/fs';\nimport { join } from 'path';\n\nconst logger = createLogger('alias-manager');\n\n/**\n * 模块解析上下文\n */\ninterface ResolveContext {\n /**\n * 请求的模块\n */\n request: string;\n\n /**\n * 导入者的路径\n */\n importer?: string;\n}\n\ninterface AliasRule {\n originalName: string;\n aliasName: string;\n dependents: Set<string>;\n}\n\n/**\n * 别名管理器\n * 负责管理模块别名和生成解析规则\n */\nexport class AliasManager {\n private options: ResolvedOptions;\n private aliasMappings: AliasMapping[] = [];\n /**\n * 规则索引:originalName -> 相关规则列表\n * 用于在 resolveModule 时避免全量遍历所有规则,提升 dev server/HMR 场景下性能。\n */\n private rulesMap: Map<string, AliasRule[]> = new Map();\n\n constructor(options: ResolvedOptions) {\n this.options = options;\n }\n\n /**\n * 从分析结果初始化别名映射\n */\n initFromAnalysisResult(result: AnalysisResult): void {\n this.aliasMappings = result.aliasMappings;\n this.buildRules();\n\n logger.info(`Initialized ${this.aliasMappings.length} alias mappings`);\n }\n\n /**\n * 基于 allDependents 构建规则(用 Set 做成员判断,避免超大正则导致的性能与长度问题)\n */\n private buildRules(): void {\n this.rulesMap = new Map();\n\n for (const mapping of this.aliasMappings) {\n let dependents = mapping.allDependents ?? [];\n\n // 过滤掉配置中排除的依赖包\n const excludeList = this.options.excludeRedirects[mapping.originalName] ?? [];\n if (excludeList.length > 0) {\n dependents = dependents.filter(dep => !excludeList.includes(dep));\n logger.debug(`Excluded redirects for ${mapping.originalName}: ${excludeList.join(', ')}`);\n }\n\n const rule: AliasRule = {\n originalName: mapping.originalName,\n aliasName: mapping.aliasName,\n dependents: new Set(dependents),\n };\n\n const list = this.rulesMap.get(rule.originalName);\n if (list) {\n list.push(rule);\n } else {\n this.rulesMap.set(rule.originalName, [rule]);\n }\n }\n }\n\n /**\n * 从模块请求中提取“包名部分”,用于索引命中:\n * - vue/compiler-sfc -> vue\n * - @scope/pkg/subpath -> @scope/pkg\n * - @scope/pkg/subpath?raw -> @scope/pkg\n * - virtual:xxx -> virtual:xxx\n * - C:\\path\\to\\file (Windows) -> ''(视为非包请求)\n */\n private getRequestPackageName(request: string): string {\n if (!request) return '';\n\n // 去掉 query/hash(保留原 request 用于最终返回,避免改变行为)\n const base = request.split(/[?#]/, 1)[0] ?? '';\n if (!base) return '';\n\n // Windows 绝对路径(避免误判为包名)\n if (/^[a-zA-Z]:[\\\\/]/.test(base)) {\n return '';\n }\n\n // scoped package\n if (base.startsWith('@')) {\n const firstSlash = base.indexOf('/');\n if (firstSlash === -1) return base;\n const secondSlash = base.indexOf('/', firstSlash + 1);\n return secondSlash === -1 ? base : base.slice(0, secondSlash);\n }\n\n const slash = base.indexOf('/');\n return slash === -1 ? base : base.slice(0, slash);\n }\n\n /**\n * 从 importer 路径中提取所有 node_modules 里出现过的包名(包含嵌套 node_modules)。\n *\n * 示例:\n * - /p/node_modules/a/index.js -> [\"a\"]\n * - /p/node_modules/a/node_modules/b/x.js -> [\"a\",\"b\"]\n * - /p/node_modules/@s/a/dist/index.js -> [\"@s/a\"]\n * - /p/node_modules/.pnpm/a@1/node_modules/a/ -> [\"a\"](会跳过 \".pnpm\")\n */\n private extractImporterPackages(importer: string): string[] {\n const normalized = importer.replace(/\\\\/g, '/');\n const parts = normalized.split('/');\n\n const packages: string[] = [];\n\n for (let i = 0; i < parts.length - 1; i++) {\n if (parts[i] !== 'node_modules') continue;\n\n const next = parts[i + 1];\n if (!next || next.startsWith('.')) {\n continue;\n }\n\n if (next.startsWith('@')) {\n const name = parts[i + 2];\n if (name) {\n packages.push(`${next}/${name}`);\n }\n continue;\n }\n\n packages.push(next);\n }\n\n return packages;\n }\n\n /**\n * 解析模块请求\n * @returns 解析后的模块名,如果不需要重定向则返回 null\n */\n resolveModule(context: ResolveContext): string | null {\n const { request, importer } = context;\n\n // 如果没有导入者,不处理\n if (!importer) {\n return null;\n }\n\n const importerPackages = this.extractImporterPackages(importer);\n if (importerPackages.length === 0) {\n return null;\n }\n\n const requestPackageName = this.getRequestPackageName(request);\n if (!requestPackageName) {\n return null;\n }\n\n const candidateRules = this.rulesMap.get(requestPackageName);\n if (!candidateRules || candidateRules.length === 0) {\n return null;\n }\n\n for (const rule of candidateRules) {\n // importer 是否位于需要重定向的依赖包链路中\n // 优化点:\n // - 避免每次都把 Set 展开成数组(会产生大量临时对象)\n // - importerPackages 通常很短(路径上出现的包名数量有限),因此遍历它并用 Set.has 做判断更高效\n let shouldRedirect = false;\n for (const pkg of importerPackages) {\n if (rule.dependents.has(pkg)) {\n shouldRedirect = true;\n break;\n }\n }\n if (!shouldRedirect) {\n continue;\n }\n\n if (request === rule.originalName) {\n logger.debug(`Resolving ${request} -> ${rule.aliasName} (from ${importer})`);\n return rule.aliasName;\n }\n\n const prefix = `${rule.originalName}/`;\n if (request.startsWith(prefix)) {\n const resolved = `${rule.aliasName}${request.slice(rule.originalName.length)}`;\n logger.debug(`Resolving ${request} -> ${resolved} (from ${importer})`);\n return resolved;\n }\n }\n\n return null;\n }\n\n /**\n * 获取别名路径映射\n * 返回别名名称到实际路径的映射,供构建工具插件转换为各自的格式\n */\n getAliasPathMappings(): AliasPathMapping[] {\n const mappings: AliasPathMapping[] = [];\n\n for (const mapping of this.aliasMappings) {\n // 查找别名包的实际路径\n const aliasPath = findPackagePath(mapping.aliasName, this.options.projectRoot);\n\n const resolvedPath =\n aliasPath ?? join(this.options.projectRoot, 'node_modules', mapping.aliasName);\n\n mappings.push({\n aliasName: mapping.aliasName,\n originalName: mapping.originalName,\n path: resolvedPath,\n });\n }\n\n return mappings;\n }\n}\n\n/**\n * 创建别名管理器实例\n */\nexport function createAliasManager(options: ResolvedOptions): AliasManager {\n return new AliasManager(options);\n}\n","import { spawn } from 'child_process';\nimport type { AliasMapping, ResolvedOptions } from '../types/index';\nimport { createLogger } from '../utils/logger';\nimport { fileExists, readPackageJsonCached } from '../utils/fs';\nimport { join } from 'path';\nimport semver from 'semver';\n\nconst logger = createLogger('package-installer');\n\n/**\n * 安装超时时间(毫秒)\n */\nconst INSTALL_TIMEOUT = 120000; // 120秒\n\n/**\n * 安装结果\n */\ninterface InstallResult {\n /**\n * 是否成功\n */\n success: boolean;\n\n /**\n * 安装的包\n */\n installed: string[];\n\n /**\n * 失败的包\n */\n failed: string[];\n\n /**\n * 错误信息\n */\n errors: string[];\n}\n\n/**\n * 包安装器\n * 负责安装别名依赖\n *\n * 安装策略:\n * - 只安装 aliasMappings 中有 installSpec 的别名(与主工程版本冲突的)\n * - 复用已存在的别名(installSpec 为空表示复用)\n * - 不自动安装缺失的 peer 依赖,只记录警告\n */\nexport class PackageInstaller {\n private options: ResolvedOptions;\n\n constructor(options: ResolvedOptions) {\n this.options = options;\n }\n\n /**\n * 安装别名依赖\n */\n async installAliases(mappings: AliasMapping[]): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n failed: [],\n errors: [],\n };\n\n if (mappings.length === 0) {\n logger.info('No aliases to install');\n return result;\n }\n\n // 过滤出需要安装的\n const toInstall = mappings.filter(m => {\n // 没有 installSpec 表示复用现有别名,不需要安装\n if (!m.installSpec) {\n logger.debug(`Skipping ${m.aliasName}: reusing existing installation`);\n return false;\n }\n\n const aliasPath = join(this.options.projectRoot, 'node_modules', m.aliasName);\n\n // 检查是否已安装\n if (!fileExists(aliasPath)) {\n return true; // 未安装,需要安装\n }\n\n // 已安装,验证版本是否正确\n const versionMatch = this.verifyInstalledVersion(\n aliasPath,\n m.originalName,\n m.resolvedVersion,\n );\n if (!versionMatch) {\n logger.info(`${m.aliasName} exists but version mismatch, will reinstall`);\n return true; // 版本不匹配,需要重新安装\n }\n\n logger.debug(`${m.aliasName} already installed with correct version`);\n return false;\n });\n\n if (toInstall.length === 0) {\n logger.info('All aliases already installed with correct versions');\n return result;\n }\n\n logger.info(`Installing ${toInstall.length} alias packages...`);\n\n const installSpecs = toInstall.map(m => m.installSpec);\n const installResult = await this.runInstall(installSpecs);\n\n if (installResult.success) {\n result.installed = toInstall.map(m => m.aliasName);\n logger.info(`Successfully installed: ${result.installed.join(', ')}`);\n } else {\n result.success = false;\n result.failed = toInstall.map(m => m.aliasName);\n result.errors = installResult.errors;\n logger.error(`Failed to install aliases: ${installResult.errors.join(', ')}`);\n }\n\n return result;\n }\n\n /**\n * 验证已安装的别名版本是否正确\n * @returns true 如果版本匹配\n */\n private verifyInstalledVersion(\n aliasPath: string,\n expectedPackageName: string,\n expectedVersion: string,\n ): boolean {\n try {\n const pkgJsonPath = join(aliasPath, 'package.json');\n if (!fileExists(pkgJsonPath)) {\n return false;\n }\n\n const pkgJson = readPackageJsonCached(aliasPath);\n if (!pkgJson) {\n logger.debug(`Failed to verify version: unable to read/parse ${pkgJsonPath}`);\n return false;\n }\n\n // 检查实际包名是否匹配(npm 别名安装后,name 字段是原始包名)\n if (pkgJson.name !== expectedPackageName) {\n logger.debug(\n `Package name mismatch: expected ${expectedPackageName}, got ${pkgJson.name ?? 'unknown'}`,\n );\n return false;\n }\n\n // 检查版本是否匹配(使用 semver 等价比较,容忍 v1.0.0 vs 1.0.0 等格式差异)\n const installedClean = semver.clean(pkgJson.version ?? '');\n const expectedClean = semver.clean(expectedVersion);\n if (!installedClean || !expectedClean || installedClean !== expectedClean) {\n logger.debug(\n `Version mismatch: expected ${expectedVersion}, got ${pkgJson.version ?? 'unknown'}`,\n );\n return false;\n }\n\n return true;\n } catch (error) {\n logger.debug(`Failed to verify version: ${String(error)}`);\n return false;\n }\n }\n\n /**\n * 执行安装命令\n */\n private async runInstall(packages: string[]): Promise<{ success: boolean; errors: string[] }> {\n if (packages.length === 0) {\n return { success: true, errors: [] };\n }\n\n const { packageManager, projectRoot } = this.options;\n\n let command: string;\n let args: string[];\n\n switch (packageManager) {\n case 'yarn':\n command = 'yarn';\n args = ['add', ...packages];\n break;\n case 'pnpm':\n command = 'pnpm';\n args = ['add', ...packages];\n break;\n case 'npm':\n default:\n command = 'npm';\n // 使用 --legacy-peer-deps 跳过 peer 依赖检查,避免卡死\n args = ['install', '--legacy-peer-deps', ...packages];\n break;\n }\n\n const fullCommand = `${command} ${args.join(' ')}`;\n logger.info(`Running: ${fullCommand}`);\n\n const startTime = Date.now();\n\n return new Promise(resolve => {\n let resolved = false;\n\n const child = spawn(command, args, {\n cwd: projectRoot,\n shell: true,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n // 超时处理\n const timeoutId = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n logger.error(`Install timeout after ${INSTALL_TIMEOUT / 1000}s`);\n child.kill('SIGTERM');\n setTimeout(() => {\n if (!child.killed) {\n child.kill('SIGKILL');\n }\n }, 5000);\n resolve({\n success: false,\n errors: [`Install timeout after ${INSTALL_TIMEOUT / 1000}s`],\n });\n }\n }, INSTALL_TIMEOUT);\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('error', error => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeoutId);\n logger.error(`Install error: ${error.message}`);\n resolve({\n success: false,\n errors: [error.message],\n });\n }\n });\n\n child.on('close', code => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeoutId);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n if (code === 0) {\n if (stdout) {\n logger.debug(`stdout: ${stdout}`);\n }\n logger.info(`Install completed in ${elapsed}s`);\n resolve({ success: true, errors: [] });\n } else {\n logger.error(`Install failed with exit code ${code}`);\n if (stdout) {\n logger.debug(`stdout: ${stdout}`);\n }\n if (stderr) {\n logger.debug(`stderr: ${stderr}`);\n }\n resolve({\n success: false,\n errors: stderr ? [stderr] : [`Process exited with code ${code}`],\n });\n }\n }\n });\n });\n }\n}\n\n/**\n * 创建包安装器实例\n */\nexport function createPackageInstaller(options: ResolvedOptions): PackageInstaller {\n return new PackageInstaller(options);\n}\n","import type {\n DepsConflictResolverOptions,\n ResolvedOptions,\n AnalysisResult,\n PluginHooks,\n AliasPathMapping,\n} from '../types/index';\nimport { DEFAULT_NPM_REGISTRY } from '../constants';\nimport { createLogger, LogLevel } from '../utils/logger';\nimport { findProjectRoot } from '../utils/fs';\nimport { createEnvironmentDetector, EnvironmentDetector } from './environment-detector';\nimport { createDependencyAnalyzer, DependencyAnalyzer } from './dependency-analyzer';\nimport { createAliasManager, AliasManager } from './alias-manager';\nimport { createPackageInstaller, PackageInstaller } from './package-installer';\n\nconst logger = createLogger('resolver');\n\n/**\n * 默认配置(不包含需要自动检测的字段)\n */\nconst DEFAULT_OPTIONS = {\n autoInstall: true,\n debug: false,\n aliasPrefix: 'aliased-',\n} as const;\n\n/**\n * 依赖解析器\n * 整合所有核心模块,提供统一的 API\n */\nexport class DepsConflictResolver {\n private options!: ResolvedOptions;\n private userOptions: DepsConflictResolverOptions;\n private hooks: PluginHooks;\n\n private environmentDetector: EnvironmentDetector | null = null;\n private analyzer: DependencyAnalyzer | null = null;\n private aliasManager!: AliasManager;\n private installer!: PackageInstaller;\n\n private analysisResult: AnalysisResult | null = null;\n private initialized = false;\n\n constructor(userOptions: DepsConflictResolverOptions, hooks: PluginHooks = {}) {\n this.userOptions = userOptions;\n this.hooks = hooks;\n\n // 设置日志级别(如果用户已指定)\n if (userOptions.debug) {\n logger.setLevel(LogLevel.DEBUG);\n }\n }\n\n /**\n * 解析配置,填充默认值(异步,支持自动检测)\n */\n private async resolveOptions(\n userOptions: DepsConflictResolverOptions,\n projectRoot: string,\n ): Promise<ResolvedOptions> {\n // 创建环境检测器\n this.environmentDetector = createEnvironmentDetector(projectRoot);\n\n // 检测包管理器\n let packageManager: 'npm' | 'yarn' | 'pnpm';\n if (!userOptions.packageManager || userOptions.packageManager === 'auto') {\n const detected = await this.environmentDetector.getDetectionResult();\n packageManager = detected.packageManager;\n logger.info(\n `Auto-detected package manager: ${packageManager} (from ${detected.detectedFrom})`,\n );\n } else {\n packageManager = userOptions.packageManager;\n }\n\n // 检测 registry\n let registry: string;\n if (!userOptions.registry) {\n registry = await this.environmentDetector.getRegistryForPackageManager(packageManager);\n if (registry !== DEFAULT_NPM_REGISTRY) {\n logger.info(`Auto-detected registry: ${registry}`);\n }\n } else {\n registry = userOptions.registry;\n }\n\n return {\n ...DEFAULT_OPTIONS,\n dependencies: userOptions.dependencies,\n projectRoot,\n packageManager,\n registry,\n autoInstall: userOptions.autoInstall ?? DEFAULT_OPTIONS.autoInstall,\n debug: userOptions.debug ?? DEFAULT_OPTIONS.debug,\n aliasPrefix: userOptions.aliasPrefix ?? DEFAULT_OPTIONS.aliasPrefix,\n excludeRedirects: userOptions.excludeRedirects ?? {},\n };\n }\n\n /**\n * 初始化解析器\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n logger.info('Initializing dependencies resolver...');\n\n // 验证项目根目录\n const projectRoot = this.userOptions.projectRoot ?? process.cwd();\n const validRoot = findProjectRoot(projectRoot);\n if (!validRoot) {\n throw new Error(`Could not find package.json in ${projectRoot} or parent directories`);\n }\n\n if (validRoot !== projectRoot) {\n logger.debug(`Adjusted project root to: ${validRoot}`);\n }\n\n // 解析配置(包含自动检测)\n this.options = await this.resolveOptions(this.userOptions, validRoot);\n\n // 设置日志级别\n if (this.options.debug) {\n logger.setLevel(LogLevel.DEBUG);\n }\n\n // 初始化子模块\n this.aliasManager = createAliasManager(this.options);\n this.installer = createPackageInstaller(this.options);\n\n // 创建依赖分析器(同步创建,异步分析)\n this.analyzer = createDependencyAnalyzer(this.options);\n\n // 执行分析\n this.analysisResult = await this.analyzer.analyze();\n\n // 输出缺失的 peer 依赖警告(不自动安装,仅提示)\n this.logMissingFirstLevelPeers(this.analysisResult);\n\n // 初始化别名管理器\n this.aliasManager.initFromAnalysisResult(this.analysisResult);\n\n // 调用钩子\n if (this.hooks.onAnalysisComplete) {\n await this.hooks.onAnalysisComplete(this.analysisResult);\n }\n\n // 自动安装\n if (this.options.autoInstall) {\n await this.installDependencies();\n }\n\n this.initialized = true;\n logger.info('Dependencies resolver initialized');\n }\n\n /**\n * 输出第一层依赖中缺失的 peer 依赖警告(不自动安装,仅提示)\n *\n * 放在 initialize 阶段统一输出,避免各插件重复打印,且在 autoInstall=false 时也能看到提示。\n */\n private logMissingFirstLevelPeers(result: AnalysisResult): void {\n const missing = result.missingFirstLevelPeers;\n if (!missing || missing.length === 0) {\n return;\n }\n\n logger.warn(`Found ${missing.length} unsatisfied peer dependencies (not auto-installing):`);\n\n for (const peer of missing) {\n logger.warn(\n ` - ${peer.packageName}@${peer.requiredRange} (required by ${peer.requestedBy})`,\n );\n }\n }\n\n /**\n * 安装所需依赖\n *\n * 安装策略(按用户需求):\n * 1. 只自动安装「主工程已声明的依赖 & peerDeps 要求版本与主工程版本冲突」的别名版本\n * 2. 缺失的 peer 依赖(主工程未声明):不自动安装,只警告\n * 3. 内部依赖冲突(子依赖之间的版本冲突):不自动安装,只做编译时重定向\n *\n * 这样可以避免\"什么依赖都自动安装\"的问题,用户可以根据警告自行决定是否安装缺失的依赖\n */\n async installDependencies(): Promise<void> {\n if (!this.analysisResult) {\n throw new Error('Resolver not initialized. Call initialize() first.');\n }\n\n const { aliasMappings } = this.analysisResult;\n\n // 只安装与主工程版本冲突的别名依赖(用于编译时重定向)\n // aliasMappings 只包含 needsAlias=true 的情况,即主工程已声明且版本冲突\n const aliasResult = await this.installer.installAliases(aliasMappings);\n\n if (!aliasResult.success) {\n logger.warn(`Some alias installations failed: ${aliasResult.errors.join(', ')}`);\n }\n\n // 调用钩子\n if (this.hooks.onInstallComplete) {\n await this.hooks.onInstallComplete(aliasMappings);\n }\n }\n\n /**\n * 解析模块请求\n * @returns 解析后的模块名,如果不需要重定向则返回 null\n */\n resolveModule(request: string, importer?: string): string | null {\n // 检查钩子\n if (this.hooks.beforeResolve) {\n const hookResult = this.hooks.beforeResolve(request, importer);\n if (hookResult !== undefined) {\n return hookResult;\n }\n }\n\n return this.aliasManager.resolveModule({ request, importer });\n }\n\n /**\n * 获取别名路径映射\n * 返回别名名称到实际路径的映射,供构建工具插件转换为各自的格式\n */\n getAliasPathMappings(): AliasPathMapping[] {\n return this.aliasManager.getAliasPathMappings();\n }\n\n /**\n * 获取分析结果\n */\n getAnalysisResult(): AnalysisResult | null {\n return this.analysisResult;\n }\n\n /**\n * 获取配置\n */\n getOptions(): ResolvedOptions {\n return { ...this.options };\n }\n}\n\n/**\n * 创建依赖解析器实例\n */\nexport async function createResolver(\n options: DepsConflictResolverOptions,\n hooks?: PluginHooks,\n): Promise<DepsConflictResolver> {\n const resolver = new DepsConflictResolver(options, hooks);\n await resolver.initialize();\n return resolver;\n}\n"]}
@@ -0,0 +1,67 @@
1
+ import { D as DepsConflictResolverOptions, d as PluginHooks, a as AliasPathMapping, b as AnalysisResult, R as ResolvedOptions } from './config.types-CN7glPbA.js';
2
+
3
+ /**
4
+ * 依赖解析器
5
+ * 整合所有核心模块,提供统一的 API
6
+ */
7
+ declare class DepsConflictResolver {
8
+ private options;
9
+ private userOptions;
10
+ private hooks;
11
+ private environmentDetector;
12
+ private analyzer;
13
+ private aliasManager;
14
+ private installer;
15
+ private analysisResult;
16
+ private initialized;
17
+ constructor(userOptions: DepsConflictResolverOptions, hooks?: PluginHooks);
18
+ /**
19
+ * 解析配置,填充默认值(异步,支持自动检测)
20
+ */
21
+ private resolveOptions;
22
+ /**
23
+ * 初始化解析器
24
+ */
25
+ initialize(): Promise<void>;
26
+ /**
27
+ * 输出第一层依赖中缺失的 peer 依赖警告(不自动安装,仅提示)
28
+ *
29
+ * 放在 initialize 阶段统一输出,避免各插件重复打印,且在 autoInstall=false 时也能看到提示。
30
+ */
31
+ private logMissingFirstLevelPeers;
32
+ /**
33
+ * 安装所需依赖
34
+ *
35
+ * 安装策略(按用户需求):
36
+ * 1. 只自动安装「主工程已声明的依赖 & peerDeps 要求版本与主工程版本冲突」的别名版本
37
+ * 2. 缺失的 peer 依赖(主工程未声明):不自动安装,只警告
38
+ * 3. 内部依赖冲突(子依赖之间的版本冲突):不自动安装,只做编译时重定向
39
+ *
40
+ * 这样可以避免"什么依赖都自动安装"的问题,用户可以根据警告自行决定是否安装缺失的依赖
41
+ */
42
+ installDependencies(): Promise<void>;
43
+ /**
44
+ * 解析模块请求
45
+ * @returns 解析后的模块名,如果不需要重定向则返回 null
46
+ */
47
+ resolveModule(request: string, importer?: string): string | null;
48
+ /**
49
+ * 获取别名路径映射
50
+ * 返回别名名称到实际路径的映射,供构建工具插件转换为各自的格式
51
+ */
52
+ getAliasPathMappings(): AliasPathMapping[];
53
+ /**
54
+ * 获取分析结果
55
+ */
56
+ getAnalysisResult(): AnalysisResult | null;
57
+ /**
58
+ * 获取配置
59
+ */
60
+ getOptions(): ResolvedOptions;
61
+ }
62
+ /**
63
+ * 创建依赖解析器实例
64
+ */
65
+ declare function createResolver(options: DepsConflictResolverOptions, hooks?: PluginHooks): Promise<DepsConflictResolver>;
66
+
67
+ export { DepsConflictResolver as D, createResolver as c };
@@ -0,0 +1,67 @@
1
+ import { D as DepsConflictResolverOptions, d as PluginHooks, a as AliasPathMapping, b as AnalysisResult, R as ResolvedOptions } from './config.types-CN7glPbA.cjs';
2
+
3
+ /**
4
+ * 依赖解析器
5
+ * 整合所有核心模块,提供统一的 API
6
+ */
7
+ declare class DepsConflictResolver {
8
+ private options;
9
+ private userOptions;
10
+ private hooks;
11
+ private environmentDetector;
12
+ private analyzer;
13
+ private aliasManager;
14
+ private installer;
15
+ private analysisResult;
16
+ private initialized;
17
+ constructor(userOptions: DepsConflictResolverOptions, hooks?: PluginHooks);
18
+ /**
19
+ * 解析配置,填充默认值(异步,支持自动检测)
20
+ */
21
+ private resolveOptions;
22
+ /**
23
+ * 初始化解析器
24
+ */
25
+ initialize(): Promise<void>;
26
+ /**
27
+ * 输出第一层依赖中缺失的 peer 依赖警告(不自动安装,仅提示)
28
+ *
29
+ * 放在 initialize 阶段统一输出,避免各插件重复打印,且在 autoInstall=false 时也能看到提示。
30
+ */
31
+ private logMissingFirstLevelPeers;
32
+ /**
33
+ * 安装所需依赖
34
+ *
35
+ * 安装策略(按用户需求):
36
+ * 1. 只自动安装「主工程已声明的依赖 & peerDeps 要求版本与主工程版本冲突」的别名版本
37
+ * 2. 缺失的 peer 依赖(主工程未声明):不自动安装,只警告
38
+ * 3. 内部依赖冲突(子依赖之间的版本冲突):不自动安装,只做编译时重定向
39
+ *
40
+ * 这样可以避免"什么依赖都自动安装"的问题,用户可以根据警告自行决定是否安装缺失的依赖
41
+ */
42
+ installDependencies(): Promise<void>;
43
+ /**
44
+ * 解析模块请求
45
+ * @returns 解析后的模块名,如果不需要重定向则返回 null
46
+ */
47
+ resolveModule(request: string, importer?: string): string | null;
48
+ /**
49
+ * 获取别名路径映射
50
+ * 返回别名名称到实际路径的映射,供构建工具插件转换为各自的格式
51
+ */
52
+ getAliasPathMappings(): AliasPathMapping[];
53
+ /**
54
+ * 获取分析结果
55
+ */
56
+ getAnalysisResult(): AnalysisResult | null;
57
+ /**
58
+ * 获取配置
59
+ */
60
+ getOptions(): ResolvedOptions;
61
+ }
62
+ /**
63
+ * 创建依赖解析器实例
64
+ */
65
+ declare function createResolver(options: DepsConflictResolverOptions, hooks?: PluginHooks): Promise<DepsConflictResolver>;
66
+
67
+ export { DepsConflictResolver as D, createResolver as c };