better categorisation of transformers
This commit is contained in:
parent
c7e4213641
commit
063fec0ca6
@ -3,6 +3,7 @@
|
||||
module.exports = transform;
|
||||
|
||||
var Transformer = require("./transformer");
|
||||
var object = require("../helpers/object");
|
||||
var File = require("../file");
|
||||
var util = require("../util");
|
||||
var _ = require("lodash");
|
||||
@ -24,7 +25,7 @@ transform.fromAst = function (ast, code, opts) {
|
||||
transform._ensureTransformerNames = function (type, keys) {
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var key = keys[i];
|
||||
if (!_.has(transform.transformers, key)) {
|
||||
if (!transform.transformers[key]) {
|
||||
throw new ReferenceError(
|
||||
"Unknown transformer " + key + " specified in " + type + " - " +
|
||||
"transformer key names have been changed in 3.0.0 see " +
|
||||
@ -35,7 +36,7 @@ transform._ensureTransformerNames = function (type, keys) {
|
||||
}
|
||||
};
|
||||
|
||||
transform.transformers = {};
|
||||
transform.transformers = object();
|
||||
|
||||
transform.moduleFormatters = {
|
||||
common: require("./modules/common"),
|
||||
@ -46,18 +47,20 @@ transform.moduleFormatters = {
|
||||
};
|
||||
|
||||
_.each({
|
||||
"spec.noForInOfAssignment": require("./transformers/spec/no-for-in-of-assignment"),
|
||||
"spec.setters": require("./transformers/spec/setters"),
|
||||
useStrict: require("./transformers/other/use-strict"),
|
||||
|
||||
"validation.undeclaredVariableCheck": require("./transformers/validation/undeclared-variable-check"),
|
||||
"validation.noForInOfAssignment": require("./transformers/validation/no-for-in-of-assignment"),
|
||||
"validation.setters": require("./transformers/validation/setters"),
|
||||
"spec.blockScopedFunctions": require("./transformers/spec/block-scoped-functions"),
|
||||
"spec.illegalTopLevelThis": require("./transformers/spec/illegal-top-level-this"),
|
||||
|
||||
"playground.malletOperator": require("./transformers/playground/mallet-operator"),
|
||||
"playground.methodBinding": require("./transformers/playground/method-binding"),
|
||||
"playground.memoizationOperator": require("./transformers/playground/memoization-operator"),
|
||||
"playground.objectGetterMemoization": require("./transformers/playground/object-getter-memoization"),
|
||||
|
||||
"optional.asyncToGenerator": require("./transformers/optional/async-to-generator"),
|
||||
"optional.bluebirdCoroutines": require("./transformers/optional/bluebird-coroutines"),
|
||||
"misc.asyncToGenerator": require("./transformers/misc/async-to-generator"),
|
||||
"misc.bluebirdCoroutines": require("./transformers/misc/bluebird-coroutines"),
|
||||
|
||||
react: require("./transformers/other/react"),
|
||||
|
||||
@ -96,9 +99,8 @@ _.each({
|
||||
"es6.blockScoping": require("./transformers/es6/block-scoping"),
|
||||
|
||||
// needs to be after `es6.blockScoping` due to needing `letReferences` set on blocks
|
||||
"optional.blockScopingTDZ": require("./transformers/optional/block-scoping-tdz"),
|
||||
"es6.blockScopingTDZ": require("./transformers/es6/block-scoping-tdz"),
|
||||
|
||||
// needs to before `forOf` because otherwise regenerator wont be able to explode them
|
||||
// needs to be after block scoping since regenerator doesn't support it
|
||||
regenerator: require("./transformers/other/regenerator"),
|
||||
|
||||
@ -110,25 +112,22 @@ _.each({
|
||||
// needs to be after `regenerator` due to needing `regeneratorRuntime` references
|
||||
// needs to be after `es6.forOf` due to needing `Symbol.iterator` references
|
||||
// needs to be before `es6.modules` due to dynamic imports
|
||||
"optional.selfContained": require("./transformers/optional/self-contained"),
|
||||
"misc.selfContained": require("./transformers/misc/self-contained"),
|
||||
|
||||
_blockHoist: require("./transformers/_block-hoist"),
|
||||
|
||||
"optional.protoToAssign": require("./transformers/optional/proto-to-assign"),
|
||||
"spec.protoToAssign": require("./transformers/spec/proto-to-assign"),
|
||||
|
||||
_declarations: require("./transformers/_declarations"),
|
||||
|
||||
useStrict: require("./transformers/other/use-strict"),
|
||||
|
||||
_aliasFunctions: require("./transformers/_alias-functions"),
|
||||
_moduleFormatter: require("./transformers/_module-formatter"),
|
||||
|
||||
"optional.typeofSymbol": require("./transformers/optional/typeof-symbol"),
|
||||
"optional.undefinedToVoid": require("./transformers/optional/undefined-to-void"),
|
||||
"optional.undeclaredVariableCheck": require("./transformers/optional/undeclared-variable-check"),
|
||||
"spec.typeofSymbol": require("./transformers/spec/typeof-symbol"),
|
||||
"spec.undefinedToVoid": require("./transformers/spec/undefined-to-void"),
|
||||
|
||||
"spec.propertyLiterals": require("./transformers/spec/property-literals"),
|
||||
"spec.memberExpressionLiterals": require("./transformers/spec/member-expression-literals")
|
||||
"minification.propertyLiterals": require("./transformers/minification/property-literals"),
|
||||
"minification.memberExpressionLiterals": require("./transformers/minification/member-expression-literals")
|
||||
}, function (transformer, key) {
|
||||
transform.transformers[key] = new Transformer(key, transformer);
|
||||
});
|
||||
|
||||
@ -5,10 +5,11 @@ var t = require("../../../types");
|
||||
exports.MemberExpression = function (node) {
|
||||
var prop = node.property;
|
||||
if (node.computed && t.isLiteral(prop) && t.isValidIdentifier(prop.value)) {
|
||||
// computed literal that is a valid identifier
|
||||
// foo["bar"] => foo.bar
|
||||
node.property = t.identifier(prop.value);
|
||||
node.computed = false;
|
||||
} else if (!node.computed && t.isIdentifier(prop) && !t.isValidIdentifier(prop.name)) {
|
||||
// foo.default -> foo["default"]
|
||||
node.property = t.literal(prop.name);
|
||||
node.computed = true;
|
||||
}
|
||||
@ -5,11 +5,11 @@ var t = require("../../../types");
|
||||
exports.Property = function (node) {
|
||||
var key = node.key;
|
||||
if (t.isLiteral(key) && t.isValidIdentifier(key.value)) {
|
||||
// property key is a literal but a valid identifier
|
||||
// "foo": "bar" -> foo: "bar"
|
||||
node.key = t.identifier(key.value);
|
||||
node.computed = false;
|
||||
} else if (!node.computed && t.isIdentifier(key) && !t.isValidIdentifier(key.name)) {
|
||||
// property key is a keyword
|
||||
// default: "bar" -> "default": "bar"
|
||||
node.key = t.literal(key.name);
|
||||
}
|
||||
};
|
||||
@ -1,48 +0,0 @@
|
||||
var traverse = require("../../../traverse");
|
||||
var t = require("../../../types");
|
||||
|
||||
var visitor = {
|
||||
enter: function (node, parent, scope, context, state) {
|
||||
if (!t.isReferencedIdentifier(node, parent)) return;
|
||||
|
||||
var declared = state.letRefs[node.name];
|
||||
if (!declared) return;
|
||||
|
||||
// declared node is different in this scope
|
||||
if (scope.get(node.name, true) !== declared) return;
|
||||
|
||||
var declaredLoc = declared.loc;
|
||||
var referenceLoc = node.loc;
|
||||
|
||||
if (!declaredLoc || !referenceLoc) return;
|
||||
|
||||
// does this reference appear on a line before the declaration?
|
||||
var before = referenceLoc.start.line < declaredLoc.start.line;
|
||||
|
||||
if (referenceLoc.start.line === declaredLoc.start.line) {
|
||||
// this reference appears on the same line
|
||||
// check it appears before the declaration
|
||||
before = referenceLoc.start.col < declaredLoc.start.col;
|
||||
}
|
||||
|
||||
if (before) {
|
||||
throw state.file.errorWithNode(node, "Temporal dead zone - accessing a variable before it's initialized");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
exports.optional = true;
|
||||
|
||||
exports.Loop =
|
||||
exports.Program =
|
||||
exports.BlockStatement = function (node, parent, scope, context, file) {
|
||||
var letRefs = node._letReferences;
|
||||
if (!letRefs) return;
|
||||
|
||||
var state = {
|
||||
letRefs: letRefs,
|
||||
file: file
|
||||
};
|
||||
|
||||
traverse(node, visitor, scope, state);
|
||||
};
|
||||
@ -7,7 +7,6 @@
|
||||
|
||||
var esutils = require("esutils");
|
||||
var t = require("../../../types");
|
||||
var _ = require("lodash");
|
||||
|
||||
exports.JSXIdentifier = function (node) {
|
||||
if (esutils.keyword.isIdentifierName(node.name)) {
|
||||
@ -148,7 +147,7 @@ exports.JSXElement = {
|
||||
for (var i = 0; i < node.children.length; i++) {
|
||||
var child = node.children[i];
|
||||
|
||||
if (t.isLiteral(child) && _.isString(child.value)) {
|
||||
if (t.isLiteral(child) && typeof child.value === "string") {
|
||||
cleanJSXElementLiteralChild(child, callExpr.arguments);
|
||||
continue;
|
||||
} else if (t.isJSXEmptyExpression(child)) {
|
||||
|
||||
@ -10,3 +10,12 @@ exports.ast = {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
exports.FunctionDeclaration =
|
||||
exports.FunctionExpression = function (node, parent, scope, context) {
|
||||
context.skip();
|
||||
};
|
||||
|
||||
exports.ThisExpression = function (node, parent, scope, context, file) {
|
||||
throw file.errorWithNode(node, "Top level `this` is not allowed", ReferenceError);
|
||||
};
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
exports.FunctionDeclaration =
|
||||
exports.FunctionExpression = function (node, parent, scope, context) {
|
||||
context.skip();
|
||||
};
|
||||
|
||||
exports.ThisExpression = function (node, parent, scope, context, file) {
|
||||
throw file.errorWithNode(node, "Top level `this` is not allowed", ReferenceError);
|
||||
};
|
||||
4
test/fixtures/transformation/misc-async-to-generator/options.json
vendored
Normal file
4
test/fixtures/transformation/misc-async-to-generator/options.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"noCheckAst": true,
|
||||
"optional": ["misc.asyncToGenerator"]
|
||||
}
|
||||
4
test/fixtures/transformation/misc-bluebird-coroutines/options.json
vendored
Normal file
4
test/fixtures/transformation/misc-bluebird-coroutines/options.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"optional": ["misc.bluebirdCoroutines"],
|
||||
"noCheckAst": true
|
||||
}
|
||||
4
test/fixtures/transformation/misc-self-contained/options.json
vendored
Normal file
4
test/fixtures/transformation/misc-self-contained/options.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"optional": ["misc.selfContained"],
|
||||
"experimental": true
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
{
|
||||
"noCheckAst": true,
|
||||
"optional": ["asyncToGenerator"]
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
{
|
||||
"optional": ["bluebirdCoroutines"],
|
||||
"noCheckAst": true
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
{
|
||||
"optional": ["protoToAssign"]
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
{
|
||||
"optional": ["selfContained"],
|
||||
"experimental": true
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
{
|
||||
"optional": ["typeofSymbol"]
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
{
|
||||
"optional": ["undeclaredVariableCheck"]
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
{
|
||||
"optional": ["undefinedToVoid"]
|
||||
}
|
||||
3
test/fixtures/transformation/spec-proto-to-assign/options.json
vendored
Normal file
3
test/fixtures/transformation/spec-proto-to-assign/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"optional": ["spec.protoToAssign"]
|
||||
}
|
||||
3
test/fixtures/transformation/spec-typeof-symbol/options.json
vendored
Normal file
3
test/fixtures/transformation/spec-typeof-symbol/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"optional": ["spec.typeofSymbol"]
|
||||
}
|
||||
3
test/fixtures/transformation/spec-undefined-to-void/options.json
vendored
Normal file
3
test/fixtures/transformation/spec-undefined-to-void/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"optional": ["spec.undefinedToVoid"]
|
||||
}
|
||||
3
test/fixtures/transformation/use-strict/illegal-this-root-call/options.json
vendored
Normal file
3
test/fixtures/transformation/use-strict/illegal-this-root-call/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Top level `this` is not allowed"
|
||||
}
|
||||
3
test/fixtures/transformation/use-strict/illegal-this-root-declaration/options.json
vendored
Normal file
3
test/fixtures/transformation/use-strict/illegal-this-root-declaration/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Top level `this` is not allowed"
|
||||
}
|
||||
3
test/fixtures/transformation/use-strict/illegal-this-root-reference/options.json
vendored
Normal file
3
test/fixtures/transformation/use-strict/illegal-this-root-reference/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Top level `this` is not allowed"
|
||||
}
|
||||
3
test/fixtures/transformation/validation-undeclared-variable-check/options.json
vendored
Normal file
3
test/fixtures/transformation/validation-undeclared-variable-check/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"optional": ["validation.undeclaredVariableCheck"]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user