ember-source 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45499c9207754276970daaaf7962746303a12a72
4
- data.tar.gz: 522a436237cde74c5b9550edc08995f85f6a36ed
3
+ metadata.gz: 4dbb36593413117ee2571318d7fbf4cf4128492f
4
+ data.tar.gz: 4d0d079a59b73f06b0e59d698893762b0429b20e
5
5
  SHA512:
6
- metadata.gz: fd0b9392a655ee076794ef87f91f55669fab2255c24ad1b96840724abe3a3d5337b7cd031bf73b5ce852e7ef60aa95e7754bd43527a0330bd52de0b25ac34b69
7
- data.tar.gz: 76d77b09f1e7fd5ac7bea83e62152f50ff1e2dafc3145547326d3322d4f0e741aeaa88d612096bc1384b26cb8d9ea23db1704adfae8cc85d2b3c4af31ef97260
6
+ metadata.gz: ff007605bf24cf686481ea9129a141b2e5a8041916a664806a57eea25ad4da8a93c4b5162af24f655beb0bcf99be42ae62b2c5bee0d91bf838f5b3d242644eb6
7
+ data.tar.gz: b89d50e5eccd49b6b6ce61411b621d380470cbb01ac6bec0276b80e216568c72af16d3f7b931bb808d8784e0e4a5334acb3b4b799ee7763217f76264f287ad06
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.2
1
+ 2.0.3
@@ -1,1164 +1,1078 @@
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.2
9
- */
10
-
11
- (function() {
12
- var enifed, requireModule, eriuqer, requirejs, Ember;
13
- var mainContext = this;
14
-
15
- (function() {
16
- var isNode = typeof window === 'undefined' &&
17
- typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
1
+ enifed("backburner/binary-search", ["exports"], function (exports) {
2
+ "use strict";
18
3
 
19
- if (!isNode) {
20
- Ember = this.Ember = this.Ember || {};
21
- }
4
+ exports.default = binarySearch;
22
5
 
23
- if (typeof Ember === 'undefined') { Ember = {}; };
6
+ function binarySearch(time, timers) {
7
+ var start = 0;
8
+ var end = timers.length - 2;
9
+ var middle, l;
24
10
 
25
- if (typeof Ember.__loader === 'undefined') {
26
- var registry = {};
27
- var seen = {};
11
+ while (start < end) {
12
+ // since timers is an array of pairs 'l' will always
13
+ // be an integer
14
+ l = (end - start) / 2;
28
15
 
29
- enifed = function(name, deps, callback) {
30
- var value = { };
16
+ // compensate for the index in case even number
17
+ // of pairs inside timers
18
+ middle = start + l - l % 2;
31
19
 
32
- if (!callback) {
33
- value.deps = [];
34
- value.callback = deps;
20
+ if (time >= timers[middle]) {
21
+ start = middle + 2;
35
22
  } else {
36
- value.deps = deps;
37
- value.callback = callback;
23
+ end = middle;
38
24
  }
25
+ }
39
26
 
40
- registry[name] = value;
41
- };
27
+ return time >= timers[start] ? start + 2 : start;
28
+ }
29
+ });
30
+ enifed('backburner/deferred-action-queues', ['exports', './utils', './queue'], function (exports, _utils, _queue) {
31
+ 'use strict';
42
32
 
43
- requirejs = eriuqer = requireModule = function(name) {
44
- return internalRequire(name, null);
45
- }
33
+ exports.default = DeferredActionQueues;
46
34
 
47
- function internalRequire(name, referrerName) {
48
- var exports = seen[name];
35
+ function DeferredActionQueues(queueNames, options) {
36
+ var queues = this.queues = {};
37
+ this.queueNames = queueNames = queueNames || [];
49
38
 
50
- if (exports !== undefined) {
51
- return exports;
52
- }
39
+ this.options = options;
53
40
 
54
- exports = seen[name] = {};
41
+ _utils.each(queueNames, function (queueName) {
42
+ queues[queueName] = new _queue.default(queueName, options[queueName], options);
43
+ });
44
+ }
55
45
 
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
- }
62
- }
46
+ function noSuchQueue(name) {
47
+ throw new Error('You attempted to schedule an action in a queue (' + name + ') that doesn\'t exist');
48
+ }
63
49
 
64
- var mod = registry[name];
65
- var deps = mod.deps;
66
- var callback = mod.callback;
67
- var reified = [];
68
- var length = deps.length;
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
+ }
69
53
 
70
- for (var i=0; i<length; i++) {
71
- if (deps[i] === 'exports') {
72
- reified.push(exports);
73
- } else {
74
- reified.push(internalRequire(resolve(deps[i], name), name));
75
- }
76
- }
54
+ DeferredActionQueues.prototype = {
55
+ schedule: function (name, target, method, args, onceFlag, stack) {
56
+ var queues = this.queues;
57
+ var queue = queues[name];
77
58
 
78
- callback.apply(this, reified);
59
+ if (!queue) {
60
+ noSuchQueue(name);
61
+ }
79
62
 
80
- return exports;
81
- };
63
+ if (!method) {
64
+ noSuchMethod(name);
65
+ }
82
66
 
83
- function resolve(child, name) {
84
- if (child.charAt(0) !== '.') {
85
- return child;
67
+ if (onceFlag) {
68
+ return queue.pushUnique(target, method, args, stack);
69
+ } else {
70
+ return queue.push(target, method, args, stack);
86
71
  }
87
- var parts = child.split('/');
88
- var parentBase = name.split('/').slice(0, -1);
72
+ },
89
73
 
90
- for (var i=0, l=parts.length; i<l; i++) {
91
- var part = parts[i];
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;
92
81
 
93
- if (part === '..') {
94
- parentBase.pop();
95
- } else if (part === '.') {
96
- continue;
82
+ while (queueNameIndex < numberOfQueues) {
83
+ queueName = queueNames[queueNameIndex];
84
+ queue = queues[queueName];
85
+
86
+ var numberOfQueueItems = queue._queue.length;
87
+
88
+ if (numberOfQueueItems === 0) {
89
+ queueNameIndex++;
97
90
  } else {
98
- parentBase.push(part);
91
+ queue.flush(false /* async */);
92
+ queueNameIndex = 0;
99
93
  }
100
94
  }
101
-
102
- return parentBase.join('/');
103
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';
104
103
 
105
- requirejs._eak_seen = registry;
104
+ var needsIETryCatchFix = (function (e, x) {
105
+ try {
106
+ x();
107
+ } catch (e) {} // jshint ignore:line
108
+ return !!e;
109
+ })();
106
110
 
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;
115
- }
116
- })();
111
+ exports.needsIETryCatchFix = needsIETryCatchFix;
112
+ var platform;
117
113
 
118
- enifed('backburner', ['exports', './backburner/utils', './backburner/platform', './backburner/binary-search', './backburner/deferred-action-queues'], function (exports, _backburnerUtils, _backburnerPlatform, _backburnerBinarySearch, _backburnerDeferredActionQueues) {
114
+ /* global self */
115
+ if (typeof self === 'object') {
116
+ platform = self;
117
+
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
+ }
124
+
125
+ exports.default = platform;
126
+ });
127
+ enifed('backburner/queue', ['exports', './utils'], function (exports, _utils) {
119
128
  'use strict';
120
129
 
121
- exports.default = Backburner;
130
+ exports.default = Queue;
122
131
 
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
- };
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;
137
139
  }
138
140
 
139
- Backburner.prototype = {
140
- begin: function () {
141
- var options = this.options;
142
- var onBegin = options && options.onBegin;
143
- var previousInstance = this.currentInstance;
141
+ Queue.prototype = {
142
+ push: function (target, method, args, stack) {
143
+ var queue = this._queue;
144
+ queue.push(target, method, args, stack);
144
145
 
145
- if (previousInstance) {
146
- this.instanceStack.push(previousInstance);
147
- }
146
+ return {
147
+ queue: this,
148
+ target: target,
149
+ method: method
150
+ };
151
+ },
148
152
 
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
+ pushUniqueWithoutGuid: function (target, method, args, stack) {
154
+ var queue = this._queue;
155
+
156
+ for (var i = 0, l = queue.length; i < l; i += 4) {
157
+ var currentTarget = queue[i];
158
+ var currentMethod = queue[i + 1];
159
+
160
+ if (currentTarget === target && currentMethod === method) {
161
+ queue[i + 2] = args; // replace args
162
+ queue[i + 3] = stack; // replace stack
163
+ return;
164
+ }
153
165
  }
166
+
167
+ queue.push(target, method, args, stack);
154
168
  },
155
169
 
156
- end: function () {
157
- var options = this.options;
158
- var onEnd = options && options.onEnd;
159
- var currentInstance = this.currentInstance;
160
- var nextInstance = null;
170
+ targetQueue: function (targetQueue, target, method, args, stack) {
171
+ var queue = this._queue;
161
172
 
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;
170
-
171
- this.currentInstance = null;
173
+ for (var i = 0, l = targetQueue.length; i < l; i += 2) {
174
+ var currentMethod = targetQueue[i];
175
+ var currentIndex = targetQueue[i + 1];
172
176
 
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
- }
177
+ if (currentMethod === method) {
178
+ queue[currentIndex + 2] = args; // replace args
179
+ queue[currentIndex + 3] = stack; // replace stack
180
+ return;
181
181
  }
182
182
  }
183
- },
184
183
 
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
- }
184
+ targetQueue.push(method, queue.push(target, method, args, stack) - 4);
203
185
  },
204
186
 
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);
212
- } else {
213
- throw new TypeError('Cannot on() event "' + eventName + '" because it does not exist');
214
- }
215
- },
187
+ pushUniqueWithGuid: function (guid, target, method, args, stack) {
188
+ var hasLocalQueue = this.targetQueues[guid];
216
189
 
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');
233
- }
190
+ if (hasLocalQueue) {
191
+ this.targetQueue(hasLocalQueue, target, method, args, stack);
234
192
  } else {
235
- throw new TypeError('Cannot off() event "' + eventName + '" because it does not exist');
193
+ this.targetQueues[guid] = [method, this._queue.push(target, method, args, stack) - 4];
236
194
  }
237
- },
238
-
239
- run: function () /* target, method, args */{
240
- var length = arguments.length;
241
- var method, target, args;
242
195
 
243
- if (length === 1) {
244
- method = arguments[0];
245
- target = null;
246
- } else {
247
- target = arguments[0];
248
- method = arguments[1];
249
- }
196
+ return {
197
+ queue: this,
198
+ target: target,
199
+ method: method
200
+ };
201
+ },
250
202
 
251
- if (_backburnerUtils.isString(method)) {
252
- method = target[method];
253
- }
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;
254
210
 
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];
211
+ if (target && KEY) {
212
+ var guid = target[KEY];
213
+ if (guid) {
214
+ return this.pushUniqueWithGuid(guid, target, method, args, stack);
259
215
  }
260
- } else {
261
- args = [];
262
216
  }
263
217
 
264
- var onError = getOnError(this.options);
265
-
266
- this.begin();
218
+ this.pushUniqueWithoutGuid(target, method, args, stack);
267
219
 
268
- // guard against Safari 6's double-finally bug
269
- var didFinally = false;
220
+ return {
221
+ queue: this,
222
+ target: target,
223
+ method: method
224
+ };
225
+ },
270
226
 
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
- }
227
+ invoke: function (target, method, args, _, _errorRecordedForStack) {
228
+ if (args && args.length > 0) {
229
+ method.apply(target, args);
282
230
  } else {
283
- try {
284
- return method.apply(target, args);
285
- } finally {
286
- if (!didFinally) {
287
- didFinally = true;
288
- this.end();
289
- }
290
- }
231
+ method.call(target);
291
232
  }
292
233
  },
293
234
 
294
- join: function () /* target, method, args */{
295
- if (this.currentInstance) {
296
- var length = arguments.length;
297
- var method, target;
298
-
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)) {
308
- method = target[method];
309
- }
310
-
311
- if (length === 1) {
312
- return method();
313
- } else if (length === 2) {
314
- return method.call(target);
235
+ invokeWithOnError: function (target, method, args, onError, errorRecordedForStack) {
236
+ try {
237
+ if (args && args.length > 0) {
238
+ method.apply(target, args);
315
239
  } 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);
240
+ method.call(target);
321
241
  }
322
- } else {
323
- return this.run.apply(this, arguments);
242
+ } catch (error) {
243
+ onError(error, errorRecordedForStack);
324
244
  }
325
245
  },
