diff options
-rw-r--r-- | cli/npm/resolvers/local.rs | 14 | ||||
-rw-r--r-- | ext/node/polyfills/01_require.js | 28 |
2 files changed, 22 insertions, 20 deletions
diff --git a/cli/npm/resolvers/local.rs b/cli/npm/resolvers/local.rs index d4085f345..a44afc935 100644 --- a/cli/npm/resolvers/local.rs +++ b/cli/npm/resolvers/local.rs @@ -4,7 +4,6 @@ use std::borrow::Cow; use std::collections::HashSet; -use std::collections::VecDeque; use std::fs; use std::path::Path; use std::path::PathBuf; @@ -365,18 +364,16 @@ async fn sync_resolution_with_fs( } } - // 4. Create all the packages in the node_modules folder, which are symlinks. + // 4. Create all the top level packages in the node_modules folder, which are symlinks. // // Symlink node_modules/<package_name> to // node_modules/.deno/<package_id>/node_modules/<package_name> let mut found_names = HashSet::new(); - let mut pending_packages = VecDeque::new(); - pending_packages.extend(snapshot.top_level_packages().map(|id| (id, true))); - while let Some((id, is_top_level)) = pending_packages.pop_front() { + let mut ids = snapshot.top_level_packages().collect::<Vec<_>>(); + ids.sort_by(|a, b| b.cmp(a)); // create determinism and only include the latest version + for id in ids { let root_folder_name = if found_names.insert(id.nv.name.clone()) { id.nv.name.clone() - } else if is_top_level { - id.nv.to_string() } else { continue; // skip, already handled }; @@ -394,9 +391,6 @@ async fn sync_resolution_with_fs( &local_registry_package_path, &join_package_name(root_node_modules_dir_path, &root_folder_name), )?; - for id in package.dependencies.values() { - pending_packages.push_back((id, false)); - } } drop(single_process_lock); diff --git a/ext/node/polyfills/01_require.js b/ext/node/polyfills/01_require.js index 42ead05e3..8fbe5078c 100644 --- a/ext/node/polyfills/01_require.js +++ b/ext/node/polyfills/01_require.js @@ -557,15 +557,21 @@ Module._findPath = function (request, paths, isMain, parentPath) { } } - const isDenoDirPackage = ops.op_require_is_deno_dir_package( - curPath, - ); - const isRelative = ops.op_require_is_request_relative( - request, - ); - const basePath = (isDenoDirPackage && !isRelative) - ? pathResolve(curPath, packageSpecifierSubPath(request)) - : pathResolve(curPath, request); + let basePath; + + if (usesLocalNodeModulesDir) { + basePath = pathResolve(curPath, request); + } else { + const isDenoDirPackage = ops.op_require_is_deno_dir_package( + curPath, + ); + const isRelative = ops.op_require_is_request_relative( + request, + ); + basePath = (isDenoDirPackage && !isRelative) + ? pathResolve(curPath, packageSpecifierSubPath(request)) + : pathResolve(curPath, request); + } let filename; const rc = stat(basePath); @@ -615,7 +621,9 @@ Module._resolveLookupPaths = function (request, parent) { return paths; } - if (parent?.filename && parent.filename.length > 0) { + if ( + !usesLocalNodeModulesDir && parent?.filename && parent.filename.length > 0 + ) { const denoDirPath = ops.op_require_resolve_deno_dir( request, parent.filename, |