diff --git a/package.json b/package.json index 3524e6c23f..fb9db54842 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/vendor/fbtransform/transforms/react.js b/vendor/fbtransform/transforms/react.js index 0c217c7c71..1fa881bfa2 100644 --- a/vendor/fbtransform/transforms/react.js +++ b/vendor/fbtransform/transforms/react.js @@ -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 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 +]; diff --git a/vendor/fbtransform/transforms/reactDisplayName.js b/vendor/fbtransform/transforms/reactDisplayName.js index c02ee161c9..9fffbcc624 100644 --- a/vendor/fbtransform/transforms/reactDisplayName.js +++ b/vendor/fbtransform/transforms/reactDisplayName.js @@ -102,4 +102,6 @@ visitReactDisplayName.test = function(object, path, state) { } }; -exports.visitReactDisplayName = visitReactDisplayName; +exports.visitorList = [ + visitReactDisplayName +]; diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index 97b4f0432c..978971fa8c 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -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); } diff --git a/vendor/fbtransform/visitors.js b/vendor/fbtransform/visitors.js index a883c179ff..ef27f58656 100644 --- a/vendor/fbtransform/visitors.js +++ b/vendor/fbtransform/visitors.js @@ -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) }; /**