326
246
 
327
- defer: function (queueName /* , target, method, args */) {
328
- var length = arguments.length;
329
- var method, target, args;
247
+ flush: function (sync) {
248
+ var queue = this._queue;
249
+ var length = queue.length;
330
250
 
331
- if (length === 2) {
332
- method = arguments[1];
333
- target = null;
334
- } else {
335
- target = arguments[1];
336
- method = arguments[2];
251
+ if (length === 0) {
252
+ return;
337
253
  }
338
254
 
339
- if (_backburnerUtils.isString(method)) {
340
- method = target[method];
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;
262
+
263
+ this.targetQueues = Object.create(null);
264
+ var queueItems = this._queueBeingFlushed = this._queue.slice();
265
+ this._queue = [];
266
+
267
+ if (before) {
268
+ before();
341
269
  }
342
270
 
343
- var stack = this.DEBUG ? new Error() : undefined;
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
344
276
 
345
- if (length > 3) {
346
- args = new Array(length - 3);
347
- for (var i = 3; i < length; i++) {
348
- args[i - 3] = arguments[i];
277
+ if (_utils.isString(method)) {
278
+ method = target[method];
279
+ }
280
+
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);
349
296
  }
350
- } else {
351
- args = undefined;
352
297
  }
353
298
 
354
- if (!this.currentInstance) {
355
- createAutorun(this);
299
+ if (after) {
300
+ after();
356
301
  }
357
- return this.currentInstance.schedule(queueName, target, method, args, false, stack);
358
- },
359
302
 
360
- deferOnce: function (queueName /* , target, method, args */) {
361
- var length = arguments.length;
362
- var method, target, args;
303
+ this._queueBeingFlushed = undefined;
363
304
 
364
- if (length === 2) {
365
- method = arguments[1];
366
- target = null;
367
- } else {
368
- target = arguments[1];
369
- method = arguments[2];
305
+ if (sync !== false && this._queue.length > 0) {
306
+ // check if new items have been added
307
+ this.flush(true);
370
308
  }
309
+ },
371
310
 
372
- if (_backburnerUtils.isString(method)) {
373
- method = target[method];
374
- }
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;
375
320
 
376
- var stack = this.DEBUG ? new Error() : undefined;
321
+ if (GUID_KEY && this.targetQueues && target) {
322
+ var targetQueue = this.targetQueues[target[GUID_KEY]];
377
323
 
378
- if (length > 3) {
379
- args = new Array(length - 3);
380
- for (var i = 3; i < length; i++) {
381
- args[i - 3] = arguments[i];
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
+ }
382
330
  }
383
- } else {
384
- args = undefined;
385
- }
386
-
387
- if (!this.currentInstance) {
388
- createAutorun(this);
389
331
  }
390
- return this.currentInstance.schedule(queueName, target, method, args, true, stack);
391
- },
392
332
 
393
- setTimeout: function () {
394
- var l = arguments.length;
395
- var args = new Array(l);
333
+ for (i = 0, l = queue.length; i < l; i += 4) {
334
+ currentTarget = queue[i];
335
+ currentMethod = queue[i + 1];
396
336
 
397
- for (var x = 0; x < l; x++) {
398
- args[x] = arguments[x];
337
+ if (currentTarget === target && currentMethod === method) {
338
+ queue.splice(i, 4);
339
+ return true;
340
+ }
399
341
  }
400
342
 
401
- var length = args.length,
402
- method,
403
- wait,
404
- target,
405
- methodOrTarget,
406
- methodOrWait,
407
- methodOrArgs;
343
+ // if not found in current queue
344
+ // could be in the queue that is being flushed
345
+ queue = this._queueBeingFlushed;
408
346
 
409
- if (length === 0) {
347
+ if (!queue) {
410
348
  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];
417
-
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];
431
-
432
- if (_backburnerUtils.isCoercableNumber(last)) {
433
- wait = args.pop();
434
- } else {
435
- wait = 0;
436
- }
349
+ }
437
350
 
438
- methodOrTarget = args[0];
439
- methodOrArgs = args[1];
351
+ for (i = 0, l = queue.length; i < l; i += 4) {
352
+ currentTarget = queue[i];
353
+ currentMethod = queue[i + 1];
440
354
 
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();
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;
446
360
  }
447
361
  }
362
+ }
363
+ };
364
+ });
365
+ enifed('backburner/utils', ['exports'], function (exports) {
366
+ 'use strict';
448
367
 
449
- var executeAt = _backburnerUtils.now() + parseInt(wait, 10);
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+/;
450
375
 
451
- if (_backburnerUtils.isString(method)) {
452
- method = target[method];
453
- }
376
+ function each(collection, callback) {
377
+ for (var i = 0; i < collection.length; i++) {
378
+ callback(collection[i]);
379
+ }
380
+ }
454
381
 
455
- var onError = getOnError(this.options);
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
+ };
456
387
 
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
- }
467
- }
388
+ exports.now = now;
468
389
 
