Skip to content

Commit 8ec5417

Browse files
committed
allowMultiple
1 parent 01f854b commit 8ec5417

File tree

5 files changed

+46
-12
lines changed

5 files changed

+46
-12
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@
55

66
## Usage
77

8+
```js
9+
/**
10+
* @param {ReactClass} Component
11+
* @param {Object} styles CSS modules class map.
12+
* @param {Object} options {@link https://github.com/gajus/react-css-modules#options}
13+
* @return {ReactClass}
14+
*/
15+
```
16+
817
First you need to setup [webpack](http://webpack.github.io/docs/) to load your css files using "css" loader and enable CSS modules. You will also need to use `extract-text-webpack-plugin` to aggregate the CSS into a single file. Refer to [webpack-demo](https://github.com/css-modules/webpack-demo).
918

1019
Then you need use the higher order component declaration pattern to "decorate" your component, e.g.

dist/index.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Object.defineProperty(exports, '__esModule', {
66

77
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
88

9-
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
9+
var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
1010

1111
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
1212

@@ -19,14 +19,17 @@ var _linkClass = require('./linkClass');
1919
var _linkClass2 = _interopRequireDefault(_linkClass);
2020

2121
/**
22-
* @param {ReactClass} Target
23-
* @param {Object} styles {localClassName: 'generatedClassName'}
22+
* @param {ReactClass} Component
23+
* @param {Object} styles CSS modules class map.
24+
* @param {Object} options {@link https://github.com/gajus/react-css-modules#options}
2425
* @return {ReactClass}
2526
*/
2627

27-
exports['default'] = function (Target, styles) {
28-
return (function (_Target) {
29-
_inherits(_class, _Target);
28+
exports['default'] = function (Component, styles) {
29+
var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
30+
31+
return (function (_Component) {
32+
_inherits(_class, _Component);
3033

3134
function _class() {
3235
_classCallCheck(this, _class);
@@ -37,12 +40,20 @@ exports['default'] = function (Target, styles) {
3740
_createClass(_class, [{
3841
key: 'render',
3942
value: function render() {
40-
return (0, _linkClass2['default'])(_get(Object.getPrototypeOf(_class.prototype), 'render', this).call(this), styles);
43+
if (options.allowMultiple !== false) {
44+
options.allowMultiple = true;
45+
}
46+
47+
if (options.includeOriginal !== false) {
48+
options.includeOriginal = true;
49+
}
50+
51+
return (0, _linkClass2['default'])(_get(Object.getPrototypeOf(_class.prototype), 'render', this).call(this), styles, options);
4152
}
4253
}]);
4354

4455
return _class;
45-
})(Target);
56+
})(Component);
4657
};
4758

4859
module.exports = exports['default'];

dist/linkClass.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,27 @@ var linkClass = undefined;
1414

1515
/**
1616
* @param {ReactElement} element
17-
* @param {Object} styles
17+
* @param {Object} styles CSS modules class map.
18+
* @param {Object} options {@link https://github.com/gajus/react-css-modules#options}
1819
* @return {ReactElement}
1920
*/
2021
linkClass = function (element) {
2122
var styles = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
23+
var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
2224

2325
var newProps = undefined,
2426
newClassName = undefined,
2527
newChildren = undefined,
2628
childrenCount = undefined;
2729

2830
if (element.props.className) {
29-
newClassName = element.props.className.split(' ').map(function (className) {
31+
newClassName = element.props.className.split(' ');
32+
33+
if (options.allowMultiple === false && newClassName.length > 1) {
34+
throw new Error('ReactElement defines multiple class names ("' + element.props.className + '") in className declaration.');
35+
}
36+
37+
newClassName = newClassName.map(function (className) {
3038
if (styles[className]) {
3139
return className + ' ' + styles[className];
3240
} else {

src/linkClass.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ linkClass = (element, styles = {}, options = {}) => {
1515
childrenCount;
1616

1717
if (element.props.className) {
18-
newClassName = element.props.className.split(' ').map((className) => {
18+
newClassName = element.props.className.split(' ');
19+
20+
if (options.allowMultiple === false && newClassName.length > 1) {
21+
throw new Error(`ReactElement defines multiple class names ("${element.props.className}") in className declaration.`);
22+
}
23+
24+
newClassName = newClassName.map((className) => {
1925
if (styles[className]) {
2026
return `${className} ${styles[className]}`;
2127
} else {

test/linkClass.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ describe('linkClass', () => {
131131
it('throws an error', () => {
132132
expect(() => {
133133
linkClass(<div className='foo bar'></div>, {}, {allowMultiple: false});
134-
}).to.throw(Error);
134+
}).to.throw(Error, 'ReactElement defines multiple class names ("foo bar") in className declaration.');
135135
});
136136
});
137137
});

0 commit comments

Comments
 (0)