// ========================================== // Copyright 2013 Twitter, Inc // Licensed under The MIT License // http://opensource.org/licenses/MIT // ========================================== define( [ './utils' ], function(utils) { 'use strict'; var actionSymbols = { on: '<-', trigger: '->', off: 'x ' }; function elemToString(elem) { var tagStr = elem.tagName ? elem.tagName.toLowerCase() : elem.toString(); var classStr = elem.className ? '.' + (elem.className) : ''; var result = tagStr + classStr; return elem.tagName ? ['\'', '\''].join(result) : result; } function log(action, component, eventArgs) { if (!window.DEBUG || !window.DEBUG.enabled) return; var name, eventType, elem, fn, payload, logFilter, toRegExp, actionLoggable, nameLoggable, info; if (typeof eventArgs[eventArgs.length-1] == 'function') { fn = eventArgs.pop(); fn = fn.unbound || fn; // use unbound version if any (better info) } if (eventArgs.length == 1) { elem = component.$node[0]; eventType = eventArgs[0]; } else if ((eventArgs.length == 2) && typeof eventArgs[1] == 'object' && !eventArgs[1].type) { //2 args, first arg is not elem elem = component.$node[0]; eventType = eventArgs[0]; if (action == "trigger") { payload = eventArgs[1]; } } else { //2+ args, first arg is elem elem = eventArgs[0]; eventType = eventArgs[1]; if (action == "trigger") { payload = eventArgs[2]; } } name = typeof eventType == 'object' ? eventType.type : eventType; logFilter = DEBUG.events.logFilter; // no regex for you, actions... actionLoggable = logFilter.actions == 'all' || (logFilter.actions.indexOf(action) > -1); // event name filter allow wildcards or regex... toRegExp = function(expr) { return expr.test ? expr : new RegExp('^' + expr.replace(/\*/g, '.*') + '$'); }; nameLoggable = logFilter.eventNames == 'all' || logFilter.eventNames.some(function(e) {return toRegExp(e).test(name);}); if (actionLoggable && nameLoggable) { info = [actionSymbols[action], action, '[' + name + ']']; payload && info.push(payload); info.push(elemToString(elem)); info.push(component.constructor.describe.split(' ').slice(0,3).join(' ')); console.groupCollapsed && action == 'trigger' && console.groupCollapsed(action, name); console.info.apply(console, info); } } function withLogging() { this.before('trigger', function() { log('trigger', this, utils.toArray(arguments)); }); if (console.groupCollapsed) { this.after('trigger', function() { console.groupEnd(); }); } this.before('on', function() { log('on', this, utils.toArray(arguments)); }); this.before('off', function() { log('off', this, utils.toArray(arguments)); }); } return withLogging; } );