{"version":3,"file":"css-calc.js","sources":["../../../src/js/css-calc.ts"],"sourcesContent":["/**\n * css-calc.js\n */\n\nimport { calc } from '@csstools/css-calc';\nimport { TokenType, tokenize } from '@csstools/css-tokenizer';\nimport { LRUCache } from 'lru-cache';\nimport { isString } from './common';\nimport { roundToPrecision, valueToJsonString } from './util';\n\n/* constants */\nimport {\n FN_VAR,\n NUM,\n SYN_FN_MATH,\n SYN_FN_MATH_CALC,\n SYN_FN_MATH_VAR,\n SYN_FN_VAR,\n VAL_SPEC\n} from './constant.js';\nconst {\n CloseParen: PAREN_CLOSE,\n Comment: COMMENT,\n Dimension: DIM,\n EOF,\n Function: FUNC,\n OpenParen: PAREN_OPEN,\n Whitespace: W_SPACE\n} = TokenType;\nconst HEX = 16;\nconst MAX_PCT = 100;\n\n/* regexp */\nconst REG_FN_MATH_CALC = new RegExp(SYN_FN_MATH_CALC);\nconst REG_FN_VAR = new RegExp(SYN_FN_VAR);\nconst REG_OPERATOR = /\\s[*+/-]\\s/;\nconst REG_START_MATH = new RegExp(SYN_FN_MATH);\nconst REG_START_MATH_VAR = new RegExp(SYN_FN_MATH_VAR);\nconst REG_TYPE_DIM = new RegExp(`^(${NUM})([a-z]+)$`);\nconst REG_TYPE_DIM_PCT = new RegExp(`^(${NUM})([a-z]+|%)$`);\nconst REG_TYPE_PCT = new RegExp(`^(${NUM})%$`);\n\n/* cached results */\nexport const cachedResults = new LRUCache({\n max: 4096\n});\n\n/**\n * calclator\n */\nexport class Calculator {\n /* private */\n // number\n #hasNum: boolean;\n #numSum: Array;\n #numMul: Array;\n // percentage\n #hasPct: boolean;\n #pctSum: Array;\n #pctMul: Array;\n // dimension\n #hasDim: boolean;\n #dimSum: Array;\n #dimSub: Array;\n #dimMul: Array;\n #dimDiv: Array;\n // et cetra\n #hasEtc: boolean;\n #etcSum: Array;\n #etcSub: Array;\n #etcMul: Array;\n #etcDiv: Array;\n\n /**\n * constructor\n */\n constructor() {\n // number\n this.#hasNum = false;\n this.#numSum = [];\n this.#numMul = [];\n // percentage\n this.#hasPct = false;\n this.#pctSum = [];\n this.#pctMul = [];\n // dimension\n this.#hasDim = false;\n this.#dimSum = [];\n this.#dimSub = [];\n this.#dimMul = [];\n this.#dimDiv = [];\n // et cetra\n this.#hasEtc = false;\n this.#etcSum = [];\n this.#etcSub = [];\n this.#etcMul = [];\n this.#etcDiv = [];\n }\n\n get hasNum() {\n return this.#hasNum;\n }\n\n set hasNum(value: boolean) {\n this.#hasNum = !!value;\n }\n\n get numSum() {\n return this.#numSum;\n }\n\n get numMul() {\n return this.#numMul;\n }\n\n get hasPct() {\n return this.#hasPct;\n }\n\n set hasPct(value: boolean) {\n this.#hasPct = !!value;\n }\n\n get pctSum() {\n return this.#pctSum;\n }\n\n get pctMul() {\n return this.#pctMul;\n }\n\n get hasDim() {\n return this.#hasDim;\n }\n\n set hasDim(value: boolean) {\n this.#hasDim = !!value;\n }\n\n get dimSum() {\n return this.#dimSum;\n }\n\n get dimSub() {\n return this.#dimSub;\n }\n\n get dimMul() {\n return this.#dimMul;\n }\n\n get dimDiv() {\n return this.#dimDiv;\n }\n\n get hasEtc() {\n return this.#hasEtc;\n }\n\n set hasEtc(value: boolean) {\n this.#hasEtc = !!value;\n }\n\n get etcSum() {\n return this.#etcSum;\n }\n\n get etcSub() {\n return this.#etcSub;\n }\n\n get etcMul() {\n return this.#etcMul;\n }\n\n get etcDiv() {\n return this.#etcDiv;\n }\n\n /**\n * clear values\n * @returns {void}\n */\n clear() {\n // number\n this.#hasNum = false;\n this.#numSum = [];\n this.#numMul = [];\n // percentage\n this.#hasPct = false;\n this.#pctSum = [];\n this.#pctMul = [];\n // dimension\n this.#hasDim = false;\n this.#dimSum = [];\n this.#dimSub = [];\n this.#dimMul = [];\n this.#dimDiv = [];\n // et cetra\n this.#hasEtc = false;\n this.#etcSum = [];\n this.#etcSub = [];\n this.#etcMul = [];\n this.#etcDiv = [];\n }\n\n /**\n * sort values\n * @param {Array} values - values\n * @returns {Array} - sorted values\n */\n sort(values: Array = []): Array {\n const arr = [...values];\n if (arr.length > 1) {\n arr.sort((a, b) => {\n let res;\n if (REG_TYPE_DIM_PCT.test(a) && REG_TYPE_DIM_PCT.test(b)) {\n const [, valA, unitA] = a.match(REG_TYPE_DIM_PCT) as [\n string,\n string,\n string\n ];\n const [, valB, unitB] = b.match(REG_TYPE_DIM_PCT) as [\n string,\n string,\n string\n ];\n if (unitA === unitB) {\n if (Number(valA) === Number(valB)) {\n res = 0;\n } else if (Number(valA) > Number(valB)) {\n res = 1;\n } else {\n res = -1;\n }\n } else if (unitA > unitB) {\n res = 1;\n } else {\n res = -1;\n }\n } else {\n if (a === b) {\n res = 0;\n } else if (a > b) {\n res = 1;\n } else {\n res = -1;\n }\n }\n return res;\n });\n }\n return arr;\n }\n\n /**\n * multiply values\n * @returns {?string} - resolved value\n */\n multiply(): string | null {\n const value = [];\n let num!: number | string;\n if (this.#hasNum) {\n num = 1;\n for (const i of this.#numMul) {\n num *= i;\n if (num === 0 || !Number.isFinite(num) || Number.isNaN(num)) {\n break;\n }\n }\n if (!this.#hasPct && !this.#hasDim && !this.hasEtc) {\n value.push(num);\n }\n }\n if (this.#hasPct) {\n if (!this.#hasNum) {\n num = 1;\n }\n for (const i of this.#pctMul) {\n (num as number) *= i;\n if (num === 0 || !Number.isFinite(num) || Number.isNaN(num)) {\n break;\n }\n }\n if (Number.isFinite(num)) {\n num = `${num}%`;\n }\n if (!this.#hasDim && !this.hasEtc) {\n value.push(num);\n }\n }\n if (this.#hasDim) {\n let dim, mul, div;\n if (this.#dimMul.length) {\n if (this.#dimMul.length === 1) {\n [mul] = this.#dimMul;\n } else {\n mul = `${this.sort(this.#dimMul).join(' * ')}`;\n }\n }\n if (this.#dimDiv.length) {\n if (this.#dimDiv.length === 1) {\n [div] = this.#dimDiv;\n } else {\n div = `${this.sort(this.#dimDiv).join(' * ')}`;\n }\n }\n if (Number.isFinite(num)) {\n if (mul) {\n if (div) {\n if (div.includes('*')) {\n dim = calc(`calc(${num} * ${mul} / (${div}))`, {\n toCanonicalUnits: true\n });\n } else {\n dim = calc(`calc(${num} * ${mul} / ${div})`, {\n toCanonicalUnits: true\n });\n }\n } else {\n dim = calc(`calc(${num} * ${mul})`, {\n toCanonicalUnits: true\n });\n }\n } else {\n if (div.includes('*')) {\n dim = calc(`calc(${num} / (${div}))`, {\n toCanonicalUnits: true\n });\n } else {\n dim = calc(`calc(${num} / ${div})`, {\n toCanonicalUnits: true\n });\n }\n }\n value.push(dim.replace(/^calc/, ''));\n } else {\n if (!value.length && num !== undefined) {\n value.push(num);\n }\n if (mul) {\n if (div) {\n if (div.includes('*')) {\n dim = calc(`calc(${mul} / (${div}))`, {\n toCanonicalUnits: true\n });\n } else {\n dim = calc(`calc(${mul} / ${div})`, {\n toCanonicalUnits: true\n });\n }\n } else {\n dim = calc(`calc(${mul})`, {\n toCanonicalUnits: true\n });\n }\n if (value.length) {\n value.push('*', dim.replace(/^calc/, ''));\n } else {\n value.push(dim.replace(/^calc/, ''));\n }\n } else {\n dim = calc(`calc(${div})`, {\n toCanonicalUnits: true\n });\n if (value.length) {\n value.push('/', dim.replace(/^calc/, ''));\n } else {\n value.push('1', '/', dim.replace(/^calc/, ''));\n }\n }\n }\n }\n if (this.#hasEtc) {\n if (this.#etcMul.length) {\n if (!value.length && num !== undefined) {\n value.push(num);\n }\n const mul = this.sort(this.#etcMul).join(' * ');\n if (value.length) {\n value.push(`* ${mul}`);\n } else {\n value.push(`${mul}`);\n }\n }\n if (this.#etcDiv.length) {\n const div = this.sort(this.#etcDiv).join(' * ');\n if (div.includes('*')) {\n if (value.length) {\n value.push(`/ (${div})`);\n } else {\n value.push(`1 / (${div})`);\n }\n } else if (value.length) {\n value.push(`/ ${div}`);\n } else {\n value.push(`1 / ${div}`);\n }\n }\n }\n return value.join(' ') || null;\n }\n\n /**\n * sum values\n * @returns {?string} - resolved value\n */\n sum(): string | null {\n const value = [];\n if (this.#hasNum) {\n let num = 0;\n for (const i of this.#numSum) {\n num += i;\n if (!Number.isFinite(num) || Number.isNaN(num)) {\n break;\n }\n }\n value.push(num);\n }\n if (this.#hasPct) {\n let num = 0 as number | string;\n for (const i of this.#pctSum) {\n num += i;\n if (!Number.isFinite(num) || Number.isNaN(num)) {\n break;\n }\n }\n if (Number.isFinite(num)) {\n num = `${num}%`;\n }\n if (value.length) {\n value.push(`+ ${num}`);\n } else {\n value.push(num);\n }\n }\n if (this.#hasDim) {\n let dim, sum, sub;\n if (this.#dimSum.length) {\n sum = this.#dimSum.join(' + ');\n }\n if (this.#dimSub.length) {\n sub = this.#dimSub.join(' + ');\n }\n if (sum) {\n if (sub) {\n if (sub.includes('-')) {\n dim = calc(`calc(${sum} - (${sub}))`, {\n toCanonicalUnits: true\n });\n } else {\n dim = calc(`calc(${sum} - ${sub})`, {\n toCanonicalUnits: true\n });\n }\n } else {\n dim = calc(`calc(${sum})`, {\n toCanonicalUnits: true\n });\n }\n } else {\n dim = calc(`calc(-1 * (${sub}))`, {\n toCanonicalUnits: true\n });\n }\n if (value.length) {\n value.push('+', dim.replace(/^calc/, ''));\n } else {\n value.push(dim.replace(/^calc/, ''));\n }\n }\n if (this.#hasEtc) {\n if (this.#etcSum.length) {\n const sum = this.sort(this.#etcSum)\n .map((item) => {\n let res;\n if (\n REG_OPERATOR.test(item) &&\n !item.startsWith('(') &&\n !item.endsWith(')')\n ) {\n res = `(${item})`;\n } else {\n res = item;\n }\n return res;\n })\n .join(' + ');\n if (value.length) {\n if (this.#etcSum.length > 1) {\n value.push(`+ (${sum})`);\n } else {\n value.push(`+ ${sum}`);\n }\n } else {\n value.push(`${sum}`);\n }\n }\n if (this.#etcSub.length) {\n const sub = this.sort(this.#etcSub)\n .map((item) => {\n let res;\n if (\n REG_OPERATOR.test(item) &&\n !item.startsWith('(') &&\n !item.endsWith(')')\n ) {\n res = `(${item})`;\n } else {\n res = item;\n }\n return res;\n })\n .join(' + ');\n if (value.length) {\n if (this.#etcSub.length > 1) {\n value.push(`- (${sub})`);\n } else {\n value.push(`- ${sub}`);\n }\n } else if (this.#etcSub.length > 1) {\n value.push(`-1 * (${sub})`);\n } else {\n value.push(`-1 * ${sub}`);\n }\n }\n }\n return value.join(' ') || null;\n }\n}\n\n/**\n * sort calc values\n * @param {Array} values - values\n * @param {boolean} finalize - finalize\n * @returns {?string} - sorted value\n */\nexport const sortCalcValues = (\n values: string[] = [],\n finalize: boolean = false\n): string | null => {\n if (values.length < 3) {\n return null;\n }\n const start = values.shift();\n const end = values.pop();\n if (values.length === 1) {\n const [value] = values;\n return `${start}${value}${end}`;\n }\n const sortedValues = [];\n const cal = new Calculator();\n let operator!: string | null;\n for (let i = 0, l = values.length; i < l; i++) {\n const value = values[i]! as number | string;\n if (value === '*' || value === '/') {\n operator = value;\n } else if (value === '+' || value === '-') {\n const sortedValue = cal.multiply();\n sortedValues.push(sortedValue, value);\n cal.clear();\n operator = null;\n } else {\n switch (operator) {\n case '/': {\n const numValue = Number(value) as number;\n if (Number.isFinite(numValue)) {\n cal.hasNum = true;\n cal.numMul.push(1 / numValue);\n } else if (REG_TYPE_PCT.test(value as string)) {\n const [, val] = (value as string).match(REG_TYPE_PCT) as [\n string,\n string\n ];\n cal.hasPct = true;\n cal.pctMul.push((MAX_PCT * MAX_PCT) / Number(val));\n } else if (REG_TYPE_DIM.test(value as string)) {\n cal.hasDim = true;\n cal.dimDiv.push(value);\n } else {\n cal.hasEtc = true;\n cal.etcDiv.push(value);\n }\n break;\n }\n case '*':\n default: {\n const numValue = Number(value);\n if (Number.isFinite(numValue)) {\n cal.hasNum = true;\n cal.numMul.push(numValue);\n } else if (REG_TYPE_PCT.test(value as string)) {\n const [, val] = (value as string).match(REG_TYPE_PCT) as [\n string,\n string\n ];\n cal.hasPct = true;\n cal.pctMul.push(Number(val));\n } else if (REG_TYPE_DIM.test(value as string)) {\n cal.hasDim = true;\n cal.dimMul.push(value);\n } else {\n cal.hasEtc = true;\n cal.etcMul.push(value);\n }\n }\n }\n if (i === l - 1) {\n const sortedValue = cal.multiply();\n sortedValues.push(sortedValue);\n cal.clear();\n operator = null;\n }\n }\n }\n let resolvedValue;\n if (finalize && (sortedValues.includes('+') || sortedValues.includes('-'))) {\n const finalizedValues = [];\n cal.clear();\n operator = null;\n for (let i = 0, l = sortedValues.length; i < l; i++) {\n const value = sortedValues[i] as number | string;\n if (value === '+' || value === '-') {\n operator = value;\n } else {\n switch (operator) {\n case '-': {\n const numValue = Number(value) as number;\n if (Number.isFinite(numValue)) {\n cal.hasNum = true;\n cal.numSum.push(-1 * numValue);\n } else if (REG_TYPE_PCT.test(value as string)) {\n const [, val] = (value as string).match(REG_TYPE_PCT) as [\n string,\n string\n ];\n cal.hasPct = true;\n cal.pctSum.push(-1 * Number(val));\n } else if (REG_TYPE_DIM.test(value as string)) {\n cal.hasDim = true;\n cal.dimSub.push(value);\n } else {\n cal.hasEtc = true;\n cal.etcSub.push(value);\n }\n break;\n }\n case '+':\n default: {\n const numValue = Number(value) as number;\n if (Number.isFinite(numValue)) {\n cal.hasNum = true;\n cal.numSum.push(numValue);\n } else if (REG_TYPE_PCT.test(value as string)) {\n const [, val] = (value as string).match(REG_TYPE_PCT) as [\n string,\n string\n ];\n cal.hasPct = true;\n cal.pctSum.push(Number(val));\n } else if (REG_TYPE_DIM.test(value as string)) {\n cal.hasDim = true;\n cal.dimSum.push(value);\n } else {\n cal.hasEtc = true;\n cal.etcSum.push(value);\n }\n }\n }\n if (i === l - 1) {\n const sortedValue = cal.sum();\n finalizedValues.push(sortedValue);\n cal.clear();\n operator = null;\n }\n }\n }\n resolvedValue = finalizedValues.join(' ');\n } else {\n resolvedValue = sortedValues.join(' ');\n }\n return `${start}${resolvedValue}${end}`;\n};\n\n/**\n * serialize calc\n * @param {string} value - value\n * @param {object} [opt] - options\n * @param {string} [opt.format] - output format\n * @returns {?string} - resolved value\n */\nexport const serializeCalc = (\n value: string,\n opt: {\n format?: string;\n } = {}\n): string | null => {\n const { format } = opt;\n if (isString(value)) {\n if (!REG_START_MATH_VAR.test(value) || format !== VAL_SPEC) {\n return value;\n }\n value = value.toLowerCase().trim();\n } else {\n throw new TypeError(`${value} is not a string`);\n }\n const cacheKey = `{serializeCalc:${value},opt:${valueToJsonString(opt)}}`;\n if (cachedResults.has(cacheKey)) {\n return cachedResults.get(cacheKey) as string | null;\n }\n const items = tokenize({ css: value })\n .map((token) => {\n const [type, value] = token as [string, string];\n let res;\n if (type !== W_SPACE && type !== COMMENT) {\n res = value;\n }\n return res;\n })\n .filter((v: any) => v) as Array;\n let startIndex = items.findLastIndex((item: string) => /\\($/.test(item));\n while (startIndex) {\n const endIndex = items.findIndex((item: any, index: number) => {\n return item === ')' && index > startIndex;\n });\n const slicedValues = items.slice(startIndex, endIndex + 1);\n let serializedValue =\n sortCalcValues(slicedValues as Array) as string;\n if (REG_START_MATH_VAR.test(serializedValue)) {\n serializedValue = calc(serializedValue, {\n toCanonicalUnits: true\n }) as string;\n }\n items.splice(startIndex, endIndex - startIndex + 1, serializedValue);\n startIndex = items.findLastIndex((item: string) => /\\($/.test(item));\n }\n const serializedCalc =\n sortCalcValues(items as Array, true) as string | null;\n if (cacheKey) {\n cachedResults.set(cacheKey, serializedCalc!);\n }\n return serializedCalc;\n};\n\n/**\n * resolve dimension\n * @param {Array} token - token\n * @param {object} [opt] - options\n * @param {object} [opt.dimension] - dimension\n * @returns {?string} - resolved value\n */\nexport const resolveDimension = (\n token: Array,\n opt: {\n dimension?: object;\n } = {}\n): string | null => {\n if (!Array.isArray(token)) {\n throw new TypeError(`${token} is not an array.`);\n }\n const [, value, , , detail = {}] = token;\n const { unit, value: relativeValue } = detail;\n const { dimension = {} } = opt;\n if (unit === 'px') {\n return value;\n }\n let res;\n if (unit && Number.isFinite(relativeValue as number)) {\n let pixelValue!: number | undefined;\n if (Object.hasOwnProperty.call(dimension, unit)) {\n pixelValue = dimension[unit as never];\n } else if (\n typeof (\n dimension as {\n callback?: (unit: string) => number;\n }\n ).callback === 'function'\n ) {\n pixelValue = (\n dimension as {\n callback: (unit: string) => number;\n }\n ).callback(unit);\n }\n pixelValue = Number(pixelValue);\n if (Number.isFinite(pixelValue)) {\n res = `${relativeValue as number * pixelValue as number}px`;\n }\n }\n return res ?? null;\n};\n\n/**\n * parse tokens\n * @param {Array.} tokens - tokens\n * @param {object} [opt] - options\n * @returns {Array.} - parsed tokens\n */\nexport const parseTokens = (\n tokens: Array>,\n opt: {\n dimension?: object;\n format?: string;\n } = {}\n): Array => {\n if (!Array.isArray(tokens)) {\n throw new TypeError(`${tokens} is not an array.`);\n }\n const { format } = opt;\n const mathFunc = new Set();\n let nest = 0 as number;\n const res = [] as string[];\n while (tokens.length) {\n const token = tokens.shift();\n if (!Array.isArray(token)) {\n throw new TypeError(`${token} is not an array.`);\n }\n const [type, value] = token as [string, string];\n switch (type) {\n case DIM: {\n let resolvedValue;\n if (format === VAL_SPEC && !mathFunc.has(nest)) {\n resolvedValue = value as string;\n } else {\n resolvedValue = resolveDimension(token, opt) as string | null;\n if (!resolvedValue) {\n resolvedValue = value as string;\n }\n }\n res.push(resolvedValue as string);\n break;\n }\n case FUNC:\n case PAREN_OPEN: {\n res.push(value);\n nest++;\n if (REG_START_MATH.test(value)) {\n mathFunc.add(nest);\n }\n break;\n }\n case PAREN_CLOSE: {\n if (res.length) {\n const lastValue = res[res.length - 1] as string;\n if (lastValue === ' ') {\n res.splice(-1, 1, value);\n } else {\n res.push(value);\n }\n } else {\n res.push(value);\n }\n if (mathFunc.has(nest)) {\n mathFunc.delete(nest);\n }\n nest--;\n break;\n }\n case W_SPACE: {\n if (res.length) {\n const lastValue = res[res.length - 1] as string;\n if (!lastValue.endsWith('(') && lastValue !== ' ') {\n res.push(value);\n }\n }\n break;\n }\n default: {\n if (type !== COMMENT && type !== EOF) {\n res.push(value);\n }\n }\n }\n }\n return res;\n};\n\n/**\n * resolve CSS calc()\n * @param {string} value - color value including calc()\n * @param {object} [opt] - options\n * @param {object} [opt.dimension] - dimension\n * @param {string} [opt.format] - output format\n * @returns {?string} - value\n */\nexport const cssCalc = (\n value: string,\n opt: {\n dimension?: object;\n format?: string;\n } = {}\n): string | null => {\n const { format, dimension = {} } = opt;\n if (isString(value)) {\n if (REG_FN_VAR.test(value)) {\n if (format === VAL_SPEC) {\n return value;\n // var() must be resolved before cssCalc()\n } else {\n throw new SyntaxError(`Unexpected token ${FN_VAR} found.`);\n }\n } else if (!REG_FN_MATH_CALC.test(value)) {\n return value;\n }\n value = value.toLowerCase().trim();\n } else {\n throw new TypeError(`${value} is not a string`);\n }\n let cacheKey;\n if (\n typeof (\n dimension as {\n callback?: (unit: string) => number;\n }\n ).callback !== 'function'\n ) {\n cacheKey = `{cssCalc:${value},opt:${valueToJsonString(opt)}}`;\n if (cachedResults.has(cacheKey)) {\n return cachedResults.get(cacheKey) as string | null;\n }\n }\n let resolvedValue;\n if (dimension) {\n const tokens = tokenize({ css: value });\n const values = parseTokens(tokens, opt);\n resolvedValue = calc(values.join(''), {\n toCanonicalUnits: true\n }) as string;\n } else {\n resolvedValue = calc(value, {\n toCanonicalUnits: true\n }) as string;\n }\n if (REG_START_MATH_VAR.test(value)) {\n if (REG_TYPE_DIM_PCT.test(resolvedValue)) {\n const [, val, unit] = resolvedValue.match(REG_TYPE_DIM_PCT) as [\n string,\n string,\n string\n ];\n resolvedValue = `${roundToPrecision(Number(val), HEX)}${unit}`;\n }\n // wrap with `calc()`\n if (\n resolvedValue &&\n !REG_START_MATH_VAR.test(resolvedValue as string) &&\n format === VAL_SPEC\n ) {\n resolvedValue = `calc(${resolvedValue})`;\n }\n }\n if (cacheKey) {\n cachedResults.set(cacheKey, resolvedValue);\n }\n return resolvedValue;\n};\n"],"names":["value"],"mappings":"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"}