@@ -26,10 +26,13 @@ async function buildResponse(
2626 options ?: Partial < types . PluginOptions > ,
2727) : Promise < types . PluginResponse > {
2828 const deps = depsAnalysis . depTree . dependencies ;
29- const dockerfilePkgs = dockerfileAnalysis ?. dockerfilePackages ?? { } ;
29+ const dockerfilePkgs =
30+ dockerfileAnalysis ?. dockerfilePackages ||
31+ depsAnalysis . autoDetectedUserInstructions ?. dockerfilePackages ||
32+ { } ;
3033
3134 /** WARNING! Mutates the depTree.dependencies! */
32- annotateLayerIds ( deps , dockerfilePkgs ) ;
35+ annotateWithLayerIds ( deps , dockerfilePkgs ) ;
3336
3437 const finalDeps = excludeBaseImageDeps (
3538 deps ,
@@ -195,17 +198,12 @@ async function buildResponse(
195198 autoDetectedLayers &&
196199 Object . keys ( autoDetectedLayers ) . length > 0
197200 ) {
198- const autoDetectedPackagesWithChildren = mapDepTreeToDockerfilePackages (
199- autoDetectedPackages ,
200- deps ,
201- ) ;
202-
203201 const autoDetectedUserInstructionsFact : facts . AutoDetectedUserInstructionsFact =
204202 {
205203 type : "autoDetectedUserInstructions" ,
206204 data : {
207205 dockerfileLayers : autoDetectedLayers ,
208- dockerfilePackages : autoDetectedPackagesWithChildren ! ,
206+ dockerfilePackages : autoDetectedPackages ! ,
209207 } ,
210208 } ;
211209 additionalFacts . push ( autoDetectedUserInstructionsFact ) ;
@@ -343,51 +341,6 @@ function packageSource(depKey: string): string {
343341 return depKey . split ( "/" ) [ 0 ] ;
344342}
345343
346- function collectTransitiveDepKeys ( pkg : types . DepTreeDep ) : string [ ] {
347- if ( ! pkg . dependencies || Object . keys ( pkg . dependencies ) . length === 0 ) {
348- return [ ] ;
349- }
350- const keys = Object . keys ( pkg . dependencies ) ;
351- const nested : string [ ] = [ ] ;
352- for ( const key of keys ) {
353- const childKeys = collectTransitiveDepKeys ( pkg . dependencies ! [ key ] ) ;
354- for ( const childKey of childKeys ) {
355- nested . push ( childKey ) ;
356- }
357- }
358- return keys . concat ( nested ) ;
359- }
360-
361- // Maps each dependency key (and its transitives) that matches a dockerfile-
362- // installed package to that package's instruction.
363- export function mapDepTreeToDockerfilePackages (
364- dockerfilePkgs : DockerFilePackages ,
365- deps : { [ depName : string ] : types . DepTreeDep } ,
366- ) : DockerFilePackages {
367- if ( ! dockerfilePkgs ) {
368- return { } ;
369- }
370-
371- for ( const rootKey of Object . keys ( deps ) ) {
372- const source = packageSource ( rootKey ) ;
373- const instruction = dockerfilePkgs [ rootKey ] || dockerfilePkgs [ source ] ;
374- if ( ! instruction ) {
375- continue ;
376- }
377-
378- // Ensure the instruction data is stored under the key that matches the
379- // dependency tree.
380- dockerfilePkgs [ rootKey ] = instruction ;
381-
382- const transitiveKeys = collectTransitiveDepKeys ( deps [ rootKey ] ) ;
383- for ( const key of transitiveKeys ) {
384- dockerfilePkgs [ key ] = instruction ;
385- }
386- }
387-
388- return dockerfilePkgs ;
389- }
390-
391344// If excludeBaseImageVulns is true, only retain dependencies that are
392345// dockerfile-introduced, as defined by dockerfilePkgs.
393346function excludeBaseImageDeps (
@@ -412,10 +365,7 @@ function excludeBaseImageDeps(
412365 } , { } ) ;
413366}
414367
415- // Annotates dockerfile-introduced dependencies and sub-dependencies with the
416- // instruction ID. A dependency is identified as dockerfile-introduced if the
417- // dependency key or source was found in a dockerfile installation instruction.
418- function annotateLayerIds (
368+ function annotateWithLayerIds (
419369 deps : { [ depName : string ] : types . DepTreeDep } ,
420370 dockerfilePkgs : DockerFilePackages | undefined ,
421371) : void {
0 commit comments