chore: remove dead code flagged by knip
Local Build and Deploy / deploy (push) Successful in 1m7s

Remove 19 unused source files (no importers anywhere in src/):
- src/actions/admin-permissions.ts, admin-radio.ts, admin-user-edit.ts,
  admin-users.ts (functionality lives in @/actions/users and
  @/actions/permissions)
- src/components/admin/confirm-action.tsx, page-header.tsx
- src/components/motion-elements.tsx
- src/lib/format-date.ts
- src/lib/catalog-categories/* (incl. re-export barrel)
- src/lib/foundation/{index,database,middleware,validation}.ts (errors/action
  kept, still imported directly)
- src/lib/services/imager/{avatar-renderer,memory-cache}.ts
- src/lib/services/nitro-assets.ts

Update admin-operations-contract test to drop the two removed action-file
gates (their permission coverage already exists in users.ts/permissions.ts).

Add knip.json for repeatable dead-code audits.

Verified: tsc --noEmit clean, next build succeeds, full test suite green
(301/301).
This commit is contained in:
openhands committed 2026-07-18 19:08:17 +02:00
1 parent 60eb45be73
commit 3c9c1311ec
23 files changed
+586 -2158

No files matched your search

-40
View File
@@ -1,40 +0,0 @@
"use client";
import type { ReactNode } from "react";
export function ConfirmAction({
message,
action,
userId,
className,
style,
children,
}: {
message: string;
action: string;
userId: number;
className?: string;
style?: React.CSSProperties;
children: ReactNode;
}) {
return (
<form
action="/api/admin/users/actions"
method="post"
style={{ display: "inline-block" }}
>
<input type="hidden" name="userId" value={userId} />
<input type="hidden" name="action" value={action} />
<button
type="submit"
className={className}
style={style}
onClick={(e) => {
if (!confirm(message)) e.preventDefault();
}}
>
{children}
</button>
</form>
);
}
-29
View File
@@ -1,29 +0,0 @@
import type { LucideIcon } from "lucide-react";
interface AdminPageHeaderProps {
icon: LucideIcon;
title: string;
subtitle: string;
}
export function AdminPageHeader({
icon: Icon,
title,
subtitle,
}: AdminPageHeaderProps) {
return (
<div className="flex items-center gap-3 mb-6">
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-[var(--admin-accent)]/20 to-[var(--admin-accent)]/5 grid place-items-center">
<Icon size={20} className="text-[var(--admin-accent)]" />
</div>
<div>
<h1 className="m-0 text-xl font-extrabold text-[var(--admin-text)]">
{title}
</h1>
<p className="m-0 text-xs text-[var(--admin-text-muted)] mt-0.5">
{subtitle}
</p>
</div>
</div>
);
}