JSPM

  • Created
  • Published
  • Downloads 54626614
  • Score
    100M100P100Q293297F
  • License MIT

Load node modules according to tsconfig paths, in run-time or via API.

Package Exports

  • tsconfig-paths
  • tsconfig-paths/lib
  • tsconfig-paths/lib/tsconfig-loader
  • tsconfig-paths/register

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (tsconfig-paths) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

tsconfig-paths

npm version travis build codecov coverage MIT license code style: prettier

Use this to load modules whose location is specified in the paths section of tsconfig.json. Both loading at run-time and via API are supported.

Typescript by default mimics the Node.js runtime resolution strategy of modules. But it also allows the use of path mapping which allows arbitrary module paths (that doesn't start with "/" or ".") to be specified and mapped to physical paths in the filesystem. The typescript compiler can resolve these paths from tsconfig so it will compile OK. But if you then try to exeute the compiled files with node (or ts-node), it will only look in the node_modules folders all the way up to the root of the filesystem and thus will not find the modules specified by paths in tsconfig.

If you require this package's tsconfig-paths/register module it will read the paths from tsconfig.json and convert node's module loading calls into to physcial file paths that node can load.

How to install

yarn add --dev tsconfig-paths

or

npm install --save-dev tsconfig-paths

How to use

With node

node -r tsconfig-paths/register main.js

With ts-node

ts-node -r tsconfig-paths/register main.ts

If process.env.TS_NODE_PROJECT is set it will be used to resolved tsconfig.json

With webpack

For webpack please use the tsconfig-paths-webpack-plugin.

With mocha and ts-node

As of Mocha >= 4.0.0 the --compiler was deprecated. Instead --require should be used. You also have to specify a glob that includes .ts files because mocha looks after files with .js extension by default.

mocha -r ts-node/register -r tsconfig-paths/register "test/**/*.ts"

Bootstrap tsconfig-paths with explicit params

If you want more granular control over tsconfig-paths you can bootstrap it. This can be useful if you for instance have compiled with tsc to another directory where tsconfig.json doesn't exists.

const tsConfig = require("./tsconfig.json");
const tsConfigPaths = require("tsconfig-paths");

const baseUrl = "./"; // Either absolute or relative path. If relative it's resolved to current working directory.
tsConfigPaths.register({
    baseUrl,
    paths: tsConfig.compilerOptions.paths
});

Then run with:

node -r ./tsconfig-paths-bootstrap.js main.js

Config loading process

  1. Use explicit params passed to register
  2. Use process.env.TS_NODE_PROJECT to resolve tsConfig.json and the specified baseUrl and paths.
  3. Resolves tsconfig.json from current working directory and the specified baseUrl and paths.

Programmatic use

The public API consists of these functions:

loadConfig

export function loadConfig(cwd: string = process.cwd()): ConfigLoaderResult

export type ConfigLoaderResult =
  | ConfigLoaderSuccessResult
  | ConfigLoaderFailResult;

export interface ConfigLoaderSuccessResult {
  resultType: "success";
  absoluteBaseUrl: string;
  paths: { [key: string]: Array<string> };
}

export interface ConfigLoaderFailResult {
  resultType: "failed";
  message: string;
}

This function loads the tsconfig.json. It will start searching from the specified cwd directory.

createMatchPath

export function createMatchPath(
  absoluteBaseUrl: string,
  paths: { [key: string]: Array<string> }
): MatchPath

export type MatchPath = (
  absoluteSourceFileName: string,
  requestedModule: string,
  readPackageJson?: (packageJsonPath: string) => any,
  fileExists?: (name: string) => boolean,
  extensions?: ReadonlyArray<string>
) => string | undefined;

The createMatchPath function will create a function that can match paths. It accepts baseUrl and paths directly as they are specified in tsconfig and will handle resolving paths to absolute form. The created function has the signare specified by the type MatchPath above.

matchFromAbsolutePaths

export function matchFromAbsolutePaths(
  absolutePathMappings: { [key: string]: Array<string> },
  absoluteSourceFileName: string,
  requestedModule: string,
  readPackageJson: (packageJsonPath: string) => any = (
    packageJsonPath: string
  ) => readPackage(packageJsonPath),
  fileExists = fs.existsSync,
  extensions = Object.keys(require.extensions)
): string | undefined {

The absolutePathMappings paramater has the same structure as paths in tsconfig but all paths needs to be resolved to absolute paths. This function is lower level and requries that the paths as already been resolved to absolute form.