Skip to content

Commit 08cd5a3

Browse files
arcanisjohnnyreilly
authored andcommitted
Implements a custom resolveModuleName option (TypeStrong#862)
* Implements a custom resolveModuleName option * Addresses feedback * Adds a test * Adresses feedback * Expands the test scope * Fix validateLoaderOptionNames test * prettier formatting * Be explicit about the possible value of customResolveModuleName * Feedback round 3 * Fix lint issues * Bumps package.json, updates changelog
1 parent d49dfba commit 08cd5a3

File tree

22 files changed

+233
-20
lines changed

22 files changed

+233
-20
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 5.3.0
4+
5+
* [feat: Exposes a `resolveNodeModule` option](https://github.com/TypeStrong/ts-loader/pull/862) - thanks @arcanis!
6+
37
## 5.2.2
48

59
* [feat: Micro-optimizations](https://github.com/TypeStrong/ts-loader/pull/855) - thanks @johnnyreilly
@@ -14,7 +18,7 @@
1418

1519
## 5.1.1
1620

17-
* [fix(getTranspilationEmit): pass the raw path to transpileModule](https://github.com/TypeStrong/ts-loader/pull/835) - thanks @Brooooooklyn
21+
* [fix(getTranspilationEmit): pass the raw path to transpileModule](https://github.com/TypeStrong/ts-loader/pull/835) - thanks @Brooooooklyn
1822

1923
## 5.1.0
2024

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ts-loader",
3-
"version": "5.2.2",
3+
"version": "5.3.0",
44
"description": "TypeScript loader for webpack",
55
"main": "index.js",
66
"types": "dist/types/index.d.ts",

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ const validLoaderOptions: ValidLoaderOptions[] = [
254254
'experimentalWatchApi',
255255
'allowTsInNodeModules',
256256
'experimentalFileCaching',
257-
'projectReferences'
257+
'projectReferences',
258+
'resolveModuleName'
258259
];
259260

260261
/**

src/interfaces.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,21 @@ export interface ReverseDependencyGraph {
295295

296296
export type LogLevel = 'INFO' | 'WARN' | 'ERROR';
297297

298+
export type ResolveModuleName = (
299+
moduleName: string,
300+
containingFile: string,
301+
compilerOptions: typescript.CompilerOptions,
302+
moduleResolutionHost: typescript.ModuleResolutionHost,
303+
) => typescript.ResolvedModuleWithFailedLookupLocations;
304+
305+
export type CustomResolveModuleName = (
306+
moduleName: string,
307+
containingFile: string,
308+
compilerOptions: typescript.CompilerOptions,
309+
moduleResolutionHost: typescript.ModuleResolutionHost,
310+
parentResolver: ResolveModuleName
311+
) => typescript.ResolvedModuleWithFailedLookupLocations;
312+
298313
export interface LoaderOptions {
299314
silent: boolean;
300315
logLevel: LogLevel;
@@ -320,6 +335,7 @@ export interface LoaderOptions {
320335
allowTsInNodeModules: boolean;
321336
experimentalFileCaching: boolean;
322337
projectReferences: boolean;
338+
resolveModuleName?: CustomResolveModuleName;
323339
}
324340

325341
export interface TSFile {

src/servicesHost.ts

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as typescript from 'typescript';
33

44
import * as constants from './constants';
55
import {
6+
CustomResolveModuleName,
67
ModuleResolutionHost,
78
ResolvedModule,
89
ResolveSync,
@@ -36,7 +37,11 @@ export function makeServicesHost(
3637
compiler,
3738
compilerOptions,
3839
files,
39-
loaderOptions: { appendTsSuffixTo, appendTsxSuffixTo }
40+
loaderOptions: {
41+
appendTsSuffixTo,
42+
appendTsxSuffixTo,
43+
resolveModuleName: customResolveModuleName
44+
}
4045
} = instance;
4146

4247
const newLine =
@@ -148,7 +153,8 @@ export function makeServicesHost(
148153
instance,
149154
moduleNames,
150155
containingFile,
151-
getResolutionStrategy
156+
getResolutionStrategy,
157+
customResolveModuleName
152158
),
153159

154160
getCustomTransformers: () => instance.transformers
@@ -426,7 +432,8 @@ function resolveModuleNames(
426432
instance: TSInstance,
427433
moduleNames: string[],
428434
containingFile: string,
429-
resolutionStrategy: ResolutionStrategy
435+
resolutionStrategy: ResolutionStrategy,
436+
customResolveModuleName?: CustomResolveModuleName
430437
) {
431438
const resolvedModules = moduleNames.map(moduleName =>
432439
resolveModuleName(
@@ -438,7 +445,8 @@ function resolveModuleNames(
438445
instance,
439446
moduleName,
440447
containingFile,
441-
resolutionStrategy
448+
resolutionStrategy,
449+
customResolveModuleName
442450
)
443451
);
444452

@@ -457,6 +465,21 @@ function isJsImplementationOfTypings(
457465
);
458466
}
459467

468+
function applyTsResolver(
469+
compiler: typeof typescript,
470+
moduleName: string,
471+
containingFile: string,
472+
compilerOptions: typescript.CompilerOptions,
473+
moduleResolutionHost: typescript.ModuleResolutionHost
474+
) {
475+
return compiler.resolveModuleName(
476+
moduleName,
477+
containingFile,
478+
compilerOptions,
479+
moduleResolutionHost
480+
);
481+
}
482+
460483
function resolveModuleName(
461484
resolveSync: ResolveSync,
462485
moduleResolutionHost: ModuleResolutionHost,
@@ -466,7 +489,8 @@ function resolveModuleName(
466489
instance: TSInstance,
467490
moduleName: string,
468491
containingFile: string,
469-
resolutionStrategy: ResolutionStrategy
492+
resolutionStrategy: ResolutionStrategy,
493+
customResolveModuleName?: CustomResolveModuleName
470494
) {
471495
const { compiler, compilerOptions } = instance;
472496

@@ -496,12 +520,34 @@ function resolveModuleName(
496520
// tslint:disable-next-line:no-empty
497521
} catch (e) {}
498522

499-
const tsResolution = compiler.resolveModuleName(
500-
moduleName,
501-
containingFile,
502-
compilerOptions,
503-
moduleResolutionHost
504-
);
523+
const tsResolution =
524+
customResolveModuleName !== undefined
525+
? customResolveModuleName(
526+
moduleName,
527+
containingFile,
528+
compilerOptions,
529+
moduleResolutionHost,
530+
(
531+
moduleNameFromCustomFn: string,
532+
containingFileFromCustomFn: string,
533+
compilerOptionsFromCustomFn: typescript.CompilerOptions,
534+
moduleResolutionHostFromCustomFn: typescript.ModuleResolutionHost
535+
) =>
536+
applyTsResolver(
537+
compiler,
538+
moduleNameFromCustomFn,
539+
containingFileFromCustomFn,
540+
compilerOptionsFromCustomFn,
541+
moduleResolutionHostFromCustomFn
542+
)
543+
)
544+
: applyTsResolver(
545+
compiler,
546+
moduleName,
547+
containingFile,
548+
compilerOptions,
549+
moduleResolutionHost
550+
);
505551

506552
if (tsResolution.resolvedModule !== undefined) {
507553
const resolvedFileName = path.normalize(

test/comparison-tests/validateLoaderOptionNames/expectedOutput-3.1/bundle.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
/*! no static exports found */
9494
/***/ (function(module, exports) {
9595

96-
eval("throw new Error(\"Module build failed (from C:/source/ts-loader/index.js):/nError: ts-loader was supplied with an unexpected loader option: notRealOption/n/nPlease take a look at the options you are supplying; the following are valid options:/nsilent / logLevel / logInfoToStdOut / instance / compiler / context / configFile / transpileOnly / ignoreDiagnostics / errorFormatter / colors / compilerOptions / appendTsSuffixTo / appendTsxSuffixTo / onlyCompileBundledFiles / happyPackMode / getCustomTransformers / reportFiles / experimentalWatchApi / allowTsInNodeModules / experimentalFileCaching / projectReferences/n/n at validateLoaderOptions (C://source//ts-loader//dist//index.js:151:19)/n at getLoaderOptions (C://source//ts-loader//dist//index.js:110:5)/n at Object.loader (C://source//ts-loader//dist//index.js:16:21)\");\n\n//# sourceURL=webpack:///./app.ts?");
96+
eval("throw new Error(\"Module build failed (from C:/source/ts-loader/index.js):/nError: ts-loader was supplied with an unexpected loader option: notRealOption/n/nPlease take a look at the options you are supplying; the following are valid options:/nsilent / logLevel / logInfoToStdOut / instance / compiler / context / configFile / transpileOnly / ignoreDiagnostics / errorFormatter / colors / compilerOptions / appendTsSuffixTo / appendTsxSuffixTo / onlyCompileBundledFiles / happyPackMode / getCustomTransformers / reportFiles / experimentalWatchApi / allowTsInNodeModules / experimentalFileCaching / projectReferences / resolveModuleName/n/n at validateLoaderOptions (C://source//ts-loader//dist//index.js:152:19)/n at getLoaderOptions (C://source//ts-loader//dist//index.js:110:5)/n at Object.loader (C://source//ts-loader//dist//index.js:16:21)\");\n\n//# sourceURL=webpack:///./app.ts?");
9797

9898
/***/ })
9999

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
Asset Size Chunks Chunk Names
2-
bundle.js 4.58 KiB main [emitted] main
1+
Asset Size Chunks Chunk Names
2+
bundle.js 4.6 KiB main [emitted] main
33
Entrypoint main = bundle.js
4-
[./app.ts] 835 bytes {main} [built] [failed] [1 error]
4+
[./app.ts] 855 bytes {main} [built] [failed] [1 error]
55

66
ERROR in ./app.ts
77
Module build failed (from /index.js):
88
Error: ts-loader was supplied with an unexpected loader option: notRealOption
99

1010
Please take a look at the options you are supplying; the following are valid options:
11-
silent / logLevel / logInfoToStdOut / instance / compiler / context / configFile / transpileOnly / ignoreDiagnostics / errorFormatter / colors / compilerOptions / appendTsSuffixTo / appendTsxSuffixTo / onlyCompileBundledFiles / happyPackMode / getCustomTransformers / reportFiles / experimentalWatchApi / allowTsInNodeModules / experimentalFileCaching / projectReferences
11+
silent / logLevel / logInfoToStdOut / instance / compiler / context / configFile / transpileOnly / ignoreDiagnostics / errorFormatter / colors / compilerOptions / appendTsSuffixTo / appendTsxSuffixTo / onlyCompileBundledFiles / happyPackMode / getCustomTransformers / reportFiles / experimentalWatchApi / allowTsInNodeModules / experimentalFileCaching / projectReferences / resolveModuleName
1212

13-
at validateLoaderOptions (dist\index.js:151:19)
13+
at validateLoaderOptions (dist\index.js:152:19)
1414
at getLoaderOptions (dist\index.js:110:5)
1515
at Object.loader (dist\index.js:16:21)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import {HelloWorld} from 'foo';
2+
3+
export type HelloBuilder = (hello: number, world: number) => HelloWorld;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "bar",
3+
"version": "1.0.0",
4+
"typings": "./index.d.ts"
5+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import {HelloBuilder} from 'bar';
2+
3+
export declare const makeHello: HelloBuilder;

0 commit comments

Comments
 (0)