@@ -6,7 +6,7 @@ use serde_json::Value;
66use utoo_ruborist:: lock:: { LockPackage , PackageLock } ;
77use utoo_ruborist:: manifest:: { DepsView , EnginesView , PackageJson } ;
88use utoo_ruborist:: registry:: resolve_package;
9- use utoo_ruborist:: spec:: { PackageSpec , Protocol } ;
9+ use utoo_ruborist:: spec:: { PackageSpec , Protocol , resolve_catalog_spec } ;
1010use utoo_ruborist:: util:: PackageNameStr ;
1111
1212use super :: ruborist_context:: Context ;
@@ -19,7 +19,7 @@ use crate::util::git_resolver::{resolve_git_spec, resolve_github_spec};
1919use crate :: util:: json:: { load_package_json, load_package_lock_json_from_path, read_json_file} ;
2020use crate :: util:: logger:: { finish_progress_bar, start_progress_bar} ;
2121use crate :: util:: save_type:: { PackageAction , SaveType } ;
22- use crate :: util:: user_config:: { get_legacy_peer_deps, set_package_json} ;
22+ use crate :: util:: user_config:: { get_catalogs , get_legacy_peer_deps, set_package_json} ;
2323
2424// Platform-specific line endings
2525#[ cfg( target_os = "windows" ) ]
@@ -53,18 +53,6 @@ pub fn extract_package_name(path: &str) -> String {
5353 }
5454}
5555
56- /// Compare a PackageJson dependency map with a lock file dependency map.
57- /// Treats empty maps and None/empty objects as equal.
58- fn deps_map_equals_lock (
59- pkg_deps : & HashMap < String , String > ,
60- lock_deps : Option < & HashMap < String , String > > ,
61- ) -> bool {
62- match lock_deps {
63- Some ( ld) => * pkg_deps == * ld,
64- None => pkg_deps. is_empty ( ) ,
65- }
66- }
67-
6856pub async fn ensure_package_lock ( root_path : & Path ) -> Result < PackageLock > {
6957 // Check package.json exists in project directory
7058 if fs:: metadata ( root_path. join ( "package.json" ) ) . await . is_err ( ) {
@@ -362,6 +350,22 @@ pub async fn is_pkg_lock_outdated(root_path: &Path) -> Result<bool> {
362350 let pkg: DepsView = load_package_json ( root_path) . await ?;
363351 let lock_file: PackageLock = read_json_file ( & root_path. join ( "package-lock.json" ) ) . await ?;
364352
353+ let catalogs = get_catalogs ( ) . await ;
354+ let deps_match = |pkg_deps : & HashMap < String , String > ,
355+ lock_deps : Option < & HashMap < String , String > > |
356+ -> bool {
357+ match lock_deps {
358+ None => pkg_deps. is_empty ( ) ,
359+ Some ( ld) => {
360+ pkg_deps. len ( ) == ld. len ( )
361+ && pkg_deps. iter ( ) . all ( |( name, spec) | {
362+ let resolved = resolve_catalog_spec ( name, spec, & catalogs) . unwrap_or ( spec) ;
363+ ld. get ( name) . is_some_and ( |v| v == resolved)
364+ } )
365+ }
366+ }
367+ } ;
368+
365369 let packages = & lock_file. packages ;
366370
367371 // prepare packages to check: (relative_path, deps)
@@ -394,26 +398,25 @@ pub async fn is_pkg_lock_outdated(root_path: &Path) -> Result<bool> {
394398 let name = if path. is_empty ( ) { "root" } else { path } ;
395399
396400 // check dependencies whether changed
397- if !deps_map_equals_lock ( & pkg. dependencies , lock. dependencies . as_ref ( ) ) {
401+ if !deps_match ( & pkg. dependencies , lock. dependencies . as_ref ( ) ) {
398402 tracing:: warn!( "package-lock.json is outdated, {name} dependencies changed" ) ;
399403 return Ok ( true ) ;
400404 }
401405
402- if !deps_map_equals_lock (
406+ if !deps_match (
403407 & pkg. optional_dependencies ,
404408 lock. optional_dependencies . as_ref ( ) ,
405409 ) {
406410 tracing:: warn!( "package-lock.json is outdated, {name} optionalDependencies changed" ) ;
407411 return Ok ( true ) ;
408412 }
409413
410- if !deps_map_equals_lock ( & pkg. dev_dependencies , lock. dev_dependencies . as_ref ( ) ) {
414+ if !deps_match ( & pkg. dev_dependencies , lock. dev_dependencies . as_ref ( ) ) {
411415 tracing:: warn!( "package-lock.json is outdated, {name} devDependencies changed" ) ;
412416 return Ok ( true ) ;
413417 }
414418
415- if !legacy_peer_deps
416- && !deps_map_equals_lock ( & pkg. peer_dependencies , lock. peer_dependencies . as_ref ( ) )
419+ if !legacy_peer_deps && !deps_match ( & pkg. peer_dependencies , lock. peer_dependencies . as_ref ( ) )
417420 {
418421 tracing:: warn!( "package-lock.json is outdated, {name} peerDependencies changed" ) ;
419422 return Ok ( true ) ;
0 commit comments