469
- // find position to insert
470
- var i = _backburnerBinarySearch.default(executeAt, this._timers);
390
+ function isString(suspect) {
391
+ return typeof suspect === 'string';
392
+ }
471
393
 
472
- this._timers.splice(i, 0, executeAt, fn);
394
+ function isFunction(suspect) {
395
+ return typeof suspect === 'function';
396
+ }
473
397
 
474
- updateLaterTimer(this, executeAt, wait);
398
+ function isNumber(suspect) {
399
+ return typeof suspect === 'number';
400
+ }
475
401
 
476
- return fn;
477
- },
402
+ function isCoercableNumber(number) {
403
+ return isNumber(number) || NUMBER.test(number);
404
+ }
478
405
 
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];
406
+ function wrapInTryCatch(func) {
407
+ return function () {
408
+ try {
409
+ return func.apply(this, arguments);
410
+ } catch (e) {
411
+ throw e;
484
412
  }
485
- var immediate = args.pop();
486
- var wait, throttler, index, timer;
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';
487
418
 
488
- if (_backburnerUtils.isNumber(immediate) || _backburnerUtils.isString(immediate)) {
489
- wait = immediate;
490
- immediate = true;
491
- } else {
492
- wait = args.pop();
493
- }
419
+ exports.default = Backburner;
494
420
 
495
- wait = parseInt(wait, 10);
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
+ }
496
436
 
497
- index = findThrottler(target, method, this._throttlers);
498
- if (index > -1) {
499
- return this._throttlers[index];
500
- } // throttled
437
+ Backburner.prototype = {
438
+ begin: function () {
439
+ var options = this.options;
440
+ var onBegin = options && options.onBegin;
441
+ var previousInstance = this.currentInstance;
501
442
 
502
- timer = _backburnerPlatform.default.setTimeout(function () {
503
- if (!immediate) {
504
- backburner.run.apply(backburner, args);
505
- }
506
- var index = findThrottler(target, method, backburner._throttlers);
507
- if (index > -1) {
508
- backburner._throttlers.splice(index, 1);
509
- }
510
- }, wait);
443
+ if (previousInstance) {
444
+ this.instanceStack.push(previousInstance);
445
+ }
511
446
 
512
- if (immediate) {
513
- this.run.apply(this, args);
447
+ this.currentInstance = new _backburnerDeferredActionQueues.default(this.queueNames, options);
448
+ this._trigger('begin', this.currentInstance, previousInstance);
449
+ if (onBegin) {
450
+ onBegin(this.currentInstance, previousInstance);
514
451
  }
452
+ },
515
453
 
516
- throttler = [target, method, timer];
454
+ end: function () {
455
+ var options = this.options;
456
+ var onEnd = options && options.onEnd;
457
+ var currentInstance = this.currentInstance;
458
+ var nextInstance = null;
517
459
 
518
- this._throttlers.push(throttler);
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;
519
468
 
520
- return throttler;
521
- },
469
+ this.currentInstance = null;
522
470
 
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
- }
529
-
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;
536
- } else {
537
- wait = args.pop();
538
- }
539
-
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]);
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
+ }
548
480
  }
481
+ },
549
482
 
550
- timer = _backburnerPlatform.default.setTimeout(function () {
551
- if (!immediate) {
552
- backburner.run.apply(backburner, args);
553
- }
554
- var index = findDebouncee(target, method, backburner._debouncees);
555
- if (index > -1) {
556
- backburner._debouncees.splice(index, 1);
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);
557
499
  }
558
- }, wait);
559
-
560
- if (immediate && index === -1) {
561
- backburner.run.apply(backburner, args);
562
500
  }
563
-
564
- debouncee = [target, method, timer];
565
-
566
- backburner._debouncees.push(debouncee);
567
-
568
- return debouncee;
569
501
  },
570
502
 
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;
503
+ on: function (eventName, callback) {
504
+ if (typeof callback !== 'function') {
505
+ throw new TypeError('Callback must be a function');
585
506
  }
586
- this._timers = [];
587
-
588
- if (this._autorun) {
589
- clearTimeout(this._autorun);
590
- this._autorun = null;
507
+ var callbacks = this._eventCallbacks[eventName];
508
+ if (callbacks) {
509
+ callbacks.push(callback);
510
+ } else {
511
+ throw new TypeError('Cannot on() event "' + eventName + '" because it does not exist');
591
512
  }
592
513
  },
593
514
 
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
- }
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--;
619
526
  }
620
- return true;
621
527
  }
622
528
  }
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);
529
+ if (!callbackFound) {
530
+ throw new TypeError('Cannot off() callback that does not exist');
531
+ }
626
532
  } else {
627
- return; // timer was null or not a timer
533
+ throw new TypeError('Cannot off() event "' + eventName + '" because it does not exist');
628
534
  }
629
535
  },
630
536
 
631
- _cancelItem: function (findMethod, array, timer) {
632
- var item, index;
537
+ run: function () /* target, method, args */{
538
+ var length = arguments.length;
539
+ var method, target, args;
633
540
 
634
- if (timer.length < 3) {
635
- return false;
541
+ if (length === 1) {
542
+ method = arguments[0];
543
+ target = null;
544
+ } else {
545
+ target = arguments[0];
546
+ method = arguments[1];
636
547
  }
637
548
 
638
- index = findMethod(timer[0], timer[1], array);
639
-
640
- if (index > -1) {
641
-
642
- item = array[index];
549
+ if (_backburnerUtils.isString(method)) {
550
+ method = target[method];
551
+ }
643
552
 
644
- if (item[2] === timer[2]) {
645
- array.splice(index, 1);
646
- clearTimeout(timer[2]);
647
- return true;
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];
648
557
  }
558
+ } else {
559
+ args = [];
649
560
  }
650
561
 
651
- return false;
652
- }
653
- };
654
-
655
- Backburner.prototype.schedule = Backburner.prototype.defer;
656
- Backburner.prototype.scheduleOnce = Backburner.prototype.deferOnce;
657
- Backburner.prototype.later = Backburner.prototype.setTimeout;
658
-
659
- if (_backburnerPlatform.needsIETryCatchFix) {
660
- var originalRun = Backburner.prototype.run;
661
- Backburner.prototype.run = _backburnerUtils.wrapInTryCatch(originalRun);
662
-
663
- var originalEnd = Backburner.prototype.end;
664
- Backburner.prototype.end = _backburnerUtils.wrapInTryCatch(originalEnd);
665
- }
666
-
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
- }
562
+ var onError = getOnError(this.options);
678
563
 
