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 =
3737getOptionValue ( '--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
10181019const isMain = parentURL === undefined ;
10191020if ( 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 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 ( ) {
113113const 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-
124115const { Hooks } = require ( 'internal/modules/esm/hooks' ) ;
125116const esmLoader = require ( 'internal/process/esm_loader' ) . esmLoader ;
126117
@@ -137,7 +128,7 @@ async function initializeHooks(){
137128loadPreloadModules ( ) ;
138129initializeFrozenIntrinsics ( ) ;
139130
140- const parentURL = pathToFileURL ( cwd ) . href ;
131+ const parentURL = getCWDURL ( ) . href ;
141132for ( let i = 0 ; i < customLoaderURLs . length ; i ++ ) {
142133await hooks . register (
143134customLoaderURLs [ 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 ={
2322try {
2423const userImports = getOptionValue ( '--import' ) ;
2524if ( 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 ;
3426await SafePromiseAllReturnVoid ( userImports , ( specifier ) => esmLoader . import (
3527specifier ,
3628parentURL ,
Original file line number Diff line number Diff line change @@ -358,6 +358,36 @@ function getConstructorOf(obj){
358358return 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 ) {
362392const entry = uvErrmapGet ( err ) ;
363393return 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