From fa5486790fd138f71ebffdaa326c51e515e7d70f Mon Sep 17 00:00:00 2001 From: "Pett, David" Date: Tue, 4 Nov 2025 16:39:58 -0600 Subject: [PATCH] fix: process.exit in writeBundle hook --- src/index.ts | 28 +++++++++++++++------------- vitest.config.ts | 2 ++ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9e4be4d..9cc252a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,20 +17,12 @@ import { getRootDir, getStencilConfigFile, parseTagConfig, transformCompiledCode const DCE_OUTPUT_TARGET_NAME = 'dist-custom-elements' -let compiler: CoreCompiler.Compiler | undefined -let buildQueue: BuildQueue | undefined - -async function cleanup() { - await compiler?.destroy() - compiler = undefined - process.exit(1) -} -process.on('SIGTERM', cleanup) -process.on('SIGINT', cleanup) - export const unpluginFactory: UnpluginFactory = (options = {}) => { const nodeLogger = nodeApi.createNodeLogger() let distCustomElementsOptions: OutputTargetDistCustomElements | undefined + let compiler: CoreCompiler.Compiler | undefined + let buildQueue: BuildQueue | undefined + const isTest = process.env.NODE_ENV === 'test' || process.env.VITEST === 'true' return { name: 'unplugin-stencil', @@ -69,8 +61,18 @@ export const unpluginFactory: UnpluginFactory = (options = buildQueue = new BuildQueue(compiler) }, async buildEnd() { - // ensure the process exits when the build is finished - process.exit(0) + // Clean up compiler resources when build ends + await compiler?.destroy() + compiler = undefined + buildQueue = undefined + + // In test mode, force exit after a short delay to allow cleanup + // This works around Stencil compiler not fully releasing file handles + if (isTest) { + setTimeout(() => { + process.exit(0) + }, 100) + } }, /** * `transformInclude` is called for every file that is being transformed. diff --git a/vitest.config.ts b/vitest.config.ts index 5099a1f..09a2cdf 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,6 +4,7 @@ import stencil from './src/vite' export default defineConfig({ test: { + watch: false, coverage: { enabled: true, include: [ @@ -30,6 +31,7 @@ export default defineConfig({ include: ['**/*.spec.{ts,tsx}'], browser: { enabled: true, + headless: true, provider: 'playwright', instances: [{ browser: 'chromium' }], },