@termdock/twlint 1.0.3 → 1.1.0

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/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # TWLint
2
2
 
3
- **關於 TWLint **
4
-
5
- 目前各大 LLM 訓練語料裡面繁體中文資料的比例非常的少,透過 LLM 產生的各種內容會混雜不同版本的中文,TWLint 目的在幫助開發者統一專案中文件中文字,確保使用台灣繁體中文和用語。
3
+ > **你是否也有這樣的困擾?**
4
+ > AI 生成的文件裡,「软件」「軟件」「軟體」混在一起;技術文檔充滿「用戶」「使用者」不統一的用語;明明用繁體中文卻到處是大陸用語...
5
+ >
6
+ > 因為 LLM 訓練語料中繁體中文資料極少,生成內容常混雜簡體字和大陸用語。**TWLint 就是為了解決這個痛點而生**,讓你的專案文件保持一致的台灣繁體中文,不再手動校對到崩潰。
6
7
 
7
8
  ## ✨ 核心特色
8
9
 
@@ -13,11 +14,12 @@
13
14
 
14
15
  ### 檢索引擎
15
16
  - **語境偵測**:根據上下文精確識別同形異義詞
16
- - **領域專門詞庫**:1,062+ 詞目涵蓋 AI、軟體開發、商業金融等
17
+ - **領域專門詞庫**:多領域詞目涵蓋 AI、軟體開發、商業金融等
17
18
  - **程式碼檢查**:支援註解、字串、UI 文字等程式碼中的中文內容
18
19
 
19
20
  ### 🛠️ 開發者友善
20
- - **ESLint 風格**:預設檢查,`--fix` 修復,完美整合開發流程
21
+ - **ESLint 風格設定**:支援 `ignores`、`files`、`rules` 彈性設定
22
+ - **系統鐵律保護**:自動忽略 `.env`、`.gitignore` 等敏感檔案
21
23
  - **遵循 .gitignore**:智慧跳過不需要的檔案和目錄
22
24
  - **多種輸出格式**:stylish、json 格式滿足不同需求
23
25
  - **npm script 整合**:像使用 ESLint 一樣簡單
@@ -41,16 +43,20 @@ twlint check README.md --fix
41
43
  # 檢查程式碼中的中文(註解、字串等)
42
44
  twlint check "src/**/*.{js,ts,jsx,tsx,vue}"
43
45
 
44
- # 初始化專案配置
46
+ # 初始化專案設定
45
47
  twlint init
46
48
  ```
47
49
 
48
50
  ### 整合到專案(推薦)
49
51
  ```bash
50
- # 1. 初始化配置檔案
52
+ # 1. 初始化設定檔案
51
53
  twlint init
52
54
 
53
- # 2. 按提示加入 package.json scripts
55
+ # 2. 編輯 twlint.config.js 自訂規則和忽略模式
56
+ # 支援 global ignores 和 file-level ignores
57
+ # 詳見「設定」章節
58
+
59
+ # 3. 加入 package.json scripts
54
60
  {
55
61
  "scripts": {
56
62
  "twlint": "twlint check **/*.md **/*.txt",
@@ -60,7 +66,7 @@ twlint init
60
66
  }
61
67
  }
62
68
 
63
- # 3. 簡易的使用方式
69
+ # 4. 簡易的使用方式
64
70
  npm run twlint # 檢查文件
65
71
  npm run twlint:fix # 檢查並修復文件
66
72
  npm run twlint:all # 檢查所有檔案
@@ -71,6 +77,7 @@ npm run twlint:all # 檢查所有檔案
71
77
  ### 文件檢查範例
72
78
  假設有以下包含大陸用語的檔案:
73
79
  ```markdown
80
+ <!-- 以下為示範用簡體字內容 -->
74
81
  # 软件开发项目
75
82
  这个软件的质量很好,我们使用了先进的算法。
76
83
  ```
@@ -136,14 +143,23 @@ function processData(data) {
136
143
  }
