Skip to content

Commit 96fb348

Browse files
committed
fix: run type gen when content/ dir added in dev
1 parent e653360 commit 96fb348

1 file changed

Lines changed: 28 additions & 27 deletions

File tree

packages/astro/src/content/vite-plugin-content-server.ts

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { pathToFileURL } from 'node:url';
55
import type { Plugin } from 'vite';
66
import type { AstroSettings } from '../@types/astro.js';
77
import { info, LogOptions } from '../core/logger/core.js';
8+
import { appendForwardSlash } from '../core/path.js';
89
import { escapeViteEnvReferences, getFileInfo } from '../vite-plugin-utils/index.js';
910
import { contentFileExts, CONTENT_FLAG } from './consts.js';
1011
import { 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

Comments
 (0)