mm_eslint 1.4.5 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,82 @@
1
+ /**
2
+ * 方法相关修复函数
3
+ * 负责处理方法定义、类方法等AST节点的修复逻辑
4
+ */
5
+ class MethodFix {
6
+ /**
7
+ * 构造函数
8
+ * @param {object} config 配置对象
9
+ */
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+
14
+ /**
15
+ * 创建方法修复函数
16
+ * @param {object} context ESLint上下文
17
+ * @param {object} node AST节点
18
+ * @param {object} error 错误信息
19
+ * @returns {function} 修复函数
20
+ */
21
+ createMethodFixFunction(context, node, error) {
22
+ var old_name = error.name;
23
+ var new_name = error.fix_suggestion;
24
+
25
+ if (!old_name || !new_name) {
26
+ return function(fixer) {
27
+ return [];
28
+ };
29
+ }
30
+
31
+ return function(fixer) {
32
+ // 方法定义特殊处理
33
+ if (node.type === 'MethodDefinition' && node.key && (node.key.type === 'Identifier' || node.key.type === 'PrivateIdentifier') && node.key.name === old_name) {
34
+ // 私有标识符需要保留 # 前缀
35
+ if (node.key.type === 'PrivateIdentifier') {
36
+ return fixer.replaceText(node.key, '#' + new_name);
37
+ }
38
+ return fixer.replaceText(node.key, new_name);
39
+ }
40
+
41
+ // 类中的方法处理
42
+ if (node.type === 'ClassBody' && node.parent && node.parent.type === 'ClassDeclaration') {
43
+ for (var i = 0; i < node.body.length; i++) {
44
+ var method = node.body[i];
45
+ if (method.type === 'MethodDefinition' && method.key && method.key.type === 'Identifier' && method.key.name === old_name) {
46
+ return fixer.replaceText(method.key, new_name);
47
+ }
48
+ }
49
+ }
50
+
51
+ // 通用查找作为备用方案
52
+ var identifier_node = this._findIdentifierNode(node, old_name);
53
+ if (identifier_node) {
54
+ return fixer.replaceText(identifier_node, new_name);
55
+ }
56
+
57
+ return [];
58
+ }.bind(this);
59
+ }
60
+
61
+ /**
62
+ * 查找标识符节点
63
+ * @param {object} node AST节点
64
+ * @param {string} name 名称
65
+ * @returns {object|null} 标识符节点
66
+ */
67
+ _findIdentifierNode(node, name) {
68
+ // 如果是标识符节点且名称匹配
69
+ if (node.type === 'Identifier' && node.name === name) {
70
+ return node;
71
+ }
72
+
73
+ // 如果是方法定义,检查方法名标识符
74
+ if (node.type === 'MethodDefinition' && node.key && node.key.type === 'Identifier' && node.key.name === name) {
75
+ return node.key;
76
+ }
77
+
78
+ return null;
79
+ }
80
+ }
81
+
82
+ module.exports = { MethodFix };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * 参数相关修复函数
3
+ * 负责处理函数参数等AST节点的修复逻辑
4
+ */
5
+ class ParamFix {
6
+ /**
7
+ * 构造函数
8
+ * @param {object} config 配置对象
9
+ */
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+
14
+ /**
15
+ * 创建参数修复函数
16
+ * @param {object} context ESLint上下文
17
+ * @param {object} node AST节点
18
+ * @param {object} error 错误信息
19
+ * @returns {function} 修复函数
20
+ */
21
+ createParamFixFunction(context, node, error) {
22
+ var old_name = error.name;
23
+ var new_name = error.fix_suggestion;
24
+
25
+ if (!old_name || !new_name) {
26
+ return function(fixer) {
27
+ return [];
28
+ };
29
+ }
30
+
31
+ return function(fixer) {
32
+ // 函数参数特殊处理:直接查找参数标识符
33
+ if (node.type === 'Identifier' && node.name === old_name) {
34
+ return fixer.replaceText(node, new_name);
35
+ }
36
+
37
+ // 通用查找作为备用方案
38
+ var identifier_node = this._findIdentifierNode(node, old_name);
39
+ if (identifier_node) {
40
+ return fixer.replaceText(identifier_node, new_name);
41
+ }
42
+
43
+ return [];
44
+ }.bind(this);
45
+ }
46
+
47
+ /**
48
+ * 查找标识符节点
49
+ * @param {object} node AST节点
50
+ * @param {string} name 名称
51
+ * @returns {object|null} 标识符节点
52
+ */
53
+ _findIdentifierNode(node, name) {
54
+ // 如果是标识符节点且名称匹配
55
+ if (node.type === 'Identifier' && node.name === name) {
56
+ return node;
57
+ }
58
+
59
+ return null;
60
+ }
61
+ }
62
+
63
+ module.exports = { ParamFix };
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 属性相关修复函数
3
+ * 负责处理对象属性、类属性定义等AST节点的修复逻辑
4
+ */
5
+ class PropertyFix {
6
+ /**
7
+ * 构造函数
8
+ * @param {object} config 配置对象
9
+ */
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+
14
+ /**
15
+ * 创建属性修复函数
16
+ * @param {object} context ESLint上下文
17
+ * @param {object} node AST节点
18
+ * @param {object} error 错误信息
19
+ * @returns {function} 修复函数
20
+ */
21
+ createPropertyFixFunction(context, node, error) {
22
+ var old_name = error.name;
23
+ var new_name = error.fix_suggestion;
24
+
25
+ if (!old_name || !new_name) {
26
+ return function(fixer) {
27
+ return [];
28
+ };
29
+ }
30
+
31
+ return function(fixer) {
32
+ // 对象属性特殊处理
33
+ if (node.type === 'Property' && node.key && node.key.type === 'Identifier' && node.key.name === old_name) {
34
+ return fixer.replaceText(node.key, new_name);
35
+ }
36
+
37
+ // 类属性定义处理
38
+ if (node.type === 'PropertyDefinition' && node.key && (node.key.type === 'Identifier' || node.key.type === 'PrivateIdentifier') && node.key.name === old_name) {
39
+ // 私有标识符需要保留 # 前缀
40
+ if (node.key.type === 'PrivateIdentifier') {
41
+ return fixer.replaceText(node.key, '#' + new_name);
42
+ }
43
+ return fixer.replaceText(node.key, new_name);
44
+ }
45
+
46
+ // 对象字面量属性处理
47
+ if (node.type === 'ObjectProperty' && node.key && node.key.type === 'Identifier' && node.key.name === old_name) {
48
+ return fixer.replaceText(node.key, new_name);
49
+ }
50
+
51
+ // 赋值表达式中的成员表达式属性处理(如 Usersb.prototype._GetUserpe)
52
+ if (node.type === 'AssignmentExpression' && node.left && node.left.type === 'MemberExpression' &&
53
+ node.left.property && node.left.property.type === 'Identifier' && node.left.property.name === old_name) {
54
+ return fixer.replaceText(node.left.property, new_name);
55
+ }
56
+
57
+ // 通用查找作为备用方案
58
+ var identifier_node = this._findIdentifierNode(node, old_name);
59
+ if (identifier_node) {
60
+ return fixer.replaceText(identifier_node, new_name);
61
+ }
62
+
63
+ return [];
64
+ }.bind(this);
65
+ }
66
+
67
+ /**
68
+ * 查找标识符节点
69
+ * @param {object} node AST节点
70
+ * @param {string} name 名称
71
+ * @returns {object|null} 标识符节点
72
+ */
73
+ _findIdentifierNode(node, name) {
74
+ // 如果是标识符节点且名称匹配
75
+ if (node.type === 'Identifier' && node.name === name) {
76
+ return node;
77
+ }
78
+
79
+ // 如果是属性,检查属性名标识符
80
+ if (node.type === 'Property' && node.key && node.key.type === 'Identifier' && node.key.name === name) {
81
+ return node.key;
82
+ }
83
+
84
+ // 如果是类属性定义,检查属性名标识符
85
+ if (node.type === 'PropertyDefinition' && node.key && node.key.type === 'Identifier' && node.key.name === name) {
86
+ return node.key;
87
+ }
88
+
89
+ return null;
90
+ }
91
+ }
92
+
93
+ module.exports = { PropertyFix };
@@ -0,0 +1,134 @@
1
+ /**
2
+ * 变量相关修复函数
3
+ * 负责处理变量声明、赋值表达式等AST节点的修复逻辑
4
+ */
5
+ class VariableFix {
6
+ /**
7
+ * 构造函数
8
+ * @param {object} config 配置对象
9
+ */
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+
14
+ /**
15
+ * 创建变量声明修复函数
16
+ * @param {object} context ESLint上下文
17
+ * @param {object} node AST节点
18
+ * @param {object} error 错误信息
19
+ * @returns {function} 修复函数
20
+ */
21
+ createVariableFixFunction(context, node, error) {
22
+ var old_name = error.name;
23
+ var new_name = error.fix_suggestion;
24
+
25
+ if (!old_name || !new_name) {
26
+ return function(fixer) {
27
+ return [];
28
+ };
29
+ }
30
+
31
+ return function(fixer) {
32
+ var fixes = [];
33
+
34
+ // 变量声明特殊处理:直接查找变量标识符
35
+ if (node.type === 'VariableDeclarator' && node.id && node.id.type === 'Identifier' && node.id.name === old_name) {
36
+ fixes.push(fixer.replaceText(node.id, new_name));
37
+ }
38
+
39
+ // 赋值表达式中的变量处理
40
+ if (node.type === 'AssignmentExpression' && node.left && node.left.type === 'Identifier' && node.left.name === old_name) {
41
+ fixes.push(fixer.replaceText(node.left, new_name));
42
+ }
43
+
44
+ // 通用查找作为备用方案
45
+ var identifier_node = this._findIdentifierNode(node, old_name);
46
+ if (identifier_node) {
47
+ fixes.push(fixer.replaceText(identifier_node, new_name));
48
+ }
49
+
50
+ return fixes;
51
+ }.bind(this);
52
+ }
53
+
54
+ /**
55
+ * 查找标识符节点
56
+ * @param {object} node AST节点
57
+ * @param {string} name 名称
58
+ * @returns {object|null} 标识符节点
59
+ */
60
+ _findIdentifierNode(node, name) {
61
+ // 如果是标识符节点且名称匹配
62
+ if (node.type === 'Identifier' && node.name === name) {
63
+ return node;
64
+ }
65
+
66
+ // 如果是变量声明,检查声明标识符
67
+ if (node.type === 'VariableDeclaration' && node.declarations && node.declarations.length > 0) {
68
+ for (var i = 0; i < node.declarations.length; i++) {
69
+ var decl = node.declarations[i];
70
+ if (decl.id && decl.id.type === 'Identifier' && decl.id.name === name) {
71
+ return decl.id;
72
+ }
73
+ }
74
+ }
75
+
76
+ // 如果是变量声明器,检查声明标识符
77
+ if (node.type === 'VariableDeclarator' && node.id && node.id.type === 'Identifier' && node.id.name === name) {
78
+ return node.id;
79
+ }
80
+
81
+ // 如果是表达式中的标识符引用(如 Name + Age)
82
+ if (node.type === 'BinaryExpression' || node.type === 'CallExpression' || node.type === 'MemberExpression' || node.type === 'VariableDeclaration') {
83
+ // 递归查找子节点中的标识符
84
+ for (var key in node) {
85
+ if (node[key] && typeof node[key] === 'object') {
86
+ var result = this._findIdentifierNode(node[key], name);
87
+ if (result) {
88
+ return result;
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ return null;
95
+ }
96
+
97
+ /**
98
+ * 查找所有标识符节点
99
+ * @param {object} node AST节点
100
+ * @param {string} name 名称
101
+ * @returns {array} 标识符节点数组
102
+ */
103
+ _findAllIdentifiers(node, name) {
104
+ var identifiers = [];
105
+ var visited = new Set();
106
+
107
+ // 递归遍历AST树
108
+ function traverse(current_node) {
109
+ if (!current_node || typeof current_node !== 'object' || visited.has(current_node)) {
110
+ return;
111
+ }
112
+
113
+ // 标记为已访问,避免无限递归
114
+ visited.add(current_node);
115
+
116
+ // 如果是标识符节点且名称匹配
117
+ if (current_node.type === 'Identifier' && current_node.name === name) {
118
+ identifiers.push(current_node);
119
+ }
120
+
121
+ // 递归遍历所有子节点
122
+ for (var key in current_node) {
123
+ if (current_node[key] && typeof current_node[key] === 'object') {
124
+ traverse(current_node[key]);
125
+ }
126
+ }
127
+ }
128
+
129
+ traverse(node);
130
+ return identifiers;
131
+ }
132
+ }
133
+
134
+ module.exports = { VariableFix };
package/lib/fix.js ADDED
@@ -0,0 +1,160 @@
1
+ /**
2
+ * 自动修复功能类
3
+ * 负责处理命名规范的自动修复逻辑
4
+ * 使用模块化修复函数,根据AST节点类型分发修复任务
5
+ */
6
+ const {
7
+ ClassFix,
8
+ VariableFix,
9
+ FunctionFix,
10
+ PropertyFix,
11
+ MethodFix,
12
+ ParamFix,
13
+ ExportFix
14
+ } = require('./fix/index.js');
15
+
16
+ class Fix {
17
+ /**
18
+ * 构造函数
19
+ * @param {object} config 配置对象
20
+ */
21
+ constructor(config) {
22
+ this.config = config;
23
+
24
+ // 初始化各个修复类实例
25
+ this.class_fix = new ClassFix(config);
26
+ this.variable_fix = new VariableFix(config);
27
+ this.function_fix = new FunctionFix(config);
28
+ this.property_fix = new PropertyFix(config);
29
+ this.method_fix = new MethodFix(config);
30
+ this.param_fix = new ParamFix(config);
31
+ this.export_fix = new ExportFix(config);
32
+ }
33
+
34
+ /**
35
+ * 根据节点类型创建修复函数
36
+ * @param {object} context ESLint上下文
37
+ * @param {object} node AST节点
38
+ * @param {object} error 错误信息
39
+ * @returns {function} 修复函数
40
+ */
41
+ createFixFunction(context, node, error) {
42
+ var node_type = node.type;
43
+ var original_type = error.original_type;
44
+
45
+ // 根据节点类型或错误类型选择对应的修复函数
46
+ switch (node_type) {
47
+ case 'ClassDeclaration':
48
+ case 'ClassExpression':
49
+ return this.class_fix.createClassFixFunction(context, node, error);
50
+
51
+ case 'VariableDeclaration':
52
+ case 'VariableDeclarator':
53
+ case 'AssignmentExpression':
54
+ return this.variable_fix.createVariableFixFunction(context, node, error);
55
+
56
+ case 'FunctionDeclaration':
57
+ case 'FunctionExpression':
58
+ case 'ArrowFunctionExpression':
59
+ case 'CallExpression':
60
+ return this.function_fix.createFunctionFixFunction(context, node, error);
61
+
62
+ case 'Property':
63
+ case 'PropertyDefinition':
64
+ case 'ObjectProperty':
65
+ return this.property_fix.createPropertyFixFunction(context, node, error);
66
+
67
+ case 'MethodDefinition':
68
+ case 'ClassBody':
69
+ return this.method_fix.createMethodFixFunction(context, node, error);
70
+
71
+ case 'Identifier':
72
+ // 如果是参数标识符
73
+ if (original_type && original_type.includes('param')) {
74
+ return this.param_fix.createParamFixFunction(context, node, error);
75
+ }
76
+ // 默认使用变量修复
77
+ return this.variable_fix.createVariableFixFunction(context, node, error);
78
+
79
+ default:
80
+ // 根据错误类型选择修复函数
81
+ return this._createFixByErrorType(context, node, error, original_type);
82
+ }
83
+ }
84
+
85
+ /**
86
+ * 根据错误类型创建修复函数
87
+ * @param {object} context ESLint上下文
88
+ * @param {object} node AST节点
89
+ * @param {object} error 错误信息
90
+ * @param {string} original_type 原始类型
91
+ * @returns {function} 修复函数
92
+ */
93
+ _createFixByErrorType(context, node, error, original_type) {
94
+ if (!original_type) {
95
+ return function(fixer) {
96
+ return [];
97
+ };
98
+ }
99
+
100
+ switch (original_type) {
101
+ case 'class':
102
+ case 'super-class':
103
+ return this.class_fix.createClassFixFunction(context, node, error);
104
+
105
+ case 'variable':
106
+ case 'object':
107
+ case 'constant':
108
+ return this.variable_fix.createVariableFixFunction(context, node, error);
109
+
110
+ case 'function':
111
+ return this.function_fix.createFunctionFixFunction(context, node, error);
112
+
113
+ case 'property':
114
+ case 'object-property':
115
+ case 'class-property':
116
+ return this.property_fix.createPropertyFixFunction(context, node, error);
117
+
118
+ case 'method':
119
+ case 'class-method':
120
+ return this.method_fix.createMethodFixFunction(context, node, error);
121
+
122
+ case 'param':
123
+ case 'function-param':
124
+ case 'arrow-function-param':
125
+ return this.param_fix.createParamFixFunction(context, node, error);
126
+
127
+ default:
128
+ return this.variable_fix.createVariableFixFunction(context, node, error);
129
+ }
130
+ }
131
+
132
+ /**
133
+ * 修复导出语句中的引用
134
+ * @param {object} context ESLint上下文
135
+ * @param {string} old_name 旧名称
136
+ * @param {string} new_name 新名称
137
+ * @param {object} node AST节点
138
+ * @param {object} fixer 修复器
139
+ * @returns {array} 修复数组
140
+ */
141
+ fixExportReferences(context, old_name, new_name, node, fixer) {
142
+ return this.export_fix.fixExportReferences(context, old_name, new_name, node, fixer);
143
+ }
144
+
145
+ /**
146
+ * 创建修复函数(向后兼容)
147
+ * @param {Object} error 错误对象
148
+ * @param {string} suggestion 建议修复内容
149
+ * @returns 修复对象
150
+ */
151
+ createFunction(error, suggestion) {
152
+ // 保持向后兼容,但实际修复逻辑已转移到模块化修复函数中
153
+ return {
154
+ range: error.range,
155
+ text: suggestion
156
+ };
157
+ }
158
+ }
159
+
160
+ module.exports = { Fix };
@@ -107,6 +107,14 @@ module.exports = {
107
107
  * @returns {object} 包含前缀和实际名称的对象
108
108
  */
109
109
  getRealName(name) {
110
+ // 如果name为undefined或null,返回默认值
111
+ if (name === undefined || name === null) {
112
+ return {
113
+ prefix: '',
114
+ real_name: ''
115
+ };
116
+ }
117
+
110
118
  var real_name = name;
111
119
  var prefix = '';
112
120
  if (real_name.indexOf('_') === 0) {
@@ -1,5 +1,5 @@
1
- const { Config } = require('./config');
2
- const { splitWords, getRealName } = require('./util');
1
+ const { Config } = require('./config.js');
2
+ const { splitWords, getRealName } = require('./util.js');
3
3
 
4
4
  /**
5
5
  * 命名规范验证器类
@@ -152,7 +152,7 @@ Validator.prototype._validateLength = function (name, min = 1, max = 32) {
152
152
  * @returns {string} 验证类型
153
153
  */
154
154
  Validator.prototype._getValidationType = function (original_type) {
155
- return original_type.replace('property-', '').replace('static-', '').replace('prototype-', '').replace('private-', '').replace('internal-', '').replace('use-', '').replace('param-', '');
155
+ return this.config.getType(original_type);
156
156
  };
157
157
 
158
158
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mm_eslint",
3
- "version": "1.4.5",
4
- "description": "ESLint plugin for naming conventions - PascalCase, camelCase, snake_case, and UPPER_SNAKE_CASE naming rules",
3
+ "version": "1.4.7",
4
+ "description": "ESLint plugin for personal naming conventions - supports PascalCase, camelCase, snake_case, and UPPER_SNAKE_CASE naming rules with intelligent recommendations",
5
5
  "main": "index.js",
6
6
  "keywords": [
7
7
  "eslint",
@@ -13,7 +13,12 @@
13
13
  "pascalcase",
14
14
  "camelcase",
15
15
  "snake-case",
16
- "code-quality"
16
+ "code-quality",
17
+ "javascript",
18
+ "linting",
19
+ "code-style",
20
+ "best-practices",
21
+ "development-tools"
17
22
  ],
18
23
  "author": "qww",
19
24
  "license": "ISC",
@@ -32,20 +37,12 @@
32
37
  "eslint": ">=8.0.0"
33
38
  },
34
39
  "scripts": {
35
- "test": "node test_module_integration.js",
40
+ "test": "node test_basic.js",
36
41
  "lint": "npx eslint . --config eslint.config.js"
37
42
  },
38
43
  "files": [
39
- "config.js",
40
- "corrector.js",
41
- "detector.js",
42
- "eslint.config.js",
43
- "fix.js",
44
- "handler.js",
45
44
  "index.js",
46
- "tip.js",
47
- "util.js",
48
- "validator.js",
45
+ "lib/",
49
46
  "README.md",
50
47
  "README_EN.md",
51
48
  "LICENSE"