test02/node_modules/@vuepress/theme-default/lib/node/defaultTheme.js
罗佳鸿 6aa1ebe342
Some checks are pending
部署文档 / deploy-gh-pages (push) Waiting to run
first commit
2024-08-13 10:11:19 +08:00

196 lines
8.9 KiB
JavaScript

import { addViteConfig, addViteOptimizeDepsExclude, chainWebpack, } from '@vuepress/helper';
import { activeHeaderLinksPlugin } from '@vuepress/plugin-active-header-links';
import { backToTopPlugin } from '@vuepress/plugin-back-to-top';
import { copyCodePlugin } from '@vuepress/plugin-copy-code';
import { gitPlugin } from '@vuepress/plugin-git';
import { linksCheckPlugin } from '@vuepress/plugin-links-check';
import { markdownContainerPlugin } from '@vuepress/plugin-markdown-container';
import { mediumZoomPlugin } from '@vuepress/plugin-medium-zoom';
import { nprogressPlugin } from '@vuepress/plugin-nprogress';
import { palettePlugin } from '@vuepress/plugin-palette';
import { prismjsPlugin } from '@vuepress/plugin-prismjs';
import { seoPlugin } from '@vuepress/plugin-seo';
import { sitemapPlugin } from '@vuepress/plugin-sitemap';
import { themeDataPlugin } from '@vuepress/plugin-theme-data';
import { isPlainObject } from 'vuepress/shared';
import { fs, getDirname, path } from 'vuepress/utils';
import { assignDefaultLocaleOptions, resolveMarkdownContainerPluginOptions, } from './utils/index.js';
const __dirname = getDirname(import.meta.url);
export const defaultTheme = ({ hostname, themePlugins = {}, ...localeOptions } = {}) => {
assignDefaultLocaleOptions(localeOptions);
return {
name: '@vuepress/theme-default',
templateBuild: path.resolve(__dirname, '../../templates/build.html'),
alias: {
// use alias to make all components replaceable
...Object.fromEntries(fs
.readdirSync(path.resolve(__dirname, '../client/components'))
.filter((file) => file.endsWith('.vue'))
.map((file) => [
`@theme/${file}`,
path.resolve(__dirname, '../client/components', file),
])),
// use alias to make all composables replaceable
...Object.fromEntries(fs
.readdirSync(path.resolve(__dirname, '../client/composables'))
.filter((file) => file.endsWith('.js'))
.map((file) => [
`@theme/${file.substring(0, file.length - 3)}`,
path.resolve(__dirname, '../client/composables', file),
])),
},
clientConfigFile: path.resolve(__dirname, '../client/config.js'),
extendsBundlerOptions: (bundlerOptions, app) => {
// FIXME: hide sass deprecation warning for mixed-decls
addViteConfig(bundlerOptions, app, {
css: {
preprocessorOptions: {
sass: {
logger: {
warn: (message, { deprecation, deprecationType }) => {
if (deprecation && deprecationType.id === 'mixed-decls')
return;
console.warn(message);
},
},
},
scss: {
logger: {
warn: (message, { deprecation, deprecationType }) => {
if (deprecation && deprecationType.id === 'mixed-decls')
return;
console.warn(message);
},
},
},
},
},
});
chainWebpack(bundlerOptions, app, (config) => {
config.module
.rule('scss')
.use('sass-loader')
.tap((options) => ({
api: 'modern-compiler',
...options,
sassOptions: {
silenceDeprecations: ['mixed-decls'],
...options.sassOptions,
},
}));
});
// ensure theme alias is not optimized by Vite
addViteOptimizeDepsExclude(bundlerOptions, app, '@theme');
},
extendsPage: (page) => {
// save relative file path into page data to generate edit link
page.data.filePathRelative = page.filePathRelative;
// save title into route meta to generate navbar and sidebar
page.routeMeta.title = page.title;
},
plugins: [
// @vuepress/plugin-active-header-link
themePlugins.activeHeaderLinks !== false
? activeHeaderLinksPlugin({
headerLinkSelector: 'a.vp-sidebar-item',
headerAnchorSelector: '.header-anchor',
// should greater than page transition duration
delay: 300,
})
: [],
// @vuepress/plugin-back-to-top
themePlugins.backToTop !== false
? backToTopPlugin(isPlainObject(themePlugins.backToTop) ? themePlugins.backToTop : {})
: [],
// @vuepress/plugin-copy-code
themePlugins.copyCode !== false
? copyCodePlugin({
...(isPlainObject(themePlugins.copyCode)
? themePlugins.copyCode
: {}),
})
: [],
// @vuepress/plugin-markdown-container
themePlugins.container?.tip !== false
? markdownContainerPlugin(resolveMarkdownContainerPluginOptions(localeOptions, 'tip'))
: [],
themePlugins.container?.warning !== false
? markdownContainerPlugin(resolveMarkdownContainerPluginOptions(localeOptions, 'warning'))
: [],
themePlugins.container?.danger !== false
? markdownContainerPlugin(resolveMarkdownContainerPluginOptions(localeOptions, 'danger'))
: [],
themePlugins.container?.details !== false
? markdownContainerPlugin({
type: 'details',
before: (info) => `<details class="custom-container details">${info ? `<summary>${info}</summary>` : ''}\n`,
after: () => '</details>\n',
})
: [],
themePlugins.container?.codeGroup !== false
? markdownContainerPlugin({
type: 'code-group',
before: () => `<CodeGroup>\n`,
after: () => '</CodeGroup>\n',
})
: [],
themePlugins.container?.codeGroupItem !== false
? markdownContainerPlugin({
type: 'code-group-item',
before: (info) => `<CodeGroupItem title="${info}">\n`,
after: () => '</CodeGroupItem>\n',
})
: [],
// @vuepress/plugin-git
themePlugins.git !== false
? gitPlugin({
createdTime: false,
updatedTime: localeOptions.lastUpdated !== false,
contributors: localeOptions.contributors !== false,
})
: [],
// @vuepress/plugin-links-check
themePlugins.linksCheck !== false
? linksCheckPlugin(isPlainObject(themePlugins.linksCheck)
? themePlugins.linksCheck
: {})
: [],
// @vuepress/plugin-medium-zoom
themePlugins.mediumZoom !== false
? mediumZoomPlugin({
selector: '.theme-default-content > img, .theme-default-content :not(a) > img',
zoomOptions: {},
// should greater than page transition duration
delay: 300,
})
: [],
// @vuepress/plugin-nprogress
themePlugins.nprogress !== false ? nprogressPlugin() : [],
// @vuepress/plugin-palette
palettePlugin({ preset: 'sass' }),
// @vuepress/plugin-prismjs
themePlugins.prismjs !== false
? prismjsPlugin(isPlainObject(themePlugins.prismjs) ? themePlugins.prismjs : {})
: [],
// @vuepress/plugin-seo
hostname && themePlugins.seo !== false
? seoPlugin({
hostname,
...(isPlainObject(themePlugins.seo) ? themePlugins.seo : {}),
})
: [],
// @vuepress/plugin-sitemap
hostname && themePlugins.sitemap !== false
? sitemapPlugin({
hostname,
...(isPlainObject(themePlugins.sitemap)
? themePlugins.sitemap
: {}),
})
: [],
// @vuepress/plugin-theme-data
themeDataPlugin({ themeData: localeOptions }),
],
};
};