Skip to content

Commit bb88bcd

Browse files
committed
API tests and at-nest fix
1 parent 24fea07 commit bb88bcd

File tree

7 files changed

+136
-47
lines changed

7 files changed

+136
-47
lines changed

index.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
module.exports = function resolveNestedSelector(selector, node) {
22
var parent = node.parent;
3+
var parentIsNestAtRule = parent.type === 'atrule' && parent.name === 'nest';
4+
35
if (parent.type === 'root') return [selector];
4-
if (parent.type !== 'rule') return resolveNestedSelector(selector, parent);
6+
if (parent.type !== 'rule' && !parentIsNestAtRule) return resolveNestedSelector(selector, parent);
7+
8+
var parentSelectors = (parentIsNestAtRule)
9+
? parent.params.split(',').map(function(s) { return s.trim(); })
10+
: parent.selectors;
511

6-
var resolvedSelectors = parent.selectors.reduce(function(result, parentSelector) {
12+
var resolvedSelectors = parentSelectors.reduce(function(result, parentSelector) {
713
if (selector.indexOf('&') !== -1) {
814
var newlyResolvedSelectors = resolveNestedSelector(parentSelector, parent).map(function(resolvedParentSelector) {
915
return selector.replace(/&/g, resolvedParentSelector);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "postcss-resolve-nested-selector",
3-
"version": "0.1.0",
3+
"version": "0.1.1",
44
"description": "Resolve a nested selector in a PostCSS AST",
55
"main": "index.js",
66
"scripts": {

test/api-test.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import test from 'ava';
2+
import resolveNestedSelector from '..';
3+
import util from './util';
4+
5+
test(async t => {
6+
const code = `a { b { top: 0; c { d {}}}}`;
7+
t.same(
8+
await util.resolveChosenSelector(code, 'd'),
9+
['a b c d'],
10+
);
11+
});
12+
13+
test(async t => {
14+
const code = `.foo { .bar &, a {}}`;
15+
t.same(
16+
await util.resolveChosenSelector(code, '.bar &'),
17+
['.bar .foo'],
18+
);
19+
});
20+
21+
test(async t => {
22+
const code = `.foo { .bar &, a, & + &:hover { b {}}}`;
23+
t.same(
24+
await util.resolveChosenSelector(code, 'b'),
25+
['.bar .foo b', '.foo + .foo:hover b', '.foo a b'],
26+
);
27+
});
28+
29+
test(async t => {
30+
const code = `.foo { @nest .bar &, & + &:hover { b {}}}`;
31+
t.same(
32+
await util.resolveChosenSelector(code, 'b'),
33+
['.bar .foo b', '.foo + .foo:hover b'],
34+
);
35+
});
36+
37+
test(async t => {
38+
const code = `.foo { .bar &, & + &:hover { c > & {}}}`;
39+
t.same(
40+
await util.resolveChosenSelector(code, 'c > &'),
41+
['c > .bar .foo', 'c > .foo + .foo:hover'],
42+
);
43+
});
44+
45+
test(async t => {
46+
const code = `.foo { @nest .bar &, & + &:hover { @nest c > & {}}}`;
47+
t.same(
48+
await util.resolveChosenSelector(code, 'c > &'),
49+
['c > .bar .foo', 'c > .foo + .foo:hover'],
50+
);
51+
});
52+
53+
test(async t => {
54+
const code = `.foo { &:hover, &_bar { > b {}}}`;
55+
t.same(
56+
await util.resolveChosenSelector(code, '> b'),
57+
['.foo:hover > b', '.foo_bar > b'],
58+
);
59+
});

test/postcss-nested-test.js

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ test('postcss-nested unwraps rule inside rule', async t => {
77
const code = 'a { a: 1 } a { a: 1; b { b: 2; c { c: 3 } } }';
88
t.same(
99
await util.postcssNestedResolve(code),
10-
await util.expected(code),
10+
await util.allExpected(code),
1111
);
1212
t.same(
13-
await util.expected(code),
13+
await util.allExpected(code),
1414
['a', 'a', 'a b', 'a b c'],
1515
);
1616
});
@@ -19,10 +19,10 @@ test('postcss-nested cleans rules after unwrap', async t => {
1919
const code = 'a { b .one {} b .two {} }';
2020
t.same(
2121
await util.postcssNestedResolve(code),
22-
await util.expected(code),
22+
await util.allExpected(code),
2323
);
2424
t.same(
25-
await util.expected(code),
25+
await util.allExpected(code),
2626
['a b .one', 'a b .two'],
2727
);
2828
});
@@ -31,10 +31,10 @@ test('postcss-nested replaces ampersand', async t => {
3131
const code = 'a { body &:hover b {} }';
3232
t.same(
3333
await util.postcssNestedResolve(code),
34-
await util.expected(code),
34+
await util.allExpected(code),
3535
);
3636
t.same(
37-
await util.expected(code),
37+
await util.allExpected(code),
3838
['body a:hover b'],
3939
);
4040
});
@@ -43,10 +43,10 @@ test('postcss-nested replaces ampersands', async t => {
4343
const code = 'a { &:hover, &:active {} }';
4444
t.same(
4545
await util.postcssNestedResolve(code),
46-
await util.expected(code),
46+
await util.allExpected(code),
4747
);
4848
t.same(
49-
await util.expected(code),
49+
await util.allExpected(code),
5050
['a:active', 'a:hover'],
5151
);
5252
});
@@ -55,10 +55,10 @@ test('postcss-nested replaces ampersand in string', async t => {
5555
const code = '.block { &_elem {} }';
5656
t.same(
5757
await util.postcssNestedResolve(code),
58-
await util.expected(code),
58+
await util.allExpected(code),
5959
);
6060
t.same(
61-
await util.expected(code),
61+
await util.allExpected(code),
6262
['.block_elem'],
6363
);
6464
});
@@ -67,10 +67,10 @@ test('postcss-nested unwrap rules inside at-rules', async t => {
6767
const code = '@media (max-width: 500px) { a { b {} } }';
6868
t.same(
6969
await util.postcssNestedResolve(code),
70-
await util.expected(code),
70+
await util.allExpected(code),
7171
);
7272
t.same(
73-
await util.expected(code),
73+
await util.allExpected(code),
7474
['a b'],
7575
);
7676
});
@@ -79,10 +79,10 @@ test('postcss-nested unwraps at-rule', async t => {
7979
const code = 'a { b { @media screen { width: auto } } }';
8080
t.same(
8181
await util.postcssNestedResolve(code),
82-
await util.expected(code),
82+
await util.allExpected(code),
8383
);
8484
t.same(
85-
await util.expected(code),
85+
await util.allExpected(code),
8686
['a b'],
8787
);
8888
});
@@ -91,10 +91,10 @@ test('postcss-nested unwraps at-rule with rules', async t => {
9191
const code = 'a { @media screen { b { color: black } } }';
9292
t.same(
9393
await util.postcssNestedResolve(code),
94-
await util.expected(code),
94+
await util.allExpected(code),
9595
);
9696
t.same(
97-
await util.expected(code),
97+
await util.allExpected(code),
9898
['a b'],
9999
);
100100
});
@@ -103,10 +103,10 @@ test('postcss-nested unwraps at-rules', async t => {
103103
const code = 'a { a: 1 } a { @media screen { @supports (a: 1) { a: 1 } } }';
104104
t.same(
105105
await util.postcssNestedResolve(code),
106-
await util.expected(code),
106+
await util.allExpected(code),
107107
);
108108
t.same(
109-
await util.expected(code),
109+
await util.allExpected(code),
110110
['a', 'a'],
111111
);
112112
});
@@ -115,10 +115,10 @@ test('postcss-nested processes comma', async t => {
115115
const code = '.one, .two { a {} }';
116116
t.same(
117117
await util.postcssNestedResolve(code),
118-
await util.expected(code),
118+
await util.allExpected(code),
119119
);
120120
t.same(
121-
await util.expected(code),
121+
await util.allExpected(code),
122122
['.one a', '.two a'],
123123
);
124124
});
@@ -127,10 +127,10 @@ test('postcss-nested processes comma with ampersand', async t => {
127127
const code = '.one, .two { &:hover {} }';
128128
t.same(
129129
await util.postcssNestedResolve(code),
130-
await util.expected(code),
130+
await util.allExpected(code),
131131
);
132132
t.same(
133-
await util.expected(code),
133+
await util.allExpected(code),
134134
['.one:hover', '.two:hover'],
135135
);
136136
});
@@ -139,10 +139,10 @@ test('postcss-nested processes comma inside', async t => {
139139
const code = 'a, b { .one, .two {} }';
140140
t.same(
141141
await util.postcssNestedResolve(code),
142-
await util.expected(code),
142+
await util.allExpected(code),
143143
);
144144
t.same(
145-
await util.expected(code),
145+
await util.allExpected(code),
146146
['a .one', 'a .two', 'b .one', 'b .two'],
147147
);
148148
});
@@ -151,10 +151,10 @@ test('postcss-nested moves comment with rule', async t => {
151151
const code = 'a {\n /*B*/\n b {}\n}';
152152
t.same(
153153
await util.postcssNestedResolve(code),
154-
await util.expected(code),
154+
await util.allExpected(code),
155155
);
156156
t.same(
157-
await util.expected(code),
157+
await util.allExpected(code),
158158
['a b'],
159159
);
160160
});
@@ -163,10 +163,10 @@ test('postcss-nested moves comment with at-rule', async t => {
163163
const code = 'a {\n /*B*/\n @media {\n one: 1\n }\n}';
164164
t.same(
165165
await util.postcssNestedResolve(code),
166-
await util.expected(code),
166+
await util.allExpected(code),
167167
);
168168
t.same(
169-
await util.expected(code),
169+
await util.allExpected(code),
170170
['a'],
171171
);
172172
});
@@ -175,10 +175,10 @@ test('postcss-nested moves comment with declaration', async t => {
175175
const code = 'a {\n @media {\n /*B*/\n one: 1\n }\n}';
176176
t.same(
177177
await util.postcssNestedResolve(code),
178-
await util.expected(code),
178+
await util.allExpected(code),
179179
);
180180
t.same(
181-
await util.expected(code),
181+
await util.allExpected(code),
182182
['a'],
183183
);
184184
});

test/postcss-nesting-test.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ test('postcss-nesting Test Case 1', async t => {
1313
}`;
1414
t.same(
1515
await util.postcssNestingResolve(code),
16-
await util.expected(code),
16+
await util.allExpected(code),
1717
);
1818
t.same(
19-
await util.expected(code),
19+
await util.allExpected(code),
2020
['a', 'a c', 'a d', 'b', 'b c', 'b d'],
2121
);
2222
});
@@ -36,10 +36,10 @@ test('postcss-nesting Test Case 2', async t => {
3636
}`;
3737
t.same(
3838
await util.postcssNestingResolve(code),
39-
await util.expected(code),
39+
await util.allExpected(code),
4040
);
4141
t.same(
42-
await util.expected(code),
42+
await util.allExpected(code),
4343
['a', 'a c', 'a c e', 'a c f', 'a d', 'a d e', 'a d f',
4444
'b', 'b c', 'b c e', 'b c f', 'b d', 'b d e', 'b d f'],
4545
);
@@ -55,10 +55,10 @@ test('postcss-nesting Test Case 3', async t => {
5555
}`;
5656
t.same(
5757
await util.postcssNestingResolve(code),
58-
await util.expected(code),
58+
await util.allExpected(code),
5959
);
6060
t.same(
61-
await util.expected(code),
61+
await util.allExpected(code),
6262
['a', 'a a', 'b', 'b b'],
6363
);
6464
});
@@ -73,10 +73,10 @@ test('postcss-nesting Test Case 4', async t => {
7373
}`;
7474
t.same(
7575
await util.postcssNestingResolve(code),
76-
await util.expected(code),
76+
await util.allExpected(code),
7777
);
7878
t.same(
79-
await util.expected(code),
79+
await util.allExpected(code),
8080
['a', 'a'],
8181
);
8282
});
@@ -103,10 +103,10 @@ test('postcss-nesting Test Case 5', async t => {
103103
}`;
104104
t.same(
105105
await util.postcssNestingResolve(code),
106-
await util.expected(code),
106+
await util.allExpected(code),
107107
);
108108
t.same(
109-
await util.expected(code),
109+
await util.allExpected(code),
110110
['a', 'a', 'a b', 'a b', 'a c'],
111111
);
112112
});
@@ -133,10 +133,10 @@ test('postcss-nesting Test Case 6', async t => {
133133
}`;
134134
t.same(
135135
await util.postcssNestingResolve(code),
136-
await util.expected(code),
136+
await util.allExpected(code),
137137
);
138138
t.same(
139-
await util.expected(code),
139+
await util.allExpected(code),
140140
['a', 'a', 'a b', 'a b', 'a c'],
141141
);
142142
});

test/sass.js

Whitespace-only changes.

0 commit comments

Comments
 (0)