@@ -17,7 +17,11 @@ import {
1717 toArray ,
1818} from './utils' ;
1919import { Page , ResolvedConfig , Route } from './types' ;
20- import { PAGE_EXTS , RESOLVED_ROUTES_MODULE_ID } from './constants' ;
20+ import {
21+ PAGE_EXTS ,
22+ RESOLVED_PAGES_DATA_MODULE_ID ,
23+ RESOLVED_ROUTES_MODULE_ID ,
24+ } from './constants' ;
2125import { generateWithPreloadCode } from './withPreload' ;
2226
2327/**
@@ -220,11 +224,14 @@ export class PagesService extends EventEmitter {
220224 return ;
221225 }
222226
223- const mods = this . _server . moduleGraph . getModulesByFile (
224- RESOLVED_ROUTES_MODULE_ID
225- ) ;
227+ const mods = [
228+ RESOLVED_ROUTES_MODULE_ID ,
229+ RESOLVED_PAGES_DATA_MODULE_ID ,
230+ ] . flatMap ( id => [
231+ ...( this . _server ?. moduleGraph . getModulesByFile ( id ) || [ ] ) ,
232+ ] ) ;
226233
227- if ( mods ) {
234+ if ( mods . length ) {
228235 const seen = new Set < ModuleNode > ( ) ;
229236 mods . forEach ( mod => {
230237 this . _server ?. moduleGraph . invalidateModule ( mod , seen ) ;
@@ -277,18 +284,19 @@ export class PagesService extends EventEmitter {
277284 return page ;
278285 }
279286
280- getPages ( ) {
281- return this . _pages ;
282- }
283-
284- async createRoutes ( basePath : string ) : Promise < Route [ ] > {
287+ async getPages ( ) {
285288 if ( ! this . _startPromise ) {
286289 throw new Error ( 'PagesService is not started yet' ) ;
287290 }
288291
289292 await this . _startPromise ;
293+ return this . _pages ;
294+ }
290295
291- let pages = this . _pages . filter ( page => page . basePath === basePath ) ;
296+ async createRoutes ( basePath : string ) : Promise < Route [ ] > {
297+ let pages = ( await this . getPages ( ) ) . filter (
298+ page => page . basePath === basePath
299+ ) ;
292300 // run hook: onCreatePages
293301 pages = ( await this . config . onCreatePages ?.( pages ) ) || pages ;
294302
@@ -389,4 +397,23 @@ export default routes;
389397
390398 return routesCode ;
391399 }
400+
401+ async generatePagesDataCode ( ) {
402+ const pagesData = ( await this . getPages ( ) ) . reduce < Record < string , Page > > (
403+ ( res , page ) => {
404+ // skip layout file and 404 file
405+ if ( page . isLayout || page . is404 ) {
406+ return res ;
407+ }
408+
409+ res [ page . routePath ] = page ;
410+ return res ;
411+ } ,
412+ { }
413+ ) ;
414+
415+ return `export const pagesData = ${ JSON . stringify ( pagesData , null , 2 ) } ;
416+ export default pagesData;
417+ ` ;
418+ }
392419}
0 commit comments