Runtime TypeScript path alias resolver for Node.js.
Works as a Node preload hook (-r) that allows ESM and CJS apps to resolve tsconfig.paths aliases at runtime.
Node.js does not support TypeScript path aliases like:
import { x } from '@unsonet/utils';at runtime.
This library fixes that by intercepting module resolution before Node loads the app.
- Runs as a CommonJS preload script
- Registers
node:moduleresolution hooks - Translates
tsconfig.base.json → runtime paths - Resolves imports dynamically during execution
npm install @unsonet/runtime-aliasesnode -r @unsonet/runtime-aliases app.jsor from dist:
node -r ./dist/libs/runtime-aliases/src/bin/runtime-aliases.cjs app.js{
"targets": {
"run": {
"executor": "nx:run-commands",
"options": {
"command": "node -r \"%CD%/dist/libs/runtime-aliases/src/bin/runtime-aliases.cjs\" {args.file} --mode=memory {args.args}",
"forwardAllArgs": true
}
}
}
}- Node.js 20+
- TypeScript
pathsconfigured intsconfig.base.json - Compiled JS output (
dist/)
- Supports ESM and CJS applications
- Supports wildcard aliases (
@app/*) - Works with Nx monorepos
- No ts-node required
- No runtime transpilation
- Zero bundler dependency
Registers aliases in memory only.
node -r runtime-aliases.cjs app.js --mode=memoryGenerates runtime tsconfig:
node -r runtime-aliases.cjs app.js --mode=fileOutput:
tsconfig.runtime.json{
"compilerOptions": {
"paths": {
"@unsonet/utils": ["libs/utils/src/index.ts"],
"@unsonet/*": ["libs/*/src/index.ts"]
}
}
}Example:
import { x } from '@unsonet/utils';Resolved to:
dist/libs/utils/src/index.jsThe preload entry MUST be CommonJS.
{
"format": ["cjs"]
}Reason:
node -ronly supports CommonJS preload modules.
import { registerRuntimeAliases } from '@unsonet/runtime-aliases';
registerRuntimeAliases();module.exports = function transform(path) {
return path
.replace(/^libs\//, 'dist/libs/')
.replace(/\.ts$/, '.js');
};Run:
node -r runtime-aliases.cjs app.js --transform ./transform.jsnode -r runtime-aliases.cjs app.js \
--transform="inline:(p)=>p.replace(/^libs\\//,'dist/libs/').replace(/\\.ts$/,'.js')"-rworks only with CommonJS- ESM loader hooks require
--import(different system) - This library is not a bundler or transpiler
Think of it as:
“tsconfig paths polyfill for Node module resolver”
not:
“runtime compiler”
MIT