[fix] reorganize the typing files
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "@/components/ui/sheet";
|
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "@/components/ui/sheet";
|
||||||
import { useActiveHeading } from "@/hooks/useActiveHeading";
|
import { useActiveHeading } from "@/hooks/useActiveHeading";
|
||||||
import useDrawerTOCState from "@/stores/useDrawerTOCState";
|
import useDrawerTOCState from "@/stores/useDrawerTOCState";
|
||||||
import type { TTOCItem } from "@/types/toc.type";
|
import type { TTOCItem } from "@/types/docs.type";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { MdMenuBook } from "react-icons/md";
|
import { MdMenuBook } from "react-icons/md";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useActiveHeading } from "@/hooks/useActiveHeading";
|
import { useActiveHeading } from "@/hooks/useActiveHeading";
|
||||||
import type { TTOCItem } from "@/types/toc.type";
|
import type { TTOCItem } from "@/types/docs.type";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { normalizeDate } from "@/lib/date";
|
import { normalizeDate } from "@/lib/date";
|
||||||
import type { TPostListItem } from "@/types/post-list";
|
import type { TPostListItem } from "@/types/docs.type";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { Badge } from "../ui/badge";
|
import { Badge } from "../ui/badge";
|
||||||
|
|||||||
@@ -1,25 +1,25 @@
|
|||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { PostFilesDirectory } from "@/consts/consts";
|
import { PostFilesDirectory } from "@/consts/consts";
|
||||||
import type { TFrontmatter } from "@/types/frontmatter.type";
|
import type { TPostFrontmatter } from "@/types/frontmatter.type";
|
||||||
import type { TPostListItem, TPostsByTag } from "@/types/post-list";
|
import type { TPostListItem, TPostsByTag } from "@/types/docs.type";
|
||||||
import { serialize } from "next-mdx-remote/serialize";
|
import { serialize } from "next-mdx-remote/serialize";
|
||||||
import { titleCase } from "title-case";
|
import { titleCase } from "title-case";
|
||||||
import { isEmptyString, nullifyEmptyArray, nullifyEmptyString } from "./utils";
|
import { isEmptyString, nullifyEmptyArray, nullifyEmptyString } from "./utils";
|
||||||
|
|
||||||
async function extractFrontmatters(filepath: string): Promise<TFrontmatter> {
|
async function extractFrontmatters(filepath: string): Promise<TPostFrontmatter> {
|
||||||
const source = fs.readFileSync(filepath, "utf-8");
|
const source = fs.readFileSync(filepath, "utf-8");
|
||||||
const mdxSource = await serialize(source, {
|
const mdxSource = await serialize(source, {
|
||||||
parseFrontmatter: true,
|
parseFrontmatter: true,
|
||||||
mdxOptions: { format: "md" },
|
mdxOptions: { format: "md" },
|
||||||
});
|
});
|
||||||
const frontmatter = mdxSource.frontmatter as TFrontmatter;
|
const frontmatter = mdxSource.frontmatter as TPostFrontmatter;
|
||||||
|
|
||||||
const normalizedTags = frontmatter.tags
|
const normalizedTags = frontmatter.tags
|
||||||
?.filter((tagname) => !isEmptyString(tagname))
|
?.filter((tagname) => !isEmptyString(tagname))
|
||||||
.map((tagname) => tagname.toUpperCase());
|
.map((tagname) => tagname.toUpperCase());
|
||||||
|
|
||||||
const normalizedResult: TFrontmatter = {
|
const normalizedResult: TPostFrontmatter = {
|
||||||
title: titleCase(frontmatter.title),
|
title: titleCase(frontmatter.title),
|
||||||
subtitle: nullifyEmptyString(frontmatter.subtitle),
|
subtitle: nullifyEmptyString(frontmatter.subtitle),
|
||||||
coverURL: nullifyEmptyString(frontmatter.coverURL),
|
coverURL: nullifyEmptyString(frontmatter.coverURL),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { TTOCItem } from "@/types/toc.type";
|
import type { TTOCItem } from "@/types/docs.type";
|
||||||
import { JSDOM } from "jsdom";
|
import { JSDOM } from "jsdom";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import type { NonEmptyArray } from "@/types/utils.type";
|
|
||||||
import { type ClassValue, clsx } from "clsx";
|
import { type ClassValue, clsx } from "clsx";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
@@ -84,11 +83,11 @@ export function isEmptyArray(value: any[] | null | undefined): boolean {
|
|||||||
* @param value - The array value to be nullified if empty.
|
* @param value - The array value to be nullified if empty.
|
||||||
* @returns The nullified array if it is empty, otherwise returns the original array.
|
* @returns The nullified array if it is empty, otherwise returns the original array.
|
||||||
*/
|
*/
|
||||||
export function nullifyEmptyArray<T>(value: T[] | null | undefined): NonEmptyArray<T> | null {
|
export function nullifyEmptyArray<T>(value: T[] | null | undefined): T[] | null {
|
||||||
if (isEmptyArray(value)) {
|
if (isEmptyArray(value)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return value as NonEmptyArray<T>;
|
return value!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { SearchIndex } from "@/lib/search";
|
import { SearchIndex } from "@/lib/search";
|
||||||
import { isEmptyString } from "@/lib/utils";
|
import { isEmptyString } from "@/lib/utils";
|
||||||
import type { TSearchResultItem } from "@/types/search-result";
|
import type { TSearchResultItem } from "@/types/docs.type";
|
||||||
import type { NextApiRequest, NextApiResponse } from "next";
|
import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
|
|
||||||
type ResponseData = TSearchResultItem[];
|
type ResponseData = TSearchResultItem[];
|
||||||
|
|||||||
@@ -13,9 +13,8 @@ import { Config } from "@/data/config";
|
|||||||
import { normalizeDate } from "@/lib/date";
|
import { normalizeDate } from "@/lib/date";
|
||||||
import { getPostFileContent, sortedPosts } from "@/lib/post-process";
|
import { getPostFileContent, sortedPosts } from "@/lib/post-process";
|
||||||
import { makeTOCTree } from "@/lib/toc";
|
import { makeTOCTree } from "@/lib/toc";
|
||||||
import type { TFrontmatter } from "@/types/frontmatter.type";
|
import type { TPostFrontmatter } from "@/types/frontmatter.type";
|
||||||
import type { TPostListItem } from "@/types/post-list";
|
import type { TPostListItem, TTOCItem } from "@/types/docs.type";
|
||||||
import type { TTOCItem } from "@/types/toc.type";
|
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import type { GetStaticPaths, GetStaticProps } from "next";
|
import type { GetStaticPaths, GetStaticProps } from "next";
|
||||||
import { MDXRemote, type MDXRemoteSerializeResult } from "next-mdx-remote";
|
import { MDXRemote, type MDXRemoteSerializeResult } from "next-mdx-remote";
|
||||||
@@ -36,7 +35,7 @@ import { titleCase } from "title-case";
|
|||||||
type ReaderPageProps = {
|
type ReaderPageProps = {
|
||||||
compiledSource: MDXRemoteSerializeResult;
|
compiledSource: MDXRemoteSerializeResult;
|
||||||
tocList: TTOCItem[];
|
tocList: TTOCItem[];
|
||||||
frontMatter: TFrontmatter;
|
frontMatter: TPostFrontmatter;
|
||||||
postId: string;
|
postId: string;
|
||||||
nextPostListItem: TPostListItem | null;
|
nextPostListItem: TPostListItem | null;
|
||||||
prevPostListItem: TPostListItem | null;
|
prevPostListItem: TPostListItem | null;
|
||||||
@@ -205,7 +204,7 @@ export const getStaticProps: GetStaticProps<ReaderPageProps> = async (context) =
|
|||||||
|
|
||||||
const postIndexInAllPosts = sortedPosts.allPostList.findIndex((item) => item.id === postId);
|
const postIndexInAllPosts = sortedPosts.allPostList.findIndex((item) => item.id === postId);
|
||||||
|
|
||||||
const frontMatter: TFrontmatter = sortedPosts.allPostList[postIndexInAllPosts].frontMatter;
|
const frontMatter: TPostFrontmatter = sortedPosts.allPostList[postIndexInAllPosts].frontMatter;
|
||||||
|
|
||||||
const nextPostListItem =
|
const nextPostListItem =
|
||||||
postIndexInAllPosts !== sortedPosts.allPostList.length - 1
|
postIndexInAllPosts !== sortedPosts.allPostList.length - 1
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { LatestPostCountInHomePage } from "@/consts/consts";
|
|||||||
import { Config } from "@/data/config";
|
import { Config } from "@/data/config";
|
||||||
import { sortedPosts } from "@/lib/post-process";
|
import { sortedPosts } from "@/lib/post-process";
|
||||||
import { generateRSSFeed } from "@/lib/rss";
|
import { generateRSSFeed } from "@/lib/rss";
|
||||||
import type { TPostListItem } from "@/types/post-list";
|
import type { TPostListItem } from "@/types/docs.type";
|
||||||
import type { GetStaticProps } from "next";
|
import type { GetStaticProps } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { LuPenTool } from "react-icons/lu";
|
import { LuPenTool } from "react-icons/lu";
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { PostCountPerPagination } from "@/consts/consts";
|
|||||||
import { Config } from "@/data/config";
|
import { Config } from "@/data/config";
|
||||||
import { sortedPosts } from "@/lib/post-process";
|
import { sortedPosts } from "@/lib/post-process";
|
||||||
import { isEmptyArray, paginateArray } from "@/lib/utils";
|
import { isEmptyArray, paginateArray } from "@/lib/utils";
|
||||||
import type { TPostListItem } from "@/types/post-list";
|
import type { TPostListItem } from "@/types/docs.type";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import type { GetStaticPaths, GetStaticProps } from "next";
|
import type { GetStaticPaths, GetStaticProps } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { NavBar } from "@/components/utils/NavBar";
|
|||||||
import { SEO } from "@/components/utils/SEO";
|
import { SEO } from "@/components/utils/SEO";
|
||||||
import { Config } from "@/data/config";
|
import { Config } from "@/data/config";
|
||||||
import { isEmptyString } from "@/lib/utils";
|
import { isEmptyString } from "@/lib/utils";
|
||||||
import type { TSearchResultItem } from "@/types/search-result";
|
import type { TSearchResultItem } from "@/types/docs.type";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { isArray } from "lodash";
|
import { isArray } from "lodash";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { PostCountPerPagination } from "@/consts/consts";
|
|||||||
import { Config } from "@/data/config";
|
import { Config } from "@/data/config";
|
||||||
import { sortedPosts } from "@/lib/post-process";
|
import { sortedPosts } from "@/lib/post-process";
|
||||||
import { paginateArray } from "@/lib/utils";
|
import { paginateArray } from "@/lib/utils";
|
||||||
import type { TPostListItem } from "@/types/post-list";
|
import type { TPostListItem } from "@/types/docs.type";
|
||||||
import type { GetStaticPaths, GetStaticProps } from "next";
|
import type { GetStaticPaths, GetStaticProps } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { PostFilesDirectory } from "@/consts/consts";
|
import { PostFilesDirectory } from "@/consts/consts";
|
||||||
import { getCurrentTime } from "@/lib/date";
|
import { getCurrentTime } from "@/lib/date";
|
||||||
import { stringifyFrontmatter } from "@/lib/frontmatter";
|
import { stringifyFrontmatter } from "@/lib/frontmatter";
|
||||||
|
import type { TPostFrontmatter } from "@/types/frontmatter.type";
|
||||||
import { type ChildProcessWithoutNullStreams, type SpawnSyncReturns, spawn, spawnSync } from "child_process";
|
import { type ChildProcessWithoutNullStreams, type SpawnSyncReturns, spawn, spawnSync } from "child_process";
|
||||||
import colors from "colors";
|
import colors from "colors";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
@@ -103,7 +104,7 @@ inquirer.prompt<TAnswer>(questions).then((answers) => {
|
|||||||
const time = `${year}-${month}-${day}`;
|
const time = `${year}-${month}-${day}`;
|
||||||
|
|
||||||
// Stringify the frontmatters
|
// Stringify the frontmatters
|
||||||
const stringifiedFrontmatter = stringifyFrontmatter({
|
const frontmatter: TPostFrontmatter = {
|
||||||
title: title,
|
title: title,
|
||||||
subtitle: subtitle,
|
subtitle: subtitle,
|
||||||
summary: "",
|
summary: "",
|
||||||
@@ -114,7 +115,8 @@ inquirer.prompt<TAnswer>(questions).then((answers) => {
|
|||||||
noPrompt: noPrompt,
|
noPrompt: noPrompt,
|
||||||
allowShare: allowShare,
|
allowShare: allowShare,
|
||||||
closed: false,
|
closed: false,
|
||||||
});
|
};
|
||||||
|
const stringifiedFrontmatter = stringifyFrontmatter(frontmatter);
|
||||||
|
|
||||||
// Output the new post file
|
// Output the new post file
|
||||||
const postFileName = `${year}-${month}-${day}-${_.kebabCase(answers.inputTitle)}.md`;
|
const postFileName = `${year}-${month}-${day}-${_.kebabCase(answers.inputTitle)}.md`;
|
||||||
|
|||||||
23
types/docs.type.ts
Normal file
23
types/docs.type.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import type { TPostFrontmatter } from "./frontmatter.type";
|
||||||
|
|
||||||
|
export type TPostListItem = {
|
||||||
|
id: string;
|
||||||
|
frontMatter: TPostFrontmatter;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type TPostsByTag = {
|
||||||
|
[tagName: string]: TPostListItem[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type TSearchResultItem = {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
summary: string | null;
|
||||||
|
tags: string[] | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type TTOCItem = {
|
||||||
|
level: number;
|
||||||
|
title: string;
|
||||||
|
anchorId: string;
|
||||||
|
};
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
import type { NonEmptyArray } from "./utils.type";
|
export type TPostFrontmatter = {
|
||||||
|
|
||||||
export type TFrontmatter = {
|
|
||||||
title: string;
|
title: string;
|
||||||
time: string;
|
time: string;
|
||||||
tags: NonEmptyArray<string> | null;
|
tags: string[] | null;
|
||||||
subtitle: string | null;
|
subtitle: string | null;
|
||||||
summary: string | null;
|
summary: string | null;
|
||||||
coverURL: string | null;
|
coverURL: string | null;
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
import type { TFrontmatter } from "./frontmatter.type";
|
|
||||||
|
|
||||||
export type TPostListItem = {
|
|
||||||
id: string;
|
|
||||||
frontMatter: TFrontmatter;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type TPostsByTag = {
|
|
||||||
[tagName: string]: TPostListItem[];
|
|
||||||
};
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
export type TSearchResultItem = {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
summary: string | null;
|
|
||||||
tags: string[] | null;
|
|
||||||
};
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
export type TTOCItem = {
|
|
||||||
level: number;
|
|
||||||
title: string;
|
|
||||||
anchorId: string;
|
|
||||||
};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export type NonEmptyArray<T> = [T, ...T[]];
|
|
||||||
Reference in New Issue
Block a user