@@ -111,6 +111,9 @@ export class PullRequestGenerator {
111
111
// Fetch package information for package.json updates only
112
112
const packageInfos = new Map < string , { packageInfo : PackageInfo , releaseNotes : ReleaseNote [ ] , compareUrl ?: string } > ( )
113
113
114
+ // Fetch Composer package information
115
+ const composerPackageInfos = new Map < string , PackageInfo > ( )
116
+
114
117
// Package.json updates table (with full badges)
115
118
if ( packageJsonUpdates . length > 0 ) {
116
119
body += `### npm Dependencies\n\n`
@@ -177,33 +180,49 @@ export class PullRequestGenerator {
177
180
body += `\n`
178
181
}
179
182
180
- // Composer dependencies table (simplified, without badges)
183
+ // Composer dependencies table (with full badges like npm )
181
184
if ( uniqueComposerUpdates . length > 0 ) {
185
+ // Fetch Composer package information first
186
+ for ( const update of uniqueComposerUpdates ) {
187
+ try {
188
+ const packageInfo = await this . releaseNotesFetcher . fetchComposerPackageInfo ( update . name )
189
+ composerPackageInfos . set ( update . name , packageInfo )
190
+ }
191
+ catch ( error ) {
192
+ console . warn ( `Failed to fetch Composer info for ${ update . name } :` , error )
193
+ }
194
+ }
195
+
182
196
body += `### PHP/Composer Dependencies\n\n`
183
- body += `| Package | Change | File | Status |\n`
184
- body += `|---|---|---|---|\n`
197
+ body += `| Package | Change | Age | Adoption | Passing | Confidence |\n`
198
+ body += `|---|---|---|---|---|---| \n`
185
199
186
200
for ( const update of uniqueComposerUpdates ) {
187
- // Generate enhanced package link with source repository (like npm packages)
201
+ const packageInfo = composerPackageInfos . get ( update . name ) || { name : update . name }
202
+
203
+ // Generate enhanced package link to match npm format exactly
188
204
let packageCell : string
189
- if ( update . metadata ?. repository ) {
190
- const sourceUrl = this . getComposerSourceUrl ( update . metadata . repository , update . name )
191
- packageCell = `[${ update . name } ](https://packagist.org/packages/${ encodeURIComponent ( update . name ) } ) ([source](${ sourceUrl } ))`
205
+ if ( packageInfo . repository ?. url ) {
206
+ const sourceUrl = this . getComposerSourceUrl ( packageInfo . repository . url , update . name )
207
+ // Format: [packageName](repoUrl) ([source](sourceUrl)) - matching npm format
208
+ packageCell = `[${ update . name } ](${ sourceUrl } ) ([source](${ sourceUrl } ))`
192
209
} else {
193
210
// Fallback to Packagist page only
194
211
packageCell = `[${ update . name } ](https://packagist.org/packages/${ encodeURIComponent ( update . name ) } )`
195
212
}
196
213
197
- // Simple version change display
198
- const change = `\`${ update . currentVersion } \` -> \`${ update . newVersion } \``
199
-
200
- // File reference
201
- const fileName = update . file . split ( '/' ) . pop ( ) || update . file
214
+ // Generate version change with diff link (Renovate style, similar to npm)
215
+ const diffUrl = `https://renovatebot.com/diffs/packagist/${ encodeURIComponent ( update . name ) } /${ update . currentVersion } /${ update . newVersion } `
216
+ const change = `[\`${ update . currentVersion } \` -> \`${ update . newVersion } \`](${ diffUrl } )`
202
217
203
- // Status (simple)
204
- const status = '✅ Available'
218
+ // Generate Composer confidence badges
219
+ const badges = this . releaseNotesFetcher . generateComposerBadges (
220
+ packageInfo ,
221
+ update . currentVersion ,
222
+ update . newVersion ,
223
+ )
205
224
206
- body += `| ${ packageCell } | ${ change } | ${ fileName } | ${ status } |\n`
225
+ body += `| ${ packageCell } | ${ change } | ${ badges . age } | ${ badges . adoption } | ${ badges . passing } | ${ badges . confidence } |\n`
207
226
}
208
227
209
228
body += `\n`
0 commit comments