File tree Expand file tree Collapse file tree 4 files changed +37
-22
lines changed Expand file tree Collapse file tree 4 files changed +37
-22
lines changed Original file line number Diff line number Diff line change @@ -37,6 +37,7 @@ const experimentalNetworkImports =
3737 getOptionValue ( '--experimental-network-imports' ) ;
3838const typeFlag = getOptionValue ( '--input-type' ) ;
3939const { URL , pathToFileURL, fileURLToPath, isURL } = require ( 'internal/url' ) ;
40+ const { getCWDURL } = require ( 'internal/util' ) ;
4041const { canParse : URLCanParse } = internalBinding ( 'url' ) ;
4142const { legacyMainResolve : FSLegacyMainResolve } = internalBinding ( 'fs' ) ;
4243const {
@@ -1017,7 +1018,7 @@ function defaultResolve(specifier, context = {}) {
10171018
10181019 const isMain = parentURL === undefined ;
10191020 if ( isMain ) {
1020- parentURL = pathToFileURL ( ` ${ process . cwd ( ) } /` ) . href ;
1021+ parentURL = getCWDURL ( ) . href ;
10211022
10221023 // This is the initial entry point to the program, and --input-type has
10231024 // been passed as an option; but --input-type can only be used with
Original file line number Diff line number Diff line change @@ -16,7 +16,7 @@ const {
1616 loadPreloadModules,
1717 initializeFrozenIntrinsics,
1818} = require ( 'internal/process/pre_execution' ) ;
19- const { pathToFileURL } = require ( 'internal/url ' ) ;
19+ const { getCWDURL } = require ( 'internal/util ' ) ;
2020const {
2121 setImportModuleDynamicallyCallback,
2222 setInitializeImportMetaObjectCallback,
@@ -112,15 +112,6 @@ function isLoaderWorker() {
112112async function initializeHooks ( ) {
113113 const customLoaderURLs = getOptionValue ( '--experimental-loader' ) ;
114114
115- let cwd ;
116- try {
117- // `process.cwd()` can fail if the parent directory is deleted while the process runs.
118- cwd = process . cwd ( ) + '/' ;
119- } catch {
120- cwd = '/' ;
121- }
122-
123-
124115 const { Hooks } = require ( 'internal/modules/esm/hooks' ) ;
125116 const esmLoader = require ( 'internal/process/esm_loader' ) . esmLoader ;
126117
@@ -137,7 +128,7 @@ async function initializeHooks() {
137128 loadPreloadModules ( ) ;
138129 initializeFrozenIntrinsics ( ) ;
139130
140- const parentURL = pathToFileURL ( cwd ) . href ;
131+ const parentURL = getCWDURL ( ) . href ;
141132 for ( let i = 0 ; i < customLoaderURLs . length ; i ++ ) {
142133 await hooks . register (
143134 customLoaderURLs [ i ] ,
Original file line number Diff line number Diff line change @@ -9,8 +9,7 @@ const { getOptionValue } = require('internal/options');
99const {
1010 hasUncaughtExceptionCaptureCallback,
1111} = require ( 'internal/process/execution' ) ;
12- const { pathToFileURL } = require ( 'internal/url' ) ;
13- const { kEmptyObject } = require ( 'internal/util' ) ;
12+ const { kEmptyObject, getCWDURL } = require ( 'internal/util' ) ;
1413
1514let esmLoader ;
1615
@@ -23,14 +22,7 @@ module.exports = {
2322 try {
2423 const userImports = getOptionValue ( '--import' ) ;
2524 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 ;
3426 await SafePromiseAllReturnVoid ( userImports , ( specifier ) => esmLoader . import (
3527 specifier ,
3628 parentURL ,
Original file line number Diff line number Diff line change @@ -358,6 +358,36 @@ function getConstructorOf(obj) {
358358 return null ;
359359}
360360
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+
361391function getSystemErrorName ( err ) {
362392 const entry = uvErrmapGet ( err ) ;
363393 return entry ? entry [ 0 ] : `Unknown system error ${ err } ` ;
@@ -850,6 +880,7 @@ module.exports = {
850880 filterDuplicateStrings,
851881 filterOwnProperties,
852882 getConstructorOf,
883+ getCWDURL,
853884 getInternalGlobal,
854885 getSystemErrorMap,
855886 getSystemErrorName,
You can’t perform that action at this time.
0 commit comments