]*(style=".*?")/
- const preRE = /^/
const vueRE = /-vue$/
const lineNoStartRE = /=(\d*)/
const lineNoRE = /:(no-)?line-numbers(=\d*)?$/
@@ -116,16 +126,6 @@ export async function highlight(
}
const lineOptions = attrsToLines(attrs)
- const cleanup = (str: string) => {
- return str
- .replace(
- preRE,
- (_, attributes) =>
- ``
- )
- .replace(styleRE, (_, style) => _.replace(style, ''))
- }
-
const mustaches = new Map()
const removeMustache = (s: string) => {
@@ -161,8 +161,17 @@ export async function highlight(
transformers: [
...transformers,
transformerCompactLineOptions(lineOptions),
+ {
+ name: 'vitepress:v-pre',
+ pre(node) {
+ if (vPre) node.properties['v-pre'] = ''
+ }
+ },
...userTransformers
],
+ meta: {
+ __raw: attrs
+ },
...(typeof theme === 'string' || 'name' in theme
? { theme }
: {
@@ -171,6 +180,6 @@ export async function highlight(
})
})
- return fillEmptyHighlightedLine(cleanup(restoreMustache(highlighted)))
+ return fillEmptyHighlightedLine(restoreMustache(highlighted))
}
}
diff --git a/src/node/plugin.ts b/src/node/plugin.ts
index eed1c009..0c3daddc 100644
--- a/src/node/plugin.ts
+++ b/src/node/plugin.ts
@@ -95,22 +95,6 @@ export async function createVitePressPlugin(
}
}
- const getMergedAssetUrlOptions = () => {
- const { transformAssetUrls } = userVuePluginOptions?.template ?? {}
- const assetUrlOptions = { includeAbsolute: true }
-
- if (transformAssetUrls && typeof transformAssetUrls === 'object') {
- // presence of array fields means this is raw tags config
- if (Object.values(transformAssetUrls).some((val) => Array.isArray(val))) {
- return { ...assetUrlOptions, tags: transformAssetUrls as any }
- } else {
- return { ...assetUrlOptions, ...transformAssetUrls }
- }
- } else {
- return assetUrlOptions
- }
- }
-
// lazy require plugin-vue to respect NODE_ENV in @vue/compiler-x
const vuePlugin = await import('@vitejs/plugin-vue').then((r) =>
r.default({
@@ -121,8 +105,7 @@ export async function createVitePressPlugin(
compilerOptions: {
...userVuePluginOptions?.template?.compilerOptions,
isCustomElement
- },
- transformAssetUrls: getMergedAssetUrlOptions()
+ }
}
})
)
@@ -169,7 +152,8 @@ export async function createVitePressPlugin(
site.themeConfig?.search?.provider === 'algolia' ||
!!site.themeConfig?.algolia, // legacy
__CARBON__: !!site.themeConfig?.carbonAds,
- __ASSETS_DIR__: JSON.stringify(siteConfig.assetsDir)
+ __ASSETS_DIR__: JSON.stringify(siteConfig.assetsDir),
+ __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: !!process.env.DEBUG
},
optimizeDeps: {
// force include vue to avoid duplicated copies when linked + optimized
@@ -284,7 +268,11 @@ export async function createVitePressPlugin(
if (file.endsWith('.md')) {
Object.assign(
siteConfig,
- await resolvePages(siteConfig.srcDir, siteConfig.userConfig)
+ await resolvePages(
+ siteConfig.srcDir,
+ siteConfig.userConfig,
+ siteConfig.logger
+ )
)
}
diff --git a/src/node/plugins/dynamicRoutesPlugin.ts b/src/node/plugins/dynamicRoutesPlugin.ts
index e42e8c13..cf9576ae 100644
--- a/src/node/plugins/dynamicRoutesPlugin.ts
+++ b/src/node/plugins/dynamicRoutesPlugin.ts
@@ -1,6 +1,7 @@
import {
loadConfigFromFile,
normalizePath,
+ type Logger,
type Plugin,
type ViteDevServer
} from 'vite'
@@ -13,7 +14,11 @@ import { resolveRewrites } from './rewritesPlugin'
export const dynamicRouteRE = /\[(\w+?)\]/g
-export async function resolvePages(srcDir: string, userConfig: UserConfig) {
+export async function resolvePages(
+ srcDir: string,
+ userConfig: UserConfig,
+ logger: Logger
+) {
// Important: fast-glob doesn't guarantee order of the returned files.
// We must sort the pages so the input list to rollup is stable across
// builds - otherwise different input order could result in different exports
@@ -39,7 +44,11 @@ export async function resolvePages(srcDir: string, userConfig: UserConfig) {
;(dynamicRouteRE.test(file) ? dynamicRouteFiles : pages).push(file)
})
- const dynamicRoutes = await resolveDynamicRoutes(srcDir, dynamicRouteFiles)
+ const dynamicRoutes = await resolveDynamicRoutes(
+ srcDir,
+ dynamicRouteFiles,
+ logger
+ )
pages.push(...dynamicRoutes.routes.map((r) => r.path))
const rewrites = resolveRewrites(pages, userConfig.rewrites)
@@ -141,7 +150,7 @@ export const dynamicRoutesPlugin = async (
if (!/\.md$/.test(ctx.file)) {
Object.assign(
config,
- await resolvePages(config.srcDir, config.userConfig)
+ await resolvePages(config.srcDir, config.userConfig, config.logger)
)
}
for (const id of mods) {
@@ -154,7 +163,8 @@ export const dynamicRoutesPlugin = async (
export async function resolveDynamicRoutes(
srcDir: string,
- routes: string[]
+ routes: string[],
+ logger: Logger
): Promise {
const pendingResolveRoutes: Promise[] = []
const routeFileToModulesMap: Record> = {}
@@ -170,7 +180,7 @@ export async function resolveDynamicRoutes(
const pathsFile = paths.find((p) => fs.existsSync(p))
if (pathsFile == null) {
- console.warn(
+ logger.warn(
c.yellow(
`Missing paths file for dynamic route ${route}: ` +
`a corresponding ${paths[0]} (or .ts/.mjs/.mts) file is needed.`
@@ -183,15 +193,15 @@ export async function resolveDynamicRoutes(
let mod = routeModuleCache.get(pathsFile)
if (!mod) {
try {
- mod = (await loadConfigFromFile({} as any, pathsFile)) as RouteModule
+ mod = (await loadConfigFromFile(
+ {} as any,
+ pathsFile,
+ undefined,
+ 'silent'
+ )) as RouteModule
routeModuleCache.set(pathsFile, mod)
- } catch (e) {
- console.warn(
- c.yellow(
- `Invalid paths file export in ${pathsFile}. ` +
- `Expects default export of an object with a "paths" property.`
- )
- )
+ } catch (e: any) {
+ logger.warn(`${c.yellow(`Failed to load ${pathsFile}:`)}\n${e.stack}`)
continue
}
}
@@ -210,7 +220,7 @@ export async function resolveDynamicRoutes(
const loader = mod!.config.paths
if (!loader) {
- console.warn(
+ logger.warn(
c.yellow(
`Invalid paths file export in ${pathsFile}. ` +
`Missing "paths" property from default export.`
diff --git a/src/node/siteConfig.ts b/src/node/siteConfig.ts
index 56c0592c..74174280 100644
--- a/src/node/siteConfig.ts
+++ b/src/node/siteConfig.ts
@@ -147,6 +147,15 @@ export interface UserConfig
*/
useWebFonts?: boolean
+ /**
+ * This option allows you to configure the concurrency of the build.
+ * A lower number will reduce the memory usage but will increase the build time.
+ *
+ * @experimental
+ * @default 64
+ */
+ buildConcurrency?: number
+
/**
* @experimental
*
@@ -240,4 +249,5 @@ export interface SiteConfig
}
logger: Logger
userConfig: UserConfig
+ buildConcurrency: number
}
diff --git a/src/shared/shared.ts b/src/shared/shared.ts
index c69f7277..9dd05e34 100644
--- a/src/shared/shared.ts
+++ b/src/shared/shared.ts
@@ -113,6 +113,10 @@ export function createTitle(siteData: SiteData, pageData: PageData): string {
const templateString = createTitleTemplate(siteData.title, template)
+ if (title === templateString.slice(3)) {
+ return title
+ }
+
return `${title}${templateString}`
}
diff --git a/types/default-theme.d.ts b/types/default-theme.d.ts
index dc066881..157faa00 100644
--- a/types/default-theme.d.ts
+++ b/types/default-theme.d.ts
@@ -355,6 +355,7 @@ export namespace DefaultTheme {
desc?: string
links?: SocialLink[]
sponsor?: string
+ actionText?: string
}
// outline -------------------------------------------------------------------