@@ -75,7 +75,23 @@ export default class ComponentDetection {
75
75
76
76
var json : any = JSON . parse ( results ) ;
77
77
json . componentsFound . forEach ( async ( component : any ) => {
78
+ // Skip components without packageUrl
79
+ if ( ! component . component . packageUrl ) {
80
+ core . debug ( `Skipping component detected without packageUrl: ${ JSON . stringify ( {
81
+ id : component . component . id ,
82
+ name : component . component . name || 'unnamed' ,
83
+ type : component . component . type || 'unknown'
84
+ } , null , 2 ) } `) ;
85
+ return ;
86
+ }
87
+
78
88
const packageUrl = ComponentDetection . makePackageUrl ( component . component . packageUrl ) ;
89
+
90
+ // Skip if the packageUrl is empty (indicates an invalid or missing packageUrl)
91
+ if ( ! packageUrl ) {
92
+ core . debug ( `Skipping component with invalid packageUrl: ${ component . component . id } ` ) ;
93
+ return ;
94
+ }
79
95
80
96
if ( ! packageCache . hasPackage ( packageUrl ) ) {
81
97
const pkg = new ComponentDetectionPackage ( packageUrl , component . component . id ,
@@ -89,9 +105,27 @@ export default class ComponentDetection {
89
105
core . debug ( "Sorting out transitive dependencies" ) ;
90
106
packages . forEach ( async ( pkg : ComponentDetectionPackage ) => {
91
107
pkg . topLevelReferrers . forEach ( async ( referrer : any ) => {
92
- const referrerPackage = packageCache . lookupPackage ( ComponentDetection . makePackageUrl ( referrer . packageUrl ) ) ;
93
- if ( referrerPackage ) {
94
- referrerPackage . dependsOn ( pkg ) ;
108
+ // Skip if referrer doesn't have a valid packageUrl
109
+ if ( ! referrer . packageUrl ) {
110
+ core . debug ( `Skipping referrer without packageUrl for component: ${ pkg . id } ` ) ;
111
+ return ;
112
+ }
113
+
114
+ const referrerUrl = ComponentDetection . makePackageUrl ( referrer . packageUrl ) ;
115
+
116
+ // Skip if the generated packageUrl is empty
117
+ if ( ! referrerUrl ) {
118
+ core . debug ( `Skipping referrer with invalid packageUrl for component: ${ pkg . id } ` ) ;
119
+ return ;
120
+ }
121
+
122
+ try {
123
+ const referrerPackage = packageCache . lookupPackage ( referrerUrl ) ;
124
+ if ( referrerPackage ) {
125
+ referrerPackage . dependsOn ( pkg ) ;
126
+ }
127
+ } catch ( error ) {
128
+ core . debug ( `Error looking up referrer package: ${ error } ` ) ;
95
129
}
96
130
} ) ;
97
131
} ) ;
@@ -121,23 +155,41 @@ export default class ComponentDetection {
121
155
}
122
156
123
157
public static makePackageUrl ( packageUrlJson : any ) : string {
124
- var packageUrl = `${ packageUrlJson . Scheme } :${ packageUrlJson . Type } /` ;
125
- if ( packageUrlJson . Namespace ) {
126
- packageUrl += `${ packageUrlJson . Namespace . replaceAll ( "@" , "%40" ) } /` ;
127
- }
128
- packageUrl += `${ packageUrlJson . Name . replaceAll ( "@" , "%40" ) } ` ;
129
- if ( packageUrlJson . Version ) {
130
- packageUrl += `@${ packageUrlJson . Version } ` ;
158
+ // Handle case when packageUrlJson is null or undefined
159
+ if (
160
+ ! packageUrlJson ||
161
+ typeof packageUrlJson . Scheme !== 'string' ||
162
+ typeof packageUrlJson . Type !== 'string' ||
163
+ ! packageUrlJson . Scheme ||
164
+ ! packageUrlJson . Type
165
+ ) {
166
+ core . debug ( `Warning: Received null or undefined packageUrlJson. Unable to create package URL.` ) ;
167
+ return "" ; // Return a blank string for unknown packages
131
168
}
132
- if ( typeof packageUrlJson . Qualifiers === "object"
133
- && packageUrlJson . Qualifiers !== null
134
- && Object . keys ( packageUrlJson . Qualifiers ) . length > 0 ) {
135
- const qualifierString = Object . entries ( packageUrlJson . Qualifiers )
136
- . map ( ( [ key , value ] ) => `${ key } =${ value } ` )
137
- . join ( "&" ) ;
138
- packageUrl += `?${ qualifierString } ` ;
169
+
170
+ try {
171
+ var packageUrl = `${ packageUrlJson . Scheme } :${ packageUrlJson . Type } /` ;
172
+ if ( packageUrlJson . Namespace ) {
173
+ packageUrl += `${ packageUrlJson . Namespace . replaceAll ( "@" , "%40" ) } /` ;
174
+ }
175
+ packageUrl += `${ packageUrlJson . Name . replaceAll ( "@" , "%40" ) } ` ;
176
+ if ( packageUrlJson . Version ) {
177
+ packageUrl += `@${ packageUrlJson . Version } ` ;
178
+ }
179
+ if ( typeof packageUrlJson . Qualifiers === "object"
180
+ && packageUrlJson . Qualifiers !== null
181
+ && Object . keys ( packageUrlJson . Qualifiers ) . length > 0 ) {
182
+ const qualifierString = Object . entries ( packageUrlJson . Qualifiers )
183
+ . map ( ( [ key , value ] ) => `${ key } =${ value } ` )
184
+ . join ( "&" ) ;
185
+ packageUrl += `?${ qualifierString } ` ;
186
+ }
187
+ return packageUrl ;
188
+ } catch ( error ) {
189
+ core . debug ( `Error creating package URL from packageUrlJson: ${ JSON . stringify ( packageUrlJson , null , 2 ) } ` ) ;
190
+ core . debug ( `Error details: ${ error } ` ) ;
191
+ return "" ; // Return a blank string for error cases
139
192
}
140
- return packageUrl ;
141
193
}
142
194
143
195
private static async getLatestReleaseURL ( ) : Promise < string > {
0 commit comments