tsconfck
A utility to find and parse tsconfig files without depending on typescript
Why
Because no simple official api exists and tsconfig isn't actual json.
Features
Users
Used by vite*, vite-tsconfig-paths, astro and many more
(*) vite bundles tsconfck so it is listed as a devDependency
Install
npm install --save-dev tsconfck # or pnpm, yarn
Usage
without typescript installed
import { parse } from 'tsconfck';
const {
tsconfigFile,
tsconfig,
extended,
solution,
referenced
} = await parse('foo/bar.ts');
with typescript
import { parseNative } from 'tsconfck';
const {
tsconfigFile,
tsconfig,
result,
solution,
referenced
} = await parseNative('foo/bar.ts');
API
see API-DOCS
Advanced
ignoring tsconfig for files inside node_modules
esbuild ignores node_modules so when you want to use tsconfck with esbuild, you can set ignoreNodeModules: true
import { find, parse } from 'tsconfck';
const fooTSConfig = await find('node_modules/some-lib/src/foo.ts');
const fooTSConfigIgnored = await find('node_modules/some-lib/src/foo.ts', {
ignoreNodeModules: true
});
const { tsconfig } = await parse('node_modules/some-lib/src/foo.ts', { ignoreNodeModules: true });
caching
a TSConfckCache instance can be created and passed to find and parse functions to reduce overhead when they are called often within the same project
import { find, parse, TSCOnfckCache } from 'tsconfck';
const cache = new TSCOnfckCache();
const fooTSConfig = await find(('src/foo.ts', { cache }));
const barTSConfig = await find(('src/bar.ts', { cache }));
const fooResult = await parse('src/foo.ts', { cache });
const barResult = await parse('src/bar.ts', { cache });
cache invalidation
You are responsible for clearing the cache if tsconfig files are added/removed/changed after reading them during the cache lifetime.
Call cache.clear()
and also discard all previous compilation results based previously cached configs.
cache mutation
Returned results are direct cache objects. If you want to modify them, deep-clone first.
cache reuse
Never use the same cache instance for mixed calls of find/findNative or parse/parseNative as result structures are different
root
This option can be used to limit finding tsconfig files outside of a root directory
import { parse, TSConfckCache } from 'tsconfck';
const root = '.';
const parseOptions = { root };
const fooResult = await find('src/foo.ts', parseOptions);
const barResult = await parse('src/bar.ts', parseOptions);
Using the root option can lead to errors if there is no tsconfig found inside root.
error handling
find and parse reject for errors they encounter, but return null or empty result if no config was found
If you want them to error instead, test the result and throw
import { parse } from 'tsconfck';
find('some/path/without/tsconfig/foo.ts').then((result) => {
if (result === null) {
throw new Error('not found');
}
return result;
});
parse('some/path/without/tsconfig/foo.ts').then((result) => {
if (result.tsconfigFile === null) {
throw new Error('not found');
}
return result;
});
TSConfig type (optional, requires typescript as devDependency)
import type { TSConfig } from 'pkg-types';
Check out https://github.com/unjs/pkg-types
cli
A simple cli wrapper is included, you can use it like this
find
# prints /path/to/tsconfig.json on stdout
tsconfck find src/index.ts
find-all
# prints all tsconfig.json in dir on stdout
tsconfck find-all src/
parse
# print content of ParseResult.tsconfig on stdout
tsconfck parse src/index.ts
# print to file
tsconfck parse src/index.ts > output.json
parse-result
# print content of ParseResult on stdout
tsconfck parse-result src/index.ts
# print to file
tsconfck parse-result src/index.ts > output.json
help
# print usage
tsconfck -h # or --help, -?, help
Links
Develop
This repo uses
In every PR you have to add a changeset by running pnpm changeset
and following the prompts
PRs are going to be squash-merged
# install dependencies
pnpm install
# run tests
pnpm test
#run tests in watch mode (doesn't require dev in parallel)
pnpm test:watch
License
MIT