99 type MarkdownOptions ,
1010 type MarkdownRenderer
1111} from './markdown/markdown'
12+ import { getPageDataTransformer } from './plugins/dynamicRoutesPlugin'
1213import {
1314 EXTERNAL_URL_RE ,
1415 getLocaleForPath ,
@@ -31,25 +32,62 @@ export interface MarkdownCompileResult {
3132 includes : string [ ]
3233}
3334
34- export function clearCache ( file ?: string ) {
35- if ( ! file ) {
35+ export function clearCache ( id ?: string ) {
36+ if ( ! id ) {
3637 cache . clear ( )
3738 return
3839 }
3940
40- file = JSON . stringify ( { file } ) . slice ( 1 )
41- cache . find ( ( _ , key ) => key . endsWith ( file ! ) && cache . delete ( key ) )
41+ id = JSON . stringify ( { id } ) . slice ( 1 )
42+ cache . find ( ( _ , key ) => key . endsWith ( id ! ) && cache . delete ( key ) )
43+ }
44+
45+ let __pages : string [ ] = [ ]
46+ let __dynamicRoutes = new Map < string , [ string , string ] > ( )
47+ let __rewrites = new Map < string , string > ( )
48+ let __ts : number
49+
50+ function getResolutionCache ( siteConfig : SiteConfig ) {
51+ // @ts -expect-error internal
52+ if ( siteConfig . __dirty ) {
53+ __pages = siteConfig . pages . map ( ( p ) => slash ( p . replace ( / \. m d $ / , '' ) ) )
54+
55+ __dynamicRoutes = new Map (
56+ siteConfig . dynamicRoutes . map ( ( r ) => [
57+ r . fullPath ,
58+ [ slash ( path . join ( siteConfig . srcDir , r . route ) ) , r . loaderPath ]
59+ ] )
60+ )
61+
62+ __rewrites = new Map (
63+ Object . entries ( siteConfig . rewrites . map ) . map ( ( [ key , value ] ) => [
64+ slash ( path . join ( siteConfig . srcDir , key ) ) ,
65+ slash ( path . join ( siteConfig . srcDir , value ! ) )
66+ ] )
67+ )
68+
69+ __ts = Date . now ( )
70+
71+ // @ts -expect-error internal
72+ siteConfig . __dirty = false
73+ }
74+
75+ return {
76+ pages : __pages ,
77+ dynamicRoutes : __dynamicRoutes ,
78+ rewrites : __rewrites ,
79+ ts : __ts
80+ }
4281}
4382
4483export async function createMarkdownToVueRenderFn (
4584 srcDir : string ,
4685 options : MarkdownOptions = { } ,
47- pages : string [ ] ,
4886 isBuild = false ,
4987 base = '/' ,
5088 includeLastUpdatedData = false ,
5189 cleanUrls = false ,
52- siteConfig : SiteConfig | null = null
90+ siteConfig : SiteConfig
5391) {
5492 const md = await createMarkdownRenderer (
5593 srcDir ,
@@ -58,32 +96,30 @@ export async function createMarkdownToVueRenderFn(
5896 siteConfig ?. logger
5997 )
6098
61- pages = pages . map ( ( p ) => slash ( p . replace ( / \. m d $ / , '' ) ) )
62-
63- const dynamicRoutes = new Map (
64- siteConfig ?. dynamicRoutes ?. routes . map ( ( r ) => [
65- r . fullPath ,
66- slash ( path . join ( srcDir , r . route ) )
67- ] ) || [ ]
68- )
69-
70- const rewrites = new Map (
71- Object . entries ( siteConfig ?. rewrites . map || { } ) . map ( ( [ key , value ] ) => [
72- slash ( path . join ( srcDir , key ) ) ,
73- slash ( path . join ( srcDir , value ! ) )
74- ] ) || [ ]
75- )
76-
7799 return async (
78100 src : string ,
79101 file : string ,
80102 publicDir : string
81103 ) : Promise < MarkdownCompileResult > => {
82- const fileOrig = dynamicRoutes . get ( file ) || file
104+ const { pages, dynamicRoutes, rewrites, ts } =
105+ getResolutionCache ( siteConfig )
106+
107+ const dynamicRoute = dynamicRoutes . get ( file )
108+ const fileOrig = dynamicRoute ?. [ 0 ] || file
109+ const transformPageData = [
110+ siteConfig ?. transformPageData ,
111+ getPageDataTransformer ( dynamicRoute ?. [ 1 ] ! )
112+ ] . filter ( ( fn ) => fn != null )
113+
83114 file = rewrites . get ( file ) || file
84115 const relativePath = slash ( path . relative ( srcDir , file ) )
85116
86- const cacheKey = JSON . stringify ( { src, file : relativePath } )
117+ const cacheKey = JSON . stringify ( {
118+ src,
119+ ts,
120+ file : relativePath ,
121+ id : fileOrig
122+ } )
87123 if ( isBuild || options . cache !== false ) {
88124 const cached = cache . get ( cacheKey )
89125 if ( cached ) {
@@ -205,14 +241,14 @@ export async function createMarkdownToVueRenderFn(
205241 }
206242 }
207243
208- if ( siteConfig ?. transformPageData ) {
209- const dataToMerge = await siteConfig . transformPageData ( pageData , {
210- siteConfig
211- } )
212- if ( dataToMerge ) {
213- pageData = {
214- ...pageData ,
215- ... dataToMerge
244+ for ( const fn of transformPageData ) {
245+ if ( fn ) {
246+ const dataToMerge = await fn ( pageData , { siteConfig } )
247+ if ( dataToMerge ) {
248+ pageData = {
249+ ... pageData ,
250+ ...dataToMerge
251+ }
216252 }
217253 }
218254 }
@@ -318,10 +354,7 @@ const inferDescription = (frontmatter: Record<string, any>) => {
318354 return ( head && getHeadMetaContent ( head , 'description' ) ) || ''
319355}
320356
321- const getHeadMetaContent = (
322- head : HeadConfig [ ] ,
323- name : string
324- ) : string | undefined => {
357+ const getHeadMetaContent = ( head : HeadConfig [ ] , name : string ) => {
325358 if ( ! head || ! head . length ) {
326359 return undefined
327360 }
0 commit comments