clean up module formatters and fix interopRequireWildcard helper

This commit is contained in:
Sebastian McKenzie
2015-01-26 00:14:04 +11:00
parent 3d355566dc
commit 75460b91d8
33 changed files with 95 additions and 78 deletions

View File

@@ -12,6 +12,8 @@ function DefaultFormatter(file) {
this.file = file;
this.ids = object();
this.hasNonDefaultExports = false;
this.hasLocalExports = false;
this.hasLocalImports = false;
@@ -27,8 +29,9 @@ function DefaultFormatter(file) {
DefaultFormatter.prototype.bumpImportOccurences = function (node) {
var source = node.source.value;
this.localImportOccurences[source] = this.localImportOccurences[source] || 0;
this.localImportOccurences[source] += node.specifiers.length;
var occurs = this.localImportOccurences;
occurs[source] = occurs[source] || 0;
occurs[source] += node.specifiers.length;
};
var exportsVisitor = {
@@ -36,10 +39,15 @@ var exportsVisitor = {
var declar = node && node.declaration;
if (t.isExportDeclaration(node)) {
formatter.hasLocalImports = true;
if (declar && t.isStatement(declar)) {
_.extend(formatter.localExports, t.getIds(declar, true));
}
if (!node.default) {
formatter.hasNonDefaultExports = true;
}
if (node.source) {
formatter.bumpImportOccurences(node);
}
@@ -189,14 +197,14 @@ DefaultFormatter.prototype._hoistExport = function (declar, assign, priority) {
return assign;
};
DefaultFormatter.prototype.push = function (node, nodes) {
DefaultFormatter.prototype.getExternalReference = function (node, nodes) {
var ids = this.ids;
var id = node.source.value;
if (ids[id]) {
return ids[id];
} else {
return this.ids[id] = this._push(node, nodes);
return this.ids[id] = this._getExternalReference(node, nodes);
}
};
@@ -205,11 +213,11 @@ DefaultFormatter.prototype.exportSpecifier = function (specifier, node, nodes) {
if (node.specifiers.length === 1) inherits = node;
if (node.source) {
var ref = this.push(node, nodes);
var ref = this.getExternalReference(node, nodes);
if (t.isExportBatchSpecifier(specifier)) {
// export * from "foo";
nodes.push(this._exportsWildcard(ref, node));
nodes.push(this.buildExportsWildcard(ref, node));
} else {
var ref;
if (t.isSpecifierDefault(specifier) && !this.noInteropRequire) {
@@ -220,7 +228,7 @@ DefaultFormatter.prototype.exportSpecifier = function (specifier, node, nodes) {
}
// export { foo } from "test";
nodes.push(this._exportsAssign(
nodes.push(this.buildExportsAssignment(
t.getSpecifierName(specifier),
ref,
node
@@ -228,18 +236,18 @@ DefaultFormatter.prototype.exportSpecifier = function (specifier, node, nodes) {
}
} else {
// export { foo };
nodes.push(this._exportsAssign(t.getSpecifierName(specifier), specifier.id, node));
nodes.push(this.buildExportsAssignment(t.getSpecifierName(specifier), specifier.id, node));
}
};
DefaultFormatter.prototype._exportsWildcard = function (objectIdentifier) {
DefaultFormatter.prototype.buildExportsWildcard = function (objectIdentifier) {
return t.expressionStatement(t.callExpression(this.file.addHelper("defaults"), [
t.identifier("exports"),
t.callExpression(this.file.addHelper("interop-require-wildcard"), [objectIdentifier])
]));
};
DefaultFormatter.prototype._exportsAssign = function (id, init) {
DefaultFormatter.prototype.buildExportsAssignment = function (id, init) {
return util.template("exports-assign", {
VALUE: init,
KEY: id
@@ -261,7 +269,7 @@ DefaultFormatter.prototype.exportDeclaration = function (node, nodes) {
for (var i = 0; i < declar.declarations.length; i++) {
var decl = declar.declarations[i];
decl.init = this._exportsAssign(decl.id, decl.init, node).expression;
decl.init = this.buildExportsAssignment(decl.id, decl.init, node).expression;
var newDeclar = t.variableDeclaration(declar.kind, [decl]);
if (i === 0) t.inherits(newDeclar, declar);
@@ -275,7 +283,7 @@ DefaultFormatter.prototype.exportDeclaration = function (node, nodes) {
nodes.push(declar);
}
assign = this._exportsAssign(id, ref, node);
assign = this.buildExportsAssignment(id, ref, node);
nodes.push(assign);

View File

@@ -67,17 +67,17 @@ AMDFormatter.prototype.getModuleName = function () {
}
};
AMDFormatter.prototype._push = function (node) {
AMDFormatter.prototype._getExternalReference = function (node) {
return this.file.generateUidIdentifier(node.source.value);
};
AMDFormatter.prototype.importDeclaration = function (node) {
this.push(node);
this.getExternalReference(node);
};
AMDFormatter.prototype.importSpecifier = function (specifier, node, nodes) {
var key = t.getSpecifierName(specifier);
var ref = this.push(node);
var ref = this.getExternalReference(node);
if (_.contains(this.file.dynamicImported, node)) {
// Prevent unnecessary renaming of dynamic imports.
@@ -99,7 +99,7 @@ AMDFormatter.prototype.importSpecifier = function (specifier, node, nodes) {
};
AMDFormatter.prototype.exportDeclaration = function (node) {
if (node.default && !this.noInteropRequire) {
if (node.default && !this.noInteropRequire && !this.hasNonDefaultExports) {
this.passModuleArg = true;
}

View File

@@ -8,23 +8,13 @@ var util = require("../../util");
var t = require("../../types");
var _ = require("lodash");
var visitor = {
enter: function (node, parent, scope, context, state) {
if (t.isExportDeclaration(node) && !node.default) {
state.hasNonDefaultExports = true;
context.stop();
}
}
};
function CommonJSFormatter(file) {
DefaultFormatter.apply(this, arguments);
var state = { hasNonDefaultExports: false };
traverse(file.ast, visitor, file.scope, state);
this.insertedModuleDeclaration = false;
this.hasNonDefaultExports = state.hasNonDefaultExports;
if (this.hasNonDefaultExports) {
file.ast.program.body.push(util.template("exports-module-declaration", true));
}
}
util.inherits(CommonJSFormatter, DefaultFormatter);
@@ -32,7 +22,7 @@ util.inherits(CommonJSFormatter, DefaultFormatter);
CommonJSFormatter.prototype.importSpecifier = function (specifier, node, nodes) {
var variableName = t.getSpecifierName(specifier);
var ref = this.push(node, nodes);
var ref = this.getExternalReference(node, nodes);
// import foo from "foo";
if (t.isSpecifierDefault(specifier)) {
@@ -71,34 +61,25 @@ CommonJSFormatter.prototype.importDeclaration = function (node, nodes) {
};
CommonJSFormatter.prototype.exportDeclaration = function (node, nodes) {
if (node.default && !this.noInteropRequire) {
if (node.default && !this.noInteropRequire && !this.hasNonDefaultExports) {
var declar = node.declaration;
var assign;
var assign = util.template("exports-default-assign", {
VALUE: this._pushStatement(declar, nodes)
}, true);
if (this.hasNonDefaultExports) {
if (!this.insertedModuleDeclaration) {
nodes.push(util.template("exports-module-declaration", true));
this.insertedModuleDeclaration = true;
}
} else {
var assign = util.template("exports-default-assign", {
VALUE: this._pushStatement(declar, nodes)
}, true);
if (t.isFunctionDeclaration(declar)) {
// we can hoist this assignment to the top of the file
assign._blockHoist = 3;
}
nodes.push(assign);
return;
if (t.isFunctionDeclaration(declar)) {
// we can hoist this assignment to the top of the file
assign._blockHoist = 3;
}
nodes.push(assign);
return;
}
DefaultFormatter.prototype.exportDeclaration.apply(this, arguments);
};
CommonJSFormatter.prototype._push = function (node, nodes) {
CommonJSFormatter.prototype._getExternalReference = function (node, nodes) {
var source = node.source.value;
var call = t.callExpression(t.identifier("require"), [node.source]);

View File

@@ -23,7 +23,7 @@ SystemFormatter.prototype._addImportSource = function (node, exportNode) {
return node;
};
SystemFormatter.prototype._exportsWildcard = function (objectIdentifier, node) {
SystemFormatter.prototype.buildExportsWildcard = function (objectIdentifier, node) {
var leftIdentifier = this.file.generateUidIdentifier("key");
var valIdentifier = t.memberExpression(objectIdentifier, leftIdentifier, true);
@@ -40,7 +40,7 @@ SystemFormatter.prototype._exportsWildcard = function (objectIdentifier, node) {
return this._addImportSource(t.forInStatement(left, right, block), node);
};
SystemFormatter.prototype._exportsAssign = function (id, init, node) {
SystemFormatter.prototype.buildExportsAssignment = function (id, init, node) {
var call = this.buildExportCall(t.literal(id.name), init, true);
return this._addImportSource(call, node);
};

View File

@@ -1,3 +1,3 @@
(function (obj) {
return obj && obj.__esModule ? obj.default : { default: obj };
return obj && obj.__esModule ? obj : { default: obj };
})

View File

@@ -2,7 +2,7 @@ define(["exports", "foo"], function (exports, _foo) {
"use strict";
var _interopRequireWildcard = function (obj) {
return obj && obj.__esModule ? obj["default"] : {
return obj && obj.__esModule ? obj : {
"default": obj
};
};
@@ -26,4 +26,5 @@ define(["exports", "foo"], function (exports, _foo) {
exports["default"] = _foo.foo;
exports["default"] = _foo.foo;
exports.bar = _foo.bar;
exports.__esModule = true;
});

View File

@@ -8,4 +8,5 @@ define(["exports"], function (exports) {
exports["default"] = foo;
exports["default"] = foo;
exports.bar = bar;
exports.__esModule = true;
});

View File

@@ -14,4 +14,5 @@ define(["exports"], function (exports) {
var foo8 = function foo8() {};
exports.foo8 = foo8;
});
exports.__esModule = true;
});

View File

@@ -12,4 +12,5 @@ define(["exports", "./evens"], function (exports, _evens) {
return !isEven(n);
};
})(isEven);
exports.__esModule = true;
});

View File

@@ -1,4 +1,4 @@
define(["exports", "module", "foo", "foo-bar", "./directory/foo-bar"], function (exports, module, _foo, _fooBar, _directoryFooBar) {
define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports, _foo, _fooBar, _directoryFooBar) {
"use strict";
var _interopRequire = function (obj) {
@@ -13,6 +13,6 @@ define(["exports", "module", "foo", "foo-bar", "./directory/foo-bar"], function
exports.test = test;
var test2 = exports.test2 = 5;
exports.__esModule = true;
exports["default"] = test;
});
exports.__esModule = true;
});

View File

@@ -10,4 +10,5 @@ define(["exports"], function (exports) {
test = 3;
test++;
})();
exports.__esModule = true;
});

View File

@@ -1,6 +1,6 @@
"use strict";
exports.Cachier = Cachier;
exports.__esModule = true;
exports["default"] = new Cachier();
function Cachier(databaseName) {}
exports.__esModule = true;

View File

@@ -1,7 +1,7 @@
"use strict";
var _interopRequireWildcard = function (obj) {
return obj && obj.__esModule ? obj["default"] : {
return obj && obj.__esModule ? obj : {
"default": obj
};
};
@@ -27,3 +27,4 @@ exports.bar = _foo.foo;
exports["default"] = _foo.foo;
exports["default"] = _foo.foo;
exports.bar = _foo.bar;
exports.__esModule = true;

View File

@@ -7,3 +7,4 @@ exports.bar = foo;
exports["default"] = foo;
exports["default"] = foo;
exports.bar = bar;
exports.__esModule = true;

View File

@@ -13,3 +13,4 @@ function foo7() {}
var foo8 = function foo8() {};
exports.foo8 = foo8;
exports.__esModule = true;

View File

@@ -10,4 +10,5 @@ var isOdd = exports.isOdd = (function (isEven) {
return function (n) {
return !isEven(n);
};
})(isEven);
})(isEven);
exports.__esModule = true;

View File

@@ -1,7 +1,7 @@
"use strict";
var _interopRequireWildcard = function (obj) {
return obj && obj.__esModule ? obj["default"] : {
return obj && obj.__esModule ? obj : {
"default": obj
};
};

View File

@@ -1,7 +1,7 @@
"use strict";
var _interopRequireWildcard = function (obj) {
return obj && obj.__esModule ? obj["default"] : {
return obj && obj.__esModule ? obj : {
"default": obj
};
};
@@ -23,4 +23,5 @@ var foo2 = _interopRequireWildcard(require("foo3"));
var bar = require("foo4").bar;
var bar2 = require("foo5").foo;
exports.test = test;
var test = exports.test = 5;
var test = exports.test = 5;
exports.__esModule = true;

View File

@@ -9,3 +9,4 @@ test = exports.test += 1;
test = 3;
test++;
})();
exports.__esModule = true;

View File

@@ -21,6 +21,8 @@ System.register(["foo"], function (_export) {
_export("bar", _foo.bar);
}],
execute: function () {}
execute: function () {
exports.__esModule = true;
}
};
});

View File

@@ -18,6 +18,8 @@ System.register([], function (_export) {
return {
setters: [],
execute: function () {}
execute: function () {
exports.__esModule = true;
}
};
});
});

View File

@@ -17,6 +17,8 @@ System.register([], function (_export) {
_export("default", foo);
_export("bar", bar);
exports.__esModule = true;
}
};
});

View File

@@ -19,6 +19,7 @@ System.register([], function (_export) {
_export("foo8", foo8);
_export("foo3", foo3 = 5);
exports.__esModule = true;
}
};
});
});

View File

@@ -19,6 +19,7 @@ System.register(["./evens"], function (_export) {
return !isEven(n);
};
})(isEven));
exports.__esModule = true;
}
};
});

View File

@@ -14,6 +14,8 @@ System.register(["foo", "foo-bar", "./directory/foo-bar"], function (_export) {
test2 = _export("test2", 5);
_export("default", test);
exports.__esModule = true;
}
};
});
});

View File

@@ -14,6 +14,7 @@ System.register([], function (_export) {
test = 3;
test++;
})();
exports.__esModule = true;
}
};
});

View File

@@ -8,7 +8,7 @@
"use strict";
var _interopRequireWildcard = function (obj) {
return obj && obj.__esModule ? obj["default"] : {
return obj && obj.__esModule ? obj : {
"default": obj
};
};
@@ -32,4 +32,5 @@
exports["default"] = _foo.foo;
exports["default"] = _foo.foo;
exports.bar = _foo.bar;
exports.__esModule = true;
});

View File

@@ -14,4 +14,5 @@
exports["default"] = foo;
exports["default"] = foo;
exports.bar = bar;
exports.__esModule = true;
});

