@@ -14,6 +14,28 @@ export interface IssueFormatterOptions {
1414 id ?: number ;
1515}
1616
17+ export interface IssueFormatterJson {
18+ type : 'issue' ;
19+ title : string | undefined ;
20+ count : number ;
21+ id ?: number ;
22+ }
23+
24+ export interface AffectedResource {
25+ uid ?: string ;
26+ data ?: unknown ;
27+ request ?: string | number ;
28+ }
29+
30+ export interface IssueFormatterJsonDetailed {
31+ id ?: number ;
32+ type : 'issue' ;
33+ title : string | undefined ;
34+ description : string | undefined ;
35+ links ?: ReadonlyArray < { link : string ; linkTitle : string } > ;
36+ affectedResources : AffectedResource [ ] ;
37+ }
38+
1739export class IssueFormatter {
1840 #issue: DevTools . AggregatedIssue ;
1941 #options: IssueFormatterOptions ;
@@ -59,6 +81,55 @@ export class IssueFormatter {
5981 }
6082 }
6183
84+ const affectedResources = this . #getAffectedResources( ) ;
85+ if ( affectedResources . length ) {
86+ bodyParts . push ( '### Affected resources' ) ;
87+ bodyParts . push (
88+ ...affectedResources . map ( item => {
89+ const details = [ ] ;
90+ if ( item . uid ) {
91+ details . push ( `uid=${ item . uid } ` ) ;
92+ }
93+ if ( item . request ) {
94+ details . push (
95+ ( typeof item . request === 'number' ? `reqid=` : 'url=' ) +
96+ item . request ,
97+ ) ;
98+ }
99+ if ( item . data ) {
100+ details . push ( `data=${ JSON . stringify ( item . data ) } ` ) ;
101+ }
102+ return details . join ( ' ' ) ;
103+ } ) ,
104+ ) ;
105+ }
106+
107+ result . push ( `Message: issue> ${ bodyParts . join ( '\n' ) } ` ) ;
108+
109+ return result . join ( '\n' ) ;
110+ }
111+
112+ toJSON ( ) : IssueFormatterJson {
113+ return {
114+ type : 'issue' ,
115+ title : this . #getTitle( ) ,
116+ count : this . #issue. getAggregatedIssuesCount ( ) ,
117+ id : this . #options. id ,
118+ } ;
119+ }
120+
121+ toJSONDetailed ( ) : IssueFormatterJsonDetailed {
122+ return {
123+ id : this . #options. id ,
124+ type : 'issue' ,
125+ title : this . #getTitle( ) ,
126+ description : this . #getDescription( ) ,
127+ links : this . #issue. getDescription ( ) ?. links ,
128+ affectedResources : this . #getAffectedResources( ) ,
129+ } ;
130+ }
131+
132+ #getAffectedResources( ) : AffectedResource [ ] {
62133 const issues = this . #issue. getAllIssues ( ) ;
63134 const affectedResources : Array < {
64135 uid ?: string ;
@@ -73,8 +144,10 @@ export class IssueFormatter {
73144
74145 // We send the remaining details as untyped JSON because the DevTools
75146 // frontend code is currently not re-usable.
76- // eslint-disable-next-line
77- const data = structuredClone ( details ) as any ;
147+ const data = structuredClone ( details ) as unknown as Record <
148+ string ,
149+ unknown
150+ > ;
78151
79152 let uid ;
80153 let request : number | string | undefined ;
@@ -111,7 +184,8 @@ export class IssueFormatter {
111184 ) ;
112185 if ( resolvedId ) {
113186 request = resolvedId ;
114- delete data . request . requestId ;
187+ const requestData = data . request as Record < string , unknown > ;
188+ delete requestData . requestId ;
115189 }
116190 }
117191 }
@@ -125,31 +199,7 @@ export class IssueFormatter {
125199 request,
126200 } ) ;
127201 }
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' ) ;
202+ return affectedResources ;
153203 }
154204
155205 isValid ( ) : boolean {
0 commit comments