679
- function updateLaterTimer(backburner, executeAt, wait) {
680
- var n = _backburnerUtils.now();
681
- if (!backburner._laterTimer || executeAt < backburner._laterTimerExpiresAt || backburner._laterTimerExpiresAt < n) {
564
+ this.begin();
682
565
 
683
- if (backburner._laterTimer) {
684
- // Clear when:
685
- // - Already expired
686
- // - New timer is earlier
687
- clearTimeout(backburner._laterTimer);
566
+ // guard against Safari 6's double-finally bug
567
+ var didFinally = false;
688
568
 
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);
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();
587
+ }
693
588
  }
694
589
  }
590
+ },
695
591
 
696
- backburner._laterTimer = _backburnerPlatform.default.setTimeout(function () {
697
- backburner._laterTimer = null;
698
- backburner._laterTimerExpiresAt = null;
699
- executeTimers(backburner);
700
- }, wait);
701
-
702
- backburner._laterTimerExpiresAt = n + wait;
703
- }
704
- }
705
-
706
- function executeTimers(backburner) {
707
- var n = _backburnerUtils.now();
708
- var fns, i, l;
592
+ join: function () /* target, method, args */{
593
+ if (this.currentInstance) {
594
+ var length = arguments.length;
595
+ var method, target;
709
596
 
710
- backburner.run(function () {
711
- i = _backburnerBinarySearch.default(n, backburner._timers);
597
+ if (length === 1) {
598
+ method = arguments[0];
599
+ target = null;
600
+ } else {
601
+ target = arguments[0];
602
+ method = arguments[1];
603
+ }
712
604
 
713
- fns = backburner._timers.splice(0, i);
605
+ if (_backburnerUtils.isString(method)) {
606
+ method = target[method];
607
+ }
714
608
 
715
- for (i = 1, l = fns.length; i < l; i += 2) {
716
- backburner.schedule(backburner.options.defaultQueue, null, fns[i]);
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);
619
+ }
620
+ } else {
621
+ return this.run.apply(this, arguments);
717
622
  }
718
- });
719
-
720
- if (backburner._timers.length) {
721
- updateLaterTimer(backburner, backburner._timers[0], backburner._timers[0] - n);
722
- }
723
- }
724
-
725
- function findDebouncee(target, method, debouncees) {
726
- return findItem(target, method, debouncees);
727
- }
728
-
729
- function findThrottler(target, method, throttlers) {
730
- return findItem(target, method, throttlers);
731
- }
623
+ },
732
624
 
733
- function findItem(target, method, collection) {
734
- var item;
735
- var index = -1;
625
+ defer: function (queueName /* , target, method, args */) {
626
+ var length = arguments.length;
627
+ var method, target, args;
736
628
 
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;
629
+ if (length === 2) {
630
+ method = arguments[1];
631
+ target = null;
632
+ } else {
633
+ target = arguments[1];
634
+ method = arguments[2];
742
635
  }
743
- }
744
636
 
745
- return index;
746
- }
747
- });
748
- enifed("backburner/binary-search", ["exports"], function (exports) {
749
- "use strict";
750
-
751
- exports.default = binarySearch;
752
-
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;
637
+ if (_backburnerUtils.isString(method)) {
638
+ method = target[method];
639
+ }
762
640
 
763
- // compensate for the index in case even number
764
- // of pairs inside timers
765
- middle = start + l - l % 2;
641
+ var stack = this.DEBUG ? new Error() : undefined;
766
642
 
767
- if (time >= timers[middle]) {
768
- start = middle + 2;
643
+ if (length > 3) {
644
+ args = new Array(length - 3);
645
+ for (var i = 3; i < length; i++) {
646
+ args[i - 3] = arguments[i];
647
+ }
769
648
  } else {
770
- end = middle;
649
+ args = undefined;
771
650
  }
772
- }
773
-
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';
779
-
780
- exports.default = DeferredActionQueues;
781
-
782
- function DeferredActionQueues(queueNames, options) {
783
- var queues = this.queues = {};
784
- this.queueNames = queueNames = queueNames || [];
785
651
 
786
- this.options = options;
787
-
788
- _utils.each(queueNames, function (queueName) {
789
- queues[queueName] = new _queue.default(queueName, options[queueName], options);
790
- });
791
- }
792
-
793
- function noSuchQueue(name) {
794
- throw new Error('You attempted to schedule an action in a queue (' + name + ') that doesn\'t exist');
795
- }
796
-
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
- }
800
-
801
- DeferredActionQueues.prototype = {
802
- schedule: function (name, target, method, args, onceFlag, stack) {
803
- var queues = this.queues;
804
- var queue = queues[name];
805
-
806
- if (!queue) {
807
- noSuchQueue(name);
652
+ if (!this.currentInstance) {
653
+ createAutorun(this);
808
654
  }
655
+ return this.currentInstance.schedule(queueName, target, method, args, false, stack);
656
+ },
809
657
 
810
- if (!method) {
811
- noSuchMethod(name);
812
- }
658
+ deferOnce: function (queueName /* , target, method, args */) {
659
+ var length = arguments.length;
660
+ var method, target, args;
813
661
 
814
- if (onceFlag) {
815
- return queue.pushUnique(target, method, args, stack);
662
+ if (length === 2) {
663
+ method = arguments[1];
664
+ target = null;
816
665
  } else {
817
- return queue.push(target, method, args, stack);
666
+ target = arguments[1];
667
+ method = arguments[2];
818
668
  }
819
- },
820
-
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;
828
-
829
- while (queueNameIndex < numberOfQueues) {
830
- queueName = queueNames[queueNameIndex];
831
- queue = queues[queueName];
832
-
833
- var numberOfQueueItems = queue._queue.length;
834
669
 
835
- if (numberOfQueueItems === 0) {
836
- queueNameIndex++;
837
- } else {
838
- queue.flush(false /* async */);
839
- queueNameIndex = 0;
840
- }
670
+ if (_backburnerUtils.isString(method)) {
671
+ method = target[method];
841
672
  }
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';
850
-
851
- var needsIETryCatchFix = (function (e, x) {
852
- try {
853
- x();
854
- } catch (e) {} // jshint ignore:line
855
- return !!e;
856
- })();
857
-
858
- exports.needsIETryCatchFix = needsIETryCatchFix;
859
- var platform;
860
673
 
861
- /* global self */
862
- if (typeof self === 'object') {
863
- platform = self;
674
+ var stack = this.DEBUG ? new Error() : undefined;
864
675
 
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
- }
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;
683
+ }
871
684
 
872
- exports.default = platform;
873
- });
874
- enifed('backburner/queue', ['exports', './utils'], function (exports, _utils) {
875
- 'use strict';
685
+ if (!this.currentInstance) {
686
+ createAutorun(this);
687
+ }
688
+ return this.currentInstance.schedule(queueName, target, method, args, true, stack);
689
+ },
876
690
 
877
- exports.default = Queue;
691
+ setTimeout: function () {
692
+ var l = arguments.length;
693
+ var args = new Array(l);
878
694
 
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
- }
695
+ for (var x = 0; x < l; x++) {
696
+ args[x] = arguments[x];
697
+ }
887
698
 
888
- Queue.prototype = {
889
- push: function (target, method, args, stack) {
890
- var queue = this._queue;
891
- queue.push(target, method, args, stack);
699
+ var length = args.length,
700
+ method,
701
+ wait,
702
+ target,
703
+ methodOrTarget,
704
+ methodOrWait,
705
+ methodOrArgs;
892
706
 
893
- return {
894
- queue: this,
895
- target: target,
896
- method: method
897
- };
898
- },
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];
899
715
 
900
- pushUniqueWithoutGuid: function (target, method, args, stack) {
901
- var queue = this._queue;
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
+ }
727
+ } else {
728
+ var last = args[args.length - 1];
902
729
 
903
- for (var i = 0, l = queue.length; i < l; i += 4) {
904
- var currentTarget = queue[i];
905
- var currentMethod = queue[i + 1];
730
+ if (_backburnerUtils.isCoercableNumber(last)) {
731
+ wait = args.pop();
732
+ } else {
733
+ wait = 0;
734
+ }
906
735
 
907
- if (currentTarget === target && currentMethod === method) {
908
- queue[i + 2] = args; // replace args
909
- queue[i + 3] = stack; // replace stack
910
- return;
736
+ methodOrTarget = args[0];
737
+ methodOrArgs = args[1];
738
+
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();
911
744
  }
912
745
  }
913
746
 
914
- queue.push(target, method, args, stack);
915
- },
747
+ var executeAt = _backburnerUtils.now() + parseInt(wait, 10);
916
748
 
917
- targetQueue: function (targetQueue, target, method, args, stack) {
918
- var queue = this._queue;
749
+ if (_backburnerUtils.isString(method)) {
750
+ method = target[method];
751
+ }
919
752
 
920
- for (var i = 0, l = targetQueue.length; i < l; i += 2) {
921
- var currentMethod = targetQueue[i];
922
- var currentIndex = targetQueue[i + 1];
753
+ var onError = getOnError(this.options);
923
754
 
924
- if (currentMethod === method) {
925
- queue[currentIndex + 2] = args; // replace args
926
- queue[currentIndex + 3] = stack; // replace stack
927
- return;
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);
928
764
  }
929
765
  }
930
766
 
931
- targetQueue.push(method, queue.push(target, method, args, stack) - 4);
767
+ // find position to insert
768
+ var i = _backburnerBinarySearch.default(executeAt, this._timers);
769
+
770
+ this._timers.splice(i, 0, executeAt, fn);
771
+
772
+ updateLaterTimer(this, executeAt, wait);
773
+
774
+ return fn;
932
775
  },
933
776
 
934
- pushUniqueWithGuid: function (guid, target, method, args, stack) {
935
- var hasLocalQueue = this.targetQueues[guid];
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];
782
+ }
783
+ var immediate = args.pop();
784
+ var wait, throttler, index, timer;
936
785
 
