{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { FhirPackageInstaller } from 'fhir-package-installer';\nimport type { FhirPackageIdentifier, FhirRelease, FhirVersion, FileIndexEntryWithPkg } from '@outburn/types';\nimport { LookupFilter } from './types';\nimport fs from 'fs-extra';\n\n/**\n * Sorts an array of FhirPackageIdentifier objects by their id and version.\n * @param arr - The array of FhirPackageIdentifier objects to sort.\n * @returns \n */\nexport const sortPackages = (arr: FhirPackageIdentifier[]): FhirPackageIdentifier[] => {\n  return arr.slice().sort((a, b) => {\n    const aKey = `${a.id}@${a.version}`;\n    const bKey = `${b.id}@${b.version}`;\n    return aKey < bKey ? -1 : aKey > bKey ? 1 : 0;\n  });\n};\n\n/**\n * Normalizes the filter by splitting the version from the URL, id or name - if piped (e.g. `bp|4.0.1`).\n * If none of these keys are piped, the filter is returned as is.\n * @param filter - The filter to normalize.\n * @return - The normalized filter.\n */\nexport const normalizePipedFilter = (filter: LookupFilter): LookupFilter => {\n  const newFilter = { ...filter };\n  const pipedKeys: (keyof LookupFilter)[] = ['url', 'name', 'id'];\n  for (const key of pipedKeys) {\n    const val = filter[key];\n    if (typeof val === 'string' && val.includes('|')) {\n      const [left, right] = val.split('|');\n      newFilter[key] = left;\n      newFilter.version = right;\n      break;\n    }\n  }\n  return newFilter;\n};\n\n/**\n * Checks if the entry matches the filter by comparing each key-value pair.\n * If the key is 'package', it is ignored, since package filtering is transitive and handled separately.\n * @param entry - The entry to check.\n * @param filter - The filter to check against.\n * @returns - True if the entry matches the filter (ignoring `package`), false otherwise.\n */\nexport const matchesFilter = (entry: FileIndexEntryWithPkg, filter: LookupFilter): boolean => {\n  for (const [key, value] of Object.entries(filter)) {\n    if (key === 'package') continue;\n    if ((entry as any)[key] !== value) return false;\n  }\n  return true;\n};\n\n/**\n * When multiple matches are found, this function tries to resolve the duplicates using a prioritized strategy.\n * \n * Resolution strategies (in order of priority):\n * 1. Package filter match - exact package match if specified in filter\n * 2. Implicit-over-core bias - prefer implicit packages (terminology, extensions) over core packages\n * 3. Resource type bias within implicit packages - terminology resources prefer terminology package, others prefer extensions\n * 4. Implicit package version bias - higher package version wins (e.g.,terminology.rX 7.1.0 > 7.0.0) \n * 5. FHIR version bias - higher FHIR version wins when implicit package versions are equal (terminology.r5@7.0.0 > terminology.r4@7.0.0)\n * 6. Semver resolution - latest version of the same package\n * \n * @param matches \n * @param filter \n * @param fpi \n * @returns \n */\nexport const tryResolveDuplicates = async (matches: FileIndexEntryWithPkg[], filter: LookupFilter, fpi: FhirPackageInstaller): Promise<FileIndexEntryWithPkg[]> => {\n  // 1. Package filter match: if one of the matches is from the same package as in the filter, return that one\n  if (filter.package) {\n    const pkgIdentifier = await fpi.toPackageObject(filter.package);\n    const filteredMatches = matches.filter(m => m.__packageId === pkgIdentifier.id && m.__packageVersion === pkgIdentifier.version);\n    if (filteredMatches.length === 1) return filteredMatches;\n  }\n\n  // Helper functions for package classification\n  const isCorePackage = (packageId: string): boolean => /^hl7\\.fhir\\.r\\d+\\.core$/.test(packageId);\n  const isTerminologyPackage = (packageId: string): boolean => /^hl7\\.terminology\\.r\\d+$/.test(packageId);\n  const isExtensionsPackage = (packageId: string): boolean => /^hl7\\.fhir\\.uv\\.extensions\\.r\\d+$/.test(packageId);\n  const isImplicitPackage = (packageId: string): boolean => isTerminologyPackage(packageId) || isExtensionsPackage(packageId);\n  const isTerminologyResource = (resourceType: string): boolean => ['ValueSet', 'ConceptMap', 'CodeSystem'].includes(resourceType);\n\n  /**\n   * Extracts the FHIR version (e.g. 4 from r4) from an implicit package ID.\n   * This is only safe to call on packages validated by isImplicitPackage.\n   */\n  const extractFhirVersionFromImplicitPackageId = (packageId: string): number => {\n    const match = packageId.match(/\\.r(\\d+)$/);\n    return match ? parseInt(match[1], 10) : 0;\n  };\n\n  const compareSemver = (a: string | undefined, b: string | undefined): number => {\n    if (!a && !b) return 0;\n    if (!a) return -1;\n    if (!b) return 1;\n\n    const parse = (v: string) => {\n      const [core] = v.split('-');\n      const [major, minor, patch] = core.split('.').map(Number);\n      return { major, minor, patch };\n    };\n\n    const aParts = parse(a);\n    const bParts = parse(b);\n\n    if (aParts.major !== bParts.major) return aParts.major - bParts.major;\n    if (aParts.minor !== bParts.minor) return aParts.minor - bParts.minor;\n    if (aParts.patch !== bParts.patch) return aParts.patch - bParts.patch;\n    return 0;\n  };\n\n  // 2. Implicit-over-core bias: implicit packages ALWAYS win over core packages\n  const coreMatches = matches.filter(m => isCorePackage(m.__packageId));\n  const implicitMatches = matches.filter(m => isImplicitPackage(m.__packageId));\n  \n  if (implicitMatches.length > 0 && coreMatches.length > 0) {\n    // Implicit packages always win over core packages (they're more up-to-date)\n    matches = implicitMatches;\n  } else if (coreMatches.length === 1 && implicitMatches.length === 0) {\n    // Traditional core-bias: if exactly one match is from core and no implicit packages, prefer core\n    return coreMatches;\n  } else if (implicitMatches.length > 0 && coreMatches.length === 0) {\n    // We have implicit matches but no core matches - prefer implicit packages\n    matches = implicitMatches;\n  }\n\n  // 3. Resource type bias within implicit packages\n  if (matches.length > 1 && matches.every(m => isImplicitPackage(m.__packageId))) {\n    const terminologyMatches = matches.filter(m => isTerminologyPackage(m.__packageId));\n    const extensionsMatches = matches.filter(m => isExtensionsPackage(m.__packageId));\n    \n    if (terminologyMatches.length > 0 && extensionsMatches.length > 0) {\n      // We have matches in both implicit packages, use resource type to decide\n      if (filter.resourceType && isTerminologyResource(filter.resourceType)) {\n        matches = terminologyMatches;\n      } else {\n        matches = extensionsMatches;\n      }\n    }\n  }\n\n  // 4 & 5. Package version and FHIR version bias for implicit packages\n  if (matches.length > 1 && matches.every(m => isImplicitPackage(m.__packageId))) {\n    // Sort by package version (descending), then by FHIR version (descending)\n    matches.sort((a, b) => {\n      // First compare package versions\n      const versionComparison = compareSemver(b.__packageVersion, a.__packageVersion);\n      if (versionComparison !== 0) return versionComparison;\n      \n      // If package versions are equal, compare FHIR versions\n      return extractFhirVersionFromImplicitPackageId(b.__packageId) - extractFhirVersionFromImplicitPackageId(a.__packageId);\n    });\n    \n    // Return the best match (highest package version, then highest FHIR version)\n    return [matches[0]];\n  }\n\n  // 6. Semver resolution: try to resolve by semver where matches are from different versions of the same package\n  const groupedByPkg = new Map<string, string[]>();\n  for (const entry of matches) {\n    const pkg = entry.__packageId;\n    const v = entry.version;\n    if (!v || !/^\\d+\\.\\d+\\.\\d+(-[\\w.-]+)?$/.test(v)) return [];\n    if (!groupedByPkg.has(pkg)) groupedByPkg.set(pkg, []);\n    groupedByPkg.get(pkg)!.push(v);\n  }\n\n  if (groupedByPkg.size !== 1) return [];\n  const [pkgId, versions] = Array.from(groupedByPkg.entries())[0];\n\n  const latest = versions.slice().sort(compareSemver).pop();\n  return matches.filter(m => m.__packageId === pkgId && m.version === latest);\n};\n\nexport const loadJson = async (filePath: string): Promise<any> => {\n  return await fs.readJson(filePath);\n};\n\n/**\n * Map of FHIR version strings to their canonical release identifiers\n */\nconst fhirVersionMap: Record<FhirVersion, FhirRelease> = {\n  '3.0.2': 'STU3',\n  '3.0': 'STU3',\n  'R3': 'STU3',\n  'STU3': 'STU3',\n  '4.0.1': 'R4',\n  '4.0': 'R4',\n  'R4': 'R4',\n  '4.3.0': 'R4B',\n  '4.3': 'R4B',\n  'R4B': 'R4B',\n  '5.0.0': 'R5',\n  '5.0': 'R5',\n  'R5': 'R5'\n};\n\n/**\n * Map of FHIR release identifiers to their core package identifiers\n */\nconst fhirCorePackages: Record<FhirRelease, FhirPackageIdentifier> = {\n  'STU3': { id: 'hl7.fhir.r3.core', version: '3.0.2' },\n  'R3': { id: 'hl7.fhir.r3.core', version: '3.0.2' },\n  'R4': { id: 'hl7.fhir.r4.core', version: '4.0.1' },\n  'R4B': { id: 'hl7.fhir.r4b.core', version: '4.3.0' },\n  'R5': { id: 'hl7.fhir.r5.core', version: '5.0.0' }\n};\n\n/**\n * Maps a FHIR version string to the appropriate core package identifier.\n * Supports versions: STU3/R3 (3.0.2), R4 (4.0.1), R4B (4.3.0), R5 (5.0.0)\n * \n * @param fhirVersion - The FHIR version string (e.g., '4.0.1', '5.0.0', 'R4', 'STU3')\n * @returns The FhirPackageIdentifier for the corresponding core package\n * @throws Error if the FHIR version is not supported\n */\nexport const resolveFhirVersionToCorePackage = (fhirVersion: FhirVersion): FhirPackageIdentifier => {\n   \n  // Look up the canonical release identifier\n  const fhirRelease: FhirRelease = fhirVersionMap[fhirVersion];\n  \n  if (!fhirRelease) {\n    const supportedVersions = Object.keys(fhirVersionMap).join(', ');\n    throw new Error(`Unsupported FHIR version: ${fhirVersion}. Supported versions: ${supportedVersions}`);\n  }\n  \n  return fhirCorePackages[fhirRelease];\n};\n\n/**\n * Takes an entry and returns an array of key combinations used to index the entry for fast lookups.\n * @param entry - The entry to get the keys for.\n * @returns - An array of keys for the entry.\n */\nexport const getAllFastIndexKeys = (entry: FileIndexEntryWithPkg): string[] => {\n  const { __packageId, __packageVersion, resourceType, url, id, name, version, derivation } = entry;\n  const keys: string[] = [];\n\n  if (__packageId && __packageVersion && resourceType && id && derivation) keys.push(`pkg:${__packageId}#${__packageVersion}|resourceType:${resourceType}|id:${id}|derivation:${derivation}`);\n  if (__packageId && __packageVersion && resourceType && url) keys.push(`pkg:${__packageId}#${__packageVersion}|resourceType:${resourceType}|url:${url}`);\n  if (resourceType && url && version) keys.push(`resourceType:${resourceType}|url:${url}|version:${version}`);\n  if (resourceType && url) keys.push(`resourceType:${resourceType}|url:${url}`);\n  if (url && version) keys.push(`url:${url}|version:${version}`);\n  if (url) keys.push(`url:${url}`);\n  if (resourceType && name && version) keys.push(`resourceType:${resourceType}|name:${name}|version:${version}`);\n  if (resourceType && id && version) keys.push(`resourceType:${resourceType}|id:${id}|version:${version}`);\n  if (resourceType && name) keys.push(`resourceType:${resourceType}|name:${name}`);\n  if (resourceType && id) keys.push(`resourceType:${resourceType}|id:${id}`);\n\n  return keys;\n};","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n  FhirPackageInstaller\n} from 'fhir-package-installer';\nimport path from 'path';\nimport { LRUCache } from 'lru-cache';\nimport type { FhirPackageIdentifier, Logger, FileInPackageIndex, FileIndexEntryWithPkg } from '@outburn/types';\n\n\nimport { ExplorerConfig, LookupFilter } from './types';\n\nimport { getAllFastIndexKeys, loadJson, matchesFilter, normalizePipedFilter, sortPackages, tryResolveDuplicates, resolveFhirVersionToCorePackage } from './utils';\n\nexport class FhirPackageExplorer {\n  private fpi: FhirPackageInstaller;\n  private cachePath: string;\n  private logger: Logger;\n  private indexCache: LRUCache<string, FileIndexEntryWithPkg[]>;\n  private contentCache: LRUCache<string, any>;\n  private fastIndex: LRUCache<string, FileIndexEntryWithPkg[]>;\n  private contextPackages: FhirPackageIdentifier[] = [];\n  private normalizedRootPackages: FhirPackageIdentifier[] = [];\n  private dependencyRootByPackageKey: Map<string, FhirPackageIdentifier> = new Map();\n  private skipExamples: boolean = false;\n\n  static async create(config: ExplorerConfig): Promise<FhirPackageExplorer> {\n    const instance = new FhirPackageExplorer(config);\n    // Determine the effective context - potentially adding a core package if needed\n    let effectiveContext = config.context;\n      \n    // If fhirVersion is specified, check if we need to auto-add a core package\n    if (config.fhirVersion) {\n      // First, load the initial context to check what's there\n      await instance._loadContext(config.context);\n        \n      // Check if any FHIR core package is in the context\n      const hasCorePackage = instance.contextPackages.some(pkg => \n        pkg.id.match(/^hl7\\.fhir\\.r\\d+b?\\.core$/)\n      );\n        \n      if (!hasCorePackage) {\n        // No core package found - add one based on fhirVersion\n        const corePackage = resolveFhirVersionToCorePackage(config.fhirVersion);\n          \n        instance.logger.warn?.(\n          `No FHIR core package found in context. Auto-adding: ${corePackage.id}@${corePackage.version}`\n        );\n          \n        // Reload context with the core package added\n        effectiveContext = [...config.context, corePackage];\n        await instance._loadContext(effectiveContext);\n      }\n    } else {\n      // Just load the context as-is\n      await instance._loadContext(effectiveContext);\n    }\n      \n    return instance;\n  }\n\n  private constructor(config: ExplorerConfig) {\n    const {\n      logger,\n      registryUrl,\n      registryToken,\n      cachePath,\n      skipExamples,\n      contentCacheSize,\n      indexCacheSize,\n      fastIndexSize\n    } = config || {} as ExplorerConfig;\n    this.fpi = new FhirPackageInstaller({ logger, registryUrl, registryToken, cachePath, skipExamples });\n    this.logger = logger || {\n      debug: () => {},\n      info: () => {},\n      warn: () => {},\n      error: () => {}\n    };\n    this.cachePath = this.fpi.getCachePath();\n    if (skipExamples) this.skipExamples = skipExamples;\n    this.contentCache = new LRUCache({ max: contentCacheSize ?? 500 });\n    this.indexCache = new LRUCache({ max: indexCacheSize ?? 500 });\n    this.fastIndex = new LRUCache({ max: fastIndexSize ?? 10000 });\n  }\n\n  public getCachePath(): string {\n    return this.cachePath;\n  }\n\n  public getLogger(): Logger {\n    return this.logger;\n  }\n\n  public getContextPackages(): FhirPackageIdentifier[] {\n    return this.contextPackages;\n  }\n\n  /**\n   * Get the list of direct package dependencies for a given package.\n   * @param pkg - The package to expand. Can be a string or a FhirPackageIdentifier object.\n   * @returns - A promise that resolves to an array of FhirPackageIdentifier objects.\n   */\n  public async getDirectDependencies(pkg: string | FhirPackageIdentifier): Promise<FhirPackageIdentifier[]> {\n    const pkgObj = typeof pkg === 'string' ? await this.fpi.toPackageObject(pkg) : pkg;\n    const dependencies = await this.fpi.getDependencies(pkgObj, {\n      rootPackage: this._getDependencyRoot(pkgObj)\n    });\n    return Object.entries(dependencies).map(([id, version]) => ({ id, version }));\n  }\n  \n  /**\n   * Expands the package into a list of packages including all transitive dependencies.\n   * @param pkg - The package to expand. Can be a string or a FhirPackageIdentifier object.\n   * @returns - A promise that resolves to an array of FhirPackageIdentifier objects representing the expanded packages.\n   */\n  public async expandPackageDependencies(pkg: string | FhirPackageIdentifier): Promise<FhirPackageIdentifier[]> {\n    const pkgObj = typeof pkg === 'string' ? await this.fpi.toPackageObject(pkg) : pkg;\n    return sortPackages(await this._collectDependencyObjects(pkgObj));\n  }\n\n  public async lookup(filter: LookupFilter = {}): Promise<any[]> {\n    const meta = await this.lookupMeta(filter);\n    const results = await Promise.all(meta.map(async (entry) => {\n      const filePath = await this._getFilePath(entry);\n      if (this.contentCache.has(filePath)) return this.contentCache.get(filePath);\n      const content = await loadJson(filePath);\n      const enriched = {\n        __packageId: entry.__packageId,\n        __packageVersion: entry.__packageVersion,\n        __filename: entry.filename,\n        ...content\n      };\n      this.contentCache.set(filePath, enriched);\n      return enriched;\n    }));\n    return results;\n  }\n\n  public async lookupMeta(filter: LookupFilter = {}): Promise<FileIndexEntryWithPkg[]> {\n    const normalizedFilter = normalizePipedFilter(filter);\n    const pkgIdentifiers = this.contextPackages;\n  \n    let allowedPackages: Set<string> | undefined = undefined;\n    if (normalizedFilter.package) {\n      const scopedPackage = await this.fpi.toPackageObject(normalizedFilter.package);\n      allowedPackages = await this._collectDependencies(scopedPackage);\n    }\n  \n    const resultMap = new Map<string, FileIndexEntryWithPkg>();\n  \n    for (const pkg of pkgIdentifiers) {\n      const pkgKey = `${pkg.id}#${pkg.version}`;\n      if (allowedPackages && !allowedPackages.has(pkgKey)) continue;\n  \n      let index = this.indexCache.get(pkgKey);\n      if (!index) {\n        await this.fpi.install(pkg);\n        const rawPkgIndex = await this.fpi.getPackageIndexFile(pkg);\n        const rawIndex = rawPkgIndex.files ?? [];\n        const newIndex = rawIndex.map((file: FileInPackageIndex) => ({\n          ...file,\n          __packageId: pkg.id,\n          __packageVersion: pkg.version\n        }));\n        this.indexCache.set(pkgKey, newIndex);\n        this._buildFastIndex(newIndex);\n        index = newIndex;\n      }\n  \n      const fastKeys = getAllFastIndexKeys(normalizedFilter as FileIndexEntryWithPkg);\n      const fastCandidates = fastKeys.flatMap(k => this.fastIndex.get(k) ?? []);\n  \n      const candidates = fastCandidates.length > 0 ? fastCandidates : index;\n  \n      for (const entry of candidates) {\n        const entryPkgKey = `${entry.__packageId}#${entry.__packageVersion}`;\n        if (allowedPackages && !allowedPackages.has(entryPkgKey)) continue;\n        if (!matchesFilter(entry, normalizedFilter)) continue;\n        const compositeKey = `${entry.filename}|${entry.__packageId}|${entry.__packageVersion}`;\n        if (!resultMap.has(compositeKey)) {\n          resultMap.set(compositeKey, entry);\n        }\n      }\n    }\n  \n    return Array.from(resultMap.values());\n  }\n\n  public async resolve(filter: LookupFilter = {}): Promise<any> {\n    const matches = await this.lookup(filter);\n    if (matches.length === 0) throw new Error(`No matching resource found with filter: ${JSON.stringify(filter)}`);\n    if (matches.length > 1) {\n      const candidates = await tryResolveDuplicates(matches, filter, this.fpi);\n      if (candidates.length !== 1) {\n        const matchInfo = matches.map(m => `${m.__packageId}@${m.__packageVersion}`).join(', ');\n        throw new Error(`Multiple matching resources found with filter: ${JSON.stringify(filter)}. Found in packages: ${matchInfo}`);\n      }\n      return candidates[0];\n    }\n    return matches[0];\n  }\n\n  public async resolveMeta(filter: LookupFilter = {}): Promise<FileIndexEntryWithPkg> {\n    const matches = await this.lookupMeta(filter);\n    if (matches.length === 0) throw new Error(`No matching resource found with filter: ${JSON.stringify(filter)}`);\n    if (matches.length > 1) {\n      const candidates = await tryResolveDuplicates(matches, filter, this.fpi);\n      if (candidates.length !== 1) {\n        const matchInfo = matches.map(m => `${m.__packageId}@${m.__packageVersion}`).join(', ');\n        throw new Error(`Multiple matching resources found with filter: ${JSON.stringify(filter)}. Found in packages: ${matchInfo}`);\n      }\n      return candidates[0];\n    }\n    return matches[0];\n  }\n\n  /**\n   * Get the manifest (package.json) for a given FHIR package.\n   * Returns the parsed manifest object for the specified package, or throws if not found.\n   *\n   * @param pkg - The package to fetch the manifest for (string or FhirPackageIdentifier).\n   * @returns A promise that resolves to the manifest (package.json) object for the package.\n   */\n  public async getPackageManifest(pkg: string | FhirPackageIdentifier): Promise<any> {\n    const meta = await this.fpi.getManifest(pkg);\n    if (!meta) throw new Error(`Failed to fetch manifest (package.json) for package: ${String(pkg)}`);\n    return meta;\n  }\n\n  private async _loadContext(context: Array<string | FhirPackageIdentifier>) {\n    // Resolve provided context entries into root packages (dedup first)\n    const rootMap = new Map<string, FhirPackageIdentifier>();\n    for (const entry of context) {\n      const pkg = await this.fpi.toPackageObject(entry);\n      rootMap.set(`${pkg.id}#${pkg.version}`, pkg);\n    }\n    const initialRoots = Array.from(rootMap.values());\n\n    // For each root, compute its full transitive dependency closure (including itself)\n    const rootClosures = new Map<string, Set<string>>();\n    const keyToPkg = new Map<string, FhirPackageIdentifier>();\n    for (const root of initialRoots) {\n      await this.fpi.install(root); // ensure root is installed before dependency walk\n      const closurePackages = await this._collectDependencyObjects(root);\n      const closure = new Set(closurePackages.map((pkg) => `${pkg.id}#${pkg.version}`));\n      rootClosures.set(`${root.id}#${root.version}`, closure);\n      // Track all packages encountered for later object reconstruction\n      for (const pkg of closurePackages) {\n        keyToPkg.set(`${pkg.id}#${pkg.version}`, pkg);\n      }\n    }\n\n    // Determine redundant roots: any root that appears in another root's closure\n    const redundant = new Set<string>();\n    const allRootKeys = Array.from(rootClosures.keys());\n    for (const [rootKey, closure] of rootClosures.entries()) {\n      for (const otherKey of allRootKeys) {\n        if (rootKey === otherKey) continue;\n        if (closure.has(otherKey)) {\n          // other root is covered by this root; mark redundant\n          redundant.add(otherKey);\n        }\n      }\n    }\n\n    // Minimal normalized root packages = roots not marked redundant\n    let minimalRoots = initialRoots.filter(r => !redundant.has(`${r.id}#${r.version}`));\n    // Handle pathological cycles where all roots ended up redundant (keep deterministic first root)\n    if (minimalRoots.length === 0 && initialRoots.length > 0) {\n      minimalRoots = [sortPackages(initialRoots)[0]];\n    }\n\n    // Build final full context package set = union of closures of minimal roots\n    const finalContextMap = new Map<string, FhirPackageIdentifier>();\n    for (const mr of minimalRoots) {\n      const closure = rootClosures.get(`${mr.id}#${mr.version}`)!;\n      for (const key of closure) {\n        const pkgObj = keyToPkg.get(key);\n        if (pkgObj) finalContextMap.set(key, pkgObj);\n      }\n    }\n\n    // Store normalized roots (canonical ordering) and full context packages\n    this.normalizedRootPackages = sortPackages(minimalRoots);\n    this.contextPackages = sortPackages(Array.from(finalContextMap.values()));\n\n    this.dependencyRootByPackageKey.clear();\n    for (const root of this.normalizedRootPackages) {\n      const closure = rootClosures.get(`${root.id}#${root.version}`);\n      if (!closure) continue;\n      for (const key of closure) {\n        if (!this.dependencyRootByPackageKey.has(key)) {\n          this.dependencyRootByPackageKey.set(key, root);\n        }\n      }\n    }\n  }\n\n  private _getDependencyRoot(pkg: FhirPackageIdentifier): FhirPackageIdentifier {\n    return this.dependencyRootByPackageKey.get(`${pkg.id}#${pkg.version}`) ?? pkg;\n  }\n\n  private async _collectDependencies(pkg: FhirPackageIdentifier): Promise<Set<string>> {\n    const visited = new Set<string>();\n    const rootPackage = this._getDependencyRoot(pkg);\n    const visit = async (p: FhirPackageIdentifier) => {\n      const key = `${p.id}#${p.version}`;\n      if (visited.has(key)) return;\n      visited.add(key);\n      const deps = await this.fpi.getDependencies(p, { rootPackage });\n      for (const [id, version] of Object.entries(deps || {})) {\n        if (this.skipExamples && id.includes('examples')) continue;\n        await visit({ id, version });\n      }\n    };\n    await visit(pkg);\n    return visited;\n  }\n\n  private async _collectDependencyObjects(pkg: FhirPackageIdentifier): Promise<FhirPackageIdentifier[]> {\n    const keys = await this._collectDependencies(pkg);\n    return sortPackages(Array.from(keys).map((key) => {\n      const [id, version] = key.split('#', 2);\n      return { id, version };\n    }));\n  }\n\n  private async _getFilePath(entry: FileIndexEntryWithPkg): Promise<string> {\n    const dir = await this.fpi.getPackageDirPath({ id: entry.__packageId, version: entry.__packageVersion });\n    return path.join(dir, 'package', entry.filename);\n  }\n\n  private _buildFastIndex(index: FileIndexEntryWithPkg[]) {\n    for (const file of index) {\n      for (const key of getAllFastIndexKeys(file)) {\n        const entries = this.fastIndex.get(key) ?? [];\n        entries.push(file);\n        this.fastIndex.set(key, entries);\n      }\n    }\n  }\n\n  /**\n   * Get the normalized minimal set of root packages from the context.\n   * Returns only the root packages that are not dependencies of other root packages,\n   * effectively removing redundant entries from the originally provided context.\n   *\n   * @returns An array of FhirPackageIdentifier objects representing the minimal root packages.\n   */\n  public getNormalizedRootPackages(): FhirPackageIdentifier[] {\n    return this.normalizedRootPackages;\n  }\n}\n\nexport type {\n  FileInPackageIndex,\n  FileIndexEntryWithPkg,\n  ExplorerConfig,\n  LookupFilter \n};\n"]}