diff --git a/src/node_file.cc b/src/node_file.cc index a3e80898cde6b6..17fd62143ed585 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -2922,6 +2922,10 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo& args) { for (int i = 0; i < legacy_main_extensions_with_main_end; i++) { file_path = *initial_file_path + std::string(legacy_main_extensions[i]); + // TODO(StefanStojanovic): Remove ifdef after path.toNamespacedPath logic is ported to C++ +#ifdef _WIN32 + file_path = "\\\\?\\" + file_path; +#endif switch (FilePathIsFile(env, file_path)) { case BindingData::FilePathIsFileReturnType::kIsFile: @@ -2959,6 +2963,10 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo& args) { i < legacy_main_extensions_package_fallback_end; i++) { file_path = *initial_file_path + std::string(legacy_main_extensions[i]); + // TODO(StefanStojanovic): Remove ifdef after path.toNamespacedPath logic is ported to C++ +#ifdef _WIN32 + file_path = "\\\\?\\" + file_path; +#endif switch (FilePathIsFile(env, file_path)) { case BindingData::FilePathIsFileReturnType::kIsFile: diff --git a/src/node_modules.cc b/src/node_modules.cc index 9dca1857f96e43..da06bad2b48b11 100644 --- a/src/node_modules.cc +++ b/src/node_modules.cc @@ -256,8 +256,14 @@ void BindingData::ReadPackageJSON(const FunctionCallbackInfo& args) { permission::PermissionScope::kFileSystemRead, path.ToStringView()); + // TODO(StefanStojanovic): Remove ifdef after path.toNamespacedPath logic is ported to C++ +#ifdef _WIN32 + auto package_json = GetPackageJSON( + realm, "\\\\?\\" + path.ToString(), is_esm ? &error_context : nullptr); +#else auto package_json = GetPackageJSON(realm, path.ToString(), is_esm ? &error_context : nullptr); +#endif if (package_json == nullptr) { return; } diff --git a/test/es-module/test-GH-50753.js b/test/es-module/test-GH-50753.js new file mode 100644 index 00000000000000..1cecfa5bebf6a5 --- /dev/null +++ b/test/es-module/test-GH-50753.js @@ -0,0 +1,42 @@ +'use strict'; + +// Flags: --expose-internals + +const common = require('../common'); +if (!common.isWindows) { + common.skip('this test is Windows-specific.'); +} + +const fs = require('fs'); +const path = require('path'); +const tmpdir = require('../common/tmpdir'); + +// https://github.com/nodejs/node/issues/50753 +// Make a path that is more than 260 chars long. +// Module layout will be the following: +// package.json +// main +// main.js + +const packageDirNameLen = Math.max(260 - tmpdir.path.length, 1); +const packageDirName = tmpdir.resolve('x'.repeat(packageDirNameLen)); +const packageDirPath = path.resolve(packageDirName); +const packageJsonFilePath = path.join(packageDirPath, 'package.json'); +const mainDirName = 'main'; +const mainDirPath = path.resolve(packageDirPath, mainDirName); +const mainJsFile = 'main.js'; +const mainJsFilePath = path.resolve(mainDirPath, mainJsFile); + +tmpdir.refresh(); + +fs.mkdirSync(packageDirPath); +fs.writeFileSync( + packageJsonFilePath, + `{"main":"${mainDirName}/${mainJsFile}"}` +); +fs.mkdirSync(mainDirPath); +fs.writeFileSync(mainJsFilePath, 'console.log("hello world");'); + +require('internal/modules/run_main').executeUserEntryPoint(packageDirPath); + +tmpdir.refresh();