@precisa-saude/fhir 0.25.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/biomarkers.cjs +2 -2
  2. package/dist/biomarkers.js +1 -1
  3. package/dist/{chunk-QULBXISC.js → chunk-37LQWDN7.js} +8 -2
  4. package/dist/chunk-37LQWDN7.js.map +1 -0
  5. package/dist/{chunk-ERALICUK.cjs → chunk-4NSBIPLW.cjs} +8 -2
  6. package/dist/chunk-4NSBIPLW.cjs.map +1 -0
  7. package/dist/{chunk-IBF6HOBG.cjs → chunk-ABCHG3CF.cjs} +26 -3
  8. package/dist/chunk-ABCHG3CF.cjs.map +1 -0
  9. package/dist/{chunk-BNG4YNY2.js → chunk-BA26FWOG.js} +26 -3
  10. package/dist/chunk-BA26FWOG.js.map +1 -0
  11. package/dist/{chunk-2F3TXKDI.js → chunk-JFSIRIBM.js} +2 -2
  12. package/dist/{chunk-DGTP2QB6.cjs → chunk-TA4B4WB7.cjs} +3 -3
  13. package/dist/{chunk-DGTP2QB6.cjs.map → chunk-TA4B4WB7.cjs.map} +1 -1
  14. package/dist/{chunk-PXDGYFGR.js → chunk-UVCWSKPO.js} +2 -2
  15. package/dist/{chunk-Y7TOLJ2Y.cjs → chunk-YHLC3YNA.cjs} +7 -7
  16. package/dist/{chunk-Y7TOLJ2Y.cjs.map → chunk-YHLC3YNA.cjs.map} +1 -1
  17. package/dist/cli.js +33 -4
  18. package/dist/converter.cjs +3 -3
  19. package/dist/converter.js +2 -2
  20. package/dist/importer.cjs +3 -3
  21. package/dist/importer.js +2 -2
  22. package/dist/index.cjs +8 -8
  23. package/dist/index.js +4 -4
  24. package/dist/reference-ranges.cjs +2 -2
  25. package/dist/reference-ranges.js +1 -1
  26. package/package.json +1 -1
  27. package/dist/chunk-BNG4YNY2.js.map +0 -1
  28. package/dist/chunk-ERALICUK.cjs.map +0 -1
  29. package/dist/chunk-IBF6HOBG.cjs.map +0 -1
  30. package/dist/chunk-QULBXISC.js.map +0 -1
  31. /package/dist/{chunk-2F3TXKDI.js.map → chunk-JFSIRIBM.js.map} +0 -0
  32. /package/dist/{chunk-PXDGYFGR.js.map → chunk-UVCWSKPO.js.map} +0 -0
@@ -8,7 +8,7 @@ var _chunkOR67NJDZcjs = require('./chunk-OR67NJDZ.cjs');
8
8
 
9
9
 
10
10
 
11
- var _chunkIBF6HOBGcjs = require('./chunk-IBF6HOBG.cjs');
11
+ var _chunkABCHG3CFcjs = require('./chunk-ABCHG3CF.cjs');
12
12
 
13
13
 
14
14
  var _chunk3ILBFLVQcjs = require('./chunk-3ILBFLVQ.cjs');
@@ -33,11 +33,11 @@ function resolveBiomarkerCode(observation) {
33
33
  } else {
34
34
  reason = "No code found in observation coding";
35
35
  }
36
- const fromLoinc = loincCode ? _chunkIBF6HOBGcjs.loincToCode.call(void 0, loincCode) : void 0;
36
+ const fromLoinc = loincCode ? _chunkABCHG3CFcjs.loincToCode.call(void 0, loincCode) : void 0;
37
37
  if (fromLoinc) return { internalCode: fromLoinc, loincCode, reason };
38
- if (declaredCode && _chunkIBF6HOBGcjs.isValidCode.call(void 0, declaredCode)) {
39
- const canonical = _chunkIBF6HOBGcjs.normalizeCode.call(void 0, declaredCode);
40
- return { internalCode: canonical, loincCode: _chunkIBF6HOBGcjs.codeToLoinc.call(void 0, canonical), reason };
38
+ if (declaredCode && _chunkABCHG3CFcjs.isValidCode.call(void 0, declaredCode)) {
39
+ const canonical = _chunkABCHG3CFcjs.normalizeCode.call(void 0, declaredCode);
40
+ return { internalCode: canonical, loincCode: _chunkABCHG3CFcjs.codeToLoinc.call(void 0, canonical), reason };
41
41
  }
42
42
  return { loincCode, reason };
43
43
  }
@@ -74,7 +74,7 @@ function mapFHIRObservationToInternal(observation, index) {
74
74
  skipped: { index, loincCode, reason, resourceType: "Observation" }
75
75
  };
76
76
  }
77
- const definition = _chunkIBF6HOBGcjs.getDefinitionByCode.call(void 0, internalCode);
77
+ const definition = _chunkABCHG3CFcjs.getDefinitionByCode.call(void 0, internalCode);
78
78
  let value;
79
79
  let unit = "";
80
80
  let isQualitative = false;
