{"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":["dirname","readFileSync","existsSync","join","pathToFileURL","createRequire","fs","logger","relative","parseYaml","semver","spawn"],"mappings":"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","file":"index.cjs","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';\r\nimport { join, dirname } from 'path';\r\nimport { createRequire } from 'module';\r\nimport { pathToFileURL } from 'url';\r\nimport type { PackageJson } from '../types/index';\r\nimport { LruCache } from './lru-cache';\r\n\r\n/**\r\n * 从 startDir 开始向上遍历父目录（包含 startDir 与根目录）\r\n * 用于统一实现“向上查找”的逻辑，避免各处重复 while 循环。\r\n */\r\nexport function* iterateParentDirs(startDir: string): Generator<string> {\r\n  let currentDir = startDir;\r\n\r\n  while (true) {\r\n    yield currentDir;\r\n\r\n    const parentDir = dirname(currentDir);\r\n    if (parentDir === currentDir) {\r\n      break; // 到达根目录\r\n    }\r\n\r\n    currentDir = parentDir;\r\n  }\r\n}\r\n\r\n/**\r\n * package.json 读取缓存，避免重复 IO 操作\r\n */\r\nconst DEFAULT_PACKAGE_JSON_CACHE_MAX_ENTRIES = 5000;\r\nconst packageJsonCache = new LruCache<string, PackageJson | null>({\r\n  maxEntries: DEFAULT_PACKAGE_JSON_CACHE_MAX_ENTRIES,\r\n});\r\n\r\n/**\r\n * require() 实例缓存（按 baseDir）\r\n * - findPackagePath 会频繁 createRequire，缓存可显著减少开销\r\n */\r\ntype RequireFn = ReturnType<typeof createRequire>;\r\n\r\nconst DEFAULT_REQUIRE_CACHE_MAX_ENTRIES = 200;\r\nconst requireCache = new LruCache<string, RequireFn>({\r\n  maxEntries: DEFAULT_REQUIRE_CACHE_MAX_ENTRIES,\r\n});\r\n\r\n/**\r\n * 包路径解析缓存（按 baseDir + packageName）\r\n * - 缓存 null，避免重复探测\r\n */\r\nconst DEFAULT_PACKAGE_PATH_CACHE_MAX_ENTRIES = 20000;\r\nconst packagePathCache = new LruCache<string, string | null>({\r\n  maxEntries: DEFAULT_PACKAGE_PATH_CACHE_MAX_ENTRIES,\r\n});\r\n\r\n/**\r\n * 清理 package.json 缓存，释放内存\r\n */\r\nexport function clearPackageJsonCache(): void {\r\n  packageJsonCache.clear();\r\n  packagePathCache.clear();\r\n  requireCache.clear();\r\n}\r\n\r\n/**\r\n * 同步读取 JSON 文件（性能更好，减少事件循环开销）\r\n */\r\nfunction readJsonFileSync<T = unknown>(filePath: string): T | null {\r\n  try {\r\n    const content = readFileSync(filePath, 'utf-8');\r\n    return JSON.parse(content) as T;\r\n  } catch {\r\n    return null;\r\n  }\r\n}\r\n\r\n/**\r\n * 检查文件是否存在\r\n */\r\nexport function fileExists(filePath: string): boolean {\r\n  return existsSync(filePath);\r\n}\r\n\r\n/**\r\n * 读取 package.json（带缓存）\r\n * 使用同步读取以减少事件循环开销\r\n */\r\nexport function readPackageJsonCached(dir: string): PackageJson | null {\r\n  const pkgPath = join(dir, 'package.json');\r\n\r\n  const cached = packageJsonCache.get(pkgPath);\r\n  if (cached !== undefined) {\r\n    return cached;\r\n  }\r\n\r\n  // 使用同步读取，性能更好\r\n  const result = readJsonFileSync<PackageJson>(pkgPath);\r\n  // 缓存结果（包含 null，避免重复 IO 探测）\r\n  packageJsonCache.set(pkgPath, result);\r\n  return result;\r\n}\r\n\r\n/**\r\n * 查找项目根目录（通过向上查找 package.json）\r\n */\r\nexport function findProjectRoot(startDir: string): string | null {\r\n  for (const dir of iterateParentDirs(startDir)) {\r\n    if (fileExists(join(dir, 'package.json'))) {\r\n      return dir;\r\n    }\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\n/**\r\n * 查找 node_modules 中的包路径\r\n * 使用 require.resolve 机制来正确处理各种包管理器（npm, yarn, pnpm）的依赖结构\r\n */\r\nexport function findPackagePath(packageName: string, baseDir: string): string | null {\r\n  const cacheKey = `${baseDir}\\0${packageName}`;\r\n  const cached = packagePathCache.get(cacheKey);\r\n  if (cached !== undefined) {\r\n    return cached;\r\n  }\r\n\r\n  try {\r\n    // 使用 createRequire 创建一个基于 baseDir 的 require 函数\r\n    // 这样可以正确处理 ESM 和 CJS，以及各种包管理器的依赖结构\r\n    let localRequire = requireCache.get(baseDir);\r\n    if (!localRequire) {\r\n      const baseUrl = pathToFileURL(join(baseDir, 'package.json')).href;\r\n      localRequire = createRequire(baseUrl);\r\n      requireCache.set(baseDir, localRequire);\r\n    }\r\n\r\n    const pkgJsonPath = localRequire.resolve(`${packageName}/package.json`);\r\n    const resolved = dirname(pkgJsonPath);\r\n    packagePathCache.set(cacheKey, resolved);\r\n    return resolved;\r\n  } catch {\r\n    // 如果 require.resolve 失败，回退到手动查找\r\n    // 这处理了一些边缘情况，比如包没有正确导出 package.json\r\n    const resolved = findPackagePathFallback(packageName, baseDir);\r\n    packagePathCache.set(cacheKey, resolved);\r\n    return resolved;\r\n  }\r\n}\r\n\r\n/**\r\n * 回退的包路径查找方法\r\n * 当 require.resolve 失败时使用（例如包没有导出 package.json）\r\n */\r\nfunction findPackagePathFallback(packageName: string, baseDir: string): string | null {\r\n  for (const dir of iterateParentDirs(baseDir)) {\r\n    const candidatePath = join(dir, 'node_modules', packageName);\r\n    if (fileExists(candidatePath)) {\r\n      return candidatePath;\r\n    }\r\n  }\r\n\r\n  return null;\r\n}\r\n","import { promises as fs } from 'fs';\r\nimport { join } from 'path';\r\nimport { createLogger } from '../utils/logger';\r\nimport { fileExists, iterateParentDirs, readPackageJsonCached } from '../utils/fs';\r\nimport { DEFAULT_NPM_REGISTRY, LOCK_FILE_MAP } from '../constants';\r\nimport type { PackageManagerType, PackageManagerDetectionResult } from '../types/index';\r\n\r\nconst logger = createLogger('environment-detector');\r\n\r\n/**\r\n * 环境检测器\r\n * 负责检测项目使用的包管理器和 registry\r\n */\r\nexport class EnvironmentDetector {\r\n  private projectRoot: string;\r\n  private detectionResult: PackageManagerDetectionResult | null = null;\r\n  private registryCache: string | null = null;\r\n\r\n  constructor(projectRoot: string) {\r\n    this.projectRoot = projectRoot;\r\n  }\r\n\r\n  /**\r\n   * 获取检测到的包管理器类型\r\n   */\r\n  getPackageManager(): PackageManagerType {\r\n    const result = this.detect();\r\n    return result.packageManager;\r\n  }\r\n\r\n  /**\r\n   * 获取检测到的 registry\r\n   */\r\n  async getRegistry(): Promise<string> {\r\n    if (this.registryCache) {\r\n      return this.registryCache;\r\n    }\r\n\r\n    const result = this.detect();\r\n    this.registryCache = await this.detectRegistry(result.packageManager);\r\n    return this.registryCache;\r\n  }\r\n\r\n  /**\r\n   * 获取指定包管理器的 registry（兼容旧 API）\r\n   */\r\n  async getRegistryForPackageManager(packageManager: PackageManagerType): Promise<string> {\r\n    return this.detectRegistry(packageManager);\r\n  }\r\n\r\n  /**\r\n   * 获取完整的检测结果\r\n   */\r\n  getDetectionResult(): PackageManagerDetectionResult {\r\n    return this.detect();\r\n  }\r\n\r\n  /**\r\n   * 重置缓存，强制重新检测\r\n   */\r\n  reset(): void {\r\n    this.detectionResult = null;\r\n    this.registryCache = null;\r\n  }\r\n\r\n  /**\r\n   * 更新项目根目录\r\n   */\r\n  setProjectRoot(projectRoot: string): void {\r\n    this.projectRoot = projectRoot;\r\n    this.reset();\r\n  }\r\n\r\n  /**\r\n   * 检测项目使用的包管理器\r\n   *\r\n   * 检测优先级：\r\n   * 1. package.json 中的 packageManager 字段（如 \"pnpm@8.0.0\"）- 向上遍历查找\r\n   * 2. lock 文件存在 - 向上遍历查找（支持 monorepo）\r\n   * 3. 默认为 npm\r\n   */\r\n  private detect(): PackageManagerDetectionResult {\r\n    if (this.detectionResult) {\r\n      return this.detectionResult;\r\n    }\r\n\r\n    for (const currentDir of iterateParentDirs(this.projectRoot)) {\r\n      const pkgJsonPath = join(currentDir, 'package.json');\r\n      if (fileExists(pkgJsonPath)) {\r\n        const pkgJson = readPackageJsonCached(currentDir);\r\n        // eslint(type): 显式标注避免 no-unsafe 报错\r\n        const pmField: string | undefined = pkgJson?.packageManager;\r\n        if (pmField) {\r\n          const pm = this.parsePackageManagerField(pmField);\r\n          if (pm) {\r\n            logger.debug(`Detected package manager from package.json: ${pm} (at ${currentDir})`);\r\n            this.detectionResult = {\r\n              packageManager: pm,\r\n              detectedFrom: 'packageJson',\r\n              rootDir: currentDir,\r\n            };\r\n            return this.detectionResult;\r\n          }\r\n        }\r\n      }\r\n\r\n      for (const [lockFile, pm] of Object.entries(LOCK_FILE_MAP)) {\r\n        if (fileExists(join(currentDir, lockFile))) {\r\n          logger.debug(\r\n            `Detected package manager from lock file: ${pm} (${lockFile} at ${currentDir})`,\r\n          );\r\n          this.detectionResult = {\r\n            packageManager: pm,\r\n            detectedFrom: 'lockfile',\r\n            rootDir: currentDir,\r\n          };\r\n          return this.detectionResult;\r\n        }\r\n      }\r\n    }\r\n\r\n    logger.debug('No lock file found, defaulting to npm');\r\n    this.detectionResult = {\r\n      packageManager: 'npm',\r\n      detectedFrom: 'default',\r\n    };\r\n    return this.detectionResult;\r\n  }\r\n\r\n  /**\r\n   * 解析 package.json 中的 packageManager 字段\r\n   * 格式如：pnpm@8.0.0, yarn@3.2.0, npm@9.0.0\r\n   */\r\n  private parsePackageManagerField(value: string): PackageManagerType | null {\r\n    const match = value.match(/^(npm|yarn|pnpm)(@|$)/);\r\n    if (match) {\r\n      return match[1] as PackageManagerType;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * 检测项目使用的 registry\r\n   *\r\n   * 检测优先级：\r\n   * 1. 项目级 .npmrc（向上遍历，覆盖 monorepo 子包场景）\r\n   * 2. 用户级 .npmrc\r\n   * 3. 包管理器特定配置\r\n   * 4. 默认 registry\r\n   */\r\n  private async detectRegistry(packageManager: PackageManagerType): Promise<string> {\r\n    const defaultRegistry = DEFAULT_NPM_REGISTRY;\r\n\r\n    // 1. 从 projectRoot 向上遍历查找 .npmrc（覆盖 monorepo 子包场景）\r\n    for (const dir of iterateParentDirs(this.projectRoot)) {\r\n      const npmrcPath = join(dir, '.npmrc');\r\n      if (fileExists(npmrcPath)) {\r\n        const registry = await this.parseRegistryFromNpmrc(npmrcPath);\r\n        if (registry) {\r\n          logger.debug(`Detected registry from .npmrc: ${registry} (at ${dir})`);\r\n          return registry;\r\n        }\r\n      }\r\n    }\r\n\r\n    // 2. 检查用户级配置\r\n    const homeDir = process.env.HOME ?? process.env.USERPROFILE ?? '';\r\n    if (homeDir) {\r\n      // 检查 .npmrc\r\n      const userNpmrc = join(homeDir, '.npmrc');\r\n      if (fileExists(userNpmrc)) {\r\n        const registry = await this.parseRegistryFromNpmrc(userNpmrc);\r\n        if (registry) {\r\n          logger.debug(`Detected registry from user .npmrc: ${registry}`);\r\n          return registry;\r\n        }\r\n      }\r\n\r\n      // 检查 pnpm 配置（如果是 pnpm）\r\n      if (packageManager === 'pnpm') {\r\n        const pnpmConfig = join(homeDir, '.pnpmrc');\r\n        if (fileExists(pnpmConfig)) {\r\n          const registry = await this.parseRegistryFromNpmrc(pnpmConfig);\r\n          if (registry) {\r\n            logger.debug(`Detected registry from .pnpmrc: ${registry}`);\r\n            return registry;\r\n          }\r\n        }\r\n      }\r\n\r\n      // 检查 yarn 配置（如果是 yarn）—— 向上遍历查找 .yarnrc.yml（覆盖 monorepo 子包场景）\r\n      if (packageManager === 'yarn') {\r\n        for (const dir of iterateParentDirs(this.projectRoot)) {\r\n          const yarnrc = join(dir, '.yarnrc.yml');\r\n          if (fileExists(yarnrc)) {\r\n            const registry = await this.parseRegistryFromYarnrc(yarnrc);\r\n            if (registry) {\r\n              logger.debug(`Detected registry from .yarnrc.yml: ${registry} (at ${dir})`);\r\n              return registry;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    logger.debug(`Using default registry: ${defaultRegistry}`);\r\n    return defaultRegistry;\r\n  }\r\n\r\n  /**\r\n   * 从 .npmrc 文件解析 registry\r\n   */\r\n  private async parseRegistryFromNpmrc(filePath: string): Promise<string | null> {\r\n    try {\r\n      const content = await fs.readFile(filePath, 'utf-8');\r\n      const lines = content.split('\\n');\r\n\r\n      for (const line of lines) {\r\n        const trimmed = line.trim();\r\n        // 跳过注释和空行\r\n        if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith(';')) {\r\n          continue;\r\n        }\r\n\r\n        // 匹配 registry=xxx 或 registry = xxx\r\n        const match = trimmed.match(/^registry\\s*=\\s*(.+)$/i);\r\n        if (match?.[1]) {\r\n          return match[1].trim().replace(/[\"']/g, '');\r\n        }\r\n      }\r\n    } catch {\r\n      // 忽略读取错误\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * 从 .yarnrc.yml 文件解析 registry\r\n   */\r\n  private async parseRegistryFromYarnrc(filePath: string): Promise<string | null> {\r\n    try {\r\n      const content = await fs.readFile(filePath, 'utf-8');\r\n      const lines = content.split('\\n');\r\n\r\n      for (const line of lines) {\r\n        const trimmed = line.trim();\r\n        // 匹配 npmRegistryServer: xxx\r\n        const match = trimmed.match(/^npmRegistryServer:\\s*[\"']?(.+?)[\"']?\\s*$/);\r\n        if (match?.[1]) {\r\n          return match[1];\r\n        }\r\n      }\r\n    } catch {\r\n      // 忽略读取错误\r\n    }\r\n\r\n    return null;\r\n  }\r\n}\r\n\r\n/**\r\n * 创建环境检测器实例\r\n */\r\nexport function createEnvironmentDetector(projectRoot: string): EnvironmentDetector {\r\n  return new EnvironmentDetector(projectRoot);\r\n}\r\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';\r\nimport { join, relative } from 'path';\r\nimport { parse as parseYaml } from 'yaml';\r\nimport { createLogger } from '../utils/logger';\r\nimport { fileExists, iterateParentDirs, readPackageJsonCached } from '../utils/fs';\r\nimport { parseNpmAlias } from '../utils/version-spec';\r\nimport type {\r\n  PnpmWorkspaceConfig,\r\n  WorkspaceDetectionResult,\r\n  CatalogResolution,\r\n  WorkspaceAliasInfo,\r\n} from '../types/index';\r\n\r\nconst logger = createLogger('workspace-detector');\r\n\r\n/** 版本协议类型 */\r\ntype VersionProtocol = 'catalog' | 'workspace' | 'npm' | 'file' | 'link' | 'portal' | 'normal';\r\n\r\n/** 协议前缀到类型的映射 */\r\nconst PROTOCOL_PREFIXES: Record<string, VersionProtocol> = {\r\n  'catalog:': 'catalog',\r\n  'workspace:': 'workspace',\r\n  'npm:': 'npm',\r\n  'file:': 'file',\r\n  'link:': 'link',\r\n  'portal:': 'portal',\r\n};\r\n\r\n/**\r\n * 从依赖对象中提取指定包的别名\r\n */\r\nfunction extractAliasesFromDeps(\r\n  deps: Record<string, string> | undefined,\r\n  targetPackage: string,\r\n  definedIn: string,\r\n  existingAliases: Set<string>,\r\n): WorkspaceAliasInfo[] {\r\n  if (!deps) return [];\r\n\r\n  const aliases: WorkspaceAliasInfo[] = [];\r\n\r\n  for (const [aliasName, versionSpec] of Object.entries(deps)) {\r\n    if (typeof versionSpec !== 'string') continue;\r\n    if (existingAliases.has(aliasName)) continue;\r\n\r\n    const parsed = parseNpmAlias(versionSpec);\r\n    if (parsed && parsed[0] === targetPackage) {\r\n      aliases.push({\r\n        aliasName,\r\n        targetPackage,\r\n        versionSpec: parsed[1],\r\n        definedIn,\r\n        isWorkspaceRoot: true,\r\n      });\r\n      existingAliases.add(aliasName);\r\n\r\n      logger.debug(`Found alias: ${aliasName} -> ${targetPackage}@${parsed[1]} (in ${definedIn})`);\r\n    }\r\n  }\r\n\r\n  return aliases;\r\n}\r\n\r\n/**\r\n * Workspace 检测器\r\n * 负责检测 monorepo 结构、解析 catalog 协议、查找 workspace 级别别名\r\n */\r\nexport class WorkspaceDetector {\r\n  private projectRoot: string;\r\n  private detectionResult: WorkspaceDetectionResult | null = null;\r\n\r\n  constructor(projectRoot: string) {\r\n    this.projectRoot = projectRoot;\r\n  }\r\n\r\n  /**\r\n   * 获取 workspace 检测结果\r\n   */\r\n  detect(): WorkspaceDetectionResult {\r\n    if (this.detectionResult) {\r\n      return this.detectionResult;\r\n    }\r\n\r\n    this.detectionResult = this.detectWorkspace();\r\n    return this.detectionResult;\r\n  }\r\n\r\n  /**\r\n   * 重置缓存\r\n   */\r\n  reset(): void {\r\n    this.detectionResult = null;\r\n  }\r\n\r\n  /**\r\n   * 解析 catalog: 协议的版本\r\n   * @param packageName 包名\r\n   * @param versionSpec 版本规格（如 \"catalog:\" 或 \"catalog:react17\"）\r\n   */\r\n  resolveCatalogVersion(\r\n    packageName: string,\r\n    versionSpec: string,\r\n  ): CatalogResolution {\r\n    const result: CatalogResolution = {\r\n      original: versionSpec,\r\n      resolved: null,\r\n      catalogName: 'default',\r\n      success: false,\r\n    };\r\n\r\n    // 解析 catalog 名称\r\n    if (versionSpec === 'catalog:' || versionSpec === 'catalog:default') {\r\n      result.catalogName = 'default';\r\n    } else if (versionSpec.startsWith('catalog:')) {\r\n      result.catalogName = versionSpec.slice('catalog:'.length);\r\n    } else {\r\n      // 不是 catalog 协议\r\n      return result;\r\n    }\r\n\r\n    const workspace = this.detect();\r\n    if (!workspace.isMonorepo || !workspace.workspaceRoot) {\r\n      logger.warn(`Cannot resolve catalog: protocol - not in a monorepo`);\r\n      return result;\r\n    }\r\n\r\n    // 从 catalog 中查找版本\r\n    if (result.catalogName === 'default') {\r\n      // 默认 catalog\r\n      const version = workspace.catalog?.[packageName];\r\n      if (version) {\r\n        result.resolved = version;\r\n        result.success = true;\r\n        logger.debug(`Resolved ${packageName} from default catalog: ${version}`);\r\n      }\r\n    } else {\r\n      // 命名 catalog\r\n      const namedCatalog = workspace.catalogs?.[result.catalogName];\r\n      if (namedCatalog) {\r\n        const version = namedCatalog[packageName];\r\n        if (version) {\r\n          result.resolved = version;\r\n          result.success = true;\r\n          logger.debug(`Resolved ${packageName} from catalog:${result.catalogName}: ${version}`);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!result.success) {\r\n      logger.warn(`Package \"${packageName}\" not found in catalog:${result.catalogName}`);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * 解析版本规格（支持各种特殊协议）\r\n   * @param packageName 包名\r\n   * @param versionSpec 版本规格\r\n   * @returns 解析后的普通版本范围，或 null（如无法解析）\r\n   */\r\n  resolveVersionSpec(packageName: string, versionSpec: string): string | null {\r\n    const protocol = this.getVersionProtocol(versionSpec);\r\n\r\n    switch (protocol) {\r\n      case 'catalog': {\r\n        const resolution = this.resolveCatalogVersion(packageName, versionSpec);\r\n        return resolution.resolved;\r\n      }\r\n      case 'workspace':\r\n      case 'file':\r\n      case 'link':\r\n      case 'portal':\r\n        // 这些协议无法确定具体版本，返回 * 让其匹配任何版本\r\n        return '*';\r\n      case 'npm': {\r\n        const parsed = parseNpmAlias(versionSpec);\r\n        return parsed?.[1] ?? null;\r\n      }\r\n      default:\r\n        // 普通版本号或范围\r\n        return versionSpec;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 判断版本规格的协议类型\r\n   */\r\n  getVersionProtocol(versionSpec: string): VersionProtocol {\r\n    for (const [prefix, protocol] of Object.entries(PROTOCOL_PREFIXES)) {\r\n      if (versionSpec.startsWith(prefix)) {\r\n        return protocol;\r\n      }\r\n    }\r\n\r\n    return 'normal';\r\n  }\r\n\r\n  /**\r\n   * 从 workspace 根目录和 catalog 中查找已存在的别名\r\n   */\r\n  findWorkspaceAliases(targetPackage: string): WorkspaceAliasInfo[] {\r\n    const workspace = this.detect();\r\n\r\n    if (!workspace.isMonorepo || !workspace.workspaceRoot) {\r\n      return [];\r\n    }\r\n\r\n    const existingAliases = new Set<string>();\r\n    const aliases: WorkspaceAliasInfo[] = [];\r\n    const catalogPath = join(workspace.workspaceRoot, 'pnpm-workspace.yaml');\r\n\r\n    // 1. 从 catalog 中查找别名（pnpm workspace 特有）\r\n    if (workspace.workspaceType === 'pnpm') {\r\n      // 检查默认 catalog\r\n      aliases.push(\r\n        ...extractAliasesFromDeps(workspace.catalog, targetPackage, catalogPath, existingAliases),\r\n      );\r\n\r\n      // 检查命名 catalogs\r\n      if (workspace.catalogs) {\r\n        for (const catalog of Object.values(workspace.catalogs)) {\r\n          aliases.push(\r\n            ...extractAliasesFromDeps(catalog, targetPackage, catalogPath, existingAliases),\r\n          );\r\n        }\r\n      }\r\n    }\r\n\r\n    // 2. 从 workspace 根目录的 package.json 查找别名\r\n    const rootPkgPath = join(workspace.workspaceRoot, 'package.json');\r\n    const rootPkgJson = readPackageJsonCached(workspace.workspaceRoot);\r\n    if (rootPkgJson) {\r\n      aliases.push(\r\n        ...extractAliasesFromDeps(\r\n          rootPkgJson.dependencies,\r\n          targetPackage,\r\n          rootPkgPath,\r\n          existingAliases,\r\n        ),\r\n        ...extractAliasesFromDeps(\r\n          rootPkgJson.devDependencies,\r\n          targetPackage,\r\n          rootPkgPath,\r\n          existingAliases,\r\n        ),\r\n      );\r\n    }\r\n\r\n    return aliases;\r\n  }\r\n\r\n  /**\r\n   * 获取 workspace 根目录\r\n   */\r\n  getWorkspaceRoot(): string | null {\r\n    const result = this.detect();\r\n    return result.workspaceRoot;\r\n  }\r\n\r\n  /**\r\n   * 检测 workspace\r\n   */\r\n  private detectWorkspace(): WorkspaceDetectionResult {\r\n    for (const dir of iterateParentDirs(this.projectRoot)) {\r\n      // 尝试检测各种 workspace 类型\r\n      const result = this.tryDetectWorkspaceAt(dir);\r\n      if (result) {\r\n        return result;\r\n      }\r\n    }\r\n\r\n    // 不在 monorepo 中\r\n    return {\r\n      isMonorepo: false,\r\n      workspaceRoot: null,\r\n      workspaceType: 'none',\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 尝试在指定目录检测 workspace\r\n   */\r\n  private tryDetectWorkspaceAt(dir: string): WorkspaceDetectionResult | null {\r\n    // 1. 检查 pnpm-workspace.yaml（pnpm monorepo）\r\n    const pnpmWorkspacePath = join(dir, 'pnpm-workspace.yaml');\r\n    if (fileExists(pnpmWorkspacePath)) {\r\n      const config = this.parsePnpmWorkspaceYaml(pnpmWorkspacePath);\r\n      logger.debug(`Detected pnpm workspace at: ${dir}`);\r\n\r\n      return {\r\n        isMonorepo: true,\r\n        workspaceRoot: dir,\r\n        currentProjectPath: relative(dir, this.projectRoot) || '.',\r\n        workspaceType: 'pnpm',\r\n        catalog: config.catalog,\r\n        catalogs: config.catalogs,\r\n      };\r\n    }\r\n\r\n    // 2. 检查 package.json 中的 workspaces 字段（yarn/npm workspaces）\r\n    const pkgJson = readPackageJsonCached(dir);\r\n    if (pkgJson?.workspaces) {\r\n      const isYarn = fileExists(join(dir, 'yarn.lock'));\r\n      const workspaceType = isYarn ? 'yarn' : 'npm';\r\n      logger.debug(`Detected ${workspaceType} workspace at: ${dir}`);\r\n\r\n      return {\r\n        isMonorepo: true,\r\n        workspaceRoot: dir,\r\n        currentProjectPath: relative(dir, this.projectRoot) || '.',\r\n        workspaceType,\r\n      };\r\n    }\r\n\r\n    // 3. 检查 lerna.json\r\n    if (fileExists(join(dir, 'lerna.json'))) {\r\n      logger.debug(`Detected lerna workspace at: ${dir}`);\r\n\r\n      return {\r\n        isMonorepo: true,\r\n        workspaceRoot: dir,\r\n        currentProjectPath: relative(dir, this.projectRoot) || '.',\r\n        workspaceType: 'lerna',\r\n      };\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * 解析 pnpm-workspace.yaml\r\n   */\r\n  private parsePnpmWorkspaceYaml(filePath: string): PnpmWorkspaceConfig {\r\n    try {\r\n      const content = readFileSync(filePath, 'utf-8');\r\n      const parsed = parseYaml(content) as PnpmWorkspaceConfig | null;\r\n      return parsed ?? {};\r\n    } catch (error) {\r\n      logger.warn(`Failed to parse pnpm-workspace.yaml: ${String(error)}`);\r\n      return {};\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 创建 Workspace 检测器实例\r\n */\r\nexport function createWorkspaceDetector(projectRoot: string): WorkspaceDetector {\r\n  return new WorkspaceDetector(projectRoot);\r\n}\r\n","import semver from 'semver';\r\n\r\n/**\r\n * 检查版本是否满足版本范围\r\n */\r\nexport function satisfies(version: string, range: string): boolean {\r\n  try {\r\n    return semver.satisfies(version, range, { includePrerelease: false });\r\n  } catch {\r\n    return false;\r\n  }\r\n}\r\n\r\n/**\r\n * 比较两个版本\r\n * @returns -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2；无法解析时视为相等\r\n */\r\nexport function compare(v1: string, v2: string): -1 | 0 | 1 {\r\n  try {\r\n    return semver.compare(v1, v2);\r\n  } catch {\r\n    return 0;\r\n  }\r\n}\r\n\r\n/**\r\n * 找出满足所有版本范围的版本（交集）\r\n * @param versions 可用版本列表\r\n * @param ranges 版本范围列表\r\n * @returns 满足所有范围的版本列表\r\n */\r\nexport function findIntersection(versions: string[], ranges: string[]): string[] {\r\n  if (ranges.length === 0) return versions;\r\n\r\n  return versions.filter(version => {\r\n    return ranges.every(range => satisfies(version, range));\r\n  });\r\n}\r\n\r\n/**\r\n * 从版本列表中找出满足所有范围的最新版本\r\n */\r\nexport function findBestVersion(versions: string[], ranges: string[]): string | null {\r\n  const satisfyingVersions = findIntersection(versions, ranges);\r\n\r\n  if (satisfyingVersions.length === 0) {\r\n    return null;\r\n  }\r\n\r\n  let best = satisfyingVersions[0]!;\r\n  for (let i = 1; i < satisfyingVersions.length; i++) {\r\n    if (compare(satisfyingVersions[i]!, best) > 0) {\r\n      best = satisfyingVersions[i]!;\r\n    }\r\n  }\r\n  return best;\r\n}\r\n\r\n/**\r\n * 检查两个版本范围是否有交集\r\n */\r\nexport function rangesIntersect(range1: string, range2: string): boolean {\r\n  try {\r\n    const intersection = semver.intersects(range1, range2);\r\n    return intersection;\r\n  } catch {\r\n    return false;\r\n  }\r\n}\r\n\r\n/**\r\n * 生成 npm 别名安装字符串\r\n */\r\nexport function createAliasInstallSpec(\r\n  alias: string,\r\n  packageName: string,\r\n  version: string,\r\n): string {\r\n  return `${alias}@npm:${packageName}@${version}`;\r\n}\r\n\r\n/**\r\n * 生成别名名称\r\n * 例如 vue + 2.6.14 -> vue2\r\n */\r\nexport function generateAliasName(packageName: string, version: string): string {\r\n  let major: number;\r\n  try {\r\n    major = semver.major(version);\r\n  } catch {\r\n    // 非标准版本号：取第一段数字，兜底为 0\r\n    const m = version.match(/^(\\d+)/);\r\n    major = m ? Number(m[1]) : 0;\r\n  }\r\n  const cleanName = packageName.replace(/^@/, '').replace(/\\//g, '-');\r\n  return `${cleanName}${major}`;\r\n}\r\n","import type { NpmPackageInfo } from '../types/index';\r\nimport { createLogger } from '../utils/logger';\r\nimport { DEFAULT_NPM_REGISTRY, DEFAULT_NPM_REGISTRY_TIMEOUT_MS } from '../constants';\r\n\r\nconst logger = createLogger('npm-registry');\r\n\r\n/**\r\n * NPM 注册表缓存\r\n */\r\nconst packageCache = new Map<string, NpmPackageInfo>();\r\n\r\nexport function clearNpmRegistryCache(): void {\r\n  packageCache.clear();\r\n}\r\n\r\n/**\r\n * 带超时的 fetch\r\n */\r\nasync function fetchWithTimeout(\r\n  url: string,\r\n  options: RequestInit = {},\r\n  timeout = DEFAULT_NPM_REGISTRY_TIMEOUT_MS,\r\n): Promise<Response> {\r\n  const controller = new AbortController();\r\n  const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n  try {\r\n    const response = await fetch(url, {\r\n      ...options,\r\n      signal: controller.signal,\r\n    });\r\n    return response;\r\n  } finally {\r\n    clearTimeout(timeoutId);\r\n  }\r\n}\r\n\r\n/**\r\n * 从 NPM 注册表获取包信息\r\n */\r\nasync function fetchPackageInfo(\r\n  packageName: string,\r\n  registry = DEFAULT_NPM_REGISTRY,\r\n): Promise<NpmPackageInfo | null> {\r\n  // 检查缓存\r\n  const cacheKey = `${registry}:${packageName}`;\r\n  const cached = packageCache.get(cacheKey);\r\n  if (cached) {\r\n    return cached;\r\n  }\r\n\r\n  try {\r\n    // 处理作用域包的 URL 编码\r\n    const encodedName = packageName.startsWith('@')\r\n      ? `@${encodeURIComponent(packageName.slice(1))}`\r\n      : packageName;\r\n\r\n    const url = `${registry}/${encodedName}`;\r\n    logger.debug(`Fetching package info from: ${url}`);\r\n\r\n    const response = await fetchWithTimeout(url, {\r\n      headers: {\r\n        Accept: 'application/vnd.npm.install-v1+json',\r\n      },\r\n    });\r\n\r\n    if (!response.ok) {\r\n      if (response.status === 404) {\r\n        logger.warn(`Package not found: ${packageName}`);\r\n        return null;\r\n      }\r\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n    }\r\n\r\n    const data = (await response.json()) as {\r\n      name: string;\r\n      versions: Record<\r\n        string,\r\n        {\r\n          dependencies?: Record<string, string>;\r\n          peerDependencies?: Record<string, string>;\r\n          peerDependenciesMeta?: Record<string, { optional?: boolean }>;\r\n        }\r\n      >;\r\n      'dist-tags': Record<string, string>;\r\n    };\r\n\r\n    const packageInfo: NpmPackageInfo = {\r\n      name: data.name,\r\n      versions: Object.keys(data.versions),\r\n      versionDetails: data.versions,\r\n      distTags: data['dist-tags'],\r\n    };\r\n\r\n    // 缓存时只保留版本列表和 distTags，丢弃庞大的 versionDetails 以节省内存\r\n    const cacheEntry: NpmPackageInfo = {\r\n      name: packageInfo.name,\r\n      versions: packageInfo.versions,\r\n      versionDetails: {},\r\n      distTags: packageInfo.distTags,\r\n    };\r\n    packageCache.set(cacheKey, cacheEntry);\r\n\r\n    return packageInfo;\r\n  } catch (error) {\r\n    if (error instanceof Error && error.name === 'AbortError') {\r\n      logger.error(\r\n        `Timeout fetching package info for ${packageName} (>${DEFAULT_NPM_REGISTRY_TIMEOUT_MS}ms)`,\r\n      );\r\n    } else {\r\n      logger.error(`Failed to fetch package info for ${packageName}:`, error);\r\n    }\r\n    return null;\r\n  }\r\n}\r\n\r\n/**\r\n * 获取包的所有可用版本\r\n */\r\nexport async function fetchAllVersions(\r\n  packageName: string,\r\n  registry = DEFAULT_NPM_REGISTRY,\r\n): Promise<string[]> {\r\n  const info = await fetchPackageInfo(packageName, registry);\r\n  return info?.versions ?? [];\r\n}\r\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 * 已存在的别名信息（从 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  /** collectAllRelatedPackages 的 memo 缓存（单次 analyze 生命周期内有效） */\n  private collectCache = new Map<string, string[]>();\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 ensureWorkspaceRootDeclaredDepsLoaded(): void {\n    if (this.workspaceRootDeclaredLoaded) {\n      return;\n    }\n    this.workspaceRootDeclaredLoaded = true;\n\n    const workspaceRoot = 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 resolveCatalogDependencies(): 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 = 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 = 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      this.resolveCatalogDependencies();\n\n      // 0.1 预加载 workspaceRoot 的声明依赖（用于后续“已声明”判断合并）\n      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 = 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      // 清理全局 IO 缓存\n      clearPackageJsonCache();\n      clearNpmRegistryCache();\n\n      // 清理仅在分析期间使用的内部状态，允许 GC 回收\n      // 注意：不能清理 analyzedDependencies，它被返回值直接引用\n      this.visitedPackages.clear();\n      this.installedPackageCache.clear();\n      this.existingAliasesMap.clear();\n      this.workspaceAliasesCache.clear();\n      this.workspaceRootDeclaredDeps = {};\n      this.rawDeclaredDeps = {};\n      this.declaredDeps = {};\n      this.collectCache.clear();\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 analyzePeerConflicts(\n    peerDepsMap: Map<string, DependencyPath[]>,\n  ): 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      const conflictingRanges: DependencyPath[] = [];\n      const satisfiedRanges: DependencyPath[] = [];\n\n      for (const request of requestedBy) {\n        const resolvedRange =\n          (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      }\n\n      // hasConflict: 纯版本兼容性判断——存在不满足的 peer 范围即为 true\n      const hasConflict = conflictingRanges.length > 0;\n      // needsAlias: 可操作条件——冲突 + 主工程已声明且已安装该包\n      const needsAlias = hasConflict && isDeclared && isInstalled;\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 = this.workspaceDetector.getWorkspaceRoot();\n    if (workspaceRoot) {\n      logger.info(`  Workspace root detected: ${workspaceRoot}`);\n      const wsAliases = 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 = 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 = 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 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  ): AliasMapping | null {\n    // 1. 先检查是否有现有别名可复用（包括 workspace 级别）\n    const existingAlias = 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    // 收集 usedByRoots 子树（dependencies + peerDependencies 递归）用于重定向。\n    // 排除所有冲突包名（allConflictPackageNames），防止其被纳入 allDependents 后\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 findExistingAliasForRanges(\n    packageName: string,\n    ranges: string[],\n    excludeAliases: Set<string>,\n  ): {\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 = this.findWorkspaceAliasesForPackage(packageName);\n    const workspaceRoot = 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 findWorkspaceAliasesForPackage(packageName: string): WorkspaceAliasInfo[] {\n    // 检查缓存\n    if (this.workspaceAliasesCache.has(packageName)) {\n      return this.workspaceAliasesCache.get(packageName)!;\n    }\n\n    // 从 workspace 检测器获取别名\n    const aliases = 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 getExistingAliasNames(packageName: string): 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 = 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   * - 遇到冲突包（excludeTraversal）时，不加入 collected 也不遍历其子树，\n   *   因为 analyzedDependencies 中存储的是主项目安装的版本（而非冲突库实际需要的版本），\n   *   遍历它们会引入无关包（如 vue-router@5 的 peerDep pinia）\n   *\n   * 性能优化：优先从 analyzedDependencies 内存数据中读取，避免重复磁盘 I/O\n   */\n  private collectAllSubDependenciesRecursive(\n    packageName: string,\n    visited: Set<string>,\n    collected: Set<string>,\n    baseDir: string,\n    excludeTraversal?: Set<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      if (excludeTraversal?.has(name)) {\n        continue;\n      }\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  private collectAllRelatedPackages(packageNames: string[], excludePackages: string[] = []): string[] {\n    const cacheKey = JSON.stringify([packageNames.slice().sort(), excludePackages.slice().sort()]);\n    const cached = this.collectCache.get(cacheKey);\n    if (cached) {\n      return cached;\n    }\n\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        excludeSet,\n      );\n    }\n\n    // 防御性兜底：即使 excludeTraversal 已在递归中阻止冲突包进入 collected，\n    // 仍在此处做最终清理，避免未来重构时意外引入错误重定向\n    for (const excludePkg of excludeSet) {\n      collected.delete(excludePkg);\n    }\n\n    const result = Array.from(collected);\n    this.collectCache.set(cacheKey, result);\n    return result;\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';\nimport { LruCache } from '../utils/lru-cache';\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   * importer 路径 -> 包名列表 的 LRU 缓存\n   * dev server / HMR 场景下同一 importer 会被反复解析，缓存避免重复字符串拆分\n   */\n  private importerCache = new LruCache<string, string[]>({ maxEntries: 1000 });\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      const dependents = new Set(mapping.allDependents ?? []);\n\n      // 1. 先叠加 includeRedirects：显式强制纳入的包（优先于 exclude 执行）\n      const includeList = this.options.includeRedirects[mapping.originalName] ?? [];\n      if (includeList.length > 0) {\n        for (const dep of includeList) {\n          dependents.add(dep);\n        }\n        logger.debug(`Included redirects for ${mapping.originalName}: ${includeList.join(', ')}`);\n      }\n\n      // 2. 再减去 excludeRedirects：显式排除的包\n      const excludeList = this.options.excludeRedirects[mapping.originalName] ?? [];\n      if (excludeList.length > 0) {\n        for (const dep of excludeList) {\n          dependents.delete(dep);\n        }\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,\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 cached = this.importerCache.get(importer);\n    if (cached) {\n      return cached;\n    }\n\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    this.importerCache.set(importer, packages);\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    let packageManager: 'npm' | 'yarn' | 'pnpm';\n    if (!userOptions.packageManager || userOptions.packageManager === 'auto') {\n      const detected = 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      includeRedirects: userOptions.includeRedirects ?? {},\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    // 分析器在初始化完成后不再使用，释放以允许 GC 回收其内部状态\n    this.analyzer = null;\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"]}