@@ -37,7 +37,7 @@ const experimentalNetworkImports =
3737 getOptionValue ( '--experimental-network-imports' ) ;
3838const inputTypeFlag = getOptionValue ( '--input-type' ) ;
3939const { URL , pathToFileURL, fileURLToPath, isURL } = require ( 'internal/url' ) ;
40- const { getCWDURL } = require ( 'internal/util' ) ;
40+ const { getCWDURL, setOwnProperty } = require ( 'internal/util' ) ;
4141const { canParse : URLCanParse } = internalBinding ( 'url' ) ;
4242const { legacyMainResolve : FSLegacyMainResolve } = internalBinding ( 'fs' ) ;
4343const {
@@ -51,6 +51,7 @@ const {
5151 ERR_PACKAGE_IMPORT_NOT_DEFINED ,
5252 ERR_PACKAGE_PATH_NOT_EXPORTED ,
5353 ERR_UNSUPPORTED_DIR_IMPORT ,
54+ ERR_UNSUPPORTED_RESOLVE_REQUEST ,
5455 ERR_NETWORK_IMPORT_DISALLOWED ,
5556} = require ( 'internal/errors' ) . codes ;
5657
@@ -884,22 +885,37 @@ function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) {
884885 * @param {boolean } preserveSymlinks - Whether to preserve symlinks in the resolved URL.
885886 */
886887function moduleResolve ( specifier , base , conditions , preserveSymlinks ) {
887- const isRemote = base . protocol === 'http:' ||
888- base . protocol === 'https:' ;
888+ const protocol = typeof base === 'string' ?
889+ StringPrototypeSlice ( base , 0 , StringPrototypeIndexOf ( base , ':' ) + 1 ) :
890+ base . protocol ;
891+ const isData = protocol === 'data:' ;
892+ const isRemote =
893+ isData ||
894+ protocol === 'http:' ||
895+ protocol === 'https:' ;
889896 // Order swapped from spec for minor perf gain.
890897 // Ok since relative URLs cannot parse as URLs.
891898 let resolved ;
892899 if ( shouldBeTreatedAsRelativeOrAbsolutePath ( specifier ) ) {
893- resolved = new URL ( specifier , base ) ;
894- } else if ( ! isRemote && specifier [ 0 ] === '#' ) {
900+ try {
901+ resolved = new URL ( specifier , base ) ;
902+ } catch ( cause ) {
903+ const error = new ERR_UNSUPPORTED_RESOLVE_REQUEST ( specifier , base ) ;
904+ setOwnProperty ( error , 'cause' , cause ) ;
905+ throw error ;
906+ }
907+ } else if ( protocol === 'file:' && specifier [ 0 ] === '#' ) {
895908 resolved = packageImportsResolve ( specifier , base , conditions ) ;
896909 } else {
897910 try {
898911 resolved = new URL ( specifier ) ;
899- } catch {
900- if ( ! isRemote ) {
901- resolved = packageResolve ( specifier , base , conditions ) ;
912+ } catch ( cause ) {
913+ if ( isRemote && ! BuiltinModule . canBeRequiredWithoutScheme ( specifier ) ) {
914+ const error = new ERR_UNSUPPORTED_RESOLVE_REQUEST ( specifier , base ) ;
915+ setOwnProperty ( error , 'cause' , cause ) ;
916+ throw error ;
902917 }
918+ resolved = packageResolve ( specifier , base , conditions ) ;
903919 }
904920 }
905921 if ( resolved . protocol !== 'file:' ) {
@@ -1073,7 +1089,7 @@ function defaultResolve(specifier, context = {}) {
10731089 }
10741090 }
10751091
1076- let parsed ;
1092+ let parsed , protocol ;
10771093 try {
10781094 if ( shouldBeTreatedAsRelativeOrAbsolutePath ( specifier ) ) {
10791095 parsed = new URL ( specifier , parsedParentURL ) ;
@@ -1082,7 +1098,7 @@ function defaultResolve(specifier, context = {}) {
10821098 }
10831099
10841100 // Avoid accessing the `protocol` property due to the lazy getters.
1085- const protocol = parsed . protocol ;
1101+ protocol = parsed . protocol ;
10861102 if ( protocol === 'data:' ||
10871103 ( experimentalNetworkImports &&
10881104 (
@@ -1109,7 +1125,8 @@ function defaultResolve(specifier, context = {}) {
11091125 if ( maybeReturn ) { return maybeReturn ; }
11101126
11111127 // This must come after checkIfDisallowedImport
1112- if ( parsed && parsed . protocol === 'node:' ) { return { __proto__ : null , url : specifier } ; }
1128+ protocol ??= parsed ?. protocol ;
1129+ if ( protocol === 'node:' ) { return { __proto__ : null , url : specifier } ; }
11131130
11141131
11151132 const isMain = parentURL === undefined ;
0 commit comments