Skip to content

Commit e13f8cb

Browse files
committed
update
1 parent 84a502e commit e13f8cb

File tree

3 files changed

+74
-32
lines changed

3 files changed

+74
-32
lines changed

lib/Resolver.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const {
1616
} = require("./util/path");
1717

1818
/** @typedef {import("./ResolverFactory").ResolveOptions} ResolveOptions */
19-
19+
/** @typedef {import("./AliasUtils").AliasOption} AliasOption */
2020
/** @typedef {Error & { details?: string }} ErrorWithDetail */
2121

2222
/** @typedef {(err: ErrorWithDetail | null, res?: string | false, req?: ResolveRequest) => void} ResolveCallback */
@@ -292,6 +292,12 @@ const {
292292
// eslint-disable-next-line jsdoc/require-property
293293
/** @typedef {object} Context */
294294

295+
/**
296+
* @typedef {object} TsconfigFileData
297+
* @property {Array<AliasOption>} aliases tsconfig file data
298+
* @property {Set<string>} fileDependencies file dependencies
299+
*/
300+
295301
/**
296302
* @typedef {object} BaseResolveRequest
297303
* @property {string | false} path path
@@ -302,6 +308,7 @@ const {
302308
* @property {string=} relativePath relative path
303309
* @property {boolean=} ignoreSymlinks true when need to ignore symlinks, otherwise false
304310
* @property {boolean=} fullySpecified true when full specified, otherwise false
311+
* @property {TsconfigFileData=} tsconfigFileData tsconfig file data
305312
* @property {string=} __innerRequest inner request for internal usage
306313
* @property {string=} __innerRequest_request inner request for internal usage
307314
* @property {string=} __innerRequest_relativePath inner relative path for internal usage

lib/TsconfigPathsPlugin.js

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ const { aliasResolveHandler } = require("./AliasUtils");
1010
const { modulesResolveHandler } = require("./ModulesUtils");
1111

1212
/** @typedef {import("./Resolver")} Resolver */
13-
/** @typedef {{alias: string | string[] | false, name: string, onlyModule?: boolean}} AliasOption */
1413
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
14+
/** @typedef {import("./AliasUtils").AliasOption} AliasOption */
15+
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
16+
/** @typedef {import("./Resolver").ResolveContext} ResolveContext */
1517

1618
/**
1719
* @typedef {object} TsconfigPathsPluginOptions
@@ -37,22 +39,18 @@ module.exports = class TsconfigPathsPlugin {
3739
apply(resolver) {
3840
const aliasTarget = resolver.ensureHook("internal-resolve");
3941
const moduleTarget = resolver.ensureHook("module");
40-
const aliasResultCachePromise = this.loadAndConvertPaths(resolver);
4142

4243
resolver
4344
.getHook("raw-resolve")
4445
.tapAsync(
4546
"TsconfigPathsPlugin",
4647
async (request, resolveContext, callback) => {
4748
try {
48-
const aliasResult = await aliasResultCachePromise;
49-
if (!aliasResult) return callback();
50-
const { aliases, fileDependencies } = aliasResult;
51-
for (const fileDependency of fileDependencies) {
52-
if (resolveContext.fileDependencies) {
53-
resolveContext.fileDependencies.add(fileDependency);
54-
}
55-
}
49+
const aliases = await this.beforeResolve(
50+
resolver,
51+
request,
52+
resolveContext,
53+
);
5654
aliasResolveHandler(
5755
resolver,
5856
aliases.filter((option) => option.name !== "*"),
@@ -73,18 +71,14 @@ module.exports = class TsconfigPathsPlugin {
7371
"TsconfigPathsPlugin",
7472
async (request, resolveContext, callback) => {
7573
try {
76-
const aliasResult = await aliasResultCachePromise;
77-
if (!aliasResult) return callback();
78-
const { aliases, fileDependencies } = aliasResult;
79-
for (const fileDependency of fileDependencies) {
80-
if (resolveContext.fileDependencies) {
81-
resolveContext.fileDependencies.add(fileDependency);
82-
}
83-
}
74+
const aliases = await this.beforeResolve(
75+
resolver,
76+
request,
77+
resolveContext,
78+
);
8479
const directories = aliases
8580
.filter((option) => option.name === "*")
8681
.map((option) => /** @type {string} */ (option.alias));
87-
if (directories.length === 0) return callback();
8882

8983
modulesResolveHandler(
9084
resolver,
@@ -101,6 +95,27 @@ module.exports = class TsconfigPathsPlugin {
10195
);
10296
}
10397

