Compare commits

...

18 Commits

Author SHA1 Message Date
Sebastian McKenzie
7f3959444c v1.12.0 2014-11-11 19:14:52 +11:00
Sebastian McKenzie
0ba9216d6f remove unused variables in react transformer 2014-11-11 19:14:00 +11:00
Sebastian McKenzie
6dfe66bce3 add v1.12.0 to changelog 2014-11-11 19:12:44 +11:00
Sebastian McKenzie
9e08a6f084 combine jsx and react transformer so we can make the jsx output correct - #143 2014-11-11 19:11:30 +11:00
Sebastian McKenzie
b9f3f1e2a9 add comment inheriting to types.inherits 2014-11-11 19:10:41 +11:00
Sebastian McKenzie
4f18ed406c v1.11.15 2014-11-11 17:17:08 +11:00
Sebastian McKenzie
4d8e5f728a 1.11.15 2014-11-11 17:16:11 +11:00
Sebastian McKenzie
54857ceac7 fix jsx literal generator - closes #143 2014-11-11 17:15:37 +11:00
Sebastian McKenzie
5b961ea3e7 v1.11.14 2014-11-11 15:35:18 +11:00
Sebastian McKenzie
35b28cf722 more reliable jsx literal whitespace 2014-11-11 15:34:29 +11:00
Sebastian McKenzie
c5bfbf37f0 add 1.11.14 changelog 2014-11-11 15:27:23 +11:00
Sebastian McKenzie
cfee68aa67 jsx: replace all newlines and excess whitespace with spaces - fixes #142 2014-11-11 15:26:25 +11:00
Sebastian McKenzie
7d0dae129c nicer let-scoping switch 2014-11-11 15:25:37 +11:00
Sebastian McKenzie
f9d14fa2ed add runtime, property-literals and shebang tests 2014-11-11 15:25:27 +11:00
Sebastian McKenzie
11d55e661e rename let-scoping tests to traceur-let-scoping and add additional let-scoping tests 2014-11-11 15:25:13 +11:00
Sebastian McKenzie
0544e98fb1 add switch case generated node whitespace 2014-11-11 15:24:40 +11:00
Sebastian McKenzie
59d918ea67 remove unused isArray traverse.hasType 2014-11-11 15:23:52 +11:00
Sebastian McKenzie
b4232699d2 add newline after shebang 2014-11-11 15:23:31 +11:00
132 changed files with 435 additions and 242 deletions

View File

@@ -1,3 +1,17 @@
# 1.12.0
* Combine `jsx` and `react` transformers to `react`.
* Update `react` syntax output to React v0.12.
# 1.11.15
* Fix JSX literal whitespace generation.
# 1.11.14
* Avoid using a switch for let-scoping continue and break statements and use an if statement instead.
* Remove excess whitespace and newlines from JSX literals.
# 1.11.13
* Update regenerator-6to5

View File

