{"version":3,"sources":["../src/utils/element/applyDiffs.ts","../src/utils/element/ensureChild.ts","../src/utils/element/ensureBranch.ts","../src/utils/element/toNodeType.ts","../src/utils/element/injectElementBlock.ts","../src/utils/element/mergeElement.ts","../src/utils/element/elementExists.ts","../src/utils/element/rewriteElementPaths.ts","../src/utils/element/migrateElements.ts","../src/utils/element/findMonopolyShortcutTarget.ts","../src/utils/tree/expandNode.ts","../src/utils/tree/fromTree.ts","../src/utils/tree/toTree.ts","../src/utils/tree/rewriteNodePaths.ts","../src/utils/tree/isNodeSliceable.ts","../src/utils/misc/logger.ts","../src/utils/misc/resolveFhirVersion.ts","../src/utils/misc/resolveBasePackage.ts","../src/utils/misc/definitionFetcher.ts","../src/utils/misc/initCap.ts","../package.json","../src/utils/misc/getVersionedCacheDir.ts","../src/utils/terminology/flattenCodeSystemConcepts.ts","../src/utils/terminology/systemMapHelpers.ts","../src/index.ts"],"names":["rewrite","slice","version","DefinitionFetcher","elements","FhirPackageExplorer","path","fs"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ILogger } from 'fhir-package-explorer';\r\nimport { ElementDefinition } from '../../../types';\r\nimport { ensureBranch, mergeElement, elementExists, DefinitionFetcher } from '..';\r\n\r\n/**\r\n * Apply a single diff element to the working snapshot array and return the updated array.\r\n * The existing element will be replaced by the result of merging it with the diff element.\r\n * This function assumes that an element with the same id already exists in the working snapshot array.\r\n * If the element does not exist, an error will be thrown.\r\n * @param elements working snapshot array\r\n * @param diffElement the diff element to apply\r\n * @returns the updated element array after applying the diff element\r\n */\r\nexport const applySingleDiff = (elements: ElementDefinition[], diffElement: ElementDefinition): ElementDefinition[] => {\r\n  const index = elements.findIndex(el => el.id === diffElement.id);\r\n  if (index === -1) {\r\n    throw new Error(`Element with id \"${diffElement.id}\" not found`);\r\n  }\r\n  const baseElement = { ...elements[index]}; // create a shallow copy of the base element\r\n  const mergedElement = mergeElement(baseElement, diffElement);\r\n\r\n  // if the resulting element has a sliceName but the id does not, remove sliceName.\r\n  // This is a remnant of aplying a diff on a monopoly using slices\r\n  if (mergedElement.sliceName && !mergedElement.id.endsWith(`:${mergedElement.sliceName}`)) {\r\n    delete mergedElement.sliceName;\r\n  }\r\n  const updatedElements = [...elements.slice(0, index), mergedElement, ...elements.slice(index + 1)];\r\n  return updatedElements;\r\n};\r\n\r\n/**\r\n * Rewrite the given id or path based on the path rewrite map.\r\n * This is used to handle the shortcut form of monopolized elements,\r\n * where valueString is both a type constraint and a differential on value[x].\r\n * After rewrite, the canonical value[x] path segment will be used.\r\n * The actual type constraint whould have already been applied to the working snapshot as a virtual diff during ensureChild.\r\n * @param original the original string to rewrite\r\n * @param kind the kind of rewrite to perform ('id' or 'path')\r\n * @returns \r\n */\r\nconst rewrite = (original: string, kind: 'id' | 'path', pathRewriteMap: Map<string, { id: string, path: string }>) => {\r\n  for (const [illegalPrefix, rewrite] of pathRewriteMap.entries()) {\r\n    if (original === illegalPrefix || original.startsWith(illegalPrefix + '.')) {\r\n      return original.replace(illegalPrefix, rewrite[kind]);\r\n    }\r\n  }\r\n  return original;\r\n};\r\n\r\n\r\n/**\r\n * Apply all diffs to the working snapshot array, in order, and return the updated array.\r\n * Missing (but valid) elements and their containing branches will be added to the working snapshot array on the fly.\r\n * The diff is an array of ElementDefinition objects that will be applied to the target element.\r\n * @param elements working snapshot array\r\n * @param diffElements the diff elements to apply\r\n * @returns the updated element array after applying the diff elements\r\n */\r\nexport const applyDiffs = async (elements: ElementDefinition[], diffs: ElementDefinition[], fetcher: DefinitionFetcher, logger: ILogger): Promise<ElementDefinition[]> => {\r\n  // working snapshot array. will accumulate all changes and be returned at the end.\r\n  let updatedElements = [...elements];\r\n  \r\n  // map to keep track of path rewrites for shortcut forms of monopolized elements (e.g. \"valueString\" as a type constraint on \"value[x]\")\r\n  const pathRewriteMap = new Map<string, { id: string, path: string }>();\r\n\r\n  // remove extension array from root element if it exists\r\n  if (updatedElements[0].extension) {\r\n    delete updatedElements[0].extension;\r\n  }\r\n  // if no diffs - return the elements array as is\r\n  if (diffs.length === 0) return updatedElements;\r\n  for (const diff of diffs) {\r\n    if (!elementExists(updatedElements, diff.id)) {\r\n      // ensure the entire path to the target element exists in the working snapshot array\r\n      updatedElements = await ensureBranch(updatedElements, diff.id, fetcher, logger, pathRewriteMap);\r\n    }\r\n\r\n    // If during ensureBranch some parts of the id/path have been rewritten, fix the id and path accordingly\r\n    const rewrittenDiff = {\r\n      ...diff,\r\n      id: rewrite(diff.id, 'id', pathRewriteMap),\r\n      path: rewrite(diff.path, 'path', pathRewriteMap)\r\n    };\r\n    \r\n    // apply the diff element to the working snapshot array\r\n    updatedElements = applySingleDiff(updatedElements, rewrittenDiff);\r\n  }\r\n  return updatedElements;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ILogger } from 'fhir-package-explorer';\r\nimport {\r\n  rewriteNodePaths,\r\n  toTree,\r\n  fromTree,\r\n  isNodeSliceable,\r\n  expandNode,\r\n  injectElementBlock,\r\n  DefinitionFetcher,\r\n  findMonopolyShortcutTarget,\r\n  applySingleDiff,\r\n  initCap\r\n} from '..';\r\n\r\nimport { ElementDefinition } from '../../../types';\r\n\r\n/**\r\n * Takes a parent node and a child id, and ensures that the child exists in the working snapshot array.\r\n * If the child does not exist, it will be created by expanding the parent or creating the slice.\r\n * @param elements working snapshot array\r\n * @param parentId the full path of the parent node to look for the child in\r\n * @param childId the last segment of the child element id to look for, e.g \"identifier:foo\" or \"system\"\r\n * @param fetcher the definition fetcher to use for expanding the node\r\n * @param logger the logger to use for logging messages\r\n * @returns the updated element array after child was added\r\n */\r\nexport const ensureChild = async (\r\n  elements: ElementDefinition[],\r\n  parentId: string,\r\n  childId: string,\r\n  fetcher: DefinitionFetcher,\r\n  logger: ILogger,\r\n  pathRewriteMap: Map<string, { id: string, path: string }>\r\n): Promise<ElementDefinition[]> => {\r\n  const parentElementBlock = elements.filter(element => element.id === parentId || element.id.startsWith(`${parentId}.`));\r\n  if (parentElementBlock.length === 0) {\r\n    throw new Error(`Parent element '${parentId}' not found in the working snapshot array`);\r\n  }\r\n  let parentNode = toTree(parentElementBlock);\r\n  if (isNodeSliceable(parentNode)) {\r\n    parentNode = parentNode.children[0]; // headslice is always the first child\r\n  }\r\n  const isExpanded = parentNode.children.length > 0;\r\n  if (!isExpanded) {\r\n    parentNode = await expandNode(parentNode, fetcher);\r\n    elements = injectElementBlock(elements, parentId, fromTree(parentNode));\r\n  }\r\n  const [ elementName, sliceName ] = childId.split(':');\r\n  \r\n  // Try to find a direct child with the expected segment name\r\n  const childElement = parentNode.children.find(element => element.id.endsWith(`.${elementName}`));\r\n  \r\n  if (!childElement) {\r\n    // Check if it's a shortcut to a polymorphic element\r\n    const match = findMonopolyShortcutTarget(parentId, elementName, parentNode.children);\r\n    if (match) {\r\n      const canonicalId = `${parentId}.${match.rewrittenSegment}`;\r\n      const elementDefinition = elements.find(e => e.id === canonicalId);\r\n      const canonicalPath = elementDefinition?.path ?? canonicalId;\r\n\r\n      // Register the rewritten ID and path for future rewriting\r\n      pathRewriteMap.set(`${parentId}.${elementName}`, {\r\n        id: canonicalId,\r\n        path: canonicalPath\r\n      });\r\n\r\n      // Apply a virtual diff that constrains the polymorphic type\r\n      const virtualDiff: ElementDefinition = {\r\n        id: canonicalId,\r\n        path: canonicalPath,\r\n        type: [{ code: match.type }]\r\n      };\r\n\r\n      elements = applySingleDiff(elements, virtualDiff);\r\n      return elements;\r\n    }\r\n\r\n    // If still not found → this is truly illegal\r\n    throw new Error(`Element '${childId}' is illegal under '${parentId}'.`);\r\n  }\r\n\r\n  if (!sliceName) return elements; // referring to child itself and it exists. nothing to do.\r\n  \r\n  // referring to a slice\r\n\r\n  // if child is not sliceable, no slices are allowed but we must be forgiving for this since some HL7 profiles do it.\r\n  // Ex: The 'catalog' profile on Composition has a \"date:IssueDate\" diff while \"date\" is not sliceable.\r\n  if (!isNodeSliceable(childElement)) {\r\n    // ignore the sliceName and return the elements as is after registering the path rewrite\r\n    const aliasId = `${childElement.id}:${sliceName}`;\r\n    pathRewriteMap.set(aliasId, {\r\n      id: childElement.id,\r\n      path: childElement.path\r\n    });\r\n    return elements;\r\n  }\r\n  // find the slice by name\r\n  const slice = childElement.children.find(slice => slice.sliceName === sliceName);\r\n\r\n  // if found - it's already in the element array. nothing to do.\r\n  if (slice) {\r\n    return elements;\r\n  }\r\n  if (!slice) {\r\n  // Potentially a monopoly alias — check type\r\n    if (elementName.endsWith('[x]') && childElement.children[0].definition?.type?.length === 1) {\r\n      const onlyType = childElement.children[0].definition.type[0].code;\r\n      const monopolySliceName = `${elementName.slice(0, -3)}${initCap(onlyType)}`;\r\n\r\n      if (sliceName === monopolySliceName) {\r\n        // Monopoly alias - treat this element id as canonical for the head slice\r\n        const aliasId = `${childElement.id}:${sliceName}`;\r\n        const aliasPath = childElement.path; // path never contains slice names\r\n\r\n        pathRewriteMap.set(aliasId, {\r\n          id: childElement.id,\r\n          path: aliasPath\r\n        });\r\n\r\n        return elements;\r\n      }\r\n    }\r\n\r\n    // ✅ Truly needs a new slice → proceed with slice creation\r\n    const headSlice = childElement.children[0];\r\n    const newId = `${headSlice.id}:${sliceName}`;\r\n\r\n    const newSlice = rewriteNodePaths(headSlice, newId, headSlice.id);\r\n    newSlice.nodeType = 'slice';\r\n    delete newSlice.definition?.slicing;\r\n    delete newSlice.definition?.mustSupport;\r\n    newSlice.sliceName = sliceName;\r\n    if (newSlice.definition) {\r\n      newSlice.definition.sliceName = sliceName;\r\n    }\r\n\r\n    childElement.children.push(newSlice);\r\n    elements = injectElementBlock(elements, childElement.id, fromTree(childElement));\r\n  }\r\n  return elements;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ILogger } from 'fhir-package-explorer';\r\nimport { ElementDefinition } from '../../../types';\r\nimport { DefinitionFetcher, ensureChild } from '..';\r\n\r\n/**\r\n * Walks the path segements up to the target, expanding child elements and creating slices as needed.\r\n * @param elements working snapshot array\r\n * @param targetElementId target element id\r\n * * @returns the updated element array after entire path to target element was added\r\n */\r\nexport const ensureBranch = async (\r\n  elements: ElementDefinition[],\r\n  targetElementId: string,\r\n  fetcher: DefinitionFetcher,\r\n  logger: ILogger,\r\n  pathRewriteMap: Map<string, { id: string, path: string }>\r\n): Promise<ElementDefinition[]> => {\r\n  const idSegments = targetElementId.split('.');\r\n  const rootId = idSegments[0];\r\n  let updatedElements = elements;\r\n  // check that root matches the first element in the array\r\n  if (elements[0].id !== rootId) {\r\n    throw new Error(`Root element '${rootId}' not found in the working snapshot array`);\r\n  }\r\n  if (rootId === targetElementId) {\r\n    // if the target is the root element, just return the elements array\r\n    return updatedElements;\r\n  }\r\n\r\n  // track the canonical parent id - this is the correct form of the cumulative branch after any rewrites\r\n  let canonicalParentId = rootId;\r\n\r\n  // loop over the remaining segments and ensure each one exists\r\n  for (let i = 1; i < idSegments.length; i++) {\r\n    const rawChildSegment = idSegments[i];\r\n\r\n    // Rewrite the current parent ID if needed (cumulative)\r\n    const rewrite = pathRewriteMap.get(canonicalParentId);\r\n    if (rewrite) {\r\n      canonicalParentId = rewrite.id;\r\n    }\r\n\r\n    // Ensure the child\r\n    updatedElements = await ensureChild(\r\n      updatedElements,\r\n      canonicalParentId,\r\n      rawChildSegment,\r\n      fetcher,\r\n      logger,\r\n      pathRewriteMap\r\n    );\r\n\r\n    // Build canonical child ID and continue\r\n    canonicalParentId = `${canonicalParentId}.${rawChildSegment}`;\r\n  }\r\n  return updatedElements;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ElementDefinition } from '../../../types';\r\n\r\n/**\r\n * Gets the node type based on the element definition properties.\r\n * @param element - the element definition to check\r\n * @returns - the node type as a string\r\n */\r\nexport const toNodeType = (element: ElementDefinition): 'array' | 'poly' | 'element' | 'resliced' | 'slice' => {\r\n  if (element.id.endsWith('[x]')) {\r\n    return 'poly';\r\n  }\r\n  if (element.sliceName) {\r\n    if (element.slicing) return 'resliced';\r\n    return 'slice';\r\n  }\r\n  if (element.base?.max && (element.base.max === '*' || parseInt(element.base.max) > 1)) {\r\n    return 'array';\r\n  }\r\n  return 'element';\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ElementDefinition } from '../../../types';\r\n\r\n/**\r\n * Injects a block of elements into the working snapshot array at the specified injection point.\r\n * The injection point is the id of the element where the block will be injected.\r\n * The block will replace the existing element at the injection point, and all of its children (slices, elements).\r\n * @param elements working snapshot array\r\n * @param injectionPoint the id of the element the block will replace\r\n * @param elementBlock the block of elements to inject\r\n * @returns the updated element array after injection\r\n */\r\nexport const injectElementBlock = (elements: ElementDefinition[], injectionPoint: string, elementBlock: ElementDefinition[]): ElementDefinition[] => {\r\n  const index = elements.findIndex(el => el.id === injectionPoint);\r\n  if (index === -1) throw new Error(`Element with id \"${injectionPoint}\" not found`);\r\n  const before = elements.slice(0, index);\r\n  const after = elements.slice(index + 1).filter(element => !(element.id.startsWith(`${injectionPoint}.`)) && !(element.id.startsWith(`${injectionPoint}:`))); // Skip the target\r\n  const results = [...before, ...elementBlock, ...after];\r\n  return results;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ElementDefinition } from '../../../types';\r\n\r\n/**\r\n * Merge an existing snapshot element with a diff element.\r\n * Most diff keys just override the snapshot ones if they exist.\r\n * The 'constraint', 'mapping' and 'condition' arrays are accumulated.\r\n * @param base ElementDefinition - the base snapshot element to apply the merge to\r\n * @param diff ElementDefinition - the diff element to merge with the base element\r\n * @returns ElementDefinition - the merged element\r\n * @throws Error if the diff element ID does not match the base element ID\r\n */\r\nexport const mergeElement = (base: ElementDefinition, diff: ElementDefinition): ElementDefinition => {\r\n  // ensure diff.id === base.id\r\n  if (diff.id !== base.id) {\r\n    throw new Error(`Element ID mismatch. Tried to apply \"${diff.id}\" onto \"${base.id}\".`);\r\n  }\r\n  // create a shallow working copy of the base element\r\n  const mergedElement: ElementDefinition = { ...base };\r\n  // apply the diff attributes, key by key\r\n  for (const key of Object.keys(diff) as string[]) {\r\n    if (['constraint', 'condition', 'mapping'].includes(key)) {\r\n      const baseArr = base[key] || [], diffArr = diff[key] || [];\r\n    \r\n      if (key === 'constraint') {\r\n        mergedElement.constraint = [...baseArr, ...diffArr];\r\n    \r\n      } else if (key === 'condition') {\r\n        const ids = Array.from(new Set([...baseArr, ...diffArr]));\r\n        mergedElement.condition = ids;\r\n    \r\n      } else {\r\n        const seen = new Set<string>();\r\n        const serialize = (obj: Record<string, string>) => JSON.stringify(Object.entries(obj).sort());\r\n        const combined = [...baseArr, ...diffArr];\r\n        mergedElement.mapping = combined.filter(m => {\r\n          const s = serialize(m);\r\n          return seen.has(s) ? false : seen.add(s);\r\n        });\r\n      }\r\n    }\r\n    else if (key !== 'id' && key !== 'path') {\r\n      if (diff[key] !== undefined) {\r\n        mergedElement[key] = diff[key];\r\n      };\r\n    }\r\n  }\r\n\r\n  return mergedElement;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ElementDefinition } from '../../../types';\r\n\r\n/**\r\n * Check if the current working snapshot contains the target element id.\r\n * @param elements working snapshot array\r\n * @param targetElementId target element id\r\n * @returns true if the element exists, false otherwise\r\n */\r\nexport const elementExists = (elements: ElementDefinition[], targetElementId: string): boolean => {\r\n  return elements.some(element => element.id === targetElementId);\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ElementDefinition } from '../../../types';\r\n\r\n/**\r\n * Rewrites the paths and id's of elements in an array to match a new prefix.\r\n * The id's maintain slice names while the paths don't.\r\n * @param elements - the array of elements to rewrite\r\n * @param newPrefix - the new prefix to use for the element ids and paths\r\n * @param oldPrefix - the old prefix to replace in the element ids and paths\r\n * @returns - the rewritten array of elements\r\n */\r\nexport const rewriteElementPaths = (\r\n  elements: ElementDefinition[],\r\n  newPrefix: string,\r\n  oldPrefix: string\r\n): ElementDefinition[] => {\r\n  const oldPrefixDot = oldPrefix.endsWith('.') ? oldPrefix : oldPrefix + '.';\r\n  const newPrefixDot = newPrefix.endsWith('.') ? newPrefix : newPrefix + '.';\r\n    \r\n  const removeSlices = (elementIdPart: string): string => {\r\n    const segments = elementIdPart.split('.');\r\n    // for each segment, remove the slice name if it exists\r\n    const cleanedSegments = segments.map(segment => {\r\n      const sliceIndex = segment.indexOf(':');\r\n      return sliceIndex !== -1 ? segment.slice(0, sliceIndex) : segment;\r\n    });\r\n    return cleanedSegments.join('.'); \r\n  };\r\n      \r\n  const replaceId = (str: string) =>\r\n    str === oldPrefix\r\n      ? newPrefix\r\n      : str.startsWith(oldPrefixDot)\r\n        ? newPrefixDot + str.slice(oldPrefixDot.length)\r\n        : str;\r\n      \r\n  const replacePath = (elementPath: string) => {\r\n    const newPathPrefix = removeSlices(newPrefixDot);\r\n    const oldPathPrefix = removeSlices(oldPrefixDot);\r\n    return elementPath === oldPathPrefix\r\n      ? newPathPrefix\r\n      : elementPath.startsWith(oldPathPrefix)\r\n        ? newPathPrefix + elementPath.slice(oldPathPrefix.length)\r\n        : elementPath;\r\n  };\r\n    \r\n  return elements.map(el => ({\r\n    ...el,\r\n    id: replaceId(el.id),\r\n    path: replacePath(el.path)\r\n  }));\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ElementConstraint, ElementDefinition, FhirExtensionInstance } from '../../../types';\r\n\r\n/**\r\n * When bringing an ElementDefinition from one of the base FHIR packages and using it as the base for a diff application,\r\n * some cleanup and adaptations must be done. For example: \r\n * - changing relative links in markdown to absolute links\r\n * - removing some extensions that are not supposed to be inherited.\r\n */\r\n\r\n// list of markdown elements to replace links in\r\nconst markdownKeys = ['definition', 'comment', 'requirements', 'meaningWhenMissing'] as const;\r\n\r\n// Extensions that should not be inherited from a base definition\r\n// See: https://jira.hl7.org/browse/FHIR-27535\r\nconst ignoredExtensions = [\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm-no-warnings',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-hierarchy',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-interface',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-normative-version',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-applicable-version',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-category',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-codegen-super',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-security-category',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-summary',\r\n  'http://hl7.org/fhir/StructureDefinition/structuredefinition-wg',\r\n  'http://hl7.org/fhir/StructureDefinition/replaces',\r\n  'http://hl7.org/fhir/StructureDefinition/resource-approvalDate',\r\n  'http://hl7.org/fhir/StructureDefinition/resource-effectivePeriod',\r\n  'http://hl7.org/fhir/StructureDefinition/resource-lastReviewDate'\r\n];\r\n\r\n/**\r\n * Replaces relative links in a single Markdown field with absolute HL7 FHIR URLs.\r\n * Example: [Extensibility](extensibility.html) → [Extensibility](http://hl7.org/fhir/extensibility.html)\r\n *\r\n * @param markdown - The Markdown string to process\r\n * @returns The updated Markdown string with absolute HL7 FHIR URLs\r\n */\r\nconst replaceRelativeLinks = (markdown: string): string => {\r\n  return markdown.replace(\r\n    /\\[([^\\]]+)\\]\\((?!https?:\\/\\/)([^)]+)\\)/g,\r\n    (_match, text, url) => `[${text}](http://hl7.org/fhir/${url})`\r\n  );\r\n};\r\n\r\n/**\r\n * Delete extensions that should be ignored when inheriting an ElementDefinition.\r\n * @param extensions \r\n * @param ignoredExtensions \r\n * @returns \r\n */\r\nconst filterExtensions = (\r\n  extensions: FhirExtensionInstance[]\r\n): FhirExtensionInstance[] | undefined => {\r\n  const result = extensions.filter(\r\n    ext => !ignoredExtensions.includes(ext.url)\r\n  );\r\n  return result.length > 0 ? result : undefined;\r\n};\r\n\r\n/**\r\n * If an inherited constraint does not have a source, add the source URL to it.\r\n * If it already has one, preserve it.\r\n * @param constraints \r\n * @param sourceUrl \r\n * @returns \r\n */\r\nconst addSourceToConstraints = (\r\n  constraints: ElementConstraint[],\r\n  sourceUrl: string\r\n): ElementConstraint[] => {\r\n  return constraints.map(constraint => ({ source: sourceUrl, ...constraint }));\r\n};\r\n\r\n/**\r\n * Prepares an ElementDefinition array for inheritance into derived profiles.\r\n * @param elements \r\n * @param sourceUrl - The URL of the source StructureDefinition, used to determine if it is from the base FHIR spec and to add `source` to inherited constraints.\r\n * @returns \r\n */\r\nexport const migrateElements = (elements: ElementDefinition[], sourceUrl: string): ElementDefinition[] => {\r\n  return elements.map((el: ElementDefinition, index) => {\r\n    const updated: ElementDefinition = { ...el };\r\n    // Top-level elements may have extensions that should not be inherited\r\n    if (index === 0 && el.extension) {\r\n      const filteredExtensions = filterExtensions(el.extension);\r\n      if (filteredExtensions) {\r\n        updated.extension = filteredExtensions;\r\n      } else {\r\n        delete updated.extension; // remove the extension array if empty\r\n      }\r\n    }\r\n    // if source URL is the base FHIR namespace, replace relative links in markdown fields\r\n    if (sourceUrl.startsWith('http://hl7.org/fhir')) {\r\n      for (const key of markdownKeys) {\r\n        const value = el[key];\r\n        if (typeof value === 'string') {\r\n          updated[key] = replaceRelativeLinks(value);\r\n        }\r\n      }\r\n    }\r\n    // if constraints exist, add the source URL to them\r\n    if (el.constraint) {\r\n      updated.constraint = addSourceToConstraints(el.constraint, sourceUrl);\r\n    }\r\n    return updated;\r\n  });\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { FhirTreeNode } from '../../../types';\r\nimport { initCap } from '..';\r\n\r\nexport const findMonopolyShortcutTarget = (\r\n  parentId: string,\r\n  missingSegment: string,\r\n  elements: FhirTreeNode[]\r\n): { rewrittenSegment: string; type: string } | null => {\r\n  const prefix = `${parentId}.`;\r\n\r\n  // Filter elements that are children of the parent and are polyorphic at the base (detected by [x] suffix)\r\n  const childElements = elements.filter(el =>\r\n    el.id.startsWith(prefix) &&\r\n    el.id !== parentId &&\r\n    el.id.endsWith('[x]')\r\n  );\r\n\r\n  // Scan through child elements to find a match\r\n  for (const el of childElements) {\r\n    const idSegment = el.id.slice(prefix.length); // e.g. value[x]\r\n    const base = idSegment.slice(0, -3); // remove [x]\r\n\r\n    // Go through each type defined in the element definition\r\n    // We take the definition from the first child (headslice) since polymorphic elements are sliceable\r\n    for (const type of el?.children[0]?.definition?.type ?? []) {\r\n      const shortcut = base + initCap(type.code);\r\n      if (shortcut === missingSegment) {\r\n        return {\r\n          rewrittenSegment: `${base}[x]`,\r\n          type: type.code\r\n        };\r\n      }\r\n    }\r\n  }\r\n\r\n  return null;\r\n};\r\n","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { isNodeSliceable, toTree, rewriteElementPaths, DefinitionFetcher } from '..';\r\nimport { FhirTreeNode, ElementDefinition, ElementDefinitionType } from '../../../types';\r\n\r\n/**\r\n * Expands a node by ensuring its children are populated.\r\n * @param node - the node to expand\r\n * @returns - the expanded node\r\n */\r\nexport const expandNode = async (node: FhirTreeNode, fetcher: DefinitionFetcher): Promise<FhirTreeNode> => {\r\n  if (isNodeSliceable(node)) {\r\n    throw new Error(`Node '${node.id}' is sliceable. Expand node must be called on a specific slice, headslice or a non-sliceable node.`);\r\n  }\r\n\r\n  // if node has children - it is already expanded\r\n  if (node.children.length > 0) return node;\r\n\r\n  // if node has no definition - throw.\r\n  if (!node.definition) {\r\n    throw new Error(`Node '${node.id}' has no ElementDefinition. Cannot expand.`);\r\n  }\r\n\r\n  const definition: ElementDefinition = node.definition;\r\n\r\n  // if node has no type nor contentReference - throw.\r\n  if ((!definition.type || definition.type.length === 0) && (!definition.contentReference)) {\r\n    throw new Error(`Node '${node.id}' has no type or contentReference defined. Cannot expand.`);\r\n  }\r\n\r\n  let snapshotElements: ElementDefinition[] = [];\r\n  // if node has contentReference - use it to get the snapshot.\r\n  if (definition.contentReference) {\r\n    snapshotElements = await fetcher.getContentReference(definition.contentReference);\r\n    if (!snapshotElements || snapshotElements.length === 0) {\r\n      throw new Error(`Snapshot for contentReference '${definition.contentReference}' is empty or missing.`);\r\n    }\r\n    // See: https://hl7.org/fhir/R4/elementdefinition-definitions.html#ElementDefinition.contentReference\r\n    // ** Rule eld-5 - cannot have type information AND contentReference at the same time.\r\n    delete definition.contentReference; // remove contentReference from the definition.\r\n  } else if (definition.type && definition.type.length > 1) {\r\n    // if there are multiple types (polymorphic) - expand using the base 'Element' type.\r\n    // This gives us the only children that are common to all types.\r\n    snapshotElements = await fetcher.getBaseType('Element');\r\n    if (!snapshotElements || snapshotElements.length === 0) {\r\n      throw new Error('Snapshot for base type \\'Element\\' is empty or missing.');\r\n    }\r\n  } else if (definition.type && definition.type.length === 1) {\r\n    // only a single type\r\n    const elementType: ElementDefinitionType = definition.type[0];\r\n\r\n    if (elementType.profile && elementType.profile.length === 1) {\r\n      // if type has a single `profile` - use it to get the snapshot.\r\n      // Currently only a single profile is supported for profile based expansion.\r\n      // If there are multiple profiles expansion will be done using the base type.\r\n      // TODO: Test how SUSHI handles multiple profiles (FHIR spec says \"one must apply\")\r\n      const url = elementType.profile[0];\r\n      snapshotElements = await fetcher.getByUrl(url);\r\n      if (!snapshotElements || snapshotElements.length === 0) {\r\n        throw new Error(`Snapshot for type '${url}' is empty or missing.`);\r\n      }\r\n    } else {\r\n      // if type has no profile - use the type code to get the snapshot.\r\n      const id = elementType.code;\r\n      if (id.startsWith('http://hl7.org/fhirpath/System.')) {\r\n        // It's a true (system) primitive, so it cannot have children.\r\n        // Should not expand.\r\n        throw new Error(`Cannot expand node '${node.id}', type '${id}' can never have children.`);\r\n      }\r\n      snapshotElements = await fetcher.getBaseType(id);\r\n      if (!snapshotElements || snapshotElements.length === 0) {\r\n        throw new Error(`Snapshot for type '${id}' is empty or missing.`);\r\n      }\r\n    }\r\n  }\r\n  // if no snapshot elements were found - throw.\r\n  if (!snapshotElements || snapshotElements.length === 0) {\r\n    throw new Error(`Error expanding node '${node.id}' - the snapshot contains no elements.`);\r\n  }\r\n  // rewrite the paths of the snapshot elements to match the current node\r\n  const oldPrefix = snapshotElements[0].id;\r\n  const newPrefix = node.id;\r\n  const rewrittenElements = rewriteElementPaths(snapshotElements, newPrefix, oldPrefix);\r\n  // construct the new node from the element array\r\n  const expandedSubtree = toTree(rewrittenElements);\r\n  const clonedNode = { ...node, children: expandedSubtree.children };\r\n  return clonedNode;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { FhirTreeNode, ElementDefinition } from '../../../types';\r\n\r\n/**\r\n * Flattens a FhirTreeNode into a flat array of ElementDefinition objects.\r\n * @param tree - the tree to flatten\r\n * @returns - the flattened array of elements\r\n */\r\nexport const fromTree = (tree: FhirTreeNode): ElementDefinition[] => {\r\n  const result: ElementDefinition[] = [];\r\n  \r\n  function visit(node: FhirTreeNode) {\r\n    // Only output nodes that hold a definition\r\n    if (['element', 'slice', 'headslice'].includes(node.nodeType)) {\r\n      if (!node.definition) {\r\n        throw new Error(`Node ${node.id} of type ${node.nodeType} is missing its definition`);\r\n      }\r\n      result.push(node.definition);\r\n    }\r\n  \r\n    for (const child of node.children) {\r\n      visit(child);\r\n    }\r\n  }\r\n  \r\n  visit(tree);\r\n  return result;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { toNodeType, isNodeSliceable } from '..';\r\nimport { ElementDefinition, FhirTreeNode } from '../../../types';\r\n\r\n/**\r\n * Builds a tree from an array of ElementDefinition objects.\r\n * @param elements - the array of elements to convert to a tree\r\n * @returns - the root node of the tree, including all nested children\r\n */\r\nexport const toTree = (elements: ElementDefinition[]): FhirTreeNode => {\r\n  if (elements.length === 0) {\r\n    throw new Error('Element array is empty');\r\n  }\r\n  \r\n  const idToNode = new Map<string, FhirTreeNode>();\r\n  \r\n  const makeSegments = (fullId: string): { idSegments: string[], pathSegments: string[] } => {\r\n    const idSegments = fullId.split('.');\r\n    const pathSegments = idSegments.map(segment => segment.split(':')[0]); // Remove slice names\r\n    return { idSegments, pathSegments };\r\n  };\r\n  \r\n  const createNode = (\r\n    element: ElementDefinition,\r\n    forceNodeType?: 'element'\r\n  ): FhirTreeNode => {\r\n    const { idSegments, pathSegments } = makeSegments(element.id);\r\n    const nodeType = forceNodeType || toNodeType(element);\r\n  \r\n    const node: FhirTreeNode = {\r\n      id: element.id,\r\n      path: element.path,\r\n      idSegments,\r\n      pathSegments,\r\n      nodeType,\r\n      children: []\r\n    };\r\n  \r\n    if (isNodeSliceable(node)) {\r\n      // Always create the headslice immediately for arrays/polys/resliceables:\r\n      const headSlice: FhirTreeNode = {\r\n        id: element.id,\r\n        path: element.path,\r\n        idSegments,\r\n        pathSegments,\r\n        nodeType: 'headslice',\r\n        definition: element,\r\n        children: []\r\n      };\r\n      node.children.push(headSlice);\r\n    } else {\r\n      node.definition = element; // Only element and slice nodes hold definitions\r\n      if (element.sliceName) {\r\n        node.sliceName = element.sliceName; // Add slice name to the node\r\n      }\r\n    }\r\n  \r\n    return node;\r\n  };\r\n  \r\n  const rootElement = elements[0];\r\n  const rootNode = createNode(rootElement, 'element'); // Force root as element\r\n  idToNode.set(rootNode.id, rootNode);\r\n  \r\n  for (let i = 1; i < elements.length; i++) {\r\n    const element = elements[i];\r\n    const { idSegments } = makeSegments(element.id);\r\n    // if the current element last segment contains a slice name, then parent should be the part before the slice name\r\n    // otherwise, parent should be the part before the last segment\r\n    const lastSegment = idSegments[idSegments.length - 1];\r\n    const isSlice = lastSegment.includes(':');\r\n    const lastSegmentWithoutSlice = isSlice ? lastSegment.split(':')[0] : lastSegment;\r\n    const parentPath = isSlice ? idSegments.slice(0, -1).join('.') + `.${lastSegmentWithoutSlice}` : idSegments.slice(0, -1).join('.');\r\n  \r\n    const parentNode = idToNode.get(parentPath);\r\n    if (!parentNode) {\r\n      throw new Error(`Parent node not found for element ${element.id}`);\r\n    }\r\n  \r\n    const newNode = createNode(element);\r\n  \r\n    if (isNodeSliceable(parentNode)) {\r\n      // if current element is a slice - add it to the parent node\r\n      // otherwise - add it to the headslice\r\n      if (isSlice) {\r\n        parentNode.children.push(newNode);\r\n      } else {\r\n        parentNode.children[0].children.push(newNode); // headslice is always the first child\r\n      }\r\n    } else {\r\n      // if parent element is not sliceable - add child directly to it\r\n      parentNode.children.push(newNode);\r\n    }\r\n  \r\n    idToNode.set(newNode.id, newNode);\r\n  }\r\n  \r\n  return rootNode;\r\n};\r\n","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { toTree, fromTree, rewriteElementPaths } from '..';\r\nimport { FhirTreeNode } from '../../../types';\r\n\r\n/**\r\n * Rewrites the paths and id's of an entire branch to match a new prefix.\r\n * The id's maintain slice names while the paths don't.\r\n * @param node - the branch in the tree to rewrite\r\n * @param newPrefix - the new prefix to use for the element ids and paths\r\n * @param oldPrefix - the old prefix to replace in the element ids and paths\r\n * @returns the rewritten branch of the tree\r\n */\r\nexport const rewriteNodePaths = (\r\n  node: FhirTreeNode,\r\n  newPrefix: string,\r\n  oldPrefix: string\r\n): FhirTreeNode => {\r\n  const flattened = fromTree(node);\r\n  const rewritten = rewriteElementPaths(flattened, newPrefix, oldPrefix);\r\n  const newNode = toTree(rewritten);\r\n  return newNode;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { FhirTreeNode } from '../../../types';\r\n\r\n/**\r\n * Checks if a node is sliceable based on its node type.\r\n * @param node - the node to check\r\n * @returns - true if the node is sliceable, false otherwise\r\n */\r\nexport const isNodeSliceable = (node: FhirTreeNode): boolean => {\r\n  return ['array', 'poly', 'resliced'].includes(node.nodeType);\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ILogger, Prethrower } from '../../../types';\r\n\r\n/**\r\n * default logger uses global console methods\r\n */\r\nexport const defaultLogger: ILogger = {\r\n  info: (msg: any) => console.log(msg),\r\n  warn: (msg: any) => console.warn(msg),\r\n  error: (msg: any) => console.error(msg)\r\n};\r\n\r\n/**\r\n * Default prethrow function does nothing since the regular throw prints to console.error, which is the default error logger.\r\n * If the same prethrow function was used with both custom and default loggers, in default mode duplicate errors would have been printed\r\n */\r\nexport const defaultPrethrow: Prethrower = (msg: Error | any): Error => {\r\n  if (msg instanceof Error) {\r\n    return msg;\r\n  }\r\n  const error = new Error(msg);\r\n  return error;\r\n};\r\n\r\nexport const customPrethrower = (logger: ILogger): Prethrower => {\r\n  return (msg: Error | any): Error => {\r\n    if (msg instanceof Error) {\r\n      logger.error(msg);\r\n      return msg;\r\n    }\r\n    const error = new Error(msg);\r\n    logger.error(error);\r\n    return error;\r\n  };\r\n};\r\n","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { PackageIdentifier } from 'fhir-package-explorer';\r\nimport { BaseFhirVersion } from '../../../types';\r\n\r\nconst fhirVersionMap = {\r\n  '3.0.2': 'STU3',\r\n  '3.0': 'STU3',\r\n  'R3': 'STU3',\r\n  '4.0.0': 'R4',\r\n  '4.0.1': 'R4',\r\n  '4.0': 'R4',\r\n  '4.3.0': 'R4B',\r\n  '4.3': 'R4B',\r\n  '5.0.0': 'R5',\r\n  '5.0': 'R5'\r\n};\r\n\r\nexport const fhirCorePackages = {\r\n  'STU3': 'hl7.fhir.r3.core@3.0.2',\r\n  'R4': 'hl7.fhir.r4.core@4.0.1',\r\n  'R4B': 'hl7.fhir.r4b.core@4.3.0',\r\n  'R5': 'hl7.fhir.r5.core@5.0.0'\r\n};\r\n\r\n/**\r\n * Resolves any of the allowed FHIR version identifiers to a canonical version string.\r\n * If toPackage is true, it will return the base FHIR package name instead of the version identifier.\r\n * @param version Any valid FHIR version identifier (e.g., \"R4\", \"4.0.1\", \"4.3\", etc.).\r\n * @param toPackage If true, return the base FHIR package name & version instead of the version identifier (e.g. R5).\r\n * @throws Error if the version is not supported.\r\n * @returns The resolved FHIR version or base package name.\r\n */\r\nexport const resolveFhirVersion = (version: BaseFhirVersion, toPackage?: boolean): BaseFhirVersion | PackageIdentifier => {\r\n  const canonicalVersion: BaseFhirVersion = fhirVersionMap[version] || version;\r\n  const corePackage = fhirCorePackages[canonicalVersion];\r\n  if (!corePackage) {\r\n    throw new Error(`Unsupported FHIR version: ${version}. Supported versions are: ${Object.keys(fhirCorePackages).join(', ')}`);\r\n  }\r\n  if (toPackage) {\r\n    const [id, version] = corePackage.split('@');\r\n    return { id, version };\r\n  }\r\n  return canonicalVersion;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { FhirPackageExplorer, ILogger, PackageIdentifier } from 'fhir-package-explorer';\r\nimport { fhirCorePackages, resolveFhirVersion } from './resolveFhirVersion';\r\nimport { BaseFhirVersion } from '../..';\r\n\r\nconst findCorePackage = async (pkg: PackageIdentifier, fpe: FhirPackageExplorer): Promise<PackageIdentifier[]> => {\r\n  // if the requested package is a base package itself, return it as is\r\n  if (Object.values(fhirCorePackages).includes(`${pkg.id}@${pkg.version}`)) {\r\n    return [{ id: pkg.id, version: pkg.version }];\r\n  }\r\n  // otherwise, find the direct dependencies that are base FHIR packages\r\n  const deps = await fpe.getDirectDependencies(pkg);\r\n  return deps.filter(dep => Object.values(fhirCorePackages).includes(`${dep.id}@${dep.version}`));\r\n};\r\n\r\n/**\r\n * Resolves the base FHIR package for a given package ID and version.\r\n * If no base package is found in the dependencies, or there are multiple FHIR versions - returns undefined.\r\n * @param packageId The source package name (e.g., \"hl7.fhir.us.core\").\r\n * @param packageVersion The source package version (e.g., \"6.1.0\").\r\n * @param fpe The FhirPackageExplorer instance. Used to expand package dependencies.\r\n * @param logger The logger instance. Used to log warnings.\r\n * @return (string) The resolved base FHIR package (e.g., \"hl7.fhir.r4.core@4.0.1\").\r\n */\r\nexport const resolveBasePackage = async (packageId: string, packageVersion: string, fpe: FhirPackageExplorer, logger: ILogger): Promise<string | undefined> => {\r\n  const corePackages = await findCorePackage({ id: packageId, version: packageVersion }, fpe);\r\n  if (corePackages.length === 0) {\r\n    logger.warn(`No base FHIR package dependency found for ${packageId}@${packageVersion}.`);\r\n    // Check if the package manifest has a fhirVersions array\r\n    const pkgManifest = await fpe.getPackageManifest({ id: packageId, version: packageVersion });\r\n    // If it's an old package it may have 'fhir-version-list' instead of 'fhirVersions'. So let's normalize it.\r\n    if (pkgManifest['fhir-version-list'] && !pkgManifest.fhirVersions) {\r\n      pkgManifest.fhirVersions = pkgManifest['fhir-version-list'];\r\n    };\r\n    if (pkgManifest.fhirVersions && pkgManifest.fhirVersions.length > 0) {\r\n      // translate each fhirVersion to a package identifier and push into corePackages\r\n      pkgManifest.fhirVersions.map((fhirVersion: string) => {\r\n        logger.info(`Resolving core package for FHIR version ${fhirVersion}`);\r\n        const corePackageId = resolveFhirVersion(fhirVersion as BaseFhirVersion, true) as PackageIdentifier | undefined;\r\n        if (corePackageId) {\r\n          const { id, version } = corePackageId;\r\n          corePackages.push(\r\n            {\r\n              id,\r\n              version\r\n            }\r\n          );\r\n        } else {\r\n          logger.warn(`Unknown FHIR version ${version} in package ${packageId}@${packageVersion}.`);\r\n        }\r\n      });\r\n      // if still empty, return undefined\r\n      if (corePackages.length === 0) return undefined;\r\n    }\r\n  }\r\n  if (corePackages.length > 1) {\r\n    logger.warn(`Multiple base FHIR packages found for ${packageId}@${packageVersion}: ${corePackages.map(pkg => `${pkg.id}@${pkg.version}`).join(', ')}.`);\r\n    return undefined;\r\n  }\r\n  // We have exactly one base package\r\n  const version = corePackages[0].id === 'hl7.fhir.r4.core' && corePackages[0].version === '4.0.0' ? '4.0.1' : corePackages[0].version; // Normalize 4.0.0 to 4.0.1\r\n  return `${corePackages[0].id}@${version}`;\r\n};","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { FhirPackageExplorer, PackageIdentifier } from 'fhir-package-explorer';\r\nimport { ElementDefinition, SnapshotFetcher } from '../../../types';\r\nimport { migrateElements } from '../element';\r\n\r\n/**\r\n * A class dedicated to fetching FHIR definitions in the correct context for a specific snapshot generation process.\r\n * We use a class to encapsulate the context and expose methods that need fewer arguments/injections.\r\n */\r\nexport class DefinitionFetcher {\r\n  // Package from which the StructureDefinition is from. Used as context for all mid-process type/profile resolutions\r\n  private sourcePackage: PackageIdentifier;\r\n  // The base FHIR package (e.g., \"hl7.fhir.r4.core@4.0.1\") used for resolving FHIR base types.\r\n  private corePackage: PackageIdentifier;\r\n  // An instance of the FhirPackageExplorer class. Used to resolve FHIR types and profiles.\r\n  private fpe: FhirPackageExplorer;\r\n  // A map to cache previously fetched element arrays for base types, profiles and contentReference.\r\n  private elementCache: Map<string, ElementDefinition[]> = new Map<string, ElementDefinition[]>();\r\n  // A function to fetch the snapshot of a profile using its URL. This is used when the URL points to a profile.\r\n  // Depending on the FSG cache mode, it may return a pre-generated cached snapshot or generate a new one.\r\n  private snapshotFetcher: SnapshotFetcher;\r\n  \r\n  public constructor(sourcePackage: PackageIdentifier, corePackage: PackageIdentifier, fpe: FhirPackageExplorer, snapshotFetcher: SnapshotFetcher) {\r\n    this.sourcePackage = sourcePackage;\r\n    this.corePackage = corePackage;\r\n    this.snapshotFetcher = snapshotFetcher;\r\n    this.fpe = fpe;\r\n  };\r\n\r\n  /**\r\n     * Get the definition for one of the base FHIR types.\r\n     * @param type The type ID (e.g., \"CodeableConcept\", \"Quantity\", etc.).\r\n     */\r\n  public async getBaseType(type: string): Promise<ElementDefinition[]> {\r\n    // Check if the type is already cached\r\n    let elements = this.elementCache.get(type);\r\n    if (elements) {\r\n      return elements;\r\n    }\r\n    // If not cached, fetch the type definition from the FhirPackageExplorer\r\n    const definition = await this.fpe.resolve({ resourceType: 'StructureDefinition', id: type, package: this.corePackage, derivation: ['Element', 'Resource'].includes(type) ? undefined : 'specialization'});\r\n    if (!definition) {\r\n      throw new Error(`FHIR type '${type}' not found in base package '${this.corePackage}'`);\r\n    }\r\n    if (!definition.snapshot || !definition.snapshot.element || definition.snapshot.element.length === 0) {\r\n      throw new Error(`FHIR type '${type}' in base package '${this.corePackage.id}@${this.corePackage.version}' does not have a snapshot`);\r\n    }\r\n    // prepare the elements array for inheritance\r\n    elements = migrateElements(definition.snapshot.element as ElementDefinition[], definition.url);\r\n    // Cache the elements later use\r\n    this.elementCache.set(type, elements);\r\n    return elements;\r\n  }\r\n\r\n  /**\r\n   * Get the structure of a contentReference element.\r\n   * @param identifier The identifier of the contentReference (e.g., \"#Observation.referenceRange\").\r\n   */\r\n  public async getContentReference(identifier: string): Promise<ElementDefinition[]> {\r\n    if (!identifier.startsWith('#')) {\r\n      throw new Error(`Invalid contentReference identifier '${identifier}'. Must start with '#'`);\r\n    }\r\n    // Check if the type is already cached\r\n    const elements = this.elementCache.get(identifier);\r\n    if (elements) {\r\n      return elements;\r\n    }\r\n    const elementId: string = identifier.substring(1);\r\n    const baseType: string = elementId.split('.')[0];\r\n    const allElements: ElementDefinition[] = await this.getBaseType(baseType);\r\n    const matchingElements: ElementDefinition[] = allElements.filter((e) => e?.id === elementId || String(e?.id).startsWith(elementId + '.'));\r\n    if (matchingElements.length === 0) {\r\n      throw new Error(`No matching elements found for contentReference '${identifier}'`);\r\n    }\r\n    // Cache the elements for future use\r\n    this.elementCache.set(identifier, matchingElements);\r\n    return matchingElements;\r\n  }\r\n\r\n  /**\r\n   * When a profile references a type using a URL, the target may be either a profile or a base type.\r\n   * This method resolves the URL, and if it is a base type (derivation=specialization), returns its snapshot.\r\n   * If it is a profile, it returns the snapshot of the profile using the injected snapshotFetcher().\r\n   * The snapshotFetcher is expected to return a pre-generated snapshot from the cache or generate a new one.\r\n   * @param url Canonical URL of the type or profile.\r\n   * @returns The snapshot elements of the resolved type or profile.\r\n   */\r\n  public async getByUrl(url: string): Promise<ElementDefinition[]> {\r\n    // Check if the URL is already cached\r\n    const elements = this.elementCache.get(url);\r\n    if (elements) {\r\n      return elements;\r\n    }\r\n    // If not cached, fetch the metadata first\r\n    const metadata = await this.fpe.resolve({ resourceType: 'StructureDefinition', url, package: this.sourcePackage });\r\n    if (!metadata) {\r\n      throw new Error(`StructureDefinition '${url}' not found in package '${this.sourcePackage.id}@${this.sourcePackage.version}'`);\r\n    }\r\n    if (metadata.derivation === 'specialization') {\r\n      // It's a base type, return the snapshot from the original StructureDefinition\r\n      const sd = await this.fpe.resolve({ filename: metadata.filename, package: { id: metadata.__packageId, version: metadata.__packageVersion} });\r\n      const elements = migrateElements(sd.snapshot?.element as ElementDefinition[], url);\r\n      if (!elements || elements.length === 0) {\r\n        throw new Error(`StructureDefinition '${url}' does not have a snapshot`);\r\n      }\r\n      // Cache the elements for future use\r\n      this.elementCache.set(url, elements);\r\n      return elements;\r\n    }\r\n    if (metadata?.derivation === 'constraint') {\r\n      // It's a profile, return the snapshot using the injected snapshotFetcher\r\n      const elements = migrateElements(await this.snapshotFetcher(url), url);\r\n      if (!elements || elements.length === 0) {\r\n        throw new Error(`Profile '${url}' does not have a snapshot`);\r\n      }\r\n      // Cache the elements for future use\r\n      this.elementCache.set(url, elements);\r\n      return elements;\r\n    }\r\n    throw new Error(`StructureDefinition '${url}' is neither a base type nor a profile`);\r\n  }\r\n};","export const initCap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1);","{\r\n  \"name\": \"fhir-snapshot-generator\",\r\n  \"version\": \"1.5.1\",\r\n  \"description\": \"Generate snapshots for FHIR Profiles\",\r\n  \"main\": \"./dist/index.cjs\",\r\n  \"module\": \"./dist/index.mjs\",\r\n  \"types\": \"./dist/index.d.ts\",\r\n  \"type\": \"module\",\r\n  \"exports\": {\r\n    \".\": {\r\n      \"types\": \"./dist/index.d.ts\",\r\n      \"import\": \"./dist/index.mjs\",\r\n      \"require\": \"./dist/index.cjs\"\r\n    }\r\n  },\r\n  \"author\": \"Outburn Ltd.\",\r\n  \"license\": \"Apache-2.0\",\r\n  \"scripts\": {\r\n    \"build\": \"npm run clean && tsup\",\r\n    \"clean\": \"rimraf dist\",\r\n    \"build:test:wip\": \"rimraf test/wip && tsup test/wip.ts --format cjs --outDir test/wip --external fhir-package-explorer --external fs-extra --minify --no-splitting --no-dts --external fhir-snapshot-generator\",\r\n    \"build:sushi\": \"rimraf test/FsgTestPkg/dist && sushi -s test/FsgTestPkg -o test/FsgTestPkg/dist && node test/create-fsh-manifest.js && npm run install:fsh-package\",\r\n    \"install:fsh-package\": \"node test/install-fsh-package.js\",\r\n    \"clear:cache\": \"rimraf test/.test-cache\",\r\n    \"prepublishOnly\": \"npm run build\",\r\n    \"dist-to-module\": \"npm run build && rimraf node_modules/fhir-snapshot-generator && node test/dist-to-module.js\",\r\n    \"pretest\": \"npm run dist-to-module && npm run install:fsh-package\",\r\n    \"pretest:hard\": \"npm run clear:cache && npm run build:sushi && npm run pretest\",\r\n    \"test\": \"vitest run\",\r\n    \"test:hard\": \"npm run pretest:hard && vitest run\",\r\n    \"test:wip\": \"npm run dist-to-module && npm run build:test:wip && npm run install:fsh-package && node test/wip/wip.cjs\"\r\n  },\r\n  \"keywords\": [\r\n    \"fhir\",\r\n    \"hl7\",\r\n    \"package\",\r\n    \"profile\",\r\n    \"conformance\",\r\n    \"cache\",\r\n    \"structuredefinition\",\r\n    \"snapshot\",\r\n    \"differential\",\r\n    \"bake\",\r\n    \"resources\"\r\n  ],\r\n  \"files\": [\r\n    \"dist\",\r\n    \"README.md\",\r\n    \"LICENSE\"\r\n  ],\r\n  \"repository\": {\r\n    \"type\": \"git\",\r\n    \"url\": \"git+https://github.com/Outburn-IL/fhir-snapshot-generator.git\"\r\n  },\r\n  \"dependencies\": {\r\n    \"fhir-package-explorer\": \"^1.5.1\",\r\n    \"fs-extra\": \"^11.3.2\"\r\n  },\r\n  \"devDependencies\": {\r\n    \"@eslint/js\": \"^9.24.0\",\r\n    \"@types/fs-extra\": \"^11.0.4\",\r\n    \"eslint\": \"^9.39.1\",\r\n    \"fsh-sushi\": \"^3.16.5\",\r\n    \"rimraf\": \"^6.1.0\",\r\n    \"tsup\": \"^8.5.1\",\r\n    \"typescript\": \"^5.9.3\",\r\n    \"typescript-eslint\": \"^8.47.0\",\r\n    \"vitest\": \"^3.2.4\"\r\n  }\r\n}\r\n","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { version as fsgVersion } from '../../../package.json';\r\n\r\nexport const versionedCacheDir = `v${fsgVersion.split('.').slice(0, 2).join('.')}.x`;","/**\r\n * Flatten CodeSystem concepts (collect all nested {code, display}).\r\n * Returns a Map<code, display?>.\r\n */\r\nexport function flattenCodeSystemConcepts(cs: any): Map<string, string | undefined> {\r\n  const map = new Map<string, string | undefined>();\r\n  const walk = (concepts: any[]) => {\r\n    if (!Array.isArray(concepts)) return;\r\n    for (const c of concepts) {\r\n      if (c && typeof c === 'object' && typeof c.code === 'string') {\r\n        if (!map.has(c.code)) map.set(c.code, c.display);\r\n      }\r\n      if (Array.isArray(c?.concept)) walk(c.concept);\r\n    }\r\n  };\r\n  if (Array.isArray(cs?.concept)) walk(cs.concept);\r\n  return map;\r\n}\r\n","export type SystemCodeMap = Map<string, Map<string, string | undefined>>;\r\n\r\nexport function toSystemCodeMapFromContains(contains: any[] | undefined): SystemCodeMap {\r\n  const out: SystemCodeMap = new Map();\r\n  if (!Array.isArray(contains)) return out;\r\n  for (const item of contains) {\r\n    if (!item || typeof item !== 'object') continue;\r\n    const system: string | undefined = item.system;\r\n    const code: string | undefined = item.code;\r\n    if (!system || !code) continue;\r\n    if (!out.has(system)) out.set(system, new Map());\r\n    const m = out.get(system)!;\r\n    if (!m.has(code)) m.set(code, item.display);\r\n  }\r\n  return out;\r\n}\r\n\r\nexport function mergeSystemMaps(target: SystemCodeMap, source: SystemCodeMap): void {\r\n  for (const [system, codes] of source.entries()) {\r\n    if (!target.has(system)) target.set(system, new Map());\r\n    const t = target.get(system)!;\r\n    for (const [code, display] of codes.entries()) {\r\n      if (!t.has(code)) t.set(code, display);\r\n    }\r\n  }\r\n}\r\n\r\nexport function subtractSystemMaps(target: SystemCodeMap, exclude: SystemCodeMap): void {\r\n  for (const [system, codes] of exclude.entries()) {\r\n    const t = target.get(system);\r\n    if (!t) continue;\r\n    for (const code of codes.keys()) {\r\n      t.delete(code);\r\n    }\r\n  }\r\n}\r\n\r\nexport function buildExpansionFromSystemMap(map: SystemCodeMap): { contains: any[]; total: number } {\r\n  const contains: any[] = [];\r\n  for (const [system, codes] of map.entries()) {\r\n    for (const [code, display] of codes.entries()) {\r\n      contains.push({ system, code, display });\r\n    }\r\n  }\r\n  return { contains, total: contains.length };\r\n}\r\n","/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport {\r\n  defaultLogger,\r\n  DefinitionFetcher,\r\n  resolveBasePackage,\r\n  resolveFhirVersion,\r\n  applyDiffs,\r\n  migrateElements,\r\n  versionedCacheDir,\r\n  defaultPrethrow,\r\n  customPrethrower,\r\n  flattenCodeSystemConcepts,\r\n  toSystemCodeMapFromContains,\r\n  mergeSystemMaps,\r\n  subtractSystemMaps,\r\n  buildExpansionFromSystemMap\r\n} from './utils';\r\nimport path from 'path';\r\nimport fs from 'fs-extra';\r\n\r\nimport {\r\n  FhirPackageExplorer,\r\n  PackageIdentifier,\r\n  FileIndexEntryWithPkg\r\n} from 'fhir-package-explorer';\r\n\r\nimport {\r\n  ILogger,\r\n  BaseFhirVersion,\r\n  ElementDefinition,\r\n  SnapshotCacheMode,\r\n  SnapshotFetcher,\r\n  SnapshotGeneratorConfig,\r\n  Prethrower\r\n} from '../types';\r\n\r\nexport class FhirSnapshotGenerator {\r\n  private fpe: FhirPackageExplorer;\r\n  private logger: ILogger;\r\n  private prethrow: Prethrower;\r\n  private cachePath: string;\r\n  private cacheMode: SnapshotCacheMode;\r\n  private fhirVersion: BaseFhirVersion;\r\n  private fhirCorePackage: PackageIdentifier;\r\n  private resolvedBasePackages: Map<string, string> = new Map<string, string>(); // cache for resolved base packages\r\n\r\n  private constructor(fpe: FhirPackageExplorer, cacheMode: SnapshotCacheMode, fhirVersion: BaseFhirVersion, logger?: ILogger) {\r\n    if (logger) {\r\n      this.logger = logger;\r\n      this.prethrow = customPrethrower(this.logger);\r\n    } else {\r\n      this.logger = defaultLogger;\r\n      this.prethrow = defaultPrethrow;\r\n    }\r\n    this.cacheMode = cacheMode;\r\n    this.fhirVersion = fhirVersion;\r\n    this.fhirCorePackage = resolveFhirVersion(fhirVersion, true) as PackageIdentifier;\r\n    this.fpe = fpe;\r\n    this.cachePath = fpe.getCachePath();\r\n  };\r\n\r\n  /**\r\n   * Creates a new instance of the FhirSnapshotGenerator class.\r\n   * @param config - the configuration object for the FhirPackageExplorer\r\n   * @returns - a promise that resolves to a new instance of the FhirSnapshotGenerator class\r\n   */\r\n  static async create(config: SnapshotGeneratorConfig): Promise<FhirSnapshotGenerator> {\r\n    const logger = config.logger || defaultLogger; // use provided logger or default\r\n    const prethrow = config.logger ? customPrethrower(logger) : defaultPrethrow;\r\n    \r\n    try {\r\n      const cacheMode = config.cacheMode || 'lazy'; // default cache mode\r\n      const fhirVersion = resolveFhirVersion(config.fhirVersion || '4.0.1') as BaseFhirVersion; // default FHIR version\r\n      const fpeConfig = { ...config, skipExamples: true }; // force skipExamples=true\r\n\r\n      delete fpeConfig.cacheMode; // remove cacheMode (fsg-only feature)\r\n      delete fpeConfig.fhirVersion; // remove fhirVersion (fsg-only feature)\r\n      let fpe = await FhirPackageExplorer.create(fpeConfig);\r\n      // check if a base FHIR package is in the fpe context\r\n      const packagesInContext = fpe.getContextPackages();\r\n      const fhirCorePackage = resolveFhirVersion(fhirVersion, true) as PackageIdentifier;\r\n      if (!packagesInContext.find(pkg => pkg.id === fhirCorePackage.id && pkg.version === fhirCorePackage.version)) {\r\n        logger.warn(`No FHIR base package found in the context for version ${fhirVersion}. Adding: ${fhirCorePackage}.`);\r\n        fpeConfig.context = [...fpeConfig.context, fhirCorePackage];\r\n        // replace fpe instance with a new one that includes the base package\r\n        fpe = await FhirPackageExplorer.create(fpeConfig);\r\n      };\r\n\r\n      // Create a new FhirSnapshotGenerator instance\r\n      const fsg = new FhirSnapshotGenerator(fpe, cacheMode, fhirVersion, config.logger);\r\n\r\n      let precache: boolean = false;\r\n\r\n      // 'ensure' and 'rebuild' cache modes both trigger a walkthrough of all structure definitions.\r\n      // The difference is that 'rebuild' will first delete all existing snapshots in the cache.\r\n      if (cacheMode === 'rebuild') {\r\n        precache = true;\r\n        // delete all existing snapshots in the cache for the packages in the context\r\n        const packageList = fpe.getContextPackages().map(pkg => path.join(fpe.getCachePath(), `${pkg.id}#${pkg.version}`, '.fsg.snapshots', versionedCacheDir));\r\n        // for each path, delete the directory if it exists\r\n        for (const snapshotCacheDir of packageList) {\r\n          if (await fs.exists(snapshotCacheDir)) {\r\n            fs.removeSync(snapshotCacheDir);\r\n          }\r\n        }\r\n      }\r\n\r\n      if (cacheMode === 'ensure') precache = true;\r\n\r\n      if (precache) {\r\n        logger.info(`Pre-caching snapshots in '${cacheMode}' mode...`);\r\n        // lookup all *profiles* in the FPE context and ensure their snapshots are cached.\r\n        const allSds = await fpe.lookupMeta({ resourceType: 'StructureDefinition', derivation: 'constraint' });\r\n        const errors: string[] = [];\r\n        for (const sd of allSds) {\r\n          const { filename, __packageId: packageId, __packageVersion: packageVersion, url } = sd;\r\n          try {\r\n            await fsg.ensureSnapshotCached(filename, packageId, packageVersion);\r\n          } catch (e) {\r\n            errors.push(`Failed to ${cacheMode} snapshot for '${url}' in package '${packageId}@${packageVersion}': ${\r\n              e instanceof Error ? e.message : String(e)\r\n            }`\r\n            );\r\n          }\r\n        }\r\n        if (errors.length > 0) {\r\n          logger.error(`Errors during pre-caching snapshots (${errors.length} total):\\n${errors.join('\\n')}`);\r\n        } else {\r\n          logger.info(`Pre-caching snapshots in '${cacheMode}' mode completed successfully.`);\r\n        }\r\n\r\n        // Pre-cache ValueSet expansions as well\r\n        logger.info(`Pre-caching ValueSet expansions in '${cacheMode}' mode...`);\r\n        const vsErrors: string[] = [];\r\n        const allVs = await fpe.lookupMeta({ resourceType: 'ValueSet' });\r\n        for (const vs of allVs) {\r\n          const { filename, __packageId: packageId, __packageVersion: packageVersion, url } = vs as any;\r\n          try {\r\n            await fsg.ensureExpansionCached(filename, packageId, packageVersion);\r\n          } catch (e) {\r\n            // tolerate failures\r\n            vsErrors.push(`Failed to ${cacheMode} expansion for '${url || filename}' in package '${packageId}@${packageVersion}': ${e instanceof Error ? e.message : String(e)}`);\r\n          }\r\n        }\r\n        if (vsErrors.length > 0) {\r\n          logger.warn(`Errors during pre-caching ValueSet expansions (${vsErrors.length} total):\\n${vsErrors.join('\\n')}`);\r\n        } else {\r\n          logger.info(`Pre-caching ValueSet expansions in '${cacheMode}' mode completed successfully.`);\r\n        }\r\n      }\r\n      return fsg;\r\n    } catch (e) {\r\n      throw prethrow(e);\r\n    }\r\n  };\r\n\r\n  public getLogger(): ILogger {\r\n    return this.logger;\r\n  }\r\n\r\n  public getCachePath(): string {\r\n    return this.cachePath;\r\n  }\r\n\r\n  public getCacheMode(): SnapshotCacheMode {\r\n    return this.cacheMode;\r\n  };\r\n\r\n  public getFhirVersion(): BaseFhirVersion {\r\n    return this.fhirVersion;\r\n  };\r\n\r\n  public getFpe(): FhirPackageExplorer {\r\n    return this.fpe;\r\n  }\r\n\r\n  /**\r\n   * Get the core FHIR package for a specific FHIR package.\r\n   * Will try to resolve the core package based on the direct dependencies of the source package or its fhirVersions array.\r\n   * Defaults to the FHIR package of this instance's fhirVersion if no base package can be determined.\r\n   * @param sourcePackage The source package identifier (e.g., { id: 'hl7.fhir.us.core', version: '6.1.0' }).\r\n   * @returns The core FHIR package identifier (e.g., { id: 'hl7.fhir.r4.core', version: '4.0.1' }).\r\n   */\r\n  private async getCorePackage(sourcePackage: PackageIdentifier): Promise<PackageIdentifier> {\r\n    let baseFhirPackage: string | undefined = this.resolvedBasePackages.get(`${sourcePackage.id}@${sourcePackage.version}`);\r\n    if (!baseFhirPackage) { // try to resolve by dependency context\r\n      try {\r\n        baseFhirPackage = await resolveBasePackage(sourcePackage.id, sourcePackage.version, this.fpe, this.logger);\r\n      } catch (e) {\r\n        this.logger.warn(`Failed to resolve base FHIR package for '${sourcePackage.id}@${sourcePackage.version}': ${e instanceof Error ? e.message : String(e)}`);\r\n      }      \r\n    }\r\n    if (!baseFhirPackage) { // fallback to the default FHIR package\r\n      this.logger.warn(`Defaulting to core package ${this.fhirCorePackage.id}@${this.fhirCorePackage.version} for resolving FHIR types within '${sourcePackage.id}@${sourcePackage.version}'.`);\r\n      baseFhirPackage = `${this.fhirCorePackage.id}@${this.fhirCorePackage.version}`;\r\n    }\r\n    if (!baseFhirPackage) {\r\n      throw new Error(`No base FHIR package found for '${sourcePackage.id}@${sourcePackage.version}'.`);\r\n    }\r\n    this.resolvedBasePackages.set(`${sourcePackage.id}@${sourcePackage.version}`, baseFhirPackage);\r\n    const [id, version] = baseFhirPackage.split('@');\r\n    return { id, version };\r\n  }\r\n\r\n  /**\r\n   * Get an original StructureDefinition from a specific package by filename.\r\n   * After resolving the metadata using any other identifier (id, url, name), filename (combind with the package id and version)\r\n   * is the most reliable way to get to a specific StructureDefinition, and is also used as the basis for the cache.\r\n   */\r\n  private async getStructureDefinitionByFileName(filename: string, packageId: string, packageVersion: string): Promise<any> {\r\n    return await this.fpe.resolve({\r\n      filename,\r\n      package: {\r\n        id: packageId,\r\n        version: packageVersion\r\n      }\r\n    });\r\n  }\r\n\r\n  private getCacheFilePath(filename: string, packageId: string, packageVersion: string): string {\r\n    return path.join(this.cachePath, `${packageId}#${packageVersion}`, '.fsg.snapshots', versionedCacheDir, filename);\r\n  }\r\n\r\n  /**\r\n   * Try to get an existing cached StructureDefinition snapshot. If not found, return undefined.\r\n   */\r\n  private async getSnapshotFromCache(filename: string, packageId: string, packageVersion: string): Promise<any> {\r\n    const cacheFilePath = this.getCacheFilePath(filename, packageId, packageVersion);\r\n    if (await fs.exists(cacheFilePath)) {\r\n      return await fs.readJSON(cacheFilePath);\r\n    } else {\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  private async saveSnapshotToCache(filename: string, packageId: string, packageVersion: string, snapshot: any): Promise<void> {\r\n    const cacheFilePath = this.getCacheFilePath(filename, packageId, packageVersion);\r\n    await fs.ensureDir(path.dirname(cacheFilePath));\r\n    await fs.writeJSON(cacheFilePath, snapshot);\r\n  }\r\n\r\n  /**\r\n   * Fetch StructureDefinition metadata by any identifier (id, url, name) - FSH style.\r\n   */\r\n  public async getMetadata(identifier: string, packageFilter?: PackageIdentifier): Promise<FileIndexEntryWithPkg> {\r\n    const errors: any[] = [];\r\n    if (identifier.startsWith('http:') || identifier.startsWith('https:') || identifier.includes(':')) {\r\n      // the identifier is possibly a URL/URN - try and resolve it as such\r\n      try {\r\n        const match = await this.fpe.resolveMeta({ resourceType: 'StructureDefinition', url: identifier, package: packageFilter });\r\n        return match; // return the resolved match (with core-bias applied)\r\n      } catch (e) {\r\n        errors.push(e);\r\n      }\r\n    }\r\n    // Not a URL, or failed to resolve as URL - try and resolve it as ID\r\n    try {\r\n      const match = await this.fpe.resolveMeta({ resourceType: 'StructureDefinition', id: identifier, package: packageFilter });\r\n      return match; // return the resolved match (with core-bias applied)\r\n    } catch (e) {\r\n      errors.push(e);\r\n    }\r\n    // Couldn't resolve as ID - try and resolve it as name\r\n    try {\r\n      const match = await this.fpe.resolveMeta({ resourceType: 'StructureDefinition', name: identifier, package: packageFilter });\r\n      return match; // return the resolved match (with core-bias applied)\r\n    } catch (e) {\r\n      errors.push(e);\r\n    }\r\n    // Couldn't resolve at all - throw all errors\r\n    errors.map(e => this.logger.error(e));\r\n    throw new Error(`Failed to resolve StructureDefinition '${identifier}'`);\r\n  }\r\n\r\n  /**\r\n   * Generate a snapshot for a StructureDefinition.\r\n   */\r\n  private async generate(filename: string, packageId: string, packageVersion: string): Promise<any> {\r\n    this.logger.info(`Generating snapshot for '${filename}' in package '${packageId}@${packageVersion}'...`);\r\n    const sd = await this.getStructureDefinitionByFileName(filename, packageId, packageVersion);\r\n    if (!sd) {\r\n      throw new Error(`File '${filename}' not found in package '${packageId}@${packageVersion}'`);\r\n    }\r\n    if (!sd.baseDefinition) {\r\n      throw new Error(`StructureDefinition '${sd?.url}' does not have a baseDefinition`);\r\n    }\r\n    const baseFhirPackage = await this.getCorePackage({ id: packageId, version: packageVersion });\r\n    const snapshotFetcher: SnapshotFetcher = (async (url: string) => {\r\n      let metadata: FileIndexEntryWithPkg;\r\n      try {\r\n        metadata = await this.fpe.resolveMeta({ resourceType: 'StructureDefinition', url, package: {\r\n          id: packageId,\r\n          version: packageVersion\r\n        }});\r\n      } catch (e) {\r\n        this.logger.warn(`Failed to resolve metadata for '${url}' in package '${packageId}@${packageVersion}': ${e instanceof Error ? e.message : String(e)}`);\r\n        // try to resolve outside package context\r\n        metadata = await this.fpe.resolveMeta({ resourceType: 'StructureDefinition', url });\r\n      }\r\n      return (await this.getSnapshotByMeta(metadata)).snapshot?.element as ElementDefinition[];\r\n    }).bind(this);\r\n    const fetcher = new DefinitionFetcher(\r\n      {\r\n        id: packageId,\r\n        version: packageVersion\r\n      },\r\n      baseFhirPackage,\r\n      this.fpe,\r\n      snapshotFetcher\r\n    );\r\n    const diffs = sd.differential?.element;\r\n    if (!diffs || diffs.length === 0) {\r\n      throw new Error(`StructureDefinition '${filename}' does not have a differential`);\r\n    }\r\n    let baseSnapshot: ElementDefinition[] | undefined;\r\n    try {\r\n      baseSnapshot = await snapshotFetcher(sd.baseDefinition);\r\n      if (!baseSnapshot || baseSnapshot.length === 0) {\r\n        throw new Error(`Base definition '${sd.baseDefinition}' does not have a snapshot`);\r\n      }\r\n      const migratedBaseSnapshot = migrateElements(baseSnapshot, sd.baseDefinition);\r\n      const generated = await applyDiffs(migratedBaseSnapshot, diffs, fetcher, this.logger);\r\n      return { __corePackage: baseFhirPackage, ...sd, snapshot: { element: generated } };\r\n    } catch (e) {\r\n      this.logger.warn(`Failed to generate snapshot for '${sd.url}': ${e instanceof Error ? e.message : String(e)}\\nUsing the original StructureDefinition from source package.`);\r\n      // if sd doesn't have a snapshot, throw an error\r\n      if (!sd.snapshot || !sd.snapshot.element || sd.snapshot.element.length === 0) {\r\n        throw new Error(`The original StructureDefinition '${sd.url}' does not have a snapshot`);\r\n      }\r\n      return { __corePackage: baseFhirPackage, ...sd };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get snapshot by metadata.\r\n   */\r\n  private async getSnapshotByMeta(metadata: FileIndexEntryWithPkg): Promise<any> {\r\n    const { derivation, filename, __packageId: packageId, __packageVersion: packageVersion } = metadata;\r\n    if (!derivation || derivation === 'specialization') {\r\n      // It's a base type, return the snapshot from the original StructureDefinition\r\n      const sd = await this.getStructureDefinitionByFileName(filename, packageId, packageVersion);\r\n      const elements = sd?.snapshot?.element as ElementDefinition[];\r\n      if (!elements || elements.length === 0) {\r\n        throw new Error(`StructureDefinition '${metadata.url}' does not have a snapshot`);\r\n      }\r\n      return { __corePackage: { id: packageId, version: packageVersion }, ...sd };\r\n    }\r\n    // It's a profile, return a snapshot from cache or generate a new one\r\n    const cached = this.cacheMode !== 'none' ? await this.getSnapshotFromCache(\r\n      filename,\r\n      packageId,\r\n      packageVersion\r\n    ) : undefined;\r\n    if (cached) return cached;\r\n    const generated = await this.generate(filename, packageId, packageVersion);\r\n    if (this.cacheMode !== 'none') {\r\n      await this.saveSnapshotToCache(filename, packageId, packageVersion, generated);\r\n    }\r\n    return generated;\r\n  }\r\n\r\n  // ValueSet helpers\r\n  private async getValueSetByFileName(filename: string, packageId: string, packageVersion: string): Promise<any> {\r\n    return await this.fpe.resolve({ filename, package: { id: packageId, version: packageVersion } });\r\n  }\r\n\r\n  private async getValueSetMetadata(identifier: string, packageFilter?: PackageIdentifier): Promise<FileIndexEntryWithPkg> {\r\n    const errors: any[] = [];\r\n    if (identifier.startsWith('http:') || identifier.startsWith('https:') || identifier.includes(':')) {\r\n      try {\r\n        const match = await this.fpe.resolveMeta({ resourceType: 'ValueSet', url: identifier, package: packageFilter });\r\n        return match; // return the resolved match (with core-bias applied)\r\n      } catch (e) {\r\n        errors.push(e);\r\n      }\r\n    }\r\n    // Not a URL, or failed to resolve as URL - try and resolve it as ID\r\n    try {\r\n      const match = await this.fpe.resolveMeta({ resourceType: 'ValueSet', id: identifier, package: packageFilter });\r\n      return match; // return the resolved match (with core-bias applied)\r\n    } catch (e) {\r\n      errors.push(e);\r\n    }\r\n    // Couldn't resolve as ID - try and resolve it as name\r\n    try {\r\n      const match = await this.fpe.resolveMeta({ resourceType: 'ValueSet', name: identifier, package: packageFilter });\r\n      return match; // return the resolved match (with core-bias applied)\r\n    } catch (e) {\r\n      errors.push(e);\r\n    }\r\n    // Couldn't resolve at all - throw all errors\r\n    errors.map(e => this.logger.error(e));\r\n    throw new Error(`Failed to resolve ValueSet '${identifier}'`);\r\n  }\r\n\r\n  private async getExpansionFromCache(filename: string, packageId: string, packageVersion: string): Promise<any | undefined> {\r\n    const cacheFilePath = this.getCacheFilePath(filename, packageId, packageVersion);\r\n    if (await fs.exists(cacheFilePath)) {\r\n      return await fs.readJSON(cacheFilePath);\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private async saveExpansionToCache(filename: string, packageId: string, packageVersion: string, vs: any): Promise<void> {\r\n    const cacheFilePath = this.getCacheFilePath(filename, packageId, packageVersion);\r\n    await fs.ensureDir(path.dirname(cacheFilePath));\r\n    await fs.writeJSON(cacheFilePath, vs);\r\n  }\r\n\r\n  // Flatten CodeSystem concepts (collect all nested {code, display})\r\n  private flattenCodeSystemConcepts(cs: any): Map<string, string | undefined> {\r\n    return flattenCodeSystemConcepts(cs);\r\n  }\r\n\r\n  private toSystemCodeMapFromContains(contains: any[] | undefined): Map<string, Map<string, string | undefined>> {\r\n    return toSystemCodeMapFromContains(contains);\r\n  }\r\n\r\n  private mergeSystemMaps(target: Map<string, Map<string, string | undefined>>, source: Map<string, Map<string, string | undefined>>): void {\r\n    mergeSystemMaps(target as any, source as any);\r\n  }\r\n\r\n  private subtractSystemMaps(target: Map<string, Map<string, string | undefined>>, exclude: Map<string, Map<string, string | undefined>>): void {\r\n    subtractSystemMaps(target as any, exclude as any);\r\n  }\r\n\r\n  private buildExpansionFromSystemMap(map: Map<string, Map<string, string | undefined>>): { contains: any[], total: number } {\r\n    return buildExpansionFromSystemMap(map as any);\r\n  }\r\n\r\n  private async expandInclude(\r\n    include: any,\r\n    sourcePackage: PackageIdentifier,\r\n    visited: Set<string>\r\n  ): Promise<Map<string, Map<string, string | undefined>>> {\r\n    if (include.filter && include.filter.length) {\r\n      throw new Error('Unsupported ValueSet.include.filter encountered. Filtering is not implemented yet.');\r\n    }\r\n\r\n    const result = new Map<string, Map<string, string | undefined>>();\r\n\r\n    // Referenced ValueSets\r\n    let vsUnion = new Map<string, Map<string, string | undefined>>();\r\n    const referenced = Array.isArray(include.valueSet) ? include.valueSet : (include.valueSet ? [include.valueSet] : []);\r\n    for (const vsUrl of referenced) {\r\n      if (typeof vsUrl !== 'string') continue;\r\n      if (visited.has(vsUrl)) {\r\n        throw new Error(`Cyclic ValueSet reference detected: '${vsUrl}'.`);\r\n      }\r\n      visited.add(vsUrl);\r\n      // resolve referenced ValueSet metadata first within source package, then fallback globally\r\n      let vsMeta: FileIndexEntryWithPkg;\r\n      try {\r\n        vsMeta = await this.fpe.resolveMeta({ resourceType: 'ValueSet', url: vsUrl, package: sourcePackage });\r\n      } catch {\r\n        try {\r\n          vsMeta = await this.fpe.resolveMeta({ resourceType: 'ValueSet', url: vsUrl });\r\n        } catch {\r\n          throw new Error(`Referenced ValueSet '${vsUrl}' not found (searched locally, then globally).`);\r\n        }\r\n      }\r\n      const vsExpanded = await this.expandValueSetByMeta(vsMeta, visited);\r\n      const map = this.toSystemCodeMapFromContains(vsExpanded?.expansion?.contains);\r\n      this.mergeSystemMaps(vsUnion, map);\r\n    }\r\n\r\n    // Build concepts from system/concept in include\r\n    const hasSystem = typeof include.system === 'string' && include.system.length > 0;\r\n    const hasConcepts = Array.isArray(include.concept) && include.concept.length > 0;\r\n\r\n    const conceptMap = new Map<string, Map<string, string | undefined>>();\r\n    if (hasSystem) {\r\n      const systemUrl: string = include.system;\r\n      let codesForSystem = new Map<string, string | undefined>();\r\n      if (hasConcepts) {\r\n        // explicit concepts with optional display; resolve CodeSystem only if any concept is missing a display\r\n        let csDict: Map<string, string | undefined> | undefined;\r\n        const needsCsLookup = include.concept.some((c: any) => !c?.display);\r\n        if (needsCsLookup) {\r\n          try {\r\n            const cs = await this.resolveCompleteCodeSystem(systemUrl, sourcePackage);\r\n            csDict = this.flattenCodeSystemConcepts(cs);\r\n          } catch (e) {\r\n            // CodeSystem lookup failed (e.g., content='not-present' like UCUM)\r\n            // Fall back to using code as display (matches HL7 spec behavior)\r\n            this.logger.warn(`CodeSystem lookup failed for '${systemUrl}', using codes as displays: ${e instanceof Error ? e.message : String(e)}`);\r\n            csDict = undefined;\r\n          }\r\n        }\r\n        for (const c of include.concept) {\r\n          if (!c?.code) continue;\r\n          const display: string | undefined = typeof c.display === 'string' ? c.display : (csDict?.get(c.code) ?? c.code);\r\n          if (!codesForSystem.has(c.code)) codesForSystem.set(c.code, display);\r\n        }\r\n      } else {\r\n        // all concepts from CodeSystem\r\n        const cs = await this.resolveCompleteCodeSystem(systemUrl, sourcePackage);\r\n        codesForSystem = this.flattenCodeSystemConcepts(cs);\r\n      }\r\n      conceptMap.set(systemUrl, codesForSystem);\r\n    }\r\n\r\n    // Combine with referenced VS per JSONata rules\r\n    if (vsUnion.size > 0) {\r\n      if (hasSystem) {\r\n        // Intersect for that system\r\n        const systemUrl: string = include.system;\r\n        const concepts = conceptMap.get(systemUrl) || new Map<string, string | undefined>();\r\n        const refMap = vsUnion.get(systemUrl) || new Map<string, string | undefined>();\r\n        const intersection = new Map<string, string | undefined>();\r\n        for (const [code, disp] of concepts.entries()) {\r\n          if (refMap.has(code)) intersection.set(code, disp);\r\n        }\r\n        if (intersection.size > 0) result.set(systemUrl, intersection);\r\n      } else {\r\n        // No system provided: pass through union from referenced VS\r\n        this.mergeSystemMaps(result, vsUnion);\r\n      }\r\n    } else {\r\n      // No referenced VS: return concepts as-is\r\n      this.mergeSystemMaps(result, conceptMap);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  private async expandValueSetByMeta(metadata: FileIndexEntryWithPkg, visited: Set<string> = new Set()): Promise<any> {\r\n    const { filename, __packageId: packageId, __packageVersion: packageVersion } = metadata;\r\n\r\n    // Check cache\r\n    const cached = this.cacheMode !== 'none' ? await this.getExpansionFromCache(filename, packageId, packageVersion) : undefined;\r\n    if (cached) {\r\n      if (cached?.expansion?.__failure === true) {\r\n        // Prior attempt already failed; short-circuit without recomputation\r\n        throw new Error(`Previous expansion attempt failed for ValueSet '${(cached.url || cached.id || filename)}' (cached).`);\r\n      }\r\n      return cached;\r\n    }\r\n\r\n    // Load original VS\r\n    const vs = await this.getValueSetByFileName(filename, packageId, packageVersion);\r\n    if (!vs || vs.resourceType !== 'ValueSet') throw new Error(`File '${filename}' not found as a ValueSet in package '${packageId}@${packageVersion}'.`);\r\n\r\n    try {\r\n      const compose = vs.compose || {};\r\n      const includes = Array.isArray(compose.include) ? compose.include : [];\r\n      const excludes = Array.isArray(compose.exclude) ? compose.exclude : [];\r\n\r\n      // Build include union map\r\n      let includeMap = new Map<string, Map<string, string | undefined>>();\r\n      for (const inc of includes) {\r\n        const incMap = await this.expandInclude(inc, { id: packageId, version: packageVersion }, visited);\r\n        this.mergeSystemMaps(includeMap, incMap);\r\n      }\r\n      // Build exclude union map\r\n      let excludeMap = new Map<string, Map<string, string | undefined>>();\r\n      for (const exc of excludes) {\r\n        const excMap = await this.expandInclude(exc, { id: packageId, version: packageVersion }, visited);\r\n        this.mergeSystemMaps(excludeMap, excMap);\r\n      }\r\n      // Subtract excludes\r\n      this.subtractSystemMaps(includeMap, excludeMap);\r\n\r\n      const { contains, total } = this.buildExpansionFromSystemMap(includeMap);\r\n      const expanded = { ...vs, expansion: { timestamp: new Date().toISOString(), total, contains } };\r\n\r\n      if (this.cacheMode !== 'none') {\r\n        await this.saveExpansionToCache(filename, packageId, packageVersion, expanded);\r\n      }\r\n      return expanded;\r\n    } catch (e) {\r\n      this.logger.warn(`Failed to expand ValueSet '${vs?.url || vs?.id || filename}': ${e instanceof Error ? e.message : String(e)}. Falling back to original expansion if present.`);\r\n      if (vs?.expansion?.contains && Array.isArray(vs.expansion.contains)) {\r\n        // Cache the original as well to avoid repeated regeneration attempts\r\n        if (this.cacheMode !== 'none') {\r\n          await this.saveExpansionToCache(filename, packageId, packageVersion, vs);\r\n        }\r\n        return vs;\r\n      }\r\n      // No usable fallback expansion. Cache a stub marking failure to avoid repeated expensive retries.\r\n      if (this.cacheMode !== 'none') {\r\n        const failureStub = { ...vs, expansion: { timestamp: new Date().toISOString(), __failure: true } };\r\n        try { await this.saveExpansionToCache(filename, packageId, packageVersion, failureStub); } catch { /* ignore */ }\r\n      }\r\n      throw e;\r\n    }\r\n  }\r\n\r\n  private async ensureExpansionCached(filename: string, packageId: string, packageVersion: string): Promise<void> {\r\n    const cacheFilePath = this.getCacheFilePath(filename, packageId, packageVersion);\r\n    try {\r\n      await fs.access(cacheFilePath);\r\n      return; // already cached\r\n    } catch {\r\n      const meta: FileIndexEntryWithPkg = { resourceType: 'ValueSet', filename, __packageId: packageId, __packageVersion: packageVersion } as any;\r\n      try {\r\n        await this.expandValueSetByMeta(meta);\r\n      } catch (e) {\r\n        // tolerate failures during pre-generation\r\n        this.logger.warn(`Failed to pre-cache ValueSet expansion for '${filename}' in '${packageId}@${packageVersion}': ${e instanceof Error ? e.message : String(e)}`);\r\n      }\r\n    }\r\n  }\r\n\r\n  private async ensureSnapshotCached(filename: string, packageId: string, packageVersion: string): Promise<void> {\r\n    // Check if file exists in the cache\r\n    const cacheFilePath = this.getCacheFilePath(filename, packageId, packageVersion);\r\n    try {\r\n      await fs.access(cacheFilePath);\r\n      return; // Snapshot is already cached\r\n    } catch {\r\n      // File does not exist, continue to build and cache\r\n      const generated = await this.generate(filename, packageId, packageVersion);\r\n      await this.saveSnapshotToCache(filename, packageId, packageVersion, generated); \r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get snapshot by any FSH style identifier (id, url or name), or by a metadata object.\r\n   */\r\n  public async getSnapshot(identifier: string | FileIndexEntryWithPkg, packageFilter?: PackageIdentifier): Promise<any> {\r\n    try {\r\n      let metadata: FileIndexEntryWithPkg | undefined;\r\n      if (typeof identifier === 'string') {\r\n        // If identifier is a string, resolve it to metadata\r\n        metadata = await this.getMetadata(identifier, packageFilter);\r\n        if (!metadata) {\r\n          throw new Error(`StructureDefinition '${identifier}' not found in context. Could not get or generate a snapshot.`);\r\n        }\r\n      } else {\r\n        metadata = identifier as FileIndexEntryWithPkg;\r\n        if (!metadata) {\r\n          // create a human readable string from the metadata object\r\n          throw new Error(`StructureDefinition with metadata: \\n${JSON.stringify(identifier, null, 2)}\\nnot found in context. Could not get or generate a snapshot.`);\r\n        }\r\n      }\r\n      return await this.getSnapshotByMeta(metadata);\r\n    } catch (e) {\r\n      throw this.prethrow(e);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get ValueSet expansion by any FSH style identifier (id, url or name), or by a metadata object.\r\n   */\r\n  public async expandValueSet(identifier: string | FileIndexEntryWithPkg, packageFilter?: PackageIdentifier): Promise<any> {\r\n    try {\r\n      let metadata: FileIndexEntryWithPkg | undefined;\r\n      if (typeof identifier === 'string') {\r\n        metadata = await this.getValueSetMetadata(identifier, packageFilter);\r\n        if (!metadata) {\r\n          throw new Error(`ValueSet '${identifier}' not found in context. Could not get or generate an expansion.`);\r\n        }\r\n      } else {\r\n        metadata = identifier as FileIndexEntryWithPkg;\r\n        if (!metadata) {\r\n          throw new Error(`ValueSet with metadata: \\n${JSON.stringify(identifier, null, 2)}\\nnot found in context. Could not get or generate an expansion.`);\r\n        }\r\n      }\r\n      return await this.expandValueSetByMeta(metadata);\r\n    } catch (e) {\r\n      throw this.prethrow(e);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Resolve a CodeSystem by canonical URL inside the provided source package context.\r\n   * Will NOT attempt a global resolution fallback (that is the responsibility of the external caller / entrypoint).\r\n   * Only CodeSystems with content === 'complete' are eligible for expansion; if not complete an error is thrown.\r\n   * @param url Canonical URL of the CodeSystem.\r\n   * @param sourcePackage The package (id + version) of the ValueSet that is triggering this resolution.\r\n   * @returns The full CodeSystem resource (content=complete).\r\n   */\r\n  public async resolveCompleteCodeSystem(url: string, sourcePackage: PackageIdentifier): Promise<any> {\r\n    try {\r\n      if (!url) {\r\n        throw new Error('CodeSystem canonical URL missing.');\r\n      }\r\n\r\n      // Prefer a semver-aware single resolution inside the source package context first.\r\n      // resolveMeta will internally pick the best version match instead of returning multiples.\r\n      let meta: any | undefined;\r\n      try {\r\n        meta = await this.fpe.resolveMeta({ resourceType: 'CodeSystem', url, package: sourcePackage });\r\n      } catch {\r\n        // swallow and fallback to global resolution\r\n      }\r\n\r\n      if (!meta) {\r\n        try {\r\n          meta = await this.fpe.resolveMeta({ resourceType: 'CodeSystem', url });\r\n        } catch {\r\n          throw new Error(`CodeSystem '${url}' not found (searched in package '${sourcePackage.id}@${sourcePackage.version}' then globally).`);\r\n        }\r\n      }\r\n\r\n      if (!meta?.content || (typeof meta?.content === 'string' && meta.content !== 'complete')) {\r\n        throw new Error(`CodeSystem '${url}' has content='${meta.content}' and cannot be expanded (only 'complete' supported).`);\r\n      }\r\n\r\n      const cs = await this.fpe.resolve({ filename: meta.filename, package: { id: meta.__packageId, version: meta.__packageVersion } });\r\n      if (!cs) {\r\n        throw new Error(`Failed to load CodeSystem '${url}' from package '${meta.__packageId}@${meta.__packageVersion}'.`);\r\n      }\r\n      if (cs.resourceType !== 'CodeSystem') {\r\n        throw new Error(`Resolved resource for '${url}' is not a CodeSystem (got '${cs.resourceType || 'unknown'}').`);\r\n      }\r\n      if (cs.content !== 'complete') {\r\n        throw new Error(`CodeSystem '${url}' has content='${cs.content || 'undefined'}' and cannot be expanded (only 'complete' supported).`);\r\n      }\r\n      return cs;\r\n    } catch (e) {\r\n      throw this.prethrow(e);\r\n    }\r\n  }\r\n};\r\n\r\nexport type {\r\n  ElementDefinition,\r\n  ILogger,\r\n  BaseFhirVersion,\r\n  SnapshotCacheMode,\r\n  SnapshotGeneratorConfig,\r\n  SnapshotFetcher,\r\n  Prethrower,\r\n  FhirExtensionInstance,\r\n  ElementConstraint,\r\n  ElementDefinitionType,\r\n  ElementDefinitionSlicing,\r\n  SlicingDiscriminator,\r\n  ElementDefinitionBinding,\r\n  FhirTreeNode\r\n} from '../types';\r\n\r\n// Re-export useful types from dependencies\r\nexport type { PackageIdentifier } from 'fhir-package-explorer';\r\n"]}