fix(tsbuild): Improve diagnostic error handling and summary reporting for TypeScript compilation by refactoring diagnostic processing and adding pre-emit error checks.
This commit is contained in:
		@@ -6,6 +6,19 @@ export type { CompilerOptions, ScriptTarget, ModuleKind };
 | 
			
		||||
 | 
			
		||||
export * from './tsbuild.classes.tsbuild.js';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * compile an array of absolute file paths with error tracking
 | 
			
		||||
 */
 | 
			
		||||
export let compileFileArrayWithErrorTracking = async (
 | 
			
		||||
  fileStringArrayArg: string[],
 | 
			
		||||
  compilerOptionsArg: CompilerOptions = {},
 | 
			
		||||
  argvArg?: any
 | 
			
		||||
): Promise<{ emittedFiles: any[], errorSummary: import('./tsbuild.classes.tsbuild.js').IErrorSummary }> => {
 | 
			
		||||
  const { TsBuild } = await import('./tsbuild.classes.tsbuild.js');
 | 
			
		||||
  const tsBuild = new TsBuild(fileStringArrayArg, compilerOptionsArg, argvArg);
 | 
			
		||||
  return tsBuild.compileWithErrorTracking();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * compile am array of absolute file paths
 | 
			
		||||
 */
 | 
			
		||||
@@ -17,6 +30,75 @@ export let compileFileArray = (
 | 
			
		||||
  return compiler(fileStringArrayArg, mergeCompilerOptions(compilerOptionsArg, argvArg), argvArg);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper function to merge error summaries
 | 
			
		||||
 */
 | 
			
		||||
function mergeErrorSummaries(summaries: import('./tsbuild.classes.tsbuild.js').IErrorSummary[]): import('./tsbuild.classes.tsbuild.js').IErrorSummary {
 | 
			
		||||
  const mergedErrorsByFile: Record<string, plugins.typescript.Diagnostic[]> = {};
 | 
			
		||||
  const mergedGeneralErrors: plugins.typescript.Diagnostic[] = [];
 | 
			
		||||
  let totalErrors = 0;
 | 
			
		||||
  
 | 
			
		||||
  summaries.forEach(summary => {
 | 
			
		||||
    // Merge errors by file
 | 
			
		||||
    Object.entries(summary.errorsByFile).forEach(([fileName, errors]) => {
 | 
			
		||||
      if (!mergedErrorsByFile[fileName]) {
 | 
			
		||||
        mergedErrorsByFile[fileName] = [];
 | 
			
		||||
      }
 | 
			
		||||
      mergedErrorsByFile[fileName] = mergedErrorsByFile[fileName].concat(errors);
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // Merge general errors
 | 
			
		||||
    mergedGeneralErrors.push(...summary.generalErrors);
 | 
			
		||||
    totalErrors += summary.totalErrors;
 | 
			
		||||
  });
 | 
			
		||||
  
 | 
			
		||||
  return {
 | 
			
		||||
    errorsByFile: mergedErrorsByFile,
 | 
			
		||||
    generalErrors: mergedGeneralErrors,
 | 
			
		||||
    totalErrors,
 | 
			
		||||
    totalFiles: Object.keys(mergedErrorsByFile).length
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper function to display final compilation summary
 | 
			
		||||
 */
 | 
			
		||||
function displayFinalErrorSummary(errorSummary: import('./tsbuild.classes.tsbuild.js').IErrorSummary): void {
 | 
			
		||||
  if (errorSummary.totalErrors === 0) {
 | 
			
		||||
    console.log('\n📊 \x1b[32mCompilation Summary: All tasks completed successfully! ✅\x1b[0m\n');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  const colors = {
 | 
			
		||||
    reset: '\x1b[0m',
 | 
			
		||||
    red: '\x1b[31m',
 | 
			
		||||
    yellow: '\x1b[33m',
 | 
			
		||||
    cyan: '\x1b[36m',
 | 
			
		||||
    brightRed: '\x1b[91m',
 | 
			
		||||
    brightYellow: '\x1b[93m'
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
  console.log('\n' + '='.repeat(80));
 | 
			
		||||
  console.log(`📊 ${colors.brightYellow}Final Compilation Summary${colors.reset}`);
 | 
			
		||||
  console.log('='.repeat(80));
 | 
			
		||||
  
 | 
			
		||||
  if (errorSummary.totalFiles > 0) {
 | 
			
		||||
    console.log(`${colors.brightRed}❌ Files with errors (${errorSummary.totalFiles}):${colors.reset}`);
 | 
			
		||||
    
 | 
			
		||||
    Object.entries(errorSummary.errorsByFile).forEach(([fileName, errors]) => {
 | 
			
		||||
      const displayPath = fileName.replace(process.cwd(), '').replace(/^\//, '');
 | 
			
		||||
      console.log(`  ${colors.red}•${colors.reset} ${colors.cyan}${displayPath}${colors.reset} ${colors.yellow}(${errors.length} error${errors.length !== 1 ? 's' : ''})${colors.reset}`);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if (errorSummary.generalErrors.length > 0) {
 | 
			
		||||
    console.log(`${colors.brightRed}❌ General errors: ${errorSummary.generalErrors.length}${colors.reset}`);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  console.log(`\n${colors.brightRed}Total: ${errorSummary.totalErrors} error${errorSummary.totalErrors !== 1 ? 's' : ''} across ${errorSummary.totalFiles} file${errorSummary.totalFiles !== 1 ? 's' : ''}${colors.reset}`);
 | 
			
		||||
  console.log('='.repeat(80) + '\n');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * compile advanced glob configurations
 | 
			
		||||
 * @param globStringArrayArg a array of glob strings
 | 
			
		||||
@@ -31,6 +113,7 @@ export let compileGlobStringObject = async (
 | 
			
		||||
  argvArg?: any
 | 
			
		||||
) => {
 | 
			
		||||
  let compiledFiles: any[] = [];
 | 
			
		||||
  const errorSummaries: import('./tsbuild.classes.tsbuild.js').IErrorSummary[] = [];
 | 
			
		||||
  
 | 
			
		||||
  // Log the compilation tasks in a nice format
 | 
			
		||||
  console.log('\n👷 TypeScript Compilation Tasks:');
 | 
			
		||||
@@ -69,12 +152,16 @@ export let compileGlobStringObject = async (
 | 
			
		||||
        outDir: destDir,
 | 
			
		||||
      };
 | 
			
		||||
      
 | 
			
		||||
      // Compile the files and correctly concat the results
 | 
			
		||||
      // Fixed: removed duplicating compiledFiles in the concat operation
 | 
			
		||||
      const newlyCompiledFiles = await compileFileArray(absoluteFilePathArray, updatedTsOptions, argvArg);
 | 
			
		||||
      compiledFiles = compiledFiles.concat(newlyCompiledFiles);
 | 
			
		||||
      // Compile with error tracking
 | 
			
		||||
      const result = await compileFileArrayWithErrorTracking(absoluteFilePathArray, updatedTsOptions, argvArg);
 | 
			
		||||
      compiledFiles = compiledFiles.concat(result.emittedFiles);
 | 
			
		||||
      errorSummaries.push(result.errorSummary);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  // Display final error summary after all compilation tasks
 | 
			
		||||
  const finalErrorSummary = mergeErrorSummaries(errorSummaries);
 | 
			
		||||
  displayFinalErrorSummary(finalErrorSummary);
 | 
			
		||||
  
 | 
			
		||||
  return compiledFiles;
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user