UNPKG

5.47 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _isObject2 = require('lodash/isObject');
8
9var _isObject3 = _interopRequireDefault(_isObject2);
10
11var _forEach2 = require('lodash/forEach');
12
13var _forEach3 = _interopRequireDefault(_forEach2);
14
15var _isArray2 = require('lodash/isArray');
16
17var _isArray3 = _interopRequireDefault(_isArray2);
18
19var _map2 = require('lodash/map');
20
21var _map3 = _interopRequireDefault(_map2);
22
23var _react = require('react');
24
25var _react2 = _interopRequireDefault(_react);
26
27var _objectUnfreeze = require('object-unfreeze');
28
29var _objectUnfreeze2 = _interopRequireDefault(_objectUnfreeze);
30
31var _isIterable = require('./isIterable');
32
33var _isIterable2 = _interopRequireDefault(_isIterable);
34
35var _parseStyleName = require('./parseStyleName');
36
37var _parseStyleName2 = _interopRequireDefault(_parseStyleName);
38
39var _generateAppendClassName = require('./generateAppendClassName');
40
41var _generateAppendClassName2 = _interopRequireDefault(_generateAppendClassName);
42
43function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
44
45function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
46
47var mapChildrenWithoutKeyPrefix = function mapChildrenWithoutKeyPrefix(children, mapper, context) {
48 if (typeof children === 'undefined' || children === null) {
49 return children;
50 }
51
52 var result = [];
53
54 _react2.default.Children.forEach(children, function (child, index) {
55 result.push(mapper.call(context, child, index));
56 });
57
58 return result;
59};
60
61var linkArray = function linkArray(array, styles, configuration) {
62 return (0, _map3.default)(array, function (value) {
63 if (_react2.default.isValidElement(value)) {
64 // eslint-disable-next-line no-use-before-define
65 return linkElement(_react2.default.Children.only(value), styles, configuration);
66 } else if ((0, _isArray3.default)(value)) {
67 return linkArray(value, styles, configuration);
68 }
69
70 return value;
71 });
72};
73
74var linkElement = function linkElement(element, styles, configuration) {
75 var appendClassName = void 0;
76 var elementIsFrozen = void 0;
77 var elementShallowCopy = void 0;
78
79 elementShallowCopy = element;
80
81 if (Object.isFrozen && Object.isFrozen(elementShallowCopy)) {
82 elementIsFrozen = true;
83
84 // https://github.com/facebook/react/blob/v0.13.3/src/classic/element/ReactElement.js#L131
85 elementShallowCopy = (0, _objectUnfreeze2.default)(elementShallowCopy);
86 elementShallowCopy.props = (0, _objectUnfreeze2.default)(elementShallowCopy.props);
87 }
88
89 var styleNames = (0, _parseStyleName2.default)(elementShallowCopy.props.styleName || '', configuration.allowMultiple);
90
91 var _elementShallowCopy$p = elementShallowCopy.props,
92 children = _elementShallowCopy$p.children,
93 restProps = _objectWithoutProperties(_elementShallowCopy$p, ['children']);
94
95 if (_react2.default.isValidElement(children)) {
96 elementShallowCopy.props.children = linkElement(_react2.default.Children.only(children), styles, configuration);
97 } else if ((0, _isArray3.default)(children) || (0, _isIterable2.default)(children)) {
98 elementShallowCopy.props.children = mapChildrenWithoutKeyPrefix(children, function (node) {
99 if (_react2.default.isValidElement(node)) {
100 // eslint-disable-next-line no-use-before-define
101 return linkElement(_react2.default.Children.only(node), styles, configuration);
102 } else {
103 return node;
104 }
105 });
106 }
107
108 (0, _forEach3.default)(restProps, function (propValue, propName) {
109 if (_react2.default.isValidElement(propValue)) {
110 elementShallowCopy.props[propName] = linkElement(_react2.default.Children.only(propValue), styles, configuration);
111 } else if ((0, _isArray3.default)(propValue)) {
112 elementShallowCopy.props[propName] = (0, _map3.default)(propValue, function (node) {
113 if (_react2.default.isValidElement(node)) {
114 return linkElement(_react2.default.Children.only(node), styles, configuration);
115 } else if ((0, _isArray3.default)(node)) {
116 return linkArray(node, styles, configuration);
117 }
118
119 return node;
120 });
121 }
122 });
123
124 if (styleNames.length) {
125 appendClassName = (0, _generateAppendClassName2.default)(styles, styleNames, configuration.errorWhenNotFound);
126
127 if (appendClassName) {
128 if (elementShallowCopy.props.className) {
129 appendClassName = elementShallowCopy.props.className + ' ' + appendClassName;
130 }
131
132 elementShallowCopy.props.className = appendClassName;
133 }
134 }
135
136 delete elementShallowCopy.props.styleName;
137
138 if (elementIsFrozen) {
139 Object.freeze(elementShallowCopy.props);
140 Object.freeze(elementShallowCopy);
141 }
142
143 return elementShallowCopy;
144};
145
146/**
147 * @param {ReactElement} element
148 * @param {Object} styles CSS modules class map.
149 * @param {CSSModules~Options} configuration
150 */
151
152exports.default = function (element) {
153 var styles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
154 var configuration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
155
156 // @see https://github.com/gajus/react-css-modules/pull/30
157 if (!(0, _isObject3.default)(element)) {
158 return element;
159 }
160
161 return linkElement(element, styles, configuration);
162};
163
164module.exports = exports['default'];
\No newline at end of file