@@ -43,6 +43,8 @@ using v8::String;
43
43
using v8::Undefined;
44
44
using v8::Value;
45
45
46
+ static const char * const EXTENSIONS[] = {" .mjs" , " .js" , " .json" , " .node" };
47
+
46
48
ModuleWrap::ModuleWrap (Environment* env,
47
49
Local<Object> object,
48
50
Local<Module> module,
@@ -683,6 +685,36 @@ Maybe<URL> FinalizeResolution(Environment* env,
683
685
return Just (resolved);
684
686
}
685
687
688
+ enum ResolveExtensionsOptions {
689
+ TRY_EXACT_NAME,
690
+ ONLY_VIA_EXTENSIONS
691
+ };
692
+
693
+ template <ResolveExtensionsOptions options>
694
+ Maybe<URL> ResolveExtensions (const URL& search) {
695
+ if (options == TRY_EXACT_NAME) {
696
+ std::string filePath = search.ToFilePath ();
697
+ Maybe<uv_file> fd = OpenDescriptor (filePath);
698
+ if (!fd.IsNothing ()) {
699
+ return Just (search);
700
+ }
701
+ }
702
+
703
+ for (const char * extension : EXTENSIONS) {
704
+ URL guess (search.path () + extension, &search);
705
+ Maybe<uv_file> fd = OpenDescriptor (guess.ToFilePath ());
706
+ if (!fd.IsNothing ()) {
707
+ return Just (guess);
708
+ }
709
+ }
710
+
711
+ return Nothing<URL>();
712
+ }
713
+
714
+ inline Maybe<URL> ResolveIndex (const URL& search) {
715
+ return ResolveExtensions<ONLY_VIA_EXTENSIONS>(URL (" index" , search));
716
+ }
717
+
686
718
Maybe<URL> PackageMainResolve (Environment* env,
687
719
const URL& pjson_url,
688
720
const PackageConfig& pcfg,
@@ -778,6 +810,16 @@ Maybe<URL> Resolve(Environment* env,
778
810
URL resolved;
779
811
if (ShouldBeTreatedAsRelativeOrAbsolutePath (specifier)) {
780
812
resolved = URL (specifier, base);
813
+ if (env->options ()->legacy_resolution ) {
814
+ Maybe<URL> file = ResolveExtensions<TRY_EXACT_NAME>(resolved);
815
+ if (!file.IsNothing ()) {
816
+ return file;
817
+ }
818
+ if (specifier.back () != ' /' ) {
819
+ resolved = URL (specifier + " /" , base);
820
+ }
821
+ return ResolveIndex (resolved);
822
+ }
781
823
} else {
782
824
URL pure_url (specifier);
783
825
if (!(pure_url.flags () & URL_FLAGS_FAILED)) {
0 commit comments