@@ -146,7 +146,7 @@ File.prototype.generate = function () {
if (this.shebang) {
// add back shebang
result.code = this.shebang + result.code;
result.code = this.shebang + "\n" + result.code;
}
if (opts.sourceMap === "inline") {

View File

@@ -46,15 +46,11 @@ exports.XJSElement = function (node, print) {
this.indent();
_.each(node.children, function (child) {
if (t.isLiteral(child) && typeof child.value === "string") {
if (/\S/.test(child.value)) {
return self.push(child.value.replace(/^\s+|\s+$/g, ""));
} else if (/\n/.test(child.value)) {
return self.newline();
}
if (t.isLiteral(child)) {
self.push(child.value);
} else {
print(child);
}
print(child);
});
this.dedent();

View File

@@ -80,6 +80,10 @@ Node.prototype.needsWhitespace = function (type) {
if (t.isProperty(node) && parent.properties[0] === node) {
return 1;
}
if (t.isSwitchCase(node) && parent.cases[0] === node) {
return 1;
}
}
if (type === "after") {

View File

@@ -49,7 +49,6 @@ _.each({
numericLiterals: require("./transformers/numeric-literals"),
react: require("./transformers/react"),
jsx: require("./transformers/jsx"),
_aliasFunctions: require("./transformers/_alias-functions"),
_blockHoist: require("./transformers/_block-hoist"),

View File

@@ -1,89 +0,0 @@
// Based upon the excellent jsx-transpiler by Ingvar Stepanyan (RReverser)
// https://github.com/RReverser/jsx-transpiler
var esutils = require("esutils");
var t = require("../../types");
var _ = require("lodash");
var JSX_ANNOTATION_REGEX = /^\*\s*@jsx\s+([^\s]+)/;
exports.Program = function (node, parent, file) {
var jsx = "React.DOM";
// looking for namespace annotation
_.each(node.leadingComments, function (comment) {
var matches = JSX_ANNOTATION_REGEX.exec(comment.value);
if (matches) jsx = matches[1];
});
// prebuilding AST node
file.jsx = jsx.split(".").map(t.identifier).reduce(function (object, property) {
return t.memberExpression(object, property);
});
};
exports.XJSIdentifier = function (node) {
if (esutils.keyword.isIdentifierName(node.name)) {
node.type = "Identifier";
} else {
return t.literal(node.name);
}
};
exports.XJSNamespacedName = function () {
throw new Error("Namespace tags are not supported. ReactJSX is not XML.");
};
exports.XJSMemberExpression = {
exit: function (node) {
node.computed = t.isLiteral(node.property);
node.type = "MemberExpression";
}
};
exports.XJSExpressionContainer = function (node) {
return node.expression;
};
exports.XJSAttribute = {
exit: function (node) {
var value = node.value || t.literal(true);
return t.property("init", node.name, value);
}
};
exports.XJSOpeningElement = {
exit: function (node, parent, file) {
var tagExpr = node.name;
if (t.isIdentifier(tagExpr)) {
var tagName = tagExpr.name;
if (/[a-z]/.exec(tagName[0]) || _.contains(tagName, "-")) {
tagExpr = t.memberExpression(file.jsx, tagExpr);
}
}
var props = node.attributes;
if (props.length) {
props = t.objectExpression(props);
} else {
props = t.literal(null);
}
return t.callExpression(tagExpr, [props]);
}
};
exports.XJSElement = {
exit: function (node) {
var callExpr = node.openingElement;
var children = node.children;
_.each(children, function (child) {
callExpr.arguments.push(child);
});
return t.inherits(callExpr, node);
}
};

View File

@@ -133,7 +133,7 @@ var checkFor = function (forParent, block) {
} else if (t.isReturnStatement(node)) {
has.hasReturn = true;
replace = t.returnStatement(t.objectExpression([
t.property("init", t.identifier("v"), node.argument)
t.property("init", t.identifier("v"), node.argument || t.identifier("undefined"))
]));
}
@@ -286,16 +286,13 @@ var run = function (forParent, block, parent, file, scope) {
var retCheck;
var cases = [];
if (has.hasReturn) {
// typeof ret === "object"
retCheck = util.template("let-scoping-return", {
RETURN: ret,
});
// there's no `break` or `continue` so we can just push in the `if`
if (!has.hasBreak && !has.hasContinue) {
body.push(retCheck);
}
}
if (has.hasBreak || has.hasContinue) {
@@ -303,8 +300,6 @@ var run = function (forParent, block, parent, file, scope) {
// need to be able to access it
var label = forParent.label = forParent.label || t.identifier(file.generateUid("loop", scope));
var cases = [];
if (has.hasBreak) {
cases.push(t.switchCase(t.literal("break"), [t.breakStatement(label)]));
}
@@ -317,7 +312,17 @@ var run = function (forParent, block, parent, file, scope) {
cases.push(t.switchCase(null, [retCheck]));
}
body.push(t.switchStatement(ret, cases));
if (cases.length === 1) {
var single = cases[0];
body.push(t.ifStatement(
t.binaryExpression("===", ret, single.test),
single.consequent[0]
));
} else {
body.push(t.switchStatement(ret, cases));
}
} else {
if (has.hasReturn) body.push(retCheck);
}
} else {
body.push(t.expressionStatement(call));

View File

@@ -1,5 +1,100 @@
var t = require("../../types");
var _ = require("lodash");
// Based upon the excellent jsx-transpiler by Ingvar Stepanyan (RReverser)
// https://github.com/RReverser/jsx-transpiler
// jsx
var esutils = require("esutils");
var t = require("../../types");
var _ = require("lodash");
exports.XJSIdentifier = function (node) {
if (esutils.keyword.isIdentifierName(node.name)) {
node.type = "Identifier";
} else {
return t.literal(node.name);
}
};
exports.XJSNamespacedName = function (node, parent, file) {
throw file.errorWithNode(node, "Namespace tags are not supported. ReactJSX is not XML.");
};
exports.XJSMemberExpression = {
exit: function (node) {
node.computed = t.isLiteral(node.property);
node.type = "MemberExpression";
}
};
exports.XJSExpressionContainer = function (node) {
return node.expression;
};
exports.XJSAttribute = {
exit: function (node) {
var value = node.value || t.literal(true);
return t.property("init", node.name, value);
}
};
exports.XJSOpeningElement = {
exit: function (node) {
var tagExpr = node.name;
var args = [];
var tagName;
if (t.isIdentifier(tagExpr)) {
tagName = tagExpr.name;
} else if (t.isLiteral(tagExpr)) {
tagName = tagExpr.value;
}
if (tagName && (/[a-z]/.exec(tagName[0]) || _.contains(tagName, "-"))) {
args.push(t.literal(tagName));
} else {
args.push(tagExpr);
}
var props = node.attributes;
if (props.length) {
var first = props[0];
if (t.isXJSSpreadAttribute(first)) {
props.shift();
props = t.callExpression(
t.memberExpression(t.identifier("React"), t.identifier("__spread")),
[t.objectExpression([]), first.argument, t.objectExpression(props)]
);
} else {
props = t.objectExpression(props);
}
} else {
props = t.literal(null);
}
args.push(props);
tagExpr = t.memberExpression(t.identifier("React"), t.identifier("createElement"));
return t.callExpression(tagExpr, args);
}
};
exports.XJSElement = {
exit: function (node) {
var callExpr = node.openingElement;
var childrenToRender = node.children.filter(function(child) {
return !(t.isLiteral(child) && _.isString(child.value) && child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/));
});
_.each(childrenToRender, function (child) {
callExpr.arguments.push(child);
});
return t.inherits(callExpr, node);
}
};
// display names
var addDisplayName = function (id, call) {
if (!call || !t.isCallExpression(call)) return;

View File

@@ -40,8 +40,6 @@ function traverse(parent, callbacks, opts) {
// type is blacklisted
if (_.contains(blacklistTypes, node.type)) return;
var result;
// replace node
var maybeReplace = function (result) {
if (result === false) return;
@@ -54,12 +52,11 @@ function traverse(parent, callbacks, opts) {
// enter
if (callbacks.enter) {
result = callbacks.enter(node, parent, opts2.scope);
var result = callbacks.enter(node, parent, opts2.scope);
maybeReplace(result);
// stop iteration
if (result === false) return;
maybeReplace(result);
}
// traverse node
@@ -114,25 +111,18 @@ traverse.hasType = function (tree, type, blacklistTypes) {
var has = false;
if (_.isArray(tree)) {
// array of nodes, find the first
return tree.some(function (node) {
return traverse.hasType(node, type, blacklistTypes);
});
} else {
// the node we're searching in is blacklisted
if (_.contains(blacklistTypes, tree.type)) return false;
// the node we're searching in is blacklisted
if (_.contains(blacklistTypes, tree.type)) return false;
// the type we're looking for is the same as the passed node
if (tree.type === type) return true;
// the type we're looking for is the same as the passed node
if (tree.type === type) return true;
traverse(tree, function (node) {
if (node.type === type) {
has = true;
return false;
}
}, { blacklist: blacklistTypes });
}
traverse(tree, function (node) {
if (node.type === type) {
has = true;
return false;
}
}, { blacklist: blacklistTypes });
return has;
};

View File

@@ -205,10 +205,12 @@ t.getIds.arrays = {
};
t.inherits = function (child, parent) {
child.loc = parent.loc;
child.end = parent.end;
child.range = parent.range;
child.start = parent.start;
child.loc = parent.loc;
child.end = parent.end;
child.range = parent.range;
child.start = parent.start;
child.leadingComments = parent.leadingComments;
child.trailingComments = parent.trailingComments;
return child;
};

View File

@@ -71,6 +71,6 @@
"XJSMemberExpression": ["object", "property"],
"XJSNamespacedName": ["namespace", "name"],
"XJSOpeningElement": ["name", "attributes"],
"XJSSpreadAttribute": [],
"XJSSpreadAttribute": ["argument"],
"YieldExpression": ["argument"]
}

View File

@@ -1,7 +1,7 @@
{
"name": "6to5",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "1.11.13",
"version": "1.12.0",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://github.com/6to5/6to5",
"repository": {

View File

@@ -1,3 +0,0 @@
/** @jsx CUSTOM_DOM */
<a></a>

View File

@@ -1,5 +0,0 @@
/** @jsx CUSTOM_DOM */
"use strict";
CUSTOM_DOM.a(null);

View File

@@ -1 +0,0 @@
<X>{}</X>

View File

@@ -1,3 +0,0 @@
"use strict";
X(null, null);

View File

@@ -1,2 +0,0 @@
<X data-prop={x ? <Y prop={2} /> : <Z>
</Z>}></X>

View File

@@ -1,7 +0,0 @@
"use strict";
X({
"data-prop": x ? Y({
prop: 2
}) : Z(null, "\n")
});

View File

@@ -1,5 +0,0 @@
(<X>{a}</X>);
(<X>{a} {b}</X>);
(<X prop={a} yes></X>);

View File

@@ -1,10 +0,0 @@
"use strict";
(X(null, a));
(X(null, a, " ", b));
(X({
prop: a,
yes: true
}));

View File

@@ -1 +0,0 @@
<a></a>

View File

@@ -1,3 +0,0 @@
"use strict";
React.DOM.a(null);

View File

@@ -1 +0,0 @@
<Test.X></Test.X>

View File

@@ -1,3 +0,0 @@
"use strict";
Test.X(null);

View File

@@ -1 +0,0 @@
<Test:X></Test:X>

View File

@@ -1,3 +0,0 @@
(<X />);
(<X prop="1" />);

View File

@@ -1,7 +0,0 @@
"use strict";
(X(null));
(X({
prop: "1"
}));

View File

@@ -1 +0,0 @@
<X></X>

View File

@@ -1,3 +0,0 @@
"use strict";
X(null);

View File

@@ -1,3 +0,0 @@
(<X prop="2"><Y /></X>);
(<X prop="2"><Y /><Z /></X>);

View File

@@ -1,9 +0,0 @@
"use strict";
(X({
prop: "2"
}, Y(null)));
(X({
prop: "2"
}, Y(null), Z(null)));

View File

@@ -1,13 +0,0 @@
(<X> </X>);
(<X>
</X>);
(<X>
string
</X>);
(<X>
string
string
</X>);

View File

@@ -1,9 +0,0 @@
"use strict";
(X(null, " "));
(X(null, "\n"));
(X(null, "\n string\n"));
(X(null, "\n string\n string\n "));

View File

@@ -0,0 +1,10 @@
for (let i in nums) {
fns.push(function () { return i; });
if (i === 1) {
continue;
} else if (i === 2) {
break;
} else if (i === 3) {
return i;
}
}

View File

@@ -0,0 +1,24 @@
"use strict";
_loop: for (var i in nums) {
var _ret = (function (i) {
fns.push(function () {
return i;
});
if (i === 1) {
return "continue";
} else if (i === 2) {
return "break";
} else if (i === 3) {
return {
v: i
};
}
})(i);
switch (_ret) {
case "break": break _loop;
case "continue": continue _loop;
default: if (typeof _ret === "object") return _ret.v;
}
}

View File

@@ -0,0 +1,4 @@
for (let i in nums) {
fns.push(function () { return i; });
break;
}

View File

@@ -0,0 +1,12 @@
"use strict";
_loop: for (var i in nums) {
var _ret = (function (i) {
fns.push(function () {
return i;
});
return "break";
})(i);
if (_ret === "break") break _loop;
}

View File

@@ -0,0 +1,4 @@
for (let i in nums) {
fns.push(function () { return i; });
continue;
}

View File

@@ -0,0 +1,12 @@
"use strict";
_loop: for (var i in nums) {
var _ret = (function (i) {
fns.push(function () {
return i;
});
return "continue";
})(i);
if (_ret === "continue") continue _loop;
}

View File

@@ -0,0 +1,4 @@
for (let i in nums) {
fns.push(function () { return i; });
return;
}

View File

@@ -0,0 +1,14 @@
"use strict";
for (var i in nums) {
var _ret = (function (i) {
fns.push(function () {
return i;
});
return {
v: undefined
};
})(i);
if (typeof _ret === "object") return _ret.v;
}

View File

@@ -0,0 +1,4 @@
for (let i in nums) {
fns.push(function () { return i; });
return i;
}

View File

@@ -0,0 +1,14 @@
"use strict";
for (var i in nums) {
var _ret = (function (i) {
fns.push(function () {
return i;
});
return {
v: i
};
})(i);
if (typeof _ret === "object") return _ret.v;
}

View File

@@ -0,0 +1,3 @@
function test() {
let foo = "bar";
}

View File

@@ -0,0 +1,5 @@
"use strict";
function test() {
var foo = "bar";
}

View File

@@ -0,0 +1 @@
let test = "foo";

View File

@@ -0,0 +1,3 @@
"use strict";
var test = "foo";

View File

@@ -0,0 +1,3 @@
function foo(...test) {
}

View File

@@ -0,0 +1,5 @@
"use strict";
function foo() {
var test = customNamespace.slice.call(arguments);
}

View File

@@ -0,0 +1,3 @@
{
"runtime": "customNamespace"
}

View File

@@ -0,0 +1,3 @@
var obj = {
"foobar": "lol"
};

View File

@@ -0,0 +1,5 @@
"use strict";
var obj = {
foobar: "lol"
};

View File

@@ -0,0 +1,3 @@
function foo(...test) {
}

View File

@@ -0,0 +1,5 @@
"use strict";
function foo() {
var test = to5Runtime.slice.call(arguments);
}

View File

@@ -0,0 +1,3 @@
{
"runtime": true
}

View File

@@ -0,0 +1,3 @@
#!/usr/bin/env node
foobar();

View File

@@ -0,0 +1,4 @@
#!/usr/bin/env node
"use strict";
foobar();

View File

@@ -0,0 +1 @@
<div>&nbsp; </div>;

View File

@@ -0,0 +1 @@
React.createElement("div", null, "\u00A0 ");

View File

@@ -0,0 +1 @@
<div>&nbsp;</div>;

View File

@@ -0,0 +1 @@
React.createElement("div", null, "\u00A0");

View File

@@ -0,0 +1,13 @@
var x = (
<div>
{/* A comment at the beginning */}
{/* A second comment at the beginning */}
<span>
{/* A nested comment */}
</span>
{/* A sandwiched comment */}
<br />
{/* A comment at the end */}
{/* A second comment at the end */}
</div>
);

View File

@@ -0,0 +1,11 @@
var x = (React.createElement("div", null,
/* A comment at the beginning */
/* A second comment at the beginning */
React.createElement("span", null
/* A nested comment */
),
/* A sandwiched comment */
React.createElement("br", null)
/* A comment at the end */
/* A second comment at the end */
));

View File

@@ -0,0 +1,10 @@
var x = (
<div
/* a multi-line
comment */
attr1="foo">
<span // a double-slash comment
attr2="bar"
/>
</div>
);

View File

@@ -0,0 +1,8 @@
var x = (React.createElement("div", {
/* a multi-line
comment */
attr1: "foo"},
React.createElement("span", {// a double-slash comment
attr2: "bar"}
)
));

View File

@@ -0,0 +1,3 @@
<Component
{...this.props}
sound="moo" />

View File

@@ -0,0 +1,3 @@
React.createElement(Component, React.__spread({}, this.props, {
sound: "moo"
}));

View File

@@ -1,5 +1,3 @@
"use strict";
var Component;
Component = React.createClass({
displayName: "Component",

View File

@@ -1,8 +1,6 @@
"use strict";
var Whateva = React.createClass({
displayName: "Whatever",
render: function () {
return null;
}
});
});

View File

@@ -1,5 +1,3 @@
"use strict";
exports = {
Component: React.createClass({
displayName: "Component",

View File

@@ -1,5 +1,3 @@
"use strict";
exports.Component = React.createClass({
displayName: "Component",

View File

@@ -1,5 +1,3 @@
"use strict";
var Component = React.createClass({
displayName: "Component",

View File

@@ -0,0 +1,3 @@
{
"blacklist": ["useStrict"]
}

View File

@@ -0,0 +1 @@
<Component constructor="foo" />;

View File

@@ -0,0 +1,3 @@
React.createElement(Component, {
constructor: "foo"
});

View File

@@ -0,0 +1 @@
<Namespace.DeepNamespace.Component />;

View File

@@ -0,0 +1 @@
React.createElement(Namespace.DeepNamespace.Component, null);

View File

@@ -0,0 +1 @@
<Namespace.Component />;

View File

@@ -0,0 +1 @@
React.createElement(Namespace.Component, null);

View File

@@ -0,0 +1 @@
React.createElement(Namespace.Component, null);

View File

@@ -0,0 +1,15 @@
var x = <div>
<Component />
</div>;
var x = <div>
{this.props.children}
</div>;
var x = <Composite>
{this.props.children}
</Composite>;
var x = <Composite>
<Composite2 />
</Composite>;

View File

@@ -0,0 +1,7 @@
var x = React.createElement("div", null, React.createElement(Component, null));
var x = React.createElement("div", null, this.props.children);
var x = React.createElement(Composite, null, this.props.children);
var x = React.createElement(Composite, null, React.createElement(Composite2, null));

View File

@@ -0,0 +1 @@
var x = <div></div>;

View File

@@ -0,0 +1 @@
var x = React.createElement("div", null);

View File

@@ -0,0 +1 @@
var x = <div>text</div>;

View File

@@ -0,0 +1 @@
var x = React.createElement("div", null, "text");

View File

@@ -0,0 +1 @@
<Namespace:Component />;

View File

@@ -0,0 +1 @@
<hasOwnProperty>testing</hasOwnProperty>;

View File

@@ -0,0 +1 @@
React.createElement("hasOwnProperty", null, "testing");

View File

@@ -0,0 +1,5 @@
var x = <div>
<div><br /></div>
<Component>{foo}<br />{bar}</Component>
<br />
</div>;

View File

@@ -0,0 +1 @@
var x = React.createElement("div", null, React.createElement("div", null, React.createElement("br", null)), React.createElement(Component, null, foo, React.createElement("br", null), bar), React.createElement("br", null));

View File

@@ -0,0 +1,16 @@
var x =
<div
attr1={
"foo" + "bar"
}
attr2={
"foo" + "bar" +
"baz" + "bug"
}
attr3={
"foo" + "bar" +
"baz" + "bug"
}
attr4="baz">
</div>

View File

@@ -0,0 +1,6 @@
var x = React.createElement("div", {
attr1: "foo" + "bar",
attr2: "foo" + "bar" + "baz" + "bug",
attr3: "foo" + "bar" + "baz" + "bug",
attr4: "baz"
});

View File

@@ -0,0 +1 @@
<font-face />;

View File

@@ -0,0 +1 @@
React.createElement("font-face", null);

View File

@@ -0,0 +1,2 @@
<Component { ... x } y
={2 } z />

View File

@@ -0,0 +1,4 @@
React.createElement(Component, React.__spread({}, x, {
y: 2,
z: true
}));

Some files were not shown because too many files have changed in this diff Show More