ember-source 2.0.3 → 2.0.3.1

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.
@@ -1,1078 +1,1164 @@
1
- enifed("backburner/binary-search", ["exports"], function (exports) {
2
- "use strict";
3
-
4
- exports.default = binarySearch;
5
-
6
- function binarySearch(time, timers) {
7
- var start = 0;
8
- var end = timers.length - 2;
9
- var middle, l;
10
-
11
- while (start < end) {
12
- // since timers is an array of pairs 'l' will always
13
- // be an integer
14
- l = (end - start) / 2;
1
+ /*!
2
+ * @overview Ember - JavaScript Application Framework
3
+ * @copyright Copyright 2011-2015 Tilde Inc. and contributors
4
+ * Portions Copyright 2006-2011 Strobe Inc.
5
+ * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
+ * @license Licensed under MIT license
7
+ * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
+ * @version 2.0.3
9
+ */
15
10
 
16
- // compensate for the index in case even number
17
- // of pairs inside timers
18
- middle = start + l - l % 2;
11
+ (function() {
12
+ var enifed, requireModule, eriuqer, requirejs, Ember;
13
+ var mainContext = this;
19
14
 
20
- if (time >= timers[middle]) {
21
- start = middle + 2;
22
- } else {
23
- end = middle;
24
- }
25
- }
15
+ (function() {
16
+ var isNode = typeof window === 'undefined' &&
17
+ typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
26
18
 
27
- return time >= timers[start] ? start + 2 : start;
19
+ if (!isNode) {
20
+ Ember = this.Ember = this.Ember || {};
28
21
  }
29
- });
30
- enifed('backburner/deferred-action-queues', ['exports', './utils', './queue'], function (exports, _utils, _queue) {
31
- 'use strict';
32
22
 
33
- exports.default = DeferredActionQueues;
23
+ if (typeof Ember === 'undefined') { Ember = {}; };
34
24
 
35
- function DeferredActionQueues(queueNames, options) {
36
- var queues = this.queues = {};
37
- this.queueNames = queueNames = queueNames || [];
25
+ if (typeof Ember.__loader === 'undefined') {
26
+ var registry = {};
27
+ var seen = {};
38
28
 
39
- this.options = options;
29
+ enifed = function(name, deps, callback) {
30
+ var value = { };
40
31
 
41
- _utils.each(queueNames, function (queueName) {
42
- queues[queueName] = new _queue.default(queueName, options[queueName], options);
43
- });
44
- }
32
+ if (!callback) {
33
+ value.deps = [];
34
+ value.callback = deps;
35
+ } else {
36
+ value.deps = deps;
37
+ value.callback = callback;
38
+ }
45
39
 
46
- function noSuchQueue(name) {
47
- throw new Error('You attempted to schedule an action in a queue (' + name + ') that doesn\'t exist');
48
- }
40
+ registry[name] = value;
41
+ };
49
42
 
50
- function noSuchMethod(name) {
51
- throw new Error('You attempted to schedule an action in a queue (' + name + ') for a method that doesn\'t exist');
52
- }
43
+ requirejs = eriuqer = requireModule = function(name) {
44
+ return internalRequire(name, null);
45
+ }
53
46
 
54
- DeferredActionQueues.prototype = {
55
- schedule: function (name, target, method, args, onceFlag, stack) {
56
- var queues = this.queues;
57
- var queue = queues[name];
47
+ function internalRequire(name, referrerName) {
48
+ var exports = seen[name];
58
49
 
59
- if (!queue) {
60
- noSuchQueue(name);
50
+ if (exports !== undefined) {
51
+ return exports;
61
52
  }
62
53
 
63
- if (!method) {
64
- noSuchMethod(name);
65
- }
54
+ exports = seen[name] = {};
66
55
 
67
- if (onceFlag) {
68
- return queue.pushUnique(target, method, args, stack);
69
- } else {
70
- return queue.push(target, method, args, stack);
56
+ if (!registry[name]) {
57
+ if (referrerName) {
58
+ throw new Error('Could not find module ' + name + ' required by: ' + referrerName);
59
+ } else {
60
+ throw new Error('Could not find module ' + name);
61
+ }
71
62
  }
72
- },
73
-
74
- flush: function () {
75
- var queues = this.queues;
76
- var queueNames = this.queueNames;
77
- var queueName, queue, queueItems, priorQueueNameIndex;
78
- var queueNameIndex = 0;
79
- var numberOfQueues = queueNames.length;
80
- var options = this.options;
81
-
82
- while (queueNameIndex < numberOfQueues) {
83
- queueName = queueNames[queueNameIndex];
84
- queue = queues[queueName];
85
63
 
86
- var numberOfQueueItems = queue._queue.length;
64
+ var mod = registry[name];
65
+ var deps = mod.deps;
66
+ var callback = mod.callback;
67
+ var reified = [];
68
+ var length = deps.length;
87
69
 
88
- if (numberOfQueueItems === 0) {
89
- queueNameIndex++;
70
+ for (var i=0; i<length; i++) {
71
+ if (deps[i] === 'exports') {
72
+ reified.push(exports);
90
73
  } else {
91
- queue.flush(false /* async */);
92
- queueNameIndex = 0;
74
+ reified.push(internalRequire(resolve(deps[i], name), name));
93
75
  }
94
76
  }
95
- }
96
- };
97
- });
98
- enifed('backburner/platform', ['exports'], function (exports) {
99
- // In IE 6-8, try/finally doesn't work without a catch.
100
- // Unfortunately, this is impossible to test for since wrapping it in a parent try/catch doesn't trigger the bug.
101
- // This tests for another broken try/catch behavior that only exhibits in the same versions of IE.
102
- 'use strict';
103
77
 
104
- var needsIETryCatchFix = (function (e, x) {
105
- try {
106
- x();
107
- } catch (e) {} // jshint ignore:line
108
- return !!e;
109
- })();
78
+ callback.apply(this, reified);
110
79
 
111
- exports.needsIETryCatchFix = needsIETryCatchFix;
112
- var platform;
80
+ return exports;
81
+ };
113
82
 
114
- /* global self */
115
- if (typeof self === 'object') {
116
- platform = self;
83
+ function resolve(child, name) {
84
+ if (child.charAt(0) !== '.') {
85
+ return child;
86
+ }
87
+ var parts = child.split('/');
88
+ var parentBase = name.split('/').slice(0, -1);
117
89
 
118
- /* global global */
119
- } else if (typeof global === 'object') {
120
- platform = global;
121
- } else {
122
- throw new Error('no global: `self` or `global` found');
123
- }
90
+ for (var i=0, l=parts.length; i<l; i++) {
91
+ var part = parts[i];
124
92
 
125
- exports.default = platform;
126
- });
127
- enifed('backburner/queue', ['exports', './utils'], function (exports, _utils) {
128
- 'use strict';
93
+ if (part === '..') {
94
+ parentBase.pop();
95
+ } else if (part === '.') {
96
+ continue;
97
+ } else {
98
+ parentBase.push(part);
99
+ }
100
+ }
129
101
 
130
- exports.default = Queue;
102
+ return parentBase.join('/');
103
+ }
131
104
 
132
- function Queue(name, options, globalOptions) {
133
- this.name = name;
134
- this.globalOptions = globalOptions || {};
135
- this.options = options;
136
- this._queue = [];
137
- this.targetQueues = {};
138
- this._queueBeingFlushed = undefined;
105
+ requirejs._eak_seen = registry;
106
+
107
+ Ember.__loader = {
108
+ define: enifed,
109
+ require: eriuqer,
110
+ registry: registry
111
+ };
112
+ } else {
113
+ enifed = Ember.__loader.define;
114
+ requirejs = eriuqer = requireModule = Ember.__loader.require;
139
115
  }
116
+ })();
140
117
 
141
- Queue.prototype = {
142
- push: function (target, method, args, stack) {
143
- var queue = this._queue;
144
- queue.push(target, method, args, stack);
118
+ enifed('backburner', ['exports', './backburner/utils', './backburner/platform', './backburner/binary-search', './backburner/deferred-action-queues'], function (exports, _backburnerUtils, _backburnerPlatform, _backburnerBinarySearch, _backburnerDeferredActionQueues) {
119
+ 'use strict';
145
120
 
146
- return {
147
- queue: this,
148
- target: target,
149
- method: method
150
- };
151
- },
121
+ exports.default = Backburner;
152
122
 
153
- pushUniqueWithoutGuid: function (target, method, args, stack) {
154
- var queue = this._queue;
123
+ function Backburner(queueNames, options) {
124
+ this.queueNames = queueNames;
125
+ this.options = options || {};
126
+ if (!this.options.defaultQueue) {
127
+ this.options.defaultQueue = queueNames[0];
128
+ }
129
+ this.instanceStack = [];
130
+ this._debouncees = [];
131
+ this._throttlers = [];
132
+ this._timers = [];
133
+ this._eventCallbacks = {
134
+ end: [],
135
+ begin: []
136
+ };
137
+ }
155
138
 
156
- for (var i = 0, l = queue.length; i < l; i += 4) {
157
- var currentTarget = queue[i];
158
- var currentMethod = queue[i + 1];
139
+ Backburner.prototype = {
140
+ begin: function () {
141
+ var options = this.options;
142
+ var onBegin = options && options.onBegin;
143
+ var previousInstance = this.currentInstance;
159
144
 
160
- if (currentTarget === target && currentMethod === method) {
161
- queue[i + 2] = args; // replace args
162
- queue[i + 3] = stack; // replace stack
163
- return;
164
- }
145
+ if (previousInstance) {
146
+ this.instanceStack.push(previousInstance);
165
147
  }
166
148
 
167
- queue.push(target, method, args, stack);
149
+ this.currentInstance = new _backburnerDeferredActionQueues.default(this.queueNames, options);
150
+ this._trigger('begin', this.currentInstance, previousInstance);
151
+ if (onBegin) {
152
+ onBegin(this.currentInstance, previousInstance);
153
+ }
168
154
  },
169
155
 
170
- targetQueue: function (targetQueue, target, method, args, stack) {
171
- var queue = this._queue;
156
+ end: function () {
157
+ var options = this.options;
158
+ var onEnd = options && options.onEnd;
159
+ var currentInstance = this.currentInstance;
160
+ var nextInstance = null;
172
161
 
173
- for (var i = 0, l = targetQueue.length; i < l; i += 2) {
174
- var currentMethod = targetQueue[i];
175
- var currentIndex = targetQueue[i + 1];
162
+ // Prevent double-finally bug in Safari 6.0.2 and iOS 6
163
+ // This bug appears to be resolved in Safari 6.0.5 and iOS 7
164
+ var finallyAlreadyCalled = false;
165
+ try {
166
+ currentInstance.flush();
167
+ } finally {
168
+ if (!finallyAlreadyCalled) {
169
+ finallyAlreadyCalled = true;
176
170
 
177
- if (currentMethod === method) {
178
- queue[currentIndex + 2] = args; // replace args
179
- queue[currentIndex + 3] = stack; // replace stack
180
- return;
171
+ this.currentInstance = null;
172
+
173
+ if (this.instanceStack.length) {
174
+ nextInstance = this.instanceStack.pop();
175
+ this.currentInstance = nextInstance;
176
+ }
177
+ this._trigger('end', currentInstance, nextInstance);
178
+ if (onEnd) {
179
+ onEnd(currentInstance, nextInstance);
180
+ }
181
181
  }
182
182
  }
183
-
184
- targetQueue.push(method, queue.push(target, method, args, stack) - 4);
185
183
  },
186
184
 
187
- pushUniqueWithGuid: function (guid, target, method, args, stack) {
188
- var hasLocalQueue = this.targetQueues[guid];
185
+ /**
186
+ Trigger an event. Supports up to two arguments. Designed around
187
+ triggering transition events from one run loop instance to the
188
+ next, which requires an argument for the first instance and then
189
+ an argument for the next instance.
190
+ @private
191
+ @method _trigger
192
+ @param {String} eventName
193
+ @param {any} arg1
194
+ @param {any} arg2
195
+ */
196
+ _trigger: function (eventName, arg1, arg2) {
197
+ var callbacks = this._eventCallbacks[eventName];
198
+ if (callbacks) {
199
+ for (var i = 0; i < callbacks.length; i++) {
200
+ callbacks[i](arg1, arg2);
201
+ }
202
+ }
203
+ },
189
204
 
190
- if (hasLocalQueue) {
191
- this.targetQueue(hasLocalQueue, target, method, args, stack);
205
+ on: function (eventName, callback) {
206
+ if (typeof callback !== 'function') {
207
+ throw new TypeError('Callback must be a function');
208
+ }
209
+ var callbacks = this._eventCallbacks[eventName];
210
+ if (callbacks) {
211
+ callbacks.push(callback);
192
212
  } else {
193
- this.targetQueues[guid] = [method, this._queue.push(target, method, args, stack) - 4];
213
+ throw new TypeError('Cannot on() event "' + eventName + '" because it does not exist');
194
214
  }
195
-
196
- return {
197
- queue: this,
198
- target: target,
199
- method: method
200
- };
201
215
  },
202
216
 
203
- pushUnique: function (target, method, args, stack) {
204
- var queue = this._queue,
205
- currentTarget,
206
- currentMethod,
207
- i,
208
- l;
209
- var KEY = this.globalOptions.GUID_KEY;
210
-
211
- if (target && KEY) {
212
- var guid = target[KEY];
213
- if (guid) {
214
- return this.pushUniqueWithGuid(guid, target, method, args, stack);
217
+ off: function (eventName, callback) {
218
+ if (eventName) {
219
+ var callbacks = this._eventCallbacks[eventName];
220
+ var callbackFound = false;
221
+ if (!callbacks) return;
222
+ if (callback) {
223
+ for (var i = 0; i < callbacks.length; i++) {
224
+ if (callbacks[i] === callback) {
225
+ callbackFound = true;
226
+ callbacks.splice(i, 1);
227
+ i--;
228
+ }
229
+ }
230
+ }
231
+ if (!callbackFound) {
232
+ throw new TypeError('Cannot off() callback that does not exist');
215
233
  }
234
+ } else {
235
+ throw new TypeError('Cannot off() event "' + eventName + '" because it does not exist');
216
236
  }
217
-
218
- this.pushUniqueWithoutGuid(target, method, args, stack);
219
-
220
- return {
221
- queue: this,
222
- target: target,
223
- method: method
224
- };
225
237
  },
226
238
 
227
- invoke: function (target, method, args, _, _errorRecordedForStack) {
228
- if (args && args.length > 0) {
229
- method.apply(target, args);
239
+ run: function () /* target, method, args */{
240
+ var length = arguments.length;
241
+ var method, target, args;
242
+
243
+ if (length === 1) {
244
+ method = arguments[0];
245
+ target = null;
230
246
  } else {
231
- method.call(target);
247
+ target = arguments[0];
248
+ method = arguments[1];
232
249
  }
233
- },
234
250
 
235
- invokeWithOnError: function (target, method, args, onError, errorRecordedForStack) {
236
- try {
237
- if (args && args.length > 0) {
238
- method.apply(target, args);
239
- } else {
240
- method.call(target);
241
- }
242
- } catch (error) {
243
- onError(error, errorRecordedForStack);
251
+ if (_backburnerUtils.isString(method)) {
252
+ method = target[method];
244
253
  }
245
- },
246
254
 
247
- flush: function (sync) {
248
- var queue = this._queue;
249
- var length = queue.length;
250
-
251
- if (length === 0) {
252
- return;
255
+ if (length > 2) {
256
+ args = new Array(length - 2);
257
+ for (var i = 0, l = length - 2; i < l; i++) {
258
+ args[i] = arguments[i + 2];
259
+ }
260
+ } else {
261
+ args = [];
253
262
  }
254
263
 
255
- var globalOptions = this.globalOptions;
256
- var options = this.options;
257
- var before = options && options.before;
258
- var after = options && options.after;
259
- var onError = globalOptions.onError || globalOptions.onErrorTarget && globalOptions.onErrorTarget[globalOptions.onErrorMethod];
260
- var target, method, args, errorRecordedForStack;
261
- var invoke = onError ? this.invokeWithOnError : this.invoke;
264
+ var onError = getOnError(this.options);
262
265
 
263
- this.targetQueues = Object.create(null);
264
- var queueItems = this._queueBeingFlushed = this._queue.slice();
265
- this._queue = [];
266
+ this.begin();
266
267
 
267
- if (before) {
268
- before();
268
+ // guard against Safari 6's double-finally bug
269
+ var didFinally = false;
270
+
271
+ if (onError) {
272
+ try {
273
+ return method.apply(target, args);
274
+ } catch (error) {
275
+ onError(error);
276
+ } finally {
277
+ if (!didFinally) {
278
+ didFinally = true;
279
+ this.end();
280
+ }
281
+ }
282
+ } else {
283
+ try {
284
+ return method.apply(target, args);
285
+ } finally {
286
+ if (!didFinally) {
287
+ didFinally = true;
288
+ this.end();
289
+ }
290
+ }
269
291
  }
292
+ },
270
293
 
271
- for (var i = 0; i < length; i += 4) {
272
- target = queueItems[i];
273
- method = queueItems[i + 1];
274
- args = queueItems[i + 2];
275
- errorRecordedForStack = queueItems[i + 3]; // Debugging assistance
294
+ join: function () /* target, method, args */{
295
+ if (this.currentInstance) {
296
+ var length = arguments.length;
297
+ var method, target;
276
298
 
277
- if (_utils.isString(method)) {
299
+ if (length === 1) {
300
+ method = arguments[0];
301
+ target = null;
302
+ } else {
303
+ target = arguments[0];
304
+ method = arguments[1];
305
+ }
306
+
307
+ if (_backburnerUtils.isString(method)) {
278
308
  method = target[method];
279
309
  }
280
310
 
281
- // method could have been nullified / canceled during flush
282
- if (method) {
283
- //
284
- // ** Attention intrepid developer **
285
- //
286
- // To find out the stack of this task when it was scheduled onto
287
- // the run loop, add the following to your app.js:
288
- //
289
- // Ember.run.backburner.DEBUG = true; // NOTE: This slows your app, don't leave it on in production.
290
- //
291
- // Once that is in place, when you are at a breakpoint and navigate
292
- // here in the stack explorer, you can look at `errorRecordedForStack.stack`,
293
- // which will be the captured stack when this job was scheduled.
294
- //
295
- invoke(target, method, args, onError, errorRecordedForStack);
311
+ if (length === 1) {
312
+ return method();
313
+ } else if (length === 2) {
314
+ return method.call(target);
315
+ } else {
316
+ var args = new Array(length - 2);
317
+ for (var i = 0, l = length - 2; i < l; i++) {
318
+ args[i] = arguments[i + 2];
319
+ }
320
+ return method.apply(target, args);
296
321
  }
322
+ } else {
323
+ return this.run.apply(this, arguments);
297
324
  }
325
+ },
298
326
 
299
- if (after) {
300
- after();
301
- }
327
+ defer: function (queueName /* , target, method, args */) {
328
+ var length = arguments.length;
329
+ var method, target, args;
302
330
 
303
- this._queueBeingFlushed = undefined;
331
+ if (length === 2) {
332
+ method = arguments[1];
333
+ target = null;
334
+ } else {
335
+ target = arguments[1];
336
+ method = arguments[2];
337
+ }
304
338
 
305
- if (sync !== false && this._queue.length > 0) {
306
- // check if new items have been added
307
- this.flush(true);
339
+ if (_backburnerUtils.isString(method)) {
340
+ method = target[method];
308
341
  }
309
- },
310
342
 
311
- cancel: function (actionToCancel) {
312
- var queue = this._queue,
313
- currentTarget,
314
- currentMethod,
315
- i,
316
- l;
317
- var target = actionToCancel.target;
318
- var method = actionToCancel.method;
319
- var GUID_KEY = this.globalOptions.GUID_KEY;
343
+ var stack = this.DEBUG ? new Error() : undefined;
320
344
 
321
- if (GUID_KEY && this.targetQueues && target) {
322
- var targetQueue = this.targetQueues[target[GUID_KEY]];
323
-
324
- if (targetQueue) {
325
- for (i = 0, l = targetQueue.length; i < l; i++) {
326
- if (targetQueue[i] === method) {
327
- targetQueue.splice(i, 1);
328
- }
329
- }
345
+ if (length > 3) {
346
+ args = new Array(length - 3);
347
+ for (var i = 3; i < length; i++) {
348
+ args[i - 3] = arguments[i];
330
349
  }
350
+ } else {
351
+ args = undefined;
331
352
  }
332
353
 
333
- for (i = 0, l = queue.length; i < l; i += 4) {
334
- currentTarget = queue[i];
335
- currentMethod = queue[i + 1];
336
-
337
- if (currentTarget === target && currentMethod === method) {
338
- queue.splice(i, 4);
339
- return true;
340
- }
354
+ if (!this.currentInstance) {
355
+ createAutorun(this);
341
356
  }
357
+ return this.currentInstance.schedule(queueName, target, method, args, false, stack);
358
+ },
342
359
 
343
- // if not found in current queue
344
- // could be in the queue that is being flushed
345
- queue = this._queueBeingFlushed;
360
+ deferOnce: function (queueName /* , target, method, args */) {
361
+ var length = arguments.length;
362
+ var method, target, args;
346
363
 
347
- if (!queue) {
348
- return;
364
+ if (length === 2) {
365
+ method = arguments[1];
366
+ target = null;
367
+ } else {
368
+ target = arguments[1];
369
+ method = arguments[2];
349
370
  }
350
371
 
351
- for (i = 0, l = queue.length; i < l; i += 4) {
352
- currentTarget = queue[i];
353
- currentMethod = queue[i + 1];
372
+ if (_backburnerUtils.isString(method)) {
373
+ method = target[method];
374
+ }
354
375
 
355
- if (currentTarget === target && currentMethod === method) {
356
- // don't mess with array during flush
357
- // just nullify the method
358
- queue[i + 1] = null;
359
- return true;
376
+ var stack = this.DEBUG ? new Error() : undefined;
377
+
378
+ if (length > 3) {
379
+ args = new Array(length - 3);
380
+ for (var i = 3; i < length; i++) {
381
+ args[i - 3] = arguments[i];
360
382
  }
383
+ } else {
384
+ args = undefined;
361
385
  }
362
- }
363
- };
364
- });
365
- enifed('backburner/utils', ['exports'], function (exports) {
366
- 'use strict';
367
386
 
368
- exports.each = each;
369
- exports.isString = isString;
370
- exports.isFunction = isFunction;
371
- exports.isNumber = isNumber;
372
- exports.isCoercableNumber = isCoercableNumber;
373
- exports.wrapInTryCatch = wrapInTryCatch;
374
- var NUMBER = /\d+/;
387
+ if (!this.currentInstance) {
388
+ createAutorun(this);
389
+ }
390
+ return this.currentInstance.schedule(queueName, target, method, args, true, stack);
391
+ },
375
392
 
376
- function each(collection, callback) {
377
- for (var i = 0; i < collection.length; i++) {
378
- callback(collection[i]);
379
- }
380
- }
393
+ setTimeout: function () {
394
+ var l = arguments.length;
395
+ var args = new Array(l);
381
396
 
382
- // Date.now is not available in browsers < IE9
383
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility
384
- var now = Date.now || function () {
385
- return new Date().getTime();
386
- };
397
+ for (var x = 0; x < l; x++) {
398
+ args[x] = arguments[x];
399
+ }
387
400
 
388
- exports.now = now;
401
+ var length = args.length,
402
+ method,
403
+ wait,
404
+ target,
405
+ methodOrTarget,
406
+ methodOrWait,
407
+ methodOrArgs;
389
408
 
390
- function isString(suspect) {
391
- return typeof suspect === 'string';
392
- }
409
+ if (length === 0) {
410
+ return;
411
+ } else if (length === 1) {
412
+ method = args.shift();
413
+ wait = 0;
414
+ } else if (length === 2) {
415
+ methodOrTarget = args[0];
416
+ methodOrWait = args[1];
393
417
 
394
- function isFunction(suspect) {
395
- return typeof suspect === 'function';
396
- }
418
+ if (_backburnerUtils.isFunction(methodOrWait) || _backburnerUtils.isFunction(methodOrTarget[methodOrWait])) {
419
+ target = args.shift();
420
+ method = args.shift();
421
+ wait = 0;
422
+ } else if (_backburnerUtils.isCoercableNumber(methodOrWait)) {
423
+ method = args.shift();
424
+ wait = args.shift();
425
+ } else {
426
+ method = args.shift();
427
+ wait = 0;
428
+ }
429
+ } else {
430
+ var last = args[args.length - 1];
397
431
 
398
- function isNumber(suspect) {
399
- return typeof suspect === 'number';
400
- }
432
+ if (_backburnerUtils.isCoercableNumber(last)) {
433
+ wait = args.pop();
434
+ } else {
435
+ wait = 0;
436
+ }
401
437
 
402
- function isCoercableNumber(number) {
403
- return isNumber(number) || NUMBER.test(number);
404
- }
438
+ methodOrTarget = args[0];
439
+ methodOrArgs = args[1];
405
440
 
406
- function wrapInTryCatch(func) {
407
- return function () {
408
- try {
409
- return func.apply(this, arguments);
410
- } catch (e) {
411
- throw e;
441
+ if (_backburnerUtils.isFunction(methodOrArgs) || _backburnerUtils.isString(methodOrArgs) && methodOrTarget !== null && methodOrArgs in methodOrTarget) {
442
+ target = args.shift();
443
+ method = args.shift();
444
+ } else {
445
+ method = args.shift();
446
+ }
412
447
  }
413
- };
414
- }
415
- });
416
- enifed('backburner', ['exports', './backburner/utils', './backburner/platform', './backburner/binary-search', './backburner/deferred-action-queues'], function (exports, _backburnerUtils, _backburnerPlatform, _backburnerBinarySearch, _backburnerDeferredActionQueues) {
417
- 'use strict';
418
-
419
- exports.default = Backburner;
420
-
421
- function Backburner(queueNames, options) {
422
- this.queueNames = queueNames;
423
- this.options = options || {};
424
- if (!this.options.defaultQueue) {
425
- this.options.defaultQueue = queueNames[0];
426
- }
427
- this.instanceStack = [];
428
- this._debouncees = [];
429
- this._throttlers = [];
430
- this._timers = [];
431
- this._eventCallbacks = {
432
- end: [],
433
- begin: []
434
- };
435
- }
436
448
 
437
- Backburner.prototype = {
438
- begin: function () {
439
- var options = this.options;
440
- var onBegin = options && options.onBegin;
441
- var previousInstance = this.currentInstance;
449
+ var executeAt = _backburnerUtils.now() + parseInt(wait, 10);
442
450
 
443
- if (previousInstance) {
444
- this.instanceStack.push(previousInstance);
451
+ if (_backburnerUtils.isString(method)) {
452
+ method = target[method];
445
453
  }
446
454
 
447
- this.currentInstance = new _backburnerDeferredActionQueues.default(this.queueNames, options);
448
- this._trigger('begin', this.currentInstance, previousInstance);
449
- if (onBegin) {
450
- onBegin(this.currentInstance, previousInstance);
455
+ var onError = getOnError(this.options);
456
+
457
+ function fn() {
458
+ if (onError) {
459
+ try {
460
+ method.apply(target, args);
461
+ } catch (e) {
462
+ onError(e);
463
+ }
464
+ } else {
465
+ method.apply(target, args);
466
+ }
451
467
  }
452
- },
453
468
 
454
- end: function () {
455
- var options = this.options;
456
- var onEnd = options && options.onEnd;
457
- var currentInstance = this.currentInstance;
458
- var nextInstance = null;
469
+ // find position to insert
470
+ var i = _backburnerBinarySearch.default(executeAt, this._timers);
459
471
 
460
- // Prevent double-finally bug in Safari 6.0.2 and iOS 6
461
- // This bug appears to be resolved in Safari 6.0.5 and iOS 7
462
- var finallyAlreadyCalled = false;
463
- try {
464
- currentInstance.flush();
465
- } finally {
466
- if (!finallyAlreadyCalled) {
467
- finallyAlreadyCalled = true;
472
+ this._timers.splice(i, 0, executeAt, fn);
468
473
 
469
- this.currentInstance = null;
474
+ updateLaterTimer(this, executeAt, wait);
470
475
 
471
- if (this.instanceStack.length) {
472
- nextInstance = this.instanceStack.pop();
473
- this.currentInstance = nextInstance;
474
- }
475
- this._trigger('end', currentInstance, nextInstance);
476
- if (onEnd) {
477
- onEnd(currentInstance, nextInstance);
478
- }
479
- }
480
- }
476
+ return fn;
481
477
  },
482
478
 
483
- /**
484
- Trigger an event. Supports up to two arguments. Designed around
485
- triggering transition events from one run loop instance to the
486
- next, which requires an argument for the first instance and then
487
- an argument for the next instance.
488
- @private
489
- @method _trigger
490
- @param {String} eventName
491
- @param {any} arg1
492
- @param {any} arg2
493
- */
494
- _trigger: function (eventName, arg1, arg2) {
495
- var callbacks = this._eventCallbacks[eventName];
496
- if (callbacks) {
497
- for (var i = 0; i < callbacks.length; i++) {
498
- callbacks[i](arg1, arg2);
499
- }
479
+ throttle: function (target, method /* , args, wait, [immediate] */) {
480
+ var backburner = this;
481
+ var args = new Array(arguments.length);
482
+ for (var i = 0; i < arguments.length; i++) {
483
+ args[i] = arguments[i];
500
484
  }
501
- },
485
+ var immediate = args.pop();
486
+ var wait, throttler, index, timer;
502
487
 
503
- on: function (eventName, callback) {
504
- if (typeof callback !== 'function') {
505
- throw new TypeError('Callback must be a function');
506
- }
507
- var callbacks = this._eventCallbacks[eventName];
508
- if (callbacks) {
509
- callbacks.push(callback);
488
+ if (_backburnerUtils.isNumber(immediate) || _backburnerUtils.isString(immediate)) {
489
+ wait = immediate;
490
+ immediate = true;
510
491
  } else {
511
- throw new TypeError('Cannot on() event "' + eventName + '" because it does not exist');
492
+ wait = args.pop();
512
493
  }
513
- },
514
494
 
515
- off: function (eventName, callback) {
516
- if (eventName) {
517
- var callbacks = this._eventCallbacks[eventName];
518
- var callbackFound = false;
519
- if (!callbacks) return;
520
- if (callback) {
521
- for (var i = 0; i < callbacks.length; i++) {
522
- if (callbacks[i] === callback) {
523
- callbackFound = true;
524
- callbacks.splice(i, 1);
525
- i--;
526
- }
527
- }
495
+ wait = parseInt(wait, 10);
496
+
497
+ index = findThrottler(target, method, this._throttlers);
498
+ if (index > -1) {
499
+ return this._throttlers[index];
500
+ } // throttled
501
+
502
+ timer = _backburnerPlatform.default.setTimeout(function () {
503
+ if (!immediate) {
504
+ backburner.run.apply(backburner, args);
528
505
  }
529
- if (!callbackFound) {
530
- throw new TypeError('Cannot off() callback that does not exist');
506
+ var index = findThrottler(target, method, backburner._throttlers);
507
+ if (index > -1) {
508
+ backburner._throttlers.splice(index, 1);
531
509
  }
532
- } else {
533
- throw new TypeError('Cannot off() event "' + eventName + '" because it does not exist');
510
+ }, wait);
511
+
512
+ if (immediate) {
513
+ this.run.apply(this, args);
534
514
  }
515
+
516
+ throttler = [target, method, timer];
517
+
518
+ this._throttlers.push(throttler);
519
+
520
+ return throttler;
535
521
  },
536
522
 
537
- run: function () /* target, method, args */{
538
- var length = arguments.length;
539
- var method, target, args;
523
+ debounce: function (target, method /* , args, wait, [immediate] */) {
524
+ var backburner = this;
525
+ var args = new Array(arguments.length);
526
+ for (var i = 0; i < arguments.length; i++) {
527
+ args[i] = arguments[i];
528
+ }
540
529
 
541
- if (length === 1) {
542
- method = arguments[0];
543
- target = null;
530
+ var immediate = args.pop();
531
+ var wait, index, debouncee, timer;
532
+
533
+ if (_backburnerUtils.isNumber(immediate) || _backburnerUtils.isString(immediate)) {
534
+ wait = immediate;
535
+ immediate = false;
544
536
  } else {
545
- target = arguments[0];
546
- method = arguments[1];
537
+ wait = args.pop();
547
538
  }
548
539
 
549
- if (_backburnerUtils.isString(method)) {
550
- method = target[method];
540
+ wait = parseInt(wait, 10);
541
+ // Remove debouncee
542
+ index = findDebouncee(target, method, this._debouncees);
543
+
544
+ if (index > -1) {
545
+ debouncee = this._debouncees[index];
546
+ this._debouncees.splice(index, 1);
547
+ clearTimeout(debouncee[2]);
551
548
  }
552
549
 
553
- if (length > 2) {
554
- args = new Array(length - 2);
555
- for (var i = 0, l = length - 2; i < l; i++) {
556
- args[i] = arguments[i + 2];
550
+ timer = _backburnerPlatform.default.setTimeout(function () {
551
+ if (!immediate) {
552
+ backburner.run.apply(backburner, args);
557
553
  }
558
- } else {
559
- args = [];
554
+ var index = findDebouncee(target, method, backburner._debouncees);
555
+ if (index > -1) {
556
+ backburner._debouncees.splice(index, 1);
557
+ }
558
+ }, wait);
559
+
560
+ if (immediate && index === -1) {
561
+ backburner.run.apply(backburner, args);
560
562
  }
561
563
 
562
- var onError = getOnError(this.options);
564
+ debouncee = [target, method, timer];
563
565
 
564
- this.begin();
566
+ backburner._debouncees.push(debouncee);
565
567
 
566
- // guard against Safari 6's double-finally bug
567
- var didFinally = false;
568
+ return debouncee;
569
+ },
568
570
 
569
- if (onError) {
570
- try {
571
- return method.apply(target, args);
572
- } catch (error) {
573
- onError(error);
574
- } finally {
575
- if (!didFinally) {
576
- didFinally = true;
577
- this.end();
578
- }
579
- }
580
- } else {
581
- try {
582
- return method.apply(target, args);
583
- } finally {
584
- if (!didFinally) {
585
- didFinally = true;
586
- this.end();
571
+ cancelTimers: function () {
572
+ var clearItems = function (item) {
573
+ clearTimeout(item[2]);
574
+ };
575
+
576
+ _backburnerUtils.each(this._throttlers, clearItems);
577
+ this._throttlers = [];
578
+
579
+ _backburnerUtils.each(this._debouncees, clearItems);
580
+ this._debouncees = [];
581
+
582
+ if (this._laterTimer) {
583
+ clearTimeout(this._laterTimer);
584
+ this._laterTimer = null;
585
+ }
586
+ this._timers = [];
587
+
588
+ if (this._autorun) {
589
+ clearTimeout(this._autorun);
590
+ this._autorun = null;
591
+ }
592
+ },
593
+
594
+ hasTimers: function () {
595
+ return !!this._timers.length || !!this._debouncees.length || !!this._throttlers.length || this._autorun;
596
+ },
597
+
598
+ cancel: function (timer) {
599
+ var timerType = typeof timer;
600
+
601
+ if (timer && timerType === 'object' && timer.queue && timer.method) {
602
+ // we're cancelling a deferOnce
603
+ return timer.queue.cancel(timer);
604
+ } else if (timerType === 'function') {
605
+ // we're cancelling a setTimeout
606
+ for (var i = 0, l = this._timers.length; i < l; i += 2) {
607
+ if (this._timers[i + 1] === timer) {
608
+ this._timers.splice(i, 2); // remove the two elements
609
+ if (i === 0) {
610
+ if (this._laterTimer) {
611
+ // Active timer? Then clear timer and reset for future timer
612
+ clearTimeout(this._laterTimer);
613
+ this._laterTimer = null;
614
+ }
615
+ if (this._timers.length > 0) {
616
+ // Update to next available timer when available
617
+ updateLaterTimer(this, this._timers[0], this._timers[0] - _backburnerUtils.now());
618
+ }
619
+ }
620
+ return true;
587
621
  }
588
622
  }
623
+ } else if (Object.prototype.toString.call(timer) === '[object Array]') {
624
+ // we're cancelling a throttle or debounce
625
+ return this._cancelItem(findThrottler, this._throttlers, timer) || this._cancelItem(findDebouncee, this._debouncees, timer);
626
+ } else {
627
+ return; // timer was null or not a timer
589
628
  }
590
629
  },
591
630
 
592
- join: function () /* target, method, args */{
593
- if (this.currentInstance) {
594
- var length = arguments.length;
595
- var method, target;
631
+ _cancelItem: function (findMethod, array, timer) {
632
+ var item, index;
596
633
 
597
- if (length === 1) {
598
- method = arguments[0];
599
- target = null;
600
- } else {
601
- target = arguments[0];
602
- method = arguments[1];
603
- }
634
+ if (timer.length < 3) {
635
+ return false;
636
+ }
604
637
 
605
- if (_backburnerUtils.isString(method)) {
606
- method = target[method];
607
- }
638
+ index = findMethod(timer[0], timer[1], array);
608
639
 
609
- if (length === 1) {
610
- return method();
611
- } else if (length === 2) {
612
- return method.call(target);
613
- } else {
614
- var args = new Array(length - 2);
615
- for (var i = 0, l = length - 2; i < l; i++) {
616
- args[i] = arguments[i + 2];
617
- }
618
- return method.apply(target, args);
640
+ if (index > -1) {
641
+
642
+ item = array[index];
643
+
644
+ if (item[2] === timer[2]) {
645
+ array.splice(index, 1);
646
+ clearTimeout(timer[2]);
647
+ return true;
619
648
  }
620
- } else {
621
- return this.run.apply(this, arguments);
622
649
  }
623
- },
624
650
 
625
- defer: function (queueName /* , target, method, args */) {
626
- var length = arguments.length;
627
- var method, target, args;
651
+ return false;
652
+ }
653
+ };
628
654
 
629
- if (length === 2) {
630
- method = arguments[1];
631
- target = null;
632
- } else {
633
- target = arguments[1];
634
- method = arguments[2];
635
- }
655
+ Backburner.prototype.schedule = Backburner.prototype.defer;
656
+ Backburner.prototype.scheduleOnce = Backburner.prototype.deferOnce;
657
+ Backburner.prototype.later = Backburner.prototype.setTimeout;
636
658
 
637
- if (_backburnerUtils.isString(method)) {
638
- method = target[method];
639
- }
659
+ if (_backburnerPlatform.needsIETryCatchFix) {
660
+ var originalRun = Backburner.prototype.run;
661
+ Backburner.prototype.run = _backburnerUtils.wrapInTryCatch(originalRun);
640
662
 
641
- var stack = this.DEBUG ? new Error() : undefined;
663
+ var originalEnd = Backburner.prototype.end;
664
+ Backburner.prototype.end = _backburnerUtils.wrapInTryCatch(originalEnd);
665
+ }
642
666
 
643
- if (length > 3) {
644
- args = new Array(length - 3);
645
- for (var i = 3; i < length; i++) {
646
- args[i - 3] = arguments[i];
667
+ function getOnError(options) {
668
+ return options.onError || options.onErrorTarget && options.onErrorTarget[options.onErrorMethod];
669
+ }
670
+
671
+ function createAutorun(backburner) {
672
+ backburner.begin();
673
+ backburner._autorun = _backburnerPlatform.default.setTimeout(function () {
674
+ backburner._autorun = null;
675
+ backburner.end();
676
+ });
677
+ }
678
+
679
+ function updateLaterTimer(backburner, executeAt, wait) {
680
+ var n = _backburnerUtils.now();
681
+ if (!backburner._laterTimer || executeAt < backburner._laterTimerExpiresAt || backburner._laterTimerExpiresAt < n) {
682
+
683
+ if (backburner._laterTimer) {
684
+ // Clear when:
685
+ // - Already expired
686
+ // - New timer is earlier
687
+ clearTimeout(backburner._laterTimer);
688
+
689
+ if (backburner._laterTimerExpiresAt < n) {
690
+ // If timer was never triggered
691
+ // Calculate the left-over wait-time
692
+ wait = Math.max(0, executeAt - n);
647
693
  }
648
- } else {
649
- args = undefined;
650
694
  }
651
695
 
652
- if (!this.currentInstance) {
653
- createAutorun(this);
654
- }
655
- return this.currentInstance.schedule(queueName, target, method, args, false, stack);
656
- },
696
+ backburner._laterTimer = _backburnerPlatform.default.setTimeout(function () {
697
+ backburner._laterTimer = null;
698
+ backburner._laterTimerExpiresAt = null;
699
+ executeTimers(backburner);
700
+ }, wait);
657
701
 
658
- deferOnce: function (queueName /* , target, method, args */) {
659
- var length = arguments.length;
660
- var method, target, args;
702
+ backburner._laterTimerExpiresAt = n + wait;
703
+ }
704
+ }
661
705
 
662
- if (length === 2) {
663
- method = arguments[1];
664
- target = null;
665
- } else {
666
- target = arguments[1];
667
- method = arguments[2];
668
- }
706
+ function executeTimers(backburner) {
707
+ var n = _backburnerUtils.now();
708
+ var fns, i, l;
669
709
 
670
- if (_backburnerUtils.isString(method)) {
671
- method = target[method];
672
- }
710
+ backburner.run(function () {
711
+ i = _backburnerBinarySearch.default(n, backburner._timers);
673
712
 
674
- var stack = this.DEBUG ? new Error() : undefined;
713
+ fns = backburner._timers.splice(0, i);
675
714
 
676
- if (length > 3) {
677
- args = new Array(length - 3);
678
- for (var i = 3; i < length; i++) {
679
- args[i - 3] = arguments[i];
680
- }
681
- } else {
682
- args = undefined;
715
+ for (i = 1, l = fns.length; i < l; i += 2) {
716
+ backburner.schedule(backburner.options.defaultQueue, null, fns[i]);
683
717
  }
718
+ });
684
719
 
685
- if (!this.currentInstance) {
686
- createAutorun(this);
687
- }
688
- return this.currentInstance.schedule(queueName, target, method, args, true, stack);
689
- },
720
+ if (backburner._timers.length) {
721
+ updateLaterTimer(backburner, backburner._timers[0], backburner._timers[0] - n);
722
+ }
723
+ }
690
724
 
691
- setTimeout: function () {
692
- var l = arguments.length;
693
- var args = new Array(l);
725
+ function findDebouncee(target, method, debouncees) {
726
+ return findItem(target, method, debouncees);
727
+ }
694
728
 
695
- for (var x = 0; x < l; x++) {
696
- args[x] = arguments[x];
729
+ function findThrottler(target, method, throttlers) {
730
+ return findItem(target, method, throttlers);
731
+ }
732
+
733
+ function findItem(target, method, collection) {
734
+ var item;
735
+ var index = -1;
736
+
737
+ for (var i = 0, l = collection.length; i < l; i++) {
738
+ item = collection[i];
739
+ if (item[0] === target && item[1] === method) {
740
+ index = i;
741
+ break;
697
742
  }
743
+ }
698
744
 
699
- var length = args.length,
700
- method,
701
- wait,
702
- target,
703
- methodOrTarget,
704
- methodOrWait,
705
- methodOrArgs;
745
+ return index;
746
+ }
747
+ });
748
+ enifed("backburner/binary-search", ["exports"], function (exports) {
749
+ "use strict";
706
750
 
707
- if (length === 0) {
708
- return;
709
- } else if (length === 1) {
710
- method = args.shift();
711
- wait = 0;
712
- } else if (length === 2) {
713
- methodOrTarget = args[0];
714
- methodOrWait = args[1];
751
+ exports.default = binarySearch;
715
752
 
716
- if (_backburnerUtils.isFunction(methodOrWait) || _backburnerUtils.isFunction(methodOrTarget[methodOrWait])) {
717
- target = args.shift();
718
- method = args.shift();
719
- wait = 0;
720
- } else if (_backburnerUtils.isCoercableNumber(methodOrWait)) {
721
- method = args.shift();
722
- wait = args.shift();
723
- } else {
724
- method = args.shift();
725
- wait = 0;
726
- }
753
+ function binarySearch(time, timers) {
754
+ var start = 0;
755
+ var end = timers.length - 2;
756
+ var middle, l;
757
+
758
+ while (start < end) {
759
+ // since timers is an array of pairs 'l' will always
760
+ // be an integer
761
+ l = (end - start) / 2;
762
+
763
+ // compensate for the index in case even number
764
+ // of pairs inside timers
765
+ middle = start + l - l % 2;
766
+
767
+ if (time >= timers[middle]) {
768
+ start = middle + 2;
727
769
  } else {
728
- var last = args[args.length - 1];
770
+ end = middle;
771
+ }
772
+ }
729
773
 
730
- if (_backburnerUtils.isCoercableNumber(last)) {
731
- wait = args.pop();
732
- } else {
733
- wait = 0;
734
- }
774
+ return time >= timers[start] ? start + 2 : start;
775
+ }
776
+ });
777
+ enifed('backburner/deferred-action-queues', ['exports', './utils', './queue'], function (exports, _utils, _queue) {
778
+ 'use strict';
735
779
 
736
- methodOrTarget = args[0];
737
- methodOrArgs = args[1];
780
+ exports.default = DeferredActionQueues;
781
+
782
+ function DeferredActionQueues(queueNames, options) {
783
+ var queues = this.queues = {};
784
+ this.queueNames = queueNames = queueNames || [];
785
+
786
+ this.options = options;
787
+
788
+ _utils.each(queueNames, function (queueName) {
789
+ queues[queueName] = new _queue.default(queueName, options[queueName], options);
790
+ });
791
+ }
738
792
 
739
- if (_backburnerUtils.isFunction(methodOrArgs) || _backburnerUtils.isString(methodOrArgs) && methodOrTarget !== null && methodOrArgs in methodOrTarget) {
740
- target = args.shift();
741
- method = args.shift();
742
- } else {
743
- method = args.shift();
744
- }
745
- }
793
+ function noSuchQueue(name) {
794
+ throw new Error('You attempted to schedule an action in a queue (' + name + ') that doesn\'t exist');
795
+ }
746
796
 
747
- var executeAt = _backburnerUtils.now() + parseInt(wait, 10);
797
+ function noSuchMethod(name) {
798
+ throw new Error('You attempted to schedule an action in a queue (' + name + ') for a method that doesn\'t exist');
799
+ }
748
800
 
749
- if (_backburnerUtils.isString(method)) {
750
- method = target[method];
751
- }
801
+ DeferredActionQueues.prototype = {
802
+ schedule: function (name, target, method, args, onceFlag, stack) {
803
+ var queues = this.queues;
804
+ var queue = queues[name];
752
805
 
753
- var onError = getOnError(this.options);
806
+ if (!queue) {
807
+ noSuchQueue(name);
808
+ }
754
809
 
755
- function fn() {
756
- if (onError) {
757
- try {
758
- method.apply(target, args);
759
- } catch (e) {
760
- onError(e);
761
- }
762
- } else {
763
- method.apply(target, args);
764
- }
810
+ if (!method) {
811
+ noSuchMethod(name);
765
812
  }
766
813
 
767
- // find position to insert
768
- var i = _backburnerBinarySearch.default(executeAt, this._timers);
814
+ if (onceFlag) {
815
+ return queue.pushUnique(target, method, args, stack);
816
+ } else {
817
+ return queue.push(target, method, args, stack);
818
+ }
819
+ },
769
820
 
770
- this._timers.splice(i, 0, executeAt, fn);
821
+ flush: function () {
822
+ var queues = this.queues;
823
+ var queueNames = this.queueNames;
824
+ var queueName, queue, queueItems, priorQueueNameIndex;
825
+ var queueNameIndex = 0;
826
+ var numberOfQueues = queueNames.length;
827
+ var options = this.options;
771
828
 
772
- updateLaterTimer(this, executeAt, wait);
829
+ while (queueNameIndex < numberOfQueues) {
830
+ queueName = queueNames[queueNameIndex];
831
+ queue = queues[queueName];
773
832
 
774
- return fn;
775
- },
833
+ var numberOfQueueItems = queue._queue.length;
776
834
 
777
- throttle: function (target, method /* , args, wait, [immediate] */) {
778
- var backburner = this;
779
- var args = new Array(arguments.length);
780
- for (var i = 0; i < arguments.length; i++) {
781
- args[i] = arguments[i];
835
+ if (numberOfQueueItems === 0) {
836
+ queueNameIndex++;
837
+ } else {
838
+ queue.flush(false /* async */);
839
+ queueNameIndex = 0;
840
+ }
782
841
  }
783
- var immediate = args.pop();
784
- var wait, throttler, index, timer;
842
+ }
843
+ };
844
+ });
845
+ enifed('backburner/platform', ['exports'], function (exports) {
846
+ // In IE 6-8, try/finally doesn't work without a catch.
847
+ // Unfortunately, this is impossible to test for since wrapping it in a parent try/catch doesn't trigger the bug.
848
+ // This tests for another broken try/catch behavior that only exhibits in the same versions of IE.
849
+ 'use strict';
785
850
 
786
- if (_backburnerUtils.isNumber(immediate) || _backburnerUtils.isString(immediate)) {
787
- wait = immediate;
788
- immediate = true;
789
- } else {
790
- wait = args.pop();
791
- }
851
+ var needsIETryCatchFix = (function (e, x) {
852
+ try {
853
+ x();
854
+ } catch (e) {} // jshint ignore:line
855
+ return !!e;
856
+ })();
792
857
 
793
- wait = parseInt(wait, 10);
858
+ exports.needsIETryCatchFix = needsIETryCatchFix;
859
+ var platform;
794
860
 
795
- index = findThrottler(target, method, this._throttlers);
796
- if (index > -1) {
797
- return this._throttlers[index];
798
- } // throttled
861
+ /* global self */
862
+ if (typeof self === 'object') {
863
+ platform = self;
799
864
 
800
- timer = _backburnerPlatform.default.setTimeout(function () {
801
- if (!immediate) {
802
- backburner.run.apply(backburner, args);
803
- }
804
- var index = findThrottler(target, method, backburner._throttlers);
805
- if (index > -1) {
806
- backburner._throttlers.splice(index, 1);
807
- }
808
- }, wait);
865
+ /* global global */
866
+ } else if (typeof global === 'object') {
867
+ platform = global;
868
+ } else {
869
+ throw new Error('no global: `self` or `global` found');
870
+ }
809
871
 
810
- if (immediate) {
811
- this.run.apply(this, args);
812
- }
872
+ exports.default = platform;
873
+ });
874
+ enifed('backburner/queue', ['exports', './utils'], function (exports, _utils) {
875
+ 'use strict';
813
876
 
814
- throttler = [target, method, timer];
877
+ exports.default = Queue;
815
878
 
816
- this._throttlers.push(throttler);
879
+ function Queue(name, options, globalOptions) {
880
+ this.name = name;
881
+ this.globalOptions = globalOptions || {};
882
+ this.options = options;
883
+ this._queue = [];
884
+ this.targetQueues = {};
885
+ this._queueBeingFlushed = undefined;
886
+ }
817
887
 
818
- return throttler;
888
+ Queue.prototype = {
889
+ push: function (target, method, args, stack) {
890
+ var queue = this._queue;
891
+ queue.push(target, method, args, stack);
892
+
893
+ return {
894
+ queue: this,
895
+ target: target,
896
+ method: method
897
+ };
819
898
  },
820
899
 
821
- debounce: function (target, method /* , args, wait, [immediate] */) {
822
- var backburner = this;
823
- var args = new Array(arguments.length);
824
- for (var i = 0; i < arguments.length; i++) {
825
- args[i] = arguments[i];
826
- }
900
+ pushUniqueWithoutGuid: function (target, method, args, stack) {
901
+ var queue = this._queue;
827
902
 
828
- var immediate = args.pop();
829
- var wait, index, debouncee, timer;
903
+ for (var i = 0, l = queue.length; i < l; i += 4) {
904
+ var currentTarget = queue[i];
905
+ var currentMethod = queue[i + 1];
830
906
 
831
- if (_backburnerUtils.isNumber(immediate) || _backburnerUtils.isString(immediate)) {
832
- wait = immediate;
833
- immediate = false;
834
- } else {
835
- wait = args.pop();
907
+ if (currentTarget === target && currentMethod === method) {
908
+ queue[i + 2] = args; // replace args
909
+ queue[i + 3] = stack; // replace stack
910
+ return;
911
+ }
836
912
  }
837
913
 
838
- wait = parseInt(wait, 10);
839
- // Remove debouncee
840
- index = findDebouncee(target, method, this._debouncees);
914
+ queue.push(target, method, args, stack);
915
+ },
841
916
 
842
- if (index > -1) {
843
- debouncee = this._debouncees[index];
844
- this._debouncees.splice(index, 1);
845
- clearTimeout(debouncee[2]);
846
- }
917
+ targetQueue: function (targetQueue, target, method, args, stack) {
918
+ var queue = this._queue;
847
919
 
848
- timer = _backburnerPlatform.default.setTimeout(function () {
849
- if (!immediate) {
850
- backburner.run.apply(backburner, args);
851
- }
852
- var index = findDebouncee(target, method, backburner._debouncees);
853
- if (index > -1) {
854
- backburner._debouncees.splice(index, 1);
855
- }
856
- }, wait);
920
+ for (var i = 0, l = targetQueue.length; i < l; i += 2) {
921
+ var currentMethod = targetQueue[i];
922
+ var currentIndex = targetQueue[i + 1];
857
923
 
858
- if (immediate && index === -1) {
859
- backburner.run.apply(backburner, args);
924
+ if (currentMethod === method) {
925
+ queue[currentIndex + 2] = args; // replace args
926
+ queue[currentIndex + 3] = stack; // replace stack
927
+ return;
928
+ }
860
929
  }
861
930
 
862
- debouncee = [target, method, timer];
931
+ targetQueue.push(method, queue.push(target, method, args, stack) - 4);
932
+ },
863
933
 
864
- backburner._debouncees.push(debouncee);
934
+ pushUniqueWithGuid: function (guid, target, method, args, stack) {
935
+ var hasLocalQueue = this.targetQueues[guid];
865
936
 
866
- return debouncee;
867
- },
937
+ if (hasLocalQueue) {
938
+ this.targetQueue(hasLocalQueue, target, method, args, stack);
939
+ } else {
940
+ this.targetQueues[guid] = [method, this._queue.push(target, method, args, stack) - 4];
941
+ }
868
942
 
869
- cancelTimers: function () {
870
- var clearItems = function (item) {
871
- clearTimeout(item[2]);
943
+ return {
944
+ queue: this,
945
+ target: target,
946
+ method: method
872
947
  };
948
+ },
873
949
 
874
- _backburnerUtils.each(this._throttlers, clearItems);
875
- this._throttlers = [];
876
-
877
- _backburnerUtils.each(this._debouncees, clearItems);
878
- this._debouncees = [];
950
+ pushUnique: function (target, method, args, stack) {
951
+ var queue = this._queue,
952
+ currentTarget,
953
+ currentMethod,
954
+ i,
955
+ l;
956
+ var KEY = this.globalOptions.GUID_KEY;
879
957
 
880
- if (this._laterTimer) {
881
- clearTimeout(this._laterTimer);
882
- this._laterTimer = null;
958
+ if (target && KEY) {
959
+ var guid = target[KEY];
960
+ if (guid) {
961
+ return this.pushUniqueWithGuid(guid, target, method, args, stack);
962
+ }
883
963
  }
884
- this._timers = [];
885
964
 
886
- if (this._autorun) {
887
- clearTimeout(this._autorun);
888
- this._autorun = null;
889
- }
890
- },
965
+ this.pushUniqueWithoutGuid(target, method, args, stack);
891
966
 
892
- hasTimers: function () {
893
- return !!this._timers.length || !!this._debouncees.length || !!this._throttlers.length || this._autorun;
967
+ return {
968
+ queue: this,
969
+ target: target,
970
+ method: method
971
+ };
894
972
  },
895
973
 
896
- cancel: function (timer) {
897
- var timerType = typeof timer;
974
+ invoke: function (target, method, args, _, _errorRecordedForStack) {
975
+ if (args && args.length > 0) {
976
+ method.apply(target, args);
977
+ } else {
978
+ method.call(target);
979
+ }
980
+ },
898
981
 
899
- if (timer && timerType === 'object' && timer.queue && timer.method) {
900
- // we're cancelling a deferOnce
901
- return timer.queue.cancel(timer);
902
- } else if (timerType === 'function') {
903
- // we're cancelling a setTimeout
904
- for (var i = 0, l = this._timers.length; i < l; i += 2) {
905
- if (this._timers[i + 1] === timer) {
906
- this._timers.splice(i, 2); // remove the two elements
907
- if (i === 0) {
908
- if (this._laterTimer) {
909
- // Active timer? Then clear timer and reset for future timer
910
- clearTimeout(this._laterTimer);
911
- this._laterTimer = null;
912
- }
913
- if (this._timers.length > 0) {
914
- // Update to next available timer when available
915
- updateLaterTimer(this, this._timers[0], this._timers[0] - _backburnerUtils.now());
916
- }
917
- }
918
- return true;
919
- }
982
+ invokeWithOnError: function (target, method, args, onError, errorRecordedForStack) {
983
+ try {
984
+ if (args && args.length > 0) {
985
+ method.apply(target, args);
986
+ } else {
987
+ method.call(target);
920
988
  }
921
- } else if (Object.prototype.toString.call(timer) === '[object Array]') {
922
- // we're cancelling a throttle or debounce
923
- return this._cancelItem(findThrottler, this._throttlers, timer) || this._cancelItem(findDebouncee, this._debouncees, timer);
924
- } else {
925
- return; // timer was null or not a timer
989
+ } catch (error) {
990
+ onError(error, errorRecordedForStack);
926
991
  }
927
992
  },
928
993
 
929
- _cancelItem: function (findMethod, array, timer) {
930
- var item, index;
994
+ flush: function (sync) {
995
+ var queue = this._queue;
996
+ var length = queue.length;
931
997
 
932
- if (timer.length < 3) {
933
- return false;
998
+ if (length === 0) {
999
+ return;
934
1000
  }
935
1001
 
936
- index = findMethod(timer[0], timer[1], array);
937
-
938
- if (index > -1) {
1002
+ var globalOptions = this.globalOptions;
1003
+ var options = this.options;
1004
+ var before = options && options.before;
1005
+ var after = options && options.after;
1006
+ var onError = globalOptions.onError || globalOptions.onErrorTarget && globalOptions.onErrorTarget[globalOptions.onErrorMethod];
1007
+ var target, method, args, errorRecordedForStack;
1008
+ var invoke = onError ? this.invokeWithOnError : this.invoke;
939
1009
 
940
- item = array[index];
1010
+ this.targetQueues = Object.create(null);
1011
+ var queueItems = this._queueBeingFlushed = this._queue.slice();
1012
+ this._queue = [];
941
1013
 
942
- if (item[2] === timer[2]) {
943
- array.splice(index, 1);
944
- clearTimeout(timer[2]);
945
- return true;
946
- }
1014
+ if (before) {
1015
+ before();
947
1016
  }
948
1017
 
949
- return false;
950
- }
951
- };
1018
+ for (var i = 0; i < length; i += 4) {
1019
+ target = queueItems[i];
1020
+ method = queueItems[i + 1];
1021
+ args = queueItems[i + 2];
1022
+ errorRecordedForStack = queueItems[i + 3]; // Debugging assistance
952
1023
 
953
- Backburner.prototype.schedule = Backburner.prototype.defer;
954
- Backburner.prototype.scheduleOnce = Backburner.prototype.deferOnce;
955
- Backburner.prototype.later = Backburner.prototype.setTimeout;
1024
+ if (_utils.isString(method)) {
1025
+ method = target[method];
1026
+ }
956
1027
 
957
- if (_backburnerPlatform.needsIETryCatchFix) {
958
- var originalRun = Backburner.prototype.run;
959
- Backburner.prototype.run = _backburnerUtils.wrapInTryCatch(originalRun);
1028
+ // method could have been nullified / canceled during flush
1029
+ if (method) {
1030
+ //
1031
+ // ** Attention intrepid developer **
1032
+ //
1033
+ // To find out the stack of this task when it was scheduled onto
1034
+ // the run loop, add the following to your app.js:
1035
+ //
1036
+ // Ember.run.backburner.DEBUG = true; // NOTE: This slows your app, don't leave it on in production.
1037
+ //
1038
+ // Once that is in place, when you are at a breakpoint and navigate
1039
+ // here in the stack explorer, you can look at `errorRecordedForStack.stack`,
1040
+ // which will be the captured stack when this job was scheduled.
1041
+ //
1042
+ invoke(target, method, args, onError, errorRecordedForStack);
1043
+ }
1044
+ }
960
1045
 
961
- var originalEnd = Backburner.prototype.end;
962
- Backburner.prototype.end = _backburnerUtils.wrapInTryCatch(originalEnd);
963
- }
1046
+ if (after) {
1047
+ after();
1048
+ }
964
1049
 
965
- function getOnError(options) {
966
- return options.onError || options.onErrorTarget && options.onErrorTarget[options.onErrorMethod];
967
- }
1050
+ this._queueBeingFlushed = undefined;
968
1051
 
969
- function createAutorun(backburner) {
970
- backburner.begin();
971
- backburner._autorun = _backburnerPlatform.default.setTimeout(function () {
972
- backburner._autorun = null;
973
- backburner.end();
974
- });
975
- }
1052
+ if (sync !== false && this._queue.length > 0) {
1053
+ // check if new items have been added
1054
+ this.flush(true);
1055
+ }
1056
+ },
976
1057
 
977
- function updateLaterTimer(backburner, executeAt, wait) {
978
- var n = _backburnerUtils.now();
979
- if (!backburner._laterTimer || executeAt < backburner._laterTimerExpiresAt || backburner._laterTimerExpiresAt < n) {
1058
+ cancel: function (actionToCancel) {
1059
+ var queue = this._queue,
1060
+ currentTarget,
1061
+ currentMethod,
1062
+ i,
1063
+ l;
1064
+ var target = actionToCancel.target;
1065
+ var method = actionToCancel.method;
1066
+ var GUID_KEY = this.globalOptions.GUID_KEY;
980
1067
 
981
- if (backburner._laterTimer) {
982
- // Clear when:
983
- // - Already expired
984
- // - New timer is earlier
985
- clearTimeout(backburner._laterTimer);
1068
+ if (GUID_KEY && this.targetQueues && target) {
1069
+ var targetQueue = this.targetQueues[target[GUID_KEY]];
986
1070
 
987
- if (backburner._laterTimerExpiresAt < n) {
988
- // If timer was never triggered
989
- // Calculate the left-over wait-time
990
- wait = Math.max(0, executeAt - n);
1071
+ if (targetQueue) {
1072
+ for (i = 0, l = targetQueue.length; i < l; i++) {
1073
+ if (targetQueue[i] === method) {
1074
+ targetQueue.splice(i, 1);
1075
+ }
1076
+ }
991
1077
  }
992
1078
  }
993
1079
 
994
- backburner._laterTimer = _backburnerPlatform.default.setTimeout(function () {
995
- backburner._laterTimer = null;
996
- backburner._laterTimerExpiresAt = null;
997
- executeTimers(backburner);
998
- }, wait);
1080
+ for (i = 0, l = queue.length; i < l; i += 4) {
1081
+ currentTarget = queue[i];
1082
+ currentMethod = queue[i + 1];
999
1083
 
1000
- backburner._laterTimerExpiresAt = n + wait;
1001
- }
1002
- }
1084
+ if (currentTarget === target && currentMethod === method) {
1085
+ queue.splice(i, 4);
1086
+ return true;
1087
+ }
1088
+ }
1003
1089
 
1004
- function executeTimers(backburner) {
1005
- var n = _backburnerUtils.now();
1006
- var fns, i, l;
1090
+ // if not found in current queue
1091
+ // could be in the queue that is being flushed
1092
+ queue = this._queueBeingFlushed;
1007
1093
 
1008
- backburner.run(function () {
1009
- i = _backburnerBinarySearch.default(n, backburner._timers);
1094
+ if (!queue) {
1095
+ return;
1096
+ }
1010
1097
 
1011
- fns = backburner._timers.splice(0, i);
1098
+ for (i = 0, l = queue.length; i < l; i += 4) {
1099
+ currentTarget = queue[i];
1100
+ currentMethod = queue[i + 1];
1012
1101
 
1013
- for (i = 1, l = fns.length; i < l; i += 2) {
1014
- backburner.schedule(backburner.options.defaultQueue, null, fns[i]);
1102
+ if (currentTarget === target && currentMethod === method) {
1103
+ // don't mess with array during flush
1104
+ // just nullify the method
1105
+ queue[i + 1] = null;
1106
+ return true;
1107
+ }
1015
1108
  }
1016
- });
1017
-
1018
- if (backburner._timers.length) {
1019
- updateLaterTimer(backburner, backburner._timers[0], backburner._timers[0] - n);
1020
1109
  }
1021
- }
1110
+ };
1111
+ });
1112
+ enifed('backburner/utils', ['exports'], function (exports) {
1113
+ 'use strict';
1022
1114
 
1023
- function findDebouncee(target, method, debouncees) {
1024
- return findItem(target, method, debouncees);
1025
- }
1115
+ exports.each = each;
1116
+ exports.isString = isString;
1117
+ exports.isFunction = isFunction;
1118
+ exports.isNumber = isNumber;
1119
+ exports.isCoercableNumber = isCoercableNumber;
1120
+ exports.wrapInTryCatch = wrapInTryCatch;
1121
+ var NUMBER = /\d+/;
1026
1122
 
1027
- function findThrottler(target, method, throttlers) {
1028
- return findItem(target, method, throttlers);
1123
+ function each(collection, callback) {
1124
+ for (var i = 0; i < collection.length; i++) {
1125
+ callback(collection[i]);
1126
+ }
1029
1127
  }
1030
1128
 
1031
- function findItem(target, method, collection) {
1032
- var item;
1033
- var index = -1;
1129
+ // Date.now is not available in browsers < IE9
1130
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility
1131
+ var now = Date.now || function () {
1132
+ return new Date().getTime();
1133
+ };
1034
1134
 
1035
- for (var i = 0, l = collection.length; i < l; i++) {
1036
- item = collection[i];
1037
- if (item[0] === target && item[1] === method) {
1038
- index = i;
1039
- break;
1040
- }
1041
- }
1135
+ exports.now = now;
1042
1136
 
1043
- return index;
1137
+ function isString(suspect) {
1138
+ return typeof suspect === 'string';
1044
1139
  }
1045
- });
1046
- requireModule("ember-debug");
1047
- requireModule("ember-template-compiler");
1048
1140
 
1049
- enifed('ember-debug/deprecation-manager', ['exports', 'ember-metal/dictionary', 'ember-metal/utils'], function (exports, _emberMetalDictionary, _emberMetalUtils) {
1050
- 'use strict';
1141
+ function isFunction(suspect) {
1142
+ return typeof suspect === 'function';
1143
+ }
1051
1144
 
1052
- var deprecationLevels = {
1053
- RAISE: _emberMetalUtils.symbol('RAISE'),
1054
- LOG: _emberMetalUtils.symbol('LOG'),
1055
- SILENCE: _emberMetalUtils.symbol('SILENCE')
1056
- };
1145
+ function isNumber(suspect) {
1146
+ return typeof suspect === 'number';
1147
+ }
1057
1148
 
1058
- exports.deprecationLevels = deprecationLevels;
1059
- exports.default = {
1060
- defaultLevel: deprecationLevels.LOG,
1061
- individualLevels: _emberMetalDictionary.default(null),
1062
- setDefaultLevel: function (level) {
1063
- this.defaultLevel = level;
1064
- },
1065
- setLevel: function (id, level) {
1066
- this.individualLevels[id] = level;
1067
- },
1068
- getLevel: function (id) {
1069
- var level = this.individualLevels[id];
1070
- if (!level) {
1071
- level = this.defaultLevel;
1149
+ function isCoercableNumber(number) {
1150
+ return isNumber(number) || NUMBER.test(number);
1151
+ }
1152
+
1153
+ function wrapInTryCatch(func) {
1154
+ return function () {
1155
+ try {
1156
+ return func.apply(this, arguments);
1157
+ } catch (e) {
1158
+ throw e;
1072
1159
  }
1073
- return level;
1074
- }
1075
- };
1160
+ };
1161
+ }
1076
1162
  });
1077
1163
  enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'ember-metal/error', 'ember-metal/logger', 'ember-debug/deprecation-manager', 'ember-metal/environment'], function (exports, _emberMetalCore, _emberMetalFeatures, _emberMetalError, _emberMetalLogger, _emberDebugDeprecationManager, _emberMetalEnvironment) {
1078
1164
  /*global __fail__*/
@@ -1400,6 +1486,242 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1400
1486
  _emberMetalCore.default.warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');
1401
1487
  }
1402
1488
  });
1489
+ enifed('ember-debug/deprecation-manager', ['exports', 'ember-metal/dictionary', 'ember-metal/utils'], function (exports, _emberMetalDictionary, _emberMetalUtils) {
1490
+ 'use strict';
1491
+
1492
+ var deprecationLevels = {
1493
+ RAISE: _emberMetalUtils.symbol('RAISE'),
1494
+ LOG: _emberMetalUtils.symbol('LOG'),
1495
+ SILENCE: _emberMetalUtils.symbol('SILENCE')
1496
+ };
1497
+
1498
+ exports.deprecationLevels = deprecationLevels;
1499
+ exports.default = {
1500
+ defaultLevel: deprecationLevels.LOG,
1501
+ individualLevels: _emberMetalDictionary.default(null),
1502
+ setDefaultLevel: function (level) {
1503
+ this.defaultLevel = level;
1504
+ },
1505
+ setLevel: function (id, level) {
1506
+ this.individualLevels[id] = level;
1507
+ },
1508
+ getLevel: function (id) {
1509
+ var level = this.individualLevels[id];
1510
+ if (!level) {
1511
+ level = this.defaultLevel;
1512
+ }
1513
+ return level;
1514
+ }
1515
+ };
1516
+ });
1517
+ enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/features', 'ember-metal/merge', 'ember-metal/instrumentation', 'ember-metal/utils', 'ember-metal/error', 'ember-metal/cache', 'ember-metal/logger', 'ember-metal/property_get', 'ember-metal/events', 'ember-metal/observer_set', 'ember-metal/property_events', 'ember-metal/properties', 'ember-metal/property_set', 'ember-metal/map', 'ember-metal/get_properties', 'ember-metal/set_properties', 'ember-metal/watch_key', 'ember-metal/chains', 'ember-metal/watch_path', 'ember-metal/watching', 'ember-metal/expand_properties', 'ember-metal/computed', 'ember-metal/alias', 'ember-metal/computed_macros', 'ember-metal/observer', 'ember-metal/mixin', 'ember-metal/binding', 'ember-metal/run_loop', 'ember-metal/libraries', 'ember-metal/is_none', 'ember-metal/is_empty', 'ember-metal/is_blank', 'ember-metal/is_present', 'backburner', 'ember-metal/streams/utils', 'ember-metal/streams/stream'], function (exports, _emberMetalCore, _emberMetalFeatures, _emberMetalMerge, _emberMetalInstrumentation, _emberMetalUtils, _emberMetalError, _emberMetalCache, _emberMetalLogger, _emberMetalProperty_get, _emberMetalEvents, _emberMetalObserver_set, _emberMetalProperty_events, _emberMetalProperties, _emberMetalProperty_set, _emberMetalMap, _emberMetalGet_properties, _emberMetalSet_properties, _emberMetalWatch_key, _emberMetalChains, _emberMetalWatch_path, _emberMetalWatching, _emberMetalExpand_properties, _emberMetalComputed, _emberMetalAlias, _emberMetalComputed_macros, _emberMetalObserver, _emberMetalMixin, _emberMetalBinding, _emberMetalRun_loop, _emberMetalLibraries, _emberMetalIs_none, _emberMetalIs_empty, _emberMetalIs_blank, _emberMetalIs_present, _backburner, _emberMetalStreamsUtils, _emberMetalStreamsStream) {
1518
+ /**
1519
+ @module ember
1520
+ @submodule ember-metal
1521
+ */
1522
+
1523
+ // BEGIN IMPORTS
1524
+ 'use strict';
1525
+
1526
+ _emberMetalComputed.computed.empty = _emberMetalComputed_macros.empty;
1527
+ _emberMetalComputed.computed.notEmpty = _emberMetalComputed_macros.notEmpty;
1528
+ _emberMetalComputed.computed.none = _emberMetalComputed_macros.none;
1529
+ _emberMetalComputed.computed.not = _emberMetalComputed_macros.not;
1530
+ _emberMetalComputed.computed.bool = _emberMetalComputed_macros.bool;
1531
+ _emberMetalComputed.computed.match = _emberMetalComputed_macros.match;
1532
+ _emberMetalComputed.computed.equal = _emberMetalComputed_macros.equal;
1533
+ _emberMetalComputed.computed.gt = _emberMetalComputed_macros.gt;
1534
+ _emberMetalComputed.computed.gte = _emberMetalComputed_macros.gte;
1535
+ _emberMetalComputed.computed.lt = _emberMetalComputed_macros.lt;
1536
+ _emberMetalComputed.computed.lte = _emberMetalComputed_macros.lte;
1537
+ _emberMetalComputed.computed.alias = _emberMetalAlias.default;
1538
+ _emberMetalComputed.computed.oneWay = _emberMetalComputed_macros.oneWay;
1539
+ _emberMetalComputed.computed.reads = _emberMetalComputed_macros.oneWay;
1540
+ _emberMetalComputed.computed.readOnly = _emberMetalComputed_macros.readOnly;
1541
+ _emberMetalComputed.computed.defaultTo = _emberMetalComputed_macros.defaultTo;
1542
+ _emberMetalComputed.computed.deprecatingAlias = _emberMetalComputed_macros.deprecatingAlias;
1543
+ _emberMetalComputed.computed.and = _emberMetalComputed_macros.and;
1544
+ _emberMetalComputed.computed.or = _emberMetalComputed_macros.or;
1545
+ _emberMetalComputed.computed.any = _emberMetalComputed_macros.any;
1546
+ _emberMetalComputed.computed.collect = _emberMetalComputed_macros.collect;
1547
+
1548
+ // END IMPORTS
1549
+
1550
+ // BEGIN EXPORTS
1551
+ var EmberInstrumentation = _emberMetalCore.default.Instrumentation = {};
1552
+ EmberInstrumentation.instrument = _emberMetalInstrumentation.instrument;
1553
+ EmberInstrumentation.subscribe = _emberMetalInstrumentation.subscribe;
1554
+ EmberInstrumentation.unsubscribe = _emberMetalInstrumentation.unsubscribe;
1555
+ EmberInstrumentation.reset = _emberMetalInstrumentation.reset;
1556
+
1557
+ _emberMetalCore.default.instrument = _emberMetalInstrumentation.instrument;
1558
+ _emberMetalCore.default.subscribe = _emberMetalInstrumentation.subscribe;
1559
+
1560
+ _emberMetalCore.default._Cache = _emberMetalCache.default;
1561
+
1562
+ _emberMetalCore.default.generateGuid = _emberMetalUtils.generateGuid;
1563
+ _emberMetalCore.default.GUID_KEY = _emberMetalUtils.GUID_KEY;
1564
+ _emberMetalCore.default.platform = {
1565
+ defineProperty: true,
1566
+ hasPropertyAccessors: true
1567
+ };
1568
+
1569
+ _emberMetalCore.default.Error = _emberMetalError.default;
1570
+ _emberMetalCore.default.guidFor = _emberMetalUtils.guidFor;
1571
+ _emberMetalCore.default.META_DESC = _emberMetalUtils.META_DESC;
1572
+ _emberMetalCore.default.EMPTY_META = _emberMetalUtils.EMPTY_META;
1573
+ _emberMetalCore.default.meta = _emberMetalUtils.meta;
1574
+ _emberMetalCore.default.inspect = _emberMetalUtils.inspect;
1575
+ _emberMetalCore.default.tryCatchFinally = _emberMetalUtils.deprecatedTryCatchFinally;
1576
+ _emberMetalCore.default.makeArray = _emberMetalUtils.makeArray;
1577
+ _emberMetalCore.default.canInvoke = _emberMetalUtils.canInvoke;
1578
+ _emberMetalCore.default.tryInvoke = _emberMetalUtils.tryInvoke;
1579
+ _emberMetalCore.default.wrap = _emberMetalUtils.wrap;
1580
+ _emberMetalCore.default.apply = _emberMetalUtils.apply;
1581
+ _emberMetalCore.default.applyStr = _emberMetalUtils.applyStr;
1582
+ _emberMetalCore.default.uuid = _emberMetalUtils.uuid;
1583
+
1584
+ _emberMetalCore.default.Logger = _emberMetalLogger.default;
1585
+
1586
+ _emberMetalCore.default.get = _emberMetalProperty_get.get;
1587
+ _emberMetalCore.default.getWithDefault = _emberMetalProperty_get.getWithDefault;
1588
+ _emberMetalCore.default.normalizeTuple = _emberMetalProperty_get.normalizeTuple;
1589
+ _emberMetalCore.default._getPath = _emberMetalProperty_get._getPath;
1590
+
1591
+ _emberMetalCore.default.on = _emberMetalEvents.on;
1592
+ _emberMetalCore.default.addListener = _emberMetalEvents.addListener;
1593
+ _emberMetalCore.default.removeListener = _emberMetalEvents.removeListener;
1594
+ _emberMetalCore.default._suspendListener = _emberMetalEvents.suspendListener;
1595
+ _emberMetalCore.default._suspendListeners = _emberMetalEvents.suspendListeners;
1596
+ _emberMetalCore.default.sendEvent = _emberMetalEvents.sendEvent;
1597
+ _emberMetalCore.default.hasListeners = _emberMetalEvents.hasListeners;
1598
+ _emberMetalCore.default.watchedEvents = _emberMetalEvents.watchedEvents;
1599
+ _emberMetalCore.default.listenersFor = _emberMetalEvents.listenersFor;
1600
+ _emberMetalCore.default.accumulateListeners = _emberMetalEvents.accumulateListeners;
1601
+
1602
+ _emberMetalCore.default._ObserverSet = _emberMetalObserver_set.default;
1603
+
1604
+ _emberMetalCore.default.propertyWillChange = _emberMetalProperty_events.propertyWillChange;
1605
+ _emberMetalCore.default.propertyDidChange = _emberMetalProperty_events.propertyDidChange;
1606
+ _emberMetalCore.default.overrideChains = _emberMetalProperty_events.overrideChains;
1607
+ _emberMetalCore.default.beginPropertyChanges = _emberMetalProperty_events.beginPropertyChanges;
1608
+ _emberMetalCore.default.endPropertyChanges = _emberMetalProperty_events.endPropertyChanges;
1609
+ _emberMetalCore.default.changeProperties = _emberMetalProperty_events.changeProperties;
1610
+
1611
+ _emberMetalCore.default.defineProperty = _emberMetalProperties.defineProperty;
1612
+
1613
+ _emberMetalCore.default.set = _emberMetalProperty_set.set;
1614
+ _emberMetalCore.default.trySet = _emberMetalProperty_set.trySet;
1615
+
1616
+ _emberMetalCore.default.OrderedSet = _emberMetalMap.OrderedSet;
1617
+ _emberMetalCore.default.Map = _emberMetalMap.Map;
1618
+ _emberMetalCore.default.MapWithDefault = _emberMetalMap.MapWithDefault;
1619
+
1620
+ _emberMetalCore.default.getProperties = _emberMetalGet_properties.default;
1621
+ _emberMetalCore.default.setProperties = _emberMetalSet_properties.default;
1622
+
1623
+ _emberMetalCore.default.watchKey = _emberMetalWatch_key.watchKey;
1624
+ _emberMetalCore.default.unwatchKey = _emberMetalWatch_key.unwatchKey;
1625
+
1626
+ _emberMetalCore.default.flushPendingChains = _emberMetalChains.flushPendingChains;
1627
+ _emberMetalCore.default.removeChainWatcher = _emberMetalChains.removeChainWatcher;
1628
+ _emberMetalCore.default._ChainNode = _emberMetalChains.ChainNode;
1629
+ _emberMetalCore.default.finishChains = _emberMetalChains.finishChains;
1630
+
1631
+ _emberMetalCore.default.watchPath = _emberMetalWatch_path.watchPath;
1632
+ _emberMetalCore.default.unwatchPath = _emberMetalWatch_path.unwatchPath;
1633
+
1634
+ _emberMetalCore.default.watch = _emberMetalWatching.watch;
1635
+ _emberMetalCore.default.isWatching = _emberMetalWatching.isWatching;
1636
+ _emberMetalCore.default.unwatch = _emberMetalWatching.unwatch;
1637
+ _emberMetalCore.default.rewatch = _emberMetalWatching.rewatch;
1638
+ _emberMetalCore.default.destroy = _emberMetalWatching.destroy;
1639
+
1640
+ _emberMetalCore.default.expandProperties = _emberMetalExpand_properties.default;
1641
+
1642
+ _emberMetalCore.default.ComputedProperty = _emberMetalComputed.ComputedProperty;
1643
+ _emberMetalCore.default.computed = _emberMetalComputed.computed;
1644
+ _emberMetalCore.default.cacheFor = _emberMetalComputed.cacheFor;
1645
+
1646
+ _emberMetalCore.default.addObserver = _emberMetalObserver.addObserver;
1647
+ _emberMetalCore.default.observersFor = _emberMetalObserver.observersFor;
1648
+ _emberMetalCore.default.removeObserver = _emberMetalObserver.removeObserver;
1649
+ _emberMetalCore.default._suspendObserver = _emberMetalObserver._suspendObserver;
1650
+ _emberMetalCore.default._suspendObservers = _emberMetalObserver._suspendObservers;
1651
+
1652
+ _emberMetalCore.default.IS_BINDING = _emberMetalMixin.IS_BINDING;
1653
+ _emberMetalCore.default.required = _emberMetalMixin.required;
1654
+ _emberMetalCore.default.aliasMethod = _emberMetalMixin.aliasMethod;
1655
+ _emberMetalCore.default.observer = _emberMetalMixin.observer;
1656
+ _emberMetalCore.default.immediateObserver = _emberMetalMixin._immediateObserver;
1657
+ _emberMetalCore.default.mixin = _emberMetalMixin.mixin;
1658
+ _emberMetalCore.default.Mixin = _emberMetalMixin.Mixin;
1659
+
1660
+ _emberMetalCore.default.bind = _emberMetalBinding.bind;
1661
+ _emberMetalCore.default.Binding = _emberMetalBinding.Binding;
1662
+ _emberMetalCore.default.isGlobalPath = _emberMetalBinding.isGlobalPath;
1663
+
1664
+ _emberMetalCore.default.run = _emberMetalRun_loop.default;
1665
+
1666
+ /**
1667
+ @class Backburner
1668
+ @for Ember
1669
+ @private
1670
+ */
1671
+ _emberMetalCore.default.Backburner = _backburner.default;
1672
+ // this is the new go forward, once Ember Data updates to using `_Backburner` we
1673
+ // can remove the non-underscored version.
1674
+ _emberMetalCore.default._Backburner = _backburner.default;
1675
+
1676
+ _emberMetalCore.default.libraries = new _emberMetalLibraries.default();
1677
+ _emberMetalCore.default.libraries.registerCoreLibrary('Ember', _emberMetalCore.default.VERSION);
1678
+
1679
+ _emberMetalCore.default.isNone = _emberMetalIs_none.default;
1680
+ _emberMetalCore.default.isEmpty = _emberMetalIs_empty.default;
1681
+ _emberMetalCore.default.isBlank = _emberMetalIs_blank.default;
1682
+ _emberMetalCore.default.isPresent = _emberMetalIs_present.default;
1683
+
1684
+ _emberMetalCore.default.merge = _emberMetalMerge.default;
1685
+
1686
+ _emberMetalCore.default.FEATURES = _emberMetalFeatures.FEATURES;
1687
+ _emberMetalCore.default.FEATURES.isEnabled = _emberMetalFeatures.default;
1688
+
1689
+ /**
1690
+ A function may be assigned to `Ember.onerror` to be called when Ember
1691
+ internals encounter an error. This is useful for specialized error handling
1692
+ and reporting code.
1693
+
1694
+ ```javascript
1695
+ Ember.onerror = function(error) {
1696
+ Em.$.ajax('/report-error', 'POST', {
1697
+ stack: error.stack,
1698
+ otherInformation: 'whatever app state you want to provide'
1699
+ });
1700
+ };
1701
+ ```
1702
+
1703
+ Internally, `Ember.onerror` is used as Backburner's error handler.
1704
+
1705
+ @event onerror
1706
+ @for Ember
1707
+ @param {Exception} error the error object
1708
+ @public
1709
+ */
1710
+ _emberMetalCore.default.onerror = null;
1711
+ // END EXPORTS
1712
+
1713
+ // do this for side-effects of updating Ember.assert, warn, etc when
1714
+ // ember-debug is present
1715
+ // This needs to be called before any deprecateFunc
1716
+ if (_emberMetalCore.default.__loader.registry['ember-debug']) {
1717
+ requireModule('ember-debug');
1718
+ }
1719
+
1720
+ _emberMetalCore.default.create = _emberMetalCore.default.deprecateFunc('Ember.create is deprecated in favor of Object.create', { id: 'ember-metal.ember-create', until: '3.0.0' }, Object.create);
1721
+ _emberMetalCore.default.keys = _emberMetalCore.default.deprecateFunc('Ember.keys is deprecated in favor of Object.keys', { id: 'ember-metal.ember.keys', until: '3.0.0' }, Object.keys);
1722
+
1723
+ exports.default = _emberMetalCore.default;
1724
+ });
1403
1725
  enifed('ember-metal/alias', ['exports', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/core', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/utils', 'ember-metal/dependent_keys'], function (exports, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalCore, _emberMetalError, _emberMetalProperties, _emberMetalComputed, _emberMetalUtils, _emberMetalDependent_keys) {
1404
1726
  'use strict';
1405
1727
 
@@ -10648,312 +10970,139 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
10648
10970
 
10649
10971
  'use strict';
10650
10972
 
10651
- exports.isWatching = isWatching;
10652
- exports.unwatch = unwatch;
10653
- exports.destroy = destroy;
10654
-
10655
- /**
10656
- Starts watching a property on an object. Whenever the property changes,
10657
- invokes `Ember.propertyWillChange` and `Ember.propertyDidChange`. This is the
10658
- primitive used by observers and dependent keys; usually you will never call
10659
- this method directly but instead use higher level methods like
10660
- `Ember.addObserver()`
10661
-
10662
- @private
10663
- @method watch
10664
- @for Ember
10665
- @param obj
10666
- @param {String} _keyPath
10667
- */
10668
- function watch(obj, _keyPath, m) {
10669
- // can't watch length on Array - it is special...
10670
- if (_keyPath === 'length' && Array.isArray(obj)) {
10671
- return;
10672
- }
10673
-
10674
- if (!_emberMetalPath_cache.isPath(_keyPath)) {
10675
- _emberMetalWatch_key.watchKey(obj, _keyPath, m);
10676
- } else {
10677
- _emberMetalWatch_path.watchPath(obj, _keyPath, m);
10678
- }
10679
- }
10680
-
10681
- exports.watch = watch;
10682
-
10683
- function isWatching(obj, key) {
10684
- var meta = obj['__ember_meta__'];
10685
- return (meta && meta.watching[key]) > 0;
10686
- }
10687
-
10688
- watch.flushPending = _emberMetalChains.flushPendingChains;
10689
-
10690
- function unwatch(obj, _keyPath, m) {
10691
- // can't watch length on Array - it is special...
10692
- if (_keyPath === 'length' && Array.isArray(obj)) {
10693
- return;
10694
- }
10695
-
10696
- if (!_emberMetalPath_cache.isPath(_keyPath)) {
10697
- _emberMetalWatch_key.unwatchKey(obj, _keyPath, m);
10698
- } else {
10699
- _emberMetalWatch_path.unwatchPath(obj, _keyPath, m);
10700
- }
10701
- }
10702
-
10703
- var NODE_STACK = [];
10704
-
10705
- /**
10706
- Tears down the meta on an object so that it can be garbage collected.
10707
- Multiple calls will have no effect.
10708
-
10709
- @method destroy
10710
- @for Ember
10711
- @param {Object} obj the object to destroy
10712
- @return {void}
10713
- @private
10714
- */
10715
-
10716
- function destroy(obj) {
10717
- var meta = obj['__ember_meta__'];
10718
- var node, nodes, key, nodeObject;
10719
-
10720
- if (meta) {
10721
- obj['__ember_meta__'] = null;
10722
- // remove chainWatchers to remove circular references that would prevent GC
10723
- node = meta.chains;
10724
- if (node) {
10725
- NODE_STACK.push(node);
10726
- // process tree
10727
- while (NODE_STACK.length > 0) {
10728
- node = NODE_STACK.pop();
10729
- // push children
10730
- nodes = node._chains;
10731
- if (nodes) {
10732
- for (key in nodes) {
10733
- if (nodes[key] !== undefined) {
10734
- NODE_STACK.push(nodes[key]);
10735
- }
10736
- }
10737
- }
10738
- // remove chainWatcher in node object
10739
- if (node._watching) {
10740
- nodeObject = node._object;
10741
- if (nodeObject) {
10742
- _emberMetalChains.removeChainWatcher(nodeObject, node._key, node);
10743
- }
10744
- }
10745
- }
10746
- }
10747
- }
10748
- }
10749
- });
10750
- enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/features', 'ember-metal/merge', 'ember-metal/instrumentation', 'ember-metal/utils', 'ember-metal/error', 'ember-metal/cache', 'ember-metal/logger', 'ember-metal/property_get', 'ember-metal/events', 'ember-metal/observer_set', 'ember-metal/property_events', 'ember-metal/properties', 'ember-metal/property_set', 'ember-metal/map', 'ember-metal/get_properties', 'ember-metal/set_properties', 'ember-metal/watch_key', 'ember-metal/chains', 'ember-metal/watch_path', 'ember-metal/watching', 'ember-metal/expand_properties', 'ember-metal/computed', 'ember-metal/alias', 'ember-metal/computed_macros', 'ember-metal/observer', 'ember-metal/mixin', 'ember-metal/binding', 'ember-metal/run_loop', 'ember-metal/libraries', 'ember-metal/is_none', 'ember-metal/is_empty', 'ember-metal/is_blank', 'ember-metal/is_present', 'backburner', 'ember-metal/streams/utils', 'ember-metal/streams/stream'], function (exports, _emberMetalCore, _emberMetalFeatures, _emberMetalMerge, _emberMetalInstrumentation, _emberMetalUtils, _emberMetalError, _emberMetalCache, _emberMetalLogger, _emberMetalProperty_get, _emberMetalEvents, _emberMetalObserver_set, _emberMetalProperty_events, _emberMetalProperties, _emberMetalProperty_set, _emberMetalMap, _emberMetalGet_properties, _emberMetalSet_properties, _emberMetalWatch_key, _emberMetalChains, _emberMetalWatch_path, _emberMetalWatching, _emberMetalExpand_properties, _emberMetalComputed, _emberMetalAlias, _emberMetalComputed_macros, _emberMetalObserver, _emberMetalMixin, _emberMetalBinding, _emberMetalRun_loop, _emberMetalLibraries, _emberMetalIs_none, _emberMetalIs_empty, _emberMetalIs_blank, _emberMetalIs_present, _backburner, _emberMetalStreamsUtils, _emberMetalStreamsStream) {
10751
- /**
10752
- @module ember
10753
- @submodule ember-metal
10754
- */
10755
-
10756
- // BEGIN IMPORTS
10757
- 'use strict';
10758
-
10759
- _emberMetalComputed.computed.empty = _emberMetalComputed_macros.empty;
10760
- _emberMetalComputed.computed.notEmpty = _emberMetalComputed_macros.notEmpty;
10761
- _emberMetalComputed.computed.none = _emberMetalComputed_macros.none;
10762
- _emberMetalComputed.computed.not = _emberMetalComputed_macros.not;
10763
- _emberMetalComputed.computed.bool = _emberMetalComputed_macros.bool;
10764
- _emberMetalComputed.computed.match = _emberMetalComputed_macros.match;
10765
- _emberMetalComputed.computed.equal = _emberMetalComputed_macros.equal;
10766
- _emberMetalComputed.computed.gt = _emberMetalComputed_macros.gt;
10767
- _emberMetalComputed.computed.gte = _emberMetalComputed_macros.gte;
10768
- _emberMetalComputed.computed.lt = _emberMetalComputed_macros.lt;
10769
- _emberMetalComputed.computed.lte = _emberMetalComputed_macros.lte;
10770
- _emberMetalComputed.computed.alias = _emberMetalAlias.default;
10771
- _emberMetalComputed.computed.oneWay = _emberMetalComputed_macros.oneWay;
10772
- _emberMetalComputed.computed.reads = _emberMetalComputed_macros.oneWay;
10773
- _emberMetalComputed.computed.readOnly = _emberMetalComputed_macros.readOnly;
10774
- _emberMetalComputed.computed.defaultTo = _emberMetalComputed_macros.defaultTo;
10775
- _emberMetalComputed.computed.deprecatingAlias = _emberMetalComputed_macros.deprecatingAlias;
10776
- _emberMetalComputed.computed.and = _emberMetalComputed_macros.and;
10777
- _emberMetalComputed.computed.or = _emberMetalComputed_macros.or;
10778
- _emberMetalComputed.computed.any = _emberMetalComputed_macros.any;
10779
- _emberMetalComputed.computed.collect = _emberMetalComputed_macros.collect;
10780
-
10781
- // END IMPORTS
10782
-
10783
- // BEGIN EXPORTS
10784
- var EmberInstrumentation = _emberMetalCore.default.Instrumentation = {};
10785
- EmberInstrumentation.instrument = _emberMetalInstrumentation.instrument;
10786
- EmberInstrumentation.subscribe = _emberMetalInstrumentation.subscribe;
10787
- EmberInstrumentation.unsubscribe = _emberMetalInstrumentation.unsubscribe;
10788
- EmberInstrumentation.reset = _emberMetalInstrumentation.reset;
10789
-
10790
- _emberMetalCore.default.instrument = _emberMetalInstrumentation.instrument;
10791
- _emberMetalCore.default.subscribe = _emberMetalInstrumentation.subscribe;
10792
-
10793
- _emberMetalCore.default._Cache = _emberMetalCache.default;
10794
-
10795
- _emberMetalCore.default.generateGuid = _emberMetalUtils.generateGuid;
10796
- _emberMetalCore.default.GUID_KEY = _emberMetalUtils.GUID_KEY;
10797
- _emberMetalCore.default.platform = {
10798
- defineProperty: true,
10799
- hasPropertyAccessors: true
10800
- };
10801
-
10802
- _emberMetalCore.default.Error = _emberMetalError.default;
10803
- _emberMetalCore.default.guidFor = _emberMetalUtils.guidFor;
10804
- _emberMetalCore.default.META_DESC = _emberMetalUtils.META_DESC;
10805
- _emberMetalCore.default.EMPTY_META = _emberMetalUtils.EMPTY_META;
10806
- _emberMetalCore.default.meta = _emberMetalUtils.meta;
10807
- _emberMetalCore.default.inspect = _emberMetalUtils.inspect;
10808
- _emberMetalCore.default.tryCatchFinally = _emberMetalUtils.deprecatedTryCatchFinally;
10809
- _emberMetalCore.default.makeArray = _emberMetalUtils.makeArray;
10810
- _emberMetalCore.default.canInvoke = _emberMetalUtils.canInvoke;
10811
- _emberMetalCore.default.tryInvoke = _emberMetalUtils.tryInvoke;
10812
- _emberMetalCore.default.wrap = _emberMetalUtils.wrap;
10813
- _emberMetalCore.default.apply = _emberMetalUtils.apply;
10814
- _emberMetalCore.default.applyStr = _emberMetalUtils.applyStr;
10815
- _emberMetalCore.default.uuid = _emberMetalUtils.uuid;
10816
-
10817
- _emberMetalCore.default.Logger = _emberMetalLogger.default;
10818
-
10819
- _emberMetalCore.default.get = _emberMetalProperty_get.get;
10820
- _emberMetalCore.default.getWithDefault = _emberMetalProperty_get.getWithDefault;
10821
- _emberMetalCore.default.normalizeTuple = _emberMetalProperty_get.normalizeTuple;
10822
- _emberMetalCore.default._getPath = _emberMetalProperty_get._getPath;
10823
-
10824
- _emberMetalCore.default.on = _emberMetalEvents.on;
10825
- _emberMetalCore.default.addListener = _emberMetalEvents.addListener;
10826
- _emberMetalCore.default.removeListener = _emberMetalEvents.removeListener;
10827
- _emberMetalCore.default._suspendListener = _emberMetalEvents.suspendListener;
10828
- _emberMetalCore.default._suspendListeners = _emberMetalEvents.suspendListeners;
10829
- _emberMetalCore.default.sendEvent = _emberMetalEvents.sendEvent;
10830
- _emberMetalCore.default.hasListeners = _emberMetalEvents.hasListeners;
10831
- _emberMetalCore.default.watchedEvents = _emberMetalEvents.watchedEvents;
10832
- _emberMetalCore.default.listenersFor = _emberMetalEvents.listenersFor;
10833
- _emberMetalCore.default.accumulateListeners = _emberMetalEvents.accumulateListeners;
10834
-
10835
- _emberMetalCore.default._ObserverSet = _emberMetalObserver_set.default;
10836
-
10837
- _emberMetalCore.default.propertyWillChange = _emberMetalProperty_events.propertyWillChange;
10838
- _emberMetalCore.default.propertyDidChange = _emberMetalProperty_events.propertyDidChange;
10839
- _emberMetalCore.default.overrideChains = _emberMetalProperty_events.overrideChains;
10840
- _emberMetalCore.default.beginPropertyChanges = _emberMetalProperty_events.beginPropertyChanges;
10841
- _emberMetalCore.default.endPropertyChanges = _emberMetalProperty_events.endPropertyChanges;
10842
- _emberMetalCore.default.changeProperties = _emberMetalProperty_events.changeProperties;
10843
-
10844
- _emberMetalCore.default.defineProperty = _emberMetalProperties.defineProperty;
10845
-
10846
- _emberMetalCore.default.set = _emberMetalProperty_set.set;
10847
- _emberMetalCore.default.trySet = _emberMetalProperty_set.trySet;
10848
-
10849
- _emberMetalCore.default.OrderedSet = _emberMetalMap.OrderedSet;
10850
- _emberMetalCore.default.Map = _emberMetalMap.Map;
10851
- _emberMetalCore.default.MapWithDefault = _emberMetalMap.MapWithDefault;
10852
-
10853
- _emberMetalCore.default.getProperties = _emberMetalGet_properties.default;
10854
- _emberMetalCore.default.setProperties = _emberMetalSet_properties.default;
10855
-
10856
- _emberMetalCore.default.watchKey = _emberMetalWatch_key.watchKey;
10857
- _emberMetalCore.default.unwatchKey = _emberMetalWatch_key.unwatchKey;
10858
-
10859
- _emberMetalCore.default.flushPendingChains = _emberMetalChains.flushPendingChains;
10860
- _emberMetalCore.default.removeChainWatcher = _emberMetalChains.removeChainWatcher;
10861
- _emberMetalCore.default._ChainNode = _emberMetalChains.ChainNode;
10862
- _emberMetalCore.default.finishChains = _emberMetalChains.finishChains;
10863
-
10864
- _emberMetalCore.default.watchPath = _emberMetalWatch_path.watchPath;
10865
- _emberMetalCore.default.unwatchPath = _emberMetalWatch_path.unwatchPath;
10866
-
10867
- _emberMetalCore.default.watch = _emberMetalWatching.watch;
10868
- _emberMetalCore.default.isWatching = _emberMetalWatching.isWatching;
10869
- _emberMetalCore.default.unwatch = _emberMetalWatching.unwatch;
10870
- _emberMetalCore.default.rewatch = _emberMetalWatching.rewatch;
10871
- _emberMetalCore.default.destroy = _emberMetalWatching.destroy;
10872
-
10873
- _emberMetalCore.default.expandProperties = _emberMetalExpand_properties.default;
10874
-
10875
- _emberMetalCore.default.ComputedProperty = _emberMetalComputed.ComputedProperty;
10876
- _emberMetalCore.default.computed = _emberMetalComputed.computed;
10877
- _emberMetalCore.default.cacheFor = _emberMetalComputed.cacheFor;
10878
-
10879
- _emberMetalCore.default.addObserver = _emberMetalObserver.addObserver;
10880
- _emberMetalCore.default.observersFor = _emberMetalObserver.observersFor;
10881
- _emberMetalCore.default.removeObserver = _emberMetalObserver.removeObserver;
10882
- _emberMetalCore.default._suspendObserver = _emberMetalObserver._suspendObserver;
10883
- _emberMetalCore.default._suspendObservers = _emberMetalObserver._suspendObservers;
10884
-
10885
- _emberMetalCore.default.IS_BINDING = _emberMetalMixin.IS_BINDING;
10886
- _emberMetalCore.default.required = _emberMetalMixin.required;
10887
- _emberMetalCore.default.aliasMethod = _emberMetalMixin.aliasMethod;
10888
- _emberMetalCore.default.observer = _emberMetalMixin.observer;
10889
- _emberMetalCore.default.immediateObserver = _emberMetalMixin._immediateObserver;
10890
- _emberMetalCore.default.mixin = _emberMetalMixin.mixin;
10891
- _emberMetalCore.default.Mixin = _emberMetalMixin.Mixin;
10892
-
10893
- _emberMetalCore.default.bind = _emberMetalBinding.bind;
10894
- _emberMetalCore.default.Binding = _emberMetalBinding.Binding;
10895
- _emberMetalCore.default.isGlobalPath = _emberMetalBinding.isGlobalPath;
10896
-
10897
- _emberMetalCore.default.run = _emberMetalRun_loop.default;
10973
+ exports.isWatching = isWatching;
10974
+ exports.unwatch = unwatch;
10975
+ exports.destroy = destroy;
10898
10976
 
10899
10977
  /**
10900
- @class Backburner
10901
- @for Ember
10902
- @private
10978
+ Starts watching a property on an object. Whenever the property changes,
10979
+ invokes `Ember.propertyWillChange` and `Ember.propertyDidChange`. This is the
10980
+ primitive used by observers and dependent keys; usually you will never call
10981
+ this method directly but instead use higher level methods like
10982
+ `Ember.addObserver()`
10983
+
10984
+ @private
10985
+ @method watch
10986
+ @for Ember
10987
+ @param obj
10988
+ @param {String} _keyPath
10903
10989
  */
10904
- _emberMetalCore.default.Backburner = _backburner.default;
10905
- // this is the new go forward, once Ember Data updates to using `_Backburner` we
10906
- // can remove the non-underscored version.
10907
- _emberMetalCore.default._Backburner = _backburner.default;
10990
+ function watch(obj, _keyPath, m) {
10991
+ // can't watch length on Array - it is special...
10992
+ if (_keyPath === 'length' && Array.isArray(obj)) {
10993
+ return;
10994
+ }
10908
10995
 
10909
- _emberMetalCore.default.libraries = new _emberMetalLibraries.default();
10910
- _emberMetalCore.default.libraries.registerCoreLibrary('Ember', _emberMetalCore.default.VERSION);
10996
+ if (!_emberMetalPath_cache.isPath(_keyPath)) {
10997
+ _emberMetalWatch_key.watchKey(obj, _keyPath, m);
10998
+ } else {
10999
+ _emberMetalWatch_path.watchPath(obj, _keyPath, m);
11000
+ }
11001
+ }
10911
11002
 
10912
- _emberMetalCore.default.isNone = _emberMetalIs_none.default;
10913
- _emberMetalCore.default.isEmpty = _emberMetalIs_empty.default;
10914
- _emberMetalCore.default.isBlank = _emberMetalIs_blank.default;
10915
- _emberMetalCore.default.isPresent = _emberMetalIs_present.default;
11003
+ exports.watch = watch;
10916
11004
 
10917
- _emberMetalCore.default.merge = _emberMetalMerge.default;
11005
+ function isWatching(obj, key) {
11006
+ var meta = obj['__ember_meta__'];
11007
+ return (meta && meta.watching[key]) > 0;
11008
+ }
10918
11009
 
10919
- _emberMetalCore.default.FEATURES = _emberMetalFeatures.FEATURES;
10920
- _emberMetalCore.default.FEATURES.isEnabled = _emberMetalFeatures.default;
11010
+ watch.flushPending = _emberMetalChains.flushPendingChains;
11011
+
11012
+ function unwatch(obj, _keyPath, m) {
11013
+ // can't watch length on Array - it is special...
11014
+ if (_keyPath === 'length' && Array.isArray(obj)) {
11015
+ return;
11016
+ }
11017
+
11018
+ if (!_emberMetalPath_cache.isPath(_keyPath)) {
11019
+ _emberMetalWatch_key.unwatchKey(obj, _keyPath, m);
11020
+ } else {
11021
+ _emberMetalWatch_path.unwatchPath(obj, _keyPath, m);
11022
+ }
11023
+ }
11024
+
11025
+ var NODE_STACK = [];
10921
11026
 
10922
11027
  /**
10923
- A function may be assigned to `Ember.onerror` to be called when Ember
10924
- internals encounter an error. This is useful for specialized error handling
10925
- and reporting code.
10926
-
10927
- ```javascript
10928
- Ember.onerror = function(error) {
10929
- Em.$.ajax('/report-error', 'POST', {
10930
- stack: error.stack,
10931
- otherInformation: 'whatever app state you want to provide'
10932
- });
10933
- };
10934
- ```
10935
-
10936
- Internally, `Ember.onerror` is used as Backburner's error handler.
11028
+ Tears down the meta on an object so that it can be garbage collected.
11029
+ Multiple calls will have no effect.
10937
11030
 
10938
- @event onerror
11031
+ @method destroy
10939
11032
  @for Ember
10940
- @param {Exception} error the error object
10941
- @public
11033
+ @param {Object} obj the object to destroy
11034
+ @return {void}
11035
+ @private
10942
11036
  */
10943
- _emberMetalCore.default.onerror = null;
10944
- // END EXPORTS
10945
11037
 
10946
- // do this for side-effects of updating Ember.assert, warn, etc when
10947
- // ember-debug is present
10948
- // This needs to be called before any deprecateFunc
10949
- if (_emberMetalCore.default.__loader.registry['ember-debug']) {
10950
- requireModule('ember-debug');
11038
+ function destroy(obj) {
11039
+ var meta = obj['__ember_meta__'];
11040
+ var node, nodes, key, nodeObject;
11041
+
11042
+ if (meta) {
11043
+ obj['__ember_meta__'] = null;
11044
+ // remove chainWatchers to remove circular references that would prevent GC
11045
+ node = meta.chains;
11046
+ if (node) {
11047
+ NODE_STACK.push(node);
11048
+ // process tree
11049
+ while (NODE_STACK.length > 0) {
11050
+ node = NODE_STACK.pop();
11051
+ // push children
11052
+ nodes = node._chains;
11053
+ if (nodes) {
11054
+ for (key in nodes) {
11055
+ if (nodes[key] !== undefined) {
11056
+ NODE_STACK.push(nodes[key]);
11057
+ }
11058
+ }
11059
+ }
11060
+ // remove chainWatcher in node object
11061
+ if (node._watching) {
11062
+ nodeObject = node._object;
11063
+ if (nodeObject) {
11064
+ _emberMetalChains.removeChainWatcher(nodeObject, node._key, node);
11065
+ }
11066
+ }
11067
+ }
11068
+ }
11069
+ }
11070
+ }
11071
+ });
11072
+ enifed('ember-template-compiler', ['exports', 'ember-metal', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template', 'ember-template-compiler/plugins', 'ember-template-compiler/plugins/transform-old-binding-syntax', 'ember-template-compiler/plugins/transform-old-class-binding-syntax', 'ember-template-compiler/plugins/transform-item-class', 'ember-template-compiler/plugins/transform-component-attrs-into-mut', 'ember-template-compiler/plugins/transform-component-curly-to-readonly', 'ember-template-compiler/plugins/transform-angle-bracket-components', 'ember-template-compiler/plugins/transform-input-on-to-onEvent', 'ember-template-compiler/plugins/transform-each-into-collection', 'ember-template-compiler/plugins/assert-no-view-and-controller-paths', 'ember-template-compiler/plugins/assert-no-view-helper', 'ember-template-compiler/compat'], function (exports, _emberMetal, _emberTemplateCompilerSystemPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemTemplate, _emberTemplateCompilerPlugins, _emberTemplateCompilerPluginsTransformOldBindingSyntax, _emberTemplateCompilerPluginsTransformOldClassBindingSyntax, _emberTemplateCompilerPluginsTransformItemClass, _emberTemplateCompilerPluginsTransformComponentAttrsIntoMut, _emberTemplateCompilerPluginsTransformComponentCurlyToReadonly, _emberTemplateCompilerPluginsTransformAngleBracketComponents, _emberTemplateCompilerPluginsTransformInputOnToOnEvent, _emberTemplateCompilerPluginsTransformEachIntoCollection, _emberTemplateCompilerPluginsAssertNoViewAndControllerPaths, _emberTemplateCompilerPluginsAssertNoViewHelper, _emberTemplateCompilerCompat) {
11073
+ 'use strict';
11074
+
11075
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformOldBindingSyntax.default);
11076
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformOldClassBindingSyntax.default);
11077
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformItemClass.default);
11078
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformComponentAttrsIntoMut.default);
11079
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformComponentCurlyToReadonly.default);
11080
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformAngleBracketComponents.default);
11081
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformInputOnToOnEvent.default);
11082
+
11083
+ if (_emberMetal.default.ENV._ENABLE_LEGACY_VIEW_SUPPORT) {
11084
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformEachIntoCollection.default);
11085
+ } else {
11086
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsAssertNoViewAndControllerPaths.default);
11087
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsAssertNoViewHelper.default);
10951
11088
  }
10952
11089
 
10953
- _emberMetalCore.default.create = _emberMetalCore.default.deprecateFunc('Ember.create is deprecated in favor of Object.create', { id: 'ember-metal.ember-create', until: '3.0.0' }, Object.create);
10954
- _emberMetalCore.default.keys = _emberMetalCore.default.deprecateFunc('Ember.keys is deprecated in favor of Object.keys', { id: 'ember-metal.ember.keys', until: '3.0.0' }, Object.keys);
11090
+ exports._Ember = _emberMetal.default;
11091
+ exports.precompile = _emberTemplateCompilerSystemPrecompile.default;
11092
+ exports.compile = _emberTemplateCompilerSystemCompile.default;
11093
+ exports.template = _emberTemplateCompilerSystemTemplate.default;
11094
+ exports.registerPlugin = _emberTemplateCompilerPlugins.registerPlugin;
11095
+ });
10955
11096
 
10956
- exports.default = _emberMetalCore.default;
11097
+ // used for adding Ember.Handlebars.compile for backwards compat
11098
+ enifed('ember-template-compiler/compat', ['exports', 'ember-metal/core', 'ember-template-compiler/compat/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template'], function (exports, _emberMetalCore, _emberTemplateCompilerCompatPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemTemplate) {
11099
+ 'use strict';
11100
+
11101
+ var EmberHandlebars = _emberMetalCore.default.Handlebars = _emberMetalCore.default.Handlebars || {};
11102
+
11103
+ EmberHandlebars.precompile = _emberTemplateCompilerCompatPrecompile.default;
11104
+ EmberHandlebars.compile = _emberTemplateCompilerSystemCompile.default;
11105
+ EmberHandlebars.template = _emberTemplateCompilerSystemTemplate.default;
10957
11106
  });
10958
11107
  enifed('ember-template-compiler/compat/precompile', ['exports', 'ember-metal/core', 'ember-template-compiler/system/compile_options'], function (exports, _emberMetalCore, _emberTemplateCompilerSystemCompile_options) {
10959
11108
  /**
@@ -10982,14 +11131,39 @@ enifed('ember-template-compiler/compat/precompile', ['exports', 'ember-metal/cor
10982
11131
  return compileFunc(string, _emberTemplateCompilerSystemCompile_options.default());
10983
11132
  };
10984
11133
  });
10985
- enifed('ember-template-compiler/compat', ['exports', 'ember-metal/core', 'ember-template-compiler/compat/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template'], function (exports, _emberMetalCore, _emberTemplateCompilerCompatPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemTemplate) {
11134
+ enifed('ember-template-compiler/plugins', ['exports'], function (exports) {
11135
+ /**
11136
+ @module ember
11137
+ @submodule ember-template-compiler
11138
+ */
11139
+
11140
+ /**
11141
+ @private
11142
+ @property helpers
11143
+ */
10986
11144
  'use strict';
10987
11145
 
10988
- var EmberHandlebars = _emberMetalCore.default.Handlebars = _emberMetalCore.default.Handlebars || {};
11146
+ exports.registerPlugin = registerPlugin;
11147
+ var plugins = {
11148
+ ast: []
11149
+ };
10989
11150
 
10990
- EmberHandlebars.precompile = _emberTemplateCompilerCompatPrecompile.default;
10991
- EmberHandlebars.compile = _emberTemplateCompilerSystemCompile.default;
10992
- EmberHandlebars.template = _emberTemplateCompilerSystemTemplate.default;
11151
+ /**
11152
+ Adds an AST plugin to be used by Ember.HTMLBars.compile.
11153
+
11154
+ @private
11155
+ @method registerASTPlugin
11156
+ */
11157
+
11158
+ function registerPlugin(type, Plugin) {
11159
+ if (!plugins[type]) {
11160
+ throw new Error('Attempting to register "' + Plugin + '" as "' + type + '" which is not a valid HTMLBars plugin type.');
11161
+ }
11162
+
11163
+ plugins[type].push(Plugin);
11164
+ }
11165
+
11166
+ exports.default = plugins;
10993
11167
  });
10994
11168
  enifed('ember-template-compiler/plugins/assert-no-view-and-controller-paths', ['exports', 'ember-metal/core', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberMetalCore, _emberTemplateCompilerSystemCalculateLocationDisplay) {
10995
11169
  'use strict';
@@ -11757,40 +11931,6 @@ enifed('ember-template-compiler/plugins/transform-old-class-binding-syntax', ['e
11757
11931
  return segments;
11758
11932
  }
11759
11933
  });
11760
- enifed('ember-template-compiler/plugins', ['exports'], function (exports) {
11761
- /**
11762
- @module ember
11763
- @submodule ember-template-compiler
11764
- */
11765
-
11766
- /**
11767
- @private
11768
- @property helpers
11769
- */
11770
- 'use strict';
11771
-
11772
- exports.registerPlugin = registerPlugin;
11773
- var plugins = {
11774
- ast: []
11775
- };
11776
-
11777
- /**
11778
- Adds an AST plugin to be used by Ember.HTMLBars.compile.
11779
-
11780
- @private
11781
- @method registerASTPlugin
11782
- */
11783
-
11784
- function registerPlugin(type, Plugin) {
11785
- if (!plugins[type]) {
11786
- throw new Error('Attempting to register "' + Plugin + '" as "' + type + '" which is not a valid HTMLBars plugin type.');
11787
- }
11788
-
11789
- plugins[type].push(Plugin);
11790
- }
11791
-
11792
- exports.default = plugins;
11793
- });
11794
11934
  enifed('ember-template-compiler/system/calculate-location-display', ['exports'], function (exports) {
11795
11935
  'use strict';
11796
11936
 
@@ -11958,41 +12098,22 @@ enifed('ember-template-compiler/system/template', ['exports', 'htmlbars-runtime/
11958
12098
 
11959
12099
  exports.default = function (templateSpec) {
11960
12100
  if (!templateSpec.render) {
11961
- templateSpec = _htmlbarsRuntimeHooks.wrap(templateSpec);
11962
- }
11963
-
11964
- templateSpec.isTop = true;
11965
- templateSpec.isMethod = false;
11966
-
11967
- return templateSpec;
11968
- };
11969
- });
11970
- enifed('ember-template-compiler', ['exports', 'ember-metal', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template', 'ember-template-compiler/plugins', 'ember-template-compiler/plugins/transform-old-binding-syntax', 'ember-template-compiler/plugins/transform-old-class-binding-syntax', 'ember-template-compiler/plugins/transform-item-class', 'ember-template-compiler/plugins/transform-component-attrs-into-mut', 'ember-template-compiler/plugins/transform-component-curly-to-readonly', 'ember-template-compiler/plugins/transform-angle-bracket-components', 'ember-template-compiler/plugins/transform-input-on-to-onEvent', 'ember-template-compiler/plugins/transform-each-into-collection', 'ember-template-compiler/plugins/assert-no-view-and-controller-paths', 'ember-template-compiler/plugins/assert-no-view-helper', 'ember-template-compiler/compat'], function (exports, _emberMetal, _emberTemplateCompilerSystemPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemTemplate, _emberTemplateCompilerPlugins, _emberTemplateCompilerPluginsTransformOldBindingSyntax, _emberTemplateCompilerPluginsTransformOldClassBindingSyntax, _emberTemplateCompilerPluginsTransformItemClass, _emberTemplateCompilerPluginsTransformComponentAttrsIntoMut, _emberTemplateCompilerPluginsTransformComponentCurlyToReadonly, _emberTemplateCompilerPluginsTransformAngleBracketComponents, _emberTemplateCompilerPluginsTransformInputOnToOnEvent, _emberTemplateCompilerPluginsTransformEachIntoCollection, _emberTemplateCompilerPluginsAssertNoViewAndControllerPaths, _emberTemplateCompilerPluginsAssertNoViewHelper, _emberTemplateCompilerCompat) {
11971
- 'use strict';
11972
-
11973
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformOldBindingSyntax.default);
11974
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformOldClassBindingSyntax.default);
11975
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformItemClass.default);
11976
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformComponentAttrsIntoMut.default);
11977
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformComponentCurlyToReadonly.default);
11978
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformAngleBracketComponents.default);
11979
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformInputOnToOnEvent.default);
11980
-
11981
- if (_emberMetal.default.ENV._ENABLE_LEGACY_VIEW_SUPPORT) {
11982
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformEachIntoCollection.default);
11983
- } else {
11984
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsAssertNoViewAndControllerPaths.default);
11985
- _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsAssertNoViewHelper.default);
11986
- }
12101
+ templateSpec = _htmlbarsRuntimeHooks.wrap(templateSpec);
12102
+ }
11987
12103
 
11988
- exports._Ember = _emberMetal.default;
11989
- exports.precompile = _emberTemplateCompilerSystemPrecompile.default;
11990
- exports.compile = _emberTemplateCompilerSystemCompile.default;
11991
- exports.template = _emberTemplateCompilerSystemTemplate.default;
11992
- exports.registerPlugin = _emberTemplateCompilerPlugins.registerPlugin;
12104
+ templateSpec.isTop = true;
12105
+ templateSpec.isMethod = false;
12106
+
12107
+ return templateSpec;
12108
+ };
11993
12109
  });
12110
+ enifed("htmlbars-compiler", ["exports", "./htmlbars-compiler/compiler"], function (exports, _htmlbarsCompilerCompiler) {
12111
+ "use strict";
11994
12112
 
11995
- // used for adding Ember.Handlebars.compile for backwards compat
12113
+ exports.compile = _htmlbarsCompilerCompiler.compile;
12114
+ exports.compileSpec = _htmlbarsCompilerCompiler.compileSpec;
12115
+ exports.template = _htmlbarsCompilerCompiler.template;
12116
+ });
11996
12117
  enifed("htmlbars-compiler/compiler", ["exports", "../htmlbars-syntax/parser", "./template-compiler", "../htmlbars-runtime/hooks", "../htmlbars-runtime/render"], function (exports, _htmlbarsSyntaxParser, _templateCompiler, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender) {
11997
12118
  /*jshint evil:true*/
11998
12119
  "use strict";
@@ -13272,12 +13393,23 @@ enifed("htmlbars-compiler/utils", ["exports"], function (exports) {
13272
13393
  }
13273
13394
  }
13274
13395
  });
13275
- enifed("htmlbars-compiler", ["exports", "./htmlbars-compiler/compiler"], function (exports, _htmlbarsCompilerCompiler) {
13276
- "use strict";
13396
+ enifed('htmlbars-runtime', ['exports', './htmlbars-runtime/hooks', './htmlbars-runtime/render', '../htmlbars-util/morph-utils', '../htmlbars-util/template-utils', './htmlbars-runtime/expression-visitor', 'htmlbars-runtime/hooks'], function (exports, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils, _htmlbarsRuntimeExpressionVisitor, _htmlbarsRuntimeHooks2) {
13397
+ 'use strict';
13277
13398
 
13278
- exports.compile = _htmlbarsCompilerCompiler.compile;
13279
- exports.compileSpec = _htmlbarsCompilerCompiler.compileSpec;
13280
- exports.template = _htmlbarsCompilerCompiler.template;
13399
+ var internal = {
13400
+ blockFor: _htmlbarsUtilTemplateUtils.blockFor,
13401
+ manualElement: _htmlbarsRuntimeRender.manualElement,
13402
+ hostBlock: _htmlbarsRuntimeHooks2.hostBlock,
13403
+ continueBlock: _htmlbarsRuntimeHooks2.continueBlock,
13404
+ hostYieldWithShadowTemplate: _htmlbarsRuntimeHooks2.hostYieldWithShadowTemplate,
13405
+ visitChildren: _htmlbarsUtilMorphUtils.visitChildren,
13406
+ validateChildMorphs: _htmlbarsRuntimeExpressionVisitor.validateChildMorphs,
13407
+ clearMorph: _htmlbarsUtilTemplateUtils.clearMorph
13408
+ };
13409
+
13410
+ exports.hooks = _htmlbarsRuntimeHooks.default;
13411
+ exports.render = _htmlbarsRuntimeRender.default;
13412
+ exports.internal = internal;
13281
13413
  });
13282
13414
  enifed("htmlbars-runtime/expression-visitor", ["exports", "../htmlbars-util/object-utils", "../htmlbars-util/morph-utils"], function (exports, _htmlbarsUtilObjectUtils, _htmlbarsUtilMorphUtils) {
13283
13415
  "use strict";
@@ -15150,23 +15282,14 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15150
15282
  return fragment;
15151
15283
  }
15152
15284
  });
15153
- enifed('htmlbars-runtime', ['exports', './htmlbars-runtime/hooks', './htmlbars-runtime/render', '../htmlbars-util/morph-utils', '../htmlbars-util/template-utils', './htmlbars-runtime/expression-visitor', 'htmlbars-runtime/hooks'], function (exports, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils, _htmlbarsRuntimeExpressionVisitor, _htmlbarsRuntimeHooks2) {
15154
- 'use strict';
15155
-
15156
- var internal = {
15157
- blockFor: _htmlbarsUtilTemplateUtils.blockFor,
15158
- manualElement: _htmlbarsRuntimeRender.manualElement,
15159
- hostBlock: _htmlbarsRuntimeHooks2.hostBlock,
15160
- continueBlock: _htmlbarsRuntimeHooks2.continueBlock,
15161
- hostYieldWithShadowTemplate: _htmlbarsRuntimeHooks2.hostYieldWithShadowTemplate,
15162
- visitChildren: _htmlbarsUtilMorphUtils.visitChildren,
15163
- validateChildMorphs: _htmlbarsRuntimeExpressionVisitor.validateChildMorphs,
15164
- clearMorph: _htmlbarsUtilTemplateUtils.clearMorph
15165
- };
15285
+ enifed("htmlbars-syntax", ["exports", "./htmlbars-syntax/builders", "./htmlbars-syntax/parser", "./htmlbars-syntax/generation/print", "./htmlbars-syntax/traversal/traverse", "./htmlbars-syntax/traversal/walker"], function (exports, _htmlbarsSyntaxBuilders, _htmlbarsSyntaxParser, _htmlbarsSyntaxGenerationPrint, _htmlbarsSyntaxTraversalTraverse, _htmlbarsSyntaxTraversalWalker) {
15286
+ "use strict";
15166
15287
 
15167
- exports.hooks = _htmlbarsRuntimeHooks.default;
15168
- exports.render = _htmlbarsRuntimeRender.default;
15169
- exports.internal = internal;
15288
+ exports.builders = _htmlbarsSyntaxBuilders.default;
15289
+ exports.parse = _htmlbarsSyntaxParser.default;
15290
+ exports.print = _htmlbarsSyntaxGenerationPrint.default;
15291
+ exports.traverse = _htmlbarsSyntaxTraversalTraverse.default;
15292
+ exports.Walker = _htmlbarsSyntaxTraversalWalker.default;
15170
15293
  });
15171
15294
  enifed("htmlbars-syntax/builders", ["exports"], function (exports) {
15172
15295
  // Statements
@@ -17103,6 +17226,95 @@ enifed('htmlbars-syntax/handlebars/utils', ['exports'], function (exports) {
17103
17226
  return (contextPath ? contextPath + '.' : '') + id;
17104
17227
  }
17105
17228
  });
17229
+ enifed("htmlbars-syntax/parser", ["exports", "./handlebars/compiler/base", "../htmlbars-syntax", "../simple-html-tokenizer/evented-tokenizer", "../simple-html-tokenizer/entity-parser", "../simple-html-tokenizer/char-refs/full", "./parser/handlebars-node-visitors", "./parser/tokenizer-event-handlers"], function (exports, _handlebarsCompilerBase, _htmlbarsSyntax, _simpleHtmlTokenizerEventedTokenizer, _simpleHtmlTokenizerEntityParser, _simpleHtmlTokenizerCharRefsFull, _parserHandlebarsNodeVisitors, _parserTokenizerEventHandlers) {
17230
+ "use strict";
17231
+
17232
+ exports.preprocess = preprocess;
17233
+ exports.Parser = Parser;
17234
+
17235
+ function preprocess(html, options) {
17236
+ var ast = typeof html === 'object' ? html : _handlebarsCompilerBase.parse(html);
17237
+ var combined = new Parser(html, options).acceptNode(ast);
17238
+
17239
+ if (options && options.plugins && options.plugins.ast) {
17240
+ for (var i = 0, l = options.plugins.ast.length; i < l; i++) {
17241
+ var plugin = new options.plugins.ast[i](options);
17242
+
17243
+ plugin.syntax = _htmlbarsSyntax;
17244
+
17245
+ combined = plugin.transform(combined);
17246
+ }
17247
+ }
17248
+
17249
+ return combined;
17250
+ }
17251
+
17252
+ exports.default = preprocess;
17253
+
17254
+ var entityParser = new _simpleHtmlTokenizerEntityParser.default(_simpleHtmlTokenizerCharRefsFull.default);
17255
+
17256
+ function Parser(source, options) {
17257
+ this.options = options || {};
17258
+ this.elementStack = [];
17259
+ this.tokenizer = new _simpleHtmlTokenizerEventedTokenizer.default(this, entityParser);
17260
+
17261
+ this.currentNode = null;
17262
+ this.currentAttribute = null;
17263
+
17264
+ if (typeof source === 'string') {
17265
+ this.source = source.split(/(?:\r\n?|\n)/g);
17266
+ }
17267
+ }
17268
+
17269
+ for (var key in _parserHandlebarsNodeVisitors.default) {
17270
+ Parser.prototype[key] = _parserHandlebarsNodeVisitors.default[key];
17271
+ }
17272
+
17273
+ for (var key in _parserTokenizerEventHandlers.default) {
17274
+ Parser.prototype[key] = _parserTokenizerEventHandlers.default[key];
17275
+ }
17276
+
17277
+ Parser.prototype.acceptNode = function (node) {
17278
+ return this[node.type](node);
17279
+ };
17280
+
17281
+ Parser.prototype.currentElement = function () {
17282
+ return this.elementStack[this.elementStack.length - 1];
17283
+ };
17284
+
17285
+ Parser.prototype.sourceForMustache = function (mustache) {
17286
+ var firstLine = mustache.loc.start.line - 1;
17287
+ var lastLine = mustache.loc.end.line - 1;
17288
+ var currentLine = firstLine - 1;
17289
+ var firstColumn = mustache.loc.start.column + 2;
17290
+ var lastColumn = mustache.loc.end.column - 2;
17291
+ var string = [];
17292
+ var line;
17293
+
17294
+ if (!this.source) {
17295
+ return '{{' + mustache.path.id.original + '}}';
17296
+ }
17297
+
17298
+ while (currentLine < lastLine) {
17299
+ currentLine++;
17300
+ line = this.source[currentLine];
17301
+
17302
+ if (currentLine === firstLine) {
17303
+ if (firstLine === lastLine) {
17304
+ string.push(line.slice(firstColumn, lastColumn));
17305
+ } else {
17306
+ string.push(line.slice(firstColumn));
17307
+ }
17308
+ } else if (currentLine === lastLine) {
17309
+ string.push(line.slice(0, lastColumn));
17310
+ } else {
17311
+ string.push(line);
17312
+ }
17313
+ }
17314
+
17315
+ return string.join('\n');
17316
+ };
17317
+ });
17106
17318
  enifed("htmlbars-syntax/parser/handlebars-node-visitors", ["exports", "../builders", "../utils"], function (exports, _builders, _utils) {
17107
17319
  "use strict";
17108
17320
 
@@ -17538,95 +17750,6 @@ enifed("htmlbars-syntax/parser/tokenizer-event-handlers", ["exports", "../../htm
17538
17750
  return "`" + tag.name + "` (on line " + tag.loc.end.line + ")";
17539
17751
  }
17540
17752
  });
17541
- enifed("htmlbars-syntax/parser", ["exports", "./handlebars/compiler/base", "../htmlbars-syntax", "../simple-html-tokenizer/evented-tokenizer", "../simple-html-tokenizer/entity-parser", "../simple-html-tokenizer/char-refs/full", "./parser/handlebars-node-visitors", "./parser/tokenizer-event-handlers"], function (exports, _handlebarsCompilerBase, _htmlbarsSyntax, _simpleHtmlTokenizerEventedTokenizer, _simpleHtmlTokenizerEntityParser, _simpleHtmlTokenizerCharRefsFull, _parserHandlebarsNodeVisitors, _parserTokenizerEventHandlers) {
17542
- "use strict";
17543
-
17544
- exports.preprocess = preprocess;
17545
- exports.Parser = Parser;
17546
-
17547
- function preprocess(html, options) {
17548
- var ast = typeof html === 'object' ? html : _handlebarsCompilerBase.parse(html);
17549
- var combined = new Parser(html, options).acceptNode(ast);
17550
-
17551
- if (options && options.plugins && options.plugins.ast) {
17552
- for (var i = 0, l = options.plugins.ast.length; i < l; i++) {
17553
- var plugin = new options.plugins.ast[i](options);
17554
-
17555
- plugin.syntax = _htmlbarsSyntax;
17556
-
17557
- combined = plugin.transform(combined);
17558
- }
17559
- }
17560
-
17561
- return combined;
17562
- }
17563
-
17564
- exports.default = preprocess;
17565
-
17566
- var entityParser = new _simpleHtmlTokenizerEntityParser.default(_simpleHtmlTokenizerCharRefsFull.default);
17567
-
17568
- function Parser(source, options) {
17569
- this.options = options || {};
17570
- this.elementStack = [];
17571
- this.tokenizer = new _simpleHtmlTokenizerEventedTokenizer.default(this, entityParser);
17572
-
17573
- this.currentNode = null;
17574
- this.currentAttribute = null;
17575
-
17576
- if (typeof source === 'string') {
17577
- this.source = source.split(/(?:\r\n?|\n)/g);
17578
- }
17579
- }
17580
-
17581
- for (var key in _parserHandlebarsNodeVisitors.default) {
17582
- Parser.prototype[key] = _parserHandlebarsNodeVisitors.default[key];
17583
- }
17584
-
17585
- for (var key in _parserTokenizerEventHandlers.default) {
17586
- Parser.prototype[key] = _parserTokenizerEventHandlers.default[key];
17587
- }
17588
-
17589
- Parser.prototype.acceptNode = function (node) {
17590
- return this[node.type](node);
17591
- };
17592
-
17593
- Parser.prototype.currentElement = function () {
17594
- return this.elementStack[this.elementStack.length - 1];
17595
- };
17596
-
17597
- Parser.prototype.sourceForMustache = function (mustache) {
17598
- var firstLine = mustache.loc.start.line - 1;
17599
- var lastLine = mustache.loc.end.line - 1;
17600
- var currentLine = firstLine - 1;
17601
- var firstColumn = mustache.loc.start.column + 2;
17602
- var lastColumn = mustache.loc.end.column - 2;
17603
- var string = [];
17604
- var line;
17605
-
17606
- if (!this.source) {
17607
- return '{{' + mustache.path.id.original + '}}';
17608
- }
17609
-
17610
- while (currentLine < lastLine) {
17611
- currentLine++;
17612
- line = this.source[currentLine];
17613
-
17614
- if (currentLine === firstLine) {
17615
- if (firstLine === lastLine) {
17616
- string.push(line.slice(firstColumn, lastColumn));
17617
- } else {
17618
- string.push(line.slice(firstColumn));
17619
- }
17620
- } else if (currentLine === lastLine) {
17621
- string.push(line.slice(0, lastColumn));
17622
- } else {
17623
- string.push(line);
17624
- }
17625
- }
17626
-
17627
- return string.join('\n');
17628
- };
17629
- });
17630
17753
  enifed("htmlbars-syntax/traversal/errors", ["exports"], function (exports) {
17631
17754
  "use strict";
17632
17755
 
@@ -17975,15 +18098,6 @@ enifed('htmlbars-syntax/utils', ['exports', '../htmlbars-util/array-utils'], fun
17975
18098
  }
17976
18099
  }
17977
18100
  });
17978
- enifed("htmlbars-syntax", ["exports", "./htmlbars-syntax/builders", "./htmlbars-syntax/parser", "./htmlbars-syntax/generation/print", "./htmlbars-syntax/traversal/traverse", "./htmlbars-syntax/traversal/walker"], function (exports, _htmlbarsSyntaxBuilders, _htmlbarsSyntaxParser, _htmlbarsSyntaxGenerationPrint, _htmlbarsSyntaxTraversalTraverse, _htmlbarsSyntaxTraversalWalker) {
17979
- "use strict";
17980
-
17981
- exports.builders = _htmlbarsSyntaxBuilders.default;
17982
- exports.parse = _htmlbarsSyntaxParser.default;
17983
- exports.print = _htmlbarsSyntaxGenerationPrint.default;
17984
- exports.traverse = _htmlbarsSyntaxTraversalTraverse.default;
17985
- exports.Walker = _htmlbarsSyntaxTraversalWalker.default;
17986
- });
17987
18101
  enifed("htmlbars-test-helpers", ["exports", "../simple-html-tokenizer", "../htmlbars-util/array-utils"], function (exports, _simpleHtmlTokenizer, _htmlbarsUtilArrayUtils) {
17988
18102
  "use strict";
17989
18103
 
@@ -18111,6 +18225,16 @@ enifed("htmlbars-test-helpers", ["exports", "../simple-html-tokenizer", "../html
18111
18225
  }
18112
18226
  }
18113
18227
  });
18228
+ enifed('htmlbars-util', ['exports', './htmlbars-util/safe-string', './htmlbars-util/handlebars/utils', './htmlbars-util/namespaces', './htmlbars-util/morph-utils'], function (exports, _htmlbarsUtilSafeString, _htmlbarsUtilHandlebarsUtils, _htmlbarsUtilNamespaces, _htmlbarsUtilMorphUtils) {
18229
+ 'use strict';
18230
+
18231
+ exports.SafeString = _htmlbarsUtilSafeString.default;
18232
+ exports.escapeExpression = _htmlbarsUtilHandlebarsUtils.escapeExpression;
18233
+ exports.getAttrNamespace = _htmlbarsUtilNamespaces.getAttrNamespace;
18234
+ exports.validateChildMorphs = _htmlbarsUtilMorphUtils.validateChildMorphs;
18235
+ exports.linkParams = _htmlbarsUtilMorphUtils.linkParams;
18236
+ exports.dump = _htmlbarsUtilMorphUtils.dump;
18237
+ });
18114
18238
  enifed('htmlbars-util/array-utils', ['exports'], function (exports) {
18115
18239
  'use strict';
18116
18240
 
@@ -18669,320 +18793,53 @@ enifed("htmlbars-util/template-utils", ["exports", "../htmlbars-util/morph-utils
18669
18793
  }
18670
18794
  if (destroySelf && destroy) {
18671
18795
  destroy(morph);
18672
- }
18673
-
18674
- _htmlbarsUtilMorphUtils.visitChildren(morph.childNodes, destroyNode);
18675
-
18676
- // TODO: Deal with logical children that are not in the DOM tree
18677
- morph.clear();
18678
- if (didCleanup) {
18679
- didCleanup(env, morph, destroySelf);
18680
- }
18681
-
18682
- morph.lastResult = null;
18683
- morph.lastYielded = null;
18684
- morph.childNodes = null;
18685
- }
18686
-
18687
- function clearMorphList(morphList, morph, env) {
18688
- var item = morphList.firstChildMorph;
18689
-
18690
- while (item) {
18691
- var next = item.nextMorph;
18692
- delete morph.morphMap[item.key];
18693
- clearMorph(item, env, true);
18694
- item.destroy();
18695
-
18696
- item = next;
18697
- }
18698
-
18699
- // Remove the MorphList from the morph.
18700
- morphList.clear();
18701
- morph.morphList = null;
18702
- }
18703
- });
18704
- enifed("htmlbars-util/void-tag-names", ["exports", "./array-utils"], function (exports, _arrayUtils) {
18705
- "use strict";
18706
-
18707
- // The HTML elements in this list are speced by
18708
- // http://www.w3.org/TR/html-markup/syntax.html#syntax-elements,
18709
- // and will be forced to close regardless of if they have a
18710
- // self-closing /> at the end.
18711
- var voidTagNames = "area base br col command embed hr img input keygen link meta param source track wbr";
18712
- var voidMap = {};
18713
-
18714
- _arrayUtils.forEach(voidTagNames.split(" "), function (tagName) {
18715
- voidMap[tagName] = true;
18716
- });
18717
-
18718
- exports.default = voidMap;
18719
- });
18720
- enifed('htmlbars-util', ['exports', './htmlbars-util/safe-string', './htmlbars-util/handlebars/utils', './htmlbars-util/namespaces', './htmlbars-util/morph-utils'], function (exports, _htmlbarsUtilSafeString, _htmlbarsUtilHandlebarsUtils, _htmlbarsUtilNamespaces, _htmlbarsUtilMorphUtils) {
18721
- 'use strict';
18722
-
18723
- exports.SafeString = _htmlbarsUtilSafeString.default;
18724
- exports.escapeExpression = _htmlbarsUtilHandlebarsUtils.escapeExpression;
18725
- exports.getAttrNamespace = _htmlbarsUtilNamespaces.getAttrNamespace;
18726
- exports.validateChildMorphs = _htmlbarsUtilMorphUtils.validateChildMorphs;
18727
- exports.linkParams = _htmlbarsUtilMorphUtils.linkParams;
18728
- exports.dump = _htmlbarsUtilMorphUtils.dump;
18729
- });
18730
- (function() {
18731
- })();
18732
- /*!
18733
- * @overview Ember - JavaScript Application Framework
18734
- * @copyright Copyright 2011-2015 Tilde Inc. and contributors
18735
- * Portions Copyright 2006-2011 Strobe Inc.
18736
- * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
18737
- * @license Licensed under MIT license
18738
- * See https://raw.github.com/emberjs/ember.js/master/LICENSE
18739
- * @version 2.0.3
18740
- */
18741
-
18742
- var enifed, requireModule, eriuqer, requirejs, Ember;
18743
- var mainContext = this;
18744
-
18745
- (function() {
18746
- var isNode = typeof window === 'undefined' &&
18747
- typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
18748
-
18749
- if (!isNode) {
18750
- Ember = this.Ember = this.Ember || {};
18751
- }
18752
-
18753
- if (typeof Ember === 'undefined') { Ember = {}; };
18754
-
18755
- if (typeof Ember.__loader === 'undefined') {
18756
- var registry = {};
18757
- var seen = {};
18758
-
18759
- enifed = function(name, deps, callback) {
18760
- var value = { };
18761
-
18762
- if (!callback) {
18763
- value.deps = [];
18764
- value.callback = deps;
18765
- } else {
18766
- value.deps = deps;
18767
- value.callback = callback;
18768
- }
18769
-
18770
- registry[name] = value;
18771
- };
18772
-
18773
- requirejs = eriuqer = requireModule = function(name) {
18774
- return internalRequire(name, null);
18775
- }
18776
-
18777
- function internalRequire(name, referrerName) {
18778
- var exports = seen[name];
18779
-
18780
- if (exports !== undefined) {
18781
- return exports;
18782
- }
18783
-
18784
- exports = seen[name] = {};
18785
-
18786
- if (!registry[name]) {
18787
- if (referrerName) {
18788
- throw new Error('Could not find module ' + name + ' required by: ' + referrerName);
18789
- } else {
18790
- throw new Error('Could not find module ' + name);
18791
- }
18792
- }
18793
-
18794
- var mod = registry[name];
18795
- var deps = mod.deps;
18796
- var callback = mod.callback;
18797
- var reified = [];
18798
- var length = deps.length;
18799
-
18800
- for (var i=0; i<length; i++) {
18801
- if (deps[i] === 'exports') {
18802
- reified.push(exports);
18803
- } else {
18804
- reified.push(internalRequire(resolve(deps[i], name), name));
18805
- }
18806
- }
18807
-
18808
- callback.apply(this, reified);
18809
-
18810
- return exports;
18811
- };
18812
-
18813
- function resolve(child, name) {
18814
- if (child.charAt(0) !== '.') {
18815
- return child;
18816
- }
18817
- var parts = child.split('/');
18818
- var parentBase = name.split('/').slice(0, -1);
18819
-
18820
- for (var i=0, l=parts.length; i<l; i++) {
18821
- var part = parts[i];
18822
-
18823
- if (part === '..') {
18824
- parentBase.pop();
18825
- } else if (part === '.') {
18826
- continue;
18827
- } else {
18828
- parentBase.push(part);
18829
- }
18830
- }
18831
-
18832
- return parentBase.join('/');
18833
- }
18834
-
18835
- requirejs._eak_seen = registry;
18836
-
18837
- Ember.__loader = {
18838
- define: enifed,
18839
- require: eriuqer,
18840
- registry: registry
18841
- };
18842
- } else {
18843
- enifed = Ember.__loader.define;
18844
- requirejs = eriuqer = requireModule = Ember.__loader.require;
18845
- }
18846
- })();
18847
-
18848
- enifed('morph-range/morph-list', ['exports', './utils'], function (exports, _utils) {
18849
- 'use strict';
18850
-
18851
- function MorphList() {
18852
- // morph graph
18853
- this.firstChildMorph = null;
18854
- this.lastChildMorph = null;
18855
-
18856
- this.mountedMorph = null;
18857
- }
18858
-
18859
- var prototype = MorphList.prototype;
18860
-
18861
- prototype.clear = function MorphList$clear() {
18862
- var current = this.firstChildMorph;
18863
-
18864
- while (current) {
18865
- var next = current.nextMorph;
18866
- current.previousMorph = null;
18867
- current.nextMorph = null;
18868
- current.parentMorphList = null;
18869
- current = next;
18870
- }
18871
-
18872
- this.firstChildMorph = this.lastChildMorph = null;
18873
- };
18874
-
18875
- prototype.destroy = function MorphList$destroy() {};
18876
-
18877
- prototype.appendMorph = function MorphList$appendMorph(morph) {
18878
- this.insertBeforeMorph(morph, null);
18879
- };
18880
-
18881
- prototype.insertBeforeMorph = function MorphList$insertBeforeMorph(morph, referenceMorph) {
18882
- if (morph.parentMorphList !== null) {
18883
- morph.unlink();
18884
- }
18885
- if (referenceMorph && referenceMorph.parentMorphList !== this) {
18886
- throw new Error('The morph before which the new morph is to be inserted is not a child of this morph.');
18887
- }
18888
-
18889
- var mountedMorph = this.mountedMorph;
18890
-
18891
- if (mountedMorph) {
18892
-
18893
- var parentNode = mountedMorph.firstNode.parentNode;
18894
- var referenceNode = referenceMorph ? referenceMorph.firstNode : mountedMorph.lastNode.nextSibling;
18895
-
18896
- _utils.insertBefore(parentNode, morph.firstNode, morph.lastNode, referenceNode);
18897
-
18898
- // was not in list mode replace current content
18899
- if (!this.firstChildMorph) {
18900
- _utils.clear(this.mountedMorph.firstNode.parentNode, this.mountedMorph.firstNode, this.mountedMorph.lastNode);
18901
- }
18902
- }
18903
-
18904
- morph.parentMorphList = this;
18905
-
18906
- var previousMorph = referenceMorph ? referenceMorph.previousMorph : this.lastChildMorph;
18907
- if (previousMorph) {
18908
- previousMorph.nextMorph = morph;
18909
- morph.previousMorph = previousMorph;
18910
- } else {
18911
- this.firstChildMorph = morph;
18912
- }
18913
-
18914
- if (referenceMorph) {
18915
- referenceMorph.previousMorph = morph;
18916
- morph.nextMorph = referenceMorph;
18917
- } else {
18918
- this.lastChildMorph = morph;
18919
- }
18920
-
18921
- this.firstChildMorph._syncFirstNode();
18922
- this.lastChildMorph._syncLastNode();
18923
- };
18796
+ }
18924
18797
 
18925
- prototype.removeChildMorph = function MorphList$removeChildMorph(morph) {
18926
- if (morph.parentMorphList !== this) {
18927
- throw new Error("Cannot remove a morph from a parent it is not inside of");
18798
+ _htmlbarsUtilMorphUtils.visitChildren(morph.childNodes, destroyNode);
18799
+
18800
+ // TODO: Deal with logical children that are not in the DOM tree
18801
+ morph.clear();
18802
+ if (didCleanup) {
18803
+ didCleanup(env, morph, destroySelf);
18928
18804
  }
18929
18805
 
18930
- morph.destroy();
18931
- };
18806
+ morph.lastResult = null;
18807
+ morph.lastYielded = null;
18808
+ morph.childNodes = null;
18809
+ }
18932
18810
 
18933
- exports.default = MorphList;
18934
- });
18935
- enifed('morph-range/morph-list.umd', ['exports', './morph-list'], function (exports, _morphList) {
18936
- 'use strict';
18811
+ function clearMorphList(morphList, morph, env) {
18812
+ var item = morphList.firstChildMorph;
18937
18813
 
18938
- (function (root, factory) {
18939
- if (typeof enifed === 'function' && enifed.amd) {
18940
- enifed([], factory);
18941
- } else if (typeof exports === 'object') {
18942
- module.exports = factory();
18943
- } else {
18944
- root.MorphList = factory();
18814
+ while (item) {
18815
+ var next = item.nextMorph;
18816
+ delete morph.morphMap[item.key];
18817
+ clearMorph(item, env, true);
18818
+ item.destroy();
18819
+
18820
+ item = next;
18945
18821
  }
18946
- })(undefined, function () {
18947
- return _morphList.default;
18948
- });
18822
+
18823
+ // Remove the MorphList from the morph.
18824
+ morphList.clear();
18825
+ morph.morphList = null;
18826
+ }
18949
18827
  });
18950
- enifed("morph-range/utils", ["exports"], function (exports) {
18951
- // inclusive of both nodes
18828
+ enifed("htmlbars-util/void-tag-names", ["exports", "./array-utils"], function (exports, _arrayUtils) {
18952
18829
  "use strict";
18953
18830
 
18954
- exports.clear = clear;
18955
- exports.insertBefore = insertBefore;
18956
-
18957
- function clear(parentNode, firstNode, lastNode) {
18958
- if (!parentNode) {
18959
- return;
18960
- }
18831
+ // The HTML elements in this list are speced by
18832
+ // http://www.w3.org/TR/html-markup/syntax.html#syntax-elements,
18833
+ // and will be forced to close regardless of if they have a
18834
+ // self-closing /> at the end.
18835
+ var voidTagNames = "area base br col command embed hr img input keygen link meta param source track wbr";
18836
+ var voidMap = {};
18961
18837
 
18962
- var node = firstNode;
18963
- var nextNode;
18964
- do {
18965
- nextNode = node.nextSibling;
18966
- parentNode.removeChild(node);
18967
- if (node === lastNode) {
18968
- break;
18969
- }
18970
- node = nextNode;
18971
- } while (node);
18972
- }
18838
+ _arrayUtils.forEach(voidTagNames.split(" "), function (tagName) {
18839
+ voidMap[tagName] = true;
18840
+ });
18973
18841
 
18974
- function insertBefore(parentNode, firstNode, lastNode, refNode) {
18975
- var node = firstNode;
18976
- var nextNode;
18977
- do {
18978
- nextNode = node.nextSibling;
18979
- parentNode.insertBefore(node, refNode);
18980
- if (node === lastNode) {
18981
- break;
18982
- }
18983
- node = nextNode;
18984
- } while (node);
18985
- }
18842
+ exports.default = voidMap;
18986
18843
  });
18987
18844
  enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _morphRangeUtils) {
18988
18845
  'use strict';
@@ -19248,6 +19105,159 @@ enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _mo
19248
19105
 
19249
19106
  exports.default = Morph;
19250
19107
  });
19108
+ enifed('morph-range/morph-list', ['exports', './utils'], function (exports, _utils) {
19109
+ 'use strict';
19110
+
19111
+ function MorphList() {
19112
+ // morph graph
19113
+ this.firstChildMorph = null;
19114
+ this.lastChildMorph = null;
19115
+
19116
+ this.mountedMorph = null;
19117
+ }
19118
+
19119
+ var prototype = MorphList.prototype;
19120
+
19121
+ prototype.clear = function MorphList$clear() {
19122
+ var current = this.firstChildMorph;
19123
+
19124
+ while (current) {
19125
+ var next = current.nextMorph;
19126
+ current.previousMorph = null;
19127
+ current.nextMorph = null;
19128
+ current.parentMorphList = null;
19129
+ current = next;
19130
+ }
19131
+
19132
+ this.firstChildMorph = this.lastChildMorph = null;
19133
+ };
19134
+
19135
+ prototype.destroy = function MorphList$destroy() {};
19136
+
19137
+ prototype.appendMorph = function MorphList$appendMorph(morph) {
19138
+ this.insertBeforeMorph(morph, null);
19139
+ };
19140
+
19141
+ prototype.insertBeforeMorph = function MorphList$insertBeforeMorph(morph, referenceMorph) {
19142
+ if (morph.parentMorphList !== null) {
19143
+ morph.unlink();
19144
+ }
19145
+ if (referenceMorph && referenceMorph.parentMorphList !== this) {
19146
+ throw new Error('The morph before which the new morph is to be inserted is not a child of this morph.');
19147
+ }
19148
+
19149
+ var mountedMorph = this.mountedMorph;
19150
+
19151
+ if (mountedMorph) {
19152
+
19153
+ var parentNode = mountedMorph.firstNode.parentNode;
19154
+ var referenceNode = referenceMorph ? referenceMorph.firstNode : mountedMorph.lastNode.nextSibling;
19155
+
19156
+ _utils.insertBefore(parentNode, morph.firstNode, morph.lastNode, referenceNode);
19157
+
19158
+ // was not in list mode replace current content
19159
+ if (!this.firstChildMorph) {
19160
+ _utils.clear(this.mountedMorph.firstNode.parentNode, this.mountedMorph.firstNode, this.mountedMorph.lastNode);
19161
+ }
19162
+ }
19163
+
19164
+ morph.parentMorphList = this;
19165
+
19166
+ var previousMorph = referenceMorph ? referenceMorph.previousMorph : this.lastChildMorph;
19167
+ if (previousMorph) {
19168
+ previousMorph.nextMorph = morph;
19169
+ morph.previousMorph = previousMorph;
19170
+ } else {
19171
+ this.firstChildMorph = morph;
19172
+ }
19173
+
19174
+ if (referenceMorph) {
19175
+ referenceMorph.previousMorph = morph;
19176
+ morph.nextMorph = referenceMorph;
19177
+ } else {
19178
+ this.lastChildMorph = morph;
19179
+ }
19180
+
19181
+ this.firstChildMorph._syncFirstNode();
19182
+ this.lastChildMorph._syncLastNode();
19183
+ };
19184
+
19185
+ prototype.removeChildMorph = function MorphList$removeChildMorph(morph) {
19186
+ if (morph.parentMorphList !== this) {
19187
+ throw new Error("Cannot remove a morph from a parent it is not inside of");
19188
+ }
19189
+
19190
+ morph.destroy();
19191
+ };
19192
+
19193
+ exports.default = MorphList;
19194
+ });
19195
+ enifed('morph-range/morph-list.umd', ['exports', './morph-list'], function (exports, _morphList) {
19196
+ 'use strict';
19197
+
19198
+ (function (root, factory) {
19199
+ if (typeof enifed === 'function' && enifed.amd) {
19200
+ enifed([], factory);
19201
+ } else if (typeof exports === 'object') {
19202
+ module.exports = factory();
19203
+ } else {
19204
+ root.MorphList = factory();
19205
+ }
19206
+ })(undefined, function () {
19207
+ return _morphList.default;
19208
+ });
19209
+ });
19210
+ enifed("morph-range/utils", ["exports"], function (exports) {
19211
+ // inclusive of both nodes
19212
+ "use strict";
19213
+
19214
+ exports.clear = clear;
19215
+ exports.insertBefore = insertBefore;
19216
+
19217
+ function clear(parentNode, firstNode, lastNode) {
19218
+ if (!parentNode) {
19219
+ return;
19220
+ }
19221
+
19222
+ var node = firstNode;
19223
+ var nextNode;
19224
+ do {
19225
+ nextNode = node.nextSibling;
19226
+ parentNode.removeChild(node);
19227
+ if (node === lastNode) {
19228
+ break;
19229
+ }
19230
+ node = nextNode;
19231
+ } while (node);
19232
+ }
19233
+
19234
+ function insertBefore(parentNode, firstNode, lastNode, refNode) {
19235
+ var node = firstNode;
19236
+ var nextNode;
19237
+ do {
19238
+ nextNode = node.nextSibling;
19239
+ parentNode.insertBefore(node, refNode);
19240
+ if (node === lastNode) {
19241
+ break;
19242
+ }
19243
+ node = nextNode;
19244
+ } while (node);
19245
+ }
19246
+ });
19247
+ enifed('simple-html-tokenizer', ['exports', './simple-html-tokenizer/evented-tokenizer', './simple-html-tokenizer/tokenizer', './simple-html-tokenizer/tokenize', './simple-html-tokenizer/generator', './simple-html-tokenizer/generate', './simple-html-tokenizer/tokens'], function (exports, _simpleHtmlTokenizerEventedTokenizer, _simpleHtmlTokenizerTokenizer, _simpleHtmlTokenizerTokenize, _simpleHtmlTokenizerGenerator, _simpleHtmlTokenizerGenerate, _simpleHtmlTokenizerTokens) {
19248
+ /*jshint boss:true*/
19249
+ 'use strict';
19250
+
19251
+ exports.EventedTokenizer = _simpleHtmlTokenizerEventedTokenizer.default;
19252
+ exports.Tokenizer = _simpleHtmlTokenizerTokenizer.default;
19253
+ exports.tokenize = _simpleHtmlTokenizerTokenize.default;
19254
+ exports.Generator = _simpleHtmlTokenizerGenerator.default;
19255
+ exports.generate = _simpleHtmlTokenizerGenerate.default;
19256
+ exports.StartTag = _simpleHtmlTokenizerTokens.StartTag;
19257
+ exports.EndTag = _simpleHtmlTokenizerTokens.EndTag;
19258
+ exports.Chars = _simpleHtmlTokenizerTokens.Chars;
19259
+ exports.Comment = _simpleHtmlTokenizerTokens.Comment;
19260
+ });
19251
19261
  enifed("simple-html-tokenizer/char-refs/full", ["exports"], function (exports) {
19252
19262
  "use strict";
19253
19263
 
@@ -22115,20 +22125,10 @@ enifed("simple-html-tokenizer/utils", ["exports"], function (exports) {
22115
22125
  return input.replace(/\r\n?/g, "\n");
22116
22126
  }
22117
22127
  });
22118
- enifed('simple-html-tokenizer', ['exports', './simple-html-tokenizer/evented-tokenizer', './simple-html-tokenizer/tokenizer', './simple-html-tokenizer/tokenize', './simple-html-tokenizer/generator', './simple-html-tokenizer/generate', './simple-html-tokenizer/tokens'], function (exports, _simpleHtmlTokenizerEventedTokenizer, _simpleHtmlTokenizerTokenizer, _simpleHtmlTokenizerTokenize, _simpleHtmlTokenizerGenerator, _simpleHtmlTokenizerGenerate, _simpleHtmlTokenizerTokens) {
22119
- /*jshint boss:true*/
22120
- 'use strict';
22128
+ requireModule("ember-debug");
22129
+ requireModule("ember-template-compiler");
22121
22130
 
22122
- exports.EventedTokenizer = _simpleHtmlTokenizerEventedTokenizer.default;
22123
- exports.Tokenizer = _simpleHtmlTokenizerTokenizer.default;
22124
- exports.tokenize = _simpleHtmlTokenizerTokenize.default;
22125
- exports.Generator = _simpleHtmlTokenizerGenerator.default;
22126
- exports.generate = _simpleHtmlTokenizerGenerate.default;
22127
- exports.StartTag = _simpleHtmlTokenizerTokens.StartTag;
22128
- exports.EndTag = _simpleHtmlTokenizerTokens.EndTag;
22129
- exports.Chars = _simpleHtmlTokenizerTokens.Chars;
22130
- exports.Comment = _simpleHtmlTokenizerTokens.Comment;
22131
- });
22131
+ })();
22132
22132
  ;
22133
22133
  if (typeof exports === "object") {
22134
22134
  module.exports = Ember.__loader.require("ember-template-compiler");