feat(tsbuild): Improve task logging and update dependencies

This commit is contained in:
2025-05-21 13:38:21 +00:00
parent f220a11caa
commit 050e41cdf9
8 changed files with 4218 additions and 1335 deletions

1
.npmrc Normal file
View File

@@ -0,0 +1 @@
registry=https://registry.npmjs.org/

View File

@@ -1,5 +1,14 @@
# Changelog # Changelog
## 2025-05-21 - 2.6.0 - feat(tsbuild)
Improve task logging and update dependencies
- Add .npmrc file with npm registry configuration
- Update test script to use '--verbose' flag
- Bump dependency versions for @push.rocks packages and TypeScript
- Enhance TsBuild logging by incorporating task info (e.g. task number, total tasks, output folder, and compile durations)
- Propagate task info in compileFileArrayWithErrorTracking for better task tracking
## 2025-05-21 - 2.5.2 - fix(tsbuild) ## 2025-05-21 - 2.5.2 - fix(tsbuild)
Improve diagnostic error handling and summary reporting for TypeScript compilation by refactoring diagnostic processing and adding pre-emit error checks. Improve diagnostic error handling and summary reporting for TypeScript compilation by refactoring diagnostic processing and adding pre-emit error checks.

View File

@@ -10,7 +10,7 @@
"tsbuild": "./cli.js" "tsbuild": "./cli.js"
}, },
"scripts": { "scripts": {
"test": "tsrun test/test.ts", "test": "tsrun test/test.ts --verbose",
"build": "node cli.ts.js --web", "build": "node cli.ts.js --web",
"buildDocs": "tsdoc" "buildDocs": "tsdoc"
}, },
@@ -40,16 +40,16 @@
"@push.rocks/early": "^4.0.4", "@push.rocks/early": "^4.0.4",
"@push.rocks/smartcli": "^4.0.11", "@push.rocks/smartcli": "^4.0.11",
"@push.rocks/smartdelay": "^3.0.5", "@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartfile": "^11.1.5", "@push.rocks/smartfile": "^11.2.3",
"@push.rocks/smartlog": "^3.0.7", "@push.rocks/smartlog": "^3.1.8",
"@push.rocks/smartpath": "^5.0.18", "@push.rocks/smartpath": "^5.0.18",
"@push.rocks/smartpromise": "^4.2.2", "@push.rocks/smartpromise": "^4.2.3",
"typescript": "5.7.3" "typescript": "5.8.3"
}, },
"devDependencies": { "devDependencies": {
"@git.zone/tsrun": "^1.2.47", "@git.zone/tsrun": "^1.2.47",
"@push.rocks/tapbundle": "^5.5.6", "@git.zone/tstest": "^1.9.0",
"@types/node": "^22.12.0" "@types/node": "^22.15.21"
}, },
"files": [ "files": [
"ts/**/*", "ts/**/*",

5464
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
import { tap, expect, expectAsync } from '@push.rocks/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as tsbuild from '../ts/index.js'; import * as tsbuild from '../ts/index.js';

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@git.zone/tsbuild', name: '@git.zone/tsbuild',
version: '2.5.2', version: '2.6.0',
description: 'A tool for compiling TypeScript files using the latest nightly features, offering flexible APIs and a CLI for streamlined development.' description: 'A tool for compiling TypeScript files using the latest nightly features, offering flexible APIs and a CLI for streamlined development.'
} }

View File

