Skip to content

Commit 2a9ac5a

Browse files
authored
Copy rule for declarations after nested rule (#93)
1 parent ac58e03 commit 2a9ac5a

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

index.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,42 @@ function atruleChilds (rule, atrule, bubbling) {
8989
}
9090
}
9191

92+
function pickDeclarations (selector, declarations, after) {
93+
var parent = postcss.rule({
94+
selector: selector,
95+
nodes: []
96+
})
97+
98+
for (var i = 0; i < declarations.length; i++) {
99+
parent.append(declarations[i])
100+
}
101+
102+
after.after(parent)
103+
return parent
104+
}
105+
92106
function processRule (rule, bubble, unwrap, preserveEmpty) {
93107
var unwrapped = false
94108
var after = rule
109+
var copyDeclarations = false
110+
var declarations = []
95111

96112
rule.each(function (child) {
97113
if (child.type === 'rule') {
114+
if (declarations.length) {
115+
after = pickDeclarations(rule.selector, declarations, after)
116+
declarations = []
117+
}
118+
119+
copyDeclarations = true
98120
unwrapped = true
99121
child.selectors = selectors(rule, child)
100122
after = pickComment(child.prev(), after)
101123
after.after(child)
102124
after = child
103125
} else if (child.type === 'atrule') {
126+
copyDeclarations = false
127+
104128
if (child.name === 'at-root') {
105129
unwrapped = true
106130
atruleChilds(rule, child, false)
@@ -129,8 +153,15 @@ function processRule (rule, bubble, unwrap, preserveEmpty) {
129153
after.after(child)
130154
after = child
131155
}
156+
} else if (child.type === 'decl' && copyDeclarations) {
157+
declarations.push(child)
132158
}
133159
})
160+
161+
if (declarations.length) {
162+
after = pickDeclarations(rule.selector, declarations, after)
163+
}
164+
134165
if (unwrapped && preserveEmpty !== true) {
135166
rule.raws.semicolon = true
136167
if (rule.nodes.length === 0) rule.remove()

index.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,13 @@ it('saves order of rules', () => {
186186
)
187187
})
188188

189+
it('copy rule for declarations after nested rule', () => {
190+
return run(
191+
'a { a: 1; &b { b: 2 } c: 1; &c { d: 5 } e: 6 } c { f: 1 }',
192+
'a { a: 1; } ab { b: 2 } a { c: 1; } ac { d: 5 } a { e: 6; } c { f: 1 }'
193+
)
194+
})
195+
189196
it('does not replace ampersand inside string', () => {
190197
return run(
191198
'div { &[data-category="sound & vision"] {} }',

0 commit comments

Comments
 (0)