feat(cli): Enhance CLI for TypeScript folder compilation ordering based on rank and predefined rules.

This commit is contained in:
Philipp Kunz 2024-11-05 01:48:49 +01:00
parent 5369e8d931
commit 59c6e72187
7 changed files with 2728 additions and 1931 deletions

View File

@ -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

View File

@ -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/**/*",

4526
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -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'
} }

View File

@ -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';

View File

@ -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;
})(), })(),

View File

@ -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);