mm_eslint 1.4.4 → 1.4.5

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.
package/eslint.config.js CHANGED
@@ -3,12 +3,15 @@ const mmEslint = require('./index.js');
3
3
  module.exports = [
4
4
  {
5
5
  files: ['**/*.js'],
6
+ ignores: ['node_modules/**', 'eslint.config.js'],
6
7
  languageOptions: {
7
- ecmaVersion: 2022, // 支持类字段等ES2022特性
8
+ ecmaVersion: 'latest', // 支持类字段等ES2022特性
8
9
  sourceType: 'module'
9
10
  },
10
11
  plugins: {
11
- 'mm_eslint': mmEslint
12
+ mm_eslint: {
13
+ rules: mmEslint
14
+ }
12
15
  },
13
16
  rules: {
14
17
  'mm_eslint/class-name': 'error', // 类名命名规则
package/fix.js ADDED
@@ -0,0 +1,441 @@
1
+ /**
2
+ * 自动修复功能类
3
+ * 负责处理命名规范的自动修复逻辑
4
+ */
5
+ class Fix {
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
+ createClassFixFunction(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 === 'ClassDeclaration' && node.id && node.id.type === 'Identifier' && node.id.name === old_name) {
34
+ return fixer.replaceText(node.id, new_name);
35
+ }
36
+
37
+ // 类表达式特殊处理
38
+ if (node.type === 'ClassExpression' && node.id && node.id.type === 'Identifier' && node.id.name === old_name) {
39
+ return fixer.replaceText(node.id, new_name);
40
+ }
41
+
42
+ // 继承的父类名处理
43
+ if (node.type === 'ClassDeclaration' && node.superClass && node.superClass.type === 'Identifier' && node.superClass.name === old_name) {
44
+ return fixer.replaceText(node.superClass, new_name);
45
+ }
46
+
47
+ // 通用查找作为备用方案
48
+ var identifier_node = this._findIdentifierNode(node, old_name);
49
+ if (identifier_node) {
50
+ return fixer.replaceText(identifier_node, new_name);
51
+ }
52
+
53
+ return [];
54
+ }.bind(this);
55
+ }
56
+
57
+ /**
58
+ * 创建变量声明修复函数
59
+ * @param {object} context ESLint上下文
60
+ * @param {object} node AST节点
61
+ * @param {object} error 错误信息
62
+ * @returns {function} 修复函数
63
+ */
64
+ createVariableFixFunction(context, node, error) {
65
+ var old_name = error.name;
66
+ var new_name = error.fix_suggestion;
67
+
68
+ if (!old_name || !new_name) {
69
+ return function(fixer) {
70
+ return [];
71
+ };
72
+ }
73
+
74
+ return function(fixer) {
75
+ // 变量声明特殊处理:直接查找变量标识符
76
+ if (node.type === 'VariableDeclarator' && node.id && node.id.type === 'Identifier' && node.id.name === old_name) {
77
+ return fixer.replaceText(node.id, new_name);
78
+ }
79
+
80
+ // 赋值表达式中的变量处理
81
+ if (node.type === 'AssignmentExpression' && node.left && node.left.type === 'Identifier' && node.left.name === old_name) {
82
+ return fixer.replaceText(node.left, new_name);
83
+ }
84
+
85
+ // 通用查找作为备用方案
86
+ var identifier_node = this._findIdentifierNode(node, old_name);
87
+ if (identifier_node) {
88
+ return fixer.replaceText(identifier_node, new_name);
89
+ }
90
+
91
+ return [];
92
+ }.bind(this);
93
+ }
94
+
95
+ /**
96
+ * 创建属性修复函数
97
+ * @param {object} context ESLint上下文
98
+ * @param {object} node AST节点
99
+ * @param {object} error 错误信息
100
+ * @returns {function} 修复函数
101
+ */
102
+ createPropertyFixFunction(context, node, error) {
103
+ var old_name = error.name;
104
+ var new_name = error.fix_suggestion;
105
+
106
+ if (!old_name || !new_name) {
107
+ return function(fixer) {
108
+ return [];
109
+ };
110
+ }
111
+
112
+ return function(fixer) {
113
+ // 对象属性特殊处理
114
+ if (node.type === 'Property' && node.key && node.key.type === 'Identifier' && node.key.name === old_name) {
115
+ return fixer.replaceText(node.key, new_name);
116
+ }
117
+
118
+ // 类属性定义处理
119
+ if (node.type === 'PropertyDefinition' && node.key && (node.key.type === 'Identifier' || node.key.type === 'PrivateIdentifier') && node.key.name === old_name) {
120
+ // 私有标识符需要保留 # 前缀
121
+ if (node.key.type === 'PrivateIdentifier') {
122
+ return fixer.replaceText(node.key, '#' + new_name);
123
+ }
124
+ return fixer.replaceText(node.key, new_name);
125
+ }
126
+
127
+ // 对象字面量属性处理
128
+ if (node.type === 'ObjectProperty' && node.key && node.key.type === 'Identifier' && node.key.name === old_name) {
129
+ return fixer.replaceText(node.key, new_name);
130
+ }
131
+
132
+ // 赋值表达式中的成员表达式属性处理(如 Usersb.prototype._GetUserpe)
133
+ if (node.type === 'AssignmentExpression' && node.left && node.left.type === 'MemberExpression' &&
134
+ node.left.property && node.left.property.type === 'Identifier' && node.left.property.name === old_name) {
135
+ return fixer.replaceText(node.left.property, new_name);
136
+ }
137
+
138
+ // 通用查找作为备用方案
139
+ var identifier_node = this._findIdentifierNode(node, old_name);
140
+ if (identifier_node) {
141
+ return fixer.replaceText(identifier_node, new_name);
142
+ }
143
+
144
+ return [];
145
+ }.bind(this);
146
+ }
147
+
148
+ /**
149
+ * 创建方法修复函数
150
+ * @param {object} context ESLint上下文
151
+ * @param {object} node AST节点
152
+ * @param {object} error 错误信息
153
+ * @returns {function} 修复函数
154
+ */
155
+ createMethodFixFunction(context, node, error) {
156
+ var old_name = error.name;
157
+ var new_name = error.fix_suggestion;
158
+
159
+ if (!old_name || !new_name) {
160
+ return function(fixer) {
161
+ return [];
162
+ };
163
+ }
164
+
165
+ return function(fixer) {
166
+ // 方法定义特殊处理
167
+ if (node.type === 'MethodDefinition' && node.key && (node.key.type === 'Identifier' || node.key.type === 'PrivateIdentifier') && node.key.name === old_name) {
168
+ // 私有标识符需要保留 # 前缀
169
+ if (node.key.type === 'PrivateIdentifier') {
170
+ return fixer.replaceText(node.key, '#' + new_name);
171
+ }
172
+ return fixer.replaceText(node.key, new_name);
173
+ }
174
+
175
+ // 类中的方法处理
176
+ if (node.type === 'ClassBody' && node.parent && node.parent.type === 'ClassDeclaration') {
177
+ for (var i = 0; i < node.body.length; i++) {
178
+ var method = node.body[i];
179
+ if (method.type === 'MethodDefinition' && method.key && method.key.type === 'Identifier' && method.key.name === old_name) {
180
+ return fixer.replaceText(method.key, new_name);
181
+ }
182
+ }
183
+ }
184
+
185
+ // 通用查找作为备用方案
186
+ var identifier_node = this._findIdentifierNode(node, old_name);
187
+ if (identifier_node) {
188
+ return fixer.replaceText(identifier_node, new_name);
189
+ }
190
+
191
+ return [];
192
+ }.bind(this);
193
+ }
194
+
195
+ /**
196
+ * 创建函数修复函数
197
+ * @param {object} context ESLint上下文
198
+ * @param {object} node AST节点
199
+ * @param {object} error 错误信息
200
+ * @returns {function} 修复函数
201
+ */
202
+ createFunctionFixFunction(context, node, error) {
203
+ var old_name = error.name;
204
+ var new_name = error.fix_suggestion;
205
+
206
+ if (!old_name || !new_name) {
207
+ return function(fixer) {
208
+ return [];
209
+ };
210
+ }
211
+
212
+ return function(fixer) {
213
+ // 函数声明特殊处理
214
+ if (node.type === 'FunctionDeclaration' && node.id && node.id.type === 'Identifier' && node.id.name === old_name) {
215
+ return fixer.replaceText(node.id, new_name);
216
+ }
217
+
218
+ // 函数表达式特殊处理
219
+ if (node.type === 'FunctionExpression' && node.id && node.id.type === 'Identifier' && node.id.name === old_name) {
220
+ return fixer.replaceText(node.id, new_name);
221
+ }
222
+
223
+ // 箭头函数处理(通过父节点查找变量名)
224
+ if (node.type === 'ArrowFunctionExpression' && node.parent && node.parent.type === 'VariableDeclarator' &&
225
+ node.parent.id && node.parent.id.type === 'Identifier' && node.parent.id.name === old_name) {
226
+ return fixer.replaceText(node.parent.id, new_name);
227
+ }
228
+
229
+ // 函数调用处理
230
+ if (node.type === 'CallExpression' && node.callee && node.callee.type === 'Identifier' && node.callee.name === old_name) {
231
+ return fixer.replaceText(node.callee, new_name);
232
+ }
233
+
234
+ // 通用查找作为备用方案
235
+ var identifier_node = this._findIdentifierNode(node, old_name);
236
+ if (identifier_node) {
237
+ return fixer.replaceText(identifier_node, new_name);
238
+ }
239
+
240
+ return [];
241
+ }.bind(this);
242
+ }
243
+
244
+ /**
245
+ * 创建参数修复函数
246
+ * @param {object} context ESLint上下文
247
+ * @param {object} node AST节点
248
+ * @param {object} error 错误信息
249
+ * @returns {function} 修复函数
250
+ */
251
+ createParamFixFunction(context, node, error) {
252
+ var old_name = error.name;
253
+ var new_name = error.fix_suggestion;
254
+
255
+ if (!old_name || !new_name) {
256
+ return function(fixer) {
257
+ return [];
258
+ };
259
+ }
260
+
261
+ return function(fixer) {
262
+ // 函数参数特殊处理:直接查找参数标识符
263
+ if (node.type === 'Identifier' && node.name === old_name) {
264
+ return fixer.replaceText(node, new_name);
265
+ }
266
+
267
+ // 通用查找作为备用方案
268
+ var identifier_node = this._findIdentifierNode(node, old_name);
269
+ if (identifier_node) {
270
+ return fixer.replaceText(identifier_node, new_name);
271
+ }
272
+
273
+ return [];
274
+ }.bind(this);
275
+ }
276
+
277
+ /**
278
+ * 查找标识符节点
279
+ * @param {object} node AST节点
280
+ * @param {string} name 名称
281
+ * @returns {object|null} 标识符节点
282
+ */
283
+ _findIdentifierNode(node, name) {
284
+ // 如果是标识符节点且名称匹配
285
+ if (node.type === 'Identifier' && node.name === name) {
286
+ return node;
287
+ }
288
+
289
+ // 如果是变量声明,检查声明标识符
290
+ if (node.type === 'VariableDeclaration' && node.declarations && node.declarations.length > 0) {
291
+ for (var i = 0; i < node.declarations.length; i++) {
292
+ var decl = node.declarations[i];
293
+ if (decl.id && decl.id.type === 'Identifier' && decl.id.name === name) {
294
+ return decl.id;
295
+ }
296
+ }
297
+ }
298
+
299
+ // 如果是变量声明器,检查声明标识符
300
+ if (node.type === 'VariableDeclarator' && node.id && node.id.type === 'Identifier' && node.id.name === name) {
301
+ return node.id;
302
+ }
303
+
304
+ // 如果是函数声明,检查函数名标识符
305
+ if ((node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression') &&
306
+ node.id && node.id.type === 'Identifier' && node.id.name === name) {
307
+ return node.id;
308
+ }
309
+
310
+ // 如果是类声明,检查类名标识符
311
+ if (node.type === 'ClassDeclaration' && node.id && node.id.type === 'Identifier' && node.id.name === name) {
312
+ return node.id;
313
+ }
314
+
315
+ // 如果是属性,检查属性名标识符
316
+ if (node.type === 'Property' && node.key && node.key.type === 'Identifier' && node.key.name === name) {
317
+ return node.key;
318
+ }
319
+
320
+ // 如果是方法定义,检查方法名标识符
321
+ if (node.type === 'MethodDefinition' && node.key && node.key.type === 'Identifier' && node.key.name === name) {
322
+ return node.key;
323
+ }
324
+
325
+ return null;
326
+ }
327
+
328
+ /**
329
+ * 修复导出语句中的引用
330
+ * @param {object} context ESLint上下文
331
+ * @param {string} old_name 旧名称
332
+ * @param {string} new_name 新名称
333
+ * @param {object} node AST节点
334
+ * @param {object} fixer 修复器
335
+ * @returns {array} 修复数组
336
+ */
337
+ _fixExportReferences(context, old_name, new_name, node, fixer) {
338
+ var fixes = [];
339
+
340
+ // 获取当前文件的完整AST
341
+ var source_code = context.getSourceCode();
342
+ var ast = source_code.ast;
343
+
344
+ // 遍历AST查找导出语句
345
+ this._traverseAST(ast, function(child_node) {
346
+ // 处理 module.exports = { ... } 形式的导出
347
+ if (child_node.type === 'AssignmentExpression' &&
348
+ child_node.left &&
349
+ child_node.left.type === 'MemberExpression' &&
350
+ child_node.left.object &&
351
+ child_node.left.object.type === 'Identifier' &&
352
+ child_node.left.object.name === 'module' &&
353
+ child_node.left.property &&
354
+ child_node.left.property.type === 'Identifier' &&
355
+ child_node.left.property.name === 'exports' &&
356
+ child_node.right &&
357
+ child_node.right.type === 'ObjectExpression') {
358
+
359
+ // 检查对象字面量中的属性
360
+ for (var i = 0; i < child_node.right.properties.length; i++) {
361
+ var property = child_node.right.properties[i];
362
+
363
+ // 处理简写属性(如 { AdminManager })
364
+ if (property.shorthand && property.key && property.key.type === 'Identifier' && property.key.name === old_name) {
365
+ fixes.push(fixer.replaceText(property.key, new_name));
366
+ }
367
+
368
+ // 处理普通属性(如 { AdminManager: AdminManager })
369
+ if (!property.shorthand && property.key && property.key.type === 'Identifier' && property.key.name === old_name) {
370
+ fixes.push(fixer.replaceText(property.key, new_name));
371
+ }
372
+ }
373
+ }
374
+
375
+ // 处理 exports.XXX = ... 形式的导出
376
+ if (child_node.type === 'AssignmentExpression' &&
377
+ child_node.left &&
378
+ child_node.left.type === 'MemberExpression' &&
379
+ child_node.left.object &&
380
+ child_node.left.object.type === 'Identifier' &&
381
+ child_node.left.object.name === 'exports' &&
382
+ child_node.left.property &&
383
+ child_node.left.property.type === 'Identifier' &&
384
+ child_node.left.property.name === old_name) {
385
+
386
+ fixes.push(fixer.replaceText(child_node.left.property, new_name));
387
+ }
388
+
389
+ // 处理 module.exports.XXX = ... 形式的导出
390
+ if (child_node.type === 'AssignmentExpression' &&
391
+ child_node.left &&
392
+ child_node.left.type === 'MemberExpression' &&
393
+ child_node.left.object &&
394
+ child_node.left.object.type === 'MemberExpression' &&
395
+ child_node.left.object.object &&
396
+ child_node.left.object.object.type === 'Identifier' &&
397
+ child_node.left.object.object.name === 'module' &&
398
+ child_node.left.object.property &&
399
+ child_node.left.object.property.type === 'Identifier' &&
400
+ child_node.left.object.property.name === 'exports' &&
401
+ child_node.left.property &&
402
+ child_node.left.property.type === 'Identifier' &&
403
+ child_node.left.property.name === old_name) {
404
+
405
+ fixes.push(fixer.replaceText(child_node.left.property, new_name));
406
+ }
407
+ });
408
+
409
+ return fixes;
410
+ }
411
+
412
+ /**
413
+ * 遍历AST节点
414
+ * @param {object} node AST节点
415
+ * @param {function} callback 回调函数
416
+ */
417
+ _traverseAST(node, callback) {
418
+ if (!node || typeof node !== 'object') {
419
+ return;
420
+ }
421
+
422
+ // 调用回调函数处理当前节点
423
+ callback(node);
424
+
425
+ // 递归遍历子节点
426
+ for (var k in node) {
427
+ if (node.hasOwnProperty(k)) {
428
+ var child = node[k];
429
+ if (Array.isArray(child)) {
430
+ for (var i = 0; i < child.length; i++) {
431
+ this._traverseAST(child[i], callback);
432
+ }
433
+ } else if (typeof child === 'object' && child !== null) {
434
+ this._traverseAST(child, callback);
435
+ }
436
+ }
437
+ }
438
+ }
439
+ }
440
+
441
+ module.exports = { Fix };