https://github.com/flex-development/tsconfig-utils
Utilities for working with tsconfig files
https://github.com/flex-development/tsconfig-utils
programmatic tsconfig tsconfig-paths typescript typescript-compiler typescript-compiler-api
Last synced: 4 days ago
JSON representation
Utilities for working with tsconfig files
- Host: GitHub
- URL: https://github.com/flex-development/tsconfig-utils
- Owner: flex-development
- License: bsd-3-clause
- Created: 2023-02-03T01:55:31.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2024-04-23T04:02:30.000Z (almost 2 years ago)
- Last Synced: 2024-10-04T10:37:12.740Z (over 1 year ago)
- Topics: programmatic, tsconfig, tsconfig-paths, typescript, typescript-compiler, typescript-compiler-api
- Language: TypeScript
- Homepage: https://github.com/flex-development/tsconfig-utils
- Size: 2.79 MB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Funding: .github/funding.yml
- License: LICENSE.md
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# tsconfig-utils
[](https://github.com/flex-development/tsconfig-utils/releases/latest)
[](https://npmjs.com/package/@flex-development/tsconfig-utils)
[](https://www.npmcharts.com/compare/@flex-development/tsconfig-utils?interval=30)
[](https://packagephobia.now.sh/result?p=@flex-development/tsconfig-utils)
[](https://codecov.io/gh/flex-development/tsconfig-utils)
[](https://github.com/voxpelli/badges-cjs-esm)
[](LICENSE.md)
[](https://conventionalcommits.org)
[](https://typescriptlang.org)
[](https://vitest.dev)
[](https://yarnpkg.com)
Utilities for working with [`tsconfig`][tsconfig] files
## Contents
- [What is this?](#what-is-this)
- [When should I use this?](#when-should-i-use-this)
- [Install](#install)
- [Use](#use)
- [API](#api)
- [`createGetCanonicalFileName([useCaseSensitiveFileNames])`](#creategetcanonicalfilenameusecasesensitivefilenames)
- [`createModuleResolutionHost([options])`](#createmoduleresolutionhostoptions)
- [`createParseConfigHost([options])`](#createparseconfighostoptions)
- [`isResolvedTsconfig(value)`](#isresolvedtsconfigvalue)
- [`isTsconfigHost(value)`](#istsconfighostvalue)
- [`loadTsconfig([id][, options])`](#loadtsconfigtid-options)
- [`mergeTsconfig(target[, ...tsconfigs])`](#mergetsconfigttarget-tsconfigs)
- [`readTsconfig([id][, options])`](#readtsconfigtid-options)
- [`resolvePath(specifier[, options])`](#resolvepathspecifier-options)
- [Types](#types)
- [`tsconfig-types`](#tsconfig-types)
- [`Awaitable`](#awaitablet)
- [`DirectoryExists`](#directoryexists)
- [`Dirent`](#dirent)
- [`FileExists`](#fileexists)
- [`FileSystem`](#filesystem)
- [`GetCanonicalFileName`](#getcanonicalfilename)
- [`GetCurrentDirectory`](#getcurrentdirectory)
- [`GetDirectories`](#getdirectories)
- [`HostReadFile`](#hostreadfile)
- [`IsDirectory`](#isdirectory)
- [`IsFile`](#isfile)
- [`IsSymbolicLink`](#issymboliclink)
- [`List<[T]>`](#listt)
- [`LoadTsconfigOptions`](#loadtsconfigoptions)
- [`ModuleResolutionHostOptions`](#moduleresolutionhostoptions)
- [`ModuleResolutionHost`](#moduleresolutionhost)
- [`ParseConfigHostOptions`](#parseconfighostoptions)
- [`ParseConfigHost`](#parseconfighost)
- [`ReadDirectory`](#readdirectory)
- [`ReadFile`](#readfile)
- [`ReadTsconfigOptions`](#readtsconfigoptions)
- [`ReaddirDirentOptions`](#readdirdirentoptions)
- [`ReaddirOptions`](#readdiroptions)
- [`Readdir`](#readdir)
- [`Realpath`](#realpath)
- [`ResolvePathOptions`](#resolvepathoptions)
- [`ResolvedTsconfig`](#resolvedtsconfig)
- [`Stat`](#stat)
- [`Stats`](#stats)
- [`TsconfigHost`](#tsconfighost)
- [`UseCaseSensitiveFileNamesFn`](#usecasesensitivefilenamesfn)
- [`UseCaseSensitiveFileNames`](#usecasesensitivefilenames)
- [Related](#related)
- [Contribute](#contribute)
## What is this?
This package exports utilities for working with [TypeScript configuration files][tsconfig].
## When should I use this?
This package can be used to merge and load tsconfig files, as well resolve path aliases.
## Install
This package is [ESM only][esm].
In Node.js (version 20+) with [yarn][]:
```sh
yarn add @flex-development/tsconfig-utils
```
See Git - Protocols | Yarn
Β for details regarding installing from Git.
In Deno with [`esm.sh`][esmsh]:
```ts
import {
createModuleResolutionHost,
loadTsconfig,
resolvePath
} from 'https://esm.sh/@flex-development/tsconfig-utils'
```
In browsers with [`esm.sh`][esmsh]:
```html
import {
createModuleResolutionHost,
loadTsconfig,
resolvePath
} from 'https://esm.sh/@flex-development/tsconfig-utils'
```
## Use
```ts
import {
loadTsconfig,
type ResolvedTsconfig
} from '@flex-development/tsconfig-utils'
import fs from 'node:fs'
/**
* The resolved tsconfig.
*
* @const {ResolvedTsconfig | null} resolved
*/
const resolved: ResolvedTsconfig | null = await loadTsconfig(null, {
encoding: 'utf8',
fs: fs.promises
})
if (resolved) {
console.dir(resolved.tsconfig) // the loaded tsconfig, with bases applied
console.dir(resolved.url) // the url of the tsconfig file
}
```
## API
This package exports the following identifiers listed below.
There is no default export.
### `createGetCanonicalFileName([useCaseSensitiveFileNames])`
Create a canonical file name function.
#### Parameters
- `useCaseSensitiveFileNames` ([`UseCaseSensitiveFileNames`](#usecasesensitivefilenames))
β whether to treat filenames as case sensitive
#### Returns
([`GetCanonicalFileName`](#getcanonicalfilename)) A function that returns a canonical file name given a module id
### `createModuleResolutionHost([options])`
Create a module resolution host.
The module resolution host acts a bridge between the TypeScript compiler and the file system.
> π **Note**: The host can have both asynchronous and synchronous methods,
> but when used with the native TypeScript compiler, all methods must return synchronous values.
#### Parameters
- `options` ([`ModuleResolutionHostOptions`](#moduleresolutionhostoptions) | `null` | `undefined`)
β options for host creation
#### Returns
([`ModuleResolutionHost`](#moduleresolutionhost)) The module resolution host
### `createParseConfigHost([options])`
Create a configuration parser host.
The parser host provides methods for accessing the file system and resolving module paths.
> π **Note**: The host can have both asynchronous and synchronous methods,
> but when used with the native TypeScript compiler, all methods must return synchronous values.
#### Parameters
- `options` ([`ParseConfigHostOptions`](#parseconfighostoptions) | `null` | `undefined`)
β options for host creation
#### Returns
([`ParseConfigHost`](#parseconfighost)) The parse config host
### `isResolvedTsconfig(value)`
Check if `value` is a resolved configuration object.
#### Parameters
- `value` (`unknown`)
β the value to check
#### Returns
([`value is ResolvedTsconfig`](#resolvedtsconfig)) `true` if `value` is resolved tsconfig object, `false` otherwise
### `isTsconfigHost(value)`
Check if `value` is an object with a [`Tsconfig`][tt-tsconfig].
#### Parameters
- `value` (`unknown`)
β the value to check
#### Returns
([`value is TsconfigHost`](#tsconfighost)) `true` if `value` is tsconfig host object, `false` otherwise
### `loadTsconfig([id][, options])`
Load a tsconfig file.
#### Type Parameters
- `T` ([`Awaitable`](#resolvedtsconfig))
β the resolved tsconfig
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid] | `null` | `undefined`)
β the module id or specifier of the tsconfig file
- **default**: `'tsconfig.json'`
- `options` ([`LoadTsconfigOptions`](#loadtsconfigoptions) | `null` | `undefined`)
β load options
#### Returns
(`T`) The resolved tsconfig, or `null` if tsconfig file is not found
### `mergeTsconfig(target[, ...tsconfigs])`
Merge one or more tsconfig objects into a single [`Tsconfig`][tt-tsconfig].
Tsconfig source objects are applied from left to right.
Subsequent sources overwrite property assignments of previous sources.
> π **Note**: If `target` is a [`TsconfigHost`](#tsconfighost), `target.tsconfig` will be modified.
> Otherwise, `target` will be modified.
#### Type Parameters
- `T` ([`Tsconfig`][tt-tsconfig])
β the merged tsconfig
#### Parameters
- `target` ([`Tsconfig`][tt-tsconfig] | [`TsconfigHost`](#tsconfighost) | `null` | `undefined`)
β the target tsconfig or tsconfig host
- `...tsconfigs` (`readonly (Tsconfig | TsconfigHost | null | undefined)[]`)
β the source tsconfig object(s)
#### Returns
(`T`) The merged tsconfig
### `readTsconfig([id][, options])`
Read a tsconfig file.
> π **Note**: Returns a promise if [`getSource`][mlly-getsource]
> or [`resolveModule`][mlly-resolvemodule] returns a promise.
#### Type Parameters
- `T` ([`Awaitable`](#resolvedtsconfig))
β the resolved tsconfig
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid] | `null` | `undefined`)
β the module id or specifier of the tsconfig file
- **default**: `'tsconfig.json'`
- `options` ([`ReadTsconfigOptions`](#readtsconfigoptions) | `null` | `undefined`)
β read options
#### Returns
(`T`) The resolved tsconfig, or `null` if tsconfig file is not found
### `resolvePath(specifier[, options])`
Resolve an aliased `specifier`.
#### Parameters
- `specifier` (`string`)
β the specifier using an alias
- `options` ([`ResolvePathOptions`](#resolvepathoptions) | `null` | `undefined`)
β alias resolution options
#### Returns
(`string` | `null`) The path alias match or `null` if match is not found
## Types
This package is fully typed with [TypeScript][].
### `tsconfig-types`
This package re-exports TypeScript definitions from [`tsconfig-types`][tsconfig-types].
This is primarily for the convenience of TypeScript users who do not hoist packages,
but may need to `import` definitions used in this package.
### `Awaitable`
Create a union of `T` and `T` as a promise-like object (`type`).
```ts
type Awaitable = PromiseLike | T
```
#### Type Parameters
- `T` (`any`)
β the value
### `DirectoryExists`
Check if a directory exists (`interface`).
#### Signatures
```ts
>(id: ModuleId): T
```
#### Type Parameters
- `T` ([`Awaitable`](#awaitablet))
β the result of the check
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid])
β the module id to check
#### Returns
(`T`) `true` if directory exists at `id`, `false` otherwise
### `Dirent`
Information about a directory entry (`interface`).
#### Properties
- `isDirectory` ([`IsDirectory`](#isdirectory))
β check if the entry is a directory
- `isFile` ([`IsFile`](#isfile))
β check if the entry is a file
- `isSymbolicLink` ([`IsSymbolicLink`](#issymboliclink))
β check if the entry is a symbolic link
- `name` (`string`)
β the path to the entry, relative to the `parentPath`
- `parentPath` (`string`)
β the path to the parent directory
### `FileExists`
Check if a file exists (`interface`).
#### Signatures
```ts
>(id: ModuleId): T
```
#### Type Parameters
- `T` ([`Awaitable`](#awaitablet))
β the result of the check
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid])
β the module id to check
#### Returns
(`T`) `true` if file exists at `id`, `false` otherwise
### `FileSystem`
The file system API (`interface`).
#### Properties
- `readFile` ([`ReadFile`](#readfile))
β read the entire contents of a file
- `readdir` ([`Readdir`](#readdir))
β read the entire contents of a directory
- `realpath` ([`Realpath`](#realpath))
β compute a canonical pathname by resolving `.`, `..`, and symbolic links
- `stat` ([`Stat`](#stat))
β get information about a file system entry
### `GetCanonicalFileName`
Get the canonical file name for a module id (`type`).
```ts
type GetCanonicalFileName = (this: void, id: ModuleId) => string
```
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid])
β the module id
#### Returns
(`string`) The canonical file name
### `GetCurrentDirectory`
Get the path to the current working directory (`interface`).
#### Signatures
```ts
>(): T
```
#### Type Parameters
- `T` ([`Awaitable`](#awaitablet))
β the directory path
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid])
β the module id to check
#### Returns
(`T`) The current working directory path
### `GetDirectories`
Get a list of subdirectories (`interface`).
#### Signatures
```ts
>(parent: ModuleId): T
```
#### Type Parameters
- `T` ([`Awaitable`](#awaitablet))
β the list of subdirectory names
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid])
β the module id of the parent directory
#### Returns
(`T`) The list of subdirectory names
### `HostReadFile`
Read the entire contents of a file (`interface`).
#### Signatures
```ts
>(id: ModuleId): T
```
#### Type Parameters
- `T` ([`Awaitable`](#awaitablet))
β the file contents
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid])
β the module id of the file
#### Returns
(`T`) The file contents, or `undefined` if file does not exist at `id`
### `IsDirectory`
Check if a file system entry is a directory (`interface`).
#### Extends
- [`mlly.IsDirectory`][mlly-isdirectory]
### `IsFile`
Check if a file system entry is a file (`interface`).
#### Extends
- [`mlly.IsFile`][mlly-isfile]
### `IsSymbolicLink`
Check if a file system entry is a symbolic link (`interface`).
#### Signatures
```ts
(): boolean
```
#### Returns
(`boolean`) `true` if entry is symbolic link, `false` otherwise
### `List<[T]>`
A list (`type`).
```ts
type List = ReadonlySet | readonly T[]
```
#### Type Parameters
- `T` (`any`, optional)
β the list item type
### `LoadTsconfigOptions`
Options for loading tsconfig files (`interface`).
#### Extends
- [`ReadTsconfigOptions`](#readtsconfigoptions)
#### Properties
- `relativePaths` ([`List`](#listt) | `null` | `undefined`)
β the list of property paths where the value may be a relative path
### `ModuleResolutionHostOptions`
Options for creating module resolution hosts (`interface`).
#### Properties
- `encoding?` ([`BufferEncoding`][mlly-bufferencoding])
β the encoding to use when reading files
- **default**: `'utf8'`
- `fs?` ([`FileSystem`](#filesystem) | `null` | `undefined`)
β the file system api
- `root?` ([`ModuleId`][mlly-moduleid] | `null` | `undefined`)
β the module id of the current working directory
- `useCaseSensitiveFileNames?` ([`UseCaseSensitiveFileNames`](#usecasesensitivefilenames))
β boolean indicating whether filenames should be treated as case sensitive, or a function that returns such a value
### `ModuleResolutionHost`
The module resolution host API (`interface`).
The module resolution host acts a bridge between the TypeScript compiler and the file system.
> π **Note**: The host can have both asynchronous and synchronous methods,
> but when used with the native TypeScript compiler, all methods must return synchronous values.
#### Properties
- `directoryExists` ([`DirectoryExists`](#directoryexists))
β check if a directory exists
- `fileExists` ([`FileExists`](#fileexists))
β check if a file exists
- `getCurrentDirectory` ([`GetCurrentDirectory`](#getcurrentdirectory))
β get the path to the current working directory
- `getDirectories` ([`GetDirectories`](#getdirectories))
β get a list of subdirectories
- `readFile` ([`HostReadFile`](#hostreadfile))
β read the entire contents of a file
- `realpath` ([`Realpath`](#realpath))
β compute a canonical pathname by resolving `.`, `..`, and symbolic links
- `useCaseSensitiveFileNames?` ([`UseCaseSensitiveFileNames`](#usecasesensitivefilenames))
β whether to treat filenames as case sensitive
### `ParseConfigHostOptions`
Options for creating parse config hosts (`interface`).
#### Extends
- [`ModuleResolutionHostOptions`](#moduleresolutionhostoptions)
### `ParseConfigHost`
The configuration parser host API (`interface`).
The parser host provides methods for accessing the file system and resolving module paths.
> π **Note**: The host can have both asynchronous and synchronous methods,
> but when used with the native TypeScript compiler, all methods must return synchronous values.
#### Extends
- [`ModuleResolutionHost`](#moduleresolutionhost)
#### Properties
- `readDirectory` ([`ReadDirectory`](#readdirectory))
β read the contents of a directory
- `useCaseSensitiveFileNames` (`boolean`)
β whether to treat filenames as case sensitive
### `ReadDirectory`
Read the contents of a directory (`interface`).
#### Signatures
```ts
>(
parent: ModuleId,
extensions?: List | null | undefined,
exclude?: List | null | undefined,
include?: List | null | undefined,
depth?: number | null | undefined
): T
```
#### Type Parameters
- `T` ([`Awaitable`](#awaitablet))
β the list of matched files
#### Parameters
- `parent` ([`ModuleId`][mlly-moduleid])
β the module id of the parent directory
- `extensions` ([`List`](#listt) | `null` | `undefined`)
β the list of file extensions to filter for
- `exclude` ([`List`](#listt) | `null` | `undefined`)
β the list of glob patterns matching files to exclude
- `include` ([`List`](#listt) | `null` | `undefined`)
β the list of glob patterns matching files to include
- `depth` (`number` | `null` | `undefined`)
β the maximum search depth (inclusive)
#### Returns
(`T`) The list of matched files
### `ReadFile`
Read the entire contents of a file (`interface`).
#### Extends
- [`mlly.ReadFile`][mlly-readfile]
### `ReadTsconfigOptions`
Options for reading tsconfig files (`interface`).
#### Extends
- [`GetSourceOptions`][mlly-getsourceoptions]
#### Properties
- `conditions` ([`List`][mlly-condition] | `null` | `undefined`)
β the list of export/import conditions
- **default**: [`mlly.defaultConditions`][mlly-defaultconditions]
> π **note**: should be sorted by priority
- `cwd` ([`ModuleId`][mlly-moduleid] | `null` | `undefined`)
β the url of the current working directory
- **default**: [`mlly.cwd()`][mlly-cwd]
- `mainFields` ([`List`][mlly-mainfield] | `null` | `undefined`)
β the list of legacy `main` fields
- **default**: [`mlly.defaultMainFields`][mlly-defaultmainfields]
> π **note**: should be sorted by priority
- `parent` ([`ModuleId`][mlly-moduleid] | `null` | `undefined`)
β the parent module id
- **default**: `cwd` | [`mlly.cwd()`][mlly-cwd]
- `preserveSymlinks` (`boolean` | `null` | `undefined`)
β whether to keep symlinks instead of resolving them
### `ReaddirDirentOptions`
Options for reading the contents of a directory (`interface`).
#### Extends
- [`ReaddirOptions`](#readdiroptions)
#### Properties
- `withFileTypes` (`true`)
β whether the result should be a content object list instead of just strings.\
if `true`, the result will be a list of [`Direct`](#dirent) objects, which provide methods
like [`isDirectory()`](#isdirectory) and [`isFile()`](#isfile) to get more information about
a file system entry without additional [`fs.stat()`](#stat) calls
### `ReaddirOptions`
Options for reading the contents of a directory (`interface`).
#### Extends
- [`ReaddirOptions`](#readdiroptions)
#### Properties
- `withFileTypes?` (`boolean` | `null` | `undefined`)
β whether the result should be a content object list instead of just strings.\
if `true`, the result will be a list of [`Direct`](#dirent) objects, which provide methods
like [`isDirectory()`](#isdirectory) and [`isFile()`](#isfile) to get more information about
a file system entry without additional [`fs.stat()`](#stat) calls
### `Readdir`
Read the entire contents of a directory (`interface`).
#### Signatures
```ts
>(id: ModuleId, options: ReaddirDirentOptions): T
```
#### Type Parameters
- `T` ([`Awaitable`](#dirent))
β the directory contents
#### Parameters
- `id` ([`ModuleId`][mlly-moduleid])
β the module id of the file
- `options` ([`ReaddirDirentOptions`](#readdirdirentoptions))
β read options
#### Returns
(`T`) The directory contents
### `Realpath`
Compute a canonical pathname by resolving `.`, `..`, and symbolic links (`interface`).
#### Extends
- [`mlly.Realpath`][mlly-realpath]
### `ResolvePathOptions`
Options for path alias resolution (`interface`).
#### Extends
- [`ResolveAliasOptions`][mlly-resolvealiasoptions]
#### Properties
- `aliases?` (`null` | `undefined`)
β the url of the tsconfig file
> π **note**: path aliases are read from the `tsconfig`
- `tsconfig?` ([`ResolvedTsconfig`](#resolvedtsconfig) | [`Tsconfig`][tt-tsconfig] `null` | `undefined`)
β the tsconfig object, or the resolved tsconfig
### `ResolvedTsconfig`
A resolved TypeScript configuration (`interface`).
#### Extends
- [`TsconfigHost`](#tsconfighost)
#### Properties
- `url` (`URL`)
β the url of the tsconfig file
### `Stat`
Get information about a file system entry (`interface`).
#### Extends
- [`mlly.Stat`][mlly-stat]
### `Stats`
Information about a file system entry (`interface`).
#### Properties
- `isDirectory` ([`IsDirectory`](#isdirectory))
β check if the entry is a directory
- `isFile` ([`IsFile`](#isfile))
β check if the entry is a file
### `TsconfigHost`
An object with a TypeScript configuration (`interface`).
#### Properties
- `tsconfig` ([`Tsconfig`][tt-tsconfig])
β the tsconfig object
### `UseCaseSensitiveFileNamesFn`
Determine if file names should be treated as case sensitive (`type`).
```ts
type UseCaseSensitiveFileNamesFn = (this: void) => boolean | null | undefined
```
#### Returns
(`boolean` | `null` | `undefined`) `true` if file names should be treated as case sensitive
### `UseCaseSensitiveFileNames`
Union of values used to determine if file names should be treated as case sensitive (`type`).
```ts
type UseCaseSensitiveFileNames =
| UseCaseSensitiveFileNamesFn
| boolean
| null
| undefined
```
#### Returns
(`boolean` | `null` | `undefined`) `true` if file names should be treated as case sensitive
## Related
- [`@flex-development/mlly`][mlly]
β [ECMAScript module][node-esm] utilities
- [`@flex-development/tsconfig-types`][tsconfig-types]
β [TypeScript][] definitions for `tsconfig.json`
## Contribute
See [`CONTRIBUTING.md`](CONTRIBUTING.md).
This project has a [code of conduct](./CODE_OF_CONDUCT.md). By interacting with this repository, organization, or
community you agree to abide by its terms.
[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c
[esmsh]: https://esm.sh
[mlly]: https://github.com/flex-development/mlly
[mlly-bufferencoding]: https://github.com/flex-development/mlly#bufferencoding
[mlly-condition]: https://github.com/flex-development/mlly#condition
[mlly-cwd]: https://github.com/flex-development/mlly#cwd
[mlly-defaultconditions]: https://github.com/flex-development/mlly#defaultconditions
[mlly-defaultmainfields]: https://github.com/flex-development/mlly#defaultmainfields
[mlly-getsourceoptions]: https://github.com/flex-development/mlly#getsourceoptions
[mlly-getsource]: https://github.com/flex-development/mlly#getsourcetid-options
[mlly-isdirectory]: https://github.com/flex-development/mlly#isdirectory
[mlly-isfile]: https://github.com/flex-development/mlly#isfile
[mlly-mainfield]: https://github.com/flex-development/mlly#mainfield
[mlly-moduleid]: https://github.com/flex-development/mlly#moduleid
[mlly-readfile]: https://github.com/flex-development/mlly#readfile
[mlly-realpath]: https://github.com/flex-development/mlly#realpath
[mlly-resolvealiasoptions]: https://github.com/flex-development/mlly#resolvealiasoptions
[mlly-resolvemodule]: https://github.com/flex-development/mlly#resolvemoduletspecifier-parent-options
[mlly-stat]: https://github.com/flex-development/mlly#stat
[node-esm]: https://nodejs.org/api/esm.html
[tsconfig-types]: https://github.com/flex-development/tsconfig-types
[tsconfig]: https://www.typescriptlang.org/tsconfig
[tt-tsconfig]: https://github.com/flex-development/tsconfig-types/blob/main/src/tsconfig.mts
[typescript]: https://www.typescriptlang.org
[yarn]: https://yarnpkg.com