2015-01-25 14:03:25 +11:00

103 lines
3.1 KiB
JavaScript

"use strict";
module.exports = CommonJSFormatter;
var DefaultFormatter = require("./_default");
var traverse = require("../../traverse");
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;
}
};
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;
}
util.inherits(CommonJSFormatter, DefaultFormatter);
CommonJSFormatter.prototype.importSpecifier = function (specifier, node, nodes) {
var variableName = t.getSpecifierName(specifier);
// import foo from "foo";
if (t.isSpecifierDefault(specifier)) {
var ref = util.template("require", {
MODULE_NAME: node.source
});
if (!_.contains(this.file.dynamicImported, node)) {
ref = t.callExpression(this.file.addHelper("interop-require"), [ref]);
}
nodes.push(t.variableDeclaration("var", [t.variableDeclarator(variableName, ref)]));
} else {
if (specifier.type === "ImportBatchSpecifier") {
// import * as bar from "foo";
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(
variableName,
t.callExpression(this.file.addHelper("interop-require-wildcard"), [
t.callExpression(t.identifier("require"), [node.source])
])
)
]));
} else {
// import foo from "foo";
nodes.push(util.template("require-assign-key", {
VARIABLE_NAME: variableName,
MODULE_NAME: node.source,
KEY: t.getSpecifierId(specifier)
}));
}
}
};
CommonJSFormatter.prototype.importDeclaration = function (node, nodes) {
// import "foo";
nodes.push(util.template("require", {
MODULE_NAME: node.source
}, true));
};
CommonJSFormatter.prototype.exportDeclaration = function (node, nodes) {
if (node.default && !this.noInteropRequire) {
var declar = node.declaration;
var assign;
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;
}
}
DefaultFormatter.prototype.exportDeclaration.apply(this, arguments);
};
CommonJSFormatter.prototype.exportSpecifier = function (specifier, node, nodes) {
this._exportSpecifier(function () {
return t.callExpression(t.identifier("require"), [node.source]);
}, specifier, node, nodes);
};