@precisa-saude/fhir 0.37.2 → 0.38.1
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.
- package/dist/biomarkers.cjs +2 -2
- package/dist/biomarkers.js +1 -1
- package/dist/{chunk-CZLX33DZ.js → chunk-2J3V7DCF.js} +21 -2
- package/dist/chunk-2J3V7DCF.js.map +1 -0
- package/dist/{chunk-3YB2ORY7.cjs → chunk-46PNS7KW.cjs} +38 -9
- package/dist/chunk-46PNS7KW.cjs.map +1 -0
- package/dist/{chunk-DE7NHXIR.cjs → chunk-4O3QE7DU.cjs} +12 -3
- package/dist/chunk-4O3QE7DU.cjs.map +1 -0
- package/dist/{chunk-VOBVUACD.js → chunk-77N3LQNM.js} +3 -3
- package/dist/{chunk-5FMR2U7P.cjs → chunk-C3SMDNLC.cjs} +8 -1
- package/dist/chunk-C3SMDNLC.cjs.map +1 -0
- package/dist/{chunk-CVMOQDM2.js → chunk-GG3MOT3C.js} +2 -2
- package/dist/{chunk-RWUFK5AN.cjs → chunk-IY6BZX2V.cjs} +22 -3
- package/dist/chunk-IY6BZX2V.cjs.map +1 -0
- package/dist/{chunk-AJUDODBT.cjs → chunk-LUGMRMWY.cjs} +10 -10
- package/dist/{chunk-AJUDODBT.cjs.map → chunk-LUGMRMWY.cjs.map} +1 -1
- package/dist/{chunk-LSC7NHFE.cjs → chunk-NUFN24W4.cjs} +3 -3
- package/dist/{chunk-LSC7NHFE.cjs.map → chunk-NUFN24W4.cjs.map} +1 -1
- package/dist/{chunk-O7SK2YUU.js → chunk-SIXIWFC5.js} +11 -2
- package/dist/chunk-SIXIWFC5.js.map +1 -0
- package/dist/{chunk-HQ26GOLI.js → chunk-SZV66GMI.js} +8 -1
- package/dist/chunk-SZV66GMI.js.map +1 -0
- package/dist/{chunk-BDS6CM7F.cjs → chunk-VMID6CDC.cjs} +45 -2
- package/dist/chunk-VMID6CDC.cjs.map +1 -0
- package/dist/{chunk-JMWPX43H.js → chunk-X2BYLSNK.js} +33 -4
- package/dist/chunk-X2BYLSNK.js.map +1 -0
- package/dist/{chunk-YCJUGK6D.js → chunk-XVXLDN4Q.js} +45 -2
- package/dist/chunk-XVXLDN4Q.js.map +1 -0
- package/dist/cli.js +128 -2
- package/dist/converter.cjs +5 -5
- package/dist/converter.js +4 -4
- package/dist/importer.cjs +5 -5
- package/dist/importer.js +4 -4
- package/dist/index.cjs +36 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -7
- package/dist/index.js.map +1 -1
- package/dist/reference-ranges.cjs +4 -4
- package/dist/reference-ranges.js +3 -3
- package/dist/sources.cjs +2 -2
- package/dist/sources.js +1 -1
- package/dist/units.cjs +3 -3
- package/dist/units.js +2 -2
- package/dist/validators.cjs +4 -4
- package/dist/validators.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-3YB2ORY7.cjs.map +0 -1
- package/dist/chunk-5FMR2U7P.cjs.map +0 -1
- package/dist/chunk-BDS6CM7F.cjs.map +0 -1
- package/dist/chunk-CZLX33DZ.js.map +0 -1
- package/dist/chunk-DE7NHXIR.cjs.map +0 -1
- package/dist/chunk-HQ26GOLI.js.map +0 -1
- package/dist/chunk-JMWPX43H.js.map +0 -1
- package/dist/chunk-O7SK2YUU.js.map +0 -1
- package/dist/chunk-RWUFK5AN.cjs.map +0 -1
- package/dist/chunk-YCJUGK6D.js.map +0 -1
- /package/dist/{chunk-VOBVUACD.js.map → chunk-77N3LQNM.js.map} +0 -0
- /package/dist/{chunk-CVMOQDM2.js.map → chunk-GG3MOT3C.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkVMID6CDCcjs = require('./chunk-VMID6CDC.cjs');
|
|
4
4
|
|
|
5
5
|
// src/units.ts
|
|
6
6
|
var UNIT_TO_UCUM = {
|
|
@@ -96,7 +96,7 @@ var DIMENSIONLESS_DEFAULTS = {
|
|
|
96
96
|
};
|
|
97
97
|
var BIOMARKER_DEFAULT_UNIT = {
|
|
98
98
|
...Object.fromEntries(
|
|
99
|
-
|
|
99
|
+
_chunkVMID6CDCcjs.BIOMARKER_DEFINITIONS.filter((b) => b.unit).map((b) => [b.code, b.unit])
|
|
100
100
|
),
|
|
101
101
|
...DIMENSIONLESS_DEFAULTS
|
|
102
102
|
};
|
|
@@ -396,6 +396,17 @@ var BIOMARKER_UNITS = {
|
|
|
396
396
|
siUcum: "pg/mL",
|
|
397
397
|
siUnit: "pg/mL"
|
|
398
398
|
},
|
|
399
|
+
// O BUN em mmol/L é expresso como ureia: cada molécula de ureia tem dois
|
|
400
|
+
// nitrogênios, então a massa que entra na conversão é a de N2 (2 × 14,007),
|
|
401
|
+
// e não a da ureia (60,06) usada em `Urea`. 14 mg/dL de BUN ≈ 5 mmol/L.
|
|
402
|
+
BUN: {
|
|
403
|
+
aliases: { "mg/dl": "mg/dL", "mmol/l": "mmol/L" },
|
|
404
|
+
canonicalUcum: "mg/dL",
|
|
405
|
+
canonicalUnit: "mg/dL",
|
|
406
|
+
molecularWeight: 28.0134,
|
|
407
|
+
siUcum: "mmol/L",
|
|
408
|
+
siUnit: "mmol/L"
|
|
409
|
+
},
|
|
399
410
|
CA125: {
|
|
400
411
|
aliases: { "u/ml": "U/mL" },
|
|
401
412
|
canonicalUcum: "U/mL",
|
|
@@ -836,6 +847,14 @@ var BIOMARKER_UNITS = {
|
|
|
836
847
|
siUcum: "pmol/L",
|
|
837
848
|
siUnit: "pmol/L"
|
|
838
849
|
},
|
|
850
|
+
T3Total: {
|
|
851
|
+
aliases: { "ng/dl": "ng/dL", "nmol/l": "nmol/L" },
|
|
852
|
+
canonicalUcum: "ng/dL",
|
|
853
|
+
canonicalUnit: "ng/dL",
|
|
854
|
+
molecularWeight: 650.98,
|
|
855
|
+
siUcum: "nmol/L",
|
|
856
|
+
siUnit: "nmol/L"
|
|
857
|
+
},
|
|
839
858
|
T4Free: {
|
|
840
859
|
aliases: { "ng/dl": "ng/dL", "pmol/l": "pmol/L" },
|
|
841
860
|
canonicalUcum: "ng/dL",
|
|
@@ -1073,4 +1092,4 @@ function resolveUcum(unit, biomarkerCode) {
|
|
|
1073
1092
|
|
|
1074
1093
|
|
|
1075
1094
|
exports.UNIT_TO_UCUM = UNIT_TO_UCUM; exports.BIOMARKER_DEFAULT_UNIT = BIOMARKER_DEFAULT_UNIT; exports.unitToUCUM = unitToUCUM; exports.getDefaultUnit = getDefaultUnit; exports.isUcumCode = isUcumCode; exports.BIOMARKER_UNITS = BIOMARKER_UNITS; exports.getCanonicalUnit = getCanonicalUnit; exports.getSIUnit = getSIUnit; exports.convertUnit = convertUnit; exports.resolveUcum = resolveUcum;
|
|
1076
|
-
//# sourceMappingURL=chunk-
|
|
1095
|
+
//# sourceMappingURL=chunk-IY6BZX2V.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-IY6BZX2V.cjs","../src/units.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-IY6BZX2V.cjs","sourcesContent":[null,"/**\n * Unit Mappings and Biomarker Unit Definitions\n *\n * Maps units to UCUM format, provides default units for biomarkers,\n * and defines canonical/SI unit configurations with aliases.\n */\n\nimport { BIOMARKER_DEFINITIONS } from './biomarkers';\n\n// ─── UCUM Mappings ───────────────────────────────────────────────────────────\n\n/**\n * Grafia impressa → código UCUM (Unified Code for Units of Measure).\n *\n * É a segunda fonte de `resolveUcum`, atrás de `BIOMARKER_UNITS`, e a única\n * para unidade que nenhum biomarcador configura. Cobre toda unidade declarada\n * em `biomarkers.ts`: o teste `loinc-axes.test.ts` confere isso, porque uma\n * unidade sem entrada aqui saía no FHIR como `code` sob o system do UCUM sem\n * ser UCUM (`uIU/mL`, `K/uL`, `razão`).\n *\n * `[IU]` e `[iU]` são o mesmo átomo no UCUM, nas grafias sensível e\n * insensível a caixa; esta tabela usa `[IU]` e `BIOMARKER_UNITS` usa `[iU]`.\n *\n * @see https://ucum.org/\n */\nexport const UNIT_TO_UCUM: Record<string, string> = {\n // Dimensionless / special measurements\n '[pH]': '[pH]',\n '{index}': '{index}',\n '{ratio}': '{ratio}',\n '{score}': '{score}',\n '{specific gravity}': '{specific gravity}',\n\n '/HPF': '/[HPF]',\n '/LPF': '/[LPF]',\n '/µL': '/uL',\n // Percentage\n '%': '%',\n // Count units\n '10³/µL': '10*3/uL',\n '10⁶/µL': '10*6/uL',\n Angstrom: 'Ao',\n AU: '{score}',\n cm: 'cm',\n 'cm³': 'cm3',\n deg: 'deg',\n // Volume\n fL: 'fL',\n g: 'g',\n 'g/cm²': 'g/cm2',\n\n // Mass concentration\n 'g/dL': 'g/dL',\n 'g/L': 'g/L',\n 'IU/L': '[IU]/L',\n 'IU/mL': '[IU]/mL',\n 'K/uL': '10*3/uL',\n 'kcal/d': 'kcal/d',\n kg: 'kg',\n 'kg/m2': 'kg/m2',\n 'kg/m²': 'kg/m2',\n 'kU/L': 'k[IU]/L',\n L: 'L',\n 'M/uL': '10*6/uL',\n 'mcg/dL': 'ug/dL',\n 'mcg/L': 'ug/L',\n 'mcg/mL': 'ug/mL',\n // Molar concentration\n 'mEq/L': 'meq/L',\n\n mg: 'mg',\n 'mg/dL': 'mg/dL',\n 'mg/g': 'mg/g',\n 'mg/L': 'mg/L',\n 'mIU/L': 'm[IU]/L',\n 'mIU/mL': 'm[IU]/mL',\n mL: 'mL',\n 'mL/min/1.73m²': 'mL/min/{1.73_m2}',\n mm: 'mm',\n 'mm/h': 'mm/h',\n 'mm/hr': 'mm/h',\n 'mmol/L': 'mmol/L',\n 'mUI/L': 'm[IU]/L',\n 'mUI/mL': 'm[IU]/mL',\n\n ng: 'ng',\n\n 'ng/dL': 'ng/dL',\n 'ng/L': 'ng/L',\n 'ng/mL': 'ng/mL',\n 'nmol/L': 'nmol/L',\n // Mass\n pg: 'pg',\n\n 'pg/mL': 'pg/mL',\n pH: '[pH]',\n 'pmol/L': 'pmol/L',\n razão: '{ratio}',\n score: '{score}',\n segundos: 's',\n // Enzyme activity\n U: 'U',\n 'U/L': 'U/L',\n // Special units\n 'U/mL': 'U/mL',\n 'ug/dL': 'ug/dL',\n 'ug/L': 'ug/L',\n 'UI/L': '[IU]/L',\n\n 'UI/mL': '[IU]/mL',\n 'uIU/mL': 'u[IU]/mL',\n 'umol/L': 'umol/L',\n\n µg: 'ug',\n 'µg/dL': 'ug/dL',\n 'µg/L': 'ug/L',\n 'µmol/L': 'umol/L',\n 'µUI/mL': 'u[IU]/mL',\n índice: '{index}',\n};\n\n/**\n * Unidades adimensionais de urina, que a definição não declara porque o laudo\n * não as imprime: a densidade sai como `1.020` e o pH como `6.0`, sem unidade.\n * Quando o laudo não traz unidade, o FHIR ainda precisa de uma, e estas são\n * as do UCUM.\n */\nconst DIMENSIONLESS_DEFAULTS: Record<string, string> = {\n pH_Urine: '[pH]',\n SpecificGravity_Urine: '{specific gravity}',\n};\n\n/**\n * Unidade padrão de cada biomarcador, usada quando o laudo não imprime uma.\n *\n * Derivada de `unit` em `biomarkers.ts`, que é a fonte única. Até out/2026\n * era uma segunda tabela escrita à mão, e as duas divergiam: TSH era\n * `µUI/mL` aqui e `uIU/mL` lá, ferro era `µg/dL` aqui e `mcg/dL` lá. Duas\n * fontes para a mesma unidade é o que faz o `fhir-bio units` e o `fhir-bio\n * range` responderem coisas diferentes para o mesmo código.\n */\nexport const BIOMARKER_DEFAULT_UNIT: Record<string, string> = {\n ...Object.fromEntries(\n BIOMARKER_DEFINITIONS.filter((b) => b.unit).map((b) => [b.code, b.unit as string]),\n ),\n ...DIMENSIONLESS_DEFAULTS,\n};\n\n/**\n * Convert unit to UCUM format\n *\n * Devolve a entrada intacta quando não conhece a unidade. Para montar um\n * `Quantity` FHIR use `resolveUcum`, que diz \"não sei\" em vez de devolver\n * uma grafia qualquer como se fosse UCUM.\n */\nexport function unitToUCUM(unit: string): string {\n return UNIT_TO_UCUM[unit] || unit;\n}\n\n/**\n * Get default unit for a biomarker code\n * @param biomarkerCode - The biomarker code (e.g., \"Glucose\", \"HbA1c\")\n * @returns The default unit or empty string if not found\n */\nexport function getDefaultUnit(biomarkerCode: string): string {\n return BIOMARKER_DEFAULT_UNIT[biomarkerCode] || '';\n}\n\n// ─── UCUM syntax ─────────────────────────────────────────────────────────────\n\n/**\n * Átomos do UCUM que aparecem em laudo clínico, mais as bases do SI.\n *\n * Não é a tabela inteira do UCUM, que tem centenas de átomos. É a lista que\n * basta para dizer que `uIU/mL` não é UCUM (`IU` não é átomo; `[IU]` é) e que\n * `10*3/uL` é. Átomo fora desta lista cai em \"não é UCUM\", e o jeito certo de\n * aceitá-lo é acrescentá-lo aqui, com o laudo que o imprimiu.\n */\nconst UCUM_ATOMS = new Set([\n 'm',\n 'g',\n 's',\n 'L',\n 'l',\n 'mol',\n 'eq',\n 'U',\n 'cal',\n 'h',\n 'd',\n 'min',\n 'wk',\n 'mo',\n 'a',\n 'Ao',\n 'deg',\n 'K',\n 'A',\n 'N',\n 'Pa',\n 'J',\n 'W',\n 'Hz',\n 'V',\n 'C',\n 'osm',\n 't',\n 'u',\n 'bar',\n 'atm',\n 'rad',\n 'sr',\n 'cd',\n 'Bq',\n 'Gy',\n 'Sv',\n 'lm',\n 'lx',\n 'Cel',\n 'B',\n 'Np',\n]);\n\n/** Prefixos do UCUM, do yotta ao yocto. `da` (deca) é o único com duas letras. */\nconst UCUM_PREFIXES = new Set([\n 'Y',\n 'Z',\n 'E',\n 'P',\n 'T',\n 'G',\n 'M',\n 'k',\n 'h',\n 'da',\n 'd',\n 'c',\n 'm',\n 'u',\n 'n',\n 'p',\n 'f',\n 'a',\n 'z',\n 'y',\n]);\n\n/**\n * Um átomo com prefixo opcional: `g`, `mg`, `[IU]`, `u[IU]`, `10*3`, `%`.\n *\n * O prefixo só vale na frente de átomo métrico, e o UCUM marca essa\n * propriedade átomo a átomo. Aqui a regra é mais frouxa, prefixo na frente de\n * qualquer átomo, porque o que se quer pegar é grafia que não é UCUM de jeito\n * nenhum, e não o caso de borda `kdeg`.\n */\nfunction isUcumAtom(token: string): boolean {\n if (token === '%' || /^10\\*-?\\d+$/.test(token) || /^\\d+$/.test(token)) return true;\n // Átomo entre colchetes: `[IU]`, `[HPF]`, `[lb_av]`, `[pH]`. Com prefixo:\n // `u[IU]`, `m[IU]`, `k[IU]`.\n const bracket = /^([A-Za-z]{0,2})\\[[^[\\]{}\\s]+\\]$/.exec(token);\n if (bracket) return bracket[1] === '' || UCUM_PREFIXES.has(bracket[1] as string);\n if (UCUM_ATOMS.has(token)) return true;\n for (const prefix of UCUM_PREFIXES) {\n if (token.startsWith(prefix) && UCUM_ATOMS.has(token.slice(prefix.length))) return true;\n }\n return false;\n}\n\n/**\n * Um componente: átomo com expoente opcional e anotação opcional, ou anotação\n * sozinha. `m2`, `cm3`, `[in_i]3`, `mL{total}`, `{ratio}`.\n *\n * A anotação aceita qualquer caractere que não seja chave, que é o que a\n * especificação diz dela: texto sem interpretação. `{specific gravity}` passa\n * por isso, mesmo com espaço.\n */\nfunction isUcumComponent(token: string): boolean {\n const m = /^(.*?)(\\{[^{}]*\\})?$/.exec(token);\n if (!m) return false;\n const [, body, annotation] = m;\n if (!body) return annotation !== undefined;\n const exp = /^(.+?)([+-]?\\d+)?$/.exec(body as string);\n if (!exp) return false;\n const [, atom, exponent] = exp;\n // `10*3` termina em dígito e não tem expoente; o regex ganancioso já\n // separou errado, então tenta o token inteiro como átomo primeiro.\n if (isUcumAtom(body as string)) return true;\n if (exponent === undefined) return false;\n return isUcumAtom(atom as string);\n}\n\n/**\n * Diz se a string é sintaticamente UCUM: componentes ligados por `.` e `/`,\n * com `/` inicial permitido (`/[HPF]`).\n *\n * É sintaxe, não semântica: `K/uL` passa porque `K` é kelvin, e nada aqui sabe\n * que o laudo quis dizer milhares. É o que `resolveUcum` e `BIOMARKER_UNITS`\n * resolvem antes de a string chegar aqui. O que este check pega é o resto:\n * grafia em português, `µ` fora do ASCII, `IU` sem colchetes, `hr`.\n *\n * O `.` e o `/` só separam fora de chaves e colchetes: `mL/min/{1.73_m2}` tem\n * um ponto dentro da anotação, e `[in_i]` poderia ter um operador dentro do\n * átomo.\n */\nexport function isUcumCode(code: string): boolean {\n if (!code || /[^\\x21-\\x7E ]/.test(code)) return false;\n const terms: string[] = [];\n let current = '';\n let braces = 0;\n let inBracket = false;\n for (const ch of code) {\n if (ch === '{') braces++;\n else if (ch === '}') {\n if (braces === 0) return false;\n braces--;\n } else if (ch === '[') inBracket = true;\n else if (ch === ']') inBracket = false;\n if ((ch === '.' || ch === '/') && braces === 0 && !inBracket) {\n terms.push(current, ch);\n current = '';\n continue;\n }\n current += ch;\n }\n if (braces !== 0 || inBracket) return false;\n terms.push(current);\n // `/[HPF]` é `1/[HPF]` com o numerador implícito.\n if (terms[0] === '' && terms[1] === '/') terms[0] = '1';\n\n let expectOperand = true;\n for (const t of terms) {\n if (expectOperand) {\n if (!isUcumComponent(t)) return false;\n } else if (t !== '.' && t !== '/') {\n return false;\n }\n expectOperand = !expectOperand;\n }\n return !expectOperand;\n}\n\n// ─── Biomarker Unit Configurations ───────────────────────────────────────────\n\n/** Biomarker unit definitions — canonical units match reference-ranges.ts (BR conventional). */\n\nexport interface BiomarkerUnitConfig {\n aliases: Record<string, string>;\n canonicalUcum: string;\n canonicalUnit: string;\n molecularWeight?: number;\n siUcum: string;\n siUnit: string;\n}\n\nconst CBC_DIFF_ALIASES: Record<string, string> = {\n '/ul': '/uL',\n '/µl': '/uL',\n '10*3/ul': 'K/uL',\n 'cells/ul': '/uL',\n 'cells/µl': '/uL',\n 'k/ul': 'K/uL',\n 'x10e3/ul': 'K/uL',\n};\nconst CBC_DIFF: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: '10*3/uL',\n canonicalUnit: 'K/uL',\n siUcum: '10*3/uL',\n siUnit: 'K/uL',\n};\nconst DEXA_KG_ALIASES: Record<string, string> = {\n kg: 'kg',\n lb: '[lb_av]',\n lbs: '[lb_av]',\n};\nconst DEXA_KG: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: 'kg',\n canonicalUnit: 'kg',\n siUcum: 'kg',\n siUnit: 'kg',\n};\n\n/**\n * Urine sediment units — Brazilian automated analyzers (Sysmex UF-series)\n * report in /mL while manual microscopy uses /HPF. Canonical unit is /HPF.\n */\nconst URINE_SEDIMENT_ALIASES: Record<string, string> = {\n '/hpf': '/HPF',\n '/ml': '/mL',\n};\nconst URINE_SEDIMENT: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: '/[HPF]',\n canonicalUnit: '/HPF',\n siUcum: '/[HPF]',\n siUnit: '/HPF',\n};\n\n/** Percentage biomarkers — canonical and SI both use %. */\nconst PERCENTAGE_ALIASES: Record<string, string> = { '%': '%', pct: '%', percent: '%' };\nconst PERCENTAGE: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: '%',\n canonicalUnit: '%',\n siUcum: '%',\n siUnit: '%',\n};\n\n/** Enzyme activity — canonical and SI both use U/L. */\nconst ENZYME_ALIASES: Record<string, string> = { 'iu/l': 'U/L', 'u/l': 'U/L' };\nconst ENZYME: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: 'U/L',\n canonicalUnit: 'U/L',\n siUcum: 'U/L',\n siUnit: 'U/L',\n};\n\n/** Monovalent electrolytes — mEq/L ↔ mmol/L (1:1). */\nconst ELECTROLYTE_MONO_ALIASES: Record<string, string> = { 'meq/l': 'mEq/L', 'mmol/l': 'mmol/L' };\nconst ELECTROLYTE_MONO: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: 'meq/L',\n canonicalUnit: 'mEq/L',\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n};\n\n/** CAC scores — Agatston Units (AU), dimensionless. */\nconst CAC_ALIASES: Record<string, string> = { au: 'AU' };\nconst CAC: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: '{score}',\n canonicalUnit: 'AU',\n siUcum: '{score}',\n siUnit: 'AU',\n};\n\n/** nmol/L biomarkers — same unit for canonical and SI. */\nconst NMOL_L_ALIASES: Record<string, string> = { 'nmol/l': 'nmol/L' };\nconst NMOL_L: Omit<BiomarkerUnitConfig, 'aliases'> = {\n canonicalUcum: 'nmol/L',\n canonicalUnit: 'nmol/L',\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n};\n\nexport const BIOMARKER_UNITS: Record<string, BiomarkerUnitConfig> = {\n AFP: {\n aliases: { 'ng/ml': 'ng/mL' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ng/mL',\n siUnit: 'ng/mL',\n },\n Albumin: {\n aliases: { 'g/dl': 'g/dL', 'g/l': 'g/L' },\n canonicalUcum: 'g/dL',\n canonicalUnit: 'g/dL',\n siUcum: 'g/L',\n siUnit: 'g/L',\n },\n AlkalinePhosphatase: { aliases: ENZYME_ALIASES, ...ENZYME },\n ALT: { aliases: ENZYME_ALIASES, ...ENZYME },\n AMH: {\n aliases: { 'ng/ml': 'ng/mL', 'pmol/l': 'pmol/L' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n molecularWeight: 12_500,\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n Amylase: { aliases: ENZYME_ALIASES, ...ENZYME },\n AntiThyroglobulin: {\n aliases: { 'iu/ml': 'IU/mL', 'ui/ml': 'IU/mL' },\n canonicalUcum: '[iU]/mL',\n canonicalUnit: 'IU/mL',\n siUcum: '[iU]/mL',\n siUnit: 'IU/mL',\n },\n AntiTPO: {\n aliases: { 'iu/ml': 'IU/mL', 'ui/ml': 'IU/mL' },\n canonicalUcum: '[iU]/mL',\n canonicalUnit: 'IU/mL',\n siUcum: '[iU]/mL',\n siUnit: 'IU/mL',\n },\n AoA1: {\n aliases: { 'mg/dl': 'mg/dL' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n siUcum: 'mg/dL',\n siUnit: 'mg/dL',\n },\n AorticValveCalcium: { aliases: CAC_ALIASES, ...CAC },\n ApoB: {\n aliases: { 'mg/dl': 'mg/dL' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n siUcum: 'mg/dL',\n siUnit: 'mg/dL',\n },\n AST: { aliases: ENZYME_ALIASES, ...ENZYME },\n Basophils: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Basophils_Abs: { aliases: CBC_DIFF_ALIASES, ...CBC_DIFF },\n BilirubinDirect: {\n aliases: { 'mg/dl': 'mg/dL', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 584.66,\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n BilirubinIndirect: {\n aliases: { 'mg/dl': 'mg/dL', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 584.66,\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n BilirubinTotal: {\n aliases: { 'mg/dl': 'mg/dL', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 584.66,\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n BMC: { aliases: DEXA_KG_ALIASES, ...DEXA_KG },\n BMI: {\n aliases: { 'kg/m2': 'kg/m²', 'kg/m²': 'kg/m²' },\n canonicalUcum: 'kg/m2',\n canonicalUnit: 'kg/m²',\n siUcum: 'kg/m2',\n siUnit: 'kg/m²',\n },\n BNP: {\n aliases: { 'pg/ml': 'pg/mL' },\n canonicalUcum: 'pg/mL',\n canonicalUnit: 'pg/mL',\n siUcum: 'pg/mL',\n siUnit: 'pg/mL',\n },\n // O BUN em mmol/L é expresso como ureia: cada molécula de ureia tem dois\n // nitrogênios, então a massa que entra na conversão é a de N2 (2 × 14,007),\n // e não a da ureia (60,06) usada em `Urea`. 14 mg/dL de BUN ≈ 5 mmol/L.\n BUN: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 28.0134,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n CA125: {\n aliases: { 'u/ml': 'U/mL' },\n canonicalUcum: 'U/mL',\n canonicalUnit: 'U/mL',\n siUcum: 'U/mL',\n siUnit: 'U/mL',\n },\n CAC_LAD: { aliases: CAC_ALIASES, ...CAC },\n CAC_LCX: { aliases: CAC_ALIASES, ...CAC },\n CAC_LMA: { aliases: CAC_ALIASES, ...CAC },\n CAC_RCA: { aliases: CAC_ALIASES, ...CAC },\n Calcium: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 40.08,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n CEA: {\n aliases: { 'ng/ml': 'ng/mL' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ng/mL',\n siUnit: 'ng/mL',\n },\n Chloride: { aliases: ELECTROLYTE_MONO_ALIASES, ...ELECTROLYTE_MONO },\n Cholesterol: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 386.65,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n CK: { aliases: ENZYME_ALIASES, ...ENZYME },\n CO2: { aliases: ELECTROLYTE_MONO_ALIASES, ...ELECTROLYTE_MONO },\n Cortisol: {\n aliases: { 'mcg/dl': 'µg/dL', 'nmol/l': 'nmol/L', 'ug/dl': 'µg/dL', 'µg/dl': 'µg/dL' },\n canonicalUcum: 'ug/dL',\n canonicalUnit: 'µg/dL',\n molecularWeight: 362.46,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n Creatinine: {\n aliases: { 'mg/dl': 'mg/dL', 'umol/l': 'µmol/L', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 113.12,\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n CRP: {\n aliases: { 'mg/dl': 'mg/dL', 'mg/l': 'mg/L' },\n canonicalUcum: 'mg/L',\n canonicalUnit: 'mg/L',\n siUcum: 'mg/L',\n siUnit: 'mg/L',\n },\n DHEAS: {\n aliases: { 'mcg/dl': 'µg/dL', 'ug/dl': 'µg/dL', 'µg/dl': 'µg/dL', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'ug/dL',\n canonicalUnit: 'µg/dL',\n molecularWeight: 368.49,\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n DHT: {\n aliases: { 'ng/dl': 'ng/dL', 'nmol/l': 'nmol/L' },\n canonicalUcum: 'ng/dL',\n canonicalUnit: 'ng/dL',\n molecularWeight: 290.44,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n eGFR: {\n aliases: {\n 'ml/min/1,73 m2': 'mL/min/1.73m²',\n 'ml/min/1.73m2': 'mL/min/1.73m²',\n 'ml/min/1.73m²': 'mL/min/1.73m²',\n },\n canonicalUcum: 'mL/min/{1.73_m2}',\n canonicalUnit: 'mL/min/1.73m²',\n siUcum: 'mL/min/{1.73_m2}',\n siUnit: 'mL/min/1.73m²',\n },\n Eosinophils: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Eosinophils_Abs: { aliases: CBC_DIFF_ALIASES, ...CBC_DIFF },\n EPADPADHA: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n ESR: {\n aliases: { 'mm/h': 'mm/h', 'mm/hr': 'mm/h' },\n canonicalUcum: 'mm/h',\n canonicalUnit: 'mm/h',\n siUcum: 'mm/h',\n siUnit: 'mm/h',\n },\n Estradiol: {\n aliases: { 'ng/dl': 'ng/dL', 'pg/ml': 'pg/mL' },\n canonicalUcum: 'pg/mL',\n canonicalUnit: 'pg/mL',\n molecularWeight: 272.38,\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n FatFreeMass: { aliases: DEXA_KG_ALIASES, ...DEXA_KG },\n FatMass: { aliases: DEXA_KG_ALIASES, ...DEXA_KG },\n Ferritin: {\n aliases: {\n 'mcg/l': 'ng/mL',\n 'microg/l': 'ng/mL',\n 'ng/ml': 'ng/mL',\n 'µg/l': 'ng/mL',\n },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ug/L',\n siUnit: 'µg/L',\n },\n Folate: {\n aliases: { 'ng/ml': 'ng/mL', 'nmol/l': 'nmol/L' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n molecularWeight: 441.4,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n FSH: {\n aliases: {\n 'iu/l': 'mIU/mL',\n 'miu/ml': 'mIU/mL',\n 'ui/l': 'mIU/mL',\n },\n canonicalUcum: 'm[iU]/mL',\n canonicalUnit: 'mIU/mL',\n siUcum: '[iU]/L',\n siUnit: 'IU/L',\n },\n GGT: { aliases: ENZYME_ALIASES, ...ENZYME },\n Globulin: {\n aliases: { 'g/dl': 'g/dL', 'g/l': 'g/L' },\n canonicalUcum: 'g/dL',\n canonicalUnit: 'g/dL',\n siUcum: 'g/L',\n siUnit: 'g/L',\n },\n Glucose: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 180.156,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n HbA1c: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Hct: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n HDL: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 386.65,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n HDL_Large: { aliases: NMOL_L_ALIASES, ...NMOL_L },\n Hgb: {\n aliases: { 'g/dl': 'g/dL', 'g/l': 'g/L' },\n canonicalUcum: 'g/dL',\n canonicalUnit: 'g/dL',\n siUcum: 'g/L',\n siUnit: 'g/L',\n },\n Homocysteine: {\n aliases: { 'umol/l': 'µmol/L', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'umol/L',\n canonicalUnit: 'µmol/L',\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n // Imunoglobulinas: canônica em mg/dL, a unidade da faixa de referência\n // (Tietz) e a que laboratórios brasileiros e americanos imprimem. g/L fica\n // como unidade SI; a conversão é exata (g/L × 100 = mg/dL, em FIXED_FACTORS).\n IgA: {\n aliases: { 'g/l': 'g/L', 'mg/dl': 'mg/dL' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n siUcum: 'g/L',\n siUnit: 'g/L',\n },\n IgG: {\n aliases: { 'g/l': 'g/L', 'mg/dl': 'mg/dL' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n siUcum: 'g/L',\n siUnit: 'g/L',\n },\n INR: {\n aliases: { '{ratio}': '{ratio}' },\n canonicalUcum: '{ratio}',\n canonicalUnit: '{ratio}',\n siUcum: '{ratio}',\n siUnit: '{ratio}',\n },\n Insulin: {\n aliases: {\n 'mu/l': 'uIU/mL',\n 'uiu/ml': 'uIU/mL',\n 'µu/ml': 'uIU/mL',\n 'µui/ml': 'uIU/mL',\n },\n canonicalUcum: 'u[iU]/mL',\n canonicalUnit: 'uIU/mL',\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n Iron: {\n aliases: {\n 'mcg/dl': 'mcg/dL',\n 'microg/dl': 'mcg/dL',\n 'ug/dl': 'mcg/dL',\n 'µg/dl': 'mcg/dL',\n },\n canonicalUcum: 'ug/dL',\n canonicalUnit: 'mcg/dL',\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n LDL: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 386.65,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n LDL_Medium: { aliases: NMOL_L_ALIASES, ...NMOL_L },\n LDL_ParticleNumber: { aliases: NMOL_L_ALIASES, ...NMOL_L },\n LDL_Peak_Size: {\n aliases: { å: 'Ao', angstrom: 'Ao', ao: 'Ao', nm: 'nm' },\n canonicalUcum: 'Ao',\n canonicalUnit: 'Angstrom',\n siUcum: 'nm',\n siUnit: 'nm',\n },\n LDL_Small: { aliases: NMOL_L_ALIASES, ...NMOL_L },\n Lead: {\n aliases: { 'mcg/dl': 'µg/dL', 'ug/dl': 'µg/dL', 'µg/dl': 'µg/dL', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'ug/dL',\n canonicalUnit: 'µg/dL',\n molecularWeight: 207.2,\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n LeanMass: { aliases: DEXA_KG_ALIASES, ...DEXA_KG },\n Leptin: {\n aliases: { 'ng/ml': 'ng/mL' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ng/mL',\n siUnit: 'ng/mL',\n },\n Leukocytes_Urine: { aliases: URINE_SEDIMENT_ALIASES, ...URINE_SEDIMENT },\n LH: {\n aliases: {\n 'iu/l': 'mIU/mL',\n 'miu/ml': 'mIU/mL',\n 'ui/l': 'mIU/mL',\n },\n canonicalUcum: 'm[iU]/mL',\n canonicalUnit: 'mIU/mL',\n siUcum: '[iU]/L',\n siUnit: 'IU/L',\n },\n Lipase: { aliases: ENZYME_ALIASES, ...ENZYME },\n Lipoprotein_a: {\n aliases: { 'mg/dl': 'mg/dL', 'nmol/l': 'nmol/L' },\n canonicalUcum: 'nmol/L',\n canonicalUnit: 'nmol/L',\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n Lymphocytes: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Lymphocytes_Abs: { aliases: CBC_DIFF_ALIASES, ...CBC_DIFF },\n MCH: {\n aliases: { pg: 'pg' },\n canonicalUcum: 'pg',\n canonicalUnit: 'pg',\n siUcum: 'pg',\n siUnit: 'pg',\n },\n MCHC: {\n aliases: { 'g/dl': 'g/dL', 'g/l': 'g/L' },\n canonicalUcum: 'g/dL',\n canonicalUnit: 'g/dL',\n siUcum: 'g/L',\n siUnit: 'g/L',\n },\n MCV: {\n aliases: { fl: 'fL' },\n canonicalUcum: 'fL',\n canonicalUnit: 'fL',\n siUcum: 'fL',\n siUnit: 'fL',\n },\n Mercury: {\n aliases: { 'mcg/l': 'µg/L', 'nmol/l': 'nmol/L', 'ug/l': 'µg/L', 'µg/l': 'µg/L' },\n canonicalUcum: 'ug/L',\n canonicalUnit: 'µg/L',\n molecularWeight: 200.59,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n Microalbumin_Urine: {\n aliases: { 'mg/l': 'mg/L' },\n canonicalUcum: 'mg/L',\n canonicalUnit: 'mg/L',\n siUcum: 'mg/L',\n siUnit: 'mg/L',\n },\n MMA: { aliases: NMOL_L_ALIASES, ...NMOL_L },\n Monocytes: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Monocytes_Abs: { aliases: CBC_DIFF_ALIASES, ...CBC_DIFF },\n MPV: {\n aliases: { fl: 'fL' },\n canonicalUcum: 'fL',\n canonicalUnit: 'fL',\n siUcum: 'fL',\n siUnit: 'fL',\n },\n Myeloperoxidase: {\n aliases: { 'pmol/l': 'pmol/L' },\n canonicalUcum: 'pmol/L',\n canonicalUnit: 'pmol/L',\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n Neutrophils: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Neutrophils_Abs: { aliases: CBC_DIFF_ALIASES, ...CBC_DIFF },\n // MW 386.65 = colesterol livre. Frações lipoproteicas são heterogêneas,\n // mas a conversão mg/dL→mmol/L usa MW do colesterol por convenção clínica.\n NonHDL_Cholesterol: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 386.65,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n NTproBNP: {\n aliases: { 'pg/ml': 'pg/mL' },\n canonicalUcum: 'pg/mL',\n canonicalUnit: 'pg/mL',\n siUcum: 'pg/mL',\n siUnit: 'pg/mL',\n },\n Omega3_DHA: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Omega3_DPA: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Omega3_EPA: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Omega3_Total: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Omega6_AA: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Omega6_LA: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Omega6_Total: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Platelets: { aliases: CBC_DIFF_ALIASES, ...CBC_DIFF },\n Potassium: { aliases: ELECTROLYTE_MONO_ALIASES, ...ELECTROLYTE_MONO },\n Progesterone: {\n aliases: { 'ng/ml': 'ng/mL', 'nmol/l': 'nmol/L' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n molecularWeight: 314.46,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n Prolactin: {\n aliases: {\n 'microg/l': 'ng/mL',\n 'ng/ml': 'ng/mL',\n 'µg/l': 'ng/mL',\n },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ug/L',\n siUnit: 'µg/L',\n },\n ProthrombinTime: {\n aliases: { s: 's', sec: 's' },\n canonicalUcum: 's',\n canonicalUnit: 's',\n siUcum: 's',\n siUnit: 's',\n },\n PSA: {\n aliases: { 'ng/ml': 'ng/mL' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ng/mL',\n siUnit: 'ng/mL',\n },\n PSA_Free: {\n aliases: { 'ng/ml': 'ng/mL' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ng/mL',\n siUnit: 'ng/mL',\n },\n RBC: {\n aliases: {\n '/ul': '/uL',\n '/µl': '/uL',\n '10*6/ul': 'M/uL',\n 'cells/ul': '/uL',\n 'm/ul': 'M/uL',\n 'milhões/mm3': 'M/uL',\n 'milhões/mm³': 'M/uL',\n 'x10e6/ul': 'M/uL',\n },\n canonicalUcum: '10*6/uL',\n canonicalUnit: 'M/uL',\n siUcum: '10*6/uL',\n siUnit: 'M/uL',\n },\n RBC_Urine: { aliases: URINE_SEDIMENT_ALIASES, ...URINE_SEDIMENT },\n RDW: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n Reticulocytes: { aliases: PERCENTAGE_ALIASES, ...PERCENTAGE },\n RheumatoidFactor: {\n aliases: { 'iu/ml': 'IU/mL', 'ui/ml': 'IU/mL' },\n canonicalUcum: '[iU]/mL',\n canonicalUnit: 'IU/mL',\n siUcum: '[iU]/mL',\n siUnit: 'IU/mL',\n },\n SHBG: { aliases: NMOL_L_ALIASES, ...NMOL_L },\n Sodium: { aliases: ELECTROLYTE_MONO_ALIASES, ...ELECTROLYTE_MONO },\n T3Free: {\n aliases: { 'pg/ml': 'pg/mL', 'pmol/l': 'pmol/L' },\n canonicalUcum: 'pg/mL',\n canonicalUnit: 'pg/mL',\n molecularWeight: 650.98,\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n T3Total: {\n aliases: { 'ng/dl': 'ng/dL', 'nmol/l': 'nmol/L' },\n canonicalUcum: 'ng/dL',\n canonicalUnit: 'ng/dL',\n molecularWeight: 650.98,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n T4Free: {\n aliases: { 'ng/dl': 'ng/dL', 'pmol/l': 'pmol/L' },\n canonicalUcum: 'ng/dL',\n canonicalUnit: 'ng/dL',\n molecularWeight: 776.87,\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n T4Total: {\n aliases: { 'mcg/dl': 'µg/dL', 'nmol/l': 'nmol/L', 'ug/dl': 'µg/dL', 'µg/dl': 'µg/dL' },\n canonicalUcum: 'ug/dL',\n canonicalUnit: 'µg/dL',\n molecularWeight: 776.87,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n Testosterone: {\n aliases: { 'ng/dl': 'ng/dL', 'nmol/l': 'nmol/L' },\n canonicalUcum: 'ng/dL',\n canonicalUnit: 'ng/dL',\n molecularWeight: 288.42,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n TestosteroneFree: {\n aliases: { 'pg/ml': 'pg/mL', 'pmol/l': 'pmol/L' },\n canonicalUcum: 'pg/mL',\n canonicalUnit: 'pg/mL',\n molecularWeight: 288.42,\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n TIBC: {\n aliases: {\n 'mcg/dl': 'mcg/dL',\n 'microg/dl': 'mcg/dL',\n 'ug/dl': 'mcg/dL',\n 'µg/dl': 'mcg/dL',\n },\n canonicalUcum: 'ug/dL',\n canonicalUnit: 'mcg/dL',\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n TotalMass: { aliases: DEXA_KG_ALIASES, ...DEXA_KG },\n TotalProtein: {\n aliases: { 'g/dl': 'g/dL', 'g/l': 'g/L' },\n canonicalUcum: 'g/dL',\n canonicalUnit: 'g/dL',\n siUcum: 'g/L',\n siUnit: 'g/L',\n },\n Triglycerides: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 885.4,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n TroponinI: {\n aliases: { 'ng/ml': 'ng/mL' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n siUcum: 'ng/mL',\n siUnit: 'ng/mL',\n },\n // Troponina T: canônica em ng/L (hs-cTnT). O ensaio convencional imprime em\n // ng/mL, que é a mesma grandeza que µg/L; converte por fator exato\n // (ng/mL × 1000 = ng/L, em FIXED_FACTORS). pg/mL é a mesma unidade que ng/L\n // e entra como alias, como em VitaminB12.\n TroponinT: {\n aliases: {\n 'mcg/l': 'ng/mL',\n 'microg/l': 'ng/mL',\n 'ng/l': 'ng/L',\n 'ng/ml': 'ng/mL',\n 'pg/ml': 'ng/L',\n 'ug/l': 'ng/mL',\n 'µg/l': 'ng/mL',\n },\n canonicalUcum: 'ng/L',\n canonicalUnit: 'ng/L',\n siUcum: 'ng/L',\n siUnit: 'ng/L',\n },\n TSH: {\n aliases: {\n 'miu/l': 'uIU/mL',\n 'mui/l': 'uIU/mL',\n 'uiu/ml': 'uIU/mL',\n 'µui/ml': 'uIU/mL',\n },\n canonicalUcum: 'u[iU]/mL',\n canonicalUnit: 'uIU/mL',\n siUcum: 'm[iU]/L',\n siUnit: 'mIU/L',\n },\n Urea: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 60.06,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n UricAcid: {\n aliases: { 'mg/dl': 'mg/dL', 'µmol/l': 'µmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 168.11,\n siUcum: 'umol/L',\n siUnit: 'µmol/L',\n },\n VATMass: { aliases: DEXA_KG_ALIASES, ...DEXA_KG },\n VATVolume: {\n aliases: { cm3: 'cm3', 'cm³': 'cm3', in3: '[in_i]3', 'in³': '[in_i]3' },\n canonicalUcum: 'cm3',\n canonicalUnit: 'cm³',\n siUcum: 'cm3',\n siUnit: 'cm³',\n },\n VitaminB12: {\n aliases: { 'ng/l': 'pg/mL', 'pg/ml': 'pg/mL' },\n canonicalUcum: 'pg/mL',\n canonicalUnit: 'pg/mL',\n siUcum: 'pmol/L',\n siUnit: 'pmol/L',\n },\n VitaminD: {\n aliases: { 'ng/ml': 'ng/mL', 'nmol/l': 'nmol/L' },\n canonicalUcum: 'ng/mL',\n canonicalUnit: 'ng/mL',\n molecularWeight: 384.64,\n siUcum: 'nmol/L',\n siUnit: 'nmol/L',\n },\n VLDL: {\n aliases: { 'mg/dl': 'mg/dL', 'mmol/l': 'mmol/L' },\n canonicalUcum: 'mg/dL',\n canonicalUnit: 'mg/dL',\n molecularWeight: 386.65,\n siUcum: 'mmol/L',\n siUnit: 'mmol/L',\n },\n WBC: { aliases: CBC_DIFF_ALIASES, ...CBC_DIFF },\n};\n\n/**\n * Get the canonical unit for a biomarker code.\n */\nexport function getCanonicalUnit(code: string): string | null {\n return BIOMARKER_UNITS[code]?.canonicalUnit ?? null;\n}\n\n/**\n * Get the SI unit for a biomarker code.\n */\nexport function getSIUnit(code: string): string | null {\n return BIOMARKER_UNITS[code]?.siUnit ?? null;\n}\n\n// ─── Unit Conversion ────────────────────────────────────────────────────────────\n\n/**\n * Normalize a unit string to its canonical display form for a given biomarker.\n * Returns the input unchanged if no alias is found.\n */\nfunction normalizeUnit(unit: string, config: BiomarkerUnitConfig): string {\n return config.aliases[unit.toLowerCase()] ?? config.aliases[unit] ?? unit;\n}\n\n/**\n * Conversion factor tables for unit pairs that don't require molecular weight.\n * Key format: \"fromUnit -> toUnit\" (using canonical display forms).\n * Both directions must be listed explicitly — there is no auto-inversion.\n */\nconst FIXED_FACTORS: Record<string, number> = {\n 'g/dL -> g/L': 10,\n 'g/L -> g/dL': 0.1,\n 'g/L -> mg/dL': 100,\n 'mEq/L -> mmol/L': 1,\n 'mg/dL -> g/L': 0.01,\n 'mmol/L -> mEq/L': 1,\n 'ng/dL -> pg/mL': 10,\n 'ng/L -> ng/mL': 0.001,\n 'ng/mL -> ng/L': 1000,\n 'ng/mL -> µg/L': 1,\n 'pg/mL -> ng/dL': 0.1,\n 'µg/L -> ng/mL': 1,\n};\n\n/**\n * MW-based conversion definitions.\n * Each entry maps a (fromUnit, toUnit) pair to the formula:\n * result = value × numerator / (MW × denominator)\n *\n * Common patterns:\n * mg/dL → mmol/L: value × 10 / MW\n * mg/dL → µmol/L: value × 10000 / MW (or equivalently × 10 / MW × 1000)\n * ng/mL → nmol/L: value × 1000 / MW\n * pg/mL → pmol/L: value × 1000 / MW\n * ng/dL → nmol/L: value × 10 / MW\n */\n/**\n * MW conversion entries. Each direction is explicit to avoid fragile inversion logic.\n * Formula: result = value × scale / MW (when divideByMW is true)\n * result = value × MW / scale (when divideByMW is false)\n */\ninterface MWConversion {\n divideByMW: boolean;\n scale: number;\n}\n\nconst MW_CONVERSIONS: Record<string, MWConversion> = {\n 'mg/dL -> mmol/L': { divideByMW: true, scale: 10 },\n 'mg/dL -> µmol/L': { divideByMW: true, scale: 10_000 },\n 'mmol/L -> mg/dL': { divideByMW: false, scale: 10 },\n 'ng/dL -> nmol/L': { divideByMW: true, scale: 10 },\n 'ng/dL -> pmol/L': { divideByMW: true, scale: 10_000 },\n 'ng/mL -> nmol/L': { divideByMW: true, scale: 1000 },\n 'ng/mL -> pmol/L': { divideByMW: true, scale: 1_000_000 },\n 'nmol/L -> ng/dL': { divideByMW: false, scale: 10 },\n 'nmol/L -> ng/mL': { divideByMW: false, scale: 1000 },\n 'nmol/L -> µg/dL': { divideByMW: false, scale: 10_000 },\n 'nmol/L -> µg/L': { divideByMW: false, scale: 1000 },\n 'pg/mL -> pmol/L': { divideByMW: true, scale: 1000 },\n 'pmol/L -> ng/dL': { divideByMW: false, scale: 10_000 },\n 'pmol/L -> ng/mL': { divideByMW: false, scale: 1_000_000 },\n 'pmol/L -> pg/mL': { divideByMW: false, scale: 1000 },\n 'µg/dL -> nmol/L': { divideByMW: true, scale: 10_000 },\n 'µg/dL -> µmol/L': { divideByMW: true, scale: 10 },\n 'µg/L -> nmol/L': { divideByMW: true, scale: 1000 },\n 'µmol/L -> mg/dL': { divideByMW: false, scale: 10_000 },\n 'µmol/L -> µg/dL': { divideByMW: false, scale: 10 },\n};\n\nexport interface ConversionResult {\n unit: string;\n value: number;\n}\n\n/**\n * Convert a biomarker value between units.\n *\n * Supports:\n * - Fixed-factor conversions (e.g. ng/dL ↔ pg/mL, g/dL ↔ g/L)\n * - Molecular-weight-based conversions (e.g. mg/dL ↔ mmol/L, pg/mL ↔ pmol/L)\n *\n * @returns The converted value and target unit, or null if conversion is not possible.\n */\nexport function convertUnit(\n value: number,\n fromUnit: string,\n toUnit: string,\n biomarkerCode: string,\n): ConversionResult | null {\n const config = BIOMARKER_UNITS[biomarkerCode];\n if (!config) return null;\n\n const normFrom = normalizeUnit(fromUnit, config);\n const normTo = normalizeUnit(toUnit, config);\n\n if (normFrom === normTo) {\n return { unit: normTo, value };\n }\n\n const key = `${normFrom} -> ${normTo}`;\n\n const fixedFactor = FIXED_FACTORS[key];\n if (fixedFactor !== undefined) {\n return { unit: normTo, value: value * fixedFactor };\n }\n\n const mwConv = MW_CONVERSIONS[key];\n if (mwConv && config.molecularWeight) {\n const result = mwConv.divideByMW\n ? (value * mwConv.scale) / config.molecularWeight\n : (value * config.molecularWeight) / mwConv.scale;\n return { unit: normTo, value: result };\n }\n\n return null;\n}\n\n/**\n * Código UCUM para a unidade que o laudo imprimiu, ou `undefined`.\n *\n * Ordem: a configuração do biomarcador em `BIOMARKER_UNITS` (que já sabe que\n * `K/uL` de leucócito é `10*3/uL`), depois a tabela `UNIT_TO_UCUM`, e por\n * último a própria string, se for UCUM sintaticamente válido. Fora disso é\n * `undefined`, e o conversor deixa o `Quantity` só com `unit`: unidade que\n * não se sabe traduzir não sai sob `http://unitsofmeasure.org`.\n *\n * Até out/2026 o conversor só consultava a tabela e devolvia a entrada\n * intacta quando não achava, então `uIU/mL`, `K/uL` e `razão` saíam como\n * código UCUM, e os 85 `canonicalUcum` de `BIOMARKER_UNITS` não eram lidos\n * por ninguém fora de `units.ts`.\n */\nexport function resolveUcum(unit: string, biomarkerCode?: string): string | undefined {\n if (!unit) return undefined;\n const config = biomarkerCode ? BIOMARKER_UNITS[biomarkerCode] : undefined;\n if (config) {\n const normalized = normalizeUnit(unit, config);\n if (normalized === config.canonicalUnit) return config.canonicalUcum;\n if (normalized === config.siUnit) return config.siUcum;\n }\n const mapped = UNIT_TO_UCUM[unit];\n if (mapped) return mapped;\n return isUcumCode(unit) ? unit : undefined;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkNUFN24W4cjs = require('./chunk-NUFN24W4.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ var _chunkOR67NJDZcjs = require('./chunk-OR67NJDZ.cjs');
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
15
|
+
var _chunkVMID6CDCcjs = require('./chunk-VMID6CDC.cjs');
|
|
16
16
|
|
|
17
17
|
// src/importer.ts
|
|
18
18
|
var MAX_OBSERVATIONS = 5e3;
|
|
@@ -34,11 +34,11 @@ function resolveBiomarkerCode(observation) {
|
|
|
34
34
|
} else {
|
|
35
35
|
reason = "No code found in observation coding";
|
|
36
36
|
}
|
|
37
|
-
const fromLoinc = loincCode ?
|
|
37
|
+
const fromLoinc = loincCode ? _chunkVMID6CDCcjs.loincToCode.call(void 0, loincCode) : void 0;
|
|
38
38
|
if (fromLoinc) return { internalCode: fromLoinc, loincCode, reason };
|
|
39
|
-
if (declaredCode &&
|
|
40
|
-
const canonical =
|
|
41
|
-
return { internalCode: canonical, loincCode:
|
|
39
|
+
if (declaredCode && _chunkVMID6CDCcjs.isValidCode.call(void 0, declaredCode)) {
|
|
40
|
+
const canonical = _chunkVMID6CDCcjs.normalizeCode.call(void 0, declaredCode);
|
|
41
|
+
return { internalCode: canonical, loincCode: _chunkVMID6CDCcjs.codeToLoinc.call(void 0, canonical), reason };
|
|
42
42
|
}
|
|
43
43
|
return { loincCode, reason };
|
|
44
44
|
}
|
|
@@ -75,7 +75,7 @@ function mapFHIRObservationToInternal(observation, index) {
|
|
|
75
75
|
skipped: { index, loincCode, reason, resourceType: "Observation" }
|
|
76
76
|
};
|
|
77
77
|
}
|
|
78
|
-
const definition =
|
|
78
|
+
const definition = _chunkVMID6CDCcjs.getDefinitionByCode.call(void 0, internalCode);
|
|
79
79
|
let value;
|
|
80
80
|
let unit = "";
|
|
81
81
|
let isQualitative = false;
|
|
@@ -125,7 +125,7 @@ function mapFHIRObservationToInternal(observation, index) {
|
|
|
125
125
|
flag: extractFlag(observation),
|
|
126
126
|
isQualitative,
|
|
127
127
|
loincCode,
|
|
128
|
-
...loincCode &&
|
|
128
|
+
...loincCode && _chunkVMID6CDCcjs.methodVariantOf.call(void 0, internalCode, loincCode) && { methodLoinc: loincCode },
|
|
129
129
|
...referenceKind && { referenceKind },
|
|
130
130
|
referenceMax,
|
|
131
131
|
referenceMin,
|
|
@@ -135,7 +135,7 @@ function mapFHIRObservationToInternal(observation, index) {
|
|
|
135
135
|
return { observation: imported };
|
|
136
136
|
}
|
|
137
137
|
function processImportBundle(data) {
|
|
138
|
-
const validationErrors =
|
|
138
|
+
const validationErrors = _chunkNUFN24W4cjs.validateFHIRImportBundle.call(void 0, data);
|
|
139
139
|
if (validationErrors.length > 0) {
|
|
140
140
|
return {
|
|
141
141
|
errors: validationErrors,
|
|
@@ -171,4 +171,4 @@ function processImportBundle(data) {
|
|
|
171
171
|
|
|
172
172
|
|
|
173
173
|
exports.MAX_OBSERVATIONS = MAX_OBSERVATIONS; exports.MAX_FILE_SIZE = MAX_FILE_SIZE; exports.extractObservationsFromBundle = extractObservationsFromBundle; exports.mapFHIRObservationToInternal = mapFHIRObservationToInternal; exports.processImportBundle = processImportBundle;
|
|
174
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-LUGMRMWY.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-AJUDODBT.cjs","../src/importer.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-AJUDODBT.cjs","sourcesContent":[null,"/**\n * FHIR Importer\n *\n * Parses FHIR R4 Bundles and extracts Observation resources with known LOINC codes,\n * mapping them to internal biomarker codes for storage as lab results.\n */\n\nimport {\n codeToLoinc,\n getDefinitionByCode,\n isValidCode,\n loincToCode,\n methodVariantOf,\n normalizeCode,\n} from './biomarkers';\nimport { BIOMARKER_CODE_SYSTEM, LOINC_SYSTEM } from './code-systems';\nimport type { FHIRBundle, FHIRObservation } from './fhir-types';\nimport { validateFHIRImportBundle } from './validators';\n\nexport interface ImportedObservation {\n biomarkerCode: string;\n biomarkerName: string;\n collectionDate: string;\n flag: 'H' | 'L' | '';\n isQualitative: boolean;\n /** Ausente nos biomarcadores sem LOINC publicado, como composição corporal. */\n loincCode?: string;\n /** O `loincCode` quando ele é uma das variantes por método do biomarcador. */\n methodLoinc?: string;\n /** Lido do `referenceRange.type`, quando o Bundle o traz. */\n referenceKind?: 'decision-threshold' | 'reference-interval';\n referenceMax?: number;\n referenceMin?: number;\n unit: string;\n value: number | string;\n}\n\nexport interface SkippedEntry {\n index: number;\n loincCode?: string;\n reason: string;\n resourceType?: string;\n}\n\nexport interface ImportError {\n details: string;\n field: string;\n}\n\nexport interface FHIRImportResult {\n errors: ImportError[];\n imported: ImportedObservation[];\n skipped: SkippedEntry[];\n totalProcessed: number;\n}\n\n/**\n * Limites de importação.\n *\n * Uma Observation exportada ocupa cerca de 1,25KB em JSON compacto e 2,75KB\n * quando o arquivo vem indentado, medido sobre um histórico real de 998\n * Observations em 61 laudos. Nesse tamanho, 5000 Observations dão 6,0MB\n * compactos ou 13,1MB indentados, e por isso o teto de arquivo é 15MB: cobre\n * as duas formas com folga.\n *\n * Na densidade desse mesmo histórico (16 Observations por laudo), 5000\n * equivalem a cerca de 300 laudos.\n */\nconst MAX_OBSERVATIONS = 5000;\nconst MAX_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\n/**\n * Resolve o código interno do biomarcador a partir do `code.coding`.\n *\n * LOINC primeiro, que é o vocabulário que arquivos de terceiros usam. Quando\n * não resolve, cai para o coding de códigos internos, presente nos arquivos\n * exportados pela própria plataforma.\n *\n * O fallback cobre dois casos: biomarcadores sem LOINC publicado (composição\n * corporal, densidade óssea, escore de cálcio) e arquivos antigos, exportados\n * quando esses biomarcadores saíam com o placeholder `99999-9`, que não\n * resolve para nada.\n */\nfunction resolveBiomarkerCode(observation: FHIRObservation): {\n internalCode?: string;\n loincCode?: string;\n reason: string;\n} {\n const coding = observation.code?.coding ?? [];\n const loincCode = coding.find((c) => c.system === LOINC_SYSTEM)?.code;\n const declaredCode = coding.find((c) => c.system === BIOMARKER_CODE_SYSTEM)?.code;\n\n const seenCodes = [\n ...(loincCode ? [`LOINC ${loincCode}`] : []),\n ...(declaredCode ? [`biomarker code ${declaredCode}`] : []),\n ];\n\n // Três motivos distintos de descarte, que antes se confundiam num só. Sem\n // essa separação, um arquivo em SNOMED relatava \"nenhum código encontrado\",\n // sugerindo `coding` vazio quando na verdade o código existia e estava num\n // system que não tratamos. Para importação de terceiros, é a diferença entre\n // um diagnóstico acionável e um enigma.\n let reason: string;\n if (seenCodes.length > 0) {\n reason = `Unknown code: ${seenCodes.join(', ')}`;\n } else if (coding.length > 0) {\n const systems = [...new Set(coding.map((c) => c.system ?? '(sem system)'))];\n reason = `No code in a supported system (found: ${systems.join(', ')})`;\n } else {\n reason = 'No code found in observation coding';\n }\n\n const fromLoinc = loincCode ? loincToCode(loincCode) : undefined;\n if (fromLoinc) return { internalCode: fromLoinc, loincCode, reason };\n\n if (declaredCode && isValidCode(declaredCode)) {\n // `isValidCode` aceita alias, mas alias não serve como código armazenado:\n // 49 definições têm um, e tanto `codeToLoinc` quanto as faixas de\n // referência são indexadas só pelo canônico. Sem normalizar, `VLDL_Cholesterol`\n // entraria no lugar de `VLDL` e perderia o LOINC 13458-5 que ele tem.\n // Importar um Bundle é fronteira de dados, que é onde `normalizeCode` deve\n // ser aplicado.\n const canonical = normalizeCode(declaredCode);\n\n // `codeToLoinc` devolve undefined para quem não tem LOINC, que é o caso\n // esperado aqui. O campo fica de fora em vez de receber um valor inventado.\n return { internalCode: canonical, loincCode: codeToLoinc(canonical), reason };\n }\n\n return { loincCode, reason };\n}\n\n/**\n * Extract interpretation flag from Observation\n */\nfunction extractFlag(observation: FHIRObservation): 'H' | 'L' | '' {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n if (code === 'H' || code === 'HH') return 'H';\n if (code === 'L' || code === 'LL') return 'L';\n return '';\n}\n\n/**\n * Extract Observation resources from a FHIR Bundle\n */\nexport function extractObservationsFromBundle(bundle: FHIRBundle): {\n observations: FHIRObservation[];\n skipped: SkippedEntry[];\n} {\n const observations: FHIRObservation[] = [];\n const skipped: SkippedEntry[] = [];\n\n for (let i = 0; i < bundle.entry.length; i++) {\n const entry = bundle.entry[i]!;\n if (!entry.resource) {\n skipped.push({ index: i, reason: 'Entry has no resource' });\n continue;\n }\n\n if (entry.resource.resourceType !== 'Observation') {\n // Non-observation resources are silently skipped (Patient, DiagnosticReport, etc.)\n continue;\n }\n\n if (observations.length >= MAX_OBSERVATIONS) {\n skipped.push({ index: i, reason: `Maximum of ${MAX_OBSERVATIONS} observations exceeded` });\n continue;\n }\n\n observations.push(entry.resource as FHIRObservation);\n }\n\n return { observations, skipped };\n}\n\n/**\n * Map a FHIR Observation to internal format using LOINC→biomarker code lookup\n */\nexport function mapFHIRObservationToInternal(\n observation: FHIRObservation,\n index: number,\n): { observation: ImportedObservation } | { skipped: SkippedEntry } {\n const { internalCode, loincCode, reason } = resolveBiomarkerCode(observation);\n\n if (!internalCode) {\n return {\n skipped: { index, loincCode, reason, resourceType: 'Observation' },\n };\n }\n\n const definition = getDefinitionByCode(internalCode);\n\n // Extract value\n let value: number | string;\n let unit = '';\n let isQualitative = false;\n\n if (observation.valueQuantity?.value !== undefined) {\n value = observation.valueQuantity.value;\n unit = observation.valueQuantity.unit || observation.valueQuantity.code || '';\n } else if (observation.valueString) {\n value = observation.valueString;\n isQualitative = true;\n } else {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no value (valueQuantity or valueString)',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract collection date (effectiveDateTime or effectivePeriod.start)\n const collectionDate = observation.effectiveDateTime || observation.effectivePeriod?.start || '';\n if (!collectionDate) {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no effectiveDateTime or effectivePeriod.start',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract reference ranges\n let referenceMin: number | undefined;\n let referenceMax: number | undefined;\n let referenceKind: ImportedObservation['referenceKind'];\n if (observation.referenceRange?.[0]) {\n referenceMin = observation.referenceRange[0].low?.value;\n referenceMax = observation.referenceRange[0].high?.value;\n const meaning = observation.referenceRange[0].type?.coding?.find(\n (c) => c.system === 'http://terminology.hl7.org/CodeSystem/referencerange-meaning',\n )?.code;\n if (meaning === 'normal') referenceKind = 'reference-interval';\n else if (meaning === 'recommended') referenceKind = 'decision-threshold';\n }\n\n const imported: ImportedObservation = {\n biomarkerCode: internalCode,\n biomarkerName:\n definition?.names.pt[0] || definition?.names.en[0] || observation.code.text || internalCode,\n collectionDate,\n flag: extractFlag(observation),\n isQualitative,\n loincCode,\n ...(loincCode && methodVariantOf(internalCode, loincCode) && { methodLoinc: loincCode }),\n ...(referenceKind && { referenceKind }),\n referenceMax,\n referenceMin,\n unit: unit || definition?.unit || '',\n value,\n };\n\n return { observation: imported };\n}\n\n/**\n * Process a complete FHIR Bundle for import\n */\nexport function processImportBundle(data: unknown): FHIRImportResult {\n // Structural validation\n const validationErrors = validateFHIRImportBundle(data);\n if (validationErrors.length > 0) {\n return {\n errors: validationErrors,\n imported: [],\n skipped: [],\n totalProcessed: 0,\n };\n }\n\n const bundle = data as FHIRBundle;\n\n // Extract observations\n const { observations, skipped } = extractObservationsFromBundle(bundle);\n\n // Map each observation to internal format\n const imported: ImportedObservation[] = [];\n const allSkipped: SkippedEntry[] = [...skipped];\n\n for (let i = 0; i < observations.length; i++) {\n const result = mapFHIRObservationToInternal(observations[i]!, i);\n\n if ('observation' in result) {\n imported.push(result.observation);\n } else {\n allSkipped.push(result.skipped);\n }\n }\n\n return {\n errors: [],\n imported,\n skipped: allSkipped,\n totalProcessed: observations.length,\n };\n}\n\nexport { MAX_FILE_SIZE, MAX_OBSERVATIONS };\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-LUGMRMWY.cjs","../src/importer.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-LUGMRMWY.cjs","sourcesContent":[null,"/**\n * FHIR Importer\n *\n * Parses FHIR R4 Bundles and extracts Observation resources with known LOINC codes,\n * mapping them to internal biomarker codes for storage as lab results.\n */\n\nimport {\n codeToLoinc,\n getDefinitionByCode,\n isValidCode,\n loincToCode,\n methodVariantOf,\n normalizeCode,\n} from './biomarkers';\nimport { BIOMARKER_CODE_SYSTEM, LOINC_SYSTEM } from './code-systems';\nimport type { FHIRBundle, FHIRObservation } from './fhir-types';\nimport { validateFHIRImportBundle } from './validators';\n\nexport interface ImportedObservation {\n biomarkerCode: string;\n biomarkerName: string;\n collectionDate: string;\n flag: 'H' | 'L' | '';\n isQualitative: boolean;\n /** Ausente nos biomarcadores sem LOINC publicado, como composição corporal. */\n loincCode?: string;\n /** O `loincCode` quando ele é uma das variantes por método do biomarcador. */\n methodLoinc?: string;\n /** Lido do `referenceRange.type`, quando o Bundle o traz. */\n referenceKind?: 'decision-threshold' | 'reference-interval';\n referenceMax?: number;\n referenceMin?: number;\n unit: string;\n value: number | string;\n}\n\nexport interface SkippedEntry {\n index: number;\n loincCode?: string;\n reason: string;\n resourceType?: string;\n}\n\nexport interface ImportError {\n details: string;\n field: string;\n}\n\nexport interface FHIRImportResult {\n errors: ImportError[];\n imported: ImportedObservation[];\n skipped: SkippedEntry[];\n totalProcessed: number;\n}\n\n/**\n * Limites de importação.\n *\n * Uma Observation exportada ocupa cerca de 1,25KB em JSON compacto e 2,75KB\n * quando o arquivo vem indentado, medido sobre um histórico real de 998\n * Observations em 61 laudos. Nesse tamanho, 5000 Observations dão 6,0MB\n * compactos ou 13,1MB indentados, e por isso o teto de arquivo é 15MB: cobre\n * as duas formas com folga.\n *\n * Na densidade desse mesmo histórico (16 Observations por laudo), 5000\n * equivalem a cerca de 300 laudos.\n */\nconst MAX_OBSERVATIONS = 5000;\nconst MAX_FILE_SIZE = 15 * 1024 * 1024; // 15MB\n\n/**\n * Resolve o código interno do biomarcador a partir do `code.coding`.\n *\n * LOINC primeiro, que é o vocabulário que arquivos de terceiros usam. Quando\n * não resolve, cai para o coding de códigos internos, presente nos arquivos\n * exportados pela própria plataforma.\n *\n * O fallback cobre dois casos: biomarcadores sem LOINC publicado (composição\n * corporal, densidade óssea, escore de cálcio) e arquivos antigos, exportados\n * quando esses biomarcadores saíam com o placeholder `99999-9`, que não\n * resolve para nada.\n */\nfunction resolveBiomarkerCode(observation: FHIRObservation): {\n internalCode?: string;\n loincCode?: string;\n reason: string;\n} {\n const coding = observation.code?.coding ?? [];\n const loincCode = coding.find((c) => c.system === LOINC_SYSTEM)?.code;\n const declaredCode = coding.find((c) => c.system === BIOMARKER_CODE_SYSTEM)?.code;\n\n const seenCodes = [\n ...(loincCode ? [`LOINC ${loincCode}`] : []),\n ...(declaredCode ? [`biomarker code ${declaredCode}`] : []),\n ];\n\n // Três motivos distintos de descarte, que antes se confundiam num só. Sem\n // essa separação, um arquivo em SNOMED relatava \"nenhum código encontrado\",\n // sugerindo `coding` vazio quando na verdade o código existia e estava num\n // system que não tratamos. Para importação de terceiros, é a diferença entre\n // um diagnóstico acionável e um enigma.\n let reason: string;\n if (seenCodes.length > 0) {\n reason = `Unknown code: ${seenCodes.join(', ')}`;\n } else if (coding.length > 0) {\n const systems = [...new Set(coding.map((c) => c.system ?? '(sem system)'))];\n reason = `No code in a supported system (found: ${systems.join(', ')})`;\n } else {\n reason = 'No code found in observation coding';\n }\n\n const fromLoinc = loincCode ? loincToCode(loincCode) : undefined;\n if (fromLoinc) return { internalCode: fromLoinc, loincCode, reason };\n\n if (declaredCode && isValidCode(declaredCode)) {\n // `isValidCode` aceita alias, mas alias não serve como código armazenado:\n // 49 definições têm um, e tanto `codeToLoinc` quanto as faixas de\n // referência são indexadas só pelo canônico. Sem normalizar, `VLDL_Cholesterol`\n // entraria no lugar de `VLDL` e perderia o LOINC 13458-5 que ele tem.\n // Importar um Bundle é fronteira de dados, que é onde `normalizeCode` deve\n // ser aplicado.\n const canonical = normalizeCode(declaredCode);\n\n // `codeToLoinc` devolve undefined para quem não tem LOINC, que é o caso\n // esperado aqui. O campo fica de fora em vez de receber um valor inventado.\n return { internalCode: canonical, loincCode: codeToLoinc(canonical), reason };\n }\n\n return { loincCode, reason };\n}\n\n/**\n * Extract interpretation flag from Observation\n */\nfunction extractFlag(observation: FHIRObservation): 'H' | 'L' | '' {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n if (code === 'H' || code === 'HH') return 'H';\n if (code === 'L' || code === 'LL') return 'L';\n return '';\n}\n\n/**\n * Extract Observation resources from a FHIR Bundle\n */\nexport function extractObservationsFromBundle(bundle: FHIRBundle): {\n observations: FHIRObservation[];\n skipped: SkippedEntry[];\n} {\n const observations: FHIRObservation[] = [];\n const skipped: SkippedEntry[] = [];\n\n for (let i = 0; i < bundle.entry.length; i++) {\n const entry = bundle.entry[i]!;\n if (!entry.resource) {\n skipped.push({ index: i, reason: 'Entry has no resource' });\n continue;\n }\n\n if (entry.resource.resourceType !== 'Observation') {\n // Non-observation resources are silently skipped (Patient, DiagnosticReport, etc.)\n continue;\n }\n\n if (observations.length >= MAX_OBSERVATIONS) {\n skipped.push({ index: i, reason: `Maximum of ${MAX_OBSERVATIONS} observations exceeded` });\n continue;\n }\n\n observations.push(entry.resource as FHIRObservation);\n }\n\n return { observations, skipped };\n}\n\n/**\n * Map a FHIR Observation to internal format using LOINC→biomarker code lookup\n */\nexport function mapFHIRObservationToInternal(\n observation: FHIRObservation,\n index: number,\n): { observation: ImportedObservation } | { skipped: SkippedEntry } {\n const { internalCode, loincCode, reason } = resolveBiomarkerCode(observation);\n\n if (!internalCode) {\n return {\n skipped: { index, loincCode, reason, resourceType: 'Observation' },\n };\n }\n\n const definition = getDefinitionByCode(internalCode);\n\n // Extract value\n let value: number | string;\n let unit = '';\n let isQualitative = false;\n\n if (observation.valueQuantity?.value !== undefined) {\n value = observation.valueQuantity.value;\n unit = observation.valueQuantity.unit || observation.valueQuantity.code || '';\n } else if (observation.valueString) {\n value = observation.valueString;\n isQualitative = true;\n } else {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no value (valueQuantity or valueString)',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract collection date (effectiveDateTime or effectivePeriod.start)\n const collectionDate = observation.effectiveDateTime || observation.effectivePeriod?.start || '';\n if (!collectionDate) {\n return {\n skipped: {\n index,\n loincCode,\n reason: 'Observation has no effectiveDateTime or effectivePeriod.start',\n resourceType: 'Observation',\n },\n };\n }\n\n // Extract reference ranges\n let referenceMin: number | undefined;\n let referenceMax: number | undefined;\n let referenceKind: ImportedObservation['referenceKind'];\n if (observation.referenceRange?.[0]) {\n referenceMin = observation.referenceRange[0].low?.value;\n referenceMax = observation.referenceRange[0].high?.value;\n const meaning = observation.referenceRange[0].type?.coding?.find(\n (c) => c.system === 'http://terminology.hl7.org/CodeSystem/referencerange-meaning',\n )?.code;\n if (meaning === 'normal') referenceKind = 'reference-interval';\n else if (meaning === 'recommended') referenceKind = 'decision-threshold';\n }\n\n const imported: ImportedObservation = {\n biomarkerCode: internalCode,\n biomarkerName:\n definition?.names.pt[0] || definition?.names.en[0] || observation.code.text || internalCode,\n collectionDate,\n flag: extractFlag(observation),\n isQualitative,\n loincCode,\n ...(loincCode && methodVariantOf(internalCode, loincCode) && { methodLoinc: loincCode }),\n ...(referenceKind && { referenceKind }),\n referenceMax,\n referenceMin,\n unit: unit || definition?.unit || '',\n value,\n };\n\n return { observation: imported };\n}\n\n/**\n * Process a complete FHIR Bundle for import\n */\nexport function processImportBundle(data: unknown): FHIRImportResult {\n // Structural validation\n const validationErrors = validateFHIRImportBundle(data);\n if (validationErrors.length > 0) {\n return {\n errors: validationErrors,\n imported: [],\n skipped: [],\n totalProcessed: 0,\n };\n }\n\n const bundle = data as FHIRBundle;\n\n // Extract observations\n const { observations, skipped } = extractObservationsFromBundle(bundle);\n\n // Map each observation to internal format\n const imported: ImportedObservation[] = [];\n const allSkipped: SkippedEntry[] = [...skipped];\n\n for (let i = 0; i < observations.length; i++) {\n const result = mapFHIRObservationToInternal(observations[i]!, i);\n\n if ('observation' in result) {\n imported.push(result.observation);\n } else {\n allSkipped.push(result.skipped);\n }\n }\n\n return {\n errors: [],\n imported,\n skipped: allSkipped,\n totalProcessed: observations.length,\n };\n}\n\nexport { MAX_FILE_SIZE, MAX_OBSERVATIONS };\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkIY6BZX2Vcjs = require('./chunk-IY6BZX2V.cjs');
|
|
4
4
|
|
|
5
5
|
// src/validators.ts
|
|
6
6
|
var UCUM_SYSTEM = "http://unitsofmeasure.org";
|
|
7
7
|
function ucumErrors(quantity, where) {
|
|
8
8
|
if (!quantity || quantity.system !== UCUM_SYSTEM) return [];
|
|
9
9
|
if (!quantity.code) return [`${where}: UCUM system declared without a code`];
|
|
10
|
-
if (!
|
|
10
|
+
if (!_chunkIY6BZX2Vcjs.isUcumCode.call(void 0, quantity.code)) {
|
|
11
11
|
return [`${where}: "${quantity.code}" is not a UCUM code`];
|
|
12
12
|
}
|
|
13
13
|
return [];
|
|
@@ -78,4 +78,4 @@ function validateFHIRImportBundle(data) {
|
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
exports.validateFHIRDiagnosticReport = validateFHIRDiagnosticReport; exports.validateFHIRObservation = validateFHIRObservation; exports.validateFHIRImportBundle = validateFHIRImportBundle;
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-NUFN24W4.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-NUFN24W4.cjs","../src/validators.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACMA,IAAM,YAAA,EAAc,2BAAA;AAYpB,SAAS,UAAA,CAAW,QAAA,EAAoC,KAAA,EAAyB;AAC/E,EAAA,GAAA,CAAI,CAAC,SAAA,GAAY,QAAA,CAAS,OAAA,IAAW,WAAA,EAAa,OAAO,CAAC,CAAA;AAC1D,EAAA,GAAA,CAAI,CAAC,QAAA,CAAS,IAAA,EAAM,OAAO,CAAC,CAAA,EAAA;AACC,EAAA;AACL,IAAA;AACxB,EAAA;AACQ,EAAA;AACV;AAKgB;AACY,EAAA;AAEE,EAAA;AACd,IAAA;AACd,EAAA;AAEoB,EAAA;AACN,IAAA;AACd,EAAA;AAE4B,EAAA;AACd,IAAA;AACd,EAAA;AAEwB,EAAA;AACV,IAAA;AACd,EAAA;AAEO,EAAA;AACT;AAKgB;AACY,EAAA;AAET,EAAA;AACH,IAAA;AACd,EAAA;AAEyB,EAAA;AACX,IAAA;AACd,EAAA;AAE0B,EAAA;AACZ,IAAA;AACd,EAAA;AAE6B,EAAA;AACf,IAAA;AACd,EAAA;AAEiB,EAAA;AACH,IAAA;AACd,EAAA;AAE0B,EAAA;AACA,EAAA;AACE,IAAA;AACA,IAAA;AAC5B,EAAA;AAEO,EAAA;AACT;AAKgB;AACiB,EAAA;AAEF,EAAA;AACJ,IAAA;AAChB,IAAA;AACT,EAAA;AAEe,EAAA;AAEa,EAAA;AACd,IAAA;AACD,MAAA;AACF,MAAA;AACR,IAAA;AACH,EAAA;AAE0B,EAAA;AACD,IAAA;AACD,EAAA;AACC,IAAA;AACzB,EAAA;AAEO,EAAA;AACT;AD5C+B;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/fhir-brasil/fhir-brasil/packages/core/dist/chunk-NUFN24W4.cjs","sourcesContent":[null,"/**\n * FHIR Validators\n *\n * Validation functions for FHIR R4 resources.\n */\n\nimport type { FHIRDiagnosticReport, FHIRObservation, FHIRQuantity } from './fhir-types';\nimport type { ImportError } from './importer';\nimport { isUcumCode } from './units';\n\nconst UCUM_SYSTEM = 'http://unitsofmeasure.org';\n\n/**\n * Um `Quantity` que afirma o system do UCUM precisa de um `code` que seja\n * UCUM. Sem `code` a afirmação está vazia; com `code` que não é UCUM ela está\n * errada, e foi o caso durante meses: `uIU/mL`, `K/uL` e `razão` saíam sob\n * `http://unitsofmeasure.org` porque o conversor devolvia a grafia do laudo\n * intacta quando não a conhecia.\n *\n * `Quantity` sem `system` passa: unidade só em texto é legítima, e é o que o\n * conversor emite quando não sabe traduzir.\n */\nfunction ucumErrors(quantity: FHIRQuantity | undefined, where: string): string[] {\n if (!quantity || quantity.system !== UCUM_SYSTEM) return [];\n if (!quantity.code) return [`${where}: UCUM system declared without a code`];\n if (!isUcumCode(quantity.code)) {\n return [`${where}: \"${quantity.code}\" is not a UCUM code`];\n }\n return [];\n}\n\n/**\n * Validate FHIR DiagnosticReport\n */\nexport function validateFHIRDiagnosticReport(report: FHIRDiagnosticReport): string[] {\n const errors: string[] = [];\n\n if (!report.resourceType || report.resourceType !== 'DiagnosticReport') {\n errors.push('Invalid resourceType');\n }\n\n if (!report.status) {\n errors.push('Missing status');\n }\n\n if (!report.code || !report.code.coding || report.code.coding.length === 0) {\n errors.push('Missing or invalid code');\n }\n\n if (!report.subject || !report.subject.reference) {\n errors.push('Missing subject reference');\n }\n\n return errors;\n}\n\n/**\n * Validate FHIR Observation\n */\nexport function validateFHIRObservation(observation: FHIRObservation): string[] {\n const errors: string[] = [];\n\n if (!observation.resourceType || observation.resourceType !== 'Observation') {\n errors.push('Invalid resourceType');\n }\n\n if (!observation.status) {\n errors.push('Missing status');\n }\n\n if (!observation.code || !observation.code.coding || observation.code.coding.length === 0) {\n errors.push('Missing or invalid code');\n }\n\n if (!observation.subject || !observation.subject.reference) {\n errors.push('Missing subject reference');\n }\n\n if (!observation.valueQuantity && !observation.valueString) {\n errors.push('Missing value (valueQuantity or valueString)');\n }\n\n errors.push(...ucumErrors(observation.valueQuantity, 'valueQuantity'));\n for (const [i, range] of (observation.referenceRange ?? []).entries()) {\n errors.push(...ucumErrors(range.low, `referenceRange[${i}].low`));\n errors.push(...ucumErrors(range.high, `referenceRange[${i}].high`));\n }\n\n return errors;\n}\n\n/**\n * Validate that the input is a structurally valid FHIR Bundle\n */\nexport function validateFHIRImportBundle(data: unknown): ImportError[] {\n const errors: ImportError[] = [];\n\n if (!data || typeof data !== 'object') {\n errors.push({ details: 'Input must be a JSON object', field: 'root' });\n return errors;\n }\n\n const bundle = data as Record<string, unknown>;\n\n if (bundle.resourceType !== 'Bundle') {\n errors.push({\n details: `Expected resourceType \"Bundle\", got \"${String(bundle.resourceType)}\"`,\n field: 'resourceType',\n });\n }\n\n if (!Array.isArray(bundle.entry)) {\n errors.push({ details: 'Bundle must contain an \"entry\" array', field: 'entry' });\n } else if (bundle.entry.length === 0) {\n errors.push({ details: 'Bundle entry array is empty', field: 'entry' });\n }\n\n return errors;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getCanonicalUnit
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2J3V7DCF.js";
|
|
4
4
|
|
|
5
5
|
// src/reference-ranges.ts
|
|
6
6
|
var biomarkerRangeDefinitions = {
|
|
@@ -247,6 +247,15 @@ var biomarkerRangeDefinitions = {
|
|
|
247
247
|
kind: "reference-interval",
|
|
248
248
|
source: "tietz-7ed-2015"
|
|
249
249
|
},
|
|
250
|
+
// BUN (nitrogênio ureico): "The normal range of urea nitrogen in blood or
|
|
251
|
+
// serum is 5 to 20 mg/dl" (Hosten, Clinical Methods, cap. 193). O capítulo
|
|
252
|
+
// não publica intervalo ótimo nem partição por sexo ou idade; a queda na
|
|
253
|
+
// gestação (5 a 7 mg/dL) aparece como contexto, não como intervalo próprio.
|
|
254
|
+
BUN: {
|
|
255
|
+
default: { max: 20, min: 5, unit: "mg/dL" },
|
|
256
|
+
kind: "reference-interval",
|
|
257
|
+
source: "hosten-clinical-methods-1990"
|
|
258
|
+
},
|
|
250
259
|
CA125: {
|
|
251
260
|
default: { max: 35, min: 0, optimalMax: 25, optimalMin: 0, unit: "U/mL" },
|
|
252
261
|
kind: "reference-interval",
|
|
@@ -2427,4 +2436,4 @@ export {
|
|
|
2427
2436
|
getFallbackReferenceRange,
|
|
2428
2437
|
applyFallbackReferenceRanges
|
|
2429
2438
|
};
|
|
2430
|
-
//# sourceMappingURL=chunk-
|
|
2439
|
+
//# sourceMappingURL=chunk-SIXIWFC5.js.map
|