fhir-package-explorer
Version:
Explore and resolve FHIR conformance resources across package contexts
1 lines • 45.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":["fs","FhirPackageInstaller","LRUCache","path"],"mappings":"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","file":"index.cjs","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"]}