@@ -7,18 +7,19 @@ import { prerender } from '../utils/prerender.js';
7
7
import packageJson from '../../../../package.json' with { type : 'json' } ;
8
8
import {
9
9
getVirtualParams ,
10
- invalidateEmbodiModule ,
11
10
invalidateStoredCollection ,
12
11
isHotUpdate ,
13
- isValidLoadId ,
12
+ prepareIdValidator ,
13
+ resolvePipe ,
14
14
storeLoadId ,
15
- validateResolveId
16
15
} from '../utils/virtuals.js' ;
17
16
import { loadAppHtml , loadData } from '../code-builder/load-data.js' ;
18
17
import {
19
18
generateContentMap ,
19
+ generatePageCode ,
20
20
generatePageImportCode ,
21
- generateRoutesCode
21
+ generateRoutesCode ,
22
+ VIRTUAL_PAGE_PREFIX
22
23
} from '../code-builder/load-content.js' ;
23
24
import { type ServerResponse } from 'node:http' ;
24
25
import { generateCollectionsImportsCode } from '../code-builder/collections.js' ;
@@ -29,6 +30,9 @@ import { generateInternalStores, generateReadableStores } from '../code-builder/
29
30
const cwd = process . cwd ( ) ; // Current working directory
30
31
const cf = resolve ( dirname ( fileURLToPath ( import . meta. url ) ) , '..' ) ; // core folder
31
32
33
+ const validateEmbodiId = prepareIdValidator ( '$embodi/' ) ;
34
+ const validatePageId = prepareIdValidator ( VIRTUAL_PAGE_PREFIX ) ;
35
+
32
36
export const configPlugin = ( ) : Plugin =>
33
37
( {
34
38
name : 'embodi-config-plugin' ,
@@ -69,57 +73,65 @@ export const virtualPlugin = (): Plugin =>
69
73
( {
70
74
name : 'embodi-virtual-plugin' ,
71
75
async resolveId ( id ) {
72
- return validateResolveId (
73
- id ,
74
- 'pages' ,
75
- 'paths' ,
76
- 'data' ,
77
- 'collections' ,
78
- 'hooks' ,
79
- 'env' ,
80
- 'stores' ,
81
- 'stores/internal'
82
- ) ;
76
+ return resolvePipe (
77
+ validatePageId . resolve ( id ) ,
78
+ validateEmbodiId . resolve (
79
+ id ,
80
+ 'pages' ,
81
+ 'paths' ,
82
+ 'data' ,
83
+ 'collections' ,
84
+ 'hooks' ,
85
+ 'env' ,
86
+ 'stores' ,
87
+ 'stores/internal'
88
+ )
89
+ )
83
90
} ,
84
91
async load ( id , options ) {
85
- if ( isValidLoadId ( id , 'pages' ) ) {
92
+ if ( validatePageId . load ( id ) ) {
93
+ const config = await loadConfig ( cwd ) ;
94
+ const pageMap = await generateContentMap ( config . inputDirs ) ;
95
+ const pageCode = await generatePageCode ( ...pageMap , validatePageId . getPath ( id ) ) ;
96
+ return pageCode ;
97
+ } else if ( validateEmbodiId . load ( id , 'pages' ) ) {
86
98
const config = await loadConfig ( cwd ) ;
87
99
const contentMap = await generateContentMap ( config . inputDirs ) ;
88
100
const pagesCode = await generatePageImportCode ( ...contentMap ) ;
89
101
const routesCode = await generateRoutesCode ( config . inputDirs ) ;
90
- return `${ pagesCode } \n${ routesCode } \nexport const source = "${ config . inputDirs . content } ";` ;
91
- } else if ( isValidLoadId ( id , 'paths' ) ) {
102
+ return `${ pagesCode } \n${ routesCode } \nexport const source = "${ config . inputDirs . content } ";export const VIRTUAL_PREFIX = " ${ VIRTUAL_PAGE_PREFIX } "; ` ;
103
+ } else if ( validateEmbodiId . load ( id , 'paths' ) ) {
92
104
const { statics } = await loadConfig ( cwd ) ;
93
105
const relativPathToClientEntry = relative ( cwd , resolve ( cf , '../app/entry-client.js' ) ) ;
94
106
95
107
return `export const entryClient = "${ relativPathToClientEntry } "; export const statics = "${ statics } ";` ;
96
- } else if ( isValidLoadId ( id , 'data' ) ) {
108
+ } else if ( validateEmbodiId . load ( id , 'data' ) ) {
97
109
const projectConfig = await loadConfig ( cwd ) ;
98
110
99
111
const dataDirectoryPath = projectConfig . inputDirs . data ;
100
112
const data = await loadData ( dataDirectoryPath ) ;
101
113
return `export const data = ${ JSON . stringify ( data ) } ;` ;
102
- } else if ( isValidLoadId ( id , 'collections' ) ) {
114
+ } else if ( validateEmbodiId . load ( id , 'collections' ) ) {
103
115
storeLoadId ( 'collections' , id ) ;
104
116
const params = getVirtualParams ( id ) ;
105
117
106
118
return await generateCollectionsImportsCode ( {
107
119
...params ,
108
120
only : params . only ? params . only . split ( ';' ) : undefined
109
121
} ) ;
110
- } else if ( isValidLoadId ( id , 'hooks' ) ) {
122
+ } else if ( validateEmbodiId . load ( id , 'hooks' ) ) {
111
123
return generateHooksCode ( ) ;
112
- } else if ( isValidLoadId ( id , 'env' ) ) {
124
+ } else if ( validateEmbodiId . load ( id , 'env' ) ) {
113
125
return `export const browser = ${ JSON . stringify ( ! options ?. ssr ) } ;` ;
114
- } else if ( isValidLoadId ( id , 'stores/internal' ) ) {
126
+ } else if ( validateEmbodiId . load ( id , 'stores/internal' ) ) {
115
127
return generateInternalStores ( ) ;
116
- } else if ( isValidLoadId ( id , 'stores' ) ) {
128
+ } else if ( validateEmbodiId . load ( id , 'stores' ) ) {
117
129
return generateReadableStores ( '$embodi/stores/internal' ) ;
118
130
}
119
131
} ,
120
132
async handleHotUpdate ( { server, file } ) {
121
133
if ( await isHotUpdate ( file , 'data' ) ) {
122
- await invalidateEmbodiModule ( server , 'data' ) ;
134
+ await validateEmbodiId . invalidate ( server , 'data' ) ;
123
135
server . ws . send ( {
124
136
type : 'full-reload'
125
137
} ) ;
@@ -134,8 +146,8 @@ export const virtualPlugin = (): Plugin =>
134
146
// Invalidate pages and paths when content changes
135
147
server . watcher . on ( 'add' , async ( file : string ) => {
136
148
if ( await isHotUpdate ( file , 'content' ) ) {
137
- await invalidateEmbodiModule ( server , 'pages' ) ;
138
- await invalidateEmbodiModule ( server , 'paths' ) ;
149
+ await validateEmbodiId . invalidate ( server , 'pages' ) ;
150
+ await validateEmbodiId . invalidate ( server , 'paths' ) ;
139
151
}
140
152
} ) ;
141
153
}
0 commit comments