- env.ts: added 10 missing Zod-validated env vars (imager, paypal currency, argon2/bcrypt params) - Migrated 6 modules from process.env to validated env.* (auth, proxy-auth, paypal, password, redis, imager, moderation, alert, logger) - Replaced console.warn/error with pino logger in 9 server-side modules - Removed 50+ dead exports (SWF wrappers, coalesceHotelName, signIn, isStaff re-export, formatTimestamp, Skeleton/SkeletonCard, 4 unused housekeeping sections) - Consolidated date formatting: 28 files migrated to shared formatDate() from @/lib/format-date - Wired 4 radio/settings API routes through cached siteSettings service instead of raw Prisma queries - Added getMany()/getAll() helpers to SiteSettings service - Removed 88 dead Prisma model definitions (schema 2763→1846 lines) - Created admin action-helper.ts with wrapAction() for standardized error handling - Fixed useEffect dependency arrays in 4 data-heavy components - Replaced raw btn CSS classes with shadcn Button component across admin pages - Stripped dead i18n namespaces (common, pages.client) from all 22 translation files - Removed 2 dead scripts (create-release.sh, check-local-imports.ts) - Fixed knip.json configuration - Added 7 new test suites: format-date, paypal, moderation, alert, webhook, action-helper, and fixed password.test.ts for env mocking - All 358 tests passing across 72 test files - TypeScript: 0 errors
54 lines
1.1 KiB
TypeScript
54 lines
1.1 KiB
TypeScript
import { logger } from "@/lib/logger";
|
|
|
|
type LogScalar = string | number | boolean | null;
|
|
type LogContext = Record<string, unknown>;
|
|
|
|
const SENSITIVE_KEY =
|
|
/(authorization|cookie|password|secret|token|api[-_]?key)/i;
|
|
|
|
export interface ServerErrorRecord {
|
|
level: "error";
|
|
event: string;
|
|
message: string;
|
|
context: Record<string, LogScalar>;
|
|
}
|
|
|
|
export function serverErrorRecord(
|
|
event: string,
|
|
error: unknown,
|
|
context: LogContext = {},
|
|
): ServerErrorRecord {
|
|
return {
|
|
level: "error",
|
|
event,
|
|
message:
|
|
error instanceof Error
|
|
? error.message.slice(0, 500)
|
|
: "Unknown server error",
|
|
context: Object.fromEntries(
|
|
Object.entries(context).map(([key, value]) => [
|
|
key,
|
|
SENSITIVE_KEY.test(key) ? "[REDACTED]" : logScalar(value),
|
|
]),
|
|
),
|
|
};
|
|
}
|
|
|
|
export function logServerError(
|
|
event: string,
|
|
error: unknown,
|
|
context: LogContext = {},
|
|
): void {
|
|
logger.error(JSON.stringify(serverErrorRecord(event, error, context)));
|
|
}
|
|
|
|
function logScalar(value: unknown): LogScalar {
|
|
return typeof value === "string" ||
|
|
typeof value === "number" ||
|
|
typeof value === "boolean"
|
|
? value
|
|
: value === null
|
|
? null
|
|
: "[NON_SCALAR]";
|
|
}
|