Sync out transforms from fb internal

This commit is contained in:
JeffMo
2014-02-15 12:35:32 -08:00
committed by jeffmo
parent 64afa545dd
commit adcbf0806c
5 changed files with 44 additions and 43 deletions
+2 -2
View File
@@ -33,8 +33,8 @@
},
"dependencies": {
"commoner": "~0.9.0",
"esprima-fb": "~2001.1001.0-dev-harmony-fb",
"jstransform": "~2.0.2"
"esprima-fb": "~3001.1.0-dev-harmony-fb",
"jstransform": "~3.0.0"
},
"devDependencies": {
"benchmark": "~1.0.0",
+26 -24
View File
@@ -41,40 +41,40 @@ var quoteAttrName = require('./xjs').quoteAttrName;
var JSX_ATTRIBUTE_TRANSFORMS = {
cxName: function(attr) {
if (attr.value.type !== Syntax.Literal) {
throw new Error("cx only accepts a string literal");
} else {
var classNames = attr.value.value.split(/\s+/g);
return 'cx(' + classNames.map(JSON.stringify).join(',') + ')';
}
throw new Error(
"cxName is no longer supported, use className={cx(...)} instead"
);
}
};
function visitReactTag(traverse, object, path, state) {
var jsxObjIdent = utils.getDocblock(state).jsx;
var openingElement = object.openingElement;
var nameObject = openingElement.name;
var attributesObject = openingElement.attributes;
utils.catchup(object.openingElement.range[0], state);
utils.catchup(openingElement.range[0], state);
if (object.name.namespace) {
if (nameObject.namespace) {
throw new Error(
'Namespace tags are not supported. ReactJSX is not XML.');
}
var isFallbackTag = FALLBACK_TAGS[object.name.name];
var isFallbackTag = FALLBACK_TAGS[nameObject.name];
utils.append(
(isFallbackTag ? jsxObjIdent + '.' : '') + (object.name.name) + '(',
(isFallbackTag ? jsxObjIdent + '.' : '') + (nameObject.name) + '(',
state
);
utils.move(object.name.range[1], state);
utils.move(nameObject.range[1], state);
// if we don't have any attributes, pass in null
if (object.attributes.length === 0) {
if (attributesObject.length === 0) {
utils.append('null', state);
}
// write attributes
object.attributes.forEach(function(attr, index) {
attributesObject.forEach(function(attr, index) {
utils.catchup(attr.range[0], state);
if (attr.name.namespace) {
throw new Error(
@@ -82,7 +82,7 @@ function visitReactTag(traverse, object, path, state) {
}
var name = attr.name.name;
var isFirst = index === 0;
var isLast = index === object.attributes.length - 1;
var isLast = index === attributesObject.length - 1;
if (isFirst) {
utils.append('{', state);
@@ -121,17 +121,17 @@ function visitReactTag(traverse, object, path, state) {
utils.catchup(attr.range[1], state);
});
if (!object.selfClosing) {
utils.catchup(object.openingElement.range[1] - 1, state);
utils.move(object.openingElement.range[1], state);
if (!openingElement.selfClosing) {
utils.catchup(openingElement.range[1] - 1, state);
utils.move(openingElement.range[1], state);
}
// filter out whitespace
var childrenToRender = object.children.filter(function(child) {
return !(child.type === Syntax.Literal &&
child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/));
return !(child.type === Syntax.Literal
&& typeof child.value === 'string'
&& child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/));
});
if (childrenToRender.length > 0) {
utils.append(', ', state);
@@ -156,10 +156,10 @@ function visitReactTag(traverse, object, path, state) {
});
}
if (object.selfClosing) {
if (openingElement.selfClosing) {
// everything up to />
utils.catchup(object.openingElement.range[1] - 2, state);
utils.move(object.openingElement.range[1], state);
utils.catchup(openingElement.range[1] - 2, state);
utils.move(openingElement.range[1], state);
} else {
// everything up to </ sdflksjfd>
utils.catchup(object.closingElement.range[0], state);
@@ -176,4 +176,6 @@ visitReactTag.test = function(object, path, state) {
return object.type === Syntax.XJSElement && jsx && jsx.length;
};
exports.visitReactTag = visitReactTag;
exports.visitorList = [
visitReactTag
];
+3 -1
View File
@@ -102,4 +102,6 @@ visitReactDisplayName.test = function(object, path, state) {
}
};
exports.visitReactDisplayName = visitReactDisplayName;
exports.visitorList = [
visitReactDisplayName
];
+12 -12
View File
@@ -151,27 +151,27 @@ var knownTags = {
function renderXJSLiteral(object, isLast, state, start, end) {
var lines = object.value.split(/\r\n|\n|\r/);
if (start) {
utils.append(start, state);
}
var lastNonEmptyLine = 0;
lines.forEach(function (line, index) {
if (line.match(/[^ \t]/)) {
lastNonEmptyLine = index;
}
});
lines.forEach(function (line, index) {
var isFirstLine = index === 0;
var isLastLine = index === lines.length - 1;
var isLastNonEmptyLine = index === lastNonEmptyLine;
// replace rendered whitespace tabs with spaces
var trimmedLine = line.replace(/\t/g, ' ');
// trim whitespace touching a newline
if (!isFirstLine) {
trimmedLine = trimmedLine.replace(/^[ ]+/, '');
@@ -179,15 +179,15 @@ function renderXJSLiteral(object, isLast, state, start, end) {
if (!isLastLine) {
trimmedLine = trimmedLine.replace(/[ ]+$/, '');
}
utils.append(line.match(/^[ \t]*/)[0], state);
if (trimmedLine || isLastNonEmptyLine) {
utils.append(
JSON.stringify(trimmedLine) +
(!isLastNonEmptyLine ? "+' '+" : ''),
state);
if (isLastNonEmptyLine) {
if (end) {
utils.append(end, state);
@@ -196,18 +196,18 @@ function renderXJSLiteral(object, isLast, state, start, end) {
utils.append(',', state);
}
}
// only restore tail whitespace if line had literals
if (trimmedLine) {
utils.append(line.match(/[ \t]*$/)[0], state);
}
}
if (!isLastLine) {
utils.append('\n', state);
}
});
utils.move(object.range[1], state);
}
+1 -4
View File
@@ -16,10 +16,7 @@ var transformVisitors = {
'es6-object-short-notation': es6ObjectShortNotation.visitorList,
'es6-rest-params': es6RestParameters.visitorList,
'es6-templates': es6Templates.visitorList,
'react': [
react.visitReactTag,
reactDisplayName.visitReactDisplayName
]
'react': react.visitorList.concat(reactDisplayName.visitorList)
};
/**