@@ -41,6 +41,7 @@ export class TsBuild {
private fileNames: string[] = []; private fileNames: string[] = [];
private options: plugins.typescript.CompilerOptions; private options: plugins.typescript.CompilerOptions;
private argvArg?: any; private argvArg?: any;
private taskInfo?: any;
/** /**
* Create a new TsBuild instance * Create a new TsBuild instance
@@ -48,10 +49,12 @@ export class TsBuild {
constructor( constructor(
fileNames: string[] = [], fileNames: string[] = [],
customOptions: CompilerOptions = {}, customOptions: CompilerOptions = {},
argvArg?: any argvArg?: any,
taskInfo?: any
) { ) {
this.fileNames = fileNames; this.fileNames = fileNames;
this.argvArg = argvArg; this.argvArg = argvArg;
this.taskInfo = taskInfo;
this.options = this.mergeCompilerOptions(customOptions, argvArg); this.options = this.mergeCompilerOptions(customOptions, argvArg);
} }
@@ -320,7 +323,17 @@ export class TsBuild {
await plugins.smartdelay.delayFor(5000); await plugins.smartdelay.delayFor(5000);
} }
// Enhanced logging with task info
const startTime = Date.now();
if (this.taskInfo) {
const { taskNumber, totalTasks, sourcePattern, destDir, fileCount } = this.taskInfo;
const relativeDestDir = destDir.replace(process.cwd(), '').replace(/^\//, '');
console.log(`\n🔨 [${taskNumber}/${totalTasks}] Compiling ${fileCount} file${fileCount !== 1 ? 's' : ''} from ${sourcePattern}`);
console.log(` 📁 Output: ${relativeDestDir}`);
} else {
console.log(`🔨 Compiling ${this.fileNames.length} files...`); console.log(`🔨 Compiling ${this.fileNames.length} files...`);
}
const done = plugins.smartpromise.defer<{ emittedFiles: any[], errorSummary: IErrorSummary }>(); const done = plugins.smartpromise.defer<{ emittedFiles: any[], errorSummary: IErrorSummary }>();
const program = this.createProgram(); const program = this.createProgram();
@@ -352,7 +365,15 @@ export class TsBuild {
const exitCode = emitResult.emitSkipped ? 1 : 0; const exitCode = emitResult.emitSkipped ? 1 : 0;
if (exitCode === 0) { if (exitCode === 0) {
console.log('\n✅ TypeScript emit succeeded!'); const endTime = Date.now();
const duration = endTime - startTime;
if (this.taskInfo) {
const { taskNumber, totalTasks } = this.taskInfo;
console.log(`✅ [${taskNumber}/${totalTasks}] Task completed in ${duration}ms`);
} else {
console.log(`✅ TypeScript emit succeeded! (${duration}ms)`);
}
// Get count of emitted files by type // Get count of emitted files by type
const jsFiles = emitResult.emittedFiles?.filter(f => f.endsWith('.js')).length || 0; const jsFiles = emitResult.emittedFiles?.filter(f => f.endsWith('.js')).length || 0;
@@ -361,7 +382,7 @@ export class TsBuild {
// If we have emitted files, show a summary // If we have emitted files, show a summary
if (emitResult.emittedFiles && emitResult.emittedFiles.length > 0) { if (emitResult.emittedFiles && emitResult.emittedFiles.length > 0) {
console.log(` Generated ${emitResult.emittedFiles.length} files: ${jsFiles} .js, ${dtsFiles} .d.ts, ${mapFiles} source maps`); console.log(` 📄 Generated ${emitResult.emittedFiles.length} files: ${jsFiles} .js, ${dtsFiles} .d.ts, ${mapFiles} source maps`);
} }
done.resolve({ emittedFiles: emitResult.emittedFiles || [], errorSummary: combinedErrorSummary }); done.resolve({ emittedFiles: emitResult.emittedFiles || [], errorSummary: combinedErrorSummary });

View File

@@ -6,16 +6,28 @@ export type { CompilerOptions, ScriptTarget, ModuleKind };
export * from './tsbuild.classes.tsbuild.js'; export * from './tsbuild.classes.tsbuild.js';
/**
* Interface for task information
*/
export interface ITaskInfo {
taskNumber: number;
totalTasks: number;
sourcePattern: string;
destDir: string;
fileCount: number;
}
/** /**
* compile an array of absolute file paths with error tracking * compile an array of absolute file paths with error tracking
*/ */
export let compileFileArrayWithErrorTracking = async ( export let compileFileArrayWithErrorTracking = async (
fileStringArrayArg: string[], fileStringArrayArg: string[],
compilerOptionsArg: CompilerOptions = {}, compilerOptionsArg: CompilerOptions = {},
argvArg?: any argvArg?: any,
taskInfo?: ITaskInfo
): Promise<{ emittedFiles: any[], errorSummary: import('./tsbuild.classes.tsbuild.js').IErrorSummary }> => { ): Promise<{ emittedFiles: any[], errorSummary: import('./tsbuild.classes.tsbuild.js').IErrorSummary }> => {
const { TsBuild } = await import('./tsbuild.classes.tsbuild.js'); const { TsBuild } = await import('./tsbuild.classes.tsbuild.js');
const tsBuild = new TsBuild(fileStringArrayArg, compilerOptionsArg, argvArg); const tsBuild = new TsBuild(fileStringArrayArg, compilerOptionsArg, argvArg, taskInfo);
return tsBuild.compileWithErrorTracking(); return tsBuild.compileWithErrorTracking();
}; };
@@ -115,8 +127,11 @@ export let compileGlobStringObject = async (
let compiledFiles: any[] = []; let compiledFiles: any[] = [];
const errorSummaries: import('./tsbuild.classes.tsbuild.js').IErrorSummary[] = []; const errorSummaries: import('./tsbuild.classes.tsbuild.js').IErrorSummary[] = [];
const totalTasks = Object.keys(globStringObjectArg).length;
let currentTask = 0;
// Log the compilation tasks in a nice format // Log the compilation tasks in a nice format
console.log('\n👷 TypeScript Compilation Tasks:'); console.log(`\n👷 TypeScript Compilation Tasks (${totalTasks} task${totalTasks !== 1 ? 's' : ''}):`);
Object.entries(globStringObjectArg).forEach(([source, dest]) => { Object.entries(globStringObjectArg).forEach(([source, dest]) => {
console.log(` 📂 ${source}${dest}`); console.log(` 📂 ${source}${dest}`);
}); });
@@ -153,7 +168,16 @@ export let compileGlobStringObject = async (
}; };
// Compile with error tracking // Compile with error tracking
const result = await compileFileArrayWithErrorTracking(absoluteFilePathArray, updatedTsOptions, argvArg); currentTask++;
const taskInfo = {
taskNumber: currentTask,
totalTasks,
sourcePattern: keyArg,
destDir: globStringObjectArg[keyArg],
fileCount: absoluteFilePathArray.length
};
const result = await compileFileArrayWithErrorTracking(absoluteFilePathArray, updatedTsOptions, argvArg, taskInfo);
compiledFiles = compiledFiles.concat(result.emittedFiles); compiledFiles = compiledFiles.concat(result.emittedFiles);
errorSummaries.push(result.errorSummary); errorSummaries.push(result.errorSummary);
} }