Skip to content

Instantly share code, notes, and snippets.

@Kadeluxe
Last active November 27, 2021 10:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kadeluxe/2cdd5f7a932daaa102becf9870bb5157 to your computer and use it in GitHub Desktop.
Save Kadeluxe/2cdd5f7a932daaa102becf9870bb5157 to your computer and use it in GitHub Desktop.
Node 17 custom ESM loader (TypeScript and paths rewrite)

Allows to use ts-node and tsconfig-paths with ES Modules. Works only in Node 17+.

WARNING: This Node API (custom ESM loaders) is currently being redesigned and will still change [>]

Usage: Pass --loader ./loader.js to Node: node --loader ./loader.js index.ts

Example with Webpack: node --loader ./loader.js node_modules/webpack/bin/webpack serve -c build/config/development.ts

This allows to run .ts files and import using aliases defined in tsconfig.json paths.

import {load as tsLoad, resolve as tsResolve} from "ts-node/esm";
import tsConfigPaths from "tsconfig-paths";
import {pathToFileURL} from "url";
const tsconfig = tsConfigPaths.loadConfig();
const matchPath = tsConfigPaths.createMatchPath(tsconfig.absoluteBaseUrl, tsconfig.paths);
export function resolve(specifier, context, defaultResolve) {
let mappedSpecifier = matchPath(specifier);
if (mappedSpecifier) {
mappedSpecifier += ".ts";
specifier = pathToFileURL(mappedSpecifier).href;
}
return tsResolve(specifier, context, defaultResolve);
}
export function load(url, context, defaultLoad) {
return tsLoad(url, context, defaultLoad);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment