Skip to content

Commit 254dc95

Browse files
committed
improvements
1 parent 76eee00 commit 254dc95

File tree

1 file changed

+56
-2
lines changed

1 file changed

+56
-2
lines changed

src/commands/threat-feed.ts

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
//@ts-nocheck
2+
// @ts-ignore
3+
import blessed from 'blessed'
4+
// @ts-ignore
5+
import contrib from 'blessed-contrib'
16
import meow from 'meow'
27
import ora from 'ora'
38

@@ -114,6 +119,17 @@ function setupCommand(
114119
}
115120
}
116121

122+
type ThreatResult = {
123+
createdAt: string
124+
description: string
125+
id: number,
126+
locationHtmlUrl: string
127+
packageHtmlUrl: string
128+
purl: string
129+
removedAt: string
130+
threatType: string
131+
}
132+
117133
async function fetchThreatFeed(
118134
{ per_page, page, direction, filter }: CommandContext,
119135
spinner: Ora,
@@ -122,10 +138,48 @@ async function fetchThreatFeed(
122138
const formattedQueryParams = formatQueryParams({ per_page, page, direction, filter }).join('&')
123139

124140
const response = await queryAPI(`threat-feed?${formattedQueryParams}`, apiKey)
125-
const data = await response.json();
141+
const data: {results: ThreatResult[], nextPage: string} = await response.json();
126142

127143
spinner.stop()
128-
console.log(data)
144+
145+
const screen = blessed.screen()
146+
147+
var table = contrib.table(
148+
{ keys: 'true'
149+
, fg: 'white'
150+
, selectedFg: 'white'
151+
, selectedBg: 'magenta'
152+
, interactive: 'true'
153+
, label: 'Threat feed'
154+
, width: '100%'
155+
, height: '100%'
156+
, border: {type: "line", fg: "cyan"}
157+
, columnSpacing: 10 //in chars
158+
, columnWidth: [20, 20, 20, 20, 20] /*in chars*/ })
159+
160+
//allow control the table with the keyboard
161+
table.focus()
162+
163+
screen.append(table)
164+
165+
const formattedOutput = formatResults(data.results)
166+
167+
table.setData(
168+
{ headers: ['Ecosystem', 'Threat type', 'Name', 'Version', 'Detected at'], data: formattedOutput})
169+
170+
screen.render()
171+
172+
screen.key(['escape', 'q', 'C-c'], () => process.exit(0))
173+
}
174+
175+
const formatResults = (data: ThreatResult[]) => {
176+
return data.map(d => {
177+
const ecosystem = d.purl.split('pkg:')[1].split('/')[0]
178+
const name = d.purl.split('/')[1].split('@')[0]
179+
const version = d.purl.split('@')[1]
180+
181+
return [ecosystem, d.threatType, name, version, d.createdAt]
182+
})
129183
}
130184

131185
const formatQueryParams = (params: any) => {

0 commit comments

Comments
 (0)