config.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import {
  2. defineConfig,
  3. resolveSiteDataByRoute,
  4. type HeadConfig
  5. } from 'vitepress'
  6. import {
  7. groupIconMdPlugin,
  8. groupIconVitePlugin,
  9. localIconLoader
  10. } from 'vitepress-plugin-group-icons'
  11. import llmstxt from 'vitepress-plugin-llms'
  12. const prod = !!process.env.NETLIFY
  13. export default defineConfig({
  14. title: 'VitePress',
  15. rewrites: {
  16. 'en/:rest*': ':rest*'
  17. },
  18. lastUpdated: true,
  19. cleanUrls: true,
  20. metaChunk: true,
  21. markdown: {
  22. math: true,
  23. codeTransformers: [
  24. // We use `[!!code` in demo to prevent transformation, here we revert it back.
  25. {
  26. postprocess(code) {
  27. return code.replace(/\[\!\!code/g, '[!code')
  28. }
  29. }
  30. ],
  31. config(md) {
  32. // TODO: remove when https://github.com/vuejs/vitepress/issues/4431 is fixed
  33. const fence = md.renderer.rules.fence!
  34. md.renderer.rules.fence = function (tokens, idx, options, env, self) {
  35. const { localeIndex = 'root' } = env
  36. const codeCopyButtonTitle = (() => {
  37. switch (localeIndex) {
  38. case 'es':
  39. return 'Copiar código'
  40. case 'fa':
  41. return 'کپی کد'
  42. case 'ko':
  43. return '코드 복사'
  44. case 'pt':
  45. return 'Copiar código'
  46. case 'ru':
  47. return 'Скопировать код'
  48. case 'zh':
  49. return '复制代码'
  50. default:
  51. return 'Copy code'
  52. }
  53. })()
  54. return fence(tokens, idx, options, env, self).replace(
  55. '<button title="Copy Code" class="copy"></button>',
  56. `<button title="${codeCopyButtonTitle}" class="copy"></button>`
  57. )
  58. }
  59. md.use(groupIconMdPlugin)
  60. }
  61. },
  62. sitemap: {
  63. hostname: 'https://vitepress.dev',
  64. transformItems(items) {
  65. return items.filter((item) => !item.url.includes('migration'))
  66. }
  67. },
  68. /* prettier-ignore */
  69. head: [
  70. ['link', { rel: 'icon', type: 'image/svg+xml', href: '/vitepress-logo-mini.svg' }],
  71. ['link', { rel: 'icon', type: 'image/png', href: '/vitepress-logo-mini.png' }],
  72. ['meta', { name: 'theme-color', content: '#5f67ee' }],
  73. ['meta', { property: 'og:type', content: 'website' }],
  74. ['meta', { property: 'og:site_name', content: 'VitePress' }],
  75. ['meta', { property: 'og:image', content: 'https://vitepress.dev/vitepress-og.jpg' }],
  76. ['meta', { property: 'og:url', content: 'https://vitepress.dev/' }],
  77. ['script', { src: 'https://cdn.usefathom.com/script.js', 'data-site': 'AZBRSFGG', 'data-spa': 'auto', defer: '' }]
  78. ],
  79. themeConfig: {
  80. logo: { src: '/vitepress-logo-mini.svg', width: 24, height: 24 },
  81. socialLinks: [
  82. { icon: 'github', link: 'https://github.com/vuejs/vitepress' }
  83. ],
  84. search: {
  85. provider: 'algolia',
  86. options: {
  87. appId: '8J64VVRP8K',
  88. apiKey: '52f578a92b88ad6abde815aae2b0ad7c',
  89. indexName: 'vitepress'
  90. }
  91. },
  92. carbonAds: { code: 'CEBDT27Y', placement: 'vuejsorg' }
  93. },
  94. locales: {
  95. root: { label: 'English' },
  96. zh: { label: '简体中文' },
  97. pt: { label: 'Português' },
  98. ru: { label: 'Русский' },
  99. es: { label: 'Español' },
  100. ko: { label: '한국어' },
  101. fa: { label: 'فارسی' }
  102. },
  103. vite: {
  104. plugins: [
  105. groupIconVitePlugin({
  106. customIcon: {
  107. vitepress: localIconLoader(
  108. import.meta.url,
  109. '../public/vitepress-logo-mini.svg'
  110. ),
  111. firebase: 'logos:firebase'
  112. }
  113. }),
  114. prod &&
  115. llmstxt({
  116. workDir: 'en',
  117. ignoreFiles: ['index.md']
  118. })
  119. ]
  120. },
  121. transformPageData: prod
  122. ? (pageData, ctx) => {
  123. const site = resolveSiteDataByRoute(
  124. ctx.siteConfig.site,
  125. pageData.relativePath
  126. )
  127. const title = `${pageData.title || site.title} | ${pageData.description || site.description}`
  128. ;((pageData.frontmatter.head ??= []) as HeadConfig[]).push(
  129. ['meta', { property: 'og:locale', content: site.lang }],
  130. ['meta', { property: 'og:title', content: title }]
  131. )
  132. }
  133. : undefined
  134. })