61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import type {
|
|
DevToolbarCategory,
|
|
DevToolbarIssue,
|
|
DevToolbarSeverity,
|
|
DevToolbarSourceLocation,
|
|
} from "../types.ts";
|
|
|
|
export function createServerIssue(input: {
|
|
ruleId: string;
|
|
category: DevToolbarCategory;
|
|
severity: DevToolbarSeverity;
|
|
title: string;
|
|
message: string;
|
|
pathname?: string;
|
|
source?: DevToolbarSourceLocation;
|
|
stack?: string;
|
|
recommendation?: string;
|
|
}): DevToolbarIssue {
|
|
const sourceKey = input.source?.file
|
|
? `${input.source.file}:${input.source.line ?? 0}:${input.source.column ?? 0}`
|
|
: "";
|
|
return {
|
|
id: `wrn-server-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
ruleId: input.ruleId,
|
|
category: input.category,
|
|
severity: input.severity,
|
|
title: input.title,
|
|
message: input.message,
|
|
source: input.source,
|
|
recommendation: input.recommendation,
|
|
fingerprint: [input.ruleId, input.pathname ?? "", sourceKey, input.message].join("|"),
|
|
createdAt: Date.now(),
|
|
confidence: "high",
|
|
metadata: { pathname: input.pathname, stack: input.stack },
|
|
};
|
|
}
|
|
|
|
export function issueFromError(
|
|
error: unknown,
|
|
input: {
|
|
ruleId?: string;
|
|
category?: DevToolbarCategory;
|
|
title?: string;
|
|
pathname?: string;
|
|
source?: DevToolbarSourceLocation;
|
|
} = {},
|
|
): DevToolbarIssue {
|
|
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
return createServerIssue({
|
|
ruleId: input.ruleId ?? "server/unhandled-error",
|
|
category: input.category ?? "server",
|
|
severity: "error",
|
|
title: input.title ?? normalized.name ?? "Server error",
|
|
message: normalized.message,
|
|
pathname: input.pathname,
|
|
source: input.source,
|
|
stack: normalized.stack,
|
|
recommendation: "Inspect the stack trace and open the referenced source file.",
|
|
});
|
|
}
|