postcss-minify-selectors
Advanced tools
Comparing version 2.0.5 to 2.0.6
@@ -0,1 +1,8 @@ | ||
# 2.0.6 | ||
* Performance tweaks; now calls `Node#toString()` ~50% less often, removed dead | ||
branches, extracted each node type into a separate transformer function. | ||
* Resolves an issue where extraneous whitespace around a case-insensitive | ||
attribute selector (`[href="foo" i]`) would not be removed. | ||
# 2.0.5 | ||
@@ -2,0 +9,0 @@ |
@@ -7,4 +7,2 @@ 'use strict'; | ||
var _postcss2 = _interopRequireDefault(_postcss); | ||
var _alphanumSort = require('alphanum-sort'); | ||
@@ -14,2 +12,10 @@ | ||
var _has = require('has'); | ||
var _has2 = _interopRequireDefault(_has); | ||
var _postcssSelectorParser = require('postcss-selector-parser'); | ||
var _postcssSelectorParser2 = _interopRequireDefault(_postcssSelectorParser); | ||
var _unquote = require('./lib/unquote'); | ||
@@ -23,6 +29,2 @@ | ||
var _postcssSelectorParser = require('postcss-selector-parser'); | ||
var _postcssSelectorParser2 = _interopRequireDefault(_postcssSelectorParser); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -36,2 +38,67 @@ | ||
function attribute(selector) { | ||
if (selector.value) { | ||
// Join selectors that are split over new lines | ||
selector.value = selector.value.replace(/\\\n/g, '').trim(); | ||
if ((0, _canUnquote2.default)(selector.value)) { | ||
selector.value = (0, _unquote2.default)(selector.value); | ||
} | ||
selector.operator = selector.operator.trim(); | ||
} | ||
if (selector.raws && selector.raws.insensitive) { | ||
selector.raws.insensitive = ''; | ||
} | ||
selector.attribute = selector.attribute.trim(); | ||
} | ||
function combinator(selector) { | ||
var value = selector.value.trim(); | ||
selector.value = value.length ? value : ' '; | ||
} | ||
function pseudo(selector) { | ||
var uniques = []; | ||
selector.walk(function (child) { | ||
if (child.type === 'selector') { | ||
var childStr = String(child); | ||
if (!~uniques.indexOf(childStr)) { | ||
uniques.push(childStr); | ||
} else { | ||
child.remove(); | ||
} | ||
} | ||
}); | ||
if (~pseudoElements.indexOf(selector.value)) { | ||
selector.value = selector.value.slice(1); | ||
} | ||
} | ||
var tagReplacements = { | ||
from: '0%', | ||
'100%': 'to' | ||
}; | ||
function tag(selector) { | ||
var value = selector.value; | ||
if ((0, _has2.default)(tagReplacements, value)) { | ||
selector.value = tagReplacements[value]; | ||
} | ||
} | ||
function universal(selector) { | ||
var next = selector.next(); | ||
if (next && next.type !== 'combinator') { | ||
selector.remove(); | ||
} | ||
} | ||
var reducers = { | ||
attribute: attribute, | ||
combinator: combinator, | ||
pseudo: pseudo, | ||
tag: tag, | ||
universal: universal | ||
}; | ||
function optimise(rule) { | ||
@@ -48,43 +115,13 @@ var selector = rule.raws.selector && rule.raws.selector.raw || rule.selector; | ||
selectors.walk(function (sel) { | ||
var toString = String(sel); | ||
var type = sel.type; | ||
// Trim whitespace around the value | ||
sel.spaces.before = sel.spaces.after = ''; | ||
if (sel.type === 'attribute') { | ||
if (sel.value) { | ||
// Join selectors that are split over new lines | ||
sel.value = sel.value.replace(/\\\n/g, '').trim(); | ||
if ((0, _canUnquote2.default)(sel.value)) { | ||
sel.value = (0, _unquote2.default)(sel.value); | ||
} | ||
sel.operator = sel.operator.trim(); | ||
} | ||
if (sel.raw) { | ||
sel.raw.insensitive = ''; | ||
} | ||
sel.attribute = sel.attribute.trim(); | ||
if ((0, _has2.default)(reducers, type)) { | ||
reducers[type](sel); | ||
return; | ||
} | ||
if (sel.type === 'combinator') { | ||
var value = sel.value.trim(); | ||
sel.value = value.length ? value : ' '; | ||
} | ||
if (sel.type === 'pseudo') { | ||
(function () { | ||
var uniques = []; | ||
sel.walk(function (child) { | ||
if (child.type === 'selector') { | ||
var childStr = String(child); | ||
if (! ~uniques.indexOf(childStr)) { | ||
uniques.push(childStr); | ||
} else { | ||
child.remove(); | ||
} | ||
} | ||
}); | ||
if (~pseudoElements.indexOf(sel.value)) { | ||
sel.value = sel.value.slice(1); | ||
} | ||
})(); | ||
} | ||
if (sel.type === 'selector' && sel.parent.type !== 'pseudo') { | ||
if (! ~uniqueSelectors.indexOf(toString)) { | ||
var toString = String(sel); | ||
if (type === 'selector' && sel.parent.type !== 'pseudo') { | ||
if (!~uniqueSelectors.indexOf(toString)) { | ||
uniqueSelectors.push(toString); | ||
@@ -95,15 +132,2 @@ } else { | ||
} | ||
if (sel.type === 'tag') { | ||
if (sel.value === 'from') { | ||
sel.value = '0%'; | ||
} else if (sel.value === '100%') { | ||
sel.value = 'to'; | ||
} | ||
} | ||
if (sel.type === 'universal') { | ||
var next = sel.next(); | ||
if (next && next.type !== 'combinator') { | ||
sel.remove(); | ||
} | ||
} | ||
}); | ||
@@ -113,3 +137,3 @@ }); | ||
exports.default = _postcss2.default.plugin('postcss-minify-selectors', function () { | ||
exports.default = (0, _postcss.plugin)('postcss-minify-selectors', function () { | ||
return function (css) { | ||
@@ -116,0 +140,0 @@ return css.walkRules(optimise); |
@@ -25,8 +25,5 @@ 'use strict'; | ||
} | ||
if (value) { | ||
value = value.replace(escapes, 'a').replace(/\\./g, 'a'); | ||
return !(range.test(value) || /^(?:-?\d|--)/.test(value)); | ||
} | ||
return false; | ||
value = value.replace(escapes, 'a').replace(/\\./g, 'a'); | ||
return !(range.test(value) || /^(?:-?\d|--)/.test(value)); | ||
} | ||
module.exports = exports['default']; |
{ | ||
"name": "postcss-minify-selectors", | ||
"version": "2.0.5", | ||
"version": "2.0.6", | ||
"description": "Minify selectors with PostCSS.", | ||
@@ -13,3 +13,5 @@ "main": "dist/index.js", | ||
"prepublish": "del-cli dist && BABEL_ENV=publish babel src --out-dir dist --ignore /__tests__/", | ||
"test": "ava src/__tests__" | ||
"report": "nyc report --reporter=html", | ||
"test": "nyc ava", | ||
"test-012": "nyc ava" | ||
}, | ||
@@ -26,12 +28,16 @@ "keywords": [ | ||
"devDependencies": { | ||
"ava": "^0.14.0", | ||
"babel-cli": "^6.5.1", | ||
"babel-core": "^6.5.1", | ||
"babel-plugin-add-module-exports": "^0.1.2", | ||
"babel-preset-es2015": "^6.5.0", | ||
"ava": "^0.16.0", | ||
"babel-cli": "^6.3.17", | ||
"babel-core": "^6.3.26", | ||
"babel-plugin-add-module-exports": "^0.2.1", | ||
"babel-preset-es2015": "^6.3.13", | ||
"babel-preset-es2015-loose": "^7.0.0", | ||
"babel-preset-stage-0": "^6.5.0", | ||
"babel-preset-stage-0": "^6.3.13", | ||
"babel-register": "^6.9.0", | ||
"del-cli": "^0.2.0", | ||
"eslint": "^2.0.0", | ||
"eslint-config-cssnano": "^2.0.0", | ||
"eslint": "^3.0.0", | ||
"eslint-config-cssnano": "^3.0.0", | ||
"eslint-plugin-babel": "^3.3.0", | ||
"eslint-plugin-import": "^2.0.1", | ||
"nyc": "^8.4.0", | ||
"postcss-font-magician": "^1.4.0" | ||
@@ -48,2 +54,3 @@ }, | ||
"alphanum-sort": "^1.0.2", | ||
"has": "^1.0.1", | ||
"postcss": "^5.0.14", | ||
@@ -56,4 +63,4 @@ "postcss-selector-parser": "^2.0.0" | ||
"ava": { | ||
"require": "babel-core/register" | ||
"require": "babel-register" | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
10701
135
4
15
+ Addedhas@^1.0.1
+ Addedhas@1.0.4(transitive)