Skip to content

Commit afeb06f

Browse files
rigor789brc-dd
andauthored
feat: transformPageData hook (vuejs#1492)
Co-authored-by: Divyansh Singh <[email protected]>
1 parent d404753 commit afeb06f

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed

docs/config/app-configs.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,28 @@ export default {
318318
}
319319
```
320320

321+
### transformPageData
322+
323+
- Type: `(pageData: PageData) => Awaitable<Partial<PageData> | { [key: string]: any } | void>`
324+
325+
`transformPageData` is a hook to transform the `pageData` of each page. You can directly mutate `pageData` or return changed values which will be merged into PageData.
326+
327+
328+
```ts
329+
export default {
330+
async transformPageData(pageData) {
331+
pageData.contributors = await getPageContributors(pageData.relativePath)
332+
}
333+
334+
// or return data to be merged
335+
async transformPageData(pageData) {
336+
return {
337+
contributors: await getPageContributors(pageData.relativePath)
338+
}
339+
}
340+
}
341+
```
342+
321343
### buildEnd
322344

323345
- Type: `(siteConfig: SiteConfig) => Awaitable<void>`

src/node/config.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ export interface UserConfig<ThemeConfig = any> {
108108
id: string,
109109
ctx: TransformContext
110110
) => Awaitable<string | void>
111+
112+
/**
113+
* PageData transform hook: runs when rendering markdown to vue
114+
*/
115+
transformPageData?: (
116+
pageData: PageData
117+
) => Awaitable<Partial<PageData> | { [key: string]: any } | void>
111118
}
112119

113120
export interface TransformContext {
@@ -138,6 +145,7 @@ export interface SiteConfig<ThemeConfig = any>
138145
| 'buildEnd'
139146
| 'transformHead'
140147
| 'transformHtml'
148+
| 'transformPageData'
141149
> {
142150
root: string
143151
srcDir: string
@@ -224,7 +232,8 @@ export async function resolveConfig(
224232
cleanUrls: userConfig.cleanUrls || 'disabled',
225233
buildEnd: userConfig.buildEnd,
226234
transformHead: userConfig.transformHead,
227-
transformHtml: userConfig.transformHtml
235+
transformHtml: userConfig.transformHtml,
236+
transformPageData: userConfig.transformPageData
228237
}
229238

230239
return config

src/node/markdownToVue.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import path from 'path'
33
import c from 'picocolors'
44
import LRUCache from 'lru-cache'
55
import { resolveTitleFromToken } from '@mdit-vue/shared'
6+
import { SiteConfig } from './config'
67
import { PageData, HeadConfig, EXTERNAL_URL_RE, CleanUrlsMode } from './shared'
78
import { slash } from './utils/slash'
89
import { getGitTimestamp } from './utils/getGitTimestamp'
@@ -37,7 +38,8 @@ export async function createMarkdownToVueRenderFn(
3738
isBuild = false,
3839
base = '/',
3940
includeLastUpdatedData = false,
40-
cleanUrls: CleanUrlsMode = 'disabled'
41+
cleanUrls: CleanUrlsMode = 'disabled',
42+
siteConfig: SiteConfig | null = null
4143
) {
4244
const md = await createMarkdownRenderer(srcDir, options, base)
4345
pages = pages.map((p) => slash(p.replace(/\.md$/, '')))
@@ -131,7 +133,7 @@ export async function createMarkdownToVueRenderFn(
131133
}
132134
}
133135

134-
const pageData: PageData = {
136+
let pageData: PageData = {
135137
title: inferTitle(md, frontmatter, title),
136138
titleTemplate: frontmatter.titleTemplate as any,
137139
description: inferDescription(frontmatter),
@@ -144,6 +146,16 @@ export async function createMarkdownToVueRenderFn(
144146
pageData.lastUpdated = await getGitTimestamp(file)
145147
}
146148

149+
if (siteConfig?.transformPageData) {
150+
const dataToMerge = await siteConfig.transformPageData(pageData)
151+
if (dataToMerge) {
152+
pageData = {
153+
...pageData,
154+
...dataToMerge
155+
}
156+
}
157+
}
158+
147159
const vueSrc = [
148160
...injectPageDataCode(
149161
sfcBlocks?.scripts.map((item) => item.content) ?? [],

src/node/plugin.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ export async function createVitePressPlugin(
9595
config.command === 'build',
9696
config.base,
9797
lastUpdated,
98-
cleanUrls
98+
cleanUrls,
99+
siteConfig
99100
)
100101
},
101102

0 commit comments

Comments
 (0)