import { lazy, type ComponentType, type LazyExoticComponent, type ReactNode, } from "react"; import { Outlet } from "react-router-dom"; import { TECH_LOG_ROUTE_RUNTIME_CONTRACT, type TechLogRouteId, } from "../contracts/tech-log-route-contract.ts"; import { PublicShell } from "./public/public-shell.tsx"; import { StudioShell } from "./studio/studio-shell.tsx"; type RouteRuntime = Readonly<{ moduleId: string; Component: LazyExoticComponent; }>; function runtime( routeId: TechLogRouteId, load: () => Promise<{ default: ComponentType }>, ): RouteRuntime { return Object.freeze({ moduleId: TECH_LOG_ROUTE_RUNTIME_CONTRACT[routeId].moduleId, Component: lazy(load), }); } function routeModule( load: () => Promise, key: Key, ): () => Promise<{ default: Extract }> { return async () => { const module = await load(); return { default: module[key] as Extract }; }; } export const TECH_LOG_ROUTE_RUNTIME = Object.freeze({ TECH_LOG_HOME: runtime( "TECH_LOG_HOME", routeModule(() => import("./public/pages/home-page.tsx"), "HomePage"), ), TECH_LOG_EXPLORE: runtime( "TECH_LOG_EXPLORE", routeModule( () => import("./public/pages/explore-page.tsx"), "ExplorePage", ), ), TECH_LOG_EXPLORE_KIND: runtime( "TECH_LOG_EXPLORE_KIND", routeModule( () => import("./public/pages/explore-kind-page.tsx"), "ExploreKindPage", ), ), TECH_LOG_CASE: runtime( "TECH_LOG_CASE", routeModule(() => import("./public/pages/case-page.tsx"), "CasePage"), ), TECH_LOG_REFERENCE: runtime( "TECH_LOG_REFERENCE", routeModule( () => import("./public/pages/reference-page.tsx"), "ReferencePage", ), ), TECH_LOG_QUESTION: runtime( "TECH_LOG_QUESTION", routeModule( () => import("./public/pages/question-page.tsx"), "QuestionPage", ), ), TECH_LOG_TOPIC: runtime( "TECH_LOG_TOPIC", routeModule(() => import("./public/pages/topic-page.tsx"), "TopicPage"), ), TECH_LOG_PROJECTS: runtime( "TECH_LOG_PROJECTS", routeModule( () => import("./public/pages/projects-page.tsx"), "ProjectsPage", ), ), TECH_LOG_PROJECT: runtime( "TECH_LOG_PROJECT", routeModule( () => import("./public/pages/project-overview-page.tsx"), "ProjectOverviewPage", ), ), TECH_LOG_PROJECT_RECORDS: runtime( "TECH_LOG_PROJECT_RECORDS", routeModule( () => import("./public/pages/project-records-page.tsx"), "ProjectRecordsPage", ), ), TECH_LOG_PROJECT_DECISIONS: runtime( "TECH_LOG_PROJECT_DECISIONS", routeModule( () => import("./public/pages/project-decisions-page.tsx"), "ProjectDecisionsPage", ), ), TECH_LOG_PROJECT_ACTIVITY: runtime( "TECH_LOG_PROJECT_ACTIVITY", routeModule( () => import("./public/pages/project-activity-page.tsx"), "ProjectActivityPage", ), ), TECH_LOG_RELEASES: runtime( "TECH_LOG_RELEASES", routeModule( () => import("./public/pages/releases-page.tsx"), "ReleasesPage", ), ), TECH_LOG_RELEASE: runtime( "TECH_LOG_RELEASE", routeModule( () => import("./public/pages/release-page.tsx"), "ReleasePage", ), ), TECH_LOG_PROFILE: runtime( "TECH_LOG_PROFILE", routeModule( () => import("./public/pages/profile-page.tsx"), "ProfilePage", ), ), TECH_LOG_SEARCH: runtime( "TECH_LOG_SEARCH", routeModule(() => import("./public/pages/search-page.tsx"), "SearchPage"), ), TECH_LOG_STUDIO_HOME: runtime( "TECH_LOG_STUDIO_HOME", routeModule( () => import("./studio/pages/studio-home-page.tsx"), "StudioHomePage", ), ), TECH_LOG_STUDIO_DOCUMENTS: runtime( "TECH_LOG_STUDIO_DOCUMENTS", routeModule( () => import("./studio/pages/documents-page.tsx"), "DocumentsPage", ), ), TECH_LOG_STUDIO_DOCUMENT_NEW: runtime( "TECH_LOG_STUDIO_DOCUMENT_NEW", routeModule( () => import("./studio/pages/new-document-page.tsx"), "NewDocumentPage", ), ), TECH_LOG_STUDIO_DOCUMENT_EDIT: runtime( "TECH_LOG_STUDIO_DOCUMENT_EDIT", routeModule( () => import("./studio/pages/document-edit-page.tsx"), "DocumentEditPage", ), ), TECH_LOG_STUDIO_DOCUMENT_VALIDATION: runtime( "TECH_LOG_STUDIO_DOCUMENT_VALIDATION", routeModule( () => import("./studio/pages/document-validation-page.tsx"), "DocumentValidationPage", ), ), TECH_LOG_STUDIO_DOCUMENT_PREVIEW: runtime( "TECH_LOG_STUDIO_DOCUMENT_PREVIEW", routeModule( () => import("./studio/pages/document-preview-page.tsx"), "DocumentPreviewPage", ), ), TECH_LOG_STUDIO_DOCUMENT_PUBLISH: runtime( "TECH_LOG_STUDIO_DOCUMENT_PUBLISH", routeModule( () => import("./studio/pages/document-publish-page.tsx"), "DocumentPublishPage", ), ), TECH_LOG_STUDIO_PUBLICATIONS: runtime( "TECH_LOG_STUDIO_PUBLICATIONS", routeModule( () => import("./studio/pages/publications-page.tsx"), "PublicationsPage", ), ), TECH_LOG_STUDIO_PUBLICATION_PREVIEW: runtime( "TECH_LOG_STUDIO_PUBLICATION_PREVIEW", routeModule( () => import("./studio/pages/publication-preview-page.tsx"), "PublicationPreviewPage", ), ), TECH_LOG_STUDIO_NOT_FOUND: runtime( "TECH_LOG_STUDIO_NOT_FOUND", routeModule( () => import("./studio/pages/studio-not-found-page.tsx"), "StudioNotFoundPage", ), ), NOT_FOUND: runtime( "NOT_FOUND", routeModule( () => import("./public/pages/public-not-found-page.tsx"), "PublicNotFoundPage", ), ), }) satisfies Readonly>; export const TECH_LOG_ROUTE_LAYOUTS: Readonly< Record<"PUBLIC" | "STUDIO", ReactNode> > = Object.freeze({ PUBLIC: ( ), STUDIO: ( ), });