@precisa-saude/fhir 0.31.0 → 0.31.2

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-M6TGECTK.cjs → chunk-3GN33H37.cjs} +14 -1
  4. package/dist/chunk-3GN33H37.cjs.map +1 -0
  5. package/dist/{chunk-37LQWDN7.js → chunk-CL2HNUGG.js} +58 -34
  6. package/dist/chunk-CL2HNUGG.js.map +1 -0
  7. package/dist/{chunk-4NSBIPLW.cjs → chunk-EWX7VXN3.cjs} +58 -34
  8. package/dist/chunk-EWX7VXN3.cjs.map +1 -0
  9. package/dist/{chunk-CO3KLE5C.js → chunk-FSAQ3USO.js} +14 -1
  10. package/dist/chunk-FSAQ3USO.js.map +1 -0
  11. package/dist/{chunk-OSBQUQEI.cjs → chunk-KL5SYSYZ.cjs} +7 -7
  12. package/dist/{chunk-OSBQUQEI.cjs.map → chunk-KL5SYSYZ.cjs.map} +1 -1
  13. package/dist/{chunk-TFVADOWD.js → chunk-WRDWLWU2.js} +2 -2
  14. package/dist/{chunk-GDYFB2SE.js → chunk-XX7KTBUX.js} +2 -2
  15. package/dist/{chunk-3I7VPANN.cjs → chunk-YX6B5YFJ.cjs} +3 -3
  16. package/dist/{chunk-3I7VPANN.cjs.map → chunk-YX6B5YFJ.cjs.map} +1 -1
  17. package/dist/cli.js +71 -34
  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-37LQWDN7.js.map +0 -1
  28. package/dist/chunk-4NSBIPLW.cjs.map +0 -1
  29. package/dist/chunk-CO3KLE5C.js.map +0 -1
  30. package/dist/chunk-M6TGECTK.cjs.map +0 -1
  31. /package/dist/{chunk-TFVADOWD.js.map → chunk-WRDWLWU2.js.map} +0 -0
  32. /package/dist/{chunk-GDYFB2SE.js.map → chunk-XX7KTBUX.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-3I7VPANN.cjs","../src/bundle-urls.ts","../src/converter.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-3I7VPANN.cjs","sourcesContent":[null,"/**\n * Endereço das entradas de um Bundle.\n *\n * O `fullUrl` identifica a entrada, e é contra ele que o validador resolve as\n * referências entre os recursos. Um Bundle com `subject.reference` valendo\n * `Patient/abc` só resolve se alguma entrada tiver `fullUrl` terminando em\n * `/Patient/abc`: a referência relativa é lida contra a base do `fullUrl` da\n * entrada, que é como os exemplos da própria HL7 montam Bundle de coleção.\n *\n * Antes o `fullUrl` era `urn:uuid:observation-<laudo>-<código>`, que erra duas\n * vezes. `urn:uuid:` exige a sintaxe de UUID e aquilo não era um UUID, e num\n * Bundle de entradas `urn:uuid:` a referência precisa repetir a URN inteira,\n * então nenhuma das relativas resolvia. Um laudo de 22 marcadores saía com 24\n * erros de URN e 22 referências perdidas.\n */\n/**\n * Recurso que já tem id, e por isso pode ser endereçado numa entrada.\n *\n * No FHIR o `id` é opcional, porque um recurso pode viajar sem identidade\n * própria. Numa entrada de Bundle ele não pode: sem id não há `fullUrl`, e sem\n * `fullUrl` nenhuma referência chega ao recurso. Os conversores daqui sempre\n * atribuem um, e o tipo passa a dizer isso em vez de deixar `undefined` chegar\n * até a montagem da URL.\n */\nexport type Addressable<T> = T & { id: string };\n\n/**\n * Base dos `fullUrl`.\n *\n * Não precisa responder a uma requisição: no FHIR o `fullUrl` é identidade, não\n * endereço de download. Fica sob um domínio nosso para não colidir com a\n * identidade de recurso de outra instituição, que é o risco real de usar\n * `example.org` em dado que sai da máquina.\n */\nexport const BUNDLE_BASE_URL = 'https://precisa-saude.com.br/fhir';\n\n/**\n * Monta o `fullUrl` a partir do próprio recurso.\n *\n * Recebe o recurso em vez do tipo e do id soltos de propósito. O defeito que\n * isto substitui nasceu de montar os dois lados em separado: o `fullUrl` dizia\n * `observation-demo-Hgb` enquanto o recurso tinha id `demo-Hgb`, e ninguém\n * percebeu porque nada obrigava os dois a concordarem.\n *\n * O parâmetro pede o mínimo que a URL consome, e não a união de recursos que\n * este pacote converte. Um Bundle pode carregar qualquer recurso do R4, e quem\n * acrescenta uma entrada de um tipo que não está nessa união (um `Specimen`,\n * por exemplo) precisa do mesmo endereço, senão monta o dele e as duas formas\n * divergem outra vez.\n */\nexport const entryFullUrl = (resource: Addressable<{ resourceType: string }>): string =>\n `${BUNDLE_BASE_URL}/${resource.resourceType}/${resource.id}`;\n","/**\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 Addressable, entryFullUrl } from './bundle-urls';\nimport { BIOMARKER_CODE_SYSTEM, LOINC_SYSTEM } from './code-systems';\nimport type {\n FHIRBundle,\n FHIRDiagnosticReport,\n FHIRObservation,\n FHIRPatient,\n FHIRQuantity,\n FHIRReferenceRange,\n} 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 * O `coding` do sexo, que vai **dentro** do CodeableConcept do `appliesTo`.\n *\n * O nome diz `CODING` e não `APPLIES_TO` de propósito: isto não é o valor do\n * campo, é uma entrada da lista de codificações dele. O embrulho acontece no\n * uso, em `{ coding: [SEX_CODING[sex]] }`.\n *\n * É o `AdministrativeGender`, e não o v3-ObservationInterpretation nem um\n * sistema nosso: um consumidor que já lê `Patient.gender` compara os dois sem\n * tabela de tradução no meio.\n */\nconst SEX_CODING = {\n female: {\n code: 'female',\n display: 'Female',\n system: 'http://hl7.org/fhir/administrative-gender',\n },\n male: { code: 'male', display: 'Male', system: 'http://hl7.org/fhir/administrative-gender' },\n} as const;\n\n/**\n * Monta as faixas de referência do `Observation`.\n *\n * Duas mudanças em relação ao que existia, e as duas são sobre não perder o que\n * o laudo imprimiu.\n *\n * **Um limite só já basta.** Antes a faixa só saía com os dois, e um laudo que\n * publica \"inferior a 190 mg/dL\" ou \"superior a 60 mL/min/1,73m²\" perdia o\n * campo inteiro. O R4 trata `low` e `high` como opcionais independentes e\n * documenta o caso de um lado só, e o importador deste mesmo pacote já lia\n * `low?.value` e `high?.value` com acesso opcional: a assimetria era só do\n * escritor. Ver PRE-430.\n *\n * **Mais de uma faixa, anotada.** Laudo com uma coluna de referência por sexo\n * passa a sair com as duas, cada uma com o seu `appliesTo`, em vez de o\n * pipeline escolher uma sem saber de quem é o exame. Ver PRE-424 e PRE-425.\n */\nconst buildReferenceRanges = (\n observation: LabObservationData,\n sourceUnit: string,\n ucumUnit: string,\n): FHIRReferenceRange[] => {\n const quantity = (value: number): FHIRQuantity => ({\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value,\n });\n\n // Devolve lista, e não uma faixa: o caso sem limite nenhum vira lista vazia\n // em vez de `undefined`, e aí os dois caminhos abaixo se compõem com\n // `flatMap` sem ninguém precisar filtrar nada depois.\n const toRanges = (low?: number, high?: number, sex?: 'female' | 'male'): FHIRReferenceRange[] => {\n if (low === undefined && high === undefined) return [];\n\n return [\n {\n ...(sex === undefined ? {} : { appliesTo: [{ coding: [SEX_CODING[sex]] }] }),\n ...(high === undefined ? {} : { high: quantity(high) }),\n ...(low === undefined ? {} : { low: quantity(low) }),\n },\n ];\n };\n\n // A lista anotada tem precedência: quando ela existe, o par simples é o\n // resumo de uma das colunas e repeti-lo publicaria a mesma faixa duas vezes,\n // uma delas sem dizer a quem se aplica.\n //\n // Lista vazia cai no par simples, igual a ausente, e isso é escolha: as duas\n // dizem \"não tenho faixa anotada\", e tratá-las diferente faria um `[]` vindo\n // de um `.filter()` apagar em silêncio a faixa que o chamador também mandou\n // em `referenceMin` e `referenceMax`.\n if (observation.referenceRanges && observation.referenceRanges.length > 0) {\n return observation.referenceRanges.flatMap((r) => toRanges(r.low, r.high, r.appliesTo));\n }\n\n return toRanges(observation.referenceMin, observation.referenceMax);\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): Addressable<FHIRObservation> {\n const loincCode = codeToLoinc(observation.biomarkerCode);\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: Addressable<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 // Sem LOINC, o coding LOINC simplesmente não sai. Antes ia `99999-9`,\n // que não é código LOINC nenhum: publicava sob `http://loinc.org` uma\n // afirmação falsa, e quem consumisse o bundle confiando no system\n // trataria aquilo como código de verdade. Composição corporal, densidade\n // óssea e escore de cálcio não têm LOINC, e o certo é a lacuna explícita.\n coding: [\n ...(loincCode\n ? [\n {\n code: loincCode,\n display: observation.biomarkerName,\n system: LOINC_SYSTEM,\n },\n ]\n : []),\n {\n code: observation.biomarkerCode,\n display: observation.biomarkerName,\n system: BIOMARKER_CODE_SYSTEM,\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 const referenceRange = buildReferenceRanges(observation, sourceUnit, ucumUnit);\n if (referenceRange.length > 0) fhirObs.referenceRange = referenceRange;\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): Addressable<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): Addressable<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 const resource = labObservationToFHIR(\n { ...obs, collectionDate: report.collectionDate },\n patientId,\n report.laboratoryName,\n );\n\n return { fullUrl: entryFullUrl(resource), resource };\n });\n\n // Os ids vêm dos recursos já montados, e não de uma segunda montagem da mesma\n // regra. O `DiagnosticReport.result` aponta para eles, e era aqui que a\n // referência se separava do recurso.\n const observationIds = fhirObservations.map((entry) => entry.resource.id);\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 { fullUrl: entryFullUrl(fhirPatient), resource: fhirPatient },\n { fullUrl: entryFullUrl(diagnosticReport), resource: diagnosticReport },\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-YX6B5YFJ.cjs","../src/bundle-urls.ts","../src/converter.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-YX6B5YFJ.cjs","sourcesContent":[null,"/**\n * Endereço das entradas de um Bundle.\n *\n * O `fullUrl` identifica a entrada, e é contra ele que o validador resolve as\n * referências entre os recursos. Um Bundle com `subject.reference` valendo\n * `Patient/abc` só resolve se alguma entrada tiver `fullUrl` terminando em\n * `/Patient/abc`: a referência relativa é lida contra a base do `fullUrl` da\n * entrada, que é como os exemplos da própria HL7 montam Bundle de coleção.\n *\n * Antes o `fullUrl` era `urn:uuid:observation-<laudo>-<código>`, que erra duas\n * vezes. `urn:uuid:` exige a sintaxe de UUID e aquilo não era um UUID, e num\n * Bundle de entradas `urn:uuid:` a referência precisa repetir a URN inteira,\n * então nenhuma das relativas resolvia. Um laudo de 22 marcadores saía com 24\n * erros de URN e 22 referências perdidas.\n */\n/**\n * Recurso que já tem id, e por isso pode ser endereçado numa entrada.\n *\n * No FHIR o `id` é opcional, porque um recurso pode viajar sem identidade\n * própria. Numa entrada de Bundle ele não pode: sem id não há `fullUrl`, e sem\n * `fullUrl` nenhuma referência chega ao recurso. Os conversores daqui sempre\n * atribuem um, e o tipo passa a dizer isso em vez de deixar `undefined` chegar\n * até a montagem da URL.\n */\nexport type Addressable<T> = T & { id: string };\n\n/**\n * Base dos `fullUrl`.\n *\n * Não precisa responder a uma requisição: no FHIR o `fullUrl` é identidade, não\n * endereço de download. Fica sob um domínio nosso para não colidir com a\n * identidade de recurso de outra instituição, que é o risco real de usar\n * `example.org` em dado que sai da máquina.\n */\nexport const BUNDLE_BASE_URL = 'https://precisa-saude.com.br/fhir';\n\n/**\n * Monta o `fullUrl` a partir do próprio recurso.\n *\n * Recebe o recurso em vez do tipo e do id soltos de propósito. O defeito que\n * isto substitui nasceu de montar os dois lados em separado: o `fullUrl` dizia\n * `observation-demo-Hgb` enquanto o recurso tinha id `demo-Hgb`, e ninguém\n * percebeu porque nada obrigava os dois a concordarem.\n *\n * O parâmetro pede o mínimo que a URL consome, e não a união de recursos que\n * este pacote converte. Um Bundle pode carregar qualquer recurso do R4, e quem\n * acrescenta uma entrada de um tipo que não está nessa união (um `Specimen`,\n * por exemplo) precisa do mesmo endereço, senão monta o dele e as duas formas\n * divergem outra vez.\n */\nexport const entryFullUrl = (resource: Addressable<{ resourceType: string }>): string =>\n `${BUNDLE_BASE_URL}/${resource.resourceType}/${resource.id}`;\n","/**\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 Addressable, entryFullUrl } from './bundle-urls';\nimport { BIOMARKER_CODE_SYSTEM, LOINC_SYSTEM } from './code-systems';\nimport type {\n FHIRBundle,\n FHIRDiagnosticReport,\n FHIRObservation,\n FHIRPatient,\n FHIRQuantity,\n FHIRReferenceRange,\n} 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 * O `coding` do sexo, que vai **dentro** do CodeableConcept do `appliesTo`.\n *\n * O nome diz `CODING` e não `APPLIES_TO` de propósito: isto não é o valor do\n * campo, é uma entrada da lista de codificações dele. O embrulho acontece no\n * uso, em `{ coding: [SEX_CODING[sex]] }`.\n *\n * É o `AdministrativeGender`, e não o v3-ObservationInterpretation nem um\n * sistema nosso: um consumidor que já lê `Patient.gender` compara os dois sem\n * tabela de tradução no meio.\n */\nconst SEX_CODING = {\n female: {\n code: 'female',\n display: 'Female',\n system: 'http://hl7.org/fhir/administrative-gender',\n },\n male: { code: 'male', display: 'Male', system: 'http://hl7.org/fhir/administrative-gender' },\n} as const;\n\n/**\n * Monta as faixas de referência do `Observation`.\n *\n * Duas mudanças em relação ao que existia, e as duas são sobre não perder o que\n * o laudo imprimiu.\n *\n * **Um limite só já basta.** Antes a faixa só saía com os dois, e um laudo que\n * publica \"inferior a 190 mg/dL\" ou \"superior a 60 mL/min/1,73m²\" perdia o\n * campo inteiro. O R4 trata `low` e `high` como opcionais independentes e\n * documenta o caso de um lado só, e o importador deste mesmo pacote já lia\n * `low?.value` e `high?.value` com acesso opcional: a assimetria era só do\n * escritor. Ver PRE-430.\n *\n * **Mais de uma faixa, anotada.** Laudo com uma coluna de referência por sexo\n * passa a sair com as duas, cada uma com o seu `appliesTo`, em vez de o\n * pipeline escolher uma sem saber de quem é o exame. Ver PRE-424 e PRE-425.\n */\nconst buildReferenceRanges = (\n observation: LabObservationData,\n sourceUnit: string,\n ucumUnit: string,\n): FHIRReferenceRange[] => {\n const quantity = (value: number): FHIRQuantity => ({\n code: ucumUnit,\n system: 'http://unitsofmeasure.org',\n unit: sourceUnit,\n value,\n });\n\n // Devolve lista, e não uma faixa: o caso sem limite nenhum vira lista vazia\n // em vez de `undefined`, e aí os dois caminhos abaixo se compõem com\n // `flatMap` sem ninguém precisar filtrar nada depois.\n const toRanges = (low?: number, high?: number, sex?: 'female' | 'male'): FHIRReferenceRange[] => {\n if (low === undefined && high === undefined) return [];\n\n return [\n {\n ...(sex === undefined ? {} : { appliesTo: [{ coding: [SEX_CODING[sex]] }] }),\n ...(high === undefined ? {} : { high: quantity(high) }),\n ...(low === undefined ? {} : { low: quantity(low) }),\n },\n ];\n };\n\n // A lista anotada tem precedência: quando ela existe, o par simples é o\n // resumo de uma das colunas e repeti-lo publicaria a mesma faixa duas vezes,\n // uma delas sem dizer a quem se aplica.\n //\n // Lista vazia cai no par simples, igual a ausente, e isso é escolha: as duas\n // dizem \"não tenho faixa anotada\", e tratá-las diferente faria um `[]` vindo\n // de um `.filter()` apagar em silêncio a faixa que o chamador também mandou\n // em `referenceMin` e `referenceMax`.\n if (observation.referenceRanges && observation.referenceRanges.length > 0) {\n return observation.referenceRanges.flatMap((r) => toRanges(r.low, r.high, r.appliesTo));\n }\n\n return toRanges(observation.referenceMin, observation.referenceMax);\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): Addressable<FHIRObservation> {\n const loincCode = codeToLoinc(observation.biomarkerCode);\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: Addressable<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 // Sem LOINC, o coding LOINC simplesmente não sai. Antes ia `99999-9`,\n // que não é código LOINC nenhum: publicava sob `http://loinc.org` uma\n // afirmação falsa, e quem consumisse o bundle confiando no system\n // trataria aquilo como código de verdade. Composição corporal, densidade\n // óssea e escore de cálcio não têm LOINC, e o certo é a lacuna explícita.\n coding: [\n ...(loincCode\n ? [\n {\n code: loincCode,\n display: observation.biomarkerName,\n system: LOINC_SYSTEM,\n },\n ]\n : []),\n {\n code: observation.biomarkerCode,\n display: observation.biomarkerName,\n system: BIOMARKER_CODE_SYSTEM,\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 const referenceRange = buildReferenceRanges(observation, sourceUnit, ucumUnit);\n if (referenceRange.length > 0) fhirObs.referenceRange = referenceRange;\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): Addressable<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): Addressable<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 const resource = labObservationToFHIR(\n { ...obs, collectionDate: report.collectionDate },\n patientId,\n report.laboratoryName,\n );\n\n return { fullUrl: entryFullUrl(resource), resource };\n });\n\n // Os ids vêm dos recursos já montados, e não de uma segunda montagem da mesma\n // regra. O `DiagnosticReport.result` aponta para eles, e era aqui que a\n // referência se separava do recurso.\n const observationIds = fhirObservations.map((entry) => entry.resource.id);\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 { fullUrl: entryFullUrl(fhirPatient), resource: fhirPatient },\n { fullUrl: entryFullUrl(diagnosticReport), resource: diagnosticReport },\n ...fhirObservations,\n ],\n resourceType: 'Bundle',\n type: 'collection',\n };\n}\n"]}
package/dist/cli.js CHANGED
@@ -2222,6 +2222,12 @@ var BIOMARKER_DEFINITIONS = [
2222
2222
  {
2223
2223
  category: "composicao-corporal",
2224
2224
  code: "VATVolume",
2225
+ // A tabela de tendência do DEXA traz a seção "Visceral Adipose Tissue (VAT)"
2226
+ // com as colunas "Fat Mass" e "Volume", e o modelo nomeia a linha com o
2227
+ // prefixo da seção. Antes do nome abaixo, o valor era gravado com o código
2228
+ // `UNKNOWN_` que fica aqui como alias, e o `normalizeCode` na leitura
2229
+ // devolve as observações já gravadas para este código.
2230
+ codeAliases: ["UNKNOWN_Visceral_Adipose_Tissue_VAT_Volume"],
2225
2231
  // No official LOINC code exists for visceral adipose tissue volume
2226
2232
  names: {
2227
2233
  en: [
@@ -2229,6 +2235,7 @@ var BIOMARKER_DEFINITIONS = [
2229
2235
  "VAT Volume",
2230
2236
  "VATVolume",
2231
2237
  "Visceral Adipose Tissue Volume",
2238
+ "Visceral Adipose Tissue (VAT) Volume",
2232
2239
  "VAT",
2233
2240
  // "Visceral Fat" e "Gordura Visceral" nus não dizem qual das duas
2234
2241
  // medidas o laudo traz, então também estão no `VisceralFatLevel`. O
@@ -2250,6 +2257,9 @@ var BIOMARKER_DEFINITIONS = [
2250
2257
  {
2251
2258
  category: "composicao-corporal",
2252
2259
  code: "VATMass",
2260
+ // Mesmo caso do `VATVolume`: a coluna da tendência do DEXA é "Fat Mass", e
2261
+ // o nome chega como "Visceral Adipose Tissue (VAT) Fat Mass".
2262
+ codeAliases: ["UNKNOWN_Visceral_Adipose_Tissue_VAT_Fat_Mass"],
2253
2263
  // No official LOINC code exists for visceral adipose tissue mass
2254
2264
  names: {
2255
2265
  en: [
@@ -2257,6 +2267,9 @@ var BIOMARKER_DEFINITIONS = [
2257
2267
  "VAT Mass",
2258
2268
  "VATMass",
2259
2269
  "Visceral Adipose Tissue Mass",
2270
+ "Visceral Adipose Tissue (VAT) Fat Mass",
2271
+ "Visceral Adipose Tissue Fat Mass",
2272
+ "VAT Fat Mass",
2260
2273
  "Visceral Adipose Tissue",
2261
2274
  "Visceral Mass"
2262
2275
  ],
@@ -4812,13 +4825,15 @@ var biomarkerRangeDefinitions = {
4812
4825
  }
4813
4826
  ]
4814
4827
  },
4815
- Basophils: {
4816
- default: { max: 1, min: 0, optimalMax: 0.5, optimalMin: 0, unit: "%" },
4817
- source: "pns-hemograma-2019"
4818
- },
4828
+ // `Basophils` (%) fica sem faixa de propósito e `Basophils_Abs` usa os limites da
4829
+ // Tabela 2 da PNS 2019. Ver o comentário em `Neutrophils_Abs`.
4819
4830
  Basophils_Abs: {
4820
- default: { max: 0.1, min: 0, optimalMax: 0.05, optimalMin: 0, unit: "K/uL" },
4821
- source: "pns-hemograma-2019"
4831
+ default: { max: 0.072, min: 0, unit: "K/uL" },
4832
+ source: "pns-hemograma-2019",
4833
+ variants: [
4834
+ { ageMin: 18, range: { max: 0.062, min: 0, unit: "K/uL" }, sex: "M" },
4835
+ { ageMin: 18, range: { max: 0.072, min: 0, unit: "K/uL" }, sex: "F" }
4836
+ ]
4822
4837
  },
4823
4838
  Bicarbonate: {
4824
4839
  default: { max: 29, min: 23, optimalMax: 28, optimalMin: 24, unit: "mEq/L" },
@@ -5112,14 +5127,15 @@ var biomarkerRangeDefinitions = {
5112
5127
  // alterado qualquer idoso com função preservada.
5113
5128
  source: "kdigo-ckd-2024"
5114
5129
  },
5115
- Eosinophils: {
5116
- default: { max: 5, min: 0, optimalMax: 4, optimalMin: 1, unit: "%" },
5117
- direction: "lower-better",
5118
- source: "pns-hemograma-2019"
5119
- },
5130
+ // `Eosinophils` (%) fica sem faixa de propósito e `Eosinophils_Abs` usa os limites da
5131
+ // Tabela 2 da PNS 2019. Ver o comentário em `Neutrophils_Abs`.
5120
5132
  Eosinophils_Abs: {
5121
- default: { max: 0.5, min: 0, optimalMax: 0.3, optimalMin: 0, unit: "K/uL" },
5122
- source: "pns-hemograma-2019"
5133
+ default: { max: 0.66, min: 0, unit: "K/uL" },
5134
+ source: "pns-hemograma-2019",
5135
+ variants: [
5136
+ { ageMin: 18, range: { max: 0.66, min: 0, unit: "K/uL" }, sex: "M" },
5137
+ { ageMin: 18, range: { max: 0.55, min: 0, unit: "K/uL" }, sex: "F" }
5138
+ ]
5123
5139
  },
5124
5140
  Omega3_EPA: {
5125
5141
  default: { max: 3.5, min: 0.5, optimalMax: 2.5, optimalMin: 1, unit: "%" },
@@ -5571,13 +5587,15 @@ var biomarkerRangeDefinitions = {
5571
5587
  direction: "lower-better",
5572
5588
  source: "sbc-lipids-2025"
5573
5589
  },
5574
- Lymphocytes: {
5575
- default: { max: 40, min: 20, optimalMax: 35, optimalMin: 25, unit: "%" },
5576
- source: "pns-hemograma-2019"
5577
- },
5590
+ // `Lymphocytes` (%) fica sem faixa de propósito e `Lymphocytes_Abs` usa os limites da
5591
+ // Tabela 2 da PNS 2019. Ver o comentário em `Neutrophils_Abs`.
5578
5592
  Lymphocytes_Abs: {
5579
- default: { max: 4, min: 1, optimalMax: 3, optimalMin: 1.5, unit: "K/uL" },
5580
- source: "pns-hemograma-2019"
5593
+ default: { max: 3.414, min: 0.72, unit: "K/uL" },
5594
+ source: "pns-hemograma-2019",
5595
+ variants: [
5596
+ { ageMin: 18, range: { max: 3.37, min: 0.72, unit: "K/uL" }, sex: "M" },
5597
+ { ageMin: 18, range: { max: 3.414, min: 0.796, unit: "K/uL" }, sex: "F" }
5598
+ ]
5581
5599
  },
5582
5600
  Magnesium: {
5583
5601
  default: { max: 2.2, min: 1.7, optimalMax: 2.1, optimalMin: 1.9, unit: "mg/dL" },
@@ -5611,13 +5629,15 @@ var biomarkerRangeDefinitions = {
5611
5629
  default: { max: 378, min: 0, optimalMax: 270, optimalMin: 0, unit: "nmol/L" },
5612
5630
  source: "tietz-7ed-2015"
5613
5631
  },
5614
- Monocytes: {
5615
- default: { max: 8, min: 2, optimalMax: 7, optimalMin: 3, unit: "%" },
5616
- source: "pns-hemograma-2019"
5617
- },
5632
+ // `Monocytes` (%) fica sem faixa de propósito e `Monocytes_Abs` usa os limites da
5633
+ // Tabela 2 da PNS 2019. Ver o comentário em `Neutrophils_Abs`.
5618
5634
  Monocytes_Abs: {
5619
- default: { max: 0.8, min: 0.2, optimalMax: 0.7, optimalMin: 0.3, unit: "K/uL" },
5620
- source: "pns-hemograma-2019"
5635
+ default: { max: 0.812, min: 0.011, unit: "K/uL" },
5636
+ source: "pns-hemograma-2019",
5637
+ variants: [
5638
+ { ageMin: 18, range: { max: 0.812, min: 0.011, unit: "K/uL" }, sex: "M" },
5639
+ { ageMin: 18, range: { max: 0.692, min: 0.022, unit: "K/uL" }, sex: "F" }
5640
+ ]
5621
5641
  },
5622
5642
  MPV: {
5623
5643
  default: { max: 11.5, min: 7.5, optimalMax: 10.5, optimalMin: 8, unit: "fL" },
@@ -5628,15 +5648,32 @@ var biomarkerRangeDefinitions = {
5628
5648
  default: { max: 470, min: 0, optimalMax: 322, optimalMin: 0, unit: "pmol/L" },
5629
5649
  source: "meuwese-mpo-2007"
5630
5650
  },
5631
- // WBC Differential (%)
5632
- Neutrophils: {
5633
- default: { max: 70, min: 40, optimalMax: 65, optimalMin: 50, unit: "%" },
5634
- source: "pns-hemograma-2019"
5635
- },
5636
- // WBC Differential (Absolute)
5651
+ // Leucograma diferencial em percentual (`Neutrophils`, `Lymphocytes`,
5652
+ // `Monocytes`, `Eosinophils`, `Basophils`) fica sem faixa de propósito.
5653
+ // As faixas em % que existiam aqui citavam `pns-hemograma-2019`, mas o
5654
+ // artigo (ROSENFELD et al., Rev. Bras. Epidemiol., v. 22, supl. 2, 2019,
5655
+ // DOI 10.1590/1980-549720190003.supl.2) publica o diferencial só em
5656
+ // contagem absoluta por mm³, separado por sexo (Tabela 2: basófilos 0–62
5657
+ // em homens e 0–72 em mulheres, eosinófilos 0–660 e 0–550, e assim por
5658
+ // diante). Não há intervalo percentual em nenhuma tabela. Sem fonte, a
5659
+ // lacuna é melhor que um intervalo inventado: o consumidor usa a faixa
5660
+ // impressa no laudo, como já acontece com `Glucose`.
5661
+ //
5662
+ // Diferencial absoluto (`*_Abs`): limites inferior e superior da Tabela 2
5663
+ // do mesmo artigo, por sexo, exatamente como publicados. São limites da
5664
+ // distribuição amostral de adultos (18 anos ou mais), não cortes clínicos.
5665
+ // O artigo informa células/mm³ (= células/µL); aqui a unidade é K/uL, então
5666
+ // cada limite foi dividido por 1.000 sem arredondar (62/mm³ = 0,062 K/uL).
5667
+ // O artigo não publica faixa ótima, por isso não há optimalMin/optimalMax.
5668
+ // Quando o sexo não é informado, o default é a união das duas faixas
5669
+ // (menor mínimo e maior máximo entre homens e mulheres).
5637
5670
  Neutrophils_Abs: {
5638
- default: { max: 8, min: 1.5, optimalMax: 6, optimalMin: 2, unit: "K/uL" },
5639
- source: "pns-hemograma-2019"
5671
+ default: { max: 6.474, min: 0.576, unit: "K/uL" },
5672
+ source: "pns-hemograma-2019",
5673
+ variants: [
5674
+ { ageMin: 18, range: { max: 5.971, min: 0.576, unit: "K/uL" }, sex: "M" },
5675
+ { ageMin: 18, range: { max: 6.474, min: 0.612, unit: "K/uL" }, sex: "F" }
5676
+ ]
5640
5677
  },
5641
5678
  NonHDL_Cholesterol: {
5642
5679
  default: { max: 130, min: 0, optimalMax: 100, optimalMin: 0, unit: "mg/dL" },
@@ -6755,7 +6792,7 @@ async function main() {
6755
6792
  strict: false
6756
6793
  });
6757
6794
  if (values.version) {
6758
- process.stdout.write(`${"0.31.0"}
6795
+ process.stdout.write(`${"0.31.2"}
6759
6796
  `);
6760
6797
  return;
6761
6798
  }
@@ -3,14 +3,14 @@
3
3
 
4
4
 
5
5
 
6
- var _chunk3I7VPANNcjs = require('./chunk-3I7VPANN.cjs');
6
+ var _chunkYX6B5YFJcjs = require('./chunk-YX6B5YFJ.cjs');
7
7
  require('./chunk-OR67NJDZ.cjs');
8
- require('./chunk-M6TGECTK.cjs');
8
+ require('./chunk-3GN33H37.cjs');
9
9
  require('./chunk-MJ254F5K.cjs');
10
10
 
11
11
 
12
12
 
13
13
 
14
14
 
15
- exports.labObservationToFHIR = _chunk3I7VPANNcjs.labObservationToFHIR; exports.labReportToFHIR = _chunk3I7VPANNcjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunk3I7VPANNcjs.labResultToFHIRBundle; exports.userProfileToFHIR = _chunk3I7VPANNcjs.userProfileToFHIR;
15
+ exports.labObservationToFHIR = _chunkYX6B5YFJcjs.labObservationToFHIR; exports.labReportToFHIR = _chunkYX6B5YFJcjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunkYX6B5YFJcjs.labResultToFHIRBundle; exports.userProfileToFHIR = _chunkYX6B5YFJcjs.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-TFVADOWD.js";
6
+ } from "./chunk-WRDWLWU2.js";
7
7
  import "./chunk-A6HR4XDK.js";
8
- import "./chunk-CO3KLE5C.js";
8
+ import "./chunk-FSAQ3USO.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 _chunkOSBQUQEIcjs = require('./chunk-OSBQUQEI.cjs');
7
+ var _chunkKL5SYSYZcjs = require('./chunk-KL5SYSYZ.cjs');
8
8
  require('./chunk-OR67NJDZ.cjs');
9
- require('./chunk-M6TGECTK.cjs');
9
+ require('./chunk-3GN33H37.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 = _chunkOSBQUQEIcjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkOSBQUQEIcjs.MAX_OBSERVATIONS; exports.extractObservationsFromBundle = _chunkOSBQUQEIcjs.extractObservationsFromBundle; exports.mapFHIRObservationToInternal = _chunkOSBQUQEIcjs.mapFHIRObservationToInternal; exports.processImportBundle = _chunkOSBQUQEIcjs.processImportBundle;
17
+ exports.MAX_FILE_SIZE = _chunkKL5SYSYZcjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkKL5SYSYZcjs.MAX_OBSERVATIONS; exports.extractObservationsFromBundle = _chunkKL5SYSYZcjs.extractObservationsFromBundle; exports.mapFHIRObservationToInternal = _chunkKL5SYSYZcjs.mapFHIRObservationToInternal; exports.processImportBundle = _chunkKL5SYSYZcjs.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-GDYFB2SE.js";
7
+ } from "./chunk-XX7KTBUX.js";
8
8
  import "./chunk-A6HR4XDK.js";
9
- import "./chunk-CO3KLE5C.js";
9
+ import "./chunk-FSAQ3USO.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 _chunk3I7VPANNcjs = require('./chunk-3I7VPANN.cjs');
8
+ var _chunkYX6B5YFJcjs = require('./chunk-YX6B5YFJ.cjs');
9
9
 
10
10
 
11
11
 
12
12
 
13
13
 
14
14
 
15
- var _chunkOSBQUQEIcjs = require('./chunk-OSBQUQEI.cjs');
15
+ var _chunkKL5SYSYZcjs = require('./chunk-KL5SYSYZ.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 _chunkM6TGECTKcjs = require('./chunk-M6TGECTK.cjs');
52
+ var _chunk3GN33H37cjs = require('./chunk-3GN33H37.cjs');
53
53
 
54
54
 
55
55
 
@@ -57,7 +57,7 @@ var _chunkM6TGECTKcjs = require('./chunk-M6TGECTK.cjs');
57
57
 
58
58
 
59
59
 
60
- var _chunk4NSBIPLWcjs = require('./chunk-4NSBIPLW.cjs');
60
+ var _chunkEWX7VXN3cjs = require('./chunk-EWX7VXN3.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 = _chunk3I7VPANNcjs.userProfileToFHIR.call(void 0, userProfile);
237
+ const fhirPatient = _chunkYX6B5YFJcjs.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: _chunk3I7VPANNcjs.entryFullUrl.call(void 0, resource), resource };
241
+ return { fullUrl: _chunkYX6B5YFJcjs.entryFullUrl.call(void 0, resource), resource };
242
242
  });
243
243
  return {
244
- entry: [{ fullUrl: _chunk3I7VPANNcjs.entryFullUrl.call(void 0, fhirPatient), resource: fhirPatient }, ...entries],
244
+ entry: [{ fullUrl: _chunkYX6B5YFJcjs.entryFullUrl.call(void 0, fhirPatient), resource: fhirPatient }, ...entries],
245
245
  resourceType: "Bundle",
246
246
  type: "collection"
247
247
  };
@@ -738,5 +738,5 @@ var specimenTypeCoding = (text) => BY_NORMALIZED_TEXT.get(normalize(text));
738
738
 
739
739
 
740
740
 
741
- exports.AGE_BRACKETS = AGE_BRACKETS; exports.BIOMARKER_CODE_SYSTEM = _chunkOR67NJDZcjs.BIOMARKER_CODE_SYSTEM; exports.BIOMARKER_DEFAULT_UNIT = _chunkMJ254F5Kcjs.BIOMARKER_DEFAULT_UNIT; exports.BIOMARKER_DEFINITIONS = _chunkM6TGECTKcjs.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 = _chunk3I7VPANNcjs.BUNDLE_BASE_URL; exports.CAC_INDICATOR_CODES = _chunkM6TGECTKcjs.CAC_INDICATOR_CODES; exports.CATEGORY_GROUPS = CATEGORY_GROUPS; exports.CATEGORY_SCREENING_INTERVALS = CATEGORY_SCREENING_INTERVALS; exports.DEXA_CATEGORIES = _chunkM6TGECTKcjs.DEXA_CATEGORIES; exports.DEXA_INDICATOR_CODES = _chunkM6TGECTKcjs.DEXA_INDICATOR_CODES; exports.FHIR_BRASIL_EXTENSIONS = FHIR_BRASIL_EXTENSIONS; exports.HL7_SPECIMEN_TYPE_SYSTEM = HL7_SPECIMEN_TYPE_SYSTEM; exports.IG_CANONICAL = IG_CANONICAL; exports.LOINC_SYSTEM = _chunkOR67NJDZcjs.LOINC_SYSTEM; exports.MAX_FILE_SIZE = _chunkOSBQUQEIcjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkOSBQUQEIcjs.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 = _chunkM6TGECTKcjs.codeToLoinc; exports.convertUnit = _chunkMJ254F5Kcjs.convertUnit; exports.cpfToFHIRIdentifier = cpfToFHIRIdentifier; exports.defaultReferenceRanges = _chunk4NSBIPLWcjs.defaultReferenceRanges; exports.entryFullUrl = _chunk3I7VPANNcjs.entryFullUrl; exports.extractObservationsFromBundle = _chunkOSBQUQEIcjs.extractObservationsFromBundle; exports.filterVisibleBiomarkers = _chunkM6TGECTKcjs.filterVisibleBiomarkers; exports.findCodeByName = _chunkM6TGECTKcjs.findCodeByName; exports.formatCNS = formatCNS; exports.formatCPF = formatCPF; exports.generateCacFullReference = _chunkM6TGECTKcjs.generateCacFullReference; exports.generateDexaFullReference = _chunkM6TGECTKcjs.generateDexaFullReference; exports.generateFilteredLLMReference = _chunkM6TGECTKcjs.generateFilteredLLMReference; exports.generateLLMReference = _chunkM6TGECTKcjs.generateLLMReference; exports.getAllCodes = _chunkM6TGECTKcjs.getAllCodes; exports.getAllDefinitions = _chunkM6TGECTKcjs.getAllDefinitions; exports.getAllLoincCodes = _chunkM6TGECTKcjs.getAllLoincCodes; exports.getAllSearchPatterns = _chunkM6TGECTKcjs.getAllSearchPatterns; exports.getBiomarkersByCategory = _chunkM6TGECTKcjs.getBiomarkersByCategory; exports.getBiomarkersForCategories = _chunkM6TGECTKcjs.getBiomarkersForCategories; exports.getCanonicalUnit = _chunkMJ254F5Kcjs.getCanonicalUnit; exports.getCategoriesByInterval = getCategoriesByInterval; exports.getCategoryGroup = getCategoryGroup; exports.getDaysUntilScreening = getDaysUntilScreening; exports.getDefaultUnit = _chunkMJ254F5Kcjs.getDefaultUnit; exports.getDefinitionByCode = _chunkM6TGECTKcjs.getDefinitionByCode; exports.getDefinitionByLoinc = _chunkM6TGECTKcjs.getDefinitionByLoinc; exports.getDefinitionsBySex = _chunkM6TGECTKcjs.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 = _chunkM6TGECTKcjs.getSexForCode; exports.getVisibleDefinitions = _chunkM6TGECTKcjs.getVisibleDefinitions; exports.interventionToFHIRMedicationStatement = interventionToFHIRMedicationStatement; exports.interventionToFHIRObservation = interventionToFHIRObservation; exports.interventionsToFHIRBundle = interventionsToFHIRBundle; exports.isBiomarkerVisible = _chunkM6TGECTKcjs.isBiomarkerVisible; exports.isCacDocument = _chunkM6TGECTKcjs.isCacDocument; exports.isDexaDocument = _chunkM6TGECTKcjs.isDexaDocument; exports.isScreeningDue = isScreeningDue; exports.isValidCode = _chunkM6TGECTKcjs.isValidCode; exports.isValidLoinc = _chunkM6TGECTKcjs.isValidLoinc; exports.labObservationToFHIR = _chunk3I7VPANNcjs.labObservationToFHIR; exports.labReportToFHIR = _chunk3I7VPANNcjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunk3I7VPANNcjs.labResultToFHIRBundle; exports.listMappedSubcategories = listMappedSubcategories; exports.loincToCode = _chunkM6TGECTKcjs.loincToCode; exports.mapFHIRObservationToInternal = _chunkOSBQUQEIcjs.mapFHIRObservationToInternal; exports.normalizeCode = _chunkM6TGECTKcjs.normalizeCode; exports.plural = plural; exports.pluralCount = pluralCount; exports.pluralPhrase = pluralPhrase; exports.pluralPhraseCount = pluralPhraseCount; exports.processImportBundle = _chunkOSBQUQEIcjs.processImportBundle; exports.specimenTypeCoding = specimenTypeCoding; exports.toBiomarkerTests = _chunkM6TGECTKcjs.toBiomarkerTests; exports.unitToUCUM = _chunkMJ254F5Kcjs.unitToUCUM; exports.userProfileToFHIR = _chunk3I7VPANNcjs.userProfileToFHIR; exports.validateCNS = validateCNS; exports.validateCPF = validateCPF; exports.validateFHIRDiagnosticReport = _chunk3ILBFLVQcjs.validateFHIRDiagnosticReport; exports.validateFHIRImportBundle = _chunk3ILBFLVQcjs.validateFHIRImportBundle; exports.validateFHIRObservation = _chunk3ILBFLVQcjs.validateFHIRObservation; exports.validateLoincNameMatch = _chunkM6TGECTKcjs.validateLoincNameMatch;
741
+ exports.AGE_BRACKETS = AGE_BRACKETS; exports.BIOMARKER_CODE_SYSTEM = _chunkOR67NJDZcjs.BIOMARKER_CODE_SYSTEM; exports.BIOMARKER_DEFAULT_UNIT = _chunkMJ254F5Kcjs.BIOMARKER_DEFAULT_UNIT; exports.BIOMARKER_DEFINITIONS = _chunk3GN33H37cjs.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 = _chunkYX6B5YFJcjs.BUNDLE_BASE_URL; exports.CAC_INDICATOR_CODES = _chunk3GN33H37cjs.CAC_INDICATOR_CODES; exports.CATEGORY_GROUPS = CATEGORY_GROUPS; exports.CATEGORY_SCREENING_INTERVALS = CATEGORY_SCREENING_INTERVALS; exports.DEXA_CATEGORIES = _chunk3GN33H37cjs.DEXA_CATEGORIES; exports.DEXA_INDICATOR_CODES = _chunk3GN33H37cjs.DEXA_INDICATOR_CODES; exports.FHIR_BRASIL_EXTENSIONS = FHIR_BRASIL_EXTENSIONS; exports.HL7_SPECIMEN_TYPE_SYSTEM = HL7_SPECIMEN_TYPE_SYSTEM; exports.IG_CANONICAL = IG_CANONICAL; exports.LOINC_SYSTEM = _chunkOR67NJDZcjs.LOINC_SYSTEM; exports.MAX_FILE_SIZE = _chunkKL5SYSYZcjs.MAX_FILE_SIZE; exports.MAX_OBSERVATIONS = _chunkKL5SYSYZcjs.MAX_OBSERVATIONS; exports.T_SCORE_ZONES = T_SCORE_ZONES; exports.UNIT_TO_UCUM = _chunkMJ254F5Kcjs.UNIT_TO_UCUM; exports.ZONE_DEFS = ZONE_DEFS; exports.applyFallbackReferenceRanges = _chunkEWX7VXN3cjs.applyFallbackReferenceRanges; exports.biomarkerRangeDefinitions = _chunkEWX7VXN3cjs.biomarkerRangeDefinitions; exports.calculateNextScreeningDate = calculateNextScreeningDate; exports.cnsToFHIRIdentifier = cnsToFHIRIdentifier; exports.codeToLoinc = _chunk3GN33H37cjs.codeToLoinc; exports.convertUnit = _chunkMJ254F5Kcjs.convertUnit; exports.cpfToFHIRIdentifier = cpfToFHIRIdentifier; exports.defaultReferenceRanges = _chunkEWX7VXN3cjs.defaultReferenceRanges; exports.entryFullUrl = _chunkYX6B5YFJcjs.entryFullUrl; exports.extractObservationsFromBundle = _chunkKL5SYSYZcjs.extractObservationsFromBundle; exports.filterVisibleBiomarkers = _chunk3GN33H37cjs.filterVisibleBiomarkers; exports.findCodeByName = _chunk3GN33H37cjs.findCodeByName; exports.formatCNS = formatCNS; exports.formatCPF = formatCPF; exports.generateCacFullReference = _chunk3GN33H37cjs.generateCacFullReference; exports.generateDexaFullReference = _chunk3GN33H37cjs.generateDexaFullReference; exports.generateFilteredLLMReference = _chunk3GN33H37cjs.generateFilteredLLMReference; exports.generateLLMReference = _chunk3GN33H37cjs.generateLLMReference; exports.getAllCodes = _chunk3GN33H37cjs.getAllCodes; exports.getAllDefinitions = _chunk3GN33H37cjs.getAllDefinitions; exports.getAllLoincCodes = _chunk3GN33H37cjs.getAllLoincCodes; exports.getAllSearchPatterns = _chunk3GN33H37cjs.getAllSearchPatterns; exports.getBiomarkersByCategory = _chunk3GN33H37cjs.getBiomarkersByCategory; exports.getBiomarkersForCategories = _chunk3GN33H37cjs.getBiomarkersForCategories; exports.getCanonicalUnit = _chunkMJ254F5Kcjs.getCanonicalUnit; exports.getCategoriesByInterval = getCategoriesByInterval; exports.getCategoryGroup = getCategoryGroup; exports.getDaysUntilScreening = getDaysUntilScreening; exports.getDefaultUnit = _chunkMJ254F5Kcjs.getDefaultUnit; exports.getDefinitionByCode = _chunk3GN33H37cjs.getDefinitionByCode; exports.getDefinitionByLoinc = _chunk3GN33H37cjs.getDefinitionByLoinc; exports.getDefinitionsBySex = _chunk3GN33H37cjs.getDefinitionsBySex; exports.getDueCategories = getDueCategories; exports.getFallbackReferenceRange = _chunkEWX7VXN3cjs.getFallbackReferenceRange; exports.getRangeDirection = _chunkEWX7VXN3cjs.getRangeDirection; exports.getReferenceRange = _chunkEWX7VXN3cjs.getReferenceRange; exports.getSIUnit = _chunkMJ254F5Kcjs.getSIUnit; exports.getScreeningInterval = getScreeningInterval; exports.getSexForCode = _chunk3GN33H37cjs.getSexForCode; exports.getVisibleDefinitions = _chunk3GN33H37cjs.getVisibleDefinitions; exports.interventionToFHIRMedicationStatement = interventionToFHIRMedicationStatement; exports.interventionToFHIRObservation = interventionToFHIRObservation; exports.interventionsToFHIRBundle = interventionsToFHIRBundle; exports.isBiomarkerVisible = _chunk3GN33H37cjs.isBiomarkerVisible; exports.isCacDocument = _chunk3GN33H37cjs.isCacDocument; exports.isDexaDocument = _chunk3GN33H37cjs.isDexaDocument; exports.isScreeningDue = isScreeningDue; exports.isValidCode = _chunk3GN33H37cjs.isValidCode; exports.isValidLoinc = _chunk3GN33H37cjs.isValidLoinc; exports.labObservationToFHIR = _chunkYX6B5YFJcjs.labObservationToFHIR; exports.labReportToFHIR = _chunkYX6B5YFJcjs.labReportToFHIR; exports.labResultToFHIRBundle = _chunkYX6B5YFJcjs.labResultToFHIRBundle; exports.listMappedSubcategories = listMappedSubcategories; exports.loincToCode = _chunk3GN33H37cjs.loincToCode; exports.mapFHIRObservationToInternal = _chunkKL5SYSYZcjs.mapFHIRObservationToInternal; exports.normalizeCode = _chunk3GN33H37cjs.normalizeCode; exports.plural = plural; exports.pluralCount = pluralCount; exports.pluralPhrase = pluralPhrase; exports.pluralPhraseCount = pluralPhraseCount; exports.processImportBundle = _chunkKL5SYSYZcjs.processImportBundle; exports.specimenTypeCoding = specimenTypeCoding; exports.toBiomarkerTests = _chunk3GN33H37cjs.toBiomarkerTests; exports.unitToUCUM = _chunkMJ254F5Kcjs.unitToUCUM; exports.userProfileToFHIR = _chunkYX6B5YFJcjs.userProfileToFHIR; exports.validateCNS = validateCNS; exports.validateCPF = validateCPF; exports.validateFHIRDiagnosticReport = _chunk3ILBFLVQcjs.validateFHIRDiagnosticReport; exports.validateFHIRImportBundle = _chunk3ILBFLVQcjs.validateFHIRImportBundle; exports.validateFHIRObservation = _chunk3ILBFLVQcjs.validateFHIRObservation; exports.validateLoincNameMatch = _chunk3GN33H37cjs.validateLoincNameMatch;
742
742
  //# 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-TFVADOWD.js";
8
+ } from "./chunk-WRDWLWU2.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-GDYFB2SE.js";
15
+ } from "./chunk-XX7KTBUX.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-CO3KLE5C.js";
52
+ } from "./chunk-FSAQ3USO.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-37LQWDN7.js";
60
+ } from "./chunk-CL2HNUGG.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 _chunk4NSBIPLWcjs = require('./chunk-4NSBIPLW.cjs');
8
+ var _chunkEWX7VXN3cjs = require('./chunk-EWX7VXN3.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 = _chunk4NSBIPLWcjs.applyFallbackReferenceRanges; exports.biomarkerRangeDefinitions = _chunk4NSBIPLWcjs.biomarkerRangeDefinitions; exports.defaultReferenceRanges = _chunk4NSBIPLWcjs.defaultReferenceRanges; exports.getFallbackReferenceRange = _chunk4NSBIPLWcjs.getFallbackReferenceRange; exports.getRangeDirection = _chunk4NSBIPLWcjs.getRangeDirection; exports.getReferenceRange = _chunk4NSBIPLWcjs.getReferenceRange;
17
+ exports.applyFallbackReferenceRanges = _chunkEWX7VXN3cjs.applyFallbackReferenceRanges; exports.biomarkerRangeDefinitions = _chunkEWX7VXN3cjs.biomarkerRangeDefinitions; exports.defaultReferenceRanges = _chunkEWX7VXN3cjs.defaultReferenceRanges; exports.getFallbackReferenceRange = _chunkEWX7VXN3cjs.getFallbackReferenceRange; exports.getRangeDirection = _chunkEWX7VXN3cjs.getRangeDirection; exports.getReferenceRange = _chunkEWX7VXN3cjs.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-37LQWDN7.js";
8
+ } from "./chunk-CL2HNUGG.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.31.0",
3
+ "version": "0.31.2",
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",