|
1 | | -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 26ba; v8) */ |
| 1 | +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 6aec; v8) */ |
2 | 2 | /* eslint-env browser */ |
3 | 3 |
|
4 | 4 | (function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) { |
|
52 | 52 | var platformText = "platform"; |
53 | 53 | var platformVersionText = "platformVersion"; |
54 | 54 | var docsUrl = "https://docs.simpleanalytics.com"; |
| 55 | + var allowParams; |
55 | 56 | var isBotAgent = |
56 | 57 | /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); |
57 | 58 | var screen = window.screen; |
|
117 | 118 | return !!value === value; |
118 | 119 | }; |
119 | 120 |
|
120 | | - var getParams = function (regex) { |
| 121 | + var getParams = function (regex, returnArray) { |
121 | 122 | // From the search we grab the utm_source and ref and save only that |
122 | 123 | var matches = loc.search.match( |
123 | 124 | new RegExp("[?&](" + regex + ")=([^?&]+)", "gi") |
124 | 125 | ); |
125 | 126 | var match = matches |
126 | 127 | ? matches.map(function (m) { |
127 | | - return m.split("=")[1]; |
| 128 | + return m.split(/[?&=]/).slice(-2); |
128 | 129 | }) |
129 | 130 | : []; |
130 | | - if (match && match[0]) return match[0]; |
| 131 | + |
| 132 | + if (match[0]) return returnArray ? match[0] : match[0][1]; |
131 | 133 | }; |
132 | 134 |
|
133 | 135 | // Ignore pages specified in data-ignore-pages |
|
161 | 163 | var sendData = function (data, callback) { |
162 | 164 | data = assign(payload, page, data); |
163 | 165 |
|
| 166 | + if (allowParams) |
| 167 | + data.params = stringify( |
| 168 | + allowParams |
| 169 | + .map(function (param) { |
| 170 | + var params = getParams(param, true); |
| 171 | + if (!params) return; |
| 172 | + return { key: params[0], value: params[1] }; |
| 173 | + }) |
| 174 | + .filter(Boolean) |
| 175 | + ); |
| 176 | + |
164 | 177 | var image = new Image(); |
165 | 178 | if (callback) { |
166 | 179 | image.onerror = callback; |
|
264 | 277 | overwriteOptions.autoCollect === false |
265 | 278 | ); |
266 | 279 |
|
| 280 | + var convertCommaSeparatedToArray = function (csv) { |
| 281 | + return Array.isArray(csv) |
| 282 | + ? csv |
| 283 | + : isString(csv) && csv.length |
| 284 | + ? csv.split(/, ?/) |
| 285 | + : []; |
| 286 | + }; |
| 287 | + |
267 | 288 | // Event function name |
268 | 289 | var functionName = |
269 | 290 | overwriteOptions.saGlobal || attr(scriptElement, "sa-global") || saGlobal; |
270 | 291 |
|
271 | 292 | // Customers can ignore certain pages |
272 | | - var ignorePagesRaw = |
273 | | - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages"); |
| 293 | + var ignorePages = convertCommaSeparatedToArray( |
| 294 | + overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") |
| 295 | + ); |
274 | 296 |
|
275 | | - // Make sure ignore pages is an array |
276 | | - var ignorePages = Array.isArray(ignorePagesRaw) |
277 | | - ? ignorePagesRaw |
278 | | - : isString(ignorePagesRaw) && ignorePagesRaw.length |
279 | | - ? ignorePagesRaw.split(/, ?/) |
280 | | - : []; |
| 297 | + // Customers can allow params |
| 298 | + allowParams = convertCommaSeparatedToArray( |
| 299 | + overwriteOptions.allowParams || attr(scriptElement, "allow-params") |
| 300 | + ); |
281 | 301 |
|
282 | | - // Customers can ignore certain pages |
283 | | - var ignorePagesRaw = |
284 | | - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages"); |
| 302 | + // By default we allow source, medium in the URLs. With strictUtm enabled |
| 303 | + // we only allow it with the utm_ prefix: utm_source, utm_medium, ... |
| 304 | + var strictUtm = |
| 305 | + overwriteOptions.strictUtm || attr(scriptElement, "strict-utm"); |
285 | 306 |
|
286 | 307 | ///////////////////// |
287 | 308 | // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS |
|
366 | 387 | .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") |
367 | 388 | .replace(/^([^/]+)$/, "$1") || undefinedVar; |
368 | 389 |
|
369 | | - // The prefix utm_ is optional |
370 | | - var utmRegexPrefix = "(utm_)?"; |
| 390 | + // The prefix utm_ is optional with strictUtm disabled |
| 391 | + var utmRegexPrefix = "(utm_)" + (strictUtm ? "" : "?"); |
371 | 392 | var source = { |
372 | | - source: getParams(utmRegexPrefix + "source|ref"), |
| 393 | + source: getParams(utmRegexPrefix + "source" + (strictUtm ? "" : "|ref")), |
373 | 394 | medium: getParams(utmRegexPrefix + "medium"), |
374 | 395 | campaign: getParams(utmRegexPrefix + "campaign"), |
375 | 396 | term: getParams(utmRegexPrefix + "term"), |
|
0 commit comments