@@ -5,6 +5,7 @@ import { pathToFileURL } from 'node:url';
55import type { Plugin } from 'vite' ;
66import type { AstroSettings } from '../@types/astro.js' ;
77import { info , LogOptions } from '../core/logger/core.js' ;
8+ import { appendForwardSlash } from '../core/path.js' ;
89import { escapeViteEnvReferences , getFileInfo } from '../vite-plugin-utils/index.js' ;
910import { contentFileExts , CONTENT_FLAG } from './consts.js' ;
1011import { createContentTypesGenerator , getEntryType } from './types-generator.js' ;
@@ -32,56 +33,56 @@ export function astroContentServerPlugin({
3233 mode,
3334} : AstroContentServerPluginParams ) : Plugin [ ] {
3435 const contentPaths = getContentPaths ( settings . config ) ;
35- let contentDirExists = false ;
36- let contentGenerator : Awaited < ReturnType < typeof createContentTypesGenerator > > ;
3736 const contentConfigObserver = contentObservable ( { status : 'loading' } ) ;
3837
38+ async function initContentGenerator ( ) {
39+ const contentGenerator = await createContentTypesGenerator ( {
40+ fs,
41+ settings,
42+ logging,
43+ contentConfigObserver,
44+ } ) ;
45+ await contentGenerator . init ( ) ;
46+ return contentGenerator ;
47+ }
48+
3949 return [
4050 {
4151 name : 'astro-content-server-plugin' ,
4252 async config ( viteConfig ) {
43- try {
44- await fs . promises . stat ( contentPaths . contentDir ) ;
45- contentDirExists = true ;
46- } catch {
47- /* silently move on */
48- return ;
49- }
50-
51- if ( contentDirExists && ( mode === 'dev' || viteConfig . build ?. ssr === true ) ) {
52- contentGenerator = await createContentTypesGenerator ( {
53- fs,
54- settings,
55- logging,
56- contentConfigObserver,
57- } ) ;
58- await contentGenerator . init ( ) ;
59- info ( logging , 'content' , 'Types generated' ) ;
53+ // Production build type gen
54+ if ( fs . existsSync ( contentPaths . contentDir ) && viteConfig . build ?. ssr === true ) {
55+ await initContentGenerator ( ) ;
6056 }
6157 } ,
6258 async configureServer ( viteServer ) {
6359 if ( mode !== 'dev' ) return ;
6460
65- if ( contentDirExists ) {
61+ // Dev server type gen
62+ if ( fs . existsSync ( contentPaths . contentDir ) ) {
6663 info (
6764 logging ,
6865 'content' ,
6966 `Watching ${ cyan (
7067 contentPaths . contentDir . href . replace ( settings . config . root . href , '' )
7168 ) } for changes`
7269 ) ;
73- attachListeners ( ) ;
70+ await attachListeners ( ) ;
7471 } else {
75- viteServer . watcher . on ( 'addDir' , ( dir ) => {
76- if ( pathToFileURL ( dir ) . href === contentPaths . contentDir . href ) {
72+ viteServer . watcher . on ( 'addDir' , contentDirListener ) ;
73+ async function contentDirListener ( dir : string ) {
74+ if ( appendForwardSlash ( pathToFileURL ( dir ) . href ) === contentPaths . contentDir . href ) {
7775 info ( logging , 'content' , `Content dir found. Watching for changes` ) ;
78- contentDirExists = true ;
79- attachListeners ( ) ;
76+ await attachListeners ( ) ;
77+ viteServer . watcher . removeListener ( 'addDir' , contentDirListener ) ;
8078 }
81- } ) ;
79+ }
8280 }
8381
84- function attachListeners ( ) {
82+ async function attachListeners ( ) {
83+ const contentGenerator = await initContentGenerator ( ) ;
84+ info ( logging , 'content' , 'Types generated' ) ;
85+
8586 viteServer . watcher . on ( 'add' , ( entry ) => {
8687 contentGenerator . queueEvent ( { name : 'add' , entry } ) ;
8788 } ) ;
0 commit comments