diff --git a/src/config/vite.ts b/src/config/vite.ts index ee2e9d9f..695f70d1 100644 --- a/src/config/vite.ts +++ b/src/config/vite.ts @@ -1,3 +1,4 @@ +import upath from 'upath'; import { ConfigEnv, createLogger, @@ -24,10 +25,16 @@ export async function resolveViteConfig({ viteConfig, viteConfigFile, logLevel, + workspaceDir, mode, }: Pick< ResolvedTaskConfig, - 'context' | 'server' | 'viteConfig' | 'viteConfigFile' | 'logLevel' + | 'context' + | 'server' + | 'viteConfig' + | 'viteConfigFile' + | 'logLevel' + | 'workspaceDir' > & { mode: 'preview' | 'build'; }): Promise { @@ -69,6 +76,7 @@ export async function resolveViteConfig({ configFile: viteConfigFile === true ? undefined : viteConfigFile, root: context, customLogger: viteLogger, + cacheDir: upath.join(workspaceDir, '.vite'), } satisfies InlineConfig); return await resolveConfig( finalUserConfig, diff --git a/src/server.ts b/src/server.ts index f9f49e71..ba334bd2 100644 --- a/src/server.ts +++ b/src/server.ts @@ -13,7 +13,12 @@ import { ResolvedTaskConfig } from './config/resolve.js'; import { ParsedVivliostyleInlineConfig } from './config/schema.js'; import { EMPTY_DATA_URI, VIEWER_ROOT_PATH } from './const.js'; import { Logger } from './logger.js'; -import { getDefaultEpubOpfPath, isValidUri, openEpub } from './util.js'; +import { + getDefaultEpubOpfPath, + isValidUri, + openEpub, + registerExitHandler, +} from './util.js'; import { vsBrowserPlugin } from './vite/vite-plugin-browser.js'; import { vsDevServerPlugin } from './vite/vite-plugin-dev-server.js'; import { vsStaticServePlugin } from './vite/vite-plugin-static-serve.js'; @@ -206,9 +211,19 @@ export async function createViteServer({ server: viteConfig.server, preview: viteConfig.preview, customLogger: viteConfig.customLogger, + cacheDir: viteConfig.cacheDir, } satisfies InlineConfig; Logger.debug('createViteServer > viteInlineConfig %O', viteInlineConfig); + if (config.context === config.workspaceDir) { + const { cacheDir } = viteInlineConfig; + registerExitHandler('Removing the Vite cacheDir', () => { + if (fs.existsSync(cacheDir)) { + fs.rmSync(cacheDir, { recursive: true }); + } + }); + } + if (mode === 'preview') { return await createServer(viteInlineConfig); } else { diff --git a/tests/global-setup/clean.ts b/tests/global-setup/clean.ts index 7922b4b5..35baf315 100644 --- a/tests/global-setup/clean.ts +++ b/tests/global-setup/clean.ts @@ -3,6 +3,8 @@ import { glob } from 'tinyglobby'; const tmpFilePatterns = [ 'tests/fixtures/**/.vs-*', + 'tests/fixtures/**/.vite', + 'tests/fixtures/config/**/vvv.*', 'tests/fixtures/cover/publication.json', 'tests/fixtures/toc/publication.json', ]; @@ -14,7 +16,9 @@ export default function clean() { dot: true, }); for (const file of files) { - fs.rmSync(file, { recursive: true }); + if (fs.existsSync(file)) { + fs.rmSync(file, { recursive: true }); + } } }; }