Skip to content

Commit c94614d

Browse files
committed
Fix insertBefore: use splice instead.
>insertBefore will misreplace `*display:none` with `display:none`
1 parent 2f40244 commit c94614d

File tree

4 files changed

+47
-3
lines changed

4 files changed

+47
-3
lines changed

index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,12 @@ function insertBefore(rule, child) {
196196
}
197197
childNodes.forEach(function (node) {
198198
node.parent = rule.parent
199-
rule.parent.insertBefore(rule, node)
199+
// DO NOT use insertBefore
200+
// declarations like `*display:none` will be transformed to `display:none`
201+
//rule.parent.insertBefore(rule, node)
200202
})
203+
var nodes = rule.parent.nodes
204+
nodes.splice.apply(nodes, [ nodes.indexOf(rule), 0 ].concat(childNodes))
201205
}
202206

203207
function createEmitter() {

test/emitter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ test('emitter', function(t) {
4949
postcssOpts
5050
)
5151
.then(function (result) {
52-
t.equal(result.css, 'a {}\nb {}\nc {}\nf {}\ne {}\nd {}')
52+
t.equal(result.css, 'a {}b {}c {}\nf {}\ne {}\nd {}')
5353
})
5454
.catch(function (err) {
5555
t.error(err)

test/glob.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ test('glob', run.bind(
55
null,
66
{ glob: true },
77
{ file: 'glob_imports/glob.css', source: '@import "*.css";' },
8-
{ source: 'a {}\nb {}\nc {}' }
8+
{ source: 'a {}b {}c {}' }
99
))
1010

test/insertBefore.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
var test = require('tape')
2+
var atImport = require('..')
3+
var postcss = require('postcss')
4+
var path = require('path')
5+
var fixtures = require('./util/fixtures')
6+
7+
var contents = {
8+
d: '@import "e.css";\nie7 { *display: inline; }',
9+
e: '@import "f.css";\nie8 { display: inline\\0; }',
10+
f: '@import "g.css";\nie89 { display: inline\\0/IE8+9; }',
11+
g: 'ie9 { display: inline\\0/IE9; }',
12+
}
13+
14+
var entry = fixtures('emitter.css')
15+
16+
test('insertBefore', function(t) {
17+
var postcssOpts = { from: entry }
18+
return postcss(atImport({
19+
importer: function (url) {
20+
var base = path.basename(url, '.css')
21+
return Promise.resolve({
22+
from: fixtures(url),
23+
source: contents[base],
24+
})
25+
},
26+
}))
27+
.process(
28+
'@import "d.css";\nie6{ _display: inline; }',
29+
postcssOpts
30+
)
31+
.then(function (result) {
32+
var fs = require('fs')
33+
fs.writeFileSync('x.css', result.css)
34+
t.equal(result.css, 'ie9 { display: inline\\0/IE9; }\nie89 { display: inline\\0/IE8+9; }\nie8 { display: inline\\0; }\nie7 { *display: inline; }\nie6{ _display: inline; }')
35+
})
36+
.catch(function (err) {
37+
t.error(err)
38+
})
39+
})
40+

0 commit comments

Comments
 (0)