Sync out transforms from fb internal
JeffMo committed
Feb 15, 2014 at 12:13 UTC
adcbf0806ccee3cfa5de65bc45833223df5a6ec5
5 files changed
+44
-43
package.json
+2
-2
@@ -33,8 +33,8 @@
33
},
34
"dependencies": {
35
"commoner": "~0.9.0",
36
- "esprima-fb": "~2001.1001.0-dev-harmony-fb",
37
- "jstransform": "~2.0.2"
36
+ "esprima-fb": "~3001.1.0-dev-harmony-fb",
37
+ "jstransform": "~3.0.0"
38
},
39
"devDependencies": {
40
"benchmark": "~1.0.0",
vendor/fbtransform/transforms/react.js
+26
-24
@@ -41,40 +41,40 @@ var quoteAttrName = require('./xjs').quoteAttrName;
41
42
var JSX_ATTRIBUTE_TRANSFORMS = {
43
cxName: function(attr) {
44
- if (attr.value.type !== Syntax.Literal) {
45
- throw new Error("cx only accepts a string literal");
46
- } else {
47
- var classNames = attr.value.value.split(/\s+/g);
48
- return 'cx(' + classNames.map(JSON.stringify).join(',') + ')';
49
- }
44
+ throw new Error(
45
+ "cxName is no longer supported, use className={cx(...)} instead"
46
+ );
47
}
48
};
49
50
function visitReactTag(traverse, object, path, state) {
51
var jsxObjIdent = utils.getDocblock(state).jsx;
52
+ var openingElement = object.openingElement;
53
+ var nameObject = openingElement.name;
54
+ var attributesObject = openingElement.attributes;
55
56
- utils.catchup(object.openingElement.range[0], state);
56
+ utils.catchup(openingElement.range[0], state);
57
58
- if (object.name.namespace) {
58
+ if (nameObject.namespace) {
59
throw new Error(
60
'Namespace tags are not supported. ReactJSX is not XML.');
61
}
62
63
- var isFallbackTag = FALLBACK_TAGS[object.name.name];
63
+ var isFallbackTag = FALLBACK_TAGS[nameObject.name];
64
utils.append(
65
- (isFallbackTag ? jsxObjIdent + '.' : '') + (object.name.name) + '(',
65
+ (isFallbackTag ? jsxObjIdent + '.' : '') + (nameObject.name) + '(',
66
state
67
);
68
69
- utils.move(object.name.range[1], state);
69
+ utils.move(nameObject.range[1], state);
70
71
// if we don't have any attributes, pass in null
72
- if (object.attributes.length === 0) {
72
+ if (attributesObject.length === 0) {
73
utils.append('null', state);
74
}
75
76
// write attributes
77
- object.attributes.forEach(function(attr, index) {
77
+ attributesObject.forEach(function(attr, index) {
78
utils.catchup(attr.range[0], state);
79
if (attr.name.namespace) {
80
throw new Error(
@@ -82,7 +82,7 @@ function visitReactTag(traverse, object, path, state) {
82
}
83
var name = attr.name.name;
84
var isFirst = index === 0;
85
- var isLast = index === object.attributes.length - 1;
85
+ var isLast = index === attributesObject.length - 1;
86
87
if (isFirst) {
88
utils.append('{', state);
@@ -121,17 +121,17 @@ function visitReactTag(traverse, object, path, state) {
121
utils.catchup(attr.range[1], state);
122
});
123
124
- if (!object.selfClosing) {
125
- utils.catchup(object.openingElement.range[1] - 1, state);
126
- utils.move(object.openingElement.range[1], state);
124
+ if (!openingElement.selfClosing) {
125
+ utils.catchup(openingElement.range[1] - 1, state);
126
+ utils.move(openingElement.range[1], state);
127
}
128
129
// filter out whitespace
130
var childrenToRender = object.children.filter(function(child) {
131
- return !(child.type === Syntax.Literal &&
132
- child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/));
131
+ return !(child.type === Syntax.Literal
132
+ && typeof child.value === 'string'
133
+ && child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/));
134
});
134
-
135
if (childrenToRender.length > 0) {
136
utils.append(', ', state);
137
@@ -156,10 +156,10 @@ function visitReactTag(traverse, object, path, state) {
156
});
157
}
158
159
- if (object.selfClosing) {
159
+ if (openingElement.selfClosing) {
160
// everything up to />
161
- utils.catchup(object.openingElement.range[1] - 2, state);
162
- utils.move(object.openingElement.range[1], state);
161
+ utils.catchup(openingElement.range[1] - 2, state);
162
+ utils.move(openingElement.range[1], state);
163
} else {
164
// everything up to </ sdflksjfd>
165
utils.catchup(object.closingElement.range[0], state);
@@ -176,4 +176,6 @@ visitReactTag.test = function(object, path, state) {
176
return object.type === Syntax.XJSElement && jsx && jsx.length;
177
};
178
179
-exports.visitReactTag = visitReactTag;
179
+exports.visitorList = [
180
+ visitReactTag
181
+];
vendor/fbtransform/transforms/reactDisplayName.js
+3
-1
@@ -102,4 +102,6 @@ visitReactDisplayName.test = function(object, path, state) {
102
}
103
};
104
105
-exports.visitReactDisplayName = visitReactDisplayName;
105
+exports.visitorList = [
106
+ visitReactDisplayName
107
+];
vendor/fbtransform/transforms/xjs.js
+12
-12
@@ -151,27 +151,27 @@ var knownTags = {
151
152
function renderXJSLiteral(object, isLast, state, start, end) {
153
var lines = object.value.split(/\r\n|\n|\r/);
154
-
154
+
155
if (start) {
156
utils.append(start, state);
157
}
158
-
158
+
159
var lastNonEmptyLine = 0;
160
-
160
+
161
lines.forEach(function (line, index) {
162
if (line.match(/[^ \t]/)) {
163
lastNonEmptyLine = index;
164
}
165
});
166
-
166
+
167
lines.forEach(function (line, index) {
168
var isFirstLine = index === 0;
169
var isLastLine = index === lines.length - 1;
170
var isLastNonEmptyLine = index === lastNonEmptyLine;
171
-
171
+
172
// replace rendered whitespace tabs with spaces
173
var trimmedLine = line.replace(/\t/g, ' ');
174
-
174
+
175
// trim whitespace touching a newline
176
if (!isFirstLine) {
177
trimmedLine = trimmedLine.replace(/^[ ]+/, '');
@@ -179,15 +179,15 @@ function renderXJSLiteral(object, isLast, state, start, end) {
179
if (!isLastLine) {
180
trimmedLine = trimmedLine.replace(/[ ]+$/, '');
181
}
182
-
182
+
183
utils.append(line.match(/^[ \t]*/)[0], state);
184
-
184
+
185
if (trimmedLine || isLastNonEmptyLine) {
186
utils.append(
187
JSON.stringify(trimmedLine) +
188
(!isLastNonEmptyLine ? "+' '+" : ''),
189
state);
190
-
190
+
191
if (isLastNonEmptyLine) {
192
if (end) {
193
utils.append(end, state);
@@ -196,18 +196,18 @@ function renderXJSLiteral(object, isLast, state, start, end) {
196
utils.append(',', state);
197
}
198
}
199
-
199
+
200
// only restore tail whitespace if line had literals
201
if (trimmedLine) {
202
utils.append(line.match(/[ \t]*$/)[0], state);
203
}
204
}
205
-
205
+
206
if (!isLastLine) {
207
utils.append('\n', state);
208
}
209
});
210
-
210
+
211
utils.move(object.range[1], state);
212
}
213
vendor/fbtransform/visitors.js
+1
-4
@@ -16,10 +16,7 @@ var transformVisitors = {
16
'es6-object-short-notation': es6ObjectShortNotation.visitorList,
17
'es6-rest-params': es6RestParameters.visitorList,
18
'es6-templates': es6Templates.visitorList,
19
- 'react': [
20
- react.visitReactTag,
21
- reactDisplayName.visitReactDisplayName
22
- ]
19
+ 'react': react.visitorList.concat(reactDisplayName.visitorList)
20
};
21
22
/**