mm_eslint 1.4.3 → 1.4.4

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/config.js CHANGED
@@ -1,573 +1,588 @@
1
- /**
2
- * 命名规范检测配置类
3
- */
4
- class Config {
5
- /**
6
- * 构造函数
7
- * @param {object} config 配置对象
8
- */
9
- constructor(config) {
10
- this.config = Object.assign({
11
- // 忽略词
12
- ignored_words: {
13
- 'class-name': [],
14
- 'method-name': [],
15
- 'variable-name': [],
16
- 'constant-name': []
17
- },
18
- // 禁止拼接词
19
- forbidden_words: {
20
- 'class-name': [],
21
- 'method-name': [],
22
- 'variable-name': [],
23
- 'constant-name': [],
24
- 'param-name': []
25
- },
26
- // 推荐词
27
- recommended_words: {
28
- 'class-name': {
29
- },
30
- 'method-name': {
31
- },
32
- 'variable-name': {
33
- },
34
- 'constant-name': {
35
- },
36
- 'param-name': {
37
- }
38
- }
39
- }, config);
40
- }
41
- }
42
-
43
- /**
44
- * 获取命名风格的正则表达式
45
- * @param {string} style 命名风格
46
- * @returns {RegExp} 正则表达式
47
- */
48
- Config.prototype.getRegex = function (style) {
49
- var regex = {
50
- PascalCase: /^[A-Z][a-z]*([A-Z][a-z]*)*$/,
51
- camelCase: /^[a-z][a-z]*([A-Z][a-z]*)*$/,
52
- snake_case: /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,
53
- UPPER_SNAKE_CASE: /^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/,
54
- lowercase: /^[a-z][a-z0-9]*$/,
55
- UPPERCASE: /^[A-Z][A-Z0-9]*$/,
56
- _camelCase: /^_[a-z][a-z0-9]*([A-Z][a-z0-9]*)*$/,
57
- _snake_case: /^_[a-z][a-z0-9]*(_[a-z0-9]+)*$/,
58
- _lowercase: /^_[a-z][a-z0-9]*$/,
59
- };
60
-
61
- return regex[style] || null;
62
- };
63
-
64
- /**
65
- * 获取命名类型的规则配置
66
- * @param {string} name_type 命名类型
67
- * @returns {object} 规则配置对象
68
- */
69
- Config.prototype.getRule = function (name_type) {
70
- var rule = {
71
- 'class-name': {
72
- name: '类名',
73
- message:
74
- '必须使用大驼峰命名法(PascalCase),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
75
- min: 1,
76
- max: 20,
77
- styles: ['PascalCase'],
78
- single_word: true,
79
- single_word_len: 8,
80
- },
81
- 'function-name': {
82
- name: '函数名',
83
- message:
84
- '必须使用小驼峰命名法(camelCase),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符,不允许使用私有函数',
85
- min: 1,
86
- max: 20,
87
- styles: ['camelCase'],
88
- single_word: true,
89
- single_word_len: 8,
90
- },
91
- 'method-name': {
92
- name: '方法名',
93
- message:
94
- '必须使用小驼峰命名法(camelCase),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
95
- min: 1,
96
- max: 20,
97
- styles: ['camelCase'],
98
- single_word: true,
99
- single_word_len: 8
100
- },
101
- 'variable-name': {
102
- name: '变量名',
103
- message:
104
- '必须使用小写蛇形命名法(snake_case),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
105
- min: 1,
106
- max: 20,
107
- styles: ['snake_case'],
108
- single_word: true,
109
- single_word_len: 8
110
- },
111
- 'param-name': {
112
- name: '参数名',
113
- message:
114
- '必须使用小写蛇形命名法(snake_case),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
115
- min: 1,
116
- max: 20,
117
- styles: ['snake_case'],
118
- single_word: true,
119
- single_word_len: 8
120
- },
121
- 'constant-name': {
122
- name: '常量名',
123
- message:
124
- '必须使用大写蛇形命名法(UPPER_SNAKE_CASE),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
125
- min: 1,
126
- max: 20,
127
- styles: ['UPPER_SNAKE_CASE'],
128
- single_word: true,
129
- single_word_len: 8
130
- },
131
- 'property-class-name': {
132
- name: '属性类名',
133
- message:
134
- '属性类必须使用大驼峰命名法(PascalCase),私有属性类使用私有大驼峰命名法(_PascalCase),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
135
- min: 1,
136
- max: 20,
137
- styles: ['PascalCase', '_PascalCase'],
138
- single_word: true,
139
- single_word_len: 8
140
- },
141
- 'property-instance-class-name': {
142
- name: '属性实例类名',
143
- message:
144
- '属性实例类必须使用小驼峰命名法(camelCase),私有属性实例类使用私有小驼峰命名法(_camelCase),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
145
- min: 1,
146
- max: 20,
147
- styles: ['camelCase', '_camelCase'],
148
- single_word: true,
149
- single_word_len: 8
150
- },
151
- 'property-method-name': {
152
- name: '属性方法名',
153
- message:
154
- '属性方法必须使用小驼峰命名法(camelCase),私有属性方法使用私有小驼峰命名法(_camelCase),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
155
- min: 1,
156
- max: 20,
157
- styles: ['camelCase', '_camelCase'],
158
- single_word: true,
159
- single_word_len: 8
160
- },
161
- 'property-value-name': {
162
- name: '属性值名',
163
- message:
164
- '属性值必须使用小写蛇形命名法(snake_case),私有属性值使用私有蛇形命名法(_snake_case),常量属性值使用大写蛇形命名法(UPPER_SNAKE_CASE),长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
165
- min: 1,
166
- max: 20,
167
- styles: ['snake_case', '_snake_case', 'UPPER_SNAKE_CASE'],
168
- single_word: true,
169
- single_word_len: 8
170
- },
171
- 'property-flexible-name': {
172
- name: '灵活属性名',
173
- message:
174
- '灵活属性名支持多种命名风格,长度{min}-{max}字符,且优先使用单个单词,每个单词不超过{word_len}字符',
175
- min: 1,
176
- max: 20,
177
- styles: ['snake_case', 'UPPER_SNAKE_CASE', 'PascalCase', 'camelCase', '_snake_case', '_camelCase'],
178
- single_word: true,
179
- single_word_len: 8
180
- }
181
- };
182
-
183
- return rule[name_type] || null;
184
- };
185
-
186
- /**
187
- * 获取命名类型的禁止拼接词列表
188
- * @param {string} name_type 命名类型
189
- * @returns {Array} 禁止拼接词列表
190
- */
191
- Config.prototype.getForbiddenWords = function (name_type) {
192
- let type = name_type.replace('property-', '').replace('instance-', '');
193
- if (type == 'function-name') {
194
- type = 'method-name';
195
- }
196
- else if (type == 'value-name') {
197
- type = 'variable-name';
198
- }
199
- var forbidden = {
200
- 'class-name': [
201
- 'manager',
202
- 'handler',
203
- 'processor',
204
- 'controller',
205
- 'service',
206
- 'provider',
207
- 'factory',
208
- 'builder',
209
- 'adapter',
210
- 'decorator',
211
- 'proxy',
212
- 'facade',
213
- 'mediator',
214
- 'observer',
215
- 'strategy',
216
- 'command',
217
- 'visitor',
218
- 'iterator',
219
- 'template',
220
- 'flyweight',
221
- 'memento',
222
- 'interpreter',
223
- 'model',
224
- 'view',
225
- 'route',
226
- 'router',
227
- 'component',
228
- 'widget',
229
- 'panel',
230
- 'dialog',
231
- 'window',
232
- 'form',
233
- 'field',
234
- 'property',
235
- 'entity',
236
- ],
237
- 'method-name': [
238
- 'data',
239
- 'result',
240
- 'output',
241
- 'input',
242
- 'param',
243
- 'params',
244
- 'parameter',
245
- 'parameters',
246
- 'value',
247
- 'values',
248
- 'item',
249
- 'items',
250
- 'process',
251
- 'processor',
252
- 'provider',
253
- 'builder',
254
- 'adapter',
255
- 'decorator',
256
- 'proxy',
257
- 'facade',
258
- 'mediator',
259
- 'observer',
260
- 'strategy',
261
- 'command',
262
- 'visitor',
263
- 'iterator',
264
- 'template',
265
- 'flyweight',
266
- 'memento',
267
- 'interpreter',
268
- 'temp',
269
- 'tmp',
270
- 'temporary',
271
- 'cached',
272
- 'buffered',
273
- 'idx',
274
- 'counter',
275
- 'with'
276
- ],
277
- 'variable-name': [
278
- 'object',
279
- 'array',
280
- 'map',
281
- 'set',
282
- 'collection',
283
- 'container',
284
- 'instance',
285
- 'data',
286
- 'item',
287
- 'items',
288
- 'element',
289
- 'elements',
290
- 'entry',
291
- 'entries',
292
- 'temp',
293
- 'tmp',
294
- 'temporary',
295
- 'cached',
296
- 'buffer',
297
- 'buffered',
298
- 'input',
299
- 'output',
300
- 'result',
301
- 'destination',
302
- 'index',
303
- 'idx',
304
- 'counter',
305
- 'length',
306
- 'total',
307
- 'sum',
308
- 'pointer',
309
- 'reference',
310
- 'ref',
311
- 'handle',
312
- 'handler',
313
- 'entity',
314
- 'column',
315
- 'property',
316
- 'attribute',
317
- 'manager',
318
- 'processor',
319
- 'controller',
320
- 'service',
321
- 'middleware',
322
- 'component',
323
- 'provider'
324
- ],
325
- 'constant-name': [
326
- 'manager',
327
- 'handler',
328
- 'processor',
329
- 'controller',
330
- 'service',
331
- 'provider',
332
- 'factory',
333
- 'builder',
334
- 'adapter',
335
- 'decorator',
336
- 'proxy',
337
- 'facade',
338
- 'mediator',
339
- 'observer',
340
- 'strategy',
341
- 'command',
342
- 'visitor',
343
- 'iterator',
344
- 'template',
345
- 'flyweight',
346
- 'memento',
347
- 'interpreter',
348
- 'model',
349
- 'view',
350
- 'route',
351
- 'router',
352
- 'component',
353
- 'widget',
354
- 'panel',
355
- 'dialog',
356
- 'window',
357
- 'form',
358
- 'field',
359
- 'property',
360
- 'entity',
361
- 'data',
362
- 'result',
363
- 'output',
364
- 'input',
365
- 'temp',
366
- 'tmp',
367
- 'temporary',
368
- 'cached',
369
- 'buffer',
370
- 'buffered'
371
- ],
372
- "param-name": [
373
- 'param',
374
- 'params',
375
- 'parameter',
376
- 'parameters'
377
- ]
378
- };
379
-
380
- // 优先返回配置中的禁用词,其次返回硬编码禁用词
381
- var config = this.config.forbidden_words[type];
382
- var hardcoded = forbidden[type];
383
-
384
- // 如果配置中的禁用词为空数组,则使用硬编码禁用词
385
- if (config && config.length > 0) {
386
- return config;
387
- } else if (hardcoded && hardcoded.length > 0) {
388
- return hardcoded;
389
- }
390
-
391
- return [];
392
- };
393
-
394
- /**
395
- * 获取推荐词映射
396
- * @param {string} name_type 名称类型
397
- * @returns {object} 推荐词映射
398
- */
399
- Config.prototype.getRecommendedWords = function (name_type) {
400
- let type = name_type.replace('property-', '').replace('instance-', '');
401
- if (type == 'function-name') {
402
- type = 'method-name';
403
- }
404
- else if (type == 'value-name') {
405
- type = 'variable-name';
406
- }
407
- var recommend = {
408
- 'class-name': {
409
- 'App': ['Application'],
410
- 'Config': ['Configuration'],
411
- 'Env': ['Environment'],
412
- 'Init': ['Initialization'],
413
- 'Auth': ['Authentication'],
414
- 'Authz': ['Authorization'],
415
- 'Valid': ['Validation'],
416
- 'Serializer': ['Serialization'],
417
- 'Deserializer': ['Deserialization'],
418
- 'Transformer': ['Transformation'],
419
- 'Impl': ['Implementation'],
420
- 'Proc': ['Processor'],
421
- 'Dcr': ['Decorator'],
422
- 'Prov': ['Provider'],
423
- 'Obs': ['Observer'],
424
- 'Strat': ['Strategy'],
425
- 'Mnt': ['Memento'],
426
- 'Intp': ['Interpreter'],
427
- 'Cmp': ['Component'],
428
- 'Info': ['Information'],
429
- 'Conn': ['Connection'],
430
- 'Ext': ['Extension'],
431
- 'Asst': ['Assistant'],
432
- 'Const': ['Constants', 'Constant']
433
- },
434
- 'method-name': {
435
- 'get': ['fetch', 'retrieve', 'obtain', 'query'],
436
- 'set': ['setting', 'update'],
437
- 'add': ['append', 'insert'],
438
- 'del': ['delete'],
439
- 'check': ['validate', 'verify'],
440
- 'calc': ['calculate', 'compute', 'evaluate'],
441
- 'init': ['initialize', 'initialization', 'prepare'],
442
- 'gen': ['generate'],
443
- 'exec': ['execute'],
444
- 'run': ['process', 'handle'],
445
- 'load': ['retrieve'],
446
- 'save': ['persist'],
447
- 'cmp': ['compare'],
448
- 'copy': ['duplicate'],
449
- 'move': ['transfer'],
450
- 'to': ['convert', 'transform', 'transformation'],
451
- 'create': ['construct'],
452
- 'avg': ['average'],
453
- 'zip': ['compress'],
454
- 'unzip': ['decompress'],
455
- 'env': ['Environment'],
456
- 'auth': ['authorize', 'Authentication'],
457
- 'authz': ['Authorization'],
458
- 'valid': ['Validation'],
459
- 'stringify': ['serialize', 'serialization'],
460
- 'parse': ['deserialize', 'deserialization'],
461
- 'impl': ['Implementation'],
462
- // 名词
463
- 'App': ['Application'],
464
- 'Conn': ['Connection'],
465
- 'Info': ['Information'],
466
- 'Config': ['Configure', 'Configuration']
467
- },
468
- 'variable-name': {
469
- 'obj': ['object'],
470
- 'arr': ['array'],
471
- 'str': ['string'],
472
- 'num': ['number'],
473
- 'bool': ['boolean'],
474
- 'fn': ['function'],
475
- 'tmp': ['temporary'],
476
- 'def': ['default'],
477
- 'max': ['maximum'],
478
- 'min': ['minimum'],
479
- 'avg': ['average'],
480
- 'app': ['application'],
481
- 'connect': ['connection'],
482
- 'info': ['information'],
483
- 'config': ['configure', 'configuration'],
484
- 'var': ['variable']
485
- },
486
- 'constant-name': {
487
- 'MAX': ['MAXIMUM'],
488
- 'MIN': ['MINIMUM'],
489
- 'AVG': ['AVERAGE'],
490
- 'APP': ['APPLICATION'],
491
- 'INFO': ['INFORMATION'],
492
- 'CONFIG': ['CONFIGURE', 'CONFIGURATION'],
493
- 'VAL': ['VALUE'],
494
- 'NUM': ['NUMBER'],
495
- 'STR': ['STRING'],
496
- 'BOOL': ['BOOLEAN'],
497
- 'ARR': ['ARRAY'],
498
- 'OBJ': ['OBJECT'],
499
- 'FUNC': ['FUNCTION']
500
- }
501
- };
502
-
503
- // 优先返回配置中的推荐词,其次返回硬编码推荐词
504
- var config = this.config.recommended_words[type];
505
- var hardcoded = recommend[type];
506
-
507
- // 如果配置中的推荐词不为空对象,则使用配置推荐词
508
- if (config && Object.keys(config).length > 0) {
509
- return config;
510
- } else if (hardcoded && Object.keys(hardcoded).length > 0) {
511
- return hardcoded;
512
- }
513
-
514
- return {};
515
- };
516
-
517
- /**
518
- * 获取忽略词列表
519
- * @param {string} name_type 名称类型
520
- * @returns {Array} 忽略词列表
521
- */
522
- Config.prototype.getIgnoredWords = function (name_type) {
523
- let type = name_type.replace('property-', '').replace('instance-', '');
524
- if (type == 'function-name') {
525
- type = 'method-name';
526
- }
527
- var ignore = {
528
- 'class-name': [
529
- 'exports', 'Middleware', 'Component', 'Controller', 'Repository', 'Interface', 'Transformer', 'Template'
530
- ],
531
- 'method-name': [
532
- 'constructor', 'prototype', 'hasOwnProperty',
533
- 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString',
534
- 'arguments',
535
- 'Middleware', 'Component', 'Controller', 'Repository', 'Interface', 'Transform', 'Template'
536
- ],
537
- 'variable-name': [
538
- 'i', 'k', 'x', 'y', 'z', 'n', 'm', 'o', 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template', '$',
539
- 'timestamp', 'extensions'
540
- ],
541
- 'param-name': [
542
- 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template',
543
- 'timestamp', 'extensions'
544
- ],
545
- 'value-name': [
546
- '$', // 忽略$符号的属性值名
547
- 'middleware',
548
- 'component',
549
- 'controller',
550
- 'service',
551
- 'repository',
552
- 'interface',
553
- 'transformer',
554
- 'template',
555
- 'timestamp', 'extensions'
556
- ]
557
- };
558
-
559
- // 优先返回配置中的忽略词,其次返回硬编码忽略词
560
- var config = this.config.ignored_words[type];
561
- var hardcoded = ignore[type];
562
-
563
- // 如果配置中的忽略词为空数组,则使用硬编码忽略词
564
- if (config && config.length > 0) {
565
- return config;
566
- } else if (hardcoded && hardcoded.length > 0) {
567
- return hardcoded;
568
- }
569
-
570
- return [];
571
- };
572
-
573
- module.exports = { Config };
1
+ /**
2
+ * 命名规范检测配置类
3
+ * 负责提供配置,风格、长度等
4
+ */
5
+ class Config {
6
+ /**
7
+ * 构造函数
8
+ * @param {object} config 配置对象
9
+ */
10
+ constructor(config) {
11
+ this.config = Object.assign({
12
+ // 忽略词
13
+ ignore_words: {
14
+ 'class': [],
15
+ 'class-instance': [],
16
+ 'function': [],
17
+ 'param': [],
18
+ 'variable': [],
19
+ 'constant': []
20
+ },
21
+ // 禁止拼接词
22
+ forbidden_words: {
23
+ 'class': [],
24
+ 'class-instance': [],
25
+ 'function': [],
26
+ 'param': [],
27
+ 'variable': [],
28
+ 'constant': []
29
+ },
30
+ // 推荐词
31
+ recommended_words: {
32
+ 'class': {},
33
+ 'class-instance': {},
34
+ 'function': {},
35
+ 'param': {},
36
+ 'variable': {},
37
+ 'constant': {}
38
+ }
39
+ }, config || {});
40
+ }
41
+ }
42
+
43
+ /**
44
+ * 获取命名风格的正则表达式
45
+ * @param {string} style 命名风格
46
+ * @returns {RegExp} 正则表达式
47
+ */
48
+ Config.prototype.getRegex = function (style) {
49
+ var regex = {
50
+ "PascalCase": /^[A-Z][a-z]*([A-Z][a-z]*)*$/,
51
+ "camelCase": /^[a-z][a-z]*([A-Z][a-z]*)*$/,
52
+ "snake_case": /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,
53
+ "UPPER_SNAKE_CASE": /^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/,
54
+ "lowercase": /^[a-z]+([a-z0-9]+)*$/,
55
+ "UPPERCASE": /^[A-Z]+([A-Z0-9]+)*$/,
56
+ "kebab-case": /^[a-z]+([a-z0-9-])*$/,
57
+ "UPPER-KEBAB-CASE": /^[A-Z]+([A-Z0-9-])*$/
58
+ };
59
+ return regex[style] || null;
60
+ };
61
+
62
+ /**
63
+ * 获取命名类型的禁止拼接词列表
64
+ * @param {string} name_type 命名类型
65
+ * @returns {Array} 禁止拼接词列表
66
+ */
67
+ Config.prototype.getForbiddenWords = function (name_type) {
68
+ let type = name_type.replace('property-', '').replace('instance-', '');
69
+ var forbidden = {
70
+ 'class': [
71
+ 'manager',
72
+ 'handler',
73
+ 'processor',
74
+ 'controller',
75
+ 'service',
76
+ 'provider',
77
+ 'factory',
78
+ 'builder',
79
+ 'adapter',
80
+ 'decorator',
81
+ 'proxy',
82
+ 'facade',
83
+ 'mediator',
84
+ 'observer',
85
+ 'strategy',
86
+ 'command',
87
+ 'visitor',
88
+ 'iterator',
89
+ 'template',
90
+ 'flyweight',
91
+ 'memento',
92
+ 'interpreter',
93
+ 'model',
94
+ 'view',
95
+ 'route',
96
+ 'router',
97
+ 'component',
98
+ 'widget',
99
+ 'panel',
100
+ 'dialog',
101
+ 'window',
102
+ 'form',
103
+ 'field',
104
+ 'property',
105
+ 'entity',
106
+ ],
107
+ 'function': [
108
+ 'data',
109
+ 'result',
110
+ 'output',
111
+ 'input',
112
+ 'param',
113
+ 'params',
114
+ 'parameter',
115
+ 'parameters',
116
+ 'value',
117
+ 'values',
118
+ 'item',
119
+ 'items',
120
+ 'process',
121
+ 'processor',
122
+ 'provider',
123
+ 'builder',
124
+ 'adapter',
125
+ 'decorator',
126
+ 'proxy',
127
+ 'facade',
128
+ 'mediator',
129
+ 'observer',
130
+ 'strategy',
131
+ 'command',
132
+ 'visitor',
133
+ 'iterator',
134
+ 'template',
135
+ 'flyweight',
136
+ 'memento',
137
+ 'interpreter',
138
+ 'temp',
139
+ 'tmp',
140
+ 'temporary',
141
+ 'cached',
142
+ 'buffered',
143
+ 'idx',
144
+ 'counter',
145
+ 'with'
146
+ ],
147
+ 'variable': [
148
+ 'object',
149
+ 'array',
150
+ 'map',
151
+ 'set',
152
+ 'collection',
153
+ 'container',
154
+ 'instance',
155
+ 'data',
156
+ 'item',
157
+ 'items',
158
+ 'element',
159
+ 'elements',
160
+ 'entry',
161
+ 'entries',
162
+ 'temp',
163
+ 'tmp',
164
+ 'temporary',
165
+ 'cached',
166
+ 'buffer',
167
+ 'buffered',
168
+ 'input',
169
+ 'output',
170
+ 'result',
171
+ 'destination',
172
+ 'index',
173
+ 'idx',
174
+ 'counter',
175
+ 'length',
176
+ 'total',
177
+ 'sum',
178
+ 'pointer',
179
+ 'reference',
180
+ 'ref',
181
+ 'handle',
182
+ 'handler',
183
+ 'entity',
184
+ 'column',
185
+ 'property',
186
+ 'attribute',
187
+ 'manager',
188
+ 'processor',
189
+ 'controller',
190
+ 'service',
191
+ 'middleware',
192
+ 'component',
193
+ 'provider'
194
+ ],
195
+ 'constant': [
196
+ 'manager',
197
+ 'handler',
198
+ 'processor',
199
+ 'controller',
200
+ 'service',
201
+ 'provider',
202
+ 'factory',
203
+ 'builder',
204
+ 'adapter',
205
+ 'decorator',
206
+ 'proxy',
207
+ 'facade',
208
+ 'mediator',
209
+ 'observer',
210
+ 'strategy',
211
+ 'command',
212
+ 'visitor',
213
+ 'iterator',
214
+ 'template',
215
+ 'flyweight',
216
+ 'memento',
217
+ 'interpreter',
218
+ 'model',
219
+ 'view',
220
+ 'route',
221
+ 'router',
222
+ 'component',
223
+ 'widget',
224
+ 'panel',
225
+ 'dialog',
226
+ 'window',
227
+ 'form',
228
+ 'field',
229
+ 'property',
230
+ 'entity',
231
+ 'data',
232
+ 'result',
233
+ 'output',
234
+ 'input',
235
+ 'temp',
236
+ 'tmp',
237
+ 'temporary',
238
+ 'cached',
239
+ 'buffer',
240
+ 'buffered'
241
+ ],
242
+ "param": [
243
+ 'param',
244
+ 'params',
245
+ 'parameter',
246
+ 'parameters'
247
+ ]
248
+ };
249
+
250
+ // 优先返回配置中的禁用词,其次返回硬编码禁用词
251
+ var config = this.config.forbidden_words[type];
252
+ var hardcoded = forbidden[type];
253
+
254
+ // 如果配置中的禁用词为空数组,则使用硬编码禁用词
255
+ if (config && config.length > 0) {
256
+ return config;
257
+ } else if (hardcoded && hardcoded.length > 0) {
258
+ return hardcoded;
259
+ }
260
+
261
+ return [];
262
+ };
263
+
264
+ /**
265
+ * 获取基础规则配置
266
+ * @param {string} name_type 命名类型
267
+ * @returns {object} 规则配置对象
268
+ */
269
+ Config.prototype.getBaseRule = function (name_type) {
270
+ var rule = {
271
+ 'class': {
272
+ name: '类名',
273
+ min: 1,
274
+ max: 20,
275
+ styles: ['PascalCase'],
276
+ single_word: true,
277
+ single_word_len: 8 // 类名允许更长的单词,因为需要表达复杂语义
278
+ },
279
+ 'class-instance': {
280
+ name: '类实例名',
281
+ min: 1,
282
+ max: 20,
283
+ styles: ['camelCase'],
284
+ single_word: true,
285
+ single_word_len: 8
286
+ },
287
+ 'function': {
288
+ name: '函数名',
289
+ min: 1,
290
+ max: 20,
291
+ styles: ['camelCase'],
292
+ single_word: true,
293
+ single_word_len: 8
294
+ },
295
+ 'param': {
296
+ name: '参数名',
297
+ min: 1,
298
+ max: 20,
299
+ styles: ['snake_case', 'camelCase', 'PascalCase'],
300
+ single_word: true,
301
+ single_word_len: 8
302
+ },
303
+ 'variable': {
304
+ name: '变量名',
305
+ min: 1,
306
+ max: 20,
307
+ styles: ['snake_case'],
308
+ single_word: true,
309
+ single_word_len: 8
310
+ },
311
+ 'constant': {
312
+ name: '常量名',
313
+ min: 1,
314
+ max: 20,
315
+ styles: ['UPPER_SNAKE_CASE'],
316
+ single_word: true,
317
+ single_word_len: 8
318
+ }
319
+ };
320
+ return rule[name_type] || null;
321
+ }
322
+
323
+ /**
324
+ * 获取命名类型的规则配置
325
+ * @param {string} name_type 命名类型
326
+ * @returns {object} 规则配置对象
327
+ */
328
+ Config.prototype.getRule = function (name_type) {
329
+ var rule = this.getBaseRule(name_type);
330
+ if (rule) {
331
+ rule.ignore_words = this.getIgnoreWords(name_type);
332
+ rule.forbidden_words = this.getForbiddenWords(name_type);
333
+ rule.recommend_words = this.getRecommendWords(name_type);
334
+ }
335
+ return rule;
336
+ };
337
+
338
+ /**
339
+ * 获取推荐词映射
340
+ * @param {string} name_type 名称类型
341
+ * @returns {object} 推荐词映射
342
+ */
343
+ Config.prototype.getRecommendWords = function (name_type) {
344
+ let type = name_type.replace('property-', '').replace('instance-', '');
345
+ if (type == 'function') {
346
+ type = 'function';
347
+ }
348
+ else if (type == 'value') {
349
+ type = 'variable';
350
+ }
351
+ var recommend = {
352
+ 'class': {
353
+ 'App': ['Application'],
354
+ 'Config': ['Configuration'],
355
+ 'Env': ['Environment'],
356
+ 'Init': ['Initialization'],
357
+ 'Auth': ['Authentication'],
358
+ 'Authz': ['Authorization'],
359
+ 'Valid': ['Validation'],
360
+ 'Serializer': ['Serialization'],
361
+ 'Deserializer': ['Deserialization'],
362
+ 'Transformer': ['Transformation'],
363
+ 'Impl': ['Implementation'],
364
+ 'Proc': ['Processor'],
365
+ 'Dcr': ['Decorator'],
366
+ 'Prov': ['Provider'],
367
+ 'Obs': ['Observer'],
368
+ 'Strat': ['Strategy'],
369
+ 'Mnt': ['Memento'],
370
+ 'Intp': ['Interpreter'],
371
+ 'Cmp': ['Component'],
372
+ 'Info': ['Information'],
373
+ 'Conn': ['Connection'],
374
+ 'Ext': ['Extension'],
375
+ 'Asst': ['Assistant'],
376
+ 'Const': ['Constants', 'Constant'],
377
+ 'Info': ['Information'],
378
+ 'Store': ['Repository']
379
+ },
380
+ 'function': {
381
+ 'get': ['fetch', 'retrieve', 'obtain', 'query'],
382
+ 'set': ['setting', 'update'],
383
+ 'add': ['append', 'insert'],
384
+ 'del': ['delete'],
385
+ 'check': ['validate', 'verify'],
386
+ 'calc': ['calculate', 'compute', 'evaluate'],
387
+ 'init': ['initialize', 'initialization', 'prepare'],
388
+ 'gen': ['generate'],
389
+ 'exec': ['execute'],
390
+ 'run': ['process', 'handle'],
391
+ 'load': ['retrieve'],
392
+ 'save': ['persist'],
393
+ 'cmp': ['compare'],
394
+ 'copy': ['duplicate'],
395
+ 'move': ['transfer'],
396
+ 'to': ['convert', 'transform', 'transformation'],
397
+ 'create': ['construct'],
398
+ 'avg': ['average'],
399
+ 'zip': ['compress'],
400
+ 'unzip': ['decompress'],
401
+ 'env': ['Environment'],
402
+ 'auth': ['authorize', 'Authentication'],
403
+ 'authz': ['Authorization'],
404
+ 'valid': ['Validation'],
405
+ 'stringify': ['serialize', 'serialization'],
406
+ 'parse': ['deserialize', 'deserialization'],
407
+ 'impl': ['Implementation'],
408
+ // 名词
409
+ 'App': ['Application'],
410
+ 'Conn': ['Connection'],
411
+ 'Info': ['Information'],
412
+ 'Config': ['Configure', 'Configuration']
413
+ },
414
+ 'variable': {
415
+ 'obj': ['object'],
416
+ 'arr': ['array'],
417
+ 'str': ['string'],
418
+ 'num': ['number'],
419
+ 'bool': ['boolean'],
420
+ 'fn': ['function'],
421
+ 'tmp': ['temporary'],
422
+ 'def': ['default'],
423
+ 'max': ['maximum'],
424
+ 'min': ['minimum'],
425
+ 'avg': ['average'],
426
+ 'app': ['application'],
427
+ 'connect': ['connection'],
428
+ 'info': ['information'],
429
+ 'config': ['configure', 'configuration'],
430
+ 'var': ['variable']
431
+ },
432
+ 'constant': {
433
+ 'MAX': ['MAXIMUM'],
434
+ 'MIN': ['MINIMUM'],
435
+ 'AVG': ['AVERAGE'],
436
+ 'APP': ['APPLICATION'],
437
+ 'INFO': ['INFORMATION'],
438
+ 'CONFIG': ['CONFIGURE', 'CONFIGURATION'],
439
+ 'VAL': ['VALUE'],
440
+ 'NUM': ['NUMBER'],
441
+ 'STR': ['STRING'],
442
+ 'BOOL': ['BOOLEAN'],
443
+ 'ARR': ['ARRAY'],
444
+ 'OBJ': ['OBJECT'],
445
+ 'FUNC': ['FUNCTION']
446
+ }
447
+ };
448
+
449
+ // 优先返回配置中的推荐词,其次返回硬编码推荐词
450
+ var config = this.config.recommended_words[type];
451
+ var hardcoded = recommend[type];
452
+
453
+ // 如果配置中的推荐词不为空对象,则使用配置推荐词
454
+ if (config && Object.keys(config).length > 0) {
455
+ return config;
456
+ } else if (hardcoded && Object.keys(hardcoded).length > 0) {
457
+ return hardcoded;
458
+ }
459
+
460
+ return {};
461
+ };
462
+
463
+ /**
464
+ * 获取忽略词列表
465
+ * @param {string} name_type 名称类型
466
+ * @returns {Array} 忽略词列表
467
+ */
468
+ Config.prototype.getIgnoreWords = function (name_type) {
469
+ let type = name_type.replace('property-', '').replace('instance-', '');
470
+ var ignore = {
471
+ 'class': [
472
+ 'exports', 'Middleware', 'Component', 'Controller', 'Repository', 'Interface', 'Transformer', 'Template'
473
+ ],
474
+ 'function': [
475
+ 'constructor', 'prototype', 'hasOwnProperty',
476
+ 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString',
477
+ 'arguments',
478
+ 'Middleware', 'Component', 'Controller', 'Repository', 'Interface', 'Transform', 'Template'
479
+ ],
480
+ 'variable': [
481
+ 'i', 'k', 'x', 'y', 'z', 'n', 'm', 'o', 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template', '$',
482
+ 'timestamp', 'extensions'
483
+ ],
484
+ 'param': [
485
+ 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template',
486
+ 'timestamp', 'extensions'
487
+ ],
488
+ 'value': [
489
+ '$', // 忽略$符号的属性值名
490
+ 'middleware',
491
+ 'component',
492
+ 'controller',
493
+ 'service',
494
+ 'repository',
495
+ 'interface',
496
+ 'transformer',
497
+ 'template',
498
+ 'timestamp', 'extensions'
499
+ ]
500
+ };
501
+
502
+ // 优先返回配置中的忽略词,其次返回硬编码忽略词
503
+ var config = this.config.ignore_words[type];
504
+ var hardcoded = ignore[type];
505
+
506
+ // 如果配置中的忽略词为空数组,则使用硬编码忽略词
507
+ if (config && config.length > 0) {
508
+ return config;
509
+ } else if (hardcoded && hardcoded.length > 0) {
510
+ return hardcoded;
511
+ }
512
+
513
+ return [];
514
+ };
515
+
516
+ /**
517
+ * 获取命名类型的中文描述
518
+ * @param {string} name_type 命名类型
519
+ * @returns {string} 中文描述
520
+ */
521
+ Config.prototype.getTypeName = function (name_type) {
522
+ var type_name_map = this.getTypeNameMap();
523
+ return type_name_map[name_type] || '名称';
524
+ }
525
+
526
+ /**
527
+ * 获取命名类型的中文描述
528
+ * @returns {object} 命名类型映射表
529
+ */
530
+ Config.prototype.getTypeNameMap = function () {
531
+ var type_name_map = {
532
+ 'function': '函数',
533
+ 'variable': '变量',
534
+ 'param': '参数',
535
+ 'class-instance': '类实例',
536
+ 'class': '类',
537
+ 'constant': '常量',
538
+ 'property-function': '属性函数',
539
+ 'property-variable': '属性变量',
540
+ 'property-class-instance': '属性类实例',
541
+ 'property-class': '属性类',
542
+ 'property-constant': '属性常量',
543
+ 'static-function': '静态函数',
544
+ 'static-variable': '静态变量',
545
+ 'static-class-instance': '静态类实例',
546
+ 'static-class': '静态类',
547
+ 'static-constant': '静态常量',
548
+ 'prototype-function': '原型函数',
549
+ 'prototype-variable': '原型变量',
550
+ 'prototype-class-instance': '原型类实例',
551
+ 'prototype-class': '原型类',
552
+ 'prototype-constant': '原型常量',
553
+ 'private-function': '私有函数',
554
+ 'private-variable': '私有变量'
555
+ };
556
+ return type_name_map;
557
+ }
558
+
559
+ /**
560
+ * 获取风格名称的中文描述
561
+ * @param {string} style 风格
562
+ * @returns {string} 中文描述
563
+ */
564
+ Config.prototype.getStyleName = function (style) {
565
+ var style_name_map = this.getStyleNameMap();
566
+ return style_name_map[style] || style;
567
+ }
568
+
569
+ /**
570
+ * 获取风格名称的中文描述
571
+ * @returns {object} 风格名称映射表
572
+ */
573
+ Config.prototype.getStyleNameMap = function () {
574
+ var style_name_map = {
575
+ 'snake_case': '小写蛇形命名法',
576
+ 'camelCase': '小驼峰命名法',
577
+ 'PascalCase': '大驼峰命名法',
578
+ 'UPPER_CASE': '大写蛇形命名法',
579
+ 'lowercase': '小写命名法',
580
+ 'UPPERCASE': '大写命名法',
581
+ 'lowercase': '小写命名法',
582
+ 'kebab-case': '短横线命名法',
583
+ 'UPPERCASE_KEBAB_CASE': '大写短横线命名法'
584
+ };
585
+ return style_name_map;
586
+ }
587
+
588
+ module.exports = { Config };