@@ -18,16 +18,25 @@ export default class RulesProvider implements Engine {
18
18
19
19
private readonly typenameToFieldMap : { [ typeName : string ] : string }
20
20
21
+ private readonly extraFields : string [ ]
22
+
21
23
private readonly providerName
22
24
23
25
private readonly entityName
24
26
25
- constructor (
26
- providerName : string ,
27
- entityName : string ,
27
+ constructor ( {
28
+ providerName,
29
+ entityName,
30
+ typenameToFieldMap,
31
+ extraFields,
32
+ } : {
33
+ providerName : string
34
+ entityName : string
28
35
typenameToFieldMap ?: { [ tn : string ] : string }
29
- ) {
30
- this . typenameToFieldMap = typenameToFieldMap || { }
36
+ extraFields ?: string [ ]
37
+ } ) {
38
+ this . extraFields = extraFields ?? [ ]
39
+ this . typenameToFieldMap = typenameToFieldMap ?? { }
31
40
this . entityName = entityName
32
41
this . providerName = providerName
33
42
}
@@ -60,6 +69,11 @@ export default class RulesProvider implements Engine {
60
69
) : Promise < RuleFinding > => {
61
70
const finding = await evaluator . evaluateSingleResource ( rule , data )
62
71
72
+ // Inject extra fields
73
+ for ( const field of this . extraFields ) {
74
+ finding [ field ] = data . resource [ field ]
75
+ }
76
+
63
77
const connField =
64
78
data . resource . __typename && // eslint-disable-line no-underscore-dangle
65
79
this . typenameToFieldMap [ data . resource . __typename ] // eslint-disable-line no-underscore-dangle
@@ -201,7 +215,7 @@ export default class RulesProvider implements Engine {
201
215
this . entityName
202
216
} Findings]
203
217
}
204
- type ${ this . providerName } ${ this . entityName } Findings @key(fields: "id") {
218
+ interface baseFinding {
205
219
id: String! @id
206
220
ruleId: String! @search(by: [hash, regexp])
207
221
resourceId: String @search(by: [hash, regexp])
@@ -213,9 +227,17 @@ export default class RulesProvider implements Engine {
213
227
remediation: String @search(by: [hash, regexp])
214
228
references: [String] @search(by: [hash, regexp])
215
229
result: FindingsResult @search
230
+ }
231
+ type ${ this . providerName } ${
232
+ this . entityName
233
+ } Findings implements baseFinding @key(fields: "id") {
216
234
findings: ${ this . providerName } Findings @hasInverse(field: ${
217
235
this . entityName
218
236
} Findings)
237
+ # extra fields
238
+ ${ this . extraFields . map (
239
+ field => `${ field } : String @search(by: [hash, regexp])`
240
+ ) }
219
241
# connections
220
242
${ Object . keys ( this . typenameToFieldMap )
221
243
. map (
0 commit comments