From b4b37efd2ded0cb9c67eb6312f0087800baf02df Mon Sep 17 00:00:00 2001 From: zthxxx Date: Tue, 16 Dec 2025 23:10:00 +0800 Subject: [PATCH] fix(plugin-dts): follow `lib.dts.abortOnError` when generating dts - pass `abortOnError` through dts pipeline (tsc/tsgo) instead of always failing - allow bundling to proceed when `abortOnError` is `false` despite diagnostics --- packages/plugin-dts/src/dts.ts | 4 +++- packages/plugin-dts/src/tsc.ts | 21 ++++++++++++++------- packages/plugin-dts/src/tsgo.ts | 5 ++++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/plugin-dts/src/dts.ts b/packages/plugin-dts/src/dts.ts index f16d50be8..41adec46f 100644 --- a/packages/plugin-dts/src/dts.ts +++ b/packages/plugin-dts/src/dts.ts @@ -122,6 +122,7 @@ export const calcBundledPackages = (options: { export async function generateDts(data: DtsGenOptions): Promise { const { bundle, + abortOnError, dtsEntry, dtsEmitPath, tsconfigPath, @@ -269,6 +270,7 @@ export async function generateDts(data: DtsGenOptions): Promise { tsConfigResult, declarationDir, dtsExtension, + abortOnError, redirect, rootDir, paths, @@ -282,7 +284,7 @@ export async function generateDts(data: DtsGenOptions): Promise { ); if (tsgo) { - if (!hasError) { + if (!hasError || !abortOnError) { await bundleDtsIfNeeded(); } } else { diff --git a/packages/plugin-dts/src/tsc.ts b/packages/plugin-dts/src/tsc.ts index 521ecbb37..e45c4dfa0 100644 --- a/packages/plugin-dts/src/tsc.ts +++ b/packages/plugin-dts/src/tsc.ts @@ -28,6 +28,7 @@ const formatHost: FormatDiagnosticsHost = { }; export type EmitDtsOptions = { + abortOnError: boolean | undefined; name: string; cwd: string; configPath: string; @@ -42,6 +43,7 @@ export type EmitDtsOptions = { }; async function handleDiagnosticsAndProcessFiles( + abortOnError: boolean | undefined, diagnostics: readonly Diagnostic[], configPath: string, bundle: boolean, @@ -81,12 +83,14 @@ async function handleDiagnosticsAndProcessFiles( logger.error(logPrefixTsc, message); } - const error = new Error( - `Failed to generate declaration files. ${color.dim(`(${name})`)}`, - ); - // do not log the stack trace, diagnostic messages are enough - error.stack = ''; - throw error; + if (abortOnError) { + const error = new Error( + `Failed to generate declaration files. ${color.dim(`(${name})`)}`, + ); + // do not log the stack trace, diagnostic messages are enough + error.stack = ''; + throw error; + } } } @@ -99,6 +103,7 @@ export async function emitDtsTsc( ): Promise { const start = Date.now(); const { + abortOnError, configPath, tsConfigResult, declarationDir, @@ -252,6 +257,7 @@ export async function emitDtsTsc( ts.sortAndDeduplicateDiagnostics(allDiagnostics); await handleDiagnosticsAndProcessFiles( + abortOnError, sortAndDeduplicateDiagnostics, configPath, bundle, @@ -322,6 +328,7 @@ export async function emitDtsTsc( ts.sortAndDeduplicateDiagnostics(allDiagnostics); await handleDiagnosticsAndProcessFiles( + abortOnError, sortAndDeduplicateDiagnostics, configPath, bundle, @@ -370,7 +377,7 @@ export async function emitDtsTsc( footer, ); - if (errorNumber > 0) { + if (errorNumber > 0 && abortOnError) { const error = new Error( `Failed to generate declaration files. ${color.dim(`(${name})`)}`, ); diff --git a/packages/plugin-dts/src/tsgo.ts b/packages/plugin-dts/src/tsgo.ts index 0831ff513..a83dd821c 100644 --- a/packages/plugin-dts/src/tsgo.ts +++ b/packages/plugin-dts/src/tsgo.ts @@ -74,6 +74,7 @@ const generateTsgoArgs = ( }; async function handleDiagnosticsAndProcessFiles( + abortOnError: boolean | undefined, isWatch: boolean, hasErrors: boolean, tsConfigResult: ts.ParsedCommandLine, @@ -124,7 +125,7 @@ async function handleDiagnosticsAndProcessFiles( footer, ); - if (hasErrors && !isWatch) { + if (hasErrors && !isWatch && abortOnError) { const error = new Error( `Failed to generate declaration files. ${color.dim(`(${name})`)}`, ); @@ -143,6 +144,7 @@ export async function emitDtsTsgo( ): Promise { const start = Date.now(); const { + abortOnError, configPath, tsConfigResult, declarationDir, @@ -203,6 +205,7 @@ export async function emitDtsTsgo( } await handleDiagnosticsAndProcessFiles( + abortOnError, isWatch, hasErrors, tsConfigResult,