@precisa-saude/fhir 0.18.0 → 0.20.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-NP4YZFUI.cjs → chunk-2KDLOCD2.cjs} +3 -3
  4. package/dist/{chunk-NP4YZFUI.cjs.map → chunk-2KDLOCD2.cjs.map} +1 -1
  5. package/dist/{chunk-7O6VUA2B.js → chunk-3KIJIRCI.js} +329 -2
  6. package/dist/chunk-3KIJIRCI.js.map +1 -0
  7. package/dist/{chunk-LPYXISLF.js → chunk-6TQ24JCA.js} +2 -2
  8. package/dist/{chunk-HGEQS7P7.cjs → chunk-CFKXCL2N.cjs} +4 -4
  9. package/dist/{chunk-HGEQS7P7.cjs.map → chunk-CFKXCL2N.cjs.map} +1 -1
  10. package/dist/{chunk-CBGEU6SG.cjs → chunk-ERALICUK.cjs} +60 -1
  11. package/dist/chunk-ERALICUK.cjs.map +1 -0
  12. package/dist/{chunk-ONRVND6U.cjs → chunk-NXOTXKVB.cjs} +329 -2
  13. package/dist/chunk-NXOTXKVB.cjs.map +1 -0
  14. package/dist/{chunk-HP3OETAJ.js → chunk-OZGOBYLX.js} +2 -2
  15. package/dist/{chunk-LR2OUVOA.js → chunk-QULBXISC.js} +60 -1
  16. package/dist/chunk-QULBXISC.js.map +1 -0
  17. package/dist/cli.js +388 -2
  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 +6 -6
  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-7O6VUA2B.js.map +0 -1
  28. package/dist/chunk-CBGEU6SG.cjs.map +0 -1
  29. package/dist/chunk-LR2OUVOA.js.map +0 -1
  30. package/dist/chunk-ONRVND6U.cjs.map +0 -1
  31. /package/dist/{chunk-LPYXISLF.js.map → chunk-6TQ24JCA.js.map} +0 -0
  32. /package/dist/{chunk-HP3OETAJ.js.map → chunk-OZGOBYLX.js.map} +0 -0
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- var _chunkONRVND6Ucjs = require('./chunk-ONRVND6U.cjs');
33
+ var _chunkNXOTXKVBcjs = require('./chunk-NXOTXKVB.cjs');
34
34
 
35
35
 
36
36
 
@@ -63,5 +63,5 @@ var _chunkONRVND6Ucjs = require('./chunk-ONRVND6U.cjs');
63
63
 
64
64
 
65
65
 
66
- exports.BIOMARKER_DEFINITIONS = _chunkONRVND6Ucjs.BIOMARKER_DEFINITIONS; exports.CAC_INDICATOR_CODES = _chunkONRVND6Ucjs.CAC_INDICATOR_CODES; exports.DEXA_CATEGORIES = _chunkONRVND6Ucjs.DEXA_CATEGORIES; exports.DEXA_INDICATOR_CODES = _chunkONRVND6Ucjs.DEXA_INDICATOR_CODES; exports.codeToLoinc = _chunkONRVND6Ucjs.codeToLoinc; exports.filterVisibleBiomarkers = _chunkONRVND6Ucjs.filterVisibleBiomarkers; exports.findCodeByName = _chunkONRVND6Ucjs.findCodeByName; exports.generateCacFullReference = _chunkONRVND6Ucjs.generateCacFullReference; exports.generateDexaFullReference = _chunkONRVND6Ucjs.generateDexaFullReference; exports.generateFilteredLLMReference = _chunkONRVND6Ucjs.generateFilteredLLMReference; exports.generateLLMReference = _chunkONRVND6Ucjs.generateLLMReference; exports.getAllCodes = _chunkONRVND6Ucjs.getAllCodes; exports.getAllDefinitions = _chunkONRVND6Ucjs.getAllDefinitions; exports.getAllLoincCodes = _chunkONRVND6Ucjs.getAllLoincCodes; exports.getAllSearchPatterns = _chunkONRVND6Ucjs.getAllSearchPatterns; exports.getBiomarkersByCategory = _chunkONRVND6Ucjs.getBiomarkersByCategory; exports.getBiomarkersForCategories = _chunkONRVND6Ucjs.getBiomarkersForCategories; exports.getDefinitionByCode = _chunkONRVND6Ucjs.getDefinitionByCode; exports.getDefinitionByLoinc = _chunkONRVND6Ucjs.getDefinitionByLoinc; exports.getDefinitionsBySex = _chunkONRVND6Ucjs.getDefinitionsBySex; exports.getSexForCode = _chunkONRVND6Ucjs.getSexForCode; exports.getVisibleDefinitions = _chunkONRVND6Ucjs.getVisibleDefinitions; exports.isBiomarkerVisible = _chunkONRVND6Ucjs.isBiomarkerVisible; exports.isCacDocument = _chunkONRVND6Ucjs.isCacDocument; exports.isDexaDocument = _chunkONRVND6Ucjs.isDexaDocument; exports.isValidCode = _chunkONRVND6Ucjs.isValidCode; exports.isValidLoinc = _chunkONRVND6Ucjs.isValidLoinc; exports.loincToCode = _chunkONRVND6Ucjs.loincToCode; exports.normalizeCode = _chunkONRVND6Ucjs.normalizeCode; exports.toBiomarkerTests = _chunkONRVND6Ucjs.toBiomarkerTests; exports.validateLoincNameMatch = _chunkONRVND6Ucjs.validateLoincNameMatch;
66
+ exports.BIOMARKER_DEFINITIONS = _chunkNXOTXKVBcjs.BIOMARKER_DEFINITIONS; exports.CAC_INDICATOR_CODES = _chunkNXOTXKVBcjs.CAC_INDICATOR_CODES; exports.DEXA_CATEGORIES = _chunkNXOTXKVBcjs.DEXA_CATEGORIES; exports.DEXA_INDICATOR_CODES = _chunkNXOTXKVBcjs.DEXA_INDICATOR_CODES; exports.codeToLoinc = _chunkNXOTXKVBcjs.codeToLoinc; exports.filterVisibleBiomarkers = _chunkNXOTXKVBcjs.filterVisibleBiomarkers; exports.findCodeByName = _chunkNXOTXKVBcjs.findCodeByName; exports.generateCacFullReference = _chunkNXOTXKVBcjs.generateCacFullReference; exports.generateDexaFullReference = _chunkNXOTXKVBcjs.generateDexaFullReference; exports.generateFilteredLLMReference = _chunkNXOTXKVBcjs.generateFilteredLLMReference; exports.generateLLMReference = _chunkNXOTXKVBcjs.generateLLMReference; exports.getAllCodes = _chunkNXOTXKVBcjs.getAllCodes; exports.getAllDefinitions = _chunkNXOTXKVBcjs.getAllDefinitions; exports.getAllLoincCodes = _chunkNXOTXKVBcjs.getAllLoincCodes; exports.getAllSearchPatterns = _chunkNXOTXKVBcjs.getAllSearchPatterns; exports.getBiomarkersByCategory = _chunkNXOTXKVBcjs.getBiomarkersByCategory; exports.getBiomarkersForCategories = _chunkNXOTXKVBcjs.getBiomarkersForCategories; exports.getDefinitionByCode = _chunkNXOTXKVBcjs.getDefinitionByCode; exports.getDefinitionByLoinc = _chunkNXOTXKVBcjs.getDefinitionByLoinc; exports.getDefinitionsBySex = _chunkNXOTXKVBcjs.getDefinitionsBySex; exports.getSexForCode = _chunkNXOTXKVBcjs.getSexForCode; exports.getVisibleDefinitions = _chunkNXOTXKVBcjs.getVisibleDefinitions; exports.isBiomarkerVisible = _chunkNXOTXKVBcjs.isBiomarkerVisible; exports.isCacDocument = _chunkNXOTXKVBcjs.isCacDocument; exports.isDexaDocument = _chunkNXOTXKVBcjs.isDexaDocument; exports.isValidCode = _chunkNXOTXKVBcjs.isValidCode; exports.isValidLoinc = _chunkNXOTXKVBcjs.isValidLoinc; exports.loincToCode = _chunkNXOTXKVBcjs.loincToCode; exports.normalizeCode = _chunkNXOTXKVBcjs.normalizeCode; exports.toBiomarkerTests = _chunkNXOTXKVBcjs.toBiomarkerTests; exports.validateLoincNameMatch = _chunkNXOTXKVBcjs.validateLoincNameMatch;
67
67
  //# sourceMappingURL=biomarkers.cjs.map
