1 | 'use strict';
|
2 |
|
3 | const internals = {
|
4 | allowed: [
|
5 | '_labScriptRun',
|
6 |
|
7 |
|
8 |
|
9 | 'setTimeout',
|
10 | 'setInterval',
|
11 | 'setImmediate',
|
12 | 'clearTimeout',
|
13 | 'clearInterval',
|
14 | 'clearImmediate',
|
15 | 'console',
|
16 | 'Buffer',
|
17 | 'process',
|
18 | 'global',
|
19 | 'GLOBAL',
|
20 | 'globalThis',
|
21 | 'root',
|
22 | 'constructor',
|
23 | 'ArrayBuffer',
|
24 | 'Int8Array',
|
25 | 'Uint8Array',
|
26 | 'Uint8ClampedArray',
|
27 | 'Int16Array',
|
28 | 'Uint16Array',
|
29 | 'Int32Array',
|
30 | 'Uint32Array',
|
31 | 'Float32Array',
|
32 | 'Float64Array',
|
33 | 'DataView',
|
34 | '__$$labCov',
|
35 | 'gc',
|
36 |
|
37 |
|
38 |
|
39 | 'Array',
|
40 | 'isNaN',
|
41 | 'ReferenceError',
|
42 | 'Number',
|
43 | 'RangeError',
|
44 | 'EvalError',
|
45 | 'Function',
|
46 | 'isFinite',
|
47 | 'Object',
|
48 | 'undefined',
|
49 | 'Date',
|
50 | 'SyntaxError',
|
51 | 'String',
|
52 | 'eval',
|
53 | 'parseFloat',
|
54 | 'unescape',
|
55 | 'Error',
|
56 | 'encodeURI',
|
57 | 'NaN',
|
58 | 'RegExp',
|
59 | 'encodeURIComponent',
|
60 | 'Math',
|
61 | 'decodeURI',
|
62 | 'parseInt',
|
63 | 'Infinity',
|
64 | 'escape',
|
65 | 'decodeURIComponent',
|
66 | 'JSON',
|
67 | 'TypeError',
|
68 | 'URIError',
|
69 | 'Boolean',
|
70 | 'Intl',
|
71 | 'Map',
|
72 | 'Promise',
|
73 | 'Set',
|
74 | 'Symbol',
|
75 | 'WeakMap',
|
76 | 'WeakSet',
|
77 |
|
78 |
|
79 |
|
80 | 'Atomics',
|
81 | 'Proxy',
|
82 | 'Reflect',
|
83 | 'SharedArrayBuffer',
|
84 | 'WebAssembly',
|
85 | 'URL',
|
86 | 'URLSearchParams',
|
87 | 'TextEncoder',
|
88 | 'TextDecoder',
|
89 | 'BigInt',
|
90 | 'BigUint64Array',
|
91 | 'BigInt64Array',
|
92 | 'DTRACE_HTTP_SERVER_RESPONSE',
|
93 | 'DTRACE_HTTP_SERVER_REQUEST',
|
94 | 'DTRACE_HTTP_CLIENT_RESPONSE',
|
95 | 'DTRACE_HTTP_CLIENT_REQUEST',
|
96 | 'DTRACE_NET_STREAM_END',
|
97 | 'DTRACE_NET_SERVER_CONNECTION',
|
98 | 'DTRACE_NET_SOCKET_READ',
|
99 | 'DTRACE_NET_SOCKET_WRITE',
|
100 | 'COUNTER_NET_SERVER_CONNECTION',
|
101 | 'COUNTER_NET_SERVER_CONNECTION_CLOSE',
|
102 | 'COUNTER_HTTP_SERVER_REQUEST',
|
103 | 'COUNTER_HTTP_SERVER_RESPONSE',
|
104 | 'COUNTER_HTTP_CLIENT_REQUEST',
|
105 | 'COUNTER_HTTP_CLIENT_RESPONSE',
|
106 | 'queueMicrotask',
|
107 |
|
108 |
|
109 |
|
110 | 'Symbol(graceful-fs.queue)'
|
111 | ],
|
112 |
|
113 | symbols: [
|
114 | Symbol.toStringTag,
|
115 | Symbol.for('@hapi/lab/coverage/_state')
|
116 | ]
|
117 | };
|
118 |
|
119 |
|
120 | exports.detect = function (customGlobals) {
|
121 |
|
122 | let allowed = internals.allowed;
|
123 | if (customGlobals) {
|
124 | allowed = allowed.concat(customGlobals);
|
125 | }
|
126 |
|
127 | const symbols = [];
|
128 | allowed = allowed.filter((ignore) => {
|
129 |
|
130 | if (!/^Symbol\(.+\)$/.test(ignore)) {
|
131 | return true;
|
132 | }
|
133 |
|
134 | symbols.push(ignore);
|
135 | return false;
|
136 | });
|
137 |
|
138 | const leaks = Object.getOwnPropertyNames(global).filter((key) => !allowed.includes(key));
|
139 |
|
140 | for (const sym of Object.getOwnPropertySymbols(global)) {
|
141 | if (!internals.symbols.includes(sym) &&
|
142 | !symbols.includes(sym.toString())) {
|
143 |
|
144 | leaks.push(sym.toString());
|
145 | }
|
146 | }
|
147 |
|
148 | return leaks;
|
149 | };
|