Skip to content

Commit 0e1eca8

Browse files
committed
fix: 🐛 replace all & operators in nesting addon
1 parent 2c897e0 commit 0e1eca8

File tree

3 files changed

+61
-14
lines changed

3 files changed

+61
-14
lines changed

.storybook/nesting.stories.js

+13
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,20 @@ const className = rule({
2121
},
2222
}, 'nesting');
2323

24+
const classNamePlus = rule({
25+
border: '1px solid red',
26+
'& + &': {
27+
border: '1px solid blue',
28+
},
29+
}, 'plus');
30+
2431
storiesOf('Addons/Nesting', module)
2532
.add('Default', () =>
2633
h('div', {className}, 'Hover ', h('span', null, 'me!'))
2734
)
35+
.add('& + &', () =>
36+
h('div', {},
37+
h('div', {className: classNamePlus}, 'a'),
38+
h('div', {className: classNamePlus}, 'b'),
39+
)
40+
)

addon/__tests__/nesting.test.js

+46-8
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,55 @@ describe('nesting', function () {
3131

3232
expect(nano.putRaw.mock.calls[0][0].includes('.foo .one,.foo .two')).toBe(true);
3333
});
34-
/*
35-
it('expands & operand after', () => {
36-
expect(interpolateSelectors(['.one', '#two'], '.test &')).toBe('.test .one,.test #two');
34+
35+
it('expands & operand after', function () {
36+
var nano = createNano();
37+
38+
nano.putRaw = jest.fn();
39+
40+
nano.put('.one, #two', {
41+
'.foo &': {
42+
color: 'tomato'
43+
}
44+
});
45+
46+
var result = nano.putRaw.mock.calls[0][0].replace(/ +(?= )/g,'');
47+
48+
expect(result.includes('.foo .one,.foo #two')).toBe(true);
3749
});
3850

39-
it('expands & operand before', () => {
40-
expect(interpolateSelectors(['.test'], '&:hover')).toBe('.test:hover');
51+
it('expands & operand before', function () {
52+
var nano = createNano();
53+
54+
nano.putRaw = jest.fn();
55+
nano.put('.foo', {
56+
'&:hover': {
57+
color: 'tomato'
58+
},
59+
'& .bar': {
60+
color: 'tomato'
61+
},
62+
});
63+
64+
var css1 = nano.putRaw.mock.calls[0][0].replace(/ +(?= )/g,'');
65+
var css2 = nano.putRaw.mock.calls[1][0].replace(/ +(?= )/g,'');
66+
67+
expect(css1.includes('.foo:hover')).toBe(true);
68+
expect(css2.includes('.foo .bar')).toBe(true);
4169
});
4270

43-
it('expands & operand before and preserves spaces', () => {
44-
expect(interpolateSelectors(['.one', '.two'], '& .test')).toBe('.one .test,.two .test');
71+
it('expands multiple & operands', function () {
72+
var nano = createNano();
73+
74+
nano.putRaw = jest.fn();
75+
nano.put('.foo', {
76+
'& + &': {
77+
color: 'tomato'
78+
},
79+
});
80+
81+
var css1 = nano.putRaw.mock.calls[0][0].replace(/ +(?= )/g,'');
82+
83+
expect(css1.includes('.foo + .foo')).toBe(true);
4584
});
46-
*/
4785
});

addon/nesting.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,16 @@ exports.addon = function (renderer) {
77
var selectors = selector.split(',');
88
var len1 = parents.length;
99
var len2 = selectors.length;
10-
var i, j, part1, part2, sel, pos, parent, replacedSelector;
10+
var i, j, sel, pos, parent, replacedSelector;
1111

1212
for (i = 0; i < len2; i++) {
1313
sel = selectors[i];
1414
pos = sel.indexOf('&');
1515

1616
if (pos > -1) {
17-
part1 = sel.substr(0, pos);
18-
part2 = sel.substr(pos + 1);
19-
2017
for (j = 0; j < len1; j++) {
2118
parent = parents[j];
22-
replacedSelector = part1 + parent + part2;
23-
19+
replacedSelector = sel.replace(/&/g, parent);
2420
result.push(replacedSelector);
2521
}
2622
} else {

0 commit comments

Comments
 (0)