937
- if (hasLocalQueue) {
938
- this.targetQueue(hasLocalQueue, target, method, args, stack);
786
+ if (_backburnerUtils.isNumber(immediate) || _backburnerUtils.isString(immediate)) {
787
+ wait = immediate;
788
+ immediate = true;
939
789
  } else {
940
- this.targetQueues[guid] = [method, this._queue.push(target, method, args, stack) - 4];
790
+ wait = args.pop();
941
791
  }
942
792
 
943
- return {
944
- queue: this,
945
- target: target,
946
- method: method
947
- };
948
- },
793
+ wait = parseInt(wait, 10);
949
794
 
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;
795
+ index = findThrottler(target, method, this._throttlers);
796
+ if (index > -1) {
797
+ return this._throttlers[index];
798
+ } // throttled
957
799
 
958
- if (target && KEY) {
959
- var guid = target[KEY];
960
- if (guid) {
961
- return this.pushUniqueWithGuid(guid, target, method, args, stack);
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);
962
807
  }
808
+ }, wait);
809
+
810
+ if (immediate) {
811
+ this.run.apply(this, args);
963
812
  }
964
813
 
965
- this.pushUniqueWithoutGuid(target, method, args, stack);
814
+ throttler = [target, method, timer];
966
815
 
967
- return {
968
- queue: this,
969
- target: target,
970
- method: method
971
- };
816
+ this._throttlers.push(throttler);
817
+
818
+ return throttler;
972
819
  },
973
820
 
974
- invoke: function (target, method, args, _, _errorRecordedForStack) {
975
- if (args && args.length > 0) {
976
- method.apply(target, args);
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
+ }
827
+
828
+ var immediate = args.pop();
829
+ var wait, index, debouncee, timer;
830
+
831
+ if (_backburnerUtils.isNumber(immediate) || _backburnerUtils.isString(immediate)) {
832
+ wait = immediate;
833
+ immediate = false;
977
834
  } else {
978
- method.call(target);
835
+ wait = args.pop();
979
836
  }
980
- },
981
837
 
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);
988
- }
989
- } catch (error) {
990
- onError(error, errorRecordedForStack);
838
+ wait = parseInt(wait, 10);
839
+ // Remove debouncee
840
+ index = findDebouncee(target, method, this._debouncees);
841
+
842
+ if (index > -1) {
843
+ debouncee = this._debouncees[index];
844
+ this._debouncees.splice(index, 1);
845
+ clearTimeout(debouncee[2]);
991
846
  }
992
- },
993
847
 
994
- flush: function (sync) {
995
- var queue = this._queue;
996
- var length = queue.length;
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);
997
857
 
998
- if (length === 0) {
999
- return;
858
+ if (immediate && index === -1) {
859
+ backburner.run.apply(backburner, args);
1000
860
  }
1001
861
 
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;
862
+ debouncee = [target, method, timer];
1009
863
 
1010
- this.targetQueues = Object.create(null);
1011
- var queueItems = this._queueBeingFlushed = this._queue.slice();
1012
- this._queue = [];
864
+ backburner._debouncees.push(debouncee);
1013
865
 
1014
- if (before) {
1015
- before();
1016
- }
866
+ return debouncee;
867
+ },
1017
868
 
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
869
+ cancelTimers: function () {
870
+ var clearItems = function (item) {
871
+ clearTimeout(item[2]);
872
+ };
1023
873
 
1024
- if (_utils.isString(method)) {
1025
- method = target[method];
1026
- }
874
+ _backburnerUtils.each(this._throttlers, clearItems);
875
+ this._throttlers = [];
1027
876
 
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
- }
877
+ _backburnerUtils.each(this._debouncees, clearItems);
878
+ this._debouncees = [];
1045
879
 
1046
- if (after) {
1047
- after();
880
+ if (this._laterTimer) {
881
+ clearTimeout(this._laterTimer);
882
+ this._laterTimer = null;
1048
883
  }
884
+ this._timers = [];
1049
885
 
1050
- this._queueBeingFlushed = undefined;
1051
-
1052
- if (sync !== false && this._queue.length > 0) {
1053
- // check if new items have been added
1054
- this.flush(true);
886
+ if (this._autorun) {
887
+ clearTimeout(this._autorun);
888
+ this._autorun = null;
1055
889
  }
1056
890
  },
1057
891
 
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;
892
+ hasTimers: function () {
893
+ return !!this._timers.length || !!this._debouncees.length || !!this._throttlers.length || this._autorun;
894
+ },
1067
895
 
1068
- if (GUID_KEY && this.targetQueues && target) {
1069
- var targetQueue = this.targetQueues[target[GUID_KEY]];
896
+ cancel: function (timer) {
897
+ var timerType = typeof timer;
1070
898
 
1071
- if (targetQueue) {
1072
- for (i = 0, l = targetQueue.length; i < l; i++) {
1073
- if (targetQueue[i] === method) {
1074
- targetQueue.splice(i, 1);
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
+ }
1075
917
  }
918
+ return true;
1076
919
  }
1077
920
  }
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
1078
926
  }
927
+ },
1079
928
 
