Skip to content

Commit f11d423

Browse files
gpittarelligajus
authored andcommitted
fix: don't break when spreading falsy value (#249)
1 parent 4a47f35 commit f11d423

File tree

3 files changed

+34
-25
lines changed

3 files changed

+34
-25
lines changed

src/createSpreadMapper.js

+26-17
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
Expression,
55
memberExpression,
66
binaryExpression,
7+
conditionalExpression,
78
stringLiteral,
89
logicalExpression,
910
identifier,
@@ -43,25 +44,33 @@ const createSpreadMapper = (path: *, stats: *): { [destinationName: string]: Exp
4344
result[destinationName] = binaryExpression(
4445
'+',
4546
result[destinationName],
46-
binaryExpression(
47-
'+',
48-
stringLiteral(' '),
49-
logicalExpression(
50-
'||',
51-
memberExpression(
52-
spread.argument,
53-
identifier(destinationName),
54-
),
55-
stringLiteral('')
56-
)
57-
),
47+
conditionalExpression(
48+
spread.argument,
49+
binaryExpression(
50+
'+',
51+
stringLiteral(' '),
52+
logicalExpression(
53+
'||',
54+
memberExpression(
55+
spread.argument,
56+
identifier(destinationName),
57+
),
58+
stringLiteral('')
59+
)
60+
),
61+
stringLiteral('')
62+
)
5863
);
5964
} else {
60-
result[destinationName] = logicalExpression(
61-
'||',
62-
memberExpression(
63-
spread.argument,
64-
identifier(destinationName),
65+
result[destinationName] = conditionalExpression(
66+
spread.argument,
67+
logicalExpression(
68+
'||',
69+
memberExpression(
70+
spread.argument,
71+
identifier(destinationName),
72+
),
73+
stringLiteral('')
6574
),
6675
stringLiteral('')
6776
);

test/fixtures/react-css-modules/does not throw error if attribute has no name property/output.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ require("./bar.css");
55
const props = {
66
foo: 'bar'
77
};
8-
<div className={"bar__a" + (" " + (props.className || ""))} {...props}></div>;
8+
<div className={"bar__a" + (" " + (props ? props.className || "" : ""))} {...props}></div>;

test/fixtures/react-css-modules/handle spread attributes/output.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
require("./foo.css");
44

55
const rest = {};
6-
<div {...rest} className={"b foo__a" + (" " + (rest.className || ""))}></div>;
7-
<div {...rest} className={"foo__a" + (" " + (rest.className || ""))}></div>;
8-
<div {...rest} activeClassName={((void 0).props.activeClassName ? (void 0).props.activeClassName + " " : "") + "foo__a" + (" " + (rest.activeClassName || ""))} className={"foo__a" + (" " + (rest.className || ""))}></div>;
9-
<div {...rest} activeClassName={"b foo__a" + (" " + (rest.activeClassName || ""))}></div>; // Should be okay if rest is put on last
6+
<div {...rest} className={"b foo__a" + (" " + (rest ? rest.className || "" : ""))}></div>;
7+
<div {...rest} className={"foo__a" + (" " + (rest ? rest.className || "" : ""))}></div>;
8+
<div {...rest} activeClassName={((void 0).props.activeClassName ? (void 0).props.activeClassName + " " : "") + "foo__a" + (" " + (rest ? rest.activeClassName || "" : ""))} className={"foo__a" + (" " + (rest ? rest.className || "" : ""))}></div>;
9+
<div {...rest} activeClassName={"b foo__a" + (" " + (rest ? rest.activeClassName || "" : ""))}></div>; // Should be okay if rest is put on last
1010

11-
<div className={"foo__a" + (" " + (rest.className || ""))} {...rest}></div>;
11+
<div className={"foo__a" + (" " + (rest ? rest.className || "" : ""))} {...rest}></div>;
1212
const rest2 = {};
13-
<div {...rest} {...rest2} className={"foo__a" + (" " + ((rest.className || "") + (" " + (rest2.className || ""))))}></div>; // Should not do anything
13+
<div {...rest} {...rest2} className={"foo__a" + (" " + ((rest ? rest.className || "" : "") + (rest2 ? " " + (rest2.className || "") : "")))}></div>; // Should not do anything
1414

1515
<div {...rest} {...rest2}></div>;
1616
<div {...rest} {...rest2} className="b"></div>;
1717
<div className="foo__a">
18-
<div {...rest} activeClassName={"foo__a" + (" " + (rest.activeClassName || ""))}></div>
18+
<div {...rest} activeClassName={"foo__a" + (" " + (rest ? rest.activeClassName || "" : ""))}></div>
1919
</div>;

0 commit comments

Comments
 (0)