mm_eslint 1.3.7 → 1.3.9

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.
Files changed (3) hide show
  1. package/config.js +12 -9
  2. package/detector.js +121 -5
  3. package/package.json +1 -1
package/config.js CHANGED
@@ -500,20 +500,23 @@ Config.prototype.getIgnoredWords = function (name_type) {
500
500
  'Middleware', 'Component', 'Controller', 'Repository', 'Interface', 'Transform', 'Template'
501
501
  ],
502
502
  'variable-name': [
503
- 'i', 'k', 'x', 'y', 'z', 'n', 'm', 'o', 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template', '$'
503
+ 'i', 'k', 'x', 'y', 'z', 'n', 'm', 'o', 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template', '$',
504
+ 'timestamp', 'extensions'
504
505
  ],
505
506
  'param-name': [
506
- 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template'
507
+ 'middleware', 'component', 'controller', 'repository', 'interface', 'transformer', 'template',
508
+ 'timestamp', 'extensions'
507
509
  ],
508
510
  'value-name': [
509
511
  '$', // 忽略$符号的属性值名
510
- 'middleware', // 忽略middleware属性值名
511
- 'component', // 忽略component属性值名
512
- 'controller', // 忽略controller属性值名
513
- 'repository', // 忽略repository属性值名
514
- 'interface', // 忽略interface属性值名
515
- 'transformer', // 忽略transformer属性值名
516
- 'template' // 忽略template属性值名
512
+ 'middleware',
513
+ 'component',
514
+ 'controller',
515
+ 'repository',
516
+ 'interface',
517
+ 'transformer',
518
+ 'template',
519
+ 'timestamp', 'extensions'
517
520
  ]
518
521
  };
519
522
 
package/detector.js CHANGED
@@ -627,17 +627,125 @@ Detector.prototype._checkForbiddenWords = function (name, name_type) {
627
627
  }
628
628
  }
629
629
 
