"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _browserslist = require("browserslist"); var _browserslist2 = _interopRequireDefault(_browserslist); var _postcss = require("postcss"); var _postcss2 = _interopRequireDefault(_postcss); var _postcssValueParser = require("postcss-value-parser"); var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser); var _colours = require("./colours"); var _colours2 = _interopRequireDefault(_colours); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function walk(parent, callback) { parent.nodes.forEach((node, index) => { const bubble = callback(node, index, parent); if (node.nodes && bubble !== false) { walk(node, callback); } }); } /* * IE 8 & 9 do not properly handle clicks on elements * with a `transparent` `background-color`. * * https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer */ function hasTransparentBug(browser) { return ~["ie 8", "ie 9"].indexOf(browser); } exports.default = _postcss2.default.plugin("postcss-colormin", () => { return (css, result) => { const resultOpts = result.opts || {}; const browsers = (0, _browserslist2.default)(null, { stats: resultOpts.stats, path: __dirname, env: resultOpts.env }); const isLegacy = browsers.some(hasTransparentBug); const colorminCache = {}; const cache = {}; css.walkDecls(decl => { if (/^(composes|font|filter|-webkit-tap-highlight-color)/i.test(decl.prop)) { return; } if (cache[decl.value]) { decl.value = cache[decl.value]; return; } const parsed = (0, _postcssValueParser2.default)(decl.value); walk(parsed, (node, index, parent) => { if (node.type === "function") { if (/^(rgb|hsl)a?$/i.test(node.value)) { const { value } = node; node.value = (0, _colours2.default)((0, _postcssValueParser.stringify)(node), isLegacy, colorminCache); node.type = "word"; const next = parent.nodes[index + 1]; if (node.value !== value && next && (next.type === "word" || next.type === "function")) { parent.nodes.splice(index + 1, 0, { type: "space", value: " " }); } } else if (node.value.toLowerCase() === "calc") { return false; } } else if (node.type === "word") { node.value = (0, _colours2.default)(node.value, isLegacy, colorminCache); } }); const optimizedValue = parsed.toString(); decl.value = optimizedValue; cache[decl.value] = optimizedValue; }); }; });