From 479b984a27d685354aeba1c8e8f0df9eba62a847 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Thu, 30 Jul 2026 04:06:11 +0530 Subject: [PATCH] refactor(build): use async fs in build entry Replace the remaining sync writes and the tempDir removal in build()/generateMetadataScript() with fs/promises, and switch linkVue to the async packageDirectory lookup with an async unlink. Co-Authored-By: Claude Fable 5 --- src/node/build/build.ts | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/node/build/build.ts b/src/node/build/build.ts index e88deea0..949ca81d 100644 --- a/src/node/build/build.ts +++ b/src/node/build/build.ts @@ -1,10 +1,11 @@ import { getIconsCSS } from '@iconify/utils' import { createHash } from 'node:crypto' import fs from 'node:fs' +import { mkdir, rm, symlink, unlink, writeFile } from 'node:fs/promises' import { createRequire } from 'node:module' import path from 'node:path' import pMap from 'p-map' -import { packageDirectorySync } from 'package-directory' +import { packageDirectory } from 'package-directory' import type { BuildOptions, Rolldown } from 'vite' import { resolveConfig, type SiteConfig } from '../config' import { clearCache } from '../markdownToVue' @@ -35,7 +36,7 @@ export async function build( await buildOptions.onAfterConfigResolve?.(siteConfig) delete buildOptions.onAfterConfigResolve - const unlinkVue = linkVue() + const unlinkVue = await linkVue() if (buildOptions.base) { siteConfig.site.base = buildOptions.base @@ -105,7 +106,10 @@ export async function build( // ---- const additionalHeadTags: HeadConfig[] = [] - const metadataScript = generateMetadataScript(pageToHashMap, siteConfig) + const metadataScript = await generateMetadataScript( + pageToHashMap, + siteConfig + ) if (isDefaultTheme) { const fontURL = assets.find((file) => @@ -156,19 +160,19 @@ export async function build( mode: 'mask' }).replace(/[^]*?}\n*/, '') - fs.writeFileSync(path.join(siteConfig.outDir, 'vp-icons.css'), iconsCss) + await writeFile(path.join(siteConfig.outDir, 'vp-icons.css'), iconsCss) }) // emit page hash map for the case where a user session is open // when the site got redeployed (which invalidates current hash map) - fs.writeFileSync( + await writeFile( path.join(siteConfig.outDir, 'hashmap.json'), JSON.stringify(pageToHashMap) ) } finally { - unlinkVue() + await unlinkVue() if (!process.env.DEBUG) { - fs.rmSync(siteConfig.tempDir, { + await rm(siteConfig.tempDir, { recursive: true, force: true, maxRetries: 10 @@ -185,27 +189,25 @@ export async function build( ) } -function linkVue() { - const root = packageDirectorySync() +async function linkVue() { + const root = await packageDirectory() if (root) { const dest = path.resolve(root, 'node_modules/vue') // if user did not install vue by themselves, link VitePress' version if (!fs.existsSync(dest)) { const src = path.dirname(createRequire(import.meta.url).resolve('vue')) - fs.mkdirSync(path.dirname(dest), { recursive: true }) - fs.symlinkSync(src, dest, 'junction') - return () => { - fs.unlinkSync(dest) - } + await mkdir(path.dirname(dest), { recursive: true }) + await symlink(src, dest, 'junction') + return () => unlink(dest) } } - return () => {} + return async () => {} } -function generateMetadataScript( +async function generateMetadataScript( pageToHashMap: Record, config: SiteConfig -) { +): Promise<{ html: string; inHead: boolean }> { if (config.mpa) { return { html: '', inHead: false } } @@ -237,8 +239,8 @@ function generateMetadataScript( const resolvedMetadataFile = path.join(config.outDir, metadataFile) const metadataFileURL = slash(`${config.site.base}${metadataFile}`) - fs.mkdirSync(path.dirname(resolvedMetadataFile), { recursive: true }) - fs.writeFileSync(resolvedMetadataFile, metadataContent) + await mkdir(path.dirname(resolvedMetadataFile), { recursive: true }) + await writeFile(resolvedMetadataFile, metadataContent) return { html: ``,