diff --git a/internal/config/allowlist/allowed_ext_test.go b/internal/config/allowlist/allowed_ext_test.go index 954f0c6..4230c8d 100644 --- a/internal/config/allowlist/allowed_ext_test.go +++ b/internal/config/allowlist/allowed_ext_test.go @@ -16,6 +16,10 @@ func TestIsAllowedExt(t *testing.T) { {".tsx", true}, {".py", true}, {".rs", true}, + {".ets", true}, + {".ETS", true}, + {".json5", true}, + {".JSON5", true}, {".txt", false}, {".md", false}, {".png", false}, @@ -84,6 +88,12 @@ func TestIsExcludedPath(t *testing.T) { {"rust test file", "src/parser_test.rs", true}, {"rust non-test", "src/parser.rs", false}, + // HarmonyOS oh_modules and test files + {"oh_modules root", "oh_modules/some_lib/index.ets", true}, + {"oh_modules nested", "entry/oh_modules/lib/index.ets", true}, + {"ets test file", "entry/src/test/Component.test.ets", true}, + {"ets non-test", "entry/src/main/Component.ets", false}, + // Case insensitive {"case insensitive go", "Foo/Bar_Test.go", true}, {"case insensitive java", "com/FooTEST.java", true}, // lowercase → "com/footest.java" matches "**/*test.java" diff --git a/internal/config/allowlist/default_exclude_patterns.json b/internal/config/allowlist/default_exclude_patterns.json index d90cb1e..9419a12 100644 --- a/internal/config/allowlist/default_exclude_patterns.json +++ b/internal/config/allowlist/default_exclude_patterns.json @@ -12,5 +12,7 @@ "**/spec/**/*_spec.rb", "**/*Test.java", "**/*Tests.java", - "**/*_test.rs" + "**/*_test.rs", + "**/oh_modules/**", + "**/*.test.ets" ] diff --git a/internal/config/allowlist/supported_file_types.json b/internal/config/allowlist/supported_file_types.json index ded820e..27dc9fe 100644 --- a/internal/config/allowlist/supported_file_types.json +++ b/internal/config/allowlist/supported_file_types.json @@ -62,6 +62,8 @@ ".exs", ".erl", ".hrl", + ".ets", + ".json5", ".dart", ".tf" ] \ No newline at end of file diff --git a/internal/config/rules/rule_docs/arkts.md b/internal/config/rules/rule_docs/arkts.md new file mode 100644 index 0000000..2036927 --- /dev/null +++ b/internal/config/rules/rule_docs/arkts.md @@ -0,0 +1,55 @@ +#### 明确的错别字或拼写错误 +- 组件名、变量名、函数名中的拼写错误 +- 日志或错误信息中影响阅读理解的拼写错误 + +#### 死代码 +- 永远不会被执行到的代码块(如条件恒为 false 的分支、return 语句后的代码) +- 声明后从未被读取或引用的变量 +- 已注释掉的大段代码块(无明显保留意图的注释代码) + +#### 状态装饰器使用 +- `@State` 修饰的数组/对象通过 push/属性修改不会触发 UI 刷新,必须替换引用 +- `@Prop`(单向)与 `@Link`(双向)使用场景是否正确 +- 嵌套对象状态更新必须配合 `@Observed` + `@ObjectLink` +- 超过 3 层 props 传递应使用 `@Provide/@Consume` 替代 +- `@StorageLink/@StorageProp` 仅用于真正的全局状态,避免滥用 + +#### 组件生命周期 +- `aboutToAppear` 中创建的定时器、监听器必须在 `aboutToDisappear` 中释放 +- 页面级逻辑应放在 `onPageShow/onPageHide` 而非组件生命周期中 +- 避免在生命周期中执行耗时同步操作阻塞 UI 线程 + +#### ArkUI 声明式语法 +- 禁止在 `build` 方法中执行副作用(网络请求、定时器、日志打印) +- `ForEach` / `LazyForEach` 必须提供唯一且稳定的 key 生成函数 +- 条件渲染使用 `if/else`,不使用 `switch` +- 禁止在 `build` 方法外直接操作组件实例 + +#### 性能优化 +- 大列表(>20项)必须使用 `LazyForEach` 替代 `ForEach` +- 禁止在 `build` 方法中创建新对象、闭包或调用函数返回样式,会导致子组件不必要重建 +- 复杂计算结果应通过 `@Watch` 缓存,避免每次渲染重复计算 +- 图片资源应设置合理缓存策略,避免重复加载 + +#### 资源访问规范 +- 字符串禁止硬编码,必须使用 `$r('app.string.key')` 支持国际化 +- 图片使用 `$r('app.media.icon')` 或 `$rawfile('path')`,禁止硬编码路径 +- 颜色/尺寸使用资源引用 `$r('app.color.primary')` 支持主题切换 + +#### 组件通信 +- 父→子用 `@Prop`/`@Link`,子→父用回调函数 `onEvent` 模式 +- 跨组件通信用 `@Provide/@Consume`,全局状态用 `AppStorage` +- 避免通过 `AppStorage` 传递组件间局部状态 + +#### TypeScript 通用规范 +- 禁止使用 `any` 类型,如必须使用需注释说明原因 +- 禁止使用 `var`,必须使用 `let` 或 `const` +- 禁止使用 `==` 和 `!=`,必须使用 `===` 和 `!==` +- 异步函数必须包含 try-catch 错误处理,提供用户友好的错误提示 +- 优先使用 async/await,禁止回调地狱;独立异步操作用 `Promise.all` 并行 +- 空值判断:取值或解构赋值时进行空值判断,避免空指针异常 + +#### 代码安全性检查 +- 用户输入必须校验(长度、格式、范围),禁止直接拼接到 SQL 或命令字符串 +- 敏感信息(密钥、密码、token)禁止打印到日志或上传 +- 网络请求必须使用 HTTPS 并验证证书 diff --git a/internal/config/rules/system_rules.json b/internal/config/rules/system_rules.json index 470a701..3cc0093 100644 --- a/internal/config/rules/system_rules.json +++ b/internal/config/rules/system_rules.json @@ -6,9 +6,10 @@ "**/pom.xml": "pom_xml.md", "**/build.gradle": "build_gradle.md", "**/package.json": "package_json.md", - "**/*.json": "json.md", + "**/*.{json,json5}": "json.md", "**/*.{yaml,yml}": "yaml.md", "**/*.java": "java.md", + "**/*.ets": "arkts.md", "**/*.{ts,js,tsx,jsx}": "ts_js_tsx_jsx.md", "**/*.{kt}": "kotlin.md", "**/*.{cpp,cc,hpp}": "cpp.md", diff --git a/internal/config/rules/system_rules_test.go b/internal/config/rules/system_rules_test.go index da23e58..b364cd8 100644 --- a/internal/config/rules/system_rules_test.go +++ b/internal/config/rules/system_rules_test.go @@ -72,6 +72,10 @@ func TestResolve_DefaultRules(t *testing.T) { {"app.kt", "空安全"}, {"src/main/handler.cpp", "智能指针"}, {"driver.c", "malloc"}, + {"pages/Index.ets", "状态装饰器"}, + {"components/Button.ets", "状态装饰器"}, + {"entry/src/main/module.json5", "json-key"}, + {"entry/oh-package.json5", "json-key"}, } for _, tt := range tests {