astro-ghostcms/.pnpm-store/v3/files/29/8192983c08dcf4905ad392b5424...

106 lines
3.5 KiB
Plaintext
Raw Normal View History

2024-02-14 14:10:47 +00:00
import { bold, cyan, underline } from "kleur/colors";
import path from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";
import { loadTSConfig } from "../core/config/tsconfig.js";
import { appendForwardSlash } from "../core/path.js";
import { createContentTypesGenerator } from "./types-generator.js";
import { getContentPaths, globalContentConfigObserver } from "./utils.js";
async function attachContentServerListeners({
viteServer,
fs,
logger,
settings
}) {
const contentPaths = getContentPaths(settings.config, fs);
if (fs.existsSync(contentPaths.contentDir)) {
logger.debug(
"content",
`Watching ${cyan(
contentPaths.contentDir.href.replace(settings.config.root.href, "")
)} for changes`
);
const maybeTsConfigStats = await getTSConfigStatsWhenAllowJsFalse({ contentPaths, settings });
if (maybeTsConfigStats)
warnAllowJsIsFalse({ ...maybeTsConfigStats, logger });
await attachListeners();
} else {
viteServer.watcher.on("addDir", contentDirListener);
async function contentDirListener(dir) {
if (appendForwardSlash(pathToFileURL(dir).href) === contentPaths.contentDir.href) {
logger.debug("content", `Content directory found. Watching for changes`);
await attachListeners();
viteServer.watcher.removeListener("addDir", contentDirListener);
}
}
}
async function attachListeners() {
const contentGenerator = await createContentTypesGenerator({
fs,
settings,
logger,
viteServer,
contentConfigObserver: globalContentConfigObserver
});
await contentGenerator.init();
logger.debug("content", "Types generated");
viteServer.watcher.on("add", (entry) => {
contentGenerator.queueEvent({ name: "add", entry });
});
viteServer.watcher.on(
"addDir",
(entry) => contentGenerator.queueEvent({ name: "addDir", entry })
);
viteServer.watcher.on(
"change",
(entry) => contentGenerator.queueEvent({ name: "change", entry })
);
viteServer.watcher.on("unlink", (entry) => {
contentGenerator.queueEvent({ name: "unlink", entry });
});
viteServer.watcher.on(
"unlinkDir",
(entry) => contentGenerator.queueEvent({ name: "unlinkDir", entry })
);
}
}
function warnAllowJsIsFalse({
logger,
tsConfigFileName,
contentConfigFileName
}) {
logger.warn(
"content",
`Make sure you have the ${bold("allowJs")} compiler option set to ${bold(
"true"
)} in your ${bold(tsConfigFileName)} file to have autocompletion in your ${bold(
contentConfigFileName
)} file. See ${underline(
cyan("https://www.typescriptlang.org/tsconfig#allowJs")
)} for more information.`
);
}
async function getTSConfigStatsWhenAllowJsFalse({
contentPaths,
settings
}) {
const isContentConfigJsFile = [".js", ".mjs"].some(
(ext) => contentPaths.config.url.pathname.endsWith(ext)
);
if (!isContentConfigJsFile)
return;
const inputConfig = await loadTSConfig(fileURLToPath(settings.config.root));
if (typeof inputConfig === "string")
return;
const tsConfigFileName = inputConfig.tsconfigFile.split(path.sep).pop();
if (!tsConfigFileName)
return;
const contentConfigFileName = contentPaths.config.url.pathname.split(path.sep).pop();
const allowJSOption = inputConfig.tsconfig.compilerOptions?.allowJs;
if (allowJSOption)
return;
return { tsConfigFileName, contentConfigFileName };
}
export {
attachContentServerListeners
};