@@ -30,6 +30,7 @@ pub enum Error {
30
30
#[ derive( Debug ) ]
31
31
pub struct BunLockfile {
32
32
data : BunLockfileData ,
33
+ key_to_entry : Map < String , String > ,
33
34
}
34
35
35
36
#[ derive( Debug , Deserialize ) ]
@@ -136,15 +137,19 @@ impl Lockfile for BunLockfile {
136
137
& self ,
137
138
key : & str ,
138
139
) -> Result < Option < std:: collections:: HashMap < String , String > > , crate :: Error > {
140
+ let entry_key = self
141
+ . key_to_entry
142
+ . get ( key)
143
+ . ok_or_else ( || crate :: Error :: MissingPackage ( key. into ( ) ) ) ?;
139
144
let entry = self
140
145
. data
141
146
. packages
142
- . get ( key )
147
+ . get ( entry_key )
143
148
. ok_or_else ( || crate :: Error :: MissingPackage ( key. into ( ) ) ) ?;
144
149
145
150
let mut deps = HashMap :: new ( ) ;
146
151
for ( dependency, version) in entry. info . iter ( ) . flat_map ( |info| info. all_dependencies ( ) ) {
147
- let parent_key = format ! ( "{key }/{dependency}" ) ;
152
+ let parent_key = format ! ( "{entry_key }/{dependency}" ) ;
148
153
let Some ( ( dep_key, _) ) = self . package_entry ( & parent_key) else {
149
154
return Err ( crate :: Error :: MissingPackage ( dependency. to_string ( ) ) ) ;
150
155
} ;
@@ -224,8 +229,12 @@ impl FromStr for BunLockfile {
224
229
)
225
230
. map_err ( Error :: from) ?;
226
231
let strict_json = format. print ( ) . map_err ( Error :: from) ?;
227
- let data = serde_json:: from_str ( strict_json. as_code ( ) ) ?;
228
- Ok ( Self { data } )
232
+ let data: BunLockfileData = serde_json:: from_str ( strict_json. as_code ( ) ) ?;
233
+ let mut key_to_entry = Map :: new ( ) ;
234
+ for ( path, info) in data. packages . iter ( ) {
235
+ key_to_entry. insert ( info. ident . clone ( ) , path. clone ( ) ) ;
236
+ }
237
+ Ok ( Self { data, key_to_entry } )
229
238
}
230
239
}
231
240
impl PackageEntry {
0 commit comments