UNPKG

3.26 kBJavaScriptView Raw
1'use strict';
2
3const internals = {
4 allowed: [
5 '_labScriptRun', // Lab global to detect script executions
6
7 // Enumerable globals
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 // Non-Enumerable globals
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 // Sometime
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 // External symbols
109
110 'Symbol(graceful-fs.queue)'
111 ],
112
113 symbols: [
114 Symbol.toStringTag,
115 Symbol.for('@hapi/lab/coverage/_state')
116 ]
117};
118
119
120exports.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};