ember-source 2.0.3.1 → 2.1.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ember-source might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2bfe4fe7faef8a991541dfd6f9fa54236d19c72d
4
- data.tar.gz: 3910a9ef37c53bce2e3d75eb3c333ef0e4f9f285
3
+ metadata.gz: 6f9cb78ab289bef4b21a2365d166d7183872d41d
4
+ data.tar.gz: 17f6a12bf1ece2899c2bbc3356b6e00a2214f404
5
5
  SHA512:
6
- metadata.gz: 43ec2307d332ca1065036ac2273d09dcb9a237af4ada6d59107c0e0e88c737fc695c974d403b37ab95e1ec6024ef57943580da42f1602845aae409d447cd9910
7
- data.tar.gz: bb43549157b21623811137caeaee54cda9acc8cad53bb1257c778ad2dbd8cd7e97d4d228c369e0ea412d6c1324d763a3a2aca30cd22ac49f95ef35f83a7659d1
6
+ metadata.gz: 2bac0642a221c467d6ebe10378e638fa41d3cac939792ecfd8ff7dd6d6fb18fe2a20f5f393459be9a3112a6bd04b78f118c0d977e682c9caee3fb4bd82f11b59
7
+ data.tar.gz: edd837b7f89eabbc82ff5333bc47b28e29350780c4bbba77a93a4aa653103be018852703cbd64f34a287cc798d6b07ed673f50478d36a528020fb0e695e2d648
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.3.1
1
+ 2.1.0-beta.1
@@ -5,7 +5,7 @@
5
5
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
6
  * @license Licensed under MIT license
7
7
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- * @version 2.0.3
8
+ * @version 2.1.0-beta.1
9
9
  */
10
10
 
