Improvements: remove dead config, fix ESM, add URL validation, unify types, add missing logging
Deploy / release (push) Skipped
Deploy / deploy (push) Successful in 1m52s

- Remove .prettierrc (dead config, Biome replaces Prettier)
- Rename lighthouserc.json to lighthouserc.cjs with module.exports for ESM compat
- Add logger.warn to empty catch blocks in auth, register, site-settings, prisma-cache, redis, security, rate-limit
- Unify ActionResult type: action-helper.ts uses 'ok' consistent with safe-action-shared.ts
- Add noUnusedLocals + noUnusedParameters to tsconfig + fix 25 pre-existing unused vars
- Replace barrel export src/types/index.ts with direct @/types/common imports
- Make trustHost conditional (development only) in auth.ts
- Add pre-flight URL validation to update-Nitrov3.sh to catch image.library.url misconfigurations
- Improve NITRO_IMAGE_LIBRARY_URL content validation in pre-flight & post-compute checks
This commit is contained in:
openhands committed 2026-07-26 20:28:11 +02:00
1 parent b922f6d49f
commit 17847545dd
292 files changed
+69195 -67915

No files matched your search

+1 -3
View File
@@ -1,5 +1,4 @@
import { getTranslations } from "next-intl/server";
import { formatDate } from "@/lib/format-date";
import {
createApiKey,
deleteApiKey,
@@ -7,6 +6,7 @@ import {
} from "@/actions/admin-radio-api-keys";
import { StatusCard } from "@/components/admin/dashboard";
import { Button } from "@/components/ui/button";
import { formatDate } from "@/lib/format-date";
import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
@@ -25,7 +25,6 @@ type ApiKey = {
createdAt: Date | null;
};
function maskKey(key: string): string {
return key.length > 8 ? `${key.slice(0, 8)}\u2026` : key;
}
@@ -69,7 +68,6 @@ export default async function AdminRadioApiKeysPage() {
return (
<main>
<section className="mt-6">
{dbError ? (
<div className="admin-card" style={{ marginTop: "1rem" }}>
<p className="text-xs theme-text-muted dark:theme-text-muted m-0">
+1 -4
View File
@@ -1,5 +1,4 @@
import Image from "next/image";
import { formatDate } from "@/lib/format-date";
import { getTranslations } from "next-intl/server";
import {
createTrack,
@@ -8,6 +7,7 @@ import {
} from "@/actions/admin-radio-autodj";
import { StatusCard } from "@/components/admin/dashboard";
import { Button } from "@/components/ui/button";
import { formatDate } from "@/lib/format-date";
import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
@@ -34,7 +34,6 @@ function formatDuration(seconds: number | null): string {
return `${m}:${String(s).padStart(2, "0")}`;
}
export default async function AdminRadioAutoDjPage() {
const t = await getTranslations("pages.admin.radio");
@@ -72,9 +71,7 @@ export default async function AdminRadioAutoDjPage() {
return (
<main>
<section className="mt-6">
{dbError ? (
<div className="admin-card mb-6">
<p className="text-xs theme-text-muted dark:theme-text-muted m-0">
+1 -2
View File
@@ -1,5 +1,4 @@
import NextImage from "next/image";
import { formatDate } from "@/lib/format-date";
import { getTranslations } from "next-intl/server";
import {
createRadioBanner,
@@ -8,6 +7,7 @@ import {
} from "@/actions/admin-radio-extra";
import { StatusCard } from "@/components/admin/dashboard";
import { Button } from "@/components/ui/button";
import { formatDate } from "@/lib/format-date";
import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
@@ -23,7 +23,6 @@ type Banner = {
createdAt: Date | null;
};
export default async function AdminRadioBannersPage() {
const t = await getTranslations("pages.admin.radio");
+1 -2
View File
@@ -1,6 +1,6 @@
import { getTranslations } from "next-intl/server";
import { formatDate } from "@/lib/format-date";
import { StatusCard } from "@/components/admin/dashboard";
import { formatDate } from "@/lib/format-date";
import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
@@ -15,7 +15,6 @@ type History = {
notes: string | null;
};
function formatDuration(start: Date, end: Date | null): string {
if (!end) return "\u2014";
const ms = end.getTime() - start.getTime();
+2 -8
View File
@@ -1,8 +1,8 @@
import { getTranslations } from "next-intl/server";
import { formatDate } from "@/lib/format-date";
import { deleteShout } from "@/actions/admin-radio-moderation";
import { StatusCard } from "@/components/admin/dashboard";
import { Button } from "@/components/ui/button";
import { formatDate } from "@/lib/format-date";
import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
@@ -15,7 +15,6 @@ type Shout = {
updatedAt: Date | null;
};
export default async function AdminRadioModerationPage() {
const t = await getTranslations("pages.admin.radio");
@@ -38,13 +37,8 @@ export default async function AdminRadioModerationPage() {
return (
<main>
<div className="grid grid-cols-[repeat(auto-fit,minmax(180px,1fr))] gap-3.5 mb-6">
<StatusCard
label={t("shouts")}
value={shouts.length}
icon="📣"
/>
<StatusCard label={t("shouts")} value={shouts.length} icon="📣" />
</div>
<section className="mt-6">
-1
View File
@@ -211,7 +211,6 @@ export default async function AdminRadioMonitoringPage() {
return (
<main>
<section className="mt-6">
<div className="grid grid-cols-[repeat(auto-fit,minmax(180px,1fr))] gap-3.5 mb-6">
<StatusCard
+1 -1
View File
@@ -1,8 +1,8 @@
import { getTranslations } from "next-intl/server";
import { formatDate } from "@/lib/format-date";
import { deleteShout } from "@/actions/admin-radio-moderation";
import { StatusCard } from "@/components/admin/dashboard";
import { Button } from "@/components/ui/button";
import { formatDate } from "@/lib/format-date";
import { prisma } from "@/lib/prisma";
export const dynamic = "force-dynamic";
-1
View File
@@ -62,7 +62,6 @@ export default async function AdminRadioPointsPage({
return (
<main>
<section className="mt-6">
{saved === "1" ? (
<p>
+1 -5
View File
@@ -52,11 +52,7 @@ export default async function AdminRadioRanksPage() {
</div>
) : (
<div className="grid grid-cols-[repeat(auto-fit,minmax(180px,1fr))] gap-3.5 mb-6">
<StatusCard
label={t("ranks")}
value={ranks.length}
icon="🎖️"
/>
<StatusCard label={t("ranks")} value={ranks.length} icon="🎖️" />
<StatusCard
label={t("ranksForm.active")}
value={activeCount}