Compare commits

..

38 Commits

Author SHA1 Message Date
6d68f35a9a 2.3.2 2025-03-20 15:30:52 +00:00
0378b9feca fix(compileGlobStringObject): Fix duplicate file outputs in glob pattern processing 2025-03-20 15:30:52 +00:00
5ecf4b7125 2.3.1 2025-03-20 15:20:27 +00:00
2aa6348cdd fix(compiler): Refactor compiler implementation with consolidated TsBuild class and improved diagnostics handling 2025-03-20 15:20:27 +00:00
9f42670865 2.3.0 2025-03-20 15:16:02 +00:00
6cc9f41bd2 feat(cli): Add emitcheck command to validate TS file emission without generating output 2025-03-20 15:16:02 +00:00
5d32ac85e0 2.2.7 2025-03-17 10:27:36 +00:00
4f2ac6922a fix(compiler): Improve diagnostic checking and error handling in the TypeScript compiler integration 2025-03-17 10:27:36 +00:00
31834e0b3e 2.2.6 2025-03-04 23:13:33 +00:00
c6c94866bb fix(package): Fix repository URL in package.json 2025-03-04 23:13:33 +00:00
09a648b435 2.2.5 2025-03-04 23:00:51 +00:00
065e0baaf7 fix(package.json): Update repository URLs in package metadata. 2025-03-04 23:00:51 +00:00
89d32617ce 2.2.4 2025-03-04 19:41:37 +00:00
094702b917 fix(core): Fix compiler logic to remove duplicate compiled files and improve glob pattern handling. 2025-03-04 19:41:37 +00:00
c2aec98da3 2.2.3 2025-03-04 19:41:05 +00:00
289421206c fix(exports): Fixed duplicate file compilation in compileGlobStringObject, fixes #1 2025-03-04 19:41:05 +00:00
1f9870ffbb 2.2.2 2025-01-28 12:06:06 +01:00
8f7f34d61e fix(ci): Remove GitLab CI configuration 2025-01-28 12:06:06 +01:00
2e23919503 2.2.1 2025-01-28 12:04:59 +01:00
f601cf8eb8 fix(core): Update dependencies to improve stability and performance. 2025-01-28 12:04:58 +01:00
15af2e4e2d 2.2.0 2024-11-05 01:48:49 +01:00
59c6e72187 feat(cli): Enhance CLI for TypeScript folder compilation ordering based on rank and predefined rules. 2024-11-05 01:48:49 +01:00
5369e8d931 2.1.85 2024-10-27 13:35:55 +01:00
88444e835f fix(compiler): Improve path handling in compiler options 2024-10-27 13:35:54 +01:00
4892c8f7ae 2.1.84 2024-07-22 00:07:08 +02:00
687f01d1a3 fix(cli): Fixed transpilation order issue in tsfolders command 2024-07-22 00:07:07 +02:00
071b3e222f 2.1.83 2024-07-21 17:33:22 +02:00
fa41dbf332 fix(cli): Ensure ts_shared folder is compiled sedond to interfaces when present 2024-07-21 17:33:21 +02:00
c45a216379 2.1.82 2024-06-24 12:06:19 +02:00
00046837a7 fix(core): Minor improvements and optimizations in core TypeScript compiler integration. 2024-06-24 12:06:18 +02:00
ed22b539f2 2.1.81 2024-06-24 12:00:38 +02:00
43c7021aea fix(dependencies): Update dependencies to latest versions 2024-06-24 12:00:37 +02:00
b21009f815 2.1.80 2024-05-17 19:19:55 +02:00
deba95dfa6 fix(core): update 2024-05-17 19:19:55 +02:00
50e6fec9b0 2.1.79 2024-05-17 19:19:04 +02:00
f7c2a67d81 fix(core): update 2024-05-17 19:19:03 +02:00
91e3502965 2.1.78 2024-05-17 19:18:26 +02:00
0afddbefce fix(core): update 2024-05-17 19:18:26 +02:00
13 changed files with 6892 additions and 1793 deletions

View File

@ -1,128 +0,0 @@
# gitzone ci_default
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache:
paths:
- .npmci_cache/
key: '$CI_BUILD_STAGE'
stages:
- security
- test
- release
- metadata
before_script:
- pnpm install -g pnpm
- pnpm install -g @shipzone/npmci
- npmci npm prepare
# ====================
# security stage
# ====================
# ====================
# security stage
# ====================
auditProductionDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security
script:
- npmci command npm config set registry https://registry.npmjs.org
- npmci command pnpm audit --audit-level=high --prod
tags:
- lossless
- docker
allow_failure: true
auditDevDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security
script:
- npmci command npm config set registry https://registry.npmjs.org
- npmci command pnpm audit --audit-level=high --dev
tags:
- lossless
- docker
allow_failure: true
# ====================
# test stage
# ====================
testStable:
stage: test
script:
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
testBuild:
stage: test
script:
- npmci node install stable
- npmci npm install
- npmci npm build
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
release:
stage: release
script:
- npmci node install stable
- npmci npm publish
only:
- tags
tags:
- lossless
- docker
- notpriv
# ====================
# metadata stage
# ====================
codequality:
stage: metadata
allow_failure: true
only:
- tags
script:
- npmci command npm install -g typescript
- npmci npm prepare
- npmci npm install
tags:
- lossless
- docker
- priv
trigger:
stage: metadata
script:
- npmci trigger
only:
- tags
tags:
- lossless
- docker
- notpriv
pages:
stage: metadata
script:
- npmci node install stable
- npmci npm install
- npmci command npm run buildDocs
tags:
- lossless
- docker
- notpriv
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public
allow_failure: true

