Compare commits

..

No commits in common. "master" and "v2.1.9" have entirely different histories.

34 changed files with 1834 additions and 8033 deletions

23
.gitignore vendored
View File

@ -1,20 +1,7 @@
.nogit/ # gitzone standard
# artifacts
coverage/
public/
pages/
# installs
node_modules/ node_modules/
coverage/
# caches pages/
.yarn/ public/
.cache/ assets/output/
.rpt2_cache
# builds
dist/ dist/
dist_*/
# custom

125
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,125 @@
# gitzone standard
image: hosttoday/ht-docker-node:npmci
cache:
paths:
- .npmci_cache/
key: "$CI_BUILD_STAGE"
stages:
- security
- test
- release
- metadata
# ====================
# security stage
# ====================
mirror:
stage: security
script:
- npmci git mirror
tags:
- docker
- notpriv
snyk:
stage: security
script:
- npmci npm prepare
- npmci command npm install -g snyk
- npmci command npm install --ignore-scripts
- npmci command snyk test
tags:
- docker
- notpriv
# ====================
# test stage
# ====================
testLTS:
stage: test
script:
- npmci npm prepare
- npmci node install lts
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
testSTABLE:
stage: test
script:
- npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
release:
stage: release
script:
- npmci node install stable
- npmci npm publish
only:
- tags
tags:
- docker
- notpriv
# ====================
# metadata stage
# ====================
codequality:
stage: metadata
image: docker:stable
allow_failure: true
services:
- docker:stable-dind
script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
- docker run
--env SOURCE_CODE="$PWD"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
artifacts:
paths: [codeclimate.json]
tags:
- docker
- priv
trigger:
stage: metadata
script:
- npmci trigger
only:
- tags
tags:
- docker
- notpriv
pages:
image: hosttoday/ht-docker-node:npmci
stage: metadata
script:
- npmci command npm install -g typedoc typescript
- npmci npm prepare
- npmci npm install
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/
tags:
- docker
- notpriv
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public
allow_failure: true

4
.snyk Normal file
View File

@ -0,0 +1,4 @@
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
version: v1.13.3
ignore: {}
patch: {}

11
.vscode/launch.json vendored
View File

@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "npm test",
"name": "Run npm test",
"request": "launch",
"type": "node-terminal"
}
]
}

26
.vscode/settings.json vendored
View File

@ -1,26 +0,0 @@
{
"json.schemas": [
{
"fileMatch": ["/npmextra.json"],
"schema": {
"type": "object",
"properties": {
"npmci": {
"type": "object",
"description": "settings for npmci"
},
"gitzone": {
"type": "object",
"description": "settings for gitzone",
"properties": {
"projectType": {
"type": "string",
"enum": ["website", "element", "service", "npm", "wcc"]
}
}
}
}
}
}
]
}

70
README.md Normal file
View File

