@@ -26,7 +26,6 @@ using v8::HandleScope;
2626using v8::Integer;
2727using v8::IntegrityLevel;
2828using v8::Isolate;
29- using v8::JSON;
3029using v8::Just;
3130using v8::Local;
3231using v8::Maybe;
@@ -505,70 +504,17 @@ Maybe<uv_file> CheckFile(const std::string& path,
505504 return Just (fd);
506505}
507506
508- using Exists = PackageConfig::Exists;
509- using IsValid = PackageConfig::IsValid;
510- using HasMain = PackageConfig::HasMain;
511-
512- const PackageConfig& GetPackageConfig (Environment* env,
513- const std::string& path) {
514- auto existing = env->package_json_cache .find (path);
515- if (existing != env->package_json_cache .end ()) {
516- return existing->second ;
517- }
518- Maybe<uv_file> check = CheckFile (path, LEAVE_OPEN_AFTER_CHECK);
519- if (check.IsNothing ()) {
520- auto entry = env->package_json_cache .emplace (path,
521- PackageConfig { Exists::No, IsValid::Yes, HasMain::No, " " });
522- return entry.first ->second ;
523- }
524-
525- Isolate* isolate = env->isolate ();
526- v8::HandleScope handle_scope (isolate);
527-
528- std::string pkg_src = ReadFile (check.FromJust ());
529- uv_fs_t fs_req;
530- CHECK_EQ (0 , uv_fs_close (nullptr , &fs_req, check.FromJust (), nullptr ));
531- uv_fs_req_cleanup (&fs_req);
532-
533- Local<String> src;
534- if (!String::NewFromUtf8 (isolate,
535- pkg_src.c_str (),
536- v8::NewStringType::kNormal ,
537- pkg_src.length ()).ToLocal (&src)) {
538- auto entry = env->package_json_cache .emplace (path,
539- PackageConfig { Exists::No, IsValid::Yes, HasMain::No, " " });
540- return entry.first ->second ;
541- }
542-
543- Local<Value> pkg_json_v;
544- Local<Object> pkg_json;
545-
546- if (!JSON::Parse (env->context (), src).ToLocal (&pkg_json_v) ||
547- !pkg_json_v->ToObject (env->context ()).ToLocal (&pkg_json)) {
548- auto entry = env->package_json_cache .emplace (path,
549- PackageConfig { Exists::Yes, IsValid::No, HasMain::No, " " });
550- return entry.first ->second ;
551- }
552-
553- Local<Value> pkg_main;
554- HasMain has_main = HasMain::No;
555- std::string main_std;
556- if (pkg_json->Get (env->context (), env->main_string ()).ToLocal (&pkg_main)) {
557- has_main = HasMain::Yes;
558- Utf8Value main_utf8 (isolate, pkg_main);
559- main_std.assign (std::string (*main_utf8, main_utf8.length ()));
560- }
561-
562- auto entry = env->package_json_cache .emplace (path,
563- PackageConfig { Exists::Yes, IsValid::Yes, has_main, main_std });
564- return entry.first ->second ;
565- }
566-
567507enum ResolveExtensionsOptions {
568508 TRY_EXACT_NAME,
569509 ONLY_VIA_EXTENSIONS
570510};
571511
512+ inline bool ResolvesToFile (const URL& search) {
513+ std::string filePath = search.ToFilePath ();
514+ Maybe<uv_file> check = CheckFile (filePath);
515+ return !check.IsNothing ();
516+ }
517+
572518template <ResolveExtensionsOptions options>
573519Maybe<URL> ResolveExtensions (const URL& search) {
574520 if (options == TRY_EXACT_NAME) {
@@ -594,24 +540,6 @@ inline Maybe<URL> ResolveIndex(const URL& search) {
594540 return ResolveExtensions<ONLY_VIA_EXTENSIONS>(URL (" index" , search));
595541}
596542
597- Maybe<URL> ResolveMain (Environment* env, const URL& search) {
598- URL pkg (" package.json" , &search);
599-
600- const PackageConfig& pjson =
601- GetPackageConfig (env, pkg.ToFilePath ());
602- // Note invalid package.json should throw in resolver
603- // currently we silently ignore which is incorrect
604- if (pjson.exists == Exists::No ||
605- pjson.is_valid == IsValid::No ||
606- pjson.has_main == HasMain::No) {
607- return Nothing<URL>();
608- }
609- if (!ShouldBeTreatedAsRelativeOrAbsolutePath (pjson.main )) {
610- return Resolve (env, " ./" + pjson.main , search, IgnoreMain);
611- }
612- return Resolve (env, pjson.main , search, IgnoreMain);
613- }
614-
615543Maybe<URL> ResolveModule (Environment* env,
616544 const std::string& specifier,
617545 const URL& base) {
@@ -620,7 +548,7 @@ Maybe<URL> ResolveModule(Environment* env,
620548 do {
621549 dir = parent;
622550 Maybe<URL> check =
623- Resolve (env, " ./node_modules/" + specifier, dir, CheckMain );
551+ Resolve (env, " ./node_modules/" + specifier, dir);
624552 if (!check.IsNothing ()) {
625553 const size_t limit = specifier.find (' /' );
626554 const size_t spec_len =
@@ -640,23 +568,11 @@ Maybe<URL> ResolveModule(Environment* env,
640568 return Nothing<URL>();
641569}
642570
643- Maybe<URL> ResolveDirectory (Environment* env,
644- const URL& search,
645- PackageMainCheck check_pjson_main) {
646- if (check_pjson_main) {
647- Maybe<URL> main = ResolveMain (env, search);
648- if (!main.IsNothing ())
649- return main;
650- }
651- return ResolveIndex (search);
652- }
653-
654571} // anonymous namespace
655572
656573Maybe<URL> Resolve (Environment* env,
657574 const std::string& specifier,
658- const URL& base,
659- PackageMainCheck check_pjson_main) {
575+ const URL& base) {
660576 URL pure_url (specifier);
661577 if (!(pure_url.flags () & URL_FLAGS_FAILED)) {
662578 // just check existence, without altering
@@ -671,13 +587,9 @@ Maybe<URL> Resolve(Environment* env,
671587 }
672588 if (ShouldBeTreatedAsRelativeOrAbsolutePath (specifier)) {
673589 URL resolved (specifier, base);
674- Maybe<URL> file = ResolveExtensions<TRY_EXACT_NAME>(resolved);
675- if (!file.IsNothing ())
676- return file;
677- if (specifier.back () != ' /' ) {
678- resolved = URL (specifier + " /" , base);
679- }
680- return ResolveDirectory (env, resolved, check_pjson_main);
590+ if (ResolvesToFile (resolved))
591+ return Just (resolved);
592+ return Nothing<URL>();
681593 } else {
682594 return ResolveModule (env, specifier, base);
683595 }
0 commit comments