1080
- for (i = 0, l = queue.length; i < l; i += 4) {
1081
- currentTarget = queue[i];
1082
- currentMethod = queue[i + 1];
929
+ _cancelItem: function (findMethod, array, timer) {
930
+ var item, index;
1083
931
 
1084
- if (currentTarget === target && currentMethod === method) {
1085
- queue.splice(i, 4);
1086
- return true;
1087
- }
932
+ if (timer.length < 3) {
933
+ return false;
1088
934
  }
1089
935
 
1090
- // if not found in current queue
1091
- // could be in the queue that is being flushed
1092
- queue = this._queueBeingFlushed;
936
+ index = findMethod(timer[0], timer[1], array);
1093
937
 
1094
- if (!queue) {
1095
- return;
1096
- }
938
+ if (index > -1) {
1097
939
 
1098
- for (i = 0, l = queue.length; i < l; i += 4) {
1099
- currentTarget = queue[i];
1100
- currentMethod = queue[i + 1];
940
+ item = array[index];
1101
941
 
1102
- if (currentTarget === target && currentMethod === method) {
1103
- // don't mess with array during flush
1104
- // just nullify the method
1105
- queue[i + 1] = null;
942
+ if (item[2] === timer[2]) {
943
+ array.splice(index, 1);
944
+ clearTimeout(timer[2]);
1106
945
  return true;
1107
946
  }
1108
947
  }
948
+
949
+ return false;
1109
950
  }
1110
951
  };
1111
- });
1112
- enifed('backburner/utils', ['exports'], function (exports) {
1113
- 'use strict';
1114
952
 
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+/;
953
+ Backburner.prototype.schedule = Backburner.prototype.defer;
954
+ Backburner.prototype.scheduleOnce = Backburner.prototype.deferOnce;
955
+ Backburner.prototype.later = Backburner.prototype.setTimeout;
1122
956
 
1123
- function each(collection, callback) {
1124
- for (var i = 0; i < collection.length; i++) {
1125
- callback(collection[i]);
957
+ if (_backburnerPlatform.needsIETryCatchFix) {
958
+ var originalRun = Backburner.prototype.run;
959
+ Backburner.prototype.run = _backburnerUtils.wrapInTryCatch(originalRun);
960
+
961
+ var originalEnd = Backburner.prototype.end;
962
+ Backburner.prototype.end = _backburnerUtils.wrapInTryCatch(originalEnd);
963
+ }
964
+
965
+ function getOnError(options) {
966
+ return options.onError || options.onErrorTarget && options.onErrorTarget[options.onErrorMethod];
967
+ }
968
+
969
+ function createAutorun(backburner) {
970
+ backburner.begin();
971
+ backburner._autorun = _backburnerPlatform.default.setTimeout(function () {
972
+ backburner._autorun = null;
973
+ backburner.end();
974
+ });
975
+ }
976
+
977
+ function updateLaterTimer(backburner, executeAt, wait) {
978
+ var n = _backburnerUtils.now();
979
+ if (!backburner._laterTimer || executeAt < backburner._laterTimerExpiresAt || backburner._laterTimerExpiresAt < n) {
980
+
981
+ if (backburner._laterTimer) {
982
+ // Clear when:
983
+ // - Already expired
984
+ // - New timer is earlier
985
+ clearTimeout(backburner._laterTimer);
986
+
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);
991
+ }
992
+ }
993
+
994
+ backburner._laterTimer = _backburnerPlatform.default.setTimeout(function () {
995
+ backburner._laterTimer = null;
996
+ backburner._laterTimerExpiresAt = null;
997
+ executeTimers(backburner);
998
+ }, wait);
999
+
1000
+ backburner._laterTimerExpiresAt = n + wait;
1126
1001
  }
1127
1002
  }
1128
1003
 
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
- };
1004
+ function executeTimers(backburner) {
1005
+ var n = _backburnerUtils.now();
1006
+ var fns, i, l;
1134
1007
 
1135
- exports.now = now;
1008
+ backburner.run(function () {
1009
+ i = _backburnerBinarySearch.default(n, backburner._timers);
1136
1010
 
1137
- function isString(suspect) {
1138
- return typeof suspect === 'string';
1011
+ fns = backburner._timers.splice(0, i);
1012
+
1013
+ for (i = 1, l = fns.length; i < l; i += 2) {
1014
+ backburner.schedule(backburner.options.defaultQueue, null, fns[i]);
1015
+ }
1016
+ });
1017
+
1018
+ if (backburner._timers.length) {
1019
+ updateLaterTimer(backburner, backburner._timers[0], backburner._timers[0] - n);
1020
+ }
1139
1021
  }
1140
1022
 
1141
- function isFunction(suspect) {
1142
- return typeof suspect === 'function';
1023
+ function findDebouncee(target, method, debouncees) {
1024
+ return findItem(target, method, debouncees);
1143
1025
  }
1144
1026
 
1145
- function isNumber(suspect) {
1146
- return typeof suspect === 'number';
1027
+ function findThrottler(target, method, throttlers) {
1028
+ return findItem(target, method, throttlers);
1147
1029
  }
1148
1030
 
1149
- function isCoercableNumber(number) {
1150
- return isNumber(number) || NUMBER.test(number);
1031
+ function findItem(target, method, collection) {
1032
+ var item;
1033
+ var index = -1;
1034
+
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
+ }
1042
+
1043
+ return index;
1151
1044
  }
1045
+ });
1046
+ requireModule("ember-debug");
1047
+ requireModule("ember-template-compiler");
1152
1048
 
1153
- function wrapInTryCatch(func) {
1154
- return function () {
1155
- try {
1156
- return func.apply(this, arguments);
1157
- } catch (e) {
1158
- throw e;
1049
+ enifed('ember-debug/deprecation-manager', ['exports', 'ember-metal/dictionary', 'ember-metal/utils'], function (exports, _emberMetalDictionary, _emberMetalUtils) {
1050
+ 'use strict';
1051
+
1052
+ var deprecationLevels = {
1053
+ RAISE: _emberMetalUtils.symbol('RAISE'),
1054
+ LOG: _emberMetalUtils.symbol('LOG'),
1055
+ SILENCE: _emberMetalUtils.symbol('SILENCE')
1056
+ };
1057
+
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;
1159
1072
  }
1160
- };
1161
- }
1073
+ return level;
1074
+ }
1075
+ };
1162
1076
  });
1163
1077
  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) {
1164
1078
  /*global __fail__*/
@@ -1480,247 +1394,11 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1480
1394
  so that if `ember.js` (which must be output for backwards compat reasons) is
1481
1395
  used a nice helpful warning message will be printed out.
1482
1396
  */
1483
- var runningNonEmberDebugJS = false;
1484
- exports.runningNonEmberDebugJS = runningNonEmberDebugJS;
1485
- if (runningNonEmberDebugJS) {
1486
- _emberMetalCore.default.warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');
1487
- }
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');
1397
+ var runningNonEmberDebugJS = false;
1398
+ exports.runningNonEmberDebugJS = runningNonEmberDebugJS;
1399
+ if (runningNonEmberDebugJS) {
1400
+ _emberMetalCore.default.warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');
1718
1401
  }
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
1402
  });
