ts-add-module-exports
Version:
Adds `module.exports = exports['default'];` for `exports.default`, for CommonJS default export interoperability.
72 lines (71 loc) • 2.86 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var ast_types_1 = __importDefault(require("ast-types"));
var n = ast_types_1.default.namedTypes;
function isRootLevel(ast, node) {
return ast.program.body.indexOf(node) !== -1;
}
function isExports(objectName, propertyName) {
return ((objectName === "exports" || objectName === "_exports") &&
propertyName !== "__esModule");
}
function hasExports(ast) {
var hasModuleExports = false;
var hasExportsNamed = false;
var hasExportsDefault = false;
ast_types_1.default.visit(ast, {
visitMemberExpression: function (path) {
if (isRootLevel(ast, path.parent.parent.value) &&
n.Identifier.check(path.node.object) &&
n.Identifier.check(path.node.property)) {
var objectName = path.node.object.name;
var propertyName = path.node.property.name;
if (isExports(objectName, propertyName)) {
if (propertyName === "default") {
hasExportsDefault = true;
}
else {
hasExportsNamed = true;
}
}
if (objectName + "." + propertyName === "module.exports") {
hasModuleExports = true;
}
}
this.traverse(path);
},
visitCallExpression: function (path) {
if (isRootLevel(ast, path.parent.value) &&
n.MemberExpression.check(path.node.callee) &&
n.Identifier.check(path.node.callee.object) &&
n.Identifier.check(path.node.callee.property) &&
path.node.callee.object.name === "Object" &&
path.node.callee.property.name === "defineProperty") {
var obj = path.node.arguments[0];
var prop = path.node.arguments[1];
if (n.Identifier.check(obj) && n.Identifier.check(prop)) {
var objectName = obj.name;
var propertyName = prop.name;
if (isExports(objectName, propertyName)) {
if (propertyName === "default") {
hasExportsDefault = true;
}
else {
hasExportsNamed = true;
}
}
}
}
this.traverse(path);
}
});
return {
hasModuleExports: hasModuleExports,
hasExportsNamed: hasExportsNamed,
hasExportsDefault: hasExportsDefault
};
}
exports.hasExports = hasExports;