diabetic-utils
Version:
Zero-bloat TypeScript utilities for diabetes data: glucose, A1C, conversions, time-in-range, and more.
1 lines • 77.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/a1c.ts","../src/constants.ts","../src/guards.ts","../src/glucose.ts","../src/validators.ts","../src/alignment.ts","../src/conversions.ts","../src/formatters.ts","../src/tir.ts","../src/types.ts","../src/mage.ts","../src/variability.ts"],"names":["formatA1C","val","isValidA1C","value","getA1CCategory","a1c","thresholds","normalMax","prediabetesMax","isA1CInTarget","target","min","max","a1cDelta","current","previous","a1cTrend","readings","delta","HOMA_IR_DENOMINATOR","HOMA_IR_CUTOFFS","HYPO_THRESHOLD_MGDL","HYPER_THRESHOLD_MGDL","HYPO_THRESHOLD_MMOLL","HYPER_THRESHOLD_MMOLL","A1C_TO_EAG_MULTIPLIER","A1C_TO_EAG_CONSTANT","MGDL_MMOLL_CONVERSION","MG_DL","MMOL_L","GLUCOSE_COLOR_LOW","GLUCOSE_COLOR_NORMAL","GLUCOSE_COLOR_NORMAL_UP","GLUCOSE_COLOR_NORMAL_DOWN","GLUCOSE_COLOR_ELEVATED","GLUCOSE_COLOR_HIGH","GLUCOSE_ZONE_COLORS","TREND_ARROWS","isEstimateGMIOptions","input","isValidGlucoseString","isHypo","unit","hypoMgdl","hypoMmoll","isHyper","hyperMgdl","hyperMmoll","getGlucoseLabel","parseGlucoseString","match","rawValue","rawUnit","isValidGlucoseValue","isValidInsulin","calculateHOMAIR","glucose","insulin","score","interpretHOMAIR","checkGlycemicAlignment","estimatedAvg","homaResult","flags","estimateA1CFromAvgGlucose","avgMgDl","estimateAvgGlucoseFromA1C","estimateEAG","eAG","estimateA1CFromAverage","avgGlucose","a1cToGMI","estimateGMI","valueOrOptions","resolvedUnit","parsed","gmi","mgDlToMmolL","mmolLToMgDl","convertGlucoseUnit","formatGlucose","options","digits","suffix","formatPercentage","formatDate","iso","timeZone","calculateTIR","inRange","belowRange","aboveRange","r","total","getTIRSummary","result","groupByDay","acc","reading","day","calculateTimeInRange","lower","upper","AllowedGlucoseUnits","glucoseMAGE","validReadings","mean","sum","v","variance","sd","shortWindow","longWindow","direction","_calculateSimpleMAGE","crossingPoints","_findMovingAverageCrossings","turningPoints","_findTurningPoints","excursions","_calculateExcursions","_calculateMAGEFromExcursions","shortMA","_calculateMovingAverage","longMA","crossings","i","prevShort","currShort","prevLong","currLong","values","windowSize","halfWindow","start","end","count","j","extremeIndex","extremeValue","isMaximum","maxVal","minVal","maxIdx","minIdx","maxDiff","minDiff","tp1","tp2","tp3","leftAmplitude","rightAmplitude","targetDirection","filteredExcursions","e","amplitudes","amp","isPeak","isNadir","validAmplitudes","amplitude","excursionAmplitude","glucoseStandardDeviation","glucoseCoefficientOfVariation","glucosePercentiles","percentiles","sorted","a","b","p","rank"],"mappings":"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","file":"index.mjs","sourcesContent":["// @file src/a1c.ts\n\n/**\n * Formats a clinical A1C value as a percent string (e.g., \"7.2%\").\n * Used for clinical reporting and display.\n * @param val - A1C value (percentage)\n * @returns A1C as string with percent sign\n */\nexport function formatA1C(val: number): string {\n return `${val.toFixed(1)}%`\n}\n\n/**\n * Validates a clinical A1C value (percentage).\n * Ensures value is within physiologically plausible range for clinical analytics.\n * @param value - Candidate A1C value\n * @returns True if value is a valid A1C percentage\n */\nexport function isValidA1C(value: unknown): boolean {\n return (\n typeof value === 'number' &&\n Number.isFinite(value) &&\n value > 0 &&\n value < 20\n )\n}\n\n/**\n * Returns the clinical category for an A1C value (normal, prediabetes, diabetes, or invalid).\n * Uses ADA thresholds by default, but allows custom cutoffs for research or population-specific use.\n * @param a1c - A1C value (percentage)\n * @returns 'normal' | 'prediabetes' | 'diabetes' | 'invalid'\n */\n/**\n * Returns the clinical category for an A1C value (normal, prediabetes, diabetes, or invalid).\n * Uses ADA thresholds by default, but allows custom cutoffs for research or population-specific use.\n * @param a1c - A1C value (percentage)\n * @param thresholds - Optional custom thresholds: { normalMax?: number; prediabetesMax?: number }\n * @returns 'normal' | 'prediabetes' | 'diabetes' | 'invalid'\n */\nexport function getA1CCategory(\n a1c: number,\n thresholds?: { normalMax?: number; prediabetesMax?: number }\n): 'normal' | 'prediabetes' | 'diabetes' | 'invalid' {\n const normalMax = thresholds?.normalMax ?? 5.7\n const prediabetesMax = thresholds?.prediabetesMax ?? 6.5\n if (!isValidA1C(a1c)) return 'invalid'\n if (a1c <= normalMax) return 'normal'\n if (a1c <= prediabetesMax) return 'prediabetes'\n return 'diabetes'\n}\n\n/**\n * Checks if an A1C value is within a target range.\n * @param a1c - A1C value\n * @param target - [min, max] range (default: [6.5, 7.0])\n * @param thresholds - Optional custom thresholds: { min?: number; max?: number }\n * @returns True if in target range\n */\nexport function isA1CInTarget(\n a1c: number,\n target: [number, number] = [6.5, 7.0],\n thresholds?: { min?: number; max?: number }\n): boolean {\n const min = thresholds?.min ?? target[0]\n const max = thresholds?.max ?? target[1]\n return isValidA1C(a1c) && a1c >= min && a1c <= max\n}\n\n/**\n * Calculates the change (delta) between two A1C values.\n * @param current - Current A1C\n * @param previous - Previous A1C\n * @returns Delta (current - previous)\n * @throws If either value is invalid\n */\nexport function a1cDelta(current: number, previous: number): number {\n if (!isValidA1C(current) || !isValidA1C(previous))\n throw new Error('Invalid A1C value')\n return +(current - previous).toFixed(2)\n}\n\n/**\n * Determines the trend of A1C values over time.\n * @param readings - Array of A1C values (chronological order)\n * @returns 'increasing' | 'decreasing' | 'stable' | 'insufficient data'\n */\nexport function a1cTrend(\n readings: number[]\n): 'increasing' | 'decreasing' | 'stable' | 'insufficient data' {\n if (!Array.isArray(readings) || readings.length < 2)\n return 'insufficient data'\n const delta = readings[readings.length - 1] - readings[0]\n if (Math.abs(delta) < 0.1) return 'stable'\n return delta > 0 ? 'increasing' : 'decreasing'\n}\n","// @file src/constants.ts\n\n/**\n * Denominator constant for HOMA-IR calculation.\n * HOMA-IR = (glucose [mg/dL] × insulin [µIU/mL]) / HOMA_IR_DENOMINATOR\n * @see https://www.ncbi.nlm.nih.gov/books/NBK279396/\n */\nexport const HOMA_IR_DENOMINATOR = 405\n\n/**\n * Interpretation cutoffs for HOMA-IR (insulin resistance assessment).\n * These are general clinical categories, not diagnostic.\n */\nexport const HOMA_IR_CUTOFFS = {\n VERY_SENSITIVE: 1,\n NORMAL: 2,\n EARLY_RESISTANCE: 2.9,\n}\n\n\n/**\n * Clinical hypoglycemia threshold (mg/dL).\n * Used for detecting low glucose events in analytics and reporting.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport const HYPO_THRESHOLD_MGDL = 70\n\n/**\n * Clinical hyperglycemia threshold (mg/dL).\n * Used for detecting high glucose events in clinical analytics.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport const HYPER_THRESHOLD_MGDL = 180\n\n/**\n * Clinical hypoglycemia threshold (mmol/L).\n * Used for low glucose detection in international/metric contexts.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport const HYPO_THRESHOLD_MMOLL = 3.9\n\n/**\n * Clinical hyperglycemia threshold (mmol/L).\n * Used for high glucose detection in international/metric contexts.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport const HYPER_THRESHOLD_MMOLL = 10\n\n/**\n * Clinical multiplier for converting A1C to estimated average glucose (eAG).\n * Used in eAG calculation per CDC/ADA guidelines.\n * @see https://www.cdc.gov/diabetes/managing/managing-blood-sugar/a1c.html\n */\nexport const A1C_TO_EAG_MULTIPLIER = 28.7\n\n/**\n * Clinical constant for converting A1C to estimated average glucose (eAG).\n * Used in eAG calculation per CDC/ADA guidelines.\n * @see https://www.cdc.gov/diabetes/managing/managing-blood-sugar/a1c.html\n */\nexport const A1C_TO_EAG_CONSTANT = 46.7\n\n/**\n * Clinical conversion factor between mg/dL and mmol/L.\n * Used for unit conversion in all clinical analytics.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport const MGDL_MMOLL_CONVERSION = 18.0182\n\n/**\n * Clinical string literal for mg/dL glucose unit.\n * Used for clinical data interoperability and formatting.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport const MG_DL = 'mg/dL' as const\n\n/**\n * String literal for mmol/L unit.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport const MMOL_L = 'mmol/L' as const\n\n\n/**\n * Color codes for glucose zones.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport const GLUCOSE_COLOR_LOW = '#D32F2F' // Red (low)\nexport const GLUCOSE_COLOR_NORMAL = '#388E3C' // Green (steady normal)\nexport const GLUCOSE_COLOR_NORMAL_UP = '#4CAF50' // Lighter Green (normal, trending up)\nexport const GLUCOSE_COLOR_NORMAL_DOWN = '#2E7D32' // Darker Green (normal, trending down)\nexport const GLUCOSE_COLOR_ELEVATED = '#FBC02D' // Yellow (over 140)\nexport const GLUCOSE_COLOR_HIGH = '#F57C00' // Orange (over 180)\n\n/**\n * Glucose zone color mapping for different statuses and trends.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport const GLUCOSE_ZONE_COLORS = {\n LOW: GLUCOSE_COLOR_LOW, // Red\n NORMAL: GLUCOSE_COLOR_NORMAL, // Green\n ELEVATED: GLUCOSE_COLOR_ELEVATED, // Yellow\n HIGH: GLUCOSE_COLOR_HIGH, // Orange\n // Colors for trending normal up and down\n NORMAL_UP: GLUCOSE_COLOR_NORMAL_UP, // Lighter Green\n NORMAL_DOWN: GLUCOSE_COLOR_NORMAL_DOWN, // Darker Green\n}\n\n/**\n * Unicode arrows for glucose trend indication.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport const TREND_ARROWS = {\n STEADY: '→',\n RISING: '↗',\n FALLING: '↘',\n RAPIDRISE: '↑',\n RAPIDFALL: '↓',\n}\n","import type { EstimateGMIOptions } from './types'\n\n/**\n * Clinical type guard for EstimateGMIOptions.\n * Validates that the input matches the required shape for GMI estimation options (numeric value, string unit).\n * Useful for ensuring safe handling of clinical glucose data and interoperability with analytics functions.\n * @param input - Candidate value to validate.\n * @returns True if input is a valid EstimateGMIOptions object.\n */\nexport function isEstimateGMIOptions(\n input: unknown\n): input is EstimateGMIOptions {\n return (\n typeof input === 'object' &&\n input !== null &&\n 'value' in input &&\n 'unit' in input &&\n typeof (input as any).value === 'number' &&\n typeof (input as any).unit === 'string'\n )\n}\n\n/**\n * Validates a clinical glucose string (e.g., \"100 mg/dL\", \"5.5 mmol/L\").\n * Ensures the string is in a recognized clinical format for glucose values, supporting safe parsing and conversion.\n * @param input - Value to check as a clinical glucose string.\n * @returns True if input is a valid glucose string for clinical use.\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport function isValidGlucoseString(input: unknown): input is string {\n if (typeof input !== 'string') return false\n\n return /^\\d+(\\.\\d+)?\\s+(mg\\/dL|mmol\\/L)$/i.test(input.trim())\n}\n","// @file src/glucose.ts\n\nimport { GlucoseUnit } from './types'\nimport {\n HYPO_THRESHOLD_MGDL,\n HYPO_THRESHOLD_MMOLL,\n HYPER_THRESHOLD_MGDL,\n HYPER_THRESHOLD_MMOLL,\n MG_DL,\n MMOL_L,\n} from './constants'\n\nimport { isValidGlucoseString } from './guards'\n\n/**\n * Checks if a glucose value is clinically hypoglycemic for the given unit.\n * Used for detecting low glucose events in clinical analytics and reporting.\n * @param val - Glucose value (number)\n * @param unit - Glucose unit ('mg/dL' or 'mmol/L'), default: 'mg/dL'\n * @param thresholds - Optional custom thresholds ({ mgdl?: number; mmoll?: number })\n * @returns True if value is below clinical hypoglycemia threshold\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport function isHypo(\n val: number,\n unit: GlucoseUnit = MG_DL,\n thresholds?: { mgdl?: number; mmoll?: number }\n): boolean {\n const hypoMgdl = thresholds?.mgdl ?? HYPO_THRESHOLD_MGDL\n const hypoMmoll = thresholds?.mmoll ?? HYPO_THRESHOLD_MMOLL\n return unit === MG_DL ? val < hypoMgdl : val < hypoMmoll\n}\n\n/**\n * Checks if a glucose value is clinically hyperglycemic for the given unit.\n * Used for detecting high glucose events in clinical analytics and reporting.\n * @param val - Glucose value (number)\n * @param unit - Glucose unit ('mg/dL' or 'mmol/L'), default: 'mg/dL'\n * @param thresholds - Optional custom thresholds ({ mgdl?: number; mmoll?: number })\n * @returns True if value is above clinical hyperglycemia threshold\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport function isHyper(\n val: number,\n unit: GlucoseUnit = MG_DL,\n thresholds?: { mgdl?: number; mmoll?: number }\n): boolean {\n const hyperMgdl = thresholds?.mgdl ?? HYPER_THRESHOLD_MGDL\n const hyperMmoll = thresholds?.mmoll ?? HYPER_THRESHOLD_MMOLL\n return unit === MG_DL ? val > hyperMgdl : val > hyperMmoll\n}\n\n/**\n * Returns a clinical glucose status label ('low', 'normal', or 'high') based on thresholds for the given unit.\n * Used for clinical charting, alerts, and reporting.\n * @param val - Glucose value (number)\n * @param unit - Glucose unit ('mg/dL' or 'mmol/L'), default: 'mg/dL'\n * @param thresholds - Optional custom thresholds for hypo/hyper ({ hypo?: { mgdl?: number; mmoll?: number }, hyper?: { mgdl?: number; mmoll?: number } })\n * @returns 'low', 'normal', or 'high' based on clinical thresholds\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-level-ranges.html\n */\nexport function getGlucoseLabel(\n val: number,\n unit: GlucoseUnit = MG_DL,\n thresholds?: {\n hypo?: { mgdl?: number; mmoll?: number }\n hyper?: { mgdl?: number; mmoll?: number }\n }\n): 'low' | 'normal' | 'high' {\n if (isHypo(val, unit, thresholds?.hypo)) return 'low'\n if (isHyper(val, unit, thresholds?.hyper)) return 'high'\n return 'normal'\n}\n\n/**\n * Parses a clinical glucose string (e.g., \"100 mg/dL\", \"5.5 mmol/L\") into value and unit.\n * Used for robust input validation and clinical data ingestion.\n * @param input - String in the format \"value unit\" (e.g., \"100 mg/dL\")\n * @returns Object with numeric value and validated unit\n * @throws {Error} If input string is invalid or not in expected format\n * @example\n * parseGlucoseString(\"100 mg/dL\") // { value: 100, unit: \"mg/dL\" }\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport function parseGlucoseString(input: string): {\n value: number\n unit: GlucoseUnit\n} {\n if (!isValidGlucoseString(input)) {\n throw new Error(\n 'Invalid glucose string format. Use \"100 mg/dL\" or \"5.5 mmol/L\".'\n )\n }\n\n const cleaned = input.trim().replace(/\\s+/g, ' ')\n const match = cleaned.match(/^([\\d.]+) (mg\\/dL|mmol\\/L)$/i)\n const [, rawValue, rawUnit] = match!\n\n return {\n value: parseFloat(rawValue),\n unit: rawUnit.toLowerCase() === 'mg/dl' ? MG_DL : MMOL_L,\n }\n}\n\n/**\n * Validates a clinical glucose value and unit.\n * Ensures value is a positive finite number and unit is supported for analytics.\n * @param value - Glucose value to validate\n * @param unit - Glucose unit to validate\n * @returns True if value and unit are clinically valid\n */\nexport function isValidGlucoseValue(value: unknown, unit: unknown): boolean {\n return (\n typeof value === 'number' &&\n Number.isFinite(value) &&\n value > 0 &&\n (unit === MG_DL || unit === MMOL_L)\n )\n}\n","// @file src/validators.ts\n\n/**\n * Validates a clinical fasting insulin value (µIU/mL).\n * Ensures value is a positive finite number and within plausible physiological range.\n * @param value - Candidate insulin value\n * @returns True if value is a valid fasting insulin (µIU/mL)\n * @see https://www.ncbi.nlm.nih.gov/books/NBK279396/ (normal fasting insulin: ~2-25 µIU/mL, but allow wider plausible range for outliers)\n */\nexport function isValidInsulin(value: unknown): boolean {\n return (\n typeof value === 'number' &&\n Number.isFinite(value) &&\n value > 0 &&\n value < 1000 // upper bound is generous for outliers, adjust as needed\n )\n}\n","/**\n * @file src/alignment.ts\n *\n * Clinical utility functions for evaluating glycemic alignment using A1C, fasting glucose, and insulin.\n * These functions are provided for informational and educational purposes only. They do not constitute\n * medical advice, diagnosis, or treatment. Always consult a licensed healthcare provider before making\n * medical decisions or interpreting laboratory results.\n */\nimport { isValidA1C } from './a1c'\nimport { isValidGlucoseValue } from './glucose'\nimport { isValidInsulin } from './validators'\nimport {\n HOMA_IR_DENOMINATOR,\n HOMA_IR_CUTOFFS,\n A1C_TO_EAG_MULTIPLIER,\n A1C_TO_EAG_CONSTANT,\n MG_DL,\n} from './constants'\n\n/**\n * Calculates HOMA-IR (Homeostatic Model Assessment for Insulin Resistance) from fasting glucose and insulin.\n *\n * Formula: HOMA-IR = (fasting glucose [mg/dL] × fasting insulin [µIU/mL]) / 405\n *\n * Used for estimating insulin resistance in clinical analytics and research. Not a diagnostic tool—interpret with clinical context.\n *\n * @param glucose - Fasting glucose value in mg/dL. Must be a positive finite number.\n * @param insulin - Fasting insulin value in µIU/mL. Must be a positive finite number.\n * @returns Object with numeric HOMA-IR value and clinical interpretation label.\n * @throws {Error} If glucose or insulin are invalid (non-finite, zero, or negative).\n * @see https://pubmed.ncbi.nlm.nih.gov/3899825/ (Original HOMA-IR publication)\n * @see https://diabetesjournals.org/care/article/26/1/118/22567/Prevalence-and-Concomitants-of-Glucose-Intolerance (ADA: Glucose Intolerance and HOMA-IR context)\n */\nexport function calculateHOMAIR(glucose: number, insulin: number) {\n if (!isValidGlucoseValue(glucose, MG_DL)) {\n throw new Error(\n 'Invalid fasting glucose value (must be a positive number in mg/dL)'\n )\n }\n if (!isValidInsulin(insulin)) {\n throw new Error(\n 'Invalid fasting insulin value (must be a positive number in µIU/mL)'\n )\n }\n const score = (glucose * insulin) / HOMA_IR_DENOMINATOR\n return {\n value: score,\n interpretation: interpretHOMAIR(score),\n }\n}\n\n/**\n * Interprets a numeric HOMA-IR score into a clinical insulin sensitivity/resistance category.\n *\n * Categories:\n * - Very insulin sensitive: < 1.0\n * - Normal insulin sensitivity: 1.0–2.0\n * - Early insulin resistance: 2.0–2.9\n * - Significant insulin resistance: ≥ 2.9\n *\n * Cutoffs are conventional and may vary by population and lab; not diagnostic.\n *\n * @param score - HOMA-IR numeric value\n * @returns Clinical interpretation string\n */\nfunction interpretHOMAIR(score: number): string {\n if (score < HOMA_IR_CUTOFFS.VERY_SENSITIVE) return 'Very insulin sensitive'\n if (score >= HOMA_IR_CUTOFFS.VERY_SENSITIVE && score < HOMA_IR_CUTOFFS.NORMAL)\n return 'Normal insulin sensitivity'\n if (\n score >= HOMA_IR_CUTOFFS.NORMAL &&\n score < HOMA_IR_CUTOFFS.EARLY_RESISTANCE\n )\n return 'Early insulin resistance'\n return 'Significant insulin resistance'\n}\n\n/**\n * Checks clinical consistency among A1C, fasting glucose, and fasting insulin markers.\n *\n * Returns:\n * - Estimated average glucose (mg/dL), calculated per CDC formula\n * - HOMA-IR result (value and interpretation)\n * - Flags for potential inconsistencies\n * - Educational recommendation and disclaimer\n *\n * Used for high-level clinical insight and trend alignment, not for diagnosis.\n *\n * @param a1c - A1C value (percentage). Must be a positive finite number.\n * @param glucose - Fasting glucose value in mg/dL. Must be a positive finite number.\n * @param insulin - Fasting insulin value in µIU/mL. Must be a positive finite number.\n * @returns Object with estimated average glucose (mg/dL), HOMA-IR result object, flags array, recommendation string, and disclaimer.\n * @throws {Error} If any input value is invalid (non-finite, zero, or negative).\n * @see https://www.cdc.gov/diabetes/diabetes-testing/prediabetes-a1c-test.html (CDC: eAG formula)\n */\nexport function checkGlycemicAlignment(\n a1c: number,\n glucose: number,\n insulin: number\n) {\n if (!isValidA1C(a1c)) {\n throw new Error('Invalid A1C value (must be a positive number < 20%)')\n }\n if (!isValidGlucoseValue(glucose, MG_DL)) {\n throw new Error(\n 'Invalid fasting glucose value (must be a positive number in mg/dL)'\n )\n }\n if (!isValidInsulin(insulin)) {\n throw new Error(\n 'Invalid fasting insulin value (must be a positive number in µIU/mL)'\n )\n }\n\n const estimatedAvg = A1C_TO_EAG_MULTIPLIER * a1c - A1C_TO_EAG_CONSTANT\n const homaResult = calculateHOMAIR(glucose, insulin)\n\n const flags: string[] = []\n\n if (glucose > estimatedAvg + 20) {\n flags.push(\n 'Fasting glucose is higher than estimated average glucose from A1C.'\n )\n }\n\n if (insulin < 2 && glucose > 110) {\n flags.push(\n 'Low insulin with high glucose may indicate reduced insulin secretion.'\n )\n }\n\n return {\n estimatedAverageGlucose: estimatedAvg,\n homaIR: homaResult,\n flags,\n recommendation: flags.length\n ? 'Some inconsistencies were detected in your markers. This may occur for various reasons including diet, stress, or lab variability. Always consult your healthcare provider for interpretation and guidance.'\n : 'Your markers appear consistent based on this informational analysis. This does not replace professional medical advice. Always consult your healthcare provider for interpretation and guidance.',\n disclaimer:\n 'This tool is for informational and educational purposes only. It does not constitute medical advice, diagnosis, or treatment.',\n }\n}\n","// @file src/conversions.ts\n\nimport {\n A1C_TO_EAG_MULTIPLIER,\n A1C_TO_EAG_CONSTANT,\n MGDL_MMOLL_CONVERSION,\n MG_DL,\n MMOL_L,\n} from './constants'\nimport { GlucoseUnit } from './types'\nimport type { EstimateGMIOptions } from './types'\nimport { isEstimateGMIOptions } from './guards'\nimport { parseGlucoseString } from './glucose'\n\n/**\n * Converts clinical average glucose (mg/dL) to estimated A1C (percentage).\n * Used for clinical analytics and patient reporting.\n * @param avgMgDl - Average glucose in mg/dL\n * @returns Estimated A1C value (percentage)\n * @see https://www.cdc.gov/diabetes/managing/managing-blood-sugar/a1c.html\n */\nexport function estimateA1CFromAvgGlucose(avgMgDl: number): number {\n return +((avgMgDl + A1C_TO_EAG_CONSTANT) / A1C_TO_EAG_MULTIPLIER).toFixed(2)\n}\n\n/**\n * Converts clinical A1C value (percentage) to estimated average glucose (mg/dL).\n * Used for clinical analytics and patient reporting.\n * @param a1c - A1C value (percentage)\n * @returns Estimated average glucose in mg/dL\n * @see https://www.cdc.gov/diabetes/managing/managing-blood-sugar/a1c.html\n */\nexport function estimateAvgGlucoseFromA1C(a1c: number): number {\n return Math.round(a1c * A1C_TO_EAG_MULTIPLIER - A1C_TO_EAG_CONSTANT)\n}\n\n/**\n * Estimates eAG (estimated average glucose, mg/dL) from clinical A1C value.\n * Throws if input is negative. Used for clinical and research reporting.\n * @param a1c - A1C value (percentage)\n * @returns Estimated average glucose (mg/dL)\n * @throws {Error} If a1c is negative\n * @see https://www.cdc.gov/diabetes/managing/managing-blood-sugar/a1c.html\n */\nexport function estimateEAG(a1c: number): number {\n if (a1c < 0) throw new Error('A1C must be positive')\n const eAG = Number(\n (a1c * A1C_TO_EAG_MULTIPLIER - A1C_TO_EAG_CONSTANT).toFixed(10)\n )\n return Math.round(eAG)\n}\n\n/**\n * Estimates A1C from average glucose.\n * @param avgGlucose - Average glucose value\n * @param unit - Glucose unit (mg/dL or mmol/L)\n * @returns Estimated A1C\n * @see https://www.cdc.gov/diabetes/managing/managing-blood-sugar/a1c.html\n */\nexport function estimateA1CFromAverage(\n avgGlucose: number,\n unit: GlucoseUnit = MG_DL\n): number {\n const glucoseMgdl =\n unit === MMOL_L ? avgGlucose * MGDL_MMOLL_CONVERSION : avgGlucose\n return +((glucoseMgdl + 46.7) / 28.7).toFixed(2)\n}\n\n/**\n * Converts A1C to Glucose Management Indicator (GMI).\n * @param a1c - A1C value\n * @returns GMI value\n * @see https://diatribe.org/glucose-management-indicator-gmi\n */\nexport function a1cToGMI(a1c: number): number {\n return +(3.31 + 0.02392 * a1c).toFixed(2)\n}\n\n/**\n * Estimate Glucose Management Indicator (GMI) from average glucose.\n * @param valueOrOptions - Glucose value, string, or options object\n * @param unit - Glucose unit (if value is a number)\n * @returns GMI value\n * @throws {Error} If unit is required but not provided when input is a number.\n * @throws {Error} If the glucose unit is unsupported.\n * @throws {Error} If the glucose value is not a positive number.\n * @see https://diatribe.org/glucose-management-indicator-gmi\n */\nexport function estimateGMI(\n valueOrOptions: number | string | EstimateGMIOptions,\n unit?: GlucoseUnit\n): number {\n let value: number\n let resolvedUnit: GlucoseUnit\n\n if (isEstimateGMIOptions(valueOrOptions)) {\n value = valueOrOptions.value\n resolvedUnit = valueOrOptions.unit\n } else if (typeof valueOrOptions === 'string') {\n const parsed = parseGlucoseString(valueOrOptions)\n value = parsed.value\n resolvedUnit = parsed.unit\n } else {\n if (!unit) throw new Error('Unit is required when input is a number.')\n value = valueOrOptions\n resolvedUnit = unit\n }\n\n if (![MG_DL, MMOL_L].includes(resolvedUnit)) {\n throw new Error(`Unsupported glucose unit: ${resolvedUnit}`)\n }\n\n if (value <= 0 || !Number.isFinite(value)) {\n throw new Error('Glucose value must be a positive number.')\n }\n\n const gmi = resolvedUnit === MMOL_L ? 1.57 * value + 3.5 : 0.03 * value + 2.4\n\n return parseFloat(gmi.toFixed(1))\n}\n\n/**\n * Converts clinical glucose value from mg/dL to mmol/L.\n * Used for international interoperability and reporting.\n * @param val - Glucose value in mg/dL\n * @returns Value in mmol/L\n * @throws {Error} If val is not a finite number or is negative/zero\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport function mgDlToMmolL(val: number): number {\n if (!Number.isFinite(val) || val <= 0)\n throw new Error('Invalid glucose value')\n return +(val / MGDL_MMOLL_CONVERSION).toFixed(1)\n}\n\n/**\n * Converts clinical glucose value from mmol/L to mg/dL.\n * Used for international interoperability and reporting.\n * @param val - Glucose value in mmol/L\n * @returns Value in mg/dL\n * @throws {Error} If val is not a finite number or is negative/zero\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport function mmolLToMgDl(val: number): number {\n if (!Number.isFinite(val) || val <= 0)\n throw new Error('Invalid glucose value')\n return Math.round(val * MGDL_MMOLL_CONVERSION)\n}\n\n/**\n * Converts clinical glucose value between mg/dL and mmol/L.\n * Used for clinical interoperability and analytics.\n * @param value - Glucose value (number)\n * @param unit - Current glucose unit ('mg/dL' or 'mmol/L')\n * @returns Object with converted value and new unit\n * @throws {Error} If value is not a finite number or is negative/zero\n * @throws {Error} If unit is not a supported glucose unit\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport function convertGlucoseUnit({\n value,\n unit,\n}: {\n value: number\n unit: GlucoseUnit\n}): { value: number; unit: GlucoseUnit } {\n if (!Number.isFinite(value) || value <= 0)\n throw new Error('Invalid glucose value')\n if (![MG_DL, MMOL_L].includes(unit)) throw new Error('Invalid unit')\n if (unit === MG_DL)\n return {\n value: Math.round((value / MGDL_MMOLL_CONVERSION) * 10) / 10,\n unit: MMOL_L,\n }\n return {\n value: Math.round(value * MGDL_MMOLL_CONVERSION),\n unit: MG_DL,\n }\n}\n","// @file src/formatters.ts\n\nimport { GlucoseUnit } from './types'\n\n/**\n * Formats a clinical glucose value with unit and optional rounding.\n * Used for clinical reporting, charting, and data export.\n * @param val - Glucose value (number)\n * @param unit - Glucose unit ('mg/dL' or 'mmol/L')\n * @param options - Formatting options: { digits?: number; suffix?: boolean } (default: { digits: 0, suffix: true })\n * @returns Formatted glucose string (e.g., '5.5 mmol/L', '120 mg/dL')\n * @see https://www.diabetes.co.uk/diabetes_care/blood-sugar-conversion.html\n */\nexport function formatGlucose(\n val: number,\n unit: GlucoseUnit,\n options: { digits?: number; suffix?: boolean } = {}\n): stri