1725
1403
  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) {
1726
1404
  'use strict';
@@ -4059,7 +3737,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4059
3737
 
4060
3738
  @class Ember
4061
3739
  @static
4062
- @version 2.0.2
3740
+ @version 2.0.3
4063
3741
  @public
4064
3742
  */
4065
3743
 
@@ -4093,11 +3771,11 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4093
3771
 
4094
3772
  @property VERSION
4095
3773
  @type String
4096
- @default '2.0.2'
3774
+ @default '2.0.3'
4097
3775
  @static
4098
3776
  @public
4099
3777
  */
4100
- Ember.VERSION = '2.0.2';
3778
+ Ember.VERSION = '2.0.3';
4101
3779
 
4102
3780
  /**
4103
3781
  The hash of environment variables used to control various configuration
@@ -10951,158 +10629,331 @@ enifed('ember-metal/watch_path', ['exports', 'ember-metal/utils', 'ember-metal/c
10951
10629
  }
10952
10630
  }
10953
10631
 
10954
- function unwatchPath(obj, keyPath, meta) {
10955
- var m = meta || _emberMetalUtils.meta(obj);
10956
- var watching = m.watching;
10632
+ function unwatchPath(obj, keyPath, meta) {
10633
+ var m = meta || _emberMetalUtils.meta(obj);
10634
+ var watching = m.watching;
10635
+
10636
+ if (watching[keyPath] === 1) {
10637
+ watching[keyPath] = 0;
10638
+ chainsFor(obj, m).remove(keyPath);
10639
+ } else if (watching[keyPath] > 1) {
10640
+ watching[keyPath]--;
10641
+ }
10642
+ }
10643
+ });
10644
+ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/watch_key', 'ember-metal/watch_path', 'ember-metal/path_cache'], function (exports, _emberMetalChains, _emberMetalWatch_key, _emberMetalWatch_path, _emberMetalPath_cache) {
10645
+ /**
10646
+ @module ember-metal
10647
+ */
10648
+
10649
+ 'use strict';
10650
+
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;
10957
10884
 
10958
- if (watching[keyPath] === 1) {
10959
- watching[keyPath] = 0;
10960
- chainsFor(obj, m).remove(keyPath);
10961
- } else if (watching[keyPath] > 1) {
10962
- watching[keyPath]--;
10963
- }
10964
- }
10965
- });
10966
- enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/watch_key', 'ember-metal/watch_path', 'ember-metal/path_cache'], function (exports, _emberMetalChains, _emberMetalWatch_key, _emberMetalWatch_path, _emberMetalPath_cache) {
10967
- /**
10968
- @module ember-metal
10969
- */
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;
10970
10892
 
10971
- 'use strict';
10893
+ _emberMetalCore.default.bind = _emberMetalBinding.bind;
10894
+ _emberMetalCore.default.Binding = _emberMetalBinding.Binding;
10895
+ _emberMetalCore.default.isGlobalPath = _emberMetalBinding.isGlobalPath;
10972
10896
 
10973
- exports.isWatching = isWatching;
10974
- exports.unwatch = unwatch;
10975
- exports.destroy = destroy;
10897
+ _emberMetalCore.default.run = _emberMetalRun_loop.default;
10976
10898
 
10977
10899
  /**
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
10900
+ @class Backburner
10901
+ @for Ember
10902
+ @private
10989
10903
  */
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
- }
10995
-
10996
- if (!_emberMetalPath_cache.isPath(_keyPath)) {
10997
- _emberMetalWatch_key.watchKey(obj, _keyPath, m);
10998
- } else {
10999
- _emberMetalWatch_path.watchPath(obj, _keyPath, m);
11000
- }
11001
- }
11002
-
11003
- exports.watch = watch;
11004
-
11005
- function isWatching(obj, key) {
11006
- var meta = obj['__ember_meta__'];
11007
- return (meta && meta.watching[key]) > 0;
11008
- }
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;
11009
10908
 
11010
- watch.flushPending = _emberMetalChains.flushPendingChains;
10909
+ _emberMetalCore.default.libraries = new _emberMetalLibraries.default();
10910
+ _emberMetalCore.default.libraries.registerCoreLibrary('Ember', _emberMetalCore.default.VERSION);
11011
10911
 
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
- }
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;
11017
10916
 
11018
- if (!_emberMetalPath_cache.isPath(_keyPath)) {
11019
- _emberMetalWatch_key.unwatchKey(obj, _keyPath, m);
11020
- } else {
11021
- _emberMetalWatch_path.unwatchPath(obj, _keyPath, m);
11022
- }
11023
- }
10917
+ _emberMetalCore.default.merge = _emberMetalMerge.default;
11024
10918
 
11025
- var NODE_STACK = [];
10919
+ _emberMetalCore.default.FEATURES = _emberMetalFeatures.FEATURES;
10920
+ _emberMetalCore.default.FEATURES.isEnabled = _emberMetalFeatures.default;
11026
10921
 
11027
10922
  /**
11028
- Tears down the meta on an object so that it can be garbage collected.
11029
- Multiple calls will have no effect.
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.
11030
10926
 
11031
- @method destroy
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.
10937
+
10938
+ @event onerror
11032
10939
  @for Ember
11033
- @param {Object} obj the object to destroy
11034
- @return {void}
11035
- @private
10940
+ @param {Exception} error the error object
10941
+ @public
11036
10942
  */
10943
+ _emberMetalCore.default.onerror = null;
10944
+ // END EXPORTS
11037
10945
 
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);
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');
11088
10951
  }
11089
10952
 
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
- });
11096
-
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 || {};
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);
11102
10955
 
11103
- EmberHandlebars.precompile = _emberTemplateCompilerCompatPrecompile.default;
11104
- EmberHandlebars.compile = _emberTemplateCompilerSystemCompile.default;
11105
- EmberHandlebars.template = _emberTemplateCompilerSystemTemplate.default;
10956
+ exports.default = _emberMetalCore.default;
11106
10957
  });
11107
10958
  enifed('ember-template-compiler/compat/precompile', ['exports', 'ember-metal/core', 'ember-template-compiler/system/compile_options'], function (exports, _emberMetalCore, _emberTemplateCompilerSystemCompile_options) {
11108
10959
  /**
@@ -11131,39 +10982,14 @@ enifed('ember-template-compiler/compat/precompile', ['exports', 'ember-metal/cor
11131
10982
  return compileFunc(string, _emberTemplateCompilerSystemCompile_options.default());
11132
10983
  };
11133
10984
  });
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
- */
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) {
11144
10986
  'use strict';
11145
10987
 
11146
- exports.registerPlugin = registerPlugin;
11147
- var plugins = {
11148
- ast: []
11149
- };
11150
-
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
- }
10988
+ var EmberHandlebars = _emberMetalCore.default.Handlebars = _emberMetalCore.default.Handlebars || {};
11165
10989
 
11166
- exports.default = plugins;
10990
+ EmberHandlebars.precompile = _emberTemplateCompilerCompatPrecompile.default;
10991
+ EmberHandlebars.compile = _emberTemplateCompilerSystemCompile.default;
10992
+ EmberHandlebars.template = _emberTemplateCompilerSystemTemplate.default;
11167
10993
  });
11168
10994
  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) {
11169
10995
  'use strict';
@@ -11928,8 +11754,42 @@ enifed('ember-template-compiler/plugins/transform-old-class-binding-syntax', ['e
11928
11754
  segments[i] = segments[i].split(':');
11929
11755
  }
11930
11756
 
11931
- return segments;
11757
+ return segments;
11758
+ }
11759
+ });
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);
11932
11790
  }
11791
+
11792
+ exports.default = plugins;
11933
11793
  });
