Skip to content

Commit

Permalink
Flight: Update dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
passy committed May 22, 2014
1 parent 2e2ee2b commit a5d0ac7
Show file tree
Hide file tree
Showing 10 changed files with 295 additions and 189 deletions.
34 changes: 26 additions & 8 deletions dependency-examples/flight/bower_components/flight/lib/base.js
Expand Up @@ -41,6 +41,12 @@ define(
}
}

function proxyEventTo(targetEvent) {
return function(e, data) {
$(e.target).trigger(targetEvent, data);
};
}

function withBase() {

// delegate trigger, bind and unbind to an element
Expand Down Expand Up @@ -99,6 +105,8 @@ define(
originalCb = utils.delegate(
this.resolveDelegateRules(origin)
);
} else if (typeof origin == 'string') {
originalCb = proxyEventTo(origin);
} else {
originalCb = origin;
}
Expand All @@ -117,16 +125,13 @@ define(

callback = originalCb.bind(this);
callback.target = originalCb;

// if the original callback is already branded by jQuery's guid, copy it to the context-bound version
if (originalCb.guid) {
callback.guid = originalCb.guid;
}
callback.context = this;

$element.on(type, callback);

// get jquery's guid from our bound fn, so unbinding will work
originalCb.guid = callback.guid;
// store every bound version of the callback
originalCb.bound || (originalCb.bound = []);
originalCb.bound.push(callback);

return callback;
};
Expand All @@ -148,6 +153,19 @@ define(
type = arguments[0];
}

if (callback) {
//this callback may be the original function or a bound version
var boundFunctions = callback.target ? callback.target.bound : callback.bound || [];
//set callback to version bound against this instance
boundFunctions && boundFunctions.some(function(fn, i, arr) {
if (fn.context && (this.identity == fn.context.identity)) {
arr.splice(i, 1);
callback = fn;
return true;
}
}, this);
}

return $element.off(type, callback);
};

Expand All @@ -158,7 +176,7 @@ define(
if (!(r in this.attr)) {
throw new Error('Component "' + this.toString() + '" wants to listen on "' + r + '" but no such attribute was defined.');
}
rules[this.attr[r]] = ruleInfo[r];
rules[this.attr[r]] = (typeof ruleInfo[r] == 'string') ? proxyEventTo(ruleInfo[r]) : ruleInfo[r];
}, this);

return rules;
Expand Down
48 changes: 32 additions & 16 deletions dependency-examples/flight/bower_components/flight/lib/component.js
Expand Up @@ -27,7 +27,11 @@ define(

componentInfo && Object.keys(componentInfo.instances).forEach(function(k) {
var info = componentInfo.instances[k];
info.instance.teardown();
// It's possible that a previous teardown caused another component to teardown,
// so we can't assume that the instances object is as it was.
if (info && info.instance) {
info.instance.teardown();
}
});
}

Expand Down Expand Up @@ -65,37 +69,49 @@ define(
}.bind(this));
}

function prettyPrintMixins() {
//could be called from constructor or constructor.prototype
var mixedIn = this.mixedIn || this.prototype.mixedIn || [];
return mixedIn.map(function(mixin) {
if (mixin.name == null) {
// function name property not supported by this browser, use regex
var m = mixin.toString().match(functionNameRegEx);
return (m && m[1]) ? m[1] : '';
} else {
return (mixin.name != 'withBase') ? mixin.name : '';
}
}).filter(Boolean).join(', ');
};


