export type InputCategory = { id: string title: string description: string groups: InputGroup[] hero: string | null } export type InputSection = { id: string title: string description: string categories: InputCategory[] hero: string | null sidebar_behavior: 'show-links' | 'show-title' | 'hidden' | 'reference' } export type InputGroup = { id: string } /* --------------------- Authors -------------------- */ export type Authors = Author[] export interface Author { id: string name: string image: string email: string twitter: string } /* ---------------------- Pages --------------------- */ export interface ContentPage { /** The page's id */ id: string /** The id of the page's parent */ // parentId: string | null /** The page's title */ title: string /** The page's description */ description: string | null /** The page's content */ content: string | null /** The page's path */ path: string | null /** The page's type */ type: 'article' | 'category' | 'section' | 'group' } export interface Section extends ContentPage { type: 'section' /** The index of this section.*/ index: number /** An array of this section's categories. */ categories: Category[] /** How the section should appear in the sidebar. */ sidebar_behavior: 'show-links' | 'show-title' | 'hidden' | 'reference' /** The section's hero image (optional). */ hero: string | null } export interface Category extends ContentPage { type: 'category' /** The id of this category's section. */ sectionId: string /** The index of this category inside of its section. */ index: number /** The category's groups */ groups: Group[] /** The category's hero image (optional). */ hero: string | null } export interface Group extends ContentPage { type: 'group' /** The id of this group's section. */ sectionId: string /** The id of this group's category. */ categoryId: string /** The index of this group inside of its category. */ index: number } export interface Article extends ContentPage { type: 'article' /** The id of the group to which this article belongs. */ groupId: string | null /** The index of this article inside of the article's group. */ groupIndex: number /** The id of the category to which this article belongs. */ categoryId: string /** The index of this article inside of the article's category. */ categoryIndex: number /** The id of the section to which this article belongs. */ sectionId: string /** The index of this article inside of the article's section. */ sectionIndex: number /** The article's author details (optional). */ author: Author['id'] | null /** The article's hero image (optional). */ hero: string | null /** The article's status (draft, published, hidden, etc) */ status: ArticleStatus /** The date on which the article was published (optional). */ date: string | null /** An array of keywords associated with this article. */ keywords: string[] /** The URL where the article's source can be found. */ sourceUrl: string | null /** The article's code example (optional). */ componentCode: string | null /** The article's code example files, JSON stringified (optional). */ componentCodeFiles: string | null } export enum ArticleStatus { Draft = 'draft', Published = 'published', Unlisted = 'unlisted', } export enum APIGroup { Class = 'Class', Function = 'Function', Variable = 'Variable', Enum = 'Enum', Interface = 'Interface', TypeAlias = 'TypeAlias', Namespace = 'Namespace', } /* ---------------- Article Headings ---------------- */ export interface ArticleHeading { level: number title: string slug: string isCode: boolean } export type ArticleHeadings = ArticleHeading[] /* ------------------ Article Links ----------------- */ export type ArticleLink = Pick< Article, 'id' | 'title' | 'description' | 'categoryId' | 'sectionId' | 'path' > export type ArticleLinks = { prev: ArticleLink | null next: ArticleLink | null } /* --------------------- Sidebar -------------------- */ export interface BaseSidebarLink { title: string url: string type: 'section' | 'category' | 'article' } export interface SidebarContentSectionLink extends BaseSidebarLink { type: 'section' children: SidebarContentLink[] } export interface SidebarContentCategoryLink extends BaseSidebarLink { type: 'category' children: SidebarContentLink[] } export interface SidebarContentArticleLink extends BaseSidebarLink { type: 'article' articleId: string | null groupId: string | null } export type SidebarContentLink = | SidebarContentSectionLink | SidebarContentCategoryLink | SidebarContentArticleLink export type SidebarContentList = { sectionId: string | null categoryId: string | null articleId: string | null links: SidebarContentLink[] activeId?: string | null } /* ---------- Finished / generated content ---------- */ /** A table keyed by slug of articles. */ export type Articles = Record export type GeneratedContent = { sections: Section[]; articles: Articles }