{"version":3,"file":"resolve.js","sources":["../../../src/js/resolve.ts"],"sourcesContent":["/**\n * resolve.js\n */\n\nimport { LRUCache } from 'lru-cache';\nimport {\n convertRgbToHex,\n resolveColorFunc,\n resolveColorMix,\n resolveColorValue\n} from './color';\nimport { isString } from './common';\nimport { cssCalc } from './css-calc';\nimport { cssVar } from './css-var';\nimport { resolveRelativeColor } from './relative-color';\nimport { valueToJsonString } from './util';\n\n/* constants */\nimport {\n FN_COLOR,\n FN_MIX,\n SYN_FN_MATH_CALC,\n SYN_FN_REL,\n SYN_FN_VAR,\n VAL_COMP,\n VAL_SPEC\n} from './constant.js';\n\nconst RGB_TRANSPARENT = 'rgba(0, 0, 0, 0)';\n\n/* regexp */\nconst REG_FN_MATH_CALC = new RegExp(SYN_FN_MATH_CALC);\nconst REG_FN_REL = new RegExp(SYN_FN_REL);\nconst REG_FN_VAR = new RegExp(SYN_FN_VAR);\n\n/* cached results */\nexport const cachedResults = new LRUCache({\n max: 4096\n});\n\n/**\n * resolve CSS color\n * @param {string} color - color value\n * - system colors are not supported\n * @param {object} [opt] - options\n * @param {string} [opt.currentColor]\n * - color to use for `currentcolor` keyword\n * - if omitted, it will be treated as a missing color\n * i.e. `rgb(none none none / none)`\n * @param {object} [opt.customProperty]\n * - custom properties\n * - pair of `--` prefixed property name and value,\n * e.g. `customProperty: { '--some-color': '#0000ff' }`\n * - and/or `callback` function to get the value of the custom property,\n * e.g. `customProperty: { callback: someDeclaration.getPropertyValue }`\n * @param {object} [opt.dimension]\n * - dimension, convert relative length to pixels\n * - pair of unit and it's value as a number in pixels,\n * e.g. `dimension: { em: 12, rem: 16, vw: 10.26 }`\n * - and/or `callback` function to get the value as a number in pixels,\n * e.g. `dimension: { callback: convertUnitToPixel }`\n * @param {string} [opt.format]\n * - output format, one of below\n * - `computedValue` (default), [computed value][139] of the color\n * - `specifiedValue`, [specified value][140] of the color\n * - `hex`, hex color notation, i.e. `rrggbb`\n * - `hexAlpha`, hex color notation with alpha channel, i.e. `#rrggbbaa`\n * @param {*} [opt.key] - key e.g. CSS property `background-color`\n * @returns {?string|Array}\n * - one of rgba?(), #rrggbb(aa)?, color-name, '(empty-string)',\n * color(color-space r g b / alpha), color(color-space x y z / alpha),\n * lab(l a b / alpha), lch(l c h / alpha), oklab(l a b / alpha),\n * oklch(l c h / alpha), null or [key, rgba?()] etc. if `key` is specified\n * - in `computedValue`, values are numbers, however `rgb()` values are\n * integers\n * - in `specifiedValue`, returns `empty string` for unknown and/or invalid\n * color\n * - in `hex`, returns `null` for `transparent`, and also returns `null` if\n * any of `r`, `g`, `b`, `alpha` is not a number\n * - in `hexAlpha`, returns `#00000000` for `transparent`,\n * however returns `null` if any of `r`, `g`, `b`, `alpha` is not a number\n */\nexport const resolve = (\n color: string,\n opt: {\n currentColor?: string;\n customProperty?: object;\n dimension?: object;\n format?: string;\n key?: any;\n } = {}\n): (string | Array) | null => {\n if (isString(color)) {\n color = color.trim();\n } else {\n throw new TypeError(`${color} is not a string.`);\n }\n const { currentColor, customProperty = {}, format = VAL_COMP, key } = opt;\n let cacheKey;\n if (\n !REG_FN_VAR.test(color) ||\n typeof (\n customProperty as { callback?: (value: string) => string }\n ).callback === 'function'\n ) {\n cacheKey = `{resolve:${color},opt:${valueToJsonString(opt)}}`;\n if (cachedResults.has(cacheKey)) {\n return cachedResults.get(cacheKey) as string | Array;\n }\n }\n let res, cs, r, g, b, alpha;\n if (REG_FN_VAR.test(color)) {\n if (format === VAL_SPEC) {\n if (cacheKey) {\n cachedResults.set(cacheKey, color);\n }\n return color;\n }\n const resolvedColor = cssVar(color, opt);\n if (resolvedColor) {\n color = resolvedColor;\n } else {\n switch (format) {\n case 'hex':\n case 'hexAlpha': {\n if (cacheKey) {\n cachedResults.set(cacheKey, null!);\n }\n return null;\n }\n default: {\n res = RGB_TRANSPARENT;\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n }\n }\n }\n if (opt.format !== format) {\n opt.format = format;\n }\n color = color.toLowerCase();\n if (REG_FN_REL.test(color)) {\n const resolvedColor = resolveRelativeColor(color, opt) as string | null;\n if (format === VAL_COMP) {\n if (resolvedColor) {\n res = resolvedColor;\n } else {\n res = RGB_TRANSPARENT;\n }\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n if (format === VAL_SPEC) {\n if (resolvedColor) {\n res = resolvedColor;\n } else {\n res = '';\n }\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n if (resolvedColor) {\n color = resolvedColor;\n } else {\n color = '';\n }\n }\n if (REG_FN_MATH_CALC.test(color)) {\n const resolvedColor = cssCalc(color, opt) as string | null;\n if (resolvedColor) {\n color = resolvedColor;\n } else {\n color = '';\n }\n }\n if (color === 'transparent') {\n switch (format) {\n case VAL_SPEC: {\n if (cacheKey) {\n cachedResults.set(cacheKey, color);\n }\n return color;\n }\n case 'hex': {\n if (cacheKey) {\n cachedResults.set(cacheKey, null!);\n }\n return null;\n }\n case 'hexAlpha': {\n res = '#00000000';\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n case VAL_COMP:\n default: {\n res = RGB_TRANSPARENT;\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n }\n } else if (color === 'currentcolor') {\n if (format === VAL_SPEC) {\n if (cacheKey) {\n cachedResults.set(cacheKey, color);\n }\n return color;\n }\n if (currentColor) {\n if (currentColor.startsWith(FN_MIX)) {\n [cs, r, g, b, alpha] = resolveColorMix(currentColor, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n } else if (currentColor.startsWith(FN_COLOR)) {\n [cs, r, g, b, alpha] = resolveColorFunc(currentColor, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n } else {\n [cs, r, g, b, alpha] = resolveColorValue(currentColor, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n }\n } else if (format === VAL_COMP) {\n res = RGB_TRANSPARENT;\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n } else if (format === VAL_SPEC) {\n if (color.startsWith(FN_MIX)) {\n res = resolveColorMix(color, opt);\n if (cacheKey) {\n cachedResults.set(cacheKey, res!);\n }\n return res;\n } else if (color.startsWith(FN_COLOR)) {\n [cs, r, g, b, alpha] = resolveColorFunc(color, opt) as [\n string,\n number | string,\n number | string,\n number | string,\n number | string\n ];\n if (alpha === 1) {\n res = `color(${cs} ${r} ${g} ${b})`;\n } else {\n res = `color(${cs} ${r} ${g} ${b} / ${alpha})`;\n }\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n } else {\n const rgb = resolveColorValue(color, opt);\n if (!rgb) {\n res = '';\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n [cs, r, g, b, alpha] = rgb;\n if (cs === 'rgb') {\n if (alpha === 1) {\n res = `${cs}(${r}, ${g}, ${b})`;\n } else {\n res = `${cs}a(${r}, ${g}, ${b}, ${alpha})`;\n }\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n if (alpha === 1) {\n res = `${cs}(${r} ${g} ${b})`;\n } else {\n res = `${cs}(${r} ${g} ${b} / ${alpha})`;\n }\n if (cacheKey) {\n cachedResults.set(cacheKey, res);\n }\n return res;\n }\n } else if (/currentcolor/.test(color)) {\n if (currentColor) {\n color = color.replace(/currentcolor/g, currentColor);\n }\n if (/transparent/.test(color)) {\n color = color.replace(/transparent/g, RGB_TRANSPARENT);\n }\n if (color.startsWith(FN_MIX)) {\n [cs, r, g, b, alpha] = resolveColorMix(color, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n }\n } else if (/transparent/.test(color)) {\n color = color.replace(/transparent/g, RGB_TRANSPARENT);\n if (color.startsWith(FN_MIX)) {\n [cs, r, g, b, alpha] = resolveColorMix(color, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n }\n } else if (color.startsWith(FN_MIX)) {\n [cs, r, g, b, alpha] = resolveColorMix(color, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n } else if (color.startsWith(FN_COLOR)) {\n [cs, r, g, b, alpha] = resolveColorFunc(color, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n } else if (color) {\n [cs, r, g, b, alpha] = resolveColorValue(color, opt) as [\n string,\n number,\n number,\n number,\n number\n ];\n }\n switch (format) {\n case 'hex': {\n let hex;\n if (\n isNaN(r as number) ||\n isNaN(g as number) ||\n isNaN(b as number) ||\n isNaN(alpha as number) ||\n alpha === 0\n ) {\n hex = null;\n } else {\n hex = convertRgbToHex([r as number, g as number, b as number]);\n }\n if (key) {\n res = [key, hex];\n } else {\n res = hex;\n }\n break;\n }\n case 'hexAlpha': {\n let hex;\n if (\n isNaN(r as number) ||\n isNaN(g as number) ||\n isNaN(b as number) ||\n isNaN(alpha as number)\n ) {\n hex = null;\n } else {\n hex = convertRgbToHex([\n r as number,\n g as number,\n b as number,\n alpha as number\n ]);\n }\n if (key) {\n res = [key, hex];\n } else {\n res = hex;\n }\n break;\n }\n case VAL_COMP:\n default: {\n let value;\n switch (cs) {\n case 'rgb': {\n if (alpha === 1) {\n value = `${cs}(${r}, ${g}, ${b})`;\n } else {\n value = `${cs}a(${r}, ${g}, ${b}, ${alpha})`;\n }\n break;\n }\n case 'lab':\n case 'lch':\n case 'oklab':\n case 'oklch': {\n if (alpha === 1) {\n value = `${cs}(${r} ${g} ${b})`;\n } else {\n value = `${cs}(${r} ${g} ${b} / ${alpha})`;\n }\n break;\n }\n // color()\n default: {\n if (alpha === 1) {\n value = `color(${cs} ${r} ${g} ${b})`;\n } else {\n value = `color(${cs} ${r} ${g} ${b} / ${alpha})`;\n }\n }\n }\n if (key) {\n res = [key, value];\n } else {\n res = value;\n }\n }\n }\n if (cacheKey) {\n cachedResults.set(cacheKey, res!);\n }\n return res;\n};\n"],"names":[],"mappings":"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"}