import { LocaleConfig, LocaleData, Page, PageFrontmatter } from "vuepress"; import { Stats } from "node:fs"; import { WatermarkPluginFrontmatter, WatermarkPluginOptions } from "@vuepress/plugin-watermark"; import { MarkdownChartPluginOptions } from "@vuepress/plugin-markdown-chart"; import { MarkdownHintPluginOptions } from "@vuepress/plugin-markdown-hint"; import { MarkdownImagePluginOptions } from "@vuepress/plugin-markdown-image"; import { MarkdownIncludePluginOptions } from "@vuepress/plugin-markdown-include"; import { MarkdownMathPluginOptions } from "@vuepress/plugin-markdown-math"; import { MarkdownPowerPluginOptions } from "vuepress-plugin-md-power"; import { SearchPluginOptions } from "@vuepress-plume/plugin-search"; import { DocSearchOptions as DocSearchOptions$1, DocSearchPluginOptions } from "@vuepress/plugin-docsearch"; import { CommentPluginOptions } from "@vuepress/plugin-comment"; import { CopyCodePluginOptions } from "@vuepress/plugin-copy-code"; import { ChangelogOptions, ContributorsOptions, GitChangelogInfo as GitChangelog, GitContributorInfo as GitContributor, GitPluginPageData } from "@vuepress/plugin-git"; import { ReadingTime, ReadingTimePluginOptions } from "@vuepress/plugin-reading-time"; import { ReplaceAssetsPluginOptions } from "@vuepress/plugin-replace-assets"; import { ShikiPluginOptions } from "@vuepress/plugin-shiki"; import { CachePluginOptions } from "@vuepress/plugin-cache"; import { PhotoSwipePluginOptions } from "@vuepress/plugin-photo-swipe"; import { SeoPluginOptions } from "@vuepress/plugin-seo"; import { SitemapPluginOptions } from "@vuepress/plugin-sitemap"; //#region src/shared/common/base.d.ts /** * 图片 */ type ThemeImage = string | { src: string; alt?: string; width?: string | number; height?: string | number; } | { dark: string; light: string; alt?: string; width?: string | number; height?: string | number; }; /** * 图标 */ type ThemeIcon = string | { svg: string; }; /** * 颜色 */ type ThemeColor = string | { light: string; dark: string; }; /** * 页内 heading 导航栏 */ type ThemeOutline = false | number | [number, number] | "deep"; /** * 徽章 */ interface ThemeBadge { text?: string; type?: string; color?: string; bgColor?: string; borderColor?: string; } //#endregion //#region src/shared/common/social.d.ts /** * 社交链接 */ interface SocialLink { icon: SocialLinkIcon; link: string; ariaLabel?: string; } /** * 社交链接图标 */ type SocialLinkIcon = SocialLinkIconUnion | { svg: string; name?: string; }; type SocialLinkIconUnion = "discord" | "telegram" | "facebook" | "github" | "instagram" | "linkedin" | "mastodon" | "npm" | "slack" | "twitter" | "x" | "youtube" | "qq" | "weibo" | "bilibili" | "gitlab" | "docker" | "juejin" | "zhihu" | "douban" | "steam" | "stackoverflow" | "xbox"; //#endregion //#region src/shared/frontmatter/normal.d.ts type ThemeNormalFrontmatter = PageFrontmatter<{ /** * @deprecated * * 使用 pageLayout = 'home' 代替 */ home?: boolean; /** * @deprecated * * 使用 pageLayout = 'friends' 代替 */ friends?: boolean; /** * page layout */ pageLayout?: false | "home" | "blog" | "doc" | "custom" | "page" | "friends"; /** * 自定义页面 class */ pageClass?: string; /** * 是否显示导航栏 * * @default true */ navbar?: boolean; /** * 是否显示返回顶部按钮 * * @default true */ backToTop?: boolean; /** * 是否显示向下箭头标志 * * @default false */ signDown?: boolean; /** * 当前页面是否显示 外部链接图标 * * @default true */ externalLinkIcon?: boolean; /** * @deprecated 使用 `externalLinkIcon` 代替 */ externalLink?: boolean; }>; //#endregion //#region src/shared/frontmatter/page.d.ts interface ThemePageFrontmatter extends ThemeNormalFrontmatter { home?: never; friends?: never; /** * 是否开启评论 */ comments?: boolean; /** * 是否显示编辑按钮 */ editLink?: boolean; /** * 编辑链接模式 */ editLinkPattern?: string; /** * 是否显示最近更新时间 */ lastUpdated?: boolean; /** * 是否显示贡献者 */ contributors?: boolean | string[]; /** * 是否显示变更历史 */ changelog?: boolean; /** * 上一篇 */ prev?: string | NavItemWithLink; /** * 下一篇 */ next?: string | NavItemWithLink; /** * 是否显示侧边栏,也可以强制指定当前页面显示哪个侧边栏 */ sidebar?: string | false; /** * 是否显示页内侧边栏 */ aside?: boolean | "left"; /** * 是否显示内容大纲,仅在页内侧边栏开启时生效 */ outline?: ThemeOutline; /** * 是否显示阅读时间、字数 */ readingTime?: boolean; /** * 水印配置 */ watermark?: WatermarkPluginFrontmatter["watermark"] & { fullPage?: boolean; }; /** * 用作 navbar 、 sidebar 的图标 * 支持 iconify 图标,直接使用 iconify name 即可自动加载 * 支持 本地、远程 svg 图标,直接使用 svg 的 url 即可 * 或直接传入 svg 字符串 */ icon?: ThemeIcon; /** * 标题徽章 */ badge?: string | ThemeBadge; } //#endregion //#region src/shared/features/autoFrontmatter.d.ts interface AutoFrontmatterMarkdownFile { filepath: string; relativePath: string; content: string; createTime: Date; stats: Stats; } type FrontmatterFn = (value: T, file: AutoFrontmatterMarkdownFile, data: ThemePageFrontmatter) => T | PromiseLike; type AutoFrontmatterObject = Record>; type AutoFrontmatterArray = { include: string | string[]; frontmatter: AutoFrontmatterObject; }[]; interface AutoFrontmatterOptions { /** * glob 匹配,被匹配的文件将会自动生成 frontmatter * * @default ['**\/*.md'] */ include?: string | string[]; /** * glob 匹配,被匹配的文件将不会自动生成 frontmatter */ exclude?: string | string[]; /** * 是否自动生成 permalink * * @default true */ permalink?: boolean; /** * 是否自动生成 createTime * * 默认读取 文件创建时间,`createTitme` 比 vuepress 默认的 `date` 时间更精准到秒 */ createTime?: boolean; /** * 是否自动生成 author * * 默认读取 `profile.name` 或 `package.json` 的 `author` * * @deprecated 不再默认生成 `author`, 该配置已废弃 */ author?: boolean; /** * 是否自动生成 title * * 默认读取文件名作为标题 */ title?: boolean; /** * { * key(value, file, data) { * return value * } * } */ frontmatter?: AutoFrontmatterArray | AutoFrontmatterObject; } //#endregion //#region src/shared/features/blog.d.ts interface BlogCategoryItem { /** * 分类 ID */ id: string; /** * 分类排序 */ sort: number; /** * 分类名称 */ name: string; } /** * 博客封面图布局 */ type BlogPostCoverLayout = "left" | "right" | "odd-left" | "odd-right" | "top"; /** * 博客文章封面图样式 */ interface BlogPostCoverStyle { /** * 博客文章封面图的位置 */ layout?: BlogPostCoverLayout; /** * 博客文章封面图的比例 * * @default '4:3' */ ratio?: number | `${number}:${number}` | `${number}/${number}`; /** * 封面图的宽度, 仅在 layout 为 'left' 或 'right' 时生效 * * @default 240 */ width?: number; /** * 是否使用紧凑模式,紧凑模式下,封面图紧贴容器边缘 * @default false */ compact?: boolean; } /** * 博客文章 */ interface ThemeBlogPostItem { /** * 文章标题 */ title: string; /** * 文章摘要 */ excerpt: string; /** * 文章路径 */ path: string; /** * 文章标签 */ tags?: string[]; /** * 文章是否置顶,数字表示置顶的优先级 * @default false */ sticky?: boolean | number; /** * 文章所属分类 */ categoryList?: BlogCategoryItem[]; /** * 文章创建时间 */ createTime: string; /** * 文章语言 */ lang: string; /** * 文章是否加密 */ encrypt?: boolean; /** * 文章封面图 */ cover?: string; /** * 文章封面图样式 */ coverStyle?: BlogPostCoverStyle; /** * 文章是否为草稿 */ draft?: boolean; } /** * 博客文章列表 */ type ThemeBlogPostList = ThemeBlogPostItem[]; /** * 博客配置 */ interface BlogOptions { /** * 通过 glob string 配置包含文件, * * 默认读取 源目录中的所有 `.md` 文件,但会排除 `notes` 配置中用于笔记的目录。 * * 如果希望只将某个目录下的文章读取为博客文章,比如 `blog` 目录,可以配置为: * `['blog/**\/*.md']` * * @default - ['**\/*.md'] */ include?: string[]; /** * 通过 glob string 配置排除的文件 * * _README.md 文件一般作为主页或者某个目录下的主页,不应该被读取为 blog文章_ * * @default - ['.vuepress/', 'node_modules/', '{README,index}.md'] */ exclude?: string[]; /** * 分页 */ pagination?: false | number | { /** * 每页显示的文章数量 * @default 15 */ perPage?: number; }; /** * 博客文章列表页链接 * * @default '/blog/' */ link?: string; /** * 是否启用博客文章列表 * @default true */ postList?: boolean; /** * 是否启用标签页 * @default true */ tags?: boolean; /** * 自定义标签页链接 * * @default '/blog/tags/' */ tagsLink?: string; /** * 标签颜色主题 * * @default 'colored' */ tagsTheme?: "colored" | "gray" | "brand"; /** * 是否启用归档页 * @default true */ archives?: boolean; /** * 自定义归档页链接 * * @default '/blog/archives/' */ archivesLink?: string; /** * 是否启用分类功能 * - 启用后会生成分类页 * @default true */ categories?: boolean; /** * 自定义分类页链接 * * @default '/blog/categories/' */ categoriesLink?: string; /** * 分类页展开深度 * * @default 'deep' */ categoriesExpand?: number | "deep"; /** * 文章分类列表转换函数,比如排除不需要的一级分类 * @param categories 分类列表 * @returns 返回一个新的分类列表 */ categoriesTransform?: (categories: BlogCategoryItem[]) => BlogCategoryItem[]; /** * 博客文章封面图 * * 配置封面图的位置,支持 `'left'`、`'right'`、`'top'`、`'top-inside'` * * @default 'right' */ postCover?: BlogPostCoverLayout | BlogPostCoverStyle; } //#endregion //#region src/shared/features/bulletin.d.ts /** * 公告栏配置 */ type BulletinOptions = Record> = T & { /** * 公告位置 * @default 'top-right' */ layout?: "top-left" | "top-right" | "bottom-left" | "bottom-right" | "center"; /** * 是否显示渐变边框 * * @default true */ border?: boolean; /** * 在哪些页面显示公告 * * - `true` 表示所有页面 * - `false` 表示不显示 * - 传入一个函数,返回 `true` 时显示 */ enablePage?: boolean | ((page: Page) => boolean); /** * 公告持续时间 * * @default 'always' * * - `'session'` 表示在会话周期内关闭公告后不再显示,在新的会话周期重新显示,刷新页面不会重新显示 * - `'always'` 表示总是显示,关闭公告后刷新页面会重新显示 * - `'once'` 表示在仅在当前周期内显示,关闭公告后不再显示,新的会话和刷新页面都不会重新显示 */ lifetime?: "session" | "always" | "once"; /** * 公告 ID * * 公告持续时间 需要根据 `id` 作为唯一标识 */ id?: string; /** * 公告标题 */ title?: string; /** * 公告内容 * * 可以使用 markdown 语法 或者 使用 html 文本, * 使用 markdown 时需要声明 `contentType` 为 `markdown` */ content?: string; /** * 公告内容 类型 * * - `markdown` 表示使用 markdown 语法 * - `text` 表示使用 普通文本 (可以是 html 内容) * * @default 'text' */ contentType?: "markdown" | "text"; /** * 传入一个 `markdown` 或 `html` 文件路径,并使用文件内容作为公告内容 * * - 使用 `.md` 文件时,将会解析 markdown 语法 * - 使用 `.html` 文件时,只能包含公告内容,请不要使用 `` `` `