123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- 'use strict';
- exports.__esModule = true;
- var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
- var _uniqs = require('uniqs');
- var _uniqs2 = _interopRequireDefault(_uniqs);
- var _postcss = require('postcss');
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
- var comma = _postcss.list.comma;
- var space = _postcss.list.space;
- var atrule = 'atrule';
- var decl = 'decl';
- var rule = 'rule';
- function addValues(cache, _ref) {
- var value = _ref.value;
- return comma(value).reduce(function (memo, val) {
- return [].concat(memo, space(val));
- }, cache);
- }
- function filterAtRule(_ref2) {
- var atRules = _ref2.atRules;
- var values = _ref2.values;
- values = (0, _uniqs2.default)(values);
- atRules.forEach(function (node) {
- var hasAtRule = values.some(function (value) {
- return value === node.params;
- });
- if (!hasAtRule) {
- node.remove();
- }
- });
- }
- function filterNamespace(_ref3) {
- var atRules = _ref3.atRules;
- var rules = _ref3.rules;
- rules = (0, _uniqs2.default)(rules);
- atRules.forEach(function (atRule) {
- var _atRule$params$split$ = atRule.params.split(' ').filter(Boolean);
- var param = _atRule$params$split$[0];
- var len = _atRule$params$split$.length;
- if (len === 1) {
- return;
- }
- var hasRule = rules.some(function (r) {
- return r === param || r === '*';
- });
- if (!hasRule) {
- atRule.remove();
- }
- });
- }
- function hasFont(fontFamily, cache) {
- return comma(fontFamily).some(function (font) {
- return cache.some(function (c) {
- return ~c.indexOf(font);
- });
- });
- }
- // fonts have slightly different logic
- function filterFont(_ref4) {
- var atRules = _ref4.atRules;
- var values = _ref4.values;
- values = (0, _uniqs2.default)(values);
- atRules.forEach(function (r) {
- var families = r.nodes.filter(function (_ref5) {
- var prop = _ref5.prop;
- return prop === 'font-family';
- });
- // Discard the @font-face if it has no font-family
- if (!families.length) {
- return r.remove();
- }
- families.forEach(function (family) {
- if (!hasFont(family.value.toLowerCase(), values)) {
- r.remove();
- }
- });
- });
- }
- exports.default = (0, _postcss.plugin)('postcss-discard-unused', function (opts) {
- var _fontFace$counterStyl = _extends({
- fontFace: true,
- counterStyle: true,
- keyframes: true,
- namespace: true
- }, opts);
- var fontFace = _fontFace$counterStyl.fontFace;
- var counterStyle = _fontFace$counterStyl.counterStyle;
- var keyframes = _fontFace$counterStyl.keyframes;
- var namespace = _fontFace$counterStyl.namespace;
- return function (css) {
- var counterStyleCache = { atRules: [], values: [] };
- var keyframesCache = { atRules: [], values: [] };
- var namespaceCache = { atRules: [], rules: [] };
- var fontCache = { atRules: [], values: [] };
- css.walk(function (node) {
- var type = node.type;
- var prop = node.prop;
- var selector = node.selector;
- var name = node.name;
- if (type === rule && namespace && ~selector.indexOf('|')) {
- namespaceCache.rules = namespaceCache.rules.concat(selector.split('|')[0]);
- return;
- }
- if (type === decl) {
- if (counterStyle && /list-style|system/.test(prop)) {
- counterStyleCache.values = addValues(counterStyleCache.values, node);
- }
- if (fontFace && node.parent.type === rule && /font(|-family)/.test(prop)) {
- fontCache.values = fontCache.values.concat(comma(node.value.toLowerCase()));
- }
- if (keyframes && /animation/.test(prop)) {
- keyframesCache.values = addValues(keyframesCache.values, node);
- }
- return;
- }
- if (type === atrule) {
- if (counterStyle && /counter-style/.test(name)) {
- counterStyleCache.atRules.push(node);
- }
- if (fontFace && name === 'font-face' && node.nodes) {
- fontCache.atRules.push(node);
- }
- if (keyframes && /keyframes/.test(name)) {
- keyframesCache.atRules.push(node);
- }
- if (namespace && name === 'namespace') {
- namespaceCache.atRules.push(node);
- }
- return;
- }
- });
- counterStyle && filterAtRule(counterStyleCache);
- fontFace && filterFont(fontCache);
- keyframes && filterAtRule(keyframesCache);
- namespace && filterNamespace(namespaceCache);
- };
- });
- module.exports = exports['default'];
|