@@ -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;
@@ -489,70 +488,17 @@ Maybe<uv_file> CheckFile(const std::string& path,
489488 return Just (fd);
490489}
491490
492- using Exists = PackageConfig::Exists;
493- using IsValid = PackageConfig::IsValid;
494- using HasMain = PackageConfig::HasMain;
495-
496- const PackageConfig& GetPackageConfig (Environment* env,
497- const std::string& path) {
498- auto existing = env->package_json_cache .find (path);
499- if (existing != env->package_json_cache .end ()) {
500- return existing->second ;
501- }
502- Maybe<uv_file> check = CheckFile (path, LEAVE_OPEN_AFTER_CHECK);
503- if (check.IsNothing ()) {
504- auto entry = env->package_json_cache .emplace (path,
505- PackageConfig { Exists::No, IsValid::Yes, HasMain::No, " " });
506- return entry.first ->second ;
507- }
508-
509- Isolate* isolate = env->isolate ();
510- v8::HandleScope handle_scope (isolate);
511-
512- std::string pkg_src = ReadFile (check.FromJust ());
513- uv_fs_t fs_req;
514- CHECK_EQ (0 , uv_fs_close (nullptr , &fs_req, check.FromJust (), nullptr ));
515- uv_fs_req_cleanup (&fs_req);
516-
517- Local<String> src;
518- if (!String::NewFromUtf8 (isolate,
519- pkg_src.c_str (),
520- v8::NewStringType::kNormal ,
521- pkg_src.length ()).ToLocal (&src)) {
522- auto entry = env->package_json_cache .emplace (path,
523- PackageConfig { Exists::No, IsValid::Yes, HasMain::No, " " });
524- return entry.first ->second ;
525- }
526-
527- Local<Value> pkg_json_v;
528- Local<Object> pkg_json;
529-
530- if (!JSON::Parse (env->context (), src).ToLocal (&pkg_json_v) ||
531- !pkg_json_v->ToObject (env->context ()).ToLocal (&pkg_json)) {
532- auto entry = env->package_json_cache .emplace (path,
533- PackageConfig { Exists::Yes, IsValid::No, HasMain::No, " " });
534- return entry.first ->second ;
535- }
536-
537- Local<Value> pkg_main;
538- HasMain has_main = HasMain::No;
539- std::string main_std;
540- if (pkg_json->Get (env->context (), env->main_string ()).ToLocal (&pkg_main)) {
541- has_main = HasMain::Yes;
542- Utf8Value main_utf8 (isolate, pkg_main);
543- main_std.assign (std::string (*main_utf8, main_utf8.length ()));
544- }
545-
546- auto entry = env->package_json_cache .emplace (path,
547- PackageConfig { Exists::Yes, IsValid::Yes, has_main, main_std });
548- return entry.first ->second ;
549- }
550-
551491enum ResolveExtensionsOptions {
552492 TRY_EXACT_NAME,
553493 ONLY_VIA_EXTENSIONS
554494};
555495
496+ inline bool ResolvesToFile (const URL& search) {
497+ std::string filePath = search.ToFilePath ();
498+ Maybe<uv_file> check = CheckFile (filePath);
499+ return !check.IsNothing ();
500+ }
501+
556502template <ResolveExtensionsOptions options>
557503Maybe<URL> ResolveExtensions (const URL& search) {
558504 if (options == TRY_EXACT_NAME) {
@@ -578,24 +524,6 @@ inline Maybe<URL> ResolveIndex(const URL& search) {
578524 return ResolveExtensions<ONLY_VIA_EXTENSIONS>(URL (" index" , search));
579525}
580526
581- Maybe<URL> ResolveMain (Environment* env, const URL& search) {
582- URL pkg (" package.json" , &search);
583-
584- const PackageConfig& pjson =
585- GetPackageConfig (env, pkg.ToFilePath ());
586- // Note invalid package.json should throw in resolver
587- // currently we silently ignore which is incorrect
588- if (pjson.exists == Exists::No ||
589- pjson.is_valid == IsValid::No ||
590- pjson.has_main == HasMain::No) {
591- return Nothing<URL>();
592- }
593- if (!ShouldBeTreatedAsRelativeOrAbsolutePath (pjson.main )) {
594- return Resolve (env, " ./" + pjson.main , search, IgnoreMain);
595- }
596- return Resolve (env, pjson.main , search, IgnoreMain);
597- }
598-
599527Maybe<URL> ResolveModule (Environment* env,
600528 const std::string& specifier,
601529 const URL& base) {
@@ -604,7 +532,7 @@ Maybe<URL> ResolveModule(Environment* env,
604532 do {
605533 dir = parent;
606534 Maybe<URL> check =
607- Resolve (env, " ./node_modules/" + specifier, dir, CheckMain );
535+ Resolve (env, " ./node_modules/" + specifier, dir);
608536 if (!check.IsNothing ()) {
609537 const size_t limit = specifier.find (' /' );
610538 const size_t spec_len =
@@ -624,23 +552,11 @@ Maybe<URL> ResolveModule(Environment* env,
624552 return Nothing<URL>();
625553}
626554
627- Maybe<URL> ResolveDirectory (Environment* env,
628- const URL& search,
629- PackageMainCheck check_pjson_main) {
630- if (check_pjson_main) {
631- Maybe<URL> main = ResolveMain (env, search);
632- if (!main.IsNothing ())
633- return main;
634- }
635- return ResolveIndex (search);
636- }
637-
638555} // anonymous namespace
639556
640557Maybe<URL> Resolve (Environment* env,
641558 const std::string& specifier,
642- const URL& base,
643- PackageMainCheck check_pjson_main) {
559+ const URL& base) {
644560 URL pure_url (specifier);
645561 if (!(pure_url.flags () & URL_FLAGS_FAILED)) {
646562 // just check existence, without altering
@@ -655,13 +571,9 @@ Maybe<URL> Resolve(Environment* env,
655571 }
656572 if (ShouldBeTreatedAsRelativeOrAbsolutePath (specifier)) {
657573 URL resolved (specifier, base);
658- Maybe<URL> file = ResolveExtensions<TRY_EXACT_NAME>(resolved);
659- if (!file.IsNothing ())
660- return file;
661- if (specifier.back () != ' /' ) {
662- resolved = URL (specifier + " /" , base);
663- }
664- return ResolveDirectory (env, resolved, check_pjson_main);
574+ if (ResolvesToFile (resolved))
575+ return Just (resolved);
576+ return Nothing<URL>();
665577 } else {
666578 return ResolveModule (env, specifier, base);
667579 }
0 commit comments