postcss-calc
Version:
PostCSS plugin to reduce calc()
38 lines (35 loc) • 1.36 kB
JavaScript
import { baseOf, convert } from '../convertUnits.js';
/**
* If `dims` contain exactly one numerator / one denominator pair with the
* same base type and convertible units, return the numeric factor produced
* by cancelling them and the list of remaining (uncancelled) dims.
* Otherwise return null. Used by `simplifyProduct` for typed division
* (§10.2). More complex cancellation (e.g. `px^2 / px`) is left
* unreduced — consumers rarely rely on it and the spec doesn't require it.
* @template {{ exponent: 1 | -1, value: number, unit: string }} D
* @param {D[]} dims
* @return {{ factor: number, remaining: D[] } | null}
*/
function tryCancelPair(dims) {
if (dims.length !== 2) {
return null;
}
const [a, b] = /** @type {[D, D]} */ (dims);
if (a.exponent === b.exponent) {
return null;
}
const numerator = a.exponent === 1 ? a : b;
const denominator = a.exponent === 1 ? b : a;
const numBase = baseOf(numerator.unit);
const denBase = baseOf(denominator.unit);
if (!numBase || numBase !== denBase) {
return null;
}
const converted = convert(numerator.value, numerator.unit, denominator.unit);
if (converted === null) {
return null;
}
// denominator.value === 0 yields ±Infinity / NaN naturally (§10.9.1).
return { factor: converted / denominator.value, remaining: [] };
}
export { tryCancelPair };