From 2f651b2d64523bdd377d22b8b7213a04ad82f459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 2 May 2023 02:35:33 +0200 Subject: fix(npm): canonicalize filename before returning (#18948) This commit changes how paths for npm packages are handled, by canonicalizing them when resolving. This is done so that instead of returning "node_modules/@/node_modules//index.js" (which is a symlink) we "node_modules/@/index.js. Fixes https://github.com/denoland/deno/issues/18924 Fixes https://github.com/bluwy/create-vite-extra/issues/31 --------- Co-authored-by: David Sherret --- ext/fs/std_fs.rs | 10 +--------- ext/node/ops/require.rs | 10 +--------- ext/node/polyfills/01_require.js | 6 ++++-- 3 files changed, 6 insertions(+), 20 deletions(-) (limited to 'ext') diff --git a/ext/fs/std_fs.rs b/ext/fs/std_fs.rs index 49d113c01..4bdbf4943 100644 --- a/ext/fs/std_fs.rs +++ b/ext/fs/std_fs.rs @@ -647,15 +647,7 @@ fn metadata_to_fsstat(metadata: fs::Metadata) -> FsStat { } fn realpath(path: impl AsRef) -> FsResult { - let canonicalized_path = path.as_ref().canonicalize()?; - #[cfg(windows)] - let canonicalized_path = PathBuf::from( - canonicalized_path - .display() - .to_string() - .trim_start_matches("\\\\?\\"), - ); - Ok(canonicalized_path) + Ok(deno_core::strip_unc_prefix(path.as_ref().canonicalize()?)) } fn read_dir(path: impl AsRef) -> FsResult> { diff --git a/ext/node/ops/require.rs b/ext/node/ops/require.rs index 34eac8475..1c8647bab 100644 --- a/ext/node/ops/require.rs +++ b/ext/node/ops/require.rs @@ -287,15 +287,7 @@ where let path = PathBuf::from(request); ensure_read_permission::(state, &path)?; let fs = state.borrow::>(); - let mut canonicalized_path = fs.canonicalize(&path)?; - if cfg!(windows) { - canonicalized_path = PathBuf::from( - canonicalized_path - .display() - .to_string() - .trim_start_matches("\\\\?\\"), - ); - } + let canonicalized_path = deno_core::strip_unc_prefix(fs.canonicalize(&path)?); Ok(canonicalized_path.to_string_lossy().to_string()) } diff --git a/ext/node/polyfills/01_require.js b/ext/node/polyfills/01_require.js index 8fbe5078c..ce7312ee8 100644 --- a/ext/node/polyfills/01_require.js +++ b/ext/node/polyfills/01_require.js @@ -861,9 +861,11 @@ Module.prototype.load = function (filename) { throw Error("Module already loaded"); } - this.filename = filename; + // Canonicalize the path so it's not pointing to the symlinked directory + // in `node_modules` directory of the referrer. + this.filename = ops.op_require_real_path(filename); this.paths = Module._nodeModulePaths( - pathDirname(filename), + pathDirname(this.filename), ); const extension = findLongestRegisteredExtension(filename); // allow .mjs to be overriden -- cgit v1.2.3