@@ -14,6 +14,12 @@ export interface IssueFormatterOptions {
1414 id ?: number ;
1515}
1616
17+ export interface AffectedResource {
18+ uid ?: string ;
19+ data ?: unknown ;
20+ request ?: string | number ;
21+ }
22+
1723export class IssueFormatter {
1824 #issue: DevTools . AggregatedIssue ;
1925 #options: IssueFormatterOptions ;
@@ -59,6 +65,55 @@ export class IssueFormatter {
5965 }
6066 }
6167
68+ const affectedResources = this . #getAffectedResources( ) ;
69+ if ( affectedResources . length ) {
70+ bodyParts . push ( '### Affected resources' ) ;
71+ bodyParts . push (
72+ ...affectedResources . map ( item => {
73+ const details = [ ] ;
74+ if ( item . uid ) {
75+ details . push ( `uid=${ item . uid } ` ) ;
76+ }
77+ if ( item . request ) {
78+ details . push (
79+ ( typeof item . request === 'number' ? `reqid=` : 'url=' ) +
80+ item . request ,
81+ ) ;
82+ }
83+ if ( item . data ) {
84+ details . push ( `data=${ JSON . stringify ( item . data ) } ` ) ;
85+ }
86+ return details . join ( ' ' ) ;
87+ } ) ,
88+ ) ;
89+ }
90+
91+ result . push ( `Message: issue> ${ bodyParts . join ( '\n' ) } ` ) ;
92+
93+ return result . join ( '\n' ) ;
94+ }
95+
96+ toJSON ( ) : object {
97+ return {
98+ type : 'issue' ,
99+ title : this . #getTitle( ) ,
100+ count : this . #issue. getAggregatedIssuesCount ( ) ,
101+ id : this . #options. id ,
102+ } ;
103+ }
104+
105+ toJSONDetailed ( ) : object {
106+ return {
107+ id : this . #options. id ,
108+ type : 'issue' ,
109+ title : this . #getTitle( ) ,
110+ description : this . #getDescription( ) ,
111+ links : this . #issue. getDescription ( ) ?. links ,
112+ affectedResources : this . #getAffectedResources( ) ,
113+ } ;
114+ }
115+
116+ #getAffectedResources( ) : AffectedResource [ ] {
62117 const issues = this . #issue. getAllIssues ( ) ;
63118 const affectedResources : Array < {
64119 uid ?: string ;
@@ -73,8 +128,10 @@ export class IssueFormatter {
73128
74129 // We send the remaining details as untyped JSON because the DevTools
75130 // frontend code is currently not re-usable.
76- // eslint-disable-next-line
77- const data = structuredClone ( details ) as any ;
131+ const data = structuredClone ( details ) as unknown as Record <
132+ string ,
133+ unknown
134+ > ;
78135
79136 let uid ;
80137 let request : number | string | undefined ;
@@ -111,7 +168,8 @@ export class IssueFormatter {
111168 ) ;
112169 if ( resolvedId ) {
113170 request = resolvedId ;
114- delete data . request . requestId ;
171+ const requestData = data . request as Record < string , unknown > ;
172+ delete requestData . requestId ;
115173 }
116174 }
117175 }
@@ -125,31 +183,7 @@ export class IssueFormatter {
125183 request,
126184 } ) ;
127185 }
128- if ( affectedResources . length ) {
129- bodyParts . push ( '### Affected resources' ) ;
130- bodyParts . push (
131- ...affectedResources . map ( item => {
132- const details = [ ] ;
133- if ( item . uid ) {
134- details . push ( `uid=${ item . uid } ` ) ;
135- }
136- if ( item . request ) {
137- details . push (
138- ( typeof item . request === 'number' ? `reqid=` : 'url=' ) +
139- item . request ,
140- ) ;
141- }
142- if ( item . data ) {
143- details . push ( `data=${ JSON . stringify ( item . data ) } ` ) ;
144- }
145- return details . join ( ' ' ) ;
146- } ) ,
147- ) ;
148- }
149-
150- result . push ( `Message: issue> ${ bodyParts . join ( '\n' ) } ` ) ;
151-
152- return result . join ( '\n' ) ;
186+ return affectedResources ;
153187 }
154188
155189 isValid ( ) : boolean {
0 commit comments