This is an automated email from the ASF dual-hosted git repository. poorejc pushed a commit to branch test in repository https://gitbox.apache.org/repos/asf/incubator-flagon-useralejs.git
commit c23fec23d3f223979d407838f18f2150bdb0abd9 Author: Gedd Johnson <[email protected]> AuthorDate: Tue Mar 23 11:53:08 2021 +0000 refactors var into let/const --- build/UserALEWebExtension/background.js | 58 ++++----- build/UserALEWebExtension/content.js | 209 +++++++++++++++---------------- build/userale-2.1.1.js | 211 ++++++++++++++++---------------- build/userale-2.1.1.min.js | 2 +- package-lock.json | 9 +- src/attachHandlers.js | 15 ++- src/configure.js | 8 +- src/getInitialSettings.js | 114 ++++++++--------- src/main.js | 14 +-- src/packageLogs.js | 52 ++++---- src/sendLogs.js | 6 +- 11 files changed, 351 insertions(+), 347 deletions(-) diff --git a/build/UserALEWebExtension/background.js b/build/UserALEWebExtension/background.js index 24fc4e3..73fb7ec 100644 --- a/build/UserALEWebExtension/background.js +++ b/build/UserALEWebExtension/background.js @@ -72,34 +72,36 @@ var ADD_LOG = prefix + 'ADD_LOG'; * @return {timeStampScale~tsScaler} The timestamp normalizing function. */ function timeStampScale(e) { - if (e.timeStamp && e.timeStamp > 0) { - var delta = Date.now() - e.timeStamp; - /** - * Returns a timestamp depending on various browser quirks. - * @param {?Number} ts A timestamp to use for normalization. - * @return {Number} A normalized timestamp. - */ - var tsScaler; - - if (delta < 0) { - tsScaler = function () { - return e.timeStamp / 1000; - }; - } else if (delta > e.timeStamp) { - var navStart = performance.timing.navigationStart; - tsScaler = function (ts) { - return ts + navStart; - }; + let tsScaler; + if (e.timeStamp && e.timeStamp > 0) { + const delta = Date.now() - e.timeStamp; + /** + * Returns a timestamp depending on various browser quirks. + * @param {?Number} ts A timestamp to use for normalization. + * @return {Number} A normalized timestamp. + */ + + if (delta < 0) { + tsScaler = function () { + return e.timeStamp / 1000; + }; + } else if (delta > e.timeStamp) { + const navStart = performance.timing.navigationStart; + tsScaler = function (ts) { + return ts + navStart; + }; + } else { + tsScaler = function (ts) { + return ts; + }; + } } else { - tsScaler = function (ts) { - return ts; - }; + tsScaler = function () { + return Date.now(); + }; } - } else { - tsScaler = function () { return Date.now(); }; - } - return tsScaler; + return tsScaler; } var __spreadArrays = (undefined && undefined.__spreadArrays) || function () { @@ -348,7 +350,7 @@ function extractTimeFields(timeStamp) { * limitations under the License. */ -var sendIntervalId = null; +let sendIntervalId = null; /** * Initializes the log queue processors. @@ -417,10 +419,10 @@ function sendOnClose(logs, config) { // @todo expose config object to sendLogs replate url with config.url function sendLogs(logs, config, retries) { - var req = new XMLHttpRequest(); + const req = new XMLHttpRequest(); // @todo setRequestHeader for Auth - var data = JSON.stringify(logs); + const data = JSON.stringify(logs); req.open('POST', config.url); if (config.authHeader) { diff --git a/build/UserALEWebExtension/content.js b/build/UserALEWebExtension/content.js index 0c6e317..411fe1e 100644 --- a/build/UserALEWebExtension/content.js +++ b/build/UserALEWebExtension/content.js @@ -67,7 +67,7 @@ var version = "2.1.1"; * limitations under the License. */ - var sessionId = null; +let sessionId = null; /** * Extracts the initial configuration settings from the @@ -75,33 +75,35 @@ var version = "2.1.1"; * @return {Object} The extracted configuration object */ function getInitialSettings() { - var settings = {}; + const settings = {}; - if (sessionId === null) { - sessionId = getSessionId('userAleSessionId', 'session_' + String(Date.now())); - } + if (sessionId === null) { + sessionId = getSessionId('userAleSessionId', 'session_' + String(Date.now())); + } + + const script = document.currentScript || (function () { + const scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + })(); - var script = document.currentScript || (function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - })(); - - var get = script ? script.getAttribute.bind(script) : function() { return null; }; - settings.autostart = get('data-autostart') === 'false' ? false : true; - settings.url = get('data-url') || 'http://localhost:8000'; - settings.transmitInterval = +get('data-interval') || 5000; - settings.logCountThreshold = +get('data-threshold') || 5; - settings.userId = get('data-user') || null; - settings.version = get('data-version') || null; - settings.logDetails = get('data-log-details') === 'true' ? true : false; - settings.resolution = +get('data-resolution') || 500; - settings.toolName = get('data-tool') || null; - settings.userFromParams = get('data-user-from-params') || null; - settings.time = timeStampScale(document.createEvent('CustomEvent')); - settings.sessionID = get('data-session') || sessionId; - settings.authHeader = get('data-auth') || null; - settings.custIndex = get('data-index') || null; - return settings; + const get = script ? script.getAttribute.bind(script) : function () { + return null; + }; + settings.autostart = get('data-autostart') === 'false' ? false : true; + settings.url = get('data-url') || 'http://localhost:8000'; + settings.transmitInterval = +get('data-interval') || 5000; + settings.logCountThreshold = +get('data-threshold') || 5; + settings.userId = get('data-user') || null; + settings.version = get('data-version') || null; + settings.logDetails = get('data-log-details') === 'true' ? true : false; + settings.resolution = +get('data-resolution') || 500; + settings.toolName = get('data-tool') || null; + settings.userFromParams = get('data-user-from-params') || null; + settings.time = timeStampScale(document.createEvent('CustomEvent')); + settings.sessionID = get('data-session') || sessionId; + settings.authHeader = get('data-auth') || null; + settings.custIndex = get('data-index') || null; + return settings; } /** @@ -110,13 +112,13 @@ function getInitialSettings() { * from refreshing the current user session * */ -function getSessionId(sessionKey, value){ - if (window.sessionStorage.getItem(sessionKey) === null) { - window.sessionStorage.setItem(sessionKey, JSON.stringify(value)); - return value; - } +function getSessionId(sessionKey, value) { + if (window.sessionStorage.getItem(sessionKey) === null) { + window.sessionStorage.setItem(sessionKey, JSON.stringify(value)); + return value; + } - return JSON.parse(window.sessionStorage.getItem(sessionKey)); + return JSON.parse(window.sessionStorage.getItem(sessionKey)); } @@ -126,34 +128,36 @@ function getSessionId(sessionKey, value){ * @return {timeStampScale~tsScaler} The timestamp normalizing function. */ function timeStampScale(e) { - if (e.timeStamp && e.timeStamp > 0) { - var delta = Date.now() - e.timeStamp; - /** - * Returns a timestamp depending on various browser quirks. - * @param {?Number} ts A timestamp to use for normalization. - * @return {Number} A normalized timestamp. - */ - var tsScaler; - - if (delta < 0) { - tsScaler = function () { - return e.timeStamp / 1000; - }; - } else if (delta > e.timeStamp) { - var navStart = performance.timing.navigationStart; - tsScaler = function (ts) { - return ts + navStart; - }; + let tsScaler; + if (e.timeStamp && e.timeStamp > 0) { + const delta = Date.now() - e.timeStamp; + /** + * Returns a timestamp depending on various browser quirks. + * @param {?Number} ts A timestamp to use for normalization. + * @return {Number} A normalized timestamp. + */ + + if (delta < 0) { + tsScaler = function () { + return e.timeStamp / 1000; + }; + } else if (delta > e.timeStamp) { + const navStart = performance.timing.navigationStart; + tsScaler = function (ts) { + return ts + navStart; + }; + } else { + tsScaler = function (ts) { + return ts; + }; + } } else { - tsScaler = function (ts) { - return ts; - }; + tsScaler = function () { + return Date.now(); + }; } - } else { - tsScaler = function () { return Date.now(); }; - } - return tsScaler; + return tsScaler; } /* @@ -182,7 +186,7 @@ function timeStampScale(e) { function configure(config, newConfig) { Object.keys(newConfig).forEach(function(option) { if (option === 'userFromParams') { - var userId = getUserIdFromParams(newConfig[option]); + const userId = getUserIdFromParams(newConfig[option]); if (userId) { config.userId = userId; } @@ -197,9 +201,9 @@ function configure(config, newConfig) { * @return {string|null} The extracted/decoded userid, or null if none is found. */ function getUserIdFromParams(param) { - var userField = param; - var regex = new RegExp('[?&]' + userField + '(=([^&#]*)|&|#|$)'); - var results = window.location.href.match(regex); + const userField = param; + const regex = new RegExp('[?&]' + userField + '(=([^&#]*)|&|#|$)'); + const results = window.location.href.match(regex); if (results && results[2]) { return decodeURIComponent(results[2].replace(/\+/g, ' ')); @@ -422,21 +426,21 @@ function createVersionParts(count) { * See the License for the specific language governing permissions and * limitations under the License. */ -var browser$1 = detect(); +const browser$1 = detect(); -var logs$1; -var config$1; +let logs$1; +let config$1; // Interval Logging Globals -var intervalID; -var intervalType; -var intervalPath; -var intervalTimer; -var intervalCounter; -var intervalLog; +let intervalID; +let intervalType; +let intervalPath; +let intervalTimer; +let intervalCounter; +let intervalLog; -var filterHandler = null; -var mapHandler = null; +let filterHandler = null; +let mapHandler = null; /** * Assigns a handler to filter logs out of the queue. @@ -476,16 +480,16 @@ function packageLog(e, detailFcn) { return false; } - var details = null; + let details = null; if (detailFcn) { details = detailFcn(e); } - var timeFields = extractTimeFields( + const timeFields = extractTimeFields( (e.timeStamp && e.timeStamp > 0) ? config$1.time(e.timeStamp) : Date.now() ); - var log = { + let log = { 'target' : getSelector(e.target), 'path' : buildPath(e), 'pageUrl': window.location.href, @@ -532,12 +536,12 @@ function packageCustomLog(customLog, detailFcn, userAction) { return false; } - var details = null; + let details = null; if (detailFcn) { details = detailFcn(); } - var metaData = { + const metaData = { 'pageUrl': window.location.href, 'pageTitle': document.title, 'pageReferrer': document.referrer, @@ -554,7 +558,7 @@ function packageCustomLog(customLog, detailFcn, userAction) { 'sessionID': config$1.sessionID }; - var log = Object.assign(metaData, customLog); + let log = Object.assign(metaData, customLog); if ((typeof filterHandler === 'function') && !filterHandler(log)) { return false; @@ -588,10 +592,10 @@ function extractTimeFields(timeStamp) { * @return boolean */ function packageIntervalLog(e) { - var target = getSelector(e.target); - var path = buildPath(e); - var type = e.type; - var timestamp = Math.floor((e.timeStamp && e.timeStamp > 0) ? config$1.time(e.timeStamp) : Date.now()); + const target = getSelector(e.target); + const path = buildPath(e); + const type = e.type; + const timestamp = Math.floor((e.timeStamp && e.timeStamp > 0) ? config$1.time(e.timeStamp) : Date.now()); // Init - this should only happen once on initialization if (intervalID == null) { @@ -702,11 +706,11 @@ function getSelector(ele) { * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element. */ function buildPath(e) { - var path = []; + let path = []; if (e.path) { path = e.path; } else { - var ele = e.target; + let ele = e.target; while(ele) { path.push(ele); ele = ele.parentElement; @@ -722,9 +726,9 @@ function buildPath(e) { * @return {string[]} Array of string CSS selectors. */ function selectorizePath(path) { - var i = 0; - var pathEle; - var pathSelectors = []; + let i = 0; + let pathEle; + const pathSelectors = []; while (pathEle = path[i]) { pathSelectors.push(getSelector(pathEle)); ++i; @@ -756,7 +760,7 @@ function detectBrowser() { * limitations under the License. */ -var sendIntervalId = null; +let sendIntervalId = null; /** * Initializes the log queue processors. @@ -843,10 +847,10 @@ function sendOnClose(logs, config) { // @todo expose config object to sendLogs replate url with config.url function sendLogs(logs, config, retries) { - var req = new XMLHttpRequest(); + const req = new XMLHttpRequest(); // @todo setRequestHeader for Auth - var data = JSON.stringify(logs); + const data = JSON.stringify(logs); req.open('POST', config.url); if (config.authHeader) { @@ -883,14 +887,13 @@ function sendLogs(logs, config, retries) { * limitations under the License. */ -// @todo var>let -var events; -var bufferBools; -var bufferedEvents; +let events; +let bufferBools; +let bufferedEvents; //@todo: Investigate drag events and their behavior -var intervalEvents = ['click', 'focus', 'blur', 'input', 'change', 'mouseover', 'submit']; -var refreshEvents; -var windowEvents = ['load', 'blur', 'focus']; +const intervalEvents = ['click', 'focus', 'blur', 'input', 'change', 'mouseover', 'submit']; +let refreshEvents; +const windowEvents = ['load', 'blur', 'focus']; /** * Maps an event to an object containing useful information. @@ -1010,15 +1013,15 @@ function attachHandlers(config) { * limitations under the License. */ -var config = {}; -var logs = []; -var startLoadTimestamp = Date.now(); -var endLoadTimestamp; +const config = {}; +const logs = []; +const startLoadTimestamp = Date.now(); +let endLoadTimestamp; window.onload = function () { endLoadTimestamp = Date.now(); }; -var started = false; +let started = false; // Start up Userale @@ -1040,7 +1043,7 @@ if (config.autostart) { function setup(config) { if (!started) { setTimeout(function () { - var state = document.readyState; + const state = document.readyState; if (state === 'interactive' || state === 'complete') { attachHandlers(config); diff --git a/build/userale-2.1.1.js b/build/userale-2.1.1.js index ea5de7d..2b7ed4a 100644 --- a/build/userale-2.1.1.js +++ b/build/userale-2.1.1.js @@ -41,7 +41,7 @@ * limitations under the License. */ - var sessionId = null; + let sessionId = null; /** * Extracts the initial configuration settings from the @@ -49,33 +49,35 @@ * @return {Object} The extracted configuration object */ function getInitialSettings() { - var settings = {}; + const settings = {}; - if (sessionId === null) { - sessionId = getSessionId('userAleSessionId', 'session_' + String(Date.now())); - } + if (sessionId === null) { + sessionId = getSessionId('userAleSessionId', 'session_' + String(Date.now())); + } + + const script = document.currentScript || (function () { + const scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + })(); - var script = document.currentScript || (function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - })(); - - var get = script ? script.getAttribute.bind(script) : function() { return null; }; - settings.autostart = get('data-autostart') === 'false' ? false : true; - settings.url = get('data-url') || 'http://localhost:8000'; - settings.transmitInterval = +get('data-interval') || 5000; - settings.logCountThreshold = +get('data-threshold') || 5; - settings.userId = get('data-user') || null; - settings.version = get('data-version') || null; - settings.logDetails = get('data-log-details') === 'true' ? true : false; - settings.resolution = +get('data-resolution') || 500; - settings.toolName = get('data-tool') || null; - settings.userFromParams = get('data-user-from-params') || null; - settings.time = timeStampScale(document.createEvent('CustomEvent')); - settings.sessionID = get('data-session') || sessionId; - settings.authHeader = get('data-auth') || null; - settings.custIndex = get('data-index') || null; - return settings; + const get = script ? script.getAttribute.bind(script) : function () { + return null; + }; + settings.autostart = get('data-autostart') === 'false' ? false : true; + settings.url = get('data-url') || 'http://localhost:8000'; + settings.transmitInterval = +get('data-interval') || 5000; + settings.logCountThreshold = +get('data-threshold') || 5; + settings.userId = get('data-user') || null; + settings.version = get('data-version') || null; + settings.logDetails = get('data-log-details') === 'true' ? true : false; + settings.resolution = +get('data-resolution') || 500; + settings.toolName = get('data-tool') || null; + settings.userFromParams = get('data-user-from-params') || null; + settings.time = timeStampScale(document.createEvent('CustomEvent')); + settings.sessionID = get('data-session') || sessionId; + settings.authHeader = get('data-auth') || null; + settings.custIndex = get('data-index') || null; + return settings; } /** @@ -84,13 +86,13 @@ * from refreshing the current user session * */ - function getSessionId(sessionKey, value){ - if (window.sessionStorage.getItem(sessionKey) === null) { - window.sessionStorage.setItem(sessionKey, JSON.stringify(value)); - return value; - } + function getSessionId(sessionKey, value) { + if (window.sessionStorage.getItem(sessionKey) === null) { + window.sessionStorage.setItem(sessionKey, JSON.stringify(value)); + return value; + } - return JSON.parse(window.sessionStorage.getItem(sessionKey)); + return JSON.parse(window.sessionStorage.getItem(sessionKey)); } @@ -100,34 +102,36 @@ * @return {timeStampScale~tsScaler} The timestamp normalizing function. */ function timeStampScale(e) { - if (e.timeStamp && e.timeStamp > 0) { - var delta = Date.now() - e.timeStamp; - /** - * Returns a timestamp depending on various browser quirks. - * @param {?Number} ts A timestamp to use for normalization. - * @return {Number} A normalized timestamp. - */ - var tsScaler; - - if (delta < 0) { - tsScaler = function () { - return e.timeStamp / 1000; - }; - } else if (delta > e.timeStamp) { - var navStart = performance.timing.navigationStart; - tsScaler = function (ts) { - return ts + navStart; - }; + let tsScaler; + if (e.timeStamp && e.timeStamp > 0) { + const delta = Date.now() - e.timeStamp; + /** + * Returns a timestamp depending on various browser quirks. + * @param {?Number} ts A timestamp to use for normalization. + * @return {Number} A normalized timestamp. + */ + + if (delta < 0) { + tsScaler = function () { + return e.timeStamp / 1000; + }; + } else if (delta > e.timeStamp) { + const navStart = performance.timing.navigationStart; + tsScaler = function (ts) { + return ts + navStart; + }; + } else { + tsScaler = function (ts) { + return ts; + }; + } } else { - tsScaler = function (ts) { - return ts; - }; + tsScaler = function () { + return Date.now(); + }; } - } else { - tsScaler = function () { return Date.now(); }; - } - return tsScaler; + return tsScaler; } /* @@ -156,7 +160,7 @@ function configure(config, newConfig) { Object.keys(newConfig).forEach(function(option) { if (option === 'userFromParams') { - var userId = getUserIdFromParams(newConfig[option]); + const userId = getUserIdFromParams(newConfig[option]); if (userId) { config.userId = userId; } @@ -171,9 +175,9 @@ * @return {string|null} The extracted/decoded userid, or null if none is found. */ function getUserIdFromParams(param) { - var userField = param; - var regex = new RegExp('[?&]' + userField + '(=([^&#]*)|&|#|$)'); - var results = window.location.href.match(regex); + const userField = param; + const regex = new RegExp('[?&]' + userField + '(=([^&#]*)|&|#|$)'); + const results = window.location.href.match(regex); if (results && results[2]) { return decodeURIComponent(results[2].replace(/\+/g, ' ')); @@ -396,21 +400,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - var browser = detect(); + const browser = detect(); - var logs$1; - var config$1; + let logs$1; + let config$1; // Interval Logging Globals - var intervalID; - var intervalType; - var intervalPath; - var intervalTimer; - var intervalCounter; - var intervalLog; + let intervalID; + let intervalType; + let intervalPath; + let intervalTimer; + let intervalCounter; + let intervalLog; - var filterHandler = null; - var mapHandler = null; + let filterHandler = null; + let mapHandler = null; /** * Assigns a handler to filter logs out of the queue. @@ -458,16 +462,16 @@ return false; } - var details = null; + let details = null; if (detailFcn) { details = detailFcn(e); } - var timeFields = extractTimeFields( + const timeFields = extractTimeFields( (e.timeStamp && e.timeStamp > 0) ? config$1.time(e.timeStamp) : Date.now() ); - var log = { + let log = { 'target' : getSelector(e.target), 'path' : buildPath(e), 'pageUrl': window.location.href, @@ -514,12 +518,12 @@ return false; } - var details = null; + let details = null; if (detailFcn) { details = detailFcn(); } - var metaData = { + const metaData = { 'pageUrl': window.location.href, 'pageTitle': document.title, 'pageReferrer': document.referrer, @@ -536,7 +540,7 @@ 'sessionID': config$1.sessionID }; - var log = Object.assign(metaData, customLog); + let log = Object.assign(metaData, customLog); if ((typeof filterHandler === 'function') && !filterHandler(log)) { return false; @@ -570,10 +574,10 @@ * @return boolean */ function packageIntervalLog(e) { - var target = getSelector(e.target); - var path = buildPath(e); - var type = e.type; - var timestamp = Math.floor((e.timeStamp && e.timeStamp > 0) ? config$1.time(e.timeStamp) : Date.now()); + const target = getSelector(e.target); + const path = buildPath(e); + const type = e.type; + const timestamp = Math.floor((e.timeStamp && e.timeStamp > 0) ? config$1.time(e.timeStamp) : Date.now()); // Init - this should only happen once on initialization if (intervalID == null) { @@ -684,11 +688,11 @@ * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element. */ function buildPath(e) { - var path = []; + let path = []; if (e.path) { path = e.path; } else { - var ele = e.target; + let ele = e.target; while(ele) { path.push(ele); ele = ele.parentElement; @@ -704,9 +708,9 @@ * @return {string[]} Array of string CSS selectors. */ function selectorizePath(path) { - var i = 0; - var pathEle; - var pathSelectors = []; + let i = 0; + let pathEle; + const pathSelectors = []; while (pathEle = path[i]) { pathSelectors.push(getSelector(pathEle)); ++i; @@ -738,7 +742,7 @@ * limitations under the License. */ - var sendIntervalId = null; + let sendIntervalId = null; /** * Initializes the log queue processors. @@ -825,10 +829,10 @@ // @todo expose config object to sendLogs replate url with config.url function sendLogs(logs, config, retries) { - var req = new XMLHttpRequest(); + const req = new XMLHttpRequest(); // @todo setRequestHeader for Auth - var data = JSON.stringify(logs); + const data = JSON.stringify(logs); req.open('POST', config.url); if (config.authHeader) { @@ -865,14 +869,13 @@ * limitations under the License. */ - // @todo var>let - var events; - var bufferBools; - var bufferedEvents; + let events; + let bufferBools; + let bufferedEvents; //@todo: Investigate drag events and their behavior - var intervalEvents = ['click', 'focus', 'blur', 'input', 'change', 'mouseover', 'submit']; - var refreshEvents; - var windowEvents = ['load', 'blur', 'focus']; + const intervalEvents = ['click', 'focus', 'blur', 'input', 'change', 'mouseover', 'submit']; + let refreshEvents; + const windowEvents = ['load', 'blur', 'focus']; /** * Maps an event to an object containing useful information. @@ -937,7 +940,7 @@ // Events list // Keys are event types // Values are functions that return details object if applicable - var eventType = { + const eventType = { 'click' : extractMouseEvent, 'dblclick' : extractMouseEvent, 'mousedown' : extractMouseEvent, @@ -1025,10 +1028,10 @@ * limitations under the License. */ - var config = {}; - var logs = []; - var startLoadTimestamp = Date.now(); - var endLoadTimestamp; + const config = {}; + const logs = []; + const startLoadTimestamp = Date.now(); + let endLoadTimestamp; window.onload = function () { endLoadTimestamp = Date.now(); }; @@ -1055,7 +1058,7 @@ function setup(config) { if (!exports.started) { setTimeout(function () { - var state = document.readyState; + const state = document.readyState; if (state === 'interactive' || state === 'complete') { attachHandlers(config); @@ -1075,7 +1078,7 @@ // Export the Userale API - var version = version$1; + const version = version$1; /** * Used to start the logging process if the diff --git a/build/userale-2.1.1.min.js b/build/userale-2.1.1.min.js index 9b6cd5b..fe4e247 100644 --- a/build/userale-2.1.1.min.js +++ b/build/userale-2.1.1.min.js @@ -15,4 +15,4 @@ * limitations under the License. * @preserved */ -!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).userale={})}(this,function(t){"use strict";var e="2.1.1",r=null;function n(t,o){Object.keys(o).forEach(function(e){var n;"userFromParams"!==e||(n=function(e){e=new RegExp("[?&]"+e+"(=([^&#]*)|&|#|$)"),e=window.location.href.match(e);return e&&e[2]?decodeURIComponent(e[2].replace(/\+/g," ")):null} [...] \ No newline at end of file +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).userale={})}(this,function(t){"use strict";var e="2.1.1";let r=null;function n(t,o){Object.keys(o).forEach(function(e){var n;"userFromParams"!==e||(n=function(e){const n=e,t=new RegExp("[?&]"+n+"(=([^&#]*)|&|#|$)"),o=window.location.href.match(t);return o&&o[2]?decodeURIComponent(o[2].replace(/\+ [...] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b5ce3f7..59c9e1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2768,7 +2768,6 @@ "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", @@ -3828,8 +3827,7 @@ "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "optionator": "^0.8.1" }, "bin": { "escodegen": "bin/escodegen.js", @@ -7483,7 +7481,6 @@ "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -8044,7 +8041,6 @@ "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -9924,9 +9920,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.2.tgz", "integrity": "sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg==", "dev": true, - "dependencies": { - "fsevents": "~2.3.1" - }, "bin": { "rollup": "dist/bin/rollup" }, diff --git a/src/attachHandlers.js b/src/attachHandlers.js index 0d6967a..5baa201 100644 --- a/src/attachHandlers.js +++ b/src/attachHandlers.js @@ -20,14 +20,13 @@ import { packageLog } from './packageLogs.js'; import { packageIntervalLog} from './packageLogs'; import { sendOnRefresh } from "./sendLogs"; -// @todo var>let -var events; -var bufferBools; -var bufferedEvents; +let events; +let bufferBools; +let bufferedEvents; //@todo: Investigate drag events and their behavior -var intervalEvents = ['click', 'focus', 'blur', 'input', 'change', 'mouseover', 'submit']; -var refreshEvents; -var windowEvents = ['load', 'blur', 'focus']; +const intervalEvents = ['click', 'focus', 'blur', 'input', 'change', 'mouseover', 'submit']; +let refreshEvents; +const windowEvents = ['load', 'blur', 'focus']; /** * Maps an event to an object containing useful information. @@ -92,7 +91,7 @@ export function defineCustomDetails(options, type) { // Events list // Keys are event types // Values are functions that return details object if applicable - var eventType = { + const eventType = { 'click' : extractMouseEvent, 'dblclick' : extractMouseEvent, 'mousedown' : extractMouseEvent, diff --git a/src/configure.js b/src/configure.js index 32dc9ec..fb369d9 100644 --- a/src/configure.js +++ b/src/configure.js @@ -24,7 +24,7 @@ export function configure(config, newConfig) { Object.keys(newConfig).forEach(function(option) { if (option === 'userFromParams') { - var userId = getUserIdFromParams(newConfig[option]); + const userId = getUserIdFromParams(newConfig[option]); if (userId) { config.userId = userId; } @@ -39,9 +39,9 @@ export function configure(config, newConfig) { * @return {string|null} The extracted/decoded userid, or null if none is found. */ export function getUserIdFromParams(param) { - var userField = param; - var regex = new RegExp('[?&]' + userField + '(=([^&#]*)|&|#|$)'); - var results = window.location.href.match(regex); + const userField = param; + const regex = new RegExp('[?&]' + userField + '(=([^&#]*)|&|#|$)'); + const results = window.location.href.match(regex); if (results && results[2]) { return decodeURIComponent(results[2].replace(/\+/g, ' ')); diff --git a/src/getInitialSettings.js b/src/getInitialSettings.js index 01abf4c..174c642 100644 --- a/src/getInitialSettings.js +++ b/src/getInitialSettings.js @@ -15,7 +15,7 @@ * limitations under the License. */ - var sessionId = null; +let sessionId = null; /** * Extracts the initial configuration settings from the @@ -23,33 +23,35 @@ * @return {Object} The extracted configuration object */ export function getInitialSettings() { - var settings = {}; + const settings = {}; - if (sessionId === null) { - sessionId = getSessionId('userAleSessionId', 'session_' + String(Date.now())); - } + if (sessionId === null) { + sessionId = getSessionId('userAleSessionId', 'session_' + String(Date.now())); + } - var script = document.currentScript || (function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - })(); + const script = document.currentScript || (function () { + const scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + })(); - var get = script ? script.getAttribute.bind(script) : function() { return null; }; - settings.autostart = get('data-autostart') === 'false' ? false : true; - settings.url = get('data-url') || 'http://localhost:8000'; - settings.transmitInterval = +get('data-interval') || 5000; - settings.logCountThreshold = +get('data-threshold') || 5; - settings.userId = get('data-user') || null; - settings.version = get('data-version') || null; - settings.logDetails = get('data-log-details') === 'true' ? true : false; - settings.resolution = +get('data-resolution') || 500; - settings.toolName = get('data-tool') || null; - settings.userFromParams = get('data-user-from-params') || null; - settings.time = timeStampScale(document.createEvent('CustomEvent')); - settings.sessionID = get('data-session') || sessionId; - settings.authHeader = get('data-auth') || null; - settings.custIndex = get('data-index') || null; - return settings; + const get = script ? script.getAttribute.bind(script) : function () { + return null; + }; + settings.autostart = get('data-autostart') === 'false' ? false : true; + settings.url = get('data-url') || 'http://localhost:8000'; + settings.transmitInterval = +get('data-interval') || 5000; + settings.logCountThreshold = +get('data-threshold') || 5; + settings.userId = get('data-user') || null; + settings.version = get('data-version') || null; + settings.logDetails = get('data-log-details') === 'true' ? true : false; + settings.resolution = +get('data-resolution') || 500; + settings.toolName = get('data-tool') || null; + settings.userFromParams = get('data-user-from-params') || null; + settings.time = timeStampScale(document.createEvent('CustomEvent')); + settings.sessionID = get('data-session') || sessionId; + settings.authHeader = get('data-auth') || null; + settings.custIndex = get('data-index') || null; + return settings; } /** @@ -58,13 +60,13 @@ export function getInitialSettings() { * from refreshing the current user session * */ -export function getSessionId(sessionKey, value){ - if (window.sessionStorage.getItem(sessionKey) === null) { - window.sessionStorage.setItem(sessionKey, JSON.stringify(value)); - return value; - } +export function getSessionId(sessionKey, value) { + if (window.sessionStorage.getItem(sessionKey) === null) { + window.sessionStorage.setItem(sessionKey, JSON.stringify(value)); + return value; + } - return JSON.parse(window.sessionStorage.getItem(sessionKey)); + return JSON.parse(window.sessionStorage.getItem(sessionKey)); } @@ -74,32 +76,34 @@ export function getSessionId(sessionKey, value){ * @return {timeStampScale~tsScaler} The timestamp normalizing function. */ export function timeStampScale(e) { - if (e.timeStamp && e.timeStamp > 0) { - var delta = Date.now() - e.timeStamp; - /** - * Returns a timestamp depending on various browser quirks. - * @param {?Number} ts A timestamp to use for normalization. - * @return {Number} A normalized timestamp. - */ - var tsScaler; + let tsScaler; + if (e.timeStamp && e.timeStamp > 0) { + const delta = Date.now() - e.timeStamp; + /** + * Returns a timestamp depending on various browser quirks. + * @param {?Number} ts A timestamp to use for normalization. + * @return {Number} A normalized timestamp. + */ - if (delta < 0) { - tsScaler = function () { - return e.timeStamp / 1000; - }; - } else if (delta > e.timeStamp) { - var navStart = performance.timing.navigationStart; - tsScaler = function (ts) { - return ts + navStart; - } + if (delta < 0) { + tsScaler = function () { + return e.timeStamp / 1000; + }; + } else if (delta > e.timeStamp) { + const navStart = performance.timing.navigationStart; + tsScaler = function (ts) { + return ts + navStart; + } + } else { + tsScaler = function (ts) { + return ts; + } + } } else { - tsScaler = function (ts) { - return ts; - } + tsScaler = function () { + return Date.now(); + }; } - } else { - tsScaler = function () { return Date.now(); }; - } - return tsScaler; + return tsScaler; } diff --git a/src/main.js b/src/main.js index 7bd2094..f1bdfad 100644 --- a/src/main.js +++ b/src/main.js @@ -22,15 +22,15 @@ import {attachHandlers} from './attachHandlers.js'; import {initPackager, packageCustomLog} from './packageLogs.js'; import {initSender} from './sendLogs.js'; -var config = {}; -var logs = []; -var startLoadTimestamp = Date.now() -var endLoadTimestamp +const config = {}; +const logs = []; +const startLoadTimestamp = Date.now() +let endLoadTimestamp window.onload = function () { endLoadTimestamp = Date.now() } -export var started = false; +export let started = false; export {defineCustomDetails as details} from './attachHandlers.js'; export { setLogMapper as map, @@ -61,7 +61,7 @@ if (config.autostart) { function setup(config) { if (!started) { setTimeout(function () { - var state = document.readyState; + const state = document.readyState; if (state === 'interactive' || state === 'complete') { attachHandlers(config); @@ -81,7 +81,7 @@ function setup(config) { // Export the Userale API -export var version = userAleVersion; +export const version = userAleVersion; /** * Used to start the logging process if the diff --git a/src/packageLogs.js b/src/packageLogs.js index cb7e3a2..59a7e40 100644 --- a/src/packageLogs.js +++ b/src/packageLogs.js @@ -16,21 +16,21 @@ */ import { detect } from 'detect-browser'; -var browser = detect(); +const browser = detect(); -export var logs; -var config; +export let logs; +let config; // Interval Logging Globals -var intervalID; -var intervalType; -var intervalPath; -var intervalTimer; -var intervalCounter; -var intervalLog; +let intervalID; +let intervalType; +let intervalPath; +let intervalTimer; +let intervalCounter; +let intervalLog; -export var filterHandler = null; -export var mapHandler = null; +export let filterHandler = null; +export let mapHandler = null; /** * Assigns a handler to filter logs out of the queue. @@ -78,16 +78,16 @@ export function packageLog(e, detailFcn) { return false; } - var details = null; + let details = null; if (detailFcn) { details = detailFcn(e); } - var timeFields = extractTimeFields( + const timeFields = extractTimeFields( (e.timeStamp && e.timeStamp > 0) ? config.time(e.timeStamp) : Date.now() ); - var log = { + let log = { 'target' : getSelector(e.target), 'path' : buildPath(e), 'pageUrl': window.location.href, @@ -134,12 +134,12 @@ export function packageCustomLog(customLog, detailFcn, userAction) { return false; } - var details = null; + let details = null; if (detailFcn) { details = detailFcn(); } - var metaData = { + const metaData = { 'pageUrl': window.location.href, 'pageTitle': document.title, 'pageReferrer': document.referrer, @@ -156,7 +156,7 @@ export function packageCustomLog(customLog, detailFcn, userAction) { 'sessionID': config.sessionID }; - var log = Object.assign(metaData, customLog); + let log = Object.assign(metaData, customLog); if ((typeof filterHandler === 'function') && !filterHandler(log)) { return false; @@ -190,10 +190,10 @@ export function extractTimeFields(timeStamp) { * @return boolean */ export function packageIntervalLog(e) { - var target = getSelector(e.target); - var path = buildPath(e); - var type = e.type; - var timestamp = Math.floor((e.timeStamp && e.timeStamp > 0) ? config.time(e.timeStamp) : Date.now()); + const target = getSelector(e.target); + const path = buildPath(e); + const type = e.type; + const timestamp = Math.floor((e.timeStamp && e.timeStamp > 0) ? config.time(e.timeStamp) : Date.now()); // Init - this should only happen once on initialization if (intervalID == null) { @@ -304,11 +304,11 @@ export function getSelector(ele) { * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element. */ export function buildPath(e) { - var path = []; + let path = []; if (e.path) { path = e.path; } else { - var ele = e.target + let ele = e.target while(ele) { path.push(ele); ele = ele.parentElement; @@ -324,9 +324,9 @@ export function buildPath(e) { * @return {string[]} Array of string CSS selectors. */ export function selectorizePath(path) { - var i = 0; - var pathEle; - var pathSelectors = []; + let i = 0; + let pathEle; + const pathSelectors = []; while (pathEle = path[i]) { pathSelectors.push(getSelector(pathEle)); ++i; diff --git a/src/sendLogs.js b/src/sendLogs.js index da43180..9d84706 100644 --- a/src/sendLogs.js +++ b/src/sendLogs.js @@ -15,7 +15,7 @@ * limitations under the License. */ -var sendIntervalId = null; +let sendIntervalId = null; /** * Initializes the log queue processors. @@ -102,10 +102,10 @@ export function sendOnClose(logs, config) { // @todo expose config object to sendLogs replate url with config.url export function sendLogs(logs, config, retries) { - var req = new XMLHttpRequest(); + const req = new XMLHttpRequest(); // @todo setRequestHeader for Auth - var data = JSON.stringify(logs); + const data = JSON.stringify(logs); req.open('POST', config.url); if (config.authHeader) {
