@oliasoft-open-source/units 5.8.0 → 5.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"conversion.cjs","names":["Fraction","func2Module"],"sources":["../../src/numbers/statistics/confidence-interval.ts","../../src/units/constants.ts","../../src/units/unit-catalog.ts","../../src/numbers/parsing/number-input.ts","../../src/units/unit-string.ts","../../src/numbers/fractions/fractions.ts","../../src/numbers/scientific-notation/scientific-notation.ts","../../src/numbers/predicates.ts","../../src/numbers/parsing/parse-number.ts","../../src/numbers/comparison/comparison.ts","../../src/numbers/rounding/rounding.ts","../../src/numbers/format/display-number.ts","../../src/numbers/numbers.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/runtime/ucs2length.js","../../src/validate/ajv-validators.ts","../../src/validate/errors-transform.ts","../../src/units/validation.ts","../../src/units/conversion.ts"],"sourcesContent":["const { abs, exp, sqrt } = Math;\n\n/** Applies the one-dimensional iterative Newton method. */\nexport function newton(\n functionValue: (value: number) => number,\n derivative: (value: number) => number,\n initialValue: number,\n tolerance = 1e-8,\n maxIterations = 30,\n): [number, boolean, number] {\n let currentValue = initialValue;\n let iteration = 0;\n let error = 1;\n while (error > tolerance && iteration < maxIterations) {\n const nextValue = currentValue - functionValue(currentValue) / derivative(currentValue);\n error = abs(functionValue(nextValue) - functionValue(currentValue));\n if (error < tolerance) {\n return [nextValue, true, iteration];\n }\n currentValue = nextValue;\n iteration += 1;\n }\n return [initialValue, false, iteration];\n}\n\n/** Approximates the Gaussian error function. */\nexport function erf(value: number): number {\n const t = 1 / (1 + 0.5 * abs(value));\n const answer =\n 1 -\n t *\n exp(\n -(value ** 2) -\n 1.26551223 +\n t *\n (1.00002368 +\n t *\n (0.37409196 +\n t *\n (0.09678418 +\n t *\n (-0.18628806 +\n t *\n (0.27886807 +\n t * (-1.13520398 + t * (1.48851587 + t * (-0.82215223 + t * 0.17087277)))))))),\n );\n return value >= 0 ? answer : -answer;\n}\n\n/** Converts a confidence interval to a number of standard deviations. */\nexport function get_k_from_conf_int(confidenceInterval: number): number {\n const functionValue = (value: number) => {\n return confidenceInterval - erf(value / sqrt(2));\n };\n const derivative = (value: number) => {\n return -sqrt(2 / Math.PI) * exp(-0.5 * value ** 2);\n };\n const [result] = newton(functionValue, derivative, 1);\n return result;\n}\n\n/** Converts a number of standard deviations to a confidence interval. */\nexport function get_conf_int_from_k(standardDeviations: number): number {\n return erf(standardDeviations / sqrt(2));\n}\n","import { get_conf_int_from_k, get_k_from_conf_int } from '../numbers/statistics/confidence-interval.ts';\n\n/**\n * Units labels\n *\n * @readonly\n * @enum {Object}\n */\nexport const LABELS: Record<string, string> = Object.freeze({\n in: 'in',\n mm: 'mm',\n cm: 'cm',\n m: 'm',\n microM: 'μm',\n km: 'km',\n ft: 'ft',\n usft: 'usft',\n in2: 'in²',\n cm2: 'cm²',\n m2: 'm²',\n kg: 'kg',\n tonnes: 't',\n mt: 'mt',\n kip: 'kip',\n bbl: 'bbl',\n m3: 'm³',\n Mm3: 'Mm³',\n MMSCF: 'MMSCF',\n lbm: 'lbm',\n 'kg/mol': 'kg/mol',\n 'lbf/mol': 'lbf/mol',\n sg: 'sg',\n ppg: 'ppg',\n 'kg/m3': 'kg/m³',\n 'lbm/ft3': 'lbm/ft³',\n s: 's',\n min: 'min',\n h: 'h',\n d: 'd',\n month: 'month',\n year: 'year',\n 'bbl/ft': 'bbl/ft',\n lpm: 'L/min',\n lps: 'L/s',\n bpm: 'bbl/min',\n 'm3/min': 'm³/min',\n 'm3/s': 'm³/s',\n MMSCFD: 'MMSCFD',\n bar: 'Bar',\n Pa: 'Pa',\n kPa: 'kPa',\n MPa: 'MPa',\n GPa: 'GPa',\n kPsi: 'Psi',\n ksi: 'ksi',\n 'lbf/100ft2': 'lbf/100ft²',\n '1/Pa': 'Pa⁻¹',\n '1/kPa': 'kPa⁻¹',\n '1/MPa': 'MPa⁻¹',\n '1/GPa': 'GPa⁻¹',\n '1/psi': 'psi⁻¹',\n 'kPa/m': 'kPa/m',\n '1/bar': 'bar⁻¹',\n klbf: 'klbf',\n 'psi/ft': 'Psi/ft',\n 'bar/100m': 'bar/100m',\n 'psi/100ft': 'psi/100ft',\n 'kPa/100m': 'kPa/100m',\n C: '°C',\n F: '°F',\n K: 'K',\n 'C/100m': '°C/100m',\n 'C/m': '°C/m',\n 'Pa/C': 'Pa/°C',\n 'Bar/C': 'Bar/°C',\n 'psi/F': 'psi/°F',\n 'psi/C': 'psi/°C',\n 'F/100ft': '°F/100ft',\n 'F/ft': '°F/ft',\n 'K/100m': 'K/100m',\n 'K/m': 'K/m',\n 'lbf/ft': 'lbf/ft',\n N: 'N',\n kN: 'kN',\n 'N/m': 'N/m',\n 'daN/m': 'daN/m',\n lbf: 'lbf',\n kgf: 'kgf',\n rad: 'rad',\n 'BTU/lbm': 'BTU/lbm',\n ppf: 'ppf',\n 'kg/m': 'kg/m',\n 'E-06/degC': '10⁻⁶/°C',\n 'E-06/degF': '10⁻⁶/°F',\n '1/K': 'K⁻¹',\n km2: 'km²',\n ft2: 'ft²',\n mm2: 'mm²',\n mile2: 'mile²',\n ft3: 'ft³',\n 'g/cm3': 'g/cm³',\n Sm3: 'Sm³',\n 'ft3/s': 'ft³/s',\n 'ft3/d': 'ft³/d',\n 'm3/d': 'm³/d',\n '1/m3/d': '1/m³/d',\n 's/m3': 's/m³',\n '1/MMSCFD': '1/MMSCFD',\n 'bbl/d': 'bbl/d',\n tonneForce: 'tonne-force',\n USGal: 'US gal',\n 'g/mol': 'g/mol',\n Nm: 'N⋅m',\n kNm: 'kN⋅m',\n ftlbf: 'ft⋅lbf',\n 'J/(kg*degC)': 'J/(kg⋅°C)',\n 'J/(kg*degK)': 'J/(kg⋅K)',\n 'J/(s*m*degK)': 'J/(s⋅m⋅K)',\n 'BTU/(lbm*degF)': 'BTU/(lbm⋅°F)',\n 'BTU/(h*ft*degF)': 'BTU/(h⋅ft⋅°F)',\n l: 'L',\n 'l/m': 'L/m',\n 'kJ/kg': 'kJ/kg',\n 'J/kg': 'J/kg',\n deg: '°',\n 'W/(mK)': 'W/(m⋅K)',\n psi: 'psi',\n 'deg/100ft': '°/100ft',\n 'deg/30m': '°/30m',\n 'deg/10m': '°/10m',\n '%': '%',\n Hz: 'Hz',\n '1/s': '1/s',\n rpm: 'rpm',\n 'Pa/m': 'Pa/m',\n 'bar/m': 'bar/m',\n gpm: 'gpm',\n 'kg/s': 'kg/s',\n 'lbm/s': 'lbm/s',\n 'tonnes/h': 'tonnes/h',\n 'tons/h': 'tons/h',\n 'deg/m': '°/m',\n 'deg/ft': '°/ft',\n 'rad/m': 'rad/m',\n 'rad/ft': 'rad/ft',\n 'dyn/cm': 'dyn/cm',\n 'mN/m': 'mN/m',\n 'm/s': 'm/s',\n 'ft/s': 'ft/s',\n 'm/min': 'm/min',\n 'ft/min': 'ft/min',\n 'm/h': 'm/h',\n 'ft/h': 'ft/h',\n mph: 'mph',\n 'km/h': 'km/h',\n 'm/s2': 'm/s²',\n Gs: 'Gs',\n nT: 'nT',\n g: 'g',\n 'ft/s2': 'ft/s²',\n 'Pa*s': 'Pa⋅s',\n P: 'P',\n 'mPa*s': 'mPa⋅s',\n cP: 'cP',\n W: 'W',\n hhp: 'hhp',\n hp: 'hp',\n kW: 'kW',\n MW: 'MW',\n 'BTU/h': 'BTU/h',\n 'W/m2': 'W/m²',\n 'hhp/in2': 'hhp/in²',\n 'hhp/ft2': 'hhp/ft²',\n 'Mm3/d': 'Mm³/d',\n 'STB/d': 'STB/d',\n 'Sm3/d': 'Sm³/d',\n 'Sm3/min': 'Sm³/min',\n 'MSm3/d': 'MSm³/d',\n 'SCF/STB': 'SCF / STB',\n 'Sm3/Sm3': 'Sm³ / Sm³',\n 'SCF/d': 'SCF/d',\n STB: 'STB',\n SCF: 'SCF',\n MSm3: 'MSm³',\n Gsg: 'sg',\n Gppg: 'ppg',\n 'Gkg/m3': 'kg/m³',\n 'Glbm/ft3': 'lbm/ft³',\n 'lb/ft3': 'lb/ft³',\n '°N': '°N',\n '°S': '°S',\n '°W': '°W',\n '°E': '°E',\n fr: ' ',\n mD: 'mD',\n CI: 'CI',\n Sigma: 'σ',\n 'Sm3/d/bar': 'Sm³/d/bar',\n 'STB/d/psi': 'STB/d/psi',\n 'm3/s/bar': 'm³/s/bar',\n 'lb/ft': 'lb/ft',\n 'E-09/bar': '10⁻⁹/bar',\n 'E-10/psi': '10⁻¹⁰/psi',\n 'E-14/pa': '10⁻¹⁴/pa',\n 'm3/m': ' m³/m',\n 'cm3/m': 'cm³/m',\n 'mm3/m': 'mm³/m',\n 'ft3/ft': 'ft³/ft',\n 'in3/ft': 'in³/ft',\n lk: 'lk',\n ftCla: 'ftCla',\n lkCla: 'lkCla',\n ftSe: 'ftSe',\n ydSe: 'ydSe',\n chSe: 'chSe',\n 'chSe(T)': 'chSe(T)',\n ftGC: 'ftGC',\n ydInd: 'ydInd',\n 'd/stand': 'd/stand',\n 'h/stand': 'h/stand',\n 'min/stand': 'min/stand',\n 's/stand': 's/stand',\n 'm3/t': 'm3/t',\n 'L/100kg': 'L/100kg',\n});\n\n/**\n * Alternative units grouped by quantity\n *\n * @readonly\n * @enum {Object}\n */\nexport const ALT_UNITS: Record<string, string[]> = Object.freeze({\n acceleration: ['ft/s2', 'm/s2'],\n angleGradient: ['deg/30m', 'rad/m', 'deg/m', 'deg/ft', 'rad/ft', 'deg/100ft', 'deg/10m'],\n angles: ['deg', 'rad'],\n areaOther: ['in2', 'ft2', 'mm2', 'cm2', 'm2', 'mile2', 'km2'],\n areaTubular: ['in2', 'cm2', 'ft2', 'm2'],\n blowoutFlowRate: [\n 'lpm',\n 'bpm',\n 'm3/min',\n 'ft3/s',\n 'm3/s',\n 'MMSCFD',\n 'ft3/d',\n 'm3/d',\n 'bbl/d',\n 'Mm3/d',\n 'STB/d',\n 'Sm3/d',\n 'Sm3/min',\n 'MSm3/d',\n 'SCF/d',\n ],\n blowoutGasFlowRate: ['MMSCFD', 'Sm3/d', 'MSm3/d', 'SCF/d'],\n blowoutOilFlowRate: ['Sm3/d', 'Sm3/min', 'STB/d'],\n deg: ['deg', 'rad'],\n density: ['sg', 'ppg', 'kg/m3', 'lbm/ft3', 'g/cm3', 'lb/ft3', 'kPa/m'],\n densityGas: ['Gsg', 'Gppg', 'Gkg/m3', 'Glbm/ft3'],\n densityOil: ['sg', 'ppg', 'kg/m3', 'lbm/ft3'],\n densityOilGas: ['ppg', 'kg/m3', 'lbm/ft3'],\n densitySolid: ['sg', 'ppg', 'kg/m3', 'lbm/ft3'],\n depth: ['m', 'ft'],\n diameters: ['in', 'm', 'cm', 'ft', 'mm'],\n distance: ['m', 'ft'],\n dls: ['deg/10m', 'deg/30m', 'deg/100ft'],\n doglegSeverity: ['deg/10m', 'deg/30m', 'deg/100ft'],\n duration: ['s', 'h', 'd', 'min'],\n durationShort: ['s', 'min', 'h', 'd'],\n durationLong: ['min', 'h', 'd', 'month', 'year'],\n flowrate: [\n 'lpm',\n 'gpm',\n 'bpm',\n 'ft3/d',\n 'ft3/s',\n 'm3/s',\n 'm3/d',\n 'm3/min',\n 'Mm3/d',\n 'bbl/d',\n 'MMSCFD',\n 'STB/d',\n 'Sm3/d',\n 'Sm3/min',\n 'MSm3/d',\n 'SCF/d',\n ],\n fluidCompressibility: ['1/bar', '1/psi', '1/Pa', '1/kPa', '1/MPa', '1/GPa'],\n force: ['tonnes', 'lbf', 'kgf', 'N', 'kN', 'tonneForce', 'klbf'],\n forceGradient: ['lbf/ft', 'N/m'],\n frequency: ['Hz'],\n gasVolume: ['MMSCF', 'Sm3', 'MSm3', 'SCF'],\n gor: ['Sm3/Sm3', 'SCF/STB'],\n height: ['m', 'ft'],\n intensity: ['W/m2', 'hhp/in2', 'hhp/ft2'],\n interfacialTension: ['dyn/cm', 'N/m', 'lbf/ft', 'mN/m'],\n latitude: ['°N', '°S'],\n length: ['m', 'cm', 'ft', 'km', 'in', 'mm'],\n linearCapacity: ['l/m', 'bbl/ft'],\n longitude: ['°E', '°W'],\n massFlowRate: ['kg/s', 'lbm/s', 'tonnes/h', 'tons/h'],\n moleWeight: ['kg/mol', 'lbf/mol', 'g/mol'],\n oilVolume: ['STB', 'Sm3'],\n percentage: ['%', 'fr'],\n permeability: ['mD', 'm2'],\n power: ['hp', 'W', 'hhp', 'MW', 'kW', 'BTU/h'],\n pressure: ['bar', 'psi', 'Pa', 'kPa', 'MPa', 'ksi', 'GPa', 'lbf/100ft2'],\n pressureGradient: ['bar/100m', 'Pa/m', 'bar/m', 'psi/100ft', 'psi/ft', 'kPa/m'],\n pressurechange: ['bar', 'psi', 'Pa', 'MPa', 'kPa'],\n gasliftFlowRate: ['STB/d', 'Sm3/d', 'SCF/d'],\n productionFlowRate: ['MMSCFD', 'STB/d', 'Sm3/d', 'Sm3/min', 'MSm3/d', 'SCF/d'],\n productionFlowRateOil: ['MMSCFD', 'STB/d', 'Sm3/d', 'Sm3/min', 'MSm3/d', 'SCF/d'],\n productionFlowRateGas: ['MMSCFD', 'STB/d', 'Sm3/d', 'MSm3/d', 'SCF/d'],\n injectionFlowRate: ['lpm', 'lps', 'bpm', 'gpm', 'MMSCFD', 'STB/d', 'Sm3/d', 'Sm3/min', 'MSm3/d', 'SCF/d'],\n pumpRate: ['lpm', 'lps', 'bpm', 'm3/s', 'Sm3/min', 'ft3/s', 'gpm'],\n rotationalSpeed: ['rpm', 'Hz'],\n roughness: ['m', 'microM', 'in', 'mm'],\n rpm: ['rpm', 'Hz'],\n sdstats: ['CI', 'Sigma'],\n specificHeatCapacity: ['J/(kg*degC)', 'J/(kg*degK)', 'BTU/(lbm*degF)'],\n speed: ['km/h', 'ft/min', 'mph', 'ft/h', 'ft/s', 'm/min', 'm/s', 'm/h'],\n inverseStandSpeed: ['d/stand', 'h/stand', 'min/stand', 's/stand'],\n rop: ['ft/h', 'ft/min', 'ft/s', 'km/h', 'm/h', 'm/min', 'm/s', 'mph'],\n stress: ['MPa', 'kPa', 'psi', 'bar', 'Pa', 'ksi', 'lbf/100ft2'],\n temperature: ['C', 'F', 'K'],\n pressurePerTemperature: ['Pa/C', 'Bar/C', 'psi/F', 'psi/C'],\n tempgrad: ['C/100m', 'F/100ft', 'K/100m', 'C/m', 'F/ft', 'K/m'],\n thermalConductivity: ['BTU/(h*ft*degF)', 'W/(mK)'],\n thermalExpansionCoefficient: ['E-06/degC', 'E-06/degF', '1/K'],\n torque: ['Nm', 'ftlbf', 'kNm'],\n torqueGradient: ['N', 'lbf', 'tonnes'],\n turbulentSkin: ['s/m3', '1/m3/d', '1/MMSCFD'],\n viscosity: ['Pa*s', 'P', 'mPa*s', 'cP'],\n inflowProductivityIndex: ['Sm3/d/bar', 'STB/d/psi', 'm3/s/bar'],\n volume: ['m3', 'bbl', 'Mm3', 'l', 'USGal', 'ft3', 'STB', 'Sm3', 'MMSCF', 'MSm3', 'SCF'],\n kickToleranceVolume: ['m3', 'bbl', 'USGal', 'ft3', 'STB', 'Sm3', 'SCF'],\n weight: ['tonnes', 'kg', 'lbf', 'mt', 'kip', 'N'],\n weightGradient: ['ppf', 'kg/m'],\n wgrad: ['sg', 'ppg'],\n wltubulars: ['ppf', 'kg/m'],\n youngsModulus: ['Pa', 'psi'],\n massPerLength: ['kg/m', 'lb/ft'],\n wearFactor: ['E-09/bar', 'E-10/psi', 'E-14/pa'],\n volumeGradient: ['m3/m', 'cm3/m', 'mm3/m', 'ft3/ft', 'in3/ft'],\n shearStress: ['Pa', 'lbf/100ft2'],\n sensorAccelerometer: ['g', 'm/s2'],\n sensorMagnetometer: ['nT', 'Gs'],\n location: ['lk', 'ftCla', 'lkCla', 'ftSe', 'ydSe', 'chSe', 'chSe(T)', 'ftGC', 'ydInd', 'ft', 'm', 'usft'],\n mixingRequirements: ['m3/t', 'L/100kg'],\n entalphy: ['J/kg', 'kJ/kg', 'BTU/lbm'],\n});\n\n/**\n * Units list\n *\n * @readonly\n * @enum {Object}\n */\nexport const UNIT_FROM_KEY: Record<string, string> = Object.freeze({\n density: 'sg',\n densityGas: 'Gsg',\n densityOil: 'sg',\n densityOilGas: 'kg/m3',\n densitySolid: 'kg/m3',\n length: 'm',\n roughness: 'm',\n speed: 'm/s',\n diameters: 'in',\n duration: 's',\n durationShort: 'h',\n durationLong: 'd',\n pressurechange: 'bar',\n pressure: 'bar',\n temperature: 'C',\n tempgrad: 'C/100m',\n volume: 'm3',\n kickToleranceVolume: 'm3',\n weight: 'kg',\n force: 'N',\n wgrad: 'sg',\n wltubulars: 'ppf',\n flowrate: 'lpm',\n permeability: 'mD', // MilliDarcy\n interfacialTension: 'dyn/cm', // Dynes per centimeter\n deg: 'deg',\n dls: 'deg/30m',\n percentage: '%',\n latitude: '°N',\n longitude: '°E',\n torque: 'Nm',\n rpm: 'rpm',\n testSingleUnit: 'm', //test value for a unit with no alt_units\n turbulentSkin: '1/m3/d',\n pressurePerTemperature: 'Pa/C',\n sdstats: 'Sigma',\n acceleration: 'm/s2',\n massFlowRate: 'kg/s',\n angleGradient: 'deg/m',\n viscosity: 'Pa*s',\n weightGradient: 'kg/m',\n intensity: 'W/m2',\n gor: 'Sm3/Sm3',\n inflowProductivityIndex: 'Sm3/d/bar',\n wearFactor: 'E-09/psi',\n location: 'm',\n inverseStandSpeed: 's/stand',\n mixingRequirements: 'm3/t',\n entalphy: 'J/kg',\n shearStress: 'Pa',\n volumeGradient: 'm3/m',\n sensorAccelerometer: 'g',\n sensorMagnetometer: 'Gs',\n});\n\n/**\n * Constants to help conversion\n *\n * @readonly\n * @enum {Object}\n */\nconst C = Object.freeze({\n g: 0.0980665175317196,\n ft_to_m: 0.3048,\n inch_to_m: 0.0254,\n lbf_to_kg: 0.45359237, // https://en.wikipedia.org/wiki/Pound_(force)\n kg_to_lbf: 2.20462262184877, // https://en.wikipedia.org/wiki/Pound_(force)\n ppf_to_kgm: 0.45359237 / 0.3048,\n kg_cm3: 0.0293984025938081,\n bar_to_psi: 14.503773773022, // https://en.wikipedia.org/wiki/Pound_per_square_inch\n bar_to_pascal: 100000,\n sg_to_ppg: 8.345404265,\n bbl_to_m3: 0.158987294928, // https://en.wikipedia.org/wiki/Unit_of_volume\n USGal_to_m3: 0.003785411784, // https://en.wikipedia.org/wiki/Unit_of_volume\n kelvin_to_degrees: 273.15,\n tonnes_to_pascal: 9806.65,\n therm_exp_coeff: 1.242e-5,\n psi_to_pascal: 6894.757293168361, // ((0.45359237 kg x 9.80665 m/s²)/lbf) / (0.0254 m/in)²\n ft3_to_m3: 0.028316846592, // https://en.wikipedia.org/wiki/Unit_of_volume\n ft3_to_in3: 1728, // https://en.wikipedia.org/wiki/Cubic_inch\n day_to_second: 60 * 60 * 24,\n m3_per_m_to_ft3_per_ft: 10.763910416709722, // https://www.wolframalpha.com/input?i=cubic+meter+per+meter++to+feet+cubic+per+foot&assumption=%7B%22F%22%2C+%22UnitsConversion2%22%2C+%22fromValue%22%7D+-%3E%220.100000000000000000%22\n in3_per_ft_to_m3_per_m: 0.0000537633333333, // 1 / m3_per_m_to_ft3_per_ft / ft3_to_in3 = 0.000053763333333333334 https://www.wolframalpha.com/input?i=cubic+meter+per+meter++to+feet+cubic+per+foot&assumption=%7B%22F%22%2C+%22UnitsConversion2%22%2C+%22fromValue%22%7D+-%3E%220.100000000000000000%22\n /* OW-24122 Flow rate conversion MSm³/d\n `Mega Standard Cubic Metre per day` (`MSm3/d`) <-> `meters cubed per second` (`m3/s`)\n 1 `MSm3/d`\n = `1 * 625/54` `m3/s` (https://www.wolframalpha.com/input?i=Mega+Standard+Cubic+Metre+per+day)\n = `1 / (86400 * 1e-6)` `m3/s` (OW-24122)\n = `11.5740740741`\n We can represent this as `625 / 54` or `1_000_000 / 86400`\n */\n MSm3d_to_m3s: 625 / 54,\n});\n\n/**\n * Conversions list\n *\n * All unit conversion formulas should have a credible source/reference (please add a comment with URL to where you\n * got the formula when adding new units to this package). For example:\n * - Wikipedia\n * - https://www.nist.gov/pml/special-publication-811/nist-guide-si-appendix-b-conversion-factors/nist-guide-si-appendix-b8\n * - https://www.wolframalpha.com/input?i=cubic+meter+to+bbl\n *\n * Do not round conversion factors in formulas (we need full precision). Make sure the inverse conversion (A->B->A)\n * produces a valid result.\n *\n * @readonly\n * @enum {Object}\n */\nexport const KNOWN_CONVERSIONS: Record<string, (val: number) => number> = Object.freeze({\n // LENGTH\n 'm|mm': (val: number): number => val * 1000,\n 'm|cm': (val: number): number => val * 100,\n 'm|km': (val: number): number => val / 1000,\n 'm|ft': (val: number): number => val / C.ft_to_m,\n 'm|in': (val: number): number => val / C.inch_to_m,\n 'm|microM': (val: number): number => val * 1000000,\n 'mm|m': (val: number): number => val / 1000,\n 'cm|m': (val: number): number => val / 100,\n 'km|m': (val: number): number => val * 1000,\n 'ft|m': (val: number): number => val * C.ft_to_m,\n 'in|m': (val: number): number => val * C.inch_to_m,\n 'microM|m': (val: number): number => val / 1000000,\n // AREA\n 'm2|mm2': (val: number): number => val * 1000000,\n 'm2|cm2': (val: number): number => val * 10000,\n 'm2|km2': (val: number): number => val / 1000000,\n 'm2|in2': (val: number): number => val * 1550.0031,\n 'm2|ft2': (val: number): number => val * 10.76391,\n 'm2|mile2': (val: number): number => val * 0.0000003861022,\n 'mm2|m2': (val: number): number => val / 1000000,\n 'cm2|m2': (val: number): number => val / 10000,\n 'km2|m2': (val: number): number => val * 1000000,\n 'in2|m2': (val: number): number => val / 1550.0031,\n 'ft2|m2': (val: number): number => val / 10.76391,\n 'mile2|m2': (val: number): number => val / 0.0000003861022,\n // VOLUME\n 'm3|bbl': (val: number): number => val / C.bbl_to_m3,\n 'm3|ft3': (val: number): number => val / C.ft3_to_m3,\n 'm3|l': (val: number): number => val * 1000,\n 'm3|Mm3': (val: number): number => val / 1000000,\n 'm3|USGal': (val: number): number => val / C.USGal_to_m3,\n 'bbl|m3': (val: number): number => val * C.bbl_to_m3,\n 'ft3|m3': (val: number): number => val * C.ft3_to_m3,\n 'Mm3|m3': (val: number): number => val * 1000000,\n 'l|m3': (val: number): number => val / 1000,\n 'USGal|m3': (val: number): number => val * C.USGal_to_m3,\n 'm3|Sm3': (val: number): number => val * 1,\n 'm3|STB': (val: number): number => val * 6.289512957422142, // 42089843750 / 6692067261 = 6.289512957422142, // https://www.wolframalpha.com/input?i=stb\n 'Sm3|m3': (val: number): number => val * 1,\n 'STB|m3': (val: number): number => val * 0.1589948230919721, //6692067261 / 42089843750 = 0.15899482309197216, // https://www.wolframalpha.com/input?i=stb\n 'm3|MMSCF': (val: number): number => (val * 1e6) / C.ft3_to_m3,\n 'm3|MSm3': (val: number): number => val * 0.000001,\n 'm3|SCF': (val: number): number => val / C.ft3_to_m3,\n 'MMSCF|m3': (val: number): number => val * 1e-6 * C.ft3_to_m3,\n 'MSm3|m3': (val: number): number => val * 1000000,\n 'SCF|m3': (val: number): number => val * C.ft3_to_m3,\n // DENSITY\n 'kg/m3|sg': (val: number): number => val * 0.001,\n 'kg/m3|g/cm3': (val: number): number => val * 0.001,\n 'kg/m3|lbm/ft3': (val: number): number => val / 16.01846337,\n 'kg/m3|lb/ft3': (val: number): number => val / 16.01846337,\n 'kg/m3|ppg': (val: number): number => val * 0.008345404265,\n 'sg|kg/m3': (val: number): number => val * 1000,\n 'g/cm3|kg/m3': (val: number): number => val * 1000,\n 'lbm/ft3|kg/m3': (val: number): number => val * 16.01846337,\n 'lb/ft3|kg/m3': (val: number): number => val * 16.01846337,\n 'ppg|kg/m3': (val: number): number => val / 0.008345404265,\n 'sg|kPa/m': (val: number): number => val * 9.81,\n 'kPa/m|sg': (val: number): number => val / 9.81,\n // GAS DENSITY\n 'Gkg/m3|Gsg': (val: number): number => val / 1.225,\n 'Gkg/m3|Glbm/ft3': (val: number): number => val / 16.0176516725,\n 'Gkg/m3|Gppg': (val: number): number => val / 119.8659491193,\n 'Gsg|Gkg/m3': (val: number): number => val * 1.225,\n 'Glbm/ft3|Gkg/m3': (val: number): number => val * 16.0176516725,\n 'Gppg|Gkg/m3': (val: number): number => val * 119.8659491193,\n // WLTUBULARS\n 'ppf|kg/m': (val: number): number => (val * 0.45359237) / 0.3048,\n 'kg/m|ppf': (val: number): number => (val * 1) / (0.45359237 / 0.3048),\n 'kg/m|lbf/ft': (val: number): number => val / 0.67196897675131,\n 'lbf/ft|kg/m': (val: number): number => val * 0.67196897675131,\n // PRESSURE / STRESS\n 'Pa|psi': (val: number): number => val / C.psi_to_pascal,\n 'psi|Pa': (val: number): number => val * C.psi_to_pascal,\n 'Pa|bar': (val: number): number => val * 0.00001,\n 'Pa|kPa': (val: number): number => val * 0.001,\n 'Pa|MPa': (val: number): number => val * 0.000001,\n 'Pa|GPa': (val: number): number => val * 0.000000001,\n\n 'bar|Pa': (val: number): number => val * 100000,\n 'kPa|Pa': (val: number): number => val * 1000,\n 'MPa|Pa': (val: number): number => val * 1000000,\n 'GPa|Pa': (val: number): number => val * 1000000000,\n 'psi|ksi': (val: number): number => val / 1000,\n 'ksi|psi': (val: number): number => val * 1000,\n 'psi|lbf/100ft2': (val: number): number => val * 14400, // psi = lbf/in², 1 ft² = 144 in² https://en.wikipedia.org/wiki/Square_foot\n 'lbf/100ft2|psi': (val: number): number => val / 14400,\n // FLUID COMPRESSIBILITY\n '1/psi|1/Pa': (val: number): number => val / C.psi_to_pascal,\n '1/bar|1/Pa': (val: number): number => val * 0.00001,\n '1/kPa|1/Pa': (val: number): number => val * 0.001,\n '1/MPa|1/Pa': (val: number): number => val * 0.000001,\n '1/GPa|1/Pa': (val: number): number => val * 0.000000001,\n '1/Pa|1/psi': (val: number): number => val * C.psi_to_pascal,\n '1/Pa|1/bar': (val: number): number => val * 100000,\n '1/Pa|1/kPa': (val: number): number => val * 1000,\n '1/Pa|1/MPa': (val: number): number => val * 1000000,\n '1/Pa|1/GPa': (val: number): number => val * 1000000000,\n // TEMPERATURE\n 'C|F': (val: number): number => val * 1.8 + 32,\n 'F|C': (val: number): number => ((val - 32) * 5) / 9,\n 'K|C': (val: number): number => val - C.kelvin_to_degrees,\n 'C|K': (val: number): number => val + C.kelvin_to_degrees,\n // TEMPERATURE GRADIENT\n 'C/100m|F/100ft': (val: number): number => val * 1.8 * C.ft_to_m,\n 'F/100ft|C/100m': (val: number): number => (val * 5) / 9 / C.ft_to_m,\n 'C/100m|C/m': (val: number): number => val / 100,\n 'C/m|C/100m': (val: number): number => val * 100,\n 'C/100m|F/ft': (val: number): number => ((val * 1.8) / 100) * C.ft_to_m,\n 'F/ft|C/100m': (val: number): number => (((val * 5) / 9) * 100) / C.ft_to_m,\n 'C/100m|K/m': (val: number): number => val / 100,\n 'K/m|C/100m': (val: number): number => val * 100,\n 'K/100m|C/100m': (val: number): number => val,\n 'C/100m|K/100m': (val: number): number => val,\n // PRESSURE PER TEMPERATURE\n 'Pa/C|Bar/C': (val: number): number => val * 0.00001,\n 'Pa/C|psi/F': (val: number): number => val / 1.8 / C.psi_to_pascal,\n 'Pa/C|psi/C': (val: number): number => val / C.psi_to_pascal, // https://en.wikipedia.org/wiki/Pound_per_square_inch\n 'Bar/C|Pa/C': (val: number): number => val * 100000,\n 'psi/F|Pa/C': (val: number): number => val * 1.8 * C.psi_to_pascal,\n 'psi/C|Pa/C': (val: number): number => val * C.psi_to_pascal, // ((0.45359237 kg x 9.80665 m/s²)/lbf) / (0.0254 m/in)²\n 'psi/F|psi/C': (val: number): number => val * 1.8,\n 'psi/C|psi/F': (val: number): number => val / 1.8,\n // WEIGHTf\n 'kg|kgf': (val: number): number => val,\n 'kg|lbf': (val: number): number => val * C.kg_to_lbf,\n 'kg|t': (val: number): number => val / 1000,\n 'kg|tonnes': (val: number): number => val / 1000,\n 'kg|mt': (val: number): number => val / 1000,\n /*\n 1 kip = 1000 lbf - https://en.wikipedia.org/wiki/Kip_(unit)\n */\n 'kg|kip': (val: number): number => val * C.kg_to_lbf * 1e-3,\n 'kgf|kg': (val: number): number => val,\n 'lbf|kg': (val: number): number => val * C.lbf_to_kg,\n 't|kg': (val: number): number => val * 1000,\n 'tonnes|kg': (val: number): number => val * 1000,\n 'mt|kg': (val: number): number => val * 1000,\n 'kip|kg': (val: number): number => val * 1000 * C.lbf_to_kg,\n 'tonnes|lbf': (val: number): number => val * 1000 * C.kg_to_lbf,\n 'lbf|tonnes': (val: number): number => (val * C.lbf_to_kg) / 1000,\n 't|lbf': (val: number): number => val * 1000 * C.kg_to_lbf,\n 'lbf|t': (val: number): number => (val * C.lbf_to_kg) / 1000,\n 'mt|lbf': (val: number): number => val * 1000 * C.kg_to_lbf,\n 'lbf|mt': (val: number): number => val / (1000 * C.kg_to_lbf),\n 'kgf|lbf': (val: number): number => val * C.kg_to_lbf,\n 'lbf|kgf': (val: number): number => val * C.lbf_to_kg,\n 'kg|g': (val: number): number => val * 1000,\n 'g|kg': (val: number): number => val / 1000,\n 'kgf|t': (val: number): number => val / 1000,\n 't|kgf': (val: number): number => val * 1000,\n 'kgf|tonnes': (val: number): number => val / 1000,\n 'tonnes|kgf': (val: number): number => val * 1000,\n // MASS PER LENGTH\n 'kg/m|lb/ft': (val: number): number => val * 1.4881639435695537,\n 'lb/ft|kg/m': (val: number): number => val * 0.6719689751395069,\n 'kg|N': (val: number): number => val * C.g * 100,\n 'N|kg': (val: number): number => val / (C.g * 100),\n // DISTANCE PER TIME\n 'm/s|km/h': (val: number): number => val * 3.6,\n 'km/h|m/s': (val: number): number => val / 3.6,\n 'm/s|ft/s': (val: number): number => val / C.ft_to_m,\n 'm/s|ft/min': (val: number): number => (val * 60) / C.ft_to_m,\n 'm/s|ft/h': (val: number): number => (val * 3600) / C.ft_to_m,\n 'm/s|m/min': (val: number): number => val * 60,\n 'm/s|m/h': (val: number): number => val * 3600,\n 'ft/s|m/s': (val: number): number => val * C.ft_to_m,\n 'ft/min|m/s': (val: number): number => (val * C.ft_to_m) / 60,\n 'ft/h|m/s': (val: number): number => (val * C.ft_to_m) / 3600,\n 'm/min|m/s': (val: number): number => val / 60,\n 'm/h|m/s': (val: number): number => val / 3600,\n 'm/s|mph': (val: number): number => val * 2.2369362920544,\n 'mph|m/s': (val: number): number => val / 2.2369362920544,\n 'ft/h|ft/d': (val: number): number => val * 24,\n 'ft/d|ft/h': (val: number): number => val / 24,\n 'ft/h|m/h': (val: number): number => val * C.ft_to_m,\n 'm/h|ft/h': (val: number): number => val / C.ft_to_m,\n 'ft/d|m/h': (val: number): number => (val * C.ft_to_m) / 24,\n 'm/h|ft/d': (val: number): number => (val * 24) / C.ft_to_m,\n 'ft/d|m/d': (val: number): number => val * C.ft_to_m,\n 'm/d|ft/d': (val: number): number => val / C.ft_to_m,\n 'm/h|m/d': (val: number): number => val * 24,\n 'm/d|m/h': (val: number): number => val / 24,\n // LINEAR CAPACITY\n 'l/m|bbl/ft': (val: number): number => val * 0.0019171343228277056,\n 'bbl/ft|l/m': (val: number): number => val / 0.0019171343228277056,\n // FLOW RATES\n 'm3/s|ft3/s': (val: number): number => val / C.ft3_to_m3,\n 'm3/s|lpm': (val: number): number => val * 60000,\n 'm3/s|bpm': (val: number): number => val * 377.388646,\n 'm3/s|m3/min': (val: number): number => val * 60.0,\n 'm3/s|m3/d': (val: number): number => val * C.day_to_second,\n 'm3/s|bbl/d': (val: number): number => val * 543439.6505653338,\n 'm3/s|ft3/d': (val: number): number => (val * C.day_to_second) / C.ft3_to_m3,\n 'm3/s|gpm': (val: number): number => (val * 2500000000000) / 157725491, // https://www.wolframalpha.com/input?i=m3%2Fs+\n 'm3/s|MMSCFD': (val: number): number => val / 0.32774128,\n 'm3/s|STB/d': (val: number): number => (val * 134687500000000) / 247854343,\n 'm3/s|Sm3/d': (val: number): number => val * C.day_to_second,\n 'm3/s|Sm3/min': (val: number): number => val * 60,\n 'Sm3/min|m3/s': (val: number): number => val / 60,\n 'm3/s|MSm3/d': (val: number): number => val / C.MSm3d_to_m3s,\n 'm3/s|SCF/d': (val: number): number => val * 3051187.2047366146,\n 'ft3/s|m3/s': (val: number): number => val * C.ft3_to_m3,\n 'lpm|m3/s': (val: number): number => val / 60000,\n 'lps|lpm': (val: number): number => val * 60,\n 'lpm|lps': (val: number): number => val / 60,\n 'bpm|m3/s': (val: number): number => val / 377.388646,\n 'm3/d|m3/s': (val: number): number => val / C.day_to_second,\n 'm3/min|m3/s': (val: number): number => val / 60.0,\n 'bbl/d|m3/s': (val: number): number => (val / C.day_to_second) * C.bbl_to_m3,\n 'ft3/d|m3/s': (val: number): number => (val / C.day_to_second) * C.ft3_to_m3,\n 'ft3/d|m3/d': (val: number): number => val * C.ft3_to_m3,\n 'm3/d|ft3/d': (val: number): number => val / C.ft3_to_m3,\n 'm3/d|ft3/s': (val: number): number => val / C.ft3_to_m3 / C.day_to_second,\n 'gpm|m3/s': (val: number): number => (val * 157725491) / 2500000000000, // https://www.wolframalpha.com/input?i=m3%2Fs+\n 'MMSCFD|m3/s': (val: number): number => val * 0.32774128,\n 'Mm3/d|m3/d': (val: number): number => val * 1e6,\n 'm3/d|Mm3/d': (val: number): number => val * 1e-6,\n /*\n exact formula is 247854343 / 134687500000000 = 0.0000018402178598607888 - https://www.wolframalpha.com/input?i=STB%2Fd\n STB has a lot of intermediate conversions, so to avoid delta during conversions trip we have to store 2 more digits\n */\n 'STB/d|m3/s': (val: number): number => val * 0.00000184021785986,\n 'Sm3/d|m3/d': (val: number): number => val, // At a pressure of 101.325 kPa (760 Torr) and DIN 1343: a temperature of 273.15 K (0°C/32°F) | NOTE: Thomas suggested that we leep those conversions 1to1,\n 'm3/d|Sm3/d': (val: number): number => val, // because the calculated rate is the rate at standard conditions\n 'Sm3/d|m3/s': (val: number): number => val / C.day_to_second,\n 'MSm3/d|Sm3/d': (val: number): number => val * 1e6,\n 'Sm3/d|MSm3/d': (val: number): number => val * 1e-6,\n 'MSm3/d|m3/s': (val: number): number => val * C.MSm3d_to_m3s,\n 'SCF/d|m3/s': (val: number): number => val * 3.2774128e-7,\n // TURBULENT SKIN\n '1/m3/d|1/MMSCFD': (val: number): number => val * 28316.85,\n '1/MMSCFD|1/m3/d': (val: number): number => val / 28316.85,\n 's/m3|1/m3/d': (val: number): number => val / 86400,\n '1/m3/d|s/m3': (val: number): number => val * 86400,\n // MASS FLOW RATES\n 'kg/s|lbm/s': (val: number): number => val * 2.20462262,\n 'lbm/s|kg/s': (val: number): number => val / 2.20462262,\n 'kg/s|tonnes/h': (val: number): number => val * 3.6,\n 'tonnes/h|kg/s': (val: number): number => val / 3.6,\n 'kg/s|tons/h': (val: number): number => val * 3.9683207193277967,\n 'tons/h|kg/s': (val: number): number => val * 0.2519957611111111,\n 'lbm/s|tonnes/h': (val: number): number => val * 1.632932532,\n 'tonnes/h|lbm/s': (val: number): number => val * 0.612395172735771,\n 'lbm/s|tons/h': (val: number): number => val * 1.8,\n 'tons/h|lbm/s': (val: number): number => val / 1.8,\n 'tonnes/h|tons/h': (val: number): number => val * 1.1023113109243878,\n 'tons/h|tonnes/h': (val: number): number => val * 0.90718474,\n // PERMEABILITY\n 'mD|m2': (val: number): number => val * 9.869233e-13, // https://en.wikipedia.org/wiki/Darcy_(unit)\n 'm2|mD': (val: number): number => val / 9.869233e-13,\n // GRADIENTS - Force / INTERFACIAL TENSION:\n 'N/m|lbf/ft': (val: number): number => val * 0.22480894387096 * C.ft_to_m,\n 'lbf/ft|N/m': (val: number): number => val / 0.22480894387096 / C.ft_to_m,\n 'dyn/cm|mN/m': (val: number): number => val,\n 'mN/m|dyn/cm': (val: number): number => val,\n 'dyn/cm|N/m': (val: number): number => val * 0.001,\n 'N/m|dyn/cm': (val: number): number => val * 1000,\n 'mN/m|N/m': (val: number): number => val * 0.001,\n 'N/m|mN/m': (val: number): number => val * 1000,\n // TORQUE\n 'Nm|ftlbf': (val: number): number => val * 0.737562058700684063406313,\n 'Nm|kNm': (val: number): number => val / 1000,\n 'kNm|Nm': (val: number): number => val * 1000,\n 'ftlbf|Nm': (val: number): number => val / 0.737562058700684063406313,\n // FORCE\n 'N|kN': (val: number): number => val * 0.001,\n 'N|kgf': (val: number): number => (val * 20000) / 196133, // https://www.wolframalpha.com/input?i=newtons\n 'N|lbf': (val: number): number => (val * 2000000000000) / 8896443230521, // https://www.wolframalpha.com/input?i=newtons\n 'kN|lbf': (val: number): number => (val * 1e3 * 2000000000000) / 8896443230521,\n 'N|tonneForce': (val: number): number => (val * 20) / 196133, // https://www.wolframalpha.com/input?i=tonneForce\n 'kN|N': (val: number): number => val / 0.001,\n 'kgf|N': (val: number): number => (val * 196133) / 20000, // https://www.wolframalpha.com/input?i=kgf\n 'lbf|N': (val: number): number => (val * 8896443230521) / 2000000000000, // https://www.wolframalpha.com/input?i=newtons\n 'lbf|kN': (val: number): number => (val * 8896443230521) / (2000000000000 * 1e3),\n 'lbf|tonneForce': (val: number): number => (val * 45359237) / 100000000000, // https://www.wolframalpha.com/input?i=tonneForce\n 'klbf|tonneForce': (val: number): number => (val * 45359237) / (100000000000 * 1e-3),\n 'tonneForce|N': (val: number): number => (val * 196133) / 20, // https://www.wolframalpha.com/input?i=tonneForce\n 'tonneForce|lbf': (val: number): number => (val * 100000000000) / 45359237, //https://www.wolframalpha.com/input?i=tonneForce\n 'tonneForce|klbf': (val: number): number => (val * 100000000000) / (45359237 * 1e3), // https://www.wolframalpha.com/input?i=tonneForce\n 'klbf|lbf': (val: number): number => val * 1000,\n 'lbf|klbf': (val: number): number => val / 1000,\n // DURATION\n 's|min': (val: number): number => val / 60,\n 's|h': (val: number): number => val / 3600,\n 's|d': (val: number): number => val / (24 * 3600),\n 'min|s': (val: number): number => val * 60,\n 'h|s': (val: number): number => val * 3600,\n 'd|s': (val: number): number => val * 24 * 3600,\n 'year|d': (val: number): number => val * 365.25,\n 'd|year': (val: number): number => val / 365.25,\n 'year|month': (val: number): number => val * 12,\n 'month|year': (val: number): number => val / 12,\n 'month|d': (val: number): number => val * 30.4375,\n 'd|month': (val: number): number => val / 30.4375,\n // TIME/STAND DURATION\n 's/stand|min/stand': (val: number): number => val / 60,\n 's/stand|h/stand': (val: number): number => val / 3600,\n 's/stand|d/stand': (val: number): number => val / 86400,\n 'min/stand|s/stand': (val: number): number => val * 60,\n 'h/stand|s/stand': (val: number): number => val * 3600,\n 'd/stand|s/stand': (val: number): number => val * 86400,\n 'min/stand|h/stand': (val: number): number => val / 60,\n 'min/stand|d/stand': (val: number): number => val / 1440,\n 'h/stand|min/stand': (val: number): number => val * 60,\n 'h/stand|d/stand': (val: number): number => val / 24,\n 'd/stand|min/stand': (val: number): number => val * 1440,\n 'd/stand|h/stand': (val: number): number => val * 24,\n // PERCENTAGE / FRACTIONS\n '%|fr': (val: number): number => val * 0.01,\n 'fr|%': (val: number): number => val / 0.01,\n // DEGREES\n 'deg|rad': (val: number): number => (val * Math.PI) / 180,\n 'rad|deg': (val: number): number => (val * 180) / Math.PI,\n // POWER\n 'W|hp': (val: number): number => val / 745.699872,\n 'hp|W': (val: number): number => val * 745.699872,\n 'W|kW': (val: number): number => val / 1000,\n 'W|MW': (val: number): number => val / 1e6,\n 'kW|W': (val: number): number => val * 1000,\n 'MW|W': (val: number): number => val * 1e6,\n 'W|BTU/h': (val: number): number => val * 3.4121416351331,\n 'BTU/h|W': (val: number): number => val / 3.4121416351331,\n 'hhp|hp': (val: number): number => val, // hydraulic horsepower is just horsepower\n 'hp|hhp': (val: number): number => val,\n // NAVIGATION\n '°N|°S': (val: number): number => val,\n '°S|°N': (val: number): number => val,\n '°W|°E': (val: number): number => val,\n '°E|°W': (val: number): number => val,\n // Specific Heat Capacity\n 'BTU/(Kg*K)|BTU/(lbm*degF)': (val: number): number => val / 4186.798188,\n 'BTU/(lbm*degF)|J/(kg*degC)': (val: number): number => val * 4186.798188,\n 'BTU/(lbm*degF)|BTU/(Kg*K)': (val: number): number => val * 4186.798188,\n\n 'J/(kg*degK)|J/(kg*degC)': (val: number): number => val,\n 'J/(kg*degC)|BTU/(lbm*degF)': (val: number): number => val / 4186.798188,\n 'J/(kg*degC)|J/(kg*degK)': (val: number): number => val,\n 'J/(kg*degC)|J/(s*m*degK)': (val: number): number => val,\n // Thermal conductivity\n 'BTU/(h*ft*degF)|W/(mK)': (val: number): number => val * 1.7295772056,\n 'BTU/(h*ft*degF)|J/(s*m*degK)': (val: number): number => val * 1.7295772056,\n\n 'W/(mK)|BTU/(h*ft*degF)': (val: number): number => val / 1.7295772056,\n 'W/(mK)|J/(s*m*degK)': (val: number): number => val,\n 'W/(m*degK)|J/(s*m*degK)': (val: number): number => val,\n 'W/(m*degK)|BTU/(h*ft*degF)': (val: number): number => val / 1.7295772056,\n\n 'J/(s*m*degK)|BTU/(h*ft*degF)': (val: number): number => val / 1.7295772056,\n 'J/(s*m*degK)|W/(m*degK)': (val: number): number => val,\n 'J/(s*m*degK)|W/(mK)': (val: number): number => val,\n 'J/(s*m*degK)|J/(kg*degC)': (val: number): number => val,\n // THERMAL EXPANSION\n 'E-06/degF|E-06/degC': (val: number): number => val * 1.8,\n 'E-06/degC|E-06/degF': (val: number): number => val / 1.8,\n 'E-06/degC|1/K': (val: number): number => val / 1000000,\n '1/K|E-06/degC': (val: number): number => val * 1000000,\n // FREQUENCY\n 'rpm|Hz': (val: number): number => val / 60,\n 'Hz|rpm': (val: number): number => val * 60,\n // Confidence interval\n 'CI|Sigma': (val: number): number => get_k_from_conf_int(val),\n 'Sigma|CI': (val: number): number => get_conf_int_from_k(val),\n // Mole weight:\n 'g/mol|kg/mol': (val: number): number => val / 1000,\n 'kg/mol|g/mol': (val: number): number => val * 1000,\n 'lbf/mol|kg/mol': (val: number): number => val / C.kg_to_lbf,\n 'kg/mol|lbf/mol': (val: number): number => val * C.kg_to_lbf,\n // Acceleration:\n 'm/s2|ft/s2': (val: number): number => val / C.ft_to_m,\n 'ft/s2|m/s2': (val: number): number => val * C.ft_to_m,\n // Viscosity:\n 'Pa*s|P': (val: number): number => val * 10,\n 'P|Pa*s': (val: number): number => val / 10,\n 'mPa*s|Pa*s': (val: number): number => val / 1000,\n 'Pa*s|mPa*s': (val: number): number => val * 1000,\n 'cP|Pa*s': (val: number): number => val * 0.001,\n 'Pa*s|cP': (val: number): number => val / 0.001,\n // GRADIENTS - Pressure:\n 'Pa/m|bar/m': (val: number): number => val * 0.00001,\n 'bar/m|Pa/m': (val: number): number => val * 100000,\n 'Pa/m|kPa/m': (val: number): number => val / 1000,\n 'kPa/m|Pa/m': (val: number): number => val * 1000,\n 'Pa/m|bar/100m': (val: number): number => val * 0.001,\n 'bar/100m|Pa/m': (val: number): number => val * 1000,\n 'bar/m|bar/100m': (val: number): number => val * 100,\n 'bar/100m|bar/m': (val: number): number => val / 100,\n 'psi/ft|Pa/m': (val: number): number => (val * C.psi_to_pascal) / C.ft_to_m,\n 'Pa/m|psi/ft': (val: number): number => (val / C.psi_to_pascal) * C.ft_to_m,\n 'psi/100ft|Pa/m': (val: number): number => (val * 68.9475729) / C.ft_to_m,\n 'Pa/m|psi/100ft': (val: number): number => (val / 68.9475729) * C.ft_to_m,\n // Gradients - Angles:\n 'deg/30m|deg/100ft': (val: number): number => val * ((100 * C.ft_to_m) / 30),\n 'deg/100ft|deg/30m': (val: number): number => val / ((100 * C.ft_to_m) / 30),\n 'deg/30m|deg/m': (val: number): number => val / 30,\n 'deg/m|deg/30m': (val: number): number => val * 30,\n 'deg/100ft|deg/ft': (val: number): number => val / 100,\n 'deg/ft|deg/100ft': (val: number): number => val * 100,\n 'deg/100ft|deg/m': (val: number): number => val / (100 * C.ft_to_m),\n 'deg/m|deg/100ft': (val: number): number => val * (100 * C.ft_to_m),\n 'deg/ft|deg/m': (val: number): number => val / C.ft_to_m,\n 'deg/m|deg/ft': (val: number): number => val * C.ft_to_m,\n 'deg/m|rad/m': (val: number): number => (val * Math.PI) / 180,\n 'rad/m|deg/m': (val: number): number => (val * 180) / Math.PI,\n 'rad/ft|deg/m': (val: number): number => (val * 180) / Math.PI / C.ft_to_m,\n 'deg/m|rad/ft': (val: number): number => ((val * Math.PI) / 180) * C.ft_to_m,\n 'deg/10m|deg/100ft': (val: number): number => val * (10 * C.ft_to_m),\n 'deg/100ft|deg/10m': (val: number): number => val / (10 * C.ft_to_m),\n 'deg/10m|deg/m': (val: number): number => val / 10,\n 'deg/m|deg/10m': (val: number): number => val * 10,\n 'deg/30m|deg/10m': (val: number): number => val / 3,\n 'deg/10m|deg/30m': (val: number): number => val * 3,\n 'deg/10m|rad/m': (val: number): number => (val * Math.PI) / 180 / 10,\n 'rad/m|deg/10m': (val: number): number => ((val * 180) / Math.PI) * 10,\n // intensity\n 'W/m2|hhp/in2': (val: number): number => val * (1 / 745.699872 / 1550.0031),\n 'W/m2|hhp/ft2': (val: number): number => val * (1 / 745.699872 / 10.76391),\n 'hhp/in2|W/m2': (val: number): number => val / (1 / 745.699872 / 1550.0031),\n 'hhp/ft2|W/m2': (val: number): number => val / (1 / 745.699872 / 10.76391),\n // Gas Oil Ratio:\n 'SCF/STB|Sm3/Sm3': (val: number): number => val * 0.178099173553719, // 431 / 2420 = 0.17809917355371901 - https://www.wolframalpha.com/input?i=Standard+Cubic+Feet+per+Stock+Tank+Barrel\n 'Sm3/Sm3|SCF/STB': (val: number): number => val * 5.614849187935035, // 2420 / 431 = 5.614849187935035\n // Inflow Productivity Index\n 'Sm3/d/bar|m3/s/bar': (val: number): number => val / 86400,\n 'STB/d/psi|m3/s/bar': (val: number): number => val / 37468.77736,\n 'm3/s/bar|Sm3/d/bar': (val: number): number => val * 86400,\n 'm3/s/bar|STB/d/psi': (val: number): number => val * 37468.77736,\n 'E-10/psi|E-09/bar': (val: number): number => val * 1.450377378,\n 'E-10/psi|E-14/pa': (val: number): number => val * 1.450377378,\n 'E-14/pa|E-10/psi': (val: number): number => val / 1.450377378,\n 'E-09/bar|E-10/psi': (val: number): number => val / 1.450377378,\n 'E-14/pa|1/Pa': (val: number): number => val / Math.pow(10, 14),\n 'E-09/bar|1/bar': (val: number): number => val / Math.pow(10, 9),\n 'E-10/psi|1/psi': (val: number): number => val / Math.pow(10, 10),\n '1/Pa|E-14/pa': (val: number): number => val * Math.pow(10, 14),\n '1/bar|E-09/bar': (val: number): number => val * Math.pow(10, 9),\n '1/psi|E-10/psi': (val: number): number => val * Math.pow(10, 10),\n // volumeGradient\n 'm3/m|cm3/m': (val: number): number => val * 10 ** 6,\n 'm3/m|mm3/m': (val: number): number => val * 10 ** 9,\n 'm3/m|ft3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft,\n 'm3/m|in3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * C.ft3_to_in3,\n 'cm3/m|m3/m': (val: number): number => val * 1e-6,\n 'cm3/m|mm3/m': (val: number): number => val * 1e3,\n 'cm3/m|ft3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-6,\n 'cm3/m|in3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-6 * C.ft3_to_in3,\n 'mm3/m|m3/m': (val: number): number => val * 1e-9,\n 'mm3/m|cm3/m': (val: number): number => val * 0.001,\n 'mm3/m|ft3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-9,\n 'mm3/m|in3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-9 * C.ft3_to_in3,\n 'ft3/ft|m3/m': (val: number): number => val * 0.09290304,\n 'ft3/ft|cm3/m': (val: number): number => val * 92903.04,\n 'ft3/ft|mm3/m': (val: number): number => val * 92903040,\n 'ft3/ft|in3/ft': (val: number): number => val * 1728,\n 'in3/ft|m3/m': (val: number): number => val * C.in3_per_ft_to_m3_per_m,\n 'in3/ft|cm3/m': (val: number): number => val * C.in3_per_ft_to_m3_per_m * 1e6,\n 'in3/ft|mm3/m': (val: number): number => val * C.in3_per_ft_to_m3_per_m * 1e9,\n 'in3/ft|ft3/ft': (val: number): number => val / C.ft3_to_in3,\n // shearStress\n 'Pa|lbf/100ft2': (val: number): number => val * 2.088543423315013, // (100 * 185806080000) / 8896443230521 = 2.088543423315013 - https://www.wolframalpha.com/input?i=Pa+unit\n 'lbf/100ft2|Pa': (val: number): number => val * 0.4788025898033584, // 8896443230521 / (185806080000 * 100) = 0.47880258980335844, // https://www.wolframalpha.com/input?i=Pa+unit\n // GIS Location Systems\n 'usft|m': (val: number): number => val * 0.30480060960121924,\n 'lk|m': (val: number): number => val * 0.201168,\n 'ftCla|m': (val: number): number => val * 0.3047972651151,\n 'lkCla|m': (val: number): number => val * 0.2011057269733667,\n 'ftGC|m': (val: number): number => val * 0.30479971018150875,\n 'ydInd|m': (val: number): number => val * 0.9143985307444408,\n 'ftSe|m': (val: number): number => val * (12 / 39.370147),\n 'ydSe|m': (val: number): number => val * 0.9143991154275526,\n 'chSe|m': (val: number): number => val * 20.11676512155263,\n 'chSe(T)|m': (val: number): number => val * 20.116756,\n 'm|usft': (val: number): number => val / 0.30480060960121924,\n 'm|lk': (val: number): number => val / 0.201168,\n 'm|ftCla': (val: number): number => val / 0.3047972651151,\n 'm|lkCla': (val: number): number => val / 0.2011057269733667,\n 'm|ftGC': (val: number): number => val / 0.30479971018150875,\n 'm|ydInd': (val: number): number => val / 0.9143985307444408,\n 'm|ftSe': (val: number): number => val / (12 / 39.370147),\n 'm|ydSe': (val: number): number => val / 0.9143991154275526,\n 'm|chSe': (val: number): number => val / 20.11676512155263,\n 'm|chSe(T)': (val: number): number => val / 20.116756,\n // Mixing Requirements\n 'm3/t|L/100kg': (val: number) => val * 100,\n 'L/100kg|m3/t': (val: number) => val * 0.01,\n //entalphy\n 'kJ/kg|J/kg': (val: number) => val * 1000,\n 'J/kg|kJ/kg': (val: number) => val / 1000,\n 'BTU/lbm|J/kg': (val: number) => val * 2326,\n 'J/kg|BTU/lbm': (val: number) => val / 2326,\n // sensor accelerometer\n 'g|m/s2': (val: number): number => val * 9.81,\n 'm/s2|g': (val: number): number => val / 9.81,\n // sensor magnetometer\n 'Gs|nT': (val: number): number => val * 100000,\n 'nT|Gs': (val: number): number => val / 100000,\n});\n\n/**\n * Deprecated units\n *\n * @readonly\n * @enum {Object}\n */\nexport const DEPRECATED_UNITS: Record<string, string> = Object.freeze({\n 'N-m': 'Nm',\n 'ft-lbf': 'ftlbf',\n 'BTU/hr': 'BTU/h',\n 'BTU/(htf*degF)': 'BTU/(h*ft*degF)',\n 'BTU/(hft*degF)': 'BTU/(h*ft*degF)',\n});\n\n/**\n * This list is mapping from legal alternative unit names to our selected unit name\n *\n * @readonly\n * @enum {Object}\n */\nexport const UNIT_ALIASES: Record<string, string> = Object.freeze({\n 'lbs/ft': 'lb/ft',\n 'lbm/ft': 'lb/ft', // pound-mass per feet\n ftUS: 'usft', // US feet, GIS interpretation\n});\n\n/**\n * Intermediate conversions\n *\n * @readonly\n * @enum {Object}\n */\nexport const INTERMEDIATE_CONVERSIONS: Record<string, string> = Object.freeze({\n // LENGTH\n mm: 'm',\n cm: 'm',\n km: 'm',\n ft: 'm',\n in: 'm',\n microM: 'm',\n // WEIGHT\n lbf: 'kg',\n t: 'kg',\n tonnes: 'kg',\n mt: 'kg',\n kip: 'kg',\n // POWER\n kW: 'W',\n MW: 'W',\n hp: 'W',\n hhp: 'hp',\n // AREA\n mm2: 'm2',\n cm2: 'm2',\n km2: 'm2',\n in2: 'm2',\n ft2: 'm2',\n mile2: 'm2',\n // VOLUME\n bbl: 'm3',\n ft3: 'm3',\n Mm3: 'm3',\n l: 'm3',\n USGal: 'm3',\n Sm3: 'm3',\n STB: 'm3',\n MMSCF: 'm3',\n MSm3: 'm3',\n SCF: 'm3',\n // FORCE\n kN: 'N',\n kgf: 'N',\n tonneForce: 'N',\n klbf: 'lbf',\n // PRESSURE\n psi: 'Pa',\n bar: 'Pa',\n kPa: 'Pa',\n MPa: 'Pa',\n ksi: 'psi',\n 'lbf/100ft2': 'psi',\n // Pressure gradients:\n 'psi/100ft': 'Pa/m',\n 'psi/ft': 'Pa/m',\n 'bar/100m': 'Pa/m',\n 'bar/m': 'Pa/m',\n 'Pa/m': 'kPa/m',\n // DENSITY\n sg: 'kg/m3',\n 'g/cm3': 'kg/m3',\n 'lbm/ft3': 'kg/m3',\n 'lb/ft3': 'kg/m3',\n ppg: 'kg/m3',\n 'kPa/m': 'sg',\n // GAS DENSITY\n Gsg: 'Gkg/m3',\n Gppg: 'Gkg/m3',\n 'Glbm/ft3': 'Gkg/m3',\n // FLUID COMPRESSIBILITY\n '1/psi': '1/Pa',\n '1/bar': '1/Pa',\n '1/kPa': '1/Pa',\n '1/MPa': '1/Pa',\n '1/GPa': '1/Pa',\n // DISTANCE PER TIME\n 'ft/s': 'm/s',\n 'ft/min': 'm/s',\n 'ft/h': 'm/s',\n 'm/min': 'm/s',\n 'm/h': 'm/s',\n mph: 'm/s',\n // FLOW RATE\n 'ft3/s': 'm3/s',\n lpm: 'm3/s',\n lps: 'lpm',\n bpm: 'm3/s',\n 'm3/d': 'm3/s',\n 'bbl/d': 'm3/s',\n 'ft3/d': 'm3/s',\n 'STB/d': 'm3/s',\n 'Sm3/d': 'm3/s',\n 'Sm3/min': 'm3/s',\n gpm: 'm3/s',\n MMSCFD: 'm3/s',\n 'Mm3/d': 'm3/d',\n 'm3/min': 'm3/s',\n 'MSm3/d': 'm3/s',\n 'lbf/ft': 'N/m',\n // DURATION\n min: 's',\n h: 's',\n d: 's',\n month: 'd',\n year: 'd',\n //Specific Heat Capacity\n 'J/(kg*degK)': 'J/(kg*degC)',\n 'BTU/(lbm*degF)': 'J/(kg*degC)',\n 'BTU/(Kg*K)': 'J/(kg*degC)',\n //Thermal conductivity\n 'BTU/(h*ft*degF)': 'J/(s*m*degK)',\n 'W/(m*degK)': 'J/(s*m*degK)',\n 'W/(mK)': 'J/(s*m*degK)',\n // Temperature:\n K: 'C',\n // Temp grad:\n 'C/m': 'C/100m',\n 'F/ft': 'C/100m',\n 'K/m': 'C/100m',\n 'F/100ft': 'C/100m',\n 'K/100m': 'C/100m',\n // Pressure Per Temperature\n 'Bar/C': 'Pa/C',\n // Turbulent skin\n 's/m3': '1/m3/d',\n '1/MMSCFD': '1/m3/d',\n // Visosity:\n P: 'Pa*s',\n 'mPa*s': 'Pa*s',\n cP: 'Pa*s',\n // Intensity:\n 'hhp/in2': 'W/m2',\n 'hhp/ft2': 'W/m2',\n // Inflow Productivity Index:\n 'Sm3/d/bar': 'm3/s/bar',\n 'STB/d/psi': 'm3/s/bar',\n // Angle gradients:\n 'deg/100ft': 'deg/m',\n 'deg/30m': 'deg/m',\n 'deg/10m': 'deg/m',\n 'deg/ft': 'deg/m',\n 'rad/ft': 'deg/m',\n // Mole weight:\n 'lbf/mol': 'kg/mol',\n 'g/mol': 'kg/mol',\n // Thermal expansion\n '1/K': 'E-06/degC',\n 'E-09/bar': 'E-10/psi',\n 'E-14/pa': 'E-10/psi',\n '1/Pa': 'E-14/pa',\n // TORQUE\n kNm: 'Nm',\n ftlbf: 'Nm',\n // GIS Location Systems\n lk: 'm',\n ftCla: 'm',\n lkCla: 'm',\n ftSe: 'm',\n ydSe: 'm',\n chSe: 'm',\n 'chSe(T)': 'm',\n ftGC: 'm',\n ydInd: 'm',\n //Entalphy\n 'BTU/lbm': 'J/kg',\n});\n\n/**\n * List of all known units in application\n *\n * @readonly\n * @enum {string[]}\n */\nexport const KNOWN_UNITS = Object.freeze(Array.from(new Set(Object.values(ALT_UNITS).flat())));\n\nconst SPECIAL_NUMBERS = [NaN, -Infinity, Infinity];\nexport const SPECIAL_NUMBERS_STRING = SPECIAL_NUMBERS.map((number) => number.toString());\n\n/**\n * Description for the different quantites\n * @readonly\n */\nexport const QUANTITIES_DESCRIPTION = {\n density: 'Density',\n length: 'Length',\n duration: 'Duration',\n temperature: 'Temperature',\n tempgrad: 'Temperature Gradient',\n volume: 'Volume',\n weight: 'Weight',\n angles: 'Angles',\n depth: 'Depth',\n distance: 'Distances',\n height: 'Height',\n diameters: 'Diameters',\n doglegSeverity: 'Dogleg severity',\n fluidCompressibility: 'Fluid Compressibility',\n force: 'Force',\n gasVolume: 'Gas volume',\n oilVolume: 'Oil volume',\n moleWeight: 'Mole weight',\n linearCapacity: 'Linear Capacity',\n stress: 'Stress',\n thermalConductivity: 'Thermal conductivity',\n specificHeatCapacity: 'Specific heat capacity',\n thermalExpansionCoefficient: 'Thermal expansion coefficient',\n youngsModulus: 'Youngs Modulus',\n torque: 'Torque',\n areaOther: 'Area - Other',\n areaTubular: 'Area - Tubular',\n pumpRate: 'Pump Rate',\n pressure: 'Pressure',\n blowoutFlowRate: 'Flowrate (blowout)',\n percentage: 'Percentage',\n frequency: 'Frequency',\n torqueGradient: 'Torque gradient',\n pressureGradient: 'Pressure gradient',\n flowrate: 'Volumetric flow rate',\n massFlowRate: 'Mass flow rate',\n angleGradient: 'Angle gradient',\n weightGradient: 'Weight gradient',\n forceGradient: 'Force gradient',\n interfacialTension: 'Interfacial tension',\n acceleration: 'Acceleration',\n viscosity: 'Viscosity',\n power: 'Power',\n intensity: 'Power intensity',\n gasliftFlowRate: 'Flowrate (Gas lift)',\n productionFlowRate: 'Flowrate (production)',\n productionFlowRateOil: 'Flowrate for Oil (production)',\n productionFlowRateGas: 'Flowrate for Gas (production)',\n injectionFlowRate: 'Flowrate (injection)',\n blowoutOilFlowRate: 'Flowrate for Oil (blowout)',\n blowoutGasFlowRate: 'Flowrate for Gas (blowout)',\n gor: 'Gas Oil Ratio',\n rotationalSpeed: 'Rotational Speed',\n densityGas: 'Density for gas',\n inflowProductivityIndex: 'Inflow productivity index',\n latitude: 'Latitude',\n longitude: 'Longitude',\n permeability: 'Permeability',\n sdstats: 'Standard deviation',\n roughness: 'Material Roughness',\n wltubulars: 'Tubular weight',\n speed: 'Velocity',\n inverseStandSpeed: 'Inverse Stand velocity',\n rop: 'Rate of Penetration (ROP)',\n densityOil: 'Density for oil',\n densityOilGas: 'Density for oil/gas',\n kickToleranceVolume: 'Volume for kick tolerance',\n densitySolid: 'Density for solid',\n massPerLength: 'Mass Per Length',\n durationShort: 'Duration (TempSim short)',\n durationLong: 'Duration (TempSim long)',\n wearFactor: 'Wear factor',\n turbulentSkin: 'Turbulent skin',\n pressurePerTemperature: 'Pressure per temperature',\n location: 'Location coordinates length',\n mixingRequirements: 'Ratio between water and cement',\n Entalphy: 'Entalphy',\n shearStress: 'Shear Stress, force parallel to surface',\n volumeGradient: 'Rate of Volume change per unit',\n deg: 'Degree, a unit of angular measurement',\n dls: 'Dogleg Severity, measure of wellbore curvature changes per unit length',\n wgrad: 'Weight Gradient, change in weight per unit length',\n entalphy: 'Entalphy, total heat content of a system',\n pressurechange: 'Change in pressure over time or between two points',\n rpm: 'Rotations per minute, a measure of the frequency of rotation, specifying the number of full rotations completed in one minute around a fixed axis',\n sensorAccelerometer: 'Strength of gravitational acceleration',\n sensorMagnetometer: 'Strength of magnetic forces at a position',\n};\n\n/**\n * Description for the different units\n * @readonly\n */\nexport const UNITS_DESCRIPTION = {\n in: 'Inches',\n mm: 'Milimeters',\n cm: 'Centimeters',\n m: 'Meters',\n km: 'Kilometers',\n ft: 'Feets',\n usft: 'US Feets',\n in2: 'Square inches',\n cm2: 'Square centimeters',\n m2: 'Square meters',\n kg: 'Kilograms',\n tonnes: 'Tonnes',\n mt: 'Metric tonnes',\n kip: 'Kip',\n bbl: 'Barrels',\n Mm3: 'Mega cubic meters',\n MMSCF: 'Million Standard Cubic Feet',\n lbm: 'Pound mass',\n 'kg/mol': 'Kilograms per mole',\n 'lbf/mol': 'Pounds per mole',\n sg: 'Specific gravity',\n ppg: 'Pounds per gallon',\n 'kg/m3': 'Kilogram per cubic meters',\n 'lbm/ft3': 'Pounds per cubic foot',\n s: 'Seconds',\n min: 'Minutes',\n h: 'Hours',\n d: 'Days',\n month: 'Months',\n year: 'Years',\n 'bbl/ft': 'Barrels per foot',\n lpm: 'Litres per minute',\n bpm: 'Barrels per minute',\n 'm3/min': 'Cubic meters per minute',\n 'm3/s': 'Cubic meters per second',\n MMSCFD: 'Million Standard Cubic Feet per day',\n '1/MMSCFD': 'Inverse Million Standard Cubic Feet per day',\n bar: 'Bar',\n Pa: 'Pascals',\n kPa: 'Kilopascals',\n MPa: 'Megapascals',\n kPsi: 'Kilo pounds per square inch',\n 'kPa/m': 'Kilopascals per meter',\n 'psi/ft': 'Psi per foot',\n 'bar/100m': 'Bars per 100m',\n 'psi/100ft': 'Psi per 100ft',\n 'kPa/100m': 'Kilopascals per 100m',\n C: 'Degrees Celsius',\n F: 'Degrees Fahrenheit',\n K: 'Kelvins',\n 'C/100m': 'Degrees Celsius per 100m',\n 'F/100ft': 'Degrees Fahrenheit per 100m',\n 'K/100m': 'Kelvins per 100m',\n 'lbf/ft': 'Pound force / foot',\n 'Pa/C': 'Pascal per celsius',\n 'Bar/C': 'Bar per celsius',\n 'psi/F': 'Psi per fahrenheit',\n 'psi/C': 'Psi per celsius',\n N: 'Newtons',\n kN: 'Kilo Newtons',\n 'N/m': 'Newtons per meter',\n 'daN/m': 'Decanewtons per meter',\n lbf: 'Pound force',\n kgf: 'Kilogram force',\n rad: 'Radians',\n 'BTU/lbm': 'British Thermal Units per pound',\n ppf: 'Pound per foot',\n 'kg/m': 'Kilograms per meter',\n 'E-06/degC': 'Micro per degree Celsius',\n 'E-06/degF': 'Micro per degree Fahrenheit',\n km2: 'Square kilometers',\n ft2: 'Square feet',\n mm2: 'Square millimeters',\n mile2: 'Square miles',\n ft3: 'Cubic feet',\n 'g/cm3': 'Grams per cubic centimeter',\n Sm3: 'Standard cubic meter',\n 'ft3/s': 'Cubic feet per second',\n 'ft3/d': 'Cubic feet per day',\n 'm3/d': 'Cubic meter per day',\n '1/m3/d': 'Inverse Cubic meter per day',\n 's/m3': 'Seconds per cubic meters',\n 'bbl/d': 'Barrels per day',\n tonneForce: 'Tonne force',\n USGal: 'US gallon',\n 'g/mol': 'Grams per mol',\n Nm: 'Newton meter',\n kNm: 'Kilo Newton meter',\n ftlbf: 'Foot pound',\n 'J/(kg*degC)': 'Joules per kilogram degree Celsius',\n 'J/(kg*degK)': 'Joules per kilogram degree Kelwin',\n 'BTU/(lbm*degF)': 'British Thermal Unit per pound Fahrenheit',\n 'BTU/(h*ft*degF)': 'British Thermal Units per hour feet degree Fahrenheit',\n l: 'Litres',\n 'l/m': 'Litres per meter',\n 'kJ/kg': 'Kilo joules per kilogram',\n 'J/kg': 'Joules per kilogram',\n deg: 'Degrees',\n 'W/(mK)': 'Watts per milli Kelvin',\n psi: 'Pounds per square inch',\n '1/bar': '1/bar',\n '1/psi': '1/psi',\n 'deg/100ft': 'Degrees per 100ft',\n 'deg/10m': 'Degrees per 10m',\n 'deg/30m': 'Degrees per 30m',\n '%': 'Percent',\n Hz: 'Hertz',\n '1/s': 'Inverse second',\n rpm: 'Revolutions per minute',\n 'Pa/m': 'Pascal per meter',\n 'bar/m': 'Bar per meter',\n gpm: 'Gallons per minute',\n 'kg/s': 'Kilograms per second',\n 'lbm/s': 'Pound mass per second',\n 'tonnes/h': 'Tonnes per hour',\n 'tons/h': 'Tons per hour',\n 'deg/m': 'Degrees per meter',\n 'deg/ft': 'Degrees per foot',\n 'rad/m': 'Radians per meter',\n 'rad/ft': 'Radians per foot',\n 'dyn/cm': 'Dyn per centimeter',\n 'mN/m': 'Millinewtons per meter',\n '1/kPa': '1/kPa',\n m3: 'Cubic meters',\n 'm/s': 'Meters per second',\n 'ft/s': 'Feet per second',\n 'm/min': 'Meters per minute',\n 'ft/min': 'Feet per min',\n 'm/h': 'Meters per hour',\n 'ft/h': 'Feet per hour',\n mph: 'Miles per hour',\n 'km/h': 'Kilometers per hour',\n 'm/s2': 'Meters per second squared',\n 'ft/s2': 'Feet per second squared',\n 'Pa*s': 'Pascal seconds',\n P: 'Poise (dyne second per square centimeter)',\n 'mPa*s': 'Millipascal seconds',\n cP: 'Centi Poise',\n W: 'Watts',\n hhp: 'Hydraulic horsepower',\n hp: 'Horsepower',\n kW: 'Kilowatts',\n MW: 'Megawatts',\n 'BTU/h': 'British Thermal Units per hour',\n 'hhp/in2': 'Hydraulic horsepower per square inch',\n 'hhp/ft2': 'Hydraulic horsepower per square feet',\n 'Mm3/d': 'Mega cubic meters per day',\n 'STB/d': 'Stock Tank Barrel per day',\n 'Sm3/d': 'Standard cubic meters per day',\n 'Sm3/min': 'Standard cubic meters per minute',\n 'MSm3/d': 'Mega standard cubic meters per day',\n 'SCF/STB': 'Standard Cubic Feet per Stock Tank Barrel',\n 'Sm3/Sm3': 'Standard cubic meters per Standard cubic meter',\n 'SCF/d': 'Standard cubic feet per day',\n STB: 'Stock Tank Barrel',\n SCF: 'Standard Cubic Feet',\n Gsg: 'Gas - specific gravity',\n Gppg: 'Gas - pounds per gallon',\n 'Gkg/m3': 'Gas - kilogram per cubic meters',\n 'Glbm/ft3': 'Gas - pounds per cubic foot',\n MSm3: 'Mega standard cubic meters',\n 'm3/s/bar': 'Cubic per second per bar',\n 'Sm3/d/bar': 'Standard cubic per day per bar',\n 'STB/d/psi': 'Standard barrels per day per psi',\n klbf: 'kilopound force',\n '1/Pa': '1/Pascal',\n '1/MPa': '1/MPa',\n ksi: 'Kilopound per square inch',\n 'lbf/100ft2': 'Pounds per 100 square foot',\n 'lb/ft3': 'lb/ft3',\n '°N': '°N (latitude)',\n '°S': '°S (latitude)',\n '°W': '°W (longitude)',\n '°E': '°E (longitude)',\n fr: 'Fraction',\n mD: 'Millidarcy',\n Sigma: 'Sigma',\n CI: 'Confidence Interval',\n 'J/(s*m*degK)': 'Joules per second meter Kelvin',\n 'C/m': 'Degrees Celsius per meter',\n 'F/ft': 'Degrees Fahrenheit per meter',\n 'K/m': 'Kelvin per meter',\n microM: 'Micro meter',\n 'W/m2': 'Watt per square meter',\n '1/K': 'Inverse Kelvin',\n 'lb/ft': 'Pound Per Feet',\n 'E-09/bar': 'Nano per bar',\n 'E-10/psi': '10⁻¹⁰ per psi',\n 'E-14/pa': '10⁻¹⁴ per pascal',\n lk: 'Link',\n ftCla: 'Clark`s foot',\n lkCla: 'Clark`s link',\n ftSe: 'British foot (Sears 1922)',\n ydSe: 'British yard (Sears 1922)',\n chSe: 'British chain (Sears 1922)',\n 'chSe(T)': 'British chain (Sears 1922 Truncated)',\n ftGC: 'Gold Coast foot',\n ydInd: 'Indian yard',\n 'd/stand': 'Day per stand',\n 'h/stand': 'Hour per stand',\n 'min/stand': 'Minute per stand',\n 's/stand': 'Second per stand',\n 'm3/t': 'Cubic meter per ton',\n 'L/100kg': 'Liter per 100kg',\n GPa: 'Gigapascals, unit of pressure',\n 'cm3/m': 'Cubic cm per meter',\n 'in3/ft': 'Cubic inches per foot',\n 'ft3/ft': 'Cubic feet per foot',\n 'm3/m': 'Cubic meters per meter',\n 'mm3/m': 'Cubic millimeters per meter',\n '1/GPa': 'Inverse gigapascal',\n lps: 'Liters per second',\n nT: 'nanoTesla',\n Gs: 'Gauss',\n g: 'g force',\n};\n","import { ALT_UNITS, LABELS, UNIT_FROM_KEY } from './constants.ts';\nimport type { AltUnitWithLabel } from './types.ts';\n\n/** Returns the units configured for a quantity key. */\nexport function showAltUnitsList(quantityKey: string): string[] | undefined {\n return ALT_UNITS[quantityKey];\n}\n\n/** Returns the units configured for a quantity. */\nexport function getUnitsForQuantity(quantity: string): string[] | undefined {\n return showAltUnitsList(quantity);\n}\n\n/** Returns all configured quantity keys. */\nexport function getQuantities(): string[] | undefined {\n return Object.keys(ALT_UNITS);\n}\n\n/** Returns the display label for a unit key. */\nexport function label(unitKey: string): string | undefined {\n return LABELS[unitKey];\n}\n\n/** Returns the base unit configured for a quantity. */\nexport function unitFromKey(quantity: string): string | undefined {\n return UNIT_FROM_KEY[quantity];\n}\n\n/** Alias for `unitFromKey`. */\nexport function unitFromQuantity(quantity: string): string | undefined {\n return unitFromKey(quantity);\n}\n\n/** Returns the alternative units and their display labels for a quantity. */\nexport function getAltUnitsListByQuantity(quantity: string): AltUnitWithLabel[] | undefined {\n const quantityUnitList = showAltUnitsList(quantity);\n return quantityUnitList ? quantityUnitList.map((unit) => ({ unit, label: label(unit) })) : undefined;\n}\n","/** Basic trimming of numeric input strings. */\nexport const trim = (value: string): string => {\n return value.trim().replace(/[\\t\\r\\n]/g, '');\n};\n\n/** Counts occurrences of a character in a string. */\nexport function charCount(character: string | number, value: string): number {\n const singleCharacter = String(character)[0];\n let total = 0;\n let lastLocation = value.indexOf(singleCharacter, 0) + 1;\n while (lastLocation > 0) {\n lastLocation = value.indexOf(singleCharacter, lastLocation) + 1;\n total += 1;\n }\n return total;\n}\n\n/** Normalizes supported decimal and thousands separators in a numeric input string. */\nexport function cleanNumStr(value: string | number): string {\n let cleanString = trim(String(value));\n const slashCount = charCount('/', cleanString);\n const spaceCount = charCount(' ', cleanString) + charCount(' ', cleanString);\n let dotCount = charCount('.', cleanString);\n let commaCount = charCount(',', cleanString);\n if (slashCount === 0 && spaceCount > 0) {\n cleanString = cleanString.replace(/\\s/g, '');\n }\n if (commaCount > 1) {\n cleanString = cleanString.replace(/,/g, '');\n }\n if (dotCount > 1) {\n cleanString = cleanString.replace(/\\./g, '');\n }\n commaCount = charCount(',', cleanString);\n dotCount = charCount('.', cleanString);\n if (dotCount === 1 && commaCount === 1) {\n if (cleanString.indexOf(',') > cleanString.indexOf('.')) {\n cleanString = cleanString.replace('.', '');\n cleanString = cleanString.replace(',', '.');\n } else {\n cleanString = cleanString.replace(',', '');\n }\n if (cleanString.indexOf('.') === 0) {\n cleanString = `0${cleanString}`;\n }\n return cleanString;\n }\n\n if (!dotCount && commaCount) {\n cleanString = cleanString.replace(',', '.');\n }\n if (cleanString.indexOf('.') === 0) {\n cleanString = `0${cleanString}`;\n }\n return cleanString;\n}\n\n/** Removes redundant leading zeros while preserving the sign and fractional part. */\nexport const stripLeadingZeros = (value: string): string => {\n const isMinus = value?.[0] === '-';\n const matchMinus = /^-/gm;\n const matchLeadingZeros = /^(?:0+(?=[1-9])|0+(?=0))/gm;\n const cleanedValue = value.replace(matchMinus, '').replace(matchLeadingZeros, '');\n return isMinus ? `-${cleanedValue}` : cleanedValue;\n};\n\n/** Normalizes a numeric input string and parses it as a number. */\nexport function cleanNum(value: string | number): number {\n if (typeof value === 'number') {\n return value;\n }\n return parseFloat(cleanNumStr(value));\n}\n\nexport const isNull = (value: unknown): boolean => {\n return value === null;\n};\nexport const isUndefined = (value: unknown): boolean => {\n return value === undefined;\n};\nexport const isArray = (value: unknown): boolean => {\n return Boolean(value) && (value as { constructor: unknown }).constructor === Array;\n};\nexport const isObject = (value: unknown): boolean => {\n return Boolean(value) && (value as { constructor: unknown }).constructor === Object;\n};\nexport const isEmptyString = (value: unknown): boolean => {\n return value === '';\n};\nexport const isTrailingPeriodSeparator = (value: unknown): boolean => {\n return Boolean(value) && String(value)[String(value).length - 1] === '.';\n};\nexport const isTrailingCommaSeparator = (value: unknown): boolean => {\n return Boolean(value) && String(value)[String(value).length - 1] === ',';\n};\n","import { KNOWN_UNITS, LABELS, SPECIAL_NUMBERS_STRING } from './constants.ts';\nimport { charCount, cleanNumStr } from '../numbers/parsing/number-input.ts';\n\nexport const SEPARATOR = '|';\n\nconst UNIT_RE = /^(-?[0-9., /]*?(?:e[-+]?[0-9]+)?)([^0-9-., /].*)?$/;\n\n/** Checks whether a unit string has an empty numeric part, for example `|m`. */\nexport function isEmptyValueWithUnit(value: string | number): boolean {\n return typeof value === 'string' && value.length > 0 && value.startsWith('|');\n}\n\n/** Splits a supported unit string into its numeric and unit parts. */\nexport function split(valueWithUnit: string): string[] {\n let match;\n let normalizedValue = valueWithUnit !== undefined && valueWithUnit !== null ? String(valueWithUnit) : '';\n if (charCount(SEPARATOR, normalizedValue) > 1) {\n match = normalizedValue.split(SEPARATOR);\n normalizedValue = match.slice(0, -1).join('') + SEPARATOR + match.slice(-1);\n }\n if (normalizedValue.indexOf(SEPARATOR) >= 0) {\n match = normalizedValue.split(SEPARATOR);\n } else if (SPECIAL_NUMBERS_STRING.includes(normalizedValue)) {\n match = [normalizedValue, ''];\n } else {\n match = cleanNumStr(normalizedValue).match(UNIT_RE);\n if (match) {\n match = match.slice(1);\n }\n }\n if (!match) {\n match = ['0', ''];\n }\n if (match[1] == null) {\n match[1] = '';\n }\n return [match[0], match[1]];\n}\n\n/** Returns the numeric part of a unit string. */\nexport function getValue(valueWithUnit: string): string {\n return split(valueWithUnit)[0];\n}\n\n/** Returns the unit part of a unit string. */\nexport function getUnit(valueWithUnit: string): string {\n return split(valueWithUnit)[1];\n}\n\n/** Checks whether a value contains exactly one known unit suffix. */\nexport function isValueWithUnit(value: string | number): boolean {\n if (!value) {\n return false;\n }\n const parts = String(value).split(SEPARATOR);\n return parts.length === 2 && KNOWN_UNITS.includes(parts[1]);\n}\n\n/** Joins a value and unit using the package unit separator. */\nexport function withUnit(value: string | number | null | undefined, unit: string | null, defaultValue = ''): string {\n if (value === null || value === '' || value === undefined) {\n value = defaultValue;\n }\n if (unit === null) {\n return String(value);\n }\n let [normalizedValue, normalizedUnit] = String(value).includes(SEPARATOR) ? split(String(value)) : [value, unit];\n if (!normalizedUnit) {\n normalizedUnit = unit;\n }\n return [normalizedValue, normalizedUnit].join(SEPARATOR);\n}\n\n/** Replaces a unit key in a unit string with its display label. */\nexport function withPrettyUnitLabel(valueWithUnits: string): string {\n const [value, unit] = split(valueWithUnits);\n const prettyUnit = LABELS[unit] ?? '';\n return `${value} ${prettyUnit}`;\n}\n","import Fraction from 'fraction.js';\n\nconst normalizeFractionWhitespace = (value: string): string => {\n return value.trim().replace(/\\s+/g, ' ');\n};\n\n/** Checks whether a string can be parsed as a fraction by fraction.js. */\nexport const isFraction = (value: unknown): boolean => {\n if (typeof value !== 'string' || !value.includes('/')) {\n return false;\n }\n\n try {\n new Fraction(normalizeFractionWhitespace(value));\n return true;\n } catch (error) {\n return (error as Error).message === 'Division by Zero';\n }\n};\n\n/** Converts a fraction to its decimal value, or returns `NaN` when it cannot be parsed. */\nexport function fraction(value: any): number | typeof Infinity | typeof NaN {\n if (value instanceof Array || value === null || value === undefined) {\n return NaN;\n }\n if (typeof value === 'string') {\n value = normalizeFractionWhitespace(value);\n }\n if (value === '') {\n return NaN;\n }\n\n let result = NaN;\n let infinite = false;\n try {\n const fractionObject = new Fraction(value);\n if (fractionObject !== undefined) {\n result = fractionObject.valueOf();\n }\n } catch (error) {\n if (error instanceof Error && error.message === 'Division by Zero') {\n infinite = true;\n }\n }\n return infinite ? Infinity : result;\n}\n\n/** Converts a decimal value to a fractional string. */\nexport function asFraction(value: number | string): string {\n if (typeof value === 'string') {\n value = normalizeFractionWhitespace(value);\n }\n if (value === '') {\n value = '0';\n }\n return new Fraction(value as any).toFraction(true);\n}\n\n/**\n * Converts a fraction string to a number.\n *\n * For compatibility, invalid inputs are returned unchanged and division by zero returns signed infinity.\n */\nexport function numFraction(value: any): any {\n if (\n value instanceof Array ||\n value === null ||\n value === undefined ||\n value === '' ||\n value === Infinity ||\n value === -Infinity ||\n value === 'Infinity' ||\n value === '-Infinity' ||\n Number.isNaN(value) ||\n value === 'NaN'\n ) {\n return value;\n }\n if (typeof value === 'string') {\n value = normalizeFractionWhitespace(value);\n }\n\n let result = value;\n try {\n const fractionObject = new Fraction(value);\n if (fractionObject !== undefined) {\n result = fractionObject.valueOf();\n }\n } catch (error) {\n if ((error as Error).message === 'Division by Zero') {\n const minus = value.charAt(0) === '-';\n return minus ? -Infinity : Infinity;\n }\n console.warn('Error in numFraction() method: ', value);\n }\n return result.valueOf();\n}\n","import { isValueWithUnit, split } from '../../units/unit-string.ts';\n\nexport const EXP_NOTATION_RE = /^[-+]?[0-9]*\\.?[0-9]+(?:\\/[0-9]*\\.?[0-9]+)?(?:[eE][-+]?[0-9]+)?$/;\n\n/** Normalizes whitespace and mantissa syntax in a scientific-notation string. */\nexport const normalizeExponent = (input: string): string => {\n return input.replace(\n /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))[ ]*[eE][ ]*([+-]?[ ]*\\d+)/,\n (_match, mantissa: string, exponent: string) => {\n let normalizedMantissa = mantissa.endsWith('.') ? mantissa.slice(0, -1) : mantissa;\n if (normalizedMantissa.startsWith('.')) {\n normalizedMantissa = `0${normalizedMantissa}`;\n }\n const normalizedExponent = exponent.replace(/[ ]+/g, '');\n return `${normalizedMantissa}e${normalizedExponent}`;\n },\n );\n};\n\n/** Normalizes scientific notation while preserving an optional unit suffix. */\nexport function normalizeScientific(value: string | number): string | number {\n if (typeof value !== 'string') {\n return value;\n }\n\n const normalizedSpaces = value.replace(/\\u00A0|\\u2007|\\u202F/g, ' ').trim();\n if (isValueWithUnit(normalizedSpaces)) {\n const [number, unit] = split(normalizedSpaces);\n return `${normalizeExponent(number.trim())}|${unit.trim()}`;\n }\n\n const match = normalizedSpaces.match(/^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)\\s*[eE]\\s*[+-]?\\s*\\d+)\\s+(.+)$/);\n if (match) {\n return `${normalizeExponent(match[1])}|${match[2].trim()}`;\n }\n\n return normalizeExponent(normalizedSpaces);\n}\n","import { isFraction } from './fractions/fractions.ts';\nimport { EXP_NOTATION_RE } from './scientific-notation/scientific-notation.ts';\n\n/** Checks whether a value is supported as a finite numeric or fraction input. */\nexport function isNumeric(value: unknown): boolean {\n if (\n value === undefined ||\n value === null ||\n Array.isArray(value) ||\n typeof value === 'object' ||\n Number.isNaN(value) ||\n value === 'NaN' ||\n value === Infinity ||\n value === -Infinity ||\n value === 'Infinity' ||\n value === '-Infinity'\n ) {\n return false;\n }\n if (isFraction(value)) {\n return true;\n }\n const parsed = parseFloat(value as unknown as string);\n return typeof value === 'string'\n ? !isNaN(parsed) && (EXP_NOTATION_RE.test(value) || isFinite(value as unknown as number))\n : isFinite(value as unknown as number);\n}\n\nexport const isNonNumerical = (value: any): boolean => {\n return !isNumeric(value);\n};\n\nexport const isPercentage = (value: string | number): boolean => {\n return typeof value === 'string' && /^\\d+(\\.\\d+)?%$/.test(value);\n};\n\nexport function allNumbers(values: (number | string)[]): boolean {\n return !values.some((value) => typeof value !== 'number');\n}\n","import { getUnit, getValue, isValueWithUnit, withUnit } from '../../units/unit-string.ts';\nimport { toNum, toString } from '../numbers.ts';\nimport { cleanNumStr } from './number-input.ts';\n\nexport const countTrailingZeros = (value: number | string, decimalPartOnly = false) => {\n /*\n See unit test and\n - https://regex101.com/r/89tGjt/1\n - https://regex101.com/r/55lEWZ/1\n Matches trailing zeros followed by |, e, E or end of string\n */\n const condition = decimalPartOnly ? /0+((?=[|eE])|$)/ : /(0+|0+\\.0+)((?=[|eE])|$)/;\n if (typeof value === 'string' && (decimalPartOnly ? value.includes('.') || value.includes(',') : true)) {\n return value?.match(condition)?.[0]?.replaceAll(/[.,]/g, '')?.length ?? 0;\n }\n return 0;\n};\n\nexport const hasTrailingZeros = (value: number | string) => {\n return countTrailingZeros(value) > 0;\n};\n\n/**\n * Internal function to parse the value, unit, and type from a generic numeric input\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @param value\n * @returns object with number, unit, and type\n */\nexport const parseNumber = (\n value: number | string,\n preserveTrailingZeros = false,\n): { number: any; unit: string | null; isString: boolean } => {\n const isString = typeof value === 'string';\n const hasUnit = isString && isValueWithUnit(value);\n const unit = hasUnit ? getUnit(value) : null;\n const cleaned = cleanNumStr(hasUnit ? getValue(value) : value);\n const number = preserveTrailingZeros && hasTrailingZeros(value) ? cleaned : toNum(cleaned);\n return {\n number,\n unit,\n isString,\n };\n};\n\n/**\n * Convert a number to a string safely, better than String(value)\n * String(0.0000002) returns '2e-7' which is unwanted if we need to preserve formatting\n *\n * @param value\n * @param [isScientific] whether to preserve scientific notation\n * @returns number or string output value\n */\nconst safeStringifyNumber = (value: number | string, isScientific?: boolean): string => {\n /*\n Note that String(0.0000002) -> '2e-7' in JavaScript, so we need to use a safe conversion function instead\n We could improve how the scientific notation inputs are handed too, but that's a minor breaking change to the\n current unit tests, so let's consider it separately in OW-17645\n */\n return isScientific\n ? String(value) // up for debate if we should use formatScientificDisplayNumber here ...\n : toString(value);\n};\n\n/**\n * Internal function to unParse a value, unit, and type back to an output value\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @param args\n * @param args.value\n * @param args.unit\n * @param args.isString\n * @param args.isScientific\n * @returns number or string output value\n */\nexport const unParseNumber = ({\n value,\n unit,\n isString,\n isScientific,\n}: {\n value: number | string;\n unit?: string | null;\n isString?: boolean;\n isScientific?: boolean;\n}): number | string => {\n const convertedValue = typeof value === 'number' && isString ? safeStringifyNumber(value, isScientific) : value;\n if (unit) {\n return withUnit(convertedValue, unit);\n }\n return convertedValue;\n};\n","import { convertAndGetValue } from '../../units/conversion.ts';\nimport { isValueWithUnit } from '../../units/unit-string.ts';\nimport { isValidNum, toNum } from '../numbers.ts';\nimport { parseNumber } from '../parsing/parse-number.ts';\nimport { isNumeric, isPercentage } from '../predicates.ts';\n\nexport const DEFAULT_MAX_RELATIVE_DIFF = Number.EPSILON;\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\ntype XOR<T, U> = T | U extends Record<string, unknown> ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;\n\ntype toleranceType = XOR<{ relativeDiff: number | string }, { absoluteDiff: string | number }>;\n\nconst convertNumbers = (\n firstValue: number | string,\n secondValue: number | string,\n): { firstNumber: number | string; secondNumber: number | string } => {\n const { number: firstNumber, unit: firstUnit } = parseNumber(firstValue);\n const { number: secondNumber, unit: secondUnit } = parseNumber(secondValue);\n const differentUnits = firstUnit && secondUnit && firstUnit !== secondUnit;\n const convertedSecondNumber = differentUnits ? convertAndGetValue(secondNumber, firstUnit, secondUnit) : secondNumber;\n return {\n firstNumber,\n secondNumber: convertedSecondNumber,\n };\n};\n\nconst getToleranceNumber = (relativeDiff: string | number): number | null => {\n if (relativeDiff !== null && relativeDiff !== undefined) {\n if (isNumeric(relativeDiff) && typeof relativeDiff === 'number') {\n return relativeDiff;\n }\n if (isPercentage(relativeDiff)) {\n const percentageValue = toNum(relativeDiff?.toString().replace('%', ''));\n if (isNumeric(percentageValue)) {\n return percentageValue / 100;\n }\n }\n }\n\n return null;\n};\n\n/**\n * Determines whether two numbers are close in value with a tolerance\n * (mitigates excess JavaScript floating point precision quirks)\n */\nexport const isCloseTo = (\n firstValue: number | string | null,\n secondValue: number | string | null,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n const { relativeDiff, absoluteDiff } = options;\n const diff = relativeDiff ?? absoluteDiff;\n const toleranceNumber = getToleranceNumber(diff);\n\n if (firstValue === null || secondValue === null) {\n return false;\n }\n\n const hasUnitFirstValue = isValueWithUnit(firstValue);\n const hasUnitSecondValue = isValueWithUnit(secondValue);\n\n if ((hasUnitFirstValue && !hasUnitSecondValue) || (!hasUnitFirstValue && hasUnitSecondValue)) {\n throw new Error(\n `Parameters must either both have units or both not have units. Received \"${firstValue}\" and \"${secondValue}\"`,\n );\n }\n\n if (toleranceNumber === null) {\n console.warn('Tolerance number is not defined!');\n return firstValue === secondValue;\n }\n\n if (toleranceNumber <= 0 || toleranceNumber < Number.EPSILON) {\n throw Error('Unpredictable results - toleranceNumber should be bigger than zero or less then EPSILON');\n }\n const { firstNumber, secondNumber } = convertNumbers(firstValue, secondValue);\n if (\n ((firstNumber === Infinity || firstNumber === 'Infinity') &&\n (secondNumber === Infinity || secondNumber === 'Infinity')) ||\n ((firstNumber === -Infinity || firstNumber === '-Infinity') &&\n (secondNumber === -Infinity || secondNumber === '-Infinity'))\n ) {\n return true;\n }\n if (typeof firstNumber === 'number' && typeof secondNumber === 'number') {\n //1. we know they are equals\n if (firstNumber === secondNumber) {\n return true;\n }\n\n if (absoluteDiff || firstNumber === 0 || secondNumber === 0) {\n //2. checks whether they are close enough absolutely\n const diff = Math.abs(firstNumber - secondNumber);\n return isCloseTo(diff, toleranceNumber, { relativeDiff: '1%' }) || diff < toleranceNumber;\n } else {\n //3. relative checks whether they are close enough relatively\n return 2 * Math.abs((firstNumber - secondNumber) / (firstNumber + secondNumber)) < toleranceNumber;\n }\n }\n\n return false;\n};\n\n/**\n * Determines whether two numbers are close enough to be equal\n * or checks the firstValue is greater than the secondValue\n */\nexport const isCloseToOrGreaterThan = (\n firstValue: number | string | null,\n secondValue: number | string | null,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n if (firstValue === null || secondValue === null) {\n return false;\n }\n const { firstNumber, secondNumber } = convertNumbers(firstValue, secondValue);\n if (typeof firstNumber === 'number' && typeof secondNumber === 'number') {\n return isCloseTo(firstNumber, secondNumber, options) || firstNumber > secondNumber;\n }\n\n return false;\n};\n\n/**\n * Determines whether two numbers are close enough to be equal\n * or checks the firstValue is less than the secondValue\n */\nexport const isCloseToOrLessThan = (\n firstValue: number | string | null,\n secondValue: number | string | null,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n if (firstValue === null || secondValue === null) {\n return false;\n }\n const { firstNumber, secondNumber } = convertNumbers(firstValue, secondValue);\n if (typeof firstNumber === 'number' && typeof secondNumber === 'number') {\n return isCloseTo(firstNumber, secondNumber, options) || firstNumber < secondNumber;\n }\n\n return false;\n};\n\n/**\n * Determines whether two objects or arrays are deeply close equal (all nested child numbers)\n */\nexport const isDeepCloseTo = (\n a: any,\n b: any,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((a, i) => isDeepCloseTo(a, b[i], options));\n }\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every((key) => isDeepCloseTo(a[key], b[key], options));\n }\n if ((Number.isNaN(a) && Number.isNaN(b)) || (a === '' && b === '')) {\n return true;\n }\n if (\n (typeof a === 'number' && typeof b === 'number') ||\n (isValueWithUnit(a) && isValueWithUnit(b)) ||\n (isValidNum(a) && isValidNum(b))\n ) {\n return isCloseTo(a, b, options);\n }\n /*\n Generic strings and non-numerical properties should pass (loose checking)\n This function only compares numerical properties\n */\n return true;\n};\n","import { isCloseToOrLessThan } from '../comparison/comparison.ts';\nimport { formatDecimal } from '../format/display-number.ts';\nimport { isScientificStringNum, toNum } from '../numbers.ts';\nimport { parseNumber, unParseNumber } from '../parsing/parse-number.ts';\nimport { isNumeric } from '../predicates.ts';\n\nconst DEFAULT_SIGNIFICANT_DIGITS = 4;\n\n/**\n * Rounds a number to N decimal places.\n *\n * @private (see round() for the public interface)\n * @param value\n * @param [n]\n * @returns rounded number\n */\nexport const roundNumber = (value: number, n = DEFAULT_SIGNIFICANT_DIGITS): number => {\n const factor = 10 ** n;\n return Math.round(value * factor) / factor;\n};\n\n/**\n * Rounds a numeric value to N decimal places.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param [n] - the number of decimal places to round to\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * round(3.14159265) -> 3.1416\n */\nexport const round = <Value extends number | string | null | undefined>(\n value: Value,\n n = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumber(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.')) ? value : roundNumber(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a number to N significant digits.\n *\n * @private (see roundToPrecision() for the public interface)\n * @param value\n * @param [n] number of significant digits\n * @returns rounded number\n */\nexport const roundNumberToPrecision = (value: number, n: number = DEFAULT_SIGNIFICANT_DIGITS): number => {\n return Number(value.toPrecision(n));\n};\n\n/**\n * Rounds a number to N significant digits, preserving trailing decimal zeros\n *\n * @private (see roundByMagnitudeToFixed() for the public interface)\n * @param value\n * @param [n] number of significant digits\n * @returns rounded number as string\n */\nexport const roundNumberToFixedPrecision = (value: number, n: number = DEFAULT_SIGNIFICANT_DIGITS): string => {\n const roundedValue = toNum(value).toPrecision(n);\n const [integerPart, decimalPart] = roundedValue.split('.');\n if (decimalPart) {\n const decimalDigits = n - integerPart.length;\n return `${integerPart}.${decimalPart.padEnd(decimalDigits, '0')}`;\n } else {\n return integerPart;\n }\n};\n\n/**\n * Rounds a number to N significant digits, excluding the integer part (only rounds decimal part)\n *\n * @private (see roundToPrecision() for the public interface)\n * @param value\n * @param [n] number of significant digits\n * @returns rounded number\n */\nexport const roundNumberToDecimalPrecision = (value: number, n: number = DEFAULT_SIGNIFICANT_DIGITS): number => {\n if (Math.abs(value) > 1) {\n const [integerPart, decimalPart] = formatDecimal(value, '').split('.');\n if (!decimalPart) {\n return value;\n } else {\n const roundedDecimalPart = Number(`0.${decimalPart}`).toPrecision(n).slice(1);\n return Number(integerPart + roundedDecimalPart);\n }\n }\n return roundNumberToPrecision(value, n);\n};\n\n/**\n * Rounds a numeric value to N significant digits.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n * - similar to Number.toPrecision() but safer\n * - does *not* append trailing zeros (unlike `Number(4).toPrecision(4)` -> '4.000')\n *\n * @param value - the value to round\n * @param [n] - the number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * roundToPrecision(0.0000456789) -> 0.00004568\n */\nexport const roundToPrecision = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberToPrecision(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberToPrecision(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a numeric value to N significant digits (only the decimal part)\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n * - unlike roundToPrecision(), acts only on the decimal part, not the integer part too\n *\n * @param value - the value to round\n * @param [n]- the number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * roundToPrecision(1234.0000456789) -> 1234.00004568\n */\nexport const roundToDecimalPrecision = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberToDecimalPrecision(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberToDecimalPrecision(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a number to an appropriate number of digits, based on its size.\n *\n * @private (see roundByMagnitude() for the public interface)\n * @param value\n * @param [n] the number of significant digits\n * @param [toFixed] to fixed digits (i.e. with trailing zeros)\n * @returns rounded number\n */\nexport const roundNumberByMagnitude = (\n value: number,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n toFixed = false,\n): number | string => {\n const noDecimalsAbove = 10 ** n;\n const result =\n noDecimalsAbove && value > noDecimalsAbove\n ? roundNumber(value, 0)\n : toFixed\n ? roundNumberToFixedPrecision(value, n)\n : //for comparison, old implementation from toPretty (functionally equivalent to new implementation, see tests)\n //return Number(value.toExponential(n - 1).toString());\n roundNumberToPrecision(value, n);\n return toFixed ? String(result) : result;\n};\n\n/**\n * Rounds a numeric value to an appropriate number of digits, based on its size. It rounds to N significant digits,\n * but never rounds the integer part.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param [n] - the number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * roundByMagnitude(0.000123456789) -> 0.0001235\n * roundByMagnitude(1.123456789) -> 1.123\n * roundByMagnitude(19999.123456789) -> 19999\n */\nexport const roundByMagnitude = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberByMagnitude(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberByMagnitude(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a numeric value to an appropriate number of digits, based on its size. It rounds to N significant digits,\n * but never rounds the integer part. Similar to roundByMagnitude, but adds trailing zeros.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns string type (or original value and type when not possible to convert)\n *\n * @param value - the value to round\n * @param [n] - the number of significant digits\n * @returns rounded value as a string, or input value when unable to round\n *\n * @example\n * roundByMagnitudeToFixed(0.000120016789) -> 0.0001200\n */\nexport const roundByMagnitudeToFixed = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n const toFixed = true;\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberByMagnitude(value, n, toFixed) as Value;\n }\n const { number, unit } = parseNumber(value, true);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberByMagnitude(number, n, toFixed);\n return unParseNumber({\n value: result,\n unit,\n isString: true,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a number to an appropriate number of digits, based on its size in relation to a range.\n *\n * @private (see roundByMagnitude() for the public interface)\n * @param value\n * @param min\n * @param max\n * @param [n] the minimum number of significant digits\n * @returns rounded number\n */\nexport const roundNumberByRange = (value: number, min: number, max: number, n = DEFAULT_SIGNIFICANT_DIGITS): number => {\n if (isCloseToOrLessThan(max, min)) {\n return value;\n }\n const range = max - min;\n const scale = Math.floor(Math.log10(range));\n const precision = Math.max(n, 0 - scale);\n return roundNumber(value, precision);\n};\n\n/**\n * Rounds a numeric value to an appropriate number of digits, based on its size within a range of values.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param min - the min value in the range\n * @param max - the max value in the range\n * @param [n] - the minimum number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n */\nexport const roundByRange = <Value extends number | string | null | undefined>(\n value: Value,\n min: number,\n max: number,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberByRange(value, min, max, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberByRange(number, min, max, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a numeric value to N fixed decimal digits.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param [n] - the number of fixed decimal digits\n * @returns rounded value, or input value when unable to round\n *\n */\nexport const roundToFixed = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n if (typeof value === 'number') {\n return value.toFixed(n) as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result = !isNumeric(number) || (typeof number === 'string' && number.endsWith('.')) ? value : number.toFixed(n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n","import { LABELS } from '../../units/constants.ts';\nimport { round } from '../rounding/rounding.ts';\nimport { isValidNum, toNum } from '../numbers.ts';\nimport { countTrailingZeros, parseNumber } from '../parsing/parse-number.ts';\nimport { trim } from '../parsing/number-input.ts';\n\nconst DEFAULT_AUTO_SCIENTIFIC_BELOW = 1e-4;\nconst DEFAULT_AUTO_SCIENTIFIC_ABOVE = 1e7;\nconst NUMBER_FORMAT_OPTIONS = { maximumFractionDigits: 20 };\n\nconst formatEnglishNumber = (value: number): string => {\n let numberFormat: Intl.NumberFormat;\n try {\n numberFormat = new Intl.NumberFormat('en-US', NUMBER_FORMAT_OPTIONS);\n } catch {\n numberFormat = new Intl.NumberFormat(undefined, NUMBER_FORMAT_OPTIONS);\n }\n return numberFormat.format(value);\n};\n\nconst superscriptSymbols: Record<string, string> = {\n '0': '⁰',\n '1': '¹',\n '2': '²',\n '3': '³',\n '4': '⁴',\n '5': '⁵',\n '6': '⁶',\n '7': '⁷',\n '8': '⁸',\n '9': '⁹',\n '+': '⁺',\n '-': '⁻',\n};\n\ntype NumberDisplayOptions = {\n scientific?: 'auto' | boolean;\n eNotation?: boolean;\n autoScientificBelow?: number;\n autoScientificAbove?: number;\n roundScientificCoefficient?: number;\n withUnit?: boolean;\n noThousandsSeparator?: boolean;\n nonBreakingSpace?: boolean;\n};\n\ntype PrivateNumberDisplayOptions = NumberDisplayOptions & {\n preserveTrailingZeros?: boolean;\n};\n\nconst appendTrailingZeros = (value: string, numberOfZeros: number): string => {\n const zeros = '0'.repeat(numberOfZeros);\n return numberOfZeros > 0 && value !== '0' ? (!value.includes('.') ? `${value}.${zeros}` : `${value}${zeros}`) : value;\n};\n\nexport const formatDecimal = (\n value: number | string,\n thousandSeparator: string,\n preserveTrailingZeros = false,\n): string => {\n const convertedValue = formatEnglishNumber(toNum(value)).replaceAll(',', thousandSeparator);\n return preserveTrailingZeros ? appendTrailingZeros(convertedValue, countTrailingZeros(value, true)) : convertedValue;\n};\n\nexport const formatDecimalDisplayNumber = (\n value: number | string | null | undefined,\n options?: PrivateNumberDisplayOptions,\n): string => {\n const { nonBreakingSpace } = options ?? {};\n if (value === '') {\n return value;\n }\n if (value === null || value === undefined) {\n return '';\n }\n if (!isValidNum(value)) {\n return trim(value.toString());\n }\n const space = options?.noThousandsSeparator ? '' : nonBreakingSpace ? ' ' : ' '; //https://unicode-explorer.com/c/2007\n return formatDecimal(value, space, options?.preserveTrailingZeros);\n};\n\nexport const formatScientificDisplayNumber = (\n value: number | string | undefined | null,\n options?: PrivateNumberDisplayOptions,\n): string => {\n const { roundScientificCoefficient, eNotation } = options ?? {};\n if (Number.isNaN(value)) {\n return 'Invalid';\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n if (!isValidNum(value) || value === '') {\n return trim(value.toString());\n }\n const sanitizedValue = toNum(value);\n if (!Number.isFinite(sanitizedValue)) {\n return trim(value.toString());\n }\n const power = eNotation ? 'e' : '·10';\n const [coefficient, exponent] = sanitizedValue.toExponential().split('e');\n const roundedCoefficient =\n typeof roundScientificCoefficient === 'number' ? round(coefficient, roundScientificCoefficient) : coefficient;\n const noExponent = exponent === '+0' || exponent === '-0';\n const formattedExponent = [...exponent.replaceAll('+', '')]\n .map((c: string) => (eNotation ? c : superscriptSymbols[c]))\n .join('');\n return noExponent ? roundedCoefficient : `${roundedCoefficient}${power}${formattedExponent}`;\n};\n\nexport const formatDisplayNumber = (value: number | string, options: PrivateNumberDisplayOptions): string => {\n const abs = Math.abs(toNum(value));\n const formatScientific =\n options?.scientific === 'auto' && options?.autoScientificBelow && options?.autoScientificAbove\n ? abs < options?.autoScientificBelow || abs > options?.autoScientificAbove\n : options?.scientific;\n return formatScientific ? formatScientificDisplayNumber(value, options) : formatDecimalDisplayNumber(value, options);\n};\n\n/**\n * Displays a number with human-friendly formatting (use for non-editable display labels, text)\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @example\n * //returns '1 234.56'\n * displayNumber(1234.56)\n *\n * By default, adds thousands separators. Can be configured to display in scientific notation, and with formatted units.\n *\n * @param value\n * @param options\n * @returns formatted display number\n */\nexport const displayNumber = <Value extends number | string | null | undefined>(\n value: Value,\n options?: NumberDisplayOptions,\n): string => {\n const optionsWithDefaults: Record<string, any> = {\n scientific: options?.scientific ?? 'auto',\n eNotation: options?.eNotation ?? false,\n autoScientificBelow: options?.autoScientificBelow ?? DEFAULT_AUTO_SCIENTIFIC_BELOW,\n autoScientificAbove: options?.autoScientificAbove ?? DEFAULT_AUTO_SCIENTIFIC_ABOVE,\n withUnit: options?.withUnit ?? false,\n nonBreakingSpace: options?.nonBreakingSpace ?? false,\n roundScientificCoefficient: options?.roundScientificCoefficient,\n };\n const { withUnit } = optionsWithDefaults;\n if (value === null || value === undefined) {\n return '';\n }\n const { number, unit } = parseNumber(value);\n const formattedNumber = formatDisplayNumber(number, optionsWithDefaults);\n const formattedUnit = unit ? LABELS?.[unit] : '';\n return withUnit && unit\n ? formattedNumber === ''\n ? formattedUnit\n : `${formattedNumber} ${formattedUnit}`\n : formattedNumber;\n};\n\n/**\n * Displays a number with human-friendly formatting (use for non-editable display labels, text)\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @example\n * //returns '1 234.5600'\n * displayNumberToFixed('1234.5600')\n *\n * By default, adds thousands separators. Can be configured to display in scientific notation, and with formatted units.\n *\n * @param value\n * @param options\n * @returns formatted display number\n */\nexport const displayNumberToFixed = <Value extends string | null | undefined>(\n value: Value,\n options?: NumberDisplayOptions,\n): string => {\n const optionsWithDefaults: Record<string, any> = {\n scientific: options?.scientific ?? 'auto',\n eNotation: options?.eNotation ?? false,\n autoScientificBelow: options?.autoScientificBelow ?? DEFAULT_AUTO_SCIENTIFIC_BELOW,\n autoScientificAbove: options?.autoScientificAbove ?? DEFAULT_AUTO_SCIENTIFIC_ABOVE,\n withUnit: options?.withUnit ?? false,\n nonBreakingSpace: options?.nonBreakingSpace ?? false,\n roundScientificCoefficient: options?.roundScientificCoefficient,\n };\n const { withUnit } = optionsWithDefaults;\n if (value === null || value === undefined) {\n return '';\n }\n const preserveTrailingZeros = true;\n const { number, unit } = parseNumber(value, preserveTrailingZeros);\n const formattedNumber = formatDisplayNumber(number, {\n ...optionsWithDefaults,\n preserveTrailingZeros: true,\n });\n const formattedUnit = unit ? LABELS?.[unit] : '';\n return withUnit && unit\n ? formattedNumber === ''\n ? formattedUnit\n : `${formattedNumber} ${formattedUnit}`\n : formattedNumber;\n};\n\n/** @deprecated Use `displayNumber` instead. */\nexport const formatNumber = (number: number | string | undefined | null): string => {\n return displayNumber(number);\n};\n","import { isFraction, numFraction } from './fractions/fractions.ts';\nimport {\n cleanNumStr,\n isArray,\n isEmptyString,\n isNull,\n isObject,\n isTrailingCommaSeparator,\n isTrailingPeriodSeparator,\n isUndefined,\n} from './parsing/number-input.ts';\nimport { isNumeric } from './predicates.ts';\nimport { getValue, isValueWithUnit, SEPARATOR } from '../units/unit-string.ts';\nimport { formatDecimalDisplayNumber } from './format/display-number.ts';\n\nconst parseValue = (value: unknown): unknown => {\n const isString = typeof value === 'string';\n const hasUnit = isString && isValueWithUnit(value);\n return hasUnit ? getValue(value) : value;\n};\n\n/**\n * Checks whether a value can be converted to number type by the toNum() function\n *\n * @param value - value to be checked\n * @returns whether number can be converted by toNum() function\n *\n * @example\n * isValidNum('1 1/2') -> true\n * toNum('foobar|m') -> false\n */\nexport const isValidNum = (value: unknown): boolean => {\n const parsedValue = parseValue(value);\n if (\n isEmptyString(parsedValue) ||\n Number.isNaN(parsedValue) ||\n parsedValue === Infinity ||\n parsedValue === -Infinity\n ) {\n return true;\n } else {\n if (\n !(\n isNull(parsedValue) ||\n isUndefined(parsedValue) ||\n isTrailingPeriodSeparator(parsedValue) ||\n isTrailingCommaSeparator(parsedValue) ||\n isArray(parsedValue) ||\n isObject(parsedValue)\n )\n ) {\n const cleanedValue = cleanNumStr(String(parsedValue));\n if (cleanedValue.includes(SEPARATOR)) {\n return false;\n }\n const number = isFraction(cleanedValue)\n ? numFraction(cleanedValue)\n : isNumeric(cleanedValue)\n ? parseFloat(cleanedValue)\n : cleanedValue;\n if (number === Infinity || number === -Infinity) {\n return true;\n }\n if (!isNumeric(number)) {\n return false;\n }\n if (!Number.isNaN(number)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * Checks whether a value is a valid number, in string representation with scientific notation (e.g. '1e3')\n *\n * Note - it's not possible to check whether *number* types are stored in scientific notation (all numbers are stored\n * the same way internally in floating-point formats, so there is no difference between 1000 and 1e3 internally).\n * Whether number types get displayed in scientific notation or not in the console is a browser-specific implementation\n * detail (display formatting) and not something we can check/rely on, so this function is only intended for checking\n * user-input values in string format. See https://stackoverflow.com/a/66005705/942635.\n *\n * @param value - value to be checked\n * @returns whether the value is a valid number in scientific notation\n *\n * @example\n * isValidNum('1e3') -> true\n * toNum(1000) -> false\n * toNum(1e3) -> false (we cannot check scientific notation of number types)\n */\n\nexport const isScientificStringNum = (value: unknown) => {\n if (typeof value === 'string') {\n return isValidNum(value) && value.toLowerCase().includes('e');\n }\n return false;\n};\n\n/**\n * Converts a numeric value to number type (when possible).\n * - need to know if it's possible first? Call isValidNum()\n * - accepts number types (1.234), stringified numbers ('1.234'), fractions ('1/2'), and unit numbers ('1.234|m')\n * - returns the converted number if possible, otherwise returns the input value or default value when provided\n *\n * @param value - value to be converted to number type\n * @param [fallback] - optional fallback value (returned when not possible to convert)\n * @param [minimum] - optional minimum value\n * @returns valid number after conversion, or fallback, or returns the original input\n *\n * @example\n * toNum('1.2345) -> 1.2345\n * toNum('1.2345|m') -> 1.2345\n */\nexport const toNum = (value: unknown, fallback?: number, minimum?: number): any => {\n const fallbackResult = fallback ?? value;\n const parsedValue = parseValue(value);\n if (!isValidNum(parsedValue)) {\n return fallbackResult;\n } else {\n const cleanedValue = cleanNumStr(String(parsedValue));\n const number = isFraction(cleanedValue)\n ? numFraction(cleanedValue)\n : isNumeric(cleanedValue)\n ? parseFloat(cleanedValue)\n : cleanedValue;\n if (number === Infinity || number === -Infinity) {\n return number;\n }\n if (Number.isNaN(number) || !isNumeric(number)) {\n return fallbackResult;\n } else if (minimum && number < minimum) {\n return minimum;\n }\n return number;\n }\n};\n\n/**\n * Convert a number to a string safely, better than String(value)\n * String(0.0000002) returns '2e-7' which is unwanted if we need to preserve formatting\n *\n * @param value\n * @returns number or string output value\n */\nexport const toString = (value?: unknown): any => {\n if (isValidNum(value)) {\n if (typeof value === 'string') {\n return value; // already a string\n }\n if (typeof value === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return String(value);\n }\n /*\n Note that String(0.0000002) -> '2e-7' in JavaScript, so we need to use a safe conversion function instead\n We could improve how the scientific notation inputs are handed too, but that's a minor breaking change to the\n current unit tests, so let's consider it separately in OW-17645\n */\n return formatDecimalDisplayNumber(value, { noThousandsSeparator: true });\n }\n }\n return value;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// https://mathiasbynens.be/notes/javascript-encoding\n// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\nfunction ucs2length(str) {\n const len = str.length;\n let length = 0;\n let pos = 0;\n let value;\n while (pos < len) {\n length++;\n value = str.charCodeAt(pos++);\n if (value >= 0xd800 && value <= 0xdbff && pos < len) {\n // high surrogate, and there is a next character\n value = str.charCodeAt(pos);\n if ((value & 0xfc00) === 0xdc00)\n pos++; // low surrogate\n }\n }\n return length;\n}\nexports.default = ucs2length;\nucs2length.code = 'require(\"ajv/dist/runtime/ucs2length\").default';\n//# sourceMappingURL=ucs2length.js.map","// @ts-nocheck\n\"use strict\";\nimport func2Module from \"ajv/dist/runtime/ucs2length.js\";\nconst func2 = func2Module.default ?? func2Module;\nexport interface ValidatorWithErrors {\n (data: any, options?: { instancePath?: string, parentData?: any, parentDataProperty?: any, rootData?: any }): boolean;\n errors?: any;\n};\nexport const numberSchemaValidator = validate15 as ValidatorWithErrors;const schema33 = {\"type\":\"number\",\"errorMessage\":\"Must be a numerical value\"};function validate15(data, {instancePath=\"\", parentData, parentDataProperty, rootData=data}={}){\nvalidate15.errors = null;let vErrors = null;let errors = 0;if(!((typeof data == \"number\") && (isFinite(data)))){const err0 = {instancePath,schemaPath:\"#/type\",keyword:\"type\",params:{type: \"number\"},message:\"must be number\"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(errors > 0){const emErrs0 = [];for(const err1 of vErrors){if(((((err1.keyword !== \"errorMessage\") && (!err1.emUsed)) && ((err1.instancePath === instancePath) || ((err1.instancePath.indexOf(instancePath) === 0) && (err1.instancePath[instancePath.length] === \"/\")))) && (err1.schemaPath.indexOf(\"#\") === 0)) && (err1.schemaPath[\"#\".length] === \"/\")){emErrs0.push(err1);err1.emUsed = true;}}if(emErrs0.length){const err2 = {instancePath,schemaPath:\"#/errorMessage\",keyword:\"errorMessage\",params:{errors: emErrs0},message:\"Must be a numerical value\"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}const emErrs1 = [];for(const err3 of vErrors){if(!err3.emUsed){emErrs1.push(err3);}}vErrors = emErrs1;errors = emErrs1.length;}validate15.errors = vErrors;return errors === 0;}export const testSchemaValidator = validate16 as ValidatorWithErrors;const schema34 = {\"$id\":\"testValidate\",\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"name\"]};function validate16(data, {instancePath=\"\", parentData, parentDataProperty, rootData=data}={}){\nvalidate16.errors = null;/*# sourceURL=\"testValidate\" */;let vErrors = null;let errors = 0;if(data && typeof data == \"object\" && !Array.isArray(data)){if(data.name === undefined){const err0 = {instancePath,schemaPath:\"#/required\",keyword:\"required\",params:{missingProperty: \"name\"},message:\"must have required property '\"+\"name\"+\"'\"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.name !== undefined){let data0 = data.name;if(typeof data0 === \"string\"){if(func2(data0) < 1){const err1 = {instancePath:instancePath+\"/name\",schemaPath:\"#/properties/name/minLength\",keyword:\"minLength\",params:{limit: 1},message:\"must NOT have fewer than 1 characters\"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}else {const err2 = {instancePath:instancePath+\"/name\",schemaPath:\"#/properties/name/type\",keyword:\"type\",params:{type: \"string\"},message:\"must be string\"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}}else {const err3 = {instancePath,schemaPath:\"#/type\",keyword:\"type\",params:{type: \"object\"},message:\"must be object\"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}validate16.errors = vErrors;return errors === 0;}","import type { ErrorObject } from 'ajv';\n\nexport const transformErrors = (errors: ErrorObject[]) => {\n return errors?.map(({ message }: ErrorObject) => message);\n};\n","import type { ValidateReturn } from './types.ts';\nimport { toNum } from '../numbers/numbers.ts';\nimport { isNumeric } from '../numbers/predicates.ts';\nimport { numberSchemaValidator } from '../validate/ajv-validators.ts';\nimport { transformErrors } from '../validate/errors-transform.ts';\nimport { getValue, isValueWithUnit, split } from './unit-string.ts';\n\n/** Normalizes repeated decimal dots and decimal commas. */\nexport function checkAndCleanDecimalComma(value: string | number): string | number {\n const repeatedDots = /\\.{2,}/;\n const comma = /,/;\n if (typeof value === 'string') {\n while (repeatedDots.test(value) || comma.test(value)) {\n value = value.replace(repeatedDots, '.');\n value = value.replace(comma, '.');\n }\n }\n return value;\n}\n\n/** Cleans raw numeric input while retaining the unit from the previous value. */\nexport function validateAndClean(previousValue: string, nextText: string): string {\n const unit = split(previousValue)[1];\n const stripAllExceptNumeric = /[^0-9.,-Ee]/g;\n const stripExponent = /^([^(e|E)]*[eE])|[eE]/g;\n const stripInvalidLeadingExponent = /^[E|e]*|[E|e]*$/g;\n const replaceComma = /,/g;\n const stripDot = /^([^.]*\\.)|\\./g;\n const stripDotFollowedByExponent = /\\.(?=e)/g;\n const stripMinus = /-|[eE]-/g;\n\n const cleanedValue = nextText\n .replace(stripAllExceptNumeric, '')\n .replace(stripExponent, '$1')\n .replace(stripInvalidLeadingExponent, '')\n .replace(replaceComma, '.')\n .replace(stripDot, '$1')\n .replace(stripDotFollowedByExponent, '')\n .replace(stripMinus, (match, offset) => (offset === 0 || match.toLowerCase() === 'e-' ? match : ''));\n\n return !Number.isFinite(+cleanedValue) ? previousValue : `${cleanedValue}${unit ? '|' : ''}${unit}`;\n}\n\n/** Validates a numeric or unit-encoded value against the package number schema. */\nexport function validateNumber(value: string | number): ValidateReturn {\n let normalizedValue = value;\n if (typeof value === 'string' && isValueWithUnit(value)) {\n normalizedValue = getValue(value);\n }\n\n normalizedValue = checkAndCleanDecimalComma(normalizedValue);\n if (isNumeric(normalizedValue)) {\n const valid = numberSchemaValidator(toNum(normalizedValue));\n return { valid, errors: transformErrors(numberSchemaValidator.errors) };\n }\n\n const valid = numberSchemaValidator(normalizedValue);\n return { valid, errors: transformErrors(numberSchemaValidator.errors) };\n}\n","import { DEPRECATED_UNITS, INTERMEDIATE_CONVERSIONS, KNOWN_CONVERSIONS, UNIT_ALIASES } from './constants.ts';\nimport { toNum, toString } from '../numbers/numbers.ts';\nimport { cleanNum, cleanNumStr } from '../numbers/parsing/number-input.ts';\nimport { isNonNumerical, isNumeric } from '../numbers/predicates.ts';\nimport { EXP_NOTATION_RE, normalizeScientific } from '../numbers/scientific-notation/scientific-notation.ts';\nimport { unitFromKey } from './unit-catalog.ts';\nimport { getValue, isValueWithUnit, split, withUnit } from './unit-string.ts';\nimport { checkAndCleanDecimalComma } from './validation.ts';\n\n/** Converts a numeric value between compatible units. */\nexport function to(value: string | number, fromUnit: string, toUnit: string): number {\n value = checkAndCleanDecimalComma(value);\n value = normalizeScientific(value);\n\n if (toUnit === 'undefined') {\n console.warn('Inconsistent \"to unit\" - debug call to \"Units.to()\"');\n }\n if (fromUnit === 'undefined') {\n fromUnit = toUnit;\n console.warn('Inconsistent \"from unit\" - debug call to \"Units.to()\"');\n }\n if (fromUnit === toUnit) {\n return toNum(value);\n }\n\n if (value === Infinity || value === 'Infinity') {\n return Infinity;\n }\n if (value === -Infinity || value === '-Infinity') {\n return -Infinity;\n }\n if (isNonNumerical(value) && value !== '') {\n return NaN;\n }\n\n const conversion = KNOWN_CONVERSIONS[`${fromUnit}|${toUnit}`];\n if (conversion) {\n return conversion(toNum(value));\n }\n\n if (DEPRECATED_UNITS[fromUnit]) {\n console.warn(`Unit '${fromUnit}' is deprecated - use '${DEPRECATED_UNITS[fromUnit]}' instead.`);\n return to(value, DEPRECATED_UNITS[fromUnit], toUnit);\n }\n if (DEPRECATED_UNITS[toUnit]) {\n console.warn(`Unit '${toUnit}' is deprecated - use '${DEPRECATED_UNITS[toUnit]}' instead.`);\n return to(value, fromUnit, DEPRECATED_UNITS[toUnit]);\n }\n\n if (UNIT_ALIASES[toUnit]) {\n return to(value, fromUnit, UNIT_ALIASES[toUnit]);\n }\n if (UNIT_ALIASES[fromUnit]) {\n return to(value, UNIT_ALIASES[fromUnit], toUnit);\n }\n\n const intermediateFromUnit = INTERMEDIATE_CONVERSIONS[fromUnit];\n if (intermediateFromUnit) {\n const intermediateValue = to(value, fromUnit, intermediateFromUnit);\n return to(intermediateValue, intermediateFromUnit, toUnit);\n }\n\n const intermediateToUnit = INTERMEDIATE_CONVERSIONS[toUnit];\n if (toUnit && intermediateToUnit && intermediateToUnit !== toUnit) {\n const intermediateValue = to(value, fromUnit, intermediateToUnit);\n return to(intermediateValue, intermediateToUnit, toUnit);\n }\n\n console.error('no conversions found', value, fromUnit, '->', toUnit);\n throw new Error(`No conversions found: ${value} ${fromUnit} -> ${toUnit}`);\n}\n\n/** Converts a value with an optional unit suffix to the requested unit. */\nexport function unum(valueWithUnit: string | number, toUnit: string, fromUnit?: string): number {\n if (valueWithUnit == null || valueWithUnit === '') {\n return 0;\n }\n if (\n (typeof valueWithUnit === 'string' && valueWithUnit.startsWith('NaN')) ||\n (typeof valueWithUnit === 'number' && isNaN(valueWithUnit))\n ) {\n return NaN;\n }\n\n const normalizedInput = normalizeScientific(valueWithUnit);\n const cleanString = cleanNumStr(normalizedInput).replaceAll('+', '');\n const parts = split(cleanString);\n\n if (!parts) {\n if (toUnit && fromUnit) {\n return unum(valueWithUnit + fromUnit, toUnit);\n }\n throw new Error(`unum: invalid number: ${valueWithUnit}`);\n }\n if (parts[0] == null) {\n parts[0] = '0';\n }\n if (parts[1]) {\n fromUnit = parts[1];\n }\n if (!fromUnit && toUnit !== fromUnit) {\n throw new Error(`unum: unable to figure out unit: ${valueWithUnit} fromUnit ${fromUnit}`);\n }\n\n if (toUnit === fromUnit) {\n const value = parts[0] ? toNum(parts[0]) : 0;\n if (value === Infinity || value === 'Infinity') {\n return Infinity;\n }\n if (value === -Infinity || value === '-Infinity') {\n return -Infinity;\n }\n if (typeof value === 'string' && EXP_NOTATION_RE.test(value)) {\n return parseFloat(value);\n }\n if (!isNumeric(value) && value !== Infinity && value !== -Infinity) {\n throw new Error(`unum: invalid number: ${value}, ${typeof value}`);\n }\n return cleanNum(value);\n }\n\n return to(parts[0], fromUnit, toUnit);\n}\n\n/** Alias for `unum`. */\nexport function convertAndGetValue(value: string | number, toUnit: string, fromUnit?: string): number {\n return unum(value, toUnit, fromUnit);\n}\n\n/** Converts a value while preserving string types and empty values. */\nexport function convertAndGetValueStrict(\n value: string | number | null,\n toUnit: string,\n fromUnit?: string,\n): string | number | null {\n if (value === '' || value === null) {\n return value;\n }\n if (typeof value === 'string' && isValueWithUnit(value) && getValue(value) === '') {\n return '';\n }\n const isString = typeof value === 'string';\n const result = convertAndGetValue(value, toUnit, fromUnit);\n return isString ? toString(result) : result;\n}\n\n/** Converts a value to the base unit configured for a quantity. */\nexport function toBase(value: string, quantity: string): number {\n const baseUnit = unitFromKey(quantity);\n const parts = split((value || '').toString());\n return unum(value, baseUnit as string, parts[1] || baseUnit);\n}\n\n/** Converts a value and appends the requested unit. */\nexport function unumWithUnit(value: string | number, toUnit: string, fromUnit?: string): string {\n return withUnit(unum(value, toUnit, fromUnit), toUnit);\n}\n\n/** Converts a unit value while retaining approximately the input precision. */\nexport function convertSamePrecision(valueWithUnit: string | number, toUnit: string, digits?: number): string {\n const validValueWithUnit = String(valueWithUnit);\n const parts = split(validValueWithUnit);\n const convertedNumber = !parts[1] || parts[1] == toUnit ? Number(parts[0]) : to(parts[0], String(parts[1]), toUnit);\n\n let prettyNumber = '0';\n let targetDigits = digits;\n if (convertedNumber !== 0) {\n if (!targetDigits) {\n if (parts[1] === toUnit) {\n return validValueWithUnit;\n }\n const digitParts = String(parts[0]).match(/^[-+.,0]*(\\d*)[.,]?(\\d*)/);\n targetDigits = digitParts ? Math.max(3, digitParts[1].length + digitParts[2].length) : 3;\n }\n const limit = Math.pow(10, --targetDigits);\n const absoluteNumber = Math.abs(convertedNumber);\n if (absoluteNumber >= 1e5 * limit || absoluteNumber * 1e4 * (1 + limit) < limit) {\n prettyNumber = convertedNumber.toExponential(targetDigits);\n } else if (absoluteNumber >= limit) {\n prettyNumber = convertedNumber.toFixed();\n } else {\n const magnitude = Math.floor(Math.log10(absoluteNumber));\n prettyNumber = convertedNumber.toFixed(targetDigits - magnitude);\n let index = prettyNumber.length;\n if (prettyNumber[--index] == '0') {\n while (prettyNumber[--index] == '0') {\n // Find the last significant digit.\n }\n prettyNumber = prettyNumber.slice(0, index + (prettyNumber[index] == '.' ? 0 : 1));\n }\n }\n }\n return withUnit(prettyNumber, toUnit);\n}\n"],"x_google_ignoreList":[13],"mappings":"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"}
1
+ {"version":3,"file":"conversion.cjs","names":["Fraction","func2Module"],"sources":["../../src/numbers/statistics/confidence-interval.ts","../../src/units/constants.ts","../../src/units/unit-catalog.ts","../../src/numbers/parsing/number-input.ts","../../src/units/unit-string.ts","../../src/numbers/fractions/fractions.ts","../../src/numbers/scientific-notation/scientific-notation.ts","../../src/numbers/predicates.ts","../../src/numbers/parsing/parse-number.ts","../../src/numbers/comparison/comparison.ts","../../src/numbers/rounding/rounding.ts","../../src/numbers/format/display-number.ts","../../src/numbers/numbers.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/runtime/ucs2length.js","../../src/validate/ajv-validators.ts","../../src/validate/errors-transform.ts","../../src/units/validation.ts","../../src/units/conversion.ts"],"sourcesContent":["const { abs, exp, sqrt } = Math;\n\n/** Applies the one-dimensional iterative Newton method. */\nexport function newton(\n functionValue: (value: number) => number,\n derivative: (value: number) => number,\n initialValue: number,\n tolerance = 1e-8,\n maxIterations = 30,\n): [number, boolean, number] {\n let currentValue = initialValue;\n let iteration = 0;\n let error = 1;\n while (error > tolerance && iteration < maxIterations) {\n const nextValue = currentValue - functionValue(currentValue) / derivative(currentValue);\n error = abs(functionValue(nextValue) - functionValue(currentValue));\n if (error < tolerance) {\n return [nextValue, true, iteration];\n }\n currentValue = nextValue;\n iteration += 1;\n }\n return [initialValue, false, iteration];\n}\n\n/** Approximates the Gaussian error function. */\nexport function erf(value: number): number {\n const t = 1 / (1 + 0.5 * abs(value));\n const answer =\n 1 -\n t *\n exp(\n -(value ** 2) -\n 1.26551223 +\n t *\n (1.00002368 +\n t *\n (0.37409196 +\n t *\n (0.09678418 +\n t *\n (-0.18628806 +\n t *\n (0.27886807 +\n t * (-1.13520398 + t * (1.48851587 + t * (-0.82215223 + t * 0.17087277)))))))),\n );\n return value >= 0 ? answer : -answer;\n}\n\n/** Converts a confidence interval to a number of standard deviations. */\nexport function get_k_from_conf_int(confidenceInterval: number): number {\n const functionValue = (value: number) => {\n return confidenceInterval - erf(value / sqrt(2));\n };\n const derivative = (value: number) => {\n return -sqrt(2 / Math.PI) * exp(-0.5 * value ** 2);\n };\n const [result] = newton(functionValue, derivative, 1);\n return result;\n}\n\n/** Converts a number of standard deviations to a confidence interval. */\nexport function get_conf_int_from_k(standardDeviations: number): number {\n return erf(standardDeviations / sqrt(2));\n}\n","import { get_conf_int_from_k, get_k_from_conf_int } from '../numbers/statistics/confidence-interval.ts';\n\n/**\n * Units labels\n *\n * @readonly\n * @enum {Object}\n */\nexport const LABELS: Record<string, string> = Object.freeze({\n in: 'in',\n mm: 'mm',\n cm: 'cm',\n m: 'm',\n microM: 'μm',\n km: 'km',\n ft: 'ft',\n usft: 'usft',\n in2: 'in²',\n cm2: 'cm²',\n m2: 'm²',\n kg: 'kg',\n tonnes: 't',\n mt: 'mt',\n kip: 'kip',\n bbl: 'bbl',\n m3: 'm³',\n Mm3: 'Mm³',\n MMSCF: 'MMSCF',\n lbm: 'lbm',\n 'kg/mol': 'kg/mol',\n 'lbf/mol': 'lbf/mol',\n sg: 'sg',\n ppg: 'ppg',\n 'kg/m3': 'kg/m³',\n 'lbm/ft3': 'lbm/ft³',\n s: 's',\n min: 'min',\n h: 'h',\n d: 'd',\n month: 'month',\n year: 'year',\n 'bbl/ft': 'bbl/ft',\n lpm: 'L/min',\n lps: 'L/s',\n bpm: 'bbl/min',\n 'm3/min': 'm³/min',\n 'm3/s': 'm³/s',\n MMSCFD: 'MMSCFD',\n bar: 'Bar',\n Pa: 'Pa',\n kPa: 'kPa',\n MPa: 'MPa',\n GPa: 'GPa',\n kPsi: 'Psi',\n ksi: 'ksi',\n 'lbf/100ft2': 'lbf/100ft²',\n '1/Pa': 'Pa⁻¹',\n '1/kPa': 'kPa⁻¹',\n '1/MPa': 'MPa⁻¹',\n '1/GPa': 'GPa⁻¹',\n '1/psi': 'psi⁻¹',\n 'kPa/m': 'kPa/m',\n '1/bar': 'bar⁻¹',\n klbf: 'klbf',\n 'psi/ft': 'Psi/ft',\n 'bar/100m': 'bar/100m',\n 'psi/100ft': 'psi/100ft',\n 'kPa/100m': 'kPa/100m',\n C: '°C',\n F: '°F',\n K: 'K',\n 'C/100m': '°C/100m',\n 'C/m': '°C/m',\n 'Pa/C': 'Pa/°C',\n 'Bar/C': 'Bar/°C',\n 'psi/F': 'psi/°F',\n 'psi/C': 'psi/°C',\n 'F/100ft': '°F/100ft',\n 'F/ft': '°F/ft',\n 'K/100m': 'K/100m',\n 'K/m': 'K/m',\n 'lbf/ft': 'lbf/ft',\n N: 'N',\n kN: 'kN',\n 'N/m': 'N/m',\n 'daN/m': 'daN/m',\n lbf: 'lbf',\n kgf: 'kgf',\n rad: 'rad',\n 'BTU/lbm': 'BTU/lbm',\n ppf: 'ppf',\n 'kg/m': 'kg/m',\n 'E-06/degC': '10⁻⁶/°C',\n 'E-06/degF': '10⁻⁶/°F',\n '1/K': 'K⁻¹',\n km2: 'km²',\n ft2: 'ft²',\n mm2: 'mm²',\n mile2: 'mile²',\n ft3: 'ft³',\n 'g/cm3': 'g/cm³',\n Sm3: 'Sm³',\n 'ft3/s': 'ft³/s',\n 'ft3/d': 'ft³/d',\n 'm3/d': 'm³/d',\n '1/m3/d': '1/m³/d',\n 's/m3': 's/m³',\n '1/MMSCFD': '1/MMSCFD',\n 'bbl/d': 'bbl/d',\n tonneForce: 'tonne-force',\n USGal: 'US gal',\n 'g/mol': 'g/mol',\n Nm: 'N⋅m',\n kNm: 'kN⋅m',\n ftlbf: 'ft⋅lbf',\n 'J/(kg*degC)': 'J/(kg⋅°C)',\n 'J/(kg*degK)': 'J/(kg⋅K)',\n 'J/(s*m*degK)': 'J/(s⋅m⋅K)',\n 'BTU/(lbm*degF)': 'BTU/(lbm⋅°F)',\n 'BTU/(h*ft*degF)': 'BTU/(h⋅ft⋅°F)',\n l: 'L',\n 'l/m': 'L/m',\n 'kJ/kg': 'kJ/kg',\n 'J/kg': 'J/kg',\n deg: '°',\n 'W/(mK)': 'W/(m⋅K)',\n psi: 'psi',\n 'deg/100ft': '°/100ft',\n 'deg/30m': '°/30m',\n 'deg/10m': '°/10m',\n '%': '%',\n Hz: 'Hz',\n '1/s': '1/s',\n rpm: 'rpm',\n 'Pa/m': 'Pa/m',\n 'bar/m': 'bar/m',\n gpm: 'gpm',\n 'kg/s': 'kg/s',\n 'lbm/s': 'lbm/s',\n 'tonnes/h': 'tonnes/h',\n 'tons/h': 'tons/h',\n 'deg/m': '°/m',\n 'deg/ft': '°/ft',\n 'rad/m': 'rad/m',\n 'rad/ft': 'rad/ft',\n 'dyn/cm': 'dyn/cm',\n 'mN/m': 'mN/m',\n 'm/s': 'm/s',\n 'ft/s': 'ft/s',\n 'm/min': 'm/min',\n 'ft/min': 'ft/min',\n 'm/h': 'm/h',\n 'ft/h': 'ft/h',\n mph: 'mph',\n 'km/h': 'km/h',\n 'm/s2': 'm/s²',\n Gs: 'Gs',\n nT: 'nT',\n g: 'g',\n 'ft/s2': 'ft/s²',\n 'Pa*s': 'Pa⋅s',\n P: 'P',\n 'mPa*s': 'mPa⋅s',\n cP: 'cP',\n W: 'W',\n hhp: 'hhp',\n hp: 'hp',\n kW: 'kW',\n MW: 'MW',\n 'BTU/h': 'BTU/h',\n 'W/m2': 'W/m²',\n 'hhp/in2': 'hhp/in²',\n 'hhp/ft2': 'hhp/ft²',\n 'Mm3/d': 'Mm³/d',\n 'STB/d': 'STB/d',\n 'Sm3/d': 'Sm³/d',\n 'Sm3/min': 'Sm³/min',\n 'MSm3/d': 'MSm³/d',\n 'SCF/STB': 'SCF / STB',\n 'Sm3/Sm3': 'Sm³ / Sm³',\n 'SCF/d': 'SCF/d',\n STB: 'STB',\n SCF: 'SCF',\n MSm3: 'MSm³',\n Gsg: 'sg',\n Gppg: 'ppg',\n 'Gkg/m3': 'kg/m³',\n 'Glbm/ft3': 'lbm/ft³',\n 'lb/ft3': 'lb/ft³',\n '°N': '°N',\n '°S': '°S',\n '°W': '°W',\n '°E': '°E',\n fr: ' ',\n mD: 'mD',\n CI: 'CI',\n Sigma: 'σ',\n 'Sm3/d/bar': 'Sm³/d/bar',\n 'STB/d/psi': 'STB/d/psi',\n 'm3/s/bar': 'm³/s/bar',\n 'lb/ft': 'lb/ft',\n 'E-09/bar': '10⁻⁹/bar',\n 'E-10/psi': '10⁻¹⁰/psi',\n 'E-14/pa': '10⁻¹⁴/pa',\n 'm3/m': ' m³/m',\n 'cm3/m': 'cm³/m',\n 'mm3/m': 'mm³/m',\n 'ft3/ft': 'ft³/ft',\n 'in3/ft': 'in³/ft',\n lk: 'lk',\n ftCla: 'ftCla',\n lkCla: 'lkCla',\n ftSe: 'ftSe',\n ydSe: 'ydSe',\n chSe: 'chSe',\n 'chSe(T)': 'chSe(T)',\n ftGC: 'ftGC',\n ydInd: 'ydInd',\n 'd/stand': 'd/stand',\n 'h/stand': 'h/stand',\n 'min/stand': 'min/stand',\n 's/stand': 's/stand',\n 'm3/t': 'm3/t',\n 'L/100kg': 'L/100kg',\n 'deg/h': '°/h',\n});\n\n/**\n * Alternative units grouped by quantity\n *\n * @readonly\n * @enum {Object}\n */\nexport const ALT_UNITS: Record<string, string[]> = Object.freeze({\n acceleration: ['ft/s2', 'm/s2'],\n angleGradient: ['deg/30m', 'rad/m', 'deg/m', 'deg/ft', 'rad/ft', 'deg/100ft', 'deg/10m'],\n angles: ['deg', 'rad'],\n areaOther: ['in2', 'ft2', 'mm2', 'cm2', 'm2', 'mile2', 'km2'],\n areaTubular: ['in2', 'cm2', 'ft2', 'm2'],\n blowoutFlowRate: [\n 'lpm',\n 'bpm',\n 'm3/min',\n 'ft3/s',\n 'm3/s',\n 'MMSCFD',\n 'ft3/d',\n 'm3/d',\n 'bbl/d',\n 'Mm3/d',\n 'STB/d',\n 'Sm3/d',\n 'Sm3/min',\n 'MSm3/d',\n 'SCF/d',\n ],\n blowoutGasFlowRate: ['MMSCFD', 'Sm3/d', 'MSm3/d', 'SCF/d'],\n blowoutOilFlowRate: ['Sm3/d', 'Sm3/min', 'STB/d'],\n deg: ['deg', 'rad'],\n density: ['sg', 'ppg', 'kg/m3', 'lbm/ft3', 'g/cm3', 'lb/ft3', 'kPa/m'],\n densityGas: ['Gsg', 'Gppg', 'Gkg/m3', 'Glbm/ft3'],\n densityOil: ['sg', 'ppg', 'kg/m3', 'lbm/ft3'],\n densityOilGas: ['ppg', 'kg/m3', 'lbm/ft3'],\n densitySolid: ['sg', 'ppg', 'kg/m3', 'lbm/ft3'],\n depth: ['m', 'ft'],\n diameters: ['in', 'm', 'cm', 'ft', 'mm'],\n distance: ['m', 'ft'],\n dls: ['deg/10m', 'deg/30m', 'deg/100ft'],\n doglegSeverity: ['deg/10m', 'deg/30m', 'deg/100ft'],\n duration: ['s', 'h', 'd', 'min'],\n durationShort: ['s', 'min', 'h', 'd'],\n durationLong: ['min', 'h', 'd', 'month', 'year'],\n flowrate: [\n 'lpm',\n 'gpm',\n 'bpm',\n 'ft3/d',\n 'ft3/s',\n 'm3/s',\n 'm3/d',\n 'm3/min',\n 'Mm3/d',\n 'bbl/d',\n 'MMSCFD',\n 'STB/d',\n 'Sm3/d',\n 'Sm3/min',\n 'MSm3/d',\n 'SCF/d',\n ],\n fluidCompressibility: ['1/bar', '1/psi', '1/Pa', '1/kPa', '1/MPa', '1/GPa'],\n force: ['tonnes', 'lbf', 'kgf', 'N', 'kN', 'tonneForce', 'klbf'],\n forceGradient: ['lbf/ft', 'N/m'],\n frequency: ['Hz'],\n gasVolume: ['MMSCF', 'Sm3', 'MSm3', 'SCF'],\n gor: ['Sm3/Sm3', 'SCF/STB'],\n height: ['m', 'ft'],\n intensity: ['W/m2', 'hhp/in2', 'hhp/ft2'],\n interfacialTension: ['dyn/cm', 'N/m', 'lbf/ft', 'mN/m'],\n latitude: ['°N', '°S'],\n length: ['m', 'cm', 'ft', 'km', 'in', 'mm'],\n linearCapacity: ['l/m', 'bbl/ft'],\n longitude: ['°E', '°W'],\n massFlowRate: ['kg/s', 'lbm/s', 'tonnes/h', 'tons/h'],\n moleWeight: ['kg/mol', 'lbf/mol', 'g/mol'],\n oilVolume: ['STB', 'Sm3'],\n percentage: ['%', 'fr'],\n permeability: ['mD', 'm2'],\n power: ['hp', 'W', 'hhp', 'MW', 'kW', 'BTU/h'],\n pressure: ['bar', 'psi', 'Pa', 'kPa', 'MPa', 'ksi', 'GPa', 'lbf/100ft2'],\n pressureGradient: ['bar/100m', 'Pa/m', 'bar/m', 'psi/100ft', 'psi/ft', 'kPa/m'],\n pressurechange: ['bar', 'psi', 'Pa', 'MPa', 'kPa'],\n gasliftFlowRate: ['STB/d', 'Sm3/d', 'SCF/d'],\n productionFlowRate: ['MMSCFD', 'STB/d', 'Sm3/d', 'Sm3/min', 'MSm3/d', 'SCF/d'],\n productionFlowRateOil: ['MMSCFD', 'STB/d', 'Sm3/d', 'Sm3/min', 'MSm3/d', 'SCF/d'],\n productionFlowRateGas: ['MMSCFD', 'STB/d', 'Sm3/d', 'MSm3/d', 'SCF/d'],\n injectionFlowRate: ['lpm', 'lps', 'bpm', 'gpm', 'MMSCFD', 'STB/d', 'Sm3/d', 'Sm3/min', 'MSm3/d', 'SCF/d'],\n pumpRate: ['lpm', 'lps', 'bpm', 'm3/s', 'Sm3/min', 'ft3/s', 'gpm'],\n rotationalSpeed: ['rpm', 'Hz'],\n rotationalRate: ['deg/h'],\n roughness: ['m', 'microM', 'in', 'mm'],\n rpm: ['rpm', 'Hz'],\n sdstats: ['CI', 'Sigma'],\n specificHeatCapacity: ['J/(kg*degC)', 'J/(kg*degK)', 'BTU/(lbm*degF)'],\n speed: ['km/h', 'ft/min', 'mph', 'ft/h', 'ft/s', 'm/min', 'm/s', 'm/h'],\n inverseStandSpeed: ['d/stand', 'h/stand', 'min/stand', 's/stand'],\n rop: ['ft/h', 'ft/min', 'ft/s', 'km/h', 'm/h', 'm/min', 'm/s', 'mph'],\n stress: ['MPa', 'kPa', 'psi', 'bar', 'Pa', 'ksi', 'lbf/100ft2'],\n temperature: ['C', 'F', 'K'],\n pressurePerTemperature: ['Pa/C', 'Bar/C', 'psi/F', 'psi/C'],\n tempgrad: ['C/100m', 'F/100ft', 'K/100m', 'C/m', 'F/ft', 'K/m'],\n thermalConductivity: ['BTU/(h*ft*degF)', 'W/(mK)'],\n thermalExpansionCoefficient: ['E-06/degC', 'E-06/degF', '1/K'],\n torque: ['Nm', 'ftlbf', 'kNm'],\n torqueGradient: ['N', 'lbf', 'tonnes'],\n turbulentSkin: ['s/m3', '1/m3/d', '1/MMSCFD'],\n viscosity: ['Pa*s', 'P', 'mPa*s', 'cP'],\n inflowProductivityIndex: ['Sm3/d/bar', 'STB/d/psi', 'm3/s/bar'],\n volume: ['m3', 'bbl', 'Mm3', 'l', 'USGal', 'ft3', 'STB', 'Sm3', 'MMSCF', 'MSm3', 'SCF'],\n kickToleranceVolume: ['m3', 'bbl', 'USGal', 'ft3', 'STB', 'Sm3', 'SCF'],\n weight: ['tonnes', 'kg', 'lbf', 'mt', 'kip', 'N'],\n weightGradient: ['ppf', 'kg/m'],\n wgrad: ['sg', 'ppg'],\n wltubulars: ['ppf', 'kg/m'],\n youngsModulus: ['Pa', 'psi'],\n massPerLength: ['kg/m', 'lb/ft'],\n wearFactor: ['E-09/bar', 'E-10/psi', 'E-14/pa'],\n volumeGradient: ['m3/m', 'cm3/m', 'mm3/m', 'ft3/ft', 'in3/ft'],\n shearStress: ['Pa', 'lbf/100ft2'],\n sensorAccelerometer: ['g', 'm/s2'],\n sensorMagnetometer: ['nT', 'Gs'],\n location: ['lk', 'ftCla', 'lkCla', 'ftSe', 'ydSe', 'chSe', 'chSe(T)', 'ftGC', 'ydInd', 'ft', 'm', 'usft'],\n mixingRequirements: ['m3/t', 'L/100kg'],\n entalphy: ['J/kg', 'kJ/kg', 'BTU/lbm'],\n});\n\n/**\n * Units list\n *\n * @readonly\n * @enum {Object}\n */\nexport const UNIT_FROM_KEY: Record<string, string> = Object.freeze({\n density: 'sg',\n densityGas: 'Gsg',\n densityOil: 'sg',\n densityOilGas: 'kg/m3',\n densitySolid: 'kg/m3',\n length: 'm',\n roughness: 'm',\n speed: 'm/s',\n diameters: 'in',\n duration: 's',\n durationShort: 'h',\n durationLong: 'd',\n pressurechange: 'bar',\n pressure: 'bar',\n temperature: 'C',\n tempgrad: 'C/100m',\n volume: 'm3',\n kickToleranceVolume: 'm3',\n weight: 'kg',\n force: 'N',\n wgrad: 'sg',\n wltubulars: 'ppf',\n flowrate: 'lpm',\n permeability: 'mD', // MilliDarcy\n interfacialTension: 'dyn/cm', // Dynes per centimeter\n deg: 'deg',\n dls: 'deg/30m',\n percentage: '%',\n latitude: '°N',\n longitude: '°E',\n torque: 'Nm',\n rpm: 'rpm',\n testSingleUnit: 'm', //test value for a unit with no alt_units\n turbulentSkin: '1/m3/d',\n pressurePerTemperature: 'Pa/C',\n sdstats: 'Sigma',\n acceleration: 'm/s2',\n massFlowRate: 'kg/s',\n angleGradient: 'deg/m',\n viscosity: 'Pa*s',\n weightGradient: 'kg/m',\n intensity: 'W/m2',\n gor: 'Sm3/Sm3',\n inflowProductivityIndex: 'Sm3/d/bar',\n wearFactor: 'E-09/psi',\n location: 'm',\n inverseStandSpeed: 's/stand',\n mixingRequirements: 'm3/t',\n entalphy: 'J/kg',\n shearStress: 'Pa',\n volumeGradient: 'm3/m',\n sensorAccelerometer: 'g',\n sensorMagnetometer: 'Gs',\n rotationalRate: 'deg/h',\n});\n\n/**\n * Constants to help conversion\n *\n * @readonly\n * @enum {Object}\n */\nconst C = Object.freeze({\n g: 0.0980665175317196,\n ft_to_m: 0.3048,\n inch_to_m: 0.0254,\n lbf_to_kg: 0.45359237, // https://en.wikipedia.org/wiki/Pound_(force)\n kg_to_lbf: 2.20462262184877, // https://en.wikipedia.org/wiki/Pound_(force)\n ppf_to_kgm: 0.45359237 / 0.3048,\n kg_cm3: 0.0293984025938081,\n bar_to_psi: 14.503773773022, // https://en.wikipedia.org/wiki/Pound_per_square_inch\n bar_to_pascal: 100000,\n sg_to_ppg: 8.345404265,\n bbl_to_m3: 0.158987294928, // https://en.wikipedia.org/wiki/Unit_of_volume\n USGal_to_m3: 0.003785411784, // https://en.wikipedia.org/wiki/Unit_of_volume\n kelvin_to_degrees: 273.15,\n tonnes_to_pascal: 9806.65,\n therm_exp_coeff: 1.242e-5,\n psi_to_pascal: 6894.757293168361, // ((0.45359237 kg x 9.80665 m/s²)/lbf) / (0.0254 m/in)²\n ft3_to_m3: 0.028316846592, // https://en.wikipedia.org/wiki/Unit_of_volume\n ft3_to_in3: 1728, // https://en.wikipedia.org/wiki/Cubic_inch\n day_to_second: 60 * 60 * 24,\n m3_per_m_to_ft3_per_ft: 10.763910416709722, // https://www.wolframalpha.com/input?i=cubic+meter+per+meter++to+feet+cubic+per+foot&assumption=%7B%22F%22%2C+%22UnitsConversion2%22%2C+%22fromValue%22%7D+-%3E%220.100000000000000000%22\n in3_per_ft_to_m3_per_m: 0.0000537633333333, // 1 / m3_per_m_to_ft3_per_ft / ft3_to_in3 = 0.000053763333333333334 https://www.wolframalpha.com/input?i=cubic+meter+per+meter++to+feet+cubic+per+foot&assumption=%7B%22F%22%2C+%22UnitsConversion2%22%2C+%22fromValue%22%7D+-%3E%220.100000000000000000%22\n /* OW-24122 Flow rate conversion MSm³/d\n `Mega Standard Cubic Metre per day` (`MSm3/d`) <-> `meters cubed per second` (`m3/s`)\n 1 `MSm3/d`\n = `1 * 625/54` `m3/s` (https://www.wolframalpha.com/input?i=Mega+Standard+Cubic+Metre+per+day)\n = `1 / (86400 * 1e-6)` `m3/s` (OW-24122)\n = `11.5740740741`\n We can represent this as `625 / 54` or `1_000_000 / 86400`\n */\n MSm3d_to_m3s: 625 / 54,\n});\n\n/**\n * Conversions list\n *\n * All unit conversion formulas should have a credible source/reference (please add a comment with URL to where you\n * got the formula when adding new units to this package). For example:\n * - Wikipedia\n * - https://www.nist.gov/pml/special-publication-811/nist-guide-si-appendix-b-conversion-factors/nist-guide-si-appendix-b8\n * - https://www.wolframalpha.com/input?i=cubic+meter+to+bbl\n *\n * Do not round conversion factors in formulas (we need full precision). Make sure the inverse conversion (A->B->A)\n * produces a valid result.\n *\n * @readonly\n * @enum {Object}\n */\nexport const KNOWN_CONVERSIONS: Record<string, (val: number) => number> = Object.freeze({\n // LENGTH\n 'm|mm': (val: number): number => val * 1000,\n 'm|cm': (val: number): number => val * 100,\n 'm|km': (val: number): number => val / 1000,\n 'm|ft': (val: number): number => val / C.ft_to_m,\n 'm|in': (val: number): number => val / C.inch_to_m,\n 'm|microM': (val: number): number => val * 1000000,\n 'mm|m': (val: number): number => val / 1000,\n 'cm|m': (val: number): number => val / 100,\n 'km|m': (val: number): number => val * 1000,\n 'ft|m': (val: number): number => val * C.ft_to_m,\n 'in|m': (val: number): number => val * C.inch_to_m,\n 'microM|m': (val: number): number => val / 1000000,\n // AREA\n 'm2|mm2': (val: number): number => val * 1000000,\n 'm2|cm2': (val: number): number => val * 10000,\n 'm2|km2': (val: number): number => val / 1000000,\n 'm2|in2': (val: number): number => val * 1550.0031,\n 'm2|ft2': (val: number): number => val * 10.76391,\n 'm2|mile2': (val: number): number => val * 0.0000003861022,\n 'mm2|m2': (val: number): number => val / 1000000,\n 'cm2|m2': (val: number): number => val / 10000,\n 'km2|m2': (val: number): number => val * 1000000,\n 'in2|m2': (val: number): number => val / 1550.0031,\n 'ft2|m2': (val: number): number => val / 10.76391,\n 'mile2|m2': (val: number): number => val / 0.0000003861022,\n // VOLUME\n 'm3|bbl': (val: number): number => val / C.bbl_to_m3,\n 'm3|ft3': (val: number): number => val / C.ft3_to_m3,\n 'm3|l': (val: number): number => val * 1000,\n 'm3|Mm3': (val: number): number => val / 1000000,\n 'm3|USGal': (val: number): number => val / C.USGal_to_m3,\n 'bbl|m3': (val: number): number => val * C.bbl_to_m3,\n 'ft3|m3': (val: number): number => val * C.ft3_to_m3,\n 'Mm3|m3': (val: number): number => val * 1000000,\n 'l|m3': (val: number): number => val / 1000,\n 'USGal|m3': (val: number): number => val * C.USGal_to_m3,\n 'm3|Sm3': (val: number): number => val * 1,\n 'm3|STB': (val: number): number => val * 6.289512957422142, // 42089843750 / 6692067261 = 6.289512957422142, // https://www.wolframalpha.com/input?i=stb\n 'Sm3|m3': (val: number): number => val * 1,\n 'STB|m3': (val: number): number => val * 0.1589948230919721, //6692067261 / 42089843750 = 0.15899482309197216, // https://www.wolframalpha.com/input?i=stb\n 'm3|MMSCF': (val: number): number => (val * 1e6) / C.ft3_to_m3,\n 'm3|MSm3': (val: number): number => val * 0.000001,\n 'm3|SCF': (val: number): number => val / C.ft3_to_m3,\n 'MMSCF|m3': (val: number): number => val * 1e-6 * C.ft3_to_m3,\n 'MSm3|m3': (val: number): number => val * 1000000,\n 'SCF|m3': (val: number): number => val * C.ft3_to_m3,\n // DENSITY\n 'kg/m3|sg': (val: number): number => val * 0.001,\n 'kg/m3|g/cm3': (val: number): number => val * 0.001,\n 'kg/m3|lbm/ft3': (val: number): number => val / 16.01846337,\n 'kg/m3|lb/ft3': (val: number): number => val / 16.01846337,\n 'kg/m3|ppg': (val: number): number => val * 0.008345404265,\n 'sg|kg/m3': (val: number): number => val * 1000,\n 'g/cm3|kg/m3': (val: number): number => val * 1000,\n 'lbm/ft3|kg/m3': (val: number): number => val * 16.01846337,\n 'lb/ft3|kg/m3': (val: number): number => val * 16.01846337,\n 'ppg|kg/m3': (val: number): number => val / 0.008345404265,\n 'sg|kPa/m': (val: number): number => val * 9.81,\n 'kPa/m|sg': (val: number): number => val / 9.81,\n // GAS DENSITY\n 'Gkg/m3|Gsg': (val: number): number => val / 1.225,\n 'Gkg/m3|Glbm/ft3': (val: number): number => val / 16.0176516725,\n 'Gkg/m3|Gppg': (val: number): number => val / 119.8659491193,\n 'Gsg|Gkg/m3': (val: number): number => val * 1.225,\n 'Glbm/ft3|Gkg/m3': (val: number): number => val * 16.0176516725,\n 'Gppg|Gkg/m3': (val: number): number => val * 119.8659491193,\n // WLTUBULARS\n 'ppf|kg/m': (val: number): number => (val * 0.45359237) / 0.3048,\n 'kg/m|ppf': (val: number): number => (val * 1) / (0.45359237 / 0.3048),\n 'kg/m|lbf/ft': (val: number): number => val / 0.67196897675131,\n 'lbf/ft|kg/m': (val: number): number => val * 0.67196897675131,\n // PRESSURE / STRESS\n 'Pa|psi': (val: number): number => val / C.psi_to_pascal,\n 'psi|Pa': (val: number): number => val * C.psi_to_pascal,\n 'Pa|bar': (val: number): number => val * 0.00001,\n 'Pa|kPa': (val: number): number => val * 0.001,\n 'Pa|MPa': (val: number): number => val * 0.000001,\n 'Pa|GPa': (val: number): number => val * 0.000000001,\n\n 'bar|Pa': (val: number): number => val * 100000,\n 'kPa|Pa': (val: number): number => val * 1000,\n 'MPa|Pa': (val: number): number => val * 1000000,\n 'GPa|Pa': (val: number): number => val * 1000000000,\n 'psi|ksi': (val: number): number => val / 1000,\n 'ksi|psi': (val: number): number => val * 1000,\n 'psi|lbf/100ft2': (val: number): number => val * 14400, // psi = lbf/in², 1 ft² = 144 in² https://en.wikipedia.org/wiki/Square_foot\n 'lbf/100ft2|psi': (val: number): number => val / 14400,\n // FLUID COMPRESSIBILITY\n '1/psi|1/Pa': (val: number): number => val / C.psi_to_pascal,\n '1/bar|1/Pa': (val: number): number => val * 0.00001,\n '1/kPa|1/Pa': (val: number): number => val * 0.001,\n '1/MPa|1/Pa': (val: number): number => val * 0.000001,\n '1/GPa|1/Pa': (val: number): number => val * 0.000000001,\n '1/Pa|1/psi': (val: number): number => val * C.psi_to_pascal,\n '1/Pa|1/bar': (val: number): number => val * 100000,\n '1/Pa|1/kPa': (val: number): number => val * 1000,\n '1/Pa|1/MPa': (val: number): number => val * 1000000,\n '1/Pa|1/GPa': (val: number): number => val * 1000000000,\n // TEMPERATURE\n 'C|F': (val: number): number => val * 1.8 + 32,\n 'F|C': (val: number): number => ((val - 32) * 5) / 9,\n 'K|C': (val: number): number => val - C.kelvin_to_degrees,\n 'C|K': (val: number): number => val + C.kelvin_to_degrees,\n // TEMPERATURE GRADIENT\n 'C/100m|F/100ft': (val: number): number => val * 1.8 * C.ft_to_m,\n 'F/100ft|C/100m': (val: number): number => (val * 5) / 9 / C.ft_to_m,\n 'C/100m|C/m': (val: number): number => val / 100,\n 'C/m|C/100m': (val: number): number => val * 100,\n 'C/100m|F/ft': (val: number): number => ((val * 1.8) / 100) * C.ft_to_m,\n 'F/ft|C/100m': (val: number): number => (((val * 5) / 9) * 100) / C.ft_to_m,\n 'C/100m|K/m': (val: number): number => val / 100,\n 'K/m|C/100m': (val: number): number => val * 100,\n 'K/100m|C/100m': (val: number): number => val,\n 'C/100m|K/100m': (val: number): number => val,\n // PRESSURE PER TEMPERATURE\n 'Pa/C|Bar/C': (val: number): number => val * 0.00001,\n 'Pa/C|psi/F': (val: number): number => val / 1.8 / C.psi_to_pascal,\n 'Pa/C|psi/C': (val: number): number => val / C.psi_to_pascal, // https://en.wikipedia.org/wiki/Pound_per_square_inch\n 'Bar/C|Pa/C': (val: number): number => val * 100000,\n 'psi/F|Pa/C': (val: number): number => val * 1.8 * C.psi_to_pascal,\n 'psi/C|Pa/C': (val: number): number => val * C.psi_to_pascal, // ((0.45359237 kg x 9.80665 m/s²)/lbf) / (0.0254 m/in)²\n 'psi/F|psi/C': (val: number): number => val * 1.8,\n 'psi/C|psi/F': (val: number): number => val / 1.8,\n // WEIGHTf\n 'kg|kgf': (val: number): number => val,\n 'kg|lbf': (val: number): number => val * C.kg_to_lbf,\n 'kg|t': (val: number): number => val / 1000,\n 'kg|tonnes': (val: number): number => val / 1000,\n 'kg|mt': (val: number): number => val / 1000,\n /*\n 1 kip = 1000 lbf - https://en.wikipedia.org/wiki/Kip_(unit)\n */\n 'kg|kip': (val: number): number => val * C.kg_to_lbf * 1e-3,\n 'kgf|kg': (val: number): number => val,\n 'lbf|kg': (val: number): number => val * C.lbf_to_kg,\n 't|kg': (val: number): number => val * 1000,\n 'tonnes|kg': (val: number): number => val * 1000,\n 'mt|kg': (val: number): number => val * 1000,\n 'kip|kg': (val: number): number => val * 1000 * C.lbf_to_kg,\n 'tonnes|lbf': (val: number): number => val * 1000 * C.kg_to_lbf,\n 'lbf|tonnes': (val: number): number => (val * C.lbf_to_kg) / 1000,\n 't|lbf': (val: number): number => val * 1000 * C.kg_to_lbf,\n 'lbf|t': (val: number): number => (val * C.lbf_to_kg) / 1000,\n 'mt|lbf': (val: number): number => val * 1000 * C.kg_to_lbf,\n 'lbf|mt': (val: number): number => val / (1000 * C.kg_to_lbf),\n 'kgf|lbf': (val: number): number => val * C.kg_to_lbf,\n 'lbf|kgf': (val: number): number => val * C.lbf_to_kg,\n 'kg|g': (val: number): number => val * 1000,\n 'g|kg': (val: number): number => val / 1000,\n 'kgf|t': (val: number): number => val / 1000,\n 't|kgf': (val: number): number => val * 1000,\n 'kgf|tonnes': (val: number): number => val / 1000,\n 'tonnes|kgf': (val: number): number => val * 1000,\n // MASS PER LENGTH\n 'kg/m|lb/ft': (val: number): number => val * 1.4881639435695537,\n 'lb/ft|kg/m': (val: number): number => val * 0.6719689751395069,\n 'kg|N': (val: number): number => val * C.g * 100,\n 'N|kg': (val: number): number => val / (C.g * 100),\n // DISTANCE PER TIME\n 'm/s|km/h': (val: number): number => val * 3.6,\n 'km/h|m/s': (val: number): number => val / 3.6,\n 'm/s|ft/s': (val: number): number => val / C.ft_to_m,\n 'm/s|ft/min': (val: number): number => (val * 60) / C.ft_to_m,\n 'm/s|ft/h': (val: number): number => (val * 3600) / C.ft_to_m,\n 'm/s|m/min': (val: number): number => val * 60,\n 'm/s|m/h': (val: number): number => val * 3600,\n 'ft/s|m/s': (val: number): number => val * C.ft_to_m,\n 'ft/min|m/s': (val: number): number => (val * C.ft_to_m) / 60,\n 'ft/h|m/s': (val: number): number => (val * C.ft_to_m) / 3600,\n 'm/min|m/s': (val: number): number => val / 60,\n 'm/h|m/s': (val: number): number => val / 3600,\n 'm/s|mph': (val: number): number => val * 2.2369362920544,\n 'mph|m/s': (val: number): number => val / 2.2369362920544,\n 'ft/h|ft/d': (val: number): number => val * 24,\n 'ft/d|ft/h': (val: number): number => val / 24,\n 'ft/h|m/h': (val: number): number => val * C.ft_to_m,\n 'm/h|ft/h': (val: number): number => val / C.ft_to_m,\n 'ft/d|m/h': (val: number): number => (val * C.ft_to_m) / 24,\n 'm/h|ft/d': (val: number): number => (val * 24) / C.ft_to_m,\n 'ft/d|m/d': (val: number): number => val * C.ft_to_m,\n 'm/d|ft/d': (val: number): number => val / C.ft_to_m,\n 'm/h|m/d': (val: number): number => val * 24,\n 'm/d|m/h': (val: number): number => val / 24,\n // LINEAR CAPACITY\n 'l/m|bbl/ft': (val: number): number => val * 0.0019171343228277056,\n 'bbl/ft|l/m': (val: number): number => val / 0.0019171343228277056,\n // FLOW RATES\n 'm3/s|ft3/s': (val: number): number => val / C.ft3_to_m3,\n 'm3/s|lpm': (val: number): number => val * 60000,\n 'm3/s|bpm': (val: number): number => val * 377.388646,\n 'm3/s|m3/min': (val: number): number => val * 60.0,\n 'm3/s|m3/d': (val: number): number => val * C.day_to_second,\n 'm3/s|bbl/d': (val: number): number => val * 543439.6505653338,\n 'm3/s|ft3/d': (val: number): number => (val * C.day_to_second) / C.ft3_to_m3,\n 'm3/s|gpm': (val: number): number => (val * 2500000000000) / 157725491, // https://www.wolframalpha.com/input?i=m3%2Fs+\n 'm3/s|MMSCFD': (val: number): number => val / 0.32774128,\n 'm3/s|STB/d': (val: number): number => (val * 134687500000000) / 247854343,\n 'm3/s|Sm3/d': (val: number): number => val * C.day_to_second,\n 'm3/s|Sm3/min': (val: number): number => val * 60,\n 'Sm3/min|m3/s': (val: number): number => val / 60,\n 'm3/s|MSm3/d': (val: number): number => val / C.MSm3d_to_m3s,\n 'm3/s|SCF/d': (val: number): number => val * 3051187.2047366146,\n 'ft3/s|m3/s': (val: number): number => val * C.ft3_to_m3,\n 'lpm|m3/s': (val: number): number => val / 60000,\n 'lps|lpm': (val: number): number => val * 60,\n 'lpm|lps': (val: number): number => val / 60,\n 'bpm|m3/s': (val: number): number => val / 377.388646,\n 'm3/d|m3/s': (val: number): number => val / C.day_to_second,\n 'm3/min|m3/s': (val: number): number => val / 60.0,\n 'bbl/d|m3/s': (val: number): number => (val / C.day_to_second) * C.bbl_to_m3,\n 'ft3/d|m3/s': (val: number): number => (val / C.day_to_second) * C.ft3_to_m3,\n 'ft3/d|m3/d': (val: number): number => val * C.ft3_to_m3,\n 'm3/d|ft3/d': (val: number): number => val / C.ft3_to_m3,\n 'm3/d|ft3/s': (val: number): number => val / C.ft3_to_m3 / C.day_to_second,\n 'gpm|m3/s': (val: number): number => (val * 157725491) / 2500000000000, // https://www.wolframalpha.com/input?i=m3%2Fs+\n 'MMSCFD|m3/s': (val: number): number => val * 0.32774128,\n 'Mm3/d|m3/d': (val: number): number => val * 1e6,\n 'm3/d|Mm3/d': (val: number): number => val * 1e-6,\n /*\n exact formula is 247854343 / 134687500000000 = 0.0000018402178598607888 - https://www.wolframalpha.com/input?i=STB%2Fd\n STB has a lot of intermediate conversions, so to avoid delta during conversions trip we have to store 2 more digits\n */\n 'STB/d|m3/s': (val: number): number => val * 0.00000184021785986,\n 'Sm3/d|m3/d': (val: number): number => val, // At a pressure of 101.325 kPa (760 Torr) and DIN 1343: a temperature of 273.15 K (0°C/32°F) | NOTE: Thomas suggested that we leep those conversions 1to1,\n 'm3/d|Sm3/d': (val: number): number => val, // because the calculated rate is the rate at standard conditions\n 'Sm3/d|m3/s': (val: number): number => val / C.day_to_second,\n 'MSm3/d|Sm3/d': (val: number): number => val * 1e6,\n 'Sm3/d|MSm3/d': (val: number): number => val * 1e-6,\n 'MSm3/d|m3/s': (val: number): number => val * C.MSm3d_to_m3s,\n 'SCF/d|m3/s': (val: number): number => val * 3.2774128e-7,\n // TURBULENT SKIN\n '1/m3/d|1/MMSCFD': (val: number): number => val * 28316.85,\n '1/MMSCFD|1/m3/d': (val: number): number => val / 28316.85,\n 's/m3|1/m3/d': (val: number): number => val / 86400,\n '1/m3/d|s/m3': (val: number): number => val * 86400,\n // MASS FLOW RATES\n 'kg/s|lbm/s': (val: number): number => val * 2.20462262,\n 'lbm/s|kg/s': (val: number): number => val / 2.20462262,\n 'kg/s|tonnes/h': (val: number): number => val * 3.6,\n 'tonnes/h|kg/s': (val: number): number => val / 3.6,\n 'kg/s|tons/h': (val: number): number => val * 3.9683207193277967,\n 'tons/h|kg/s': (val: number): number => val * 0.2519957611111111,\n 'lbm/s|tonnes/h': (val: number): number => val * 1.632932532,\n 'tonnes/h|lbm/s': (val: number): number => val * 0.612395172735771,\n 'lbm/s|tons/h': (val: number): number => val * 1.8,\n 'tons/h|lbm/s': (val: number): number => val / 1.8,\n 'tonnes/h|tons/h': (val: number): number => val * 1.1023113109243878,\n 'tons/h|tonnes/h': (val: number): number => val * 0.90718474,\n // PERMEABILITY\n 'mD|m2': (val: number): number => val * 9.869233e-13, // https://en.wikipedia.org/wiki/Darcy_(unit)\n 'm2|mD': (val: number): number => val / 9.869233e-13,\n // GRADIENTS - Force / INTERFACIAL TENSION:\n 'N/m|lbf/ft': (val: number): number => val * 0.22480894387096 * C.ft_to_m,\n 'lbf/ft|N/m': (val: number): number => val / 0.22480894387096 / C.ft_to_m,\n 'dyn/cm|mN/m': (val: number): number => val,\n 'mN/m|dyn/cm': (val: number): number => val,\n 'dyn/cm|N/m': (val: number): number => val * 0.001,\n 'N/m|dyn/cm': (val: number): number => val * 1000,\n 'mN/m|N/m': (val: number): number => val * 0.001,\n 'N/m|mN/m': (val: number): number => val * 1000,\n // TORQUE\n 'Nm|ftlbf': (val: number): number => val * 0.737562058700684063406313,\n 'Nm|kNm': (val: number): number => val / 1000,\n 'kNm|Nm': (val: number): number => val * 1000,\n 'ftlbf|Nm': (val: number): number => val / 0.737562058700684063406313,\n // FORCE\n 'N|kN': (val: number): number => val * 0.001,\n 'N|kgf': (val: number): number => (val * 20000) / 196133, // https://www.wolframalpha.com/input?i=newtons\n 'N|lbf': (val: number): number => (val * 2000000000000) / 8896443230521, // https://www.wolframalpha.com/input?i=newtons\n 'kN|lbf': (val: number): number => (val * 1e3 * 2000000000000) / 8896443230521,\n 'N|tonneForce': (val: number): number => (val * 20) / 196133, // https://www.wolframalpha.com/input?i=tonneForce\n 'kN|N': (val: number): number => val / 0.001,\n 'kgf|N': (val: number): number => (val * 196133) / 20000, // https://www.wolframalpha.com/input?i=kgf\n 'lbf|N': (val: number): number => (val * 8896443230521) / 2000000000000, // https://www.wolframalpha.com/input?i=newtons\n 'lbf|kN': (val: number): number => (val * 8896443230521) / (2000000000000 * 1e3),\n 'lbf|tonneForce': (val: number): number => (val * 45359237) / 100000000000, // https://www.wolframalpha.com/input?i=tonneForce\n 'klbf|tonneForce': (val: number): number => (val * 45359237) / (100000000000 * 1e-3),\n 'tonneForce|N': (val: number): number => (val * 196133) / 20, // https://www.wolframalpha.com/input?i=tonneForce\n 'tonneForce|lbf': (val: number): number => (val * 100000000000) / 45359237, //https://www.wolframalpha.com/input?i=tonneForce\n 'tonneForce|klbf': (val: number): number => (val * 100000000000) / (45359237 * 1e3), // https://www.wolframalpha.com/input?i=tonneForce\n 'klbf|lbf': (val: number): number => val * 1000,\n 'lbf|klbf': (val: number): number => val / 1000,\n // DURATION\n 's|min': (val: number): number => val / 60,\n 's|h': (val: number): number => val / 3600,\n 's|d': (val: number): number => val / (24 * 3600),\n 'min|s': (val: number): number => val * 60,\n 'h|s': (val: number): number => val * 3600,\n 'd|s': (val: number): number => val * 24 * 3600,\n 'year|d': (val: number): number => val * 365.25,\n 'd|year': (val: number): number => val / 365.25,\n 'year|month': (val: number): number => val * 12,\n 'month|year': (val: number): number => val / 12,\n 'month|d': (val: number): number => val * 30.4375,\n 'd|month': (val: number): number => val / 30.4375,\n // TIME/STAND DURATION\n 's/stand|min/stand': (val: number): number => val / 60,\n 's/stand|h/stand': (val: number): number => val / 3600,\n 's/stand|d/stand': (val: number): number => val / 86400,\n 'min/stand|s/stand': (val: number): number => val * 60,\n 'h/stand|s/stand': (val: number): number => val * 3600,\n 'd/stand|s/stand': (val: number): number => val * 86400,\n 'min/stand|h/stand': (val: number): number => val / 60,\n 'min/stand|d/stand': (val: number): number => val / 1440,\n 'h/stand|min/stand': (val: number): number => val * 60,\n 'h/stand|d/stand': (val: number): number => val / 24,\n 'd/stand|min/stand': (val: number): number => val * 1440,\n 'd/stand|h/stand': (val: number): number => val * 24,\n // PERCENTAGE / FRACTIONS\n '%|fr': (val: number): number => val * 0.01,\n 'fr|%': (val: number): number => val / 0.01,\n // DEGREES\n 'deg|rad': (val: number): number => (val * Math.PI) / 180,\n 'rad|deg': (val: number): number => (val * 180) / Math.PI,\n // POWER\n 'W|hp': (val: number): number => val / 745.699872,\n 'hp|W': (val: number): number => val * 745.699872,\n 'W|kW': (val: number): number => val / 1000,\n 'W|MW': (val: number): number => val / 1e6,\n 'kW|W': (val: number): number => val * 1000,\n 'MW|W': (val: number): number => val * 1e6,\n 'W|BTU/h': (val: number): number => val * 3.4121416351331,\n 'BTU/h|W': (val: number): number => val / 3.4121416351331,\n 'hhp|hp': (val: number): number => val, // hydraulic horsepower is just horsepower\n 'hp|hhp': (val: number): number => val,\n // NAVIGATION\n '°N|°S': (val: number): number => val,\n '°S|°N': (val: number): number => val,\n '°W|°E': (val: number): number => val,\n '°E|°W': (val: number): number => val,\n // Specific Heat Capacity\n 'BTU/(Kg*K)|BTU/(lbm*degF)': (val: number): number => val / 4186.798188,\n 'BTU/(lbm*degF)|J/(kg*degC)': (val: number): number => val * 4186.798188,\n 'BTU/(lbm*degF)|BTU/(Kg*K)': (val: number): number => val * 4186.798188,\n\n 'J/(kg*degK)|J/(kg*degC)': (val: number): number => val,\n 'J/(kg*degC)|BTU/(lbm*degF)': (val: number): number => val / 4186.798188,\n 'J/(kg*degC)|J/(kg*degK)': (val: number): number => val,\n 'J/(kg*degC)|J/(s*m*degK)': (val: number): number => val,\n // Thermal conductivity\n 'BTU/(h*ft*degF)|W/(mK)': (val: number): number => val * 1.7295772056,\n 'BTU/(h*ft*degF)|J/(s*m*degK)': (val: number): number => val * 1.7295772056,\n\n 'W/(mK)|BTU/(h*ft*degF)': (val: number): number => val / 1.7295772056,\n 'W/(mK)|J/(s*m*degK)': (val: number): number => val,\n 'W/(m*degK)|J/(s*m*degK)': (val: number): number => val,\n 'W/(m*degK)|BTU/(h*ft*degF)': (val: number): number => val / 1.7295772056,\n\n 'J/(s*m*degK)|BTU/(h*ft*degF)': (val: number): number => val / 1.7295772056,\n 'J/(s*m*degK)|W/(m*degK)': (val: number): number => val,\n 'J/(s*m*degK)|W/(mK)': (val: number): number => val,\n 'J/(s*m*degK)|J/(kg*degC)': (val: number): number => val,\n // THERMAL EXPANSION\n 'E-06/degF|E-06/degC': (val: number): number => val * 1.8,\n 'E-06/degC|E-06/degF': (val: number): number => val / 1.8,\n 'E-06/degC|1/K': (val: number): number => val / 1000000,\n '1/K|E-06/degC': (val: number): number => val * 1000000,\n // FREQUENCY\n 'rpm|Hz': (val: number): number => val / 60,\n 'Hz|rpm': (val: number): number => val * 60,\n // Confidence interval\n 'CI|Sigma': (val: number): number => get_k_from_conf_int(val),\n 'Sigma|CI': (val: number): number => get_conf_int_from_k(val),\n // Mole weight:\n 'g/mol|kg/mol': (val: number): number => val / 1000,\n 'kg/mol|g/mol': (val: number): number => val * 1000,\n 'lbf/mol|kg/mol': (val: number): number => val / C.kg_to_lbf,\n 'kg/mol|lbf/mol': (val: number): number => val * C.kg_to_lbf,\n // Acceleration:\n 'm/s2|ft/s2': (val: number): number => val / C.ft_to_m,\n 'ft/s2|m/s2': (val: number): number => val * C.ft_to_m,\n // Viscosity:\n 'Pa*s|P': (val: number): number => val * 10,\n 'P|Pa*s': (val: number): number => val / 10,\n 'mPa*s|Pa*s': (val: number): number => val / 1000,\n 'Pa*s|mPa*s': (val: number): number => val * 1000,\n 'cP|Pa*s': (val: number): number => val * 0.001,\n 'Pa*s|cP': (val: number): number => val / 0.001,\n // GRADIENTS - Pressure:\n 'Pa/m|bar/m': (val: number): number => val * 0.00001,\n 'bar/m|Pa/m': (val: number): number => val * 100000,\n 'Pa/m|kPa/m': (val: number): number => val / 1000,\n 'kPa/m|Pa/m': (val: number): number => val * 1000,\n 'Pa/m|bar/100m': (val: number): number => val * 0.001,\n 'bar/100m|Pa/m': (val: number): number => val * 1000,\n 'bar/m|bar/100m': (val: number): number => val * 100,\n 'bar/100m|bar/m': (val: number): number => val / 100,\n 'psi/ft|Pa/m': (val: number): number => (val * C.psi_to_pascal) / C.ft_to_m,\n 'Pa/m|psi/ft': (val: number): number => (val / C.psi_to_pascal) * C.ft_to_m,\n 'psi/100ft|Pa/m': (val: number): number => (val * 68.9475729) / C.ft_to_m,\n 'Pa/m|psi/100ft': (val: number): number => (val / 68.9475729) * C.ft_to_m,\n // Gradients - Angles:\n 'deg/30m|deg/100ft': (val: number): number => val * ((100 * C.ft_to_m) / 30),\n 'deg/100ft|deg/30m': (val: number): number => val / ((100 * C.ft_to_m) / 30),\n 'deg/30m|deg/m': (val: number): number => val / 30,\n 'deg/m|deg/30m': (val: number): number => val * 30,\n 'deg/100ft|deg/ft': (val: number): number => val / 100,\n 'deg/ft|deg/100ft': (val: number): number => val * 100,\n 'deg/100ft|deg/m': (val: number): number => val / (100 * C.ft_to_m),\n 'deg/m|deg/100ft': (val: number): number => val * (100 * C.ft_to_m),\n 'deg/ft|deg/m': (val: number): number => val / C.ft_to_m,\n 'deg/m|deg/ft': (val: number): number => val * C.ft_to_m,\n 'deg/m|rad/m': (val: number): number => (val * Math.PI) / 180,\n 'rad/m|deg/m': (val: number): number => (val * 180) / Math.PI,\n 'rad/ft|deg/m': (val: number): number => (val * 180) / Math.PI / C.ft_to_m,\n 'deg/m|rad/ft': (val: number): number => ((val * Math.PI) / 180) * C.ft_to_m,\n 'deg/10m|deg/100ft': (val: number): number => val * (10 * C.ft_to_m),\n 'deg/100ft|deg/10m': (val: number): number => val / (10 * C.ft_to_m),\n 'deg/10m|deg/m': (val: number): number => val / 10,\n 'deg/m|deg/10m': (val: number): number => val * 10,\n 'deg/30m|deg/10m': (val: number): number => val / 3,\n 'deg/10m|deg/30m': (val: number): number => val * 3,\n 'deg/10m|rad/m': (val: number): number => (val * Math.PI) / 180 / 10,\n 'rad/m|deg/10m': (val: number): number => ((val * 180) / Math.PI) * 10,\n // intensity\n 'W/m2|hhp/in2': (val: number): number => val * (1 / 745.699872 / 1550.0031),\n 'W/m2|hhp/ft2': (val: number): number => val * (1 / 745.699872 / 10.76391),\n 'hhp/in2|W/m2': (val: number): number => val / (1 / 745.699872 / 1550.0031),\n 'hhp/ft2|W/m2': (val: number): number => val / (1 / 745.699872 / 10.76391),\n // Gas Oil Ratio:\n 'SCF/STB|Sm3/Sm3': (val: number): number => val * 0.178099173553719, // 431 / 2420 = 0.17809917355371901 - https://www.wolframalpha.com/input?i=Standard+Cubic+Feet+per+Stock+Tank+Barrel\n 'Sm3/Sm3|SCF/STB': (val: number): number => val * 5.614849187935035, // 2420 / 431 = 5.614849187935035\n // Inflow Productivity Index\n 'Sm3/d/bar|m3/s/bar': (val: number): number => val / 86400,\n 'STB/d/psi|m3/s/bar': (val: number): number => val / 37468.77736,\n 'm3/s/bar|Sm3/d/bar': (val: number): number => val * 86400,\n 'm3/s/bar|STB/d/psi': (val: number): number => val * 37468.77736,\n 'E-10/psi|E-09/bar': (val: number): number => val * 1.450377378,\n 'E-10/psi|E-14/pa': (val: number): number => val * 1.450377378,\n 'E-14/pa|E-10/psi': (val: number): number => val / 1.450377378,\n 'E-09/bar|E-10/psi': (val: number): number => val / 1.450377378,\n 'E-14/pa|1/Pa': (val: number): number => val / Math.pow(10, 14),\n 'E-09/bar|1/bar': (val: number): number => val / Math.pow(10, 9),\n 'E-10/psi|1/psi': (val: number): number => val / Math.pow(10, 10),\n '1/Pa|E-14/pa': (val: number): number => val * Math.pow(10, 14),\n '1/bar|E-09/bar': (val: number): number => val * Math.pow(10, 9),\n '1/psi|E-10/psi': (val: number): number => val * Math.pow(10, 10),\n // volumeGradient\n 'm3/m|cm3/m': (val: number): number => val * 10 ** 6,\n 'm3/m|mm3/m': (val: number): number => val * 10 ** 9,\n 'm3/m|ft3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft,\n 'm3/m|in3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * C.ft3_to_in3,\n 'cm3/m|m3/m': (val: number): number => val * 1e-6,\n 'cm3/m|mm3/m': (val: number): number => val * 1e3,\n 'cm3/m|ft3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-6,\n 'cm3/m|in3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-6 * C.ft3_to_in3,\n 'mm3/m|m3/m': (val: number): number => val * 1e-9,\n 'mm3/m|cm3/m': (val: number): number => val * 0.001,\n 'mm3/m|ft3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-9,\n 'mm3/m|in3/ft': (val: number): number => val * C.m3_per_m_to_ft3_per_ft * 1e-9 * C.ft3_to_in3,\n 'ft3/ft|m3/m': (val: number): number => val * 0.09290304,\n 'ft3/ft|cm3/m': (val: number): number => val * 92903.04,\n 'ft3/ft|mm3/m': (val: number): number => val * 92903040,\n 'ft3/ft|in3/ft': (val: number): number => val * 1728,\n 'in3/ft|m3/m': (val: number): number => val * C.in3_per_ft_to_m3_per_m,\n 'in3/ft|cm3/m': (val: number): number => val * C.in3_per_ft_to_m3_per_m * 1e6,\n 'in3/ft|mm3/m': (val: number): number => val * C.in3_per_ft_to_m3_per_m * 1e9,\n 'in3/ft|ft3/ft': (val: number): number => val / C.ft3_to_in3,\n // shearStress\n 'Pa|lbf/100ft2': (val: number): number => val * 2.088543423315013, // (100 * 185806080000) / 8896443230521 = 2.088543423315013 - https://www.wolframalpha.com/input?i=Pa+unit\n 'lbf/100ft2|Pa': (val: number): number => val * 0.4788025898033584, // 8896443230521 / (185806080000 * 100) = 0.47880258980335844, // https://www.wolframalpha.com/input?i=Pa+unit\n // GIS Location Systems\n 'usft|m': (val: number): number => val * 0.30480060960121924,\n 'lk|m': (val: number): number => val * 0.201168,\n 'ftCla|m': (val: number): number => val * 0.3047972651151,\n 'lkCla|m': (val: number): number => val * 0.2011057269733667,\n 'ftGC|m': (val: number): number => val * 0.30479971018150875,\n 'ydInd|m': (val: number): number => val * 0.9143985307444408,\n 'ftSe|m': (val: number): number => val * (12 / 39.370147),\n 'ydSe|m': (val: number): number => val * 0.9143991154275526,\n 'chSe|m': (val: number): number => val * 20.11676512155263,\n 'chSe(T)|m': (val: number): number => val * 20.116756,\n 'm|usft': (val: number): number => val / 0.30480060960121924,\n 'm|lk': (val: number): number => val / 0.201168,\n 'm|ftCla': (val: number): number => val / 0.3047972651151,\n 'm|lkCla': (val: number): number => val / 0.2011057269733667,\n 'm|ftGC': (val: number): number => val / 0.30479971018150875,\n 'm|ydInd': (val: number): number => val / 0.9143985307444408,\n 'm|ftSe': (val: number): number => val / (12 / 39.370147),\n 'm|ydSe': (val: number): number => val / 0.9143991154275526,\n 'm|chSe': (val: number): number => val / 20.11676512155263,\n 'm|chSe(T)': (val: number): number => val / 20.116756,\n // Mixing Requirements\n 'm3/t|L/100kg': (val: number) => val * 100,\n 'L/100kg|m3/t': (val: number) => val * 0.01,\n //entalphy\n 'kJ/kg|J/kg': (val: number) => val * 1000,\n 'J/kg|kJ/kg': (val: number) => val / 1000,\n 'BTU/lbm|J/kg': (val: number) => val * 2326,\n 'J/kg|BTU/lbm': (val: number) => val / 2326,\n // sensor accelerometer\n 'g|m/s2': (val: number): number => val * 9.81,\n 'm/s2|g': (val: number): number => val / 9.81,\n // sensor magnetometer\n 'Gs|nT': (val: number): number => val * 100000,\n 'nT|Gs': (val: number): number => val / 100000,\n});\n\n/**\n * Deprecated units\n *\n * @readonly\n * @enum {Object}\n */\nexport const DEPRECATED_UNITS: Record<string, string> = Object.freeze({\n 'N-m': 'Nm',\n 'ft-lbf': 'ftlbf',\n 'BTU/hr': 'BTU/h',\n 'BTU/(htf*degF)': 'BTU/(h*ft*degF)',\n 'BTU/(hft*degF)': 'BTU/(h*ft*degF)',\n});\n\n/**\n * This list is mapping from legal alternative unit names to our selected unit name\n *\n * @readonly\n * @enum {Object}\n */\nexport const UNIT_ALIASES: Record<string, string> = Object.freeze({\n 'lbs/ft': 'lb/ft',\n 'lbm/ft': 'lb/ft', // pound-mass per feet\n ftUS: 'usft', // US feet, GIS interpretation\n});\n\n/**\n * Intermediate conversions\n *\n * @readonly\n * @enum {Object}\n */\nexport const INTERMEDIATE_CONVERSIONS: Record<string, string> = Object.freeze({\n // LENGTH\n mm: 'm',\n cm: 'm',\n km: 'm',\n ft: 'm',\n in: 'm',\n microM: 'm',\n // WEIGHT\n lbf: 'kg',\n t: 'kg',\n tonnes: 'kg',\n mt: 'kg',\n kip: 'kg',\n // POWER\n kW: 'W',\n MW: 'W',\n hp: 'W',\n hhp: 'hp',\n // AREA\n mm2: 'm2',\n cm2: 'm2',\n km2: 'm2',\n in2: 'm2',\n ft2: 'm2',\n mile2: 'm2',\n // VOLUME\n bbl: 'm3',\n ft3: 'm3',\n Mm3: 'm3',\n l: 'm3',\n USGal: 'm3',\n Sm3: 'm3',\n STB: 'm3',\n MMSCF: 'm3',\n MSm3: 'm3',\n SCF: 'm3',\n // FORCE\n kN: 'N',\n kgf: 'N',\n tonneForce: 'N',\n klbf: 'lbf',\n // PRESSURE\n psi: 'Pa',\n bar: 'Pa',\n kPa: 'Pa',\n MPa: 'Pa',\n ksi: 'psi',\n 'lbf/100ft2': 'psi',\n // Pressure gradients:\n 'psi/100ft': 'Pa/m',\n 'psi/ft': 'Pa/m',\n 'bar/100m': 'Pa/m',\n 'bar/m': 'Pa/m',\n 'Pa/m': 'kPa/m',\n // DENSITY\n sg: 'kg/m3',\n 'g/cm3': 'kg/m3',\n 'lbm/ft3': 'kg/m3',\n 'lb/ft3': 'kg/m3',\n ppg: 'kg/m3',\n 'kPa/m': 'sg',\n // GAS DENSITY\n Gsg: 'Gkg/m3',\n Gppg: 'Gkg/m3',\n 'Glbm/ft3': 'Gkg/m3',\n // FLUID COMPRESSIBILITY\n '1/psi': '1/Pa',\n '1/bar': '1/Pa',\n '1/kPa': '1/Pa',\n '1/MPa': '1/Pa',\n '1/GPa': '1/Pa',\n // DISTANCE PER TIME\n 'ft/s': 'm/s',\n 'ft/min': 'm/s',\n 'ft/h': 'm/s',\n 'm/min': 'm/s',\n 'm/h': 'm/s',\n mph: 'm/s',\n // FLOW RATE\n 'ft3/s': 'm3/s',\n lpm: 'm3/s',\n lps: 'lpm',\n bpm: 'm3/s',\n 'm3/d': 'm3/s',\n 'bbl/d': 'm3/s',\n 'ft3/d': 'm3/s',\n 'STB/d': 'm3/s',\n 'Sm3/d': 'm3/s',\n 'Sm3/min': 'm3/s',\n gpm: 'm3/s',\n MMSCFD: 'm3/s',\n 'Mm3/d': 'm3/d',\n 'm3/min': 'm3/s',\n 'MSm3/d': 'm3/s',\n 'lbf/ft': 'N/m',\n // DURATION\n min: 's',\n h: 's',\n d: 's',\n month: 'd',\n year: 'd',\n //Specific Heat Capacity\n 'J/(kg*degK)': 'J/(kg*degC)',\n 'BTU/(lbm*degF)': 'J/(kg*degC)',\n 'BTU/(Kg*K)': 'J/(kg*degC)',\n //Thermal conductivity\n 'BTU/(h*ft*degF)': 'J/(s*m*degK)',\n 'W/(m*degK)': 'J/(s*m*degK)',\n 'W/(mK)': 'J/(s*m*degK)',\n // Temperature:\n K: 'C',\n // Temp grad:\n 'C/m': 'C/100m',\n 'F/ft': 'C/100m',\n 'K/m': 'C/100m',\n 'F/100ft': 'C/100m',\n 'K/100m': 'C/100m',\n // Pressure Per Temperature\n 'Bar/C': 'Pa/C',\n // Turbulent skin\n 's/m3': '1/m3/d',\n '1/MMSCFD': '1/m3/d',\n // Visosity:\n P: 'Pa*s',\n 'mPa*s': 'Pa*s',\n cP: 'Pa*s',\n // Intensity:\n 'hhp/in2': 'W/m2',\n 'hhp/ft2': 'W/m2',\n // Inflow Productivity Index:\n 'Sm3/d/bar': 'm3/s/bar',\n 'STB/d/psi': 'm3/s/bar',\n // Angle gradients:\n 'deg/100ft': 'deg/m',\n 'deg/30m': 'deg/m',\n 'deg/10m': 'deg/m',\n 'deg/ft': 'deg/m',\n 'rad/ft': 'deg/m',\n // Mole weight:\n 'lbf/mol': 'kg/mol',\n 'g/mol': 'kg/mol',\n // Thermal expansion\n '1/K': 'E-06/degC',\n 'E-09/bar': 'E-10/psi',\n 'E-14/pa': 'E-10/psi',\n '1/Pa': 'E-14/pa',\n // TORQUE\n kNm: 'Nm',\n ftlbf: 'Nm',\n // GIS Location Systems\n lk: 'm',\n ftCla: 'm',\n lkCla: 'm',\n ftSe: 'm',\n ydSe: 'm',\n chSe: 'm',\n 'chSe(T)': 'm',\n ftGC: 'm',\n ydInd: 'm',\n //Entalphy\n 'BTU/lbm': 'J/kg',\n});\n\n/**\n * List of all known units in application\n *\n * @readonly\n * @enum {string[]}\n */\nexport const KNOWN_UNITS = Object.freeze(Array.from(new Set(Object.values(ALT_UNITS).flat())));\n\nconst SPECIAL_NUMBERS = [NaN, -Infinity, Infinity];\nexport const SPECIAL_NUMBERS_STRING = SPECIAL_NUMBERS.map((number) => number.toString());\n\n/**\n * Description for the different quantites\n * @readonly\n */\nexport const QUANTITIES_DESCRIPTION = {\n density: 'Density',\n length: 'Length',\n duration: 'Duration',\n temperature: 'Temperature',\n tempgrad: 'Temperature Gradient',\n volume: 'Volume',\n weight: 'Weight',\n angles: 'Angles',\n depth: 'Depth',\n distance: 'Distances',\n height: 'Height',\n diameters: 'Diameters',\n doglegSeverity: 'Dogleg severity',\n fluidCompressibility: 'Fluid Compressibility',\n force: 'Force',\n gasVolume: 'Gas volume',\n oilVolume: 'Oil volume',\n moleWeight: 'Mole weight',\n linearCapacity: 'Linear Capacity',\n stress: 'Stress',\n thermalConductivity: 'Thermal conductivity',\n specificHeatCapacity: 'Specific heat capacity',\n thermalExpansionCoefficient: 'Thermal expansion coefficient',\n youngsModulus: 'Youngs Modulus',\n torque: 'Torque',\n areaOther: 'Area - Other',\n areaTubular: 'Area - Tubular',\n pumpRate: 'Pump Rate',\n pressure: 'Pressure',\n blowoutFlowRate: 'Flowrate (blowout)',\n percentage: 'Percentage',\n frequency: 'Frequency',\n torqueGradient: 'Torque gradient',\n pressureGradient: 'Pressure gradient',\n flowrate: 'Volumetric flow rate',\n massFlowRate: 'Mass flow rate',\n angleGradient: 'Angle gradient',\n weightGradient: 'Weight gradient',\n forceGradient: 'Force gradient',\n interfacialTension: 'Interfacial tension',\n acceleration: 'Acceleration',\n viscosity: 'Viscosity',\n power: 'Power',\n intensity: 'Power intensity',\n gasliftFlowRate: 'Flowrate (Gas lift)',\n productionFlowRate: 'Flowrate (production)',\n productionFlowRateOil: 'Flowrate for Oil (production)',\n productionFlowRateGas: 'Flowrate for Gas (production)',\n injectionFlowRate: 'Flowrate (injection)',\n blowoutOilFlowRate: 'Flowrate for Oil (blowout)',\n blowoutGasFlowRate: 'Flowrate for Gas (blowout)',\n gor: 'Gas Oil Ratio',\n rotationalSpeed: 'Rotational Speed',\n densityGas: 'Density for gas',\n inflowProductivityIndex: 'Inflow productivity index',\n latitude: 'Latitude',\n longitude: 'Longitude',\n permeability: 'Permeability',\n sdstats: 'Standard deviation',\n roughness: 'Material Roughness',\n wltubulars: 'Tubular weight',\n speed: 'Velocity',\n inverseStandSpeed: 'Inverse Stand velocity',\n rop: 'Rate of Penetration (ROP)',\n densityOil: 'Density for oil',\n densityOilGas: 'Density for oil/gas',\n kickToleranceVolume: 'Volume for kick tolerance',\n densitySolid: 'Density for solid',\n massPerLength: 'Mass Per Length',\n durationShort: 'Duration (TempSim short)',\n durationLong: 'Duration (TempSim long)',\n wearFactor: 'Wear factor',\n turbulentSkin: 'Turbulent skin',\n pressurePerTemperature: 'Pressure per temperature',\n location: 'Location coordinates length',\n mixingRequirements: 'Ratio between water and cement',\n Entalphy: 'Entalphy',\n shearStress: 'Shear Stress, force parallel to surface',\n volumeGradient: 'Rate of Volume change per unit',\n deg: 'Degree, a unit of angular measurement',\n dls: 'Dogleg Severity, measure of wellbore curvature changes per unit length',\n wgrad: 'Weight Gradient, change in weight per unit length',\n entalphy: 'Entalphy, total heat content of a system',\n pressurechange: 'Change in pressure over time or between two points',\n rpm: 'Rotations per minute, a measure of the frequency of rotation, specifying the number of full rotations completed in one minute around a fixed axis',\n sensorAccelerometer: 'Strength of gravitational acceleration',\n sensorMagnetometer: 'Strength of magnetic forces at a position',\n rotationalRate:\n 'Rotational rate, the speed at which an object rotates around a fixed axis, typically measured in degrees per unit of time',\n};\n\n/**\n * Description for the different units\n * @readonly\n */\nexport const UNITS_DESCRIPTION = {\n in: 'Inches',\n mm: 'Milimeters',\n cm: 'Centimeters',\n m: 'Meters',\n km: 'Kilometers',\n ft: 'Feets',\n usft: 'US Feets',\n in2: 'Square inches',\n cm2: 'Square centimeters',\n m2: 'Square meters',\n kg: 'Kilograms',\n tonnes: 'Tonnes',\n mt: 'Metric tonnes',\n kip: 'Kip',\n bbl: 'Barrels',\n Mm3: 'Mega cubic meters',\n MMSCF: 'Million Standard Cubic Feet',\n lbm: 'Pound mass',\n 'kg/mol': 'Kilograms per mole',\n 'lbf/mol': 'Pounds per mole',\n sg: 'Specific gravity',\n ppg: 'Pounds per gallon',\n 'kg/m3': 'Kilogram per cubic meters',\n 'lbm/ft3': 'Pounds per cubic foot',\n s: 'Seconds',\n min: 'Minutes',\n h: 'Hours',\n d: 'Days',\n month: 'Months',\n year: 'Years',\n 'bbl/ft': 'Barrels per foot',\n lpm: 'Litres per minute',\n bpm: 'Barrels per minute',\n 'm3/min': 'Cubic meters per minute',\n 'm3/s': 'Cubic meters per second',\n MMSCFD: 'Million Standard Cubic Feet per day',\n '1/MMSCFD': 'Inverse Million Standard Cubic Feet per day',\n bar: 'Bar',\n Pa: 'Pascals',\n kPa: 'Kilopascals',\n MPa: 'Megapascals',\n kPsi: 'Kilo pounds per square inch',\n 'kPa/m': 'Kilopascals per meter',\n 'psi/ft': 'Psi per foot',\n 'bar/100m': 'Bars per 100m',\n 'psi/100ft': 'Psi per 100ft',\n 'kPa/100m': 'Kilopascals per 100m',\n C: 'Degrees Celsius',\n F: 'Degrees Fahrenheit',\n K: 'Kelvins',\n 'C/100m': 'Degrees Celsius per 100m',\n 'F/100ft': 'Degrees Fahrenheit per 100m',\n 'K/100m': 'Kelvins per 100m',\n 'lbf/ft': 'Pound force / foot',\n 'Pa/C': 'Pascal per celsius',\n 'Bar/C': 'Bar per celsius',\n 'psi/F': 'Psi per fahrenheit',\n 'psi/C': 'Psi per celsius',\n N: 'Newtons',\n kN: 'Kilo Newtons',\n 'N/m': 'Newtons per meter',\n 'daN/m': 'Decanewtons per meter',\n lbf: 'Pound force',\n kgf: 'Kilogram force',\n rad: 'Radians',\n 'BTU/lbm': 'British Thermal Units per pound',\n ppf: 'Pound per foot',\n 'kg/m': 'Kilograms per meter',\n 'E-06/degC': 'Micro per degree Celsius',\n 'E-06/degF': 'Micro per degree Fahrenheit',\n km2: 'Square kilometers',\n ft2: 'Square feet',\n mm2: 'Square millimeters',\n mile2: 'Square miles',\n ft3: 'Cubic feet',\n 'g/cm3': 'Grams per cubic centimeter',\n Sm3: 'Standard cubic meter',\n 'ft3/s': 'Cubic feet per second',\n 'ft3/d': 'Cubic feet per day',\n 'm3/d': 'Cubic meter per day',\n '1/m3/d': 'Inverse Cubic meter per day',\n 's/m3': 'Seconds per cubic meters',\n 'bbl/d': 'Barrels per day',\n tonneForce: 'Tonne force',\n USGal: 'US gallon',\n 'g/mol': 'Grams per mol',\n Nm: 'Newton meter',\n kNm: 'Kilo Newton meter',\n ftlbf: 'Foot pound',\n 'J/(kg*degC)': 'Joules per kilogram degree Celsius',\n 'J/(kg*degK)': 'Joules per kilogram degree Kelwin',\n 'BTU/(lbm*degF)': 'British Thermal Unit per pound Fahrenheit',\n 'BTU/(h*ft*degF)': 'British Thermal Units per hour feet degree Fahrenheit',\n l: 'Litres',\n 'l/m': 'Litres per meter',\n 'kJ/kg': 'Kilo joules per kilogram',\n 'J/kg': 'Joules per kilogram',\n deg: 'Degrees',\n 'W/(mK)': 'Watts per milli Kelvin',\n psi: 'Pounds per square inch',\n '1/bar': '1/bar',\n '1/psi': '1/psi',\n 'deg/100ft': 'Degrees per 100ft',\n 'deg/10m': 'Degrees per 10m',\n 'deg/30m': 'Degrees per 30m',\n '%': 'Percent',\n Hz: 'Hertz',\n '1/s': 'Inverse second',\n rpm: 'Revolutions per minute',\n 'Pa/m': 'Pascal per meter',\n 'bar/m': 'Bar per meter',\n gpm: 'Gallons per minute',\n 'kg/s': 'Kilograms per second',\n 'lbm/s': 'Pound mass per second',\n 'tonnes/h': 'Tonnes per hour',\n 'tons/h': 'Tons per hour',\n 'deg/m': 'Degrees per meter',\n 'deg/ft': 'Degrees per foot',\n 'rad/m': 'Radians per meter',\n 'rad/ft': 'Radians per foot',\n 'dyn/cm': 'Dyn per centimeter',\n 'mN/m': 'Millinewtons per meter',\n '1/kPa': '1/kPa',\n m3: 'Cubic meters',\n 'm/s': 'Meters per second',\n 'ft/s': 'Feet per second',\n 'm/min': 'Meters per minute',\n 'ft/min': 'Feet per min',\n 'm/h': 'Meters per hour',\n 'ft/h': 'Feet per hour',\n mph: 'Miles per hour',\n 'km/h': 'Kilometers per hour',\n 'm/s2': 'Meters per second squared',\n 'ft/s2': 'Feet per second squared',\n 'Pa*s': 'Pascal seconds',\n P: 'Poise (dyne second per square centimeter)',\n 'mPa*s': 'Millipascal seconds',\n cP: 'Centi Poise',\n W: 'Watts',\n hhp: 'Hydraulic horsepower',\n hp: 'Horsepower',\n kW: 'Kilowatts',\n MW: 'Megawatts',\n 'BTU/h': 'British Thermal Units per hour',\n 'hhp/in2': 'Hydraulic horsepower per square inch',\n 'hhp/ft2': 'Hydraulic horsepower per square feet',\n 'Mm3/d': 'Mega cubic meters per day',\n 'STB/d': 'Stock Tank Barrel per day',\n 'Sm3/d': 'Standard cubic meters per day',\n 'Sm3/min': 'Standard cubic meters per minute',\n 'MSm3/d': 'Mega standard cubic meters per day',\n 'SCF/STB': 'Standard Cubic Feet per Stock Tank Barrel',\n 'Sm3/Sm3': 'Standard cubic meters per Standard cubic meter',\n 'SCF/d': 'Standard cubic feet per day',\n STB: 'Stock Tank Barrel',\n SCF: 'Standard Cubic Feet',\n Gsg: 'Gas - specific gravity',\n Gppg: 'Gas - pounds per gallon',\n 'Gkg/m3': 'Gas - kilogram per cubic meters',\n 'Glbm/ft3': 'Gas - pounds per cubic foot',\n MSm3: 'Mega standard cubic meters',\n 'm3/s/bar': 'Cubic per second per bar',\n 'Sm3/d/bar': 'Standard cubic per day per bar',\n 'STB/d/psi': 'Standard barrels per day per psi',\n klbf: 'kilopound force',\n '1/Pa': '1/Pascal',\n '1/MPa': '1/MPa',\n ksi: 'Kilopound per square inch',\n 'lbf/100ft2': 'Pounds per 100 square foot',\n 'lb/ft3': 'lb/ft3',\n '°N': '°N (latitude)',\n '°S': '°S (latitude)',\n '°W': '°W (longitude)',\n '°E': '°E (longitude)',\n fr: 'Fraction',\n mD: 'Millidarcy',\n Sigma: 'Sigma',\n CI: 'Confidence Interval',\n 'J/(s*m*degK)': 'Joules per second meter Kelvin',\n 'C/m': 'Degrees Celsius per meter',\n 'F/ft': 'Degrees Fahrenheit per meter',\n 'K/m': 'Kelvin per meter',\n microM: 'Micro meter',\n 'W/m2': 'Watt per square meter',\n '1/K': 'Inverse Kelvin',\n 'lb/ft': 'Pound Per Feet',\n 'E-09/bar': 'Nano per bar',\n 'E-10/psi': '10⁻¹⁰ per psi',\n 'E-14/pa': '10⁻¹⁴ per pascal',\n lk: 'Link',\n ftCla: 'Clark`s foot',\n lkCla: 'Clark`s link',\n ftSe: 'British foot (Sears 1922)',\n ydSe: 'British yard (Sears 1922)',\n chSe: 'British chain (Sears 1922)',\n 'chSe(T)': 'British chain (Sears 1922 Truncated)',\n ftGC: 'Gold Coast foot',\n ydInd: 'Indian yard',\n 'd/stand': 'Day per stand',\n 'h/stand': 'Hour per stand',\n 'min/stand': 'Minute per stand',\n 's/stand': 'Second per stand',\n 'm3/t': 'Cubic meter per ton',\n 'L/100kg': 'Liter per 100kg',\n GPa: 'Gigapascals, unit of pressure',\n 'cm3/m': 'Cubic cm per meter',\n 'in3/ft': 'Cubic inches per foot',\n 'ft3/ft': 'Cubic feet per foot',\n 'm3/m': 'Cubic meters per meter',\n 'mm3/m': 'Cubic millimeters per meter',\n '1/GPa': 'Inverse gigapascal',\n lps: 'Liters per second',\n nT: 'nanoTesla',\n Gs: 'Gauss',\n g: 'g force',\n 'deg/h': 'Degrees per hour',\n};\n","import { ALT_UNITS, LABELS, UNIT_FROM_KEY } from './constants.ts';\nimport type { AltUnitWithLabel } from './types.ts';\n\n/** Returns the units configured for a quantity key. */\nexport function showAltUnitsList(quantityKey: string): string[] | undefined {\n return ALT_UNITS[quantityKey];\n}\n\n/** Returns the units configured for a quantity. */\nexport function getUnitsForQuantity(quantity: string): string[] | undefined {\n return showAltUnitsList(quantity);\n}\n\n/** Returns all configured quantity keys. */\nexport function getQuantities(): string[] | undefined {\n return Object.keys(ALT_UNITS);\n}\n\n/** Returns the display label for a unit key. */\nexport function label(unitKey: string): string | undefined {\n return LABELS[unitKey];\n}\n\n/** Returns the base unit configured for a quantity. */\nexport function unitFromKey(quantity: string): string | undefined {\n return UNIT_FROM_KEY[quantity];\n}\n\n/** Alias for `unitFromKey`. */\nexport function unitFromQuantity(quantity: string): string | undefined {\n return unitFromKey(quantity);\n}\n\n/** Returns the alternative units and their display labels for a quantity. */\nexport function getAltUnitsListByQuantity(quantity: string): AltUnitWithLabel[] | undefined {\n const quantityUnitList = showAltUnitsList(quantity);\n return quantityUnitList ? quantityUnitList.map((unit) => ({ unit, label: label(unit) })) : undefined;\n}\n","/** Basic trimming of numeric input strings. */\nexport const trim = (value: string): string => {\n return value.trim().replace(/[\\t\\r\\n]/g, '');\n};\n\n/** Counts occurrences of a character in a string. */\nexport function charCount(character: string | number, value: string): number {\n const singleCharacter = String(character)[0];\n let total = 0;\n let lastLocation = value.indexOf(singleCharacter, 0) + 1;\n while (lastLocation > 0) {\n lastLocation = value.indexOf(singleCharacter, lastLocation) + 1;\n total += 1;\n }\n return total;\n}\n\n/** Normalizes supported decimal and thousands separators in a numeric input string. */\nexport function cleanNumStr(value: string | number): string {\n let cleanString = trim(String(value));\n const slashCount = charCount('/', cleanString);\n const spaceCount = charCount(' ', cleanString) + charCount(' ', cleanString);\n let dotCount = charCount('.', cleanString);\n let commaCount = charCount(',', cleanString);\n if (slashCount === 0 && spaceCount > 0) {\n cleanString = cleanString.replace(/\\s/g, '');\n }\n if (commaCount > 1) {\n cleanString = cleanString.replace(/,/g, '');\n }\n if (dotCount > 1) {\n cleanString = cleanString.replace(/\\./g, '');\n }\n commaCount = charCount(',', cleanString);\n dotCount = charCount('.', cleanString);\n if (dotCount === 1 && commaCount === 1) {\n if (cleanString.indexOf(',') > cleanString.indexOf('.')) {\n cleanString = cleanString.replace('.', '');\n cleanString = cleanString.replace(',', '.');\n } else {\n cleanString = cleanString.replace(',', '');\n }\n if (cleanString.indexOf('.') === 0) {\n cleanString = `0${cleanString}`;\n }\n return cleanString;\n }\n\n if (!dotCount && commaCount) {\n cleanString = cleanString.replace(',', '.');\n }\n if (cleanString.indexOf('.') === 0) {\n cleanString = `0${cleanString}`;\n }\n return cleanString;\n}\n\n/** Removes redundant leading zeros while preserving the sign and fractional part. */\nexport const stripLeadingZeros = (value: string): string => {\n const isMinus = value?.[0] === '-';\n const matchMinus = /^-/gm;\n const matchLeadingZeros = /^(?:0+(?=[1-9])|0+(?=0))/gm;\n const cleanedValue = value.replace(matchMinus, '').replace(matchLeadingZeros, '');\n return isMinus ? `-${cleanedValue}` : cleanedValue;\n};\n\n/** Normalizes a numeric input string and parses it as a number. */\nexport function cleanNum(value: string | number): number {\n if (typeof value === 'number') {\n return value;\n }\n return parseFloat(cleanNumStr(value));\n}\n\nexport const isNull = (value: unknown): boolean => {\n return value === null;\n};\nexport const isUndefined = (value: unknown): boolean => {\n return value === undefined;\n};\nexport const isArray = (value: unknown): boolean => {\n return Boolean(value) && (value as { constructor: unknown }).constructor === Array;\n};\nexport const isObject = (value: unknown): boolean => {\n return Boolean(value) && (value as { constructor: unknown }).constructor === Object;\n};\nexport const isEmptyString = (value: unknown): boolean => {\n return value === '';\n};\nexport const isTrailingPeriodSeparator = (value: unknown): boolean => {\n return Boolean(value) && String(value)[String(value).length - 1] === '.';\n};\nexport const isTrailingCommaSeparator = (value: unknown): boolean => {\n return Boolean(value) && String(value)[String(value).length - 1] === ',';\n};\n","import { KNOWN_UNITS, LABELS, SPECIAL_NUMBERS_STRING } from './constants.ts';\nimport { charCount, cleanNumStr } from '../numbers/parsing/number-input.ts';\n\nexport const SEPARATOR = '|';\n\nconst UNIT_RE = /^(-?[0-9., /]*?(?:e[-+]?[0-9]+)?)([^0-9-., /].*)?$/;\n\n/** Checks whether a unit string has an empty numeric part, for example `|m`. */\nexport function isEmptyValueWithUnit(value: string | number): boolean {\n return typeof value === 'string' && value.length > 0 && value.startsWith('|');\n}\n\n/** Splits a supported unit string into its numeric and unit parts. */\nexport function split(valueWithUnit: string): string[] {\n let match;\n let normalizedValue = valueWithUnit !== undefined && valueWithUnit !== null ? String(valueWithUnit) : '';\n if (charCount(SEPARATOR, normalizedValue) > 1) {\n match = normalizedValue.split(SEPARATOR);\n normalizedValue = match.slice(0, -1).join('') + SEPARATOR + match.slice(-1);\n }\n if (normalizedValue.indexOf(SEPARATOR) >= 0) {\n match = normalizedValue.split(SEPARATOR);\n } else if (SPECIAL_NUMBERS_STRING.includes(normalizedValue)) {\n match = [normalizedValue, ''];\n } else {\n match = cleanNumStr(normalizedValue).match(UNIT_RE);\n if (match) {\n match = match.slice(1);\n }\n }\n if (!match) {\n match = ['0', ''];\n }\n if (match[1] == null) {\n match[1] = '';\n }\n return [match[0], match[1]];\n}\n\n/** Returns the numeric part of a unit string. */\nexport function getValue(valueWithUnit: string): string {\n return split(valueWithUnit)[0];\n}\n\n/** Returns the unit part of a unit string. */\nexport function getUnit(valueWithUnit: string): string {\n return split(valueWithUnit)[1];\n}\n\n/** Checks whether a value contains exactly one known unit suffix. */\nexport function isValueWithUnit(value: string | number): boolean {\n if (!value) {\n return false;\n }\n const parts = String(value).split(SEPARATOR);\n return parts.length === 2 && KNOWN_UNITS.includes(parts[1]);\n}\n\n/** Joins a value and unit using the package unit separator. */\nexport function withUnit(value: string | number | null | undefined, unit: string | null, defaultValue = ''): string {\n if (value === null || value === '' || value === undefined) {\n value = defaultValue;\n }\n if (unit === null) {\n return String(value);\n }\n let [normalizedValue, normalizedUnit] = String(value).includes(SEPARATOR) ? split(String(value)) : [value, unit];\n if (!normalizedUnit) {\n normalizedUnit = unit;\n }\n return [normalizedValue, normalizedUnit].join(SEPARATOR);\n}\n\n/** Replaces a unit key in a unit string with its display label. */\nexport function withPrettyUnitLabel(valueWithUnits: string): string {\n const [value, unit] = split(valueWithUnits);\n const prettyUnit = LABELS[unit] ?? '';\n return `${value} ${prettyUnit}`;\n}\n","import Fraction from 'fraction.js';\n\nconst normalizeFractionWhitespace = (value: string): string => {\n return value.trim().replace(/\\s+/g, ' ');\n};\n\n/** Checks whether a string can be parsed as a fraction by fraction.js. */\nexport const isFraction = (value: unknown): boolean => {\n if (typeof value !== 'string' || !value.includes('/')) {\n return false;\n }\n\n try {\n new Fraction(normalizeFractionWhitespace(value));\n return true;\n } catch (error) {\n return (error as Error).message === 'Division by Zero';\n }\n};\n\n/** Converts a fraction to its decimal value, or returns `NaN` when it cannot be parsed. */\nexport function fraction(value: any): number | typeof Infinity | typeof NaN {\n if (value instanceof Array || value === null || value === undefined) {\n return NaN;\n }\n if (typeof value === 'string') {\n value = normalizeFractionWhitespace(value);\n }\n if (value === '') {\n return NaN;\n }\n\n let result = NaN;\n let infinite = false;\n try {\n const fractionObject = new Fraction(value);\n if (fractionObject !== undefined) {\n result = fractionObject.valueOf();\n }\n } catch (error) {\n if (error instanceof Error && error.message === 'Division by Zero') {\n infinite = true;\n }\n }\n return infinite ? Infinity : result;\n}\n\n/** Converts a decimal value to a fractional string. */\nexport function asFraction(value: number | string): string {\n if (typeof value === 'string') {\n value = normalizeFractionWhitespace(value);\n }\n if (value === '') {\n value = '0';\n }\n return new Fraction(value as any).toFraction(true);\n}\n\n/**\n * Converts a fraction string to a number.\n *\n * For compatibility, invalid inputs are returned unchanged and division by zero returns signed infinity.\n */\nexport function numFraction(value: any): any {\n if (\n value instanceof Array ||\n value === null ||\n value === undefined ||\n value === '' ||\n value === Infinity ||\n value === -Infinity ||\n value === 'Infinity' ||\n value === '-Infinity' ||\n Number.isNaN(value) ||\n value === 'NaN'\n ) {\n return value;\n }\n if (typeof value === 'string') {\n value = normalizeFractionWhitespace(value);\n }\n\n let result = value;\n try {\n const fractionObject = new Fraction(value);\n if (fractionObject !== undefined) {\n result = fractionObject.valueOf();\n }\n } catch (error) {\n if ((error as Error).message === 'Division by Zero') {\n const minus = value.charAt(0) === '-';\n return minus ? -Infinity : Infinity;\n }\n console.warn('Error in numFraction() method: ', value);\n }\n return result.valueOf();\n}\n","import { isValueWithUnit, split } from '../../units/unit-string.ts';\n\nexport const EXP_NOTATION_RE = /^[-+]?[0-9]*\\.?[0-9]+(?:\\/[0-9]*\\.?[0-9]+)?(?:[eE][-+]?[0-9]+)?$/;\n\n/** Normalizes whitespace and mantissa syntax in a scientific-notation string. */\nexport const normalizeExponent = (input: string): string => {\n return input.replace(\n /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))[ ]*[eE][ ]*([+-]?[ ]*\\d+)/,\n (_match, mantissa: string, exponent: string) => {\n let normalizedMantissa = mantissa.endsWith('.') ? mantissa.slice(0, -1) : mantissa;\n if (normalizedMantissa.startsWith('.')) {\n normalizedMantissa = `0${normalizedMantissa}`;\n }\n const normalizedExponent = exponent.replace(/[ ]+/g, '');\n return `${normalizedMantissa}e${normalizedExponent}`;\n },\n );\n};\n\n/** Normalizes scientific notation while preserving an optional unit suffix. */\nexport function normalizeScientific(value: string | number): string | number {\n if (typeof value !== 'string') {\n return value;\n }\n\n const normalizedSpaces = value.replace(/\\u00A0|\\u2007|\\u202F/g, ' ').trim();\n if (isValueWithUnit(normalizedSpaces)) {\n const [number, unit] = split(normalizedSpaces);\n return `${normalizeExponent(number.trim())}|${unit.trim()}`;\n }\n\n const match = normalizedSpaces.match(/^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)\\s*[eE]\\s*[+-]?\\s*\\d+)\\s+(.+)$/);\n if (match) {\n return `${normalizeExponent(match[1])}|${match[2].trim()}`;\n }\n\n return normalizeExponent(normalizedSpaces);\n}\n","import { isFraction } from './fractions/fractions.ts';\nimport { EXP_NOTATION_RE } from './scientific-notation/scientific-notation.ts';\n\n/** Checks whether a value is supported as a finite numeric or fraction input. */\nexport function isNumeric(value: unknown): boolean {\n if (\n value === undefined ||\n value === null ||\n Array.isArray(value) ||\n typeof value === 'object' ||\n Number.isNaN(value) ||\n value === 'NaN' ||\n value === Infinity ||\n value === -Infinity ||\n value === 'Infinity' ||\n value === '-Infinity'\n ) {\n return false;\n }\n if (isFraction(value)) {\n return true;\n }\n const parsed = parseFloat(value as unknown as string);\n return typeof value === 'string'\n ? !isNaN(parsed) && (EXP_NOTATION_RE.test(value) || isFinite(value as unknown as number))\n : isFinite(value as unknown as number);\n}\n\nexport const isNonNumerical = (value: any): boolean => {\n return !isNumeric(value);\n};\n\nexport const isPercentage = (value: string | number): boolean => {\n return typeof value === 'string' && /^\\d+(\\.\\d+)?%$/.test(value);\n};\n\nexport function allNumbers(values: (number | string)[]): boolean {\n return !values.some((value) => typeof value !== 'number');\n}\n","import { getUnit, getValue, isValueWithUnit, withUnit } from '../../units/unit-string.ts';\nimport { toNum, toString } from '../numbers.ts';\nimport { cleanNumStr } from './number-input.ts';\n\nexport const countTrailingZeros = (value: number | string, decimalPartOnly = false) => {\n /*\n See unit test and\n - https://regex101.com/r/89tGjt/1\n - https://regex101.com/r/55lEWZ/1\n Matches trailing zeros followed by |, e, E or end of string\n */\n const condition = decimalPartOnly ? /0+((?=[|eE])|$)/ : /(0+|0+\\.0+)((?=[|eE])|$)/;\n if (typeof value === 'string' && (decimalPartOnly ? value.includes('.') || value.includes(',') : true)) {\n return value?.match(condition)?.[0]?.replaceAll(/[.,]/g, '')?.length ?? 0;\n }\n return 0;\n};\n\nexport const hasTrailingZeros = (value: number | string) => {\n return countTrailingZeros(value) > 0;\n};\n\n/**\n * Internal function to parse the value, unit, and type from a generic numeric input\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @param value\n * @returns object with number, unit, and type\n */\nexport const parseNumber = (\n value: number | string,\n preserveTrailingZeros = false,\n): { number: any; unit: string | null; isString: boolean } => {\n const isString = typeof value === 'string';\n const hasUnit = isString && isValueWithUnit(value);\n const unit = hasUnit ? getUnit(value) : null;\n const cleaned = cleanNumStr(hasUnit ? getValue(value) : value);\n const number = preserveTrailingZeros && hasTrailingZeros(value) ? cleaned : toNum(cleaned);\n return {\n number,\n unit,\n isString,\n };\n};\n\n/**\n * Convert a number to a string safely, better than String(value)\n * String(0.0000002) returns '2e-7' which is unwanted if we need to preserve formatting\n *\n * @param value\n * @param [isScientific] whether to preserve scientific notation\n * @returns number or string output value\n */\nconst safeStringifyNumber = (value: number | string, isScientific?: boolean): string => {\n /*\n Note that String(0.0000002) -> '2e-7' in JavaScript, so we need to use a safe conversion function instead\n We could improve how the scientific notation inputs are handed too, but that's a minor breaking change to the\n current unit tests, so let's consider it separately in OW-17645\n */\n return isScientific\n ? String(value) // up for debate if we should use formatScientificDisplayNumber here ...\n : toString(value);\n};\n\n/**\n * Internal function to unParse a value, unit, and type back to an output value\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @param args\n * @param args.value\n * @param args.unit\n * @param args.isString\n * @param args.isScientific\n * @returns number or string output value\n */\nexport const unParseNumber = ({\n value,\n unit,\n isString,\n isScientific,\n}: {\n value: number | string;\n unit?: string | null;\n isString?: boolean;\n isScientific?: boolean;\n}): number | string => {\n const convertedValue = typeof value === 'number' && isString ? safeStringifyNumber(value, isScientific) : value;\n if (unit) {\n return withUnit(convertedValue, unit);\n }\n return convertedValue;\n};\n","import { convertAndGetValue } from '../../units/conversion.ts';\nimport { isValueWithUnit } from '../../units/unit-string.ts';\nimport { isValidNum, toNum } from '../numbers.ts';\nimport { parseNumber } from '../parsing/parse-number.ts';\nimport { isNumeric, isPercentage } from '../predicates.ts';\n\nexport const DEFAULT_MAX_RELATIVE_DIFF = Number.EPSILON;\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\ntype XOR<T, U> = T | U extends Record<string, unknown> ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;\n\ntype toleranceType = XOR<{ relativeDiff: number | string }, { absoluteDiff: string | number }>;\n\nconst convertNumbers = (\n firstValue: number | string,\n secondValue: number | string,\n): { firstNumber: number | string; secondNumber: number | string } => {\n const { number: firstNumber, unit: firstUnit } = parseNumber(firstValue);\n const { number: secondNumber, unit: secondUnit } = parseNumber(secondValue);\n const differentUnits = firstUnit && secondUnit && firstUnit !== secondUnit;\n const convertedSecondNumber = differentUnits ? convertAndGetValue(secondNumber, firstUnit, secondUnit) : secondNumber;\n return {\n firstNumber,\n secondNumber: convertedSecondNumber,\n };\n};\n\nconst getToleranceNumber = (relativeDiff: string | number): number | null => {\n if (relativeDiff !== null && relativeDiff !== undefined) {\n if (isNumeric(relativeDiff) && typeof relativeDiff === 'number') {\n return relativeDiff;\n }\n if (isPercentage(relativeDiff)) {\n const percentageValue = toNum(relativeDiff?.toString().replace('%', ''));\n if (isNumeric(percentageValue)) {\n return percentageValue / 100;\n }\n }\n }\n\n return null;\n};\n\n/**\n * Determines whether two numbers are close in value with a tolerance\n * (mitigates excess JavaScript floating point precision quirks)\n */\nexport const isCloseTo = (\n firstValue: number | string | null,\n secondValue: number | string | null,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n const { relativeDiff, absoluteDiff } = options;\n const diff = relativeDiff ?? absoluteDiff;\n const toleranceNumber = getToleranceNumber(diff);\n\n if (firstValue === null || secondValue === null) {\n return false;\n }\n\n const hasUnitFirstValue = isValueWithUnit(firstValue);\n const hasUnitSecondValue = isValueWithUnit(secondValue);\n\n if ((hasUnitFirstValue && !hasUnitSecondValue) || (!hasUnitFirstValue && hasUnitSecondValue)) {\n throw new Error(\n `Parameters must either both have units or both not have units. Received \"${firstValue}\" and \"${secondValue}\"`,\n );\n }\n\n if (toleranceNumber === null) {\n console.warn('Tolerance number is not defined!');\n return firstValue === secondValue;\n }\n\n if (toleranceNumber <= 0 || toleranceNumber < Number.EPSILON) {\n throw Error('Unpredictable results - toleranceNumber should be bigger than zero or less then EPSILON');\n }\n const { firstNumber, secondNumber } = convertNumbers(firstValue, secondValue);\n if (\n ((firstNumber === Infinity || firstNumber === 'Infinity') &&\n (secondNumber === Infinity || secondNumber === 'Infinity')) ||\n ((firstNumber === -Infinity || firstNumber === '-Infinity') &&\n (secondNumber === -Infinity || secondNumber === '-Infinity'))\n ) {\n return true;\n }\n if (typeof firstNumber === 'number' && typeof secondNumber === 'number') {\n //1. we know they are equals\n if (firstNumber === secondNumber) {\n return true;\n }\n\n if (absoluteDiff || firstNumber === 0 || secondNumber === 0) {\n //2. checks whether they are close enough absolutely\n const diff = Math.abs(firstNumber - secondNumber);\n return isCloseTo(diff, toleranceNumber, { relativeDiff: '1%' }) || diff < toleranceNumber;\n } else {\n //3. relative checks whether they are close enough relatively\n return 2 * Math.abs((firstNumber - secondNumber) / (firstNumber + secondNumber)) < toleranceNumber;\n }\n }\n\n return false;\n};\n\n/**\n * Determines whether two numbers are close enough to be equal\n * or checks the firstValue is greater than the secondValue\n */\nexport const isCloseToOrGreaterThan = (\n firstValue: number | string | null,\n secondValue: number | string | null,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n if (firstValue === null || secondValue === null) {\n return false;\n }\n const { firstNumber, secondNumber } = convertNumbers(firstValue, secondValue);\n if (typeof firstNumber === 'number' && typeof secondNumber === 'number') {\n return isCloseTo(firstNumber, secondNumber, options) || firstNumber > secondNumber;\n }\n\n return false;\n};\n\n/**\n * Determines whether two numbers are close enough to be equal\n * or checks the firstValue is less than the secondValue\n */\nexport const isCloseToOrLessThan = (\n firstValue: number | string | null,\n secondValue: number | string | null,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n if (firstValue === null || secondValue === null) {\n return false;\n }\n const { firstNumber, secondNumber } = convertNumbers(firstValue, secondValue);\n if (typeof firstNumber === 'number' && typeof secondNumber === 'number') {\n return isCloseTo(firstNumber, secondNumber, options) || firstNumber < secondNumber;\n }\n\n return false;\n};\n\n/**\n * Determines whether two objects or arrays are deeply close equal (all nested child numbers)\n */\nexport const isDeepCloseTo = (\n a: any,\n b: any,\n options: toleranceType = { relativeDiff: DEFAULT_MAX_RELATIVE_DIFF },\n): boolean => {\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((a, i) => isDeepCloseTo(a, b[i], options));\n }\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every((key) => isDeepCloseTo(a[key], b[key], options));\n }\n if ((Number.isNaN(a) && Number.isNaN(b)) || (a === '' && b === '')) {\n return true;\n }\n if (\n (typeof a === 'number' && typeof b === 'number') ||\n (isValueWithUnit(a) && isValueWithUnit(b)) ||\n (isValidNum(a) && isValidNum(b))\n ) {\n return isCloseTo(a, b, options);\n }\n /*\n Generic strings and non-numerical properties should pass (loose checking)\n This function only compares numerical properties\n */\n return true;\n};\n","import { isCloseToOrLessThan } from '../comparison/comparison.ts';\nimport { formatDecimal } from '../format/display-number.ts';\nimport { isScientificStringNum, toNum } from '../numbers.ts';\nimport { parseNumber, unParseNumber } from '../parsing/parse-number.ts';\nimport { isNumeric } from '../predicates.ts';\n\nconst DEFAULT_SIGNIFICANT_DIGITS = 4;\n\n/**\n * Rounds a number to N decimal places.\n *\n * @private (see round() for the public interface)\n * @param value\n * @param [n]\n * @returns rounded number\n */\nexport const roundNumber = (value: number, n = DEFAULT_SIGNIFICANT_DIGITS): number => {\n const factor = 10 ** n;\n return Math.round(value * factor) / factor;\n};\n\n/**\n * Rounds a numeric value to N decimal places.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param [n] - the number of decimal places to round to\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * round(3.14159265) -> 3.1416\n */\nexport const round = <Value extends number | string | null | undefined>(\n value: Value,\n n = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumber(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.')) ? value : roundNumber(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a number to N significant digits.\n *\n * @private (see roundToPrecision() for the public interface)\n * @param value\n * @param [n] number of significant digits\n * @returns rounded number\n */\nexport const roundNumberToPrecision = (value: number, n: number = DEFAULT_SIGNIFICANT_DIGITS): number => {\n return Number(value.toPrecision(n));\n};\n\n/**\n * Rounds a number to N significant digits, preserving trailing decimal zeros\n *\n * @private (see roundByMagnitudeToFixed() for the public interface)\n * @param value\n * @param [n] number of significant digits\n * @returns rounded number as string\n */\nexport const roundNumberToFixedPrecision = (value: number, n: number = DEFAULT_SIGNIFICANT_DIGITS): string => {\n const roundedValue = toNum(value).toPrecision(n);\n const [integerPart, decimalPart] = roundedValue.split('.');\n if (decimalPart) {\n const decimalDigits = n - integerPart.length;\n return `${integerPart}.${decimalPart.padEnd(decimalDigits, '0')}`;\n } else {\n return integerPart;\n }\n};\n\n/**\n * Rounds a number to N significant digits, excluding the integer part (only rounds decimal part)\n *\n * @private (see roundToPrecision() for the public interface)\n * @param value\n * @param [n] number of significant digits\n * @returns rounded number\n */\nexport const roundNumberToDecimalPrecision = (value: number, n: number = DEFAULT_SIGNIFICANT_DIGITS): number => {\n if (Math.abs(value) > 1) {\n const [integerPart, decimalPart] = formatDecimal(value, '').split('.');\n if (!decimalPart) {\n return value;\n } else {\n const roundedDecimalPart = Number(`0.${decimalPart}`).toPrecision(n).slice(1);\n return Number(integerPart + roundedDecimalPart);\n }\n }\n return roundNumberToPrecision(value, n);\n};\n\n/**\n * Rounds a numeric value to N significant digits.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n * - similar to Number.toPrecision() but safer\n * - does *not* append trailing zeros (unlike `Number(4).toPrecision(4)` -> '4.000')\n *\n * @param value - the value to round\n * @param [n] - the number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * roundToPrecision(0.0000456789) -> 0.00004568\n */\nexport const roundToPrecision = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberToPrecision(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberToPrecision(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a numeric value to N significant digits (only the decimal part)\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n * - unlike roundToPrecision(), acts only on the decimal part, not the integer part too\n *\n * @param value - the value to round\n * @param [n]- the number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * roundToPrecision(1234.0000456789) -> 1234.00004568\n */\nexport const roundToDecimalPrecision = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberToDecimalPrecision(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberToDecimalPrecision(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a number to an appropriate number of digits, based on its size.\n *\n * @private (see roundByMagnitude() for the public interface)\n * @param value\n * @param [n] the number of significant digits\n * @param [toFixed] to fixed digits (i.e. with trailing zeros)\n * @returns rounded number\n */\nexport const roundNumberByMagnitude = (\n value: number,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n toFixed = false,\n): number | string => {\n const noDecimalsAbove = 10 ** n;\n const result =\n noDecimalsAbove && value > noDecimalsAbove\n ? roundNumber(value, 0)\n : toFixed\n ? roundNumberToFixedPrecision(value, n)\n : //for comparison, old implementation from toPretty (functionally equivalent to new implementation, see tests)\n //return Number(value.toExponential(n - 1).toString());\n roundNumberToPrecision(value, n);\n return toFixed ? String(result) : result;\n};\n\n/**\n * Rounds a numeric value to an appropriate number of digits, based on its size. It rounds to N significant digits,\n * but never rounds the integer part.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param [n] - the number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n * @example\n * roundByMagnitude(0.000123456789) -> 0.0001235\n * roundByMagnitude(1.123456789) -> 1.123\n * roundByMagnitude(19999.123456789) -> 19999\n */\nexport const roundByMagnitude = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberByMagnitude(value, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberByMagnitude(number, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a numeric value to an appropriate number of digits, based on its size. It rounds to N significant digits,\n * but never rounds the integer part. Similar to roundByMagnitude, but adds trailing zeros.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns string type (or original value and type when not possible to convert)\n *\n * @param value - the value to round\n * @param [n] - the number of significant digits\n * @returns rounded value as a string, or input value when unable to round\n *\n * @example\n * roundByMagnitudeToFixed(0.000120016789) -> 0.0001200\n */\nexport const roundByMagnitudeToFixed = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n const toFixed = true;\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberByMagnitude(value, n, toFixed) as Value;\n }\n const { number, unit } = parseNumber(value, true);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberByMagnitude(number, n, toFixed);\n return unParseNumber({\n value: result,\n unit,\n isString: true,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a number to an appropriate number of digits, based on its size in relation to a range.\n *\n * @private (see roundByMagnitude() for the public interface)\n * @param value\n * @param min\n * @param max\n * @param [n] the minimum number of significant digits\n * @returns rounded number\n */\nexport const roundNumberByRange = (value: number, min: number, max: number, n = DEFAULT_SIGNIFICANT_DIGITS): number => {\n if (isCloseToOrLessThan(max, min)) {\n return value;\n }\n const range = max - min;\n const scale = Math.floor(Math.log10(range));\n const precision = Math.max(n, 0 - scale);\n return roundNumber(value, precision);\n};\n\n/**\n * Rounds a numeric value to an appropriate number of digits, based on its size within a range of values.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param min - the min value in the range\n * @param max - the max value in the range\n * @param [n] - the minimum number of significant digits\n * @returns rounded value, or input value when unable to round\n *\n */\nexport const roundByRange = <Value extends number | string | null | undefined>(\n value: Value,\n min: number,\n max: number,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (typeof value === 'number') {\n //need minimal overhead (performance / speed) if input is already number type\n return roundNumberByRange(value, min, max, n) as Value;\n }\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result =\n !isNumeric(number) || (typeof number === 'string' && number.endsWith('.'))\n ? value\n : roundNumberByRange(number, min, max, n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n\n/**\n * Rounds a numeric value to N fixed decimal digits.\n *\n * - accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n * - returns same type as input\n *\n * @param value - the value to round\n * @param [n] - the number of fixed decimal digits\n * @returns rounded value, or input value when unable to round\n *\n */\nexport const roundToFixed = <Value extends number | string | null | undefined>(\n value: Value,\n n: number = DEFAULT_SIGNIFICANT_DIGITS,\n): Value => {\n if (value === null || Number.isNaN(value) || value === Infinity || value === -Infinity || value === undefined) {\n return value as Value;\n }\n if (typeof value === 'number') {\n return value.toFixed(n) as Value;\n }\n const { number, unit, isString } = parseNumber(value);\n const result = !isNumeric(number) || (typeof number === 'string' && number.endsWith('.')) ? value : number.toFixed(n);\n return unParseNumber({\n value: result,\n unit,\n isString,\n isScientific: isScientificStringNum(value),\n }) as Value;\n};\n","import { LABELS } from '../../units/constants.ts';\nimport { round } from '../rounding/rounding.ts';\nimport { isValidNum, toNum } from '../numbers.ts';\nimport { countTrailingZeros, parseNumber } from '../parsing/parse-number.ts';\nimport { trim } from '../parsing/number-input.ts';\n\nconst DEFAULT_AUTO_SCIENTIFIC_BELOW = 1e-4;\nconst DEFAULT_AUTO_SCIENTIFIC_ABOVE = 1e7;\nconst NUMBER_FORMAT_OPTIONS = { maximumFractionDigits: 20 };\n\nconst formatEnglishNumber = (value: number): string => {\n let numberFormat: Intl.NumberFormat;\n try {\n numberFormat = new Intl.NumberFormat('en-US', NUMBER_FORMAT_OPTIONS);\n } catch {\n numberFormat = new Intl.NumberFormat(undefined, NUMBER_FORMAT_OPTIONS);\n }\n return numberFormat.format(value);\n};\n\nconst superscriptSymbols: Record<string, string> = {\n '0': '⁰',\n '1': '¹',\n '2': '²',\n '3': '³',\n '4': '⁴',\n '5': '⁵',\n '6': '⁶',\n '7': '⁷',\n '8': '⁸',\n '9': '⁹',\n '+': '⁺',\n '-': '⁻',\n};\n\ntype NumberDisplayOptions = {\n scientific?: 'auto' | boolean;\n eNotation?: boolean;\n autoScientificBelow?: number;\n autoScientificAbove?: number;\n roundScientificCoefficient?: number;\n withUnit?: boolean;\n noThousandsSeparator?: boolean;\n nonBreakingSpace?: boolean;\n};\n\ntype PrivateNumberDisplayOptions = NumberDisplayOptions & {\n preserveTrailingZeros?: boolean;\n};\n\nconst appendTrailingZeros = (value: string, numberOfZeros: number): string => {\n const zeros = '0'.repeat(numberOfZeros);\n return numberOfZeros > 0 && value !== '0' ? (!value.includes('.') ? `${value}.${zeros}` : `${value}${zeros}`) : value;\n};\n\nexport const formatDecimal = (\n value: number | string,\n thousandSeparator: string,\n preserveTrailingZeros = false,\n): string => {\n const convertedValue = formatEnglishNumber(toNum(value)).replaceAll(',', thousandSeparator);\n return preserveTrailingZeros ? appendTrailingZeros(convertedValue, countTrailingZeros(value, true)) : convertedValue;\n};\n\nexport const formatDecimalDisplayNumber = (\n value: number | string | null | undefined,\n options?: PrivateNumberDisplayOptions,\n): string => {\n const { nonBreakingSpace } = options ?? {};\n if (value === '') {\n return value;\n }\n if (value === null || value === undefined) {\n return '';\n }\n if (!isValidNum(value)) {\n return trim(value.toString());\n }\n const space = options?.noThousandsSeparator ? '' : nonBreakingSpace ? ' ' : ' '; //https://unicode-explorer.com/c/2007\n return formatDecimal(value, space, options?.preserveTrailingZeros);\n};\n\nexport const formatScientificDisplayNumber = (\n value: number | string | undefined | null,\n options?: PrivateNumberDisplayOptions,\n): string => {\n const { roundScientificCoefficient, eNotation } = options ?? {};\n if (Number.isNaN(value)) {\n return 'Invalid';\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n if (!isValidNum(value) || value === '') {\n return trim(value.toString());\n }\n const sanitizedValue = toNum(value);\n if (!Number.isFinite(sanitizedValue)) {\n return trim(value.toString());\n }\n const power = eNotation ? 'e' : '·10';\n const [coefficient, exponent] = sanitizedValue.toExponential().split('e');\n const roundedCoefficient =\n typeof roundScientificCoefficient === 'number' ? round(coefficient, roundScientificCoefficient) : coefficient;\n const noExponent = exponent === '+0' || exponent === '-0';\n const formattedExponent = [...exponent.replaceAll('+', '')]\n .map((c: string) => (eNotation ? c : superscriptSymbols[c]))\n .join('');\n return noExponent ? roundedCoefficient : `${roundedCoefficient}${power}${formattedExponent}`;\n};\n\nexport const formatDisplayNumber = (value: number | string, options: PrivateNumberDisplayOptions): string => {\n const abs = Math.abs(toNum(value));\n const formatScientific =\n options?.scientific === 'auto' && options?.autoScientificBelow && options?.autoScientificAbove\n ? abs < options?.autoScientificBelow || abs > options?.autoScientificAbove\n : options?.scientific;\n return formatScientific ? formatScientificDisplayNumber(value, options) : formatDecimalDisplayNumber(value, options);\n};\n\n/**\n * Displays a number with human-friendly formatting (use for non-editable display labels, text)\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @example\n * //returns '1 234.56'\n * displayNumber(1234.56)\n *\n * By default, adds thousands separators. Can be configured to display in scientific notation, and with formatted units.\n *\n * @param value\n * @param options\n * @returns formatted display number\n */\nexport const displayNumber = <Value extends number | string | null | undefined>(\n value: Value,\n options?: NumberDisplayOptions,\n): string => {\n const optionsWithDefaults: Record<string, any> = {\n scientific: options?.scientific ?? 'auto',\n eNotation: options?.eNotation ?? false,\n autoScientificBelow: options?.autoScientificBelow ?? DEFAULT_AUTO_SCIENTIFIC_BELOW,\n autoScientificAbove: options?.autoScientificAbove ?? DEFAULT_AUTO_SCIENTIFIC_ABOVE,\n withUnit: options?.withUnit ?? false,\n nonBreakingSpace: options?.nonBreakingSpace ?? false,\n roundScientificCoefficient: options?.roundScientificCoefficient,\n };\n const { withUnit } = optionsWithDefaults;\n if (value === null || value === undefined) {\n return '';\n }\n const { number, unit } = parseNumber(value);\n const formattedNumber = formatDisplayNumber(number, optionsWithDefaults);\n const formattedUnit = unit ? LABELS?.[unit] : '';\n return withUnit && unit\n ? formattedNumber === ''\n ? formattedUnit\n : `${formattedNumber} ${formattedUnit}`\n : formattedNumber;\n};\n\n/**\n * Displays a number with human-friendly formatting (use for non-editable display labels, text)\n *\n * Accepts number types (1.234), stringified numbers ('1.234'), and unit numbers ('1.234|m')\n *\n * @example\n * //returns '1 234.5600'\n * displayNumberToFixed('1234.5600')\n *\n * By default, adds thousands separators. Can be configured to display in scientific notation, and with formatted units.\n *\n * @param value\n * @param options\n * @returns formatted display number\n */\nexport const displayNumberToFixed = <Value extends string | null | undefined>(\n value: Value,\n options?: NumberDisplayOptions,\n): string => {\n const optionsWithDefaults: Record<string, any> = {\n scientific: options?.scientific ?? 'auto',\n eNotation: options?.eNotation ?? false,\n autoScientificBelow: options?.autoScientificBelow ?? DEFAULT_AUTO_SCIENTIFIC_BELOW,\n autoScientificAbove: options?.autoScientificAbove ?? DEFAULT_AUTO_SCIENTIFIC_ABOVE,\n withUnit: options?.withUnit ?? false,\n nonBreakingSpace: options?.nonBreakingSpace ?? false,\n roundScientificCoefficient: options?.roundScientificCoefficient,\n };\n const { withUnit } = optionsWithDefaults;\n if (value === null || value === undefined) {\n return '';\n }\n const preserveTrailingZeros = true;\n const { number, unit } = parseNumber(value, preserveTrailingZeros);\n const formattedNumber = formatDisplayNumber(number, {\n ...optionsWithDefaults,\n preserveTrailingZeros: true,\n });\n const formattedUnit = unit ? LABELS?.[unit] : '';\n return withUnit && unit\n ? formattedNumber === ''\n ? formattedUnit\n : `${formattedNumber} ${formattedUnit}`\n : formattedNumber;\n};\n\n/** @deprecated Use `displayNumber` instead. */\nexport const formatNumber = (number: number | string | undefined | null): string => {\n return displayNumber(number);\n};\n","import { isFraction, numFraction } from './fractions/fractions.ts';\nimport {\n cleanNumStr,\n isArray,\n isEmptyString,\n isNull,\n isObject,\n isTrailingCommaSeparator,\n isTrailingPeriodSeparator,\n isUndefined,\n} from './parsing/number-input.ts';\nimport { isNumeric } from './predicates.ts';\nimport { getValue, isValueWithUnit, SEPARATOR } from '../units/unit-string.ts';\nimport { formatDecimalDisplayNumber } from './format/display-number.ts';\n\nconst parseValue = (value: unknown): unknown => {\n const isString = typeof value === 'string';\n const hasUnit = isString && isValueWithUnit(value);\n return hasUnit ? getValue(value) : value;\n};\n\n/**\n * Checks whether a value can be converted to number type by the toNum() function\n *\n * @param value - value to be checked\n * @returns whether number can be converted by toNum() function\n *\n * @example\n * isValidNum('1 1/2') -> true\n * toNum('foobar|m') -> false\n */\nexport const isValidNum = (value: unknown): boolean => {\n const parsedValue = parseValue(value);\n if (\n isEmptyString(parsedValue) ||\n Number.isNaN(parsedValue) ||\n parsedValue === Infinity ||\n parsedValue === -Infinity\n ) {\n return true;\n } else {\n if (\n !(\n isNull(parsedValue) ||\n isUndefined(parsedValue) ||\n isTrailingPeriodSeparator(parsedValue) ||\n isTrailingCommaSeparator(parsedValue) ||\n isArray(parsedValue) ||\n isObject(parsedValue)\n )\n ) {\n const cleanedValue = cleanNumStr(String(parsedValue));\n if (cleanedValue.includes(SEPARATOR)) {\n return false;\n }\n const number = isFraction(cleanedValue)\n ? numFraction(cleanedValue)\n : isNumeric(cleanedValue)\n ? parseFloat(cleanedValue)\n : cleanedValue;\n if (number === Infinity || number === -Infinity) {\n return true;\n }\n if (!isNumeric(number)) {\n return false;\n }\n if (!Number.isNaN(number)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * Checks whether a value is a valid number, in string representation with scientific notation (e.g. '1e3')\n *\n * Note - it's not possible to check whether *number* types are stored in scientific notation (all numbers are stored\n * the same way internally in floating-point formats, so there is no difference between 1000 and 1e3 internally).\n * Whether number types get displayed in scientific notation or not in the console is a browser-specific implementation\n * detail (display formatting) and not something we can check/rely on, so this function is only intended for checking\n * user-input values in string format. See https://stackoverflow.com/a/66005705/942635.\n *\n * @param value - value to be checked\n * @returns whether the value is a valid number in scientific notation\n *\n * @example\n * isValidNum('1e3') -> true\n * toNum(1000) -> false\n * toNum(1e3) -> false (we cannot check scientific notation of number types)\n */\n\nexport const isScientificStringNum = (value: unknown) => {\n if (typeof value === 'string') {\n return isValidNum(value) && value.toLowerCase().includes('e');\n }\n return false;\n};\n\n/**\n * Converts a numeric value to number type (when possible).\n * - need to know if it's possible first? Call isValidNum()\n * - accepts number types (1.234), stringified numbers ('1.234'), fractions ('1/2'), and unit numbers ('1.234|m')\n * - returns the converted number if possible, otherwise returns the input value or default value when provided\n *\n * @param value - value to be converted to number type\n * @param [fallback] - optional fallback value (returned when not possible to convert)\n * @param [minimum] - optional minimum value\n * @returns valid number after conversion, or fallback, or returns the original input\n *\n * @example\n * toNum('1.2345) -> 1.2345\n * toNum('1.2345|m') -> 1.2345\n */\nexport const toNum = (value: unknown, fallback?: number, minimum?: number): any => {\n const fallbackResult = fallback ?? value;\n const parsedValue = parseValue(value);\n if (!isValidNum(parsedValue)) {\n return fallbackResult;\n } else {\n const cleanedValue = cleanNumStr(String(parsedValue));\n const number = isFraction(cleanedValue)\n ? numFraction(cleanedValue)\n : isNumeric(cleanedValue)\n ? parseFloat(cleanedValue)\n : cleanedValue;\n if (number === Infinity || number === -Infinity) {\n return number;\n }\n if (Number.isNaN(number) || !isNumeric(number)) {\n return fallbackResult;\n } else if (minimum && number < minimum) {\n return minimum;\n }\n return number;\n }\n};\n\n/**\n * Convert a number to a string safely, better than String(value)\n * String(0.0000002) returns '2e-7' which is unwanted if we need to preserve formatting\n *\n * @param value\n * @returns number or string output value\n */\nexport const toString = (value?: unknown): any => {\n if (isValidNum(value)) {\n if (typeof value === 'string') {\n return value; // already a string\n }\n if (typeof value === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return String(value);\n }\n /*\n Note that String(0.0000002) -> '2e-7' in JavaScript, so we need to use a safe conversion function instead\n We could improve how the scientific notation inputs are handed too, but that's a minor breaking change to the\n current unit tests, so let's consider it separately in OW-17645\n */\n return formatDecimalDisplayNumber(value, { noThousandsSeparator: true });\n }\n }\n return value;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// https://mathiasbynens.be/notes/javascript-encoding\n// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\nfunction ucs2length(str) {\n const len = str.length;\n let length = 0;\n let pos = 0;\n let value;\n while (pos < len) {\n length++;\n value = str.charCodeAt(pos++);\n if (value >= 0xd800 && value <= 0xdbff && pos < len) {\n // high surrogate, and there is a next character\n value = str.charCodeAt(pos);\n if ((value & 0xfc00) === 0xdc00)\n pos++; // low surrogate\n }\n }\n return length;\n}\nexports.default = ucs2length;\nucs2length.code = 'require(\"ajv/dist/runtime/ucs2length\").default';\n//# sourceMappingURL=ucs2length.js.map","// @ts-nocheck\n\"use strict\";\nimport func2Module from \"ajv/dist/runtime/ucs2length.js\";\nconst func2 = func2Module.default ?? func2Module;\nexport interface ValidatorWithErrors {\n (data: any, options?: { instancePath?: string, parentData?: any, parentDataProperty?: any, rootData?: any }): boolean;\n errors?: any;\n};\nexport const numberSchemaValidator = validate15 as ValidatorWithErrors;const schema33 = {\"type\":\"number\",\"errorMessage\":\"Must be a numerical value\"};function validate15(data, {instancePath=\"\", parentData, parentDataProperty, rootData=data}={}){\nvalidate15.errors = null;let vErrors = null;let errors = 0;if(!((typeof data == \"number\") && (isFinite(data)))){const err0 = {instancePath,schemaPath:\"#/type\",keyword:\"type\",params:{type: \"number\"},message:\"must be number\"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(errors > 0){const emErrs0 = [];for(const err1 of vErrors){if(((((err1.keyword !== \"errorMessage\") && (!err1.emUsed)) && ((err1.instancePath === instancePath) || ((err1.instancePath.indexOf(instancePath) === 0) && (err1.instancePath[instancePath.length] === \"/\")))) && (err1.schemaPath.indexOf(\"#\") === 0)) && (err1.schemaPath[\"#\".length] === \"/\")){emErrs0.push(err1);err1.emUsed = true;}}if(emErrs0.length){const err2 = {instancePath,schemaPath:\"#/errorMessage\",keyword:\"errorMessage\",params:{errors: emErrs0},message:\"Must be a numerical value\"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}const emErrs1 = [];for(const err3 of vErrors){if(!err3.emUsed){emErrs1.push(err3);}}vErrors = emErrs1;errors = emErrs1.length;}validate15.errors = vErrors;return errors === 0;}export const testSchemaValidator = validate16 as ValidatorWithErrors;const schema34 = {\"$id\":\"testValidate\",\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"name\"]};function validate16(data, {instancePath=\"\", parentData, parentDataProperty, rootData=data}={}){\nvalidate16.errors = null;/*# sourceURL=\"testValidate\" */;let vErrors = null;let errors = 0;if(data && typeof data == \"object\" && !Array.isArray(data)){if(data.name === undefined){const err0 = {instancePath,schemaPath:\"#/required\",keyword:\"required\",params:{missingProperty: \"name\"},message:\"must have required property '\"+\"name\"+\"'\"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.name !== undefined){let data0 = data.name;if(typeof data0 === \"string\"){if(func2(data0) < 1){const err1 = {instancePath:instancePath+\"/name\",schemaPath:\"#/properties/name/minLength\",keyword:\"minLength\",params:{limit: 1},message:\"must NOT have fewer than 1 characters\"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}else {const err2 = {instancePath:instancePath+\"/name\",schemaPath:\"#/properties/name/type\",keyword:\"type\",params:{type: \"string\"},message:\"must be string\"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}}else {const err3 = {instancePath,schemaPath:\"#/type\",keyword:\"type\",params:{type: \"object\"},message:\"must be object\"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}validate16.errors = vErrors;return errors === 0;}","import type { ErrorObject } from 'ajv';\n\nexport const transformErrors = (errors: ErrorObject[]) => {\n return errors?.map(({ message }: ErrorObject) => message);\n};\n","import type { ValidateReturn } from './types.ts';\nimport { toNum } from '../numbers/numbers.ts';\nimport { isNumeric } from '../numbers/predicates.ts';\nimport { numberSchemaValidator } from '../validate/ajv-validators.ts';\nimport { transformErrors } from '../validate/errors-transform.ts';\nimport { getValue, isValueWithUnit, split } from './unit-string.ts';\n\n/** Normalizes repeated decimal dots and decimal commas. */\nexport function checkAndCleanDecimalComma(value: string | number): string | number {\n const repeatedDots = /\\.{2,}/;\n const comma = /,/;\n if (typeof value === 'string') {\n while (repeatedDots.test(value) || comma.test(value)) {\n value = value.replace(repeatedDots, '.');\n value = value.replace(comma, '.');\n }\n }\n return value;\n}\n\n/** Cleans raw numeric input while retaining the unit from the previous value. */\nexport function validateAndClean(previousValue: string, nextText: string): string {\n const unit = split(previousValue)[1];\n const stripAllExceptNumeric = /[^0-9.,-Ee]/g;\n const stripExponent = /^([^(e|E)]*[eE])|[eE]/g;\n const stripInvalidLeadingExponent = /^[E|e]*|[E|e]*$/g;\n const replaceComma = /,/g;\n const stripDot = /^([^.]*\\.)|\\./g;\n const stripDotFollowedByExponent = /\\.(?=e)/g;\n const stripMinus = /-|[eE]-/g;\n\n const cleanedValue = nextText\n .replace(stripAllExceptNumeric, '')\n .replace(stripExponent, '$1')\n .replace(stripInvalidLeadingExponent, '')\n .replace(replaceComma, '.')\n .replace(stripDot, '$1')\n .replace(stripDotFollowedByExponent, '')\n .replace(stripMinus, (match, offset) => (offset === 0 || match.toLowerCase() === 'e-' ? match : ''));\n\n return !Number.isFinite(+cleanedValue) ? previousValue : `${cleanedValue}${unit ? '|' : ''}${unit}`;\n}\n\n/** Validates a numeric or unit-encoded value against the package number schema. */\nexport function validateNumber(value: string | number): ValidateReturn {\n let normalizedValue = value;\n if (typeof value === 'string' && isValueWithUnit(value)) {\n normalizedValue = getValue(value);\n }\n\n normalizedValue = checkAndCleanDecimalComma(normalizedValue);\n if (isNumeric(normalizedValue)) {\n const valid = numberSchemaValidator(toNum(normalizedValue));\n return { valid, errors: transformErrors(numberSchemaValidator.errors) };\n }\n\n const valid = numberSchemaValidator(normalizedValue);\n return { valid, errors: transformErrors(numberSchemaValidator.errors) };\n}\n","import { DEPRECATED_UNITS, INTERMEDIATE_CONVERSIONS, KNOWN_CONVERSIONS, UNIT_ALIASES } from './constants.ts';\nimport { toNum, toString } from '../numbers/numbers.ts';\nimport { cleanNum, cleanNumStr } from '../numbers/parsing/number-input.ts';\nimport { isNonNumerical, isNumeric } from '../numbers/predicates.ts';\nimport { EXP_NOTATION_RE, normalizeScientific } from '../numbers/scientific-notation/scientific-notation.ts';\nimport { unitFromKey } from './unit-catalog.ts';\nimport { getValue, isValueWithUnit, split, withUnit } from './unit-string.ts';\nimport { checkAndCleanDecimalComma } from './validation.ts';\n\n/** Converts a numeric value between compatible units. */\nexport function to(value: string | number, fromUnit: string, toUnit: string): number {\n value = checkAndCleanDecimalComma(value);\n value = normalizeScientific(value);\n\n if (toUnit === 'undefined') {\n console.warn('Inconsistent \"to unit\" - debug call to \"Units.to()\"');\n }\n if (fromUnit === 'undefined') {\n fromUnit = toUnit;\n console.warn('Inconsistent \"from unit\" - debug call to \"Units.to()\"');\n }\n if (fromUnit === toUnit) {\n return toNum(value);\n }\n\n if (value === Infinity || value === 'Infinity') {\n return Infinity;\n }\n if (value === -Infinity || value === '-Infinity') {\n return -Infinity;\n }\n if (isNonNumerical(value) && value !== '') {\n return NaN;\n }\n\n const conversion = KNOWN_CONVERSIONS[`${fromUnit}|${toUnit}`];\n if (conversion) {\n return conversion(toNum(value));\n }\n\n if (DEPRECATED_UNITS[fromUnit]) {\n console.warn(`Unit '${fromUnit}' is deprecated - use '${DEPRECATED_UNITS[fromUnit]}' instead.`);\n return to(value, DEPRECATED_UNITS[fromUnit], toUnit);\n }\n if (DEPRECATED_UNITS[toUnit]) {\n console.warn(`Unit '${toUnit}' is deprecated - use '${DEPRECATED_UNITS[toUnit]}' instead.`);\n return to(value, fromUnit, DEPRECATED_UNITS[toUnit]);\n }\n\n if (UNIT_ALIASES[toUnit]) {\n return to(value, fromUnit, UNIT_ALIASES[toUnit]);\n }\n if (UNIT_ALIASES[fromUnit]) {\n return to(value, UNIT_ALIASES[fromUnit], toUnit);\n }\n\n const intermediateFromUnit = INTERMEDIATE_CONVERSIONS[fromUnit];\n if (intermediateFromUnit) {\n const intermediateValue = to(value, fromUnit, intermediateFromUnit);\n return to(intermediateValue, intermediateFromUnit, toUnit);\n }\n\n const intermediateToUnit = INTERMEDIATE_CONVERSIONS[toUnit];\n if (toUnit && intermediateToUnit && intermediateToUnit !== toUnit) {\n const intermediateValue = to(value, fromUnit, intermediateToUnit);\n return to(intermediateValue, intermediateToUnit, toUnit);\n }\n\n console.error('no conversions found', value, fromUnit, '->', toUnit);\n throw new Error(`No conversions found: ${value} ${fromUnit} -> ${toUnit}`);\n}\n\n/** Converts a value with an optional unit suffix to the requested unit. */\nexport function unum(valueWithUnit: string | number, toUnit: string, fromUnit?: string): number {\n if (valueWithUnit == null || valueWithUnit === '') {\n return 0;\n }\n if (\n (typeof valueWithUnit === 'string' && valueWithUnit.startsWith('NaN')) ||\n (typeof valueWithUnit === 'number' && isNaN(valueWithUnit))\n ) {\n return NaN;\n }\n\n const normalizedInput = normalizeScientific(valueWithUnit);\n const cleanString = cleanNumStr(normalizedInput).replaceAll('+', '');\n const parts = split(cleanString);\n\n if (!parts) {\n if (toUnit && fromUnit) {\n return unum(valueWithUnit + fromUnit, toUnit);\n }\n throw new Error(`unum: invalid number: ${valueWithUnit}`);\n }\n if (parts[0] == null) {\n parts[0] = '0';\n }\n if (parts[1]) {\n fromUnit = parts[1];\n }\n if (!fromUnit && toUnit !== fromUnit) {\n throw new Error(`unum: unable to figure out unit: ${valueWithUnit} fromUnit ${fromUnit}`);\n }\n\n if (toUnit === fromUnit) {\n const value = parts[0] ? toNum(parts[0]) : 0;\n if (value === Infinity || value === 'Infinity') {\n return Infinity;\n }\n if (value === -Infinity || value === '-Infinity') {\n return -Infinity;\n }\n if (typeof value === 'string' && EXP_NOTATION_RE.test(value)) {\n return parseFloat(value);\n }\n if (!isNumeric(value) && value !== Infinity && value !== -Infinity) {\n throw new Error(`unum: invalid number: ${value}, ${typeof value}`);\n }\n return cleanNum(value);\n }\n\n return to(parts[0], fromUnit, toUnit);\n}\n\n/** Alias for `unum`. */\nexport function convertAndGetValue(value: string | number, toUnit: string, fromUnit?: string): number {\n return unum(value, toUnit, fromUnit);\n}\n\n/** Converts a value while preserving string types and empty values. */\nexport function convertAndGetValueStrict(\n value: string | number | null,\n toUnit: string,\n fromUnit?: string,\n): string | number | null {\n if (value === '' || value === null) {\n return value;\n }\n if (typeof value === 'string' && isValueWithUnit(value) && getValue(value) === '') {\n return '';\n }\n const isString = typeof value === 'string';\n const result = convertAndGetValue(value, toUnit, fromUnit);\n return isString ? toString(result) : result;\n}\n\n/** Converts a value to the base unit configured for a quantity. */\nexport function toBase(value: string, quantity: string): number {\n const baseUnit = unitFromKey(quantity);\n const parts = split((value || '').toString());\n return unum(value, baseUnit as string, parts[1] || baseUnit);\n}\n\n/** Converts a value and appends the requested unit. */\nexport function unumWithUnit(value: string | number, toUnit: string, fromUnit?: string): string {\n return withUnit(unum(value, toUnit, fromUnit), toUnit);\n}\n\n/** Converts a unit value while retaining approximately the input precision. */\nexport function convertSamePrecision(valueWithUnit: string | number, toUnit: string, digits?: number): string {\n const validValueWithUnit = String(valueWithUnit);\n const parts = split(validValueWithUnit);\n const convertedNumber = !parts[1] || parts[1] == toUnit ? Number(parts[0]) : to(parts[0], String(parts[1]), toUnit);\n\n let prettyNumber = '0';\n let targetDigits = digits;\n if (convertedNumber !== 0) {\n if (!targetDigits) {\n if (parts[1] === toUnit) {\n return validValueWithUnit;\n }\n const digitParts = String(parts[0]).match(/^[-+.,0]*(\\d*)[.,]?(\\d*)/);\n targetDigits = digitParts ? Math.max(3, digitParts[1].length + digitParts[2].length) : 3;\n }\n const limit = Math.pow(10, --targetDigits);\n const absoluteNumber = Math.abs(convertedNumber);\n if (absoluteNumber >= 1e5 * limit || absoluteNumber * 1e4 * (1 + limit) < limit) {\n prettyNumber = convertedNumber.toExponential(targetDigits);\n } else if (absoluteNumber >= limit) {\n prettyNumber = convertedNumber.toFixed();\n } else {\n const magnitude = Math.floor(Math.log10(absoluteNumber));\n prettyNumber = convertedNumber.toFixed(targetDigits - magnitude);\n let index = prettyNumber.length;\n if (prettyNumber[--index] == '0') {\n while (prettyNumber[--index] == '0') {\n // Find the last significant digit.\n }\n prettyNumber = prettyNumber.slice(0, index + (prettyNumber[index] == '.' ? 0 : 1));\n }\n }\n }\n return withUnit(prettyNumber, toUnit);\n}\n"],"x_google_ignoreList":[13],"mappings":"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"}