tracking-params
Version:
Easily get and remove unwanted tracking parameters from URLs.
125 lines (111 loc) • 4.15 kB
JavaScript
// Map URLSearchParams to [ key, value ][]
var paramsToEntries = function paramsToEntries(params) {
var _params = {};
params.forEach(function (value, key) {
_params[key] = value;
});
return Object.entries(_params);
};
var UNIVERSAL_PARAMS = ['__twitter_impression', '_hsenc', '_openstat', 'action_object_map', 'action_ref_map', 'action_type_map', 'adgroupid', 'amp', 'campaignid', 'CNDID', 'fb_action_ids', 'fb_action_types', 'fb_ref', 'fb_source', 'fbclid', 'feeditemid', 'ga_campaign', 'ga_content', 'ga_medium', 'ga_place', 'ga_source', 'ga_term', 'gclid', 'gs_l', 'hmb_campaign', 'hmb_medium', 'hmb_source', 'mbid', 'mc_cid', 'mc_eid', 'mkt_tok', /pd_rd\w+/, /pf_rd\w+/, 'referrer', 'spJobID', 'spMailingID', 'spReportId', 'spUserID', /utm_\w+/, 'wt_mc_o', 'WT.mc_ev', 'WT.mc_id', 'WT.srch', 'yclid'];
var DOMAIN_PARAMS = [{
domain: '.',
params: UNIVERSAL_PARAMS
}, {
domain: 'amazon',
params: ['_encoding', 'creative', 'creativeASIN', 'dchild', 'ie', 'linkCode', 'linkId', 'orig', 'psc', 'qid', 'ref', 'refRID', 'sr', 'tag'],
handler: function handler(url) {
// Remove /ref=abc at end of url path
var refPathMatch = /ref=\w+/;
var newUrl = new URL(url.toString());
var matches = newUrl.pathname.match(refPathMatch);
if (!(matches == null ? void 0 : matches.length)) {
return;
}
var startIndex = newUrl.pathname.indexOf(matches[0]);
newUrl.pathname = newUrl.pathname.substring(0, startIndex);
var newParams = [{
key: 'ref',
value: url.pathname.substring(startIndex + 4)
}];
return {
newCleanUrl: newUrl.toString(),
newParams: newParams
};
}
}, {
domain: 'bing',
params: ['cvid', 'form', 'pq', 'qs', 'sc', 'sk', 'sp']
}, {
domain: 'google',
params: ['ei', 'gws_rd', 'sei', 'ved']
}, {
domain: 'instagram',
params: ['igshid']
}, {
domain: 'nytimes',
params: ['emc', 'partner']
}, {
domain: 'reddit',
params: ['context', 'ref', 'ref_source', 'st']
}, {
domain: 'twitter',
params: ['vertical', 'src', 's', 'ref_src', 'ref_url']
}, {
domain: 'youtube',
params: ['ab_channel', 'attr_tag', 'feature', 'kw']
}];
var getTrackingData = function getTrackingData(dirtyUrl) {
var urlObj = new URL(dirtyUrl);
var urlData = {
url: dirtyUrl,
isDirty: false,
trackingParams: [],
cleanUrl: dirtyUrl
}; // Skip checks if no params
if (!urlObj.searchParams.toString().length) {
return urlData;
} // Loop through domains to find a match
// If domain match, loop through params
// If param match:
// 1. Set `isDirty` to true
// 2. Add `trackingParams` entry
// 3. Set `cleanUrl` as url with that param removed
DOMAIN_PARAMS.forEach(function (domainParams) {
// Check for domain match
if (urlObj.hostname.includes(domainParams.domain)) {
// Copy params to array so they can be freely deleted from urlObj
var urlParams = paramsToEntries(urlObj.searchParams);
urlParams.forEach(function (_ref) {
var key = _ref[0],
value = _ref[1];
domainParams.params.forEach(function (badParam) {
// Check for param key match
var match = typeof badParam === 'string' ? key === badParam : badParam.test(key);
if (match) {
urlData.isDirty = true;
urlData.trackingParams.push({
key: key,
value: value
});
urlObj.searchParams["delete"](key);
urlData.cleanUrl = urlObj.toString();
}
});
}); // Run domain specific handler to further clean URL
if (typeof domainParams.handler === 'function') {
var moreInfo = domainParams.handler(urlObj);
if (moreInfo) {
var _urlData$trackingPara;
(_urlData$trackingPara = urlData.trackingParams).push.apply(_urlData$trackingPara, moreInfo.newParams);
urlData.cleanUrl = moreInfo.newCleanUrl;
}
}
}
});
return urlData;
};
var cleanUrl = function cleanUrl(dirtyUrl) {
return getTrackingData(dirtyUrl).cleanUrl;
};
export { cleanUrl, getTrackingData };
//# sourceMappingURL=tracking-params.esm.js.map