feat(cli): Add new check command for type checking and update compiler options handling
This commit is contained in:
@ -39,7 +39,9 @@ export const runCli = async () => {
|
||||
const patterns = argvArg._.slice(1); // Remove the first element which is 'emitcheck'
|
||||
|
||||
if (patterns.length === 0) {
|
||||
console.error('Error: Please provide at least one TypeScript file path or glob pattern');
|
||||
console.error('\n❌ Error: Please provide at least one TypeScript file path or glob pattern');
|
||||
console.error(' Usage: tsbuild emitcheck <file_or_glob_pattern> [additional_patterns ...]\n');
|
||||
console.error(' Example: tsbuild emitcheck "src/**/*.ts" "test/**/*.ts"\n');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
@ -61,9 +63,9 @@ export const runCli = async () => {
|
||||
: [];
|
||||
|
||||
if (stringMatchedFiles.length === 0) {
|
||||
console.warn(`Warning: No files matched the pattern '${pattern}'`);
|
||||
console.warn(`⚠️ Warning: No files matched the pattern '${pattern}'`);
|
||||
} else {
|
||||
console.log(`Found ${stringMatchedFiles.length} files matching pattern '${pattern}'`);
|
||||
console.log(`📂 Found ${stringMatchedFiles.length} files matching pattern '${pattern}'`);
|
||||
|
||||
// Transform to absolute paths
|
||||
const absoluteMatchedFiles = plugins.smartpath.transform.toAbsolute(
|
||||
@ -75,7 +77,7 @@ export const runCli = async () => {
|
||||
allFiles = allFiles.concat(absoluteMatchedFiles);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Error processing glob pattern '${pattern}': ${err}`);
|
||||
console.error(`❌ Error processing glob pattern '${pattern}': ${err}`);
|
||||
}
|
||||
} else {
|
||||
// Handle as direct file path
|
||||
@ -87,7 +89,7 @@ export const runCli = async () => {
|
||||
await plugins.smartfile.fs.fileExists(filePath);
|
||||
allFiles.push(filePath);
|
||||
} catch (err) {
|
||||
console.error(`Error: File not found: ${filePath}`);
|
||||
console.error(`❌ Error: File not found: ${filePath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
@ -97,11 +99,12 @@ export const runCli = async () => {
|
||||
allFiles = allFiles.filter(file => file.endsWith('.ts') || file.endsWith('.tsx'));
|
||||
|
||||
if (allFiles.length === 0) {
|
||||
console.error('Error: No TypeScript files found to check');
|
||||
console.error('\n❌ Error: No TypeScript files found to check');
|
||||
console.error(' Please verify your file paths or glob patterns.\n');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`Found ${allFiles.length} TypeScript files to check`);
|
||||
console.log(`\n🔎 Found ${allFiles.length} TypeScript file${allFiles.length !== 1 ? 's' : ''} to check`);
|
||||
|
||||
// Process compiler options
|
||||
const compilerOptions = tsbuild.mergeCompilerOptions({}, argvArg);
|
||||
@ -161,13 +164,97 @@ export const runCli = async () => {
|
||||
|
||||
|
||||
const compilationCommandObject: { [key: string]: string } = {};
|
||||
console.log(`compiling in this order:`);
|
||||
console.log(sortedTsFolders);
|
||||
console.log(`\n🔄 Compiling TS folders in this order:`);
|
||||
console.log(' ' + sortedTsFolders.join('\n ') + '\n');
|
||||
for (const tsFolder of sortedTsFolders) {
|
||||
compilationCommandObject[`./${tsFolder}/**/*.ts`] = `./dist_${tsFolder}`;
|
||||
}
|
||||
await tsbuild.compileGlobStringObject(compilationCommandObject, {}, process.cwd(), argvArg);
|
||||
});
|
||||
|
||||
/**
|
||||
* the check command checks TypeScript files against a glob pattern without emitting them
|
||||
*/
|
||||
tsbuildCli.addCommand('check').subscribe(async (argvArg) => {
|
||||
const patterns = argvArg._.slice(1); // Remove the first element which is 'check'
|
||||
|
||||
if (patterns.length === 0) {
|
||||
console.error('\n❌ Error: Please provide at least one TypeScript file path or glob pattern');
|
||||
console.error(' Usage: tsbuild check <file_or_glob_pattern> [additional_patterns ...]\n');
|
||||
console.error(' Example: tsbuild check "src/**/*.ts" "test/**/*.ts"\n');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const cwd = process.cwd();
|
||||
let allFiles: string[] = [];
|
||||
|
||||
// Process each pattern - could be a direct file path or a glob pattern
|
||||
for (const pattern of patterns) {
|
||||
// Check if the pattern looks like a glob pattern
|
||||
if (pattern.includes('*') || pattern.includes('{') || pattern.includes('?')) {
|
||||
// Handle as glob pattern
|
||||
console.log(`Processing glob pattern: ${pattern}`);
|
||||
try {
|
||||
const matchedFiles = await plugins.smartfile.fs.listFileTree(cwd, pattern);
|
||||
|
||||
// Ensure matchedFiles contains only strings
|
||||
const stringMatchedFiles = Array.isArray(matchedFiles)
|
||||
? matchedFiles.filter((item): item is string => typeof item === 'string')
|
||||
: [];
|
||||
|
||||
if (stringMatchedFiles.length === 0) {
|
||||
console.warn(`⚠️ Warning: No files matched the pattern '${pattern}'`);
|
||||
} else {
|
||||
console.log(`📂 Found ${stringMatchedFiles.length} files matching pattern '${pattern}'`);
|
||||
|
||||
// Transform to absolute paths
|
||||
const absoluteMatchedFiles = plugins.smartpath.transform.toAbsolute(
|
||||
stringMatchedFiles,
|
||||
cwd
|
||||
) as string[];
|
||||
|
||||
// Add to the list of all files to check
|
||||
allFiles = allFiles.concat(absoluteMatchedFiles);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`❌ Error processing glob pattern '${pattern}': ${err}`);
|
||||
}
|
||||
} else {
|
||||
// Handle as direct file path
|
||||
const filePath = plugins.path.isAbsolute(pattern)
|
||||
? pattern
|
||||
: plugins.path.join(cwd, pattern);
|
||||
|
||||
try {
|
||||
await plugins.smartfile.fs.fileExists(filePath);
|
||||
allFiles.push(filePath);
|
||||
} catch (err) {
|
||||
console.error(`❌ Error: File not found: ${filePath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Filter to only TypeScript files
|
||||
allFiles = allFiles.filter(file => file.endsWith('.ts') || file.endsWith('.tsx'));
|
||||
|
||||
if (allFiles.length === 0) {
|
||||
console.error('\n❌ Error: No TypeScript files found to check');
|
||||
console.error(' Please verify your file paths or glob patterns.\n');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`\n🔎 Found ${allFiles.length} TypeScript file${allFiles.length !== 1 ? 's' : ''} to check`);
|
||||
|
||||
// Process compiler options
|
||||
const compilerOptions = tsbuild.mergeCompilerOptions({}, argvArg);
|
||||
|
||||
// Run type check without emitting
|
||||
const success = await tsbuild.checkTypes(allFiles, compilerOptions, argvArg);
|
||||
|
||||
// Exit with appropriate code
|
||||
process.exit(success ? 0 : 1);
|
||||
});
|
||||
|
||||
tsbuildCli.startParse();
|
||||
};
|
||||
|
Reference in New Issue
Block a user