11934
11794
  enifed('ember-template-compiler/system/calculate-location-display', ['exports'], function (exports) {
11935
11795
  'use strict';
@@ -12038,7 +11898,7 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
12038
11898
 
12039
11899
  options.buildMeta = function buildMeta(program) {
12040
11900
  return {
12041
- revision: 'Ember@2.0.2',
11901
+ revision: 'Ember@2.0.3',
12042
11902
  loc: program.loc,
12043
11903
  moduleName: options.moduleName
12044
11904
  };
@@ -12107,13 +11967,32 @@ enifed('ember-template-compiler/system/template', ['exports', 'htmlbars-runtime/
12107
11967
  return templateSpec;
12108
11968
  };
12109
11969
  });
12110
- enifed("htmlbars-compiler", ["exports", "./htmlbars-compiler/compiler"], function (exports, _htmlbarsCompilerCompiler) {
12111
- "use strict";
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';
12112
11972
 
12113
- exports.compile = _htmlbarsCompilerCompiler.compile;
12114
- exports.compileSpec = _htmlbarsCompilerCompiler.compileSpec;
12115
- exports.template = _htmlbarsCompilerCompiler.template;
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
+ }
11987
+
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;
12116
11993
  });
11994
+
11995
+ // used for adding Ember.Handlebars.compile for backwards compat
12117
11996
  enifed("htmlbars-compiler/compiler", ["exports", "../htmlbars-syntax/parser", "./template-compiler", "../htmlbars-runtime/hooks", "../htmlbars-runtime/render"], function (exports, _htmlbarsSyntaxParser, _templateCompiler, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender) {
12118
11997
  /*jshint evil:true*/
12119
11998
  "use strict";
@@ -13393,23 +13272,12 @@ enifed("htmlbars-compiler/utils", ["exports"], function (exports) {
13393
13272
  }
13394
13273
  }
13395
13274
  });
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';
13398
-
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
- };
13275
+ enifed("htmlbars-compiler", ["exports", "./htmlbars-compiler/compiler"], function (exports, _htmlbarsCompilerCompiler) {
13276
+ "use strict";
13409
13277
 
13410
- exports.hooks = _htmlbarsRuntimeHooks.default;
13411
- exports.render = _htmlbarsRuntimeRender.default;
13412
- exports.internal = internal;
13278
+ exports.compile = _htmlbarsCompilerCompiler.compile;
13279
+ exports.compileSpec = _htmlbarsCompilerCompiler.compileSpec;
13280
+ exports.template = _htmlbarsCompilerCompiler.template;
13413
13281
  });
13414
13282
  enifed("htmlbars-runtime/expression-visitor", ["exports", "../htmlbars-util/object-utils", "../htmlbars-util/morph-utils"], function (exports, _htmlbarsUtilObjectUtils, _htmlbarsUtilMorphUtils) {
13415
13283
  "use strict";
@@ -15282,14 +15150,23 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15282
15150
  return fragment;
15283
15151
  }
15284
15152
  });
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";
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';
15287
15155
 
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;
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
+ };
15166
+
15167
+ exports.hooks = _htmlbarsRuntimeHooks.default;
15168
+ exports.render = _htmlbarsRuntimeRender.default;
15169
+ exports.internal = internal;
15293
15170
  });
15294
15171
  enifed("htmlbars-syntax/builders", ["exports"], function (exports) {
15295
15172
  // Statements
@@ -17226,95 +17103,6 @@ enifed('htmlbars-syntax/handlebars/utils', ['exports'], function (exports) {
17226
17103
  return (contextPath ? contextPath + '.' : '') + id;
17227
17104
  }
17228
17105
  });
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
- });
17318
17106
  enifed("htmlbars-syntax/parser/handlebars-node-visitors", ["exports", "../builders", "../utils"], function (exports, _builders, _utils) {
17319
17107
  "use strict";
17320
17108
 
@@ -17750,6 +17538,95 @@ enifed("htmlbars-syntax/parser/tokenizer-event-handlers", ["exports", "../../htm
17750
17538
  return "`" + tag.name + "` (on line " + tag.loc.end.line + ")";
17751
17539
  }
17752
17540
  });
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
+ });
17753
17630
  enifed("htmlbars-syntax/traversal/errors", ["exports"], function (exports) {
17754
17631
  "use strict";
17755
17632
 
@@ -18098,6 +17975,15 @@ enifed('htmlbars-syntax/utils', ['exports', '../htmlbars-util/array-utils'], fun
18098
17975
  }
18099
17976
  }
18100
17977
  });
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
+ });
18101
17987
  enifed("htmlbars-test-helpers", ["exports", "../simple-html-tokenizer", "../htmlbars-util/array-utils"], function (exports, _simpleHtmlTokenizer, _htmlbarsUtilArrayUtils) {
18102
17988
  "use strict";
18103
17989
 
@@ -18225,16 +18111,6 @@ enifed("htmlbars-test-helpers", ["exports", "../simple-html-tokenizer", "../html
18225
18111
  }
18226
18112
  }
18227
18113
  });
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
- });
18238
18114
  enifed('htmlbars-util/array-utils', ['exports'], function (exports) {
18239
18115
  'use strict';
18240
18116
 
@@ -18803,43 +18679,310 @@ enifed("htmlbars-util/template-utils", ["exports", "../htmlbars-util/morph-utils
18803
18679
  didCleanup(env, morph, destroySelf);
18804
18680
  }
18805
18681
 
18806
- morph.lastResult = null;
18807
- morph.lastYielded = null;
18808
- morph.childNodes = null;
18809
- }
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
+ };
18810
18924
 
18811
- function clearMorphList(morphList, morph, env) {
18812
- var item = morphList.firstChildMorph;
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");
18928
+ }
18813
18929
 
18814
- while (item) {
18815
- var next = item.nextMorph;
18816
- delete morph.morphMap[item.key];
18817
- clearMorph(item, env, true);
18818
- item.destroy();
18930
+ morph.destroy();
18931
+ };
18819
18932
 
18820
- item = next;
18821
- }
18933
+ exports.default = MorphList;
18934
+ });
18935
+ enifed('morph-range/morph-list.umd', ['exports', './morph-list'], function (exports, _morphList) {
18936
+ 'use strict';
18822
18937
 
18823
- // Remove the MorphList from the morph.
18824
- morphList.clear();
18825
- morph.morphList = null;
18826
- }
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();
18945
+ }
18946
+ })(undefined, function () {
18947
+ return _morphList.default;
18948
+ });
18827
18949
  });
18828
- enifed("htmlbars-util/void-tag-names", ["exports", "./array-utils"], function (exports, _arrayUtils) {
18950
+ enifed("morph-range/utils", ["exports"], function (exports) {
18951
+ // inclusive of both nodes
18829
18952
  "use strict";
18830
18953
 
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 = {};
18954
+ exports.clear = clear;
18955
+ exports.insertBefore = insertBefore;
18837
18956
 
18838
- _arrayUtils.forEach(voidTagNames.split(" "), function (tagName) {
18839
- voidMap[tagName] = true;
18840
- });
18957
+ function clear(parentNode, firstNode, lastNode) {
18958
+ if (!parentNode) {
18959
+ return;
18960
+ }
18841
18961
 
18842
- exports.default = voidMap;
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
+ }
18973
+
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
+ }
18843
18986
  });
18844
18987
  enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _morphRangeUtils) {
18845
18988
  'use strict';
@@ -18899,8 +19042,8 @@ enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _mo
18899
19042
  return this.setNode(content);
18900
19043
  }
18901
19044
  /* Handlebars.SafeString */
18902
- if (typeof content.string === 'string') {
18903
- return this.setHTML(content.string);
19045
+ if (typeof content.toHTML === 'function') {
19046
+ return this.setHTML(content.toHTML());
18904
19047
  }
18905
19048
  if (this.parseTextAsHTML) {
18906
19049
  return this.setHTML(content.toString());
@@ -19105,159 +19248,6 @@ enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _mo
19105
19248
 
19106
19249
  exports.default = Morph;
19107
19250
  });
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
- });
19261
19251
  enifed("simple-html-tokenizer/char-refs/full", ["exports"], function (exports) {
19262
19252
  "use strict";
19263
19253
 
@@ -22125,10 +22115,20 @@ enifed("simple-html-tokenizer/utils", ["exports"], function (exports) {
22125
22115
  return input.replace(/\r\n?/g, "\n");
22126
22116
  }
22127
22117
  });
22128
- requireModule("ember-debug");
22129
- requireModule("ember-template-compiler");
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';
22130
22121
 
22131
- })();
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
+ });
22132
22132
  ;
22133
22133
  if (typeof exports === "object") {
22134
22134
  module.exports = Ember.__loader.require("ember-template-compiler");