tsc-prog
v2.3.0
Published
Build your TypeScript projects programmatically.
Downloads
12,816
Maintainers
Readme
tsc-prog
Build your TypeScript projects programmatically.
tsc-prog
offers flexiblity and convenient options for your more complex production builds (less suited for development builds).
Getting started
npm i -D tsc-prog
yarn add -D tsc-prog
tsc-prog
has no dependency. You just need typescript as a peer dependency.
You simply need to build 👷
Use tsc.build
. Specify the basePath
first, and either inherit from a tsconfig file or create a config from scratch.
const tsc = require('tsc-prog')
tsc.build({
basePath: __dirname, // always required, used for relative paths
configFilePath: 'tsconfig.json', // config to inherit from (optional)
compilerOptions: {
rootDir: 'src',
outDir: 'dist',
declaration: true,
skipLibCheck: true,
},
include: ['src/**/*'],
exclude: ['**/*.test.ts', '**/*.spec.ts'],
})
You can have a look at all the parameters here.
You need more access 👨🏭
The tsc.build
function is made of the two following steps, which you can have access to :
- Program creation with
tsc.createProgramFromConfig
. - Emitting files from program with
tsc.emit
.
const tsc = require('tsc-prog')
// Create the program
const program = tsc.createProgramFromConfig({
basePath: process.cwd(),
configFilePath: 'tsconfig.json',
})
// Do what you want with the program
// Actually compile typescript files
tsc.emit(program, { copyOtherToOutDir: true })
Addons
Clean 🧹
Helps to address this issue.
We frequently need to delete the emitted files from a previous build, so a clean
option recursively removes folders and files :
tsc.build({
basePath: __dirname,
configFilePath: 'tsconfig.json',
clean: ['dist'], // accepts relative paths to `basePath` or absolute paths
})
You can also directly specify common targets from your compiler options :
tsc.build({
basePath: __dirname,
configFilePath: 'tsconfig.json',
clean: { outDir: true, declarationDir: true },
})
Protections
The clean
option protects you against deleting the following folders :
- the specified
basePath
and all its parents (up to the root folder). - the current working directory and all its parents (up to the root folder).
- the
rootDir
path if specified in the compiler options and all its parents (up to the root folder).
Copy non-typescript files 🗂️
Helps to address this issue.
The copyOtherToOutDir
option allows you to copy other files to outDir
(well it says so) :
tsc.build({
basePath: __dirname,
configFilePath: 'tsconfig.json',
compilerOptions: {
outDir: 'dist', // must be set
},
copyOtherToOutDir: true,
exclude: ['**/somedir'], // taken into account
})
This option is protected against overwriting files emitted by the compiler, like same name .js
files (could happen).
Bundle type definitions 🛍️
Helps to address this issue.
Rollup your emitted .d.ts
files into a single one with bundleDeclaration
option.
tsc.build({
basePath: __dirname,
configFilePath: 'tsconfig.json',
compilerOptions: {
rootDir: 'src',
outDir: 'dist',
declaration: true // must be set
},
bundleDeclaration: {
entryPoint: 'index.d.ts', // relative to the OUTPUT directory ('dist' here)
},
})
Bundling options
tsc.build({
// ...
bundleDeclaration: {
entryPoint: 'index.d.ts',
fallbackOnError: false, // default: true
globals: false // default: true
augmentations: false // default: true
}
})
fallbackOnError
option is a safety mecanism that generates the original unbundled definition files if any error happens during the bundling process.globals
option can be switched tofalse
to discard global declarations.augmentations
option can be switched tofalse
to discard external library augmentations.
Notes on bundling 🗣️
I recommend you still check the final .d.ts
output, declaration bundling being very complex, with a lot of edge cases and issues such as name conflict and handling of external libraries.
tsc-prog
does its best to acknowledge every edge case. It covers ones that similar tools don't and probably vice versa. Don't hesitate to review API Extractor to see if it works better with your program.