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>
);
}
-100
View File
@@ -1,100 +0,0 @@
"use client";
import type { HTMLMotionProps } from "framer-motion";
import { motion } from "framer-motion";
import {
fadeIn,
fadeInUp,
hoverLift,
hoverScale,
scaleIn,
staggerContainer,
staggerItem,
} from "@/lib/motion";
type DivProps = HTMLMotionProps<"div">;
export function AnimatedSection({ children, className, ...props }: DivProps) {
return (
<motion.div
className={className}
variants={staggerContainer}
initial="hidden"
animate="visible"
{...props}
>
{children}
</motion.div>
);
}
export function AnimatedChild({ children, className, ...props }: DivProps) {
return (
<motion.div className={className} variants={staggerItem} {...props}>
{children}
</motion.div>
);
}
export function FadeIn({ children, className, ...props }: DivProps) {
return (
<motion.div
className={className}
variants={fadeIn}
initial="hidden"
animate="visible"
{...props}
>
{children}
</motion.div>
);
}
export function FadeInUp({ children, className, ...props }: DivProps) {
return (
<motion.div
className={className}
variants={fadeInUp}
initial="hidden"
animate="visible"
{...props}
>
{children}
</motion.div>
);
}
export function ScaleIn({ children, className, ...props }: DivProps) {
return (
<motion.div
className={className}
variants={scaleIn}
initial="hidden"
animate="visible"
{...props}
>
{children}
</motion.div>
);
}
export function HoverCard({ children, className, ...props }: DivProps) {
return (
<motion.div
className={className}
{...hoverLift}
whileHover={{ y: -4, transition: { duration: 0.2 } }}
{...props}
>
{children}
</motion.div>
);
}
export function HoverButton({ children, className, ...props }: DivProps) {
return (
<motion.div className={className} {...hoverScale} {...props}>
{children}
</motion.div>
);
}