Comparing version 3.4.0 to 3.4.1
@@ -26,3 +26,3 @@ #!/usr/bin/env node | ||
commander.option("-c, --remove-comments", "Remove comments from the compiled code", false); | ||
commander.option("-i, --module-ids", "Insert module id in modules", false); | ||
commander.option("-M, --module-ids", "Insert module id in modules", false); | ||
commander.option("-R, --react-compat", "Makes the react transformer produce pre-v0.12 code"); | ||
@@ -29,0 +29,0 @@ commander.option("--keep-module-id-extensions", "Keep extensions when generating module ids", false); |
@@ -47,4 +47,6 @@ "use strict"; | ||
var cacheKey = filename + ":" + JSON.stringify(transformOpts); | ||
if (cache) { | ||
var cached = cache[filename]; | ||
var cached = cache[cacheKey]; | ||
if (cached && cached.mtime === mtime(filename)) { | ||
@@ -64,3 +66,3 @@ result = cached; | ||
result.mtime = mtime(filename); | ||
cache[filename] = result; | ||
cache[cacheKey] = result; | ||
} | ||
@@ -67,0 +69,0 @@ |
@@ -166,2 +166,8 @@ "use strict"; | ||
if (opts.reactCompat) { | ||
opts.optional.push("reactCompat"); | ||
console.error("The reactCompat option has been moved into the optional transformer " + | ||
"`reactCompat` - backwards compatibility will be removed in v4.0.0"); | ||
} | ||
return opts; | ||
@@ -168,0 +174,0 @@ }; |
@@ -23,1 +23,5 @@ var t = require("../../types"); | ||
exports.isReactComponent = t.buildMatchMemberExpression("React.Component"); | ||
exports.isCompatTag = function (tagName) { | ||
return tagName && /^[a-z]|\-/.test(tagName); | ||
}; |
@@ -7,3 +7,3 @@ "use strict"; | ||
var Constructor = function () { | ||
this.noInteropRequire = true; | ||
this.noInteropRequireExport = true; | ||
Parent.apply(this, arguments); | ||
@@ -10,0 +10,0 @@ }; |
@@ -14,2 +14,3 @@ module.exports = { | ||
reactCompat: require("./other/react-compat"), | ||
react: require("./other/react"), | ||
@@ -16,0 +17,0 @@ |
"use strict"; | ||
// Based upon the excellent jsx-transpiler by Ingvar Stepanyan (RReverser) | ||
// https://github.com/RReverser/jsx-transpiler | ||
var react = require("../../helpers/react"); | ||
var t = require("../../../types"); | ||
// jsx | ||
var isString = require("lodash/lang/isString"); | ||
var esutils = require("esutils"); | ||
var react = require("../../helpers/react"); | ||
var t = require("../../../types"); | ||
exports.check = function (node) { | ||
if (t.isJSX(node)) return true; | ||
if (react.isCreateClass(node)) return true; | ||
return false; | ||
}; | ||
exports.JSXIdentifier = function (node, parent) { | ||
if (node.name === "this" && t.isReferenced(node, parent)) { | ||
return t.thisExpression(); | ||
} else if (esutils.keyword.isIdentifierName(node.name)) { | ||
node.type = "Identifier"; | ||
} else { | ||
return t.literal(node.name); | ||
} | ||
}; | ||
exports.JSXNamespacedName = function (node, parent, scope, file) { | ||
throw file.errorWithNode(node, "Namespace tags are not supported. ReactJSX is not XML."); | ||
}; | ||
exports.JSXMemberExpression = { | ||
exit: function (node) { | ||
node.computed = t.isLiteral(node.property); | ||
node.type = "MemberExpression"; | ||
} | ||
}; | ||
exports.JSXExpressionContainer = function (node) { | ||
return node.expression; | ||
}; | ||
exports.JSXAttribute = { | ||
exit: function (node) { | ||
var value = node.value || t.literal(true); | ||
return t.inherits(t.property("init", node.name, value), node); | ||
} | ||
}; | ||
var isCompatTag = function (tagName) { | ||
return /^[a-z]|\-/.test(tagName); | ||
}; | ||
exports.JSXOpeningElement = { | ||
exit: function (node, parent, scope, file) { | ||
var reactCompat = file.opts.reactCompat; | ||
var tagExpr = node.name; | ||
var args = []; | ||
var tagName; | ||
if (t.isIdentifier(tagExpr)) { | ||
tagName = tagExpr.name; | ||
} else if (t.isLiteral(tagExpr)) { | ||
tagName = tagExpr.value; | ||
} | ||
if (!reactCompat) { | ||
if (tagName && isCompatTag(tagName)) { | ||
args.push(t.literal(tagName)); | ||
} else { | ||
args.push(tagExpr); | ||
} | ||
} | ||
var attribs = node.attributes; | ||
if (attribs.length) { | ||
attribs = buildJSXOpeningElementAttributes(attribs, file); | ||
require("../../helpers/build-react-transformer")(exports, { | ||
pre: function (state) { | ||
var tagName = state.tagName; | ||
var args = state.args; | ||
if (react.isCompatTag(tagName)) { | ||
args.push(t.literal(tagName)); | ||
} else { | ||
attribs = t.literal(null); | ||
args.push(state.tagExpr); | ||
} | ||
}, | ||
args.push(attribs); | ||
if (reactCompat) { | ||
if (tagName && isCompatTag(tagName)) { | ||
return t.callExpression( | ||
t.memberExpression( | ||
t.memberExpression(t.identifier("React"), t.identifier("DOM")), | ||
tagExpr, | ||
t.isLiteral(tagExpr) | ||
), | ||
args | ||
); | ||
} | ||
} else { | ||
tagExpr = t.memberExpression(t.identifier("React"), t.identifier("createElement")); | ||
} | ||
return t.callExpression(tagExpr, args); | ||
post: function (state) { | ||
state.callee = t.memberExpression(t.identifier("React"), t.identifier("createElement")); | ||
} | ||
}; | ||
/** | ||
* The logic for this is quite terse. It's because we need to | ||
* support spread elements. We loop over all attributes, | ||
* breaking on spreads, we then push a new object containg | ||
* all prior attributes to an array for later processing. | ||
*/ | ||
var buildJSXOpeningElementAttributes = function (attribs, file) { | ||
var _props = []; | ||
var objs = []; | ||
var pushProps = function () { | ||
if (!_props.length) return; | ||
objs.push(t.objectExpression(_props)); | ||
_props = []; | ||
}; | ||
while (attribs.length) { | ||
var prop = attribs.shift(); | ||
if (t.isJSXSpreadAttribute(prop)) { | ||
pushProps(); | ||
objs.push(prop.argument); | ||
} else { | ||
_props.push(prop); | ||
} | ||
} | ||
pushProps(); | ||
if (objs.length === 1) { | ||
// only one object | ||
attribs = objs[0]; | ||
} else { | ||
// looks like we have multiple objects | ||
if (!t.isObjectExpression(objs[0])) { | ||
objs.unshift(t.objectExpression([])); | ||
} | ||
// spread it | ||
attribs = t.callExpression( | ||
file.addHelper("extends"), | ||
objs | ||
); | ||
} | ||
return attribs; | ||
}; | ||
exports.JSXElement = { | ||
exit: function (node) { | ||
var callExpr = node.openingElement; | ||
for (var i = 0; i < node.children.length; i++) { | ||
var child = node.children[i]; | ||
if (t.isLiteral(child) && typeof child.value === "string") { | ||
cleanJSXElementLiteralChild(child, callExpr.arguments); | ||
continue; | ||
} else if (t.isJSXEmptyExpression(child)) { | ||
continue; | ||
} | ||
callExpr.arguments.push(child); | ||
} | ||
callExpr.arguments = flatten(callExpr.arguments); | ||
if (callExpr.arguments.length >= 3) { | ||
callExpr._prettyCall = true; | ||
} | ||
return t.inherits(callExpr, node); | ||
} | ||
}; | ||
var isStringLiteral = function (node) { | ||
return t.isLiteral(node) && isString(node.value); | ||
}; | ||
var flatten = function (args) { | ||
var flattened = []; | ||
var last; | ||
for (var i = 0; i < args.length; i++) { | ||
var arg = args[i]; | ||
if (isStringLiteral(arg) && isStringLiteral(last)) { | ||
last.value += arg.value; | ||
} else { | ||
last = arg; | ||
flattened.push(arg); | ||
} | ||
} | ||
return flattened; | ||
}; | ||
var cleanJSXElementLiteralChild = function (child, args) { | ||
var lines = child.value.split(/\r\n|\n|\r/); | ||
var lastNonEmptyLine = 0; | ||
var i; | ||
for (i = 0; i < lines.length; i++) { | ||
if (lines[i].match(/[^ \t]/)) { | ||
lastNonEmptyLine = i; | ||
} | ||
} | ||
for (i = 0; i < lines.length; i++) { | ||
var line = lines[i]; | ||
var isFirstLine = i === 0; | ||
var isLastLine = i === lines.length - 1; | ||
var isLastNonEmptyLine = i === lastNonEmptyLine; | ||
// replace rendered whitespace tabs with spaces | ||
var trimmedLine = line.replace(/\t/g, " "); | ||
// trim whitespace touching a newline | ||
if (!isFirstLine) { | ||
trimmedLine = trimmedLine.replace(/^[ ]+/, ""); | ||
} | ||
// trim whitespace touching an endline | ||
if (!isLastLine) { | ||
trimmedLine = trimmedLine.replace(/[ ]+$/, ""); | ||
} | ||
if (trimmedLine) { | ||
if (!isLastNonEmptyLine) { | ||
trimmedLine += " "; | ||
} | ||
args.push(t.literal(trimmedLine)); | ||
} | ||
} | ||
}; | ||
// display names | ||
var addDisplayName = function (id, call) { | ||
var props = call.arguments[0].properties; | ||
var safe = true; | ||
for (var i = 0; i < props.length; i++) { | ||
var prop = props[i]; | ||
if (t.isIdentifier(prop.key, { name: "displayName" })) { | ||
safe = false; | ||
break; | ||
} | ||
} | ||
if (safe) { | ||
props.unshift(t.property("init", t.identifier("displayName"), t.literal(id))); | ||
} | ||
}; | ||
exports.ExportDeclaration = function (node, parent, scope, file) { | ||
if (node.default && react.isCreateClass(node.declaration)) { | ||
addDisplayName(file.opts.basename, node.declaration); | ||
} | ||
}; | ||
exports.AssignmentExpression = | ||
exports.Property = | ||
exports.VariableDeclarator = function (node) { | ||
var left, right; | ||
if (t.isAssignmentExpression(node)) { | ||
left = node.left; | ||
right = node.right; | ||
} else if (t.isProperty(node)) { | ||
left = node.key; | ||
right = node.value; | ||
} else if (t.isVariableDeclarator(node)) { | ||
left = node.id; | ||
right = node.init; | ||
} | ||
if (t.isMemberExpression(left)) { | ||
left = left.property; | ||
} | ||
if (t.isIdentifier(left) && react.isCreateClass(right)) { | ||
addDisplayName(left.name, right); | ||
} | ||
}; | ||
}); |
{ | ||
"name": "6to5", | ||
"description": "Turn ES6 code into readable vanilla ES5 with source maps", | ||
"version": "3.4.0", | ||
"version": "3.4.1", | ||
"author": "Sebastian McKenzie <sebmck@gmail.com>", | ||
@@ -6,0 +6,0 @@ "homepage": "https://6to5.org/", |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1426137
153
12297