rsbuild-plugin-dts
Version:
Rsbuild plugin that supports emitting declaration files for TypeScript.
121 lines (120 loc) • 8.49 kB
JavaScript
import * as __WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__ from "@rsbuild/core";
import * as __WEBPACK_EXTERNAL_MODULE_picocolors__ from "picocolors";
import * as __WEBPACK_EXTERNAL_MODULE_typescript__ from "typescript";
import * as __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__ from "./utils.js";
async function handleDiagnosticsAndProcessFiles(diagnostics, configPath, host, bundle, declarationDir, dtsExtension, redirect, rootDir, banner, footer, name) {
const diagnosticMessages = [];
for (const diagnostic of diagnostics){
const fileLoc = (0, __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__.getFileLoc)(diagnostic, configPath);
const message = `${fileLoc} - ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].red('error')} ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].gray(`TS${diagnostic.code}:`)} ${__WEBPACK_EXTERNAL_MODULE_typescript__["default"].flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine())}`;
diagnosticMessages.push(message);
}
await (0, __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__.processDtsFiles)(bundle, declarationDir, dtsExtension, redirect, configPath, rootDir, banner, footer);
if (diagnosticMessages.length) {
__WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.error(`Failed to emit declaration files. ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].gray(`(${name})`)}`);
for (const message of diagnosticMessages)__WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.error(message);
throw new Error('DTS generation failed');
}
}
async function emitDts(options, onComplete, bundle = false, isWatch = false, build = false) {
const start = Date.now();
const { configPath, tsConfigResult, declarationDir, name, dtsExtension, rootDir, banner, footer, redirect } = options;
const { options: rawCompilerOptions, fileNames, projectReferences } = tsConfigResult;
const compilerOptions = {
...rawCompilerOptions,
configFilePath: configPath,
noEmit: false,
declaration: true,
declarationDir,
emitDeclarationOnly: true
};
const createProgram = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createSemanticDiagnosticsBuilderProgram;
const formatHost = {
getCanonicalFileName: (path)=>path,
getCurrentDirectory: __WEBPACK_EXTERNAL_MODULE_typescript__["default"].sys.getCurrentDirectory,
getNewLine: ()=>__WEBPACK_EXTERNAL_MODULE_typescript__["default"].sys.newLine
};
const reportDiagnostic = (diagnostic)=>{
const fileLoc = (0, __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__.getFileLoc)(diagnostic, configPath);
__WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.error(`${fileLoc} - ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].red('error')} ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].gray(`TS${diagnostic.code}:`)}`, __WEBPACK_EXTERNAL_MODULE_typescript__["default"].flattenDiagnosticMessageText(diagnostic.messageText, formatHost.getNewLine()));
};
const reportWatchStatusChanged = async (diagnostic, _newLine, _options, errorCount)=>{
const message = `${__WEBPACK_EXTERNAL_MODULE_typescript__["default"].flattenDiagnosticMessageText(diagnostic.messageText, formatHost.getNewLine())} ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].gray(`(${name})`)}`;
if (6031 === diagnostic.code || 6032 === diagnostic.code) __WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.info(message);
if (6194 === diagnostic.code) {
if (0 !== errorCount && errorCount) __WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.error(message);
else {
__WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.info(message);
onComplete(true);
}
await (0, __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__.processDtsFiles)(bundle, declarationDir, dtsExtension, redirect, configPath, rootDir, banner, footer);
}
if (6193 === diagnostic.code) {
__WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.error(message);
await (0, __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__.processDtsFiles)(bundle, declarationDir, dtsExtension, redirect, configPath, rootDir, banner, footer);
}
};
const system = {
...__WEBPACK_EXTERNAL_MODULE_typescript__["default"].sys
};
if (isWatch) {
if (build) {
const host = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createSolutionBuilderWithWatchHost(system, createProgram, reportDiagnostic, void 0, reportWatchStatusChanged);
const solutionBuilder = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createSolutionBuilderWithWatch(host, [
configPath
], compilerOptions, {
watch: true
});
solutionBuilder.build();
} else {
const host = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createWatchCompilerHost(configPath, compilerOptions, system, createProgram, reportDiagnostic, reportWatchStatusChanged);
__WEBPACK_EXTERNAL_MODULE_typescript__["default"].createWatchProgram(host);
}
} else {
if (build || compilerOptions.composite) {
if (!build && compilerOptions.composite) {
const host = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createIncrementalCompilerHost(compilerOptions);
const program = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createIncrementalProgram({
rootNames: fileNames,
options: compilerOptions,
configFileParsingDiagnostics: __WEBPACK_EXTERNAL_MODULE_typescript__["default"].getConfigFileParsingDiagnostics(tsConfigResult),
projectReferences,
host,
createProgram
});
program.emit();
const allDiagnostics = program.getSemanticDiagnostics().concat(program.getConfigFileParsingDiagnostics());
await handleDiagnosticsAndProcessFiles(allDiagnostics, configPath, host, bundle, declarationDir, dtsExtension, redirect, rootDir, banner, footer, name);
} else {
let errorNumber = 0;
const reportErrorSummary = (errorCount)=>{
errorNumber = errorCount;
};
const host = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createSolutionBuilderHost(system, createProgram, reportDiagnostic, void 0, reportErrorSummary);
const solutionBuilder = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createSolutionBuilder(host, [
configPath
], compilerOptions);
solutionBuilder.build();
await (0, __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__.processDtsFiles)(bundle, declarationDir, dtsExtension, redirect, configPath, rootDir, banner, footer);
if (errorNumber > 0) {
__WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.error(`Failed to emit declaration files. ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].gray(`(${name})`)}`);
throw new Error('DTS generation failed');
}
}
} else {
const host = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createCompilerHost(compilerOptions);
const program = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].createProgram({
rootNames: fileNames,
options: compilerOptions,
projectReferences,
host,
configFileParsingDiagnostics: __WEBPACK_EXTERNAL_MODULE_typescript__["default"].getConfigFileParsingDiagnostics(tsConfigResult)
});
const emitResult = program.emit();
const allDiagnostics = __WEBPACK_EXTERNAL_MODULE_typescript__["default"].getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
await handleDiagnosticsAndProcessFiles(allDiagnostics, configPath, host, bundle, declarationDir, dtsExtension, redirect, rootDir, banner, footer, name);
}
__WEBPACK_EXTERNAL_MODULE__rsbuild_core_1b356efc__.logger.ready(`DTS generated in ${(0, __WEBPACK_EXTERNAL_MODULE__utils_js_d88b7fe1__.getTimeCost)(start)} ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].gray(`(${name})`)}`);
}
}
export { emitDts };