Files
wechatpay-enterprise-web/node_modules/babel-plugin-import/lib/Plugin.js
jefferyzhao b9bdc8598b first commit
2025-07-31 17:44:12 +08:00

257 lines
11 KiB
JavaScript

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);
}
};