5
5
6
6
"use strict" ;
7
7
8
- const fs = require ( "graceful-fs" ) ;
9
- const CachedInputFileSystem = require ( "./CachedInputFileSystem" ) ;
10
- const ResolverFactory = require ( "./ResolverFactory" ) ;
8
+ const memoize = require ( "./util/memoize" ) ;
11
9
12
10
/** @typedef {import("./CachedInputFileSystem").BaseFileSystem } BaseFileSystem */
13
11
/** @typedef {import("./PnpPlugin").PnpApiImpl } PnpApi */
@@ -36,17 +34,28 @@ const ResolverFactory = require("./ResolverFactory");
36
34
* }} ResolveFunction
37
35
*/
38
36
39
- const nodeFileSystem = new CachedInputFileSystem ( fs , 4000 ) ;
37
+ const getCachedFileSystem = memoize ( ( ) => require ( "./CachedInputFileSystem" ) ) ;
40
38
41
- const nodeContext = {
42
- environments : [ "node+es3+es5+process+native" ] ,
43
- } ;
39
+ const getNodeFileSystem = memoize ( ( ) => {
40
+ const fs = require ( "graceful-fs" ) ;
41
+
42
+ const CachedInputFileSystem = getCachedFileSystem ( ) ;
44
43
45
- const asyncResolver = ResolverFactory . createResolver ( {
46
- conditionNames : [ "node" ] ,
47
- extensions : [ ".js" , ".json" , ".node" ] ,
48
- fileSystem : nodeFileSystem ,
44
+ return new CachedInputFileSystem ( fs , 4000 ) ;
49
45
} ) ;
46
+ const getNodeContext = memoize ( ( ) => ( {
47
+ environments : [ "node+es3+es5+process+native" ] ,
48
+ } ) ) ;
49
+
50
+ const getResolverFactory = memoize ( ( ) => require ( "./ResolverFactory" ) ) ;
51
+
52
+ const getAsyncResolver = memoize ( ( ) =>
53
+ getResolverFactory ( ) . createResolver ( {
54
+ conditionNames : [ "node" ] ,
55
+ extensions : [ ".js" , ".json" , ".node" ] ,
56
+ fileSystem : getNodeFileSystem ( ) ,
57
+ } ) ,
58
+ ) ;
50
59
51
60
/**
52
61
* @type {ResolveFunctionAsync }
@@ -65,12 +74,12 @@ const resolve =
65
74
resolveContext = /** @type {ResolveContext } */ ( request ) ;
66
75
request = path ;
67
76
path = context ;
68
- context = nodeContext ;
77
+ context = getNodeContext ( ) ;
69
78
}
70
79
if ( typeof callback !== "function" ) {
71
80
callback = /** @type {ResolveCallback } */ ( resolveContext ) ;
72
81
}
73
- asyncResolver . resolve (
82
+ getAsyncResolver ( ) . resolve (
74
83
context ,
75
84
path ,
76
85
/** @type {string } */ ( request ) ,
@@ -79,12 +88,14 @@ const resolve =
79
88
) ;
80
89
} ;
81
90
82
- const syncResolver = ResolverFactory . createResolver ( {
83
- conditionNames : [ "node" ] ,
84
- extensions : [ ".js" , ".json" , ".node" ] ,
85
- useSyncFileSystemCalls : true ,
86
- fileSystem : nodeFileSystem ,
87
- } ) ;
91
+ const getSyncResolver = memoize ( ( ) =>
92
+ getResolverFactory ( ) . createResolver ( {
93
+ conditionNames : [ "node" ] ,
94
+ extensions : [ ".js" , ".json" , ".node" ] ,
95
+ useSyncFileSystemCalls : true ,
96
+ fileSystem : getNodeFileSystem ( ) ,
97
+ } ) ,
98
+ ) ;
88
99
89
100
/**
90
101
* @type {ResolveFunction }
@@ -100,9 +111,9 @@ const resolveSync =
100
111
if ( typeof context === "string" ) {
101
112
request = path ;
102
113
path = context ;
103
- context = nodeContext ;
114
+ context = getNodeContext ( ) ;
104
115
}
105
- return syncResolver . resolveSync (
116
+ return getSyncResolver ( ) . resolveSync (
106
117
context ,
107
118
path ,
108
119
/** @type {string } */ ( request ) ,
@@ -116,8 +127,8 @@ const resolveSync =
116
127
* @returns {ResolveFunctionAsync } Resolver function
117
128
*/
118
129
function create ( options ) {
119
- const resolver = ResolverFactory . createResolver ( {
120
- fileSystem : nodeFileSystem ,
130
+ const resolver = getResolverFactory ( ) . createResolver ( {
131
+ fileSystem : getNodeFileSystem ( ) ,
121
132
...options ,
122
133
} ) ;
123
134
/**
@@ -133,7 +144,7 @@ function create(options) {
133
144
resolveContext = /** @type {ResolveContext } */ ( request ) ;
134
145
request = path ;
135
146
path = context ;
136
- context = nodeContext ;
147
+ context = getNodeContext ( ) ;
137
148
}
138
149
if ( typeof callback !== "function" ) {
139
150
callback = /** @type {ResolveCallback } */ ( resolveContext ) ;
@@ -153,9 +164,9 @@ function create(options) {
153
164
* @returns {ResolveFunction } Resolver function
154
165
*/
155
166
function createSync ( options ) {
156
- const resolver = ResolverFactory . createResolver ( {
167
+ const resolver = getResolverFactory ( ) . createResolver ( {
157
168
useSyncFileSystemCalls : true ,
158
- fileSystem : nodeFileSystem ,
169
+ fileSystem : getNodeFileSystem ( ) ,
159
170
...options ,
160
171
} ) ;
161
172
/**
@@ -168,7 +179,7 @@ function createSync(options) {
168
179
if ( typeof context === "string" ) {
169
180
request = path ;
170
181
path = context ;
171
- context = nodeContext ;
182
+ context = getNodeContext ( ) ;
172
183
}
173
184
return resolver . resolveSync ( context , path , /** @type {string } */ ( request ) ) ;
174
185
} ;
@@ -196,8 +207,12 @@ module.exports = mergeExports(resolve, {
196
207
return createSync ;
197
208
} ,
198
209
} ) ,
199
- ResolverFactory,
200
- CachedInputFileSystem,
210
+ get ResolverFactory ( ) {
211
+ return getResolverFactory ( ) ;
212
+ } ,
213
+ get CachedInputFileSystem ( ) {
214
+ return getCachedFileSystem ( ) ;
215
+ } ,
201
216
get CloneBasenamePlugin ( ) {
202
217
return require ( "./CloneBasenamePlugin" ) ;
203
218
} ,
0 commit comments