@ -0,0 +1,70 @@
# tsn
## Availabililty
[![npm](https://push.rocks/assets/repo-button-npm.svg)](https://www.npmjs.com/package/tsn)
[![git](https://push.rocks/assets/repo-button-git.svg)](https://gitlab.com/pushrocks/tsn)
[![git](https://push.rocks/assets/repo-button-mirror.svg)](https://github.com/pushrocks/tsn)
[![docs](https://push.rocks/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/tsn/)
## Status for master
[![build status](https://gitlab.com/pushrocks/tsn/badges/master/build.svg)](https://gitlab.com/pushrocks/tsn/commits/master)
[![coverage report](https://gitlab.com/pushrocks/tsn/badges/master/coverage.svg)](https://gitlab.com/pushrocks/tsn/commits/master)
[![Dependency Status](https://david-dm.org/pushrocks/tsn.svg)](https://david-dm.org/pushrocks/tsn)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/tsn/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/tsn/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/tsn/badges/code.svg)](https://www.bithound.io/github/pushrocks/tsn)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Usage
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)

View File

@ -1,257 +0,0 @@
# 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

@ -1,4 +0,0 @@
#!/usr/bin/env node
process.env.CLI_CALL = 'true';
import * as cliTool from './ts/index.js';
cliTool.runCli();

5
cli.js
View File

@ -1,4 +1,3 @@
#!/usr/bin/env node #!/usr/bin/env node
process.env.CLI_CALL = 'true'; process.env.CLI_CALL_TSBUILD = 'true'
const cliTool = await import('./dist_ts/index.js'); var index = require("./dist/index.js");
cliTool.runCli();

View File

@ -1,4 +1,4 @@
#!/usr/bin/env node #!/usr/bin/env node
process.env.CLI_CALL = 'true'; process.env.CLI_CALL_TSBUILD = 'true';
import * as tsrun from '@git.zone/tsrun'; require('@gitzone/tsrun');
tsrun.runPath('./cli.child.js'); require('./ts/index');

View File

@ -2,30 +2,5 @@
"npmci": { "npmci": {
"npmGlobalTools": [], "npmGlobalTools": [],
"npmAccessLevel": "public" "npmAccessLevel": "public"
},
"gitzone": {
"projectType": "npm",
"module": {
"githost": "gitlab.com",
"gitscope": "gitzone",
"gitrepo": "tsbuild",
"description": "A tool for compiling TypeScript files using the latest nightly features, offering flexible APIs and a CLI for streamlined development.",
"npmPackagename": "@gitzone/tsbuild",
"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"
} }
} }

1408
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,69 +1,44 @@
{ {
"name": "@git.zone/tsbuild", "name": "@gitzone/tsbuild",
"version": "2.3.2", "version": "2.1.9",
"private": false, "private": false,
"description": "A tool for compiling TypeScript files using the latest nightly features, offering flexible APIs and a CLI for streamlined development.", "description": "TypeScript nightly to easily make use of latest features",
"main": "dist_ts/index.js", "main": "dist/index.js",
"typings": "dist_ts/index.d.ts", "typings": "dist/index.d.ts",
"type": "module",
"bin": { "bin": {
"tsbuild": "./cli.js" "tsbuild": "cli.js"
}, },
"scripts": { "scripts": {
"test": "tsrun test/test.ts", "test": "tsrun test/test.ts",
"build": "node cli.ts.js --web --allowimplicitany", "testCustom": "node cli.ts.js custom ts_web",
"buildDocs": "tsdoc" "build": "node cli.ts.js"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://code.foss.global/git.zone/tsbuild.git" "url": "git+ssh://git@gitlab.com/pushrocks/tsn.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://code.foss.global/git.zone/tsbuild/issues" "url": "https://gitlab.com/pushrocks/tsn/issues"
}, },
"homepage": "https://code.foss.global/git.zone/tsbuild#README", "homepage": "https://gitlab.com/pushrocks/tsn#README",
"dependencies": { "dependencies": {
"@git.zone/tspublish": "^1.9.1", "@pushrocks/smartcli": "^3.0.7",
"@push.rocks/early": "^4.0.4", "@pushrocks/smartfile": "^6.0.11",
"@push.rocks/smartcli": "^4.0.11", "@pushrocks/smartlog": "^2.0.9",
"@push.rocks/smartdelay": "^3.0.5", "@pushrocks/smartpath": "^4.0.1",
"@push.rocks/smartfile": "^11.1.5", "@pushrocks/smartpromise": "^2.0.5",
"@push.rocks/smartlog": "^3.0.7", "typescript": "^3.2.2"
"@push.rocks/smartpath": "^5.0.18",
"@push.rocks/smartpromise": "^4.2.2",
"typescript": "5.7.3"
}, },
"devDependencies": { "devDependencies": {
"@git.zone/tsrun": "^1.2.47", "@gitzone/tsrun": "^1.1.17",
"@push.rocks/tapbundle": "^5.5.6", "@pushrocks/tapbundle": "^3.0.7",
"@types/node": "^22.12.0" "@types/node": "^10.12.12",
}, "tslint": "^5.11.0",
"files": [ "tslint-config-prettier": "^1.17.0"
"ts/**/*", }
"ts_web/**/*",
"dist/**/*",
"dist_*/**/*",
"dist_ts/**/*",
"dist_ts_web/**/*",
"assets/**/*",
"cli.js",
"npmextra.json",
"readme.md"
],
"browserslist": [
"last 1 chrome versions"
]
} }

6866
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

216
readme.md
View File

@ -1,216 +0,0 @@
# @git.zone/tsbuild
A flexible TypeScript compiler that leverages the latest TypeScript features to streamline your build process.
## Install
Add `@git.zone/tsbuild` to your project using npm or yarn:
```bash
npm install @git.zone/tsbuild
```
or
```bash
yarn add @git.zone/tsbuild
```
## Key Features
- 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
## API Reference
### 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 +1,5 @@
export {}; declare class test2 {
test: string[];
constructor();
}
declare const run: () => Promise<string>;

View File

@ -1,10 +1,5 @@
console.log('test'); console.log('test');
console.log('test2'); console.log('test2');
import * as early from '@push.rocks/early';
early.start();
early.stop();
import { anExportedString } from './tocompile2.js';
console.log(anExportedString);
class test2 { class test2 {
constructor() { constructor() {
this.test = []; this.test = [];
@ -14,4 +9,4 @@ class test2 {
const run = async () => { const run = async () => {
return 'hi'; return 'hi';
}; };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jb21waWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdG9jb21waWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVyQixPQUFPLEtBQUssS0FBSyxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNkLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUViLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUU5QixNQUFNLEtBQUs7SUFFVDtRQURBLFNBQUksR0FBYSxFQUFFLENBQUM7UUFFbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLElBQXFCLEVBQUU7SUFDdEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jb21waWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdG9jb21waWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyQixNQUFNLEtBQUs7SUFFVDtRQURBLFNBQUksR0FBYSxFQUFFLENBQUM7UUFFbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLElBQXFCLEVBQUU7SUFDdEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMifQ==

View File

@ -1 +0,0 @@
export declare const anExportedString = "exported string";

View File

@ -1,3 +1,2 @@
console.log('hello'); console.log('hello');
export const anExportedString = 'exported string'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jb21waWxlMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RvY29tcGlsZTIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyJ9
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jb21waWxlMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RvY29tcGlsZTIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyJ9

View File

@ -1,14 +1,5 @@
console.log('test'); console.log('test');
console.log('test2'); console.log('test2');
import * as early from '@push.rocks/early';
early.start();
early.stop();
import { anExportedString } from './tocompile2.js';
console.log(anExportedString);
class test2 { class test2 {
test: string[] = []; test: string[] = [];
constructor() { constructor() {

View File

@ -1,2 +1 @@
console.log('hello'); console.log('hello');
export const anExportedString = 'exported string';

View File

@ -1,19 +1,19 @@
import { tap, expect, expectAsync } from '@push.rocks/tapbundle'; import { tap, expect } from '@pushrocks/tapbundle';
import * as tsbuild from '../ts/index.js'; import * as tsn from '../ts/index';
let assetfiles: string[] = ['./test/assets/tocompile.ts', './test/assets/tocompile2.ts']; let assetfiles: string[] = ['./test/assets/tocompile.ts', './test/assets/tocompile2.ts'];
let assetfiles2 = { let assetfiles2 = {
'./test/assets/**/!(*.d.ts|*.js|output)': './test/assets/output', './test/assets/**/!(*.d.ts|*.js|output)': './test/assets/output'
}; };
tap.test('should convert files from an array with single files to output', async (tools) => { tap.test('should convert files from an array with single files to output', async tools => {
tsbuild.compileFileArray(assetfiles, { outDir: './test/assets/output' }); tsn.compileFileArray(assetfiles, { outDir: './test/assets/output' });
}); });
tap.test('should convert files from an array with single files to output', async (tools) => { tap.test('should convert files from an array with single files to output', async tools => {
tsbuild.compileGlobStringObject(assetfiles2); tsn.compileGlobStringObject(assetfiles2);
}); });
tap.start(); tap.start();

View File

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

View File

@ -1,5 +1,3 @@
import * as early from '@push.rocks/early'; export * from './tsbuild.exports';
early.start('tsbuild');
export * from './tsbuild.exports.js'; import './tsbuild.cli';
export * from './tsbuild.cli.js';
early.stop();

View File

@ -1,4 +0,0 @@
import * as plugins from './plugins.js';
export const cwd = process.cwd();
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');

View File

@ -1,29 +0,0 @@
// node native
import * as path from 'path';
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';
import * as smartfile from '@push.rocks/smartfile';
import * as smartpath from '@push.rocks/smartpath';
import * as smartpromise from '@push.rocks/smartpromise';
export { smartcli, smartdelay, smartfile, smartpath, smartpromise };
// third party scope
import typescript from 'typescript';
export {
typescript
}

View File

@ -0,0 +1,91 @@
// import all the stuff we need
import * as plugins from './tsbuild.plugins';
import { CompilerOptions } from 'typescript';
export { CompilerOptions, ScriptTarget, ModuleKind } from 'typescript';
/**
* the default typescript compilerOptions
*/
export const compilerOptionsDefault: CompilerOptions = {
declaration: true,
emitDecoratorMetadata: true,
experimentalDecorators: true,
inlineSourceMap: true,
noEmitOnError: true,
outDir: 'dist/',
module: plugins.typescript.ModuleKind.CommonJS,
lib: ['lib.es2017.d.ts'],
noImplicitAny: false,
target: plugins.typescript.ScriptTarget.ES2017
};
export const compilerOptionsWebDefault: CompilerOptions = {
...compilerOptionsDefault,
lib: [...compilerOptionsDefault.lib, 'lib.dom.d.ts']
};
/**
* merges compilerOptions with the default compiler options
*/
export const mergeCompilerOptions = (customTsOptions: CompilerOptions, argvArg?: any): CompilerOptions => {
const defaultOptionsToMerge = (() => {
if (argvArg && argvArg.web) {
return compilerOptionsWebDefault;
} else {
return compilerOptionsDefault;
}
})();
// create merged options
let mergedOptions: CompilerOptions = {
...defaultOptionsToMerge,
...customTsOptions
};
return mergedOptions;
};
/**
* the internal main compiler function that compiles the files
*/
export const compiler = (
fileNames: string[],
options: plugins.typescript.CompilerOptions,
argvArg?: any,
): Promise<any[]> => {
console.log(`Compiling ${fileNames.length} files...`);
let done = plugins.smartpromise.defer<any[]>();
let program = plugins.typescript.createProgram(fileNames, options);
let emitResult = program.emit();
// implement check only
/*let emitResult = program.emit(undefined,(args) => {
console.log(args)
});*/
let allDiagnostics = plugins.typescript
.getPreEmitDiagnostics(program)
.concat(emitResult.diagnostics);
allDiagnostics.forEach(diagnostic => {
if (diagnostic.file) {
let { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start!);
let 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')}`
);
}
});
let 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

@ -1,271 +0,0 @@
// 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

@ -1,173 +1,40 @@
import * as plugins from './plugins.js'; import * as plugins from './tsbuild.plugins';
import * as paths from './paths.js'; import * as tsbuild from './tsbuild.exports';
import * as tsbuild from './tsbuild.exports.js';
export const runCli = async () => {
const tsbuildCli = new plugins.smartcli.Smartcli(); const tsbuildCli = new plugins.smartcli.Smartcli();
/** /**
* the standard task compiles anything in ts/ directory to dist directory * the standard task compiles anything in ts/ directory to dist directory
*/ */
tsbuildCli.standardCommand().subscribe(async (argvArg) => { tsbuildCli.standardTask().subscribe(argvArg => {
if (process.env.CLI_CALL_TSBUILD === 'true') {
tsbuild.compileGlobStringObject( tsbuild.compileGlobStringObject(
{ {
'./ts/**/*.ts': './dist_ts', './ts/**/*.ts': './dist'
}, },
{}, {},
process.cwd(), process.cwd(),
argvArg argvArg
); );
}
}); });
/** /**
* the custom command compiles any customDir to dist_customDir * the custom command compiles any customDir to dist_customDir
*/ */
tsbuildCli.addCommand('custom').subscribe(async (argvArg) => { tsbuildCli.addCommand('custom').subscribe(argvArg => {
const listedDirectories = argvArg._; const listedDirectories = argvArg._;
listedDirectories.shift(); // removes the first element that is "custom" listedDirectories.shift();
const compilationCommandObject: {[key: string]: string} = {}; const compilationCommandObject: {[key: string]: string} = {};
for (const directory of listedDirectories) { for (const directory of listedDirectories) {
compilationCommandObject[`./${directory}/**/*.ts`] = `./dist_${directory}`; compilationCommandObject[`./${directory}/**/*.ts`] = `./dist_${directory}`;
} };
await tsbuild.compileGlobStringObject(compilationCommandObject, {}, process.cwd(), argvArg); tsbuild.compileGlobStringObject(
}); compilationCommandObject,
{},
/** process.cwd(),
* the emitcheck command checks if a TypeScript file can be emitted without actually emitting it argvArg
*/ );
tsbuildCli.addCommand('emitcheck').subscribe(async (argvArg) => { })
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');
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('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
*/
tsbuildCli.addCommand('tsfolders').subscribe(async (argvArg) => {
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 } = {};
console.log(`compiling in this order:`);
console.log(sortedTsFolders);
for (const tsFolder of sortedTsFolders) {
compilationCommandObject[`./${tsFolder}/**/*.ts`] = `./dist_${tsFolder}`;
}
await tsbuild.compileGlobStringObject(compilationCommandObject, {}, process.cwd(), argvArg);
});
tsbuildCli.startParse(); tsbuildCli.startParse();
};

View File

@ -1,10 +1,7 @@
import * as plugins from './plugins.js'; import * as plugins from './tsbuild.plugins';
import type { CompilerOptions, ScriptTarget, ModuleKind } from 'typescript'; import { compiler, CompilerOptions, mergeCompilerOptions } from './tsbuild.classes.compiler';
import { compiler, mergeCompilerOptions, emitCheck } from './tsbuild.classes.tsbuild.js';
export type { CompilerOptions, ScriptTarget, ModuleKind }; export * from './tsbuild.classes.compiler';
export * from './tsbuild.classes.tsbuild.js';
/** /**
* compile am array of absolute file paths * compile am array of absolute file paths
@ -12,7 +9,7 @@ export * from './tsbuild.classes.tsbuild.js';
export let compileFileArray = ( export let compileFileArray = (
fileStringArrayArg: string[], fileStringArrayArg: string[],
compilerOptionsArg: CompilerOptions = {}, compilerOptionsArg: CompilerOptions = {},
argvArg?: any argvArg?: any,
): Promise<any[]> => { ): Promise<any[]> => {
return compiler(fileStringArrayArg, mergeCompilerOptions(compilerOptionsArg, argvArg), argvArg); return compiler(fileStringArrayArg, mergeCompilerOptions(compilerOptionsArg, argvArg), argvArg);
}; };
@ -25,52 +22,35 @@ export let compileFileArray = (
* } * }
*/ */
export let compileGlobStringObject = async ( export let compileGlobStringObject = async (
globStringObjectArg: Record<string, string>, globStringObjectArg: any,
tsOptionsArg: CompilerOptions = {}, tsOptionsArg: CompilerOptions = {},
cwdArg: string = process.cwd(), cwdArg: string = process.cwd(),
argvArg?: any argvArg?: any,
) => { ) => {
let compiledFiles: any[] = []; let compiledFiles = [];
for (const keyArg in globStringObjectArg) { for (const keyArg in globStringObjectArg) {
// Type safety check for key if(globStringObjectArg[keyArg]) {
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);
let absoluteFilePathArray: string[] = plugins.smartpath.transform.toAbsolute(
// Ensure fileTreeArray contains only strings before transforming fileTreeArray,
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[]; );
let destDir: string = plugins.smartpath.transform.toAbsolute(
// Get destination directory as absolute path
const destDir: string = plugins.smartpath.transform.toAbsolute(
globStringObjectArg[keyArg], globStringObjectArg[keyArg],
cwdArg cwdArg
) as string; );
tsOptionsArg = {
// Update compiler options with the output directory
const updatedTsOptions: CompilerOptions = {
...tsOptionsArg, ...tsOptionsArg,
outDir: destDir, outDir: destDir
}; };
compiledFiles = compiledFiles.concat(
// Compile the files and correctly concat the results compiledFiles,
// Fixed: removed duplicating compiledFiles in the concat operation await compileFileArray(absoluteFilePathArray, tsOptionsArg, argvArg)
const newlyCompiledFiles = await compileFileArray(absoluteFilePathArray, updatedTsOptions, argvArg); );
compiledFiles = compiledFiles.concat(newlyCompiledFiles);
} }
} }
return compiledFiles; return compiledFiles;
}; };

7
ts/tsbuild.plugins.ts Normal file
View File

@ -0,0 +1,7 @@
import * as smartcli from '@pushrocks/smartcli';
import * as smartfile from '@pushrocks/smartfile';
import * as smartpath from '@pushrocks/smartpath';
import * as smartpromise from '@pushrocks/smartpromise';
import * as typescript from 'typescript';
export { smartcli, smartfile, smartpath, smartpromise, typescript };

View File

@ -1,11 +1,14 @@
{ {
"compilerOptions": { "compilerOptions": {
"experimentalDecorators": true, "outDir": "dist/",
"useDefineForClassFields": false, "module": "commonjs",
"target": "ES2022", "target": "es2015",
"module": "NodeNext", "lib":[
"moduleResolution": "NodeNext", "es2016",
"esModuleInterop": true, "es2017"
"verbatimModuleSyntax": true ]
} },
"include": [
"ts/**/*.ts"
]
} }

17
tslint.json Normal file
View File

@ -0,0 +1,17 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}