-
Notifications
You must be signed in to change notification settings - Fork 3
/
tools.ts
266 lines (241 loc) · 8.92 KB
/
tools.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
import { PathLike, writeFileSync } from 'fs';
import * as path from 'path';
import * as vscode from "vscode";
import { DiagnosticCollection } from "vscode";
import * as yaml from "yaml";
import { AutomationI, IntegrationI } from './contentObject';
import * as fs from "fs-extra";
import { Logger } from './logger';
import { TerminalManager } from './terminalManager';
export function sendCommandExtraArgsWithUserInput(command: string[]): void {
vscode.window.showInputBox(
{
'placeHolder': 'Add extra arguments?'
}
).then((value) => {
if (value) {
command.push(value);
}
TerminalManager.sendDemistoSDKCommand(command);
});
}
export function getContentPath(): string | undefined {
const workspaces = vscode.workspace.workspaceFolders
if (!workspaces) {
return
}
for (const workspace of workspaces) {
const path = workspace.uri.fsPath
if (path.includes('content')) {
return path;
}
}
return
}
export function getPythonpath(): string {
let sdkPath = <string>vscode.workspace.getConfiguration('xsoar').get('demisto-sdk.pythonPath')
if (!sdkPath) {
sdkPath = <string>vscode.workspace.getConfiguration('python').get('pythonPath')
}
if (!sdkPath) {
sdkPath = 'python'
}
return sdkPath
}
export function getSDKPath(): string {
const sdkPath = `${getContentPath()}/.venv/bin/demisto-sdk`
if (fs.existsSync(sdkPath)) {
return sdkPath
}
return 'demisto-sdk'
}
export async function installDemistoSDK(): Promise<void> {
vscode.window.showQuickPick(['Poetry', 'Pip'], {
title: 'Install Demisto SDK with Poetry or with Pip?',
placeHolder: 'Poetry is recommended'
}).then(answer => {
if (answer === 'Poetry') {
installDemistoSDKPoetry()
}
else if (answer == 'Local') {
installDemistoSDKPip()
}
})
}
export async function installDemistoSDKPip(): Promise<void> {
TerminalManager.sendText(['pip', 'install', 'demisto-sdk', '--upgrade']);
}
export async function installDemistoSDKPoetry(): Promise<void> {
const contentPath = getContentPath()
if (!contentPath) {
TerminalManager.sendText(['pip', 'install', 'demisto-sdk', '--upgrade']);
}
else {
TerminalManager.sendText(['cd', contentPath])
TerminalManager.sendText(['deactivate'])
TerminalManager.sendText(['poetry', 'install'])
}
}
export async function isDemistoSDKinstalled(): Promise<boolean> {
const isSDKInstalled = await TerminalManager.sendDemistoSdkCommandWithProgress(['--version']);
if (isSDKInstalled) {
return true
}
Logger.error('demisto-sdk is not installed')
await installDemistoSDKPoetry()
await new Promise(resolve => setTimeout(resolve, 15000))
return TerminalManager.sendDemistoSdkCommandWithProgress(['--version'])
}
export function publishDiagnostics(
diagnosticCollection: DiagnosticCollection,
diagnostics: Map<string, vscode.Diagnostic[]>,
): void {
console.debug('Got ' + diagnostics.size + ' diagnostics');
diagnostics.forEach((diags, filePath) => {
diagnosticCollection?.set(vscode.Uri.parse(filePath), diags)
})
}
export function getCheckboxChecked(isChecked: boolean): string {
return isChecked ? 'checked' : '';
}
export function getSelectedSelect(isSelected: boolean): string {
return isSelected ? 'selected' : '';
}
export function getCommandDivId(commandIndex: number): string {
return 'command' + commandIndex + 'div';
}
export function getRemoveCommandButtonId(commandIndex: number): string {
return 'command' + commandIndex + 'removeButton';
}
export function getRemoveArgumentButtonId(commandIndex: number, argumentIndex: number): string {
return 'command' + commandIndex + 'RemoveArgumentButton' + argumentIndex;
}
export function getArgumentsDivId(commandIndex: number): string {
return 'command' + commandIndex + 'arguments';
}
export function getArgumentSingleDivId(commandIndex: number, argumentIndex: number): string {
return "command" + commandIndex + "argument" + argumentIndex;
}
export function getAddArgumentButtonId(commandIndex: number): string {
return "command" + commandIndex + "addArgumentButton";
}
export function getAddOutputButtonId(commandIndex: number): string {
return "command" + commandIndex + "addOutputButton";
}
export function getRemoveConfigurationButtonId(configIndex: number): string {
return getConfigurationDivId(configIndex) + 'removeButton';
}
export function getOutputsDivId(commandIndex: number): string {
return "command" + commandIndex + "outputs";
}
export function getRemoveOutputButtonId(commandIndex: number, argumentIndex: number): string {
return 'command' + commandIndex + 'RemoveOutputButton' + argumentIndex;
}
export function getConfigurationDivId(configurationIndex: number): string {
return 'config' + configurationIndex + 'section';
}
export function getReportPath(openWindowPath: string): string {
const workspaceFolder = vscode.workspace.getWorkspaceFolder(
vscode.Uri.parse(openWindowPath));
if (workspaceFolder) {
return path.join(workspaceFolder.uri.fsPath, getReportPathFromConf(workspaceFolder)).toString()
}
throw Error('Could not find report path');
}
function getAutofindProblems(workspace: vscode.WorkspaceFolder) {
return vscode.workspace.getConfiguration('xsoar.autoFindProblems', workspace);
}
export function getReportPathFromConf(workspace: vscode.WorkspaceFolder): string {
return String(getAutofindProblems(workspace).get('reportPath'))
}
export function getShouldReadProblems(workspace: vscode.WorkspaceFolder): boolean {
return Boolean(getAutofindProblems(workspace).get('readProblems'))
}
export function htmlspecialchars(
str: string, quoteStyle: number | never[] | null, doubleEncode: boolean)
: string {
// discuss at: https://locutus.io/php/htmlspecialchars/
// original by: Mirek Slugen
// improved by: Kevin van Zonneveld (https://kvz.io)
// bugfixed by: Nathan
// bugfixed by: Arno
// bugfixed by: Brett Zamir (https://brett-zamir.me)
// bugfixed by: Brett Zamir (https://brett-zamir.me)
// revised by: Kevin van Zonneveld (https://kvz.io)
// input by: Ratheous
// input by: Mailfaker (https://www.weedem.fr/)
// input by: felix
// reimplemented by: Brett Zamir (https://brett-zamir.me)
// note 1: charset argument not supported
// example 1: htmlspecialchars("<a href='test'>Test</a>", 'ENT_QUOTES')
// returns 1: '<a href='test'>Test</a>'
// example 2: htmlspecialchars("ab\"c'd", ['ENT_NOQUOTES', 'ENT_QUOTES'])
// returns 2: 'ab"c'd'
// example 3: htmlspecialchars('my "&entity;" is still here', null, null, false)
// returns 3: 'my "&entity;" is still here'
let optTemp = 0
let i = 0
let noquotes = false
if (typeof quoteStyle === 'undefined' || quoteStyle === null) {
quoteStyle = 2
}
str = str || ''
str = str.toString()
if (doubleEncode !== false) {
// Put this first to avoid double-encoding
str = str.replace(/&/g, '&')
}
str = str
.replace(/</g, '<')
.replace(/>/g, '>')
const OPTS = {
ENT_NOQUOTES: 0,
ENT_HTML_QUOTE_SINGLE: 1,
ENT_HTML_QUOTE_DOUBLE: 2,
ENT_COMPAT: 2,
ENT_QUOTES: 3,
ENT_IGNORE: 4
}
if (quoteStyle === 0) {
noquotes = true
}
if (typeof quoteStyle !== 'number') {
// Allow for a single string or an array of string flags
quoteStyle = [].concat(quoteStyle)
for (i = 0; i < quoteStyle.length; i++) {
// Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4
if (OPTS[quoteStyle[i]] === 0) {
noquotes = true
} else if (OPTS[quoteStyle[i]]) {
optTemp = optTemp | OPTS[quoteStyle[i]]
}
}
quoteStyle = optTemp
}
if (quoteStyle & OPTS.ENT_HTML_QUOTE_SINGLE) {
str = str.replace(/'/g, ''')
}
if (!noquotes) {
str = str.replace(/"/g, '"')
}
return str
}
export function saveYML(path: PathLike, obj: IntegrationI | AutomationI): void {
const ymlString = yaml.stringify(obj);
writeFileSync(path, ymlString);
}
export function getWebviewRemoveCommandButton(commandIndex: number): string {
const buttonId = getRemoveCommandButtonId(commandIndex);
return `
<button id="${buttonId}">Remove Command</button>
<script>
document.querySelector("#${buttonId}").addEventListener("click", () => {
console.log("Remove Command clicked. Command index: ${commandIndex}");
vscode.postMessage({
command: 'removeCommand',
index: parseInt(${commandIndex})
});
});
</script>
`;
}