-
Notifications
You must be signed in to change notification settings - Fork 151
/
stripAnsi.ts
71 lines (61 loc) · 2.1 KB
/
stripAnsi.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
// Copyright 2017-2022 Parity Technologies (UK) Ltd.
// This file is part of Substrate API Sidecar.
//
// Substrate API Sidecar is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import { format } from 'winston';
import { ITransformableInfo } from '../../types/logging';
/**
* Regex pattern to match ANSI characters.
*/
const pattern = [
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))',
].join('|');
/**
* RegExp for global matching ANSI characters.
*/
const ansiRegex = new RegExp(pattern, 'g');
/**
* Strip ANSI characters from strings in simple, arbitrary data. N.B. this is not
* hardened to work with any possible javascript type and is only meant for arrays,
* basic objects and strings.
*
* @param data arbitrary data
*/
function stripAnsiShellCodes(data: unknown): unknown {
if (data === null || data === undefined) {
return data;
}
if (typeof data === 'string') {
return data.replace(ansiRegex, '');
}
if (Array.isArray(data)) {
return data.map((val) => stripAnsiShellCodes(val));
}
if (typeof data === 'object' && data !== null) {
const sanitizedData = {};
for (const [k, v] of Object.entries(data)) {
sanitizedData[k] = stripAnsiShellCodes(v);
}
return sanitizedData;
}
return data;
}
/**
* Strip ANSI characters from `TransformableInfo.message`.
*/
export const stripAnsi = format((info: ITransformableInfo, _opts: unknown) => {
info.message = stripAnsiShellCodes(info.message) as string;
return info;
});