257
changelog.md Normal file
View File

@ -0,0 +1,257 @@
# Changelog
## 2025-03-20 - 2.3.2 - fix(compileGlobStringObject)
Fix duplicate file outputs in glob pattern processing
- Removed duplicate concatenation of compiled files in compileGlobStringObject
- Ensured unique file paths are used during TypeScript compilation
## 2025-03-20 - 2.3.1 - fix(compiler)
Refactor compiler implementation with consolidated TsBuild class and improved diagnostics handling
- Removed legacy tsbuild.classes.compiler.ts and introduced tsbuild.classes.tsbuild.ts
- Unified compiler options merging, reading tsconfig.json, and diagnostics reporting within the TsBuild class
- Updated exports to reference the new compiler class implementation for backward compatibility
## 2025-03-20 - 2.3.0 - feat(cli)
Add emitcheck command to validate TS file emission without generating output
- Implemented the emitcheck CLI command to allow checking if TypeScript files can be emitted without producing files
- Updated tsbuild.classes.compiler.ts to include the emitCheck function
- Enhanced documentation in readme.md to describe the new emitcheck usage with examples
## 2025-03-17 - 2.2.7 - fix(compiler)
Improve diagnostic checking and error handling in the TypeScript compiler integration
- Added pre-emit diagnostics check to log errors before emitting
- Process exits on encountering pre-emit errors to ensure build correctness
- Enhanced logging for emit diagnostics to aid debugging
## 2025-03-04 - 2.2.6 - fix(package)
Fix repository URL in package.json
- Updated repository URL in package.json to point to the correct Git repository.
## 2025-03-04 - 2.2.5 - fix(package.json)
Update repository URLs in package metadata.
- Corrected the 'bugs.url' and 'homepage' fields with the accurate URLs.
## 2025-03-04 - 2.2.4 - fix(core)
Fix compiler logic to remove duplicate compiled files and improve glob pattern handling.
- Resolved an issue causing duplicate file compilations when using compileGlobStringObject.
- Improved handling of glob patterns to ensure accurate compilation paths.
## 2025-03-04 - 2.2.3 - fix(exports)
Fixed duplicate file compilation in compileGlobStringObject
- Enhanced type safety checks for glob pattern compilation keys.
- Ensured file list transformations include type checks.
- Fixed issue with duplicate compilation results in compileGlobStringObject.
## 2025-01-28 - 2.2.2 - fix(ci)
Remove GitLab CI configuration
## 2025-01-28 - 2.2.1 - fix(core)
Update dependencies to improve stability and performance.
- Updated @git.zone/tspublish from version ^1.7.5 to ^1.9.1.
- Updated @push.rocks/smartfile from version ^11.0.21 to ^11.1.5.
- Updated @push.rocks/smartpromise from version ^4.0.4 to ^4.2.2.
- Updated typescript from version 5.6.3 to 5.7.3.
- Updated @push.rocks/tapbundle from version ^5.0.23 to ^5.5.6.
- Updated @types/node from version ^22.8.7 to ^22.12.0.
## 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
- Refactored path import in tsbuild.classes.compiler.ts.
- Enhanced mergeCompilerOptions to read paths and baseUrl from tsconfig.json if present.
## 2024-07-22 - 2.1.84 - fix(cli)
Fixed transpilation order issue in tsfolders command
- Corrected the transpilation order so 'ts_shared' is processed before other folders in the 'tsfolders' CLI command.
## 2024-07-21 - 2.1.83 - fix(cli)
Ensure 'ts_shared' folder is compiled first if present
- Added logic to make sure the 'ts_shared' folder is compiled first when running 'tsfolders' command.
## 2024-06-24 - 2.1.82 - fix(core)
Minor improvements and optimizations in core TypeScript compiler integration.
- Updated TypeScript dependency to latest version 5.5.2.
- Enhanced logging in compiler process.
- Improved handling of CLI commands for better flexibility.
- Compiled output directories are now more structured.
- Refactored internal compiler options merge function.
## 2024-06-24 - 2.1.81 - fix(dependencies)
Update dependencies to latest versions
- Upgraded @push.rocks/smartcli from ^4.0.10 to ^4.0.11
- Upgraded @push.rocks/smartfile from ^11.0.14 to ^11.0.21
- Upgraded @push.rocks/smartlog from ^3.0.3 to ^3.0.7
- Upgraded @push.rocks/smartpromise from ^4.0.3 to ^4.0.4
- Upgraded typescript from 5.4.5 to 5.5.2
- Upgraded @git.zone/tsrun from ^1.2.46 to ^1.2.47
- Upgraded @types/node from ^20.12.11 to ^20.14.8
## 2024-05-17 - 2.1.80 - core
Fix multiple core issues.
- Various small fixes and updates to the core functionality.
## 2024-05-17 - 2.1.76 to 2.1.79 - core
Routine core updates and fixes.
- Several minor enhancements and bug fixes.
## 2024-05-14 - 2.1.74 to 2.1.75 - core
General core maintenance updates.
- Core updated to fix minor bugs.
## 2024-05-10 - 2.1.72 to 2.1.73 - core
Minor core updates.
- Improvements and fixes to core components.
## 2024-01-08 - 2.1.70 to 2.1.71 - core
Core functionality enhancements.
- Small fixes and updates in the core.
## 2023-08-26 - 2.1.66 to 2.1.69 - core
Regular core updates and fixes.
- Various updates to improve core functionality.
## 2023-06-03 - 2.1.65 - core
Core maintenance update.
- Fixed issues in core functionality.
## 2022-08-03 - 2.1.63 to 2.1.64 - core
Minor core updates and fixes.
- Updated core functionality with minor fixes.
## 2022-05-25 - 2.1.61 to 2.1.62 - core
Routine core updates.
- Fixed minor bugs in the core.
## 2022-03-24 - 2.1.60 - core
Core functionality update.
- Fixed various minor issues in core.
## 2022-03-18 - 2.1.57 to 2.1.59 - core
Minor core updates and enhancements.
- Updated core components with small fixes.
## 2022-03-15 - 2.1.50 to 2.1.56 - core
Several core bug fixes.
- Fixed various minor issues in the core functionality.
## 2022-03-14 - 2.1.49 - core
Core update.
- Fixed minor bugs in the core.
## 2022-03-12 - 2.1.43 to 2.1.48 - core
General core maintenance updates.
- Core updated to fix minor bugs and improve functionality.
## 2022-03-11 - 2.1.33 to 2.1.42 - core
Core functionality enhancements and fixes.
- Multiple updates to improve core functionality and fix bugs.
## 2022-03-11 - 2.1.29 to 2.1.32 - core
Routine core updates.
- Minor bug fixes and improvements in core functionality.
## 2022-01-19 - 2.1.28 to 2.1.29 - core
Core bug fixes.
- Updated core to address minor issues.
## 2021-10-06 - 2.1.27 - core
Minor core update.
- Fixed core bugs.
## 2021-09-08 - 2.1.26 - core
Core update.
- Fixed minor bugs in the core.
## 2021-08-17 - 2.1.25 - core
Core bug fixes.
- Small updates to improve core functionality.
## 2020-08-11 - 2.1.24 - core
Routine core update.
- Fixed minor bugs in the core.
## 2020-05-14 - 2.1.23 - core
General core updates.
- Fixes to improve core stability.
## 2020-03-13 - 2.1.20 to 2.1.22 - core
Minor core updates.
- Enhancements and fixes for core functionality.
## 2020-03-09 - 2.1.19 - core
Maintenance core update.
- Fixes addressing minor issues in core functionality.
## 2019-08-26 - 2.1.16 to 2.1.17 - core
Routine minor core updates.
- Improvement and fixes within the core functionality.
## 2019-01-27 - 2.1.6 - custom directory compilation
Now picking up TypeScript files correctly.
- Resolved compilation issues with custom directories.
## 2018-12-05 - 2.1.0 to 2.1.1 - core
Minor core updates.
- Small enhancements and fixes applied to core functionality.
## 2018-12-05 - 2.0.22 - cli options
Now support --web for web compilations targeting Google Chrome.
- Added new CLI option for web compilation.
## 2018-07-25 - 2.0.15 to 2.0.19 - various
Multiple fixes across core, dependency, and compiler modules.
- Packagename fix in core.
- Dependency updates.
- Compiler options fixed.
- Initial core updates.

