{"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/index.ts"],"names":["rewrite","slice","version","DefinitionFetcher","elements"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\r\n *   Project name: fhir-snapshot-generator\r\n */\r\n\r\nimport { ElementDefinition, Logger } from '@outburn/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: Logger): 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 {\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 '@outburn/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  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 { ElementDefinition, Logger } from '@outburn/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: Logger,\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      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 '@outburn/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  const base = element.base as { max?: string } | undefined;\r\n  if (base?.max && (base.max === '*' || parseInt(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 '@outburn/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 '@outburn/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] as any[] | undefined) || [];\r\n      const diffArr = (diff[key] as any[] | undefined) || [];\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 as string[];\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 '@outburn/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 '@outburn/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 '@outburn/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 } from '../../../types';\r\nimport { ElementDefinition, ElementDefinitionType } from '@outburn/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 } from '../../../types';\r\nimport { ElementDefinition } from '@outburn/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 { FhirTreeNode } from '../../../types';\r\nimport { ElementDefinition } from '@outburn/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 { Prethrower } from '../../../types';\r\nimport { Logger } from '@outburn/types';\r\n\r\n/**\r\n * default logger uses global console methods\r\n */\r\nexport const defaultLogger: Logger = {\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: Logger): 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 { FhirVersion, FhirPackageIdentifier, FhirRelease } from '@outburn/types';\r\n\r\nconst fhirVersionMap: Record<string, FhirRelease> = {\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: Record<FhirRelease, string> = {\r\n  'STU3': 'hl7.fhir.r3.core@3.0.2',\r\n  'R3': '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: FhirVersion, toPackage?: boolean): FhirRelease | FhirPackageIdentifier => {\r\n  const canonicalVersion: FhirRelease = fhirVersionMap[version] || (version as FhirRelease);\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 } from 'fhir-package-explorer';\r\nimport { Logger, FhirPackageIdentifier, FhirVersion } from '@outburn/types';\r\nimport { fhirCorePackages, resolveFhirVersion } from './resolveFhirVersion';\r\n\r\nconst findCorePackage = async (pkg: FhirPackageIdentifier, fpe: FhirPackageExplorer): Promise<FhirPackageIdentifier[]> => {\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: Logger): 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 FhirVersion, true) as FhirPackageIdentifier | 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 } from 'fhir-package-explorer';\r\nimport { SnapshotFetcher } from '../../../types';\r\nimport { ElementDefinition, FhirPackageIdentifier } from '@outburn/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: FhirPackageIdentifier;\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: FhirPackageIdentifier;\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: FhirPackageIdentifier, corePackage: FhirPackageIdentifier, 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\": \"2.0.0\",\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.7.0\",\r\n    \"fs-extra\": \"^11.3.3\"\r\n  },\r\n  \"devDependencies\": {\r\n    \"@eslint/js\": \"^9.24.0\",\r\n    \"@outburn/types\": \"^0.1.0\",\r\n    \"@types/fs-extra\": \"^11.0.4\",\r\n    \"eslint\": \"^9.39.2\",\r\n    \"fsh-sushi\": \"^3.17.0\",\r\n    \"rimraf\": \"^6.1.2\",\r\n    \"tsup\": \"^8.5.1\",\r\n    \"typescript\": \"^5.9.3\",\r\n    \"typescript-eslint\": \"^8.51.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 * © 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} from './utils';\r\nimport path from 'path';\r\nimport fs from 'fs-extra';\r\n\r\nimport {\r\n  FhirPackageExplorer\r\n} from 'fhir-package-explorer';\r\n\r\nimport {\r\n  FileIndexEntryWithPkg\r\n} from '@outburn/types';\r\n\r\nimport {\r\n  SnapshotCacheMode,\r\n  SnapshotFetcher,\r\n  SnapshotGeneratorConfig,\r\n  Prethrower\r\n} from '../types';\r\n\r\nimport {\r\n  Logger,\r\n  FhirPackageIdentifier,\r\n  FhirVersion,\r\n  ElementDefinition\r\n} from '@outburn/types';\r\n\r\nexport class FhirSnapshotGenerator {\r\n  private fpe: FhirPackageExplorer;\r\n  private logger: Logger;\r\n  private prethrow: Prethrower;\r\n  private cachePath: string;\r\n  private cacheMode: SnapshotCacheMode;\r\n  private fhirVersion: FhirVersion;\r\n  private fhirCorePackage: FhirPackageIdentifier;\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: FhirVersion, logger: Logger) {\r\n    this.logger = logger;\r\n    this.prethrow = customPrethrower(this.logger);\r\n    this.cacheMode = cacheMode;\r\n    this.fhirVersion = fhirVersion;\r\n    this.fhirCorePackage = resolveFhirVersion(fhirVersion, true) as FhirPackageIdentifier;\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 including the FhirPackageExplorer instance\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 { fpe } = config;\r\n      if (!fpe) {\r\n        throw new Error('FhirPackageExplorer instance is required in config.fpe');\r\n      }\r\n\r\n      const cacheMode = config.cacheMode || 'lazy'; // default cache mode\r\n      const fhirVersion = resolveFhirVersion(config.fhirVersion) as FhirVersion;\r\n\r\n      // Create a new FhirSnapshotGenerator instance\r\n      const fsg = new FhirSnapshotGenerator(fpe, cacheMode, fhirVersion, 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      }\r\n      return fsg;\r\n    } catch (e) {\r\n      throw prethrow(e);\r\n    }\r\n  };\r\n\r\n  public getLogger(): Logger {\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(): FhirVersion {\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: FhirPackageIdentifier): Promise<FhirPackageIdentifier> {\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?: FhirPackageIdentifier): 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\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?: FhirPackageIdentifier): 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};\r\n\r\nexport type {\r\n  SnapshotCacheMode,\r\n  SnapshotGeneratorConfig,\r\n  SnapshotFetcher,\r\n  Prethrower,\r\n  FhirTreeNode\r\n} from '../types';\r\n\r\n"]}