File tree 4 files changed +37
-22
lines changed
4 files changed +37
-22
lines changed Original file line number Diff line number Diff line change @@ -37,6 +37,7 @@ const experimentalNetworkImports =
37
37
getOptionValue ( '--experimental-network-imports' ) ;
38
38
const typeFlag = getOptionValue ( '--input-type' ) ;
39
39
const { URL , pathToFileURL, fileURLToPath, isURL } = require ( 'internal/url' ) ;
40
+ const { getCWDURL } = require ( 'internal/util' ) ;
40
41
const { canParse : URLCanParse } = internalBinding ( 'url' ) ;
41
42
const { legacyMainResolve : FSLegacyMainResolve } = internalBinding ( 'fs' ) ;
42
43
const {
@@ -1095,7 +1096,7 @@ function defaultResolve(specifier, context = {}) {
1095
1096
1096
1097
const isMain = parentURL === undefined ;
1097
1098
if ( isMain ) {
1098
- parentURL = pathToFileURL ( ` ${ process . cwd ( ) } /` ) . href ;
1099
+ parentURL = getCWDURL ( ) . href ;
1099
1100
1100
1101
// This is the initial entry point to the program, and --input-type has
1101
1102
// been passed as an option; but --input-type can only be used with
Original file line number Diff line number Diff line change @@ -21,7 +21,7 @@ const {
21
21
loadPreloadModules,
22
22
initializeFrozenIntrinsics,
23
23
} = require ( 'internal/process/pre_execution' ) ;
24
- const { pathToFileURL } = require ( 'internal/url ' ) ;
24
+ const { getCWDURL } = require ( 'internal/util ' ) ;
25
25
const {
26
26
setImportModuleDynamicallyCallback,
27
27
setInitializeImportMetaObjectCallback,
@@ -195,15 +195,6 @@ function isLoaderWorker() {
195
195
async function initializeHooks ( ) {
196
196
const customLoaderURLs = getOptionValue ( '--experimental-loader' ) ;
197
197
198
- let cwd ;
199
- try {
200
- // `process.cwd()` can fail if the parent directory is deleted while the process runs.
201
- cwd = process . cwd ( ) + '/' ;
202
- } catch {
203
- cwd = '/' ;
204
- }
205
-
206
-
207
198
const { Hooks } = require ( 'internal/modules/esm/hooks' ) ;
208
199
const esmLoader = require ( 'internal/process/esm_loader' ) . esmLoader ;
209
200
@@ -220,7 +211,7 @@ async function initializeHooks() {
220
211
loadPreloadModules ( ) ;
221
212
initializeFrozenIntrinsics ( ) ;
222
213
223
- const parentURL = pathToFileURL ( cwd ) . href ;
214
+ const parentURL = getCWDURL ( ) . href ;
224
215
for ( let i = 0 ; i < customLoaderURLs . length ; i ++ ) {
225
216
await hooks . register (
226
217
customLoaderURLs [ i ] ,
Original file line number Diff line number Diff line change @@ -9,8 +9,7 @@ const { getOptionValue } = require('internal/options');
9
9
const {
10
10
hasUncaughtExceptionCaptureCallback,
11
11
} = require ( 'internal/process/execution' ) ;
12
- const { pathToFileURL } = require ( 'internal/url' ) ;
13
- const { kEmptyObject } = require ( 'internal/util' ) ;
12
+ const { kEmptyObject, getCWDURL } = require ( 'internal/util' ) ;
14
13
15
14
let esmLoader ;
16
15
@@ -23,14 +22,7 @@ module.exports = {
23
22
try {
24
23
const userImports = getOptionValue ( '--import' ) ;
25
24
if ( userImports . length > 0 ) {
26
- let cwd ;
27
- try {
28
- // `process.cwd()` can fail if the parent directory is deleted while the process runs.
29
- cwd = process . cwd ( ) + '/' ;
30
- } catch {
31
- cwd = '/' ;
32
- }
33
- const parentURL = pathToFileURL ( cwd ) . href ;
25
+ const parentURL = getCWDURL ( ) . href ;
34
26
await SafePromiseAllReturnVoid ( userImports , ( specifier ) => esmLoader . import (
35
27
specifier ,
36
28
parentURL ,
Original file line number Diff line number Diff line change @@ -358,6 +358,36 @@ function getConstructorOf(obj) {
358
358
return null ;
359
359
}
360
360
361
+ let cachedURL ;
362
+ let cachedCWD ;
363
+
364
+ /**
365
+ * Get the current working directory while accounting for the possibility that it has been deleted.
366
+ * `process.cwd()` can fail if the parent directory is deleted while the process runs.
367
+ * @returns {URL } The current working directory or the volume root if it cannot be determined.
368
+ */
369
+ function getCWDURL ( ) {
370
+ const { sep } = require ( 'path' ) ;
371
+ const { pathToFileURL } = require ( 'internal/url' ) ;
372
+
373
+ let cwd ;
374
+
375
+ try {
376
+ // The implementation of `process.cwd()` already uses proper cache when it can.
377
+ // It's a relatively cheap call performance-wise for the most common use case.
378
+ cwd = process . cwd ( ) ;
379
+ } catch {
380
+ cachedURL ??= pathToFileURL ( sep ) ;
381
+ }
382
+
383
+ if ( cwd != null && cwd !== cachedCWD ) {
384
+ cachedURL = pathToFileURL ( cwd + sep ) ;
385
+ cachedCWD = cwd ;
386
+ }
387
+
388
+ return cachedURL ;
389
+ }
390
+
361
391
function getSystemErrorName ( err ) {
362
392
const entry = uvErrmapGet ( err ) ;
363
393
return entry ? entry [ 0 ] : `Unknown system error ${ err } ` ;
@@ -853,6 +883,7 @@ module.exports = {
853
883
filterDuplicateStrings,
854
884
filterOwnProperties,
855
885
getConstructorOf,
886
+ getCWDURL,
856
887
getInternalGlobal,
857
888
getSystemErrorMap,
858
889
getSystemErrorName,
You can’t perform that action at this time.
0 commit comments