fix: 质量修复 — ESLint 规则 TS6 兼容 + catch 注解 + 空函数体注释化 + 后端架构对齐 + 前端红线修复
- enforce-catch-type: 增加 TSUnknownKeyword 判断,消除28个 TS6 假阳性 - no-empty-function: 统一为注释方案,移除测试/生产分支和 eslint-disable 引导 - logger.ts: 空函数体改为注释说明,删除无用 eslint-disable 指令 - 补充15处 catch 子句 : unknown 类型注解 - 清理7个测试文件失效 eslint-disable 指令 - chat/send.ts: 提取 getModelWithProvider DAO,消除直接 Drizzle 操作 - projects/update.ts: 修复死代码+条件逻辑 bug - providers/update.ts: 补充至少一个字段校验 - 前端: inline style → CSS className, ProviderFormModal whitespace 校验 - 开发文档: 更新 Zod 使用说明(AI SDK 框架级约束)
This commit is contained in:
@@ -29,7 +29,7 @@ export async function fetchConversation(projectId: string, conversationId: strin
|
||||
try {
|
||||
const response = await fetch(`/api/projects/${projectId}/conversations/${conversationId}`);
|
||||
return handleResponse(response, (data) => (data as ConversationResponse).conversation);
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
logger.error("获取会话失败", {
|
||||
conversationId,
|
||||
error: err instanceof Error ? err.message : String(err),
|
||||
@@ -61,7 +61,7 @@ export async function updateConversation(
|
||||
method: "PATCH",
|
||||
});
|
||||
return handleResponse(response, (data) => (data as ConversationResponse).conversation);
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
logger.error("更新会话失败", {
|
||||
conversationId,
|
||||
error: err instanceof Error ? err.message : String(err),
|
||||
|
||||
@@ -109,7 +109,7 @@ export function ModelFormModal({
|
||||
message.success("模型已创建");
|
||||
}
|
||||
onOpenChange(false);
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof Error) {
|
||||
message.error(err.message);
|
||||
}
|
||||
@@ -136,7 +136,7 @@ export function ModelFormModal({
|
||||
} else {
|
||||
message.error(result.message);
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
message.error((err as Error).message);
|
||||
} finally {
|
||||
setTesting(false);
|
||||
|
||||
@@ -69,7 +69,7 @@ export function ModelTable({
|
||||
try {
|
||||
await onDelete(id);
|
||||
message.success("模型已删除");
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
message.error((err as Error).message);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -83,7 +83,7 @@ export function ProviderFormModal({
|
||||
message.success("供应商已创建");
|
||||
}
|
||||
onOpenChange(false);
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof Error) {
|
||||
message.error(err.message);
|
||||
}
|
||||
@@ -105,7 +105,7 @@ export function ProviderFormModal({
|
||||
} else {
|
||||
message.error(result.message);
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof Error) {
|
||||
message.error(err.message);
|
||||
}
|
||||
@@ -135,10 +135,18 @@ export function ProviderFormModal({
|
||||
<Form.Item label="供应商类型" name="type" rules={[{ message: "请选择供应商类型", required: true }]}>
|
||||
<Select options={TYPE_OPTIONS} placeholder="请选择供应商类型" />
|
||||
</Form.Item>
|
||||
<Form.Item label="Base URL" name="baseUrl" rules={[{ message: "请输入 Base URL", required: true }]}>
|
||||
<Form.Item
|
||||
label="Base URL"
|
||||
name="baseUrl"
|
||||
rules={[{ message: "请输入 Base URL", required: true, whitespace: true }]}
|
||||
>
|
||||
<Input placeholder="https://api.openai.com/v1" />
|
||||
</Form.Item>
|
||||
<Form.Item label="API Key" name="apiKey" rules={[{ message: "请输入 API Key", required: true }]}>
|
||||
<Form.Item
|
||||
label="API Key"
|
||||
name="apiKey"
|
||||
rules={[{ message: "请输入 API Key", required: true, whitespace: true }]}
|
||||
>
|
||||
<Input.Password placeholder="请输入 API Key" />
|
||||
</Form.Item>
|
||||
<Form.Item>
|
||||
|
||||
@@ -39,7 +39,7 @@ export function ProviderTable({ data, loading, onDelete, onEdit, onPageChange, p
|
||||
try {
|
||||
await onDelete(id);
|
||||
message.success("供应商已删除");
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
message.error((err as Error).message);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -111,7 +111,7 @@ export function ModelsPage() {
|
||||
};
|
||||
|
||||
return (
|
||||
<Space orientation="vertical" size="large" style={{ flex: 1 }}>
|
||||
<Space className="app-page-flex" orientation="vertical" size="large">
|
||||
<ModelsToolbar
|
||||
activeTab={activeTab}
|
||||
key={activeTab}
|
||||
|
||||
@@ -53,7 +53,7 @@ export function ProjectFormModal({
|
||||
message.success("项目已创建");
|
||||
}
|
||||
onOpenChange(false);
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof Error) {
|
||||
message.error(err.message);
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ export function ProjectTable({
|
||||
try {
|
||||
await onArchive(id);
|
||||
message.success("项目已归档");
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
message.error((err as Error).message);
|
||||
}
|
||||
};
|
||||
@@ -78,7 +78,7 @@ export function ProjectTable({
|
||||
try {
|
||||
await onRestore(id);
|
||||
message.success("项目已恢复");
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
message.error((err as Error).message);
|
||||
}
|
||||
};
|
||||
@@ -87,7 +87,7 @@ export function ProjectTable({
|
||||
try {
|
||||
await onDelete(id);
|
||||
message.success("项目已永久删除");
|
||||
} catch (err) {
|
||||
} catch (err: unknown) {
|
||||
message.error((err as Error).message);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -35,7 +35,7 @@ export function ProjectsPage() {
|
||||
const isRowActionPending = archiveMutation.isPending || restoreMutation.isPending || deleteMutation.isPending;
|
||||
|
||||
return (
|
||||
<Space orientation="vertical" size="large" style={{ flex: 1 }}>
|
||||
<Space className="app-page-flex" orientation="vertical" size="large">
|
||||
<ProjectToolbar
|
||||
activeTab={tabValue}
|
||||
keyword={keyword}
|
||||
|
||||
@@ -250,3 +250,7 @@ body {
|
||||
.card-extra-actions .btn-dimmed:hover {
|
||||
color: var(--ant-color-text-secondary);
|
||||
}
|
||||
|
||||
.app-page-flex {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,9 @@ export interface Sink {
|
||||
}
|
||||
|
||||
class AntdMessageSink implements Sink {
|
||||
constructor(private messageApi: MessageInstance) {}
|
||||
constructor(private messageApi: MessageInstance) {
|
||||
// 仅存储依赖,无需初始化操作
|
||||
}
|
||||
|
||||
write(level: LogLevel, message: string, _data: unknown, _bindings: Record<string, unknown>): void {
|
||||
if (level === "warn") this.messageApi.warning(message);
|
||||
@@ -70,7 +72,9 @@ class BaseLogger implements Logger {
|
||||
}
|
||||
|
||||
class ConsoleSink implements Sink {
|
||||
constructor(private isProduction: boolean) {}
|
||||
constructor(private isProduction: boolean) {
|
||||
// 仅存储配置,无需初始化操作
|
||||
}
|
||||
|
||||
write(level: LogLevel, message: string, data: unknown, bindings: Record<string, unknown>): void {
|
||||
if (this.isProduction && LEVEL_ORDER[level] < LEVEL_ORDER.warn) return;
|
||||
@@ -85,23 +89,31 @@ class ConsoleSink implements Sink {
|
||||
}
|
||||
}
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-empty-function */
|
||||
class NoopLogger implements Logger {
|
||||
child(_bindings: Record<string, unknown>): Logger {
|
||||
return this;
|
||||
}
|
||||
|
||||
debug(_message: string, _data?: unknown): void {}
|
||||
debug(_message: string, _data?: unknown): void {
|
||||
/* NoopLogger 实现 Logger 接口契约,有意静默丢弃所有日志 */
|
||||
}
|
||||
|
||||
error(_message: string, _data?: unknown): void {}
|
||||
error(_message: string, _data?: unknown): void {
|
||||
/* NoopLogger 实现 Logger 接口契约,有意静默丢弃所有日志 */
|
||||
}
|
||||
|
||||
info(_message: string, _data?: unknown): void {}
|
||||
info(_message: string, _data?: unknown): void {
|
||||
/* NoopLogger 实现 Logger 接口契约,有意静默丢弃所有日志 */
|
||||
}
|
||||
|
||||
setLevel(_level: LogLevel): void {}
|
||||
setLevel(_level: LogLevel): void {
|
||||
/* NoopLogger 实现 Logger 接口契约,有意静默丢弃所有日志 */
|
||||
}
|
||||
|
||||
warn(_message: string, _data?: unknown): void {}
|
||||
warn(_message: string, _data?: unknown): void {
|
||||
/* NoopLogger 实现 Logger 接口契约,有意静默丢弃所有日志 */
|
||||
}
|
||||
}
|
||||
/* eslint-enable @typescript-eslint/no-empty-function */
|
||||
|
||||
export class MemoryLogger implements Logger {
|
||||
entries: Array<{ data?: unknown; level: LogLevel; message: string }> = [];
|
||||
@@ -123,8 +135,9 @@ export class MemoryLogger implements Logger {
|
||||
this.capture("info", message, data);
|
||||
}
|
||||
|
||||
/* eslint-disable-next-line @typescript-eslint/no-empty-function */
|
||||
setLevel(_level: LogLevel): void {}
|
||||
setLevel(_level: LogLevel): void {
|
||||
// MemoryLogger.setLevel 为接口兼容,无需实际过滤
|
||||
}
|
||||
|
||||
warn(message: string, data?: unknown): void {
|
||||
this.capture("warn", message, data);
|
||||
|
||||
Reference in New Issue
Block a user