Files
WRNexusJS/packages/dev-toolbar/src/server/issues.ts
T
2026-07-21 12:30:46 +05:30

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.",
});
}