View File

@ -9,9 +9,23 @@
"githost": "gitlab.com", "githost": "gitlab.com",
"gitscope": "gitzone", "gitscope": "gitzone",
"gitrepo": "tsbuild", "gitrepo": "tsbuild",
"description": "TypeScript nightly to easily make use of latest features", "description": "A tool for compiling TypeScript files using the latest nightly features, offering flexible APIs and a CLI for streamlined development.",
"npmPackagename": "@gitzone/tsbuild", "npmPackagename": "@gitzone/tsbuild",
"license": "MIT" "license": "MIT",
} "keywords": [
"TypeScript",
"compilation",
"nightly features",
"CLI tool",
"file compilation",
"glob patterns",
"compiler options",
"development",
"API"
]
}
},
"tsdoc": {
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
} }
} }

View File

@ -1,8 +1,8 @@
{ {
"name": "@git.zone/tsbuild", "name": "@git.zone/tsbuild",
"version": "2.1.77", "version": "2.3.2",
"private": false, "private": false,
"description": "TypeScript nightly to easily make use of latest features", "description": "A tool for compiling TypeScript files using the latest nightly features, offering flexible APIs and a CLI for streamlined development.",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts", "typings": "dist_ts/index.d.ts",
"type": "module", "type": "module",
@ -16,31 +16,40 @@
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+ssh://git@gitlab.com/pushrocks/tsn.git" "url": "https://code.foss.global/git.zone/tsbuild.git"
}, },
"keywords": [ "keywords": [
"TypeScript" "TypeScript",
"compilation",
"nightly features",
"CLI tool",
"file compilation",
"glob patterns",
"compiler options",
"development",
"API"
], ],
"author": "Lossless GmbH", "author": "Lossless GmbH",
"license": "MIT", "license": "MIT",
"bugs": { "bugs": {
"url": "https://gitlab.com/pushrocks/tsn/issues" "url": "https://code.foss.global/git.zone/tsbuild/issues"
}, },
"homepage": "https://gitlab.com/pushrocks/tsn#README", "homepage": "https://code.foss.global/git.zone/tsbuild#README",
"dependencies": { "dependencies": {
"@git.zone/tspublish": "^1.9.1",
"@push.rocks/early": "^4.0.4", "@push.rocks/early": "^4.0.4",
"@push.rocks/smartcli": "^4.0.10", "@push.rocks/smartcli": "^4.0.11",
"@push.rocks/smartdelay": "^3.0.5", "@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartfile": "^11.0.14", "@push.rocks/smartfile": "^11.1.5",
"@push.rocks/smartlog": "^3.0.3", "@push.rocks/smartlog": "^3.0.7",
"@push.rocks/smartpath": "^5.0.18", "@push.rocks/smartpath": "^5.0.18",
"@push.rocks/smartpromise": "^4.0.3", "@push.rocks/smartpromise": "^4.2.2",
"typescript": "5.4.5" "typescript": "5.7.3"
}, },
"devDependencies": { "devDependencies": {
"@git.zone/tsrun": "^1.2.46", "@git.zone/tsrun": "^1.2.47",
"@push.rocks/tapbundle": "^5.0.23", "@push.rocks/tapbundle": "^5.5.6",
"@types/node": "^20.12.11" "@types/node": "^22.12.0"
}, },
"files": [ "files": [
"ts/**/*", "ts/**/*",

7357
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

0
readme.hints.md Normal file
View File

280
readme.md
View File

@ -1,84 +1,216 @@
# @gitzone/tsbuild # @git.zone/tsbuild
TypeScript nightly to easily make use of latest features
## Availabililty and Links A flexible TypeScript compiler that leverages the latest TypeScript features to streamline your build process.
* [npmjs.org (npm package)](https://www.npmjs.com/package/@gitzone/tsbuild)
* [gitlab.com (source)](https://gitlab.com/gitzone/tsbuild)
* [github.com (source mirror)](https://github.com/gitzone/tsbuild)
* [docs (typedoc)](https://gitzone.gitlab.io/tsbuild/)
## Status for master ## Install
Status Category | Status Badge Add `@git.zone/tsbuild` to your project using npm or yarn:
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/gitzone/tsbuild/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/gitzone/tsbuild/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@gitzone/tsbuild)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/gitzone/tsbuild)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@gitzone/tsbuild)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@gitzone/tsbuild)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@gitzone/tsbuild)](https://lossless.cloud)
## Usage ```bash
npm install @git.zone/tsbuild
Tsn uses the **next** tagged npm version of typescript
```typescript
import * as tsn from 'tsn';
let myGlobStringObject = {
'./myTsFolder/**/*.ts': './myDestinationFolder/',
'./someOtherTsFolder/**/*.ts': './myOtherDestinationFolder/',
};
let tsOptions = {
target: tsn.ScriptTarget.ES2015,
module: tsn.ModuleKind.CommonJS,
};
/*
note: since this only works in code, here are the target numbers
enum ScriptTarget {
ES3 = 0,
ES5 = 1,
ES2015 = 2,
ES2016 = 3,
ES2017 = 4,
ESNext = 5,
Latest = 5,
}
and here are the module kinds
enum ModuleKind {
None = 0,
CommonJS = 1,
AMD = 2,
UMD = 3,
System = 4,
ES2015 = 5,
}
*/
let myCwd = process.cwd();
tsn.compileGlobStringObject(
myGlobStringObject, // the glob string object describing from where to compile what to where
tsOptions, // the options for TypeScript
myCwd // a custom cwd, optional, defaults to process.cwd()
);
``` ```
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks) or
## Contribution ```bash
yarn add @git.zone/tsbuild
```
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :) ## Key Features
For further information read the linked docs at the top of this readme. - Utilize the latest TypeScript features
- Flexible API for customized compilation processes
- Intuitive CLI for common build tasks
- Support for glob patterns to easily target files
- Ordered compilation to respect module dependencies
## Legal ## API Reference
> MIT licensed | **©** [Task Venture Capital GmbH](https://task.vc)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy) ### Core Compilation Functions
#### `compileFileArray(fileStringArrayArg: string[], compilerOptionsArg?: CompilerOptions, argvArg?: any): Promise<any[]>`
Compiles an array of TypeScript files with customizable compiler options.
```typescript
import { compileFileArray } from '@git.zone/tsbuild';
const files = [
'./src/file1.ts',
'./src/file2.ts',
];
const options = {
target: "ES2020",
module: "CommonJS"
};
compileFileArray(files, options)
.then(compiledFiles => {
console.log('Compiled Files:', compiledFiles);
})
.catch(error => {
console.error('Compilation Error:', error);
});
```
#### `compileGlobStringObject(globStringObjectArg: Record<string, string>, tsOptionsArg?: CompilerOptions, cwdArg?: string, argvArg?: any): Promise<any[]>`
Compiles files matching glob patterns to specified output directories.
```typescript
import { compileGlobStringObject } from '@git.zone/tsbuild';
const globPattern = {
'./src/**/*.ts': './dist',
};
const compilerOptions = {
target: "ESNext",
module: "ESNext",
};
compileGlobStringObject(globPattern, compilerOptions)
.then(compiledFiles => {
console.log('Compilation complete:', compiledFiles);
})
.catch(error => {
console.error('Error during compilation:', error);
});
```
## Command Line Interface
The CLI provides convenient commands for common compilation tasks.
### Standard Command
Compiles all TypeScript files in the `ts/` directory to the `dist_ts` directory:
```bash
npx tsbuild
```
### Custom Command
Compile specific directories to corresponding `dist_` directories:
```bash
npx tsbuild custom <Dir1> <Dir2> ...
```
Example: `npx tsbuild custom src utils` compiles:
- `./src/**/*.ts``./dist_src`
- `./utils/**/*.ts``./dist_utils`
### TSFolders Command
Compiles TypeScript folders in a specific order based on dependencies:
```bash
npx tsbuild tsfolders
```
This command:
1. Identifies all folders starting with `ts` in the current directory
2. Prioritizes `ts_interfaces` and `ts_shared` to be compiled first
3. Orders other folders based on the `order` property in their `tspublish.json` files (if available)
4. Compiles each folder to its corresponding `dist_` folder
Example compilation order output:
```
compiling in this order:
[ 'ts_interfaces', 'ts_shared', 'ts_core', 'ts_utils', 'ts_modules' ]
```
### EmitCheck Command
Checks if TypeScript files can be emitted without actually emitting them:
```bash
npx tsbuild emitcheck <file_or_glob_pattern> [additional_patterns ...]
```
This command:
1. Performs type checking on the specified TypeScript file(s)
2. Supports both direct file paths and glob patterns
3. Reports any errors that would prevent successful compilation
4. Exits with code 0 if all files can be emitted, or 1 if any cannot
5. Doesn't produce any output files
Example usage with specific files:
```bash
npx tsbuild emitcheck src/main.ts src/utils.ts
```
Example usage with glob patterns:
```bash
npx tsbuild emitcheck "src/**/*.ts" "test/**/*.ts"
```
## Compiler Options
Additional flags can be passed to any command to modify the compilation behavior:
- `--skiplibcheck`: Skip type checking of declaration files (shows warning)
- `--allowimplicitany`: Allow variables to be implicitly typed as `any`
- `--commonjs`: Use CommonJS module format instead of ESNext
Example:
```bash
npx tsbuild --skiplibcheck --allowimplicitany
```
## Default Compiler Options
By default, `@git.zone/tsbuild` uses the following compiler options:
```typescript
{
declaration: true,
emitDecoratorMetadata: true,
experimentalDecorators: true,
inlineSourceMap: true,
noEmitOnError: true,
outDir: 'dist_ts/',
module: ModuleKind.NodeNext,
target: ScriptTarget.ESNext,
moduleResolution: ModuleResolutionKind.NodeNext,
lib: ['lib.dom.d.ts', 'lib.es2022.d.ts'],
noImplicitAny: true,
esModuleInterop: true,
useDefineForClassFields: false,
verbatimModuleSyntax: true,
baseUrl: './',
}
```
These options can be overridden by providing a custom `CompilerOptions` object.
## Path Resolution
The package automatically detects and applies path mappings from your `tsconfig.json`. When it finds path mappings, it adjusts them to work with the compiled output by replacing `./ts_` with `./dist_ts_` in path aliases.
## Notes and Best Practices
- Each glob pattern compilation runs in its own pass, which may cause duplicate error messages if shared files are included in multiple patterns
- Use the `--skiplibcheck` option cautiously as it will pause for 5 seconds with a warning before continuing
- If you need different output configurations for different file sets, use multiple calls to `compileGlobStringObject`
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -1,8 +1,8 @@
/** /**
* autocreated commitinfo by @pushrocks/commitinfo * autocreated commitinfo by @push.rocks/commitinfo
*/ */
export const commitinfo = { export const commitinfo = {
name: '@git.zone/tsbuild', name: '@git.zone/tsbuild',
version: '2.1.77', version: '2.3.2',
description: 'TypeScript nightly to easily make use of latest features' description: 'A tool for compiling TypeScript files using the latest nightly features, offering flexible APIs and a CLI for streamlined development.'
} }

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

@ -1,109 +0,0 @@
// import all the stuff we need
import * as plugins from './plugins.js';
import type { CompilerOptions, ScriptTarget, ModuleKind } from './tsbuild.exports.js';
/**
* the default typescript compilerOptions
*/
export const compilerOptionsDefault: CompilerOptions = {
declaration: true,
emitDecoratorMetadata: true,
experimentalDecorators: true,
inlineSourceMap: true,
noEmitOnError: true,
outDir: 'dist_ts/',
module: plugins.typescript.ModuleKind.NodeNext,
target: plugins.typescript.ScriptTarget.ESNext,
moduleResolution: plugins.typescript.ModuleResolutionKind.NodeNext,
lib: ['lib.dom.d.ts', 'es2022'],
noImplicitAny: true,
esModuleInterop: true,
useDefineForClassFields: false,
verbatimModuleSyntax: true,
};
/**
* merges compilerOptions with the default compiler options
*/
export const mergeCompilerOptions = (
customTsOptions: CompilerOptions,
argvArg?: any
): CompilerOptions => {
// create merged options
const mergedOptions: CompilerOptions = {
...compilerOptionsDefault,
...customTsOptions,
...(argvArg && argvArg.skiplibcheck
? {
skipLibCheck: true,
}
: {}),
...(argvArg && argvArg.allowimplicitany
? {
noImplicitAny: false,
}
: {}),
...(argvArg && argvArg.commonjs
? {
module: plugins.typescript.ModuleKind.CommonJS,
moduleResolution: plugins.typescript.ModuleResolutionKind.NodeJs,
}
: {}),
};
console.log(mergedOptions);
return mergedOptions;
};
/**
* the internal main compiler function that compiles the files
*/
export const compiler = async (
fileNames: string[],
options: plugins.typescript.CompilerOptions,
argvArg?: any
): Promise<any[]> => {
if (options.skipLibCheck) {
console.log('? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?');
console.log('You are skipping libcheck... Is that really wanted?');
console.log('continuing in 5 seconds...');
console.log('? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?');
await plugins.smartdelay.delayFor(5000);
}
console.log(`Compiling ${fileNames.length} files...`);
const done = plugins.smartpromise.defer<any[]>();
const program = plugins.typescript.createProgram(fileNames, options);
const emitResult = program.emit();
// implement check only
/*let emitResult = program.emit(undefined,(args) => {
console.log(args)
});*/
const allDiagnostics = plugins.typescript
.getPreEmitDiagnostics(program)
.concat(emitResult.diagnostics);
allDiagnostics.forEach((diagnostic) => {
if (diagnostic.file) {
const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start!);
const message = plugins.typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
console.log(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
} else {
console.log(
`${plugins.typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n')}`
);
}
});
const exitCode = emitResult.emitSkipped ? 1 : 0;
if (exitCode === 0) {
console.log('TypeScript emit succeeded!');
done.resolve(emitResult.emittedFiles);
} else {
console.error('TypeScript emit failed. Please investigate!');
process.exit(exitCode);
}
return done.promise;
};