137
144
  ```
138
145
 
139
- ## 配置
146
+ ## 設定
140
147
 
141
- ### 專案配置檔案
148
+ ### 專案設定檔案
142
149
 
143
150
  建立 `twlint.config.js`:
144
151
 
145
152
  ```javascript
146
153
  export default [
154
+ // Global ignores - 全域忽略模式
155
+ {
156
+ ignores: [
157
+ "**/test-*.md", // 測試檔案
158
+ "**/draft-*.md", // 草稿檔案
159
+ "**/legacy/**" // 舊版程式碼
160
+ ]
161
+ },
162
+
147
163
  {
148
164
  // 檢查的檔案類型
149
165
  files: ["**/*.md", "**/*.txt"],
@@ -151,18 +167,89 @@ export default [
151
167
  // 使用的領域詞庫(新架構)
152
168
  domains: ["software-development", "user-interface"],
153
169
 
154
- // 或使用舊的詞庫配置(向後相容)
170
+ // 或使用舊的詞庫設定(向後相容)
155
171
  // dictionaries: ["core", "academic"],
156
172
 
157
- // 規則配置
173
+ // 規則設定
158
174
  rules: {
159
175
  "simplified-chars": "error", // 簡體字檢測(自動修復)
160
176
  "mainland-terms": "warning" // 大陸用語檢測(提供建議)
161
177
  }
178
+ },
179
+
180
+ {
181
+ // 程式碼檔案
182
+ files: ["src/**/*.{js,ts,jsx,tsx,vue}"],
183
+ domains: ["software-development"],
184
+ rules: {
185
+ "simplified-chars": "error",
186
+ "mainland-terms": "warning"
187
+ }
162
188
  }
163
189
  ]
164
190
  ```
165
191
 
192
+ ### 自訂忽略規則
193
+
194
+ TWLint 提供三種方式設定忽略規則:
195
+
196
+ #### 1. `.twlintignore` 檔案(推薦)
197
+
198
+ 類似 `.eslintignore`,在專案根目錄建立:
199
+
200
+ ```
201
+ # .twlintignore
202
+
203
+ # 測試文件
204
+ test-*.md
205
+ tests/
206
+
207
+ # 草稿文件
208
+ draft-*.md
209
+ temp/
210
+ ```
211
+
212
+ #### 2. 設定檔案 Global Ignores
213
+
214
+ ```javascript
215
+ export default [
216
+ {
217
+ ignores: [
218
+ "**/test-*.md",
219
+ "**/draft-*.md"
220
+ ]
221
+ }
222
+ ]
223
+ ```
224
+
225
+ #### 3. File-Level Ignores
226
+
227
+ ```javascript
228
+ export default [
229
+ {
230
+ files: ["**/*.md"],
231
+ ignores: ["**/README.md"], // 排除所有 README.md
232
+ rules: {
233
+ "simplified-chars": "error"
234
+ }
235
+ }
236
+ ]
237
+ ```
238
+
239
+ **忽略優先順序**
240
+
241
+ 1. **系統鐵律** - 最高優先(不可覆寫)
242
+ - 設定檔案:`.gitignore`, `.dockerignore`, `.env*`, `.*ignore`
243
+ - 版本控制:`.git/`, `.svn/`, `node_modules/`
244
+ - 建構輸出:`dist/`, `build/`, `.next/`
245
+ - 日誌檔案:`*.log`, `*.tmp`
246
+
247
+ 2. **`.twlintignore` 檔案** - TWLint 專用忽略規則
248
+ 3. **Global Ignores** - 設定檔案中的全域忽略
249
+ 4. **File-Level Ignores** - 特定設定區塊的忽略規則
250
+
251
+ > 📖 完整說明請參考 [docs/configuration-ignores.md](docs/configuration-ignores.md)
252
+
166
253
  ### CLI 選項
167
254
 
168
255
  ```bash
@@ -173,7 +260,7 @@ Options:
173
260
  --format <type> 輸出格式 (stylish, json)
174
261
  --domains <names...> 指定使用的領域詞庫(推薦)
175
262
  --dict <names...> 指定使用的詞庫(向後相容)
176
- --config <path> 配置檔案路徑
263
+ --config <path> 設定檔案路徑
177
264
  --verbose 顯示詳細輸出
178
265
  --deep 深度模式(載入所有詞庫)
179
266
  ```
@@ -196,9 +283,9 @@ TWLint 採用領域導向的詞庫架構,提供更精確的用語檢測:
196
283
  | business-finance | 商業金融 | 123 |
197
284
  | ai-emerging-tech | AI新興技術 | 108 |
198
285
 
199
- ### 配置範例
286
+ ### 設定範例
200
287
 
201
- **領域專門配置**(推薦):
288
+ **領域專門設定**(推薦):
202
289
  ```bash
203
290
  # 軟體開發專案
204
291
  twlint check src/ --domains software-development user-interface
@@ -217,7 +304,7 @@ twlint check README.md --deep
217
304
 
218
305
  ### 傳統詞庫(向後相容)
219
306
 
220
- 仍支援舊的詞庫配置方式:
307
+ 仍支援舊的詞庫設定方式:
221
308
  - **core**:核心技術用語
222
309
  - **academic**:學術用語
223
310
  - **extended**:擴充功能用語集
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAYA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AA2ID,iBAAe,IAAI,kBA4DlB;AAGD,OAAO,EAAE,IAAI,EAAE,CAAA"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAYA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAuID,iBAAe,IAAI,kBAkElB;AAGD,OAAO,EAAE,IAAI,EAAE,CAAA"}
package/dist/cli.js CHANGED
@@ -12,7 +12,7 @@ async function performCheck(linter, files, options) {
12
12
  // 檢查是否找到任何檔案
13
13
  if (files.length === 0) {
14
14
  console.error(chalk.red('✖ No files found matching the pattern.'));
15
- process.exit(1);
15
+ return 1;
16
16
  }
17
17
  const results = await linter.lintFiles(files);
18
18
  const formatter = options.format === 'json'
@@ -28,15 +28,16 @@ async function performCheck(linter, files, options) {
28
28
  if (fileReadErrors.length === results.length && results.length > 0) {
29
29
  // 在顯示詳細錯誤後,再顯示匯總錯誤訊息
30
30
  console.error(chalk.red('✖ Failed to read any of the specified files.'));
31
- process.exit(1);
31
+ return 1;
32
32
  }
33
33
  // ESLint 風格的修復提示(僅在非 JSON 格式時顯示)
34
34
  if (errorCount > 0 || warningCount > 0) {
35
35
  if (fixableCount > 0 && options.format !== 'json') {
36
36
  console.log(chalk.yellow(`\n ${fixableCount} problem${fixableCount === 1 ? '' : 's'} potentially fixable with the \`--fix\` option.`));
37
37
  }
38
- process.exit(errorCount > 0 ? 1 : 0);
38
+ return errorCount > 0 ? 1 : 0;
39
39
  }
40
+ return 0;
40
41
  }
41
42
  async function performAutoFix(linter, files, options) {
42
43
  const { readFile } = await import('fs/promises');
@@ -44,7 +45,7 @@ async function performAutoFix(linter, files, options) {
44
45
  for (const filePath of files) {
45
46
  try {
46
47
  const originalContent = await readFile(filePath, 'utf-8');
47
- const fixedContent = await linter.fixText(originalContent);
48
+ const fixedContent = await linter.fixText(originalContent, filePath);
48
49
  if (originalContent !== fixedContent) {
49
50
  await writeFile(filePath, fixedContent, 'utf-8');
50
51
  totalFixed++;
@@ -61,15 +62,10 @@ async function performAutoFix(linter, files, options) {
61
62
  }
62
63
  }
63
64
  console.log(chalk.green(`\n🎉 Fixed ${totalFixed} file(s)`));
64
- // 修復後重新檢查,顯示剩餘問題
65
- if (totalFixed > 0) {
66
- console.log(chalk.dim('\n--- Remaining issues after fix ---'));
67
- await performCheck(linter, files, { ...options, fix: false });
68
- }
69
65
  }
70
66
  async function performInit(force) {
71
67
  const configFile = 'twlint.config.js';
72
- // 檢查是否已存在配置檔案
68
+ // 檢查是否已存在設定檔案
73
69
  try {
74
70
  await access(configFile);
75
71
  if (!force) {
@@ -81,7 +77,7 @@ async function performInit(force) {
81
77
  catch {
82
78
  // 檔案不存在,可以繼續建立
83
79
  }
84
- // 建立配置檔案
80
+ // 建立設定檔案
85
81
  const configContent = createSampleConfig();
86
82
  await writeFile(configFile, configContent, 'utf-8');
87
83
  console.log(chalk.green(`✅ Created ${configFile}`));
@@ -142,10 +138,16 @@ async function main() {
142
138
  .option('--verbose', 'Enable verbose output')
143
139
  .action(async (files, options) => {
144
140
  try {
145
- const config = await loadConfig(options.config);
146
- // 如果指定了 --dict 選項,覆蓋配置中的詞庫設定
141
+ let config = await loadConfig(options.config);
142
+ // 如果指定了 --dict 選項,覆蓋設定中的詞庫設定
147
143
  if (options.dict) {
148
- config.dictionaries = options.dict;
144
+ if (Array.isArray(config)) {
145
+ // 修改第一個設定物件
146
+ config = config.map((c, i) => i === 0 ? { ...c, dictionaries: options.dict } : c);
147
+ }
148
+ else {
149
+ config = { ...config, dictionaries: options.dict };
150
+ }
149
151
  }
150
152
  const linter = new TWLinter(config, { deep: options.deep });
151
153
  if (options.deep && options.verbose) {
@@ -157,7 +159,8 @@ async function main() {
157
159
  }
158
160
  else {
159
161
  // 檢查模式
160
- await performCheck(linter, files, options);
162
+ const exitCode = await performCheck(linter, files, options);
163
+ process.exit(exitCode);
161
164
  }
162
165
  }
163
166
  catch (error) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import type { TWLintConfig } from '../types.js';
2
- export declare function loadConfig(configPath?: string): Promise<TWLintConfig>;
1
+ import type { TWLintUserConfig } from '../types.js';
2
+ export declare function loadConfig(configPath?: string): Promise<TWLintUserConfig>;
3
3
  //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqD3E"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqD/E"}
@@ -30,7 +30,7 @@ export async function loadConfig(configPath) {
30
30
  // 如果是 ES module 匯入問題,嘗試其他方式
31
31
  if (path.endsWith('.js') || path.endsWith('.mjs')) {
32
32
  const content = await readFile(path, 'utf-8');
33
- // 簡單的配置檔案執行(僅支援 export default)
33
+ // 簡單的設定檔案執行(僅支援 export default)
34
34
  if (content.includes('export default')) {
35
35
  console.warn(`Config file ${path} found but unable to import. Using default config.`);
36
36
  return DEFAULT_CONFIG;
@@ -0,0 +1,58 @@
1
+ import type { TWLintConfigRule } from './config-schema.js';
2
+ /**
3
+ * ConfigMatcher - 判斷檔案該套用哪些設定規則
4
+ *
5
+ * 設計原則(Linus style):
6
+ * 1. 系統鐵律優先(SYSTEM_IGNORES 絕對不可覆寫)
7
+ * 2. .twlintignore 檔案模式
8
+ * 3. 線性掃描所有設定區塊
9
+ * 4. 收集所有匹配的規則
10
+ * 5. 後面的規則覆寫前面的(ESLint flat config 風格)
11
+ */
12
+ export declare class ConfigMatcher {
13
+ private configs;
14
+ private twlintignorePatterns;
15
+ constructor(configs: TWLintConfigRule | TWLintConfigRule[]);
16
+ /**
17
+ * 設定 .twlintignore 檔案的模式
18
+ *
19
+ * 應該在建構後立即呼叫,從外部載入
20
+ */
21
+ setTwlintignorePatterns(patterns: string[]): void;
22
+ /**
23
+ * 判斷檔案是否應該被忽略
24
+ *
25
+ * 邏輯:
26
+ * 1. 系統鐵律(SYSTEM_IGNORES)最優先 - 絕對不可覆寫
27
+ * 2. .twlintignore 檔案模式
28
+ * 3. Global ignores(只有 ignores 屬性的設定)
29
+ * 4. 檔案級別的 ignores
30
+ */
31
+ isIgnored(filePath: string): boolean;
32
+ /**
33
+ * 取得檔案適用的規則
34
+ *
35
+ * 合併所有匹配設定區塊的規則,後面的覆寫前面的
36
+ */
37
+ getRulesForFile(filePath: string): Record<string, 'error' | 'warning' | 'info' | 'off'>;
38
+ /**
39
+ * 取得檔案適用的詞庫/領域
40
+ */
41
+ getDomainsForFile(filePath: string): string[];
42
+ /**
43
+ * 檢查檔案路徑是否匹配任何 glob 模式
44
+ *
45
+ * 邏輯:
46
+ * 1. 分離正向模式和否定模式
47
+ * 2. 先檢查正向模式是否匹配
48
+ * 3. 如果匹配,檢查否定模式是否排除
49
+ *
50
+ * "好品味":消除 if/else 特殊情況,分離兩種邏輯
51
+ */
52
+ private matchesAnyPattern;
53
+ /**
54
+ * 使用 minimatch 進行 glob 匹配
55
+ */
56
+ private matchPattern;
57
+ }
58
+ //# sourceMappingURL=config-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-matcher.d.ts","sourceRoot":"","sources":["../../src/core/config-matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AA2D1D;;;;;;;;;GASG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,oBAAoB,CAAe;gBAEvB,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,EAAE;IAElE;;;;OAIG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAIjD;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IA8CpC;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;IAiCvF;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAmC7C;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAqCzB;;OAEG;IACH,OAAO,CAAC,YAAY;CAMrB"}
@@ -0,0 +1,236 @@
1
+ import { minimatch } from 'minimatch';
2
+ /**
3
+ * 系統級忽略模式 - 鐵律,無論如何都不檢查這些檔案
4
+ *
5
+ * "有些東西就是不該被碰。設定檔案就是其中之一。"
6
+ *
7
+ * 這些模式優先於任何使用者設定,確保:
8
+ * 1. 不會誤檢查敏感設定檔案(.env, .gitignore 等)
9
+ * 2. 不會進入版本控制系統目錄(.git, .svn)
10
+ * 3. 不會掃描第三方套件(node_modules)
11
+ */
12
+ const SYSTEM_IGNORES = [
13
+ // 版本控制系統
14
+ '**/.git/**',
15
+ '**/.svn/**',
16
+ '**/.hg/**',
17
+ // 第三方套件和相依性
18
+ '**/node_modules/**',
19
+ '**/vendor/**',
20
+ // 設定檔案(鐵律:絕對不檢查)
21
+ '**/.gitignore',
22
+ '**/.dockerignore',
23
+ '**/.npmignore',
24
+ '**/.eslintignore',
25
+ '**/.prettierignore',
26
+ '**/.*ignore', // 任何 *ignore 檔案
27
+ // 環境變數和敏感資訊
28
+ '**/.env',
29
+ '**/.env.*',
30
+ '**/.envrc',
31
+ // 系統檔案
32
+ '**/.DS_Store',
33
+ '**/Thumbs.db',
34
+ '**/desktop.ini',
35
+ // 編輯器和 IDE 設定
36
+ '**/.vscode/**',
37
+ '**/.idea/**',
38
+ '**/.vs/**',
39
+ // 建構輸出
40
+ '**/dist/**',
41
+ '**/build/**',
42
+ '**/out/**',
43
+ '**/.next/**',
44
+ '**/.nuxt/**',
45
+ // 日誌和臨時檔案
46
+ '**/*.log',
47
+ '**/*.tmp',
48
+ '**/*.temp',
49
+ '**/logs/**'
50
+ ];
51
+ /**
52
+ * ConfigMatcher - 判斷檔案該套用哪些設定規則
53
+ *
54
+ * 設計原則(Linus style):
55
+ * 1. 系統鐵律優先(SYSTEM_IGNORES 絕對不可覆寫)
56
+ * 2. .twlintignore 檔案模式
57
+ * 3. 線性掃描所有設定區塊
58
+ * 4. 收集所有匹配的規則
59
+ * 5. 後面的規則覆寫前面的(ESLint flat config 風格)
60
+ */
61
+ export class ConfigMatcher {
62
+ configs;
63
+ twlintignorePatterns = [];
64
+ constructor(configs) {
65
+ this.configs = configs;
66
+ }
67
+ /**
68
+ * 設定 .twlintignore 檔案的模式
69
+ *
70
+ * 應該在建構後立即呼叫,從外部載入
71
+ */
72
+ setTwlintignorePatterns(patterns) {
73
+ this.twlintignorePatterns = patterns;
74
+ }
75
+ /**
76
+ * 判斷檔案是否應該被忽略
77
+ *
78
+ * 邏輯:
79
+ * 1. 系統鐵律(SYSTEM_IGNORES)最優先 - 絕對不可覆寫
80
+ * 2. .twlintignore 檔案模式
81
+ * 3. Global ignores(只有 ignores 屬性的設定)
82
+ * 4. 檔案級別的 ignores
83
+ */
84
+ isIgnored(filePath) {
85
+ // 第一層:系統鐵律檢查(絕對優先)
86
+ if (this.matchesAnyPattern(filePath, SYSTEM_IGNORES)) {
87
+ return true;
88
+ }
89
+ // 第二層:.twlintignore 檔案模式
90
+ if (this.twlintignorePatterns.length > 0) {
91
+ if (this.matchesAnyPattern(filePath, this.twlintignorePatterns)) {
92
+ return true;
93
+ }
94
+ }
95
+ const configArray = Array.isArray(this.configs) ? this.configs : [this.configs];
96
+ // 第三層:收集所有 global ignores(只有 ignores 屬性,沒有 files/rules)
97
+ const globalIgnores = configArray
98
+ .filter(config => config.ignores && !config.files && !config.rules)
99
+ .flatMap(config => config.ignores);
100
+ // 檢查 global ignores
101
+ if (this.matchesAnyPattern(filePath, globalIgnores)) {
102
+ return true;
103
+ }
104
+ // 檢查每個設定區塊的 ignores
105
+ for (const config of configArray) {
106
+ // 跳過 global ignore 區塊
107
+ if (config.ignores && !config.files && !config.rules) {
108
+ continue;
109
+ }
110
+ // 如果有 files 限制,先檢查是否匹配
111
+ if (config.files && !this.matchesAnyPattern(filePath, config.files)) {
112
+ continue;
113
+ }
114
+ // 檢查此區塊的 ignores
115
+ if (config.ignores && this.matchesAnyPattern(filePath, config.ignores)) {
116
+ return true;
117
+ }
118
+ }
119
+ return false;
120
+ }
121
+ /**
122
+ * 取得檔案適用的規則
123
+ *
124
+ * 合併所有匹配設定區塊的規則,後面的覆寫前面的
125
+ */
126
+ getRulesForFile(filePath) {
127
+ if (this.isIgnored(filePath)) {
128
+ return {};
129
+ }
130
+ const configArray = Array.isArray(this.configs) ? this.configs : [this.configs];
131
+ let mergedRules = {};
132
+ for (const config of configArray) {
133
+ // 跳過 global ignore 區塊
134
+ if (config.ignores && !config.files && !config.rules) {
135
+ continue;
136
+ }
137
+ // 檢查 files 模式
138
+ if (config.files && !this.matchesAnyPattern(filePath, config.files)) {
139
+ continue;
140
+ }
141
+ // 檢查 ignores 模式
142
+ if (config.ignores && this.matchesAnyPattern(filePath, config.ignores)) {
143
+ continue;
144
+ }
145
+ // 合併規則(後面的覆寫前面的)
146
+ if (config.rules) {
147
+ mergedRules = { ...mergedRules, ...config.rules };
148
+ }
149
+ }
150
+ return mergedRules;
151
+ }
152
+ /**
153
+ * 取得檔案適用的詞庫/領域
154
+ */
155
+ getDomainsForFile(filePath) {
156
+ if (this.isIgnored(filePath)) {
157
+ return [];
158
+ }
159
+ const configArray = Array.isArray(this.configs) ? this.configs : [this.configs];
160
+ const domains = [];
161
+ for (const config of configArray) {
162
+ // 跳過 global ignore 區塊
163
+ if (config.ignores && !config.files && !config.rules) {
164
+ continue;
165
+ }
166
+ // 檢查 files 模式
167
+ if (config.files && !this.matchesAnyPattern(filePath, config.files)) {
168
+ continue;
169
+ }
170
+ // 檢查 ignores 模式
171
+ if (config.ignores && this.matchesAnyPattern(filePath, config.ignores)) {
172
+ continue;
173
+ }
174
+ // 收集 domains(向後相容 dictionaries)
175
+ if (config.domains) {
176
+ domains.push(...config.domains);
177
+ }
178
+ else if (config.dictionaries) {
179
+ domains.push(...config.dictionaries);
180
+ }
181
+ }
182
+ return [...new Set(domains)]; // 去重
183
+ }
184
+ /**
185
+ * 檢查檔案路徑是否匹配任何 glob 模式
186
+ *
187
+ * 邏輯:
188
+ * 1. 分離正向模式和否定模式
189
+ * 2. 先檢查正向模式是否匹配
190
+ * 3. 如果匹配,檢查否定模式是否排除
191
+ *
192
+ * "好品味":消除 if/else 特殊情況,分離兩種邏輯
193
+ */
194
+ matchesAnyPattern(filePath, patterns) {
195
+ const positivePatterns = [];
196
+ const negativePatterns = [];
197
+ // 分離正向和否定模式
198
+ for (const pattern of patterns) {
199
+ if (pattern.startsWith('!')) {
200
+ negativePatterns.push(pattern.slice(1));
201
+ }
202
+ else {
203
+ positivePatterns.push(pattern);
204
+ }
205
+ }
206
+ // 檢查正向模式
207
+ let matched = false;
208
+ for (const pattern of positivePatterns) {
209
+ if (this.matchPattern(filePath, pattern)) {
210
+ matched = true;
211
+ break;
212
+ }
213
+ }
214
+ // 如果沒有匹配任何正向模式,直接返回 false
215
+ if (!matched) {
216
+ return false;
217
+ }
218
+ // 如果匹配了正向模式,檢查否定模式是否排除
219
+ for (const pattern of negativePatterns) {
220
+ if (this.matchPattern(filePath, pattern)) {
221
+ return false; // 被否定模式排除
222
+ }
223
+ }
224
+ return true;
225
+ }
226
+ /**
227
+ * 使用 minimatch 進行 glob 匹配
228
+ */
229
+ matchPattern(filePath, pattern) {
230
+ return minimatch(filePath, pattern, {
231
+ dot: true, // 匹配 .gitignore 等隱藏檔案
232
+ matchBase: true, // 允許不加 **/ 的模式匹配子目錄
233
+ });
234
+ }
235
+ }
236
+ //# sourceMappingURL=config-matcher.js.map