feat(cli): Enhance CLI for TypeScript folder compilation ordering based on rank and predefined rules.
This commit is contained in:
		| @@ -1,5 +1,13 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## 2024-11-05 - 2.2.0 - feat(cli) | ||||
| Enhance CLI for TypeScript folder compilation ordering based on rank and predefined rules. | ||||
|  | ||||
| - CLI now supports automatic ordering of TypeScript folders for compilation using tspublish.json based ranking. | ||||
| - Ensures 'ts_interfaces' and 'ts_shared' are always transpiled first if certain conditions are met. | ||||
| - Updated TypeScript compilerOptions to support additional path transformations. | ||||
| - Updated dependencies versions and added '@git.zone/tspublish' in ts/plugins.ts. | ||||
|  | ||||
| ## 2024-10-27 - 2.1.85 - fix(compiler) | ||||
| Improve path handling in compiler options | ||||
|  | ||||
|   | ||||
| @@ -28,6 +28,7 @@ | ||||
|   }, | ||||
|   "homepage": "https://gitlab.com/pushrocks/tsn#README", | ||||
|   "dependencies": { | ||||
|     "@git.zone/tspublish": "^1.7.5", | ||||
|     "@push.rocks/early": "^4.0.4", | ||||
|     "@push.rocks/smartcli": "^4.0.11", | ||||
|     "@push.rocks/smartdelay": "^3.0.5", | ||||
| @@ -35,12 +36,12 @@ | ||||
|     "@push.rocks/smartlog": "^3.0.7", | ||||
|     "@push.rocks/smartpath": "^5.0.18", | ||||
|     "@push.rocks/smartpromise": "^4.0.4", | ||||
|     "typescript": "5.5.2" | ||||
|     "typescript": "5.6.3" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@git.zone/tsrun": "^1.2.47", | ||||
|     "@push.rocks/tapbundle": "^5.0.23", | ||||
|     "@types/node": "^20.14.8" | ||||
|     "@types/node": "^22.8.7" | ||||
|   }, | ||||
|   "files": [ | ||||
|     "ts/**/*", | ||||
|   | ||||
							
								
								
									
										4582
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4582
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -3,6 +3,6 @@ | ||||
|  */ | ||||
| export const commitinfo = { | ||||
|   name: '@git.zone/tsbuild', | ||||
|   version: '2.1.85', | ||||
|   version: '2.2.0', | ||||
|   description: 'TypeScript nightly to easily make use of latest features' | ||||
| } | ||||
|   | ||||
| @@ -5,6 +5,13 @@ export { | ||||
|   path | ||||
| } | ||||
|  | ||||
| // @git.zone scope | ||||
| import * as tspublish from '@git.zone/tspublish'; | ||||
|  | ||||
| export { | ||||
|   tspublish | ||||
| } | ||||
|  | ||||
| // @push.rocks scope | ||||
| import * as smartcli from '@push.rocks/smartcli'; | ||||
| import * as smartdelay from '@push.rocks/smartdelay'; | ||||
|   | ||||
| @@ -62,6 +62,9 @@ export const mergeCompilerOptions = ( | ||||
|       if (tsconfig && tsconfig.compilerOptions && tsconfig.compilerOptions.paths) { | ||||
|         console.log('paths found in tsconfig.json'); | ||||
|         returnObject.paths = tsconfig.compilerOptions.paths; | ||||
|         for (const path of Object.keys(tsconfig.compilerOptions.paths)) { | ||||
|           returnObject.paths[path][0] = returnObject.paths[path][0].replace('./ts_', './dist_ts_'); | ||||
|         } | ||||
|       } | ||||
|       return returnObject; | ||||
|     })(), | ||||
|   | ||||
| @@ -37,24 +37,52 @@ export const runCli = async () => { | ||||
|    */ | ||||
|   tsbuildCli.addCommand('tsfolders').subscribe(async (argvArg) => { | ||||
|     const tsFolders = await plugins.smartfile.fs.listFolders(paths.cwd, /^ts/); | ||||
|     // lets make sure shared is always transpiled first | ||||
|     const indexShared = tsFolders.indexOf('ts_shared'); | ||||
|     if (indexShared > -1) { | ||||
|       tsFolders.splice(indexShared, 1); | ||||
|       tsFolders.unshift('ts_shared'); | ||||
|  | ||||
|     // Now tsFolders contains all other folders except 'ts_shared' and 'ts_interfaces' | ||||
|  | ||||
|     // We've established a base order. Now let's look at tspublish.json based ranking. | ||||
|     const tsPublishInstance = new plugins.tspublish.TsPublish(); | ||||
|     const tsPublishModules = await tsPublishInstance.getModuleSubDirs(paths.cwd); | ||||
|     // tsPublishModules is an object: { [folderName]: tspublishJsonData } | ||||
|  | ||||
|     // Create an array with folder names and their ranks | ||||
|     const foldersWithOrder = []; | ||||
|  | ||||
|     for (const folder of tsFolders) { | ||||
|       let rank = Infinity; // Default rank if not specified | ||||
|       if (tsPublishModules[folder] && tsPublishModules[folder].order !== undefined) { | ||||
|         rank = tsPublishModules[folder].order; | ||||
|       } | ||||
|       foldersWithOrder.push({ folder, rank }); | ||||
|     } | ||||
|  | ||||
|     // Sort the folders based on rank | ||||
|     foldersWithOrder.sort((a, b) => a.rank - b.rank); | ||||
|  | ||||
|     // lets make sure interfaces are always transpiled first | ||||
|     const indexInterfaces = tsFolders.indexOf('ts_interfaces'); | ||||
|     if (indexInterfaces > -1) { | ||||
|       tsFolders.splice(indexInterfaces, 1); | ||||
|       tsFolders.unshift('ts_interfaces'); | ||||
|     // Construct the sorted list of folders | ||||
|     const sortedTsFolders = [];  | ||||
|  | ||||
|     // Add the rest of the folders in sorted order | ||||
|     for (const item of foldersWithOrder) { | ||||
|       sortedTsFolders.push(item.folder); | ||||
|     } | ||||
|  | ||||
|     // Let's make sure 'ts_shared' is always transpiled first | ||||
|     const ensurePosition = (folderNameArg: string, ensuredPosition: number) => { | ||||
|       if (tsFolders.indexOf(folderNameArg) > -1 && Object.keys(tsPublishModules).indexOf(folderNameArg) === -1) { | ||||
|         sortedTsFolders.splice(tsFolders.indexOf(folderNameArg), 1); | ||||
|         sortedTsFolders.splice(ensuredPosition, 0, folderNameArg); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     ensurePosition('ts_interfaces', 0); | ||||
|     ensurePosition('ts_shared', 1); | ||||
|  | ||||
|  | ||||
|     const compilationCommandObject: { [key: string]: string } = {}; | ||||
|     console.log(`compiling in this order:`); | ||||
|     console.log(tsFolders); | ||||
|     for (const tsFolder of tsFolders) { | ||||
|     console.log(sortedTsFolders); | ||||
|     for (const tsFolder of sortedTsFolders) { | ||||
|       compilationCommandObject[`./${tsFolder}/**/*.ts`] = `./dist_${tsFolder}`; | ||||
|     } | ||||
|     await tsbuild.compileGlobStringObject(compilationCommandObject, {}, process.cwd(), argvArg); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user