@amplitude/analytics-core 2.35.2 → 2.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/observers/console.d.ts +21 -0
- package/lib/cjs/observers/console.d.ts.map +1 -0
- package/lib/cjs/observers/console.js +136 -0
- package/lib/cjs/observers/console.js.map +1 -0
- package/lib/esm/observers/console.d.ts +21 -0
- package/lib/esm/observers/console.d.ts.map +1 -0
- package/lib/esm/observers/console.js +133 -0
- package/lib/esm/observers/console.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type ConsoleLogLevel = keyof Console;
|
|
2
|
+
type Callback = (logLevel: ConsoleLogLevel, args: any[]) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Observe a console log method (log, warn, error, etc.)
|
|
5
|
+
* @param level - The console log level to observe
|
|
6
|
+
* @param callback - The callback function to call when the console log level is observed
|
|
7
|
+
*/
|
|
8
|
+
declare function addListener(level: ConsoleLogLevel, callback: Callback): Error | void;
|
|
9
|
+
/**
|
|
10
|
+
* Disconnect a callback function from a console log method
|
|
11
|
+
* @param callback - The callback function to disconnect
|
|
12
|
+
*/
|
|
13
|
+
declare function removeListener(callback: Callback): void;
|
|
14
|
+
declare function _restoreConsole(): void;
|
|
15
|
+
declare const consoleObserver: {
|
|
16
|
+
addListener: typeof addListener;
|
|
17
|
+
removeListener: typeof removeListener;
|
|
18
|
+
_restoreConsole: typeof _restoreConsole;
|
|
19
|
+
};
|
|
20
|
+
export { consoleObserver, ConsoleLogLevel };
|
|
21
|
+
//# sourceMappingURL=console.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/observers/console.ts"],"names":[],"mappings":"AAEA,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC;AACrC,KAAK,QAAQ,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AA4DjE;;;;GAIG;AACH,iBAAS,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAc7E;AAED;;;GAGG;AACH,iBAAS,cAAc,CAAC,QAAQ,EAAE,QAAQ,QAUzC;AAID,iBAAS,eAAe,SASvB;AAED,QAAA,MAAM,eAAe;;;;CAIpB,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.consoleObserver = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var global_scope_1 = require("../global-scope");
|
|
6
|
+
var globalScope = (0, global_scope_1.getGlobalScope)();
|
|
7
|
+
/* istanbul ignore next */
|
|
8
|
+
var originalConsole = globalScope === null || globalScope === void 0 ? void 0 : globalScope.console;
|
|
9
|
+
var handlers = {};
|
|
10
|
+
// keeps reference to original console methods
|
|
11
|
+
var originalFn = {};
|
|
12
|
+
var inConsoleOverride = false;
|
|
13
|
+
function overrideConsole(logLevel) {
|
|
14
|
+
/* istanbul ignore if */
|
|
15
|
+
if (!originalConsole) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
// should not override if original console property is not a function
|
|
19
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
20
|
+
if (typeof originalConsole[logLevel] !== 'function') {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
// if console is already overridden, return true
|
|
24
|
+
if (originalFn[logLevel]) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// override console method
|
|
28
|
+
var handler = function () {
|
|
29
|
+
var args = [];
|
|
30
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
31
|
+
args[_i] = arguments[_i];
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
if (handlers[logLevel] && !inConsoleOverride) {
|
|
35
|
+
// add a re-entrancy guard to prevent infinite recursion
|
|
36
|
+
inConsoleOverride = true;
|
|
37
|
+
var callbacks = handlers[logLevel];
|
|
38
|
+
if (callbacks) {
|
|
39
|
+
callbacks.forEach(function (callback) {
|
|
40
|
+
try {
|
|
41
|
+
callback(logLevel, args);
|
|
42
|
+
}
|
|
43
|
+
catch (_a) {
|
|
44
|
+
// do nothing
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (_a) {
|
|
51
|
+
// do nothing
|
|
52
|
+
}
|
|
53
|
+
inConsoleOverride = false;
|
|
54
|
+
return originalFn[logLevel].apply(originalConsole, args);
|
|
55
|
+
};
|
|
56
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
57
|
+
originalFn[logLevel] = originalConsole[logLevel];
|
|
58
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
59
|
+
originalConsole[logLevel] = handler;
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Observe a console log method (log, warn, error, etc.)
|
|
64
|
+
* @param level - The console log level to observe
|
|
65
|
+
* @param callback - The callback function to call when the console log level is observed
|
|
66
|
+
*/
|
|
67
|
+
function addListener(level, callback) {
|
|
68
|
+
var res = overrideConsole(level);
|
|
69
|
+
/* istanbul ignore if */
|
|
70
|
+
if (!res) {
|
|
71
|
+
return new Error('Console override failed');
|
|
72
|
+
}
|
|
73
|
+
if (handlers[level]) {
|
|
74
|
+
// using ! is safe because we know the key exists based on condition above
|
|
75
|
+
handlers[level].push(callback);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
handlers[level] = [callback];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Disconnect a callback function from a console log method
|
|
83
|
+
* @param callback - The callback function to disconnect
|
|
84
|
+
*/
|
|
85
|
+
function removeListener(callback) {
|
|
86
|
+
var e_1, _a;
|
|
87
|
+
try {
|
|
88
|
+
for (var _b = tslib_1.__values(Object.values(handlers)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
89
|
+
var callbacks = _c.value;
|
|
90
|
+
// iterate backwards to avoid index shifting
|
|
91
|
+
for (var i = callbacks.length - 1; i >= 0; i--) {
|
|
92
|
+
if (callbacks[i] === callback) {
|
|
93
|
+
callbacks.splice(i, 1);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
100
|
+
finally {
|
|
101
|
+
try {
|
|
102
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
103
|
+
}
|
|
104
|
+
finally { if (e_1) throw e_1.error; }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// this should only be used for testing
|
|
108
|
+
// restoring console can break console overrides
|
|
109
|
+
function _restoreConsole() {
|
|
110
|
+
var e_2, _a;
|
|
111
|
+
try {
|
|
112
|
+
for (var _b = tslib_1.__values(Object.entries(originalFn)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
113
|
+
var _d = tslib_1.__read(_c.value, 2), key = _d[0], originalHandler = _d[1];
|
|
114
|
+
if (originalHandler) {
|
|
115
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
116
|
+
originalConsole[key] = originalHandler;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
121
|
+
finally {
|
|
122
|
+
try {
|
|
123
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
124
|
+
}
|
|
125
|
+
finally { if (e_2) throw e_2.error; }
|
|
126
|
+
}
|
|
127
|
+
originalFn = {};
|
|
128
|
+
handlers = {};
|
|
129
|
+
}
|
|
130
|
+
var consoleObserver = {
|
|
131
|
+
addListener: addListener,
|
|
132
|
+
removeListener: removeListener,
|
|
133
|
+
_restoreConsole: _restoreConsole,
|
|
134
|
+
};
|
|
135
|
+
exports.consoleObserver = consoleObserver;
|
|
136
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/observers/console.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '../global-scope';\n\ntype ConsoleLogLevel = keyof Console;\ntype Callback = (logLevel: ConsoleLogLevel, args: any[]) => void;\n\nconst globalScope = getGlobalScope();\n/* istanbul ignore next */\nconst originalConsole: any = globalScope?.console;\n\nlet handlers: { [key in ConsoleLogLevel]?: Array<Callback> } = {};\n\n// keeps reference to original console methods\nlet originalFn: { [key in ConsoleLogLevel]?: (...args: any[]) => void } = {};\n\nlet inConsoleOverride = false;\n\nfunction overrideConsole(logLevel: ConsoleLogLevel): boolean {\n /* istanbul ignore if */\n if (!originalConsole) {\n return false;\n }\n\n // should not override if original console property is not a function\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (typeof originalConsole[logLevel] !== 'function') {\n return false;\n }\n\n // if console is already overridden, return true\n if (originalFn[logLevel]) {\n return true;\n }\n\n // override console method\n const handler = function (...args: any[]) {\n try {\n if (handlers[logLevel] && !inConsoleOverride) {\n // add a re-entrancy guard to prevent infinite recursion\n inConsoleOverride = true;\n const callbacks = handlers[logLevel];\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(logLevel, args);\n } catch {\n // do nothing\n }\n });\n }\n }\n } catch {\n // do nothing\n }\n inConsoleOverride = false;\n return originalFn[logLevel]!.apply(originalConsole, args);\n };\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalFn[logLevel] = originalConsole[logLevel] as (...args: any[]) => void;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[logLevel] = handler;\n return true;\n}\n\n/**\n * Observe a console log method (log, warn, error, etc.)\n * @param level - The console log level to observe\n * @param callback - The callback function to call when the console log level is observed\n */\nfunction addListener(level: ConsoleLogLevel, callback: Callback): Error | void {\n const res = overrideConsole(level);\n\n /* istanbul ignore if */\n if (!res) {\n return new Error('Console override failed');\n }\n\n if (handlers[level]) {\n // using ! is safe because we know the key exists based on condition above\n handlers[level]!.push(callback);\n } else {\n handlers[level] = [callback];\n }\n}\n\n/**\n * Disconnect a callback function from a console log method\n * @param callback - The callback function to disconnect\n */\nfunction removeListener(callback: Callback) {\n for (const callbacks of Object.values(handlers)) {\n // iterate backwards to avoid index shifting\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] === callback) {\n callbacks.splice(i, 1);\n break;\n }\n }\n }\n}\n\n// this should only be used for testing\n// restoring console can break console overrides\nfunction _restoreConsole() {\n for (const [key, originalHandler] of Object.entries(originalFn)) {\n if (originalHandler) {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[key] = originalHandler;\n }\n }\n originalFn = {};\n handlers = {};\n}\n\nconst consoleObserver = {\n addListener,\n removeListener,\n _restoreConsole,\n};\n\nexport { consoleObserver, ConsoleLogLevel };\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type ConsoleLogLevel = keyof Console;
|
|
2
|
+
type Callback = (logLevel: ConsoleLogLevel, args: any[]) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Observe a console log method (log, warn, error, etc.)
|
|
5
|
+
* @param level - The console log level to observe
|
|
6
|
+
* @param callback - The callback function to call when the console log level is observed
|
|
7
|
+
*/
|
|
8
|
+
declare function addListener(level: ConsoleLogLevel, callback: Callback): Error | void;
|
|
9
|
+
/**
|
|
10
|
+
* Disconnect a callback function from a console log method
|
|
11
|
+
* @param callback - The callback function to disconnect
|
|
12
|
+
*/
|
|
13
|
+
declare function removeListener(callback: Callback): void;
|
|
14
|
+
declare function _restoreConsole(): void;
|
|
15
|
+
declare const consoleObserver: {
|
|
16
|
+
addListener: typeof addListener;
|
|
17
|
+
removeListener: typeof removeListener;
|
|
18
|
+
_restoreConsole: typeof _restoreConsole;
|
|
19
|
+
};
|
|
20
|
+
export { consoleObserver, ConsoleLogLevel };
|
|
21
|
+
//# sourceMappingURL=console.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/observers/console.ts"],"names":[],"mappings":"AAEA,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC;AACrC,KAAK,QAAQ,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AA4DjE;;;;GAIG;AACH,iBAAS,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAc7E;AAED;;;GAGG;AACH,iBAAS,cAAc,CAAC,QAAQ,EAAE,QAAQ,QAUzC;AAID,iBAAS,eAAe,SASvB;AAED,QAAA,MAAM,eAAe;;;;CAIpB,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { __read, __values } from "tslib";
|
|
2
|
+
import { getGlobalScope } from '../global-scope';
|
|
3
|
+
var globalScope = getGlobalScope();
|
|
4
|
+
/* istanbul ignore next */
|
|
5
|
+
var originalConsole = globalScope === null || globalScope === void 0 ? void 0 : globalScope.console;
|
|
6
|
+
var handlers = {};
|
|
7
|
+
// keeps reference to original console methods
|
|
8
|
+
var originalFn = {};
|
|
9
|
+
var inConsoleOverride = false;
|
|
10
|
+
function overrideConsole(logLevel) {
|
|
11
|
+
/* istanbul ignore if */
|
|
12
|
+
if (!originalConsole) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
// should not override if original console property is not a function
|
|
16
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
17
|
+
if (typeof originalConsole[logLevel] !== 'function') {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// if console is already overridden, return true
|
|
21
|
+
if (originalFn[logLevel]) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
// override console method
|
|
25
|
+
var handler = function () {
|
|
26
|
+
var args = [];
|
|
27
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
28
|
+
args[_i] = arguments[_i];
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
if (handlers[logLevel] && !inConsoleOverride) {
|
|
32
|
+
// add a re-entrancy guard to prevent infinite recursion
|
|
33
|
+
inConsoleOverride = true;
|
|
34
|
+
var callbacks = handlers[logLevel];
|
|
35
|
+
if (callbacks) {
|
|
36
|
+
callbacks.forEach(function (callback) {
|
|
37
|
+
try {
|
|
38
|
+
callback(logLevel, args);
|
|
39
|
+
}
|
|
40
|
+
catch (_a) {
|
|
41
|
+
// do nothing
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (_a) {
|
|
48
|
+
// do nothing
|
|
49
|
+
}
|
|
50
|
+
inConsoleOverride = false;
|
|
51
|
+
return originalFn[logLevel].apply(originalConsole, args);
|
|
52
|
+
};
|
|
53
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
54
|
+
originalFn[logLevel] = originalConsole[logLevel];
|
|
55
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
56
|
+
originalConsole[logLevel] = handler;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Observe a console log method (log, warn, error, etc.)
|
|
61
|
+
* @param level - The console log level to observe
|
|
62
|
+
* @param callback - The callback function to call when the console log level is observed
|
|
63
|
+
*/
|
|
64
|
+
function addListener(level, callback) {
|
|
65
|
+
var res = overrideConsole(level);
|
|
66
|
+
/* istanbul ignore if */
|
|
67
|
+
if (!res) {
|
|
68
|
+
return new Error('Console override failed');
|
|
69
|
+
}
|
|
70
|
+
if (handlers[level]) {
|
|
71
|
+
// using ! is safe because we know the key exists based on condition above
|
|
72
|
+
handlers[level].push(callback);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
handlers[level] = [callback];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Disconnect a callback function from a console log method
|
|
80
|
+
* @param callback - The callback function to disconnect
|
|
81
|
+
*/
|
|
82
|
+
function removeListener(callback) {
|
|
83
|
+
var e_1, _a;
|
|
84
|
+
try {
|
|
85
|
+
for (var _b = __values(Object.values(handlers)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
86
|
+
var callbacks = _c.value;
|
|
87
|
+
// iterate backwards to avoid index shifting
|
|
88
|
+
for (var i = callbacks.length - 1; i >= 0; i--) {
|
|
89
|
+
if (callbacks[i] === callback) {
|
|
90
|
+
callbacks.splice(i, 1);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
97
|
+
finally {
|
|
98
|
+
try {
|
|
99
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
100
|
+
}
|
|
101
|
+
finally { if (e_1) throw e_1.error; }
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// this should only be used for testing
|
|
105
|
+
// restoring console can break console overrides
|
|
106
|
+
function _restoreConsole() {
|
|
107
|
+
var e_2, _a;
|
|
108
|
+
try {
|
|
109
|
+
for (var _b = __values(Object.entries(originalFn)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
110
|
+
var _d = __read(_c.value, 2), key = _d[0], originalHandler = _d[1];
|
|
111
|
+
if (originalHandler) {
|
|
112
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */
|
|
113
|
+
originalConsole[key] = originalHandler;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
118
|
+
finally {
|
|
119
|
+
try {
|
|
120
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
121
|
+
}
|
|
122
|
+
finally { if (e_2) throw e_2.error; }
|
|
123
|
+
}
|
|
124
|
+
originalFn = {};
|
|
125
|
+
handlers = {};
|
|
126
|
+
}
|
|
127
|
+
var consoleObserver = {
|
|
128
|
+
addListener: addListener,
|
|
129
|
+
removeListener: removeListener,
|
|
130
|
+
_restoreConsole: _restoreConsole,
|
|
131
|
+
};
|
|
132
|
+
export { consoleObserver };
|
|
133
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/observers/console.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '../global-scope';\n\ntype ConsoleLogLevel = keyof Console;\ntype Callback = (logLevel: ConsoleLogLevel, args: any[]) => void;\n\nconst globalScope = getGlobalScope();\n/* istanbul ignore next */\nconst originalConsole: any = globalScope?.console;\n\nlet handlers: { [key in ConsoleLogLevel]?: Array<Callback> } = {};\n\n// keeps reference to original console methods\nlet originalFn: { [key in ConsoleLogLevel]?: (...args: any[]) => void } = {};\n\nlet inConsoleOverride = false;\n\nfunction overrideConsole(logLevel: ConsoleLogLevel): boolean {\n /* istanbul ignore if */\n if (!originalConsole) {\n return false;\n }\n\n // should not override if original console property is not a function\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (typeof originalConsole[logLevel] !== 'function') {\n return false;\n }\n\n // if console is already overridden, return true\n if (originalFn[logLevel]) {\n return true;\n }\n\n // override console method\n const handler = function (...args: any[]) {\n try {\n if (handlers[logLevel] && !inConsoleOverride) {\n // add a re-entrancy guard to prevent infinite recursion\n inConsoleOverride = true;\n const callbacks = handlers[logLevel];\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(logLevel, args);\n } catch {\n // do nothing\n }\n });\n }\n }\n } catch {\n // do nothing\n }\n inConsoleOverride = false;\n return originalFn[logLevel]!.apply(originalConsole, args);\n };\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalFn[logLevel] = originalConsole[logLevel] as (...args: any[]) => void;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[logLevel] = handler;\n return true;\n}\n\n/**\n * Observe a console log method (log, warn, error, etc.)\n * @param level - The console log level to observe\n * @param callback - The callback function to call when the console log level is observed\n */\nfunction addListener(level: ConsoleLogLevel, callback: Callback): Error | void {\n const res = overrideConsole(level);\n\n /* istanbul ignore if */\n if (!res) {\n return new Error('Console override failed');\n }\n\n if (handlers[level]) {\n // using ! is safe because we know the key exists based on condition above\n handlers[level]!.push(callback);\n } else {\n handlers[level] = [callback];\n }\n}\n\n/**\n * Disconnect a callback function from a console log method\n * @param callback - The callback function to disconnect\n */\nfunction removeListener(callback: Callback) {\n for (const callbacks of Object.values(handlers)) {\n // iterate backwards to avoid index shifting\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] === callback) {\n callbacks.splice(i, 1);\n break;\n }\n }\n }\n}\n\n// this should only be used for testing\n// restoring console can break console overrides\nfunction _restoreConsole() {\n for (const [key, originalHandler] of Object.entries(originalFn)) {\n if (originalHandler) {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[key] = originalHandler;\n }\n }\n originalFn = {};\n handlers = {};\n}\n\nconst consoleObserver = {\n addListener,\n removeListener,\n _restoreConsole,\n};\n\nexport { consoleObserver, ConsoleLogLevel };\n"]}
|