diff --git a/lib/internal/modules/package_json_reader.js b/lib/internal/modules/package_json_reader.js index 6e1da13fdc479f..497cdb789632c3 100644 --- a/lib/internal/modules/package_json_reader.js +++ b/lib/internal/modules/package_json_reader.js @@ -185,8 +185,8 @@ function getPackageScopeConfig(resolved) { * @param {URL} url - The URL to get the package type for. */ function getPackageType(url) { - // TODO(@anonrig): Write a C++ function that returns only "type". - return getPackageScopeConfig(url).type; + const type = modulesBinding.getPackageType(`${url}`); + return type ?? 'none'; } const invalidPackageNameRegEx = /^\.|%|\\/; diff --git a/src/node_modules.cc b/src/node_modules.cc index e362663053526f..8b1031cd19e220 100644 --- a/src/node_modules.cc +++ b/src/node_modules.cc @@ -404,6 +404,7 @@ void BindingData::GetNearestParentPackageJSONType( } } +template void BindingData::GetPackageScopeConfig( const FunctionCallbackInfo& args) { CHECK_GE(args.Length(), 1); @@ -442,7 +443,15 @@ void BindingData::GetPackageScopeConfig( error_context.specifier = resolved.ToString(); auto package_json = GetPackageJSON(realm, *file_url, &error_context); if (package_json != nullptr) { - return args.GetReturnValue().Set(package_json->Serialize(realm)); + if constexpr (return_only_type) { + Local value; + if (ToV8Value(realm->context(), package_json->type).ToLocal(&value)) { + args.GetReturnValue().Set(value); + } + return; + } else { + return args.GetReturnValue().Set(package_json->Serialize(realm)); + } } auto last_href = std::string(package_json_url->get_href()); @@ -460,6 +469,12 @@ void BindingData::GetPackageScopeConfig( } } + if constexpr (return_only_type) { + return; + } + + // If the package.json could not be found return a string containing a path + // to the non-existent package.json file in the initial requested location auto package_json_url_as_path = url::FileURLToPath(realm->env(), *package_json_url); CHECK(package_json_url_as_path); @@ -604,7 +619,9 @@ void BindingData::CreatePerIsolateProperties(IsolateData* isolate_data, target, "getNearestParentPackageJSON", GetNearestParentPackageJSON); - SetMethod(isolate, target, "getPackageScopeConfig", GetPackageScopeConfig); + SetMethod( + isolate, target, "getPackageScopeConfig", GetPackageScopeConfig); + SetMethod(isolate, target, "getPackageType", GetPackageScopeConfig); SetMethod(isolate, target, "enableCompileCache", EnableCompileCache); SetMethod(isolate, target, "getCompileCacheDir", GetCompileCacheDir); SetMethod(isolate, target, "flushCompileCache", FlushCompileCache); @@ -658,7 +675,8 @@ void BindingData::RegisterExternalReferences( registry->Register(ReadPackageJSON); registry->Register(GetNearestParentPackageJSONType); registry->Register(GetNearestParentPackageJSON); - registry->Register(GetPackageScopeConfig); + registry->Register(GetPackageScopeConfig); + registry->Register(GetPackageScopeConfig); registry->Register(EnableCompileCache); registry->Register(GetCompileCacheDir); registry->Register(FlushCompileCache); diff --git a/src/node_modules.h b/src/node_modules.h index 17909b2270454b..eb2900d8f83852 100644 --- a/src/node_modules.h +++ b/src/node_modules.h @@ -59,6 +59,7 @@ class BindingData : public SnapshotableObject { const v8::FunctionCallbackInfo& args); static void GetNearestParentPackageJSONType( const v8::FunctionCallbackInfo& args); + template static void GetPackageScopeConfig( const v8::FunctionCallbackInfo& args); static void GetPackageJSONScripts( diff --git a/typings/internalBinding/modules.d.ts b/typings/internalBinding/modules.d.ts index e19c662ded3379..0b1d0e2938319f 100644 --- a/typings/internalBinding/modules.d.ts +++ b/typings/internalBinding/modules.d.ts @@ -25,6 +25,7 @@ export interface ModulesBinding { getNearestParentPackageJSONType(path: string): PackageConfig['type'] getNearestParentPackageJSON(path: string): SerializedPackageConfig | undefined getPackageScopeConfig(path: string): SerializedPackageConfig | undefined + getPackageType(path: string): PackageConfig['type'] | undefined enableCompileCache(path?: string): { status: number, message?: string, directory?: string } getCompileCacheDir(): string | undefined flushCompileCache(keepDeserializedCache?: boolean): void