flight-for-rails 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f3fefad2bb984a54aa51f73a29b47aba6607c43
4
- data.tar.gz: 6fface1503e3b8a16c79ddf7b06daec6bf008bbf
3
+ metadata.gz: 0cf5f8320790612e10c457de6f50903059fe37c8
4
+ data.tar.gz: 03e1aff1cec648d5e1531b909061e5012cf5b2c8
5
5
  SHA512:
6
- metadata.gz: c6cfe0635fab87024976d4521f1fabeed859b536a513f3769182590d70f57e8fde8331eac1df5ee539de3d9b550f2d2cbd02f23fedc38799e8ceda3aa013337b
7
- data.tar.gz: 649a0de7a0d81e1ae596c1bfafa6f78eed7a1a9c9d2ae9a4bcab2b8bdf28abd406f51cef0f6113e932aafffbc81a117a4a023c92b3b2d77ddccf198f2bb88014
6
+ metadata.gz: 11914229d27e2ebdd5d19316852234aba92353207649553e7498bdced8ea3cbe2980b916d6fceaa58a32aaf8eafcd4a1ff5a01d4ab0815fa7117256636bfbcb6
7
+ data.tar.gz: 04bde428f8c05f9a6acb41cd92957935c4ab69c242d653c1c8261bf584d3060cc053fe12861eb3eaf197ebb99395cce9c3626aac13a6f2436f77f7608accb152
data/README.md CHANGED
@@ -20,7 +20,7 @@ This gem vendors Flight files and dependecies for Rails assets pipeline.
20
20
  First add the following lines to your application `Gemfile`:
21
21
 
22
22
  ``` ruby
23
- gem 'flight-for-rails', '~> 1.2.0'
23
+ gem 'flight-for-rails', '~> 1.3.0'
24
24
  ```
25
25
 
26
26
  Then run `bundle install` to update your's gems bundle.
@@ -1,5 +1,5 @@
1
1
  # This file is automatically generated.
2
2
  # Change template/version.erb if you need.
