diff --git a/package.json b/package.json
index e0eeb20..e2fd205 100644
--- a/package.json
+++ b/package.json
@@ -32,8 +32,8 @@
"chalk": "^1.1.1",
"cheerio": "^0.19.0",
"css": "^2.2.1",
- "escodegen": "1.7.1",
- "esprima-fb": "^15001.1001.0-dev-harmony-fb",
+ "escodegen": "^1.8.0",
+ "esprima": "^2.7.1",
"lodash": "^3.10.1",
"optionator": "^0.8.0",
"text-table": "^0.2.0"
diff --git a/src/reactTemplates.js b/src/reactTemplates.js
index 1a2503f..7cb78e9 100644
--- a/src/reactTemplates.js
+++ b/src/reactTemplates.js
@@ -1,7 +1,7 @@
'use strict';
var cheerio = require('cheerio');
var _ = require('lodash');
-var esprima = require('esprima-fb');
+var esprima = require('esprima');
var escodegen = require('escodegen');
var reactDOMSupport = require('./reactDOMSupport');
var reactNativeSupport = require('./reactNativeSupport');
@@ -51,6 +51,7 @@ var classAttr = 'class';
var scopeAttr = 'rt-scope';
var propsAttr = 'rt-props';
var templateNode = 'rt-template';
+var virtualNode = 'rt-virtual';
/**
* @param {Options} options
@@ -346,7 +347,7 @@ function convertHtmlToReact(node, context) {
data.item = arr[0].trim();
data.collection = arr[1].trim();
validateJS(data.item, node, context);
- validateJS(data.collection, node, context);
+ validateJS("(" + data.collection + ")", node, context);
stringUtils.addIfMissing(context.boundParams, data.item);
stringUtils.addIfMissing(context.boundParams, `${data.item}Index`);
}
@@ -374,13 +375,20 @@ function convertHtmlToReact(node, context) {
}
}
- data.children = utils.concatChildren(_.map(node.children, function (child) {
+ var children = _.map(node.children, function (child) {
var code = convertHtmlToReact(child, context);
validateJS(code, child, context);
return code;
- }));
+ });
- data.body = _.template(getTagTemplateString(!hasNonSimpleChildren(node), reactSupport.shouldUseCreateElement(context)))(data);
+ data.children = utils.concatChildren(children);
+
+ if (node.name === virtualNode) { //eslint-disable-line wix-editor/prefer-ternary
+ data.body = "[" + _.compact(children).join(',') + "]"
+ }
+ else {
+ data.body = _.template(getTagTemplateString(!hasNonSimpleChildren(node), reactSupport.shouldUseCreateElement(context)))(data);
+ }
if (node.attribs[scopeAttr]) {
var functionBody = _.values(data.innerScope.innerMapping).join('\n') + `return ${data.body}`;
@@ -522,6 +530,8 @@ function convertRT(html, reportContext, options) {
});
if (firstTag === null) {
throw RTCodeError.build(context, rootNode.root()[0], 'Document should have a single root element');
+ } else if (firstTag.name === virtualNode) {
+ throw RTCodeError.build(context, firstTag, `Document should not have <${virtualNode}> as root element`);
}
var body = convertHtmlToReact(firstTag, context);
var requirePaths = _(defines)
diff --git a/src/utils.js b/src/utils.js
index 087f313..cd2f872 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -1,6 +1,6 @@
'use strict';
var _ = require('lodash');
-var esprima = require('esprima-fb');
+var esprima = require('esprima');
var rtError = require('./RTCodeError');
var RTCodeError = rtError.RTCodeError;
diff --git a/test/data/div.rt.es6.js b/test/data/div.rt.es6.js
index 4f40316..9c4e38c 100644
--- a/test/data/div.rt.es6.js
+++ b/test/data/div.rt.es6.js
@@ -2,4 +2,4 @@ import React from 'react/addons';
import _ from 'lodash';
export default function () {
return React.createElement('div', {});
-};
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/test/data/invalid-virtual.rt b/test/data/invalid-virtual.rt
new file mode 100644
index 0000000..e8498bc
--- /dev/null
+++ b/test/data/invalid-virtual.rt
@@ -0,0 +1,3 @@
+