159 lines · 6.1 KB
import { createFileRoute, Link, useNavigate } from "@tanstack/react-router";
import { z } from "zod";
import { getDependencies } from "~/fns/security";
import { buttonClass } from "~/ui/Button";
import { inputClass } from "~/ui/Field";
import { Badge } from "~/ui/Badge";
import { EmptyState } from "~/ui/EmptyState";
import { Panel } from "~/ui/Panel";
import { RelativeTime } from "~/ui/RelativeTime";
import { cn } from "~/utils/cn";

const ECOSYSTEMS = ["npm", "pip", "go", "cargo", "rubygems", "composer"] as const;

export const Route = createFileRoute("/$owner/$repo/security/dependencies")({
  validateSearch: z.object({
    q: z.string().max(100).optional(),
    ecosystem: z.enum(ECOSYSTEMS).optional(),
    page: z.number().int().min(1).optional(),
  }),
  loaderDeps: ({ search }) => ({ query: search.q ?? "", ecosystem: search.ecosystem ?? null, page: search.page ?? 1 }),
  loader: ({ params, deps }) => getDependencies({ data: { owner: params.owner, repo: params.repo, ...deps } }),
  component: DependenciesPage,
});

function DependenciesPage() {
  const data = Route.useLoaderData();
  const params = Route.useParams();
  const search = Route.useSearch();
  const navigate = useNavigate({ from: Route.fullPath });
  const page = search.page ?? 1;

  if (!data.enabled) {
    return (
      <Panel>
        <EmptyState title="Dependency graph is disabled" icon="box">
          An admin can enable it from the security overview.
        </EmptyState>
      </Panel>
    );
  }