stylehacks 4.0.0-rc.2 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var FF_2 = exports.FF_2 = 'firefox 2';
7
- var IE_5_5 = exports.IE_5_5 = 'ie 5.5';
8
- var IE_6 = exports.IE_6 = 'ie 6';
9
- var IE_7 = exports.IE_7 = 'ie 7';
10
- var IE_8 = exports.IE_8 = 'ie 8';
11
- var OP_9 = exports.OP_9 = 'opera 9';
6
+ const FF_2 = exports.FF_2 = 'firefox 2';
7
+ const IE_5_5 = exports.IE_5_5 = 'ie 5.5';
8
+ const IE_6 = exports.IE_6 = 'ie 6';
9
+ const IE_7 = exports.IE_7 = 'ie 7';
10
+ const IE_8 = exports.IE_8 = 'ie 8';
11
+ const OP_9 = exports.OP_9 = 'opera 9';
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var MEDIA_QUERY = exports.MEDIA_QUERY = 'media query';
7
- var PROPERTY = exports.PROPERTY = 'property';
8
- var SELECTOR = exports.SELECTOR = 'selector';
9
- var VALUE = exports.VALUE = 'value';
6
+ const MEDIA_QUERY = exports.MEDIA_QUERY = 'media query';
7
+ const PROPERTY = exports.PROPERTY = 'property';
8
+ const SELECTOR = exports.SELECTOR = 'selector';
9
+ const VALUE = exports.VALUE = 'value';
@@ -3,6 +3,6 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var ATRULE = exports.ATRULE = 'atrule';
7
- var DECL = exports.DECL = 'decl';
8
- var RULE = exports.RULE = 'rule';
6
+ const ATRULE = exports.ATRULE = 'atrule';
7
+ const DECL = exports.DECL = 'decl';
8
+ const RULE = exports.RULE = 'rule';
@@ -3,5 +3,5 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var BODY = exports.BODY = 'body';
7
- var HTML = exports.HTML = 'html';
6
+ const BODY = exports.BODY = 'body';
7
+ const HTML = exports.HTML = 'html';
package/dist/exists.js CHANGED
@@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = exists;
7
7
  function exists(selector, index, value) {
8
- var node = selector.at(index);
9
- return node && node.value === value;
8
+ const node = selector.at(index);
9
+
10
+ return node && node.value && node.value.toLowerCase() === value;
10
11
  }
11
12
  module.exports = exports["default"];
package/dist/index.js CHANGED
@@ -18,47 +18,47 @@ var _plugins2 = _interopRequireDefault(_plugins);
18
18
 
19
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
20
 