11
11
  (function() {
@@ -67,7 +67,7 @@ var mainContext = this;
67
67
  var reified = [];
68
68
  var length = deps.length;
69
69
 
70
- for (var i=0; i<length; i++) {
70
+ for (var i = 0; i < length; i++) {
71
71
  if (deps[i] === 'exports') {
72
72
  reified.push(exports);
73
73
  } else {
@@ -87,7 +87,7 @@ var mainContext = this;
87
87
  var parts = child.split('/');
88
88
  var parentBase = name.split('/').slice(0, -1);
89
89
 
90
- for (var i=0, l=parts.length; i<l; i++) {
90
+ for (var i = 0, l = parts.length; i < l; i++) {
91
91
  var part = parts[i];
92
92
 
93
93
  if (part === '..') {
@@ -1160,13 +1160,13 @@ enifed('backburner/utils', ['exports'], function (exports) {
1160
1160
  };
1161
1161
  }
1162
1162
  });
1163
- enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'ember-metal/error', 'ember-metal/logger', 'ember-debug/deprecation-manager', 'ember-metal/environment'], function (exports, _emberMetalCore, _emberMetalFeatures, _emberMetalError, _emberMetalLogger, _emberDebugDeprecationManager, _emberMetalEnvironment) {
1164
- /*global __fail__*/
1165
-
1163
+ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/assert', 'ember-metal/features', 'ember-metal/error', 'ember-metal/logger', 'ember-metal/environment', 'ember-debug/deprecate', 'ember-debug/warn', 'ember-debug/is-plain-function'], function (exports, _emberMetalCore, _emberMetalAssert, _emberMetalFeatures, _emberMetalError, _emberMetalLogger, _emberMetalEnvironment, _emberDebugDeprecate, _emberDebugWarn, _emberDebugIsPlainFunction) {
1166
1164
  'use strict';
1167
1165
 
1168
1166
  exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;
1169
1167
 
1168
+ _emberMetalCore.default.deprecate = _emberDebugDeprecate.default;
1169
+
1170
1170
  /**
1171
1171
  @module ember
1172
1172
  @submodule ember-debug
@@ -1177,10 +1177,6 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1177
1177
  @public
1178
1178
  */
1179
1179
 
1180
- function isPlainFunction(test) {
1181
- return typeof test === 'function' && test.PrototypeMixin === undefined;
1182
- }
1183
-
1184
1180
  /**
1185
1181
  Define an assertion that will throw an exception if the condition is not
1186
1182
  met. Ember build tools will remove any calls to `Ember.assert()` when
@@ -1202,10 +1198,10 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1202
1198
  its return value will be used as condition.
1203
1199
  @public
1204
1200
  */
1205
- _emberMetalCore.default.assert = function (desc, test) {
1201
+ function assert(desc, test) {
1206
1202
  var throwAssertion;
1207
1203
 
1208
- if (isPlainFunction(test)) {
1204
+ if (_emberDebugIsPlainFunction.default(test)) {
1209
1205
  throwAssertion = !test();
1210
1206
  } else {
1211
1207
  throwAssertion = !test;
@@ -1214,26 +1210,7 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1214
1210
  if (throwAssertion) {
1215
1211
  throw new _emberMetalError.default('Assertion Failed: ' + desc);
1216
1212
  }
1217
- };
1218
-
1219
- /**
1220
- Display a warning with the provided message. Ember build tools will
1221
- remove any calls to `Ember.warn()` when doing a production build.
1222
-
1223
- @method warn
1224
- @param {String} message A warning to display.
1225
- @param {Boolean} test An optional boolean. If falsy, the warning
1226
- will be displayed.
1227
- @public
1228
- */
1229
- _emberMetalCore.default.warn = function (message, test) {
1230
- if (!test) {
1231
- _emberMetalLogger.default.warn('WARNING: ' + message);
1232
- if ('trace' in _emberMetalLogger.default) {
1233
- _emberMetalLogger.default.trace();
1234
- }
1235
- }
1236
- };
1213
+ }
1237
1214
 
1238
1215
  /**
1239
1216
  Display a debug notice. Ember build tools will remove any calls to
@@ -1247,90 +1224,9 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1247
1224
  @param {String} message A debug message to display.
1248
1225
  @public
1249
1226
  */
1250
- _emberMetalCore.default.debug = function (message) {
1227
+ function debug(message) {
1251
1228
  _emberMetalLogger.default.debug('DEBUG: ' + message);
1252
- };
1253
-
1254
- /**
1255
- Display a deprecation warning with the provided message and a stack trace
1256
- (Chrome and Firefox only). Ember build tools will remove any calls to
1257
- `Ember.deprecate()` when doing a production build.
1258
-
1259
- @method deprecate
1260
- @param {String} message A description of the deprecation.
1261
- @param {Boolean|Function} test An optional boolean. If falsy, the deprecation
1262
- will be displayed. If this is a function, it will be executed and its return
1263
- value will be used as condition.
1264
- @param {Object} options An optional object that can be used to pass
1265
- in a `url` to the transition guide on the emberjs.com website, and a unique
1266
- `id` for this deprecation. The `id` can be used by Ember debugging tools
1267
- to change the behavior (raise, log or silence) for that specific deprecation.
1268
- The `id` should be namespaced by dots, e.g. "view.helper.select".
1269
- @public
1270
- */
1271
- _emberMetalCore.default.deprecate = function (message, test, options) {
1272
- if (_emberMetalCore.default.ENV.RAISE_ON_DEPRECATION) {
1273
- _emberDebugDeprecationManager.default.setDefaultLevel(_emberDebugDeprecationManager.deprecationLevels.RAISE);
1274
- }
1275
- if (_emberDebugDeprecationManager.default.getLevel(options && options.id) === _emberDebugDeprecationManager.deprecationLevels.SILENCE) {
1276
- return;
1277
- }
1278
-
1279
- var noDeprecation;
1280
-
1281
- if (isPlainFunction(test)) {
1282
- noDeprecation = test();
1283
- } else {
1284
- noDeprecation = test;
1285
- }
1286
-
1287
- if (noDeprecation) {
1288
- return;
1289
- }
1290
-
1291
- if (options && options.id) {
1292
- message = message + (' [deprecation id: ' + options.id + ']');
1293
- }
1294
-
1295
- if (_emberDebugDeprecationManager.default.getLevel(options && options.id) === _emberDebugDeprecationManager.deprecationLevels.RAISE) {
1296
- throw new _emberMetalError.default(message);
1297
- }
1298
-
1299
- var error;
1300
-
1301
- // When using new Error, we can't do the arguments check for Chrome. Alternatives are welcome
1302
- try {
1303
- __fail__.fail();
1304
- } catch (e) {
1305
- error = e;
1306
- }
1307
-
1308
- if (arguments.length === 3) {
1309
- _emberMetalCore.default.assert('options argument to Ember.deprecate should be an object', options && typeof options === 'object');
1310
- if (options.url) {
1311
- message += ' See ' + options.url + ' for more details.';
1312
- }
1313
- }
1314
-
1315
- if (_emberMetalCore.default.LOG_STACKTRACE_ON_DEPRECATION && error.stack) {
1316
- var stack;
1317
- var stackStr = '';
1318
-
1319
- if (error['arguments']) {
1320
- // Chrome
1321
- stack = error.stack.replace(/^\s+at\s+/gm, '').replace(/^([^\(]+?)([\n$])/gm, '{anonymous}($1)$2').replace(/^Object.<anonymous>\s*\(([^\)]+)\)/gm, '{anonymous}($1)').split('\n');
1322
- stack.shift();
1323
- } else {
1324
- // Firefox
1325
- stack = error.stack.replace(/(?:\n@:0)?\s+$/m, '').replace(/^\(/gm, '{anonymous}(').split('\n');
1326
- }
1327
-
1328
- stackStr = '\n ' + stack.slice(2).join('\n ');
1329
- message = message + stackStr;
1330
- }
1331
-
1332
- _emberMetalLogger.default.warn('DEPRECATION: ' + message);
1333
- };
1229
+ }
1334
1230
 
1335
1231
  /**
1336
1232
  Alias an old, deprecated method with its new counterpart.
@@ -1352,7 +1248,7 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1352
1248
  @return {Function} a new function that wrapped the original function with a deprecation warning
1353
1249
  @private
1354
1250
  */
1355
- _emberMetalCore.default.deprecateFunc = function () {
1251
+ function deprecateFunc() {
1356
1252
  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
1357
1253
  args[_key] = arguments[_key];
1358
1254
  }
@@ -1387,7 +1283,7 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1387
1283
 
1388
1284
  if (typeof _ret2 === 'object') return _ret2.v;
1389
1285
  }
1390
- };
1286
+ }
1391
1287
 
1392
1288
  /**
1393
1289
  Run a function meant for debugging. Ember build tools will remove any calls to
@@ -1408,9 +1304,16 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1408
1304
  @since 1.5.0
1409
1305
  @public
1410
1306
  */
1411
- _emberMetalCore.default.runInDebug = function (func) {
1307
+ function runInDebug(func) {
1412
1308
  func();
1413
- };
1309
+ }
1310
+
1311
+ _emberMetalAssert.registerDebugFunction('assert', assert);
1312
+ _emberMetalAssert.registerDebugFunction('warn', _emberDebugWarn.default);
1313
+ _emberMetalAssert.registerDebugFunction('debug', debug);
1314
+ _emberMetalAssert.registerDebugFunction('deprecate', _emberDebugDeprecate.default);
1315
+ _emberMetalAssert.registerDebugFunction('deprecateFunc', deprecateFunc);
1316
+ _emberMetalAssert.registerDebugFunction('runInDebug', runInDebug);
1414
1317
 
1415
1318
  /**
1416
1319
  Will call `Ember.warn()` if ENABLE_ALL_FEATURES, ENABLE_OPTIONAL_FEATURES, or
@@ -1425,12 +1328,12 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1425
1328
 
1426
1329
  function _warnIfUsingStrippedFeatureFlags(FEATURES, featuresWereStripped) {
1427
1330
  if (featuresWereStripped) {
1428
- _emberMetalCore.default.warn('Ember.ENV.ENABLE_ALL_FEATURES is only available in canary builds.', !_emberMetalCore.default.ENV.ENABLE_ALL_FEATURES);
1429
- _emberMetalCore.default.warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberMetalCore.default.ENV.ENABLE_OPTIONAL_FEATURES);
1331
+ _emberMetalCore.default.warn('Ember.ENV.ENABLE_ALL_FEATURES is only available in canary builds.', !_emberMetalCore.default.ENV.ENABLE_ALL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });
1332
+ _emberMetalCore.default.warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberMetalCore.default.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });
1430
1333
 
1431
1334
  for (var key in FEATURES) {
1432
1335
  if (FEATURES.hasOwnProperty(key) && key !== 'isEnabled') {
1433
- _emberMetalCore.default.warn('FEATURE["' + key + '"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key]);
1336
+ _emberMetalCore.default.warn('FEATURE["' + key + '"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });
1434
1337
  }
1435
1338
  }
1436
1339
  }
@@ -1465,12 +1368,10 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1465
1368
  }
1466
1369
  }
1467
1370
 
1468
- _emberMetalCore.default.Debug = {
1469
- _addDeprecationLevel: function (id, level) {
1470
- _emberDebugDeprecationManager.default.setLevel(id, level);
1471
- },
1472
- _deprecationLevels: _emberDebugDeprecationManager.deprecationLevels
1473
- };
1371
+ _emberMetalCore.default.Debug = {};
1372
+
1373
+ _emberMetalCore.default.Debug.registerDeprecationHandler = _emberDebugDeprecate.registerHandler;
1374
+ _emberMetalCore.default.Debug.registerWarnHandler = _emberDebugWarn.registerHandler;
1474
1375
 
1475
1376
  /*
1476
1377
  We are transitioning away from `ember.js` to `ember.debug.js` to make
@@ -1486,35 +1387,216 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1486
1387
  _emberMetalCore.default.warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');
1487
1388
  }
1488
1389
  });
1489
- enifed('ember-debug/deprecation-manager', ['exports', 'ember-metal/dictionary', 'ember-metal/utils'], function (exports, _emberMetalDictionary, _emberMetalUtils) {
1390
+ enifed('ember-debug/deprecate', ['exports', 'ember-metal/core', 'ember-metal/error', 'ember-metal/logger', 'ember-debug/handlers'], function (exports, _emberMetalCore, _emberMetalError, _emberMetalLogger, _emberDebugHandlers) {
1391
+ /*global __fail__*/
1392
+
1490
1393
  'use strict';
1491
1394
 
1492
- var deprecationLevels = {
1493
- RAISE: _emberMetalUtils.symbol('RAISE'),
1494
- LOG: _emberMetalUtils.symbol('LOG'),
1495
- SILENCE: _emberMetalUtils.symbol('SILENCE')
1496
- };
1395
+ var _slice = Array.prototype.slice;
1396
+ exports.registerHandler = registerHandler;
1397
+ exports.default = deprecate;
1497
1398
 
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;
1399
+ function registerHandler(handler) {
1400
+ _emberDebugHandlers.registerHandler('deprecate', handler);
1401
+ }
1402
+
1403
+ function formatMessage(_message, options) {
1404
+ var message = _message;
1405
+
1406
+ if (options && options.id) {
1407
+ message = message + (' [deprecation id: ' + options.id + ']');
1408
+ }
1409
+
1410
+ if (options && options.url) {
1411
+ message += ' See ' + options.url + ' for more details.';
1412
+ }
1413
+
1414
+ return message;
1415
+ }
1416
+
1417
+ registerHandler(function logDeprecationToConsole(message, options) {
1418
+ var updatedMessage = formatMessage(message, options);
1419
+
1420
+ _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage);
1421
+ });
1422
+
1423
+ registerHandler(function logDeprecationStackTrace(message, options, next) {
1424
+ if (_emberMetalCore.default.LOG_STACKTRACE_ON_DEPRECATION) {
1425
+ var stackStr = '';
1426
+ var error = undefined,
1427
+ stack = undefined;
1428
+
1429
+ // When using new Error, we can't do the arguments check for Chrome. Alternatives are welcome
1430
+ try {
1431
+ __fail__.fail();
1432
+ } catch (e) {
1433
+ error = e;
1434
+ }
1435
+
1436
+ if (error.stack) {
1437
+ if (error['arguments']) {
1438
+ // Chrome
1439
+ stack = error.stack.replace(/^\s+at\s+/gm, '').replace(/^([^\(]+?)([\n$])/gm, '{anonymous}($1)$2').replace(/^Object.<anonymous>\s*\(([^\)]+)\)/gm, '{anonymous}($1)').split('\n');
1440
+ stack.shift();
1441
+ } else {
1442
+ // Firefox
1443
+ stack = error.stack.replace(/(?:\n@:0)?\s+$/m, '').replace(/^\(/gm, '{anonymous}(').split('\n');
1444
+ }
1445
+
1446
+ stackStr = '\n ' + stack.slice(2).join('\n ');
1512
1447
  }
1513
- return level;
1448
+
1449
+ var updatedMessage = formatMessage(message, options);
1450
+
1451
+ _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage + stackStr);
1452
+ } else {
1453
+ next.apply(undefined, arguments);
1514
1454
  }
1515
- };
1455
+ });
1456
+
1457
+ registerHandler(function raiseOnDeprecation(message, options, next) {
1458
+ if (_emberMetalCore.default.ENV.RAISE_ON_DEPRECATION) {
1459
+ var updatedMessage = formatMessage(message);
1460
+
1461
+ throw new _emberMetalError.default(updatedMessage);
1462
+ } else {
1463
+ next.apply(undefined, arguments);
1464
+ }
1465
+ });
1466
+
1467
+ var missingOptionsDeprecation = 'When calling `Ember.deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';
1468
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
1469
+ var missingOptionsIdDeprecation = 'When calling `Ember.deprecate` you must provide `id` in options.';
1470
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
1471
+ var missingOptionsUntilDeprecation = 'When calling `Ember.deprecate` you must provide `until` in options.';
1472
+
1473
+ exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;
1474
+ /**
1475
+ Display a deprecation warning with the provided message and a stack trace
1476
+ (Chrome and Firefox only). Ember build tools will remove any calls to
1477
+ `Ember.deprecate()` when doing a production build.
1478
+
1479
+ @method deprecate
1480
+ @param {String} message A description of the deprecation.
1481
+ @param {Boolean|Function} test A boolean. If falsy, the deprecation
1482
+ will be displayed. If this is a function, it will be executed and its return
1483
+ value will be used as condition.
1484
+ @param {Object} options An object that can be used to pass
1485
+ in a `url` to the transition guide on the emberjs.com website, and a unique
1486
+ `id` for this deprecation. The `id` can be used by Ember debugging tools
1487
+ to change the behavior (raise, log or silence) for that specific deprecation.
1488
+ The `id` should be namespaced by dots, e.g. "view.helper.select".
1489
+ @public
1490
+ */
1491
+
1492
+ function deprecate(message, test, options) {
1493
+ if (!options || !options.id && !options.until) {
1494
+ deprecate(missingOptionsDeprecation, false, { id: 'ember-debug.deprecate-options-missing', until: '3.0.0' });
1495
+ }
1496
+
1497
+ if (options && !options.id) {
1498
+ deprecate(missingOptionsIdDeprecation, false, { id: 'ember-debug.deprecate-id-missing', until: '3.0.0' });
1499
+ }
1500
+
1501
+ if (options && !options.until) {
1502
+ deprecate(missingOptionsUntilDeprecation, options && options.until, { id: 'ember-debug.deprecate-until-missing', until: '3.0.0' });
1503
+ }
1504
+
1505
+ _emberDebugHandlers.invoke.apply(undefined, ['deprecate'].concat(_slice.call(arguments)));
1506
+ }
1507
+ });
1508
+ enifed('ember-debug/handlers', ['exports', 'ember-debug/is-plain-function'], function (exports, _emberDebugIsPlainFunction) {
1509
+ 'use strict';
1510
+
1511
+ exports.registerHandler = registerHandler;
1512
+ exports.invoke = invoke;
1513
+ var HANDLERS = {};
1514
+
1515
+ exports.HANDLERS = HANDLERS;
1516
+ function normalizeTest(test) {
1517
+ return _emberDebugIsPlainFunction.default(test) ? test() : test;
1518
+ }
1519
+
1520
+ function registerHandler(type, callback) {
1521
+ var nextHandler = HANDLERS[type] || function () {};
1522
+
1523
+ HANDLERS[type] = function (message, options) {
1524
+ callback(message, options, nextHandler);
1525
+ };
1526
+ }
1527
+
1528
+ function invoke(type, message, test, options) {
1529
+ if (normalizeTest(test)) {
1530
+ return;
1531
+ }
1532
+
1533
+ var handlerForType = HANDLERS[type];
1534
+
1535
+ if (!handlerForType) {
1536
+ return;
1537
+ }
1538
+
1539
+ if (handlerForType) {
1540
+ handlerForType(message, options);
1541
+ }
1542
+ }
1543
+ });
1544
+ enifed('ember-debug/is-plain-function', ['exports'], function (exports) {
1545
+ 'use strict';
1546
+
1547
+ exports.default = isPlainFunction;
1548
+
1549
+ function isPlainFunction(test) {
1550
+ return typeof test === 'function' && test.PrototypeMixin === undefined;
1551
+ }
1552
+ });
1553
+ enifed('ember-debug/warn', ['exports', 'ember-metal/core', 'ember-metal/logger', 'ember-debug/handlers'], function (exports, _emberMetalCore, _emberMetalLogger, _emberDebugHandlers) {
1554
+ 'use strict';
1555
+
1556
+ var _slice = Array.prototype.slice;
1557
+ exports.registerHandler = registerHandler;
1558
+ exports.default = warn;
1559
+
1560
+ function registerHandler(handler) {
1561
+ _emberDebugHandlers.registerHandler('warn', handler);
1562
+ }
1563
+
1564
+ registerHandler(function logWarning(message, options) {
1565
+ _emberMetalLogger.default.warn('WARNING: ' + message);
1566
+ if ('trace' in _emberMetalLogger.default) {
1567
+ _emberMetalLogger.default.trace();
1568
+ }
1569
+ });
1570
+
1571
+ var missingOptionsDeprecation = 'When calling `Ember.warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';
1572
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
1573
+ var missingOptionsIdDeprecation = 'When calling `Ember.warn` you must provide `id` in options.';
1574
+
1575
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
1576
+ /**
1577
+ Display a warning with the provided message. Ember build tools will
1578
+ remove any calls to `Ember.warn()` when doing a production build.
1579
+
1580
+ @method warn
1581
+ @param {String} message A warning to display.
1582
+ @param {Boolean} test An optional boolean. If falsy, the warning
1583
+ will be displayed.
1584
+ @public
1585
+ */
1586
+
1587
+ function warn(message, test, options) {
1588
+ if (!options) {
1589
+ _emberMetalCore.default.deprecate(missingOptionsDeprecation, false, { id: 'ember-debug.warn-options-missing', until: '3.0.0' });
1590
+ }
1591
+
1592
+ if (options && !options.id) {
1593
+ _emberMetalCore.default.deprecate(missingOptionsIdDeprecation, false, { id: 'ember-debug.warn-id-missing', until: '3.0.0' });
1594
+ }
1595
+
1596
+ _emberDebugHandlers.invoke.apply(undefined, ['warn'].concat(_slice.call(arguments)));
1597
+ }
1516
1598
  });
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) {
1599
+ enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/features', 'ember-metal/merge', 'ember-metal/instrumentation', 'ember-metal/utils', 'ember-metal/meta', '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'], function (exports, _emberMetalCore, _emberMetalFeatures, _emberMetalMerge, _emberMetalInstrumentation, _emberMetalUtils, _emberMetalMeta, _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) {
1518
1600
  /**
1519
1601
  @module ember
1520
1602
  @submodule ember-metal
@@ -1568,9 +1650,9 @@ enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1568
1650
 
1569
1651
  _emberMetalCore.default.Error = _emberMetalError.default;
1570
1652
  _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;
1653
+ _emberMetalCore.default.META_DESC = _emberMetalMeta.META_DESC;
1654
+ _emberMetalCore.default.EMPTY_META = _emberMetalMeta.EMPTY_META;
1655
+ _emberMetalCore.default.meta = _emberMetalMeta.meta;
1574
1656
  _emberMetalCore.default.inspect = _emberMetalUtils.inspect;
1575
1657
  _emberMetalCore.default.tryCatchFinally = _emberMetalUtils.deprecatedTryCatchFinally;
1576
1658
  _emberMetalCore.default.makeArray = _emberMetalUtils.makeArray;
@@ -1715,6 +1797,11 @@ enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1715
1797
  // This needs to be called before any deprecateFunc
1716
1798
  if (_emberMetalCore.default.__loader.registry['ember-debug']) {
1717
1799
  requireModule('ember-debug');
1800
+ } else {
1801
+ _emberMetalCore.default.Debug = {};
1802
+
1803
+ _emberMetalCore.default.Debug.registerDeprecationHandler = function () {};
1804
+ _emberMetalCore.default.Debug.registerWarnHandler = function () {};
1718
1805
  }
1719
1806
 
1720
1807
  _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);
@@ -1722,7 +1809,7 @@ enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/features', 'e
1722
1809
 
1723
1810
  exports.default = _emberMetalCore.default;
1724
1811
  });
1725
- enifed('ember-metal/alias', ['exports', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/core', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/utils', 'ember-metal/dependent_keys'], function (exports, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalCore, _emberMetalError, _emberMetalProperties, _emberMetalComputed, _emberMetalUtils, _emberMetalDependent_keys) {
1812
+ 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/meta', 'ember-metal/dependent_keys'], function (exports, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalCore, _emberMetalError, _emberMetalProperties, _emberMetalComputed, _emberMetalUtils, _emberMetalMeta, _emberMetalDependent_keys) {
1726
1813
  'use strict';
1727
1814
 
1728
1815
  exports.default = alias;
@@ -1749,24 +1836,24 @@ enifed('ember-metal/alias', ['exports', 'ember-metal/property_get', 'ember-metal
1749
1836
  };
1750
1837
 
1751
1838
  AliasedProperty.prototype.willWatch = function (obj, keyName) {
1752
- _emberMetalDependent_keys.addDependentKeys(this, obj, keyName, _emberMetalUtils.meta(obj));
1839
+ _emberMetalDependent_keys.addDependentKeys(this, obj, keyName, _emberMetalMeta.meta(obj));
1753
1840
  };
1754
1841
 
1755
1842
  AliasedProperty.prototype.didUnwatch = function (obj, keyName) {
1756
- _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, _emberMetalUtils.meta(obj));
1843
+ _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, _emberMetalMeta.meta(obj));
1757
1844
  };
1758
1845
 
1759
1846
  AliasedProperty.prototype.setup = function (obj, keyName) {
1760
1847
  _emberMetalCore.default.assert('Setting alias \'' + keyName + '\' on self', this.altKey !== keyName);
1761
- var m = _emberMetalUtils.meta(obj);
1762
- if (m.watching[keyName]) {
1848
+ var m = _emberMetalMeta.meta(obj);
1849
+ if (m.peekWatching(keyName)) {
1763
1850
  _emberMetalDependent_keys.addDependentKeys(this, obj, keyName, m);
1764
1851
  }
1765
1852
  };
1766
1853
 
1767
1854
  AliasedProperty.prototype.teardown = function (obj, keyName) {
1768
- var m = _emberMetalUtils.meta(obj);
1769
- if (m.watching[keyName]) {
1855
+ var m = _emberMetalMeta.meta(obj);
1856
+ if (m.peekWatching(keyName)) {
1770
1857
  _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, m);
1771
1858
  }
1772
1859
  };
@@ -1795,6 +1882,88 @@ enifed('ember-metal/alias', ['exports', 'ember-metal/property_get', 'ember-metal
1795
1882
  AliasedProperty.prototype.meta = _emberMetalComputed.ComputedProperty.prototype.meta;
1796
1883
  });
1797
1884
  // Ember.assert
1885
+ enifed("ember-metal/assert", ["exports"], function (exports) {
1886
+ "use strict";
1887
+
1888
+ exports.registerDebugFunction = registerDebugFunction;
1889
+ exports.assert = assert;
1890
+ exports.warn = warn;
1891
+ exports.debug = debug;
1892
+ exports.deprecate = deprecate;
1893
+ exports.deprecateFunc = deprecateFunc;
1894
+ exports.runInDebug = runInDebug;
1895
+ var debugFunctions = {
1896
+ assert: function () {},
1897
+ warn: function () {},
1898
+ debug: function () {},
1899
+ deprecate: function () {},
1900
+ deprecateFunc: function () {
1901
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
1902
+ args[_key] = arguments[_key];
1903
+ }
1904
+
1905
+ return args[args.length - 1];
1906
+ },
1907
+ runInDebug: function () {}
1908
+ };
1909
+
1910
+ exports.debugFunctions = debugFunctions;
1911
+
1912
+ function registerDebugFunction(name, fn) {
1913
+ debugFunctions[name] = fn;
1914
+ }
1915
+
1916
+ function assert() {
1917
+ return debugFunctions.assert.apply(undefined, arguments);
1918
+ }
1919
+
1920
+ function warn() {
1921
+ return debugFunctions.warn.apply(undefined, arguments);
1922
+ }
1923
+
1924
+ function debug() {
1925
+ return debugFunctions.debug.apply(undefined, arguments);
1926
+ }
1927
+
1928
+ function deprecate() {
1929
+ return debugFunctions.deprecate.apply(undefined, arguments);
1930
+ }
1931
+
1932
+ function deprecateFunc() {
1933
+ return debugFunctions.deprecateFunc.apply(undefined, arguments);
1934
+ }
1935
+
1936
+ function runInDebug() {
1937
+ return debugFunctions.runInDebug.apply(undefined, arguments);
1938
+ }
1939
+ });
1940
+ enifed("ember-metal/assign", ["exports"], function (exports) {
1941
+ "use strict";
1942
+
1943
+ exports.default = assign;
1944
+
1945
+ function assign(original) {
1946
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
1947
+ args[_key - 1] = arguments[_key];
1948
+ }
1949
+
1950
+ for (var i = 0, l = args.length; i < l; i++) {
1951
+ var arg = args[i];
1952
+ if (!arg) {
1953
+ continue;
1954
+ }
1955
+
1956
+ var updates = Object.keys(arg);
1957
+
1958
+ for (var _i = 0, _l = updates.length; _i < _l; _i++) {
1959
+ var prop = updates[_i];
1960
+ original[prop] = arg[prop];
1961
+ }
1962
+ }
1963
+
1964
+ return original;
1965
+ }
1966
+ });
1798
1967
  enifed('ember-metal/binding', ['exports', 'ember-metal/core', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/observer', 'ember-metal/run_loop', 'ember-metal/path_cache'], function (exports, _emberMetalCore, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalUtils, _emberMetalObserver, _emberMetalRun_loop, _emberMetalPath_cache) {
1799
1968
  'use strict';
1800
1969
 
@@ -2306,7 +2475,7 @@ enifed('ember-metal/cache', ['exports', 'ember-metal/dictionary'], function (exp
2306
2475
  }
2307
2476
  };
2308
2477
  });
2309
- enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/property_get', 'ember-metal/utils', 'ember-metal/watch_key'], function (exports, _emberMetalCore, _emberMetalProperty_get, _emberMetalUtils, _emberMetalWatch_key) {
2478
+ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/property_get', 'ember-metal/meta', 'ember-metal/watch_key', 'ember-metal/empty_object'], function (exports, _emberMetalCore, _emberMetalProperty_get, _emberMetalMeta, _emberMetalWatch_key, _emberMetalEmpty_object) {
2310
2479
  'use strict';
2311
2480
 
2312
2481
  exports.flushPendingChains = flushPendingChains;
@@ -2326,17 +2495,13 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
2326
2495
  return !(isObject(obj) && obj.isDescriptor && obj._volatile === false);
2327
2496
  }
2328
2497
 
2329
- function Chains() {}
2330
-
2331
- Chains.prototype = Object.create(null);
2332
-
2333
2498
  function ChainWatchers(obj) {
2334
2499
  // this obj would be the referencing chain node's parent node's value
2335
2500
  this.obj = obj;
2336
2501
  // chain nodes that reference a key in this obj by key
2337
2502
  // we only create ChainWatchers when we are going to add them
2338
2503
  // so create this upfront
2339
- this.chains = new Chains();
2504
+ this.chains = new _emberMetalEmpty_object.default();
2340
2505
  }
2341
2506
 
2342
2507
  ChainWatchers.prototype = {
@@ -2438,19 +2603,17 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
2438
2603
  _emberMetalCore.default.warn('Watching an undefined global, Ember expects watched globals to be ' + 'setup by the time the run loop is flushed, check for typos', pendingQueue.length === 0, { id: 'ember-metal.chains-flush-pending-chains' });
2439
2604
  }
2440
2605
 
2606
+ function makeChainWatcher(obj) {
2607
+ return new ChainWatchers(obj);
2608
+ }
2609
+
2441
2610
  function addChainWatcher(obj, keyName, node) {
2442
2611
  if (!isObject(obj)) {
2443
2612
  return;
2444
2613
  }
2445
2614
 
2446
- var m = _emberMetalUtils.meta(obj);
2447
-
2448
- if (m.chainWatchers === undefined || m.chainWatchers.obj !== obj) {
2449
- m.chainWatchers = new ChainWatchers(obj);
2450
- }
2451
-
2452
- m.chainWatchers.add(keyName, node);
2453
-
2615
+ var m = _emberMetalMeta.meta(obj);
2616
+ m.writableChainWatchers(makeChainWatcher).add(keyName, node);
2454
2617
  _emberMetalWatch_key.watchKey(obj, keyName, m);
2455
2618
  }
2456
2619
 
@@ -2461,14 +2624,14 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
2461
2624
 
2462
2625
  var m = obj.__ember_meta__;
2463
2626
 
2464
- if (!m || m.chainWatchers === undefined || m.chainWatchers.obj !== obj) {
2627
+ if (!m || !m.readableChainWatchers()) {
2465
2628
  return;
2466
2629
  }
2467
2630
 
2468
2631
  // make meta writable
2469
- m = _emberMetalUtils.meta(obj);
2632
+ m = _emberMetalMeta.meta(obj);
2470
2633
 
2471
- m.chainWatchers.remove(keyName, node);
2634
+ m.readableChainWatchers().remove(keyName, node);
2472
2635
 
2473
2636
  _emberMetalWatch_key.unwatchKey(obj, keyName, m);
2474
2637
  }
@@ -2519,8 +2682,9 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
2519
2682
  return _emberMetalProperty_get.get(obj, key);
2520
2683
  // Otherwise attempt to get the cached value of the computed property
2521
2684
  } else {
2522
- if (meta.cache && key in meta.cache) {
2523
- return meta.cache[key];
2685
+ var cache = meta.readableCache();
2686
+ if (cache && key in cache) {
2687
+ return cache[key];
2524
2688
  }
2525
2689
  }
2526
2690
  }
@@ -2625,7 +2789,7 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
2625
2789
  var chains = this._chains;
2626
2790
  var node;
2627
2791
  if (chains === undefined) {
2628
- chains = this._chains = new Chains();
2792
+ chains = this._chains = new _emberMetalEmpty_object.default();
2629
2793
  } else {
2630
2794
  node = chains[key];
2631
2795
  }
@@ -2714,16 +2878,17 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
2714
2878
  // We only create meta if we really have to
2715
2879
  var m = obj.__ember_meta__;
2716
2880
  if (m) {
2881
+ m = _emberMetalMeta.meta(obj);
2882
+
2717
2883
  // finish any current chains node watchers that reference obj
2718
- var chainWatchers = m.chainWatchers;
2884
+ var chainWatchers = m.readableChainWatchers();
2719
2885
  if (chainWatchers) {
2720
2886
  chainWatchers.revalidateAll();
2721
2887
  }
2722
- // copy chains from prototype
2723
- var chains = m.chains;
2724
- if (chains && chains.value() !== obj) {
2725
- // need to check if meta is writable
2726
- _emberMetalUtils.meta(obj).chains = chains.copy(obj);
2888
+ // ensure that if we have inherited any chains they have been
2889
+ // copied onto our own meta.
2890
+ if (m.readableChains()) {
2891
+ m.writableChains();
2727
2892
  }
2728
2893
  }
2729
2894
  }
@@ -2732,7 +2897,7 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
2732
2897
  exports.ChainNode = ChainNode;
2733
2898
  });
2734
2899
  // warn, assert, etc;
2735
- enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/expand_properties', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/property_events', 'ember-metal/dependent_keys'], function (exports, _emberMetalCore, _emberMetalProperty_set, _emberMetalUtils, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) {
2900
+ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/property_events', 'ember-metal/dependent_keys'], function (exports, _emberMetalCore, _emberMetalProperty_set, _emberMetalUtils, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) {
2736
2901
  'use strict';
2737
2902
 
2738
2903
  exports.default = computed;
@@ -2742,7 +2907,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
2742
2907
  @submodule ember-metal
2743
2908
  */
2744
2909
 
2745
- var metaFor = _emberMetalUtils.meta;
2910
+ var metaFor = _emberMetalMeta.meta;
2746
2911
 
2747
2912
  function UNDEFINED() {}
2748
2913
 
@@ -3000,7 +3165,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
3000
3165
  return;
3001
3166
  }
3002
3167
 
3003
- var cache = meta.cache;
3168
+ var cache = meta.readableCache();
3004
3169
  if (cache && cache[keyName] !== undefined) {
3005
3170
  cache[keyName] = undefined;
3006
3171
  _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
@@ -3040,10 +3205,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
3040
3205
  }
3041
3206
 
3042
3207
  var meta = metaFor(obj);
3043
- var cache = meta.cache;
3044
- if (!cache) {
3045
- cache = meta.cache = {};
3046
- }
3208
+ var cache = meta.writableCache();
3047
3209
 
3048
3210
  var result = cache[keyName];
3049
3211
  if (result === UNDEFINED) {
@@ -3059,7 +3221,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
3059
3221
  cache[keyName] = ret;
3060
3222
  }
3061
3223
 
3062
- var chainWatchers = meta.chainWatchers;
3224
+ var chainWatchers = meta.readableChainWatchers();
3063
3225
  if (chainWatchers) {
3064
3226
  chainWatchers.revalidate(keyName);
3065
3227
  }
@@ -3162,10 +3324,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
3162
3324
  // cache requires own meta
3163
3325
  var meta = metaFor(obj);
3164
3326
  // either there is a writable cache or we need one to update
3165
- var cache = meta.cache;
3166
- if (!cache) {
3167
- cache = meta.cache = {};
3168
- }
3327
+ var cache = meta.writableCache();
3169
3328
  var hadCachedValue = false;
3170
3329
  var cachedValue = undefined;
3171
3330
  if (cache[keyName] !== undefined) {
@@ -3182,7 +3341,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
3182
3341
  return ret;
3183
3342
  }
3184
3343
 
3185
- var watched = meta.watching && meta.watching[keyName];
3344
+ var watched = meta.peekWatching(keyName);
3186
3345
  if (watched) {
3187
3346
  _emberMetalProperty_events.propertyWillChange(obj, keyName);
3188
3347
  }
@@ -3214,7 +3373,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
3214
3373
  return;
3215
3374
  }
3216
3375
  var meta = metaFor(obj);
3217
- var cache = meta.cache;
3376
+ var cache = meta.readableCache();
3218
3377
  if (cache && cache[keyName] !== undefined) {
3219
3378
  _emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
3220
3379
  cache[keyName] = undefined;
@@ -3309,7 +3468,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/prop
3309
3468
  */
3310
3469
  function cacheFor(obj, key) {
3311
3470
  var meta = obj.__ember_meta__;
3312
- var cache = meta && meta.source === obj && meta.cache;
3471
+ var cache = meta && meta.source === obj && meta.readableCache();
3313
3472
  var ret = cache && cache[key];
3314
3473
 
3315
3474
  if (ret === UNDEFINED) {
@@ -4036,7 +4195,7 @@ enifed('ember-metal/computed_macros', ['exports', 'ember-metal/core', 'ember-met
4036
4195
  });
4037
4196
  }
4038
4197
  });
4039
- enifed('ember-metal/core', ['exports'], function (exports) {
4198
+ enifed('ember-metal/core', ['exports', 'ember-metal/assert'], function (exports, _emberMetalAssert) {
4040
4199
  /*globals Ember:true,ENV,EmberENV */
4041
4200
 
4042
4201
  /**
@@ -4059,7 +4218,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4059
4218
 
4060
4219
  @class Ember
4061
4220
  @static
4062
- @version 2.0.3
4221
+ @version 2.1.0-beta.1
4063
4222
  @public
4064
4223
  */
4065
4224
 
@@ -4093,11 +4252,11 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4093
4252
 
4094
4253
  @property VERSION
4095
4254
  @type String
4096
- @default '2.0.3'
4255
+ @default '2.1.0-beta.1'
4097
4256
  @static
4098
4257
  @public
4099
4258
  */
4100
- Ember.VERSION = '2.0.3';
4259
+ Ember.VERSION = '2.1.0-beta.1';
4101
4260
 
4102
4261
  /**
4103
4262
  The hash of environment variables used to control various configuration
@@ -4206,32 +4365,12 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4206
4365
  Ember.K = K;
4207
4366
  //TODO: ES6 GLOBAL TODO
4208
4367
 
4209
- // Stub out the methods defined by the ember-debug package in case it's not loaded
4210
-
4211
- if ('undefined' === typeof Ember.assert) {
4212
- Ember.assert = K;
4213
- }
4214
- if ('undefined' === typeof Ember.warn) {
4215
- Ember.warn = K;
4216
- }
4217
- if ('undefined' === typeof Ember.debug) {
4218
- Ember.debug = K;
4219
- }
4220
- if ('undefined' === typeof Ember.runInDebug) {
4221
- Ember.runInDebug = K;
4222
- }
4223
- if ('undefined' === typeof Ember.deprecate) {
4224
- Ember.deprecate = K;
4225
- }
4226
- if ('undefined' === typeof Ember.deprecateFunc) {
4227
- Ember.deprecateFunc = function () {
4228
- for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
4229
- args[_key] = arguments[_key];
4230
- }
4231
-
4232
- return args[args.length - 1];
4233
- };
4234
- }
4368
+ Ember.assert = _emberMetalAssert.assert;
4369
+ Ember.warn = _emberMetalAssert.warn;
4370
+ Ember.debug = _emberMetalAssert.debug;
4371
+ Ember.deprecate = _emberMetalAssert.deprecate;
4372
+ Ember.deprecateFunc = _emberMetalAssert.deprecateFunc;
4373
+ Ember.runInDebug = _emberMetalAssert.runInDebug;
4235
4374
 
4236
4375
  exports.default = Ember;
4237
4376
  });
@@ -4253,50 +4392,19 @@ enifed('ember-metal/dependent_keys', ['exports', 'ember-metal/watching'], functi
4253
4392
  // DEPENDENT KEYS
4254
4393
  //
4255
4394
 
4256
- // data structure:
4257
- // meta.deps = {
4258
- // 'depKey': {
4259
- // 'keyName': count,
4260
- // }
4261
- // }
4262
-
4263
- /*
4264
- This function returns a map of unique dependencies for a
4265
- given object and key.
4266
- */
4267
- function keysForDep(depsMeta, depKey) {
4268
- var keys = depsMeta[depKey];
4269
- if (!keys) {
4270
- // if there are no dependencies yet for a the given key
4271
- // create a new empty list of dependencies for the key
4272
- keys = depsMeta[depKey] = {};
4273
- } else if (!depsMeta.hasOwnProperty(depKey)) {
4274
- // otherwise if the dependency list is inherited from
4275
- // a superclass, clone the hash
4276
- keys = depsMeta[depKey] = Object.create(keys);
4277
- }
4278
- return keys;
4279
- }
4280
-
4281
- function metaForDeps(meta) {
4282
- return keysForDep(meta, 'deps');
4283
- }
4284
-
4285
4395
  function addDependentKeys(desc, obj, keyName, meta) {
4286
4396
  // the descriptor has a list of dependent keys, so
4287
4397
  // add all of its dependent keys.
4288
- var depsMeta, idx, len, depKey, keys;
4398
+ var idx, len, depKey, keys;
4289
4399
  var depKeys = desc._dependentKeys;
4290
4400
  if (!depKeys) {
4291
4401
  return;
4292
4402
  }
4293
4403
 
4294
- depsMeta = metaForDeps(meta);
4295
-
4296
4404
  for (idx = 0, len = depKeys.length; idx < len; idx++) {
4297
4405
  depKey = depKeys[idx];
4298
4406
  // Lookup keys meta for depKey
4299
- keys = keysForDep(depsMeta, depKey);
4407
+ keys = meta.writableDeps(depKey);
4300
4408
  // Increment the number of times depKey depends on keyName.
4301
4409
  keys[keyName] = (keys[keyName] || 0) + 1;
4302
4410
  // Watch the depKey
@@ -4308,17 +4416,15 @@ enifed('ember-metal/dependent_keys', ['exports', 'ember-metal/watching'], functi
4308
4416
  // the descriptor has a list of dependent keys, so
4309
4417
  // remove all of its dependent keys.
4310
4418
  var depKeys = desc._dependentKeys;
4311
- var depsMeta, idx, len, depKey, keys;
4419
+ var idx, len, depKey, keys;
4312
4420
  if (!depKeys) {
4313
4421
  return;
4314
4422
  }
4315
4423
 
4316
- depsMeta = metaForDeps(meta);
4317
-
4318
4424
  for (idx = 0, len = depKeys.length; idx < len; idx++) {
4319
4425
  depKey = depKeys[idx];
4320
4426
  // Lookup keys meta for depKey
4321
- keys = keysForDep(depsMeta, depKey);
4427
+ keys = meta.writableDeps(depKey);
4322
4428
  // Decrement the number of times depKey depends on keyName.
4323
4429
  keys[keyName] = (keys[keyName] || 0) - 1;
4324
4430
  // Unwatch the depKey
@@ -4490,13 +4596,14 @@ enifed('ember-metal/error', ['exports', 'ember-metal/core'], function (exports,
4490
4596
 
4491
4597
  EmberError.prototype = Object.create(Error.prototype);
4492
4598
  });
4493
- enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'], function (exports, _emberMetalCore, _emberMetalUtils) {
4599
+ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/meta_listeners'], function (exports, _emberMetalCore, _emberMetalUtils, _emberMetalMeta, _emberMetalMeta_listeners) {
4494
4600
  // Remove "use strict"; from transpiled module until
4495
4601
  // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed
4496
4602
  //
4497
4603
 
4498
4604
  exports.accumulateListeners = accumulateListeners;
4499
4605
  exports.addListener = addListener;
4606
+ exports.removeListener = removeListener;
4500
4607
  exports.suspendListener = suspendListener;
4501
4608
  exports.suspendListeners = suspendListeners;
4502
4609
  exports.watchedEvents = watchedEvents;
@@ -4511,10 +4618,6 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4511
4618
  @submodule ember-metal
4512
4619
  */
4513
4620
 
4514
- /* listener flags */
4515
- var ONCE = 1;
4516
- var SUSPENDED = 2;
4517
-
4518
4621
  /*
4519
4622
  The event system uses a series of nested hashes to store listeners on an
4520
4623
  object. When a listener is registered, or when an event arrives, these
@@ -4547,42 +4650,12 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4547
4650
  return index;
4548
4651
  }
4549
4652
 
4550
- function actionsFor(obj, eventName) {
4551
- var meta = _emberMetalUtils.meta(obj, true);
4552
- var actions;
4553
- var listeners = meta.listeners;
4554
-
4555
- if (!listeners) {
4556
- listeners = meta.listeners = Object.create(null);
4557
- listeners.__source__ = obj;
4558
- } else if (listeners.__source__ !== obj) {
4559
- // setup inherited copy of the listeners object
4560
- listeners = meta.listeners = Object.create(listeners);
4561
- listeners.__source__ = obj;
4562
- }
4563
-
4564
- actions = listeners[eventName];
4565
-
4566
- // if there are actions, but the eventName doesn't exist in our listeners, then copy them from the prototype
4567
- if (actions && actions.__source__ !== obj) {
4568
- actions = listeners[eventName] = listeners[eventName].slice();
4569
- actions.__source__ = obj;
4570
- } else if (!actions) {
4571
- actions = listeners[eventName] = [];
4572
- actions.__source__ = obj;
4573
- }
4574
-
4575
- return actions;
4576
- }
4577
-
4578
4653
  function accumulateListeners(obj, eventName, otherActions) {
4579
4654
  var meta = obj['__ember_meta__'];
4580
- var actions = meta && meta.listeners && meta.listeners[eventName];
4581
-
4582
- if (!actions) {
4655
+ if (!meta) {
4583
4656
  return;
4584
4657
  }
4585
-
4658
+ var actions = meta.matchingListeners(eventName);
4586
4659
  var newActions = [];
4587
4660
 
4588
4661
  for (var i = actions.length - 3; i >= 0; i -= 3) {
@@ -4621,19 +4694,12 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4621
4694
  target = null;
4622
4695
  }
4623
4696
 
4624
- var actions = actionsFor(obj, eventName);
4625
- var actionIndex = indexOf(actions, target, method);
4626
4697
  var flags = 0;
4627
-
4628
4698
  if (once) {
4629
- flags |= ONCE;
4699
+ flags |= _emberMetalMeta_listeners.ONCE;
4630
4700
  }
4631
4701
 
4632
- if (actionIndex !== -1) {
4633
- return;
4634
- }
4635
-
4636
- actions.push(target, method, flags);
4702
+ _emberMetalMeta.meta(obj).addToListeners(eventName, target, method, flags);
4637
4703
 
4638
4704
  if ('function' === typeof obj.didAddListener) {
4639
4705
  obj.didAddListener(eventName, target, method);
@@ -4653,6 +4719,7 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4653
4719
  @param {Function|String} method A function or the name of a function to be called on `target`
4654
4720
  @public
4655
4721
  */
4722
+
4656
4723
  function removeListener(obj, eventName, target, method) {
4657
4724
  _emberMetalCore.default.assert('You must pass at least an object and event name to Ember.removeListener', !!obj && !!eventName);
4658
4725
 
@@ -4661,35 +4728,11 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4661
4728
  target = null;
4662
4729
  }
4663
4730
 
4664
- function _removeListener(target, method) {
4665
- var actions = actionsFor(obj, eventName);
4666
- var actionIndex = indexOf(actions, target, method);
4667
-
4668
- // action doesn't exist, give up silently
4669
- if (actionIndex === -1) {
4670
- return;
4671
- }
4672
-
4673
- actions.splice(actionIndex, 3);
4674
-
4731
+ _emberMetalMeta.meta(obj).removeFromListeners(eventName, target, method, function () {
4675
4732
  if ('function' === typeof obj.didRemoveListener) {
4676
- obj.didRemoveListener(eventName, target, method);
4677
- }
4678
- }
4679
-
4680
- if (method) {
4681
- _removeListener(target, method);
4682
- } else {
4683
- var meta = obj['__ember_meta__'];
4684
- var actions = meta && meta.listeners && meta.listeners[eventName];
4685
-
4686
- if (!actions) {
4687
- return;
4688
- }
4689
- for (var i = actions.length - 3; i >= 0; i -= 3) {
4690
- _removeListener(actions[i], actions[i + 1]);
4733
+ obj.didRemoveListener.apply(obj, arguments);
4691
4734
  }
4692
- }
4735
+ });
4693
4736
  }
4694
4737
 
4695
4738
  /**
@@ -4712,25 +4755,7 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4712
4755
  */
4713
4756
 
4714
4757
  function suspendListener(obj, eventName, target, method, callback) {
4715
- if (!method && 'function' === typeof target) {
4716
- method = target;
4717
- target = null;
4718
- }
4719
-
4720
- var actions = actionsFor(obj, eventName);
4721
- var actionIndex = indexOf(actions, target, method);
4722
-
4723
- if (actionIndex !== -1) {
4724
- actions[actionIndex + 2] |= SUSPENDED; // mark the action as suspended
4725
- }
4726
-
4727
- try {
4728
- return callback.call(target);
4729
- } finally {
4730
- if (actionIndex !== -1) {
4731
- actions[actionIndex + 2] &= ~SUSPENDED;
4732
- }
4733
- }
4758
+ return suspendListeners(obj, [eventName], target, method, callback);
4734
4759
  }
4735
4760
 
4736
4761
  /**
@@ -4752,30 +4777,7 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4752
4777
  method = target;
4753
4778
  target = null;
4754
4779
  }
4755
-
4756
- var suspendedActions = [];
4757
- var actionsList = [];
4758
-
4759
- for (var i = 0, l = eventNames.length; i < l; i++) {
4760
- var eventName = eventNames[i];
4761
- var actions = actionsFor(obj, eventName);
4762
- var actionIndex = indexOf(actions, target, method);
4763
-
4764
- if (actionIndex !== -1) {
4765
- actions[actionIndex + 2] |= SUSPENDED;
4766
- suspendedActions.push(actionIndex);
4767
- actionsList.push(actions);
4768
- }
4769
- }
4770
-
4771
- try {
4772
- return callback.call(target);
4773
- } finally {
4774
- for (var i = 0, l = suspendedActions.length; i < l; i++) {
4775
- var actionIndex = suspendedActions[i];
4776
- actionsList[i][actionIndex + 2] &= ~SUSPENDED;
4777
- }
4778
- }
4780
+ return _emberMetalMeta.meta(obj).suspendListeners(eventNames, target, method, callback);
4779
4781
  }
4780
4782
 
4781
4783
  /**
@@ -4788,17 +4790,7 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4788
4790
  */
4789
4791
 
4790
4792
  function watchedEvents(obj) {
4791
- var listeners = obj['__ember_meta__'].listeners;
4792
- var ret = [];
4793
-
4794
- if (listeners) {
4795
- for (var eventName in listeners) {
4796
- if (eventName !== '__source__' && listeners[eventName]) {
4797
- ret.push(eventName);
4798
- }
4799
- }
4800
- }
4801
- return ret;
4793
+ return _emberMetalMeta.meta(obj).watchedEvents();
4802
4794
  }
4803
4795
 
4804
4796
  /**
@@ -4820,10 +4812,10 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4820
4812
  function sendEvent(obj, eventName, params, actions) {
4821
4813
  if (!actions) {
4822
4814
  var meta = obj['__ember_meta__'];
4823
- actions = meta && meta.listeners && meta.listeners[eventName];
4815
+ actions = meta && meta.matchingListeners(eventName);
4824
4816
  }
4825
4817
 
4826
- if (!actions) {
4818
+ if (!actions || actions.length === 0) {
4827
4819
  return;
4828
4820
  }
4829
4821
 
@@ -4836,10 +4828,10 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4836
4828
  if (!method) {
4837
4829
  continue;
4838
4830
  }
4839
- if (flags & SUSPENDED) {
4831
+ if (flags & _emberMetalMeta_listeners.SUSPENDED) {
4840
4832
  continue;
4841
4833
  }
4842
- if (flags & ONCE) {
4834
+ if (flags & _emberMetalMeta_listeners.ONCE) {
4843
4835
  removeListener(obj, eventName, target, method);
4844
4836
  }
4845
4837
  if (!target) {
@@ -4872,9 +4864,10 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4872
4864
 
4873
4865
  function hasListeners(obj, eventName) {
4874
4866
  var meta = obj['__ember_meta__'];
4875
- var actions = meta && meta.listeners && meta.listeners[eventName];
4876
-
4877
- return !!(actions && actions.length);
4867
+ if (!meta) {
4868
+ return false;
4869
+ }
4870
+ return meta.matchingListeners(eventName).length > 0;
4878
4871
  }
4879
4872
 
4880
4873
  /**
@@ -4888,7 +4881,7 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4888
4881
  function listenersFor(obj, eventName) {
4889
4882
  var ret = [];
4890
4883
  var meta = obj['__ember_meta__'];
4891
- var actions = meta && meta.listeners && meta.listeners[eventName];
4884
+ var actions = meta && meta.matchingListeners(eventName);
4892
4885
 
4893
4886
  if (!actions) {
4894
4887
  return ret;
@@ -4938,8 +4931,6 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
4938
4931
  func.__ember_listens__ = events;
4939
4932
  return func;
4940
4933
  }
4941
-
4942
- exports.removeListener = removeListener;
4943
4934
  });
4944
4935
  enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error'], function (exports, _emberMetalError) {
4945
4936
  'use strict';
@@ -4968,7 +4959,7 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error'], functi
4968
4959
  Ember.expandProperties('{foo,bar}', echo); //=> 'foo', 'bar'
4969
4960
  Ember.expandProperties('foo.{bar,baz}', echo); //=> 'foo.bar', 'foo.baz'
4970
4961
  Ember.expandProperties('{foo,bar}.baz', echo); //=> 'foo.baz', 'bar.baz'
4971
- Ember.expandProperties('foo.{bar,baz}.[]', echo) //=> 'foo.bar.[]', 'foo.baz.[]'
4962
+ Ember.expandProperties('foo.{bar,baz}.[]', echo) //=> 'foo.bar.[]', 'foo.baz.[]'
4972
4963
  Ember.expandProperties('{foo,bar}.{spam,eggs}', echo) //=> 'foo.spam', 'foo.eggs', 'bar.spam', 'bar.eggs'
4973
4964
  Ember.expandProperties('{foo}.bar.{baz}') //=> 'foo.bar.baz'
4974
4965
  ```
@@ -5018,7 +5009,7 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error'], functi
5018
5009
  return all;
5019
5010
  }
5020
5011
  });
5021
- enifed('ember-metal/features', ['exports', 'ember-metal/core'], function (exports, _emberMetalCore) {
5012
+ enifed('ember-metal/features', ['exports', 'ember-metal/core', 'ember-metal/assign'], function (exports, _emberMetalCore, _emberMetalAssign) {
5022
5013
  'use strict';
5023
5014
 
5024
5015
  exports.default = isEnabled;
@@ -5036,9 +5027,9 @@ enifed('ember-metal/features', ['exports', 'ember-metal/core'], function (export
5036
5027
  @since 1.1.0
5037
5028
  @public
5038
5029
  */
5039
- var FEATURES = _emberMetalCore.default.ENV.FEATURES || {};
5030
+ var FEATURES = _emberMetalAssign.default({}, _emberMetalCore.default.ENV.FEATURES);exports.FEATURES = FEATURES;
5031
+ // jshint ignore:line
5040
5032
 
5041
- exports.FEATURES = FEATURES;
5042
5033
  /**
5043
5034
  Determine whether the specified `feature` is enabled. Used by Ember's
5044
5035
  build tools to exclude experimental features from beta/stable builds.
@@ -5836,7 +5827,7 @@ enifed('ember-metal/logger', ['exports', 'ember-metal/core', 'ember-metal/error'
5836
5827
  };
5837
5828
  });
5838
5829
  // Ember.imports
5839
- enifed('ember-metal/map', ['exports', 'ember-metal/core', 'ember-metal/utils'], function (exports, _emberMetalCore, _emberMetalUtils) {
5830
+ enifed('ember-metal/map', ['exports', 'ember-metal/core', 'ember-metal/utils', 'ember-metal/empty_object'], function (exports, _emberMetalCore, _emberMetalUtils, _emberMetalEmpty_object) {
5840
5831
  /**
5841
5832
  @module ember
5842
5833
  @submodule ember-metal
@@ -5871,10 +5862,10 @@ enifed('ember-metal/map', ['exports', 'ember-metal/core', 'ember-metal/utils'],
5871
5862
  }
5872
5863
 
5873
5864
  function copyNull(obj) {
5874
- var output = Object.create(null);
5865
+ var output = new _emberMetalEmpty_object.default();
5875
5866
 
5876
5867
  for (var prop in obj) {
5877
- // hasOwnPropery is not needed because obj is Object.create(null);
5868
+ // hasOwnPropery is not needed because obj is new EmptyObject();
5878
5869
  output[prop] = obj[prop];
5879
5870
  }
5880
5871
 
@@ -5903,7 +5894,6 @@ enifed('ember-metal/map', ['exports', 'ember-metal/core', 'ember-metal/utils'],
5903
5894
  @private
5904
5895
  */
5905
5896
  function OrderedSet() {
5906
-
5907
5897
  if (this instanceof OrderedSet) {
5908
5898
  this.clear();
5909
5899
  this._silenceRemoveDeprecation = false;
@@ -5931,7 +5921,7 @@ enifed('ember-metal/map', ['exports', 'ember-metal/core', 'ember-metal/utils'],
5931
5921
  @private
5932
5922
  */
5933
5923
  clear: function () {
5934
- this.presenceSet = Object.create(null);
5924
+ this.presenceSet = new _emberMetalEmpty_object.default();
5935
5925
  this.list = [];
5936
5926
  this.size = 0;
5937
5927
  },
@@ -6089,7 +6079,7 @@ enifed('ember-metal/map', ['exports', 'ember-metal/core', 'ember-metal/utils'],
6089
6079
  if (this instanceof this.constructor) {
6090
6080
  this._keys = OrderedSet.create();
6091
6081
  this._keys._silenceRemoveDeprecation = true;
6092
- this._values = Object.create(null);
6082
+ this._values = new _emberMetalEmpty_object.default();
6093
6083
  this.size = 0;
6094
6084
  } else {
6095
6085
  missingNew('OrderedSet');
@@ -6247,7 +6237,7 @@ enifed('ember-metal/map', ['exports', 'ember-metal/core', 'ember-metal/utils'],
6247
6237
  */
6248
6238
  clear: function () {
6249
6239
  this._keys.clear();
6250
- this._values = Object.create(null);
6240
+ this._values = new _emberMetalEmpty_object.default();
6251
6241
  this.size = 0;
6252
6242
  },
6253
6243
 
@@ -6354,49 +6344,493 @@ enifed('ember-metal/merge', ['exports'], function (exports) {
6354
6344
  */
6355
6345
  'use strict';
6356
6346
 
6357
- exports.default = merge;
6358
- exports.assign = assign;
6347
+ exports.default = merge;
6348
+
6349
+ function merge(original, updates) {
6350
+ if (!updates || typeof updates !== 'object') {
6351
+ return original;
6352
+ }
6353
+
6354
+ var props = Object.keys(updates);
6355
+ var prop;
6356
+ var length = props.length;
6357
+
6358
+ for (var i = 0; i < length; i++) {
6359
+ prop = props[i];
6360
+ original[prop] = updates[prop];
6361
+ }
6362
+
6363
+ return original;
6364
+ }
6365
+ });
6366
+ enifed('ember-metal/meta', ['exports', 'ember-metal/features', 'ember-metal/meta_listeners', 'ember-metal/empty_object'], function (exports, _emberMetalFeatures, _emberMetalMeta_listeners, _emberMetalEmpty_object) {
6367
+ // Remove "use strict"; from transpiled module until
6368
+ // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed
6369
+ //
6370
+
6371
+ exports.meta = meta;
6372
+ 'REMOVE_USE_STRICT: true';
6373
+
6374
+ /**
6375
+ @module ember-metal
6376
+ */
6377
+
6378
+ /*
6379
+ This declares several meta-programmed members on the Meta class. Such
6380
+ meta!
6381
+
6382
+ In general, the `readable` variants will give you an object (if it
6383
+ already exists) that you can read but should not modify. The
6384
+ `writable` variants will give you a mutable object, and they will
6385
+ create it if it didn't already exist.
6386
+
6387
+ The following methods will get generated metaprogrammatically, and
6388
+ I'm including them here for greppability:
6389
+
6390
+ writableCache, readableCache, writableWatching, readableWatching,
6391
+ peekWatching, clearWatching, writableMixins, readableMixins,
6392
+ peekMixins, clearMixins, writableBindings, readableBindings,
6393
+ peekBindings, clearBindings, writableValues, readableValues,
6394
+ peekValues, clearValues, writableDeps, readableDeps, getAllDeps
6395
+ writableChainWatchers, readableChainWatchers, writableChains,
6396
+ readableChains
6397
+
6398
+ */
6399
+ var members = {
6400
+ cache: ownMap,
6401
+ watching: inheritedMap,
6402
+ mixins: inheritedMap,
6403
+ bindings: inheritedMap,
6404
+ values: inheritedMap,
6405
+ deps: inheritedMapOfMaps,
6406
+ chainWatchers: ownCustomObject,
6407
+ chains: inheritedCustomObject
6408
+ };
6409
+
6410
+ var memberNames = Object.keys(members);
6411
+
6412
+ function Meta(obj, parentMeta) {
6413
+ this._cache = undefined;
6414
+ this._watching = undefined;
6415
+ this._mixins = undefined;
6416
+ this._bindings = undefined;
6417
+ this._values = undefined;
6418
+ this._deps = undefined;
6419
+ this._chainWatchers = undefined;
6420
+ this._chains = undefined;
6421
+ // used only internally
6422
+ this.source = obj;
6423
+
6424
+ // when meta(obj).proto === obj, the object is intended to be only a
6425
+ // prototype and doesn't need to actually be observable itself
6426
+ this.proto = undefined;
6427
+
6428
+ // The next meta in our inheritance chain. We (will) track this
6429
+ // explicitly instead of using prototypical inheritance because we
6430
+ // have detailed knowledge of how each property should really be
6431
+ // inherited, and we can optimize it much better than JS runtimes.
6432
+ this.parent = parentMeta;
6433
+
6434
+ this._initializeListeners();
6435
+ }
6436
+
6437
+ for (var _name in _emberMetalMeta_listeners.protoMethods) {
6438
+ Meta.prototype[_name] = _emberMetalMeta_listeners.protoMethods[_name];
6439
+ }
6440
+ memberNames.forEach(function (name) {
6441
+ return members[name](name, Meta);
6442
+ });
6443
+
6444
+ // Implements a member that is a lazily created, non-inheritable
6445
+ // POJO.
6446
+ function ownMap(name, Meta) {
6447
+ var key = memberProperty(name);
6448
+ var capitalized = capitalize(name);
6449
+ Meta.prototype['writable' + capitalized] = function () {
6450
+ return this._getOrCreateOwnMap(key);
6451
+ };
6452
+ Meta.prototype['readable' + capitalized] = function () {
6453
+ return this[key];
6454
+ };
6455
+ }
6456
+
6457
+ Meta.prototype._getOrCreateOwnMap = function (key) {
6458
+ var ret = this[key];
6459
+ if (!ret) {
6460
+ ret = this[key] = new _emberMetalEmpty_object.default();
6461
+ }
6462
+ return ret;
6463
+ };
6464
+
6465
+ // Implements a member that is a lazily created POJO with inheritable
6466
+ // values.
6467
+ function inheritedMap(name, Meta) {
6468
+ var key = memberProperty(name);
6469
+ var capitalized = capitalize(name);
6470
+
6471
+ Meta.prototype['writable' + capitalized] = function () {
6472
+ return this._getOrCreateInheritedMap(key);
6473
+ };
6474
+
6475
+ Meta.prototype['readable' + capitalized] = function () {
6476
+ return this._getInherited(key);
6477
+ };
6478
+
6479
+ Meta.prototype['peek' + capitalized] = function (subkey) {
6480
+ var map = this._getInherited(key);
6481
+ if (map) {
6482
+ return map[subkey];
6483
+ }
6484
+ };
6485
+
6486
+ Meta.prototype['clear' + capitalized] = function () {
6487
+ this[key] = new _emberMetalEmpty_object.default();
6488
+ };
6489
+ }
6490
+
6491
+ Meta.prototype._getOrCreateInheritedMap = function (key) {
6492
+ var ret = this[key];
6493
+ if (!ret) {
6494
+ if (this.parent) {
6495
+ ret = this[key] = Object.create(this.parent._getOrCreateInheritedMap(key));
6496
+ } else {
6497
+ ret = this[key] = new _emberMetalEmpty_object.default();
6498
+ }
6499
+ }
6500
+ return ret;
6501
+ };
6502
+
6503
+ Meta.prototype._getInherited = function (key) {
6504
+ var pointer = this;
6505
+ while (pointer !== undefined) {
6506
+ if (pointer[key]) {
6507
+ return pointer[key];
6508
+ }
6509
+ pointer = pointer.parent;
6510
+ }
6511
+ };
6512
+
6513
+ // Implements a member that provides a lazily created map of maps,
6514
+ // with inheritance at both levels.
6515
+ function inheritedMapOfMaps(name, Meta) {
6516
+ var key = memberProperty(name);
6517
+ var capitalized = capitalize(name);
6518
+
6519
+ Meta.prototype['writable' + capitalized] = function (subkey) {
6520
+ var outerMap = this._getOrCreateInheritedMap(key);
6521
+ var innerMap = outerMap[subkey];
6522
+ if (!innerMap) {
6523
+ innerMap = outerMap[subkey] = new _emberMetalEmpty_object.default();
6524
+ } else if (!Object.hasOwnProperty.call(outerMap, subkey)) {
6525
+ innerMap = outerMap[subkey] = Object.create(innerMap);
6526
+ }
6527
+ return innerMap;
6528
+ };
6529
+
6530
+ Meta.prototype['readable' + capitalized] = function (subkey) {
6531
+ var map = this._getInherited(key);
6532
+ if (map) {
6533
+ return map[subkey];
6534
+ }
6535
+ };
6536
+
6537
+ Meta.prototype['getAll' + capitalized] = function () {
6538
+ return this._getInherited(key);
6539
+ };
6540
+ }
6541
+
6542
+ // Implements a member that provides a non-heritable, lazily-created
6543
+ // object using the method you provide.
6544
+ function ownCustomObject(name, Meta) {
6545
+ var key = memberProperty(name);
6546
+ var capitalized = capitalize(name);
6547
+ Meta.prototype['writable' + capitalized] = function (create) {
6548
+ var ret = this[key];
6549
+ if (!ret) {
6550
+ ret = this[key] = create(this.source);
6551
+ }
6552
+ return ret;
6553
+ };
6554
+ Meta.prototype['readable' + capitalized] = function () {
6555
+ return this[key];
6556
+ };
6557
+ }
6558
+
6559
+ // Implements a member that provides an inheritable, lazily-created
6560
+ // object using the method you provide. We will derived children from
6561
+ // their parents by calling your object's `copy()` method.
6562
+ function inheritedCustomObject(name, Meta) {
6563
+ var key = memberProperty(name);
6564
+ var capitalized = capitalize(name);
6565
+ Meta.prototype['writable' + capitalized] = function (create) {
6566
+ var ret = this[key];
6567
+ if (!ret) {
6568
+ if (this.parent) {
6569
+ ret = this[key] = this.parent['writable' + capitalized](create).copy(this.source);
6570
+ } else {
6571
+ ret = this[key] = create(this.source);
6572
+ }
6573
+ }
6574
+ return ret;
6575
+ };
6576
+ Meta.prototype['readable' + capitalized] = function () {
6577
+ return this._getInherited(key);
6578
+ };
6579
+ }
6580
+
6581
+ function memberProperty(name) {
6582
+ return '_' + name;
6583
+ }
6584
+
6585
+ // there's a more general-purpose capitalize in ember-runtime, but we
6586
+ // don't want to make ember-metal depend on ember-runtime.
6587
+ function capitalize(name) {
6588
+ return name.replace(/^\w/, function (m) {
6589
+ return m.toUpperCase();
6590
+ });
6591
+ }
6592
+
6593
+ var META_DESC = {
6594
+ writable: true,
6595
+ configurable: true,
6596
+ enumerable: false,
6597
+ value: null
6598
+ };
6599
+
6600
+ exports.META_DESC = META_DESC;
6601
+ var EMBER_META_PROPERTY = {
6602
+ name: '__ember_meta__',
6603
+ descriptor: META_DESC
6604
+ };
6605
+
6606
+ // Placeholder for non-writable metas.
6607
+ var EMPTY_META = new Meta(null);
6608
+
6609
+ exports.EMPTY_META = EMPTY_META;
6610
+
6611
+ EMPTY_META.writableValues();
6612
+
6613
+ /**
6614
+ Retrieves the meta hash for an object. If `writable` is true ensures the
6615
+ hash is writable for this object as well.
6616
+
6617
+ The meta object contains information about computed property descriptors as
6618
+ well as any watched properties and other information. You generally will
6619
+ not access this information directly but instead work with higher level
6620
+ methods that manipulate this hash indirectly.
6621
+
6622
+ @method meta
6623
+ @for Ember
6624
+ @private
6625
+
6626
+ @param {Object} obj The object to retrieve meta for
6627
+ @param {Boolean} [writable=true] Pass `false` if you do not intend to modify
6628
+ the meta hash, allowing the method to avoid making an unnecessary copy.
6629
+ @return {Object} the meta hash for an object
6630
+ */
6631
+
6632
+ function meta(obj, writable) {
6633
+ var ret = obj.__ember_meta__;
6634
+ if (writable === false) {
6635
+ return ret || EMPTY_META;
6636
+ }
6637
+
6638
+ if (ret && ret.source === obj) {
6639
+ return ret;
6640
+ }
6641
+
6642
+ if (!ret) {
6643
+ ret = new Meta(obj);
6644
+
6645
+ ret.writableValues();
6646
+ } else {
6647
+ ret = new Meta(obj, ret);
6648
+ }
6649
+
6650
+ if (obj.__defineNonEnumerable) {
6651
+ obj.__defineNonEnumerable(EMBER_META_PROPERTY);
6652
+ } else {
6653
+ Object.defineProperty(obj, '__ember_meta__', META_DESC);
6654
+ }
6655
+ obj.__ember_meta__ = ret;
6656
+
6657
+ return ret;
6658
+ }
6659
+ });
6660
+ enifed('ember-metal/meta_listeners', ['exports'], function (exports) {
6661
+ /*
6662
+ When we render a rich template hierarchy, the set of events that
6663
+ *might* happen tends to be much larger than the set of events that
6664
+ actually happen. This implies that we should make listener creation &
6665
+ destruction cheap, even at the cost of making event dispatch more
6666
+ expensive.
6667
+
6668
+ Thus we store a new listener with a single push and no new
6669
+ allocations, without even bothering to do deduplication -- we can
6670
+ save that for dispatch time, if an event actually happens.
6671
+ */
6672
+
6673
+ /* listener flags */
6674
+ 'use strict';
6359
6675
 
6360
- function merge(original, updates) {
6361
- if (!updates || typeof updates !== 'object') {
6362
- return original;
6363
- }
6676
+ var ONCE = 1;
6677
+ exports.ONCE = ONCE;
6678
+ var SUSPENDED = 2;
6364
6679
 
6365
- var props = Object.keys(updates);
6366
- var prop;
6367
- var length = props.length;
6680
+ exports.SUSPENDED = SUSPENDED;
6681
+ var protoMethods = {
6368
6682
 
6369
- for (var i = 0; i < length; i++) {
6370
- prop = props[i];
6371
- original[prop] = updates[prop];
6372
- }
6683
+ addToListeners: function (eventName, target, method, flags) {
6684
+ if (!this._listeners) {
6685
+ this._listeners = [];
6686
+ }
6687
+ this._listeners.push(eventName, target, method, flags);
6688
+ },
6373
6689
 
6374
- return original;
6375
- }
6690
+ _finalizeListeners: function () {
6691
+ if (this._listenersFinalized) {
6692
+ return;
6693
+ }
6694
+ if (!this._listeners) {
6695
+ this._listeners = [];
6696
+ }
6697
+ var pointer = this.parent;
6698
+ while (pointer) {
6699
+ var listeners = pointer._listeners;
6700
+ if (listeners) {
6701
+ this._listeners = this._listeners.concat(listeners);
6702
+ }
6703
+ if (pointer._listenersFinalized) {
6704
+ break;
6705
+ }
6706
+ pointer = pointer.parent;
6707
+ }
6708
+ this._listenersFinalized = true;
6709
+ },
6376
6710
 
6377
- function assign(original) {
6378
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
6379
- args[_key - 1] = arguments[_key];
6380
- }
6711
+ removeFromListeners: function (eventName, target, method, didRemove) {
6712
+ var pointer = this;
6713
+ while (pointer) {
6714
+ var listeners = pointer._listeners;
6715
+ if (listeners) {
6716
+ for (var index = listeners.length - 4; index >= 0; index -= 4) {
6717
+ if (listeners[index] === eventName && (!method || listeners[index + 1] === target && listeners[index + 2] === method)) {
6718
+ if (pointer === this) {
6719
+ // we are modifying our own list, so we edit directly
6720
+ if (typeof didRemove === 'function') {
6721
+ didRemove(eventName, target, listeners[index + 2]);
6722
+ }
6723
+ listeners.splice(index, 4);
6724
+ } else {
6725
+ // we are trying to remove an inherited listener, so we do
6726
+ // just-in-time copying to detach our own listeners from
6727
+ // our inheritance chain.
6728
+ this._finalizeListeners();
6729
+ return this.removeFromListeners(eventName, target, method);
6730
+ }
6731
+ }
6732
+ }
6733
+ }
6734
+ if (pointer._listenersFinalized) {
6735
+ break;
6736
+ }
6737
+ pointer = pointer.parent;
6738
+ }
6739
+ },
6381
6740
 
6382
- for (var i = 0, l = args.length; i < l; i++) {
6383
- var arg = args[i];
6384
- if (!arg) {
6385
- continue;
6741
+ matchingListeners: function (eventName) {
6742
+ var pointer = this;
6743
+ var result = [];
6744
+ while (pointer) {
6745
+ var listeners = pointer._listeners;
6746
+ if (listeners) {
6747
+ for (var index = 0; index < listeners.length - 3; index += 4) {
6748
+ if (listeners[index] === eventName) {
6749
+ pushUniqueListener(result, listeners, index);
6750
+ }
6751
+ }
6752
+ }
6753
+ if (pointer._listenersFinalized) {
6754
+ break;
6755
+ }
6756
+ pointer = pointer.parent;
6757
+ }
6758
+ var sus = this._suspendedListeners;
6759
+ if (sus) {
6760
+ for (var susIndex = 0; susIndex < sus.length - 2; susIndex += 3) {
6761
+ if (eventName === sus[susIndex]) {
6762
+ for (var resultIndex = 0; resultIndex < result.length - 2; resultIndex += 3) {
6763
+ if (result[resultIndex] === sus[susIndex + 1] && result[resultIndex + 1] === sus[susIndex + 2]) {
6764
+ result[resultIndex + 2] |= SUSPENDED;
6765
+ }
6766
+ }
6767
+ }
6768
+ }
6386
6769
  }
6770
+ return result;
6771
+ },
6387
6772
 
6388
- var updates = Object.keys(arg);
6773
+ suspendListeners: function (eventNames, target, method, callback) {
6774
+ var sus = this._suspendedListeners;
6775
+ if (!sus) {
6776
+ sus = this._suspendedListeners = [];
6777
+ }
6778
+ for (var i = 0; i < eventNames.length; i++) {
6779
+ sus.push(eventNames[i], target, method);
6780
+ }
6781
+ try {
6782
+ return callback.call(target);
6783
+ } finally {
6784
+ if (sus.length === eventNames.length) {
6785
+ this._suspendedListeners = undefined;
6786
+ } else {
6787
+ for (var i = sus.length - 3; i >= 0; i -= 3) {
6788
+ if (sus[i + 1] === target && sus[i + 2] === method && eventNames.indexOf(sus[i]) !== -1) {
6789
+ sus.splice(i, 3);
6790
+ }
6791
+ }
6792
+ }
6793
+ }
6794
+ },
6389
6795
 
6390
- for (var _i = 0, _l = updates.length; _i < _l; _i++) {
6391
- var prop = updates[_i];
6392
- original[prop] = arg[prop];
6796
+ watchedEvents: function () {
6797
+ var pointer = this;
6798
+ var names = {};
6799
+ while (pointer) {
6800
+ var listeners = pointer._listeners;
6801
+ if (listeners) {
6802
+ for (var index = 0; index < listeners.length - 3; index += 4) {
6803
+ names[listeners[index]] = true;
6804
+ }
6805
+ }
6806
+ if (pointer._listenersFinalized) {
6807
+ break;
6808
+ }
6809
+ pointer = pointer.parent;
6393
6810
  }
6811
+ return Object.keys(names);
6812
+ },
6813
+
6814
+ _initializeListeners: function () {
6815
+ this._listeners = undefined;
6816
+ this._listenersFinalized = undefined;
6817
+ this._suspendedListeners = undefined;
6394
6818
  }
6819
+ };
6395
6820
 
6396
- return original;
6821
+ exports.protoMethods = protoMethods;
6822
+ function pushUniqueListener(destination, source, index) {
6823
+ var target = source[index + 1];
6824
+ var method = source[index + 2];
6825
+ for (var destinationIndex = 0; destinationIndex < destination.length - 2; destinationIndex += 3) {
6826
+ if (destination[destinationIndex] === target && destination[destinationIndex + 1] === method) {
6827
+ return;
6828
+ }
6829
+ }
6830
+ destination.push(target, method, source[index + 3]);
6397
6831
  }
6398
6832
  });
6399
- enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/expand_properties', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/binding', 'ember-metal/observer', 'ember-metal/events', 'ember-metal/streams/utils'], function (exports, _emberMetalCore, _emberMetalMerge, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalUtils, _emberMetalExpand_properties, _emberMetalProperties, _emberMetalComputed, _emberMetalBinding, _emberMetalObserver, _emberMetalEvents, _emberMetalStreamsUtils) {
6833
+ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge', 'ember-metal/empty_object', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/binding', 'ember-metal/observer', 'ember-metal/events', 'ember-metal/streams/utils'], function (exports, _emberMetalCore, _emberMetalMerge, _emberMetalEmpty_object, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalUtils, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalProperties, _emberMetalComputed, _emberMetalBinding, _emberMetalObserver, _emberMetalEvents, _emberMetalStreamsUtils) {
6400
6834
  // Remove "use strict"; from transpiled module until
6401
6835
  // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed
6402
6836
  //
@@ -6418,47 +6852,8 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6418
6852
  var REQUIRED;
6419
6853
  var a_slice = [].slice;
6420
6854
 
6421
- function superFunction() {
6422
- var func = this.__nextSuper;
6423
- var ret;
6424
-
6425
- if (func) {
6426
- var length = arguments.length;
6427
- this.__nextSuper = null;
6428
- if (length === 0) {
6429
- ret = func.call(this);
6430
- } else if (length === 1) {
6431
- ret = func.call(this, arguments[0]);
6432
- } else if (length === 2) {
6433
- ret = func.call(this, arguments[0], arguments[1]);
6434
- } else {
6435
- ret = func.apply(this, arguments);
6436
- }
6437
- this.__nextSuper = func;
6438
- return ret;
6439
- }
6440
- }
6441
-
6442
- // ensure we prime superFunction to mitigate
6443
- // v8 bug potentially incorrectly deopts this function: https://code.google.com/p/v8/issues/detail?id=3709
6444
- var primer = {
6445
- __nextSuper: function (a, b, c, d) {}
6446
- };
6447
-
6448
- superFunction.call(primer);
6449
- superFunction.call(primer, 1);
6450
- superFunction.call(primer, 1, 2);
6451
- superFunction.call(primer, 1, 2, 3);
6452
-
6453
6855
  function mixinsMeta(obj) {
6454
- var m = _emberMetalUtils.meta(obj, true);
6455
- var ret = m.mixins;
6456
- if (!ret) {
6457
- ret = m.mixins = {};
6458
- } else if (!m.hasOwnProperty('mixins')) {
6459
- ret = m.mixins = Object.create(ret);
6460
- }
6461
- return ret;
6856
+ return _emberMetalMeta.meta(obj, true).writableMixins();
6462
6857
  }
6463
6858
 
6464
6859
  function isMethod(obj) {
@@ -6532,10 +6927,6 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6532
6927
  return property;
6533
6928
  }
6534
6929
 
6535
- var sourceAvailable = (function () {
6536
- return this;
6537
- }).toString().indexOf('return this;') > -1;
6538
-
6539
6930
  function giveMethodSuper(obj, key, method, values, descs) {
6540
6931
  var superMethod;
6541
6932
 
@@ -6554,21 +6945,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6554
6945
  return method;
6555
6946
  }
6556
6947
 
6557
- var hasSuper;
6558
- if (sourceAvailable) {
6559
- hasSuper = method.__hasSuper;
6560
-
6561
- if (hasSuper === undefined) {
6562
- hasSuper = method.toString().indexOf('_super') > -1;
6563
- method.__hasSuper = hasSuper;
6564
- }
6565
- }
6566
-
6567
- if (sourceAvailable === false || hasSuper) {
6568
- return _emberMetalUtils.wrap(method, superMethod);
6569
- } else {
6570
- return method;
6571
- }
6948
+ return _emberMetalUtils.wrap(method, superMethod);
6572
6949
  }
6573
6950
 
6574
6951
  function applyConcatenatedProperties(obj, key, value, values) {
@@ -6617,7 +6994,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6617
6994
  }
6618
6995
 
6619
6996
  if (hasFunction) {
6620
- newBase._super = superFunction;
6997
+ newBase._super = function () {};
6621
6998
  }
6622
6999
 
6623
7000
  return newBase;
@@ -6630,7 +7007,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6630
7007
  }
6631
7008
 
6632
7009
  // Wrap descriptor function to implement
6633
- // __nextSuper() if needed
7010
+ // _super() if needed
6634
7011
  if (value._getter) {
6635
7012
  value = giveDescriptorSuper(meta, key, value, values, descs, base);
6636
7013
  }
@@ -6669,7 +7046,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6669
7046
  }
6670
7047
 
6671
7048
  if (props) {
6672
- meta = _emberMetalUtils.meta(base);
7049
+ meta = _emberMetalMeta.meta(base);
6673
7050
  if (base.willMergeMixin) {
6674
7051
  base.willMergeMixin(props);
6675
7052
  }
@@ -6701,13 +7078,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6701
7078
 
6702
7079
  function detectBinding(obj, key, value, m) {
6703
7080
  if (IS_BINDING.test(key)) {
6704
- var bindings = m.bindings;
6705
- if (!bindings) {
6706
- bindings = m.bindings = {};
6707
- } else if (!m.hasOwnProperty('bindings')) {
6708
- bindings = m.bindings = Object.create(m.bindings);
6709
- }
6710
- bindings[key] = value;
7081
+ m.writableBindings()[key] = value;
6711
7082
  }
6712
7083
  }
6713
7084
 
@@ -6730,7 +7101,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6730
7101
  stream.subscribe(onNotify);
6731
7102
 
6732
7103
  if (obj._streamBindingSubscriptions === undefined) {
6733
- obj._streamBindingSubscriptions = Object.create(null);
7104
+ obj._streamBindingSubscriptions = new _emberMetalEmpty_object.default();
6734
7105
  }
6735
7106
 
6736
7107
  obj._streamBindingSubscriptions[key] = onNotify;
@@ -6738,7 +7109,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6738
7109
 
6739
7110
  function connectBindings(obj, m) {
6740
7111
  // TODO Mixin.apply(instance) should disconnect binding if exists
6741
- var bindings = m.bindings;
7112
+ var bindings = m.readableBindings();
6742
7113
  var key, binding, to;
6743
7114
  if (bindings) {
6744
7115
  for (key in bindings) {
@@ -6760,12 +7131,12 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6760
7131
  }
6761
7132
  }
6762
7133
  // mark as applied
6763
- m.bindings = {};
7134
+ m.clearBindings();
6764
7135
  }
6765
7136
  }
6766
7137
 
6767
7138
  function finishPartial(obj, m) {
6768
- connectBindings(obj, m || _emberMetalUtils.meta(obj));
7139
+ connectBindings(obj, m || _emberMetalMeta.meta(obj));
6769
7140
  return obj;
6770
7141
  }
6771
7142
 
@@ -6816,11 +7187,11 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
6816
7187
  function applyMixin(obj, mixins, partial) {
6817
7188
  var descs = {};
6818
7189
  var values = {};
6819
- var m = _emberMetalUtils.meta(obj);
7190
+ var m = _emberMetalMeta.meta(obj);
6820
7191
  var keys = [];
6821
7192
  var key, value, desc;
6822
7193
 
6823
- obj._super = superFunction;
7194
+ obj._super = function () {};
6824
7195
 
6825
7196
  // Go through all mixins and hashes passed in, and:
6826
7197
  //
@@ -7079,12 +7450,11 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
7079
7450
  if (obj instanceof Mixin) {
7080
7451
  return _detect(obj, this, {});
7081
7452
  }
7082
- var m = obj['__ember_meta__'];
7083
- var mixins = m && m.mixins;
7084
- if (mixins) {
7085
- return !!mixins[_emberMetalUtils.guidFor(this)];
7453
+ var m = obj.__ember_meta__;
7454
+ if (!m) {
7455
+ return false;
7086
7456
  }
7087
- return false;
7457
+ return !!m.peekMixins(_emberMetalUtils.guidFor(this));
7088
7458
  };
7089
7459
 
7090
7460
  MixinPrototype.without = function () {
@@ -7135,7 +7505,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
7135
7505
  // TODO: Make Ember.mixin
7136
7506
  Mixin.mixins = function (obj) {
7137
7507
  var m = obj['__ember_meta__'];
7138
- var mixins = m && m.mixins;
7508
+ var mixins = m && m.readableMixins();
7139
7509
  var ret = [];
7140
7510
 
7141
7511
  if (!mixins) {
@@ -7199,7 +7569,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
7199
7569
  @method aliasMethod
7200
7570
  @for Ember
7201
7571
  @param {String} methodName name of the method to alias
7202
- @public
7572
+ @private
7203
7573
  */
7204
7574
 
7205
7575
  function aliasMethod(methodName) {
@@ -7652,7 +8022,7 @@ enifed('ember-metal/path_cache', ['exports', 'ember-metal/cache'], function (exp
7652
8022
  return tailPathCache.get(path);
7653
8023
  }
7654
8024
  });
7655
- enifed('ember-metal/properties', ['exports', 'ember-metal/core', 'ember-metal/features', 'ember-metal/utils', 'ember-metal/property_events'], function (exports, _emberMetalCore, _emberMetalFeatures, _emberMetalUtils, _emberMetalProperty_events) {
8025
+ enifed('ember-metal/properties', ['exports', 'ember-metal/core', 'ember-metal/features', 'ember-metal/meta', 'ember-metal/property_events'], function (exports, _emberMetalCore, _emberMetalFeatures, _emberMetalMeta, _emberMetalProperty_events) {
7656
8026
  /**
7657
8027
  @module ember-metal
7658
8028
  */
@@ -7693,7 +8063,7 @@ enifed('ember-metal/properties', ['exports', 'ember-metal/core', 'ember-metal/fe
7693
8063
  function DEFAULT_GETTER_FUNCTION(name) {
7694
8064
  return function GETTER_FUNCTION() {
7695
8065
  var meta = this['__ember_meta__'];
7696
- return meta && meta.values[name];
8066
+ return meta && meta.peekValues(name);
7697
8067
  };
7698
8068
  }
7699
8069
 
@@ -7747,9 +8117,9 @@ enifed('ember-metal/properties', ['exports', 'ember-metal/core', 'ember-metal/fe
7747
8117
  var possibleDesc, existingDesc, watching, value;
7748
8118
 
7749
8119
  if (!meta) {
7750
- meta = _emberMetalUtils.meta(obj);
8120
+ meta = _emberMetalMeta.meta(obj);
7751
8121
  }
7752
- var watchEntry = meta.watching[keyName];
8122
+ var watchEntry = meta.peekWatching(keyName);
7753
8123
  possibleDesc = obj[keyName];
7754
8124
  existingDesc = possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor ? possibleDesc : undefined;
7755
8125
 
@@ -7781,7 +8151,7 @@ enifed('ember-metal/properties', ['exports', 'ember-metal/core', 'ember-metal/fe
7781
8151
  value = data;
7782
8152
 
7783
8153
  if (watching) {
7784
- meta.values[keyName] = data;
8154
+ meta.writableValues()[keyName] = data;
7785
8155
  Object.defineProperty(obj, keyName, {
7786
8156
  configurable: true,
7787
8157
  enumerable: true,
@@ -7846,7 +8216,7 @@ enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-me
7846
8216
  */
7847
8217
  function propertyWillChange(obj, keyName) {
7848
8218
  var m = obj['__ember_meta__'];
7849
- var watching = m && m.watching[keyName] > 0 || keyName === 'length';
8219
+ var watching = m && m.peekWatching(keyName) > 0 || keyName === 'length';
7850
8220
  var proto = m && m.proto;
7851
8221
  var possibleDesc = obj[keyName];
7852
8222
  var desc = possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor ? possibleDesc : undefined;
@@ -7886,7 +8256,7 @@ enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-me
7886
8256
  */
7887
8257
  function propertyDidChange(obj, keyName) {
7888
8258
  var m = obj['__ember_meta__'];
7889
- var watching = m && m.watching[keyName] > 0 || keyName === 'length';
8259
+ var watching = m && m.peekWatching(keyName) > 0 || keyName === 'length';
7890
8260
  var proto = m && m.proto;
7891
8261
  var possibleDesc = obj[keyName];
7892
8262
  var desc = possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor ? possibleDesc : undefined;
@@ -7908,7 +8278,7 @@ enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-me
7908
8278
  return;
7909
8279
  }
7910
8280
 
7911
- if (m && m.deps && m.deps[keyName]) {
8281
+ if (m && m.readableDeps(keyName)) {
7912
8282
  dependentKeysDidChange(obj, keyName, m);
7913
8283
  }
7914
8284
 
@@ -7924,7 +8294,7 @@ enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-me
7924
8294
  }
7925
8295
 
7926
8296
  var deps;
7927
- if (meta && meta.deps && (deps = meta.deps[depKey])) {
8297
+ if (meta && (deps = meta.readableDeps(depKey))) {
7928
8298
  var seen = WILL_SEEN;
7929
8299
  var top = !seen;
7930
8300
 
@@ -7947,7 +8317,7 @@ enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-me
7947
8317
  }
7948
8318
 
7949
8319
  var deps;
7950
- if (meta && meta.deps && (deps = meta.deps[depKey])) {
8320
+ if (meta && (deps = meta.readableDeps(depKey))) {
7951
8321
  var seen = DID_SEEN;
7952
8322
  var top = !seen;
7953
8323
 
@@ -8010,26 +8380,24 @@ enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-me
8010
8380
  }
8011
8381
 
8012
8382
  function chainsWillChange(obj, keyName, m) {
8013
- if (m.chainWatchers === undefined || m.chainWatchers.obj !== obj) {
8014
- return;
8383
+ var c = m.readableChainWatchers();
8384
+ if (c) {
8385
+ c.notify(keyName, false, propertyWillChange);
8015
8386
  }
8016
-
8017
- m.chainWatchers.notify(keyName, false, propertyWillChange);
8018
8387
  }
8019
8388
 
8020
8389
  function chainsDidChange(obj, keyName, m) {
8021
- if (m.chainWatchers === undefined || m.chainWatchers.obj !== obj) {
8022
- return;
8390
+ var c = m.readableChainWatchers();
8391
+ if (c) {
8392
+ c.notify(keyName, true, propertyDidChange);
8023
8393
  }
8024
-
8025
- m.chainWatchers.notify(keyName, true, propertyDidChange);
8026
8394
  }
8027
8395
 
8028
8396
  function overrideChains(obj, keyName, m) {
8029
- if (m.chainWatchers === undefined || m.chainWatchers.obj !== obj) {
8030
- return;
8397
+ var c = m.readableChainWatchers();
8398
+ if (c) {
8399
+ c.revalidate(keyName);
8031
8400
  }
8032
- m.chainWatchers.revalidate(keyName);
8033
8401
  }
8034
8402
 
8035
8403
  /**
@@ -8186,8 +8554,8 @@ enifed('ember-metal/property_get', ['exports', 'ember-metal/core', 'ember-metal/
8186
8554
  if (desc) {
8187
8555
  return desc.get(obj, keyName);
8188
8556
  } else {
8189
- if (meta && meta.watching[keyName] > 0) {
8190
- ret = meta.values[keyName];
8557
+ if (meta && meta.peekWatching(keyName) > 0) {
8558
+ ret = meta.peekValues(keyName);
8191
8559
  } else {
8192
8560
  ret = obj[keyName];
8193
8561
  }
@@ -8339,9 +8707,9 @@ enifed('ember-metal/property_set', ['exports', 'ember-metal/core', 'ember-metal/
8339
8707
  // `setUnknownProperty` method exists on the object
8340
8708
  if (isUnknown && 'function' === typeof obj.setUnknownProperty) {
8341
8709
  obj.setUnknownProperty(keyName, value);
8342
- } else if (meta && meta.watching[keyName] > 0) {
8710
+ } else if (meta && meta.peekWatching(keyName) > 0) {
8343
8711
  if (meta.proto !== obj) {
8344
- currentValue = meta.values[keyName];
8712
+ currentValue = meta.peekValues(keyName);
8345
8713
  }
8346
8714
  // only trigger a change if the value has changed
8347
8715
  if (value !== currentValue) {
@@ -8350,7 +8718,7 @@ enifed('ember-metal/property_set', ['exports', 'ember-metal/core', 'ember-metal/
8350
8718
  if (currentValue === undefined && !(keyName in obj) || !Object.prototype.propertyIsEnumerable.call(obj, keyName)) {
8351
8719
  _emberMetalProperties.defineProperty(obj, keyName, null, value); // setup mandatory setter
8352
8720
  } else {
8353
- meta.values[keyName] = value;
8721
+ meta.writableValues()[keyName] = value;
8354
8722
  }
8355
8723
 
8356
8724
  _emberMetalProperty_events.propertyDidChange(obj, keyName);
@@ -9435,7 +9803,7 @@ enifed('ember-metal/streams/proxy-stream', ['exports', 'ember-metal/merge', 'emb
9435
9803
 
9436
9804
  exports.default = ProxyStream;
9437
9805
  });
9438
- enifed('ember-metal/streams/stream', ['exports', 'ember-metal/core', 'ember-metal/path_cache', 'ember-metal/observer', 'ember-metal/streams/utils', 'ember-metal/streams/subscriber', 'ember-metal/streams/dependency'], function (exports, _emberMetalCore, _emberMetalPath_cache, _emberMetalObserver, _emberMetalStreamsUtils, _emberMetalStreamsSubscriber, _emberMetalStreamsDependency) {
9806
+ enifed('ember-metal/streams/stream', ['exports', 'ember-metal/core', 'ember-metal/path_cache', 'ember-metal/observer', 'ember-metal/streams/utils', 'ember-metal/empty_object', 'ember-metal/streams/subscriber', 'ember-metal/streams/dependency'], function (exports, _emberMetalCore, _emberMetalPath_cache, _emberMetalObserver, _emberMetalStreamsUtils, _emberMetalEmpty_object, _emberMetalStreamsSubscriber, _emberMetalStreamsDependency) {
9439
9807
  'use strict';
9440
9808
 
9441
9809
  /**
@@ -9484,7 +9852,7 @@ enifed('ember-metal/streams/stream', ['exports', 'ember-metal/core', 'ember-meta
9484
9852
 
9485
9853
  getKey: function (key) {
9486
9854
  if (this.children === undefined) {
9487
- this.children = Object.create(null);
9855
+ this.children = new _emberMetalEmpty_object.default();
9488
9856
  }
9489
9857
 
9490
9858
  var keyStream = this.children[key];
@@ -9502,7 +9870,7 @@ enifed('ember-metal/streams/stream', ['exports', 'ember-metal/core', 'ember-meta
9502
9870
  var tailPath = _emberMetalPath_cache.getTailPath(path);
9503
9871
 
9504
9872
  if (this.children === undefined) {
9505
- this.children = Object.create(null);
9873
+ this.children = new _emberMetalEmpty_object.default();
9506
9874
  }
9507
9875
 
9508
9876
  var keyStream = this.children[firstKey];
@@ -9823,7 +10191,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9823
10191
  /*
9824
10192
  Check whether an object is a stream or not
9825
10193
 
9826
- @public
10194
+ @private
9827
10195
  @for Ember.stream
9828
10196
  @function isStream
9829
10197
  @param {Object|Stream} object object to check whether it is a stream
@@ -9857,7 +10225,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9857
10225
  A method of unsubscribing from a stream which is safe for use with a non-stream
9858
10226
  object. If a non-stream object is passed, the function does nothing.
9859
10227
 
9860
- @public
10228
+ @private
9861
10229
  @for Ember.stream
9862
10230
  @function unsubscribe
9863
10231
  @param {Object|Stream} object object or stream to potentially unsubscribe from
@@ -9875,7 +10243,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9875
10243
  Retrieve the value of a stream, or in the case a non-stream object is passed,
9876
10244
  return the object itself.
9877
10245
 
9878
- @public
10246
+ @private
9879
10247
  @for Ember.stream
9880
10248
  @function read
9881
10249
  @param {Object|Stream} object object to return the value of
@@ -9893,7 +10261,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9893
10261
  /*
9894
10262
  Map an array, replacing any streams with their values.
9895
10263
 
9896
- @public
10264
+ @private
9897
10265
  @for Ember.stream
9898
10266
  @function readArray
9899
10267
  @param {Array} array The array to read values from
@@ -9916,7 +10284,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9916
10284
  Map a hash, replacing any stream property values with the current value of that
9917
10285
  stream.
9918
10286
 
9919
- @public
10287
+ @private
9920
10288
  @for Ember.stream
9921
10289
  @function readHash
9922
10290
  @param {Object} object The hash to read keys and values from
@@ -9937,7 +10305,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9937
10305
  /*
9938
10306
  Check whether an array contains any stream values
9939
10307
 
9940
- @public
10308
+ @private
9941
10309
  @for Ember.stream
9942
10310
  @function scanArray
9943
10311
  @param {Array} array array given to a handlebars helper
@@ -9962,7 +10330,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9962
10330
  /*
9963
10331
  Check whether a hash has any stream property values
9964
10332
 
9965
- @public
10333
+ @private
9966
10334
  @for Ember.stream
9967
10335
  @function scanHash
9968
10336
  @param {Object} hash "hash" argument given to a handlebars helper
@@ -9986,7 +10354,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
9986
10354
  /*
9987
10355
  Join an array, with any streams replaced by their current values
9988
10356
 
9989
- @public
10357
+ @private
9990
10358
  @for Ember.stream
9991
10359
  @function concat
9992
10360
  @param {Array} array An array containing zero or more stream objects and
@@ -10011,7 +10379,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
10011
10379
  });
10012
10380
 
10013
10381
  for (i = 0, l = array.length; i < l; i++) {
10014
- stream.addDependency(array[i]);
10382
+ subscribe(array[i], stream.notify, stream);
10015
10383
  }
10016
10384
 
10017
10385
  // used by angle bracket components to detect an attribute was provided
@@ -10140,7 +10508,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
10140
10508
  In the example, result is a stream if source is a stream, or a number of
10141
10509
  source was numeric.
10142
10510
 
10143
- @public
10511
+ @private
10144
10512
  @for Ember.stream
10145
10513
  @function chain
10146
10514
  @param {Object|Stream} value A stream or non-stream object
@@ -10175,21 +10543,11 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
10175
10543
  enifed("ember-metal/symbol", ["exports"], function (exports) {
10176
10544
  "use strict";
10177
10545
  });
10178
- enifed('ember-metal/utils', ['exports', 'ember-metal/features'], function (exports, _emberMetalFeatures) {
10546
+ enifed('ember-metal/utils', ['exports'], function (exports) {
10179
10547
  // Remove "use strict"; from transpiled module until
10180
10548
  // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed
10181
10549
  //
10182
10550
 
10183
- exports.uuid = uuid;
10184
- exports.symbol = symbol;
10185
- exports.generateGuid = generateGuid;
10186
- exports.guidFor = guidFor;
10187
- exports.wrap = wrap;
10188
- exports.tryInvoke = tryInvoke;
10189
- exports.makeArray = makeArray;
10190
- exports.inspect = inspect;
10191
- exports.apply = apply;
10192
- exports.applyStr = applyStr;
10193
10551
  'REMOVE_USE_STRICT: true';
10194
10552
 
10195
10553
  /**
@@ -10203,6 +10561,16 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/features'], function (expor
10203
10561
  @private
10204
10562
  @return {Number} the uuid
10205
10563
  */
10564
+ exports.uuid = uuid;
10565
+ exports.symbol = symbol;
10566
+ exports.generateGuid = generateGuid;
10567
+ exports.guidFor = guidFor;
10568
+ exports.wrap = wrap;
10569
+ exports.tryInvoke = tryInvoke;
10570
+ exports.makeArray = makeArray;
10571
+ exports.inspect = inspect;
10572
+ exports.apply = apply;
10573
+ exports.applyStr = applyStr;
10206
10574
  var _uuid = 0;
10207
10575
 
10208
10576
  /**
@@ -10314,13 +10682,6 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/features'], function (expor
10314
10682
  };
10315
10683
 
10316
10684
  exports.GUID_DESC = GUID_DESC;
10317
- var undefinedDescriptor = {
10318
- configurable: true,
10319
- writable: true,
10320
- enumerable: false,
10321
- value: undefined
10322
- };
10323
-
10324
10685
  var nullDescriptor = {
10325
10686
  configurable: true,
10326
10687
  writable: true,
@@ -10328,31 +10689,12 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/features'], function (expor
10328
10689
  value: null
10329
10690
  };
10330
10691
 
10331
- var META_DESC = {
10332
- writable: true,
10333
- configurable: true,
10334
- enumerable: false,
10335
- value: null
10336
- };
10337
-
10338
- var EMBER_META_PROPERTY = {
10339
- name: '__ember_meta__',
10340
- descriptor: META_DESC
10341
- };
10342
-
10343
- exports.EMBER_META_PROPERTY = EMBER_META_PROPERTY;
10344
10692
  var GUID_KEY_PROPERTY = {
10345
10693
  name: GUID_KEY,
10346
10694
  descriptor: nullDescriptor
10347
10695
  };
10348
10696
 
10349
10697
  exports.GUID_KEY_PROPERTY = GUID_KEY_PROPERTY;
10350
- var NEXT_SUPER_PROPERTY = {
10351
- name: '__nextSuper',
10352
- descriptor: undefinedDescriptor
10353
- };
10354
-
10355
- exports.NEXT_SUPER_PROPERTY = NEXT_SUPER_PROPERTY;
10356
10698
  /**
10357
10699
  Generates a new guid, optionally saving the guid to the object that you
10358
10700
  pass in. You will rarely need to use this method. Instead you should
@@ -10435,121 +10777,48 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/features'], function (expor
10435
10777
 
10436
10778
  return ret;
10437
10779
 
10438
- case 'string':
10439
- ret = stringCache[obj];
10440
-
10441
- if (!ret) {
10442
- ret = stringCache[obj] = 'st' + uuid();
10443
- }
10444
-
10445
- return ret;
10446
-
10447
- case 'boolean':
10448
- return obj ? '(true)' : '(false)';
10449
-
10450
- default:
10451
- if (obj === Object) {
10452
- return '(Object)';
10453
- }
10454
-
10455
- if (obj === Array) {
10456
- return '(Array)';
10457
- }
10458
-
10459
- ret = GUID_PREFIX + uuid();
10460
-
10461
- if (obj[GUID_KEY] === null) {
10462
- obj[GUID_KEY] = ret;
10463
- } else {
10464
- GUID_DESC.value = ret;
10465
-
10466
- if (obj.__defineNonEnumerable) {
10467
- obj.__defineNonEnumerable(GUID_KEY_PROPERTY);
10468
- } else {
10469
- Object.defineProperty(obj, GUID_KEY, GUID_DESC);
10470
- }
10471
- }
10472
- return ret;
10473
- }
10474
- }
10475
-
10476
- // ..........................................................
10477
- // META
10478
- //
10479
- function Meta(obj) {
10480
- this.watching = {};
10481
- this.cache = undefined;
10482
- this.source = obj;
10483
- this.deps = undefined;
10484
- this.listeners = undefined;
10485
- this.mixins = undefined;
10486
- this.bindings = undefined;
10487
- this.chains = undefined;
10488
- this.chainWatchers = undefined;
10489
- this.values = undefined;
10490
- this.proto = undefined;
10491
- }
10492
-
10493
- // Placeholder for non-writable metas.
10494
- var EMPTY_META = new Meta(null);
10495
-
10496
- EMPTY_META.values = {};
10497
-
10498
- /**
10499
- Retrieves the meta hash for an object. If `writable` is true ensures the
10500
- hash is writable for this object as well.
10501
-
10502
- The meta object contains information about computed property descriptors as
10503
- well as any watched properties and other information. You generally will
10504
- not access this information directly but instead work with higher level
10505
- methods that manipulate this hash indirectly.
10506
-
10507
- @method meta
10508
- @for Ember
10509
- @private
10510
-
10511
- @param {Object} obj The object to retrieve meta for
10512
- @param {Boolean} [writable=true] Pass `false` if you do not intend to modify
10513
- the meta hash, allowing the method to avoid making an unnecessary copy.
10514
- @return {Object} the meta hash for an object
10515
- */
10516
- function meta(obj, writable) {
10517
- var ret = obj.__ember_meta__;
10518
- if (writable === false) {
10519
- return ret || EMPTY_META;
10520
- }
10780
+ case 'string':
10781
+ ret = stringCache[obj];
10521
10782
 
10522
- if (!ret) {
10523
- if (obj.__defineNonEnumerable) {
10524
- obj.__defineNonEnumerable(EMBER_META_PROPERTY);
10525
- } else {
10526
- Object.defineProperty(obj, '__ember_meta__', META_DESC);
10527
- }
10783
+ if (!ret) {
10784
+ ret = stringCache[obj] = 'st' + uuid();
10785
+ }
10528
10786
 
10529
- ret = new Meta(obj);
10787
+ return ret;
10530
10788
 
10531
- ret.values = {};
10789
+ case 'boolean':
10790
+ return obj ? '(true)' : '(false)';
10532
10791
 
10533
- obj.__ember_meta__ = ret;
10534
- } else if (ret.source !== obj) {
10535
- if (obj.__defineNonEnumerable) {
10536
- obj.__defineNonEnumerable(EMBER_META_PROPERTY);
10537
- } else {
10538
- Object.defineProperty(obj, '__ember_meta__', META_DESC);
10539
- }
10792
+ default:
10793
+ if (obj === Object) {
10794
+ return '(Object)';
10795
+ }
10796
+
10797
+ if (obj === Array) {
10798
+ return '(Array)';
10799
+ }
10540
10800
 
10541
- ret = Object.create(ret);
10542
- ret.watching = Object.create(ret.watching);
10543
- ret.cache = undefined;
10544
- ret.source = obj;
10801
+ ret = GUID_PREFIX + uuid();
10545
10802
 
10546
- ret.values = Object.create(ret.values);
10803
+ if (obj[GUID_KEY] === null) {
10804
+ obj[GUID_KEY] = ret;
10805
+ } else {
10806
+ GUID_DESC.value = ret;
10547
10807
 
10548
- obj['__ember_meta__'] = ret;
10808
+ if (obj.__defineNonEnumerable) {
10809
+ obj.__defineNonEnumerable(GUID_KEY_PROPERTY);
10810
+ } else {
10811
+ Object.defineProperty(obj, GUID_KEY, GUID_DESC);
10812
+ }
10813
+ }
10814
+ return ret;
10549
10815
  }
10550
- return ret;
10551
10816
  }
10552
10817
 
10818
+ var sourceAvailable = (function () {
10819
+ return this;
10820
+ }).toString().indexOf('return this;') > -1;
10821
+
10553
10822
  /**
10554
10823
  Wraps the passed function so that `this._super` will point to the superFunc
10555
10824
  when the function is invoked. This is the primitive we use to implement
@@ -10563,34 +10832,52 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/features'], function (expor
10563
10832
  @return {Function} wrapped function.
10564
10833
  */
10565
10834
 
10566
- function wrap(func, superFunc) {
10567
- function superWrapper() {
10568
- var ret;
10569
- var sup = this && this.__nextSuper;
10570
- var length = arguments.length;
10835
+ function wrap(func, _superFunc) {
10836
+ var superFunc = _superFunc;
10837
+ var hasSuper;
10838
+ if (sourceAvailable) {
10839
+ hasSuper = func.__hasSuper;
10571
10840
 
10572
- if (this) {
10573
- this.__nextSuper = superFunc;
10841
+ if (hasSuper === undefined) {
10842
+ hasSuper = func.toString().indexOf('_super') > -1;
10843
+ func.__hasSuper = hasSuper;
10574
10844
  }
10575
10845
 
10576
- if (length === 0) {
10577
- ret = func.call(this);
10578
- } else if (length === 1) {
10579
- ret = func.call(this, arguments[0]);
10580
- } else if (length === 2) {
10581
- ret = func.call(this, arguments[0], arguments[1]);
10582
- } else {
10583
- var args = new Array(length);
10584
- for (var i = 0; i < length; i++) {
10585
- args[i] = arguments[i];
10586
- }
10587
- ret = apply(this, func, args);
10846
+ if (!hasSuper) {
10847
+ return func;
10588
10848
  }
10849
+ }
10589
10850
 
10590
- if (this) {
10591
- this.__nextSuper = sup;
10592
- }
10851
+ if (superFunc.wrappedFunction === undefined) {
10852
+ // terminate _super to prevent infinite recursion
10853
+ superFunc = wrap(superFunc, function () {});
10854
+ }
10855
+
10856
+ return _wrap(func, superFunc);
10857
+ }
10593
10858
 
10859
+ function _wrap(func, superFunc) {
10860
+ function superWrapper() {
10861
+ var ret;
10862
+ var orig = this._super;
10863
+ this._super = superFunc;
10864
+ switch (arguments.length) {
10865
+ case 0:
10866
+ ret = func.call(this);break;
10867
+ case 1:
10868
+ ret = func.call(this, arguments[0]);break;
10869
+ case 2:
10870
+ ret = func.call(this, arguments[0], arguments[1]);break;
10871
+ case 3:
10872
+ ret = func.call(this, arguments[0], arguments[1], arguments[2]);break;
10873
+ case 4:
10874
+ ret = func.call(this, arguments[0], arguments[1], arguments[2], arguments[3]);break;
10875
+ case 5:
10876
+ ret = func.call(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);break;
10877
+ default:
10878
+ ret = func.apply(this, arguments);break;
10879
+ }
10880
+ this._super = orig;
10594
10881
  return ret;
10595
10882
  }
10596
10883
 
@@ -10805,13 +11092,10 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/features'], function (expor
10805
11092
  }
10806
11093
 
10807
11094
  exports.GUID_KEY = GUID_KEY;
10808
- exports.META_DESC = META_DESC;
10809
- exports.EMPTY_META = EMPTY_META;
10810
- exports.meta = meta;
10811
11095
  exports.makeArray = makeArray;
10812
11096
  exports.canInvoke = canInvoke;
10813
11097
  });
10814
- enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal/utils', 'ember-metal/properties'], function (exports, _emberMetalFeatures, _emberMetalUtils, _emberMetalProperties) {
11098
+ enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal/meta', 'ember-metal/properties'], function (exports, _emberMetalFeatures, _emberMetalMeta, _emberMetalProperties) {
10815
11099
  'use strict';
10816
11100
 
10817
11101
  exports.watchKey = watchKey;
@@ -10823,8 +11107,8 @@ enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal
10823
11107
  return;
10824
11108
  }
10825
11109
 
10826
- var m = meta || _emberMetalUtils.meta(obj);
10827
- var watching = m.watching;
11110
+ var m = meta || _emberMetalMeta.meta(obj);
11111
+ var watching = m.writableWatching();
10828
11112
 
10829
11113
  // activate watching first time
10830
11114
  if (!watching[keyName]) {
@@ -10860,7 +11144,7 @@ enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal
10860
11144
 
10861
11145
  // this x in Y deopts, so keeping it in this function is better;
10862
11146
  if (configurable && isWritable && hasValue && keyName in obj) {
10863
- m.values[keyName] = obj[keyName];
11147
+ m.writableValues()[keyName] = obj[keyName];
10864
11148
  Object.defineProperty(obj, keyName, {
10865
11149
  configurable: true,
10866
11150
  enumerable: Object.prototype.propertyIsEnumerable.call(obj, keyName),
@@ -10875,8 +11159,8 @@ enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal
10875
11159
  ; // jshint ignore:line
10876
11160
 
10877
11161
  function unwatchKey(obj, keyName, meta) {
10878
- var m = meta || _emberMetalUtils.meta(obj);
10879
- var watching = m.watching;
11162
+ var m = meta || _emberMetalMeta.meta(obj);
11163
+ var watching = m.writableWatching();
10880
11164
 
10881
11165
  if (watching[keyName] === 1) {
10882
11166
  watching[keyName] = 0;
@@ -10903,7 +11187,7 @@ enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal
10903
11187
  enumerable: true,
10904
11188
  value: val
10905
11189
  });
10906
- delete m.values[keyName];
11190
+ delete m.writableValues()[keyName];
10907
11191
  },
10908
11192
  get: _emberMetalProperties.DEFAULT_GETTER_FUNCTION(keyName)
10909
11193
  });
@@ -10913,7 +11197,7 @@ enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal
10913
11197
  }
10914
11198
  }
10915
11199
  });
10916
- enifed('ember-metal/watch_path', ['exports', 'ember-metal/utils', 'ember-metal/chains'], function (exports, _emberMetalUtils, _emberMetalChains) {
11200
+ enifed('ember-metal/watch_path', ['exports', 'ember-metal/meta', 'ember-metal/chains'], function (exports, _emberMetalMeta, _emberMetalChains) {
10917
11201
  'use strict';
10918
11202
 
10919
11203
  exports.watchPath = watchPath;
@@ -10923,14 +11207,11 @@ enifed('ember-metal/watch_path', ['exports', 'ember-metal/utils', 'ember-metal/c
10923
11207
  // chains inherited from the proto they will be cloned and reconfigured for
10924
11208
  // the current object.
10925
11209
  function chainsFor(obj, meta) {
10926
- var m = meta || _emberMetalUtils.meta(obj);
10927
- var ret = m.chains;
10928
- if (!ret) {
10929
- ret = m.chains = new _emberMetalChains.ChainNode(null, null, obj);
10930
- } else if (ret.value() !== obj) {
10931
- ret = m.chains = ret.copy(obj);
10932
- }
10933
- return ret;
11210
+ return (meta || _emberMetalMeta.meta(obj)).writableChains(makeChainNode);
11211
+ }
11212
+
11213
+ function makeChainNode(obj) {
11214
+ return new _emberMetalChains.ChainNode(null, null, obj);
10934
11215
  }
10935
11216
 
10936
11217
  function watchPath(obj, keyPath, meta) {
@@ -10939,8 +11220,8 @@ enifed('ember-metal/watch_path', ['exports', 'ember-metal/utils', 'ember-metal/c
10939
11220
  return;
10940
11221
  }
10941
11222
 
10942
- var m = meta || _emberMetalUtils.meta(obj);
10943
- var watching = m.watching;
11223
+ var m = meta || _emberMetalMeta.meta(obj);
11224
+ var watching = m.writableWatching();
10944
11225
 
10945
11226
  if (!watching[keyPath]) {
10946
11227
  // activate watching first time
@@ -10952,8 +11233,8 @@ enifed('ember-metal/watch_path', ['exports', 'ember-metal/utils', 'ember-metal/c
10952
11233
  }
10953
11234
 
10954
11235
  function unwatchPath(obj, keyPath, meta) {
10955
- var m = meta || _emberMetalUtils.meta(obj);
10956
- var watching = m.watching;
11236
+ var m = meta || _emberMetalMeta.meta(obj);
11237
+ var watching = m.writableWatching();
10957
11238
 
10958
11239
  if (watching[keyPath] === 1) {
10959
11240
  watching[keyPath] = 0;
@@ -11004,7 +11285,7 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
11004
11285
 
11005
11286
  function isWatching(obj, key) {
11006
11287
  var meta = obj['__ember_meta__'];
11007
- return (meta && meta.watching[key]) > 0;
11288
+ return (meta && meta.peekWatching(key)) > 0;
11008
11289
  }
11009
11290
 
11010
11291
  watch.flushPending = _emberMetalChains.flushPendingChains;
@@ -11042,7 +11323,7 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
11042
11323
  if (meta) {
11043
11324
  obj['__ember_meta__'] = null;
11044
11325
  // remove chainWatchers to remove circular references that would prevent GC
11045
- node = meta.chains;
11326
+ node = meta.readableChains();
11046
11327
  if (node) {
11047
11328
  NODE_STACK.push(node);
11048
11329
  // process tree
@@ -11069,7 +11350,7 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
11069
11350
  }
11070
11351
  }
11071
11352
  });
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) {
11353
+ 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-top-level-components', '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, _emberTemplateCompilerPluginsTransformTopLevelComponents, _emberTemplateCompilerPluginsTransformEachIntoCollection, _emberTemplateCompilerPluginsAssertNoViewAndControllerPaths, _emberTemplateCompilerPluginsAssertNoViewHelper, _emberTemplateCompilerCompat) {
11073
11354
  'use strict';
11074
11355
 
11075
11356
  _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformOldBindingSyntax.default);
@@ -11079,6 +11360,7 @@ enifed('ember-template-compiler', ['exports', 'ember-metal', 'ember-template-com
11079
11360
  _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformComponentCurlyToReadonly.default);
11080
11361
  _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformAngleBracketComponents.default);
11081
11362
  _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformInputOnToOnEvent.default);
11363
+ _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformTopLevelComponents.default);
11082
11364
 
11083
11365
  if (_emberMetal.default.ENV._ENABLE_LEGACY_VIEW_SUPPORT) {
11084
11366
  _emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformEachIntoCollection.default);
@@ -11463,7 +11745,6 @@ enifed('ember-template-compiler/plugins/transform-each-in-to-hash', ['exports'],
11463
11745
 
11464
11746
  walker.visit(ast, function (node) {
11465
11747
  if (pluginContext.validate(node)) {
11466
-
11467
11748
  if (node.program && node.program.blockParams.length) {
11468
11749
  throw new Error('You cannot use keyword (`{{each foo in bar}}`) and block params (`{{each bar as |foo|}}`) at the same time.');
11469
11750
  }
@@ -11512,7 +11793,7 @@ enifed('ember-template-compiler/plugins/transform-each-into-collection', ['expor
11512
11793
 
11513
11794
  var moduleInfo = _emberTemplateCompilerSystemCalculateLocationDisplay.default(moduleName, legacyHashKey.loc);
11514
11795
 
11515
- _emberMetalCore.default.deprecate('Using \'' + legacyHashKey.key + '\' with \'{{each}}\' ' + moduleInfo + 'is deprecated. Please refactor to a component.');
11796
+ _emberMetalCore.default.deprecate('Using \'' + legacyHashKey.key + '\' with \'{{each}}\' ' + moduleInfo + 'is deprecated. Please refactor to a component.', false, { id: 'ember-template-compiler.transform-each-into-collection', until: '2.0.0' });
11516
11797
 
11517
11798
  var list = node.params.shift();
11518
11799
  node.path = b.path('collection');
@@ -11533,7 +11814,6 @@ enifed('ember-template-compiler/plugins/transform-each-into-collection', ['expor
11533
11814
 
11534
11815
  function validate(node) {
11535
11816
  if ((node.type === 'BlockStatement' || node.type === 'MustacheStatement') && node.path.original === 'each') {
11536
-
11537
11817
  return any(node.hash.pairs, function (pair) {
11538
11818
  var key = pair.key;
11539
11819
  return key === 'itemController' || key === 'itemView' || key === 'itemViewClass' || key === 'tagName' || key === 'emptyView' || key === 'emptyViewClass';
@@ -11605,7 +11885,7 @@ enifed('ember-template-compiler/plugins/transform-input-on-to-onEvent', ['export
11605
11885
  var moduleInfo = _emberTemplateCompilerSystemCalculateLocationDisplay.default(moduleName, node.loc);
11606
11886
 
11607
11887
  if (normalizedOn && normalizedOn.value.type !== 'StringLiteral') {
11608
- _emberMetalCore.default.deprecate('Using a dynamic value for \'#{normalizedOn.key}=\' with the \'{{input}}\' helper ' + moduleInfo + 'is deprecated.');
11888
+ _emberMetalCore.default.deprecate('Using a dynamic value for \'#{normalizedOn.key}=\' with the \'{{input}}\' helper ' + moduleInfo + 'is deprecated.', false, { id: 'ember-template-compiler.transform-input-on-to-onEvent.dynamic-value', until: '3.0.0' });
11609
11889
 
11610
11890
  normalizedOn.key = 'onEvent';
11611
11891
  return; // exit early, as we cannot transform further
@@ -11615,7 +11895,7 @@ enifed('ember-template-compiler/plugins/transform-input-on-to-onEvent', ['export
11615
11895
  removeFromHash(node.hash, action);
11616
11896
 
11617
11897
  if (!action) {
11618
- _emberMetalCore.default.deprecate('Using \'{{input ' + normalizedOn.key + '="' + normalizedOn.value.value + '" ...}}\' without specifying an action ' + moduleInfo + 'will do nothing.');
11898
+ _emberMetalCore.default.deprecate('Using \'{{input ' + normalizedOn.key + '="' + normalizedOn.value.value + '" ...}}\' without specifying an action ' + moduleInfo + 'will do nothing.', false, { id: 'ember-template-compiler.transform-input-on-to-onEvent.no-action', until: '3.0.0' });
11619
11899
 
11620
11900
  return; // exit early, if no action was available there is nothing to do
11621
11901
  }
@@ -11629,7 +11909,7 @@ enifed('ember-template-compiler/plugins/transform-input-on-to-onEvent', ['export
11629
11909
 
11630
11910
  var expected = (normalizedOn ? normalizedOn.value.value : 'enter') + '="' + action.value.original + '"';
11631
11911
 
11632
- _emberMetalCore.default.deprecate('Using \'{{input ' + specifiedOn + 'action="' + action.value.original + '"}}\' ' + moduleInfo + 'is deprecated. Please use \'{{input ' + expected + '}}\' instead.');
11912
+ _emberMetalCore.default.deprecate('Using \'{{input ' + specifiedOn + 'action="' + action.value.original + '"}}\' ' + moduleInfo + 'is deprecated. Please use \'{{input ' + expected + '}}\' instead.', false, { id: 'ember-template-compiler.transform-input-on-to-onEvent.normalized-on', until: '3.0.0' });
11633
11913
  if (!normalizedOn) {
11634
11914
  normalizedOn = b.pair('onEvent', b.string('enter'));
11635
11915
  }
@@ -11759,7 +12039,7 @@ enifed('ember-template-compiler/plugins/transform-old-binding-syntax', ['exports
11759
12039
  if (key.substr(-7) === 'Binding') {
11760
12040
  var newKey = key.slice(0, -7);
11761
12041
 
11762
- _emberMetalCore.default.deprecate('You\'re using legacy binding syntax: ' + key + '=' + exprToString(value) + ' ' + sourceInformation + '. Please replace with ' + newKey + '=' + value.original);
12042
+ _emberMetalCore.default.deprecate('You\'re using legacy binding syntax: ' + key + '=' + exprToString(value) + ' ' + sourceInformation + '. Please replace with ' + newKey + '=' + value.original, false, { id: 'ember-template-compiler.transform-old-binding-syntax', until: '3.0.0' });
11763
12043
 
11764
12044
  pair.key = newKey;
11765
12045
  if (value.type === 'StringLiteral') {
@@ -11931,6 +12211,62 @@ enifed('ember-template-compiler/plugins/transform-old-class-binding-syntax', ['e
11931
12211
  return segments;
11932
12212
  }
11933
12213
  });
12214
+ enifed('ember-template-compiler/plugins/transform-top-level-components', ['exports'], function (exports) {
12215
+ 'use strict';
12216
+
12217
+ function TransformTopLevelComponents() {
12218
+ // set later within HTMLBars to the syntax package
12219
+ this.syntax = null;
12220
+ }
12221
+
12222
+ /**
12223
+ @private
12224
+ @method transform
12225
+ @param {AST} The AST to be transformed.
12226
+ */
12227
+ TransformTopLevelComponents.prototype.transform = function TransformTopLevelComponents_transform(ast) {
12228
+ hasSingleComponentNode(ast.body, function (component) {
12229
+ component.tag = '@' + component.tag;
12230
+ });
12231
+
12232
+ return ast;
12233
+ };
12234
+
12235
+ function hasSingleComponentNode(body, callback) {
12236
+ var lastComponentNode = undefined;
12237
+ var lastIndex = undefined;
12238
+ var nodeCount = 0;
12239
+
12240
+ for (var i = 0, l = body.length; i < l; i++) {
12241
+ var curr = body[i];
12242
+
12243
+ // text node with whitespace only
12244
+ if (curr.type === 'TextNode' && /^[\s]*$/.test(curr.chars)) {
12245
+ continue;
12246
+ }
12247
+
12248
+ // has multiple root elements if we've been here before
12249
+ if (nodeCount++ > 0) {
12250
+ return false;
12251
+ }
12252
+
12253
+ if (curr.type === 'ComponentNode' || curr.type === 'ElementNode') {
12254
+ lastComponentNode = curr;
12255
+ lastIndex = i;
12256
+ }
12257
+ }
12258
+
12259
+ if (!lastComponentNode) {
12260
+ return;
12261
+ }
12262
+
12263
+ if (lastComponentNode.type === 'ComponentNode') {
12264
+ callback(lastComponentNode);
12265
+ }
12266
+ }
12267
+
12268
+ exports.default = TransformTopLevelComponents;
12269
+ });
11934
12270
  enifed('ember-template-compiler/system/calculate-location-display', ['exports'], function (exports) {
11935
12271
  'use strict';
11936
12272
 
@@ -11999,7 +12335,7 @@ enifed('ember-template-compiler/system/compile', ['exports', 'ember-metal/core',
11999
12335
  return _emberTemplateCompilerSystemTemplate.default(templateSpec);
12000
12336
  };
12001
12337
  });
12002
- enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-metal/features', 'ember-metal/merge', 'ember-template-compiler/plugins'], function (exports, _emberMetalFeatures, _emberMetalMerge, _emberTemplateCompilerPlugins) {
12338
+ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-metal/features', 'ember-metal/assign', 'ember-template-compiler/plugins'], function (exports, _emberMetalFeatures, _emberMetalAssign, _emberTemplateCompilerPlugins) {
12003
12339
  /**
12004
12340
  @module ember
12005
12341
  @submodule ember-template-compiler
@@ -12022,7 +12358,7 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
12022
12358
  if (_options === true) {
12023
12359
  options = {};
12024
12360
  } else {
12025
- options = _emberMetalMerge.assign({}, _options);
12361
+ options = _emberMetalAssign.default({}, _options);
12026
12362
  }
12027
12363
 
12028
12364
  options.disableComponentGeneration = disableComponentGeneration;
@@ -12038,7 +12374,8 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
12038
12374
 
12039
12375
  options.buildMeta = function buildMeta(program) {
12040
12376
  return {
12041
- revision: 'Ember@2.0.3',
12377
+ topLevel: detectTopLevel(program),
12378
+ revision: 'Ember@2.1.0-beta.1',
12042
12379
  loc: program.loc,
12043
12380
  moduleName: options.moduleName
12044
12381
  };
@@ -12046,6 +12383,52 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
12046
12383
 
12047
12384
  return options;
12048
12385
  };
12386
+
12387
+ function detectTopLevel(program) {
12388
+ var loc = program.loc;
12389
+ var body = program.body;
12390
+
12391
+ if (!loc || loc.start.line !== 1 || loc.start.column !== 0) {
12392
+ return null;
12393
+ }
12394
+
12395
+ var lastComponentNode = undefined;
12396
+ var lastIndex = undefined;
12397
+ var nodeCount = 0;
12398
+
12399
+ for (var i = 0, l = body.length; i < l; i++) {
12400
+ var curr = body[i];
12401
+
12402
+ // text node with whitespace only
12403
+ if (curr.type === 'TextNode' && /^[\s]*$/.test(curr.chars)) {
12404
+ continue;
12405
+ }
12406
+
12407
+ // has multiple root elements if we've been here before
12408
+ if (nodeCount++ > 0) {
12409
+ return false;
12410
+ }
12411
+
12412
+ if (curr.type === 'ComponentNode' || curr.type === 'ElementNode') {
12413
+ lastComponentNode = curr;
12414
+ lastIndex = i;
12415
+ }
12416
+ }
12417
+
12418
+ if (!lastComponentNode) {
12419
+ return null;
12420
+ }
12421
+
12422
+ if (lastComponentNode.type === 'ComponentNode') {
12423
+ var tag = lastComponentNode.tag;
12424
+ if (tag.charAt(0) !== '<') {
12425
+ return null;
12426
+ }
12427
+ return tag.slice(1, -1);
12428
+ }
12429
+
12430
+ return null;
12431
+ }
12049
12432
  });
12050
12433
  enifed('ember-template-compiler/system/precompile', ['exports', 'ember-metal/core', 'ember-template-compiler/system/compile_options'], function (exports, _emberMetalCore, _emberTemplateCompilerSystemCompile_options) {
12051
12434
  /**
@@ -12782,7 +13165,7 @@ enifed("htmlbars-compiler/hydration-opcode-compiler", ["exports", "./template-vi
12782
13165
  };
12783
13166
 
12784
13167
  HydrationOpcodeCompiler.prototype.component = function (component, childIndex, childCount) {
12785
- this.pushMorphPlaceholderNode(childIndex, childCount);
13168
+ this.pushMorphPlaceholderNode(childIndex, childCount, component.isStatic);
12786
13169
 
12787
13170
  var program = component.program || {};
12788
13171
  var blockParams = program.blockParams || [];
@@ -12857,15 +13240,18 @@ enifed("htmlbars-compiler/hydration-opcode-compiler", ["exports", "./template-vi
12857
13240
  this.opcode('printElementHook', meta(modifier));
12858
13241
  };
12859
13242
 
12860
- HydrationOpcodeCompiler.prototype.pushMorphPlaceholderNode = function (childIndex, childCount) {
12861
- if (this.paths.length === 0) {
12862
- if (childIndex === 0) {
12863
- this.opcode('openBoundary');
12864
- }
12865
- if (childIndex === childCount - 1) {
12866
- this.opcode('closeBoundary');
13243
+ HydrationOpcodeCompiler.prototype.pushMorphPlaceholderNode = function (childIndex, childCount, skipBoundaryNodes) {
13244
+ if (!skipBoundaryNodes) {
13245
+ if (this.paths.length === 0) {
13246
+ if (childIndex === 0) {
13247
+ this.opcode('openBoundary');
13248
+ }
13249
+ if (childIndex === childCount - 1) {
13250
+ this.opcode('closeBoundary');
13251
+ }
12867
13252
  }
12868
13253
  }
13254
+
12869
13255
  this.comment();
12870
13256
  };
12871
13257
 
@@ -12982,37 +13368,11 @@ enifed('htmlbars-compiler/template-compiler', ['exports', './fragment-opcode-com
12982
13368
 
12983
13369
  exports.default = TemplateCompiler;
12984
13370
 
12985
- var dynamicNodes = {
12986
- mustache: true,
12987
- block: true,
12988
- component: true
12989
- };
12990
-
12991
13371
  TemplateCompiler.prototype.compile = function (ast) {
12992
13372
  var templateVisitor = new _templateVisitor.default();
12993
13373
  templateVisitor.visit(ast);
12994
13374
 
12995
- var normalizedActions = [];
12996
- var actions = templateVisitor.actions;
12997
-
12998
- for (var i = 0, l = actions.length - 1; i < l; i++) {
12999
- var action = actions[i];
13000
- var nextAction = actions[i + 1];
13001
-
13002
- normalizedActions.push(action);
13003
-
13004
- if (action[0] === "startProgram" && nextAction[0] in dynamicNodes) {
13005
- normalizedActions.push(['insertBoundary', [true]]);
13006
- }
13007
-
13008
- if (nextAction[0] === "endProgram" && action[0] in dynamicNodes) {
13009
- normalizedActions.push(['insertBoundary', [false]]);
13010
- }
13011
- }
13012
-
13013
- normalizedActions.push(actions[actions.length - 1]);
13014
-
13015
- _utils.processOpcodes(this, normalizedActions);
13375
+ _utils.processOpcodes(this, templateVisitor.actions);
13016
13376
 
13017
13377
  return this.templates.pop();
13018
13378
  };
@@ -13086,7 +13446,7 @@ enifed('htmlbars-compiler/template-compiler', ['exports', './fragment-opcode-com
13086
13446
  return 'child' + index;
13087
13447
  }).join(', ');
13088
13448
 
13089
- var template = '(function() {\n' + this.getChildTemplateVars(indent + ' ') + indent + ' return {\n' + this.buildMeta(indent + ' ', program) + indent + ' arity: ' + blockParams.length + ',\n' + indent + ' cachedFragment: null,\n' + indent + ' hasRendered: false,\n' + indent + ' buildFragment: ' + fragmentProgram + ',\n' + indent + ' buildRenderNodes: ' + hydrationPrograms.createMorphsProgram + ',\n' + indent + ' statements: [\n' + statements + '\n' + indent + ' ],\n' + indent + ' locals: ' + locals + ',\n' + indent + ' templates: [' + templates + ']\n' + indent + ' };\n' + indent + '}())';
13449
+ var template = '(function() {\n' + this.getChildTemplateVars(indent + ' ') + indent + ' return {\n' + this.buildMeta(indent + ' ', program) + indent + ' isEmpty: ' + (program.body.length ? 'false' : 'true') + ',\n' + indent + ' arity: ' + blockParams.length + ',\n' + indent + ' cachedFragment: null,\n' + indent + ' hasRendered: false,\n' + indent + ' buildFragment: ' + fragmentProgram + ',\n' + indent + ' buildRenderNodes: ' + hydrationPrograms.createMorphsProgram + ',\n' + indent + ' statements: [\n' + statements + '\n' + indent + ' ],\n' + indent + ' locals: ' + locals + ',\n' + indent + ' templates: [' + templates + ']\n' + indent + ' };\n' + indent + '}())';
13090
13450
 
13091
13451
  this.templates.push(template);
13092
13452
  };
@@ -13393,7 +13753,7 @@ enifed("htmlbars-compiler/utils", ["exports"], function (exports) {
13393
13753
  }
13394
13754
  }
13395
13755
  });
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) {
13756
+ enifed('htmlbars-runtime', ['exports', './htmlbars-runtime/hooks', './htmlbars-runtime/render', '../htmlbars-util/morph-utils', '../htmlbars-util/template-utils', 'htmlbars-runtime/hooks'], function (exports, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils, _htmlbarsRuntimeHooks2) {
13397
13757
  'use strict';
13398
13758
 
13399
13759
  var internal = {
@@ -13403,7 +13763,7 @@ enifed('htmlbars-runtime', ['exports', './htmlbars-runtime/hooks', './htmlbars-r
13403
13763
  continueBlock: _htmlbarsRuntimeHooks2.continueBlock,
13404
13764
  hostYieldWithShadowTemplate: _htmlbarsRuntimeHooks2.hostYieldWithShadowTemplate,
13405
13765
  visitChildren: _htmlbarsUtilMorphUtils.visitChildren,
13406
- validateChildMorphs: _htmlbarsRuntimeExpressionVisitor.validateChildMorphs,
13766
+ validateChildMorphs: _htmlbarsUtilMorphUtils.validateChildMorphs,
13407
13767
  clearMorph: _htmlbarsUtilTemplateUtils.clearMorph
13408
13768
  };
13409
13769
 
@@ -13411,28 +13771,8 @@ enifed('htmlbars-runtime', ['exports', './htmlbars-runtime/hooks', './htmlbars-r
13411
13771
  exports.render = _htmlbarsRuntimeRender.default;
13412
13772
  exports.internal = internal;
13413
13773
  });
13414
- enifed("htmlbars-runtime/expression-visitor", ["exports", "../htmlbars-util/object-utils", "../htmlbars-util/morph-utils"], function (exports, _htmlbarsUtilObjectUtils, _htmlbarsUtilMorphUtils) {
13415
- "use strict";
13416
-
13774
+ enifed('htmlbars-runtime/expression-visitor', ['exports'], function (exports) {
13417
13775
  /**
13418
- Node classification:
13419
-
13420
- # Primary Statement Nodes:
13421
-
13422
- These nodes are responsible for a render node that represents a morph-range.
13423
-
13424
- * block
13425
- * inline
13426
- * content
13427
- * element
13428
- * component
13429
-
13430
- # Leaf Statement Nodes:
13431
-
13432
- This node is responsible for a render node that represents a morph-attr.
13433
-
13434
- * attribute
13435
-
13436
13776
  # Expression Nodes:
13437
13777
 
13438
13778
  These nodes are not directly responsible for any part of the DOM, but are
@@ -13441,251 +13781,86 @@ enifed("htmlbars-runtime/expression-visitor", ["exports", "../htmlbars-util/obje
13441
13781
  * get
13442
13782
  * subexpr
13443
13783
  * concat
13444
- */
13445
-
13446
- var base = {
13447
- acceptExpression: function (node, env, scope) {
13448
- var ret = { value: null };
13449
-
13450
- // Primitive literals are unambiguously non-array representations of
13451
- // themselves.
13452
- if (typeof node !== 'object' || node === null) {
13453
- ret.value = node;
13454
- return ret;
13455
- }
13456
-
13457
- switch (node[0]) {
13458
- // can be used by manualElement
13459
- case 'value':
13460
- ret.value = node[1];break;
13461
- case 'get':
13462
- ret.value = this.get(node, env, scope);break;
13463
- case 'subexpr':
13464
- ret.value = this.subexpr(node, env, scope);break;
13465
- case 'concat':
13466
- ret.value = this.concat(node, env, scope);break;
13467
- }
13468
-
13469
- return ret;
13470
- },
13471
-
13472
- acceptParams: function (nodes, env, scope) {
13473
- var arr = new Array(nodes.length);
13474
-
13475
- for (var i = 0, l = nodes.length; i < l; i++) {
13476
- arr[i] = this.acceptExpression(nodes[i], env, scope).value;
13477
- }
13478
-
13479
- return arr;
13480
- },
13481
-
13482
- acceptHash: function (pairs, env, scope) {
13483
- var object = {};
13484
-
13485
- for (var i = 0, l = pairs.length; i < l; i += 2) {
13486
- object[pairs[i]] = this.acceptExpression(pairs[i + 1], env, scope).value;
13487
- }
13488
-
13489
- return object;
13490
- },
13491
-
13492
- // [ 'get', path ]
13493
- get: function (node, env, scope) {
13494
- return env.hooks.get(env, scope, node[1]);
13495
- },
13496
-
13497
- // [ 'subexpr', path, params, hash ]
13498
- subexpr: function (node, env, scope) {
13499
- var path = node[1],
13500
- params = node[2],
13501
- hash = node[3];
13502
- return env.hooks.subexpr(env, scope, path, this.acceptParams(params, env, scope), this.acceptHash(hash, env, scope));
13503
- },
13504
-
13505
- // [ 'concat', parts ]
13506
- concat: function (node, env, scope) {
13507
- return env.hooks.concat(env, this.acceptParams(node[1], env, scope));
13508
- },
13509
-
13510
- linkParamsAndHash: function (env, scope, morph, path, params, hash) {
13511
- if (morph.linkedParams) {
13512
- params = morph.linkedParams.params;
13513
- hash = morph.linkedParams.hash;
13514
- } else {
13515
- params = params && this.acceptParams(params, env, scope);
13516
- hash = hash && this.acceptHash(hash, env, scope);
13517
- }
13518
-
13519
- _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, path, params, hash);
13520
- return [params, hash];
13521
- }
13522
- };
13523
-
13524
- var AlwaysDirtyVisitor = _htmlbarsUtilObjectUtils.merge(Object.create(base), {
13525
- // [ 'block', path, params, hash, templateId, inverseId ]
13526
- block: function (node, morph, env, scope, template, visitor) {
13527
- var path = node[1],
13528
- params = node[2],
13529
- hash = node[3],
13530
- templateId = node[4],
13531
- inverseId = node[5];
13532
- var paramsAndHash = this.linkParamsAndHash(env, scope, morph, path, params, hash);
13533
-
13534
- morph.isDirty = morph.isSubtreeDirty = false;
13535
- env.hooks.block(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templateId === null ? null : template.templates[templateId], inverseId === null ? null : template.templates[inverseId], visitor);
13536
- },
13537
-
13538
- // [ 'inline', path, params, hash ]
13539
- inline: function (node, morph, env, scope, visitor) {
13540
- var path = node[1],
13541
- params = node[2],
13542
- hash = node[3];
13543
- var paramsAndHash = this.linkParamsAndHash(env, scope, morph, path, params, hash);
13544
-
13545
- morph.isDirty = morph.isSubtreeDirty = false;
13546
- env.hooks.inline(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);
13547
- },
13548
-
13549
- // [ 'content', path ]
13550
- content: function (node, morph, env, scope, visitor) {
13551
- var path = node[1];
13552
-
13553
- morph.isDirty = morph.isSubtreeDirty = false;
13554
-
13555
- if (isHelper(env, scope, path)) {
13556
- env.hooks.inline(morph, env, scope, path, [], {}, visitor);
13557
- if (morph.linkedResult) {
13558
- _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@content-helper', [morph.linkedResult], null);
13559
- }
13560
- return;
13561
- }
13562
-
13563
- var params;
13564
- if (morph.linkedParams) {
13565
- params = morph.linkedParams.params;
13566
- } else {
13567
- params = [env.hooks.get(env, scope, path)];
13568
- }
13569
-
13570
- _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@range', params, null);
13571
- env.hooks.range(morph, env, scope, path, params[0], visitor);
13572
- },
13573
-
13574
- // [ 'element', path, params, hash ]
13575
- element: function (node, morph, env, scope, visitor) {
13576
- var path = node[1],
13577
- params = node[2],
13578
- hash = node[3];
13579
- var paramsAndHash = this.linkParamsAndHash(env, scope, morph, path, params, hash);
13580
-
13581
- morph.isDirty = morph.isSubtreeDirty = false;
13582
- env.hooks.element(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);
13583
- },
13584
-
13585
- // [ 'attribute', name, value ]
13586
- attribute: function (node, morph, env, scope) {
13587
- var name = node[1],
13588
- value = node[2];
13589
- var paramsAndHash = this.linkParamsAndHash(env, scope, morph, '@attribute', [value], null);
13590
-
13591
- morph.isDirty = morph.isSubtreeDirty = false;
13592
- env.hooks.attribute(morph, env, scope, name, paramsAndHash[0][0]);
13593
- },
13594
-
13595
- // [ 'component', path, attrs, templateId, inverseId ]
13596
- component: function (node, morph, env, scope, template, visitor) {
13597
- var path = node[1],
13598
- attrs = node[2],
13599
- templateId = node[3],
13600
- inverseId = node[4];
13601
- var paramsAndHash = this.linkParamsAndHash(env, scope, morph, path, [], attrs);
13602
- var templates = {
13603
- default: template.templates[templateId],
13604
- inverse: template.templates[inverseId]
13605
- };
13784
+ */
13606
13785
 
13607
- morph.isDirty = morph.isSubtreeDirty = false;
13608
- env.hooks.component(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templates, visitor);
13609
- },
13786
+ 'use strict';
13610
13787
 
13611
- // [ 'attributes', template ]
13612
- attributes: function (node, morph, env, scope, parentMorph, visitor) {
13613
- var template = node[1];
13614
- env.hooks.attributes(morph, env, scope, template, parentMorph, visitor);
13615
- }
13616
- });
13788
+ exports.acceptParams = acceptParams;
13789
+ exports.acceptHash = acceptHash;
13617
13790
 
13618
- exports.AlwaysDirtyVisitor = AlwaysDirtyVisitor;
13619
- exports.default = _htmlbarsUtilObjectUtils.merge(Object.create(base), {
13620
- // [ 'block', path, params, hash, templateId, inverseId ]
13621
- block: function (node, morph, env, scope, template, visitor) {
13622
- dirtyCheck(env, morph, visitor, function (visitor) {
13623
- AlwaysDirtyVisitor.block(node, morph, env, scope, template, visitor);
13624
- });
13625
- },
13791
+ function acceptParams(nodes, env, scope) {
13792
+ var array = [];
13626
13793
 
13627
- // [ 'inline', path, params, hash ]
13628
- inline: function (node, morph, env, scope, visitor) {
13629
- dirtyCheck(env, morph, visitor, function (visitor) {
13630
- AlwaysDirtyVisitor.inline(node, morph, env, scope, visitor);
13631
- });
13632
- },
13794
+ for (var i = 0, l = nodes.length; i < l; i++) {
13795
+ array.push(acceptExpression(nodes[i], env, scope).value);
13796
+ }
13633
13797
 
13634
- // [ 'content', path ]
13635
- content: function (node, morph, env, scope, visitor) {
13636
- dirtyCheck(env, morph, visitor, function (visitor) {
13637
- AlwaysDirtyVisitor.content(node, morph, env, scope, visitor);
13638
- });
13639
- },
13798
+ return array;
13799
+ }
13640
13800
 
13641
- // [ 'element', path, params, hash ]
13642
- element: function (node, morph, env, scope, template, visitor) {
13643
- dirtyCheck(env, morph, visitor, function (visitor) {
13644
- AlwaysDirtyVisitor.element(node, morph, env, scope, template, visitor);
13645
- });
13646
- },
13801
+ function acceptHash(pairs, env, scope) {
13802
+ var object = {};
13647
13803
 
13648
- // [ 'attribute', name, value ]
13649
- attribute: function (node, morph, env, scope, template) {
13650
- dirtyCheck(env, morph, null, function () {
13651
- AlwaysDirtyVisitor.attribute(node, morph, env, scope, template);
13652
- });
13653
- },
13804
+ for (var i = 0, l = pairs.length; i < l; i += 2) {
13805
+ var key = pairs[i];
13806
+ var value = pairs[i + 1];
13807
+ object[key] = acceptExpression(value, env, scope).value;
13808
+ }
13654
13809
 
13655
- // [ 'component', path, attrs, templateId ]
13656
- component: function (node, morph, env, scope, template, visitor) {
13657
- dirtyCheck(env, morph, visitor, function (visitor) {
13658
- AlwaysDirtyVisitor.component(node, morph, env, scope, template, visitor);
13659
- });
13660
- },
13810
+ return object;
13811
+ }
13661
13812
 
13662
- // [ 'attributes', template ]
13663
- attributes: function (node, morph, env, scope, parentMorph, visitor) {
13664
- AlwaysDirtyVisitor.attributes(node, morph, env, scope, parentMorph, visitor);
13813
+ function acceptExpression(node, env, scope) {
13814
+ var ret = { value: null };
13815
+
13816
+ // Primitive literals are unambiguously non-array representations of
13817
+ // themselves.
13818
+ if (typeof node !== 'object' || node === null) {
13819
+ ret.value = node;
13820
+ } else {
13821
+ ret.value = evaluateNode(node, env, scope);
13665
13822
  }
13666
- });
13667
13823
 
13668
- function dirtyCheck(_env, morph, visitor, callback) {
13669
- var isDirty = morph.isDirty;
13670
- var isSubtreeDirty = morph.isSubtreeDirty;
13671
- var env = _env;
13824
+ return ret;
13825
+ }
13672
13826
 
13673
- if (isSubtreeDirty) {
13674
- visitor = AlwaysDirtyVisitor;
13827
+ function evaluateNode(node, env, scope) {
13828
+ switch (node[0]) {
13829
+ // can be used by manualElement
13830
+ case 'value':
13831
+ return node[1];
13832
+ case 'get':
13833
+ return evaluateGet(node, env, scope);
13834
+ case 'subexpr':
13835
+ return evaluateSubexpr(node, env, scope);
13836
+ case 'concat':
13837
+ return evaluateConcat(node, env, scope);
13675
13838
  }
13839
+ }
13676
13840
 
13677
- if (isDirty || isSubtreeDirty) {
13678
- callback(visitor);
13679
- } else {
13680
- if (morph.buildChildEnv) {
13681
- env = morph.buildChildEnv(morph.state, env);
13682
- }
13683
- _htmlbarsUtilMorphUtils.validateChildMorphs(env, morph, visitor);
13684
- }
13841
+ function evaluateGet(node, env, scope) {
13842
+ var path = node[1];
13843
+
13844
+ return env.hooks.get(env, scope, path);
13685
13845
  }
13686
13846
 
13687
- function isHelper(env, scope, path) {
13688
- return env.hooks.keywords[path] !== undefined || env.hooks.hasHelper(env, scope, path);
13847
+ function evaluateSubexpr(node, env, scope) {
13848
+ var path = node[1];
13849
+ var rawParams = node[2];
13850
+ var rawHash = node[3];
13851
+
13852
+ var params = acceptParams(rawParams, env, scope);
13853
+ var hash = acceptHash(rawHash, env, scope);
13854
+
13855
+ return env.hooks.subexpr(env, scope, path, params, hash);
13856
+ }
13857
+
13858
+ function evaluateConcat(node, env, scope) {
13859
+ var rawParts = node[1];
13860
+
13861
+ var parts = acceptParams(rawParts, env, scope);
13862
+
13863
+ return env.hooks.concat(env, parts);
13689
13864
  }
13690
13865
  });
13691
13866
  enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-list", "../htmlbars-util/object-utils", "../htmlbars-util/morph-utils", "../htmlbars-util/template-utils"], function (exports, _render, _morphRangeMorphList, _htmlbarsUtilObjectUtils, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils) {
@@ -14179,6 +14354,8 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
14179
14354
  function createChildScope(parent) {
14180
14355
  var scope = Object.create(parent);
14181
14356
  scope.locals = Object.create(parent.locals);
14357
+ scope.localPresent = Object.create(parent.localPresent);
14358
+ scope.blocks = Object.create(parent.blocks);
14182
14359
  return scope;
14183
14360
  }
14184
14361
 
@@ -14927,7 +15104,204 @@ enifed("htmlbars-runtime/morph", ["exports", "../morph-range"], function (export
14927
15104
 
14928
15105
  exports.default = HTMLBarsMorph;
14929
15106
  });
14930
- enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", "../htmlbars-util/morph-utils", "./expression-visitor", "./morph", "../htmlbars-util/template-utils", "../htmlbars-util/void-tag-names"], function (exports, _htmlbarsUtilArrayUtils, _htmlbarsUtilMorphUtils, _expressionVisitor, _morph, _htmlbarsUtilTemplateUtils, _htmlbarsUtilVoidTagNames) {
15107
+ enifed("htmlbars-runtime/node-visitor", ["exports", "../htmlbars-util/morph-utils", "./expression-visitor"], function (exports, _htmlbarsUtilMorphUtils, _expressionVisitor) {
15108
+ "use strict";
15109
+
15110
+ /**
15111
+ Node classification:
15112
+
15113
+ # Primary Statement Nodes:
15114
+
15115
+ These nodes are responsible for a render node that represents a morph-range.
15116
+
15117
+ * block
15118
+ * inline
15119
+ * content
15120
+ * element
15121
+ * component
15122
+
15123
+ # Leaf Statement Nodes:
15124
+
15125
+ This node is responsible for a render node that represents a morph-attr.
15126
+
15127
+ * attribute
15128
+ */
15129
+
15130
+ function linkParamsAndHash(env, scope, morph, path, params, hash) {
15131
+ if (morph.linkedParams) {
15132
+ params = morph.linkedParams.params;
15133
+ hash = morph.linkedParams.hash;
15134
+ } else {
15135
+ params = params && _expressionVisitor.acceptParams(params, env, scope);
15136
+ hash = hash && _expressionVisitor.acceptHash(hash, env, scope);
15137
+ }
15138
+
15139
+ _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, path, params, hash);
15140
+ return [params, hash];
15141
+ }
15142
+
15143
+ var AlwaysDirtyVisitor = {
15144
+
15145
+ block: function (node, morph, env, scope, template, visitor) {
15146
+ var path = node[1];
15147
+ var params = node[2];
15148
+ var hash = node[3];
15149
+ var templateId = node[4];
15150
+ var inverseId = node[5];
15151
+
15152
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);
15153
+
15154
+ morph.isDirty = morph.isSubtreeDirty = false;
15155
+ env.hooks.block(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templateId === null ? null : template.templates[templateId], inverseId === null ? null : template.templates[inverseId], visitor);
15156
+ },
15157
+
15158
+ inline: function (node, morph, env, scope, visitor) {
15159
+ var path = node[1];
15160
+ var params = node[2];
15161
+ var hash = node[3];
15162
+
15163
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);
15164
+
15165
+ morph.isDirty = morph.isSubtreeDirty = false;
15166
+ env.hooks.inline(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);
15167
+ },
15168
+
15169
+ content: function (node, morph, env, scope, visitor) {
15170
+ var path = node[1];
15171
+
15172
+ morph.isDirty = morph.isSubtreeDirty = false;
15173
+
15174
+ if (isHelper(env, scope, path)) {
15175
+ env.hooks.inline(morph, env, scope, path, [], {}, visitor);
15176
+ if (morph.linkedResult) {
15177
+ _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@content-helper', [morph.linkedResult], null);
15178
+ }
15179
+ return;
15180
+ }
15181
+
15182
+ var params = undefined;
15183
+ if (morph.linkedParams) {
15184
+ params = morph.linkedParams.params;
15185
+ } else {
15186
+ params = [env.hooks.get(env, scope, path)];
15187
+ }
15188
+
15189
+ _htmlbarsUtilMorphUtils.linkParams(env, scope, morph, '@range', params, null);
15190
+ env.hooks.range(morph, env, scope, path, params[0], visitor);
15191
+ },
15192
+
15193
+ element: function (node, morph, env, scope, visitor) {
15194
+ var path = node[1];
15195
+ var params = node[2];
15196
+ var hash = node[3];
15197
+
15198
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, params, hash);
15199
+
15200
+ morph.isDirty = morph.isSubtreeDirty = false;
15201
+ env.hooks.element(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], visitor);
15202
+ },
15203
+
15204
+ attribute: function (node, morph, env, scope) {
15205
+ var name = node[1];
15206
+ var value = node[2];
15207
+
15208
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, '@attribute', [value], null);
15209
+
15210
+ morph.isDirty = morph.isSubtreeDirty = false;
15211
+ env.hooks.attribute(morph, env, scope, name, paramsAndHash[0][0]);
15212
+ },
15213
+
15214
+ component: function (node, morph, env, scope, template, visitor) {
15215
+ var path = node[1];
15216
+ var attrs = node[2];
15217
+ var templateId = node[3];
15218
+ var inverseId = node[4];
15219
+
15220
+ var paramsAndHash = linkParamsAndHash(env, scope, morph, path, [], attrs);
15221
+ var templates = {
15222
+ default: template.templates[templateId],
15223
+ inverse: template.templates[inverseId]
15224
+ };
15225
+
15226
+ morph.isDirty = morph.isSubtreeDirty = false;
15227
+ env.hooks.component(morph, env, scope, path, paramsAndHash[0], paramsAndHash[1], templates, visitor);
15228
+ },
15229
+
15230
+ attributes: function (node, morph, env, scope, parentMorph, visitor) {
15231
+ var template = node[1];
15232
+
15233
+ env.hooks.attributes(morph, env, scope, template, parentMorph, visitor);
15234
+ }
15235
+
15236
+ };
15237
+
15238
+ exports.AlwaysDirtyVisitor = AlwaysDirtyVisitor;
15239
+ exports.default = {
15240
+ block: function (node, morph, env, scope, template, visitor) {
15241
+ dirtyCheck(env, morph, visitor, function (visitor) {
15242
+ AlwaysDirtyVisitor.block(node, morph, env, scope, template, visitor);
15243
+ });
15244
+ },
15245
+
15246
+ inline: function (node, morph, env, scope, visitor) {
15247
+ dirtyCheck(env, morph, visitor, function (visitor) {
15248
+ AlwaysDirtyVisitor.inline(node, morph, env, scope, visitor);
15249
+ });
15250
+ },
15251
+
15252
+ content: function (node, morph, env, scope, visitor) {
15253
+ dirtyCheck(env, morph, visitor, function (visitor) {
15254
+ AlwaysDirtyVisitor.content(node, morph, env, scope, visitor);
15255
+ });
15256
+ },
15257
+
15258
+ element: function (node, morph, env, scope, template, visitor) {
15259
+ dirtyCheck(env, morph, visitor, function (visitor) {
15260
+ AlwaysDirtyVisitor.element(node, morph, env, scope, template, visitor);
15261
+ });
15262
+ },
15263
+
15264
+ attribute: function (node, morph, env, scope, template) {
15265
+ dirtyCheck(env, morph, null, function () {
15266
+ AlwaysDirtyVisitor.attribute(node, morph, env, scope, template);
15267
+ });
15268
+ },
15269
+
15270
+ component: function (node, morph, env, scope, template, visitor) {
15271
+ dirtyCheck(env, morph, visitor, function (visitor) {
15272
+ AlwaysDirtyVisitor.component(node, morph, env, scope, template, visitor);
15273
+ });
15274
+ },
15275
+
15276
+ attributes: function (node, morph, env, scope, parentMorph, visitor) {
15277
+ AlwaysDirtyVisitor.attributes(node, morph, env, scope, parentMorph, visitor);
15278
+ }
15279
+ };
15280
+
15281
+ function dirtyCheck(_env, morph, visitor, callback) {
15282
+ var isDirty = morph.isDirty;
15283
+ var isSubtreeDirty = morph.isSubtreeDirty;
15284
+ var env = _env;
15285
+
15286
+ if (isSubtreeDirty) {
15287
+ visitor = AlwaysDirtyVisitor;
15288
+ }
15289
+
15290
+ if (isDirty || isSubtreeDirty) {
15291
+ callback(visitor);
15292
+ } else {
15293
+ if (morph.buildChildEnv) {
15294
+ env = morph.buildChildEnv(morph.state, env);
15295
+ }
15296
+ _htmlbarsUtilMorphUtils.validateChildMorphs(env, morph, visitor);
15297
+ }
15298
+ }
15299
+
15300
+ function isHelper(env, scope, path) {
15301
+ return env.hooks.keywords[path] !== undefined || env.hooks.hasHelper(env, scope, path);
15302
+ }
15303
+ });
15304
+ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", "../htmlbars-util/morph-utils", "./node-visitor", "./morph", "../htmlbars-util/template-utils", "../htmlbars-util/void-tag-names"], function (exports, _htmlbarsUtilArrayUtils, _htmlbarsUtilMorphUtils, _nodeVisitor, _morph, _htmlbarsUtilTemplateUtils, _htmlbarsUtilVoidTagNames) {
14931
15305
  "use strict";
14932
15306
 
14933
15307
  exports.default = render;
@@ -15014,7 +15388,7 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15014
15388
  return new RenderResult(env, scope, options, rootNode, ownerNode, nodes, fragment, template, shouldSetContent);
15015
15389
  };
15016
15390
 
15017
- function manualElement(tagName, attributes) {
15391
+ function manualElement(tagName, attributes, _isEmpty) {
15018
15392
  var statements = [];
15019
15393
 
15020
15394
  for (var key in attributes) {
@@ -15024,7 +15398,11 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15024
15398
  statements.push(["attribute", key, attributes[key]]);
15025
15399
  }
15026
15400
 
15027
- statements.push(['content', 'yield']);
15401
+ var isEmpty = _isEmpty || _htmlbarsUtilVoidTagNames.default[tagName];
15402
+
15403
+ if (!isEmpty) {
15404
+ statements.push(['content', 'yield']);
15405
+ }
15028
15406
 
15029
15407
  var template = {
15030
15408
  arity: 0,
@@ -15044,7 +15422,7 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15044
15422
  dom.setAttribute(el1, key, attributes[key]);
15045
15423
  }
15046
15424
 
15047
- if (!_htmlbarsUtilVoidTagNames.default[tagName]) {
15425
+ if (!isEmpty) {
15048
15426
  var el2 = dom.createComment("");
15049
15427
  dom.appendChild(el1, el2);
15050
15428
  }
@@ -15064,7 +15442,10 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15064
15442
  morphs.push(dom.createAttrMorph(element, key));
15065
15443
  }
15066
15444
 
15067
- morphs.push(dom.createMorphAt(element, 0, 0));
15445
+ if (!isEmpty) {
15446
+ morphs.push(dom.createMorphAt(element, 0, 0));
15447
+ }
15448
+
15068
15449
  return morphs;
15069
15450
  },
15070
15451
  statements: statements,
@@ -15134,7 +15515,7 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15134
15515
  RenderResult.prototype.render = function () {
15135
15516
  this.root.lastResult = this;
15136
15517
  this.root.rendered = true;
15137
- this.populateNodes(_expressionVisitor.AlwaysDirtyVisitor);
15518
+ this.populateNodes(_nodeVisitor.AlwaysDirtyVisitor);
15138
15519
 
15139
15520
  if (this.shouldSetContent && this.root.setContent) {
15140
15521
  this.root.setContent(this.fragment);
@@ -15148,11 +15529,11 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
15148
15529
  };
15149
15530
 
15150
15531
  RenderResult.prototype.revalidate = function (env, self, blockArguments, scope) {
15151
- this.revalidateWith(env, scope, self, blockArguments, _expressionVisitor.default);
15532
+ this.revalidateWith(env, scope, self, blockArguments, _nodeVisitor.default);
15152
15533
  };
15153
15534
 
15154
15535
  RenderResult.prototype.rerender = function (env, self, blockArguments, scope) {
15155
- this.revalidateWith(env, scope, self, blockArguments, _expressionVisitor.AlwaysDirtyVisitor);
15536
+ this.revalidateWith(env, scope, self, blockArguments, _nodeVisitor.AlwaysDirtyVisitor);
15156
15537
  };
15157
15538
 
15158
15539
  RenderResult.prototype.revalidateWith = function (env, scope, self, blockArguments, visitor) {
@@ -15393,7 +15774,14 @@ enifed("htmlbars-syntax/builders", ["exports"], function (exports) {
15393
15774
  tag: tag,
15394
15775
  attributes: attributes,
15395
15776
  program: program,
15396
- loc: buildLoc(loc)
15777
+ loc: buildLoc(loc),
15778
+
15779
+ // this should be true only if this component node is guaranteed
15780
+ // to produce start and end points that can never change after the
15781
+ // initial render, regardless of changes to dynamic inputs. If
15782
+ // a component represents a "fragment" (any number of top-level nodes),
15783
+ // this will usually not be true.
15784
+ isStatic: false
15397
15785
  };
15398
15786
  }
15399
15787
 
@@ -18455,12 +18843,7 @@ enifed("htmlbars-util/morph-utils", ["exports"], function (exports) {
18455
18843
  current = current.nextMorph;
18456
18844
  }
18457
18845
  } else if (node.morphList) {
18458
- var current = node.morphList.firstChildMorph;
18459
-
18460
- while (current) {
18461
- nodes.push(current);
18462
- current = current.nextMorph;
18463
- }
18846
+ nodes.push(node.morphList);
18464
18847
  }
18465
18848
  }
18466
18849
  }
@@ -18899,8 +19282,8 @@ enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _mo
18899
19282
  return this.setNode(content);
18900
19283
  }
18901
19284
  /* Handlebars.SafeString */
18902
- if (typeof content.toHTML === 'function') {
18903
- return this.setHTML(content.toHTML());
19285
+ if (typeof content.string === 'string') {
19286
+ return this.setHTML(content.string);
18904
19287
  }
18905
19288
  if (this.parseTextAsHTML) {
18906
19289
  return this.setHTML(content.toString());