Last active
September 21, 2022 20:26
-
-
Save deejayy/aa5f0cde76dc29f6b4127e60e74be2f2 to your computer and use it in GitHub Desktop.
Solves the problem with typescript->javascript compilation and module path aliases (compilerOptions.paths).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import customModuleLoader = require('module'); | |
export class CustomModuleLoader { | |
public cOptions: any = require('../tsconfig.json').compilerOptions; | |
public replacePaths: any = {}; | |
constructor() { | |
Object.keys(this.cOptions.paths).forEach(alias => { | |
this.replacePaths[alias.replace(/\*.?/, '(.*)')] = this.cOptions.paths[alias][0].replace(/\*.?/, '$1'); | |
}); | |
(<any>customModuleLoader)._originalResolveFilename = (<any>customModuleLoader)._resolveFilename; | |
(<any>customModuleLoader)._resolveFilename = (request: string, parent: customModuleLoader, isMain: boolean) => { | |
Object.keys(this.replacePaths).forEach(matchString => { | |
let regex = new RegExp(matchString); | |
if (request.match(regex)) { | |
request = [process.cwd(), this.cOptions.outDir, request.replace(regex, this.replacePaths[matchString])].join('/'); | |
} | |
}) | |
return (<any>customModuleLoader)._originalResolveFilename(request, parent, isMain); | |
} | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
What's this?
This is little snippet you can use to overwrite the _resolveFilename method from "module" module, which is responsible for loading modules via "require" in node.js. Comes handy with tsconfig's module path aliases (like
@whatever
directory). Read more here:How to use module path aliases in TypeScript.
Why?
I've run into a special use case when I tried to work within a typescript project which compiles to js and runs by node. In this project, I wanted to use module path alias (compilerOptions.paths in tsconfig.json). Since the typescript compiler does not resolve this when creates the javascript files, node fails because plain javascript could not find the alias paths.
But there are plenty of solutions for this
I tried many node modules which stated to solve this problem but none worked, so I decided to write this bare minimum, which works, so this is it.
How to use?
Simple, your app surely has an entry point, like "index.ts" or something.
The first 2 lines should be:
Source not looks so good
Yeah, you can say it can be more elegant, cleaner, higher quality, whatever. I encourage you to contribute if you feel something is not done well.
Also, it can be a node module as well, which take place in the node repository, etc. Do it, fork it, extend it, I won't feel bad if you steal the show ;)