{"version":3,"sources":["../../src/core/path-finder.ts"],"names":[],"mappings":"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","file":"path-finder.mjs","sourcesContent":["import {OSAdapter} from '../adapter';\nimport {getAdapter} from '../adapters/adapter-factory';\nimport {PathInfo, SearchOptions} from '../types';\n\n// 导入扩展的平台类型\ntype PlatformWithMock = NodeJS.Platform | 'mock';\n\n/**\n * PathFinder class for locating iCloud paths on different platforms\n */\nexport class PathFinder {\n  private adapter: OSAdapter;\n\n  // Singleton implementation\n  private static instance: PathFinder | null = null;\n  private static platformOverride: PlatformWithMock | undefined;\n\n  /**\n   * Get a singleton instance of PathFinder\n   *\n   * @param platformOverride Override the platform detection (useful for testing)\n   * @returns PathFinder instance\n   */\n  public static getInstance(platformOverride?: PlatformWithMock): PathFinder {\n    // If a new platform override is provided and is different from the current one, reset the instance\n    if (platformOverride !== undefined && platformOverride !== this.platformOverride) {\n      this.reset();\n      this.platformOverride = platformOverride;\n    }\n\n    if (!this.instance) {\n      this.instance = new PathFinder(this.platformOverride);\n    }\n\n    return this.instance;\n  }\n\n  /**\n   * Reset the singleton instance\n   * Primarily used for testing\n   */\n  public static reset(): void {\n    this.instance = null;\n    this.platformOverride = undefined;\n  }\n\n  /**\n   * Find iCloud paths based on search options\n   *\n   * @param options Search options to filter paths\n   * @param platformOverride Override the platform detection (useful for testing)\n   * @returns Promise resolving to array of path info objects\n   */\n  static async find(options?: SearchOptions, platformOverride?: PlatformWithMock): Promise<PathInfo[]> {\n    const finder = PathFinder.getInstance(platformOverride);\n    return await finder.find(options);\n  }\n\n  /**\n   * Create a new PathFinder instance\n   *\n   * @param platformOverride Override the platform detection (useful for testing)\n   */\n  constructor(platformOverride?: PlatformWithMock) {\n    this.adapter = getAdapter(platformOverride);\n  }\n\n  /**\n   * Find iCloud paths based on search options\n   *\n   * @param options Search options to filter paths\n   * @returns Promise resolving to array of path info objects\n   */\n  async find(options: SearchOptions = {}): Promise<PathInfo[]> {\n    const paths = await this.adapter.findPaths();\n    return this._filterPaths(paths, options);\n  }\n\n  /**\n   * Filter paths based on search options\n   *\n   * @param paths Array of path info objects\n   * @param options Search options to filter paths\n   * @returns Filtered array of path info objects\n   */\n  private _filterPaths(paths: PathInfo[], options: SearchOptions): PathInfo[] {\n    let filtered = paths.filter(path => {\n      if (!options.includeInaccessible && !path.isAccessible) {\n        return false;\n      }\n\n      if (options.minScore && path.score < options.minScore) {\n        return false;\n      }\n\n      return true;\n    });\n\n    if (options.appName) {\n      filtered = this._findMatchingApps(options.appName, filtered);\n    }\n\n    return filtered;\n  }\n\n  /**\n   * Find paths matching the app name pattern\n   *\n   * @param pattern App name pattern to match\n   * @param paths Array of path info objects\n   * @returns Filtered and sorted array of path info objects\n   */\n  private _findMatchingApps(pattern: string, paths: PathInfo[]): PathInfo[] {\n    const searchTerms = pattern.toLowerCase().split(/\\s+/);\n\n    return paths\n      .map(path => ({\n        path,\n        score: this._calculateMatchScore(searchTerms, path),\n      }))\n      .filter(result => result.score > 0)\n      .sort((a, b) => b.score - a.score)\n      .map(result => result.path);\n  }\n\n  /**\n   * Calculate match score for a path against search terms\n   *\n   * @param searchTerms Array of search terms\n   * @param path Path info object\n   * @returns Match score (higher is better)\n   */\n  private _calculateMatchScore(searchTerms: string[], path: PathInfo): number {\n    let score = 0;\n    const {appName, appId, bundleId} = path.metadata;\n    const nameLower = appName?.toLowerCase() || '';\n    const idLower = appId?.toLowerCase() || '';\n    const bundleLower = bundleId?.toLowerCase() || '';\n\n    for (const term of searchTerms) {\n      if (nameLower === term) score += 100;\n      else if (nameLower.includes(term)) score += 50;\n      if (bundleLower.includes(term)) score += 30;\n      if (idLower.includes(term)) score += 20;\n    }\n\n    return score;\n  }\n}\n"]}