630
- // 检查名称是否包含禁止词汇作为拼接词(即名称由多个单词组成)
631
- for (var i = 0; i < forbidden_words.length; i++) {
632
- var forbidden_word = forbidden_words[i].toLowerCase();
633
- if (name_lower.includes(forbidden_word) && name_lower !== forbidden_word) {
634
- return name_type_desc + '\'' + name + '\'包含禁止拼接词\'' + forbidden_word + '\'';
630
+ // 按单词边界分割名称
631
+ var words = this._splitNameIntoWords(name_lower);
632
+
633
+ // 检查每个单词是否在禁止词汇列表中
634
+ for (var i = 0; i < words.length; i++) {
635
+ var word = words[i];
636
+ // 跳过空字符串和单个字符
637
+ if (!word || word.length <= 1) {
638
+ continue;
639
+ }
640
+
641
+ for (var j = 0; j < forbidden_words.length; j++) {
642
+ var forbidden_word = forbidden_words[j].toLowerCase();
643
+ if (word === forbidden_word) {
644
+ return name_type_desc + '\'' + name + '\'包含禁止拼接词\'' + forbidden_word + '\'';
645
+ }
635
646
  }
636
647
  }
637
648
 
638
649
  return null;
639
650
  };
640
651
 
652
+ /**
653
+ * 按单词边界分割名称
654
+ * @param {string} name 名称
655
+ * @returns {Array} 单词数组
656
+ */
657
+ Detector.prototype._splitNameIntoWords = function (name) {
658
+ if (!name) {
659
+ return [];
660
+ }
661
+
662
+ var words = [];
663
+ var processed_name = name;
664
+ var has_private_prefix = false;
665
+
666
+ // 处理私有标识符(开头的下划线)
667
+ if (name.startsWith('_')) {
668
+ has_private_prefix = true;
669
+ processed_name = name.substring(1); // 去掉开头的下划线
670
+ }
671
+
672
+ // 根据命名风格分割单词
673
+ if (processed_name.includes('_')) {
674
+ words = processed_name.split('_');
675
+ } else if (processed_name.includes('-')) {
676
+ words = processed_name.split('-');
677
+ } else {
678
+ // 驼峰命名法分割(保持原词大小写)
679
+ words = processed_name.split(/(?=[A-Z])/);
680
+ }
681
+
682
+ // 如果存在私有标识符,添加下划线作为第一个单词
683
+ if (has_private_prefix) {
684
+ words.unshift('_');
685
+ }
686
+
687
+ // 过滤空字符串
688
+ words = words.filter(function(word) {
689
+ return word && word.length > 0;
690
+ });
691
+
692
+ return words;
693
+ };
694
+
695
+ /**
696
+ * 检查是否为第三方库的配置参数
697
+ * @param {object} node AST节点
698
+ * @param {object} parent_node 父节点
699
+ * @returns {boolean} 是否为第三方库配置参数
700
+ */
701
+ Detector.prototype._isThirdPartyConfigProperty = function (node, parent_node) {
702
+ try {
703
+ // 检查当前节点是否为对象字面量的属性
704
+ if (!parent_node || parent_node.type !== 'ObjectExpression') {
705
+ return false;
706
+ }
707
+
708
+ // 检查对象字面量是否作为方法调用的参数
709
+ var grandparent = parent_node.parent;
710
+ if (!grandparent || grandparent.type !== 'CallExpression') {
711
+ return false;
712
+ }
713
+
714
+ // 检查方法调用是否来自外部模块(非当前文件定义的函数)
715
+ var callee = grandparent.callee;
716
+ if (!callee) {
717
+ return false;
718
+ }
719
+
720
+ // 如果是成员表达式(如 chokidar.watch),则认为是第三方库调用
721
+ if (callee.type === 'MemberExpression') {
722
+ return true;
723
+ }
724
+
725
+ // 如果是标识符,检查是否是常见的第三方库函数名
726
+ if (callee.type === 'Identifier') {
727
+ var common_third_party_functions = [
728
+ 'watch', 'require', 'import', 'create', 'build', 'compile',
729
+ 'parse', 'stringify', 'readFile', 'writeFile', 'mkdir',
730
+ 'exec', 'spawn', 'fork', 'connect', 'listen', 'send'
731
+ ];
732
+
733
+ // 如果是常见的第三方库函数名,则认为是第三方库调用
734
+ if (common_third_party_functions.includes(callee.name)) {
735
+ return true;
736
+ }
737
+
738
+ // 对于其他标识符,暂时不认为是第三方库调用(避免误判)
739
+ return false;
740
+ }
741
+
742
+ return false;
743
+ } catch (error) {
744
+ console.error('检查第三方库配置参数时出错:', error);
745
+ return false;
746
+ }
747
+ };
748
+
641
749
  /**
642
750
  * 获取属性类型
643
751
  * @param {object} val_node 属性值节点
@@ -725,6 +833,14 @@ Detector.prototype._checkPropertyName = function (
725
833
  return null;
726
834
  }
727
835
 
836
+ // 检查是否为第三方库的配置参数(方法调用中的对象字面量属性)
837
+ var is_third_party_config = this._isThirdPartyConfigProperty(node, parent_node);
838
+
839
+ // 如果是第三方库的配置参数,则不进行属性名检测
840
+ if (is_third_party_config) {
841
+ return null;
842
+ }
843
+
728
844
  // 获取属性类型
729
845
  var prop_type = this._getPropType(val_node, prop_name, parent_node);
730
846
  var rule_type = '';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mm_eslint",
3
- "version": "1.3.7",
3
+ "version": "1.3.9",
4
4
  "description": "ESLint plugin for naming conventions - PascalCase, camelCase, snake_case, and UPPER_SNAKE_CASE naming rules",
5
5
  "main": "index.js",
6
6
  "keywords": [