@termdock/twlint 1.0.3 → 1.2.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 +104 -17
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -15
- package/dist/cli.js.map +1 -1
- package/dist/core/config-loader.d.ts +2 -2
- package/dist/core/config-loader.d.ts.map +1 -1
- package/dist/core/config-loader.js +1 -1
- package/dist/core/config-matcher.d.ts +58 -0
- package/dist/core/config-matcher.d.ts.map +1 -0
- package/dist/core/config-matcher.js +236 -0
- package/dist/core/config-matcher.js.map +1 -0
- package/dist/core/config-schema.d.ts +2 -1
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +30 -26
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/dictionary-loading-strategies.d.ts +1 -1
- package/dist/core/dictionary-loading-strategies.js +1 -1
- package/dist/core/dictionary-manager.d.ts +1 -1
- package/dist/core/dictionary-manager.d.ts.map +1 -1
- package/dist/core/dictionary-manager.js +76 -24
- package/dist/core/dictionary-manager.js.map +1 -1
- package/dist/core/ignore-file-loader.d.ts +29 -0
- package/dist/core/ignore-file-loader.d.ts.map +1 -0
- package/dist/core/ignore-file-loader.js +74 -0
- package/dist/core/ignore-file-loader.js.map +1 -0
- package/dist/core/linter.d.ts +42 -5
- package/dist/core/linter.d.ts.map +1 -1
- package/dist/core/linter.js +129 -38
- package/dist/core/linter.js.map +1 -1
- package/dist/dictionaries/academic.json +1 -1
- package/dist/dictionaries/ai-emerging-tech.json +1 -1
- package/dist/dictionaries/business-finance.json +1 -1
- package/dist/dictionaries/core.json +386 -2
- package/dist/dictionaries/hardware-3c.json +1 -1
- package/dist/dictionaries/index.json +4 -4
- package/dist/dictionaries/network-cloud.json +1 -1
- package/dist/dictionaries/operating-system.json +1 -1
- package/dist/dictionaries/social-media.json +1 -1
- package/dist/dictionaries/software-development.json +34 -2
- package/dist/dictionaries/user-interface.json +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/core/linter.js
CHANGED
|
@@ -3,6 +3,8 @@ import { readFile } from 'fs/promises';
|
|
|
3
3
|
import { DictionaryManager } from './dictionary-manager.js';
|
|
4
4
|
import { SimplifiedCharsRule } from './rules/simplified-chars.js';
|
|
5
5
|
import { MainlandTermsRule } from './rules/mainland-terms.js';
|
|
6
|
+
import { ConfigMatcher } from './config-matcher.js';
|
|
7
|
+
import { IgnoreFileLoader } from './ignore-file-loader.js';
|
|
6
8
|
import { formatError, ErrorHandler } from '../utils/error-utils.js';
|
|
7
9
|
import { DictLoadStrategyFactory } from './dictionary-loading-strategies.js';
|
|
8
10
|
export class TWLinter {
|
|
@@ -10,12 +12,29 @@ export class TWLinter {
|
|
|
10
12
|
rules = new Map();
|
|
11
13
|
config;
|
|
12
14
|
deepMode = false;
|
|
15
|
+
configMatcher;
|
|
16
|
+
twlintignoreLoaded = false;
|
|
13
17
|
constructor(config, options) {
|
|
14
18
|
this.config = config;
|
|
15
19
|
this.deepMode = options?.deep || false;
|
|
16
20
|
this.dictManager = new DictionaryManager();
|
|
21
|
+
this.configMatcher = new ConfigMatcher(config);
|
|
17
22
|
this.initializeRules();
|
|
18
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* 載入 .twlintignore 檔案(如果存在)
|
|
26
|
+
*
|
|
27
|
+
* 這個方法會在第一次需要時自動呼叫
|
|
28
|
+
*/
|
|
29
|
+
async loadTwlintignore() {
|
|
30
|
+
if (this.twlintignoreLoaded)
|
|
31
|
+
return;
|
|
32
|
+
const patterns = await IgnoreFileLoader.load();
|
|
33
|
+
if (patterns.length > 0) {
|
|
34
|
+
this.configMatcher.setTwlintignorePatterns(patterns);
|
|
35
|
+
}
|
|
36
|
+
this.twlintignoreLoaded = true;
|
|
37
|
+
}
|
|
19
38
|
initializeRules() {
|
|
20
39
|
// 註冊簡體字檢測規則
|
|
21
40
|
this.rules.set('simplified-chars', new SimplifiedCharsRule());
|
|
@@ -23,6 +42,8 @@ export class TWLinter {
|
|
|
23
42
|
this.rules.set('mainland-terms', new MainlandTermsRule(this.dictManager));
|
|
24
43
|
}
|
|
25
44
|
async lintFiles(patterns) {
|
|
45
|
+
// 載入 .twlintignore(如果存在)
|
|
46
|
+
await this.loadTwlintignore();
|
|
26
47
|
const files = await this.expandFilePatterns(patterns);
|
|
27
48
|
const results = [];
|
|
28
49
|
for (const filePath of files) {
|
|
@@ -50,10 +71,11 @@ export class TWLinter {
|
|
|
50
71
|
}
|
|
51
72
|
return results;
|
|
52
73
|
}
|
|
53
|
-
async lintText(text,
|
|
54
|
-
|
|
74
|
+
async lintText(text, filePath) {
|
|
75
|
+
// 根據檔案路徑載入對應的詞庫
|
|
76
|
+
await this.loadDictionariesForFile(filePath);
|
|
55
77
|
const issues = [];
|
|
56
|
-
const activeRules = this.
|
|
78
|
+
const activeRules = this.getActiveRulesForFile(filePath);
|
|
57
79
|
// Process all active rules with unified preprocessing
|
|
58
80
|
for (const rule of activeRules) {
|
|
59
81
|
try {
|
|
@@ -74,9 +96,9 @@ export class TWLinter {
|
|
|
74
96
|
}
|
|
75
97
|
return issues;
|
|
76
98
|
}
|
|
77
|
-
async fixText(text) {
|
|
78
|
-
await this.
|
|
79
|
-
const activeRules = this.
|
|
99
|
+
async fixText(text, filePath) {
|
|
100
|
+
await this.loadDictionariesForFile(filePath);
|
|
101
|
+
const activeRules = this.getActiveRulesForFile(filePath).filter(rule => rule.fix);
|
|
80
102
|
let result = text;
|
|
81
103
|
// 按規則順序依次應用修復
|
|
82
104
|
for (const rule of activeRules) {
|
|
@@ -91,42 +113,41 @@ export class TWLinter {
|
|
|
91
113
|
}
|
|
92
114
|
async expandFilePatterns(patterns) {
|
|
93
115
|
const files = [];
|
|
94
|
-
const
|
|
116
|
+
const baseIgnorePatterns = await this.getBaseIgnorePatterns();
|
|
95
117
|
for (const pattern of patterns) {
|
|
96
118
|
// 檢查是否為明確的檔案路徑(沒有萬用字元)
|
|
97
119
|
const hasWildcards = pattern.includes('*') || pattern.includes('?') || pattern.includes('[');
|
|
98
120
|
if (!hasWildcards) {
|
|
99
|
-
//
|
|
100
|
-
|
|
121
|
+
// 明確的檔案路徑:直接加入,但要檢查設定的 ignores
|
|
122
|
+
if (!this.configMatcher.isIgnored(pattern)) {
|
|
123
|
+
files.push(pattern);
|
|
124
|
+
}
|
|
101
125
|
}
|
|
102
126
|
else {
|
|
103
|
-
// 萬用字元模式:使用 glob
|
|
127
|
+
// 萬用字元模式:使用 glob 擴展
|
|
104
128
|
const matches = await glob(pattern, {
|
|
105
|
-
ignore:
|
|
129
|
+
ignore: baseIgnorePatterns,
|
|
106
130
|
dot: false // 預設不包含隱藏檔案
|
|
107
131
|
});
|
|
108
|
-
|
|
132
|
+
// 過濾掉設定中 ignores 的檔案
|
|
133
|
+
const filtered = matches.filter(file => !this.configMatcher.isIgnored(file));
|
|
134
|
+
files.push(...filtered);
|
|
109
135
|
}
|
|
110
136
|
}
|
|
111
137
|
return [...new Set(files)]; // Remove duplicates
|
|
112
138
|
}
|
|
113
|
-
|
|
114
|
-
|
|
139
|
+
/**
|
|
140
|
+
* 取得基礎忽略模式(僅用於 glob 擴展時的初步過濾)
|
|
141
|
+
*
|
|
142
|
+
* 注意:
|
|
143
|
+
* - 系統鐵律(SYSTEM_IGNORES)已在 ConfigMatcher 處理
|
|
144
|
+
* - 這裡只需要最基本的過濾,避免 glob 擴展時掃描過多檔案
|
|
145
|
+
*/
|
|
146
|
+
async getBaseIgnorePatterns() {
|
|
147
|
+
// 只保留最基本的過濾,其餘交給 ConfigMatcher
|
|
148
|
+
const baseIgnores = [
|
|
115
149
|
'node_modules/**',
|
|
116
|
-
'.git/**'
|
|
117
|
-
'.next/**',
|
|
118
|
-
'.nuxt/**',
|
|
119
|
-
'dist/**',
|
|
120
|
-
'build/**',
|
|
121
|
-
'coverage/**',
|
|
122
|
-
'logs/**',
|
|
123
|
-
'*.log',
|
|
124
|
-
'.env*',
|
|
125
|
-
'.DS_Store',
|
|
126
|
-
'.vscode/**',
|
|
127
|
-
'.idea/**',
|
|
128
|
-
'test-temp/**',
|
|
129
|
-
'*.tmp'
|
|
150
|
+
'.git/**'
|
|
130
151
|
];
|
|
131
152
|
try {
|
|
132
153
|
const { readFile } = await import('fs/promises');
|
|
@@ -146,16 +167,66 @@ export class TWLinter {
|
|
|
146
167
|
}
|
|
147
168
|
return line;
|
|
148
169
|
});
|
|
149
|
-
return [...
|
|
170
|
+
return [...baseIgnores, ...gitignorePatterns];
|
|
150
171
|
}
|
|
151
172
|
catch {
|
|
152
173
|
// 沒有 .gitignore 或讀取失敗,使用預設規則
|
|
153
|
-
return
|
|
174
|
+
return baseIgnores;
|
|
154
175
|
}
|
|
155
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* 根據檔案路徑載入對應的詞庫
|
|
179
|
+
*/
|
|
180
|
+
async loadDictionariesForFile(filePath) {
|
|
181
|
+
if (this.deepMode) {
|
|
182
|
+
// Deep mode: 載入所有可用詞庫
|
|
183
|
+
const strategy = DictLoadStrategyFactory.create(Array.isArray(this.config) ? this.config[0] : this.config, true);
|
|
184
|
+
const dictNames = await strategy.getDictionaries(Array.isArray(this.config) ? this.config[0] : this.config, this.dictManager);
|
|
185
|
+
for (const name of dictNames) {
|
|
186
|
+
try {
|
|
187
|
+
await this.dictManager.loadDictionary(name);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
ErrorHandler.handle(error, `Failed to load dictionary "${name}"`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// 根據檔案獲取對應的 domains
|
|
196
|
+
const domains = filePath ? this.configMatcher.getDomainsForFile(filePath) : [];
|
|
197
|
+
// 組合要載入的詞庫:core (永遠載入) + domains
|
|
198
|
+
const dictNames = ['core']; // 永遠包含 core
|
|
199
|
+
if (domains.length > 0) {
|
|
200
|
+
dictNames.push(...domains);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// 如果沒有指定 domains,使用設定中的 dictionaries
|
|
204
|
+
const defaultDicts = this.getDefaultDictionaries().filter(d => d !== 'core');
|
|
205
|
+
dictNames.push(...defaultDicts);
|
|
206
|
+
}
|
|
207
|
+
for (const name of dictNames) {
|
|
208
|
+
try {
|
|
209
|
+
await this.dictManager.loadDictionary(name);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
ErrorHandler.handle(error, `Failed to load dictionary "${name}"`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* 取得預設詞庫列表
|
|
218
|
+
*/
|
|
219
|
+
getDefaultDictionaries() {
|
|
220
|
+
const config = Array.isArray(this.config) ? this.config[0] : this.config;
|
|
221
|
+
return config.dictionaries || ['core'];
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* 舊方法保留向後相容
|
|
225
|
+
*/
|
|
156
226
|
async loadDictionaries(deep) {
|
|
157
|
-
const
|
|
158
|
-
const
|
|
227
|
+
const config = Array.isArray(this.config) ? this.config[0] : this.config;
|
|
228
|
+
const strategy = DictLoadStrategyFactory.create(config, deep);
|
|
229
|
+
const dictNames = await strategy.getDictionaries(config, this.dictManager);
|
|
159
230
|
for (const name of dictNames) {
|
|
160
231
|
try {
|
|
161
232
|
await this.dictManager.loadDictionary(name);
|
|
@@ -166,12 +237,15 @@ export class TWLinter {
|
|
|
166
237
|
}
|
|
167
238
|
}
|
|
168
239
|
}
|
|
169
|
-
|
|
240
|
+
/**
|
|
241
|
+
* 根據檔案路徑獲取適用的規則
|
|
242
|
+
*/
|
|
243
|
+
getActiveRulesForFile(filePath) {
|
|
170
244
|
const activeRules = [];
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
245
|
+
// 如果有檔案路徑,使用 ConfigMatcher 獲取檔案特定的規則
|
|
246
|
+
const rules = filePath
|
|
247
|
+
? this.configMatcher.getRulesForFile(filePath)
|
|
248
|
+
: this.getDefaultRules();
|
|
175
249
|
for (const [ruleName, severity] of Object.entries(rules)) {
|
|
176
250
|
if (severity !== 'off') {
|
|
177
251
|
const rule = this.rules.get(ruleName);
|
|
@@ -182,11 +256,28 @@ export class TWLinter {
|
|
|
182
256
|
}
|
|
183
257
|
return activeRules;
|
|
184
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* 取得預設規則
|
|
261
|
+
*/
|
|
262
|
+
getDefaultRules() {
|
|
263
|
+
const config = Array.isArray(this.config) ? this.config[0] : this.config;
|
|
264
|
+
return config.rules || {
|
|
265
|
+
'simplified-chars': 'error',
|
|
266
|
+
'mainland-terms': 'warning'
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* 舊方法保留向後相容
|
|
271
|
+
*/
|
|
272
|
+
getActiveRules() {
|
|
273
|
+
return this.getActiveRulesForFile(undefined);
|
|
274
|
+
}
|
|
185
275
|
/**
|
|
186
276
|
* 檢查規則是否啟用
|
|
187
277
|
*/
|
|
188
278
|
isRuleActive(ruleName) {
|
|
189
|
-
const
|
|
279
|
+
const config = Array.isArray(this.config) ? this.config[0] : this.config;
|
|
280
|
+
const rules = config.rules || {};
|
|
190
281
|
return rules[ruleName] !== 'off';
|
|
191
282
|
}
|
|
192
283
|
/**
|
package/dist/core/linter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/core/linter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/core/linter.ts"],"names":[],"mappings":"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"}
|