// define the constructor for a custom component type
// takes an unlimited number of mixin functions as arguments
// typical api call with 3 mixins: define(timeline, withTweetCapability, withScrollCapability);
function define(/*mixins*/) {
// unpacking arguments by hand benchmarked faster
var l = arguments.length;
// add three for common mixins
var mixins = new Array(l + 3);
var mixins = new Array(l);
for (var i = 0; i < l; i++) mixins[i] = arguments[i];

var Component = function() {};

Component.toString = Component.prototype.toString = function() {
var prettyPrintMixins = mixins.map(function(mixin) {
if (mixin.name == null) {
// function name property not supported by this browser, use regex
var m = mixin.toString().match(functionNameRegEx);
return (m && m[1]) ? m[1] : '';
} else {
return (mixin.name != 'withBase') ? mixin.name : '';
}
}).filter(Boolean).join(', ');
return prettyPrintMixins;
};

Component.toString = Component.prototype.toString = prettyPrintMixins;
if (debug.enabled) {
Component.describe = Component.prototype.describe = Component.toString();
}

// 'options' is optional hash to be merged with 'defaults' in the component definition
Component.attachTo = attachTo;
// enables extension of existing "base" Components
Component.mixin = function() {
var newComponent = define(); //TODO: fix pretty print
var newPrototype = Object.create(Component.prototype);
newPrototype.mixedIn = [].concat(Component.prototype.mixedIn);
compose.mixin(newPrototype, arguments);
newComponent.prototype = newPrototype;
newComponent.prototype.constructor = newComponent;
return newComponent;
};
Component.teardownAll = teardownAll;

// prepend common mixins to supplied list, then mixin all flavors
Expand Down
Expand Up @@ -65,13 +65,13 @@ define(
function mixin(base, mixins) {
base.mixedIn = base.hasOwnProperty('mixedIn') ? base.mixedIn : [];

mixins.forEach(function(mixin) {
if (base.mixedIn.indexOf(mixin) == -1) {
for (var i=0; i<mixins.length; i++) {
if (base.mixedIn.indexOf(mixins[i]) == -1) {
setPropertyWritability(base, false);
mixin.call(base);
base.mixedIn.push(mixin);
mixins[i].call(base);
base.mixedIn.push(mixins[i]);
}
});
}

setPropertyWritability(base, true);
}
Expand Down
54 changes: 31 additions & 23 deletions dependency-examples/flight/bower_components/flight/lib/debug.js
Expand Up @@ -11,9 +11,9 @@ define(
function() {
'use strict';

//******************************************************************************************
// ==========================================
// Search object model
//******************************************************************************************
// ==========================================

function traverse(util, searchTerm, options) {
options = options || {};
Expand Down Expand Up @@ -53,17 +53,17 @@ define(
function byValueCoerced(searchTerm, options) {search('valueCoerced', null, searchTerm, options);}
function custom(fn, options) {traverse(fn, null, options);}

//******************************************************************************************
// ==========================================
// Event logging
//******************************************************************************************
// ==========================================

var ALL = 'all'; //no filter

//no logging by default
var defaultEventNamesFilter = [];
var defaultActionsFilter = [];

var logFilter = retrieveLogFilter();
//log nothing by default
var logFilter = {
eventNames: [],
actions: []
}

function filterEventLogsByAction(/*actions*/) {
var actions = [].slice.call(arguments);
Expand Down Expand Up @@ -94,26 +94,32 @@ define(
}

function saveLogFilter() {
if (window.localStorage) {
localStorage.setItem('logFilter_eventNames', logFilter.eventNames);
localStorage.setItem('logFilter_actions', logFilter.actions);
}
try {
if (window.localStorage) {
localStorage.setItem('logFilter_eventNames', logFilter.eventNames);
localStorage.setItem('logFilter_actions', logFilter.actions);
}
} catch (ignored) {};
}

function retrieveLogFilter() {
var result = {
eventNames: (window.localStorage && localStorage.getItem('logFilter_eventNames')) || defaultEventNamesFilter,
actions: (window.localStorage && localStorage.getItem('logFilter_actions')) || defaultActionsFilter
};

// reconstitute arrays
Object.keys(result).forEach(function(k) {
var thisProp = result[k];
var eventNames, actions;
try {
eventNames = (window.localStorage && localStorage.getItem('logFilter_eventNames'));
actions = (window.localStorage && localStorage.getItem('logFilter_actions'));
} catch(ignored) {
return;
}
eventNames && (logFilter.eventNames = eventNames);
actions && (logFilter.actions = actions);

// reconstitute arrays in place
Object.keys(logFilter).forEach(function(k) {
var thisProp = logFilter[k];
if (typeof thisProp == 'string' && thisProp !== ALL) {
result[k] = thisProp.split(',');
logFilter[k] = thisProp ? thisProp.split(',') : [];
}
});
return result;
}

return {
Expand All @@ -126,6 +132,8 @@ define(
console.info('You can configure event logging with DEBUG.events.logAll()/logNone()/logByName()/logByAction()');
}

retrieveLogFilter();

window.DEBUG = this;
},

Expand Down
72 changes: 42 additions & 30 deletions dependency-examples/flight/bower_components/flight/lib/logger.js
Expand Up @@ -27,54 +27,66 @@ define(
}

function log(action, component, eventArgs) {
var name, elem, fn, logFilter, toRegExp, actionLoggable, nameLoggable;
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 (typeof eventArgs[eventArgs.length - 1] == 'object') {
eventArgs.pop(); // trigger data arg - not logged right now
}

if (eventArgs.length == 2) {
elem = eventArgs[0];
name = eventArgs[1];
} else {
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];
name = eventArgs[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];
}
}

if (window.DEBUG && window.DEBUG.enabled) {
logFilter = DEBUG.events.logFilter;
name = typeof eventType == 'object' ? eventType.type : eventType;

// 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);});
logFilter = DEBUG.events.logFilter;

if (actionLoggable && nameLoggable) {
console.info(
actionSymbols[action],
action,
'[' + name + ']',
elemToString(elem),
component.constructor.describe.split(' ').slice(0,3).join(' ') // two mixins only
);
}
// 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));
});
Expand Down
Expand Up @@ -151,6 +151,12 @@ define(
return this.allInstances[instance.identity] || null;
};

this.getBoundEventNames = function(instance) {
return this.findInstanceInfo(instance).events.map(function(ev) {
return ev.type;
});
};

this.findInstanceInfoByNode = function(node) {
var result = [];
Object.keys(this.allInstances).forEach(function(k) {
Expand Down

0 comments on commit a5d0ac7

Please sign in to comment.