21
- function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
22
-
23
- var stylehacks = _postcss2.default.plugin('stylehacks', function () {
24
- var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
25
-
26
- return function (css, result) {
27
- var resultOpts = result.opts || {};
28
- var browsers = (0, _browserslist2.default)(null, {
21
+ const stylehacks = _postcss2.default.plugin('stylehacks', (opts = {}) => {
22
+ return (css, result) => {
23
+ const resultOpts = result.opts || {};
24
+ const browsers = (0, _browserslist2.default)(null, {
29
25
  stats: resultOpts.stats,
30
26
  path: __dirname,
31
27
  env: resultOpts.env
32
28
  });
33
- var processors = _plugins2.default.reduce(function (list, Plugin) {
34
- var hack = new Plugin(result);
35
- var applied = browsers.some(function (browser) {
36
- return hack.targets.some(function (target) {
37
- return browser === target;
38
- });
29
+ const processors = _plugins2.default.reduce((list, Plugin) => {
30
+ const hack = new Plugin(result);
31
+ const applied = browsers.some(browser => {
32
+ return hack.targets.some(target => browser === target);
39
33
  });
34
+
40
35
  if (applied) {
41
36
  return list;
42
37
  }
43
- return [].concat(_toConsumableArray(list), [hack]);
38
+
39
+ return [...list, hack];
44
40
  }, []);
45
- css.walk(function (node) {
46
- processors.forEach(function (proc) {
41
+
42
+ css.walk(node => {
43
+ processors.forEach(proc => {
47
44
  if (!~proc.nodeTypes.indexOf(node.type)) {
48
45
  return;
49
46
  }
47
+
50
48
  if (opts.lint) {
51
49
  return proc.detectAndWarn(node);
52
50
  }
51
+
53
52
  return proc.detectAndResolve(node);
54
53
  });
55
54
  });
56
55
  };
57
56
  });
58
57
 
59
- stylehacks.detect = function (node) {
60
- return _plugins2.default.some(function (Plugin) {
61
- var hack = new Plugin();
58
+ stylehacks.detect = node => {
59
+ return _plugins2.default.some(Plugin => {
60
+ const hack = new Plugin();
61
+
62
62
  return hack.any(node);
63
63
  });
64
64
  };
package/dist/isMixin.js CHANGED
@@ -5,12 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = isMixin;
7
7
  function isMixin(node) {
8
- var selector = node.selector;
9
- // If the selector ends with a ':' it is likely a part of a custom mixin.
8
+ const { selector } = node;
10
9
 
10
+ // If the selector ends with a ':' it is likely a part of a custom mixin.
11
11
  if (!selector || selector[selector.length - 1] === ':') {
12
12
  return true;
13
13
  }
14
+
14
15
  return false;
15
16
  }
16
17
  module.exports = exports['default'];
package/dist/plugin.js CHANGED
@@ -3,92 +3,63 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
-
7
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
-
9
6
  exports.default = plugin;
10
-
11
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12
-
13
7
  function plugin(targets, nodeTypes, detect) {
14
- var Plugin = function () {
15
- function Plugin(result) {
16
- _classCallCheck(this, Plugin);
17
-
8
+ class Plugin {
9
+ constructor(result) {
18
10
  this.nodes = [];
19
11
  this.result = result;
20
12
  this.targets = targets;
21
13
  this.nodeTypes = nodeTypes;
22
14
  }
23
15
 
24
- _createClass(Plugin, [{
25
- key: "push",
26
- value: function push(node, metadata) {
27
- node._stylehacks = Object.assign({}, metadata, {
28
- message: `Bad ${metadata.identifier}: ${metadata.hack}`,
29
- browsers: this.targets
30
- });
31
- this.nodes.push(node);
32
- }
33
- }, {
34
- key: "any",
35
- value: function any(node) {
36
- if (~this.nodeTypes.indexOf(node.type)) {
37
- detect.apply(this, arguments);
38
- return !!node._stylehacks;
39
- }
40
- return false;
41
- }
42
- }, {
43
- key: "detectAndResolve",
44
- value: function detectAndResolve() {
45
- this.nodes = [];
16
+ push(node, metadata) {
17
+ node._stylehacks = Object.assign({}, metadata, {
18
+ message: `Bad ${metadata.identifier}: ${metadata.hack}`,
19
+ browsers: this.targets
20
+ });
46
21
 
47
- for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
48
- args[_key] = arguments[_key];
49
- }
22
+ this.nodes.push(node);
23
+ }
24
+
25
+ any(node) {
26
+ if (~this.nodeTypes.indexOf(node.type)) {
27
+ detect.apply(this, arguments);
50
28
 
51
- detect.apply(this, args);
52
- return this.resolve();
29
+ return !!node._stylehacks;
53
30
  }
54
- }, {
55
- key: "detectAndWarn",
56
- value: function detectAndWarn() {
57
- this.nodes = [];
58
31
 
59
- for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
60
- args[_key2] = arguments[_key2];
61
- }
32
+ return false;
33
+ }
62
34
 
63
- detect.apply(this, args);
64
- return this.warn();
65
- }
66
- }, {
67
- key: "resolve",
68
- value: function resolve() {
69
- return this.nodes.forEach(function (node) {
70
- return node.remove();
71
- });
72
- }
73
- }, {
74
- key: "warn",
75
- value: function warn() {
76
- var _this = this;
77
-
78
- return this.nodes.forEach(function (node) {
79
- var _node$_stylehacks = node._stylehacks,
80
- message = _node$_stylehacks.message,
81
- browsers = _node$_stylehacks.browsers,
82
- identifier = _node$_stylehacks.identifier,
83
- hack = _node$_stylehacks.hack;
84
-
85
- return node.warn(_this.result, message, { browsers, identifier, hack });
86
- });
87
- }
88
- }]);
35
+ detectAndResolve(...args) {
36
+ this.nodes = [];
37
+
38
+ detect.apply(this, args);
39
+
40
+ return this.resolve();
41
+ }
42
+
43
+ detectAndWarn(...args) {
44
+ this.nodes = [];
45
+
46
+ detect.apply(this, args);
89
47
 
90
- return Plugin;
91
- }();
48
+ return this.warn();
49
+ }
50
+
51
+ resolve() {
52
+ return this.nodes.forEach(node => node.remove());
53
+ }
54
+
55
+ warn() {
56
+ return this.nodes.forEach(node => {
57
+ const { message, browsers, identifier, hack } = node._stylehacks;
58
+
59
+ return node.warn(this.result, message, { browsers, identifier, hack });
60
+ });
61
+ }
62
+ }
92
63
 
93
64
  return Plugin;
94
65
  }
@@ -31,8 +31,8 @@ var _tags = require('../dictionary/tags');
31
31
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
32
 
33
33
  function analyse(ctx, rule) {
34
- return function (selectors) {
35
- selectors.each(function (selector) {
34
+ return selectors => {
35
+ selectors.each(selector => {
36
36
  if ((0, _exists2.default)(selector, 0, _tags.BODY) && (0, _exists2.default)(selector, 1, ':empty') && (0, _exists2.default)(selector, 2, ' ') && selector.at(3)) {
37
37
  ctx.push(rule, {
38
38
  identifier: _identifiers.SELECTOR,
@@ -31,8 +31,8 @@ var _tags = require('../dictionary/tags');
31
31
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
32
 
33
33
  function analyse(ctx, rule) {
34
- return function (selectors) {
35
- selectors.each(function (selector) {
34
+ return selectors => {
35
+ selectors.each(selector => {
36
36
  if ((0, _exists2.default)(selector, 0, _tags.HTML) && ((0, _exists2.default)(selector, 1, '>') || (0, _exists2.default)(selector, 1, '~')) && selector.at(2) && selector.at(2).type === 'comment' && (0, _exists2.default)(selector, 3, ' ') && (0, _exists2.default)(selector, 4, _tags.BODY) && (0, _exists2.default)(selector, 5, ' ') && selector.at(6)) {
37
37
  ctx.push(rule, {
38
38
  identifier: _identifiers.SELECTOR,
@@ -31,8 +31,8 @@ var _tags = require('../dictionary/tags');
31
31
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
32
 
33
33
  function analyse(ctx, rule) {
34
- return function (selectors) {
35
- selectors.each(function (selector) {
34
+ return selectors => {
35
+ selectors.each(selector => {
36
36
  if ((0, _exists2.default)(selector, 0, _tags.HTML) && (0, _exists2.default)(selector, 1, ':first-child') && (0, _exists2.default)(selector, 2, ' ') && selector.at(3)) {
37
37
  ctx.push(rule, {
38
38
  identifier: _identifiers.SELECTOR,
@@ -15,9 +15,9 @@ var _postcss = require('../dictionary/postcss');
15
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
16
 
17
17
  exports.default = (0, _plugin2.default)([_browsers.IE_5_5, _browsers.IE_6, _browsers.IE_7], [_postcss.DECL], function (decl) {
18
- var match = decl.value.match(/!\w/);
18
+ const match = decl.value.match(/!\w/);
19
19
  if (match) {
20
- var hack = decl.value.substr(match.index, decl.value.length - 1);
20
+ const hack = decl.value.substr(match.index, decl.value.length - 1);
21
21
  this.push(decl, {
22
22
  identifier: '!important',
23
23
  hack
@@ -16,31 +16,28 @@ var _postcss = require('../dictionary/postcss');
16
16
 
17
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
18
 
19
- var hacks = '!_$_&_*_)_=_%_+_,_._/_`_]_#_~_?_:_|'.split('_');
19
+ const hacks = '!_$_&_*_)_=_%_+_,_._/_`_]_#_~_?_:_|'.split('_');
20
20
 
21
21
  exports.default = (0, _plugin2.default)([_browsers.IE_5_5, _browsers.IE_6, _browsers.IE_7], [_postcss.ATRULE, _postcss.DECL], function (node) {
22
- var _this = this;
23
-
24
22
  if (node.type === _postcss.DECL) {
25
23
  // some values are not picked up by before, so ensure they are
26
24
  // at the beginning of the value
27
- hacks.some(function (hack) {
25
+ hacks.some(hack => {
28
26
  if (!node.prop.indexOf(hack)) {
29
- _this.push(node, {
27
+ this.push(node, {
30
28
  identifier: _identifiers.PROPERTY,
31
29
  hack: node.prop
32
30
  });
33
31
  return true;
34
32
  }
35
33
  });
36
- var before = node.raws.before;
37
-
34
+ let { before } = node.raws;
38
35
  if (!before) {
39
36
  return;
40
37
  }
41
- hacks.some(function (hack) {
38
+ hacks.some(hack => {
42
39
  if (~before.indexOf(hack)) {
43
- _this.push(node, {
40
+ this.push(node, {
44
41
  identifier: _identifiers.PROPERTY,
45
42
  hack: `${before.trim()}${node.prop}`
46
43
  });
@@ -49,9 +46,8 @@ exports.default = (0, _plugin2.default)([_browsers.IE_5_5, _browsers.IE_6, _brow
49
46
  });
50
47
  } else {
51
48
  // test for the @property: value; hack
52
- var name = node.name;
53
-
54
- var len = name.length - 1;
49
+ let { name } = node;
50
+ let len = name.length - 1;
55
51
  if (name.lastIndexOf(':') === len) {
56
52
  this.push(node, {
57
53
  identifier: _identifiers.PROPERTY,
@@ -21,7 +21,7 @@ var _postcss3 = require('../dictionary/postcss');
21
21
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
22
 
23
23
  exports.default = (0, _plugin2.default)([_browsers.IE_6], [_postcss3.DECL], function (decl) {
24
- var before = decl.raws.before;
24
+ const { before } = decl.raws;
25
25
 
26
26
  if (before && ~before.indexOf('_')) {
27
27
  this.push(decl, {
@@ -29,6 +29,7 @@ exports.default = (0, _plugin2.default)([_browsers.IE_6], [_postcss3.DECL], func
29
29
  hack: `${before.trim()}${decl.prop}`
30
30
  });
31
31
  }
32
+
32
33
  if (decl.prop[0] === '-' && decl.prop[1] !== '-' && _postcss2.default.vendor.prefix(decl.prop) === '') {
33
34
  this.push(decl, {
34
35
  identifier: _identifiers.PROPERTY,
@@ -17,8 +17,9 @@ var _postcss = require('../dictionary/postcss');
17
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
18
 
19
19
  exports.default = (0, _plugin2.default)([_browsers.IE_8], [_postcss.ATRULE], function (rule) {
20
- var params = rule.params.trim();
21
- if (params === '\\0screen') {
20
+ const params = rule.params.trim();
21
+
22
+ if (params.toLowerCase() === '\\0screen') {
22
23
  this.push(rule, {
23
24
  identifier: _identifiers.MEDIA_QUERY,
24
25
  hack: params
@@ -17,8 +17,9 @@ var _postcss = require('../dictionary/postcss');
17
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
18
 
19
19
  exports.default = (0, _plugin2.default)([_browsers.IE_5_5, _browsers.IE_6, _browsers.IE_7, _browsers.IE_8], [_postcss.ATRULE], function (rule) {
20
- var params = rule.params.trim();
21
- if (params === '\\0screen\\,screen\\9') {
20
+ const params = rule.params.trim();
21
+
22
+ if (params.toLowerCase() === '\\0screen\\,screen\\9') {
22
23
  this.push(rule, {
23
24
  identifier: _identifiers.MEDIA_QUERY,
24
25
  hack: params
@@ -17,8 +17,9 @@ var _postcss = require('../dictionary/postcss');
17
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
18
 
19
19
  exports.default = (0, _plugin2.default)([_browsers.IE_5_5, _browsers.IE_6, _browsers.IE_7], [_postcss.ATRULE], function (rule) {
20
- var params = rule.params.trim();
21
- if (params === 'screen\\9') {
20
+ const params = rule.params.trim();
21
+
22
+ if (params.toLowerCase() === 'screen\\9') {
22
23
  this.push(rule, {
23
24
  identifier: _identifiers.MEDIA_QUERY,
24
25
  hack: params
@@ -17,7 +17,7 @@ var _postcss = require('../dictionary/postcss');
17
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
18
 
19
19
  exports.default = (0, _plugin2.default)([_browsers.IE_6, _browsers.IE_7, _browsers.IE_8], [_postcss.DECL], function (decl) {
20
- var v = decl.value;
20
+ let v = decl.value;
21
21
  if (v && v.length > 2 && v.indexOf('\\9') === v.length - 2) {
22
22
  this.push(decl, {
23
23
  identifier: _identifiers.VALUE,
@@ -31,8 +31,8 @@ var _tags = require('../dictionary/tags');
31
31
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
32
 
33
33
  function analyse(ctx, rule) {
34
- return function (selectors) {
35
- selectors.each(function (selector) {
34
+ return selectors => {
35
+ selectors.each(selector => {
36
36
  if ((0, _exists2.default)(selector, 0, '*') && (0, _exists2.default)(selector, 1, ' ') && (0, _exists2.default)(selector, 2, _tags.HTML) && (0, _exists2.default)(selector, 3, ' ') && selector.at(4)) {
37
37
  ctx.push(rule, {
38
38
  identifier: _identifiers.SELECTOR,
@@ -47,6 +47,7 @@ exports.default = (0, _plugin2.default)([_browsers.IE_5_5, _browsers.IE_6], [_po
47
47
  if ((0, _isMixin2.default)(rule)) {
48
48
  return;
49
49
  }
50
+
50
51
  (0, _postcssSelectorParser2.default)(analyse(this, rule)).processSync(rule.selector);
51
52
  });
52
53
  module.exports = exports['default'];
@@ -24,9 +24,10 @@ exports.default = (0, _plugin2.default)([_browsers.IE_5_5, _browsers.IE_6, _brow
24
24
  if ((0, _isMixin2.default)(rule)) {
25
25
  return;
26
26
  }
27
- var selector = rule.selector;
28
27
 
29
- var trim = selector.trim();
28
+ const { selector } = rule;
29
+ const trim = selector.trim();
30
+
30
31
  if (trim.lastIndexOf(',') === selector.length - 1 || trim.lastIndexOf('\\') === selector.length - 1) {
31
32
  this.push(rule, {
32
33
  identifier: _identifiers.SELECTOR,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stylehacks",
3
- "version": "4.0.0-rc.2",
3
+ "version": "4.0.3",
4
4
  "description": "Detect/remove browser hacks from CSS files.",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -23,24 +23,24 @@
23
23
  "license": "MIT",
24
24
  "devDependencies": {
25
25
  "babel-cli": "^6.0.0",
26
- "cross-env": "^3.0.0"
26
+ "cross-env": "^5.0.0"
27
27
  },
28
- "homepage": "https://github.com/ben-eb/cssnano",
28
+ "homepage": "https://github.com/cssnano/cssnano",
29
29
  "author": {
30
30
  "name": "Ben Briggs",
31
31
  "email": "beneb.info@gmail.com",
32
32
  "url": "http://beneb.info"
33
33
  },
34
- "repository": "ben-eb/cssnano",
34
+ "repository": "cssnano/cssnano",
35
35
  "dependencies": {
36
- "browserslist": "^2.0.0",
37
- "postcss": "^6.0.0",
38
- "postcss-selector-parser": "^3.0.0-rc.0"
36
+ "browserslist": "^4.0.0",
37
+ "postcss": "^7.0.0",
38
+ "postcss-selector-parser": "^3.0.0"
39
39
  },
40
40
  "bugs": {
41
- "url": "https://github.com/ben-eb/cssnano/issues"
41
+ "url": "https://github.com/cssnano/cssnano/issues"
42
42
  },
43
43
  "engines": {
44
- "node": ">=4"
44
+ "node": ">=6.9.0"
45
45
  }
46
46
  }
package/CHANGELOG.md DELETED
@@ -1,56 +0,0 @@
1
- # 4.0.0-rc.0
2
-
3
- * Breaking: Drops support for Node 0.12, we now require at least Node 4.
4
- * Breaking: Update PostCSS to 6.0.0.
5
- * Breaking: Removes the browsers option, as it has been superseded by using
6
- Browserslist to supply a list of browsers; we recommend using the config file
7
- as the same values will be propagated to other cssnano plugins which have the
8
- same functionality. See https://github.com/ai/browserslist#config-file
9
- for more details.
10
- * Breaking: Removes the `silent` option & logger; now stylehacks will add the
11
- warnings to `Result#messages`. If you would like logging this can be handled
12
- in your PostCSS runner.
13
- * Breaking: Removes the CLI from stylehacks. We recommend using a PostCSS
14
- runner instead as it's easier to add stylehacks into an existing setup rather
15
- than using a separate command.
16
-
17
- # 2.3.2
18
-
19
- * Resolves an issue where stylehacks would crash on CSS mixins.
20
-
21
- # 2.3.1
22
-
23
- * Upgraded postcss-selector-parser to `v2.0.0`.
24
- * Fixed an issue where stylehacks was not removing `*zoom: 1` from rules
25
- generated by other PostCSS plugins.
26
-
27
- # 2.3.0
28
-
29
- * Each warning now contains more information about the hack; what identifier
30
- it targets, what the hack is, and the browsers that it affects. E.g:
31
-
32
- ```js
33
- {
34
- browsers: [ 'ie 6', 'ie 5.5' ],
35
- identifier: 'selector',
36
- hack: '* html h1'
37
- }
38
- ```
39
-
40
- # 2.2.0
41
-
42
- * Added `value\9` hack.
43
-
44
- # 2.1.0
45
-
46
- * Added `html ~ /**/ body .selector` hack.
47
- * Added a method to detect if a PostCSS node has any hacks.
48
-
49
- # 2.0.0
50
-
51
- * Added `body:empty` & `html:first-child` hacks.
52
- * Upgraded to PostCSS 5.
53
-
54
- # 1.0.0
55
-
56
- * Initial release.