var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/Plugin.js var Plugin_exports = {}; __export(Plugin_exports, { default: () => Plugin }); module.exports = __toCommonJS(Plugin_exports); var import_path = require("path"); var import_helper_module_imports = require("@babel/helper-module-imports"); function transCamel(_str, symbol) { const cells = _str.match(/([A-Z]+(?=[A-Z]|$))|([A-Z]?[^A-Z]+)/g) || []; return cells.map((c) => c.toLowerCase()).join(symbol); } function winPath(path) { return path.replace(/\\/g, "/"); } function normalizeCustomName(originCustomName) { if (typeof originCustomName === "string") { const customNameExports = require(originCustomName); return typeof customNameExports === "function" ? customNameExports : customNameExports.default; } return originCustomName; } var Plugin = class { constructor(libraryName, libraryDirectory, style, styleLibraryDirectory, customStyleName, camel2DashComponentName, camel2UnderlineComponentName, fileName, customName, transformToDefaultImport, types, index = 0) { this.libraryName = libraryName; this.libraryDirectory = typeof libraryDirectory === "undefined" ? "lib" : libraryDirectory; this.camel2DashComponentName = typeof camel2DashComponentName === "undefined" ? true : camel2DashComponentName; this.camel2UnderlineComponentName = camel2UnderlineComponentName; this.style = style || false; this.styleLibraryDirectory = styleLibraryDirectory; this.customStyleName = normalizeCustomName(customStyleName); this.fileName = fileName || ""; this.customName = normalizeCustomName(customName); this.transformToDefaultImport = typeof transformToDefaultImport === "undefined" ? true : transformToDefaultImport; this.types = types; this.pluginStateKey = `importPluginState${index}`; } getPluginState(state) { if (!state[this.pluginStateKey]) { state[this.pluginStateKey] = {}; } return state[this.pluginStateKey]; } importMethod(methodName, file, pluginState) { if (!pluginState.selectedMethods[methodName]) { const { style, libraryDirectory } = this; const transformedMethodName = this.camel2UnderlineComponentName ? transCamel(methodName, "_") : this.camel2DashComponentName ? transCamel(methodName, "-") : methodName; const path = winPath( this.customName ? this.customName(transformedMethodName, file) : (0, import_path.join)(this.libraryName, libraryDirectory, transformedMethodName, this.fileName) // eslint-disable-line ); pluginState.selectedMethods[methodName] = this.transformToDefaultImport ? (0, import_helper_module_imports.addDefault)(file.path, path, { nameHint: methodName }) : (0, import_helper_module_imports.addNamed)(file.path, methodName, path); if (this.customStyleName) { const stylePath = winPath(this.customStyleName(transformedMethodName, file)); (0, import_helper_module_imports.addSideEffect)(file.path, `${stylePath}`); } else if (this.styleLibraryDirectory) { const stylePath = winPath( (0, import_path.join)(this.libraryName, this.styleLibraryDirectory, transformedMethodName, this.fileName) ); (0, import_helper_module_imports.addSideEffect)(file.path, `${stylePath}`); } else if (style === true) { (0, import_helper_module_imports.addSideEffect)(file.path, `${path}/style`); } else if (style === "css") { (0, import_helper_module_imports.addSideEffect)(file.path, `${path}/style/css`); } else if (typeof style === "function") { const stylePath = style(path, file); if (stylePath) { (0, import_helper_module_imports.addSideEffect)(file.path, stylePath); } } } return { ...pluginState.selectedMethods[methodName] }; } buildExpressionHandler(node, props, path, state) { const file = path && path.hub && path.hub.file || state && state.file; const { types } = this; const pluginState = this.getPluginState(state); props.forEach((prop) => { if (!types.isIdentifier(node[prop])) return; if (pluginState.specified[node[prop].name] && types.isImportSpecifier(path.scope.getBinding(node[prop].name).path)) { node[prop] = this.importMethod(pluginState.specified[node[prop].name], file, pluginState); } }); } buildDeclaratorHandler(node, prop, path, state) { const file = path && path.hub && path.hub.file || state && state.file; const { types } = this; const pluginState = this.getPluginState(state); const checkScope = (targetNode) => pluginState.specified[targetNode.name] && // eslint-disable-line path.scope.hasBinding(targetNode.name) && // eslint-disable-line path.scope.getBinding(targetNode.name).path.type === "ImportSpecifier"; if (types.isIdentifier(node[prop]) && checkScope(node[prop])) { node[prop] = this.importMethod(pluginState.specified[node[prop].name], file, pluginState); } else if (types.isSequenceExpression(node[prop])) { node[prop].expressions.forEach((expressionNode, index) => { if (types.isIdentifier(expressionNode) && checkScope(expressionNode)) { node[prop].expressions[index] = this.importMethod( pluginState.specified[expressionNode.name], file, pluginState ); } }); } } ProgramEnter(path, state) { const pluginState = this.getPluginState(state); pluginState.specified = /* @__PURE__ */ Object.create(null); pluginState.libraryObjs = /* @__PURE__ */ Object.create(null); pluginState.selectedMethods = /* @__PURE__ */ Object.create(null); pluginState.pathsToRemove = []; } ProgramExit(path, state) { this.getPluginState(state).pathsToRemove.forEach((p) => !p.removed && p.remove()); } ImportDeclaration(path, state) { const { node } = path; if (!node) return; const { value } = node.source; const { libraryName } = this; const { types } = this; const pluginState = this.getPluginState(state); if (value === libraryName) { node.specifiers.forEach((spec) => { if (types.isImportSpecifier(spec)) { pluginState.specified[spec.local.name] = spec.imported.name; } else { pluginState.libraryObjs[spec.local.name] = true; } }); pluginState.pathsToRemove.push(path); } } CallExpression(path, state) { const { node } = path; const file = path && path.hub && path.hub.file || state && state.file; const { name } = node.callee; const { types } = this; const pluginState = this.getPluginState(state); if (types.isIdentifier(node.callee)) { if (pluginState.specified[name]) { node.callee = this.importMethod(pluginState.specified[name], file, pluginState); } } node.arguments = node.arguments.map((arg) => { const { name: argName } = arg; if (pluginState.specified[argName] && path.scope.hasBinding(argName) && path.scope.getBinding(argName).path.type === "ImportSpecifier") { return this.importMethod(pluginState.specified[argName], file, pluginState); } return arg; }); } MemberExpression(path, state) { const { node } = path; const file = path && path.hub && path.hub.file || state && state.file; const pluginState = this.getPluginState(state); if (!node.object || !node.object.name) return; if (pluginState.libraryObjs[node.object.name]) { path.replaceWith(this.importMethod(node.property.name, file, pluginState)); } else if (pluginState.specified[node.object.name] && path.scope.hasBinding(node.object.name)) { const { scope } = path.scope.getBinding(node.object.name); if (scope.path.parent.type === "File") { node.object = this.importMethod(pluginState.specified[node.object.name], file, pluginState); } } } Property(path, state) { const { node } = path; this.buildDeclaratorHandler(node, "value", path, state); } VariableDeclarator(path, state) { const { node } = path; this.buildDeclaratorHandler(node, "init", path, state); } ArrayExpression(path, state) { const { node } = path; const props = node.elements.map((_, index) => index); this.buildExpressionHandler(node.elements, props, path, state); } LogicalExpression(path, state) { const { node } = path; this.buildExpressionHandler(node, ["left", "right"], path, state); } ConditionalExpression(path, state) { const { node } = path; this.buildExpressionHandler(node, ["test", "consequent", "alternate"], path, state); } IfStatement(path, state) { const { node } = path; this.buildExpressionHandler(node, ["test"], path, state); this.buildExpressionHandler(node.test, ["left", "right"], path, state); } ExpressionStatement(path, state) { const { node } = path; const { types } = this; if (types.isAssignmentExpression(node.expression)) { this.buildExpressionHandler(node.expression, ["right"], path, state); } } ReturnStatement(path, state) { const { node } = path; this.buildExpressionHandler(node, ["argument"], path, state); } ExportDefaultDeclaration(path, state) { const { node } = path; this.buildExpressionHandler(node, ["declaration"], path, state); } BinaryExpression(path, state) { const { node } = path; this.buildExpressionHandler(node, ["left", "right"], path, state); } NewExpression(path, state) { const { node } = path; this.buildExpressionHandler(node, ["callee"], path, state); const argumentsProps = node.arguments.map((_, index) => index); this.buildExpressionHandler(node.arguments, argumentsProps, path, state); } SwitchStatement(path, state) { const { node } = path; this.buildExpressionHandler(node, ["discriminant"], path, state); } SwitchCase(path, state) { const { node } = path; this.buildExpressionHandler(node, ["test"], path, state); } ClassDeclaration(path, state) { const { node } = path; this.buildExpressionHandler(node, ["superClass"], path, state); } SequenceExpression(path, state) { const { node } = path; const expressionsProps = node.expressions.map((_, index) => index); this.buildExpressionHandler(node.expressions, expressionsProps, path, state); } };