View File

@ -0,0 +1,271 @@
// import all the stuff we need
import * as plugins from './plugins.js';
import * as paths from './paths.js';
import type { CompilerOptions, ScriptTarget, ModuleKind } from './tsbuild.exports.js';
/**
* Default compiler options for TypeScript compilation
*/
export const compilerOptionsDefault: CompilerOptions = {
declaration: true,
emitDecoratorMetadata: true,
experimentalDecorators: true,
inlineSourceMap: true,
noEmitOnError: true,
outDir: 'dist_ts/',
module: plugins.typescript.ModuleKind.NodeNext,
target: plugins.typescript.ScriptTarget.ESNext,
moduleResolution: plugins.typescript.ModuleResolutionKind.NodeNext,
lib: ['lib.dom.d.ts', 'lib.es2022.d.ts'],
noImplicitAny: true,
esModuleInterop: true,
useDefineForClassFields: false,
verbatimModuleSyntax: true,
baseUrl: './',
};
/**
* TsBuild class for handling TypeScript compilation
*/
export class TsBuild {
private fileNames: string[] = [];
private options: plugins.typescript.CompilerOptions;
private argvArg?: any;
/**
* Create a new TsBuild instance
*/
constructor(
fileNames: string[] = [],
customOptions: CompilerOptions = {},
argvArg?: any
) {
this.fileNames = fileNames;
this.argvArg = argvArg;
this.options = this.mergeCompilerOptions(customOptions, argvArg);
}
/**
* Helper function to read and process tsconfig.json
*/
private getTsConfigOptions(): CompilerOptions {
console.log(`looking at tsconfig.json at ${paths.cwd}`);
const tsconfig = plugins.smartfile.fs.toObjectSync(plugins.path.join(paths.cwd, 'tsconfig.json'));
const returnObject: CompilerOptions = {};
if (!tsconfig || !tsconfig.compilerOptions) {
return returnObject;
}
if (tsconfig.compilerOptions.baseUrl) {
console.log('baseUrl found in tsconfig.json');
returnObject.baseUrl = tsconfig.compilerOptions.baseUrl;
}
if (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;
}
/**
* Process command line arguments and return applicable compiler options
*/
private getCommandLineOptions(argvArg?: any): CompilerOptions {
if (!argvArg) return {};
const options: CompilerOptions = {};
if (argvArg.skiplibcheck) {
options.skipLibCheck = true;
}
if (argvArg.allowimplicitany) {
options.noImplicitAny = false;
}
if (argvArg.commonjs) {
options.module = plugins.typescript.ModuleKind.CommonJS;
options.moduleResolution = plugins.typescript.ModuleResolutionKind.NodeJs;
}
return options;
}
/**
* Merges compilerOptions with the default compiler options
*/
public mergeCompilerOptions(
customTsOptions: CompilerOptions = {},
argvArg?: any
): CompilerOptions {
// create merged options
const mergedOptions: CompilerOptions = {
...compilerOptionsDefault,
...customTsOptions,
...this.getCommandLineOptions(argvArg),
...this.getTsConfigOptions(),
};
console.log(mergedOptions);
return mergedOptions;
}
/**
* Helper function to handle and log TypeScript diagnostics
*/
private handleDiagnostics(diagnostics: readonly plugins.typescript.Diagnostic[]): boolean {
let hasErrors = false;
diagnostics.forEach((diagnostic) => {
hasErrors = true;
if (diagnostic.file) {
const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start!);
const message = plugins.typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
console.log(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
} else {
console.log(
`${plugins.typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n')}`
);
}
});
return hasErrors;
}
/**
* Creates a TypeScript program from file names and options
*/
private createProgram(
options: plugins.typescript.CompilerOptions = this.options
): plugins.typescript.Program {
return plugins.typescript.createProgram(this.fileNames, options);
}
/**
* Set file names to be compiled
*/
public setFileNames(fileNames: string[]): void {
this.fileNames = fileNames;
}
/**
* Set compiler options
*/
public setOptions(options: CompilerOptions): void {
this.options = { ...this.options, ...options };
}
/**
* The main compiler function that compiles the files
*/
public async compile(): Promise<any[]> {
if (this.options.skipLibCheck) {
console.log('? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?');
console.log('You are skipping libcheck... Is that really wanted?');
console.log('continuing in 5 seconds...');
console.log('? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?');
await plugins.smartdelay.delayFor(5000);
}
console.log(`Compiling ${this.fileNames.length} files...`);
const done = plugins.smartpromise.defer<any[]>();
const program = this.createProgram();
// Check for pre-emit diagnostics first
const preEmitDiagnostics = plugins.typescript.getPreEmitDiagnostics(program);
const hasPreEmitErrors = this.handleDiagnostics(preEmitDiagnostics);
// Only continue to emit phase if no pre-emit errors
if (hasPreEmitErrors) {
console.error('TypeScript pre-emit checks failed. Please fix the issues above.');
process.exit(1);
}
// If no pre-emit errors, proceed with emit
const emitResult = program.emit();
const hasEmitErrors = this.handleDiagnostics(emitResult.diagnostics);
const exitCode = emitResult.emitSkipped ? 1 : 0;
if (exitCode === 0) {
console.log('TypeScript emit succeeded!');
done.resolve(emitResult.emittedFiles);
} else {
console.error('TypeScript emit failed. Please investigate!');
process.exit(exitCode);
}
return done.promise;
}
/**
* Function to check if files can be emitted without actually emitting them
*/
public async checkEmit(): Promise<boolean> {
console.log(`Checking if ${this.fileNames.length} files can be emitted...`);
// Create a program with noEmit option
const program = this.createProgram({
...this.options,
noEmit: true
});
// Check for pre-emit diagnostics
const preEmitDiagnostics = plugins.typescript.getPreEmitDiagnostics(program);
const hasPreEmitErrors = this.handleDiagnostics(preEmitDiagnostics);
// Run the emit phase but with noEmit: true to check for emit errors without producing files
const emitResult = program.emit(undefined, undefined, undefined, true);
const hasEmitErrors = this.handleDiagnostics(emitResult.diagnostics);
const success = !hasPreEmitErrors && !hasEmitErrors && !emitResult.emitSkipped;
if (success) {
console.log('TypeScript emit check passed! File can be emitted successfully.');
} else {
console.error('TypeScript emit check failed. Please fix the issues above.');
}
return success;
}
}
/**
* Merges compilerOptions with the default compiler options (backward compatibility)
*/
export const mergeCompilerOptions = (
customTsOptions: CompilerOptions,
argvArg?: any
): CompilerOptions => {
const tsBuild = new TsBuild();
return tsBuild.mergeCompilerOptions(customTsOptions, argvArg);
};
/**
* The internal main compiler function that compiles the files (backward compatibility)
*/
export const compiler = async (
fileNames: string[],
options: plugins.typescript.CompilerOptions,
argvArg?: any
): Promise<any[]> => {
const tsBuild = new TsBuild(fileNames, options, argvArg);
return tsBuild.compile();
};
/**
* Function to check if a TypeScript file can be emitted without actually emitting it (backward compatibility)
*/
export const emitCheck = async (
fileNames: string[],
options: plugins.typescript.CompilerOptions = {},
argvArg?: any
): Promise<boolean> => {
const tsBuild = new TsBuild(fileNames, options, argvArg);
return tsBuild.checkEmit();
};

View File

@ -33,31 +33,137 @@ export const runCli = async () => {
}); });
/** /**
* the custom command compiles any customDir to dist_customDir * the emitcheck command checks if a TypeScript file can be emitted without actually emitting it
*/ */
tsbuildCli.addCommand('tsfolders').subscribe(async (argvArg) => { tsbuildCli.addCommand('emitcheck').subscribe(async (argvArg) => {
const tsFolders = await plugins.smartfile.fs.listFolders(paths.cwd, /^ts/); const patterns = argvArg._.slice(1); // Remove the first element which is 'emitcheck'
// lets make sure interfaces are always transpiled first if (patterns.length === 0) {
const index = tsFolders.indexOf('ts_interfaces'); console.error('Error: Please provide at least one TypeScript file path or glob pattern');
if (index > -1) { process.exit(1);
tsFolders.splice(index, 1);
tsFolders.unshift('ts_interfaces');
} }
const compilationCommandObject: { [key: string]: string } = {};
for (const tsFolder of tsFolders) { const cwd = process.cwd();
compilationCommandObject[`./${tsFolder}/**/*.ts`] = `./dist_${tsFolder}`; 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);
} }
await tsbuild.compileGlobStringObject(compilationCommandObject, {}, process.cwd(), argvArg); } 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('Error: No TypeScript files found to check');
process.exit(1);
}
console.log(`Found ${allFiles.length} TypeScript files to check`);
// Process compiler options
const compilerOptions = tsbuild.mergeCompilerOptions({}, argvArg);
// Run emit check
const success = await tsbuild.emitCheck(allFiles, compilerOptions, argvArg);
// Exit with appropriate code
process.exit(success ? 0 : 1);
}); });
/** /**
* the custom command compiles any customDir to dist_customDir * the custom command compiles any customDir to dist_customDir
*/ */
tsbuildCli.addCommand('interfaces').subscribe(async (argvArg) => { tsbuildCli.addCommand('tsfolders').subscribe(async (argvArg) => {
const tsFolders = ['ts_interfaces']; const tsFolders = await plugins.smartfile.fs.listFolders(paths.cwd, /^ts/);
// 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);
// 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 } = {}; const compilationCommandObject: { [key: string]: string } = {};
for (const tsFolder of tsFolders) { console.log(`compiling in this order:`);
console.log(sortedTsFolders);
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);

View File

@ -1,10 +1,10 @@
import * as plugins from './plugins.js'; import * as plugins from './plugins.js';
import type { CompilerOptions, ScriptTarget, ModuleKind } from 'typescript'; import type { CompilerOptions, ScriptTarget, ModuleKind } from 'typescript';
import { compiler, mergeCompilerOptions } from './tsbuild.classes.compiler.js'; import { compiler, mergeCompilerOptions, emitCheck } from './tsbuild.classes.tsbuild.js';
export type { CompilerOptions, ScriptTarget, ModuleKind }; export type { CompilerOptions, ScriptTarget, ModuleKind };
export * from './tsbuild.classes.compiler.js'; export * from './tsbuild.classes.tsbuild.js';
/** /**
* compile am array of absolute file paths * compile am array of absolute file paths
@ -25,35 +25,52 @@ export let compileFileArray = (
* } * }
*/ */
export let compileGlobStringObject = async ( export let compileGlobStringObject = async (
globStringObjectArg: any, globStringObjectArg: Record<string, string>,
tsOptionsArg: CompilerOptions = {}, tsOptionsArg: CompilerOptions = {},
cwdArg: string = process.cwd(), cwdArg: string = process.cwd(),
argvArg?: any argvArg?: any
) => { ) => {
let compiledFiles: plugins.smartfile.SmartFile[] = []; let compiledFiles: any[] = [];
for (const keyArg in globStringObjectArg) { for (const keyArg in globStringObjectArg) {
if (globStringObjectArg[keyArg]) { // Type safety check for key
if (keyArg && typeof keyArg === 'string' && globStringObjectArg[keyArg]) {
console.log( console.log(
`TypeScript assignment: transpile from ${keyArg} to ${globStringObjectArg[keyArg]}` `TypeScript assignment: transpile from ${keyArg} to ${globStringObjectArg[keyArg]}`
); );
// Get files matching the glob pattern
const fileTreeArray = await plugins.smartfile.fs.listFileTree(cwdArg, keyArg); const fileTreeArray = await plugins.smartfile.fs.listFileTree(cwdArg, keyArg);
const absoluteFilePathArray: string[] = plugins.smartpath.transform.toAbsolute(
fileTreeArray, // Ensure fileTreeArray contains only strings before transforming
const stringFileTreeArray = Array.isArray(fileTreeArray)
? fileTreeArray.filter((item): item is string => typeof item === 'string')
: [];
// Transform to absolute paths
const absoluteFilePathArray = plugins.smartpath.transform.toAbsolute(
stringFileTreeArray,
cwdArg cwdArg
) as string[]; ) as string[];
// Get destination directory as absolute path
const destDir: string = plugins.smartpath.transform.toAbsolute( const destDir: string = plugins.smartpath.transform.toAbsolute(
globStringObjectArg[keyArg], globStringObjectArg[keyArg],
cwdArg cwdArg
) as string; ) as string;
tsOptionsArg = {
// Update compiler options with the output directory
const updatedTsOptions: CompilerOptions = {
...tsOptionsArg, ...tsOptionsArg,
outDir: destDir, outDir: destDir,
}; };
compiledFiles = compiledFiles.concat(
compiledFiles, // Compile the files and correctly concat the results
await compileFileArray(absoluteFilePathArray, tsOptionsArg, argvArg) // Fixed: removed duplicating compiledFiles in the concat operation
); const newlyCompiledFiles = await compileFileArray(absoluteFilePathArray, updatedTsOptions, argvArg);
compiledFiles = compiledFiles.concat(newlyCompiledFiles);
} }
} }
return compiledFiles; return compiledFiles;
}; };