@@ -30,7 +30,7 @@ import {
30
30
  normalizeCode,
31
31
  toBiomarkerTests,
32
32
  validateLoincNameMatch
33
- } from "./chunk-7O6VUA2B.js";
33
+ } from "./chunk-3KIJIRCI.js";
34
34
  export {
35
35
  BIOMARKER_DEFINITIONS,
36
36
  CAC_INDICATOR_CODES,
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkONRVND6Ucjs = require('./chunk-ONRVND6U.cjs');
3
+ var _chunkNXOTXKVBcjs = require('./chunk-NXOTXKVB.cjs');
4
4
 
5
5
 
6
6
 
@@ -30,7 +30,7 @@ function interpretationDisplay(flag) {
30
30
  }
31
31
  }
32
32
  function labObservationToFHIR(observation, patientId, laboratoryName) {
33
- const loincCode = _chunkONRVND6Ucjs.codeToLoinc.call(void 0, observation.biomarkerCode) || "99999-9";
33
+ const loincCode = _chunkNXOTXKVBcjs.codeToLoinc.call(void 0, observation.biomarkerCode) || "99999-9";
34
34
  const sourceUnit = observation.unit || _chunkMJ254F5Kcjs.getDefaultUnit.call(void 0, observation.biomarkerCode) || observation.unit;
35
35
  const ucumUnit = _chunkMJ254F5Kcjs.unitToUCUM.call(void 0, sourceUnit);
36
36
  const isQualitative = observation.isQualitative || typeof observation.value === "string";
@@ -248,4 +248,4 @@ function labResultToFHIRBundle(report, observations, userProfile) {
248
248
 
249
249
 
250
250
  exports.labObservationToFHIR = labObservationToFHIR; exports.labReportToFHIR = labReportToFHIR; exports.userProfileToFHIR = userProfileToFHIR; exports.labResultToFHIRBundle = labResultToFHIRBundle;
251
- //# sourceMappingURL=chunk-NP4YZFUI.cjs.map
251
+ //# sourceMappingURL=chunk-2KDLOCD2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-NP4YZFUI.cjs","../src/converter.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-NP4YZFUI.cjs","sourcesContent":[null,"/**\n * FHIR Converter\n *\n * Converts lab results to FHIR R4 DiagnosticReport and Observation resources.\n * See: https://hl7.org/fhir/diagnosticreport.html\n */\n\nimport { codeToLoinc } from './biomarkers';\nimport type { FHIRBundle, FHIRDiagnosticReport, FHIRObservation, FHIRPatient } from './fhir-types';\nimport type { Flag, LabObservationData, LabReportData, UserProfileData } from './types';\nimport { getDefaultUnit, unitToUCUM } from './units';\n\n// Re-export all types and functions\nexport * from './fhir-types';\n\n/**\n * Convert Flag to FHIR interpretation code\n */\nfunction interpretationCode(flag: Flag): string {\n switch (flag) {\n case 'H':\n return 'H'; // High\n case 'L':\n return 'L'; // Low\n default:\n return 'N'; // Normal\n }\n}\n\n/**\n * Convert Flag to FHIR interpretation display\n */\nfunction interpretationDisplay(flag: Flag): string {\n switch (flag) {\n case 'H':\n return 'High';\n case 'L':\n return 'Low';\n default:\n return 'Normal';\n }\n}\n\n/**\n * Convert generic lab observation to FHIR Observation\n */\nexport function labObservationToFHIR(\n observation: LabObservationData,\n patientId: string,\n laboratoryName?: string,\n): FHIRObservation {\n const loincCode = codeToLoinc(observation.biomarkerCode) || '99999-9';\n // Use default unit if source unit is empty\n const sourceUnit =\n observation.unit || getDefaultUnit(observation.biomarkerCode) || observation.unit;\n const ucumUnit = unitToUCUM(sourceUnit);\n const isQualitative = observation.isQualitative || typeof observation.value === 'string';\n\n // Base observation structure\n const fhirObs: FHIRObservation = {\n category: [\n {\n coding: [\n {\n code: 'laboratory',\n display: 'Laboratory',\n system: 'http://terminology.hl7.org/CodeSystem/observation-category',\n },\n ],\n },\n ],\n code: {\n coding: [\n {\n code: loincCode,\n display: observation.biomarkerName,\n system: 'http://loinc.org',\n },\n {\n code: observation.biomarkerCode,\n display: observation.biomarkerName,\n system: 'http://fhir-brasil.dev/biomarker-codes',\n },\n ],\n text: observation.biomarkerName,\n },\n effectiveDateTime: observation.collectionDate,\n id: `${observation.reportId}-${observation.biomarkerCode}`,\n interpretation: [\n {\n coding: [\n {\n code: interpretationCode(observation.flag),\n display: interpretationDisplay(observation.flag),\n system: 'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation',\n },\n ],\n },\n ],\n performer: laboratoryName ? [{ display: laboratoryName }] : undefined,\n resourceType: 'Observation',\n status: 'final',\n subject: {\n reference: `Patient/${patientId}`,\n },\n };\n\n // Add value based on type (qualitative = string, quantitative = number)\n if (isQualitative) {\n fhirObs.valueString = String(observation.value);\n } else {\n fhirObs.valueQuantity = {\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value: observation.value as number,\n };\n\n // Reference range only applies to quantitative values\n if (observation.referenceMin !== undefined && observation.referenceMax !== undefined) {\n fhirObs.referenceRange = [\n {\n high: {\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value: observation.referenceMax,\n },\n low: {\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value: observation.referenceMin,\n },\n },\n ];\n }\n }\n\n return fhirObs;\n}\n\n/**\n * Convert generic lab report to FHIR DiagnosticReport\n */\nexport function labReportToFHIR(\n report: LabReportData,\n patientId: string,\n observationIds: string[],\n): FHIRDiagnosticReport {\n // Map processing status to FHIR status\n let status: FHIRDiagnosticReport['status'];\n switch (report.processingStatus) {\n case 'complete':\n status = 'final';\n break;\n case 'partial':\n status = 'partial';\n break;\n case 'pending_review':\n status = 'preliminary';\n break;\n default:\n status = 'final';\n }\n\n return {\n category: [\n {\n coding: [\n {\n code: 'LAB',\n display: 'Laboratory',\n system: 'http://terminology.hl7.org/CodeSystem/v2-0074',\n },\n ],\n },\n ],\n code: {\n coding: [\n {\n code: '11502-2', // Laboratory report\n display: 'Laboratory report',\n system: 'http://loinc.org',\n },\n ],\n text: 'Laboratory Results',\n },\n conclusion:\n report.overallStatus === 'NORMAL'\n ? 'All results within normal limits'\n : 'One or more abnormal results detected',\n conclusionCode:\n report.overallStatus === 'ANORMAL'\n ? [\n {\n coding: [\n {\n code: 'A',\n display: 'Abnormal',\n system: 'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation',\n },\n ],\n },\n ]\n : undefined,\n effectiveDateTime: report.collectionDate,\n id: report.reportId,\n issued: report.createdAt,\n performer: report.laboratoryName ? [{ display: report.laboratoryName }] : undefined,\n resourceType: 'DiagnosticReport',\n result: observationIds.map((id) => ({ reference: `Observation/${id}` })),\n status,\n subject: {\n reference: `Patient/${patientId}`,\n },\n };\n}\n\n/**\n * Convert user profile to FHIR Patient\n * NOTE: CPF is intentionally excluded for privacy (LGPD compliance)\n */\nexport function userProfileToFHIR(profile: UserProfileData): FHIRPatient {\n const nameParts = profile.name.split(' ');\n const given = nameParts.slice(0, -1);\n const family = nameParts[nameParts.length - 1] || '';\n\n return {\n address: profile.address\n ? [\n {\n city: profile.address.city,\n country: profile.address.country || 'BR',\n line: [\n profile.address.street && profile.address.number\n ? `${profile.address.street}, ${profile.address.number}`\n : profile.address.street,\n profile.address.complement,\n ].filter(Boolean) as string[],\n postalCode: profile.address.postalCode,\n state: profile.address.state,\n },\n ]\n : undefined,\n birthDate: profile.birthDate,\n gender: profile.gender,\n id: profile.userId,\n name: [\n {\n family,\n given: given.length > 0 ? given : undefined,\n text: profile.name,\n },\n ],\n resourceType: 'Patient',\n telecom:\n [\n ...(profile.email ? [{ system: 'email' as const, value: profile.email }] : []),\n ...(profile.phone ? [{ system: 'phone' as const, value: profile.phone }] : []),\n ].length > 0\n ? [\n ...(profile.email ? [{ system: 'email' as const, value: profile.email }] : []),\n ...(profile.phone ? [{ system: 'phone' as const, value: profile.phone }] : []),\n ]\n : undefined,\n };\n}\n\n/**\n * Convert complete lab result to FHIR Bundle\n * This is the main function for exporting lab results to FHIR R4 format\n */\nexport function labResultToFHIRBundle(\n report: LabReportData,\n observations: LabObservationData[],\n userProfile: UserProfileData,\n): FHIRBundle {\n const patientId = userProfile.userId;\n\n // Convert observations\n const fhirObservations = observations.map((obs) => ({\n fullUrl: `urn:uuid:observation-${obs.reportId}-${obs.biomarkerCode}`,\n resource: labObservationToFHIR(\n { ...obs, collectionDate: report.collectionDate },\n patientId,\n report.laboratoryName,\n ),\n }));\n\n const observationIds = observations.map(\n (obs) => `observation-${obs.reportId}-${obs.biomarkerCode}`,\n );\n\n // Convert report\n const diagnosticReport = labReportToFHIR(report, patientId, observationIds);\n\n // Convert patient\n const fhirPatient = userProfileToFHIR(userProfile);\n\n return {\n entry: [\n {\n fullUrl: `urn:uuid:${patientId}`,\n resource: fhirPatient,\n },\n {\n fullUrl: `urn:uuid:diagnostic-report-${report.reportId}`,\n resource: diagnosticReport,\n },\n ...fhirObservations,\n ],\n resourceType: 'Bundle',\n type: 'collection',\n };\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-2KDLOCD2.cjs","../src/converter.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACUA,SAAS,kBAAA,CAAmB,IAAA,EAAoB;AAC9C,EAAA,OAAA,CAAQ,IAAA,EAAM;AAAA,IACZ,KAAK,GAAA;AACH,MAAA,OAAO,GAAA;AAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,GAAA;AAAA;AAAA,IACT,OAAA;AACE,MAAA,OAAO,GAAA;AAAA,EACX;AACF;AAKA,SAAS,qBAAA,CAAsB,IAAA,EAAoB;AACjD,EAAA,OAAA,CAAQ,IAAA,EAAM;AAAA,IACZ,KAAK,GAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,OAAA;AACE,MAAA,OAAO,QAAA;AAAA,EACX;AACF;AAKO,SAAS,oBAAA,CACd,WAAA,EACA,SAAA,EACA,cAAA,EACiB;AACjB,EAAA,MAAM,UAAA,EAAY,2CAAA,WAAY,CAAY,aAAa,EAAA,GAAK,SAAA;AAE5D,EAAA,MAAM,WAAA,EACJ,WAAA,CAAY,KAAA,GAAQ,8CAAA,WAAe,CAAY,aAAa,EAAA,GAAK,WAAA,CAAY,IAAA;AAC/E,EAAA,MAAM,SAAA,EAAW,0CAAA,UAAqB,CAAA;AACtC,EAAA,MAAM,cAAA,EAAgB,WAAA,CAAY,cAAA,GAAiB,OAAO,WAAA,CAAY,MAAA,IAAU,QAAA;AAGhF,EAAA,MAAM,QAAA,EAA2B;AAAA,IAC/B,QAAA,EAAU;AAAA,MACR;AAAA,QACE,MAAA,EAAQ;AAAA,UACN;AAAA,YACE,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS,YAAA;AAAA,YACT,MAAA,EAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,WAAA,CAAY,aAAA;AAAA,UACrB,MAAA,EAAQ;AAAA,QACV,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAM,WAAA,CAAY,aAAA;AAAA,UAClB,OAAA,EAAS,WAAA,CAAY,aAAA;AAAA,UACrB,MAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAAA,MACA,IAAA,EAAM,WAAA,CAAY;AAAA,IACpB,CAAA;AAAA,IACA,iBAAA,EAAmB,WAAA,CAAY,cAAA;AAAA,IAC/B,EAAA,EAAI,CAAA,EAAA;AACJ,IAAA;AACE,MAAA;AACE,QAAA;AAAQ,UAAA;AACN,YAAA;AAC2C,YAAA;AACM,YAAA;AACvC,UAAA;AAEZ,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AAGI,EAAA;AACF,IAAA;AACK,EAAA;AACL,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AAGI,IAAA;AACF,MAAA;AACE,QAAA;AAAA,UAAA;AACQ,YAAA;AACE,YAAA;AACE,YAAA;AACF,YAAA;AACa,UAAA;AACrB,UAAA;AACK,YAAA;AACG,YAAA;AACE,YAAA;AACF,YAAA;AACa,UAAA;AAEvB,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAKgB;AAMV,EAAA;AACJ,EAAA;AACO,IAAA;AACH,MAAA;AACA,MAAA;AACG,IAAA;AACH,MAAA;AACA,MAAA;AACG,IAAA;AACH,MAAA;AACA,MAAA;AACF,IAAA;AACE,MAAA;AACJ,EAAA;AAEO,EAAA;AACL,IAAA;AACE,MAAA;AACE,QAAA;AAAQ,UAAA;AACN,YAAA;AACQ,YAAA;AACG,YAAA;AACD,UAAA;AAEZ,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACE,MAAA;AACE,QAAA;AAAA,UAAA;AACQ;AAAA,UAAA;AACG,UAAA;AAEX,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AAIA,IAAA;AAGQ,MAAA;AACE,QAAA;AAAQ,UAAA;AACN,YAAA;AACQ,YAAA;AACG,YAAA;AACD,UAAA;AAEZ,QAAA;AACF,MAAA;AAEF,IAAA;AACN,IAAA;AACI,IAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACE,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAMgB;AACR,EAAA;AACA,EAAA;AACA,EAAA;AAEC,EAAA;AACL,IAAA;AAEM,MAAA;AACE,QAAA;AACA,QAAA;AACA,QAAA;AAAM,UAAA;AAGgB,UAAA;AAEtB,QAAA;AACA,QAAA;AACA,QAAA;AACF,MAAA;AAEF,IAAA;AACJ,IAAA;AACA,IAAA;AACI,IAAA;AACJ,IAAA;AACE,MAAA;AACE,QAAA;AACA,QAAA;AACA,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACA,IAAA;AAEQ,MAAA;AACA,MAAA;AACJ,IAAA;AAEQ,MAAA;AACA,MAAA;AAEN,IAAA;AACR,EAAA;AACF;AAMgB;AAKR,EAAA;AAGA,EAAA;AACJ,IAAA;AACA,IAAA;AACI,MAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AACA,EAAA;AAEI,EAAA;AACH,IAAA;AACH,EAAA;AAGM,EAAA;AAGA,EAAA;AAEC,EAAA;AACL,IAAA;AACE,MAAA;AACE,QAAA;AACA,QAAA;AACF,MAAA;AACA,MAAA;AACE,QAAA;AACA,QAAA;AACF,MAAA;AACG,MAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;ADxES;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-2KDLOCD2.cjs","sourcesContent":[null,"/**\n * FHIR Converter\n *\n * Converts lab results to FHIR R4 DiagnosticReport and Observation resources.\n * See: https://hl7.org/fhir/diagnosticreport.html\n */\n\nimport { codeToLoinc } from './biomarkers';\nimport type { FHIRBundle, FHIRDiagnosticReport, FHIRObservation, FHIRPatient } from './fhir-types';\nimport type { Flag, LabObservationData, LabReportData, UserProfileData } from './types';\nimport { getDefaultUnit, unitToUCUM } from './units';\n\n// Re-export all types and functions\nexport * from './fhir-types';\n\n/**\n * Convert Flag to FHIR interpretation code\n */\nfunction interpretationCode(flag: Flag): string {\n switch (flag) {\n case 'H':\n return 'H'; // High\n case 'L':\n return 'L'; // Low\n default:\n return 'N'; // Normal\n }\n}\n\n/**\n * Convert Flag to FHIR interpretation display\n */\nfunction interpretationDisplay(flag: Flag): string {\n switch (flag) {\n case 'H':\n return 'High';\n case 'L':\n return 'Low';\n default:\n return 'Normal';\n }\n}\n\n/**\n * Convert generic lab observation to FHIR Observation\n */\nexport function labObservationToFHIR(\n observation: LabObservationData,\n patientId: string,\n laboratoryName?: string,\n): FHIRObservation {\n const loincCode = codeToLoinc(observation.biomarkerCode) || '99999-9';\n // Use default unit if source unit is empty\n const sourceUnit =\n observation.unit || getDefaultUnit(observation.biomarkerCode) || observation.unit;\n const ucumUnit = unitToUCUM(sourceUnit);\n const isQualitative = observation.isQualitative || typeof observation.value === 'string';\n\n // Base observation structure\n const fhirObs: FHIRObservation = {\n category: [\n {\n coding: [\n {\n code: 'laboratory',\n display: 'Laboratory',\n system: 'http://terminology.hl7.org/CodeSystem/observation-category',\n },\n ],\n },\n ],\n code: {\n coding: [\n {\n code: loincCode,\n display: observation.biomarkerName,\n system: 'http://loinc.org',\n },\n {\n code: observation.biomarkerCode,\n display: observation.biomarkerName,\n system: 'http://fhir-brasil.dev/biomarker-codes',\n },\n ],\n text: observation.biomarkerName,\n },\n effectiveDateTime: observation.collectionDate,\n id: `${observation.reportId}-${observation.biomarkerCode}`,\n interpretation: [\n {\n coding: [\n {\n code: interpretationCode(observation.flag),\n display: interpretationDisplay(observation.flag),\n system: 'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation',\n },\n ],\n },\n ],\n performer: laboratoryName ? [{ display: laboratoryName }] : undefined,\n resourceType: 'Observation',\n status: 'final',\n subject: {\n reference: `Patient/${patientId}`,\n },\n };\n\n // Add value based on type (qualitative = string, quantitative = number)\n if (isQualitative) {\n fhirObs.valueString = String(observation.value);\n } else {\n fhirObs.valueQuantity = {\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value: observation.value as number,\n };\n\n // Reference range only applies to quantitative values\n if (observation.referenceMin !== undefined && observation.referenceMax !== undefined) {\n fhirObs.referenceRange = [\n {\n high: {\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value: observation.referenceMax,\n },\n low: {\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value: observation.referenceMin,\n },\n },\n ];\n }\n }\n\n return fhirObs;\n}\n\n/**\n * Convert generic lab report to FHIR DiagnosticReport\n */\nexport function labReportToFHIR(\n report: LabReportData,\n patientId: string,\n observationIds: string[],\n): FHIRDiagnosticReport {\n // Map processing status to FHIR status\n let status: FHIRDiagnosticReport['status'];\n switch (report.processingStatus) {\n case 'complete':\n status = 'final';\n break;\n case 'partial':\n status = 'partial';\n break;\n case 'pending_review':\n status = 'preliminary';\n break;\n default:\n status = 'final';\n }\n\n return {\n category: [\n {\n coding: [\n {\n code: 'LAB',\n display: 'Laboratory',\n system: 'http://terminology.hl7.org/CodeSystem/v2-0074',\n },\n ],\n },\n ],\n code: {\n coding: [\n {\n code: '11502-2', // Laboratory report\n display: 'Laboratory report',\n system: 'http://loinc.org',\n },\n ],\n text: 'Laboratory Results',\n },\n conclusion:\n report.overallStatus === 'NORMAL'\n ? 'All results within normal limits'\n : 'One or more abnormal results detected',\n conclusionCode:\n report.overallStatus === 'ANORMAL'\n ? [\n {\n coding: [\n {\n code: 'A',\n display: 'Abnormal',\n system: 'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation',\n },\n ],\n },\n ]\n : undefined,\n effectiveDateTime: report.collectionDate,\n id: report.reportId,\n issued: report.createdAt,\n performer: report.laboratoryName ? [{ display: report.laboratoryName }] : undefined,\n resourceType: 'DiagnosticReport',\n result: observationIds.map((id) => ({ reference: `Observation/${id}` })),\n status,\n subject: {\n reference: `Patient/${patientId}`,\n },\n };\n}\n\n/**\n * Convert user profile to FHIR Patient\n * NOTE: CPF is intentionally excluded for privacy (LGPD compliance)\n */\nexport function userProfileToFHIR(profile: UserProfileData): FHIRPatient {\n const nameParts = profile.name.split(' ');\n const given = nameParts.slice(0, -1);\n const family = nameParts[nameParts.length - 1] || '';\n\n return {\n address: profile.address\n ? [\n {\n city: profile.address.city,\n country: profile.address.country || 'BR',\n line: [\n profile.address.street && profile.address.number\n ? `${profile.address.street}, ${profile.address.number}`\n : profile.address.street,\n profile.address.complement,\n ].filter(Boolean) as string[],\n postalCode: profile.address.postalCode,\n state: profile.address.state,\n },\n ]\n : undefined,\n birthDate: profile.birthDate,\n gender: profile.gender,\n id: profile.userId,\n name: [\n {\n family,\n given: given.length > 0 ? given : undefined,\n text: profile.name,\n },\n ],\n resourceType: 'Patient',\n telecom:\n [\n ...(profile.email ? [{ system: 'email' as const, value: profile.email }] : []),\n ...(profile.phone ? [{ system: 'phone' as const, value: profile.phone }] : []),\n ].length > 0\n ? [\n ...(profile.email ? [{ system: 'email' as const, value: profile.email }] : []),\n ...(profile.phone ? [{ system: 'phone' as const, value: profile.phone }] : []),\n ]\n : undefined,\n };\n}\n\n/**\n * Convert complete lab result to FHIR Bundle\n * This is the main function for exporting lab results to FHIR R4 format\n */\nexport function labResultToFHIRBundle(\n report: LabReportData,\n observations: LabObservationData[],\n userProfile: UserProfileData,\n): FHIRBundle {\n const patientId = userProfile.userId;\n\n // Convert observations\n const fhirObservations = observations.map((obs) => ({\n fullUrl: `urn:uuid:observation-${obs.reportId}-${obs.biomarkerCode}`,\n resource: labObservationToFHIR(\n { ...obs, collectionDate: report.collectionDate },\n patientId,\n report.laboratoryName,\n ),\n }));\n\n const observationIds = observations.map(\n (obs) => `observation-${obs.reportId}-${obs.biomarkerCode}`,\n );\n\n // Convert report\n const diagnosticReport = labReportToFHIR(report, patientId, observationIds);\n\n // Convert patient\n const fhirPatient = userProfileToFHIR(userProfile);\n\n return {\n entry: [\n {\n fullUrl: `urn:uuid:${patientId}`,\n resource: fhirPatient,\n },\n {\n fullUrl: `urn:uuid:diagnostic-report-${report.reportId}`,\n resource: diagnosticReport,\n },\n ...fhirObservations,\n ],\n resourceType: 'Bundle',\n type: 'collection',\n };\n}\n"]}
@@ -1984,10 +1984,20 @@ var BIOMARKER_DEFINITIONS = [
1984
1984
  },
1985
1985
  unit: "kg"
1986
1986
  },
1987
+ // Sem `loinc` de propósito. A entrada apontava para 73964-9, cujo nome
1988
+ // oficial é "Body muscle mass Calculated", e massa magra não é massa
1989
+ // muscular: em DEXA, massa magra é tudo que não é gordura nem mineral
1990
+ // ósseo, incluindo órgãos, água e tecido conjuntivo. Massa muscular é um
1991
+ // subconjunto dela.
1992
+ //
1993
+ // O campo sai em bundle FHIR, então a aproximação não ficava só aqui — um
1994
+ // consumidor externo leria massa muscular onde escrevemos massa magra. Não
1995
+ // há LOINC para massa magra (busca por "lean body mass" só devolve códigos
1996
+ // de urina ajustados por LBM), então o certo é não ter código, como já se
1997
+ // faz com FatFreeMass. Quem quer massa muscular usa MuscleMass, abaixo.
1987
1998
  {
1988
1999
  category: "composicao-corporal",
1989
2000
  code: "LeanMass",
1990
- loinc: "73964-9",
1991
2001
  names: {
1992
2002
  en: ["Lean Mass", "Lean Body Mass", "Lean Tissue Mass", "Total Lean Mass", "LBM"],
1993
2003
  pt: ["Massa Magra", "Massa Corporal Magra", "Tecido Magro", "Massa Magra Total"]
@@ -2156,6 +2166,323 @@ var BIOMARKER_DEFINITIONS = [
2156
2166
  },
2157
2167
  unit: "kg"
2158
2168
  },
2169
+ // ===========================================================================
2170
+ // Composição corporal por bioimpedância, adipometria e antropometria
2171
+ // ===========================================================================
2172
+ //
2173
+ // POLÍTICA DE `loinc` AUSENTE, e o que ela custa
2174
+ //
2175
+ // Várias entradas abaixo não têm `loinc`. Isso não é pendência esquecida: é
2176
+ // o resultado de procurar e não achar, e a decisão tem consequência que
2177
+ // vale enunciar uma vez.
2178
+ //
2179
+ // O que muda sem o código: a observação continua sendo exportada em FHIR e
2180
+ // continua aparecendo para o usuário, mas o `Observation.code` sai só com o
2181
+ // nosso código interno, sem identificador interoperável. Um consumidor
2182
+ // externo consegue ler o valor e a unidade, e não consegue mapear a medida
2183
+ // para o vocabulário dele sem acordo bilateral. Na prática: exibível
2184
+ // sempre, comparável entre sistemas só quando há LOINC.
2185
+ //
2186
+ // Por que ainda assim é o certo: código errado é pior que código ausente.
2187
+ // Ausente o consumidor sabe que precisa perguntar; errado ele integra com
2188
+ // confiança e erra em silêncio. Esta mesma PR corrige um caso desses, em
2189
+ // que `LeanMass` apontava para "Body muscle mass" e o IG publicava massa
2190
+ // muscular sob o rótulo de massa magra.
2191
+ //
2192
+ // Como preencher depois: quando a LOINC publicar o conceito, basta somar o
2193
+ // campo `loinc` — o código interno não muda, e as observações já gravadas
2194
+ // não precisam ser reescritas, porque a chave é o nosso código.
2195
+ //
2196
+ // Todos os códigos aqui foram conferidos na API pública da NLM (Clinical
2197
+ // Table Search Service), e a ausência só foi registrada depois de tentar
2198
+ // múltiplas formulações: "total body water" não devolve nada, "body water"
2199
+ // devolve os dois códigos abaixo.
2200
+ //
2201
+ // As 13 entradas sem código, e o motivo de cada uma:
2202
+ //
2203
+ // MuscleMassIndex corte publicado é sobre massa apendicular, não total
2204
+ // VisceralFatLevel índice de 1 a 20; 73707-2 é área, outra grandeza
2205
+ // ResidualMass conceito de fracionamento antropométrico, não LOINC
2206
+ // BasalMetabolicRate candidatos são índice ou RMR medido, ver nota local
2207
+ // ExtracellularWater "extracellular water" não devolve nada
2208
+ // IntracellularWater "intracellular water" não devolve nada
2209
+ // ECWToTBWRatio razão derivada, sem conceito próprio
2210
+ // WaistToHeightRatio "waist to height" não devolve nada
2211
+ // ConicityIndex índice derivado, sem conceito próprio
2212
+ // SkinfoldSubscapular LOINC só tem tríceps, coxa e cintura
2213
+ // SkinfoldSuprailiac idem
2214
+ // SkinfoldChest idem
2215
+ // SkinfoldMidaxillary idem
2216
+ // Bioimpedância (BIA)
2217
+ {
2218
+ category: "composicao-corporal",
2219
+ code: "TotalBodyWater",
2220
+ loinc: "101683-1",
2221
+ names: {
2222
+ en: ["Total Body Water", "Body Water", "TBW", "Total Water"],
2223
+ pt: ["\xC1gua Corporal Total", "\xC1gua Corporal", "ACT", "\xC1gua Total"]
2224
+ },
2225
+ unit: "L"
2226
+ },
2227
+ {
2228
+ category: "composicao-corporal",
2229
+ code: "BodyWaterPct",
2230
+ loinc: "101684-9",
2231
+ names: {
2232
+ en: ["Body Water Percentage", "Percentage of Body Water", "% Body Water", "Water %"],
2233
+ pt: ["Percentual de \xC1gua Corporal", "% \xC1gua Corporal", "\xC1gua Corporal %"]
2234
+ },
2235
+ unit: "%"
2236
+ },
2237
+ {
2238
+ category: "composicao-corporal",
2239
+ code: "MuscleMass",
2240
+ loinc: "73964-9",
2241
+ names: {
2242
+ en: ["Muscle Mass", "Skeletal Muscle Mass", "SMM", "Body Muscle Mass"],
2243
+ pt: [
2244
+ "Massa Muscular",
2245
+ "Massa Muscular Esquel\xE9tica",
2246
+ "MME",
2247
+ "Massa Muscular Corporal",
2248
+ "M\xFAsculo"
2249
+ ]
2250
+ },
2251
+ unit: "kg"
2252
+ },
2253
+ // Derivado, não extraído: `MuscleMass / altura²`, calculado pelo
2254
+ // `calculadoras-clinicas` a partir da altura que o usuário informa no
2255
+ // cadastro. Mesmo ajuste que o IMC faz com o peso, e serve para a medida
2256
+ // ser comparável entre estaturas diferentes e ao longo do tempo.
2257
+ //
2258
+ // Sem `loinc` e sem faixa, e agora com fonte para a decisão em vez de só
2259
+ // cautela. O EWGSOP2 (Age and Ageing, 2019, DOI 10.1093/ageing/afy169)
2260
+ // separa explicitamente "total body Skeletal Muscle Mass (SMM)" de
2261
+ // "Appendicular Skeletal Muscle Mass (ASM)", e os cortes publicados são
2262
+ // sobre ASM. `MuscleMass` aqui é total, então o corte não se aplica.
2263
+ //
2264
+ // O mesmo consenso ainda diz, sobre ajustar por tamanho corporal: "The
2265
+ // authors make no recommendation to adjust for body size, but adjustment
2266
+ // can be made if data are available for a relevant normative population."
2267
+ // Não temos população normativa brasileira para bioimpedância, e o
2268
+ // consenso registra que a equação de Sergi, padrão do método, foi
2269
+ // derivada em europeus idosos.
2270
+ //
2271
+ // Por isso o índice existe para acompanhar a própria evolução, e não para
2272
+ // classificar.
2273
+ {
2274
+ category: "composicao-corporal",
2275
+ code: "MuscleMassIndex",
2276
+ names: {
2277
+ en: ["Muscle Mass Index", "Skeletal Muscle Mass Index", "SMI", "SMMI"],
2278
+ pt: ["\xCDndice de Massa Muscular", "IMM", "\xCDndice de Massa Muscular Esquel\xE9tica"]
2279
+ },
2280
+ unit: "kg/m2"
2281
+ },
2282
+ {
2283
+ category: "composicao-corporal",
2284
+ code: "PhaseAngle",
2285
+ loinc: "107160-4",
2286
+ names: {
2287
+ en: ["Phase Angle", "Whole Body Phase Angle", "PhA", "AnglePhase"],
2288
+ pt: ["\xC2ngulo de Fase", "\xC2ngulo de Fase Corporal"]
2289
+ },
2290
+ unit: "deg"
2291
+ },
2292
+ // O nível de gordura visceral do InBody e similares é um índice
2293
+ // adimensional de 1 a 20, e NÃO é o mesmo que VATMass ou VATVolume, que
2294
+ // vêm de DEXA em massa e volume. LOINC 73707-2 é "Visceral fat [Area]", em
2295
+ // área, então também não serve. Fica sem código, com unidade vazia, para
2296
+ // não ser confundido com nenhum dos três.
2297
+ {
2298
+ category: "composicao-corporal",
2299
+ code: "VisceralFatLevel",
2300
+ names: {
2301
+ en: ["Visceral Fat Level", "Visceral Fat Index", "VFL"],
2302
+ pt: ["N\xEDvel de Gordura Visceral", "\xCDndice de Gordura Visceral", "Gordura Visceral N\xEDvel"]
2303
+ },
2304
+ unit: ""
2305
+ },
2306
+ // Compartimentos de água. Sem LOINC: busca por "extracellular water" e
2307
+ // "intracellular water" não devolve nada, ao contrário de "body water",
2308
+ // que rendeu os dois códigos usados acima.
2309
+ {
2310
+ category: "composicao-corporal",
2311
+ code: "ExtracellularWater",
2312
+ names: {
2313
+ en: ["Extracellular Water", "ECW"],
2314
+ pt: ["\xC1gua Extracelular", "AEC"]
2315
+ },
2316
+ unit: "L"
2317
+ },
2318
+ {
2319
+ category: "composicao-corporal",
2320
+ code: "IntracellularWater",
2321
+ names: {
2322
+ en: ["Intracellular Water", "ICW"],
2323
+ pt: ["\xC1gua Intracelular", "AIC"]
2324
+ },
2325
+ unit: "L"
2326
+ },
2327
+ // Razão entre água extracelular e total. É o marcador de retenção hídrica
2328
+ // e de estado inflamatório que os aparelhos de bioimpedância reportam, e
2329
+ // vem adimensional.
2330
+ {
2331
+ category: "composicao-corporal",
2332
+ code: "ECWToTBWRatio",
2333
+ names: {
2334
+ en: ["ECW/TBW", "ECW_TBW", "ECW to TBW Ratio", "Extracellular Water Ratio"],
2335
+ pt: ["Rela\xE7\xE3o AEC/ACT", "Raz\xE3o \xC1gua Extracelular"]
2336
+ },
2337
+ unit: ""
2338
+ },
2339
+ {
2340
+ category: "composicao-corporal",
2341
+ code: "ResidualMass",
2342
+ names: {
2343
+ en: ["Residual Mass", "Residual Weight"],
2344
+ pt: ["Massa Residual", "Peso Residual"]
2345
+ },
2346
+ unit: "kg"
2347
+ },
2348
+ // Sem `loinc` até alguém decidir com a definição completa em mãos. Os
2349
+ // candidatos não servem como estão: 50042-1 é "Basal metabolic rate
2350
+ // index", um índice e não kcal/dia; 82278-3 é "Measured RMR", medido por
2351
+ // calorimetria indireta, enquanto o aparelho de bioimpedância *estima* a
2352
+ // partir da massa magra; 82286-6 "Predicted RMR" é o mais próximo, mas
2353
+ // ainda é RMR e não TMB. Colocar qualquer um deles repetiria o erro que
2354
+ // esta mesma PR corrige em LeanMass.
2355
+ {
2356
+ category: "composicao-corporal",
2357
+ code: "BasalMetabolicRate",
2358
+ names: {
2359
+ en: ["Basal Metabolic Rate", "BMR"],
2360
+ pt: ["Taxa Metab\xF3lica Basal", "TMB", "Metabolismo Basal", "Gasto Energ\xE9tico Basal"]
2361
+ },
2362
+ unit: "kcal/d"
2363
+ },
2364
+ // Antropometria
2365
+ {
2366
+ category: "composicao-corporal",
2367
+ code: "WaistCircumference",
2368
+ // 8280-0 é a medida em si. 56086-2, que parecia o óbvio pela busca, é
2369
+ // "Adult Waist Circumference Protocol", um protocolo PhenX e não um
2370
+ // resultado.
2371
+ loinc: "8280-0",
2372
+ names: {
2373
+ en: ["Waist Circumference", "Abdominal Circumference", "Waist"],
2374
+ pt: [
2375
+ "Circunfer\xEAncia de Cintura",
2376
+ "Circunfer\xEAncia Abdominal",
2377
+ "Per\xEDmetro Abdominal",
2378
+ "Cintura"
2379
+ ]
2380
+ },
2381
+ unit: "cm"
2382
+ },
2383
+ // O EWGSOP2 usa a panturrilha como proxy de massa muscular onde não há
2384
+ // outro método disponível, o que a torna útil em consulta sem aparelho.
2385
+ {
2386
+ category: "composicao-corporal",
2387
+ code: "CalfCircumference",
2388
+ loinc: "107112-5",
2389
+ names: {
2390
+ en: ["Calf Circumference", "Calf Girth"],
2391
+ pt: ["Circunfer\xEAncia da Panturrilha", "Per\xEDmetro da Panturrilha", "Panturrilha"]
2392
+ },
2393
+ unit: "cm"
2394
+ },
2395
+ {
2396
+ category: "composicao-corporal",
2397
+ code: "WaistToHeightRatio",
2398
+ names: {
2399
+ en: ["Waist to Height Ratio", "Waist-to-Height Ratio", "WHtR"],
2400
+ pt: ["Raz\xE3o Cintura-Altura", "Rela\xE7\xE3o Cintura-Estatura", "RCEst"]
2401
+ },
2402
+ unit: ""
2403
+ },
2404
+ {
2405
+ category: "composicao-corporal",
2406
+ code: "ConicityIndex",
2407
+ names: {
2408
+ en: ["Conicity Index", "C Index"],
2409
+ pt: ["\xCDndice de Conicidade", "\xCDndice C"]
2410
+ },
2411
+ unit: ""
2412
+ },
2413
+ // Dobras cutâneas (adipometria)
2414
+ //
2415
+ // A LOINC tem apenas três sítios: tríceps, coxa e cintura. Os outros quatro
2416
+ // que os protocolos brasileiros medem ficam sem código, e é por ausência
2417
+ // confirmada, não por falta de busca. Entram individualmente porque o
2418
+ // protocolo de somatório varia (Pollock 3 ou 7 dobras, Faulkner, Guedes) e
2419
+ // guardar só a soma perderia o dado de origem.
2420
+ {
2421
+ category: "composicao-corporal",
2422
+ code: "SkinfoldTriceps",
2423
+ loinc: "8354-3",
2424
+ names: {
2425
+ en: ["Triceps Skinfold", "Tricipital Skinfold", "Skin Fold Thickness Triceps"],
2426
+ pt: ["Dobra Tricipital", "Dobra Cut\xE2nea Tricipital", "Tricipital", "DCT"]
2427
+ },
2428
+ unit: "mm"
2429
+ },
2430
+ {
2431
+ category: "composicao-corporal",
2432
+ code: "SkinfoldThigh",
2433
+ loinc: "8353-5",
2434
+ names: {
2435
+ en: ["Thigh Skinfold", "Skin Fold Thickness Thigh"],
2436
+ pt: ["Dobra da Coxa", "Dobra Cut\xE2nea Coxa", "Coxa"]
2437
+ },
2438
+ unit: "mm"
2439
+ },
2440
+ {
2441
+ category: "composicao-corporal",
2442
+ code: "SkinfoldAbdominal",
2443
+ loinc: "8355-0",
2444
+ names: {
2445
+ en: ["Abdominal Skinfold", "Waist Skinfold", "Skin Fold Thickness Waist"],
2446
+ pt: ["Dobra Abdominal", "Dobra Cut\xE2nea Abdominal", "Abdominal"]
2447
+ },
2448
+ unit: "mm"
2449
+ },
2450
+ {
2451
+ category: "composicao-corporal",
2452
+ code: "SkinfoldSubscapular",
2453
+ names: {
2454
+ en: ["Subscapular Skinfold"],
2455
+ pt: ["Dobra Subescapular", "Dobra Cut\xE2nea Subescapular", "Subescapular"]
2456
+ },
2457
+ unit: "mm"
2458
+ },
2459
+ {
2460
+ category: "composicao-corporal",
2461
+ code: "SkinfoldSuprailiac",
2462
+ names: {
2463
+ en: ["Suprailiac Skinfold", "Supra-iliac Skinfold"],
2464
+ pt: ["Dobra Supra-il\xEDaca", "Dobra Cut\xE2nea Supra-il\xEDaca", "Supra-il\xEDaca", "Suprailiaca"]
2465
+ },
2466
+ unit: "mm"
2467
+ },
2468
+ {
2469
+ category: "composicao-corporal",
2470
+ code: "SkinfoldChest",
2471
+ names: {
2472
+ en: ["Chest Skinfold", "Pectoral Skinfold"],
2473
+ pt: ["Dobra Peitoral", "Dobra Cut\xE2nea Peitoral", "Peitoral", "Dobra Tor\xE1cica"]
2474
+ },
2475
+ unit: "mm"
2476
+ },
2477
+ {
2478
+ category: "composicao-corporal",
2479
+ code: "SkinfoldMidaxillary",
2480
+ names: {
2481
+ en: ["Midaxillary Skinfold", "Mid-axillary Skinfold"],
2482
+ pt: ["Dobra Axilar M\xE9dia", "Dobra Cut\xE2nea Axilar M\xE9dia", "Axilar M\xE9dia"]
2483
+ },
2484
+ unit: "mm"
2485
+ },
2159
2486
  // Regional Body Composition (DEXA)
2160
2487
  // Note: No official LOINC codes exist for regional lean/fat mass measurements
2161
2488
  // Hidden from UI for now - may be shown in future regional breakdown view
@@ -2918,4 +3245,4 @@ export {
2918
3245
  getBiomarkersByCategory,
2919
3246
  getBiomarkersForCategories
2920
3247
  };
2921
- //# sourceMappingURL=chunk-7O6VUA2B.js.map
3248
+ //# sourceMappingURL=chunk-3KIJIRCI.js.map