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 | # 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) | ## 2024-10-27 - 2.1.85 - fix(compiler) | ||||||
| Improve path handling in compiler options | Improve path handling in compiler options | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ | |||||||
|   }, |   }, | ||||||
|   "homepage": "https://gitlab.com/pushrocks/tsn#README", |   "homepage": "https://gitlab.com/pushrocks/tsn#README", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|  |     "@git.zone/tspublish": "^1.7.5", | ||||||
|     "@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", | ||||||
| @@ -35,12 +36,12 @@ | |||||||
|     "@push.rocks/smartlog": "^3.0.7", |     "@push.rocks/smartlog": "^3.0.7", | ||||||
|     "@push.rocks/smartpath": "^5.0.18", |     "@push.rocks/smartpath": "^5.0.18", | ||||||
|     "@push.rocks/smartpromise": "^4.0.4", |     "@push.rocks/smartpromise": "^4.0.4", | ||||||
|     "typescript": "5.5.2" |     "typescript": "5.6.3" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@git.zone/tsrun": "^1.2.47", |     "@git.zone/tsrun": "^1.2.47", | ||||||
|     "@push.rocks/tapbundle": "^5.0.23", |     "@push.rocks/tapbundle": "^5.0.23", | ||||||
|     "@types/node": "^20.14.8" |     "@types/node": "^22.8.7" | ||||||
|   }, |   }, | ||||||
|   "files": [ |   "files": [ | ||||||
|     "ts/**/*", |     "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 = { | export const commitinfo = { | ||||||
|   name: '@git.zone/tsbuild', |   name: '@git.zone/tsbuild', | ||||||
|   version: '2.1.85', |   version: '2.2.0', | ||||||
|   description: 'TypeScript nightly to easily make use of latest features' |   description: 'TypeScript nightly to easily make use of latest features' | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,6 +5,13 @@ export { | |||||||
|   path |   path | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // @git.zone scope | ||||||
|  | import * as tspublish from '@git.zone/tspublish'; | ||||||
|  |  | ||||||
|  | export { | ||||||
|  |   tspublish | ||||||
|  | } | ||||||
|  |  | ||||||
| // @push.rocks scope | // @push.rocks scope | ||||||
| import * as smartcli from '@push.rocks/smartcli'; | import * as smartcli from '@push.rocks/smartcli'; | ||||||
| import * as smartdelay from '@push.rocks/smartdelay'; | import * as smartdelay from '@push.rocks/smartdelay'; | ||||||
|   | |||||||
| @@ -62,6 +62,9 @@ export const mergeCompilerOptions = ( | |||||||
|       if (tsconfig && tsconfig.compilerOptions && tsconfig.compilerOptions.paths) { |       if (tsconfig && tsconfig.compilerOptions && tsconfig.compilerOptions.paths) { | ||||||
|         console.log('paths found in tsconfig.json'); |         console.log('paths found in tsconfig.json'); | ||||||
|         returnObject.paths = tsconfig.compilerOptions.paths; |         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; |       return returnObject; | ||||||
|     })(), |     })(), | ||||||
|   | |||||||
| @@ -37,24 +37,52 @@ export const runCli = async () => { | |||||||
|    */ |    */ | ||||||
|   tsbuildCli.addCommand('tsfolders').subscribe(async (argvArg) => { |   tsbuildCli.addCommand('tsfolders').subscribe(async (argvArg) => { | ||||||
|     const tsFolders = await plugins.smartfile.fs.listFolders(paths.cwd, /^ts/); |     const tsFolders = await plugins.smartfile.fs.listFolders(paths.cwd, /^ts/); | ||||||
|     // lets make sure shared is always transpiled first |  | ||||||
|     const indexShared = tsFolders.indexOf('ts_shared'); |     // Now tsFolders contains all other folders except 'ts_shared' and 'ts_interfaces' | ||||||
|     if (indexShared > -1) { |  | ||||||
|       tsFolders.splice(indexShared, 1); |     // We've established a base order. Now let's look at tspublish.json based ranking. | ||||||
|       tsFolders.unshift('ts_shared'); |     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 |     // Construct the sorted list of folders | ||||||
|     const indexInterfaces = tsFolders.indexOf('ts_interfaces'); |     const sortedTsFolders = [];  | ||||||
|     if (indexInterfaces > -1) { |  | ||||||
|       tsFolders.splice(indexInterfaces, 1); |     // Add the rest of the folders in sorted order | ||||||
|       tsFolders.unshift('ts_interfaces'); |     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 } = {}; |     const compilationCommandObject: { [key: string]: string } = {}; | ||||||
|     console.log(`compiling in this order:`); |     console.log(`compiling in this order:`); | ||||||
|     console.log(tsFolders); |     console.log(sortedTsFolders); | ||||||
|     for (const tsFolder of tsFolders) { |     for (const tsFolder of sortedTsFolders) { | ||||||
|       compilationCommandObject[`./${tsFolder}/**/*.ts`] = `./dist_${tsFolder}`; |       compilationCommandObject[`./${tsFolder}/**/*.ts`] = `./dist_${tsFolder}`; | ||||||
|     } |     } | ||||||
|     await tsbuild.compileGlobStringObject(compilationCommandObject, {}, process.cwd(), argvArg); |     await tsbuild.compileGlobStringObject(compilationCommandObject, {}, process.cwd(), argvArg); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user