3
3
  module FlightForRails
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
@@ -1,1154 +1,1426 @@
1
- /*! Flight v1.2.0 | (c) Twitter, Inc. | MIT License */
2
- (function(context) {
3
- var factories = {}, loaded = {};
4
- var isArray = Array.isArray || function(obj) {
5
- return obj.constructor == Array;
6
- };
7
-
8
- var map = Array.map || function(arr, fn, scope) {
9
- for (var i = 0, len = arr.length, result = []; i < len; i++) {
10
- result.push(fn.call(scope, arr[i]));
11
- }
12
- return result;
13
- };
1
+ /*! Flight v1.3.0 | (c) Twitter, Inc. | MIT License */
2
+ (function webpackUniversalModuleDefinition(root, factory) {
3
+ if(typeof exports === 'object' && typeof module === 'object')
4
+ module.exports = factory();
5
+ else if(typeof define === 'function' && define.amd)
6
+ define(factory);
7
+ else if(typeof exports === 'object')
8
+ exports["flight"] = factory();
9
+ else
10
+ root["flight"] = factory();
11
+ })(this, function() {
12
+ return /******/ (function(modules) { // webpackBootstrap
13
+ /******/ // The module cache
14
+ /******/ var installedModules = {};
15
+ /******/
16
+ /******/ // The require function
17
+ /******/ function __webpack_require__(moduleId) {
18
+ /******/
19
+ /******/ // Check if module is in cache
20
+ /******/ if(installedModules[moduleId])
21
+ /******/ return installedModules[moduleId].exports;
22
+ /******/
23
+ /******/ // Create a new module (and put it into the cache)
24
+ /******/ var module = installedModules[moduleId] = {
25
+ /******/ exports: {},
26
+ /******/ id: moduleId,
27
+ /******/ loaded: false
28
+ /******/ };
29
+ /******/
30
+ /******/ // Execute the module function
31
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
32
+ /******/
33
+ /******/ // Flag the module as loaded
34
+ /******/ module.loaded = true;
35
+ /******/
36
+ /******/ // Return the exports of the module
37
+ /******/ return module.exports;
38
+ /******/ }
39
+ /******/
40
+ /******/
41
+ /******/ // expose the modules object (__webpack_modules__)
42
+ /******/ __webpack_require__.m = modules;
43
+ /******/
44
+ /******/ // expose the module cache
45
+ /******/ __webpack_require__.c = installedModules;
46
+ /******/
47
+ /******/ // __webpack_public_path__
48
+ /******/ __webpack_require__.p = "";
49
+ /******/
50
+ /******/ // Load entry module and return exports
51
+ /******/ return __webpack_require__(0);
52
+ /******/ })
53
+ /************************************************************************/
54
+ /******/ ([
55
+ /* 0 */
56
+ /***/ function(module, exports, __webpack_require__) {
57
+
58
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
59
+
60
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
61
+ __webpack_require__(1),
62
+ __webpack_require__(2),
63
+ __webpack_require__(3),
64
+ __webpack_require__(4),
65
+ __webpack_require__(5),
66
+ __webpack_require__(6),
67
+ __webpack_require__(7)
68
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = (function(advice, component, compose, debug, logger, registry, utils) {
69
+ 'use strict';
70
+
71
+ return {
72
+ advice: advice,
73
+ component: component,
74
+ compose: compose,
75
+ debug: debug,
76
+ logger: logger,
77
+ registry: registry,
78
+ utils: utils
79
+ };
80
+
81
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
82
+
83
+
84
+ /***/ },
85
+ /* 1 */
86
+ /***/ function(module, exports, __webpack_require__) {
87
+
88
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
89
+
90
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
91
+ __webpack_require__(7)
92
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = (function(utils) {
93
+ 'use strict';
94
+
95
+ var advice = {
96
+
97
+ around: function(base, wrapped) {
98
+ return function composedAround() {
99
+ // unpacking arguments by hand benchmarked faster
100
+ var i = 0, l = arguments.length, args = new Array(l + 1);
101
+ args[0] = base.bind(this);
102
+ for (; i < l; i++) {
103
+ args[i + 1] = arguments[i];
104
+ }
105
+ return wrapped.apply(this, args);
106
+ };
107
+ },
108
+
109
+ before: function(base, before) {
110
+ var beforeFn = (typeof before == 'function') ? before : before.obj[before.fnName];
111
+ return function composedBefore() {
112
+ beforeFn.apply(this, arguments);
113
+ return base.apply(this, arguments);
114
+ };
115
+ },
116
+
117
+ after: function(base, after) {
118
+ var afterFn = (typeof after == 'function') ? after : after.obj[after.fnName];
119
+ return function composedAfter() {
120
+ var res = (base.unbound || base).apply(this, arguments);
121
+ afterFn.apply(this, arguments);
122
+ return res;
123
+ };
124
+ },
125
+
126
+ // a mixin that allows other mixins to augment existing functions by adding additional
127
+ // code before, after or around.
128
+ withAdvice: function() {
129
+ ['before', 'after', 'around'].forEach(function(m) {
130
+ this[m] = function(method, fn) {
131
+
132
+ utils.mutateProperty(this, method, function() {
133
+ if (typeof this[method] == 'function') {
134
+ this[method] = advice[m](this[method], fn);
135
+ } else {
136
+ this[method] = fn;
137
+ }
138
+
139
+ return this[method];
140
+ });
141
+
142
+ };
143
+ }, this);
144
+ }
145
+ };
146
+
147
+ return advice;
148
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
149
+
14
150
 
15
- function define() {
16
- var args = Array.prototype.slice.call(arguments), dependencies = [], id, factory;
17
- if (typeof args[0] == 'string') {
18
- id = args.shift();
151
+ /***/ },
152
+ /* 2 */
153
+ /***/ function(module, exports, __webpack_require__) {
154
+
155
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
156
+
157
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
158
+ __webpack_require__(1),
159
+ __webpack_require__(7),
160
+ __webpack_require__(3),
161
+ __webpack_require__(8),
162
+ __webpack_require__(6),
163
+ __webpack_require__(5),
164
+ __webpack_require__(4)
165
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = (function(advice, utils, compose, withBase, registry, withLogging, debug) {
166
+ 'use strict';
167
+
168
+ var functionNameRegEx = /function (.*?)\s?\(/;
169
+
170
+ // teardown for all instances of this constructor
171
+ function teardownAll() {
172
+ var componentInfo = registry.findComponentInfo(this);
173
+
174
+ componentInfo && Object.keys(componentInfo.instances).forEach(function(k) {
175
+ var info = componentInfo.instances[k];
176
+ // It's possible that a previous teardown caused another component to teardown,
177
+ // so we can't assume that the instances object is as it was.
178
+ if (info && info.instance) {
179
+ info.instance.teardown();
180
+ }
181
+ });
19
182
  }
20
- if (isArray(args[0])) {
21
- dependencies = args.shift();
183
+
184
+ function attachTo(selector/*, options args */) {
185
+ // unpacking arguments by hand benchmarked faster
186
+ var l = arguments.length;
187
+ var args = new Array(l - 1);
188
+ for (var i = 1; i < l; i++) {
189
+ args[i - 1] = arguments[i];
190
+ }
191
+
192
+ if (!selector) {
193
+ throw new Error('Component needs to be attachTo\'d a jQuery object, native node or selector string');
194
+ }
195
+
196
+ var options = utils.merge.apply(utils, args);
197
+ var componentInfo = registry.findComponentInfo(this);
198
+
199
+ $(selector).each(function(i, node) {
200
+ if (componentInfo && componentInfo.isAttachedTo(node)) {
201
+ // already attached
202
+ return;
203
+ }
204
+
205
+ (new this).initialize(node, options);
206
+ }.bind(this));
22
207
  }
23
- factory = args.shift();
24
- factories[id] = [dependencies, factory];
25
- }
26
-
27
- function require(id) {
28
- function resolve(dep) {
29
- var relativeParts = id.split('/'), depParts = dep.split('/'), relative = false;
30
- relativeParts.pop();
31
- while (depParts[0] == '..' && relativeParts.length) {
32
- relativeParts.pop();
33
- depParts.shift();
34
- relative = true;
208
+
209
+ function prettyPrintMixins() {
210
+ //could be called from constructor or constructor.prototype
211
+ var mixedIn = this.mixedIn || this.prototype.mixedIn || [];
212
+ return mixedIn.map(function(mixin) {
213
+ if (mixin.name == null) {
214
+ // function name property not supported by this browser, use regex
215
+ var m = mixin.toString().match(functionNameRegEx);
216
+ return (m && m[1]) ? m[1] : '';
217
+ } else {
218
+ return (mixin.name != 'withBase') ? mixin.name : '';
219
+ }
220
+ }).filter(Boolean).join(', ');
221
+ };
222
+
223
+
224
+ // define the constructor for a custom component type
225
+ // takes an unlimited number of mixin functions as arguments
226
+ // typical api call with 3 mixins: define(timeline, withTweetCapability, withScrollCapability);
227
+ function define(/*mixins*/) {
228
+ // unpacking arguments by hand benchmarked faster
229
+ var l = arguments.length;
230
+ var mixins = new Array(l);
231
+ for (var i = 0; i < l; i++) {
232
+ mixins[i] = arguments[i];
35
233
  }
36
- if (depParts[0] == '.') {
37
- depParts.shift();
38
- relative = true;
234
+
235
+ var Component = function() {};
236
+
237
+ Component.toString = Component.prototype.toString = prettyPrintMixins;
238
+ if (debug.enabled) {
239
+ Component.describe = Component.prototype.describe = Component.toString();
39
240
  }
40
- if (relative) {
41
- depParts = relativeParts.concat(depParts);
241
+
242
+ // 'options' is optional hash to be merged with 'defaults' in the component definition
243
+ Component.attachTo = attachTo;
244
+ // enables extension of existing "base" Components
245
+ Component.mixin = function() {
246
+ var newComponent = define(); //TODO: fix pretty print
247
+ var newPrototype = Object.create(Component.prototype);
248
+ newPrototype.mixedIn = [].concat(Component.prototype.mixedIn);
249
+ newPrototype.defaults = utils.merge(Component.prototype.defaults);
250
+ newPrototype.attrDef = Component.prototype.attrDef;
251
+ compose.mixin(newPrototype, arguments);
252
+ newComponent.prototype = newPrototype;
253
+ newComponent.prototype.constructor = newComponent;
254
+ return newComponent;
255
+ };
256
+ Component.teardownAll = teardownAll;
257
+
258
+ // prepend common mixins to supplied list, then mixin all flavors
259
+ if (debug.enabled) {
260
+ mixins.unshift(withLogging);
42
261
  }
43
- return depParts.join('/');
262
+ mixins.unshift(withBase, advice.withAdvice, registry.withRegistration);
263
+ compose.mixin(Component.prototype, mixins);
264
+
265
+ return Component;
266
+ }
267
+
268
+ define.teardownAll = function() {
269
+ registry.components.slice().forEach(function(c) {
270
+ c.component.teardownAll();
271
+ });
272
+ registry.reset();
273
+ };
274
+
275
+ return define;
276
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
277
+
278
+
279
+ /***/ },
280
+ /* 3 */
281
+ /***/ function(module, exports, __webpack_require__) {
282
+
283
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
284
+
285
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
286
+ __webpack_require__(7)
287
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = (function(utils) {
288
+ 'use strict';
289
+
290
+ var dontLock = ['mixedIn', 'attrDef'];
291
+
292
+ function setWritability(obj, writable) {
293
+ Object.keys(obj).forEach(function (key) {
294
+ if (dontLock.indexOf(key) < 0) {
295
+ utils.propertyWritability(obj, key, writable);
296
+ }
297
+ });
44
298
  }
45
299
 
46
- var unresolved, factory, dependencies;
47
- if (typeof loaded[id] == 'undefined') {
48
- unresolved = factories[id];
49
- if (unresolved) {
50
- dependencies = unresolved[0];
51
- factory = unresolved[1];
52
- loaded[id] = factory.apply(undefined, map(dependencies, function(id) {
53
- return require(resolve(id));
54
- }));
300
+ function mixin(base, mixins) {
301
+ base.mixedIn = base.hasOwnProperty('mixedIn') ? base.mixedIn : [];
302
+
303
+ for (var i = 0; i < mixins.length; i++) {
304
+ if (base.mixedIn.indexOf(mixins[i]) == -1) {
305
+ setWritability(base, false);
306
+ mixins[i].call(base);
307
+ base.mixedIn.push(mixins[i]);
308
+ }
55
309
  }
310
+
311
+ setWritability(base, true);
56
312
  }
57
313
 
58
- return loaded[id];
59
- }
314
+ return {
315
+ mixin: mixin
316
+ };
317
+
318
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
319
+
320
+
321
+ /***/ },
322
+ /* 4 */
323
+ /***/ function(module, exports, __webpack_require__) {
60
324
 
61
- // ==========================================
62
- // Copyright 2013 Twitter, Inc
63
- // Licensed under The MIT License
64
- // http://opensource.org/licenses/MIT
65
- // ==========================================
66
- define('lib/debug', [], function () {
325
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
326
+
327
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(6)], __WEBPACK_AMD_DEFINE_RESULT__ = (function(registry) {
67
328
  'use strict';
329
+
68
330
  // ==========================================
69
331
  // Search object model
70
332
  // ==========================================
333
+
71
334
  function traverse(util, searchTerm, options) {
72
- options = options || {};
73
- var obj = options.obj || window;
74
- var path = options.path || (obj == window ? 'window' : '');
75
- var props = Object.keys(obj);
76
- props.forEach(function (prop) {
77
- if ((tests[util] || util)(searchTerm, obj, prop)) {
78
- console.log([
79
- path,
80
- '.',
81
- prop
82
- ].join(''), '->', [
83
- '(',
84
- typeof obj[prop],
85
- ')'
86
- ].join(''), obj[prop]);
87
- }
88
- if (Object.prototype.toString.call(obj[prop]) == '[object Object]' && obj[prop] != obj && path.split('.').indexOf(prop) == -1) {
89
- traverse(util, searchTerm, {
90
- obj: obj[prop],
91
- path: [
92
- path,
93
- prop
94
- ].join('.')
95
- });
96
- }
97
- });
335
+ options = options || {};
336
+ var obj = options.obj || window;
337
+ var path = options.path || ((obj == window) ? 'window' : '');
338
+ var props = Object.keys(obj);
339
+ props.forEach(function(prop) {
340
+ if ((tests[util] || util)(searchTerm, obj, prop)) {
341
+ console.log([path, '.', prop].join(''), '->', ['(', typeof obj[prop], ')'].join(''), obj[prop]);
342
+ }
343
+ if (Object.prototype.toString.call(obj[prop]) == '[object Object]' && (obj[prop] != obj) && path.split('.').indexOf(prop) == -1) {
344
+ traverse(util, searchTerm, {obj: obj[prop], path: [path,prop].join('.')});
345
+ }
346
+ });
98
347
  }
348
+
99
349
  function search(util, expected, searchTerm, options) {
100
- if (!expected || typeof searchTerm == expected) {
101
- traverse(util, searchTerm, options);
102
- } else {
103
- console.error([
104
- searchTerm,
105
- 'must be',
106
- expected
107
- ].join(' '));
108
- }
350
+ if (!expected || typeof searchTerm == expected) {
351
+ traverse(util, searchTerm, options);
352
+ } else {
353
+ console.error([searchTerm, 'must be', expected].join(' '));
354
+ }
109
355
  }
356
+
110
357
  var tests = {
111
- 'name': function (searchTerm, obj, prop) {
112
- return searchTerm == prop;
113
- },
114
- 'nameContains': function (searchTerm, obj, prop) {
115
- return prop.indexOf(searchTerm) > -1;
116
- },
117
- 'type': function (searchTerm, obj, prop) {
118
- return obj[prop] instanceof searchTerm;
119
- },
120
- 'value': function (searchTerm, obj, prop) {
121
- return obj[prop] === searchTerm;
122
- },
123
- 'valueCoerced': function (searchTerm, obj, prop) {
124
- return obj[prop] == searchTerm;
125
- }
126
- };
127
- function byName(searchTerm, options) {
128
- search('name', 'string', searchTerm, options);
129
- }
130
- function byNameContains(searchTerm, options) {
131
- search('nameContains', 'string', searchTerm, options);
132
- }
133
- function byType(searchTerm, options) {
134
- search('type', 'function', searchTerm, options);
135
- }
136
- function byValue(searchTerm, options) {
137
- search('value', null, searchTerm, options);
138
- }
139
- function byValueCoerced(searchTerm, options) {
140
- search('valueCoerced', null, searchTerm, options);
141
- }
142
- function custom(fn, options) {
143
- traverse(fn, null, options);
144
- }
358
+ 'name': function(searchTerm, obj, prop) {return searchTerm == prop;},
359
+ 'nameContains': function(searchTerm, obj, prop) {return prop.indexOf(searchTerm) > -1;},
360
+ 'type': function(searchTerm, obj, prop) {return obj[prop] instanceof searchTerm;},
361
+ 'value': function(searchTerm, obj, prop) {return obj[prop] === searchTerm;},
362
+ 'valueCoerced': function(searchTerm, obj, prop) {return obj[prop] == searchTerm;}
363
+ };
364
+
365
+ function byName(searchTerm, options) {search('name', 'string', searchTerm, options);}
366
+ function byNameContains(searchTerm, options) {search('nameContains', 'string', searchTerm, options);}
367
+ function byType(searchTerm, options) {search('type', 'function', searchTerm, options);}
368
+ function byValue(searchTerm, options) {search('value', null, searchTerm, options);}
369
+ function byValueCoerced(searchTerm, options) {search('valueCoerced', null, searchTerm, options);}
370
+ function custom(fn, options) {traverse(fn, null, options);}
371
+
145
372
  // ==========================================
146
373
  // Event logging
147
374
  // ==========================================
148
- var ALL = 'all';
149
- //no filter
375
+
376
+ var ALL = 'all'; //no filter
377
+
150
378
  //log nothing by default
151
379
  var logFilter = {
152
- eventNames: [],
153
- actions: []
154
- };
155
- function filterEventLogsByAction() {
156
- var actions = [].slice.call(arguments);
157
- logFilter.eventNames.length || (logFilter.eventNames = ALL);
158
- logFilter.actions = actions.length ? actions : ALL;
159
- saveLogFilter();
380
+ eventNames: [],
381
+ actions: []
382
+ }
383
+
384
+ function filterEventLogsByAction(/*actions*/) {
385
+ var actions = [].slice.call(arguments);
386
+
387
+ logFilter.eventNames.length || (logFilter.eventNames = ALL);
388
+ logFilter.actions = actions.length ? actions : ALL;
389
+ saveLogFilter();
160
390
  }
161
- function filterEventLogsByName() {
162
- var eventNames = [].slice.call(arguments);
163
- logFilter.actions.length || (logFilter.actions = ALL);
164
- logFilter.eventNames = eventNames.length ? eventNames : ALL;
165
- saveLogFilter();
391
+
392
+ function filterEventLogsByName(/*eventNames*/) {
393
+ var eventNames = [].slice.call(arguments);
394
+
395
+ logFilter.actions.length || (logFilter.actions = ALL);
396
+ logFilter.eventNames = eventNames.length ? eventNames : ALL;
397
+ saveLogFilter();
166
398
  }
399
+
167
400
  function hideAllEventLogs() {
168
- logFilter.actions = [];
169
- logFilter.eventNames = [];
170
- saveLogFilter();
401
+ logFilter.actions = [];
402
+ logFilter.eventNames = [];
403
+ saveLogFilter();
171
404
  }
405
+
172
406
  function showAllEventLogs() {
173
- logFilter.actions = ALL;
174
- logFilter.eventNames = ALL;
175
- saveLogFilter();
407
+ logFilter.actions = ALL;
408
+ logFilter.eventNames = ALL;
409
+ saveLogFilter();
176
410
  }
411
+
177
412
  function saveLogFilter() {
178
- try {
179
- if (window.localStorage) {
180
- localStorage.setItem('logFilter_eventNames', logFilter.eventNames);
181
- localStorage.setItem('logFilter_actions', logFilter.actions);
182
- }
183
- } catch (ignored) {
413
+ try {
414
+ if (window.localStorage) {
415
+ localStorage.setItem('logFilter_eventNames', logFilter.eventNames);
416
+ localStorage.setItem('logFilter_actions', logFilter.actions);
184
417
  }
185
- ;
418
+ } catch (ignored) {};
186
419
  }
420
+
187
421
  function retrieveLogFilter() {
188
- var eventNames, actions;
189
- try {
190
- eventNames = window.localStorage && localStorage.getItem('logFilter_eventNames');
191
- actions = window.localStorage && localStorage.getItem('logFilter_actions');
192
- } catch (ignored) {
193
- return;
422
+ var eventNames, actions;
423
+ try {
424
+ eventNames = (window.localStorage && localStorage.getItem('logFilter_eventNames'));
425
+ actions = (window.localStorage && localStorage.getItem('logFilter_actions'));
426
+ } catch (ignored) {
427
+ return;
428
+ }
429
+ eventNames && (logFilter.eventNames = eventNames);
430
+ actions && (logFilter.actions = actions);
431
+
432
+ // reconstitute arrays in place
433
+ Object.keys(logFilter).forEach(function(k) {
434
+ var thisProp = logFilter[k];
435
+ if (typeof thisProp == 'string' && thisProp !== ALL) {
436
+ logFilter[k] = thisProp ? thisProp.split(',') : [];
194
437
  }
195
- eventNames && (logFilter.eventNames = eventNames);
196
- actions && (logFilter.actions = actions);
197
- // reconstitute arrays in place
198
- Object.keys(logFilter).forEach(function (k) {
199
- var thisProp = logFilter[k];
200
- if (typeof thisProp == 'string' && thisProp !== ALL) {
201
- logFilter[k] = thisProp ? thisProp.split(',') : [];
202
- }
203
- });
438
+ });
204
439
  }
440
+
205
441
  return {
206
- enable: function (enable) {
207
- this.enabled = !!enable;
208
- if (enable && window.console) {
209
- console.info('Booting in DEBUG mode');
210
- console.info('You can configure event logging with DEBUG.events.logAll()/logNone()/logByName()/logByAction()');
211
- }
212
- retrieveLogFilter();
213
- window.DEBUG = this;
214
- },
215
- find: {
216
- byName: byName,
217
- byNameContains: byNameContains,
218
- byType: byType,
219
- byValue: byValue,
220
- byValueCoerced: byValueCoerced,
221
- custom: custom
222
- },
223
- events: {
224
- logFilter: logFilter,
225
- logByAction: filterEventLogsByAction,
226
- logByName: filterEventLogsByName,
227
- logAll: showAllEventLogs,
228
- logNone: hideAllEventLogs
442
+
443
+ enable: function(enable) {
444
+ this.enabled = !!enable;
445
+
446
+ if (enable && window.console) {
447
+ console.info('Booting in DEBUG mode');
448
+ console.info('You can configure event logging with DEBUG.events.logAll()/logNone()/logByName()/logByAction()');
229
449
  }
450
+
451
+ retrieveLogFilter();
452
+
453
+ window.DEBUG = this;
454
+ },
455
+
456
+ registry: registry,
457
+
458
+ find: {
459
+ byName: byName,
460
+ byNameContains: byNameContains,
461
+ byType: byType,
462
+ byValue: byValue,
463
+ byValueCoerced: byValueCoerced,
464
+ custom: custom
465
+ },
466
+
467
+ events: {
468
+ logFilter: logFilter,
469
+
470
+ // Accepts any number of action args
471
+ // e.g. DEBUG.events.logByAction("on", "off")
472
+ logByAction: filterEventLogsByAction,
473
+
474
+ // Accepts any number of event name args (inc. regex or wildcards)
475
+ // e.g. DEBUG.events.logByName(/ui.*/, "*Thread*");
476
+ logByName: filterEventLogsByName,
477
+
478
+ logAll: showAllEventLogs,
479
+ logNone: hideAllEventLogs
480
+ }
230
481
  };
231
- });
232
- // ==========================================
233
- // Copyright 2013 Twitter, Inc
234
- // Licensed under The MIT License
235
- // http://opensource.org/licenses/MIT
236
- // ==========================================
237
- define('lib/utils', ['./debug'], function (debug) {
482
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
483
+
484
+
485
+ /***/ },
486
+ /* 5 */
487
+ /***/ function(module, exports, __webpack_require__) {
488
+
489
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
490
+
491
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
492
+ __webpack_require__(7)
493
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = (function(utils) {
238
494
  'use strict';
239
- var arry = [];
240
- var DEFAULT_INTERVAL = 100;
241
- function canWriteProtect() {
242
- var writeProtectSupported = debug.enabled && !utils.isEnumerable(Object, 'getOwnPropertyDescriptor');
243
- if (writeProtectSupported) {
244
- //IE8 getOwnPropertyDescriptor is built-in but throws exeption on non DOM objects
245
- try {
246
- Object.getOwnPropertyDescriptor(Object, 'keys');
247
- } catch (e) {
248
- return false;
249
- }
495
+
496
+ var actionSymbols = {
497
+ on: '<-',
498
+ trigger: '->',
499
+ off: 'x '
500
+ };
501
+
502
+ function elemToString(elem) {
503
+ var tagStr = elem.tagName ? elem.tagName.toLowerCase() : elem.toString();
504
+ var classStr = elem.className ? '.' + (elem.className) : '';
505
+ var result = tagStr + classStr;
506
+ return elem.tagName ? ['\'', '\''].join(result) : result;
507
+ }
508
+
509
+ function log(action, component, eventArgs) {
510
+ if (!window.DEBUG || !window.DEBUG.enabled) {
511
+ return;
512
+ }
513
+ var name, eventType, elem, fn, payload, logFilter, toRegExp, actionLoggable, nameLoggable, info;
514
+
515
+ if (typeof eventArgs[eventArgs.length - 1] == 'function') {
516
+ fn = eventArgs.pop();
517
+ fn = fn.unbound || fn; // use unbound version if any (better info)
518
+ }
519
+
520
+ if (eventArgs.length == 1) {
521
+ elem = component.$node[0];
522
+ eventType = eventArgs[0];
523
+ } else if ((eventArgs.length == 2) && typeof eventArgs[1] == 'object' && !eventArgs[1].type) {
524
+ //2 args, first arg is not elem
525
+ elem = component.$node[0];
526
+ eventType = eventArgs[0];
527
+ if (action == "trigger") {
528
+ payload = eventArgs[1];
529
+ }
530
+ } else {
531
+ //2+ args, first arg is elem
532
+ elem = eventArgs[0];
533
+ eventType = eventArgs[1];
534
+ if (action == "trigger") {
535
+ payload = eventArgs[2];
250
536
  }
251
- return writeProtectSupported;
537
+ }
538
+
539
+ name = typeof eventType == 'object' ? eventType.type : eventType;
540
+
541
+ logFilter = DEBUG.events.logFilter;
542
+
543
+ // no regex for you, actions...
544
+ actionLoggable = logFilter.actions == 'all' || (logFilter.actions.indexOf(action) > -1);
545
+ // event name filter allow wildcards or regex...
546
+ toRegExp = function(expr) {
547
+ return expr.test ? expr : new RegExp('^' + expr.replace(/\*/g, '.*') + '$');
548
+ };
549
+ nameLoggable =
550
+ logFilter.eventNames == 'all' ||
551
+ logFilter.eventNames.some(function(e) {return toRegExp(e).test(name);});
552
+
553
+ if (actionLoggable && nameLoggable) {
554
+ info = [actionSymbols[action], action, '[' + name + ']'];
555
+ payload && info.push(payload);
556
+ info.push(elemToString(elem));
557
+ info.push(component.constructor.describe.split(' ').slice(0,3).join(' '));
558
+ console.groupCollapsed && action == 'trigger' && console.groupCollapsed(action, name);
559
+ console.info.apply(console, info);
560
+ }
252
561
  }
253
- var utils = {
254
- isDomObj: function (obj) {
255
- return !!(obj.nodeType || obj === window);
256
- },
257
- toArray: function (obj, from) {
258
- return arry.slice.call(obj, from);
259
- },
260
- merge: function () {
261
- // unpacking arguments by hand benchmarked faster
262
- var l = arguments.length, args = new Array(l + 1);
263
- if (l === 0) {
264
- return {};
265
- }
266
- for (var i = 0; i < l; i++)
267
- args[i + 1] = arguments[i];
268
- //start with empty object so a copy is created
269
- args[0] = {};
270
- if (args[args.length - 1] === true) {
271
- //jquery extend requires deep copy as first arg
272
- args.pop();
273
- args.unshift(true);
274
- }
275
- return $.extend.apply(undefined, args);
276
- },
277
- push: function (base, extra, protect) {
278
- if (base) {
279
- Object.keys(extra || {}).forEach(function (key) {
280
- if (base[key] && protect) {
281
- throw new Error('utils.push attempted to overwrite "' + key + '" while running in protected mode');
282
- }
283
- if (typeof base[key] == 'object' && typeof extra[key] == 'object') {
284
- // recurse
285
- this.push(base[key], extra[key]);
286
- } else {
287
- // no protect, so extra wins
288
- base[key] = extra[key];
289
- }
290
- }, this);
291
- }
292
- return base;
293
- },
294
- isEnumerable: function (obj, property) {
295
- return Object.keys(obj).indexOf(property) > -1;
296
- },
297
- compose: function () {
298
- var funcs = arguments;
299
- return function () {
300
- var args = arguments;
301
- for (var i = funcs.length - 1; i >= 0; i--) {
302
- args = [funcs[i].apply(this, args)];
303
- }
304
- return args[0];
305
- };
306
- },
307
- uniqueArray: function (array) {
308
- var u = {}, a = [];
309
- for (var i = 0, l = array.length; i < l; ++i) {
310
- if (u.hasOwnProperty(array[i])) {
311
- continue;
312
- }
313
- a.push(array[i]);
314
- u[array[i]] = 1;
315
- }
316
- return a;
317
- },
318
- debounce: function (func, wait, immediate) {
319
- if (typeof wait != 'number') {
320
- wait = DEFAULT_INTERVAL;
321
- }
322
- var timeout, result;
323
- return function () {
324
- var context = this, args = arguments;
325
- var later = function () {
326
- timeout = null;
327
- if (!immediate) {
328
- result = func.apply(context, args);
329
- }
330
- };
331
- var callNow = immediate && !timeout;
332
- clearTimeout(timeout);
333
- timeout = setTimeout(later, wait);
334
- if (callNow) {
335
- result = func.apply(context, args);
336
- }
337
- return result;
338
- };
339
- },
340
- throttle: function (func, wait) {
341
- if (typeof wait != 'number') {
342
- wait = DEFAULT_INTERVAL;
343
- }
344
- var context, args, timeout, throttling, more, result;
345
- var whenDone = this.debounce(function () {
346
- more = throttling = false;
347
- }, wait);
348
- return function () {
349
- context = this;
350
- args = arguments;
351
- var later = function () {
352
- timeout = null;
353
- if (more) {
354
- result = func.apply(context, args);
355
- }
356
- whenDone();
357
- };
358
- if (!timeout) {
359
- timeout = setTimeout(later, wait);
360
- }
361
- if (throttling) {
362
- more = true;
363
- } else {
364
- throttling = true;
365
- result = func.apply(context, args);
366
- }
367
- whenDone();
368
- return result;
369
- };
370
- },
371
- countThen: function (num, base) {
372
- return function () {
373
- if (!--num) {
374
- return base.apply(this, arguments);
375
- }
376
- };
377
- },
378
- delegate: function (rules) {
379
- return function (e, data) {
380
- var target = $(e.target), parent;
381
- Object.keys(rules).forEach(function (selector) {
382
- if (!e.isPropagationStopped() && (parent = target.closest(selector)).length) {
383
- data = data || {};
384
- data.el = parent[0];
385
- return rules[selector].apply(this, [
386
- e,
387
- data
388
- ]);
389
- }
390
- }, this);
391
- };
392
- },
393
- once: function (func) {
394
- var ran, result;
395
- return function () {
396
- if (ran) {
397
- return result;
398
- }
399
- ran = true;
400
- result = func.apply(this, arguments);
401
- return result;
402
- };
403
- },
404
- propertyWritability: function (obj, prop, writable) {
405
- if (canWriteProtect() && obj.hasOwnProperty(prop)) {
406
- Object.defineProperty(obj, prop, { writable: writable });
407
- }
408
- },
409
- mutateProperty: function (obj, prop, op) {
410
- var writable;
411
- if (!canWriteProtect() || !obj.hasOwnProperty(prop)) {
412
- op.call(obj);
413
- return;
414
- }
415
- writable = Object.getOwnPropertyDescriptor(obj, prop).writable;
416
- Object.defineProperty(obj, prop, { writable: true });
417
- op.call(obj);
418
- Object.defineProperty(obj, prop, { writable: writable });
419
- }
420
- };
421
- return utils;
422
- });
423
- // ==========================================
424
- // Copyright 2013 Twitter, Inc
425
- // Licensed under The MIT License
426
- // http://opensource.org/licenses/MIT
427
- // ==========================================
428
- define('lib/compose', ['./utils'], function (utils) {
429
- 'use strict';
430
- var dontLock = ['mixedIn'];
431
- function setWritability(obj, writable) {
432
- var props = Object.create(null);
433
- Object.keys(obj).forEach(function (key) {
434
- if (dontLock.indexOf(key) < 0) {
435
- utils.propertyWritability(obj, key, writable);
436
- }
562
+
563
+ function withLogging() {
564
+ this.before('trigger', function() {
565
+ log('trigger', this, utils.toArray(arguments));
566
+ });
567
+ if (console.groupCollapsed) {
568
+ this.after('trigger', function() {
569
+ console.groupEnd();
437
570
  });
571
+ }
572
+ this.before('on', function() {
573
+ log('on', this, utils.toArray(arguments));
574
+ });
575
+ this.before('off', function() {
576
+ log('off', this, utils.toArray(arguments));
577
+ });
438
578
  }
439
- function mixin(base, mixins) {
440
- base.mixedIn = base.hasOwnProperty('mixedIn') ? base.mixedIn : [];
441
- for (var i = 0; i < mixins.length; i++) {
442
- if (base.mixedIn.indexOf(mixins[i]) == -1) {
443
- setWritability(base, false);
444
- mixins[i].call(base);
445
- base.mixedIn.push(mixins[i]);
446
- }
447
- }
448
- setWritability(base, true);
449
- }
450
- return { mixin: mixin };
451
- });
452
- // ==========================================
453
- // Copyright 2013 Twitter, Inc
454
- // Licensed under The MIT License
455
- // http://opensource.org/licenses/MIT
456
- // ==========================================
457
- define('lib/advice', [
458
- './compose',
459
- './utils'
460
- ], function (compose, utils) {
461
- 'use strict';
462
- var advice = {
463
- around: function (base, wrapped) {
464
- return function composedAround() {
465
- // unpacking arguments by hand benchmarked faster
466
- var i = 0, l = arguments.length, args = new Array(l + 1);
467
- args[0] = base.bind(this);
468
- for (; i < l; i++)
469
- args[i + 1] = arguments[i];
470
- return wrapped.apply(this, args);
471
- };
472
- },
473
- before: function (base, before) {
474
- var beforeFn = typeof before == 'function' ? before : before.obj[before.fnName];
475
- return function composedBefore() {
476
- beforeFn.apply(this, arguments);
477
- return base.apply(this, arguments);
478
- };
479
- },
480
- after: function (base, after) {
481
- var afterFn = typeof after == 'function' ? after : after.obj[after.fnName];
482
- return function composedAfter() {
483
- var res = (base.unbound || base).apply(this, arguments);
484
- afterFn.apply(this, arguments);
485
- return res;
486
- };
487
- },
488
- withAdvice: function () {
489
- [
490
- 'before',
491
- 'after',
492
- 'around'
493
- ].forEach(function (m) {
494
- this[m] = function (method, fn) {
495
- utils.mutateProperty(this, method, function () {
496
- if (typeof this[method] == 'function') {
497
- this[method] = advice[m](this[method], fn);
498
- } else {
499
- this[method] = fn;
500
- }
501
- return this[method];
502
- });
503
- };
504
- }, this);
505
- }
506
- };
507
- return advice;
508
- });
509
- // ==========================================
510
- // Copyright 2013 Twitter, Inc
511
- // Licensed under The MIT License
512
- // http://opensource.org/licenses/MIT
513
- // ==========================================
514
- define('lib/registry', [], function () {
579
+
580
+ return withLogging;
581
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
582
+
583
+
584
+ /***/ },
585
+ /* 6 */
586
+ /***/ function(module, exports, __webpack_require__) {
587
+
588
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
589
+
590
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {
515
591
  'use strict';
592
+
516
593
  function parseEventArgs(instance, args) {
517
- var element, type, callback;
518
- var end = args.length;
519
- if (typeof args[end - 1] === 'function') {
520
- end -= 1;
521
- callback = args[end];
522
- }
523
- if (typeof args[end - 1] === 'object') {
524
- end -= 1;
525
- }
526
- if (end == 2) {
527
- element = args[0];
528
- type = args[1];
529
- } else {
530
- element = instance.node;
531
- type = args[0];
532
- }
533
- return {
534
- element: element,
535
- type: type,
536
- callback: callback
537
- };
594
+ var element, type, callback;
595
+ var end = args.length;
596
+
597
+ if (typeof args[end - 1] === 'function') {
598
+ end -= 1;
599
+ callback = args[end];
600
+ }
601
+
602
+ if (typeof args[end - 1] === 'object') {
603
+ end -= 1;
604
+ }
605
+
606
+ if (end == 2) {
607
+ element = args[0];
608
+ type = args[1];
609
+ } else {
610
+ element = instance.node;
611
+ type = args[0];
612
+ }
613
+
614
+ return {
615
+ element: element,
616
+ type: type,
617
+ callback: callback
618
+ };
538
619
  }
620
+
539
621
  function matchEvent(a, b) {
540
- return a.element == b.element && a.type == b.type && (b.callback == null || a.callback == b.callback);
622
+ return (
623
+ (a.element == b.element) &&
624
+ (a.type == b.type) &&
625
+ (b.callback == null || (a.callback == b.callback))
626
+ );
541
627
  }
628
+
542
629
  function Registry() {
543
- var registry = this;
544
- (this.reset = function () {
545
- this.components = [];
546
- this.allInstances = {};
547
- this.events = [];
548
- }).call(this);
549
- function ComponentInfo(component) {
550
- this.component = component;
551
- this.attachedTo = [];
552
- this.instances = {};
553
- this.addInstance = function (instance) {
554
- var instanceInfo = new InstanceInfo(instance);
555
- this.instances[instance.identity] = instanceInfo;
556
- this.attachedTo.push(instance.node);
557
- return instanceInfo;
558
- };
559
- this.removeInstance = function (instance) {
560
- delete this.instances[instance.identity];
561
- var indexOfNode = this.attachedTo.indexOf(instance.node);
562
- indexOfNode > -1 && this.attachedTo.splice(indexOfNode, 1);
563
- if (!Object.keys(this.instances).length) {
564
- //if I hold no more instances remove me from registry
565
- registry.removeComponentInfo(this);
566
- }
567
- };
568
- this.isAttachedTo = function (node) {
569
- return this.attachedTo.indexOf(node) > -1;
570
- };
571
- }
572
- function InstanceInfo(instance) {
573
- this.instance = instance;
574
- this.events = [];
575
- this.addBind = function (event) {
576
- this.events.push(event);
577
- registry.events.push(event);
578
- };
579
- this.removeBind = function (event) {
580
- for (var i = 0, e; e = this.events[i]; i++) {
581
- if (matchEvent(e, event)) {
582
- this.events.splice(i, 1);
583
- }
584
- }
585
- };
586
- }
587
- this.addInstance = function (instance) {
588
- var component = this.findComponentInfo(instance);
589
- if (!component) {
590
- component = new ComponentInfo(instance.constructor);
591
- this.components.push(component);
592
- }
593
- var inst = component.addInstance(instance);
594
- this.allInstances[instance.identity] = inst;
595
- return component;
596
- };
597
- this.removeInstance = function (instance) {
598
- var index, instInfo = this.findInstanceInfo(instance);
599
- //remove from component info
600
- var componentInfo = this.findComponentInfo(instance);
601
- componentInfo && componentInfo.removeInstance(instance);
602
- //remove from registry
603
- delete this.allInstances[instance.identity];
604
- };
605
- this.removeComponentInfo = function (componentInfo) {
606
- var index = this.components.indexOf(componentInfo);
607
- index > -1 && this.components.splice(index, 1);
608
- };
609
- this.findComponentInfo = function (which) {
610
- var component = which.attachTo ? which : which.constructor;
611
- for (var i = 0, c; c = this.components[i]; i++) {
612
- if (c.component === component) {
613
- return c;
614
- }
615
- }
616
- return null;
617
- };
618
- this.findInstanceInfo = function (instance) {
619
- return this.allInstances[instance.identity] || null;
630
+
631
+ var registry = this;
632
+
633
+ (this.reset = function() {
634
+ this.components = [];
635
+ this.allInstances = {};
636
+ this.events = [];
637
+ }).call(this);
638
+
639
+ function ComponentInfo(component) {
640
+ this.component = component;
641
+ this.attachedTo = [];
642
+ this.instances = {};
643
+
644
+ this.addInstance = function(instance) {
645
+ var instanceInfo = new InstanceInfo(instance);
646
+ this.instances[instance.identity] = instanceInfo;
647
+ this.attachedTo.push(instance.node);
648
+
649
+ return instanceInfo;
620
650
  };
621
- this.getBoundEventNames = function (instance) {
622
- return this.findInstanceInfo(instance).events.map(function (ev) {
623
- return ev.type;
624
- });
651
+
652
+ this.removeInstance = function(instance) {
653
+ delete this.instances[instance.identity];
654
+ var indexOfNode = this.attachedTo.indexOf(instance.node);
655
+ (indexOfNode > -1) && this.attachedTo.splice(indexOfNode, 1);
656
+
657
+ if (!Object.keys(this.instances).length) {
658
+ //if I hold no more instances remove me from registry
659
+ registry.removeComponentInfo(this);
660
+ }
625
661
  };
626
- this.findInstanceInfoByNode = function (node) {
627
- var result = [];
628
- Object.keys(this.allInstances).forEach(function (k) {
629
- var thisInstanceInfo = this.allInstances[k];
630
- if (thisInstanceInfo.instance.node === node) {
631
- result.push(thisInstanceInfo);
632
- }
633
- }, this);
634
- return result;
662
+
663
+ this.isAttachedTo = function(node) {
664
+ return this.attachedTo.indexOf(node) > -1;
635
665
  };
636
- this.on = function (componentOn) {
637
- var instance = registry.findInstanceInfo(this), boundCallback;
638
- // unpacking arguments by hand benchmarked faster
639
- var l = arguments.length, i = 1;
640
- var otherArgs = new Array(l - 1);
641
- for (; i < l; i++)
642
- otherArgs[i - 1] = arguments[i];
643
- if (instance) {
644
- boundCallback = componentOn.apply(null, otherArgs);
645
- if (boundCallback) {
646
- otherArgs[otherArgs.length - 1] = boundCallback;
647
- }
648
- var event = parseEventArgs(this, otherArgs);
649
- instance.addBind(event);
650
- }
666
+ }
667
+
668
+ function InstanceInfo(instance) {
669
+ this.instance = instance;
670
+ this.events = [];
671
+
672
+ this.addBind = function(event) {
673
+ this.events.push(event);
674
+ registry.events.push(event);
651
675
  };
652
- this.off = function () {
653
- var event = parseEventArgs(this, arguments), instance = registry.findInstanceInfo(this);
654
- if (instance) {
655
- instance.removeBind(event);
656
- }
657
- //remove from global event registry
658
- for (var i = 0, e; e = registry.events[i]; i++) {
659
- if (matchEvent(e, event)) {
660
- registry.events.splice(i, 1);
661
- }
676
+
677
+ this.removeBind = function(event) {
678
+ for (var i = 0, e; e = this.events[i]; i++) {
679
+ if (matchEvent(e, event)) {
680
+ this.events.splice(i, 1);
662
681
  }
682
+ }
663
683
  };
664
- // debug tools may want to add advice to trigger
665
- registry.trigger = function () {
666
- };
667
- this.teardown = function () {
668
- registry.removeInstance(this);
669
- };
670
- this.withRegistration = function () {
671
- this.after('initialize', function () {
672
- registry.addInstance(this);
673
- });
674
- this.around('on', registry.on);
675
- this.after('off', registry.off);
676
- //debug tools may want to add advice to trigger
677
- window.DEBUG && DEBUG.enabled && this.after('trigger', registry.trigger);
678
- this.after('teardown', {
679
- obj: registry,
680
- fnName: 'teardown'
681
- });
682
- };
683
- }
684
- return new Registry();
685
- });
686
- // ==========================================
687
- // Copyright 2013 Twitter, Inc
688
- // Licensed under The MIT License
689
- // http://opensource.org/licenses/MIT
690
- // ==========================================
691
- define('lib/base', [
692
- './utils',
693
- './registry',
694
- './debug'
695
- ], function (utils, registry, debug) {
696
- 'use strict';
697
- // common mixin allocates basic functionality - used by all component prototypes
698
- // callback context is bound to component
699
- var componentId = 0;
700
- function teardownInstance(instanceInfo) {
701
- instanceInfo.events.slice().forEach(function (event) {
702
- var args = [event.type];
703
- event.element && args.unshift(event.element);
704
- typeof event.callback == 'function' && args.push(event.callback);
705
- this.off.apply(this, args);
706
- }, instanceInfo.instance);
707
- }
708
- function checkSerializable(type, data) {
709
- try {
710
- window.postMessage(data, '*');
711
- } catch (e) {
712
- console.log('unserializable data for event', type, ':', data);
713
- throw new Error([
714
- 'The event',
715
- type,
716
- 'on component',
717
- this.toString(),
718
- 'was triggered with non-serializable data'
719
- ].join(' '));
720
- }
721
- }
722
- function initAttributes(attrs) {
723
- var definedKeys = [], incomingKeys;
724
- this.attr = new this.attrDef();
725
- if (debug.enabled && window.console) {
726
- for (var key in this.attrDef.prototype)
727
- definedKeys.push(key);
728
- incomingKeys = Object.keys(attrs);
729
- for (var i = incomingKeys.length - 1; i >= 0; i--) {
730
- if (definedKeys.indexOf(incomingKeys[i]) == -1) {
731
- console.warn('Passed unused attributes including "' + incomingKeys[i] + '" to component "' + this.toString() + '".');
732
- break;
733
- }
734
- }
684
+ }
685
+
686
+ this.addInstance = function(instance) {
687
+ var component = this.findComponentInfo(instance);
688
+
689
+ if (!component) {
690
+ component = new ComponentInfo(instance.constructor);
691
+ this.components.push(component);
735
692
  }
736
- for (var key in this.attrDef.prototype) {
737
- if (typeof attrs[key] == 'undefined') {
738
- if (this.attr[key] == null) {
739
- throw new Error('Required attribute "' + key + '" not specified in attachTo for component "' + this.toString() + '".');
740
- }
741
- } else {
742
- this.attr[key] = attrs[key];
743
- }
744
- }
745
- }
746
- function initDeprecatedAttributes(attrs) {
747
- // merge defaults with supplied options
748
- // put options in attr.__proto__ to avoid merge overhead
749
- var attr = Object.create(attrs);
750
- for (var key in this.defaults) {
751
- if (!attrs.hasOwnProperty(key)) {
752
- attr[key] = this.defaults[key];
753
- }
693
+
694
+ var inst = component.addInstance(instance);
695
+
696
+ this.allInstances[instance.identity] = inst;
697
+
698
+ return component;
699
+ };
700
+
701
+ this.removeInstance = function(instance) {
702
+ //remove from component info
703
+ var componentInfo = this.findComponentInfo(instance);
704
+ componentInfo && componentInfo.removeInstance(instance);
705
+
706
+ //remove from registry
707
+ delete this.allInstances[instance.identity];
708
+ };
709
+
710
+ this.removeComponentInfo = function(componentInfo) {
711
+ var index = this.components.indexOf(componentInfo);
712
+ (index > -1) && this.components.splice(index, 1);
713
+ };
714
+
715
+ this.findComponentInfo = function(which) {
716
+ var component = which.attachTo ? which : which.constructor;
717
+
718
+ for (var i = 0, c; c = this.components[i]; i++) {
719
+ if (c.component === component) {
720
+ return c;
721
+ }
754
722
  }
755
- this.attr = attr;
756
- Object.keys(this.defaults || {}).forEach(function (key) {
757
- if (this.defaults[key] === null && this.attr[key] === null) {
758
- throw new Error('Required attribute "' + key + '" not specified in attachTo for component "' + this.toString() + '".');
759
- }
723
+
724
+ return null;
725
+ };
726
+
727
+ this.findInstanceInfo = function(instance) {
728
+ return this.allInstances[instance.identity] || null;
729
+ };
730
+
731
+ this.getBoundEventNames = function(instance) {
732
+ return this.findInstanceInfo(instance).events.map(function(ev) {
733
+ return ev.type;
734
+ });
735
+ };
736
+
737
+ this.findInstanceInfoByNode = function(node) {
738
+ var result = [];
739
+ Object.keys(this.allInstances).forEach(function(k) {
740
+ var thisInstanceInfo = this.allInstances[k];
741
+ if (thisInstanceInfo.instance.node === node) {
742
+ result.push(thisInstanceInfo);
743
+ }
760
744
  }, this);
745
+ return result;
746
+ };
747
+
748
+ this.on = function(componentOn) {
749
+ var instance = registry.findInstanceInfo(this), boundCallback;
750
+
751
+ // unpacking arguments by hand benchmarked faster
752
+ var l = arguments.length, i = 1;
753
+ var otherArgs = new Array(l - 1);
754
+ for (; i < l; i++) {
755
+ otherArgs[i - 1] = arguments[i];
756
+ }
757
+
758
+ if (instance) {
759
+ boundCallback = componentOn.apply(null, otherArgs);
760
+ if (boundCallback) {
761
+ otherArgs[otherArgs.length - 1] = boundCallback;
762
+ }
763
+ var event = parseEventArgs(this, otherArgs);
764
+ instance.addBind(event);
765
+ }
766
+ };
767
+
768
+ this.off = function(/*el, type, callback*/) {
769
+ var event = parseEventArgs(this, arguments),
770
+ instance = registry.findInstanceInfo(this);
771
+
772
+ if (instance) {
773
+ instance.removeBind(event);
774
+ }
775
+
776
+ //remove from global event registry
777
+ for (var i = 0, e; e = registry.events[i]; i++) {
778
+ if (matchEvent(e, event)) {
779
+ registry.events.splice(i, 1);
780
+ }
781
+ }
782
+ };
783
+
784
+ // debug tools may want to add advice to trigger
785
+ registry.trigger = function() {};
786
+
787
+ this.teardown = function() {
788
+ registry.removeInstance(this);
789
+ };
790
+
791
+ this.withRegistration = function() {
792
+ this.after('initialize', function() {
793
+ registry.addInstance(this);
794
+ });
795
+
796
+ this.around('on', registry.on);
797
+ this.after('off', registry.off);
798
+ //debug tools may want to add advice to trigger
799
+ window.DEBUG && (false).enabled && this.after('trigger', registry.trigger);
800
+ this.after('teardown', {obj: registry, fnName: 'teardown'});
801
+ };
802
+
761
803
  }
762
- function proxyEventTo(targetEvent) {
763
- return function (e, data) {
764
- $(e.target).trigger(targetEvent, data);
765
- };
804
+
805
+ return new Registry;
806
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
807
+
808
+
809
+ /***/ },
810
+ /* 7 */
811
+ /***/ function(module, exports, __webpack_require__) {
812
+
813
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
814
+
815
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = (function(debug) {
816
+ 'use strict';
817
+
818
+ var DEFAULT_INTERVAL = 100;
819
+
820
+ function canWriteProtect() {
821
+ var writeProtectSupported = debug.enabled && !Object.propertyIsEnumerable('getOwnPropertyDescriptor');
822
+ if (writeProtectSupported) {
823
+ //IE8 getOwnPropertyDescriptor is built-in but throws exeption on non DOM objects
824
+ try {
825
+ Object.getOwnPropertyDescriptor(Object, 'keys');
826
+ } catch (e) {
827
+ return false;
828
+ }
829
+ }
830
+
831
+ return writeProtectSupported;
766
832
  }
767
- function withBase() {
768
- // delegate trigger, bind and unbind to an element
769
- // if $element not supplied, use component's node
770
- // other arguments are passed on
771
- // event can be either a string specifying the type
772
- // of the event, or a hash specifying both the type
773
- // and a default function to be called.
774
- this.trigger = function () {
775
- var $element, type, data, event, defaultFn;
776
- var lastIndex = arguments.length - 1, lastArg = arguments[lastIndex];
777
- if (typeof lastArg != 'string' && !(lastArg && lastArg.defaultBehavior)) {
778
- lastIndex--;
779
- data = lastArg;
780
- }
781
- if (lastIndex == 1) {
782
- $element = $(arguments[0]);
783
- event = arguments[1];
784
- } else {
785
- $element = this.$node;
786
- event = arguments[0];
787
- }
788
- if (event.defaultBehavior) {
789
- defaultFn = event.defaultBehavior;
790
- event = $.Event(event.type);
791
- }
792
- type = event.type || event;
793
- if (debug.enabled && window.postMessage) {
794
- checkSerializable.call(this, type, data);
795
- }
796
- if (typeof this.attr.eventData === 'object') {
797
- data = $.extend(true, {}, this.attr.eventData, data);
798
- }
799
- $element.trigger(event || type, data);
800
- if (defaultFn && !event.isDefaultPrevented()) {
801
- (this[defaultFn] || defaultFn).call(this);
802
- }
803
- return $element;
804
- };
805
- this.on = function () {
806
- var $element, type, callback, originalCb;
807
- var lastIndex = arguments.length - 1, origin = arguments[lastIndex];
808
- if (typeof origin == 'object') {
809
- //delegate callback
810
- originalCb = utils.delegate(this.resolveDelegateRules(origin));
811
- } else if (typeof origin == 'string') {
812
- originalCb = proxyEventTo(origin);
813
- } else {
814
- originalCb = origin;
833
+
834
+ var utils = {
835
+
836
+ isDomObj: function(obj) {
837
+ return !!(obj.nodeType || (obj === window));
838
+ },
839
+
840
+ toArray: function(obj, from) {
841
+ from = from || 0;
842
+ var len = obj.length, arr = new Array(len - from);
843
+ for (var i = from; i < len; i++) {
844
+ arr[i - from] = obj[i];
845
+ }
846
+ return arr;
847
+ },
848
+
849
+ // returns new object representing multiple objects merged together
850
+ // optional final argument is boolean which specifies if merge is recursive
851
+ // original objects are unmodified
852
+ //
853
+ // usage:
854
+ // var base = {a:2, b:6};
855
+ // var extra = {b:3, c:4};
856
+ // merge(base, extra); //{a:2, b:3, c:4}
857
+ // base; //{a:2, b:6}
858
+ //
859
+ // var base = {a:2, b:6};
860
+ // var extra = {b:3, c:4};
861
+ // var extraExtra = {a:4, d:9};
862
+ // merge(base, extra, extraExtra); //{a:4, b:3, c:4. d: 9}
863
+ // base; //{a:2, b:6}
864
+ //
865
+ // var base = {a:2, b:{bb:4, cc:5}};
866
+ // var extra = {a:4, b:{cc:7, dd:1}};
867
+ // merge(base, extra, true); //{a:4, b:{bb:4, cc:7, dd:1}}
868
+ // base; //{a:2, b:6}
869
+
870
+ merge: function(/*obj1, obj2,....deepCopy*/) {
871
+ // unpacking arguments by hand benchmarked faster
872
+ var l = arguments.length,
873
+ args = new Array(l + 1);
874
+
875
+ if (l === 0) {
876
+ return {};
877
+ }
878
+
879
+ for (var i = 0; i < l; i++) {
880
+ args[i + 1] = arguments[i];
881
+ }
882
+
883
+ //start with empty object so a copy is created
884
+ args[0] = {};
885
+
886
+ if (args[args.length - 1] === true) {
887
+ //jquery extend requires deep copy as first arg
888
+ args.pop();
889
+ args.unshift(true);
890
+ }
891
+
892
+ return $.extend.apply(undefined, args);
893
+ },
894
+
895
+ // updates base in place by copying properties of extra to it
896
+ // optionally clobber protected
897
+ // usage:
898
+ // var base = {a:2, b:6};
899
+ // var extra = {c:4};
900
+ // push(base, extra); //{a:2, b:6, c:4}
901
+ // base; //{a:2, b:6, c:4}
902
+ //
903
+ // var base = {a:2, b:6};
904
+ // var extra = {b: 4 c:4};
905
+ // push(base, extra, true); //Error ("utils.push attempted to overwrite 'b' while running in protected mode")
906
+ // base; //{a:2, b:6}
907
+ //
908
+ // objects with the same key will merge recursively when protect is false
909
+ // eg:
910
+ // var base = {a:16, b:{bb:4, cc:10}};
911
+ // var extra = {b:{cc:25, dd:19}, c:5};
912
+ // push(base, extra); //{a:16, {bb:4, cc:25, dd:19}, c:5}
913
+ //
914
+ push: function(base, extra, protect) {
915
+ if (base) {
916
+ Object.keys(extra || {}).forEach(function(key) {
917
+ if (base[key] && protect) {
918
+ throw new Error('utils.push attempted to overwrite "' + key + '" while running in protected mode');
815
919
  }
816
- if (lastIndex == 2) {
817
- $element = $(arguments[0]);
818
- type = arguments[1];
920
+
921
+ if (typeof base[key] == 'object' && typeof extra[key] == 'object') {
922
+ // recurse
923
+ this.push(base[key], extra[key]);
819
924
  } else {
820
- $element = this.$node;
821
- type = arguments[0];
822
- }
823
- if (typeof originalCb != 'function' && typeof originalCb != 'object') {
824
- throw new Error('Unable to bind to "' + type + '" because the given callback is not a function or an object');
925
+ // no protect, so extra wins
926
+ base[key] = extra[key];
825
927
  }
826
- callback = originalCb.bind(this);
827
- callback.target = originalCb;
828
- callback.context = this;
829
- $element.on(type, callback);
830
- // store every bound version of the callback
831
- originalCb.bound || (originalCb.bound = []);
832
- originalCb.bound.push(callback);
833
- return callback;
928
+ }, this);
929
+ }
930
+
931
+ return base;
932
+ },
933
+
934
+ // If obj.key points to an enumerable property, return its value
935
+ // If obj.key points to a non-enumerable property, return undefined
936
+ getEnumerableProperty: function(obj, key) {
937
+ return obj.propertyIsEnumerable(key) ? obj[key] : undefined;
938
+ },
939
+
940
+ // build a function from other function(s)
941
+ // utils.compose(a,b,c) -> a(b(c()));
942
+ // implementation lifted from underscore.js (c) 2009-2012 Jeremy Ashkenas
943
+ compose: function() {
944
+ var funcs = arguments;
945
+
946
+ return function() {
947
+ var args = arguments;
948
+
949
+ for (var i = funcs.length - 1; i >= 0; i--) {
950
+ args = [funcs[i].apply(this, args)];
951
+ }
952
+
953
+ return args[0];
834
954
  };
835
- this.off = function () {
836
- var $element, type, callback;
837
- var lastIndex = arguments.length - 1;
838
- if (typeof arguments[lastIndex] == 'function') {
839
- callback = arguments[lastIndex];
840
- lastIndex -= 1;
841
- }
842
- if (lastIndex == 1) {
843
- $element = $(arguments[0]);
844
- type = arguments[1];
845
- } else {
846
- $element = this.$node;
847
- type = arguments[0];
848
- }
849
- if (callback) {
850
- //this callback may be the original function or a bound version
851
- var boundFunctions = callback.target ? callback.target.bound : callback.bound || [];
852
- //set callback to version bound against this instance
853
- boundFunctions && boundFunctions.some(function (fn, i, arr) {
854
- if (fn.context && this.identity == fn.context.identity) {
855
- arr.splice(i, 1);
856
- callback = fn;
857
- return true;
858
- }
859
- }, this);
955
+ },
956
+
957
+ // Can only unique arrays of homogeneous primitives, e.g. an array of only strings, an array of only booleans, or an array of only numerics
958
+ uniqueArray: function(array) {
959
+ var u = {}, a = [];
960
+
961
+ for (var i = 0, l = array.length; i < l; ++i) {
962
+ if (u.hasOwnProperty(array[i])) {
963
+ continue;
964
+ }
965
+
966
+ a.push(array[i]);
967
+ u[array[i]] = 1;
968
+ }
969
+
970
+ return a;
971
+ },
972
+
973
+ debounce: function(func, wait, immediate) {
974
+ if (typeof wait != 'number') {
975
+ wait = DEFAULT_INTERVAL;
976
+ }
977
+
978
+ var timeout, result;
979
+
980
+ return function() {
981
+ var context = this, args = arguments;
982
+ var later = function() {
983
+ timeout = null;
984
+ if (!immediate) {
985
+ result = func.apply(context, args);
860
986
  }
861
- return $element.off(type, callback);
862
- };
863
- this.resolveDelegateRules = function (ruleInfo) {
864
- var rules = {};
865
- Object.keys(ruleInfo).forEach(function (r) {
866
- if (!(r in this.attr)) {
867
- throw new Error('Component "' + this.toString() + '" wants to listen on "' + r + '" but no such attribute was defined.');
868
- }
869
- rules[this.attr[r]] = typeof ruleInfo[r] == 'string' ? proxyEventTo(ruleInfo[r]) : ruleInfo[r];
870
- }, this);
871
- return rules;
872
- };
873
- this.select = function (attributeKey) {
874
- return this.$node.find(this.attr[attributeKey]);
987
+ };
988
+ var callNow = immediate && !timeout;
989
+
990
+ timeout && clearTimeout(timeout);
991
+ timeout = setTimeout(later, wait);
992
+
993
+ if (callNow) {
994
+ result = func.apply(context, args);
995
+ }
996
+
997
+ return result;
875
998
  };
876
- // New-style attributes
877
- this.attributes = function (attrs) {
878
- var Attributes = function () {
879
- };
880
- if (this.attrDef) {
881
- Attributes.prototype = new this.attrDef();
882
- }
883
- for (var name in attrs) {
884
- Attributes.prototype[name] = attrs[name];
999
+ },
1000
+
1001
+ throttle: function(func, wait) {
1002
+ if (typeof wait != 'number') {
1003
+ wait = DEFAULT_INTERVAL;
1004
+ }
1005
+
1006
+ var context, args, timeout, throttling, more, result;
1007
+ var whenDone = this.debounce(function() {
1008
+ more = throttling = false;
1009
+ }, wait);
1010
+
1011
+ return function() {
1012
+ context = this; args = arguments;
1013
+ var later = function() {
1014
+ timeout = null;
1015
+ if (more) {
1016
+ result = func.apply(context, args);
885
1017
  }
886
- this.attrDef = Attributes;
1018
+ whenDone();
1019
+ };
1020
+
1021
+ if (!timeout) {
1022
+ timeout = setTimeout(later, wait);
1023
+ }
1024
+
1025
+ if (throttling) {
1026
+ more = true;
1027
+ } else {
1028
+ throttling = true;
1029
+ result = func.apply(context, args);
1030
+ }
1031
+
1032
+ whenDone();
1033
+ return result;
887
1034
  };
888
- // Deprecated attributes
889
- this.defaultAttrs = function (defaults) {
890
- utils.push(this.defaults, defaults, true) || (this.defaults = defaults);
1035
+ },
1036
+
1037
+ countThen: function(num, base) {
1038
+ return function() {
1039
+ if (!--num) { return base.apply(this, arguments); }
891
1040
  };
892
- this.initialize = function (node, attrs) {
893
- attrs = attrs || {};
894
- this.identity || (this.identity = componentId++);
895
- if (!node) {
896
- throw new Error('Component needs a node');
897
- }
898
- if (node.jquery) {
899
- this.node = node[0];
900
- this.$node = node;
901
- } else {
902
- this.node = node;
903
- this.$node = $(node);
904
- }
905
- if (this.attrDef) {
906
- initAttributes.call(this, attrs);
907
- } else {
908
- initDeprecatedAttributes.call(this, attrs);
1041
+ },
1042
+
1043
+ delegate: function(rules) {
1044
+ return function(e, data) {
1045
+ var target = $(e.target), parent;
1046
+
1047
+ Object.keys(rules).forEach(function(selector) {
1048
+ if (!e.isPropagationStopped() && (parent = target.closest(selector)).length) {
1049
+ data = data || {};
1050
+ data.el = parent[0];
1051
+ return rules[selector].apply(this, [e, data]);
909
1052
  }
910
- return this;
1053
+ }, this);
911
1054
  };
912
- this.teardown = function () {
913
- teardownInstance(registry.findInstanceInfo(this));
1055
+ },
1056
+
1057
+ // ensures that a function will only be called once.
1058
+ // usage:
1059
+ // will only create the application once
1060
+ // var initialize = utils.once(createApplication)
1061
+ // initialize();
1062
+ // initialize();
1063
+ //
1064
+ // will only delete a record once
1065
+ // var myHanlder = function () {
1066
+ // $.ajax({type: 'DELETE', url: 'someurl.com', data: {id: 1}});
1067
+ // };
1068
+ // this.on('click', utils.once(myHandler));
1069
+ //
1070
+ once: function(func) {
1071
+ var ran, result;
1072
+
1073
+ return function() {
1074
+ if (ran) {
1075
+ return result;
1076
+ }
1077
+
1078
+ ran = true;
1079
+ result = func.apply(this, arguments);
1080
+
1081
+ return result;
914
1082
  };
915
- }
916
- return withBase;
917
- });
918
- // ==========================================
919
- // Copyright 2013 Twitter, Inc
920
- // Licensed under The MIT License
921
- // http://opensource.org/licenses/MIT
922
- // ==========================================
923
- define('lib/logger', ['./utils'], function (utils) {
1083
+ },
1084
+
1085
+ propertyWritability: function(obj, prop, writable) {
1086
+ if (canWriteProtect() && obj.hasOwnProperty(prop)) {
1087
+ Object.defineProperty(obj, prop, { writable: writable });
1088
+ }
1089
+ },
1090
+
1091
+ // Property locking/unlocking
1092
+ mutateProperty: function(obj, prop, op) {
1093
+ var writable;
1094
+
1095
+ if (!canWriteProtect() || !obj.hasOwnProperty(prop)) {
1096
+ op.call(obj);
1097
+ return;
1098
+ }
1099
+
1100
+ writable = Object.getOwnPropertyDescriptor(obj, prop).writable;
1101
+
1102
+ Object.defineProperty(obj, prop, { writable: true });
1103
+ op.call(obj);
1104
+ Object.defineProperty(obj, prop, { writable: writable });
1105
+
1106
+ }
1107
+
1108
+ };
1109
+
1110
+ return utils;
1111
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1112
+
1113
+
1114
+ /***/ },
1115
+ /* 8 */
1116
+ /***/ function(module, exports, __webpack_require__) {
1117
+
1118
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
1119
+
1120
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
1121
+ __webpack_require__(7),
1122
+ __webpack_require__(6),
1123
+ __webpack_require__(4)
1124
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = (function(utils, registry, debug) {
924
1125
  'use strict';
925
- var actionSymbols = {
926
- on: '<-',
927
- trigger: '->',
928
- off: 'x '
929
- };
930
- function elemToString(elem) {
931
- var tagStr = elem.tagName ? elem.tagName.toLowerCase() : elem.toString();
932
- var classStr = elem.className ? '.' + elem.className : '';
933
- var result = tagStr + classStr;
934
- return elem.tagName ? [
935
- '\'',
936
- '\''
937
- ].join(result) : result;
1126
+
1127
+ // common mixin allocates basic functionality - used by all component prototypes
1128
+ // callback context is bound to component
1129
+ var componentId = 0;
1130
+
1131
+ function teardownInstance(instanceInfo) {
1132
+ instanceInfo.events.slice().forEach(function(event) {
1133
+ var args = [event.type];
1134
+
1135
+ event.element && args.unshift(event.element);
1136
+ (typeof event.callback == 'function') && args.push(event.callback);
1137
+
1138
+ this.off.apply(this, args);
1139
+ }, instanceInfo.instance);
938
1140
  }
939
- function log(action, component, eventArgs) {
940
- if (!window.DEBUG || !window.DEBUG.enabled)
941
- return;
942
- var name, eventType, elem, fn, payload, logFilter, toRegExp, actionLoggable, nameLoggable, info;
943
- if (typeof eventArgs[eventArgs.length - 1] == 'function') {
944
- fn = eventArgs.pop();
945
- fn = fn.unbound || fn; // use unbound version if any (better info)
1141
+
1142
+ function checkSerializable(type, data) {
1143
+ try {
1144
+ window.postMessage(data, '*');
1145
+ } catch (e) {
1146
+ console.log('unserializable data for event',type,':',data);
1147
+ throw new Error(
1148
+ ['The event', type, 'on component', this.toString(), 'was triggered with non-serializable data'].join(' ')
1149
+ );
1150
+ }
1151
+ }
1152
+
1153
+ function initAttributes(attrs) {
1154
+ var definedKeys = [], incomingKeys;
1155
+
1156
+ this.attr = new this.attrDef;
1157
+
1158
+ if (debug.enabled && window.console) {
1159
+ for (var key in this.attrDef.prototype) {
1160
+ definedKeys.push(key);
946
1161
  }
947
- if (eventArgs.length == 1) {
948
- elem = component.$node[0];
949
- eventType = eventArgs[0];
950
- } else if (eventArgs.length == 2 && typeof eventArgs[1] == 'object' && !eventArgs[1].type) {
951
- //2 args, first arg is not elem
952
- elem = component.$node[0];
953
- eventType = eventArgs[0];
954
- if (action == 'trigger') {
955
- payload = eventArgs[1];
956
- }
1162
+ incomingKeys = Object.keys(attrs);
1163
+
1164
+ for (var i = incomingKeys.length - 1; i >= 0; i--) {
1165
+ if (definedKeys.indexOf(incomingKeys[i]) == -1) {
1166
+ console.warn('Passed unused attributes including "' + incomingKeys[i] +
1167
+ '" to component "' + this.toString() + '".');
1168
+ break;
1169
+ }
1170
+ }
1171
+ }
1172
+
1173
+ for (var key in this.attrDef.prototype) {
1174
+ if (typeof attrs[key] == 'undefined') {
1175
+ if (this.attr[key] === null) {
1176
+ throw new Error('Required attribute "' + key +
1177
+ '" not specified in attachTo for component "' + this.toString() + '".');
1178
+ }
957
1179
  } else {
958
- //2+ args, first arg is elem
959
- elem = eventArgs[0];
960
- eventType = eventArgs[1];
961
- if (action == 'trigger') {
962
- payload = eventArgs[2];
963
- }
1180
+ this.attr[key] = attrs[key];
964
1181
  }
965
- name = typeof eventType == 'object' ? eventType.type : eventType;
966
- logFilter = DEBUG.events.logFilter;
967
- // no regex for you, actions...
968
- actionLoggable = logFilter.actions == 'all' || logFilter.actions.indexOf(action) > -1;
969
- // event name filter allow wildcards or regex...
970
- toRegExp = function (expr) {
971
- return expr.test ? expr : new RegExp('^' + expr.replace(/\*/g, '.*') + '$');
972
- };
973
- nameLoggable = logFilter.eventNames == 'all' || logFilter.eventNames.some(function (e) {
974
- return toRegExp(e).test(name);
975
- });
976
- if (actionLoggable && nameLoggable) {
977
- info = [
978
- actionSymbols[action],
979
- action,
980
- '[' + name + ']'
981
- ];
982
- payload && info.push(payload);
983
- info.push(elemToString(elem));
984
- info.push(component.constructor.describe.split(' ').slice(0, 3).join(' '));
985
- console.groupCollapsed && action == 'trigger' && console.groupCollapsed(action, name);
986
- console.info.apply(console, info);
1182
+
1183
+ if (typeof this.attr[key] == 'function') {
1184
+ this.attr[key] = this.attr[key].call(this);
987
1185
  }
1186
+ }
1187
+
988
1188
  }
989
- function withLogging() {
990
- this.before('trigger', function () {
991
- log('trigger', this, utils.toArray(arguments));
992
- });
993
- if (console.groupCollapsed) {
994
- this.after('trigger', function () {
995
- console.groupEnd();
996
- });
1189
+
1190
+ function initDeprecatedAttributes(attrs) {
1191
+ // merge defaults with supplied options
1192
+ // put options in attr.__proto__ to avoid merge overhead
1193
+ var attr = Object.create(attrs);
1194
+
1195
+ for (var key in this.defaults) {
1196
+ if (!attrs.hasOwnProperty(key)) {
1197
+ attr[key] = this.defaults[key];
997
1198
  }
998
- this.before('on', function () {
999
- log('on', this, utils.toArray(arguments));
1000
- });
1001
- this.before('off', function () {
1002
- log('off', this, utils.toArray(arguments));
1003
- });
1199
+ }
1200
+
1201
+ this.attr = attr;
1202
+
1203
+ Object.keys(this.defaults || {}).forEach(function(key) {
1204
+ if (this.defaults[key] === null && this.attr[key] === null) {
1205
+ throw new Error('Required attribute "' + key +
1206
+ '" not specified in attachTo for component "' + this.toString() + '".');
1207
+ }
1208
+ }, this);
1004
1209
  }
1005
- return withLogging;
1006
- });
1007
- // ==========================================
1008
- // Copyright 2013 Twitter, Inc
1009
- // Licensed under The MIT License
1010
- // http://opensource.org/licenses/MIT
1011
- // ==========================================
1012
- define('lib/component', [
1013
- './advice',
1014
- './utils',
1015
- './compose',
1016
- './base',
1017
- './registry',
1018
- './logger',
1019
- './debug'
1020
- ], function (advice, utils, compose, withBase, registry, withLogging, debug) {
1021
- 'use strict';
1022
- var functionNameRegEx = /function (.*?)\s?\(/;
1023
- // teardown for all instances of this constructor
1024
- function teardownAll() {
1025
- var componentInfo = registry.findComponentInfo(this);
1026
- componentInfo && Object.keys(componentInfo.instances).forEach(function (k) {
1027
- var info = componentInfo.instances[k];
1028
- // It's possible that a previous teardown caused another component to teardown,
1029
- // so we can't assume that the instances object is as it was.
1030
- if (info && info.instance) {
1031
- info.instance.teardown();
1032
- }
1033
- });
1210
+
1211
+ function proxyEventTo(targetEvent) {
1212
+ return function(e, data) {
1213
+ $(e.target).trigger(targetEvent, data);
1214
+ };
1034
1215
  }
1035
- function checkSerializable(type, data) {
1036
- try {
1037
- window.postMessage(data, '*');
1038
- } catch (e) {
1039
- console.log('unserializable data for event', type, ':', data);
1040
- throw new Error([
1041
- 'The event',
1042
- type,
1043
- 'on component',
1044
- this.toString(),
1045
- 'was triggered with non-serializable data'
1046
- ].join(' '));
1216
+
1217
+ function withBase() {
1218
+
1219
+ // delegate trigger, bind and unbind to an element
1220
+ // if $element not supplied, use component's node
1221
+ // other arguments are passed on
1222
+ // event can be either a string specifying the type
1223
+ // of the event, or a hash specifying both the type
1224
+ // and a default function to be called.
1225
+ this.trigger = function() {
1226
+ var $element, type, data, event, defaultFn;
1227
+ var lastIndex = arguments.length - 1, lastArg = arguments[lastIndex];
1228
+
1229
+ if (typeof lastArg != 'string' && !(lastArg && lastArg.defaultBehavior)) {
1230
+ lastIndex--;
1231
+ data = lastArg;
1047
1232
  }
1048
- }
1049
- function attachTo(selector) {
1050
- // unpacking arguments by hand benchmarked faster
1051
- var l = arguments.length;
1052
- var args = new Array(l - 1);
1053
- for (var i = 1; i < l; i++)
1054
- args[i - 1] = arguments[i];
1055
- if (!selector) {
1056
- throw new Error('Component needs to be attachTo\'d a jQuery object, native node or selector string');
1233
+
1234
+ if (lastIndex == 1) {
1235
+ $element = $(arguments[0]);
1236
+ event = arguments[1];
1237
+ } else {
1238
+ $element = this.$node;
1239
+ event = arguments[0];
1240
+ }
1241
+
1242
+ if (event.defaultBehavior) {
1243
+ defaultFn = event.defaultBehavior;
1244
+ event = $.Event(event.type);
1245
+ }
1246
+
1247
+ type = event.type || event;
1248
+
1249
+ if (debug.enabled && window.postMessage) {
1250
+ checkSerializable.call(this, type, data);
1251
+ }
1252
+
1253
+ if (typeof this.attr.eventData === 'object') {
1254
+ data = $.extend(true, {}, this.attr.eventData, data);
1255
+ }
1256
+
1257
+ $element.trigger((event || type), data);
1258
+
1259
+ if (defaultFn && !event.isDefaultPrevented()) {
1260
+ (this[defaultFn] || defaultFn).call(this, event, data);
1261
+ }
1262
+
1263
+ return $element;
1264
+ };
1265
+
1266
+
1267
+ this.on = function() {
1268
+ var $element, type, callback, originalCb;
1269
+ var lastIndex = arguments.length - 1, origin = arguments[lastIndex];
1270
+
1271
+ if (typeof origin == 'object') {
1272
+ //delegate callback
1273
+ originalCb = utils.delegate(
1274
+ this.resolveDelegateRules(origin)
1275
+ );
1276
+ } else if (typeof origin == 'string') {
1277
+ originalCb = proxyEventTo(origin);
1278
+ } else {
1279
+ originalCb = origin;
1280
+ }
1281
+
1282
+ if (lastIndex == 2) {
1283
+ $element = $(arguments[0]);
1284
+ type = arguments[1];
1285
+ } else {
1286
+ $element = this.$node;
1287
+ type = arguments[0];
1288
+ }
1289
+
1290
+ if (typeof originalCb != 'function' && typeof originalCb != 'object') {
1291
+ throw new Error('Unable to bind to "' + type +
1292
+ '" because the given callback is not a function or an object');
1293
+ }
1294
+
1295
+ callback = originalCb.bind(this);
1296
+ callback.target = originalCb;
1297
+ callback.context = this;
1298
+
1299
+ $element.on(type, callback);
1300
+
1301
+ // store every bound version of the callback
1302
+ originalCb.bound || (originalCb.bound = []);
1303
+ originalCb.bound.push(callback);
1304
+
1305
+ return callback;
1306
+ };
1307
+
1308
+ this.off = function() {
1309
+ var $element, type, callback;
1310
+ var lastIndex = arguments.length - 1;
1311
+
1312
+ if (typeof arguments[lastIndex] == 'function') {
1313
+ callback = arguments[lastIndex];
1314
+ lastIndex -= 1;
1057
1315
  }
1058
- var options = utils.merge.apply(utils, args);
1059
- var componentInfo = registry.findComponentInfo(this);
1060
- $(selector).each(function (i, node) {
1061
- if (componentInfo && componentInfo.isAttachedTo(node)) {
1062
- // already attached
1063
- return;
1316
+
1317
+ if (lastIndex == 1) {
1318
+ $element = $(arguments[0]);
1319
+ type = arguments[1];
1320
+ } else {
1321
+ $element = this.$node;
1322
+ type = arguments[0];
1323
+ }
1324
+
1325
+ if (callback) {
1326
+ //this callback may be the original function or a bound version
1327
+ var boundFunctions = callback.target ? callback.target.bound : callback.bound || [];
1328
+ //set callback to version bound against this instance
1329
+ boundFunctions && boundFunctions.some(function(fn, i, arr) {
1330
+ if (fn.context && (this.identity == fn.context.identity)) {
1331
+ arr.splice(i, 1);
1332
+ callback = fn;
1333
+ return true;
1064
1334
  }
1065
- new this().initialize(node, options);
1066
- }.bind(this));
1067
- }
1068
- function prettyPrintMixins() {
1069
- //could be called from constructor or constructor.prototype
1070
- var mixedIn = this.mixedIn || this.prototype.mixedIn || [];
1071
- return mixedIn.map(function (mixin) {
1072
- if (mixin.name == null) {
1073
- // function name property not supported by this browser, use regex
1074
- var m = mixin.toString().match(functionNameRegEx);
1075
- return m && m[1] ? m[1] : '';
1076
- } else {
1077
- return mixin.name != 'withBase' ? mixin.name : '';
1335
+ }, this);
1336
+ $element.off(type, callback);
1337
+ } else {
1338
+ // Loop through the events of `this` instance
1339
+ // and unbind using the callback
1340
+ registry.findInstanceInfo(this).events.forEach(function (event) {
1341
+ if (type == event.type) {
1342
+ $element.off(type, event.callback);
1078
1343
  }
1079
- }).filter(Boolean).join(', ');
1080
- }
1081
- ;
1082
- // define the constructor for a custom component type
1083
- // takes an unlimited number of mixin functions as arguments
1084
- // typical api call with 3 mixins: define(timeline, withTweetCapability, withScrollCapability);
1085
- function define() {
1086
- // unpacking arguments by hand benchmarked faster
1087
- var l = arguments.length;
1088
- var mixins = new Array(l);
1089
- for (var i = 0; i < l; i++)
1090
- mixins[i] = arguments[i];
1091
- var Component = function () {
1092
- };
1093
- Component.toString = Component.prototype.toString = prettyPrintMixins;
1094
- if (debug.enabled) {
1095
- Component.describe = Component.prototype.describe = Component.toString();
1344
+ });
1096
1345
  }
1097
- // 'options' is optional hash to be merged with 'defaults' in the component definition
1098
- Component.attachTo = attachTo;
1099
- // enables extension of existing "base" Components
1100
- Component.mixin = function () {
1101
- var newComponent = define();
1102
- //TODO: fix pretty print
1103
- var newPrototype = Object.create(Component.prototype);
1104
- newPrototype.mixedIn = [].concat(Component.prototype.mixedIn);
1105
- newPrototype.defaults = utils.merge(Component.prototype.defaults);
1106
- newPrototype.attrDef = Component.prototype.attrDef;
1107
- compose.mixin(newPrototype, arguments);
1108
- newComponent.prototype = newPrototype;
1109
- newComponent.prototype.constructor = newComponent;
1110
- return newComponent;
1111
- };
1112
- Component.teardownAll = teardownAll;
1113
- // prepend common mixins to supplied list, then mixin all flavors
1114
- if (debug.enabled) {
1115
- mixins.unshift(withLogging);
1346
+
1347
+ return $element;
1348
+ };
1349
+
1350
+ this.resolveDelegateRules = function(ruleInfo) {
1351
+ var rules = {};
1352
+
1353
+ Object.keys(ruleInfo).forEach(function(r) {
1354
+ if (!(r in this.attr)) {
1355
+ throw new Error('Component "' + this.toString() + '" wants to listen on "' + r + '" but no such attribute was defined.');
1356
+ }
1357
+ rules[this.attr[r]] = (typeof ruleInfo[r] == 'string') ? proxyEventTo(ruleInfo[r]) : ruleInfo[r];
1358
+ }, this);
1359
+
1360
+ return rules;
1361
+ };
1362
+
1363
+ this.select = function(attributeKey) {
1364
+ return this.$node.find(this.attr[attributeKey]);
1365
+ };
1366
+
1367
+ // New-style attributes
1368
+
1369
+ this.attributes = function(attrs) {
1370
+
1371
+ var Attributes = function() {};
1372
+
1373
+ if (this.attrDef) {
1374
+ Attributes.prototype = new this.attrDef;
1375
+ }
1376
+
1377
+ for (var name in attrs) {
1378
+ Attributes.prototype[name] = attrs[name];
1379
+ }
1380
+
1381
+ this.attrDef = Attributes;
1382
+ };
1383
+
1384
+ // Deprecated attributes
1385
+
1386
+ this.defaultAttrs = function(defaults) {
1387
+ utils.push(this.defaults, defaults, true) || (this.defaults = defaults);
1388
+ };
1389
+
1390
+ this.initialize = function(node, attrs) {
1391
+ attrs = attrs || {};
1392
+ this.identity || (this.identity = componentId++);
1393
+
1394
+ if (!node) {
1395
+ throw new Error('Component needs a node');
1116
1396
  }
1117
- mixins.unshift(withBase, advice.withAdvice, registry.withRegistration);
1118
- compose.mixin(Component.prototype, mixins);
1119
- return Component;
1397
+
1398
+ if (node.jquery) {
1399
+ this.node = node[0];
1400
+ this.$node = node;
1401
+ } else {
1402
+ this.node = node;
1403
+ this.$node = $(node);
1404
+ }
1405
+
1406
+ if (this.attrDef) {
1407
+ initAttributes.call(this, attrs);
1408
+ } else {
1409
+ initDeprecatedAttributes.call(this, attrs);
1410
+ }
1411
+
1412
+ return this;
1413
+ };
1414
+
1415
+ this.teardown = function() {
1416
+ teardownInstance(registry.findInstanceInfo(this));
1417
+ };
1120
1418
  }
1121
- define.teardownAll = function () {
1122
- registry.components.slice().forEach(function (c) {
1123
- c.component.teardownAll();
1124
- });
1125
- registry.reset();
1126
- };
1127
- return define;
1128
- });
1129
- // ==========================================
1130
- // Copyright 2013 Twitter, Inc
1131
- // Licensed under The MIT License
1132
- // http://opensource.org/licenses/MIT
1133
- // ==========================================
1134
- define('lib/index', [
1135
- './advice',
1136
- './component',
1137
- './compose',
1138
- './logger',
1139
- './registry',
1140
- './utils'
1141
- ], function (advice, component, compose, logger, registry, utils) {
1142
- 'use strict';
1143
- return {
1144
- advice: advice,
1145
- component: component,
1146
- compose: compose,
1147
- logger: logger,
1148
- registry: registry,
1149
- utils: utils
1150
- };
1151
- });
1152
1419
 
1153
- context.flight = require('lib/index');
1154
- }(this));
1420
+ return withBase;
1421
+ }.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1422
+
1423
+
1424
+ /***/ }
1425
+ /******/ ])
1426
+ })