From 2faf2e34331703b3bdea3eb487cb8799c8d65377 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Tue, 19 Sep 2023 18:13:57 +0200 Subject: refactor(build): replace paths aliases with relative paths Using paths aliases starting with "@" can be confusing and can lead to conflict with existings modules. I prefer to use relative paths to avoid extra configuration in tools because of these aliases. --- src/types/app.ts | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/types/app.ts (limited to 'src/types/app.ts') diff --git a/src/types/app.ts b/src/types/app.ts new file mode 100644 index 0000000..64bb3af --- /dev/null +++ b/src/types/app.ts @@ -0,0 +1,132 @@ +import { NextPage } from 'next'; +import { AppProps as NextAppProps } from 'next/app'; +import { ReactElement, ReactNode } from 'react'; +import { MessageFormatElement } from 'react-intl'; + +export type NextPageWithLayoutOptions = { + withExtraPadding?: boolean; + isHome?: boolean; + useGrid?: boolean; +}; + +export type NextPageWithLayout = NextPage & { + getLayout?: ( + page: ReactElement, + options: NextPageWithLayoutOptions + ) => ReactNode; +}; + +// modified version - allows for custom pageProps type, falling back to 'any' +type AppProps

= { + pageProps: P; +} & Omit, 'pageProps'>; + +type CustomPageProps = { + translation: Record | Record; +}; + +export type AppPropsWithLayout = AppProps & { + Component: NextPageWithLayout; +}; + +export type ContentKind = + | 'article' + | 'comment' + | 'page' + | 'project' + | 'thematic' + | 'topic'; + +export type Author = { + avatar?: Image; + description?: T extends 'comment' ? never : string; + name: string; + website?: string; +}; + +export type CommentMeta = { + author: Author<'comment'>; + date: string; +}; + +export type SingleComment = { + approved: boolean; + content: string; + id: number; + meta: CommentMeta; + parentId?: number; + replies: SingleComment[]; +}; + +export type Dates = { + publication: string; + update?: string; +}; + +export type Image = { + alt: string; + height: number; + src: string; + title?: string; + width: number; +}; + +export type Repos = { + github?: string; + gitlab?: string; +}; + +export type SEO = { + description: string; + title: string; +}; + +export type PageKind = Exclude; + +export type Meta = { + articles?: T extends 'thematic' | 'topic' ? Article[] : never; + author?: T extends 'article' | 'page' ? Author : never; + commentsCount?: T extends 'article' ? number : never; + cover?: Image; + dates: Dates; + license?: T extends 'project' ? string : never; + repos?: T extends 'project' ? Repos : never; + seo: SEO; + tagline?: T extends 'project' ? string : never; + technologies?: T extends 'project' ? string[] : never; + thematics?: T extends 'article' | 'topic' ? PageLink[] : never; + topics?: T extends 'article' | 'thematic' ? PageLink[] : never; + website?: T extends 'topic' ? string : never; + wordsCount: number; +}; + +export type Page = { + content: string; + id: number | string; + intro: string; + meta: Meta; + slug: string; + title: string; +}; + +export type PageLink = { + id: number; + logo?: Image; + name: string; + url: string; +}; + +export type Article = Page<'article'>; +export type ArticleCard = Pick & + Pick, 'cover' | 'dates'>; +export type Project = Page<'project'>; +export type ProjectPreview = Omit, 'content'>; +export type ProjectCard = Pick, 'id' | 'slug' | 'title'> & { + meta: Pick, 'cover' | 'dates' | 'tagline' | 'technologies'>; +}; +export type Thematic = Page<'thematic'>; +export type Topic = Page<'topic'>; + +export type Slug = { + slug: string; +}; -- cgit v1.2.3