2.5 KiB
2.5 KiB
Step 04 — Phase 2.3: Stylelint 适配器
依赖: Step 02
参考设计: §3.3
目标
实现 CSS 的 Stylelint 适配器,用 stylelint npm 包直接检查代码。
前置准备
npm install --save stylelint@^17.14.0
新建文件
| # | 文件 | 说明 |
|---|---|---|
| 1 | src/adapters/stylelint.ts |
StylelintAdapter |
src/adapters/stylelint.ts
import * as vscode from 'vscode';
import { LinterAdapter, LinterDiagnostic, AdapterResult } from '../types';
export class StylelintAdapter implements LinterAdapter {
id = 'stylelint';
supportedLanguages = ['css'];
async check(document: vscode.TextDocument, _workingDir: string): Promise<AdapterResult> {
try {
const code = document.getText();
const stylelint = await import('stylelint');
const result = await stylelint.default.lint({
code,
codeFilename: document.uri.fsPath,
config: { rules: {} },
});
const diagnostics: LinterDiagnostic[] = [];
for (const warning of result.results[0]?.warnings ?? []) {
const line = Math.max(0, (warning.line ?? 1) - 1);
const column = Math.max(0, (warning.column ?? 1) - 1);
const range = new vscode.Range(line, column, line, column + 1);
diagnostics.push({
severity: warning.severity === 'error' ? 'error' : 'warning',
ruleId: `stylelint:${warning.rule}`,
message: warning.text,
range,
});
}
return { diagnostics, status: 'ok' };
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
if (message.includes('Cannot find module')) {
return { diagnostics: [], status: 'tool-unavailable', errorMessage: 'Stylelint 未安装,请执行 npm install stylelint' };
}
return { diagnostics: [], status: 'execution-failed', errorMessage: message };
}
}
isAvailable(): boolean {
try {
require.resolve('stylelint');
return true;
} catch {
return false;
}
}
}
关键逻辑
check(): 使用stylelint.lint({ code, codeFilename })直接检查代码文本,支持虚拟文档- ruleId 加前缀
stylelint:,如stylelint:color-no-invalid-hex isAvailable(): 通过require.resolve检测 stylelint 是否已安装- 错误处理:模块未找到 →
tool-unavailable,其他错误 →execution-failed
验收
- 文件创建完成
npm run compile通过npm run lint通过