98+
/**
99+
* Pre-process request to load tsconfig.json and convert paths to AliasPlugin format
100+
* @param {Resolver} resolver the resolver
101+
* @param {ResolveRequest} request the request
102+
* @param {ResolveContext} resolveContext the resolve context
103+
* @returns {Promise<Array<AliasOption>>} the pre-processed request
104+
*/
105+
async beforeResolve(resolver, request, resolveContext) {
106+
const tsconfigFileData =
107+
request.tsconfigFileData || (await this.loadAndConvertPaths(resolver));
108+
if (!tsconfigFileData) return [];
109+
const { aliases, fileDependencies } = tsconfigFileData;
110+
for (const fileDependency of fileDependencies) {
111+
if (resolveContext.fileDependencies) {
112+
resolveContext.fileDependencies.add(fileDependency);
113+
}
114+
}
115+
request.tsconfigFileData = tsconfigFileData;
116+
return aliases;
117+
}
118+
104119
/**
105120
* Load tsconfig.json (and referenced tsconfigs) and convert paths to AliasPlugin format
106121
* @param {Resolver} resolver the resolver

types.d.ts

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,12 @@ declare interface Abortable {
1515
signal?: AbortSignal;
1616
}
1717
type Alias = string | false | string[];
18-
declare interface AliasOptionAliasPlugin {
18+
declare interface AliasOption {
1919
alias: Alias;
2020
name: string;
2121
onlyModule?: boolean;
2222
}
2323
type AliasOptionNewRequest = string | false | string[];
24-
declare interface AliasOptionTsconfigPathsPlugin {
25-
alias: string | false | string[];
26-
name: string;
27-
onlyModule?: boolean;
28-
}
2924
declare interface AliasOptions {
3025
[index: string]: AliasOptionNewRequest;
3126
}
@@ -71,6 +66,11 @@ declare interface BaseResolveRequest {
7166
*/
7267
fullySpecified?: boolean;
7368

69+
/**
70+
* tsconfig file data
71+
*/
72+
tsconfigFileData?: TsconfigFileData;
73+
7474
/**
7575
* inner request for internal usage
7676
*/
@@ -1140,12 +1140,12 @@ declare interface ResolveOptionsResolverFactoryObject_1 {
11401140
/**
11411141
* alias
11421142
*/
1143-
alias: AliasOptionAliasPlugin[];
1143+
alias: AliasOption[];
11441144

11451145
/**
11461146
* fallback
11471147
*/
1148-
fallback: AliasOptionAliasPlugin[];
1148+
fallback: AliasOption[];
11491149

11501150
/**
11511151
* alias fields
@@ -1281,12 +1281,12 @@ declare interface ResolveOptionsResolverFactoryObject_2 {
12811281
/**
12821282
* A list of module alias configurations or an object which maps key to value
12831283
*/
1284-
alias?: AliasOptions | AliasOptionAliasPlugin[];
1284+
alias?: AliasOptions | AliasOption[];
12851285

12861286
/**
12871287
* A list of module alias configurations or an object which maps key to value, applied only after modules option
12881288
*/
1289-
fallback?: AliasOptions | AliasOptionAliasPlugin[];
1289+
fallback?: AliasOptions | AliasOption[];
12901290

12911291
/**
12921292
* An object which maps extension to extension aliases
@@ -1584,17 +1584,37 @@ declare interface SyncFileSystem {
15841584
*/
15851585
realpathSync?: RealPathSync;
15861586
}
1587+
declare interface TsconfigFileData {
1588+
/**
1589+
* tsconfig file data
1590+
*/
1591+
aliases: AliasOption[];
1592+
1593+
/**
1594+
* file dependencies
1595+
*/
1596+
fileDependencies: Set<string>;
1597+
}
15871598
declare class TsconfigPathsPlugin {
15881599
constructor(configFile: string);
15891600
configFile: string;
15901601
apply(resolver: Resolver): void;
15911602

1603+
/**
1604+
* Pre-process request to load tsconfig.json and convert paths to AliasPlugin format
1605+
*/
1606+
beforeResolve(
1607+
resolver: Resolver,
1608+
request: ResolveRequest,
1609+
resolveContext: ResolveContext,
1610+
): Promise<AliasOption[]>;
1611+
15921612
/**
15931613
* Load tsconfig.json (and referenced tsconfigs) and convert paths to AliasPlugin format
15941614
*/
15951615
loadAndConvertPaths(
15961616
resolver: Resolver,
1597-
): Promise<AliasOptionTsconfigPathsPlugin[]>;
1617+
): Promise<null | { aliases: AliasOption[]; fileDependencies: Set<string> }>;
15981618

15991619
/**
16001620
* Read tsconfig.json and return normalized compiler options
@@ -1611,7 +1631,7 @@ declare class TsconfigPathsPlugin {
16111631
resolver: Resolver,
16121632
paths: { [index: string]: string[] },
16131633
baseUrl: string,
1614-
): AliasOptionTsconfigPathsPlugin[];
1634+
): AliasOption[];
16151635
}
16161636
declare interface URL_url extends URL_Import {}
16171637
declare interface WriteOnlySet<T> {

0 commit comments

Comments
 (0)