fabro/apps/fabro-web/app/router.tsx
2026-09-03 12:04:35 -04:00

182 lines
7.1 KiB
TypeScript

import { createElement } from "react";
import { type RouteObject, useParams } from "react-router";
import Root, { ErrorBoundary as RootErrorBoundary } from "./root";
import * as RedirectHome from "./routes/redirect-home";
import * as Setup from "./routes/setup";
import * as AuthLogin from "./routes/auth-login";
import * as Start from "./routes/start";
import * as ChatsLayout from "./routes/chats-layout";
import * as ChatsNew from "./routes/chats-new";
import * as ChatsDetail from "./routes/chats-detail";
import * as AskFabro from "./routes/ask-fabro";
import * as Automations from "./routes/automations";
import * as AutomationsNew from "./routes/automations-new";
import * as AutomationsEdit from "./routes/automations-edit";
import * as AutomationDetail from "./routes/automation-detail";
import * as Runs from "./routes/runs";
import * as RunDetail from "./routes/run-detail";
import * as RunOverview from "./routes/run-overview";
import * as RunStages from "./routes/run-stages";
import * as RunSettings from "./routes/run-settings";
import * as RunSource from "./routes/run-source";
import * as RunLogs from "./routes/run-logs";
import * as RunEvents from "./routes/run-events";
import * as RunArtifacts from "./routes/run-artifacts";
import * as RunChildren from "./routes/run-children";
import * as RunFiles from "./routes/run-files";
import * as RunSandbox from "./routes/run-sandbox";
import * as RunTerminal from "./routes/run-terminal";
import * as RunBilling from "./routes/run-billing";
import * as Insights from "./routes/insights";
import * as InsightsEditor from "./routes/insights-editor";
import * as InsightsNew from "./routes/insights-new";
import * as Settings from "./routes/settings";
import * as SettingsIndex from "./routes/settings-index";
import * as SettingsGeneral from "./routes/settings-general";
import * as SettingsIntegrations from "./routes/settings-integrations";
import * as SettingsModels from "./routes/settings-models";
import * as SettingsSandboxes from "./routes/settings-sandboxes";
import * as SettingsEnvironments from "./routes/settings-environments";
import * as SettingsEnvironmentsNew from "./routes/settings-environments-new";
import * as SettingsEnvironmentsEdit from "./routes/settings-environments-edit";
import * as SettingsMcps from "./routes/settings-mcps";
import * as SettingsMcpsNew from "./routes/settings-mcps-new";
import * as SettingsMcpsEdit from "./routes/settings-mcps-edit";
import * as SettingsSecrets from "./routes/settings-secrets";
import * as SettingsSecretsNew from "./routes/settings-secrets-new";
import * as SettingsVariables from "./routes/settings-variables";
import * as SettingsVariablesNew from "./routes/settings-variables-new";
import * as SettingsVariablesEdit from "./routes/settings-variables-edit";
import * as SettingsMonitoring from "./routes/settings-monitoring";
import * as SettingsSecurity from "./routes/settings-security";
import * as SettingsStorage from "./routes/settings-storage";
import * as SettingsLiveEvents from "./routes/settings-live-events";
import * as Profile from "./routes/profile";
import * as ProfileOverview from "./routes/profile-overview";
import * as ProfileSessions from "./routes/profile-sessions";
import AppShellModule from "./layouts/app-shell";
type RouteModule = {
default: React.ComponentType<any>;
handle?: RouteObject["handle"];
ErrorBoundary?: React.ComponentType<any>;
};
function withRouteModule(module: RouteModule) {
return function WrappedRouteComponent() {
const params = useParams();
return createElement(module.default, { params });
};
}
function route(
path: string,
module: RouteModule,
extra: Omit<RouteObject, "path" | "Component" | "index"> = {},
): RouteObject {
return {
path,
handle: module.handle,
Component: withRouteModule(module),
ErrorBoundary: module.ErrorBoundary,
...extra,
};
}
function indexRoute(module: RouteModule): RouteObject {
return {
index: true,
handle: module.handle,
Component: withRouteModule(module),
ErrorBoundary: module.ErrorBoundary,
};
}
export const routes: RouteObject[] = [
{
path: "/",
Component: Root,
ErrorBoundary: RootErrorBoundary,
children: [
indexRoute(RedirectHome),
route("setup", Setup),
route("login", AuthLogin),
route("runs/:id/terminal", RunTerminal),
{
Component: withRouteModule({
default: AppShellModule,
}),
children: [
route("start", Start),
route("chats", ChatsLayout, {
children: [
route("new", ChatsNew),
route(":chatId", ChatsDetail),
],
}),
route("ask-fabro", AskFabro),
route("automations", Automations),
route("automations/new", AutomationsNew),
route("automations/:id/edit", AutomationsEdit),
route("automations/:id", AutomationDetail),
// Backwards-compatible singular automation route used by older links.
route("automation/:id", AutomationDetail),
route("runs", Runs),
route("runs/:id", RunDetail, {
children: [
indexRoute(RunOverview),
route("stages", RunStages),
route("stages/:stageId", RunStages),
route("settings", RunSettings),
route("source", RunSource),
route("logs", RunLogs),
route("events", RunEvents),
route("artifacts", RunArtifacts),
route("files", RunFiles),
route("children", RunChildren),
route("sandbox", RunSandbox),
route("billing", RunBilling),
],
}),
route("insights", Insights, {
children: [
indexRoute(InsightsEditor),
route("new", InsightsNew),
],
}),
route("settings", Settings, {
children: [
indexRoute(SettingsIndex),
route("models", SettingsModels),
route("integrations", SettingsIntegrations),
route("sandboxes", SettingsSandboxes),
route("security", SettingsSecurity),
route("environments", SettingsEnvironments),
route("environments/new", SettingsEnvironmentsNew),
route("environments/:id/edit", SettingsEnvironmentsEdit),
route("mcps", SettingsMcps),
route("mcps/new", SettingsMcpsNew),
route("mcps/:id/edit", SettingsMcpsEdit),
route("variables", SettingsVariables),
route("variables/new", SettingsVariablesNew),
route("variables/:name/edit", SettingsVariablesEdit),
route("secrets", SettingsSecrets),
route("secrets/new", SettingsSecretsNew),
route("server", SettingsGeneral),
route("storage", SettingsStorage),
route("monitoring", SettingsMonitoring),
route("live-events", SettingsLiveEvents),
],
}),
route("profile", Profile, {
children: [
indexRoute(ProfileOverview),
route("sessions", ProfileSessions),
],
}),
],
},
],
},
];