@@ -162,4 +162,4 @@ function processImportBundle(data) {
162
162
 
163
163
 
164
164
  exports.MAX_OBSERVATIONS = MAX_OBSERVATIONS; exports.MAX_FILE_SIZE = MAX_FILE_SIZE; exports.extractObservationsFromBundle = extractObservationsFromBundle; exports.mapFHIRObservationToInternal = mapFHIRObservationToInternal; exports.processImportBundle = processImportBundle;
165
- //# sourceMappingURL=chunk-Y7TOLJ2Y.cjs.map
165
+ //# sourceMappingURL=chunk-YHLC3YNA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-Y7TOLJ2Y.cjs","../src/importer.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACgDA,IAAM,iBAAA,EAAmB,GAAA;AACzB,IAAM,cAAA,EAAgB,GAAA,EAAK,KAAA,EAAO,IAAA;AAclC,SAAS,oBAAA,CAAqB,WAAA,EAI5B;AACA,EAAA,MAAM,OAAA,mCAAS,WAAA,mBAAY,IAAA,6BAAM,QAAA,UAAU,CAAC,GAAA;AAC5C,EAAA,MAAM,UAAA,kBAAY,MAAA,qBAAO,IAAA,mBAAK,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,OAAA,IAAW,8BAAY,CAAA,6BAAG,MAAA;AACjE,EAAA,MAAM,aAAA,kBAAe,MAAA,qBAAO,IAAA,mBAAK,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,OAAA,IAAW,uCAAqB,CAAA,6BAAG,MAAA;AAE7E,EAAA,MAAM,UAAA,EAAY;AAAA,IAChB,GAAI,UAAA,EAAY,CAAC,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA;AACf,IAAA;AACtB,EAAA;AAOI,EAAA;AACsB,EAAA;AACE,IAAA;AACE,EAAA;AACO,IAAA;AAC1B,IAAA;AACJ,EAAA;AACI,IAAA;AACX,EAAA;AAE8B,EAAA;AACN,EAAA;AAEQ,EAAA;AAOE,IAAA;AAIE,IAAA;AACpC,EAAA;AAE2B,EAAA;AAC7B;AAKmE;AACxC,EAAA;AACU,EAAA;AACA,EAAA;AAC5B,EAAA;AACT;AAK8C;AAIH,EAAA;AACR,EAAA;AAEA,EAAA;AACH,IAAA;AACP,IAAA;AACc,MAAA;AACjC,MAAA;AACF,IAAA;AAEmB,IAAA;AAEjB,MAAA;AACF,IAAA;AAE2B,IAAA;AACQ,MAAA;AACjC,MAAA;AACF,IAAA;AAEmD,IAAA;AACrD,EAAA;AAE+B,EAAA;AACjC;AAME;AAGiC,EAAA;AAEd,EAAA;AACV,IAAA;AACwB,MAAA;AAC/B,IAAA;AACF,EAAA;AAEmB,EAAA;AAGf,EAAA;AACO,EAAA;AACS,EAAA;AAEW,EAAA;AACK,IAAA;AACD,IAAA;AACC,EAAA;AACd,IAAA;AACJ,IAAA;AACX,EAAA;AACE,IAAA;AACI,MAAA;AACP,QAAA;AACA,QAAA;AACQ,QAAA;AACM,QAAA;AAChB,MAAA;AACF,IAAA;AACF,EAAA;AAGmC,EAAA;AACd,EAAA;AACZ,IAAA;AACI,MAAA;AACP,QAAA;AACA,QAAA;AACQ,QAAA;AACM,QAAA;AAChB,MAAA;AACF,IAAA;AACF,EAAA;AAGI,EAAA;AACA,EAAA;AACiC,EAAA;AACR,IAAA;AACA,IAAA;AAC7B,EAAA;AAEsC,EAAA;AACrB,IAAA;AAEK,IAAA;AACpB,IAAA;AAC6B,IAAA;AAC7B,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACkC,IAAA;AAClC,IAAA;AACF,EAAA;AAE+B,EAAA;AACjC;AAKqE;AAE1C,EAAA;AACQ,EAAA;AACxB,IAAA;AACG,MAAA;AACG,MAAA;AACD,MAAA;AACM,MAAA;AAClB,IAAA;AACF,EAAA;AAEe,EAAA;AAGmB,EAAA;AAGO,EAAA;AACK,EAAA;AAEb,EAAA;AAChB,IAAA;AAEc,IAAA;AACK,MAAA;AAC3B,IAAA;AACyB,MAAA;AAChC,IAAA;AACF,EAAA;AAEO,EAAA;AACI,IAAA;AACT,IAAA;AACS,IAAA;AACoB,IAAA;AAC/B,EAAA;AACF;ADnIuC;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-Y7TOLJ2Y.cjs","sourcesContent":[null,"/**\n * FHIR Importer\n *\n * Parses FHIR R4 Bundles and extracts Observation resources with known LOINC codes,\n * mapping them to internal biomarker codes for storage as lab results.\n */\n\nimport {\n codeToLoinc,\n getDefinitionByCode,\n isValidCode,\n loincToCode,\n normalizeCode,\n} from './biomarkers';\nimport { BIOMARKER_CODE_SYSTEM, LOINC_SYSTEM } from './code-systems';\nimport type { FHIRBundle, FHIRObservation } from './fhir-types';\nimport { validateFHIRImportBundle } from './validators';\n\nexport interface ImportedObservation {\n biomarkerCode: string;\n biomarkerName: string;\n collectionDate: string;\n flag: 'H' | 'L' | '';\n isQualitative: boolean;\n /** Ausente nos biomarcadores sem LOINC publicado, como composição corporal. */\n loincCode?: string;\n referenceMax?: number;\n referenceMin?: number;\n unit: string;\n value: number | string;\n}\n\nexport interface SkippedEntry {\n index: number;\n loincCode?: string;\n reason: string;\n resourceType?: string;\n}\n\nexport interface ImportError {\n details: string;\n field: string;\n}\n\nexport interface FHIRImportResult {\n errors: ImportError[];\n imported: ImportedObservation[];\n skipped: SkippedEntry[];\n totalProcessed: number;\n}\n\n/**\n * Limites de importação.\n *\n * Uma Observation exportada ocupa cerca de 1,25KB em JSON compacto e 2,75KB\n * quando o arquivo vem indentado, medido sobre um histórico real de 998\n * Observations em 61 laudos. Nesse tamanho, 5000 Observations dão 6,0MB\n * compactos ou 13,1MB indentados, e por isso o teto de arquivo é 15MB: cobre\n * as duas formas com folga.\n *\n * Na densidade desse mesmo histórico (16 Observations por laudo), 5000\n * equivalem a cerca de 300 laudos.\n */\nconst MAX_OBSERVATIONS = 5000;\nconst MAX_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\n/**\n * Resolve o código interno do biomarcador a partir do `code.coding`.\n *\n * LOINC primeiro, que é o vocabulário que arquivos de terceiros usam. Quando\n * não resolve, cai para o coding de códigos internos, presente nos arquivos\n * exportados pela própria plataforma.\n *\n * O fallback cobre dois casos: biomarcadores sem LOINC publicado (composição\n * corporal, densidade óssea, escore de cálcio) e arquivos antigos, exportados\n * quando esses biomarcadores saíam com o placeholder `99999-9`, que não\n * resolve para nada.\n */\nfunction resolveBiomarkerCode(observation: FHIRObservation): {\n internalCode?: string;\n loincCode?: string;\n reason: string;\n} {\n const coding = observation.code?.coding ?? [];\n const loincCode = coding.find((c) => c.system === LOINC_SYSTEM)?.code;\n const declaredCode = coding.find((c) => c.system === BIOMARKER_CODE_SYSTEM)?.code;\n\n const seenCodes = [\n ...(loincCode ? [`LOINC ${loincCode}`] : []),\n ...(declaredCode ? [`biomarker code ${declaredCode}`] : []),\n ];\n\n // Três motivos distintos de descarte, que antes se confundiam num só. Sem\n // essa separação, um arquivo em SNOMED relatava \"nenhum código encontrado\",\n // sugerindo `coding` vazio quando na verdade o código existia e estava num\n // system que não tratamos. Para importação de terceiros, é a diferença entre\n // um diagnóstico acionável e um enigma.\n let reason: string;\n if (seenCodes.length > 0) {\n reason = `Unknown code: ${seenCodes.join(', ')}`;\n } else if (coding.length > 0) {\n const systems = [...new Set(coding.map((c) => c.system ?? '(sem system)'))];\n reason = `No code in a supported system (found: ${systems.join(', ')})`;\n } else {\n reason = 'No code found in observation coding';\n }\n\n const fromLoinc = loincCode ? loincToCode(loincCode) : undefined;\n if (fromLoinc) return { internalCode: fromLoinc, loincCode, reason };\n\n if (declaredCode && isValidCode(declaredCode)) {\n // `isValidCode` aceita alias, mas alias não serve como código armazenado:\n // 49 definições têm um, e tanto `codeToLoinc` quanto as faixas de\n // referência são indexadas só pelo canônico. Sem normalizar, `VLDL_Cholesterol`\n // entraria no lugar de `VLDL` e perderia o LOINC 13458-5 que ele tem.\n // Importar um Bundle é fronteira de dados, que é onde `normalizeCode` deve\n // ser aplicado.\n const canonical = normalizeCode(declaredCode);\n\n // `codeToLoinc` devolve undefined para quem não tem LOINC, que é o caso\n // esperado aqui. O campo fica de fora em vez de receber um valor inventado.\n return { internalCode: canonical, loincCode: codeToLoinc(canonical), reason };\n }\n\n return { loincCode, reason };\n}\n\n/**\n * Extract interpretation flag from Observation\n */\nfunction extractFlag(observation: FHIRObservation): 'H' | 'L' | '' {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n if (code === 'H' || code === 'HH') return 'H';\n if (code === 'L' || code === 'LL') return 'L';\n return '';\n}\n\n/**\n * Extract Observation resources from a FHIR Bundle\n */\nexport function extractObservationsFromBundle(bundle: FHIRBundle): {\n observations: FHIRObservation[];\n skipped: SkippedEntry[];\n} {\n const observations: FHIRObservation[] = [];\n const skipped: SkippedEntry[] = [];\n\n for (let i = 0; i < bundle.entry.length; i++) {\n const entry = bundle.entry[i]!;\n if (!entry.resource) {\n skipped.push({ index: i, reason: 'Entry has no resource' });\n continue;\n }\n\n if (entry.resource.resourceType !== 'Observation') {\n // Non-observation resources are silently skipped (Patient, DiagnosticReport, etc.)\n continue;\n }\n\n if (observations.length >= MAX_OBSERVATIONS) {\n skipped.push({ index: i, reason: `Maximum of ${MAX_OBSERVATIONS} observations exceeded` });\n continue;\n }\n\n observations.push(entry.resource as FHIRObservation);\n }\n\n return { observations, skipped };\n}\n\n/**\n * Map a FHIR Observation to internal format using LOINC→biomarker code lookup\n */\nexport function mapFHIRObservationToInternal(\n observation: FHIRObservation,\n index: number,\n): { observation: ImportedObservation } | { skipped: SkippedEntry } {\n const { internalCode, loincCode, reason } = resolveBiomarkerCode(observation);\n\n if (!internalCode) {\n return {\n skipped: { index, loincCode, reason, resourceType: 'Observation' },\n };\n }\n\n const definition = getDefinitionByCode(internalCode);\n\n // Extract value\n let value: number | string;\n let unit = '';\n let isQualitative = false;\n\n if (observation.valueQuantity?.value !== undefined) {\n value = observation.valueQuantity.value;\n unit = observation.valueQuantity.unit || observation.valueQuantity.code || '';\n } else if (observation.valueString) {\n value = observation.valueString;\n isQualitative = true;\n } else {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no value (valueQuantity or valueString)',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract collection date (effectiveDateTime or effectivePeriod.start)\n const collectionDate = observation.effectiveDateTime || observation.effectivePeriod?.start || '';\n if (!collectionDate) {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no effectiveDateTime or effectivePeriod.start',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract reference ranges\n let referenceMin: number | undefined;\n let referenceMax: number | undefined;\n if (observation.referenceRange?.[0]) {\n referenceMin = observation.referenceRange[0].low?.value;\n referenceMax = observation.referenceRange[0].high?.value;\n }\n\n const imported: ImportedObservation = {\n biomarkerCode: internalCode,\n biomarkerName:\n definition?.names.pt[0] || definition?.names.en[0] || observation.code.text || internalCode,\n collectionDate,\n flag: extractFlag(observation),\n isQualitative,\n loincCode,\n referenceMax,\n referenceMin,\n unit: unit || definition?.unit || '',\n value,\n };\n\n return { observation: imported };\n}\n\n/**\n * Process a complete FHIR Bundle for import\n */\nexport function processImportBundle(data: unknown): FHIRImportResult {\n // Structural validation\n const validationErrors = validateFHIRImportBundle(data);\n if (validationErrors.length > 0) {\n return {\n errors: validationErrors,\n imported: [],\n skipped: [],\n totalProcessed: 0,\n };\n }\n\n const bundle = data as FHIRBundle;\n\n // Extract observations\n const { observations, skipped } = extractObservationsFromBundle(bundle);\n\n // Map each observation to internal format\n const imported: ImportedObservation[] = [];\n const allSkipped: SkippedEntry[] = [...skipped];\n\n for (let i = 0; i < observations.length; i++) {\n const result = mapFHIRObservationToInternal(observations[i]!, i);\n\n if ('observation' in result) {\n imported.push(result.observation);\n } else {\n allSkipped.push(result.skipped);\n }\n }\n\n return {\n errors: [],\n imported,\n skipped: allSkipped,\n totalProcessed: observations.length,\n };\n}\n\nexport { MAX_FILE_SIZE, MAX_OBSERVATIONS };\n"]}
1
+ {"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-YHLC3YNA.cjs","../src/importer.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACgDA,IAAM,iBAAA,EAAmB,GAAA;AACzB,IAAM,cAAA,EAAgB,GAAA,EAAK,KAAA,EAAO,IAAA;AAclC,SAAS,oBAAA,CAAqB,WAAA,EAI5B;AACA,EAAA,MAAM,OAAA,mCAAS,WAAA,mBAAY,IAAA,6BAAM,QAAA,UAAU,CAAC,GAAA;AAC5C,EAAA,MAAM,UAAA,kBAAY,MAAA,qBAAO,IAAA,mBAAK,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,OAAA,IAAW,8BAAY,CAAA,6BAAG,MAAA;AACjE,EAAA,MAAM,aAAA,kBAAe,MAAA,qBAAO,IAAA,mBAAK,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,OAAA,IAAW,uCAAqB,CAAA,6BAAG,MAAA;AAE7E,EAAA,MAAM,UAAA,EAAY;AAAA,IAChB,GAAI,UAAA,EAAY,CAAC,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA;AACf,IAAA;AACtB,EAAA;AAOI,EAAA;AACsB,EAAA;AACE,IAAA;AACE,EAAA;AACO,IAAA;AAC1B,IAAA;AACJ,EAAA;AACI,IAAA;AACX,EAAA;AAE8B,EAAA;AACN,EAAA;AAEQ,EAAA;AAOE,IAAA;AAIE,IAAA;AACpC,EAAA;AAE2B,EAAA;AAC7B;AAKmE;AACxC,EAAA;AACU,EAAA;AACA,EAAA;AAC5B,EAAA;AACT;AAK8C;AAIH,EAAA;AACR,EAAA;AAEA,EAAA;AACH,IAAA;AACP,IAAA;AACc,MAAA;AACjC,MAAA;AACF,IAAA;AAEmB,IAAA;AAEjB,MAAA;AACF,IAAA;AAE2B,IAAA;AACQ,MAAA;AACjC,MAAA;AACF,IAAA;AAEmD,IAAA;AACrD,EAAA;AAE+B,EAAA;AACjC;AAME;AAGiC,EAAA;AAEd,EAAA;AACV,IAAA;AACwB,MAAA;AAC/B,IAAA;AACF,EAAA;AAEmB,EAAA;AAGf,EAAA;AACO,EAAA;AACS,EAAA;AAEW,EAAA;AACK,IAAA;AACD,IAAA;AACC,EAAA;AACd,IAAA;AACJ,IAAA;AACX,EAAA;AACE,IAAA;AACI,MAAA;AACP,QAAA;AACA,QAAA;AACQ,QAAA;AACM,QAAA;AAChB,MAAA;AACF,IAAA;AACF,EAAA;AAGmC,EAAA;AACd,EAAA;AACZ,IAAA;AACI,MAAA;AACP,QAAA;AACA,QAAA;AACQ,QAAA;AACM,QAAA;AAChB,MAAA;AACF,IAAA;AACF,EAAA;AAGI,EAAA;AACA,EAAA;AACiC,EAAA;AACR,IAAA;AACA,IAAA;AAC7B,EAAA;AAEsC,EAAA;AACrB,IAAA;AAEK,IAAA;AACpB,IAAA;AAC6B,IAAA;AAC7B,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACkC,IAAA;AAClC,IAAA;AACF,EAAA;AAE+B,EAAA;AACjC;AAKqE;AAE1C,EAAA;AACQ,EAAA;AACxB,IAAA;AACG,MAAA;AACG,MAAA;AACD,MAAA;AACM,MAAA;AAClB,IAAA;AACF,EAAA;AAEe,EAAA;AAGmB,EAAA;AAGO,EAAA;AACK,EAAA;AAEb,EAAA;AAChB,IAAA;AAEc,IAAA;AACK,MAAA;AAC3B,IAAA;AACyB,MAAA;AAChC,IAAA;AACF,EAAA;AAEO,EAAA;AACI,IAAA;AACT,IAAA;AACS,IAAA;AACoB,IAAA;AAC/B,EAAA;AACF;ADnIuC;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-YHLC3YNA.cjs","sourcesContent":[null,"/**\n * FHIR Importer\n *\n * Parses FHIR R4 Bundles and extracts Observation resources with known LOINC codes,\n * mapping them to internal biomarker codes for storage as lab results.\n */\n\nimport {\n codeToLoinc,\n getDefinitionByCode,\n isValidCode,\n loincToCode,\n normalizeCode,\n} from './biomarkers';\nimport { BIOMARKER_CODE_SYSTEM, LOINC_SYSTEM } from './code-systems';\nimport type { FHIRBundle, FHIRObservation } from './fhir-types';\nimport { validateFHIRImportBundle } from './validators';\n\nexport interface ImportedObservation {\n biomarkerCode: string;\n biomarkerName: string;\n collectionDate: string;\n flag: 'H' | 'L' | '';\n isQualitative: boolean;\n /** Ausente nos biomarcadores sem LOINC publicado, como composição corporal. */\n loincCode?: string;\n referenceMax?: number;\n referenceMin?: number;\n unit: string;\n value: number | string;\n}\n\nexport interface SkippedEntry {\n index: number;\n loincCode?: string;\n reason: string;\n resourceType?: string;\n}\n\nexport interface ImportError {\n details: string;\n field: string;\n}\n\nexport interface FHIRImportResult {\n errors: ImportError[];\n imported: ImportedObservation[];\n skipped: SkippedEntry[];\n totalProcessed: number;\n}\n\n/**\n * Limites de importação.\n *\n * Uma Observation exportada ocupa cerca de 1,25KB em JSON compacto e 2,75KB\n * quando o arquivo vem indentado, medido sobre um histórico real de 998\n * Observations em 61 laudos. Nesse tamanho, 5000 Observations dão 6,0MB\n * compactos ou 13,1MB indentados, e por isso o teto de arquivo é 15MB: cobre\n * as duas formas com folga.\n *\n * Na densidade desse mesmo histórico (16 Observations por laudo), 5000\n * equivalem a cerca de 300 laudos.\n */\nconst MAX_OBSERVATIONS = 5000;\nconst MAX_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\n/**\n * Resolve o código interno do biomarcador a partir do `code.coding`.\n *\n * LOINC primeiro, que é o vocabulário que arquivos de terceiros usam. Quando\n * não resolve, cai para o coding de códigos internos, presente nos arquivos\n * exportados pela própria plataforma.\n *\n * O fallback cobre dois casos: biomarcadores sem LOINC publicado (composição\n * corporal, densidade óssea, escore de cálcio) e arquivos antigos, exportados\n * quando esses biomarcadores saíam com o placeholder `99999-9`, que não\n * resolve para nada.\n */\nfunction resolveBiomarkerCode(observation: FHIRObservation): {\n internalCode?: string;\n loincCode?: string;\n reason: string;\n} {\n const coding = observation.code?.coding ?? [];\n const loincCode = coding.find((c) => c.system === LOINC_SYSTEM)?.code;\n const declaredCode = coding.find((c) => c.system === BIOMARKER_CODE_SYSTEM)?.code;\n\n const seenCodes = [\n ...(loincCode ? [`LOINC ${loincCode}`] : []),\n ...(declaredCode ? [`biomarker code ${declaredCode}`] : []),\n ];\n\n // Três motivos distintos de descarte, que antes se confundiam num só. Sem\n // essa separação, um arquivo em SNOMED relatava \"nenhum código encontrado\",\n // sugerindo `coding` vazio quando na verdade o código existia e estava num\n // system que não tratamos. Para importação de terceiros, é a diferença entre\n // um diagnóstico acionável e um enigma.\n let reason: string;\n if (seenCodes.length > 0) {\n reason = `Unknown code: ${seenCodes.join(', ')}`;\n } else if (coding.length > 0) {\n const systems = [...new Set(coding.map((c) => c.system ?? '(sem system)'))];\n reason = `No code in a supported system (found: ${systems.join(', ')})`;\n } else {\n reason = 'No code found in observation coding';\n }\n\n const fromLoinc = loincCode ? loincToCode(loincCode) : undefined;\n if (fromLoinc) return { internalCode: fromLoinc, loincCode, reason };\n\n if (declaredCode && isValidCode(declaredCode)) {\n // `isValidCode` aceita alias, mas alias não serve como código armazenado:\n // 49 definições têm um, e tanto `codeToLoinc` quanto as faixas de\n // referência são indexadas só pelo canônico. Sem normalizar, `VLDL_Cholesterol`\n // entraria no lugar de `VLDL` e perderia o LOINC 13458-5 que ele tem.\n // Importar um Bundle é fronteira de dados, que é onde `normalizeCode` deve\n // ser aplicado.\n const canonical = normalizeCode(declaredCode);\n\n // `codeToLoinc` devolve undefined para quem não tem LOINC, que é o caso\n // esperado aqui. O campo fica de fora em vez de receber um valor inventado.\n return { internalCode: canonical, loincCode: codeToLoinc(canonical), reason };\n }\n\n return { loincCode, reason };\n}\n\n/**\n * Extract interpretation flag from Observation\n */\nfunction extractFlag(observation: FHIRObservation): 'H' | 'L' | '' {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n if (code === 'H' || code === 'HH') return 'H';\n if (code === 'L' || code === 'LL') return 'L';\n return '';\n}\n\n/**\n * Extract Observation resources from a FHIR Bundle\n */\nexport function extractObservationsFromBundle(bundle: FHIRBundle): {\n observations: FHIRObservation[];\n skipped: SkippedEntry[];\n} {\n const observations: FHIRObservation[] = [];\n const skipped: SkippedEntry[] = [];\n\n for (let i = 0; i < bundle.entry.length; i++) {\n const entry = bundle.entry[i]!;\n if (!entry.resource) {\n skipped.push({ index: i, reason: 'Entry has no resource' });\n continue;\n }\n\n if (entry.resource.resourceType !== 'Observation') {\n // Non-observation resources are silently skipped (Patient, DiagnosticReport, etc.)\n continue;\n }\n\n if (observations.length >= MAX_OBSERVATIONS) {\n skipped.push({ index: i, reason: `Maximum of ${MAX_OBSERVATIONS} observations exceeded` });\n continue;\n }\n\n observations.push(entry.resource as FHIRObservation);\n }\n\n return { observations, skipped };\n}\n\n/**\n * Map a FHIR Observation to internal format using LOINC→biomarker code lookup\n */\nexport function mapFHIRObservationToInternal(\n observation: FHIRObservation,\n index: number,\n): { observation: ImportedObservation } | { skipped: SkippedEntry } {\n const { internalCode, loincCode, reason } = resolveBiomarkerCode(observation);\n\n if (!internalCode) {\n return {\n skipped: { index, loincCode, reason, resourceType: 'Observation' },\n };\n }\n\n const definition = getDefinitionByCode(internalCode);\n\n // Extract value\n let value: number | string;\n let unit = '';\n let isQualitative = false;\n\n if (observation.valueQuantity?.value !== undefined) {\n value = observation.valueQuantity.value;\n unit = observation.valueQuantity.unit || observation.valueQuantity.code || '';\n } else if (observation.valueString) {\n value = observation.valueString;\n isQualitative = true;\n } else {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no value (valueQuantity or valueString)',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract collection date (effectiveDateTime or effectivePeriod.start)\n const collectionDate = observation.effectiveDateTime || observation.effectivePeriod?.start || '';\n if (!collectionDate) {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no effectiveDateTime or effectivePeriod.start',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract reference ranges\n let referenceMin: number | undefined;\n let referenceMax: number | undefined;\n if (observation.referenceRange?.[0]) {\n referenceMin = observation.referenceRange[0].low?.value;\n referenceMax = observation.referenceRange[0].high?.value;\n }\n\n const imported: ImportedObservation = {\n biomarkerCode: internalCode,\n biomarkerName:\n definition?.names.pt[0] || definition?.names.en[0] || observation.code.text || internalCode,\n collectionDate,\n flag: extractFlag(observation),\n isQualitative,\n loincCode,\n referenceMax,\n referenceMin,\n unit: unit || definition?.unit || '',\n value,\n };\n\n return { observation: imported };\n}\n\n/**\n * Process a complete FHIR Bundle for import\n */\nexport function processImportBundle(data: unknown): FHIRImportResult {\n // Structural validation\n const validationErrors = validateFHIRImportBundle(data);\n if (validationErrors.length > 0) {\n return {\n errors: validationErrors,\n imported: [],\n skipped: [],\n totalProcessed: 0,\n };\n }\n\n const bundle = data as FHIRBundle;\n\n // Extract observations\n const { observations, skipped } = extractObservationsFromBundle(bundle);\n\n // Map each observation to internal format\n const imported: ImportedObservation[] = [];\n const allSkipped: SkippedEntry[] = [...skipped];\n\n for (let i = 0; i < observations.length; i++) {\n const result = mapFHIRObservationToInternal(observations[i]!, i);\n\n if ('observation' in result) {\n imported.push(result.observation);\n } else {\n allSkipped.push(result.skipped);\n }\n }\n\n return {\n errors: [],\n imported,\n skipped: allSkipped,\n totalProcessed: observations.length,\n };\n}\n\nexport { MAX_FILE_SIZE, MAX_OBSERVATIONS };\n"]}
package/dist/cli.js CHANGED
@@ -798,13 +798,36 @@ var BIOMARKER_DEFINITIONS = [
798
798
  // ============================================================================
799
799
  // METABOLIC / METABOLICO
800
800
  // ============================================================================
801
+ // Glicose e glicemia de jejum são duas definições, e a linha entre elas é o
802
+ // que o laudo **afirma**, não o que provavelmente aconteceu.
803
+ //
804
+ // No LOINC a diferença está no eixo do componente: `2345-7` é `Glucose` e
805
+ // `1558-6` é `Glucose^post CFst`, com o desafio de jejum declarado. Laudo que
806
+ // imprime só "Glicose" não afirma jejum nenhum, mesmo quando a faixa impressa
807
+ // ao lado é de jejum e mesmo sendo jejum na esmagadora maioria dos painéis
808
+ // ambulatoriais brasileiros. Codificar essa linha como `1558-6` afirmaria um
809
+ // jejum de oito horas que ninguém declarou.
810
+ //
811
+ // As duas estavam fundidas numa definição só, que carregava `2345-7` e uma
812
+ // faixa `fastingRequired: 'strict'`: o código dizia genérico e a faixa dizia
813
+ // jejum. A grafia é que decide agora.
801
814
  {
802
815
  category: "metabolico",
803
816
  code: "Glucose",
804
817
  loinc: "2345-7",
805
818
  names: {
806
- en: ["Glucose", "Blood Glucose", "Fasting Glucose"],
807
- pt: ["Glicose", "Glicemia", "Glicemia de Jejum"]
819
+ en: ["Glucose", "Blood Glucose", "Random Glucose"],
820
+ pt: ["Glicose", "Glicemia"]
821
+ },
822
+ unit: "mg/dL"
823
+ },
824
+ {
825
+ category: "metabolico",
826
+ code: "Glucose_Fasting",
827
+ loinc: "1558-6",
828
+ names: {
829
+ en: ["Fasting Glucose", "Fasting Blood Glucose", "Glucose, Fasting"],
830
+ pt: ["Glicemia de Jejum", "Glicose de Jejum", "Glicemia em Jejum"]
808
831
  },
809
832
  unit: "mg/dL"
810
833
  },
@@ -5209,12 +5232,18 @@ var biomarkerRangeDefinitions = {
5209
5232
  default: { max: 3.5, min: 2, optimalMax: 3.2, optimalMin: 2.3, unit: "g/dL" },
5210
5233
  source: "tietz-7ed-2015"
5211
5234
  },
5235
+ // A faixa é de jejum, então mora na definição que afirma jejum. Glicose
5236
+ // genérica (`Glucose`, `2345-7`) ficou sem faixa de propósito: a SBD 2024
5237
+ // publica o intervalo de jejum, não o de coleta casual, e inventar um
5238
+ // intervalo sem fonte é pior do que não ter. Na prática o laudo costuma
5239
+ // imprimir a própria faixa, e é ela que o consumidor usa.
5240
+ //
5212
5241
  // Glicemia de jejum — 70–99 mg/dL é a faixa de normalidade (SBD 2024, ADA);
5213
5242
  // hipoglicemia clinicamente acionável em não-diabético é <54 mg/dL (Level 2
5214
5243
  // ADA/SBD), não 70. O corte 70 era Level 1 (alerta em diabético em tratamento)
5215
5244
  // e gerava falsos "abaixo do normal" em indivíduos saudáveis cuja glicemia
5216
5245
  // em jejum está fisiologicamente entre 54–70. optimalMin preserva o alvo.
5217
- Glucose: {
5246
+ Glucose_Fasting: {
5218
5247
  default: {
5219
5248
  fastingRequired: "strict",
5220
5249
  max: 100,
@@ -6707,7 +6736,7 @@ async function main() {
6707
6736
  strict: false
6708
6737
  });
6709
6738
  if (values.version) {
6710
- process.stdout.write(`${"0.25.1"}
6739
+ process.stdout.write(`${"0.26.0"}
6711
6740
  `);
6712
6741
  return;
6713
6742
  }
@@ -3,14 +3,14 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkDGTP2QB6cjs = require('./chunk-DGTP2QB6.cjs');
6
+ var _chunkTA4B4WB7cjs = require('./chunk-TA4B4WB7.cjs');
7
7
  require('./chunk-OR67NJDZ.cjs');
8
- require('./chunk-IBF6HOBG.cjs');
8
+ require('./chunk-ABCHG3CF.cjs');
9
9
  require('./chunk-MJ254F5K.cjs');
10
10
 
11
11
 
12
12
 
13
13
 
14
14
 
15
- exports.labObservationToFHIR = _chunkDGTP2QB6cjs.labObservationToFHIR; exports.labReportToFHIR = _chunkDGTP2QB6cjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunkDGTP2QB6cjs.labResultToFHIRBundle; exports.userProfileToFHIR = _chunkDGTP2QB6cjs.userProfileToFHIR;
15
+ exports.labObservationToFHIR = _chunkTA4B4WB7cjs.labObservationToFHIR; exports.labReportToFHIR = _chunkTA4B4WB7cjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunkTA4B4WB7cjs.labResultToFHIRBundle; exports.userProfileToFHIR = _chunkTA4B4WB7cjs.userProfileToFHIR;
16
16
  //# sourceMappingURL=converter.cjs.map
package/dist/converter.js CHANGED
@@ -3,9 +3,9 @@ import {
3
3
  labReportToFHIR,
4
4
  labResultToFHIRBundle,
5
5
  userProfileToFHIR
6
- } from "./chunk-PXDGYFGR.js";
6
+ } from "./chunk-UVCWSKPO.js";
7
7
  import "./chunk-A6HR4XDK.js";
8
- import "./chunk-BNG4YNY2.js";
8
+ import "./chunk-BA26FWOG.js";
9
9
  import "./chunk-R4MUCMO3.js";
10
10
  export {
11
11
  labObservationToFHIR,
package/dist/importer.cjs CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkY7TOLJ2Ycjs = require('./chunk-Y7TOLJ2Y.cjs');
7
+ var _chunkYHLC3YNAcjs = require('./chunk-YHLC3YNA.cjs');
8
8
  require('./chunk-OR67NJDZ.cjs');
9
- require('./chunk-IBF6HOBG.cjs');
9
+ require('./chunk-ABCHG3CF.cjs');
10
10
  require('./chunk-3ILBFLVQ.cjs');
11
11
 
12
12
 
@@ -14,5 +14,5 @@ require('./chunk-3ILBFLVQ.cjs');
14
14
 
15
15
 
16
16
 
17
- exports.MAX_FILE_SIZE = _chunkY7TOLJ2Ycjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkY7TOLJ2Ycjs.MAX_OBSERVATIONS; exports.extractObservationsFromBundle = _chunkY7TOLJ2Ycjs.extractObservationsFromBundle; exports.mapFHIRObservationToInternal = _chunkY7TOLJ2Ycjs.mapFHIRObservationToInternal; exports.processImportBundle = _chunkY7TOLJ2Ycjs.processImportBundle;
17
+ exports.MAX_FILE_SIZE = _chunkYHLC3YNAcjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkYHLC3YNAcjs.MAX_OBSERVATIONS; exports.extractObservationsFromBundle = _chunkYHLC3YNAcjs.extractObservationsFromBundle; exports.mapFHIRObservationToInternal = _chunkYHLC3YNAcjs.mapFHIRObservationToInternal; exports.processImportBundle = _chunkYHLC3YNAcjs.processImportBundle;
18
18
  //# sourceMappingURL=importer.cjs.map
package/dist/importer.js CHANGED
@@ -4,9 +4,9 @@ import {
4
4
  extractObservationsFromBundle,
5
5
  mapFHIRObservationToInternal,
6
6
  processImportBundle
7
- } from "./chunk-2F3TXKDI.js";
7
+ } from "./chunk-JFSIRIBM.js";
8
8
  import "./chunk-A6HR4XDK.js";
9
- import "./chunk-BNG4YNY2.js";
9
+ import "./chunk-BA26FWOG.js";
10
10
  import "./chunk-N3ZCOLG2.js";
11
11
  export {
12
12
  MAX_FILE_SIZE,
package/dist/index.cjs CHANGED
@@ -5,14 +5,14 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkDGTP2QB6cjs = require('./chunk-DGTP2QB6.cjs');
8
+ var _chunkTA4B4WB7cjs = require('./chunk-TA4B4WB7.cjs');
9
9
 
10
10
 
11
11
 
12
12
 
13
13
 
14
14
 
15
- var _chunkY7TOLJ2Ycjs = require('./chunk-Y7TOLJ2Y.cjs');
15
+ var _chunkYHLC3YNAcjs = require('./chunk-YHLC3YNA.cjs');
16
16
 
17
17
 
18
18
 
@@ -49,7 +49,7 @@ var _chunkOR67NJDZcjs = require('./chunk-OR67NJDZ.cjs');
49
49
 
50
50
 
51
51
 
52
- var _chunkIBF6HOBGcjs = require('./chunk-IBF6HOBG.cjs');
52
+ var _chunkABCHG3CFcjs = require('./chunk-ABCHG3CF.cjs');
53
53
 
54
54
 
55
55
 
@@ -57,7 +57,7 @@ var _chunkIBF6HOBGcjs = require('./chunk-IBF6HOBG.cjs');
57
57
 
58
58
 
59
59
 
60
- var _chunkERALICUKcjs = require('./chunk-ERALICUK.cjs');
60
+ var _chunk4NSBIPLWcjs = require('./chunk-4NSBIPLW.cjs');
61
61
 
62
62
 
63
63
 
@@ -234,14 +234,14 @@ function interventionToFHIRObservation(intervention, patientId) {
234
234
  }
235
235
  function interventionsToFHIRBundle(interventions, userProfile) {
236
236
  const patientId = userProfile.userId;
237
- const fhirPatient = _chunkDGTP2QB6cjs.userProfileToFHIR.call(void 0, userProfile);
237
+ const fhirPatient = _chunkTA4B4WB7cjs.userProfileToFHIR.call(void 0, userProfile);
238
238
  const entries = interventions.map((intervention) => {
239
239
  const isMedication = intervention.type === "medication" || intervention.type === "supplement";
240
240
  const resource = isMedication ? interventionToFHIRMedicationStatement(intervention, patientId) : interventionToFHIRObservation(intervention, patientId);
241
- return { fullUrl: _chunkDGTP2QB6cjs.entryFullUrl.call(void 0, resource), resource };
241
+ return { fullUrl: _chunkTA4B4WB7cjs.entryFullUrl.call(void 0, resource), resource };
242
242
  });
243
243
  return {
244
- entry: [{ fullUrl: _chunkDGTP2QB6cjs.entryFullUrl.call(void 0, fhirPatient), resource: fhirPatient }, ...entries],
244
+ entry: [{ fullUrl: _chunkTA4B4WB7cjs.entryFullUrl.call(void 0, fhirPatient), resource: fhirPatient }, ...entries],
245
245
  resourceType: "Bundle",
246
246
  type: "collection"
247
247
  };
@@ -716,5 +716,5 @@ var specimenTypeCoding = (text) => BY_NORMALIZED_TEXT.get(normalize(text));
716
716
 
717
717
 
718
718
 
719
- exports.AGE_BRACKETS = AGE_BRACKETS; exports.BIOMARKER_CODE_SYSTEM = _chunkOR67NJDZcjs.BIOMARKER_CODE_SYSTEM; exports.BIOMARKER_DEFAULT_UNIT = _chunkMJ254F5Kcjs.BIOMARKER_DEFAULT_UNIT; exports.BIOMARKER_DEFINITIONS = _chunkIBF6HOBGcjs.BIOMARKER_DEFINITIONS; exports.BIOMARKER_UNITS = _chunkMJ254F5Kcjs.BIOMARKER_UNITS; exports.BODY_FAT_ZONES = BODY_FAT_ZONES; exports.BR_TIPO_AMOSTRA_VALUESET = BR_TIPO_AMOSTRA_VALUESET; exports.BUNDLE_BASE_URL = _chunkDGTP2QB6cjs.BUNDLE_BASE_URL; exports.CAC_INDICATOR_CODES = _chunkIBF6HOBGcjs.CAC_INDICATOR_CODES; exports.CATEGORY_GROUPS = CATEGORY_GROUPS; exports.CATEGORY_SCREENING_INTERVALS = CATEGORY_SCREENING_INTERVALS; exports.DEXA_CATEGORIES = _chunkIBF6HOBGcjs.DEXA_CATEGORIES; exports.DEXA_INDICATOR_CODES = _chunkIBF6HOBGcjs.DEXA_INDICATOR_CODES; exports.HL7_SPECIMEN_TYPE_SYSTEM = HL7_SPECIMEN_TYPE_SYSTEM; exports.LOINC_SYSTEM = _chunkOR67NJDZcjs.LOINC_SYSTEM; exports.MAX_FILE_SIZE = _chunkY7TOLJ2Ycjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkY7TOLJ2Ycjs.MAX_OBSERVATIONS; exports.T_SCORE_ZONES = T_SCORE_ZONES; exports.UNIT_TO_UCUM = _chunkMJ254F5Kcjs.UNIT_TO_UCUM; exports.ZONE_DEFS = ZONE_DEFS; exports.applyFallbackReferenceRanges = _chunkERALICUKcjs.applyFallbackReferenceRanges; exports.biomarkerRangeDefinitions = _chunkERALICUKcjs.biomarkerRangeDefinitions; exports.calculateNextScreeningDate = calculateNextScreeningDate; exports.cnsToFHIRIdentifier = cnsToFHIRIdentifier; exports.codeToLoinc = _chunkIBF6HOBGcjs.codeToLoinc; exports.convertUnit = _chunkMJ254F5Kcjs.convertUnit; exports.cpfToFHIRIdentifier = cpfToFHIRIdentifier; exports.defaultReferenceRanges = _chunkERALICUKcjs.defaultReferenceRanges; exports.entryFullUrl = _chunkDGTP2QB6cjs.entryFullUrl; exports.extractObservationsFromBundle = _chunkY7TOLJ2Ycjs.extractObservationsFromBundle; exports.filterVisibleBiomarkers = _chunkIBF6HOBGcjs.filterVisibleBiomarkers; exports.findCodeByName = _chunkIBF6HOBGcjs.findCodeByName; exports.formatCNS = formatCNS; exports.formatCPF = formatCPF; exports.generateCacFullReference = _chunkIBF6HOBGcjs.generateCacFullReference; exports.generateDexaFullReference = _chunkIBF6HOBGcjs.generateDexaFullReference; exports.generateFilteredLLMReference = _chunkIBF6HOBGcjs.generateFilteredLLMReference; exports.generateLLMReference = _chunkIBF6HOBGcjs.generateLLMReference; exports.getAllCodes = _chunkIBF6HOBGcjs.getAllCodes; exports.getAllDefinitions = _chunkIBF6HOBGcjs.getAllDefinitions; exports.getAllLoincCodes = _chunkIBF6HOBGcjs.getAllLoincCodes; exports.getAllSearchPatterns = _chunkIBF6HOBGcjs.getAllSearchPatterns; exports.getBiomarkersByCategory = _chunkIBF6HOBGcjs.getBiomarkersByCategory; exports.getBiomarkersForCategories = _chunkIBF6HOBGcjs.getBiomarkersForCategories; exports.getCanonicalUnit = _chunkMJ254F5Kcjs.getCanonicalUnit; exports.getCategoriesByInterval = getCategoriesByInterval; exports.getCategoryGroup = getCategoryGroup; exports.getDaysUntilScreening = getDaysUntilScreening; exports.getDefaultUnit = _chunkMJ254F5Kcjs.getDefaultUnit; exports.getDefinitionByCode = _chunkIBF6HOBGcjs.getDefinitionByCode; exports.getDefinitionByLoinc = _chunkIBF6HOBGcjs.getDefinitionByLoinc; exports.getDefinitionsBySex = _chunkIBF6HOBGcjs.getDefinitionsBySex; exports.getDueCategories = getDueCategories; exports.getFallbackReferenceRange = _chunkERALICUKcjs.getFallbackReferenceRange; exports.getRangeDirection = _chunkERALICUKcjs.getRangeDirection; exports.getReferenceRange = _chunkERALICUKcjs.getReferenceRange; exports.getSIUnit = _chunkMJ254F5Kcjs.getSIUnit; exports.getScreeningInterval = getScreeningInterval; exports.getSexForCode = _chunkIBF6HOBGcjs.getSexForCode; exports.getVisibleDefinitions = _chunkIBF6HOBGcjs.getVisibleDefinitions; exports.interventionToFHIRMedicationStatement = interventionToFHIRMedicationStatement; exports.interventionToFHIRObservation = interventionToFHIRObservation; exports.interventionsToFHIRBundle = interventionsToFHIRBundle; exports.isBiomarkerVisible = _chunkIBF6HOBGcjs.isBiomarkerVisible; exports.isCacDocument = _chunkIBF6HOBGcjs.isCacDocument; exports.isDexaDocument = _chunkIBF6HOBGcjs.isDexaDocument; exports.isScreeningDue = isScreeningDue; exports.isValidCode = _chunkIBF6HOBGcjs.isValidCode; exports.isValidLoinc = _chunkIBF6HOBGcjs.isValidLoinc; exports.labObservationToFHIR = _chunkDGTP2QB6cjs.labObservationToFHIR; exports.labReportToFHIR = _chunkDGTP2QB6cjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunkDGTP2QB6cjs.labResultToFHIRBundle; exports.listMappedSubcategories = listMappedSubcategories; exports.loincToCode = _chunkIBF6HOBGcjs.loincToCode; exports.mapFHIRObservationToInternal = _chunkY7TOLJ2Ycjs.mapFHIRObservationToInternal; exports.normalizeCode = _chunkIBF6HOBGcjs.normalizeCode; exports.plural = plural; exports.pluralCount = pluralCount; exports.pluralPhrase = pluralPhrase; exports.pluralPhraseCount = pluralPhraseCount; exports.processImportBundle = _chunkY7TOLJ2Ycjs.processImportBundle; exports.specimenTypeCoding = specimenTypeCoding; exports.toBiomarkerTests = _chunkIBF6HOBGcjs.toBiomarkerTests; exports.unitToUCUM = _chunkMJ254F5Kcjs.unitToUCUM; exports.userProfileToFHIR = _chunkDGTP2QB6cjs.userProfileToFHIR; exports.validateCNS = validateCNS; exports.validateCPF = validateCPF; exports.validateFHIRDiagnosticReport = _chunk3ILBFLVQcjs.validateFHIRDiagnosticReport; exports.validateFHIRImportBundle = _chunk3ILBFLVQcjs.validateFHIRImportBundle; exports.validateFHIRObservation = _chunk3ILBFLVQcjs.validateFHIRObservation; exports.validateLoincNameMatch = _chunkIBF6HOBGcjs.validateLoincNameMatch;
719
+ exports.AGE_BRACKETS = AGE_BRACKETS; exports.BIOMARKER_CODE_SYSTEM = _chunkOR67NJDZcjs.BIOMARKER_CODE_SYSTEM; exports.BIOMARKER_DEFAULT_UNIT = _chunkMJ254F5Kcjs.BIOMARKER_DEFAULT_UNIT; exports.BIOMARKER_DEFINITIONS = _chunkABCHG3CFcjs.BIOMARKER_DEFINITIONS; exports.BIOMARKER_UNITS = _chunkMJ254F5Kcjs.BIOMARKER_UNITS; exports.BODY_FAT_ZONES = BODY_FAT_ZONES; exports.BR_TIPO_AMOSTRA_VALUESET = BR_TIPO_AMOSTRA_VALUESET; exports.BUNDLE_BASE_URL = _chunkTA4B4WB7cjs.BUNDLE_BASE_URL; exports.CAC_INDICATOR_CODES = _chunkABCHG3CFcjs.CAC_INDICATOR_CODES; exports.CATEGORY_GROUPS = CATEGORY_GROUPS; exports.CATEGORY_SCREENING_INTERVALS = CATEGORY_SCREENING_INTERVALS; exports.DEXA_CATEGORIES = _chunkABCHG3CFcjs.DEXA_CATEGORIES; exports.DEXA_INDICATOR_CODES = _chunkABCHG3CFcjs.DEXA_INDICATOR_CODES; exports.HL7_SPECIMEN_TYPE_SYSTEM = HL7_SPECIMEN_TYPE_SYSTEM; exports.LOINC_SYSTEM = _chunkOR67NJDZcjs.LOINC_SYSTEM; exports.MAX_FILE_SIZE = _chunkYHLC3YNAcjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkYHLC3YNAcjs.MAX_OBSERVATIONS; exports.T_SCORE_ZONES = T_SCORE_ZONES; exports.UNIT_TO_UCUM = _chunkMJ254F5Kcjs.UNIT_TO_UCUM; exports.ZONE_DEFS = ZONE_DEFS; exports.applyFallbackReferenceRanges = _chunk4NSBIPLWcjs.applyFallbackReferenceRanges; exports.biomarkerRangeDefinitions = _chunk4NSBIPLWcjs.biomarkerRangeDefinitions; exports.calculateNextScreeningDate = calculateNextScreeningDate; exports.cnsToFHIRIdentifier = cnsToFHIRIdentifier; exports.codeToLoinc = _chunkABCHG3CFcjs.codeToLoinc; exports.convertUnit = _chunkMJ254F5Kcjs.convertUnit; exports.cpfToFHIRIdentifier = cpfToFHIRIdentifier; exports.defaultReferenceRanges = _chunk4NSBIPLWcjs.defaultReferenceRanges; exports.entryFullUrl = _chunkTA4B4WB7cjs.entryFullUrl; exports.extractObservationsFromBundle = _chunkYHLC3YNAcjs.extractObservationsFromBundle; exports.filterVisibleBiomarkers = _chunkABCHG3CFcjs.filterVisibleBiomarkers; exports.findCodeByName = _chunkABCHG3CFcjs.findCodeByName; exports.formatCNS = formatCNS; exports.formatCPF = formatCPF; exports.generateCacFullReference = _chunkABCHG3CFcjs.generateCacFullReference; exports.generateDexaFullReference = _chunkABCHG3CFcjs.generateDexaFullReference; exports.generateFilteredLLMReference = _chunkABCHG3CFcjs.generateFilteredLLMReference; exports.generateLLMReference = _chunkABCHG3CFcjs.generateLLMReference; exports.getAllCodes = _chunkABCHG3CFcjs.getAllCodes; exports.getAllDefinitions = _chunkABCHG3CFcjs.getAllDefinitions; exports.getAllLoincCodes = _chunkABCHG3CFcjs.getAllLoincCodes; exports.getAllSearchPatterns = _chunkABCHG3CFcjs.getAllSearchPatterns; exports.getBiomarkersByCategory = _chunkABCHG3CFcjs.getBiomarkersByCategory; exports.getBiomarkersForCategories = _chunkABCHG3CFcjs.getBiomarkersForCategories; exports.getCanonicalUnit = _chunkMJ254F5Kcjs.getCanonicalUnit; exports.getCategoriesByInterval = getCategoriesByInterval; exports.getCategoryGroup = getCategoryGroup; exports.getDaysUntilScreening = getDaysUntilScreening; exports.getDefaultUnit = _chunkMJ254F5Kcjs.getDefaultUnit; exports.getDefinitionByCode = _chunkABCHG3CFcjs.getDefinitionByCode; exports.getDefinitionByLoinc = _chunkABCHG3CFcjs.getDefinitionByLoinc; exports.getDefinitionsBySex = _chunkABCHG3CFcjs.getDefinitionsBySex; exports.getDueCategories = getDueCategories; exports.getFallbackReferenceRange = _chunk4NSBIPLWcjs.getFallbackReferenceRange; exports.getRangeDirection = _chunk4NSBIPLWcjs.getRangeDirection; exports.getReferenceRange = _chunk4NSBIPLWcjs.getReferenceRange; exports.getSIUnit = _chunkMJ254F5Kcjs.getSIUnit; exports.getScreeningInterval = getScreeningInterval; exports.getSexForCode = _chunkABCHG3CFcjs.getSexForCode; exports.getVisibleDefinitions = _chunkABCHG3CFcjs.getVisibleDefinitions; exports.interventionToFHIRMedicationStatement = interventionToFHIRMedicationStatement; exports.interventionToFHIRObservation = interventionToFHIRObservation; exports.interventionsToFHIRBundle = interventionsToFHIRBundle; exports.isBiomarkerVisible = _chunkABCHG3CFcjs.isBiomarkerVisible; exports.isCacDocument = _chunkABCHG3CFcjs.isCacDocument; exports.isDexaDocument = _chunkABCHG3CFcjs.isDexaDocument; exports.isScreeningDue = isScreeningDue; exports.isValidCode = _chunkABCHG3CFcjs.isValidCode; exports.isValidLoinc = _chunkABCHG3CFcjs.isValidLoinc; exports.labObservationToFHIR = _chunkTA4B4WB7cjs.labObservationToFHIR; exports.labReportToFHIR = _chunkTA4B4WB7cjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunkTA4B4WB7cjs.labResultToFHIRBundle; exports.listMappedSubcategories = listMappedSubcategories; exports.loincToCode = _chunkABCHG3CFcjs.loincToCode; exports.mapFHIRObservationToInternal = _chunkYHLC3YNAcjs.mapFHIRObservationToInternal; exports.normalizeCode = _chunkABCHG3CFcjs.normalizeCode; exports.plural = plural; exports.pluralCount = pluralCount; exports.pluralPhrase = pluralPhrase; exports.pluralPhraseCount = pluralPhraseCount; exports.processImportBundle = _chunkYHLC3YNAcjs.processImportBundle; exports.specimenTypeCoding = specimenTypeCoding; exports.toBiomarkerTests = _chunkABCHG3CFcjs.toBiomarkerTests; exports.unitToUCUM = _chunkMJ254F5Kcjs.unitToUCUM; exports.userProfileToFHIR = _chunkTA4B4WB7cjs.userProfileToFHIR; exports.validateCNS = validateCNS; exports.validateCPF = validateCPF; exports.validateFHIRDiagnosticReport = _chunk3ILBFLVQcjs.validateFHIRDiagnosticReport; exports.validateFHIRImportBundle = _chunk3ILBFLVQcjs.validateFHIRImportBundle; exports.validateFHIRObservation = _chunk3ILBFLVQcjs.validateFHIRObservation; exports.validateLoincNameMatch = _chunkABCHG3CFcjs.validateLoincNameMatch;
720
720
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -5,14 +5,14 @@ import {
5
5
  labReportToFHIR,
6
6
  labResultToFHIRBundle,
7
7
  userProfileToFHIR
8
- } from "./chunk-PXDGYFGR.js";
8
+ } from "./chunk-UVCWSKPO.js";
9
9
  import {
10
10
  MAX_FILE_SIZE,
11
11
  MAX_OBSERVATIONS,
12
12
  extractObservationsFromBundle,
13
13
  mapFHIRObservationToInternal,
14
14
  processImportBundle
15
- } from "./chunk-2F3TXKDI.js";
15
+ } from "./chunk-JFSIRIBM.js";
16
16
  import {
17
17
  BIOMARKER_CODE_SYSTEM,
18
18
  LOINC_SYSTEM
@@ -49,7 +49,7 @@ import {
49
49
  normalizeCode,
50
50
  toBiomarkerTests,
51
51
  validateLoincNameMatch
52
- } from "./chunk-BNG4YNY2.js";
52
+ } from "./chunk-BA26FWOG.js";
53
53
  import {
54
54
  applyFallbackReferenceRanges,
55
55
  biomarkerRangeDefinitions,
@@ -57,7 +57,7 @@ import {
57
57
  getFallbackReferenceRange,
58
58
  getRangeDirection,
59
59
  getReferenceRange
60
- } from "./chunk-QULBXISC.js";
60
+ } from "./chunk-37LQWDN7.js";
61
61
  import {
62
62
  BIOMARKER_DEFAULT_UNIT,
63
63
  BIOMARKER_UNITS,
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkERALICUKcjs = require('./chunk-ERALICUK.cjs');
8
+ var _chunk4NSBIPLWcjs = require('./chunk-4NSBIPLW.cjs');
9
9
  require('./chunk-MJ254F5K.cjs');
10
10
 
11
11
 
@@ -14,5 +14,5 @@ require('./chunk-MJ254F5K.cjs');
14
14
 
15
15
 
16
16
 
17
- exports.applyFallbackReferenceRanges = _chunkERALICUKcjs.applyFallbackReferenceRanges; exports.biomarkerRangeDefinitions = _chunkERALICUKcjs.biomarkerRangeDefinitions; exports.defaultReferenceRanges = _chunkERALICUKcjs.defaultReferenceRanges; exports.getFallbackReferenceRange = _chunkERALICUKcjs.getFallbackReferenceRange; exports.getRangeDirection = _chunkERALICUKcjs.getRangeDirection; exports.getReferenceRange = _chunkERALICUKcjs.getReferenceRange;
17
+ exports.applyFallbackReferenceRanges = _chunk4NSBIPLWcjs.applyFallbackReferenceRanges; exports.biomarkerRangeDefinitions = _chunk4NSBIPLWcjs.biomarkerRangeDefinitions; exports.defaultReferenceRanges = _chunk4NSBIPLWcjs.defaultReferenceRanges; exports.getFallbackReferenceRange = _chunk4NSBIPLWcjs.getFallbackReferenceRange; exports.getRangeDirection = _chunk4NSBIPLWcjs.getRangeDirection; exports.getReferenceRange = _chunk4NSBIPLWcjs.getReferenceRange;
18
18
  //# sourceMappingURL=reference-ranges.cjs.map
@@ -5,7 +5,7 @@ import {
5
5
  getFallbackReferenceRange,
6
6
  getRangeDirection,
7
7
  getReferenceRange
8
- } from "./chunk-QULBXISC.js";
8
+ } from "./chunk-37LQWDN7.js";
9
9
  import "./chunk-R4MUCMO3.js";
10
10
  export {
11
11
  applyFallbackReferenceRanges,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@precisa-saude/fhir",
3
- "version": "0.25.1",
3
+ "version": "0.26.0",
4
4
  "description": "Tipos FHIR R4, definições de biomarcadores, faixas de referência e conversores para o ecossistema de saúde brasileiro",
5
5
  "keywords": [
6
6
  "fhir",