Skip to content

Commit f4bf56f

Browse files
committed
API 4 has props support 🎉
1 parent 03a6535 commit f4bf56f

File tree

5 files changed

+183
-56
lines changed

5 files changed

+183
-56
lines changed

api4.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import React from 'react';
22

3-
function css (rawCSS) {
4-
let rules = rawCSS[0].trim().split('\n');
5-
3+
function css (rawCSSWithProps) {
64
return function (target, name, descriptor) {
75
return {
86
...descriptor,
97
value: function () {
10-
let style = parseCss(rawCSS);
118
let props;
129
function giveMeProps(object) {
1310
props = object.props;
1411
return object;
1512
}
1613
let rendered = descriptor.value.apply(giveMeProps(this), arguments);
14+
15+
let rawCSS = fillProps(rawCSSWithProps[0], props)
16+
let style = parseCss(rawCSS);
1717
let newProps = {...props, style};
1818

1919
return React.cloneElement(rendered, newProps, rendered.props.children);
@@ -24,9 +24,25 @@ function css (rawCSS) {
2424

2525
let camelCase = (key) => key.replace(/(\-[a-z])/g, $1 => $1.toUpperCase().replace('-',''));
2626

27+
let fillProps = (rawCSSWithProps, props) => {
28+
let re = /{this.props.*}/g;
29+
let matches = rawCSSWithProps.match(re);
30+
if (matches && matches.length) {
31+
for (let match of matches) {
32+
let keyword = match;
33+
keyword = keyword.replace('{this.props.', '');
34+
keyword = keyword.substring(0, keyword.length-1); // }
35+
keyword = keyword.trim();
36+
37+
rawCSSWithProps = rawCSSWithProps.replace(match, props[keyword]);
38+
}
39+
}
40+
return rawCSSWithProps;
41+
}
42+
2743
let parseCss = (rawCSS) => {
2844
let styles = {};
29-
let rules = rawCSS[0].trim().split('\n');
45+
let rules = rawCSS.trim().split('\n');
3046
for (let rule of rules) {
3147
let [key, value] = rule.trim().replace(';', '').split(':');
3248
key = camelCase(key.trim());

css4.js

Lines changed: 53 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@ var _react2 = _interopRequireDefault(_react);
1414

1515
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1616

17-
function css(rawCSS) {
18-
var rules = rawCSS[0].trim().split('\n');
19-
17+
function css(rawCSSWithProps) {
2018
return function (target, name, descriptor) {
2119
return _extends({}, descriptor, {
2220
value: function value() {
23-
var style = parseCss(rawCSS);
2421
var props = void 0;
2522
function giveMeProps(object) {
2623
props = object.props;
2724
return object;
2825
}
2926
var rendered = descriptor.value.apply(giveMeProps(this), arguments);
27+
28+
var rawCSS = fillProps(rawCSSWithProps[0], props);
29+
var style = parseCss(rawCSS);
3030
var newProps = _extends({}, props, { style: style });
3131

3232
return _react2.default.cloneElement(rendered, newProps, rendered.props.children);
@@ -41,16 +41,53 @@ var camelCase = function camelCase(key) {
4141
});
4242
};
4343

44+
var fillProps = function fillProps(rawCSSWithProps, props) {
45+
var re = /{this.props.*}/g;
46+
var matches = rawCSSWithProps.match(re);
47+
if (matches && matches.length) {
48+
var _iteratorNormalCompletion = true;
49+
var _didIteratorError = false;
50+
var _iteratorError = undefined;
51+
52+
try {
53+
for (var _iterator = matches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
54+
var match = _step.value;
55+
56+
var keyword = match;
57+
keyword = keyword.replace('{this.props.', '');
58+
keyword = keyword.substring(0, keyword.length - 1); // }
59+
keyword = keyword.trim();
60+
61+
rawCSSWithProps = rawCSSWithProps.replace(match, props[keyword]);
62+
}
63+
} catch (err) {
64+
_didIteratorError = true;
65+
_iteratorError = err;
66+
} finally {
67+
try {
68+
if (!_iteratorNormalCompletion && _iterator.return) {
69+
_iterator.return();
70+
}
71+
} finally {
72+
if (_didIteratorError) {
73+
throw _iteratorError;
74+
}
75+
}
76+
}
77+
}
78+
return rawCSSWithProps;
79+
};
80+
4481
var parseCss = function parseCss(rawCSS) {
4582
var styles = {};
46-
var rules = rawCSS[0].trim().split('\n');
47-
var _iteratorNormalCompletion = true;
48-
var _didIteratorError = false;
49-
var _iteratorError = undefined;
83+
var rules = rawCSS.trim().split('\n');
84+
var _iteratorNormalCompletion2 = true;
85+
var _didIteratorError2 = false;
86+
var _iteratorError2 = undefined;
5087

5188
try {
52-
for (var _iterator = rules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
53-
var rule = _step.value;
89+
for (var _iterator2 = rules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
90+
var rule = _step2.value;
5491

5592
var _rule$trim$replace$sp = rule.trim().replace(';', '').split(':'),
5693
_rule$trim$replace$sp2 = _slicedToArray(_rule$trim$replace$sp, 2),
@@ -62,16 +99,16 @@ var parseCss = function parseCss(rawCSS) {
6299
styles[key] = value;
63100
}
64101
} catch (err) {
65-
_didIteratorError = true;
66-
_iteratorError = err;
102+
_didIteratorError2 = true;
103+
_iteratorError2 = err;
67104
} finally {
68105
try {
69-
if (!_iteratorNormalCompletion && _iterator.return) {
70-
_iterator.return();
106+
if (!_iteratorNormalCompletion2 && _iterator2.return) {
107+
_iterator2.return();
71108
}
72109
} finally {
73-
if (_didIteratorError) {
74-
throw _iteratorError;
110+
if (_didIteratorError2) {
111+
throw _iteratorError2;
75112
}
76113
}
77114
}

example/bundle.js

Lines changed: 55 additions & 18 deletions
Large diffs are not rendered by default.

example/css4.js

Lines changed: 53 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@ var _react2 = _interopRequireDefault(_react);
1414

1515
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1616

17-
function css(rawCSS) {
18-
var rules = rawCSS[0].trim().split('\n');
19-
17+
function css(rawCSSWithProps) {
2018
return function (target, name, descriptor) {
2119
return _extends({}, descriptor, {
2220
value: function value() {
23-
var style = parseCss(rawCSS);
2421
var props = void 0;
2522
function giveMeProps(object) {
2623
props = object.props;
2724
return object;
2825
}
2926
var rendered = descriptor.value.apply(giveMeProps(this), arguments);
27+
28+
var rawCSS = fillProps(rawCSSWithProps[0], props);
29+
var style = parseCss(rawCSS);
3030
var newProps = _extends({}, props, { style: style });
3131

3232
return _react2.default.cloneElement(rendered, newProps, rendered.props.children);
@@ -41,16 +41,53 @@ var camelCase = function camelCase(key) {
4141
});
4242
};
4343

44+
var fillProps = function fillProps(rawCSSWithProps, props) {
45+
var re = /{this.props.*}/g;
46+
var matches = rawCSSWithProps.match(re);
47+
if (matches && matches.length) {
48+
var _iteratorNormalCompletion = true;
49+
var _didIteratorError = false;
50+
var _iteratorError = undefined;
51+
52+
try {
53+
for (var _iterator = matches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
54+
var match = _step.value;
55+
56+
var keyword = match;
57+
keyword = keyword.replace('{this.props.', '');
58+
keyword = keyword.substring(0, keyword.length - 1); // }
59+
keyword = keyword.trim();
60+
61+
rawCSSWithProps = rawCSSWithProps.replace(match, props[keyword]);
62+
}
63+
} catch (err) {
64+
_didIteratorError = true;
65+
_iteratorError = err;
66+
} finally {
67+
try {
68+
if (!_iteratorNormalCompletion && _iterator.return) {
69+
_iterator.return();
70+
}
71+
} finally {
72+
if (_didIteratorError) {
73+
throw _iteratorError;
74+
}
75+
}
76+
}
77+
}
78+
return rawCSSWithProps;
79+
};
80+
4481
var parseCss = function parseCss(rawCSS) {
4582
var styles = {};
46-
var rules = rawCSS[0].trim().split('\n');
47-
var _iteratorNormalCompletion = true;
48-
var _didIteratorError = false;
49-
var _iteratorError = undefined;
83+
var rules = rawCSS.trim().split('\n');
84+
var _iteratorNormalCompletion2 = true;
85+
var _didIteratorError2 = false;
86+
var _iteratorError2 = undefined;
5087

5188
try {
52-
for (var _iterator = rules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
53-
var rule = _step.value;
89+
for (var _iterator2 = rules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
90+
var rule = _step2.value;
5491

5592
var _rule$trim$replace$sp = rule.trim().replace(';', '').split(':'),
5693
_rule$trim$replace$sp2 = _slicedToArray(_rule$trim$replace$sp, 2),
@@ -62,16 +99,16 @@ var parseCss = function parseCss(rawCSS) {
6299
styles[key] = value;
63100
}
64101
} catch (err) {
65-
_didIteratorError = true;
66-
_iteratorError = err;
102+
_didIteratorError2 = true;
103+
_iteratorError2 = err;
67104
} finally {
68105
try {
69-
if (!_iteratorNormalCompletion && _iterator.return) {
70-
_iterator.return();
106+
if (!_iteratorNormalCompletion2 && _iterator2.return) {
107+
_iterator2.return();
71108
}
72109
} finally {
73-
if (_didIteratorError) {
74-
throw _iteratorError;
110+
if (_didIteratorError2) {
111+
throw _iteratorError2;
75112
}
76113
}
77114
}

example/withprops2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default class WithProps extends React.Component {
1212
@css`
1313
font-size: 16px;
1414
text-align: center;
15-
color: #5AF78E;
15+
color: {this.props.color};
1616
font-family: monospace;
1717
`
1818

0 commit comments

Comments
 (0)