|
1 | | -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-25; 72db; v9) */ |
| 1 | +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 2f79; v9) */ |
2 | 2 | /* eslint-env browser */ |
3 | 3 |
|
4 | 4 | (function ( |
|
8 | 8 | apiUrlPrefix, |
9 | 9 | version, |
10 | 10 | defaultNamespace, |
11 | | - sendError |
| 11 | + sendError, |
| 12 | + warn |
12 | 13 | ) { |
13 | 14 | try { |
14 | 15 | ///////////////////// |
|
71 | 72 | // |
72 | 73 |
|
73 | 74 | // A simple log function so the user knows why a request is not being send |
74 | | - var warn = function (message) { |
75 | | - if (con && con.warn) con.warn("Simple Analytics:", message); |
| 75 | + warn = function () { |
| 76 | + // 1. Convert args to a normal array |
| 77 | + var args = [].slice.call(arguments); |
| 78 | + |
| 79 | + // 2. Prepend log prefix |
| 80 | + args.unshift("Simple Analytics: "); |
| 81 | + |
| 82 | + // 3. Pass along arguments to console.warn |
| 83 | + // Function.prototype.bind.call is needed for Internet Explorer |
| 84 | + var log = Function.prototype.bind.call(con.warn, con); |
| 85 | + log.apply(con, args); |
| 86 | + }; |
| 87 | + |
| 88 | + var warnInFunction = function (name, error) { |
| 89 | + warn("Error in your " + name + " function:", error); |
76 | 90 | }; |
77 | 91 |
|
78 | 92 | var hasProp = function (obj, prop) { |
|
176 | 190 | try { |
177 | 191 | return assign( |
178 | 192 | metadata, |
179 | | - metadataCollectorFunction.call(window, assign(data, metadata)) |
| 193 | + metadataCollectorFunction.call(window, assign(metadata, data)) |
180 | 194 | ); |
181 | 195 | } catch (error) { |
182 | | - warn(errorText + " in your metadata function: " + error); |
| 196 | + warnInFunction("metadata", error); |
183 | 197 | } |
184 | 198 | }; |
185 | 199 |
|
|
231 | 245 | var ignorePage = |
232 | 246 | ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw; |
233 | 247 |
|
234 | | - try { |
235 | | - if ( |
236 | | - ignorePage === path || |
237 | | - new RegExp( |
238 | | - "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", |
239 | | - "i" |
240 | | - ).test(path) |
241 | | - ) |
242 | | - return trueVar; |
243 | | - } catch (error) { |
244 | | - return falseVar; |
245 | | - } |
| 248 | + if ( |
| 249 | + ignorePage === path || |
| 250 | + new RegExp( |
| 251 | + "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", |
| 252 | + "i" |
| 253 | + ).test(path) |
| 254 | + ) |
| 255 | + return trueVar; |
246 | 256 | } |
247 | 257 | return falseVar; |
248 | 258 | }; |
|
293 | 303 | Date.now(); |
294 | 304 | }; |
295 | 305 |
|
| 306 | + // Customers can overwrite their hostname, here we check for that |
| 307 | + var overwrittenHostname = |
| 308 | + overwriteOptions.hostname || attr(scriptElement, "hostname"); |
| 309 | + var definedHostname = overwrittenHostname || locationHostname; |
| 310 | + |
| 311 | + var basePayload = { |
| 312 | + version: version, |
| 313 | + hostname: definedHostname, |
| 314 | + }; |
| 315 | + |
296 | 316 | ///////////////////// |
297 | 317 | // ERROR FUNCTIONS |
298 | 318 | // |
299 | 319 |
|
300 | 320 | // Send errors |
301 | 321 | // no var because it's scoped outside of the try/catch |
302 | 322 | sendError = function (errorOrMessage) { |
303 | | - errorOrMessage = errorOrMessage.message || errorOrMessage; |
| 323 | + errorOrMessage = errorOrMessage.stack |
| 324 | + ? errorOrMessage + " " + errorOrMessage.stack |
| 325 | + : errorOrMessage; |
304 | 326 | warn(errorOrMessage); |
305 | | - sendData({ |
306 | | - type: errorText, |
307 | | - error: errorOrMessage, |
308 | | - url: definedHostname + loc.pathname, |
309 | | - }); |
| 327 | + sendData( |
| 328 | + assign(basePayload, { |
| 329 | + type: errorText, |
| 330 | + error: errorOrMessage, |
| 331 | + path: loc.pathname, |
| 332 | + }), |
| 333 | + undefinedVar, |
| 334 | + trueVar |
| 335 | + ); |
310 | 336 | }; |
311 | 337 |
|
312 | 338 | // We listen for the error events and only send errors that are |
|
343 | 369 | attr(scriptElement, "skip-dnt") == trueText || |
344 | 370 | attr(scriptElement, "collect-dnt") == trueText; |
345 | 371 |
|
346 | | - // Customers can overwrite their hostname, here we check for that |
347 | | - var overwrittenHostname = |
348 | | - overwriteOptions.hostname || attr(scriptElement, "hostname"); |
349 | | - var definedHostname = overwrittenHostname || locationHostname; |
350 | | - |
351 | 372 | // Some customers want to collect page views manually |
352 | 373 | var autoCollect = !( |
353 | 374 | attr(scriptElement, "auto-collect") == "false" || |
|
361 | 382 | namespace + "_" + eventText; |
362 | 383 |
|
363 | 384 | // Customers can ignore certain pages |
364 | | - var ignorePages = |
365 | | - ["/path*lala"] || |
366 | | - convertCommaSeparatedToArray( |
367 | | - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") |
368 | | - ); |
| 385 | + var ignorePages = convertCommaSeparatedToArray( |
| 386 | + overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") |
| 387 | + ); |
369 | 388 |
|
370 | 389 | // Customers can allow params |
371 | 390 | var allowParams = convertCommaSeparatedToArray( |
|
394 | 413 | timezone = collectMetricByString("c") |
395 | 414 | ? Intl.DateTimeFormat().resolvedOptions().timeZone |
396 | 415 | : undefinedVar; |
397 | | - } catch (e) { |
398 | | - /* Do nothing */ |
| 416 | + } catch (error) { |
| 417 | + warn(error); |
399 | 418 | } |
400 | 419 |
|
401 | 420 | ///////////////////// |
|
416 | 435 | var collectDataOnLeave = |
417 | 436 | collectMetricByString("t") || collectMetricByString("scro"); |
418 | 437 |
|
419 | | - var basePayload = { |
420 | | - version: version, |
421 | | - hostname: definedHostname, |
422 | | - }; |
423 | | - |
424 | 438 | if (bot) basePayload.bot = trueVar; |
425 | 439 |
|
426 | 440 | var payload = assign(basePayload, { |
|
560 | 574 | ) * 5 |
561 | 575 | ); |
562 | 576 | } catch (error) { |
| 577 | + warn(error); |
563 | 578 | return 0; |
564 | 579 | } |
565 | 580 | }; |
|
586 | 601 | // https://github.com/simpleanalytics/roadmap/issues/462 |
587 | 602 | try { |
588 | 603 | path = overwrite || decodeURIComponentFunc(loc.pathname); |
589 | | - } catch (e) { |
590 | | - // Do nothing |
| 604 | + } catch (error) { |
| 605 | + warn(error); |
591 | 606 | } |
592 | 607 |
|
593 | 608 | var pathOverwriterFunction = window[pathOverwriter]; |
594 | 609 | if (isFunction(pathOverwriterFunction)) { |
595 | | - path = pathOverwriterFunction.call(window, path); |
| 610 | + try { |
| 611 | + path = pathOverwriterFunction.call(window, { path: path }) || path; |
| 612 | + } catch (error) { |
| 613 | + warnInFunction("path", error); |
| 614 | + } |
596 | 615 | } |
597 | 616 |
|
598 | 617 | // Ignore pages specified in data-ignore-pages |
|
673 | 692 | try { |
674 | 693 | performaceEntryType = perf.getEntriesByType(navigationText)[0].type; |
675 | 694 | } catch (error) { |
676 | | - // Do nothing |
| 695 | + warn(error); |
677 | 696 | } |
678 | 697 |
|
679 | 698 | var userNavigated = performaceEntryType |
|
812 | 831 |
|
813 | 832 | var eventIsFunction = isFunction(event); |
814 | 833 | var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; |
| 834 | + var eventType = typeof event; |
815 | 835 |
|
816 | | - if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) { |
817 | | - warn(eventText + " isn't a string: " + event); |
| 836 | + if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) { |
| 837 | + warnInFunction(eventFunctionName, eventText + " can't be " + eventType); |
818 | 838 | return callback(); |
819 | 839 | } |
820 | 840 |
|
821 | 841 | try { |
822 | 842 | if (eventIsFunction) { |
823 | | - event = event(); |
824 | | - if (validTypes.indexOf(typeof event) < 0) { |
825 | | - warn(eventText + " function output isn't a string: " + event); |
| 843 | + var eventOutput = event(); |
| 844 | + if (validTypes.indexOf(typeof eventOutput) < 0) { |
| 845 | + warnInFunction( |
| 846 | + eventFunctionName, |
| 847 | + event + " returns no string: " + eventOutput |
| 848 | + ); |
826 | 849 | return callback(); |
827 | 850 | } |
| 851 | + event = eventOutput; |
828 | 852 | } |
829 | 853 | } catch (error) { |
830 | | - warn(errorText + " in your event function: " + error); |
| 854 | + warnInFunction(eventFunctionName, error); |
831 | 855 | return callback(); |
832 | 856 | } |
833 | 857 |
|
|
0 commit comments