@@ -552,6 +552,12 @@ enum ResolveExtensionsOptions {
552552 ONLY_VIA_EXTENSIONS
553553};
554554
555+ inline bool ResolvesToFile (const URL& search) {
556+ std::string filePath = search.ToFilePath ();
557+ Maybe<uv_file> check = CheckFile (filePath);
558+ return !check.IsNothing ();
559+ }
560+
555561template <ResolveExtensionsOptions options>
556562Maybe<URL> ResolveExtensions (const URL& search) {
557563 if (options == TRY_EXACT_NAME) {
@@ -589,10 +595,20 @@ Maybe<URL> ResolveMain(Environment* env, const URL& search) {
589595 pjson.has_main == HasMain::No) {
590596 return Nothing<URL>();
591597 }
592- if (!ShouldBeTreatedAsRelativeOrAbsolutePath (pjson.main )) {
593- return Resolve (env, " ./" + pjson.main , search, IgnoreMain);
598+
599+ URL resolved;
600+ if (ShouldBeTreatedAsRelativeOrAbsolutePath (pjson.main )) {
601+ resolved = URL (pjson.main , search);
602+ } else {
603+ resolved = URL (" ./" + pjson.main , search);
604+ }
605+ Maybe<URL> file = ResolveExtensions<TRY_EXACT_NAME>(resolved);
606+ if (!file.IsNothing ())
607+ return file;
608+ if (pjson.main .back () != ' /' ) {
609+ resolved = URL (pjson.main + " /" , search);
594610 }
595- return Resolve (env, pjson. main , search, IgnoreMain );
611+ return ResolveIndex (resolved );
596612}
597613
598614Maybe<URL> ResolveModule (Environment* env,
@@ -603,7 +619,7 @@ Maybe<URL> ResolveModule(Environment* env,
603619 do {
604620 dir = parent;
605621 Maybe<URL> check =
606- Resolve (env, " ./node_modules/" + specifier, dir, CheckMain );
622+ Resolve (env, " ./node_modules/" + specifier, dir);
607623 if (!check.IsNothing ()) {
608624 const size_t limit = specifier.find (' /' );
609625 const size_t spec_len =
@@ -623,23 +639,11 @@ Maybe<URL> ResolveModule(Environment* env,
623639 return Nothing<URL>();
624640}
625641
626- Maybe<URL> ResolveDirectory (Environment* env,
627- const URL& search,
628- PackageMainCheck check_pjson_main) {
629- if (check_pjson_main) {
630- Maybe<URL> main = ResolveMain (env, search);
631- if (!main.IsNothing ())
632- return main;
633- }
634- return ResolveIndex (search);
635- }
636-
637642} // anonymous namespace
638643
639644Maybe<URL> Resolve (Environment* env,
640645 const std::string& specifier,
641- const URL& base,
642- PackageMainCheck check_pjson_main) {
646+ const URL& base) {
643647 URL pure_url (specifier);
644648 if (!(pure_url.flags () & URL_FLAGS_FAILED)) {
645649 // just check existence, without altering
@@ -654,13 +658,9 @@ Maybe<URL> Resolve(Environment* env,
654658 }
655659 if (ShouldBeTreatedAsRelativeOrAbsolutePath (specifier)) {
656660 URL resolved (specifier, base);
657- Maybe<URL> file = ResolveExtensions<TRY_EXACT_NAME>(resolved);
658- if (!file.IsNothing ())
659- return file;
660- if (specifier.back () != ' /' ) {
661- resolved = URL (specifier + " /" , base);
662- }
663- return ResolveDirectory (env, resolved, check_pjson_main);
661+ if (ResolvesToFile (resolved))
662+ return Just (resolved);
663+ return Nothing<URL>();
664664 } else {
665665 return ResolveModule (env, specifier, base);
666666 }
0 commit comments