UNPKG

5.13 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 _map2 = require('lodash/map');
12
13var _map3 = _interopRequireDefault(_map2);
14
15var _isArray2 = require('lodash/isArray');
16
17var _isArray3 = _interopRequireDefault(_isArray2);
18
19var _forEach2 = require('lodash/forEach');
20
21var _forEach3 = _interopRequireDefault(_forEach2);
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 linkArray = function linkArray(array, styles, configuration) {
48 (0, _forEach3.default)(array, function (value, index) {
49 if (_react2.default.isValidElement(value)) {
50 // eslint-disable-next-line no-use-before-define
51 array[index] = linkElement(_react2.default.Children.only(value), styles, configuration);
52 } else if ((0, _isArray3.default)(value)) {
53 array[index] = linkArray(value, styles, configuration);
54 }
55 });
56
57 return array;
58};
59
60var linkElement = function linkElement(element, styles, configuration) {
61 var appendClassName = void 0;
62 var elementIsFrozen = void 0;
63 var elementShallowCopy = void 0;
64
65 elementShallowCopy = element;
66
67 if (Object.isFrozen && Object.isFrozen(elementShallowCopy)) {
68 elementIsFrozen = true;
69
70 // https://github.com/facebook/react/blob/v0.13.3/src/classic/element/ReactElement.js#L131
71 elementShallowCopy = (0, _objectUnfreeze2.default)(elementShallowCopy);
72 elementShallowCopy.props = (0, _objectUnfreeze2.default)(elementShallowCopy.props);
73 }
74
75 var styleNames = (0, _parseStyleName2.default)(elementShallowCopy.props.styleName || '', configuration.allowMultiple);
76
77 var _elementShallowCopy$p = elementShallowCopy.props,
78 children = _elementShallowCopy$p.children,
79 restProps = _objectWithoutProperties(_elementShallowCopy$p, ['children']);
80
81 if (_react2.default.isValidElement(children)) {
82 elementShallowCopy.props.children = linkElement(_react2.default.Children.only(children), styles, configuration);
83 } else if ((0, _isArray3.default)(children) || (0, _isIterable2.default)(children)) {
84 elementShallowCopy.props.children = _react2.default.Children.map(children, function (node) {
85 if (_react2.default.isValidElement(node)) {
86 // eslint-disable-next-line no-use-before-define
87 return linkElement(_react2.default.Children.only(node), styles, configuration);
88 } else {
89 return node;
90 }
91 });
92 }
93
94 (0, _forEach3.default)(restProps, function (propValue, propName) {
95 if (_react2.default.isValidElement(propValue)) {
96 elementShallowCopy.props[propName] = linkElement(_react2.default.Children.only(propValue), styles, configuration);
97 } else if ((0, _isArray3.default)(propValue)) {
98 elementShallowCopy.props[propName] = (0, _map3.default)(propValue, function (node) {
99 if (_react2.default.isValidElement(node)) {
100 return linkElement(_react2.default.Children.only(node), styles, configuration);
101 } else if ((0, _isArray3.default)(node)) {
102 return linkArray(node, styles, configuration);
103 }
104
105 return node;
106 });
107 }
108 });
109
110 if (styleNames.length) {
111 appendClassName = (0, _generateAppendClassName2.default)(styles, styleNames, configuration.errorWhenNotFound);
112
113 if (appendClassName) {
114 if (elementShallowCopy.props.className) {
115 appendClassName = elementShallowCopy.props.className + ' ' + appendClassName;
116 }
117
118 elementShallowCopy.props.className = appendClassName;
119 }
120 }
121
122 delete elementShallowCopy.props.styleName;
123
124 if (elementIsFrozen) {
125 Object.freeze(elementShallowCopy.props);
126 Object.freeze(elementShallowCopy);
127 }
128
129 return elementShallowCopy;
130};
131
132/**
133 * @param {ReactElement} element
134 * @param {Object} styles CSS modules class map.
135 * @param {CSSModules~Options} configuration
136 */
137
138exports.default = function (element) {
139 var styles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
140 var configuration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
141
142 // @see https://github.com/gajus/react-css-modules/pull/30
143 if (!(0, _isObject3.default)(element)) {
144 return element;
145 }
146
147 return linkElement(element, styles, configuration);
148};
149
150module.exports = exports['default'];
\No newline at end of file