var path = require("path"); var util = require("../util"); var b = require("ast-types").builders; var _ = require("lodash"); var toModuleNameIdentifier = function (node) { var id = node.source.value; id = path.basename(id, path.extname(id)); id = util.camelCase(id); return b.identifier(id); }; exports.ImportDeclaration = function (node) { var nodes = []; if (node.specifiers.length) { _.each(node.specifiers, function (specifier) { var variableName = specifier.name || specifier.id; var key = specifier.id.name; var templateName = "require-assign"; if (specifier.type === "ImportSpecifier") { if (key !== "default") templateName += "-key"; } nodes.push(util.template(templateName, { VARIABLE_NAME: variableName.name, MODULE_NAME: node.source.raw, KEY: key })); }); } else { nodes.push(util.template("require-assign", { VARIABLE_NAME: toModuleNameIdentifier(node), MODULE_NAME: node.source.raw })); } return nodes; }; var pushSpecifiers = function (node, nodes) { _.each(node.specifiers, function (specifier) { var variableName = specifier.name || specifier.id; if (node.source) { if (specifier.type === "ExportBatchSpecifier") { nodes.push(util.template("exports-wildcard", { MODULE_NAME: node.source.raw }, true)); } else { var templateName; if (variableName.name === "default") { templateName = "exports-default-require"; } else { templateName = "exports-require-assign"; } if (specifier.id.name !== "default") templateName += "-key"; nodes.push(util.template(templateName, { VARIABLE_NAME: variableName.name, MODULE_NAME: node.source.raw, KEY: specifier.id }, true)); } } else { if (variableName.name === "default") { nodes.push(util.template("exports-default", { VALUE: specifier.id }, true)); } else { nodes.push(util.template("exports-assign", { VALUE: specifier.id, KEY: variableName }, true)); } } }); }; var pushDeclaration = function (node, nodes) { var declar = node.declaration; if (node.default) { if (declar.type === "FunctionDeclaration") { declar.type = "FunctionExpression"; } else if (declar.type === "ClassDeclaration") { declar.type = "ClassExpression"; } nodes.push(util.template("exports-default", { VALUE: declar }, true)); } else { var id = declar.id; if (declar.type === "VariableDeclaration") { id = declar.declarations[0].id; } nodes.push(declar); nodes.push(util.template("exports-assign", { VALUE: id, KEY: id }, true)); } }; exports.ExportDeclaration = function (node) { var nodes = []; if (node.declaration) { pushDeclaration(node, nodes); } else { pushSpecifiers(node, nodes); } return nodes; };