Skip to content

Commit 861d31c

Browse files
CurtisHumphreygajus
authored andcommitted
fix: prevent a classname of undefined (#62)
1 parent 629e009 commit 861d31c

File tree

4 files changed

+36
-17
lines changed

4 files changed

+36
-17
lines changed

src/conditionalClassMerge.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// @flow
2+
3+
import {
4+
binaryExpression,
5+
conditionalExpression,
6+
stringLiteral
7+
} from 'babel-types';
8+
9+
export default (
10+
classNameExpression: any,
11+
styleNameExpression: any,
12+
): any => {
13+
return binaryExpression(
14+
'+',
15+
conditionalExpression(
16+
classNameExpression,
17+
binaryExpression(
18+
'+',
19+
classNameExpression,
20+
stringLiteral(' ')
21+
),
22+
stringLiteral('')
23+
),
24+
styleNameExpression
25+
);
26+
};

src/replaceJsxExpressionContainer.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// @flow
2-
32
import BabelTypes, {
43
binaryExpression,
54
Identifier,
@@ -8,9 +7,9 @@ import BabelTypes, {
87
jSXAttribute,
98
JSXAttribute,
109
jSXExpressionContainer,
11-
jSXIdentifier,
12-
stringLiteral
10+
jSXIdentifier
1311
} from 'babel-types';
12+
import conditionalClassMerge from './conditionalClassMerge';
1413

1514
export default (
1615
t: BabelTypes,
@@ -55,14 +54,9 @@ export default (
5554
path.node.openingElement.attributes.push(jSXAttribute(
5655
jSXIdentifier('className'),
5756
jSXExpressionContainer(
58-
binaryExpression(
59-
'+',
57+
conditionalClassMerge(
6058
classNameAttribute.value.expression,
61-
binaryExpression(
62-
'+',
63-
stringLiteral(' '),
64-
styleNameExpression
65-
)
59+
styleNameExpression
6660
)
6761
)
6862
));

src/resolveStringLiteral.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// @flow
22

33
import {
4-
binaryExpression,
54
isJSXExpressionContainer,
65
isStringLiteral,
76
JSXAttribute,
87
stringLiteral
98
} from 'babel-types';
9+
import conditionalClassMerge from './conditionalClassMerge';
1010
import getClassName from './getClassName';
1111
import type {
1212
StyleModuleImportMapType
@@ -27,10 +27,9 @@ export default (path: Object, styleModuleImportMap: StyleModuleImportMapType, st
2727
if (isStringLiteral(classNameAttribute.value)) {
2828
classNameAttribute.value.value += ' ' + resolvedStyleName;
2929
} else if (isJSXExpressionContainer(classNameAttribute.value)) {
30-
classNameAttribute.value.expression = binaryExpression(
31-
'+',
30+
classNameAttribute.value.expression = conditionalClassMerge(
3231
classNameAttribute.value.expression,
33-
stringLiteral(' ' + resolvedStyleName)
32+
stringLiteral(resolvedStyleName)
3433
);
3534
} else {
3635
throw new Error('Unexpected attribute value.');

test/fixtures/react-css-modules/merges the resolved styleName with the existing className values/expected.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ const _styleModuleImportMap = {
88
};
99
<div className="apple banana bar__a"></div>;
1010

11-
<div className={this.props.className + ' bar__a'}></div>;
11+
<div className={(this.props.className ? this.props.className + ' ' : '') + 'bar__a'}></div>;
1212

13-
<div className={(Math.random() > 0.5 ? 'apple' : 'banana') + ' bar__a'}></div>;
13+
<div className={((Math.random() > 0.5 ? 'apple' : 'banana') ? (Math.random() > 0.5 ? 'apple' : 'banana') + ' ' : '') + 'bar__a'}></div>;
1414

15-
<div className={this.props.className + (' ' + _getClassName(foo, _styleModuleImportMap))}></div>;
15+
<div className={(this.props.className ? this.props.className + ' ' : '') + _getClassName(foo, _styleModuleImportMap)}></div>;

0 commit comments

Comments
 (0)