View File

@@ -20,4 +20,5 @@
var foo8 = function foo8() {};
exports.foo8 = foo8;
});
exports.__esModule = true;
});

View File

@@ -18,4 +18,5 @@
return !isEven(n);
};
})(isEven);
exports.__esModule = true;
});

View File

@@ -1,10 +1,10 @@
(function (factory) {
if (typeof define === "function" && define.amd) {
define(["exports", "module", "foo", "foo-bar", "./directory/foo-bar"], factory);
} else if (typeof exports !== "undefined" && typeof module !== "undefined") {
factory(exports, module, require("foo"), require("foo-bar"), require("./directory/foo-bar"));
define(["exports", "foo", "foo-bar", "./directory/foo-bar"], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require("foo"), require("foo-bar"), require("./directory/foo-bar"));
}
})(function (exports, module, _foo, _fooBar, _directoryFooBar) {
})(function (exports, _foo, _fooBar, _directoryFooBar) {
"use strict";
var _interopRequire = function (obj) {
@@ -19,6 +19,6 @@
exports.test = test;
var test2 = exports.test2 = 5;
exports.__esModule = true;
exports["default"] = test;
});
exports.__esModule = true;
});

View File

@@ -16,4 +16,5 @@
test = 3;
test++;
})();
exports.__esModule = true;
});

View File

@@ -26,4 +26,5 @@ var foo = _to5Helpers.interopRequire(_someModule);
var bar = _to5Helpers.interopRequireWildcard(_someModule);
var myWord = exports.myWord = _core.Symbol("abc");
var myWord = exports.myWord = _core.Symbol("abc");
exports.__esModule = true;