From feafa4c5f31487e784e221ec383451c40ef45370 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Tue, 24 May 2022 16:08:04 +0800 Subject: [PATCH] fix: improve dts writing to prevent loops --- playground/package.json | 3 ++- src/core/ctx.ts | 41 ++++++++++++++++++++++++++++++++--------- src/core/unplugin.ts | 3 +++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/playground/package.json b/playground/package.json index c981560..ee26d16 100644 --- a/playground/package.json +++ b/playground/package.json @@ -1,7 +1,8 @@ { "private": true, "scripts": { - "dev": "vite --open" + "dev": "vite --open", + "build": "vite build" }, "dependencies": { "@vueuse/core": "^8.5.0", diff --git a/src/core/ctx.ts b/src/core/ctx.ts index 6baa6e4..2fdb2c5 100644 --- a/src/core/ctx.ts +++ b/src/core/ctx.ts @@ -4,6 +4,7 @@ import { slash, throttle, toArray } from '@antfu/utils' import { createFilter } from '@rollup/pluginutils' import { isPackageExists } from 'local-pkg' import type { Import } from 'unimport' +// @ts-expect-error types import { vueTemplateAddon } from 'unimport/addons' import { createUnimport, scanDirExports } from 'unimport' import MagicString from 'magic-string' @@ -73,12 +74,32 @@ export function createContext(options: Options = {}, root = process.cwd()) { }) } - const writeConfigFiles = throttle(500, false, () => { - if (dts) - fs.writeFile(dts, generateDTS(dts), 'utf-8') - if (eslintrc.enabled && eslintrc.filepath) - fs.writeFile(eslintrc.filepath, generateESLintConfigs(unimport.getImports(), eslintrc), 'utf-8') - }) + function generateESLint() { + return generateESLintConfigs(unimport.getImports(), eslintrc) + } + + const writeConfigFilesThrottled = throttle(500, false, writeConfigFiles) + + let lastDTS: string | undefined + let lastESLint: string | undefined + function writeConfigFiles() { + const promises: any[] = [] + if (dts) { + const content = generateDTS(dts) + if (content !== lastDTS) { + lastDTS = content + promises.push(fs.writeFile(dts, generateDTS(dts), 'utf-8')) + } + } + if (eslintrc.enabled && eslintrc.filepath) { + const content = generateESLint() + if (content !== lastESLint) { + lastESLint = content + promises.push(fs.writeFile(eslintrc.filepath, content, 'utf-8')) + } + } + return Promise.all(promises) + } async function scanDirs() { if (dirs?.length) { @@ -91,7 +112,7 @@ export function createContext(options: Options = {}, root = process.cwd()) { ] as Import[] }) } - writeConfigFiles() + writeConfigFilesThrottled() } async function transform(code: string, id: string) { @@ -102,7 +123,7 @@ export function createContext(options: Options = {}, root = process.cwd()) { if (!s.hasChanged()) return - writeConfigFiles() + writeConfigFilesThrottled() return { code: s.toString(), @@ -118,9 +139,11 @@ export function createContext(options: Options = {}, root = process.cwd()) { dirs, filter, scanDirs, - generateConfigFiles: writeConfigFiles, + writeConfigFiles, + writeConfigFilesThrottled, transform, generateDTS, + generateESLint, } } diff --git a/src/core/unplugin.ts b/src/core/unplugin.ts index 9f27f6b..9c855cc 100644 --- a/src/core/unplugin.ts +++ b/src/core/unplugin.ts @@ -16,6 +16,9 @@ export default createUnplugin((options) => { async buildStart() { await ctx.scanDirs() }, + async buildEnd() { + await ctx.writeConfigFiles() + }, vite: { async handleHotUpdate({ file }) { if (ctx.dirs?.some(dir => file.startsWith(dir)))