Passed
Push — main ( 03a93c...274053 )
by Will
13:21
created

browsers   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 367
Duplicated Lines 0 %

Test Coverage

Coverage 98.6%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 6
eloc 275
c 2
b 0
f 0
dl 0
loc 367
ccs 352
cts 357
cp 0.986
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B get() 0 360 6
1
<?php
2
declare(strict_types = 1);
3
namespace hexydec\agentzero;
4
5
/**
6
 * @phpstan-import-type MatchConfig from config
7
 */
8
class browsers {
9
10
	/**
11
	 * Generates a configuration array for matching browsers
12
	 * 
13
	 * @return MatchConfig An array with keys representing the string to match, and a value of an array containing parsing and output settings
0 ignored issues
show
Bug introduced by
The type hexydec\agentzero\MatchConfig was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
	 */
15 68
	public static function get() : array {
16 1
		$fn = [
17 1
			'browserslash' => function (string $value) : array {
18 68
				if (($browser = \mb_strrchr($value, ' ')) !== false) {
19 1
					$value = \ltrim($browser);
20
				}
21 68
				$parts = \explode('/', $value); // split more incase there are more slashes
22 68
				$map = [
23 68
					'opr' => 'Opera',
24 68
					'crios' => 'Chrome',
25 68
					'edg' => 'Edge',
26 68
					'edgios' => 'Edge',
27 68
					'edga' => 'Edge',
28 68
					'webpositive' => 'WebPositive',
29 68
					'nintendobrowser' => 'NintendoBrowser',
30 68
					'samsungbrowser' => 'SamsungBrowser',
31 68
					'up.browser' => 'UP.Browser',
32 68
					'ucbrowser' => 'UCBrowser',
33 68
					'netfront' => 'NetFront',
34 68
					'seamonkey' => 'SeaMonkey',
35 68
					'icecat' => 'IceCat',
36 68
					'iceape' => 'IceApe',
37 68
					'iceweasel' => 'IceWeasel',
38 68
					'bonecho' => 'BonEcho',
39 68
					'palemoon' => 'PaleMoon',
40 68
					'k-meleon' => 'K-Meleon',
41 68
					'samsungbrowser' => 'Samsung Browser'
42 68
				];
43 68
				$data = ['type' => 'human'];
44 68
				$browser = \mb_strtolower(\array_shift($parts));
45 68
				$data['browser'] = $map[$browser] ?? \mb_convert_case($browser, MB_CASE_TITLE);
46 68
				$data['browserversion'] = null;
47 68
				foreach ($parts AS $item) {
48 68
					if (\strpbrk($item, '1234567890') !== false) {
49 68
						$data['browserversion'] = $item;
50 68
						break;
51
					}
52
				}
53 68
				return $data;
54 1
			},
55 1
			'presto' => function (string $value) : array {
56 4
				$parts = \explode('/', $value, 2);
57 4
				return [
58 4
					'type' => 'human',
59 4
					'browser' => $parts[0],
60 4
					'browserversion' => $parts[1] ?? null,
61 4
					'engine' => 'Presto',
62 4
					'engineversion' => $parts[1] ?? null
63 4
				];
64 1
			},
65 1
			'chromium' => function (string $value) : array {
66 53
				$parts = \explode('/', $value, 3);
67 53
				return [
68 53
					'type' => 'human',
69 53
					'browser' => \mb_convert_case($parts[0], MB_CASE_TITLE),
70 53
					'engine' => 'Blink',
71 53
					'browserversion' => $parts[1] ?? null,
72 53
					'engineversion' => isset($parts[1]) && \strspn($parts[1], '1234567890.') === \strlen($parts[1]) ? $parts[1] : null
73 53
				];
74 1
			}
75 1
		];
76 25
		return [
77 25
			'HeadlessChrome/' =>  [
78 25
				'match' => 'start',
79 25
				'categories' => fn (string $value) : array => [
80
					'type' => 'robot',
81
					'category' => 'crawler',
82
					'browser' => 'HeadlessChrome',
83
					'browserversion' => \mb_substr($value, 15)
84
				]
85 25
			],
86 25
			'IEMobile/' => [
87 25
				'match' => 'start',
88 25
				'categories' => $fn['browserslash']
89 25
			],
90 25
			'Opera Mini/' => [
91 25
				'match' => 'start',
92 25
				'categories' => $fn['presto']
93 25
			],
94 25
			'Opera/' => [
95 25
				'match' => 'start',
96 25
				'categories' => $fn['presto']
97 25
			],
98 25
			'OPR/' =>  [
99 25
				'match' => 'start',
100 25
				'categories' => $fn['browserslash']
101 25
			],
102 25
			'CriOS/' => [
103 25
				'match' => 'start',
104 25
				'categories' => $fn['browserslash']
105 25
			],
106 25
			'Brave/' =>  [
107 25
				'match' => 'start',
108 25
				'categories' => $fn['browserslash']
109 25
			],
110 25
			'Vivaldi/' =>  [
111 25
				'match' => 'start',
112 25
				'categories' => $fn['browserslash']
113 25
			],
114 25
			'Maxthon/' =>  [
115 25
				'match' => 'start',
116 25
				'categories' => $fn['browserslash']
117 25
			],
118 25
			'Maxthon ' =>  [
119 25
				'match' => 'start',
120 25
				'categories' => fn (string $value) : array => [
121 1
					'browser' => 'Maxthon',
122 1
					'browserversion' => \mb_substr($value, 8)
123 1
				]
124 25
			],
125 25
			'Konqueror/' =>  [
126 25
				'match' => 'start',
127 25
				'categories' => $fn['browserslash']
128 25
			],
129 25
			'K-Meleon/' => [
130 25
				'match' => 'start',
131 25
				'categories' => $fn['browserslash']
132 25
			],
133 25
			'UCBrowser/' => [
134 25
				'match' => 'start',
135 25
				'categories' => $fn['browserslash']
136 25
			],
137 25
			'Waterfox/' =>  [
138 25
				'match' => 'start',
139 25
				'categories' => $fn['browserslash']
140 25
			],
141 25
			'PaleMoon/' => [
142 25
				'match' => 'start',
143 25
				'categories' => $fn['browserslash']
144 25
			],
145 25
			'IceWeasel/' => [
146 25
				'match' => 'start',
147 25
				'categories' => $fn['browserslash']
148 25
			],
149 25
			'IceCat/' => [
150 25
				'match' => 'start',
151 25
				'categories' => $fn['browserslash']
152 25
			],
153 25
			'IceApe/' => [
154 25
				'match' => 'start',
155 25
				'categories' => $fn['browserslash']
156 25
			],
157 25
			'Basilisk/' => [
158 25
				'match' => 'start',
159 25
				'categories' => $fn['browserslash']
160 25
			],
161 25
			'SeaMonkey/' => [
162 25
				'match' => 'start',
163 25
				'categories' => $fn['browserslash']
164 25
			],
165 25
			'UP.Browser/' => [
166 25
				'match' => 'start',
167 25
				'categories' => $fn['browserslash']
168 25
			],
169 25
			'Netscape/' => [
170 25
				'match' => 'start',
171 25
				'categories' => $fn['browserslash']
172 25
			],
173 25
			'Thunderbird/' => [
174 25
				'match' => 'start',
175 25
				'categories' => $fn['browserslash']
176 25
			],
177 25
			'Galeon/' => [
178 25
				'match' => 'start',
179 25
				'categories' => $fn['browserslash']
180 25
			],
181 25
			'WebPositive/' => [
182 25
				'match' => 'start',
183 25
				'categories' => $fn['browserslash']
184 25
			],
185 25
			'K-Ninja/' => [
186 25
				'match' => 'start',
187 25
				'categories' => $fn['browserslash']
188 25
			],
189 25
			'SamsungBrowser/' => [
190 25
				'match' => 'start',
191 25
				'categories' => $fn['browserslash']
192 25
			],
193 25
			'NintendoBrowser/' => [
194 25
				'match' => 'start',
195 25
				'categories' => $fn['browserslash']
196 25
			],
197 25
			'Epiphany/' => [
198 25
				'match' => 'start',
199 25
				'categories' => $fn['browserslash']
200 25
			],
201 25
			'Silk/' => [
202 25
				'match' => 'start',
203 25
				'categories' => $fn['browserslash']
204 25
			],
205 25
			'NetFront/' => [
206 25
				'match' => 'start',
207 25
				'categories' => $fn['browserslash']
208 25
			],
209 25
			'Dooble/' => [
210 25
				'match' => 'start',
211 25
				'categories' => $fn['browserslash']
212 25
			],
213 25
			'Falkon/' => [
214 25
				'match' => 'start',
215 25
				'categories' => $fn['browserslash']
216 25
			],
217 25
			'Namoroka/' => [
218 25
				'match' => 'start',
219 25
				'categories' => $fn['browserslash']
220 25
			],
221 25
			'Lynx/' => [
222 25
				'match' => 'start',
223 25
				'categories' => fn (string $value) : array => [
224 1
					'browser' => 'Lynx',
225 1
					'browserversion' => \explode('/', $value, 2)[1] ?? null,
226 1
					'engine' => 'Libwww',
227 1
					'type' => 'human',
228 1
					'category' => 'desktop'
229 1
				]
230 25
			],
231 25
			'Midori' => [
232 25
				'match' => 'start',
233 25
				'categories' => function (string $value) : array {
234 1
					$parts = \explode('/', $value, 2);
235 1
					return [
236 1
						'type' => 'human',
237 1
						'browser' => 'Midori',
238 1
						'browserversion' => $parts[1] ?? \explode(' ', $value, 2)[1] ?? null
239 1
					];
240 25
				}
241 25
			],
242 25
			'PrivacyBrowser/' => [
243 25
				'match' => 'start',
244 25
				'categories' => $fn['browserslash']
245 25
			],
246 25
			'Fennec/' =>  [
247 25
				'match' => 'start',
248 25
				'categories' => fn (string $value) : array => [
249 2
					'type' => 'human',
250 2
					'browser' => 'Fennec',
251 2
					'engine' => 'Gecko',
252 2
					'browserversion' => \mb_substr($value, 7),
253 2
					'engineversion' => \mb_substr($value, 7)
254 2
				]
255 25
			],
256 25
			'Firefox/' =>  [
257 25
				'match' => 'start',
258 25
				'categories' => function (string $value) use ($fn) : array {
259 23
					$data = $fn['browserslash']($value);
260 23
					return \array_merge($data, [
261 23
						'engine' => 'Gecko',
262 23
						'engineversion' => $data['browserversion'] ?? null
263 23
					]);
264 25
				}
265 25
			],
266 25
			' Firefox/' =>  [
267 25
				'match' => 'any',
268 25
				'categories' => function (string $value) use ($fn) : array {
269 1
					$data = $fn['browserslash']($value);
270 1
					return \array_merge($data, [
271 1
						'engine' => 'Gecko',
272 1
						'engineversion' => $data['browserversion'] ?? null
273 1
					]);
274 25
				}
275 25
			],
276 25
			'Firefox' =>  [
277 25
				'match' => 'exact',
278 25
				'categories' => [
279 25
					'type' => 'human',
280 25
					'engine' => 'Gecko',
281 25
					'browser' => 'Firefox'
282 25
				]
283 25
			],
284 25
			'Minimo/' =>  [
285 25
				'match' => 'start',
286 25
				'categories' => function (string $value) use ($fn) : array {
287 1
					$data = $fn['browserslash']($value);
288 1
					return \array_merge($data, [
289 1
						'engine' => 'Gecko'
290 1
					]);
291 25
				}
292 25
			],
293 25
			'BonEcho/' =>  [
294 25
				'match' => 'start',
295 25
				'categories' => function (string $value) use ($fn) : array {
296 1
					$data = $fn['browserslash']($value);
297 1
					return \array_merge($data, [
298 1
						'engine' => 'Gecko'
299 1
					]);
300 25
				}
301 25
			],
302 25
			'Links/' =>  [
303 25
				'match' => 'start',
304 25
				'categories' => $fn['browserslash']
305 25
			],
306 25
			'Links' =>  [
307 25
				'match' => 'exact',
308 25
				'categories' => fn (string $value, int $i, array $tokens) => [
309 1
					'type' => 'human',
310 1
					'browser' => $value,
311 1
					'browserversion' => $tokens[$i + 1]
312 1
				]
313 25
			],
314 25
			'Elinks/' =>  [
315 25
				'match' => 'start',
316 25
				'categories' => $fn['browserslash']
317 25
			],
318 25
			'ELinks' =>  [
319 25
				'match' => 'exact',
320 25
				'categories' => fn (string $value, int $i, array $tokens) => [
321 1
					'type' => 'human',
322 1
					'browser' => $value,
323 1
					'browserversion' => $tokens[$i + 1]
324 1
				]
325 25
			],
326 25
			'Edg/' =>  [
327 25
				'match' => 'start',
328 25
				'categories' => $fn['browserslash']
329 25
			],
330 25
			'EdgA/' =>  [
331 25
				'match' => 'start',
332 25
				'categories' => $fn['browserslash']
333 25
			],
334 25
			'Edge/' =>  [
335 25
				'match' => 'start',
336 25
				'categories' => $fn['browserslash']
337 25
			],
338 25
			'EdgiOS/' =>  [
339 25
				'match' => 'start',
340 25
				'categories' => $fn['browserslash']
341 25
			],
342 25
			'MSIE ' =>  [
343 25
				'match' => 'start',
344 25
				'categories' => fn (string $value) : array => [
345 7
					'type' => 'human',
346 7
					'browser' => 'Internet Explorer',
347 7
					'browserversion' => \mb_substr($value, 5),
348 7
					'engine' => 'Trident'
349 7
				]
350 25
			],
351 25
			'Cronet/' => [
352 25
				'match' => 'start',
353 25
				'categories' => $fn['chromium']
354 25
			],
355 25
			'Chromium/' => [
356 25
				'match' => 'start',
357 25
				'categories' => $fn['chromium']
358 25
			],
359 25
			'Chrome/' => [
360 25
				'match' => 'start',
361 25
				'categories' => $fn['chromium']
362 25
			],
363 25
			'Safari/' =>  [
364 25
				'match' => 'start',
365 25
				'categories' => $fn['browserslash']
366 25
			],
367 25
			'Mozilla/' => [
368 25
				'match' => 'start',
369 25
				'categories' => $fn['browserslash']
370 25
			],
371 25
			'rv:' => [
372 25
				'match' => 'start',
373 25
				'categories' => fn (string $value) : array => [
374 33
					'browserversion' => \mb_substr($value, 3)
375 33
				]
376 25
			]
377 25
		];
378
	}
379
}