Skip to content
This repository was archived by the owner on Apr 16, 2020. It is now read-only.

Commit b36bf08

Browse files
committed
esm: implement flagged resolution algo
1 parent f604ca4 commit b36bf08

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/module_wrap.cc

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ using v8::String;
4343
using v8::Undefined;
4444
using v8::Value;
4545

46+
static const char* const EXTENSIONS[] = {".mjs", ".js", ".json", ".node"};
47+
4648
ModuleWrap::ModuleWrap(Environment* env,
4749
Local<Object> object,
4850
Local<Module> module,
@@ -683,6 +685,36 @@ Maybe<URL> FinalizeResolution(Environment* env,
683685
return Just(resolved);
684686
}
685687

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+
686718
Maybe<URL> PackageMainResolve(Environment* env,
687719
const URL& pjson_url,
688720
const PackageConfig& pcfg,
@@ -778,6 +810,16 @@ Maybe<URL> Resolve(Environment* env,
778810
URL resolved;
779811
if (ShouldBeTreatedAsRelativeOrAbsolutePath(specifier)) {
780812
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+
}
781823
} else {
782824
URL pure_url(specifier);
783825
if (!(pure_url.flags() & URL_FLAGS_FAILED)) {

src/node_options.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() {
237237
&EnvironmentOptions::http_parser,
238238
kAllowedInEnvironment);
239239
AddOption("--legacy-resolution",
240-
"legacy exntesion and folder resolution for ES Modules",
240+
"legacy extension and folder resolution for ES Modules",
241241
&EnvironmentOptions::legacy_resolution,
242242
kAllowedInEnvironment);
243243
AddOption("--no-deprecation",

0 commit comments

Comments
 (0)