ember-source 1.13.0.beta.1 → 1.13.0.beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 99e2a3890c39e480d0e13b8dfb867b9e00f312f4
4
- data.tar.gz: 2f89ab81b3d80624c6faad84e5a689727cfe513b
3
+ metadata.gz: ac116dbefa7f1ed69130928d2a41d7315bc9ec4a
4
+ data.tar.gz: 9cad47a3a3656654cc8a6aedb953eb98d355889b
5
5
  SHA512:
6
- metadata.gz: 30a147f1fc057a9bccda327788a873c6c1c565baf537a51203f6da43f86b17e7e7bd1ddfba3d5c6e9c07b2c8165999c55261b31efc8524f0c82d072ad7519fca
7
- data.tar.gz: 171089123074b9d3ef74678abdebcf2d99fabae04f50075dea184c2f0d008b0d870a6a3b24e919e14370422cbe572c51428485cca995bfba0970c058d8d545eb
6
+ metadata.gz: 7cceee12f7f9171c36eb05b5fa28dfc8841ca4a0d45178fea243d7c74c92e9795cdd83d2a762a7c240d5137c2644558ae72432b721d4245bd5a46cbc0171d9de
7
+ data.tar.gz: c30ac845bc621d5a9d818f68603d2105d7fa9665093b2162e8753a63c71b2561ab4798eafeb7c732998c0496f910e9f3bb36b38c70411dd4ed050246d674b400
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.13.0-beta.1
1
+ 1.13.0-beta.2
@@ -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 1.13.0-beta.1
8
+ * @version 1.13.0-beta.2
9
9
  */
10
10
 
11
11
  (function() {
@@ -116,16 +116,6 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/error', 'embe
116
116
 
117
117
  exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;
118
118
 
119
- /**
120
- Will call `Ember.warn()` if ENABLE_ALL_FEATURES, ENABLE_OPTIONAL_FEATURES, or
121
- any specific FEATURES flag is truthy.
122
-
123
- This method is called automatically in debug canary builds.
124
-
125
- @private
126
- @method _warnIfUsingStrippedFeatureFlags
127
- @return {void}
128
- */
129
119
  function isPlainFunction(test) {
130
120
  return typeof test === "function" && test.PrototypeMixin === undefined;
131
121
  }
@@ -309,6 +299,17 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/error', 'embe
309
299
  Ember['default'].runInDebug = function (func) {
310
300
  func();
311
301
  };
302
+
303
+ /**
304
+ Will call `Ember.warn()` if ENABLE_ALL_FEATURES, ENABLE_OPTIONAL_FEATURES, or
305
+ any specific FEATURES flag is truthy.
306
+
307
+ This method is called automatically in debug canary builds.
308
+
309
+ @private
310
+ @method _warnIfUsingStrippedFeatureFlags
311
+ @return {void}
312
+ */
312
313
  function _warnIfUsingStrippedFeatureFlags(FEATURES, featuresWereStripped) {
313
314
  if (featuresWereStripped) {
314
315
  Ember['default'].warn("Ember.ENV.ENABLE_ALL_FEATURES is only available in canary builds.", !Ember['default'].ENV.ENABLE_ALL_FEATURES);
@@ -811,150 +812,6 @@ enifed('ember-metal/binding', ['exports', 'ember-metal/core', 'ember-metal/prope
811
812
  exports.oneWay = oneWay;
812
813
  exports.Binding = Binding;
813
814
 
814
- /**
815
- An `Ember.Binding` connects the properties of two objects so that whenever
816
- the value of one property changes, the other property will be changed also.
817
-
818
- ## Automatic Creation of Bindings with `/^*Binding/`-named Properties
819
-
820
- You do not usually create Binding objects directly but instead describe
821
- bindings in your class or object definition using automatic binding
822
- detection.
823
-
824
- Properties ending in a `Binding` suffix will be converted to `Ember.Binding`
825
- instances. The value of this property should be a string representing a path
826
- to another object or a custom binding instance created using Binding helpers
827
- (see "One Way Bindings"):
828
-
829
- ```
830
- valueBinding: "MyApp.someController.title"
831
- ```
832
-
833
- This will create a binding from `MyApp.someController.title` to the `value`
834
- property of your object instance automatically. Now the two values will be
835
- kept in sync.
836
-
837
- ## One Way Bindings
838
-
839
- One especially useful binding customization you can use is the `oneWay()`
840
- helper. This helper tells Ember that you are only interested in
841
- receiving changes on the object you are binding from. For example, if you
842
- are binding to a preference and you want to be notified if the preference
843
- has changed, but your object will not be changing the preference itself, you
844
- could do:
845
-
846
- ```
847
- bigTitlesBinding: Ember.Binding.oneWay("MyApp.preferencesController.bigTitles")
848
- ```
849
-
850
- This way if the value of `MyApp.preferencesController.bigTitles` changes the
851
- `bigTitles` property of your object will change also. However, if you
852
- change the value of your `bigTitles` property, it will not update the
853
- `preferencesController`.
854
-
855
- One way bindings are almost twice as fast to setup and twice as fast to
856
- execute because the binding only has to worry about changes to one side.
857
-
858
- You should consider using one way bindings anytime you have an object that
859
- may be created frequently and you do not intend to change a property; only
860
- to monitor it for changes (such as in the example above).
861
-
862
- ## Adding Bindings Manually
863
-
864
- All of the examples above show you how to configure a custom binding, but the
865
- result of these customizations will be a binding template, not a fully active
866
- Binding instance. The binding will actually become active only when you
867
- instantiate the object the binding belongs to. It is useful however, to
868
- understand what actually happens when the binding is activated.
869
-
870
- For a binding to function it must have at least a `from` property and a `to`
871
- property. The `from` property path points to the object/key that you want to
872
- bind from while the `to` path points to the object/key you want to bind to.
873
-
874
- When you define a custom binding, you are usually describing the property
875
- you want to bind from (such as `MyApp.someController.value` in the examples
876
- above). When your object is created, it will automatically assign the value
877
- you want to bind `to` based on the name of your binding key. In the
878
- examples above, during init, Ember objects will effectively call
879
- something like this on your binding:
880
-
881
- ```javascript
882
- binding = Ember.Binding.from("valueBinding").to("value");
883
- ```
884
-
885
- This creates a new binding instance based on the template you provide, and
886
- sets the to path to the `value` property of the new object. Now that the
887
- binding is fully configured with a `from` and a `to`, it simply needs to be
888
- connected to become active. This is done through the `connect()` method:
889
-
890
- ```javascript
891
- binding.connect(this);
892
- ```
893
-
894
- Note that when you connect a binding you pass the object you want it to be
895
- connected to. This object will be used as the root for both the from and
896
- to side of the binding when inspecting relative paths. This allows the
897
- binding to be automatically inherited by subclassed objects as well.
898
-
899
- This also allows you to bind between objects using the paths you declare in
900
- `from` and `to`:
901
-
902
- ```javascript
903
- // Example 1
904
- binding = Ember.Binding.from("App.someObject.value").to("value");
905
- binding.connect(this);
906
-
907
- // Example 2
908
- binding = Ember.Binding.from("parentView.value").to("App.someObject.value");
909
- binding.connect(this);
910
- ```
911
-
912
- Now that the binding is connected, it will observe both the from and to side
913
- and relay changes.
914
-
915
- If you ever needed to do so (you almost never will, but it is useful to
916
- understand this anyway), you could manually create an active binding by
917
- using the `Ember.bind()` helper method. (This is the same method used by
918
- to setup your bindings on objects):
919
-
920
- ```javascript
921
- Ember.bind(MyApp.anotherObject, "value", "MyApp.someController.value");
922
- ```
923
-
924
- Both of these code fragments have the same effect as doing the most friendly
925
- form of binding creation like so:
926
-
927
- ```javascript
928
- MyApp.anotherObject = Ember.Object.create({
929
- valueBinding: "MyApp.someController.value",
930
-
931
- // OTHER CODE FOR THIS OBJECT...
932
- });
933
- ```
934
-
935
- Ember's built in binding creation method makes it easy to automatically
936
- create bindings for you. You should always use the highest-level APIs
937
- available, even if you understand how it works underneath.
938
-
939
- @class Binding
940
- @namespace Ember
941
- @since Ember 0.9
942
- */
943
- // Ember.Binding = Binding; ES6TODO: where to put this?
944
-
945
- /**
946
- Global helper method to create a new binding. Just pass the root object
947
- along with a `to` and `from` path to create and connect the binding.
948
-
949
- @method bind
950
- @for Ember
951
- @param {Object} obj The root object of the transform.
952
- @param {String} to The path to the 'to' side of the binding.
953
- Must be relative to obj.
954
- @param {String} from The path to the 'from' side of the binding.
955
- Must be relative to obj or a global path.
956
- @return {Ember.Binding} binding instance
957
- */
958
815
  Ember['default'].LOG_BINDINGS = false || !!Ember['default'].ENV.LOG_BINDINGS;
959
816
 
960
817
  /**
@@ -1242,10 +1099,164 @@ enifed('ember-metal/binding', ['exports', 'ember-metal/core', 'ember-metal/prope
1242
1099
  }
1243
1100
 
1244
1101
  });
1102
+ /**
1103
+ An `Ember.Binding` connects the properties of two objects so that whenever
1104
+ the value of one property changes, the other property will be changed also.
1105
+
1106
+ ## Automatic Creation of Bindings with `/^*Binding/`-named Properties
1107
+
1108
+ You do not usually create Binding objects directly but instead describe
1109
+ bindings in your class or object definition using automatic binding
1110
+ detection.
1111
+
1112
+ Properties ending in a `Binding` suffix will be converted to `Ember.Binding`
1113
+ instances. The value of this property should be a string representing a path
1114
+ to another object or a custom binding instance created using Binding helpers
1115
+ (see "One Way Bindings"):
1116
+
1117
+ ```
1118
+ valueBinding: "MyApp.someController.title"
1119
+ ```
1120
+
1121
+ This will create a binding from `MyApp.someController.title` to the `value`
1122
+ property of your object instance automatically. Now the two values will be
1123
+ kept in sync.
1124
+
1125
+ ## One Way Bindings
1126
+
1127
+ One especially useful binding customization you can use is the `oneWay()`
1128
+ helper. This helper tells Ember that you are only interested in
1129
+ receiving changes on the object you are binding from. For example, if you
1130
+ are binding to a preference and you want to be notified if the preference
1131
+ has changed, but your object will not be changing the preference itself, you
1132
+ could do:
1133
+
1134
+ ```
1135
+ bigTitlesBinding: Ember.Binding.oneWay("MyApp.preferencesController.bigTitles")
1136
+ ```
1137
+
1138
+ This way if the value of `MyApp.preferencesController.bigTitles` changes the
1139
+ `bigTitles` property of your object will change also. However, if you
1140
+ change the value of your `bigTitles` property, it will not update the
1141
+ `preferencesController`.
1142
+
1143
+ One way bindings are almost twice as fast to setup and twice as fast to
1144
+ execute because the binding only has to worry about changes to one side.
1145
+
1146
+ You should consider using one way bindings anytime you have an object that
1147
+ may be created frequently and you do not intend to change a property; only
1148
+ to monitor it for changes (such as in the example above).
1149
+
1150
+ ## Adding Bindings Manually
1151
+
1152
+ All of the examples above show you how to configure a custom binding, but the
1153
+ result of these customizations will be a binding template, not a fully active
1154
+ Binding instance. The binding will actually become active only when you
1155
+ instantiate the object the binding belongs to. It is useful however, to
1156
+ understand what actually happens when the binding is activated.
1157
+
1158
+ For a binding to function it must have at least a `from` property and a `to`
1159
+ property. The `from` property path points to the object/key that you want to
1160
+ bind from while the `to` path points to the object/key you want to bind to.
1161
+
1162
+ When you define a custom binding, you are usually describing the property
1163
+ you want to bind from (such as `MyApp.someController.value` in the examples
1164
+ above). When your object is created, it will automatically assign the value
1165
+ you want to bind `to` based on the name of your binding key. In the
1166
+ examples above, during init, Ember objects will effectively call
1167
+ something like this on your binding:
1168
+
1169
+ ```javascript
1170
+ binding = Ember.Binding.from("valueBinding").to("value");
1171
+ ```
1172
+
1173
+ This creates a new binding instance based on the template you provide, and
1174
+ sets the to path to the `value` property of the new object. Now that the
1175
+ binding is fully configured with a `from` and a `to`, it simply needs to be
1176
+ connected to become active. This is done through the `connect()` method:
1177
+
1178
+ ```javascript
1179
+ binding.connect(this);
1180
+ ```
1181
+
1182
+ Note that when you connect a binding you pass the object you want it to be
1183
+ connected to. This object will be used as the root for both the from and
1184
+ to side of the binding when inspecting relative paths. This allows the
1185
+ binding to be automatically inherited by subclassed objects as well.
1186
+
1187
+ This also allows you to bind between objects using the paths you declare in
1188
+ `from` and `to`:
1189
+
1190
+ ```javascript
1191
+ // Example 1
1192
+ binding = Ember.Binding.from("App.someObject.value").to("value");
1193
+ binding.connect(this);
1194
+
1195
+ // Example 2
1196
+ binding = Ember.Binding.from("parentView.value").to("App.someObject.value");
1197
+ binding.connect(this);
1198
+ ```
1199
+
1200
+ Now that the binding is connected, it will observe both the from and to side
1201
+ and relay changes.
1202
+
1203
+ If you ever needed to do so (you almost never will, but it is useful to
1204
+ understand this anyway), you could manually create an active binding by
1205
+ using the `Ember.bind()` helper method. (This is the same method used by
1206
+ to setup your bindings on objects):
1207
+
1208
+ ```javascript
1209
+ Ember.bind(MyApp.anotherObject, "value", "MyApp.someController.value");
1210
+ ```
1211
+
1212
+ Both of these code fragments have the same effect as doing the most friendly
1213
+ form of binding creation like so:
1214
+
1215
+ ```javascript
1216
+ MyApp.anotherObject = Ember.Object.create({
1217
+ valueBinding: "MyApp.someController.value",
1218
+
1219
+ // OTHER CODE FOR THIS OBJECT...
1220
+ });
1221
+ ```
1222
+
1223
+ Ember's built in binding creation method makes it easy to automatically
1224
+ create bindings for you. You should always use the highest-level APIs
1225
+ available, even if you understand how it works underneath.
1226
+
1227
+ @class Binding
1228
+ @namespace Ember
1229
+ @since Ember 0.9
1230
+ */
1231
+ // Ember.Binding = Binding; ES6TODO: where to put this?
1232
+
1233
+ /**
1234
+ Global helper method to create a new binding. Just pass the root object
1235
+ along with a `to` and `from` path to create and connect the binding.
1236
+
1237
+ @method bind
1238
+ @for Ember
1239
+ @param {Object} obj The root object of the transform.
1240
+ @param {String} to The path to the 'to' side of the binding.
1241
+ Must be relative to obj.
1242
+ @param {String} from The path to the 'from' side of the binding.
1243
+ Must be relative to obj or a global path.
1244
+ @return {Ember.Binding} binding instance
1245
+ */
1245
1246
  function bind(obj, to, from) {
1246
1247
  return new Binding(to, from).connect(obj);
1247
1248
  }
1248
1249
 
1250
+ /**
1251
+ @method oneWay
1252
+ @for Ember
1253
+ @param {Object} obj The root object of the transform.
1254
+ @param {String} to The path to the 'to' side of the binding.
1255
+ Must be relative to obj.
1256
+ @param {String} from The path to the 'from' side of the binding.
1257
+ Must be relative to obj or a global path.
1258
+ @return {Ember.Binding} binding instance
1259
+ */
1249
1260
  function oneWay(obj, to, from) {
1250
1261
  return new Binding(to, from).oneWay().connect(obj);
1251
1262
  }
@@ -1319,9 +1330,6 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
1319
1330
  exports.removeChainWatcher = removeChainWatcher;
1320
1331
  exports.ChainNode = ChainNode;
1321
1332
 
1322
- // attempts to add the pendingQueue chains again. If some of them end up
1323
- // back in the queue and reschedule is true, schedules a timeout to try
1324
- // again.
1325
1333
  var warn = Ember['default'].warn;
1326
1334
  var FIRST_KEY = /^([^\.]+)/;
1327
1335
 
@@ -1334,6 +1342,11 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
1334
1342
  }
1335
1343
 
1336
1344
  var pendingQueue = [];
1345
+
1346
+ // attempts to add the pendingQueue chains again. If some of them end up
1347
+ // back in the queue and reschedule is true, schedules a timeout to try
1348
+ // again.
1349
+
1337
1350
  function flushPendingChains() {
1338
1351
  if (pendingQueue.length === 0) {
1339
1352
  return;
@@ -1815,24 +1828,23 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/property_set', 'ember-me
1815
1828
  */
1816
1829
  function ComputedProperty(config, opts) {
1817
1830
  this.isDescriptor = true;
1818
-
1819
- if (typeof config === "function") {
1820
- config.__ember_arity = config.length;
1821
- this._getter = config;
1822
- if (config.__ember_arity > 1) {
1823
- Ember.deprecate("Using the same function as getter and setter is deprecated.", false, {
1824
- url: "http://emberjs.com/deprecations/v1.x/#toc_computed-properties-with-a-shared-getter-and-setter"
1825
- });
1826
- this._setter = config;
1827
- }
1828
- } else {
1829
- this._getter = config.get;
1830
- this._setter = config.set;
1831
- if (this._setter && this._setter.__ember_arity === undefined) {
1832
- this._setter.__ember_arity = this._setter.length;
1833
- }
1831
+ if (typeof config === "function") {
1832
+ config.__ember_arity = config.length;
1833
+ this._getter = config;
1834
+ if (config.__ember_arity > 1) {
1835
+ Ember.deprecate("Using the same function as getter and setter is deprecated.", false, {
1836
+ url: "http://emberjs.com/deprecations/v1.x/#toc_deprecate-using-the-same-function-as-getter-and-setter-in-computed-properties"
1837
+ });
1838
+ this._setter = config;
1834
1839
  }
1835
-
1840
+ } else {
1841
+ this._getter = config.get;
1842
+ this._setter = config.set;
1843
+ if (this._setter && this._setter.__ember_arity === undefined) {
1844
+ this._setter.__ember_arity = this._setter.length;
1845
+ }
1846
+ }
1847
+
1836
1848
  this._dependentKeys = undefined;
1837
1849
  this._suspended = undefined;
1838
1850
  this._meta = undefined;
@@ -2282,8 +2294,7 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/property_set', 'ember-me
2282
2294
  }
2283
2295
 
2284
2296
  var cp = new ComputedProperty(func);
2285
- // jscs:disable
2286
-
2297
+
2287
2298
  if (args) {
2288
2299
  cp.property.apply(cp, args);
2289
2300
  }
@@ -2356,6 +2367,28 @@ enifed('ember-metal/computed_macros', ['exports', 'ember-metal/core', 'ember-met
2356
2367
  exports.defaultTo = defaultTo;
2357
2368
  exports.deprecatingAlias = deprecatingAlias;
2358
2369
 
2370
+ function getProperties(self, propertyNames) {
2371
+ var ret = {};
2372
+ for (var i = 0; i < propertyNames.length; i++) {
2373
+ ret[propertyNames[i]] = property_get.get(self, propertyNames[i]);
2374
+ }
2375
+ return ret;
2376
+ }
2377
+
2378
+ function generateComputedWithProperties(macro) {
2379
+ return function () {
2380
+ for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
2381
+ properties[_key] = arguments[_key];
2382
+ }
2383
+
2384
+ var computedFunc = computed.computed(function () {
2385
+ return macro.apply(this, [getProperties(this, properties)]);
2386
+ });
2387
+
2388
+ return computedFunc.property.apply(computedFunc, properties);
2389
+ };
2390
+ }
2391
+
2359
2392
  /**
2360
2393
  A computed property that returns true if the value of the dependent
2361
2394
  property is null, an empty string, empty array, or empty function.
@@ -2383,89 +2416,332 @@ enifed('ember-metal/computed_macros', ['exports', 'ember-metal/core', 'ember-met
2383
2416
  @return {Ember.ComputedProperty} computed property which negate
2384
2417
  the original value for property
2385
2418
  */
2386
- function getProperties(self, propertyNames) {
2387
- var ret = {};
2388
- for (var i = 0; i < propertyNames.length; i++) {
2389
- ret[propertyNames[i]] = property_get.get(self, propertyNames[i]);
2390
- }
2391
- return ret;
2392
- }
2393
-
2394
- function generateComputedWithProperties(macro) {
2395
- return function () {
2396
- for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
2397
- properties[_key] = arguments[_key];
2398
- }
2399
-
2400
- var computedFunc = computed.computed(function () {
2401
- return macro.apply(this, [getProperties(this, properties)]);
2402
- });
2403
-
2404
- return computedFunc.property.apply(computedFunc, properties);
2405
- };
2406
- }
2407
2419
  function empty(dependentKey) {
2408
2420
  return computed.computed(dependentKey + ".length", function () {
2409
2421
  return isEmpty['default'](property_get.get(this, dependentKey));
2410
2422
  });
2411
2423
  }
2412
2424
 
2425
+ /**
2426
+ A computed property that returns true if the value of the dependent
2427
+ property is NOT null, an empty string, empty array, or empty function.
2428
+
2429
+ Example
2430
+
2431
+ ```javascript
2432
+ var Hamster = Ember.Object.extend({
2433
+ hasStuff: Ember.computed.notEmpty('backpack')
2434
+ });
2435
+
2436
+ var hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });
2437
+
2438
+ hamster.get('hasStuff'); // true
2439
+ hamster.get('backpack').clear(); // []
2440
+ hamster.get('hasStuff'); // false
2441
+ ```
2442
+
2443
+ @method notEmpty
2444
+ @for Ember.computed
2445
+ @param {String} dependentKey
2446
+ @return {Ember.ComputedProperty} computed property which returns true if
2447
+ original value for property is not empty.
2448
+ */
2413
2449
  function notEmpty(dependentKey) {
2414
2450
  return computed.computed(dependentKey + ".length", function () {
2415
2451
  return !isEmpty['default'](property_get.get(this, dependentKey));
2416
2452
  });
2417
2453
  }
2418
2454
 
2455
+ /**
2456
+ A computed property that returns true if the value of the dependent
2457
+ property is null or undefined. This avoids errors from JSLint complaining
2458
+ about use of ==, which can be technically confusing.
2459
+
2460
+ Example
2461
+
2462
+ ```javascript
2463
+ var Hamster = Ember.Object.extend({
2464
+ isHungry: Ember.computed.none('food')
2465
+ });
2466
+
2467
+ var hamster = Hamster.create();
2468
+
2469
+ hamster.get('isHungry'); // true
2470
+ hamster.set('food', 'Banana');
2471
+ hamster.get('isHungry'); // false
2472
+ hamster.set('food', null);
2473
+ hamster.get('isHungry'); // true
2474
+ ```
2475
+
2476
+ @method none
2477
+ @for Ember.computed
2478
+ @param {String} dependentKey
2479
+ @return {Ember.ComputedProperty} computed property which
2480
+ returns true if original value for property is null or undefined.
2481
+ */
2419
2482
  function none(dependentKey) {
2420
2483
  return computed.computed(dependentKey, function () {
2421
2484
  return isNone['default'](property_get.get(this, dependentKey));
2422
2485
  });
2423
2486
  }
2424
2487
 
2488
+ /**
2489
+ A computed property that returns the inverse boolean value
2490
+ of the original value for the dependent property.
2491
+
2492
+ Example
2493
+
2494
+ ```javascript
2495
+ var User = Ember.Object.extend({
2496
+ isAnonymous: Ember.computed.not('loggedIn')
2497
+ });
2498
+
2499
+ var user = User.create({loggedIn: false});
2500
+
2501
+ user.get('isAnonymous'); // true
2502
+ user.set('loggedIn', true);
2503
+ user.get('isAnonymous'); // false
2504
+ ```
2505
+
2506
+ @method not
2507
+ @for Ember.computed
2508
+ @param {String} dependentKey
2509
+ @return {Ember.ComputedProperty} computed property which returns
2510
+ inverse of the original value for property
2511
+ */
2425
2512
  function not(dependentKey) {
2426
2513
  return computed.computed(dependentKey, function () {
2427
2514
  return !property_get.get(this, dependentKey);
2428
2515
  });
2429
2516
  }
2430
2517
 
2518
+ /**
2519
+ A computed property that converts the provided dependent property
2520
+ into a boolean value.
2521
+
2522
+ ```javascript
2523
+ var Hamster = Ember.Object.extend({
2524
+ hasBananas: Ember.computed.bool('numBananas')
2525
+ });
2526
+
2527
+ var hamster = Hamster.create();
2528
+
2529
+ hamster.get('hasBananas'); // false
2530
+ hamster.set('numBananas', 0);
2531
+ hamster.get('hasBananas'); // false
2532
+ hamster.set('numBananas', 1);
2533
+ hamster.get('hasBananas'); // true
2534
+ hamster.set('numBananas', null);
2535
+ hamster.get('hasBananas'); // false
2536
+ ```
2537
+
2538
+ @method bool
2539
+ @for Ember.computed
2540
+ @param {String} dependentKey
2541
+ @return {Ember.ComputedProperty} computed property which converts
2542
+ to boolean the original value for property
2543
+ */
2431
2544
  function bool(dependentKey) {
2432
2545
  return computed.computed(dependentKey, function () {
2433
2546
  return !!property_get.get(this, dependentKey);
2434
2547
  });
2435
2548
  }
2436
2549
 
2550
+ /**
2551
+ A computed property which matches the original value for the
2552
+ dependent property against a given RegExp, returning `true`
2553
+ if they values matches the RegExp and `false` if it does not.
2554
+
2555
+ Example
2556
+
2557
+ ```javascript
2558
+ var User = Ember.Object.extend({
2559
+ hasValidEmail: Ember.computed.match('email', /^.+@.+\..+$/)
2560
+ });
2561
+
2562
+ var user = User.create({loggedIn: false});
2563
+
2564
+ user.get('hasValidEmail'); // false
2565
+ user.set('email', '');
2566
+ user.get('hasValidEmail'); // false
2567
+ user.set('email', 'ember_hamster@example.com');
2568
+ user.get('hasValidEmail'); // true
2569
+ ```
2570
+
2571
+ @method match
2572
+ @for Ember.computed
2573
+ @param {String} dependentKey
2574
+ @param {RegExp} regexp
2575
+ @return {Ember.ComputedProperty} computed property which match
2576
+ the original value for property against a given RegExp
2577
+ */
2437
2578
  function match(dependentKey, regexp) {
2438
2579
  return computed.computed(dependentKey, function () {
2439
2580
  var value = property_get.get(this, dependentKey);
2440
2581
 
2441
2582
  return typeof value === "string" ? regexp.test(value) : false;
2442
2583
  });
2443
- }
2584
+ }
2585
+
2586
+ /**
2587
+ A computed property that returns true if the provided dependent property
2588
+ is equal to the given value.
2589
+
2590
+ Example
2591
+
2592
+ ```javascript
2593
+ var Hamster = Ember.Object.extend({
2594
+ napTime: Ember.computed.equal('state', 'sleepy')
2595
+ });
2596
+
2597
+ var hamster = Hamster.create();
2444
2598
 
2599
+ hamster.get('napTime'); // false
2600
+ hamster.set('state', 'sleepy');
2601
+ hamster.get('napTime'); // true
2602
+ hamster.set('state', 'hungry');
2603
+ hamster.get('napTime'); // false
2604
+ ```
2605
+
2606
+ @method equal
2607
+ @for Ember.computed
2608
+ @param {String} dependentKey
2609
+ @param {String|Number|Object} value
2610
+ @return {Ember.ComputedProperty} computed property which returns true if
2611
+ the original value for property is equal to the given value.
2612
+ */
2445
2613
  function equal(dependentKey, value) {
2446
2614
  return computed.computed(dependentKey, function () {
2447
2615
  return property_get.get(this, dependentKey) === value;
2448
2616
  });
2449
2617
  }
2450
2618
 
2619
+ /**
2620
+ A computed property that returns true if the provided dependent property
2621
+ is greater than the provided value.
2622
+
2623
+ Example
2624
+
2625
+ ```javascript
2626
+ var Hamster = Ember.Object.extend({
2627
+ hasTooManyBananas: Ember.computed.gt('numBananas', 10)
2628
+ });
2629
+
2630
+ var hamster = Hamster.create();
2631
+
2632
+ hamster.get('hasTooManyBananas'); // false
2633
+ hamster.set('numBananas', 3);
2634
+ hamster.get('hasTooManyBananas'); // false
2635
+ hamster.set('numBananas', 11);
2636
+ hamster.get('hasTooManyBananas'); // true
2637
+ ```
2638
+
2639
+ @method gt
2640
+ @for Ember.computed
2641
+ @param {String} dependentKey
2642
+ @param {Number} value
2643
+ @return {Ember.ComputedProperty} computed property which returns true if
2644
+ the original value for property is greater than given value.
2645
+ */
2451
2646
  function gt(dependentKey, value) {
2452
2647
  return computed.computed(dependentKey, function () {
2453
2648
  return property_get.get(this, dependentKey) > value;
2454
2649
  });
2455
2650
  }
2456
2651
 
2652
+ /**
2653
+ A computed property that returns true if the provided dependent property
2654
+ is greater than or equal to the provided value.
2655
+
2656
+ Example
2657
+
2658
+ ```javascript
2659
+ var Hamster = Ember.Object.extend({
2660
+ hasTooManyBananas: Ember.computed.gte('numBananas', 10)
2661
+ });
2662
+
2663
+ var hamster = Hamster.create();
2664
+
2665
+ hamster.get('hasTooManyBananas'); // false
2666
+ hamster.set('numBananas', 3);
2667
+ hamster.get('hasTooManyBananas'); // false
2668
+ hamster.set('numBananas', 10);
2669
+ hamster.get('hasTooManyBananas'); // true
2670
+ ```
2671
+
2672
+ @method gte
2673
+ @for Ember.computed
2674
+ @param {String} dependentKey
2675
+ @param {Number} value
2676
+ @return {Ember.ComputedProperty} computed property which returns true if
2677
+ the original value for property is greater or equal then given value.
2678
+ */
2457
2679
  function gte(dependentKey, value) {
2458
2680
  return computed.computed(dependentKey, function () {
2459
2681
  return property_get.get(this, dependentKey) >= value;
2460
2682
  });
2461
2683
  }
2462
2684
 
2685
+ /**
2686
+ A computed property that returns true if the provided dependent property
2687
+ is less than the provided value.
2688
+
2689
+ Example
2690
+
2691
+ ```javascript
2692
+ var Hamster = Ember.Object.extend({
2693
+ needsMoreBananas: Ember.computed.lt('numBananas', 3)
2694
+ });
2695
+
2696
+ var hamster = Hamster.create();
2697
+
2698
+ hamster.get('needsMoreBananas'); // true
2699
+ hamster.set('numBananas', 3);
2700
+ hamster.get('needsMoreBananas'); // false
2701
+ hamster.set('numBananas', 2);
2702
+ hamster.get('needsMoreBananas'); // true
2703
+ ```
2704
+
2705
+ @method lt
2706
+ @for Ember.computed
2707
+ @param {String} dependentKey
2708
+ @param {Number} value
2709
+ @return {Ember.ComputedProperty} computed property which returns true if
2710
+ the original value for property is less then given value.
2711
+ */
2463
2712
  function lt(dependentKey, value) {
2464
2713
  return computed.computed(dependentKey, function () {
2465
2714
  return property_get.get(this, dependentKey) < value;
2466
2715
  });
2467
2716
  }
2468
2717
 
2718
+ /**
2719
+ A computed property that returns true if the provided dependent property
2720
+ is less than or equal to the provided value.
2721
+
2722
+ Example
2723
+
2724
+ ```javascript
2725
+ var Hamster = Ember.Object.extend({
2726
+ needsMoreBananas: Ember.computed.lte('numBananas', 3)
2727
+ });
2728
+
2729
+ var hamster = Hamster.create();
2730
+
2731
+ hamster.get('needsMoreBananas'); // true
2732
+ hamster.set('numBananas', 5);
2733
+ hamster.get('needsMoreBananas'); // false
2734
+ hamster.set('numBananas', 3);
2735
+ hamster.get('needsMoreBananas'); // true
2736
+ ```
2737
+
2738
+ @method lte
2739
+ @for Ember.computed
2740
+ @param {String} dependentKey
2741
+ @param {Number} value
2742
+ @return {Ember.ComputedProperty} computed property which returns true if
2743
+ the original value for property is less or equal than given value.
2744
+ */
2469
2745
  function lte(dependentKey, value) {
2470
2746
  return computed.computed(dependentKey, function () {
2471
2747
  return property_get.get(this, dependentKey) <= value;
@@ -2541,14 +2817,88 @@ enifed('ember-metal/computed_macros', ['exports', 'ember-metal/core', 'ember-met
2541
2817
  }
2542
2818
  }
2543
2819
  return res;
2544
- });function oneWay(dependentKey) {
2820
+ });
2821
+
2822
+ function oneWay(dependentKey) {
2545
2823
  return alias['default'](dependentKey).oneWay();
2546
2824
  }
2547
2825
 
2826
+ /**
2827
+ This is a more semantically meaningful alias of `computed.oneWay`,
2828
+ whose name is somewhat ambiguous as to which direction the data flows.
2829
+
2830
+ @method reads
2831
+ @for Ember.computed
2832
+ @param {String} dependentKey
2833
+ @return {Ember.ComputedProperty} computed property which creates a
2834
+ one way computed property to the original value for property.
2835
+ */
2836
+
2837
+ /**
2838
+ Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
2839
+ a readOnly one way binding. Very often when using `computed.oneWay` one does
2840
+ not also want changes to propagate back up, as they will replace the value.
2841
+
2842
+ This prevents the reverse flow, and also throws an exception when it occurs.
2843
+
2844
+ Example
2845
+
2846
+ ```javascript
2847
+ var User = Ember.Object.extend({
2848
+ firstName: null,
2849
+ lastName: null,
2850
+ nickName: Ember.computed.readOnly('firstName')
2851
+ });
2852
+
2853
+ var teddy = User.create({
2854
+ firstName: 'Teddy',
2855
+ lastName: 'Zeenny'
2856
+ });
2857
+
2858
+ teddy.get('nickName'); // 'Teddy'
2859
+ teddy.set('nickName', 'TeddyBear'); // throws Exception
2860
+ // throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
2861
+ teddy.get('firstName'); // 'Teddy'
2862
+ ```
2863
+
2864
+ @method readOnly
2865
+ @for Ember.computed
2866
+ @param {String} dependentKey
2867
+ @return {Ember.ComputedProperty} computed property which creates a
2868
+ one way computed property to the original value for property.
2869
+ @since 1.5.0
2870
+ */
2548
2871
  function readOnly(dependentKey) {
2549
2872
  return alias['default'](dependentKey).readOnly();
2550
2873
  }
2551
2874
 
2875
+ /**
2876
+ A computed property that acts like a standard getter and setter,
2877
+ but returns the value at the provided `defaultPath` if the
2878
+ property itself has not been set to a value
2879
+
2880
+ Example
2881
+
2882
+ ```javascript
2883
+ var Hamster = Ember.Object.extend({
2884
+ wishList: Ember.computed.defaultTo('favoriteFood')
2885
+ });
2886
+
2887
+ var hamster = Hamster.create({ favoriteFood: 'Banana' });
2888
+
2889
+ hamster.get('wishList'); // 'Banana'
2890
+ hamster.set('wishList', 'More Unit Tests');
2891
+ hamster.get('wishList'); // 'More Unit Tests'
2892
+ hamster.get('favoriteFood'); // 'Banana'
2893
+ ```
2894
+
2895
+ @method defaultTo
2896
+ @for Ember.computed
2897
+ @param {String} defaultPath
2898
+ @return {Ember.ComputedProperty} computed property which acts like
2899
+ a standard getter and setter, but defaults to the value from `defaultPath`.
2900
+ @deprecated Use `Ember.computed.oneWay` or custom CP with default instead.
2901
+ */
2552
2902
  function defaultTo(defaultPath) {
2553
2903
  return computed.computed({
2554
2904
  get: function (key) {
@@ -2563,6 +2913,19 @@ enifed('ember-metal/computed_macros', ['exports', 'ember-metal/core', 'ember-met
2563
2913
  });
2564
2914
  }
2565
2915
 
2916
+ /**
2917
+ Creates a new property that is an alias for another property
2918
+ on an object. Calls to `get` or `set` this property behave as
2919
+ though they were called on the original property, but also
2920
+ print a deprecation warning.
2921
+
2922
+ @method deprecatingAlias
2923
+ @for Ember.computed
2924
+ @param {String} dependentKey
2925
+ @return {Ember.ComputedProperty} computed property which creates an
2926
+ alias with a deprecation to the original value for property.
2927
+ @since 1.7.0
2928
+ */
2566
2929
  function deprecatingAlias(dependentKey) {
2567
2930
  return computed.computed(dependentKey, {
2568
2931
  get: function (key) {
@@ -2597,23 +2960,21 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2597
2960
  */
2598
2961
 
2599
2962
  /**
2600
- All Ember methods and functions are defined inside of this namespace. You
2601
- generally should not add new properties to this namespace as it may be
2602
- overwritten by future versions of Ember.
2963
+ This namespace contains all Ember methods and functions. Future versions of
2964
+ Ember may overwrite this namespace and therefore, you should avoid adding any
2965
+ new properties.
2603
2966
 
2604
2967
  You can also use the shorthand `Em` instead of `Ember`.
2605
2968
 
2606
- Ember-Runtime is a framework that provides core functions for Ember including
2607
- cross-platform functions, support for property observing and objects. Its
2608
- focus is on small size and performance. You can use this in place of or
2609
- along-side other cross-platform libraries such as jQuery.
2610
-
2611
- The core Runtime framework is based on the jQuery API with a number of
2612
- performance optimizations.
2969
+ At the heart of Ember is Ember-Runtime, a set of core functions that provide
2970
+ cross-platform compatibility and object property observing. Ember-Runtime is
2971
+ small and performance-focused so you can use it alongside other
2972
+ cross-platform libraries such as jQuery. For more details, see
2973
+ [Ember-Runtime](http://emberjs.com/api/modules/ember-runtime.html).
2613
2974
 
2614
2975
  @class Ember
2615
2976
  @static
2616
- @version 1.13.0-beta.1
2977
+ @version 1.13.0-beta.2
2617
2978
  */
2618
2979
 
2619
2980
  if ('undefined' === typeof Ember) {
@@ -2640,19 +3001,21 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2640
3001
  };
2641
3002
 
2642
3003
  /**
3004
+ The semantic version.
3005
+
2643
3006
  @property VERSION
2644
3007
  @type String
2645
- @default '1.13.0-beta.1'
3008
+ @default '1.13.0-beta.2'
2646
3009
  @static
2647
3010
  */
2648
- Ember.VERSION = '1.13.0-beta.1';
3011
+ Ember.VERSION = '1.13.0-beta.2';
2649
3012
 
2650
3013
  /**
2651
- Standard environmental variables. You can define these in a global `EmberENV`
2652
- variable before loading Ember to control various configuration settings.
2653
-
2654
- For backwards compatibility with earlier versions of Ember the global `ENV`
2655
- variable will be used if `EmberENV` is not defined.
3014
+ The hash of environment variables used to control various configuration
3015
+ settings. To specify your own or override default settings, add the
3016
+ desired properties to a global hash named `EmberENV` (or `ENV` for
3017
+ backwards compatibility with earlier versions of Ember). The `EmberENV`
3018
+ hash must be created before loading Ember.
2656
3019
 
2657
3020
  @property ENV
2658
3021
  @type Hash
@@ -2677,16 +3040,18 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2677
3040
  }
2678
3041
 
2679
3042
  /**
2680
- Hash of enabled Canary features. Add to this before creating your application.
3043
+ The hash of enabled Canary features. Add to this, any canary features
3044
+ before creating your application.
2681
3045
 
2682
- You can also define `EmberENV.FEATURES` if you need to enable features flagged at runtime.
3046
+ Alternatively (and recommended), you can also define `EmberENV.FEATURES`
3047
+ if you need to enable features flagged at runtime.
2683
3048
 
2684
3049
  @class FEATURES
2685
3050
  @namespace Ember
2686
3051
  @static
2687
3052
  @since 1.1.0
2688
3053
  */
2689
- Ember.FEATURES = { 'features-stripped-test': false, 'ember-routing-named-substates': true, 'mandatory-setter': true, 'ember-htmlbars-component-generation': true, 'ember-htmlbars-component-helper': true, 'ember-htmlbars-inline-if-helper': true, 'ember-htmlbars-attribute-syntax': true, 'ember-routing-transitioning-classes': true, 'new-computed-syntax': true, 'ember-testing-checkbox-helpers': false, 'ember-metal-stream': false, 'ember-application-instance-initializers': true, 'ember-application-initializer-context': true, 'ember-router-willtransition': true, 'ember-application-visit': false, 'ember-views-component-block-info': true, 'ember-routing-core-outlet': false, 'ember-libraries-isregistered': false, 'ember-routing-htmlbars-improved-actions': true }; //jshint ignore:line
3054
+ Ember.FEATURES = { 'features-stripped-test': false, 'ember-routing-named-substates': true, 'mandatory-setter': true, 'ember-htmlbars-component-generation': false, 'ember-htmlbars-component-helper': true, 'ember-htmlbars-inline-if-helper': true, 'ember-htmlbars-attribute-syntax': true, 'ember-routing-transitioning-classes': true, 'ember-testing-checkbox-helpers': false, 'ember-metal-stream': false, 'ember-application-instance-initializers': true, 'ember-application-initializer-context': true, 'ember-router-willtransition': true, 'ember-application-visit': false, 'ember-views-component-block-info': true, 'ember-routing-core-outlet': false, 'ember-libraries-isregistered': false, 'ember-routing-htmlbars-improved-actions': true }; //jshint ignore:line
2690
3055
 
2691
3056
  if (Ember.ENV.FEATURES) {
2692
3057
  for (var feature in Ember.ENV.FEATURES) {
@@ -2697,8 +3062,8 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2697
3062
  }
2698
3063
 
2699
3064
  /**
2700
- Test that a feature is enabled. Parsed by Ember's build tools to leave
2701
- experimental features out of beta/stable builds.
3065
+ Determine whether the specified `feature` is enabled. Used by Ember's
3066
+ build tools to exclude experimental features from beta/stable builds.
2702
3067
 
2703
3068
  You can define the following configuration options:
2704
3069
 
@@ -2707,7 +3072,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2707
3072
  enabled/disabled.
2708
3073
 
2709
3074
  @method isEnabled
2710
- @param {String} feature
3075
+ @param {String} feature The feature to check
2711
3076
  @return {Boolean}
2712
3077
  @for Ember.FEATURES
2713
3078
  @since 1.1.0
@@ -2732,14 +3097,17 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2732
3097
  //
2733
3098
 
2734
3099
  /**
2735
- Determines whether Ember should enhance some built-in object prototypes to
2736
- provide a more friendly API. If enabled, a few methods will be added to
2737
- `Function`, `String`, and `Array`. `Object.prototype` will not be enhanced,
2738
- which is the one that causes most trouble for people.
3100
+ Determines whether Ember should add to `Array`, `Function`, and `String`
3101
+ native object prototypes, a few extra methods in order to provide a more
3102
+ friendly API.
2739
3103
 
2740
- In general we recommend leaving this option set to true since it rarely
2741
- conflicts with other code. If you need to turn it off however, you can
2742
- define an `EmberENV.EXTEND_PROTOTYPES` config to disable it.
3104
+ We generally recommend leaving this option set to true however, if you need
3105
+ to turn it off, you can add the configuration property
3106
+ `EXTEND_PROTOTYPES` to `EmberENV` and set it to `false`.
3107
+
3108
+ Note, when disabled (the default configuration for Ember Addons), you will
3109
+ instead have to access all methods and functions from the Ember
3110
+ namespace.
2743
3111
 
2744
3112
  @property EXTEND_PROTOTYPES
2745
3113
  @type Boolean
@@ -2753,7 +3121,8 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2753
3121
  }
2754
3122
 
2755
3123
  /**
2756
- Determines whether Ember logs a full stack trace during deprecation warnings
3124
+ The `LOG_STACKTRACE_ON_DEPRECATION` property, when true, tells Ember to log
3125
+ a full stack trace during deprecation warnings.
2757
3126
 
2758
3127
  @property LOG_STACKTRACE_ON_DEPRECATION
2759
3128
  @type Boolean
@@ -2762,7 +3131,8 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2762
3131
  Ember.LOG_STACKTRACE_ON_DEPRECATION = Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION !== false;
2763
3132
 
2764
3133
  /**
2765
- Determines whether Ember should add ECMAScript 5 Array shims to older browsers.
3134
+ The `SHIM_ES5` property, when true, tells Ember to add ECMAScript 5 Array
3135
+ shims to older browsers.
2766
3136
 
2767
3137
  @property SHIM_ES5
2768
3138
  @type Boolean
@@ -2771,7 +3141,8 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2771
3141
  Ember.SHIM_ES5 = Ember.ENV.SHIM_ES5 === false ? false : Ember.EXTEND_PROTOTYPES;
2772
3142
 
2773
3143
  /**
2774
- Determines whether Ember logs info about version of used libraries
3144
+ The `LOG_VERSION` property, when true, tells Ember to log versions of all
3145
+ dependent libraries in use.
2775
3146
 
2776
3147
  @property LOG_VERSION
2777
3148
  @type Boolean
@@ -2780,7 +3151,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
2780
3151
  Ember.LOG_VERSION = Ember.ENV.LOG_VERSION === false ? false : true;
2781
3152
 
2782
3153
  /**
2783
- Empty function. Useful for some operations. Always returns `this`.
3154
+ An empty function useful for some operations. Always returns `this`.
2784
3155
 
2785
3156
  @method K
2786
3157
  @private
@@ -2911,18 +3282,6 @@ enifed('ember-metal/deprecate_property', ['exports', 'ember-metal/core', 'ember-
2911
3282
 
2912
3283
  exports.deprecateProperty = deprecateProperty;
2913
3284
 
2914
- /**
2915
- Used internally to allow changing properties in a backwards compatible way, and print a helpful
2916
- deprecation warning.
2917
-
2918
- @method deprecateProperty
2919
- @param {Object} object The object to add the deprecated property to.
2920
- @param {String} deprecatedKey The property to add (and print deprecation warnings upon accessing).
2921
- @param {String} newKey The property that will be aliased.
2922
- @private
2923
- @since 1.7.0
2924
- */
2925
-
2926
3285
  function deprecateProperty(object, deprecatedKey, newKey) {
2927
3286
  function deprecate() {
2928
3287
  Ember['default'].deprecate("Usage of `" + deprecatedKey + "` is deprecated, use `" + newKey + "` instead.");
@@ -2950,12 +3309,6 @@ enifed('ember-metal/dictionary', ['exports', 'ember-metal/platform/create'], fun
2950
3309
  'use strict';
2951
3310
 
2952
3311
 
2953
-
2954
- // the delete is meant to hint at runtimes that this object should remain in
2955
- // dictionary mode. This is clearly a runtime specific hack, but currently it
2956
- // appears worthwhile in some usecases. Please note, these deletes do increase
2957
- // the cost of creation dramatically over a plain Object.create. And as this
2958
- // only makes sense for long-lived dictionaries that aren't instantiated often.
2959
3312
  exports['default'] = makeDictionary;
2960
3313
  function makeDictionary(parent) {
2961
3314
  var dict = create['default'](parent);
@@ -2980,6 +3333,8 @@ enifed('ember-metal/enumerable_utils', ['exports', 'ember-metal/array'], functio
2980
3333
  exports.replace = replace;
2981
3334
  exports.intersection = intersection;
2982
3335
 
3336
+ var splice = Array.prototype.splice;
3337
+
2983
3338
  /**
2984
3339
  * Defines some convenience methods for working with Enumerables.
2985
3340
  * `Ember.EnumerableUtils` uses `Ember.ArrayPolyfills` when necessary.
@@ -3000,29 +3355,89 @@ enifed('ember-metal/enumerable_utils', ['exports', 'ember-metal/array'], functio
3000
3355
  *
3001
3356
  * @return {Array} An array of mapped values.
3002
3357
  */
3003
- var splice = Array.prototype.splice;
3004
3358
  function map(obj, callback, thisArg) {
3005
3359
  return obj.map ? obj.map(callback, thisArg) : ember_metal__array.map.call(obj, callback, thisArg);
3006
3360
  }
3007
3361
 
3362
+ /**
3363
+ * Calls the forEach function on the passed object with a specified callback. This
3364
+ * uses `Ember.ArrayPolyfill`'s-forEach method when necessary.
3365
+ *
3366
+ * @method forEach
3367
+ * @param {Object} obj The object to call forEach on
3368
+ * @param {Function} callback The callback to execute
3369
+ * @param {Object} thisArg Value to use as this when executing *callback*
3370
+ *
3371
+ */
3008
3372
  function forEach(obj, callback, thisArg) {
3009
3373
  return obj.forEach ? obj.forEach(callback, thisArg) : ember_metal__array.forEach.call(obj, callback, thisArg);
3010
3374
  }
3011
3375
 
3376
+ /**
3377
+ * Calls the filter function on the passed object with a specified callback. This
3378
+ * uses `Ember.ArrayPolyfill`'s-filter method when necessary.
3379
+ *
3380
+ * @method filter
3381
+ * @param {Object} obj The object to call filter on
3382
+ * @param {Function} callback The callback to execute
3383
+ * @param {Object} thisArg Value to use as this when executing *callback*
3384
+ *
3385
+ * @return {Array} An array containing the filtered values
3386
+ * @since 1.4.0
3387
+ */
3012
3388
  function filter(obj, callback, thisArg) {
3013
3389
  return obj.filter ? obj.filter(callback, thisArg) : ember_metal__array.filter.call(obj, callback, thisArg);
3014
3390
  }
3015
3391
 
3392
+ /**
3393
+ * Calls the indexOf function on the passed object with a specified callback. This
3394
+ * uses `Ember.ArrayPolyfill`'s-indexOf method when necessary.
3395
+ *
3396
+ * @method indexOf
3397
+ * @param {Object} obj The object to call indexOn on
3398
+ * @param {Function} callback The callback to execute
3399
+ * @param {Object} index The index to start searching from
3400
+ *
3401
+ */
3016
3402
  function indexOf(obj, element, index) {
3017
3403
  return obj.indexOf ? obj.indexOf(element, index) : ember_metal__array.indexOf.call(obj, element, index);
3018
3404
  }
3019
3405
 
3406
+ /**
3407
+ * Returns an array of indexes of the first occurrences of the passed elements
3408
+ * on the passed object.
3409
+ *
3410
+ * ```javascript
3411
+ * var array = [1, 2, 3, 4, 5];
3412
+ * Ember.EnumerableUtils.indexesOf(array, [2, 5]); // [1, 4]
3413
+ *
3414
+ * var fubar = "Fubarr";
3415
+ * Ember.EnumerableUtils.indexesOf(fubar, ['b', 'r']); // [2, 4]
3416
+ * ```
3417
+ *
3418
+ * @method indexesOf
3419
+ * @param {Object} obj The object to check for element indexes
3420
+ * @param {Array} elements The elements to search for on *obj*
3421
+ *
3422
+ * @return {Array} An array of indexes.
3423
+ *
3424
+ */
3020
3425
  function indexesOf(obj, elements) {
3021
3426
  return elements === undefined ? [] : map(elements, function (item) {
3022
3427
  return indexOf(obj, item);
3023
3428
  });
3024
3429
  }
3025
3430
 
3431
+ /**
3432
+ * Adds an object to an array. If the array already includes the object this
3433
+ * method has no effect.
3434
+ *
3435
+ * @method addObject
3436
+ * @param {Array} array The array the passed item should be added to
3437
+ * @param {Object} item The item to add to the passed array
3438
+ *
3439
+ * @return 'undefined'
3440
+ */
3026
3441
  function addObject(array, item) {
3027
3442
  var index = indexOf(array, item);
3028
3443
  if (index === -1) {
@@ -3030,6 +3445,16 @@ enifed('ember-metal/enumerable_utils', ['exports', 'ember-metal/array'], functio
3030
3445
  }
3031
3446
  }
3032
3447
 
3448
+ /**
3449
+ * Removes an object from an array. If the array does not contain the passed
3450
+ * object this method has no effect.
3451
+ *
3452
+ * @method removeObject
3453
+ * @param {Array} array The array to remove the item from.
3454
+ * @param {Object} item The item to remove from the passed array.
3455
+ *
3456
+ * @return 'undefined'
3457
+ */
3033
3458
  function removeObject(array, item) {
3034
3459
  var index = indexOf(array, item);
3035
3460
  if (index !== -1) {
@@ -3063,6 +3488,31 @@ enifed('ember-metal/enumerable_utils', ['exports', 'ember-metal/array'], functio
3063
3488
  return ret;
3064
3489
  }
3065
3490
 
3491
+ /**
3492
+ * Replaces objects in an array with the passed objects.
3493
+ *
3494
+ * ```javascript
3495
+ * var array = [1,2,3];
3496
+ * Ember.EnumerableUtils.replace(array, 1, 2, [4, 5]); // [1, 4, 5]
3497
+ *
3498
+ * var array = [1,2,3];
3499
+ * Ember.EnumerableUtils.replace(array, 1, 1, [4, 5]); // [1, 4, 5, 3]
3500
+ *
3501
+ * var array = [1,2,3];
3502
+ * Ember.EnumerableUtils.replace(array, 10, 1, [4, 5]); // [1, 2, 3, 4, 5]
3503
+ * ```
3504
+ *
3505
+ * @method replace
3506
+ * @param {Array} array The array the objects should be inserted into.
3507
+ * @param {Number} idx Starting index in the array to replace. If *idx* >=
3508
+ * length, then append to the end of the array.
3509
+ * @param {Number} amt Number of elements that should be removed from the array,
3510
+ * starting at *idx*
3511
+ * @param {Array} objects An array of zero or more objects that should be
3512
+ * inserted into the array at *idx*
3513
+ *
3514
+ * @return {Array} The modified array.
3515
+ */
3066
3516
  function replace(array, idx, amt, objects) {
3067
3517
  if (array.replace) {
3068
3518
  return array.replace(idx, amt, objects);
@@ -3071,6 +3521,29 @@ enifed('ember-metal/enumerable_utils', ['exports', 'ember-metal/array'], functio
3071
3521
  }
3072
3522
  }
3073
3523
 
3524
+ /**
3525
+ * Calculates the intersection of two arrays. This method returns a new array
3526
+ * filled with the records that the two passed arrays share with each other.
3527
+ * If there is no intersection, an empty array will be returned.
3528
+ *
3529
+ * ```javascript
3530
+ * var array1 = [1, 2, 3, 4, 5];
3531
+ * var array2 = [1, 3, 5, 6, 7];
3532
+ *
3533
+ * Ember.EnumerableUtils.intersection(array1, array2); // [1, 3, 5]
3534
+ *
3535
+ * var array1 = [1, 2, 3];
3536
+ * var array2 = [4, 5, 6];
3537
+ *
3538
+ * Ember.EnumerableUtils.intersection(array1, array2); // []
3539
+ * ```
3540
+ *
3541
+ * @method intersection
3542
+ * @param {Array} array1 The first array
3543
+ * @param {Array} array2 The second array
3544
+ *
3545
+ * @return {Array} The intersection of the two passed arrays.
3546
+ */
3074
3547
  function intersection(array1, array2) {
3075
3548
  var result = [];
3076
3549
  forEach(array1, function (element) {
@@ -3275,6 +3748,17 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3275
3748
  return newActions;
3276
3749
  }
3277
3750
 
3751
+ /**
3752
+ Add an event listener
3753
+
3754
+ @method addListener
3755
+ @for Ember
3756
+ @param obj
3757
+ @param {String} eventName
3758
+ @param {Object|Function} target A target object or a function
3759
+ @param {Function|String} method A function or the name of a function to be called on `target`
3760
+ @param {Boolean} once A flag whether a function should only be called once
3761
+ */
3278
3762
  function addListener(obj, eventName, target, method, once) {
3279
3763
  Ember['default'].assert("You must pass at least an object and event name to Ember.addListener", !!obj && !!eventName);
3280
3764
 
@@ -3352,6 +3836,25 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3352
3836
  }
3353
3837
  }
3354
3838
  }
3839
+
3840
+ /**
3841
+ Suspend listener during callback.
3842
+
3843
+ This should only be used by the target of the event listener
3844
+ when it is taking an action that would cause the event, e.g.
3845
+ an object might suspend its property change listener while it is
3846
+ setting that property.
3847
+
3848
+ @method suspendListener
3849
+ @for Ember
3850
+
3851
+ @private
3852
+ @param obj
3853
+ @param {String} eventName
3854
+ @param {Object|Function} target A target object or a function
3855
+ @param {Function|String} method A function or the name of a function to be called on `target`
3856
+ @param {Function} callback
3857
+ */
3355
3858
  function suspendListener(obj, eventName, target, method, callback) {
3356
3859
  if (!method && "function" === typeof target) {
3357
3860
  method = target;
@@ -3377,6 +3880,19 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3377
3880
  return utils.tryFinally(tryable, finalizer);
3378
3881
  }
3379
3882
 
3883
+ /**
3884
+ Suspends multiple listeners during a callback.
3885
+
3886
+ @method suspendListeners
3887
+ @for Ember
3888
+
3889
+ @private
3890
+ @param obj
3891
+ @param {Array} eventNames Array of event names
3892
+ @param {Object|Function} target A target object or a function
3893
+ @param {Function|String} method A function or the name of a function to be called on `target`
3894
+ @param {Function} callback
3895
+ */
3380
3896
  function suspendListeners(obj, eventNames, target, method, callback) {
3381
3897
  if (!method && "function" === typeof target) {
3382
3898
  method = target;
@@ -3413,6 +3929,14 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3413
3929
  return utils.tryFinally(tryable, finalizer);
3414
3930
  }
3415
3931
 
3932
+ /**
3933
+ Return a list of currently watched events
3934
+
3935
+ @private
3936
+ @method watchedEvents
3937
+ @for Ember
3938
+ @param obj
3939
+ */
3416
3940
  function watchedEvents(obj) {
3417
3941
  var listeners = obj["__ember_meta__"].listeners;
3418
3942
  var ret = [];
@@ -3427,6 +3951,20 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3427
3951
  return ret;
3428
3952
  }
3429
3953
 
3954
+ /**
3955
+ Send an event. The execution of suspended listeners
3956
+ is skipped, and once listeners are removed. A listener without
3957
+ a target is executed on the passed object. If an array of actions
3958
+ is not passed, the actions stored on the passed object are invoked.
3959
+
3960
+ @method sendEvent
3961
+ @for Ember
3962
+ @param obj
3963
+ @param {String} eventName
3964
+ @param {Array} params Optional parameters for each listener.
3965
+ @param {Array} actions Optional array of actions (listeners).
3966
+ @return true
3967
+ */
3430
3968
  function sendEvent(obj, eventName, params, actions) {
3431
3969
  // first give object a chance to handle it
3432
3970
  if (obj !== Ember['default'] && "function" === typeof obj.sendEvent) {
@@ -3477,6 +4015,13 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3477
4015
  return true;
3478
4016
  }
3479
4017
 
4018
+ /**
4019
+ @private
4020
+ @method hasListeners
4021
+ @for Ember
4022
+ @param obj
4023
+ @param {String} eventName
4024
+ */
3480
4025
  function hasListeners(obj, eventName) {
3481
4026
  var meta = obj["__ember_meta__"];
3482
4027
  var actions = meta && meta.listeners && meta.listeners[eventName];
@@ -3484,6 +4029,13 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3484
4029
  return !!(actions && actions.length);
3485
4030
  }
3486
4031
 
4032
+ /**
4033
+ @private
4034
+ @method listenersFor
4035
+ @for Ember
4036
+ @param obj
4037
+ @param {String} eventName
4038
+ */
3487
4039
  function listenersFor(obj, eventName) {
3488
4040
  var ret = [];
3489
4041
  var meta = obj["__ember_meta__"];
@@ -3502,6 +4054,29 @@ enifed('ember-metal/events', ['exports', 'ember-metal/core', 'ember-metal/utils'
3502
4054
  return ret;
3503
4055
  }
3504
4056
 
4057
+ /**
4058
+ Define a property as a function that should be executed when
4059
+ a specified event or events are triggered.
4060
+
4061
+
4062
+ ``` javascript
4063
+ var Job = Ember.Object.extend({
4064
+ logCompleted: Ember.on('completed', function() {
4065
+ console.log('Job completed!');
4066
+ })
4067
+ });
4068
+
4069
+ var job = Job.create();
4070
+
4071
+ Ember.sendEvent(job, 'completed'); // Logs 'Job completed!'
4072
+ ```
4073
+
4074
+ @method on
4075
+ @for Ember
4076
+ @param {String} eventNames*
4077
+ @param {Function} func
4078
+ @return func
4079
+ */
3505
4080
  function on() {
3506
4081
  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
3507
4082
  args[_key] = arguments[_key];
@@ -3519,6 +4094,9 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error', 'ember-
3519
4094
  'use strict';
3520
4095
 
3521
4096
 
4097
+ exports['default'] = expandProperties;
4098
+
4099
+ var SPLIT_REGEX = /\{|\}/;
3522
4100
 
3523
4101
  /**
3524
4102
  Expands `pattern`, invoking `callback` for each expansion.
@@ -3546,9 +4124,6 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error', 'ember-
3546
4124
  @param {Function} callback The callback to invoke. It is invoked once per
3547
4125
  expansion, and is passed the expansion.
3548
4126
  */
3549
- exports['default'] = expandProperties;
3550
-
3551
- var SPLIT_REGEX = /\{|\}/;
3552
4127
  function expandProperties(pattern, callback) {
3553
4128
  if (pattern.indexOf(' ') > -1) {
3554
4129
  throw new EmberError['default']('Brace expanded properties cannot contain spaces, e.g. \'user.{firstName, lastName}\' should be \'user.{firstName,lastName}\'');
@@ -3586,35 +4161,12 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error', 'ember-
3586
4161
  return all;
3587
4162
  }
3588
4163
 
3589
- });
3590
- enifed('ember-metal/get_properties', ['exports', 'ember-metal/property_get', 'ember-metal/utils'], function (exports, property_get, utils) {
3591
-
3592
- 'use strict';
3593
-
3594
-
3595
-
3596
- /**
3597
- To get multiple properties at once, call `Ember.getProperties`
3598
- with an object followed by a list of strings or an array:
3599
-
3600
- ```javascript
3601
- Ember.getProperties(record, 'firstName', 'lastName', 'zipCode');
3602
- // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
3603
- ```
4164
+ });
4165
+ enifed('ember-metal/get_properties', ['exports', 'ember-metal/property_get', 'ember-metal/utils'], function (exports, property_get, utils) {
3604
4166
 
3605
- is equivalent to:
4167
+ 'use strict';
3606
4168
 
3607
- ```javascript
3608
- Ember.getProperties(record, ['firstName', 'lastName', 'zipCode']);
3609
- // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
3610
- ```
3611
4169
 
3612
- @method getProperties
3613
- @for Ember
3614
- @param {Object} obj
3615
- @param {String...|Array} list of keys to get
3616
- @return {Object}
3617
- */
3618
4170
  exports['default'] = getProperties;
3619
4171
  function getProperties(obj) {
3620
4172
  var ret = {};
@@ -3679,17 +4231,6 @@ enifed('ember-metal/instrumentation', ['exports', 'ember-metal/core', 'ember-met
3679
4231
  exports.unsubscribe = unsubscribe;
3680
4232
  exports.reset = reset;
3681
4233
 
3682
- /**
3683
- Notifies event's subscribers, calls `before` and `after` hooks.
3684
-
3685
- @method instrument
3686
- @namespace Ember.Instrumentation
3687
-
3688
- @param {String} [name] Namespaced event name.
3689
- @param {Object} payload
3690
- @param {Function} callback Function that you're instrumenting.
3691
- @param {Object} binding Context that instrument function is called with.
3692
- */
3693
4234
  var subscribers = [];
3694
4235
  var cache = {};
3695
4236
 
@@ -3716,6 +4257,18 @@ enifed('ember-metal/instrumentation', ['exports', 'ember-metal/core', 'ember-met
3716
4257
  return +new Date();
3717
4258
  };
3718
4259
  })();
4260
+
4261
+ /**
4262
+ Notifies event's subscribers, calls `before` and `after` hooks.
4263
+
4264
+ @method instrument
4265
+ @namespace Ember.Instrumentation
4266
+
4267
+ @param {String} [name] Namespaced event name.
4268
+ @param {Object} payload
4269
+ @param {Function} callback Function that you're instrumenting.
4270
+ @param {Object} binding Context that instrument function is called with.
4271
+ */
3719
4272
  function instrument(name, _payload, callback, binding) {
3720
4273
  if (arguments.length <= 3 && typeof _payload === "function") {
3721
4274
  binding = callback;
@@ -3742,6 +4295,8 @@ enifed('ember-metal/instrumentation', ['exports', 'ember-metal/core', 'ember-met
3742
4295
  }
3743
4296
  }
3744
4297
 
4298
+ // private for now
4299
+
3745
4300
  function _instrumentStart(name, _payload) {
3746
4301
  var listeners = cache[name];
3747
4302
 
@@ -3785,6 +4340,17 @@ enifed('ember-metal/instrumentation', ['exports', 'ember-metal/core', 'ember-met
3785
4340
  };
3786
4341
  }
3787
4342
 
4343
+ /**
4344
+ Subscribes to a particular event or instrumented block of code.
4345
+
4346
+ @method subscribe
4347
+ @namespace Ember.Instrumentation
4348
+
4349
+ @param {String} [pattern] Namespaced event name.
4350
+ @param {Object} [object] Before and After hooks.
4351
+
4352
+ @return {Subscriber}
4353
+ */
3788
4354
  function subscribe(pattern, object) {
3789
4355
  var paths = pattern.split(".");
3790
4356
  var path;
@@ -3814,6 +4380,14 @@ enifed('ember-metal/instrumentation', ['exports', 'ember-metal/core', 'ember-met
3814
4380
  return subscriber;
3815
4381
  }
3816
4382
 
4383
+ /**
4384
+ Unsubscribes from a particular event or instrumented block of code.
4385
+
4386
+ @method unsubscribe
4387
+ @namespace Ember.Instrumentation
4388
+
4389
+ @param {Object} [subscriber]
4390
+ */
3817
4391
  function unsubscribe(subscriber) {
3818
4392
  var index;
3819
4393
 
@@ -3827,6 +4401,12 @@ enifed('ember-metal/instrumentation', ['exports', 'ember-metal/core', 'ember-met
3827
4401
  cache = {};
3828
4402
  }
3829
4403
 
4404
+ /**
4405
+ Resets `Ember.Instrumentation` by flushing list of subscribers.
4406
+
4407
+ @method reset
4408
+ @namespace Ember.Instrumentation
4409
+ */
3830
4410
  function reset() {
3831
4411
  subscribers.length = 0;
3832
4412
  cache = {};
@@ -3840,30 +4420,6 @@ enifed('ember-metal/is_blank', ['exports', 'ember-metal/is_empty'], function (ex
3840
4420
  'use strict';
3841
4421
 
3842
4422
 
3843
-
3844
- /**
3845
- A value is blank if it is empty or a whitespace string.
3846
-
3847
- ```javascript
3848
- Ember.isBlank(); // true
3849
- Ember.isBlank(null); // true
3850
- Ember.isBlank(undefined); // true
3851
- Ember.isBlank(''); // true
3852
- Ember.isBlank([]); // true
3853
- Ember.isBlank('\n\t'); // true
3854
- Ember.isBlank(' '); // true
3855
- Ember.isBlank({}); // false
3856
- Ember.isBlank('\n\t Hello'); // false
3857
- Ember.isBlank('Hello world'); // false
3858
- Ember.isBlank([1,2,3]); // false
3859
- ```
3860
-
3861
- @method isBlank
3862
- @for Ember
3863
- @param {Object} obj Value to test
3864
- @return {Boolean}
3865
- @since 1.5.0
3866
- */
3867
4423
  exports['default'] = isBlank;
3868
4424
  function isBlank(obj) {
3869
4425
  return isEmpty['default'](obj) || typeof obj === 'string' && obj.match(/\S/) === null;
@@ -3945,30 +4501,6 @@ enifed('ember-metal/is_present', ['exports', 'ember-metal/is_blank'], function (
3945
4501
  'use strict';
3946
4502
 
3947
4503
 
3948
-
3949
- /**
3950
- A value is present if it not `isBlank`.
3951
-
3952
- ```javascript
3953
- Ember.isPresent(); // false
3954
- Ember.isPresent(null); // false
3955
- Ember.isPresent(undefined); // false
3956
- Ember.isPresent(''); // false
3957
- Ember.isPresent([]); // false
3958
- Ember.isPresent('\n\t'); // false
3959
- Ember.isPresent(' '); // false
3960
- Ember.isPresent({}); // true
3961
- Ember.isPresent('\n\t Hello'); // true
3962
- Ember.isPresent('Hello world'); // true
3963
- Ember.isPresent([1,2,3]); // true
3964
- ```
3965
-
3966
- @method isPresent
3967
- @for Ember
3968
- @param {Object} obj Value to test
3969
- @return {Boolean}
3970
- @since 1.8.0
3971
- */
3972
4504
  exports['default'] = isPresent;
3973
4505
  function isPresent(obj) {
3974
4506
  return !isBlank['default'](obj);
@@ -4738,22 +5270,6 @@ enifed('ember-metal/merge', ['exports', 'ember-metal/keys'], function (exports,
4738
5270
 
4739
5271
  exports.assign = assign;
4740
5272
 
4741
- /**
4742
- Merge the contents of two objects together into the first object.
4743
-
4744
- ```javascript
4745
- Ember.merge({first: 'Tom'}, {last: 'Dale'}); // {first: 'Tom', last: 'Dale'}
4746
- var a = {first: 'Yehuda'};
4747
- var b = {last: 'Katz'};
4748
- Ember.merge(a, b); // a == {first: 'Yehuda', last: 'Katz'}, b == {last: 'Katz'}
4749
- ```
4750
-
4751
- @method merge
4752
- @for Ember
4753
- @param {Object} original The object to merge into
4754
- @param {Object} updates The object to copy properties from
4755
- @return {Object}
4756
- */
4757
5273
  exports['default'] = merge;
4758
5274
 
4759
5275
  function merge(original, updates) {
@@ -4806,13 +5322,6 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
4806
5322
  exports.beforeObserver = beforeObserver;
4807
5323
  exports.Mixin = Mixin;
4808
5324
 
4809
- /**
4810
- @method mixin
4811
- @for Ember
4812
- @param obj
4813
- @param mixins*
4814
- @return obj
4815
- */
4816
5325
  "REMOVE_USE_STRICT: true";var REQUIRED;
4817
5326
  var a_slice = [].slice;
4818
5327
 
@@ -5264,6 +5773,14 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
5264
5773
 
5265
5774
  return obj;
5266
5775
  }
5776
+
5777
+ /**
5778
+ @method mixin
5779
+ @for Ember
5780
+ @param obj
5781
+ @param mixins*
5782
+ @return obj
5783
+ */
5267
5784
  function mixin(obj) {
5268
5785
  for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
5269
5786
  args[_key - 1] = arguments[_key];
@@ -5539,6 +6056,13 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
5539
6056
  REQUIRED.toString = function () {
5540
6057
  return "(Required Property)";
5541
6058
  };
6059
+
6060
+ /**
6061
+ Denotes a required property for a mixin
6062
+
6063
+ @method required
6064
+ @for Ember
6065
+ */
5542
6066
  function required() {
5543
6067
  Ember['default'].deprecate("Ember.required is deprecated as its behavior is inconsistent and unreliable.", false);
5544
6068
  return REQUIRED;
@@ -5550,10 +6074,59 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
5550
6074
  }
5551
6075
 
5552
6076
  Alias.prototype = new ember_metal__properties.Descriptor();
6077
+
6078
+ /**
6079
+ Makes a method available via an additional name.
6080
+
6081
+ ```javascript
6082
+ App.Person = Ember.Object.extend({
6083
+ name: function() {
6084
+ return 'Tomhuda Katzdale';
6085
+ },
6086
+ moniker: Ember.aliasMethod('name')
6087
+ });
6088
+
6089
+ var goodGuy = App.Person.create();
6090
+
6091
+ goodGuy.name(); // 'Tomhuda Katzdale'
6092
+ goodGuy.moniker(); // 'Tomhuda Katzdale'
6093
+ ```
6094
+
6095
+ @method aliasMethod
6096
+ @for Ember
6097
+ @param {String} methodName name of the method to alias
6098
+ */
5553
6099
  function aliasMethod(methodName) {
5554
6100
  return new Alias(methodName);
5555
6101
  }
5556
6102
 
6103
+ // ..........................................................
6104
+ // OBSERVER HELPER
6105
+ //
6106
+
6107
+ /**
6108
+ Specify a method that observes property changes.
6109
+
6110
+ ```javascript
6111
+ Ember.Object.extend({
6112
+ valueObserver: Ember.observer('value', function() {
6113
+ // Executes whenever the "value" property changes
6114
+ })
6115
+ });
6116
+ ```
6117
+
6118
+ In the future this method may become asynchronous. If you want to ensure
6119
+ synchronous behavior, use `immediateObserver`.
6120
+
6121
+ Also available as `Function.prototype.observes` if prototype extensions are
6122
+ enabled.
6123
+
6124
+ @method observer
6125
+ @for Ember
6126
+ @param {String} propertyNames*
6127
+ @param {Function} func
6128
+ @return func
6129
+ */
5557
6130
  function observer() {
5558
6131
  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
5559
6132
  args[_key4] = arguments[_key4];
@@ -5588,6 +6161,29 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
5588
6161
  return func;
5589
6162
  }
5590
6163
 
6164
+ /**
6165
+ Specify a method that observes property changes.
6166
+
6167
+ ```javascript
6168
+ Ember.Object.extend({
6169
+ valueObserver: Ember.immediateObserver('value', function() {
6170
+ // Executes whenever the "value" property changes
6171
+ })
6172
+ });
6173
+ ```
6174
+
6175
+ In the future, `Ember.observer` may become asynchronous. In this event,
6176
+ `Ember.immediateObserver` will maintain the synchronous behavior.
6177
+
6178
+ Also available as `Function.prototype.observesImmediately` if prototype extensions are
6179
+ enabled.
6180
+
6181
+ @method immediateObserver
6182
+ @for Ember
6183
+ @param {String} propertyNames*
6184
+ @param {Function} func
6185
+ @return func
6186
+ */
5591
6187
  function immediateObserver() {
5592
6188
  for (var i = 0, l = arguments.length; i < l; i++) {
5593
6189
  var arg = arguments[i];
@@ -5597,6 +6193,48 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
5597
6193
  return observer.apply(this, arguments);
5598
6194
  }
5599
6195
 
6196
+ /**
6197
+ When observers fire, they are called with the arguments `obj`, `keyName`.
6198
+
6199
+ Note, `@each.property` observer is called per each add or replace of an element
6200
+ and it's not called with a specific enumeration item.
6201
+
6202
+ A `beforeObserver` fires before a property changes.
6203
+
6204
+ A `beforeObserver` is an alternative form of `.observesBefore()`.
6205
+
6206
+ ```javascript
6207
+ App.PersonView = Ember.View.extend({
6208
+ friends: [{ name: 'Tom' }, { name: 'Stefan' }, { name: 'Kris' }],
6209
+
6210
+ valueWillChange: Ember.beforeObserver('content.value', function(obj, keyName) {
6211
+ this.changingFrom = obj.get(keyName);
6212
+ }),
6213
+
6214
+ valueDidChange: Ember.observer('content.value', function(obj, keyName) {
6215
+ // only run if updating a value already in the DOM
6216
+ if (this.get('state') === 'inDOM') {
6217
+ var color = obj.get(keyName) > this.changingFrom ? 'green' : 'red';
6218
+ // logic
6219
+ }
6220
+ }),
6221
+
6222
+ friendsDidChange: Ember.observer('friends.@each.name', function(obj, keyName) {
6223
+ // some logic
6224
+ // obj.get(keyName) returns friends array
6225
+ })
6226
+ });
6227
+ ```
6228
+
6229
+ Also available as `Function.prototype.observesBefore` if prototype extensions are
6230
+ enabled.
6231
+
6232
+ @method beforeObserver
6233
+ @for Ember
6234
+ @param {String} propertyNames*
6235
+ @param {Function} func
6236
+ @return func
6237
+ */
5600
6238
  function beforeObserver() {
5601
6239
  for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
5602
6240
  args[_key5] = arguments[_key5];
@@ -5651,14 +6289,6 @@ enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/
5651
6289
  exports.beforeObserversFor = beforeObserversFor;
5652
6290
  exports.removeBeforeObserver = removeBeforeObserver;
5653
6291
 
5654
- /**
5655
- @method addObserver
5656
- @for Ember
5657
- @param obj
5658
- @param {String} path
5659
- @param {Object|Function} targetOrMethod
5660
- @param {Function|String} [method]
5661
- */
5662
6292
  var AFTER_OBSERVERS = ":change";
5663
6293
  var BEFORE_OBSERVERS = ":before";
5664
6294
 
@@ -5669,6 +6299,15 @@ enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/
5669
6299
  function beforeEvent(keyName) {
5670
6300
  return keyName + BEFORE_OBSERVERS;
5671
6301
  }
6302
+
6303
+ /**
6304
+ @method addObserver
6305
+ @for Ember
6306
+ @param obj
6307
+ @param {String} path
6308
+ @param {Object|Function} targetOrMethod
6309
+ @param {Function|String} [method]
6310
+ */
5672
6311
  function addObserver(obj, _path, target, method) {
5673
6312
  ember_metal__events.addListener(obj, changeEvent(_path), target, method);
5674
6313
  watching.watch(obj, _path);
@@ -5680,6 +6319,14 @@ enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/
5680
6319
  return ember_metal__events.listenersFor(obj, changeEvent(path));
5681
6320
  }
5682
6321
 
6322
+ /**
6323
+ @method removeObserver
6324
+ @for Ember
6325
+ @param obj
6326
+ @param {String} path
6327
+ @param {Object|Function} target
6328
+ @param {Function|String} [method]
6329
+ */
5683
6330
  function removeObserver(obj, path, target, method) {
5684
6331
  watching.unwatch(obj, path);
5685
6332
  ember_metal__events.removeListener(obj, changeEvent(path), target, method);
@@ -5687,6 +6334,14 @@ enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/
5687
6334
  return this;
5688
6335
  }
5689
6336
 
6337
+ /**
6338
+ @method addBeforeObserver
6339
+ @for Ember
6340
+ @param obj
6341
+ @param {String} path
6342
+ @param {Object|Function} target
6343
+ @param {Function|String} [method]
6344
+ */
5690
6345
  function addBeforeObserver(obj, path, target, method) {
5691
6346
  ember_metal__events.addListener(obj, beforeEvent(path), target, method);
5692
6347
  watching.watch(obj, path);
@@ -5694,6 +6349,11 @@ enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/
5694
6349
  return this;
5695
6350
  }
5696
6351
 
6352
+ // Suspend observer during callback.
6353
+ //
6354
+ // This should only be used by the target of the observer
6355
+ // while it is setting the observed path.
6356
+
5697
6357
  function _suspendBeforeObserver(obj, path, target, method, callback) {
5698
6358
  return ember_metal__events.suspendListener(obj, beforeEvent(path), target, method, callback);
5699
6359
  }
@@ -5716,6 +6376,14 @@ enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/
5716
6376
  return ember_metal__events.listenersFor(obj, beforeEvent(path));
5717
6377
  }
5718
6378
 
6379
+ /**
6380
+ @method removeBeforeObserver
6381
+ @for Ember
6382
+ @param obj
6383
+ @param {String} path
6384
+ @param {Object|Function} target
6385
+ @param {Function|String} [method]
6386
+ */
5719
6387
  function removeBeforeObserver(obj, path, target, method) {
5720
6388
  watching.unwatch(obj, path);
5721
6389
  ember_metal__events.removeListener(obj, beforeEvent(path), target, method);
@@ -6134,18 +6802,14 @@ enifed('ember-metal/properties', ['exports', 'ember-metal/core', 'ember-metal/ut
6134
6802
  exports.DEFAULT_GETTER_FUNCTION = DEFAULT_GETTER_FUNCTION;
6135
6803
  exports.defineProperty = defineProperty;
6136
6804
 
6137
- // ..........................................................
6138
- // DESCRIPTOR
6139
- //
6140
-
6141
- /**
6142
- Objects of this type can implement an interface to respond to requests to
6143
- get and set. The default implementation handles simple properties.
6144
- */
6145
6805
  function Descriptor() {
6146
6806
  this.isDescriptor = true;
6147
6807
  }
6148
6808
 
6809
+ // ..........................................................
6810
+ // DEFINING PROPERTIES API
6811
+ //
6812
+
6149
6813
  function MANDATORY_SETTER_FUNCTION(name) {
6150
6814
  return function SETTER_FUNCTION(value) {
6151
6815
  Ember['default'].assert("You must use Ember.set() to set the `" + name + "` property (of " + this + ") to `" + value + "`.", false);
@@ -6159,6 +6823,51 @@ enifed('ember-metal/properties', ['exports', 'ember-metal/core', 'ember-metal/ut
6159
6823
  };
6160
6824
  }
6161
6825
 
6826
+ /**
6827
+ NOTE: This is a low-level method used by other parts of the API. You almost
6828
+ never want to call this method directly. Instead you should use
6829
+ `Ember.mixin()` to define new properties.
6830
+
6831
+ Defines a property on an object. This method works much like the ES5
6832
+ `Object.defineProperty()` method except that it can also accept computed
6833
+ properties and other special descriptors.
6834
+
6835
+ Normally this method takes only three parameters. However if you pass an
6836
+ instance of `Descriptor` as the third param then you can pass an
6837
+ optional value as the fourth parameter. This is often more efficient than
6838
+ creating new descriptor hashes for each property.
6839
+
6840
+ ## Examples
6841
+
6842
+ ```javascript
6843
+ // ES5 compatible mode
6844
+ Ember.defineProperty(contact, 'firstName', {
6845
+ writable: true,
6846
+ configurable: false,
6847
+ enumerable: true,
6848
+ value: 'Charles'
6849
+ });
6850
+
6851
+ // define a simple property
6852
+ Ember.defineProperty(contact, 'lastName', undefined, 'Jolley');
6853
+
6854
+ // define a computed property
6855
+ Ember.defineProperty(contact, 'fullName', Ember.computed(function() {
6856
+ return this.firstName+' '+this.lastName;
6857
+ }).property('firstName', 'lastName'));
6858
+ ```
6859
+
6860
+ @private
6861
+ @method defineProperty
6862
+ @for Ember
6863
+ @param {Object} obj the object to define this property on. This may be a prototype.
6864
+ @param {String} keyName the name of the property
6865
+ @param {Descriptor} [desc] an instance of `Descriptor` (typically a
6866
+ computed property) or an ES5 descriptor.
6867
+ You must provide this or `data` but not both.
6868
+ @param {*} [data] something other than a descriptor, that will
6869
+ become the explicit value of this property.
6870
+ */
6162
6871
  function defineProperty(obj, keyName, desc, data, meta) {
6163
6872
  var possibleDesc, existingDesc, watching, value;
6164
6873
 
@@ -6546,7 +7255,7 @@ enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-me
6546
7255
  exports.PROPERTY_DID_CHANGE = PROPERTY_DID_CHANGE;
6547
7256
 
6548
7257
  });
6549
- enifed('ember-metal/property_get', ['exports', 'ember-metal/core', 'ember-metal/error', 'ember-metal/path_cache', 'ember-metal/platform/define_property', 'ember-metal/utils'], function (exports, Ember, EmberError, path_cache, define_property, utils) {
7258
+ enifed('ember-metal/property_get', ['exports', 'ember-metal/core', 'ember-metal/error', 'ember-metal/path_cache', 'ember-metal/platform/define_property', 'ember-metal/utils', 'ember-metal/is_none'], function (exports, Ember, EmberError, path_cache, define_property, utils, isNone) {
6550
7259
 
6551
7260
  'use strict';
6552
7261
 
@@ -6555,41 +7264,12 @@ enifed('ember-metal/property_get', ['exports', 'ember-metal/core', 'ember-metal/
6555
7264
  exports._getPath = _getPath;
6556
7265
  exports.getWithDefault = getWithDefault;
6557
7266
 
6558
- // ..........................................................
6559
- // GET AND SET
6560
- //
6561
- // If we are on a platform that supports accessors we can use those.
6562
- // Otherwise simulate accessors by looking up the property directly on the
6563
- // object.
6564
-
6565
- /**
6566
- Gets the value of a property on an object. If the property is computed,
6567
- the function will be invoked. If the property is not defined but the
6568
- object implements the `unknownProperty` method then that will be invoked.
6569
-
6570
- If you plan to run on IE8 and older browsers then you should use this
6571
- method anytime you want to retrieve a property on an object that you don't
6572
- know for sure is private. (Properties beginning with an underscore '_'
6573
- are considered private.)
6574
-
6575
- On all newer browsers, you only need to use this method to retrieve
6576
- properties if the property might not be defined on the object and you want
6577
- to respect the `unknownProperty` handler. Otherwise you can ignore this
6578
- method.
6579
-
6580
- Note that if the object itself is `undefined`, this method will throw
6581
- an error.
6582
-
6583
- @method get
6584
- @for Ember
6585
- @param {Object} obj The object to retrieve from.
6586
- @param {String} keyName The property key to retrieve
6587
- @return {Object} the property value or `null`.
6588
- */
6589
7267
  var FIRST_KEY = /^([^\.]+)/;
6590
7268
 
6591
7269
  var INTERCEPT_GET = utils.symbol("INTERCEPT_GET");
6592
- var UNHANDLED_GET = utils.symbol("UNHANDLED_GET");function get(obj, keyName) {
7270
+ var UNHANDLED_GET = utils.symbol("UNHANDLED_GET");
7271
+
7272
+ function get(obj, keyName) {
6593
7273
  // Helpers that operate with 'this' within an #each
6594
7274
  if (keyName === "") {
6595
7275
  return obj;
@@ -6603,7 +7283,7 @@ enifed('ember-metal/property_get', ['exports', 'ember-metal/core', 'ember-metal/
6603
7283
  Ember['default'].assert("Cannot call get with " + keyName + " key.", !!keyName);
6604
7284
  Ember['default'].assert("Cannot call get with '" + keyName + "' on an undefined object.", obj !== undefined);
6605
7285
 
6606
- if (!obj) {
7286
+ if (isNone['default'](obj)) {
6607
7287
  return _getPath(obj, keyName);
6608
7288
  }
6609
7289
 
@@ -6641,6 +7321,19 @@ enifed('ember-metal/property_get', ['exports', 'ember-metal/core', 'ember-metal/
6641
7321
  }
6642
7322
  }
6643
7323
 
7324
+ /**
7325
+ Normalizes a target/path pair to reflect that actual target/path that should
7326
+ be observed, etc. This takes into account passing in global property
7327
+ paths (i.e. a path beginning with a capital letter not defined on the
7328
+ target).
7329
+
7330
+ @private
7331
+ @method normalizeTuple
7332
+ @for Ember
7333
+ @param {Object} target The current target. May be `null`.
7334
+ @param {String} path A path on the target or a global property path.
7335
+ @return {Array} a temporary array with the normalized target/path pair.
7336
+ */
6644
7337
  function normalizeTuple(target, path) {
6645
7338
  var hasThis = path_cache.hasThis(path);
6646
7339
  var isGlobal = !hasThis && path_cache.isGlobal(path);
@@ -6721,21 +7414,10 @@ enifed('ember-metal/property_set', ['exports', 'ember-metal/core', 'ember-metal/
6721
7414
  exports.set = set;
6722
7415
  exports.trySet = trySet;
6723
7416
 
6724
- /**
6725
- Sets the value of a property on an object, respecting computed properties
6726
- and notifying observers and other listeners of the change. If the
6727
- property is not defined but the object implements the `setUnknownProperty`
6728
- method then that will be invoked as well.
6729
-
6730
- @method set
6731
- @for Ember
6732
- @param {Object} obj The object to modify.
6733
- @param {String} keyName The property key to set
6734
- @param {Object} value The value to set
6735
- @return {Object} the passed value.
6736
- */
6737
7417
  var INTERCEPT_SET = utils.symbol("INTERCEPT_SET");
6738
- var UNHANDLED_SET = utils.symbol("UNHANDLED_SET");function set(obj, keyName, value, tolerant) {
7418
+ var UNHANDLED_SET = utils.symbol("UNHANDLED_SET");
7419
+
7420
+ function set(obj, keyName, value, tolerant) {
6739
7421
  if (typeof obj === "string") {
6740
7422
  Ember['default'].assert("Path '" + obj + "' must be global if no obj is given.", path_cache.isGlobalPath(obj));
6741
7423
  value = keyName;
@@ -6852,6 +7534,20 @@ enifed('ember-metal/property_set', ['exports', 'ember-metal/core', 'ember-metal/
6852
7534
 
6853
7535
  return set(root, keyName, value);
6854
7536
  }
7537
+
7538
+ /**
7539
+ Error-tolerant form of `Ember.set`. Will not blow up if any part of the
7540
+ chain is `undefined`, `null`, or destroyed.
7541
+
7542
+ This is primarily used when syncing bindings, which may try to update after
7543
+ an object has been destroyed.
7544
+
7545
+ @method trySet
7546
+ @for Ember
7547
+ @param {Object} obj The object to modify.
7548
+ @param {String} path The property path to set
7549
+ @param {Object} value The value to set
7550
+ */
6855
7551
  function trySet(root, path, value) {
6856
7552
  return set(root, path, value, true);
6857
7553
  }
@@ -7515,33 +8211,12 @@ enifed('ember-metal/run_loop', ['exports', 'ember-metal/core', 'ember-metal/util
7515
8211
  };
7516
8212
  /* queue, target, method */ /*target, method*/ /*queue, target, method*/
7517
8213
 
7518
- });
7519
- enifed('ember-metal/set_properties', ['exports', 'ember-metal/property_events', 'ember-metal/property_set', 'ember-metal/keys'], function (exports, property_events, property_set, keys) {
7520
-
7521
- 'use strict';
7522
-
7523
-
7524
-
7525
- /**
7526
- Set a list of properties on an object. These properties are set inside
7527
- a single `beginPropertyChanges` and `endPropertyChanges` batch, so
7528
- observers will be buffered.
8214
+ });
8215
+ enifed('ember-metal/set_properties', ['exports', 'ember-metal/property_events', 'ember-metal/property_set', 'ember-metal/keys'], function (exports, property_events, property_set, keys) {
7529
8216
 
7530
- ```javascript
7531
- var anObject = Ember.Object.create();
8217
+ 'use strict';
7532
8218
 
7533
- anObject.setProperties({
7534
- firstName: 'Stanley',
7535
- lastName: 'Stuart',
7536
- age: 21
7537
- });
7538
- ```
7539
8219
 
7540
- @method setProperties
7541
- @param obj
7542
- @param {Object} properties
7543
- @return obj
7544
- */
7545
8220
  exports['default'] = setProperties;
7546
8221
  function setProperties(obj, properties) {
7547
8222
  if (!properties || typeof properties !== "object") {
@@ -8161,31 +8836,55 @@ enifed('ember-metal/streams/utils', ['exports', './stream'], function (exports,
8161
8836
  exports.chain = chain;
8162
8837
  exports.setValue = setValue;
8163
8838
 
8164
- /*
8165
- Check whether an object is a stream or not
8166
-
8167
- @public
8168
- @for Ember.stream
8169
- @function isStream
8170
- @param {Object|Stream} object object to check whether it is a stream
8171
- @return {Boolean} `true` if the object is a stream, `false` otherwise
8172
- */
8173
8839
  function isStream(object) {
8174
8840
  return object && object.isStream;
8175
8841
  }
8176
8842
 
8843
+ /*
8844
+ A method of subscribing to a stream which is safe for use with a non-stream
8845
+ object. If a non-stream object is passed, the function does nothing.
8846
+
8847
+ @public
8848
+ @for Ember.stream
8849
+ @function subscribe
8850
+ @param {Object|Stream} object object or stream to potentially subscribe to
8851
+ @param {Function} callback function to run when stream value changes
8852
+ @param {Object} [context] the callback will be executed with this context if it
8853
+ is provided
8854
+ */
8177
8855
  function subscribe(object, callback, context) {
8178
8856
  if (object && object.isStream) {
8179
8857
  return object.subscribe(callback, context);
8180
8858
  }
8181
8859
  }
8182
8860
 
8861
+ /*
8862
+ A method of unsubscribing from a stream which is safe for use with a non-stream
8863
+ object. If a non-stream object is passed, the function does nothing.
8864
+
8865
+ @public
8866
+ @for Ember.stream
8867
+ @function unsubscribe
8868
+ @param {Object|Stream} object object or stream to potentially unsubscribe from
8869
+ @param {Function} callback function originally passed to `subscribe()`
8870
+ @param {Object} [context] object originally passed to `subscribe()`
8871
+ */
8183
8872
  function unsubscribe(object, callback, context) {
8184
8873
  if (object && object.isStream) {
8185
8874
  object.unsubscribe(callback, context);
8186
8875
  }
8187
8876
  }
8188
8877
 
8878
+ /*
8879
+ Retrieve the value of a stream, or in the case a non-stream object is passed,
8880
+ return the object itself.
8881
+
8882
+ @public
8883
+ @for Ember.stream
8884
+ @function read
8885
+ @param {Object|Stream} object object to return the value of
8886
+ @return the stream's current value, or the non-stream object itself
8887
+ */
8189
8888
  function read(object) {
8190
8889
  if (object && object.isStream) {
8191
8890
  return object.value();
@@ -8194,6 +8893,18 @@ enifed('ember-metal/streams/utils', ['exports', './stream'], function (exports,
8194
8893
  }
8195
8894
  }
8196
8895
 
8896
+ /*
8897
+ Map an array, replacing any streams with their values.
8898
+
8899
+ @public
8900
+ @for Ember.stream
8901
+ @function readArray
8902
+ @param {Array} array The array to read values from
8903
+ @return {Array} a new array of the same length with the values of non-stream
8904
+ objects mapped from their original positions untouched, and
8905
+ the values of stream objects retaining their original position
8906
+ and replaced with the stream's current value.
8907
+ */
8197
8908
  function readArray(array) {
8198
8909
  var length = array.length;
8199
8910
  var ret = new Array(length);
@@ -8203,6 +8914,19 @@ enifed('ember-metal/streams/utils', ['exports', './stream'], function (exports,
8203
8914
  return ret;
8204
8915
  }
8205
8916
 
8917
+ /*
8918
+ Map a hash, replacing any stream property values with the current value of that
8919
+ stream.
8920
+
8921
+ @public
8922
+ @for Ember.stream
8923
+ @function readHash
8924
+ @param {Object} object The hash to read keys and values from
8925
+ @return {Object} a new object with the same keys as the passed object. The
8926
+ property values in the new object are the original values in
8927
+ the case of non-stream objects, and the streams' current
8928
+ values in the case of stream objects.
8929
+ */
8206
8930
  function readHash(object) {
8207
8931
  var ret = {};
8208
8932
  for (var key in object) {
@@ -8211,6 +8935,16 @@ enifed('ember-metal/streams/utils', ['exports', './stream'], function (exports,
8211
8935
  return ret;
8212
8936
  }
8213
8937
 
8938
+ /*
8939
+ Check whether an array contains any stream values
8940
+
8941
+ @public
8942
+ @for Ember.stream
8943
+ @function scanArray
8944
+ @param {Array} array array given to a handlebars helper
8945
+ @return {Boolean} `true` if the array contains a stream/bound value, `false`
8946
+ otherwise
8947
+ */
8214
8948
  function scanArray(array) {
8215
8949
  var length = array.length;
8216
8950
  var containsStream = false;
@@ -8225,6 +8959,16 @@ enifed('ember-metal/streams/utils', ['exports', './stream'], function (exports,
8225
8959
  return containsStream;
8226
8960
  }
8227
8961
 
8962
+ /*
8963
+ Check whether a hash has any stream property values
8964
+
8965
+ @public
8966
+ @for Ember.stream
8967
+ @function scanHash
8968
+ @param {Object} hash "hash" argument given to a handlebars helper
8969
+ @return {Boolean} `true` if the object contains a stream/bound value, `false`
8970
+ otherwise
8971
+ */
8228
8972
  function scanHash(hash) {
8229
8973
  var containsStream = false;
8230
8974
 
@@ -8238,6 +8982,19 @@ enifed('ember-metal/streams/utils', ['exports', './stream'], function (exports,
8238
8982
  return containsStream;
8239
8983
  }
8240
8984
 
8985
+ /*
8986
+ Join an array, with any streams replaced by their current values
8987
+
8988
+ @public
8989
+ @for Ember.stream
8990
+ @function concat
8991
+ @param {Array} array An array containing zero or more stream objects and
8992
+ zero or more non-stream objects
8993
+ @param {String} separator string to be used to join array elements
8994
+ @return {String} String with array elements concatenated and joined by the
8995
+ provided separator, and any stream array members having been
8996
+ replaced by the current value of the stream
8997
+ */
8241
8998
  function concat(array, separator) {
8242
8999
  // TODO: Create subclass ConcatStream < Stream. Defer
8243
9000
  // subscribing to streams until the value() is called.
@@ -8360,6 +9117,38 @@ enifed('ember-metal/streams/utils', ['exports', './stream'], function (exports,
8360
9117
  return stream;
8361
9118
  }
8362
9119
 
9120
+ /**
9121
+ Generate a new stream by providing a source stream and a function that can
9122
+ be used to transform the stream's value. In the case of a non-stream object,
9123
+ returns the result of the function.
9124
+
9125
+ The value to transform would typically be available to the function you pass
9126
+ to `chain()` via scope. For example:
9127
+
9128
+ ```javascript
9129
+ var source = ...; // stream returning a number
9130
+ // or a numeric (non-stream) object
9131
+ var result = chain(source, function() {
9132
+ var currentValue = read(source);
9133
+ return currentValue + 1;
9134
+ });
9135
+ ```
9136
+
9137
+ In the example, result is a stream if source is a stream, or a number of
9138
+ source was numeric.
9139
+
9140
+ @public
9141
+ @for Ember.stream
9142
+ @function chain
9143
+ @param {Object|Stream} value A stream or non-stream object
9144
+ @param {Function} fn function to be run when the stream value changes, or to
9145
+ be run once in the case of a non-stream object
9146
+ @return {Object|Stream} In the case of a stream `value` parameter, a new
9147
+ stream that will be updated with the return value of
9148
+ the provided function `fn`. In the case of a
9149
+ non-stream object, the return value of the provided
9150
+ function `fn`.
9151
+ */
8363
9152
  function chain(value, fn, label) {
8364
9153
  Ember.assert('Must call chain with a label', !!label);
8365
9154
  if (isStream(value)) {
@@ -8404,15 +9193,6 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
8404
9193
  exports.meta = meta;
8405
9194
  exports.canInvoke = canInvoke;
8406
9195
 
8407
- /**
8408
- Generates a universally unique identifier. This method
8409
- is used internally by Ember for assisting with
8410
- the generation of GUID's and other unique identifiers
8411
- such as `bind-attr` data attributes.
8412
-
8413
- @public
8414
- @return {Number} [description]
8415
- */
8416
9196
  "REMOVE_USE_STRICT: true"; /**
8417
9197
  @module ember-metal
8418
9198
  */
@@ -8425,6 +9205,16 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
8425
9205
  @return {Number} the uuid
8426
9206
  */
8427
9207
  var _uuid = 0;
9208
+
9209
+ /**
9210
+ Generates a universally unique identifier. This method
9211
+ is used internally by Ember for assisting with
9212
+ the generation of GUID's and other unique identifiers
9213
+ such as `bind-attr` data attributes.
9214
+
9215
+ @public
9216
+ @return {Number} [description]
9217
+ */
8428
9218
  function uuid() {
8429
9219
  return ++_uuid;
8430
9220
  }
@@ -8557,7 +9347,9 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
8557
9347
  var NEXT_SUPER_PROPERTY = {
8558
9348
  name: "__nextSuper",
8559
9349
  descriptor: undefinedDescriptor
8560
- };function generateGuid(obj, prefix) {
9350
+ };
9351
+
9352
+ function generateGuid(obj, prefix) {
8561
9353
  if (!prefix) {
8562
9354
  prefix = GUID_PREFIX;
8563
9355
  }
@@ -8578,6 +9370,20 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
8578
9370
  return ret;
8579
9371
  }
8580
9372
 
9373
+ /**
9374
+ Returns a unique id for the object. If the object does not yet have a guid,
9375
+ one will be assigned to it. You can call this on any object,
9376
+ `Ember.Object`-based or not, but be aware that it will add a `_guid`
9377
+ property.
9378
+
9379
+ You can also use this method on DOM Element objects.
9380
+
9381
+ @private
9382
+ @method guidFor
9383
+ @for Ember
9384
+ @param {Object} obj any object, string, number, Element, or primitive
9385
+ @return {String} the unique guid for this instance.
9386
+ */
8581
9387
  function guidFor(obj) {
8582
9388
 
8583
9389
  // special cases where we don't want to add a key to object
@@ -8763,6 +9569,39 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
8763
9569
  return value;
8764
9570
  }
8765
9571
 
9572
+ /**
9573
+ @deprecated
9574
+ @private
9575
+
9576
+ In order to store defaults for a class, a prototype may need to create
9577
+ a default meta object, which will be inherited by any objects instantiated
9578
+ from the class's constructor.
9579
+
9580
+ However, the properties of that meta object are only shallow-cloned,
9581
+ so if a property is a hash (like the event system's `listeners` hash),
9582
+ it will by default be shared across all instances of that class.
9583
+
9584
+ This method allows extensions to deeply clone a series of nested hashes or
9585
+ other complex objects. For instance, the event system might pass
9586
+ `['listeners', 'foo:change', 'ember157']` to `prepareMetaPath`, which will
9587
+ walk down the keys provided.
9588
+
9589
+ For each key, if the key does not exist, it is created. If it already
9590
+ exists and it was inherited from its constructor, the constructor's
9591
+ key is cloned.
9592
+
9593
+ You can also pass false for `writable`, which will simply return
9594
+ undefined if `prepareMetaPath` discovers any part of the path that
9595
+ shared or undefined.
9596
+
9597
+ @method metaPath
9598
+ @for Ember
9599
+ @param {Object} obj The object whose meta we are examining
9600
+ @param {Array} path An array of keys to walk down
9601
+ @param {Boolean} writable whether or not to create a new meta
9602
+ (or meta property) if one does not already exist or if it's
9603
+ shared with its constructor
9604
+ */
8766
9605
  function metaPath(obj, path, writable) {
8767
9606
  Ember['default'].deprecate("Ember.metaPath is deprecated and will be removed from future releases.");
8768
9607
  var _meta = meta(obj, writable);
@@ -8791,6 +9630,18 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
8791
9630
  return value;
8792
9631
  }
8793
9632
 
9633
+ /**
9634
+ Wraps the passed function so that `this._super` will point to the superFunc
9635
+ when the function is invoked. This is the primitive we use to implement
9636
+ calls to super.
9637
+
9638
+ @private
9639
+ @method wrap
9640
+ @for Ember
9641
+ @param {Function} func The function to call
9642
+ @param {Function} superFunc The super function.
9643
+ @return {Function} wrapped function.
9644
+ */
8794
9645
  function wrap(func, superFunc) {
8795
9646
  function superWrapper() {
8796
9647
  var ret;
@@ -8850,6 +9701,26 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
8850
9701
  function canInvoke(obj, methodName) {
8851
9702
  return !!(obj && typeof obj[methodName] === "function");
8852
9703
  }
9704
+
9705
+ /**
9706
+ Checks to see if the `methodName` exists on the `obj`,
9707
+ and if it does, invokes it with the arguments passed.
9708
+
9709
+ ```javascript
9710
+ var d = new Date('03/15/2013');
9711
+
9712
+ Ember.tryInvoke(d, 'getTime'); // 1363320000000
9713
+ Ember.tryInvoke(d, 'setFullYear', [2014]); // 1394856000000
9714
+ Ember.tryInvoke(d, 'noSuchMethod', [2014]); // undefined
9715
+ ```
9716
+
9717
+ @method tryInvoke
9718
+ @for Ember
9719
+ @param {Object} obj The object to check for the method
9720
+ @param {String} methodName The method name to check for
9721
+ @param {Array} [args] The arguments to pass to the method
9722
+ @return {*} the return value of the invoked method or undefined if it cannot be invoked
9723
+ */
8853
9724
  function tryInvoke(obj, methodName, args) {
8854
9725
  if (canInvoke(obj, methodName)) {
8855
9726
  return args ? applyStr(obj, methodName, args) : applyStr(obj, methodName);
@@ -9040,6 +9911,29 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
9040
9911
  var isArray = Array.isArray || function (value) {
9041
9912
  return value !== null && value !== undefined && typeof value === "object" && typeof value.length === "number" && toString.call(value) === "[object Array]";
9042
9913
  };
9914
+
9915
+ /**
9916
+ Forces the passed object to be part of an array. If the object is already
9917
+ an array, it will return the object. Otherwise, it will add the object to
9918
+ an array. If obj is `null` or `undefined`, it will return an empty array.
9919
+
9920
+ ```javascript
9921
+ Ember.makeArray(); // []
9922
+ Ember.makeArray(null); // []
9923
+ Ember.makeArray(undefined); // []
9924
+ Ember.makeArray('lindsay'); // ['lindsay']
9925
+ Ember.makeArray([1, 2, 42]); // [1, 2, 42]
9926
+
9927
+ var controller = Ember.ArrayProxy.create({ content: [] });
9928
+
9929
+ Ember.makeArray(controller) === controller; // true
9930
+ ```
9931
+
9932
+ @method makeArray
9933
+ @for Ember
9934
+ @param {Object} obj the object
9935
+ @return {Array}
9936
+ */
9043
9937
  function makeArray(obj) {
9044
9938
  if (obj === null || obj === undefined) {
9045
9939
  return [];
@@ -9047,6 +9941,19 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
9047
9941
  return isArray(obj) ? obj : [obj];
9048
9942
  }
9049
9943
 
9944
+ /**
9945
+ Convenience method to inspect an object. This method will attempt to
9946
+ convert the object into a useful string description.
9947
+
9948
+ It is a pretty simple implementation. If you want something more robust,
9949
+ use something like JSDump: https://github.com/NV/jsDump
9950
+
9951
+ @method inspect
9952
+ @for Ember
9953
+ @param {Object} obj The object you want to inspect.
9954
+ @return {String} A description of the object
9955
+ @since 1.4.0
9956
+ */
9050
9957
  function inspect(obj) {
9051
9958
  if (obj === null) {
9052
9959
  return "null";
@@ -9089,6 +9996,13 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
9089
9996
  return "{" + ret.join(", ") + "}";
9090
9997
  }
9091
9998
 
9999
+ // The following functions are intentionally minified to keep the functions
10000
+ // below Chrome's function body size inlining limit of 600 chars.
10001
+ /**
10002
+ @param {Object} target
10003
+ @param {Function} method
10004
+ @param {Array} args
10005
+ */
9092
10006
  function apply(t, m, a) {
9093
10007
  var l = a && a.length;
9094
10008
  if (!a || !l) {
@@ -9110,6 +10024,11 @@ enifed('ember-metal/utils', ['exports', 'ember-metal/core', 'ember-metal/platfor
9110
10024
  }
9111
10025
  }
9112
10026
 
10027
+ /**
10028
+ @param {Object} target
10029
+ @param {String} method
10030
+ @param {Array} args
10031
+ */
9113
10032
  function applyStr(t, m, a) {
9114
10033
  var l = a && a.length;
9115
10034
  if (!a || !l) {
@@ -9213,7 +10132,8 @@ enifed('ember-metal/watch_key', ['exports', 'ember-metal/core', 'ember-metal/uti
9213
10132
 
9214
10133
  // This is super annoying, but required until
9215
10134
  // https://github.com/babel/babel/issues/906 is resolved
9216
- ;
10135
+ ; // jshint ignore:line
10136
+
9217
10137
  function unwatchKey(obj, keyName, meta) {
9218
10138
  var m = meta || utils.meta(obj);
9219
10139
  var watching = m.watching;
@@ -9346,6 +10266,16 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/utils', 'ember-metal/cha
9346
10266
  }
9347
10267
 
9348
10268
  var NODE_STACK = [];
10269
+
10270
+ /**
10271
+ Tears down the meta on an object so that it can be garbage collected.
10272
+ Multiple calls will have no effect.
10273
+
10274
+ @method destroy
10275
+ @for Ember
10276
+ @param {Object} obj the object to destroy
10277
+ @return {void}
10278
+ */
9349
10279
  function destroy(obj) {
9350
10280
  var meta = obj["__ember_meta__"];
9351
10281
  var node, nodes, key, nodeObject;
@@ -9381,7 +10311,7 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/utils', 'ember-metal/cha
9381
10311
  }
9382
10312
 
9383
10313
  });
9384
- enifed('ember-template-compiler', ['exports', 'ember-metal/core', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template', 'ember-template-compiler/plugins', 'ember-template-compiler/plugins/transform-each-in-to-block-params', 'ember-template-compiler/plugins/transform-with-as-to-hash', 'ember-template-compiler/plugins/transform-bind-attr-to-attributes', 'ember-template-compiler/plugins/transform-each-into-collection', 'ember-template-compiler/plugins/transform-single-arg-each', '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/compat'], function (exports, _Ember, precompile, compile, template, plugins, TransformEachInToBlockParams, TransformWithAsToHash, TransformBindAttrToAttributes, TransformEachIntoCollection, TransformSingleArgEach, TransformOldBindingSyntax, TransformOldClassBindingSyntax, TransformItemClass, TransformComponentAttrsIntoMut, TransformComponentCurlyToReadonly, TransformAngleBracketComponents) {
10314
+ enifed('ember-template-compiler', ['exports', 'ember-metal/core', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template', 'ember-template-compiler/plugins', 'ember-template-compiler/plugins/transform-each-in-to-block-params', 'ember-template-compiler/plugins/transform-with-as-to-hash', 'ember-template-compiler/plugins/transform-bind-attr-to-attributes', 'ember-template-compiler/plugins/transform-each-into-collection', 'ember-template-compiler/plugins/transform-single-arg-each', '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/compat'], function (exports, _Ember, precompile, compile, template, plugins, TransformEachInToBlockParams, TransformWithAsToHash, TransformBindAttrToAttributes, TransformEachIntoCollection, TransformSingleArgEach, TransformOldBindingSyntax, TransformOldClassBindingSyntax, TransformItemClass, TransformComponentAttrsIntoMut, TransformComponentCurlyToReadonly, TransformAngleBracketComponents, TransformInputOnToOnEvent) {
9385
10315
 
9386
10316
  'use strict';
9387
10317
 
@@ -9396,6 +10326,7 @@ enifed('ember-template-compiler', ['exports', 'ember-metal/core', 'ember-templat
9396
10326
  plugins.registerPlugin("ast", TransformComponentAttrsIntoMut['default']);
9397
10327
  plugins.registerPlugin("ast", TransformComponentCurlyToReadonly['default']);
9398
10328
  plugins.registerPlugin("ast", TransformAngleBracketComponents['default']);
10329
+ plugins.registerPlugin("ast", TransformInputOnToOnEvent['default']);
9399
10330
 
9400
10331
  exports._Ember = _Ember['default'];
9401
10332
  exports.precompile = precompile['default'];
@@ -9450,15 +10381,16 @@ enifed('ember-template-compiler/plugins', ['exports'], function (exports) {
9450
10381
 
9451
10382
  exports.registerPlugin = registerPlugin;
9452
10383
 
10384
+ var plugins = {
10385
+ ast: []
10386
+ };
10387
+
9453
10388
  /**
9454
10389
  Adds an AST plugin to be used by Ember.HTMLBars.compile.
9455
10390
 
9456
10391
  @private
9457
10392
  @method registerASTPlugin
9458
10393
  */
9459
- var plugins = {
9460
- ast: []
9461
- };
9462
10394
  function registerPlugin(type, Plugin) {
9463
10395
  if (!plugins[type]) {
9464
10396
  throw new Error('Attempting to register "' + Plugin + '" as "' + type + '" which is not a valid HTMLBars plugin type.');
@@ -9514,9 +10446,10 @@ enifed('ember-template-compiler/plugins/transform-bind-attr-to-attributes', ['ex
9514
10446
  @submodule ember-htmlbars
9515
10447
  */
9516
10448
 
9517
- function TransformBindAttrToAttributes() {
10449
+ function TransformBindAttrToAttributes(options) {
9518
10450
  // set later within HTMLBars to the syntax package
9519
10451
  this.syntax = null;
10452
+ this.options = options || {};
9520
10453
  }
9521
10454
 
9522
10455
  /**
@@ -9526,6 +10459,7 @@ enifed('ember-template-compiler/plugins/transform-bind-attr-to-attributes', ['ex
9526
10459
  */
9527
10460
  TransformBindAttrToAttributes.prototype.transform = function TransformBindAttrToAttributes_transform(ast) {
9528
10461
  var plugin = this;
10462
+ var moduleName = this.options.moduleName;
9529
10463
  var walker = new this.syntax.Walker();
9530
10464
 
9531
10465
  walker.visit(ast, function (node) {
@@ -9533,7 +10467,7 @@ enifed('ember-template-compiler/plugins/transform-bind-attr-to-attributes', ['ex
9533
10467
  for (var i = 0; i < node.modifiers.length; i++) {
9534
10468
  var modifier = node.modifiers[i];
9535
10469
 
9536
- if (isBindAttrModifier(modifier)) {
10470
+ if (isBindAttrModifier(modifier, moduleName)) {
9537
10471
  node.modifiers.splice(i--, 1);
9538
10472
  plugin.assignAttrs(node, modifier.hash);
9539
10473
  }
@@ -9634,11 +10568,30 @@ enifed('ember-template-compiler/plugins/transform-bind-attr-to-attributes', ['ex
9634
10568
  }
9635
10569
  };
9636
10570
 
9637
- function isBindAttrModifier(modifier) {
10571
+ function isBindAttrModifier(modifier, moduleName) {
9638
10572
  var name = modifier.path.original;
9639
10573
 
10574
+ var _ref = modifier.path.loc.start || {};
10575
+
10576
+ var column = _ref.column;
10577
+ var line = _ref.line;
10578
+
10579
+ var moduleInfo = "";
10580
+
10581
+ if (moduleName) {
10582
+ moduleInfo += "'" + moduleName + "' @ ";
10583
+ }
10584
+
10585
+ if (line && column) {
10586
+ moduleInfo += "L" + line + ":C" + column;
10587
+ }
10588
+
10589
+ if (moduleInfo) {
10590
+ moduleInfo = "(" + moduleInfo + ") ";
10591
+ }
10592
+
9640
10593
  if (name === "bind-attr" || name === "bindAttr") {
9641
- Ember['default'].deprecate("The `" + name + "` helper is deprecated in favor of " + "HTMLBars-style bound attributes");
10594
+ Ember['default'].deprecate("The `" + name + "` helper " + moduleInfo + "is deprecated in favor of " + "HTMLBars-style bound attributes.");
9642
10595
  return true;
9643
10596
  } else {
9644
10597
  return false;
@@ -9926,66 +10879,203 @@ enifed('ember-template-compiler/plugins/transform-each-into-collection', ['expor
9926
10879
  var walker = new this.syntax.Walker();
9927
10880
 
9928
10881
  walker.visit(ast, function (node) {
9929
- var legacyHashKey = validate(node);
9930
- if (!legacyHashKey) {
9931
- return;
9932
- }
9933
-
9934
- var _ref = legacyHashKey.loc.start || {};
10882
+ var legacyHashKey = validate(node);
10883
+ if (!legacyHashKey) {
10884
+ return;
10885
+ }
10886
+
10887
+ var _ref = legacyHashKey.loc.start || {};
10888
+
10889
+ var column = _ref.column;
10890
+ var line = _ref.line;
10891
+
10892
+ var moduleInfo = '';
10893
+ if (options.moduleName) {
10894
+ moduleInfo += '\'' + options.moduleName + '\' ';
10895
+ }
10896
+
10897
+ if (line && column) {
10898
+ moduleInfo += '@L' + line + ':C' + column;
10899
+ }
10900
+
10901
+ Ember['default'].deprecate('Using \'' + legacyHashKey.key + '\' with \'{{each}}\' ' + moduleInfo + ' is deprecated. Please refactor to a component.');
10902
+
10903
+ var list = node.params.shift();
10904
+ node.path = b.path('collection');
10905
+
10906
+ node.params.unshift(b.string('-legacy-each'));
10907
+
10908
+ var pair = b.pair('content', list);
10909
+ pair.loc = list.loc;
10910
+
10911
+ node.hash.pairs.push(pair);
10912
+
10913
+ //pair = b.pair('dataSource', list);
10914
+ //node.hash.pairs.push(pair);
10915
+ });
10916
+
10917
+ return ast;
10918
+ };
10919
+
10920
+ function validate(node) {
10921
+ if ((node.type === 'BlockStatement' || node.type === 'MustacheStatement') && node.path.original === 'each') {
10922
+
10923
+ return any(node.hash.pairs, function (pair) {
10924
+ var key = pair.key;
10925
+ return key === 'itemController' || key === 'itemView' || key === 'itemViewClass' || key === 'tagName' || key === 'emptyView' || key === 'emptyViewClass';
10926
+ });
10927
+ }
10928
+
10929
+ return false;
10930
+ }
10931
+
10932
+ function any(list, predicate) {
10933
+ for (var i = 0, l = list.length; i < l; i++) {
10934
+ if (predicate(list[i])) {
10935
+ return list[i];
10936
+ }
10937
+ }
10938
+
10939
+ return false;
10940
+ }
10941
+
10942
+ });
10943
+ enifed('ember-template-compiler/plugins/transform-input-on-to-onEvent', ['exports'], function (exports) {
10944
+
10945
+ 'use strict';
10946
+
10947
+ /**
10948
+ @module ember
10949
+ @submodule ember-htmlbars
10950
+ */
10951
+
10952
+ /**
10953
+ An HTMLBars AST transformation that replaces all instances of
10954
+
10955
+ ```handlebars
10956
+ {{input on="enter" action="doStuff"}}
10957
+ {{input on="key-press" action="doStuff"}}
10958
+ ```
10959
+
10960
+ with
10961
+
10962
+ ```handlebars
10963
+ {{input enter="doStuff"}}
10964
+ {{input key-press="doStuff"}}
10965
+ ```
10966
+
10967
+ @private
10968
+ @class TransformInputOnToOnEvent
10969
+ */
10970
+ function TransformInputOnToOnEvent(options) {
10971
+ // set later within HTMLBars to the syntax package
10972
+ this.syntax = null;
10973
+ this.options = options || {};
10974
+ }
10975
+
10976
+ /**
10977
+ @private
10978
+ @method transform
10979
+ @param {AST} The AST to be transformed.
10980
+ */
10981
+ TransformInputOnToOnEvent.prototype.transform = function TransformInputOnToOnEvent_transform(ast) {
10982
+ var pluginContext = this;
10983
+ var b = pluginContext.syntax.builders;
10984
+ var walker = new pluginContext.syntax.Walker();
10985
+
10986
+ walker.visit(ast, function (node) {
10987
+ if (pluginContext.validate(node)) {
10988
+ var action = hashPairForKey(node.hash, 'action');
10989
+ var on = hashPairForKey(node.hash, 'on');
10990
+ var onEvent = hashPairForKey(node.hash, 'onEvent');
10991
+ var normalizedOn = on || onEvent;
10992
+ var moduleInfo = pluginContext.calculateModuleInfo(node.loc);
9935
10993
 
9936
- var column = _ref.column;
9937
- var line = _ref.line;
10994
+ if (normalizedOn && normalizedOn.value.type !== 'StringLiteral') {
10995
+ Ember.deprecate('Using a dynamic value for \'#{normalizedOn.key}=\' with the \'{{input}}\' helper ' + moduleInfo + ' is deprecated.');
9938
10996
 
9939
- var moduleInfo = '';
9940
- if (options.moduleName) {
9941
- moduleInfo += '\'' + options.moduleName + '\' ';
9942
- }
10997
+ normalizedOn.key = 'onEvent';
10998
+ return; // exit early, as we cannot transform further
10999
+ }
9943
11000
 
9944
- if (line && column) {
9945
- moduleInfo += '@L' + line + ':C' + column;
9946
- }
11001
+ removeFromHash(node.hash, normalizedOn);
11002
+ removeFromHash(node.hash, action);
9947
11003
 
9948
- Ember['default'].deprecate('Using \'' + legacyHashKey.key + '\' with \'{{each}}\' ' + moduleInfo + ' is deprecated. Please refactor to a component.');
11004
+ if (!action) {
11005
+ Ember.deprecate('Using \'{{input ' + normalizedOn.key + '="' + normalizedOn.value.value + '" ...}}\' without specifying an action ' + moduleInfo + ' will do nothing.');
9949
11006
 
9950
- var list = node.params.shift();
9951
- node.path = b.path('collection');
11007
+ return; // exit early, if no action was available there is nothing to do
11008
+ }
9952
11009
 
9953
- node.params.unshift(b.string('-legacy-each'));
11010
+ var specifiedOn = normalizedOn ? '' + normalizedOn.key + '="' + normalizedOn.value.value + '" ' : '';
11011
+ if (normalizedOn && normalizedOn.value.value === 'keyPress') {
11012
+ // using `keyPress` in the root of the component will
11013
+ // clobber the keyPress event handler
11014
+ normalizedOn.value.value = 'key-press';
11015
+ }
9954
11016
 
9955
- var pair = b.pair('content', list);
9956
- pair.loc = list.loc;
11017
+ var expected = '' + (normalizedOn ? normalizedOn.value.value : 'enter') + '="' + action.value.original + '"';
9957
11018
 
9958
- node.hash.pairs.push(pair);
11019
+ Ember.deprecate('Using \'{{input ' + specifiedOn + 'action="' + action.value.original + '"}} ' + moduleInfo + ' is deprecated. Please use \'{{input ' + expected + '}}\' instead.');
11020
+ if (!normalizedOn) {
11021
+ normalizedOn = b.pair('onEvent', b.string('enter'));
11022
+ }
9959
11023
 
9960
- //pair = b.pair('dataSource', list);
9961
- //node.hash.pairs.push(pair);
11024
+ node.hash.pairs.push(b.pair(normalizedOn.value.value, action.value));
11025
+ }
9962
11026
  });
9963
11027
 
9964
11028
  return ast;
9965
11029
  };
9966
11030
 
9967
- function validate(node) {
9968
- if ((node.type === 'BlockStatement' || node.type === 'MustacheStatement') && node.path.original === 'each') {
11031
+ TransformInputOnToOnEvent.prototype.validate = function TransformWithAsToHash_validate(node) {
11032
+ return node.type === 'MustacheStatement' && node.path.original === 'input' && (hashPairForKey(node.hash, 'action') || hashPairForKey(node.hash, 'on') || hashPairForKey(node.hash, 'onEvent'));
11033
+ };
9969
11034
 
9970
- return any(node.hash.pairs, function (pair) {
9971
- var key = pair.key;
9972
- return key === 'itemController' || key === 'itemView' || key === 'itemViewClass' || key === 'tagName' || key === 'emptyView' || key === 'emptyViewClass';
9973
- });
11035
+ TransformInputOnToOnEvent.prototype.calculateModuleInfo = function TransformInputOnToOnEvent_calculateModuleInfo(loc) {
11036
+ var _ref = loc.start || {};
11037
+
11038
+ var column = _ref.column;
11039
+ var line = _ref.line;
11040
+
11041
+ var moduleInfo = '';
11042
+ if (this.options.moduleName) {
11043
+ moduleInfo += '\'' + this.options.moduleName + '\' ';
11044
+ }
11045
+
11046
+ if (line !== undefined && column !== undefined) {
11047
+ moduleInfo += '@L' + line + ':C' + column;
11048
+ }
11049
+
11050
+ return moduleInfo;
11051
+ };
11052
+
11053
+ function hashPairForKey(hash, key) {
11054
+ for (var i = 0, l = hash.pairs.length; i < l; i++) {
11055
+ var pair = hash.pairs[i];
11056
+ if (pair.key === key) {
11057
+ return pair;
11058
+ }
9974
11059
  }
9975
11060
 
9976
11061
  return false;
9977
11062
  }
9978
11063
 
9979
- function any(list, predicate) {
9980
- for (var i = 0, l = list.length; i < l; i++) {
9981
- if (predicate(list[i])) {
9982
- return list[i];
11064
+ function removeFromHash(hash, pairToRemove) {
11065
+ var newPairs = [];
11066
+ for (var i = 0, l = hash.pairs.length; i < l; i++) {
11067
+ var pair = hash.pairs[i];
11068
+
11069
+ if (pair !== pairToRemove) {
11070
+ newPairs.push(pair);
9983
11071
  }
9984
11072
  }
9985
11073
 
9986
- return false;
11074
+ hash.pairs = newPairs;
9987
11075
  }
9988
11076
 
11077
+ exports['default'] = TransformInputOnToOnEvent;
11078
+
9989
11079
  });
9990
11080
  enifed('ember-template-compiler/plugins/transform-item-class', ['exports'], function (exports) {
9991
11081
 
@@ -10418,9 +11508,6 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
10418
11508
  exports['default'] = function (_options) {
10419
11509
  var disableComponentGeneration = true;
10420
11510
 
10421
- disableComponentGeneration = false;
10422
-
10423
-
10424
11511
  var options = _options || {};
10425
11512
  // When calling `Ember.Handlebars.compile()` a second argument of `true`
10426
11513
  // had a special meaning (long since lost), this just gaurds against
@@ -10434,7 +11521,7 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
10434
11521
 
10435
11522
  options.buildMeta = function buildMeta(program) {
10436
11523
  return {
10437
- revision: "Ember@1.13.0-beta.1",
11524
+ revision: "Ember@1.13.0-beta.2",
10438
11525
  loc: program.loc,
10439
11526
  moduleName: options.moduleName
10440
11527
  };
@@ -10531,21 +11618,6 @@ enifed('htmlbars-compiler/compiler', ['exports', '../htmlbars-syntax/parser', '.
10531
11618
  exports.template = template;
10532
11619
  exports.compile = compile;
10533
11620
 
10534
- /*
10535
- * Compile a string into a template spec string. The template spec is a string
10536
- * representation of a template. Usually, you would use compileSpec for
10537
- * pre-compilation of a template on the server.
10538
- *
10539
- * Example usage:
10540
- *
10541
- * var templateSpec = compileSpec("Howdy {{name}}");
10542
- * // This next step is basically what plain compile does
10543
- * var template = new Function("return " + templateSpec)();
10544
- *
10545
- * @method compileSpec
10546
- * @param {String} string An HTMLBars template string
10547
- * @return {TemplateSpec} A template spec string
10548
- */
10549
11621
  function compileSpec(string, options) {
10550
11622
  var ast = parser.preprocess(string, options);
10551
11623
  var compiler = new TemplateCompiler['default'](options);
@@ -10553,10 +11625,46 @@ enifed('htmlbars-compiler/compiler', ['exports', '../htmlbars-syntax/parser', '.
10553
11625
  return program;
10554
11626
  }
10555
11627
 
11628
+ /*
11629
+ * @method template
11630
+ * @param {TemplateSpec} templateSpec A precompiled template
11631
+ * @return {Template} A template spec string
11632
+ */
10556
11633
  function template(templateSpec) {
10557
11634
  return new Function("return " + templateSpec)();
10558
11635
  }
10559
11636
 
11637
+ /*
11638
+ * Compile a string into a template rendering function
11639
+ *
11640
+ * Example usage:
11641
+ *
11642
+ * // Template is the hydration portion of the compiled template
11643
+ * var template = compile("Howdy {{name}}");
11644
+ *
11645
+ * // Template accepts three arguments:
11646
+ * //
11647
+ * // 1. A context object
11648
+ * // 2. An env object
11649
+ * // 3. A contextualElement (optional, document.body is the default)
11650
+ * //
11651
+ * // The env object *must* have at least these two properties:
11652
+ * //
11653
+ * // 1. `hooks` - Basic hooks for rendering a template
11654
+ * // 2. `dom` - An instance of DOMHelper
11655
+ * //
11656
+ * import {hooks} from 'htmlbars-runtime';
11657
+ * import {DOMHelper} from 'morph';
11658
+ * var context = {name: 'whatever'},
11659
+ * env = {hooks: hooks, dom: new DOMHelper()},
11660
+ * contextualElement = document.body;
11661
+ * var domFragment = template(context, env, contextualElement);
11662
+ *
11663
+ * @method compile
11664
+ * @param {String} string An HTMLBars template string
11665
+ * @param {Object} options A set of options to provide to the compiler
11666
+ * @return {Template} A function for rendering the template
11667
+ */
10560
11668
  function compile(string, options) {
10561
11669
  return hooks.wrap(template(compileSpec(string, options)), render['default']);
10562
11670
  }
@@ -12066,78 +13174,6 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12066
13174
  exports.bindScope = bindScope;
12067
13175
  exports.updateScope = updateScope;
12068
13176
 
12069
- /**
12070
- HTMLBars delegates the runtime behavior of a template to
12071
- hooks provided by the host environment. These hooks explain
12072
- the lexical environment of a Handlebars template, the internal
12073
- representation of references, and the interaction between an
12074
- HTMLBars template and the DOM it is managing.
12075
-
12076
- While HTMLBars host hooks have access to all of this internal
12077
- machinery, templates and helpers have access to the abstraction
12078
- provided by the host hooks.
12079
-
12080
- ## The Lexical Environment
12081
-
12082
- The default lexical environment of an HTMLBars template includes:
12083
-
12084
- * Any local variables, provided by *block arguments*
12085
- * The current value of `self`
12086
-
12087
- ## Simple Nesting
12088
-
12089
- Let's look at a simple template with a nested block:
12090
-
12091
- ```hbs
12092
- <h1>{{title}}</h1>
12093
-
12094
- {{#if author}}
12095
- <p class="byline">{{author}}</p>
12096
- {{/if}}
12097
- ```
12098
-
12099
- In this case, the lexical environment at the top-level of the
12100
- template does not change inside of the `if` block. This is
12101
- achieved via an implementation of `if` that looks like this:
12102
-
12103
- ```js
12104
- registerHelper('if', function(params) {
12105
- if (!!params[0]) {
12106
- return this.yield();
12107
- }
12108
- });
12109
- ```
12110
-
12111
- A call to `this.yield` invokes the child template using the
12112
- current lexical environment.
12113
-
12114
- ## Block Arguments
12115
-
12116
- It is possible for nested blocks to introduce new local
12117
- variables:
12118
-
12119
- ```hbs
12120
- {{#count-calls as |i|}}
12121
- <h1>{{title}}</h1>
12122
- <p>Called {{i}} times</p>
12123
- {{/count}}
12124
- ```
12125
-
12126
- In this example, the child block inherits its surrounding
12127
- lexical environment, but augments it with a single new
12128
- variable binding.
12129
-
12130
- The implementation of `count-calls` supplies the value of
12131
- `i`, but does not otherwise alter the environment:
12132
-
12133
- ```js
12134
- var count = 0;
12135
- registerHelper('count-calls', function() {
12136
- return this.yield([ ++count ]);
12137
- });
12138
- ```
12139
- */
12140
-
12141
13177
  function wrap(template) {
12142
13178
  if (template === null) {
12143
13179
  return null;
@@ -12328,6 +13364,30 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12328
13364
  yieldIn: options.template.yieldIn
12329
13365
  };
12330
13366
  }
13367
+
13368
+ /**
13369
+ Host Hook: createScope
13370
+
13371
+ @param {Scope?} parentScope
13372
+ @return Scope
13373
+
13374
+ Corresponds to entering a new HTMLBars block.
13375
+
13376
+ This hook is invoked when a block is entered with
13377
+ a new `self` or additional local variables.
13378
+
13379
+ When invoked for a top-level template, the
13380
+ `parentScope` is `null`, and this hook should return
13381
+ a fresh Scope.
13382
+
13383
+ When invoked for a child template, the `parentScope`
13384
+ is the scope for the parent environment.
13385
+
13386
+ Note that the `Scope` is an opaque value that is
13387
+ passed to other host hooks. For example, the `get`
13388
+ hook uses the scope to retrieve a value for a given
13389
+ scope and variable name.
13390
+ */
12331
13391
  function createScope(env, parentScope) {
12332
13392
  if (parentScope) {
12333
13393
  return env.hooks.createChildScope(parentScope);
@@ -12343,6 +13403,61 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12343
13403
  return { self: null, blocks: {}, locals: {}, localPresent: {} };
12344
13404
  }
12345
13405
 
13406
+ /**
13407
+ Host Hook: bindShadowScope
13408
+
13409
+ @param {Scope?} parentScope
13410
+ @return Scope
13411
+
13412
+ Corresponds to rendering a new template into an existing
13413
+ render tree, but with a new top-level lexical scope. This
13414
+ template is called the "shadow root".
13415
+
13416
+ If a shadow template invokes `{{yield}}`, it will render
13417
+ the block provided to the shadow root in the original
13418
+ lexical scope.
13419
+
13420
+ ```hbs
13421
+ {{!-- post template --}}
13422
+ <p>{{props.title}}</p>
13423
+ {{yield}}
13424
+
13425
+ {{!-- blog template --}}
13426
+ {{#post title="Hello world"}}
13427
+ <p>by {{byline}}</p>
13428
+ <article>This is my first post</article>
13429
+ {{/post}}
13430
+
13431
+ {{#post title="Goodbye world"}}
13432
+ <p>by {{byline}}</p>
13433
+ <article>This is my last post</article>
13434
+ {{/post}}
13435
+ ```
13436
+
13437
+ ```js
13438
+ helpers.post = function(params, hash, options) {
13439
+ options.template.yieldIn(postTemplate, { props: hash });
13440
+ };
13441
+
13442
+ blog.render({ byline: "Yehuda Katz" });
13443
+ ```
13444
+
13445
+ Produces:
13446
+
13447
+ ```html
13448
+ <p>Hello world</p>
13449
+ <p>by Yehuda Katz</p>
13450
+ <article>This is my first post</article>
13451
+
13452
+ <p>Goodbye world</p>
13453
+ <p>by Yehuda Katz</p>
13454
+ <article>This is my last post</article>
13455
+ ```
13456
+
13457
+ In short, `yieldIn` creates a new top-level scope for the
13458
+ provided template and renders it, making the original block
13459
+ available to `{{yield}}` in that template.
13460
+ */
12346
13461
  function bindShadowScope(env /*, parentScope, shadowScope */) {
12347
13462
  return env.hooks.createFreshScope();
12348
13463
  }
@@ -12353,6 +13468,19 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12353
13468
  return scope;
12354
13469
  }
12355
13470
 
13471
+ /**
13472
+ Host Hook: bindSelf
13473
+
13474
+ @param {Scope} scope
13475
+ @param {any} self
13476
+
13477
+ Corresponds to entering a template.
13478
+
13479
+ This hook is invoked when the `self` value for a scope is ready to be bound.
13480
+
13481
+ The host must ensure that child scopes reflect the change to the `self` in
13482
+ future calls to the `get` hook.
13483
+ */
12356
13484
  function bindSelf(env, scope, self) {
12357
13485
  scope.self = self;
12358
13486
  }
@@ -12361,6 +13489,21 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12361
13489
  env.hooks.bindSelf(env, scope, self);
12362
13490
  }
12363
13491
 
13492
+ /**
13493
+ Host Hook: bindLocal
13494
+
13495
+ @param {Environment} env
13496
+ @param {Scope} scope
13497
+ @param {String} name
13498
+ @param {any} value
13499
+
13500
+ Corresponds to entering a template with block arguments.
13501
+
13502
+ This hook is invoked when a local variable for a scope has been provided.
13503
+
13504
+ The host must ensure that child scopes reflect the change in future calls
13505
+ to the `get` hook.
13506
+ */
12364
13507
  function bindLocal(env, scope, name, value) {
12365
13508
  scope.localPresent[name] = true;
12366
13509
  scope.locals[name] = value;
@@ -12370,12 +13513,75 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12370
13513
  env.hooks.bindLocal(env, scope, name, value);
12371
13514
  }
12372
13515
 
13516
+ /**
13517
+ Host Hook: bindBlock
13518
+
13519
+ @param {Environment} env
13520
+ @param {Scope} scope
13521
+ @param {Function} block
13522
+
13523
+ Corresponds to entering a shadow template that was invoked by a block helper with
13524
+ `yieldIn`.
13525
+
13526
+ This hook is invoked with an opaque block that will be passed along
13527
+ to the shadow template, and inserted into the shadow template when
13528
+ `{{yield}}` is used. Optionally provide a non-default block name
13529
+ that can be targeted by `{{yield to=blockName}}`.
13530
+ */
12373
13531
  function bindBlock(env, scope, block) {
12374
13532
  var name = arguments[3] === undefined ? "default" : arguments[3];
12375
13533
 
12376
13534
  scope.blocks[name] = block;
12377
13535
  }
12378
13536
 
13537
+ /**
13538
+ Host Hook: block
13539
+
13540
+ @param {RenderNode} renderNode
13541
+ @param {Environment} env
13542
+ @param {Scope} scope
13543
+ @param {String} path
13544
+ @param {Array} params
13545
+ @param {Object} hash
13546
+ @param {Block} block
13547
+ @param {Block} elseBlock
13548
+
13549
+ Corresponds to:
13550
+
13551
+ ```hbs
13552
+ {{#helper param1 param2 key1=val1 key2=val2}}
13553
+ {{!-- child template --}}
13554
+ {{/helper}}
13555
+ ```
13556
+
13557
+ This host hook is a workhorse of the system. It is invoked
13558
+ whenever a block is encountered, and is responsible for
13559
+ resolving the helper to call, and then invoke it.
13560
+
13561
+ The helper should be invoked with:
13562
+
13563
+ - `{Array} params`: the parameters passed to the helper
13564
+ in the template.
13565
+ - `{Object} hash`: an object containing the keys and values passed
13566
+ in the hash position in the template.
13567
+
13568
+ The values in `params` and `hash` will already be resolved
13569
+ through a previous call to the `get` host hook.
13570
+
13571
+ The helper should be invoked with a `this` value that is
13572
+ an object with one field:
13573
+
13574
+ `{Function} yield`: when invoked, this function executes the
13575
+ block with the current scope. It takes an optional array of
13576
+ block parameters. If block parameters are supplied, HTMLBars
13577
+ will invoke the `bindLocal` host hook to bind the supplied
13578
+ values to the block arguments provided by the template.
13579
+
13580
+ In general, the default implementation of `block` should work
13581
+ for most host environments. It delegates to other host hooks
13582
+ where appropriate, and properly invokes the helper with the
13583
+ appropriate arguments.
13584
+ */
12379
13585
  function block(morph, env, scope, path, params, hash, template, inverse, visitor) {
12380
13586
  if (handleRedirect(morph, env, scope, path, params, hash, template, inverse, visitor)) {
12381
13587
  return;
@@ -12397,6 +13603,10 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12397
13603
  }
12398
13604
 
12399
13605
  function handleRedirect(morph, env, scope, path, params, hash, template, inverse, visitor) {
13606
+ if (!path) {
13607
+ return false;
13608
+ }
13609
+
12400
13610
  var redirect = env.hooks.classify(env, scope, path);
12401
13611
  if (redirect) {
12402
13612
  switch (redirect) {
@@ -12508,6 +13718,44 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12508
13718
  return;
12509
13719
  }
12510
13720
 
13721
+ /**
13722
+ Host Hook: inline
13723
+
13724
+ @param {RenderNode} renderNode
13725
+ @param {Environment} env
13726
+ @param {Scope} scope
13727
+ @param {String} path
13728
+ @param {Array} params
13729
+ @param {Hash} hash
13730
+
13731
+ Corresponds to:
13732
+
13733
+ ```hbs
13734
+ {{helper param1 param2 key1=val1 key2=val2}}
13735
+ ```
13736
+
13737
+ This host hook is similar to the `block` host hook, but it
13738
+ invokes helpers that do not supply an attached block.
13739
+
13740
+ Like the `block` hook, the helper should be invoked with:
13741
+
13742
+ - `{Array} params`: the parameters passed to the helper
13743
+ in the template.
13744
+ - `{Object} hash`: an object containing the keys and values passed
13745
+ in the hash position in the template.
13746
+
13747
+ The values in `params` and `hash` will already be resolved
13748
+ through a previous call to the `get` host hook.
13749
+
13750
+ In general, the default implementation of `inline` should work
13751
+ for most host environments. It delegates to other host hooks
13752
+ where appropriate, and properly invokes the helper with the
13753
+ appropriate arguments.
13754
+
13755
+ The default implementation of `inline` also makes `partial`
13756
+ a keyword. Instead of invoking a helper named `partial`,
13757
+ it invokes the `partial` host hook.
13758
+ */
12511
13759
  function inline(morph, env, scope, path, params, hash, visitor) {
12512
13760
  if (handleRedirect(morph, env, scope, path, params, hash, null, null, visitor)) {
12513
13761
  return;
@@ -12588,11 +13836,31 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12588
13836
  return !!(scope.blocks[name] && scope.blocks[name].arity);
12589
13837
  }
12590
13838
 
12591
- };function partial(renderNode, env, scope, path) {
13839
+ };
13840
+
13841
+ function partial(renderNode, env, scope, path) {
12592
13842
  var template = env.partials[path];
12593
13843
  return template.render(scope.self, env, {}).fragment;
12594
13844
  }
12595
13845
 
13846
+ /**
13847
+ Host hook: range
13848
+
13849
+ @param {RenderNode} renderNode
13850
+ @param {Environment} env
13851
+ @param {Scope} scope
13852
+ @param {any} value
13853
+
13854
+ Corresponds to:
13855
+
13856
+ ```hbs
13857
+ {{content}}
13858
+ {{{unescaped}}}
13859
+ ```
13860
+
13861
+ This hook is responsible for updating a render node
13862
+ that represents a range of content with a value.
13863
+ */
12596
13864
  function range(morph, env, scope, path, value, visitor) {
12597
13865
  if (handleRedirect(morph, env, scope, path, [value], {}, null, null, visitor)) {
12598
13866
  return;
@@ -12607,6 +13875,33 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12607
13875
  morph.lastValue = value;
12608
13876
  }
12609
13877
 
13878
+ /**
13879
+ Host hook: element
13880
+
13881
+ @param {RenderNode} renderNode
13882
+ @param {Environment} env
13883
+ @param {Scope} scope
13884
+ @param {String} path
13885
+ @param {Array} params
13886
+ @param {Hash} hash
13887
+
13888
+ Corresponds to:
13889
+
13890
+ ```hbs
13891
+ <div {{bind-attr foo=bar}}></div>
13892
+ ```
13893
+
13894
+ This hook is responsible for invoking a helper that
13895
+ modifies an element.
13896
+
13897
+ Its purpose is largely legacy support for awkward
13898
+ idioms that became common when using the string-based
13899
+ Handlebars engine.
13900
+
13901
+ Most of the uses of the `element` hook are expected
13902
+ to be superseded by component syntax and the
13903
+ `attribute` hook.
13904
+ */
12610
13905
  function element(morph, env, scope, path, params, hash, visitor) {
12611
13906
  if (handleRedirect(morph, env, scope, path, params, hash, null, null, visitor)) {
12612
13907
  return;
@@ -12618,6 +13913,27 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12618
13913
  }
12619
13914
  }
12620
13915
 
13916
+ /**
13917
+ Host hook: attribute
13918
+
13919
+ @param {RenderNode} renderNode
13920
+ @param {Environment} env
13921
+ @param {String} name
13922
+ @param {any} value
13923
+
13924
+ Corresponds to:
13925
+
13926
+ ```hbs
13927
+ <div foo={{bar}}></div>
13928
+ ```
13929
+
13930
+ This hook is responsible for updating a render node
13931
+ that represents an element's attribute with a value.
13932
+
13933
+ It receives the name of the attribute as well as an
13934
+ already-resolved value, and should update the render
13935
+ node with the value if appropriate.
13936
+ */
12621
13937
  function attribute(morph, env, scope, name, value) {
12622
13938
  value = env.hooks.getValue(value);
12623
13939
 
@@ -12636,6 +13952,26 @@ enifed('htmlbars-runtime/hooks', ['exports', './render', '../morph-range/morph-l
12636
13952
  }
12637
13953
  }
12638
13954
 
13955
+ /**
13956
+ Host Hook: get
13957
+
13958
+ @param {Environment} env
13959
+ @param {Scope} scope
13960
+ @param {String} path
13961
+
13962
+ Corresponds to:
13963
+
13964
+ ```hbs
13965
+ {{foo.bar}}
13966
+ ^
13967
+
13968
+ {{helper foo.bar key=value}}
13969
+ ^ ^
13970
+ ```
13971
+
13972
+ This hook is the "leaf" hook of the system. It is used to
13973
+ resolve a path relative to the current scope.
13974
+ */
12639
13975
  function get(env, scope, path) {
12640
13976
  if (path === "") {
12641
13977
  return scope.self;
@@ -12818,7 +14154,7 @@ enifed('htmlbars-runtime/morph', ['exports', '../morph-range', '../htmlbars-util
12818
14154
  exports['default'] = HTMLBarsMorph;
12819
14155
 
12820
14156
  });
12821
- enifed('htmlbars-runtime/render', ['exports', '../htmlbars-util/array-utils', '../htmlbars-util/morph-utils', './expression-visitor', './morph', '../htmlbars-util/template-utils'], function (exports, array_utils, morph_utils, ExpressionVisitor, Morph, template_utils) {
14157
+ 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, array_utils, morph_utils, ExpressionVisitor, Morph, template_utils, voidMap) {
12822
14158
 
12823
14159
  'use strict';
12824
14160
 
@@ -12931,9 +14267,13 @@ enifed('htmlbars-runtime/render', ['exports', '../htmlbars-util/array-utils', '.
12931
14267
  dom.setAttribute(el1, key, attributes[key]);
12932
14268
  }
12933
14269
 
12934
- var el2 = dom.createComment("");
12935
- dom.appendChild(el1, el2);
14270
+ if (!voidMap['default'][tagName]) {
14271
+ var el2 = dom.createComment("");
14272
+ dom.appendChild(el1, el2);
14273
+ }
14274
+
12936
14275
  dom.appendChild(el0, el1);
14276
+
12937
14277
  return el0;
12938
14278
  },
12939
14279
  buildRenderNodes: function buildRenderNodes(dom, fragment) {
@@ -13143,8 +14483,6 @@ enifed('htmlbars-syntax/builders', ['exports'], function (exports) {
13143
14483
  exports.buildPair = buildPair;
13144
14484
  exports.buildProgram = buildProgram;
13145
14485
 
13146
- // Statements
13147
-
13148
14486
  function buildMustache(path, params, hash, raw) {
13149
14487
  return {
13150
14488
  type: "MustacheStatement",
@@ -13199,6 +14537,8 @@ enifed('htmlbars-syntax/builders', ['exports'], function (exports) {
13199
14537
  };
13200
14538
  }
13201
14539
 
14540
+ // Nodes
14541
+
13202
14542
  function buildElement(tag, attributes, modifiers, children) {
13203
14543
  return {
13204
14544
  type: "ElementNode",
@@ -13233,6 +14573,8 @@ enifed('htmlbars-syntax/builders', ['exports'], function (exports) {
13233
14573
  };
13234
14574
  }
13235
14575
 
14576
+ // Expressions
14577
+
13236
14578
  function buildSexpr(path, params, hash) {
13237
14579
  return {
13238
14580
  type: "SubExpression",
@@ -13290,6 +14632,8 @@ enifed('htmlbars-syntax/builders', ['exports'], function (exports) {
13290
14632
  };
13291
14633
  }
13292
14634
 
14635
+ // Miscellaneous
14636
+
13293
14637
  function buildHash(pairs) {
13294
14638
  return {
13295
14639
  type: "Hash",
@@ -13586,6 +14930,7 @@ enifed('htmlbars-syntax/handlebars/compiler/helpers', ['exports', '../exception'
13586
14930
  }
13587
14931
 
13588
14932
  function preparePath(data, parts, locInfo) {
14933
+ /*jshint -W040 */
13589
14934
  locInfo = this.locInfo(locInfo);
13590
14935
 
13591
14936
  var original = data ? '@' : '',
@@ -13617,6 +14962,7 @@ enifed('htmlbars-syntax/handlebars/compiler/helpers', ['exports', '../exception'
13617
14962
  }
13618
14963
 
13619
14964
  function prepareMustache(path, params, hash, open, strip, locInfo) {
14965
+ /*jshint -W040 */
13620
14966
  // Must use charAt to support IE pre-10
13621
14967
  var escapeFlag = open.charAt(3) || open.charAt(2),
13622
14968
  escaped = escapeFlag !== '{' && escapeFlag !== '&';
@@ -13625,6 +14971,7 @@ enifed('htmlbars-syntax/handlebars/compiler/helpers', ['exports', '../exception'
13625
14971
  }
13626
14972
 
13627
14973
  function prepareRawBlock(openRawBlock, content, close, locInfo) {
14974
+ /*jshint -W040 */
13628
14975
  if (openRawBlock.path.original !== close) {
13629
14976
  var errorNode = { loc: openRawBlock.path.loc };
13630
14977
 
@@ -13638,6 +14985,7 @@ enifed('htmlbars-syntax/handlebars/compiler/helpers', ['exports', '../exception'
13638
14985
  }
13639
14986
 
13640
14987
  function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {
14988
+ /*jshint -W040 */
13641
14989
  // When we are chaining inverse calls, we will not have a close path
13642
14990
  if (close && close.path && openBlock.path.original !== close.path.original) {
13643
14991
  var errorNode = { loc: openBlock.path.loc };
@@ -13673,6 +15021,7 @@ enifed('htmlbars-syntax/handlebars/compiler/parser', ['exports'], function (expo
13673
15021
 
13674
15022
  'use strict';
13675
15023
 
15024
+ /* jshint ignore:start */
13676
15025
  /* istanbul ignore next */
13677
15026
  /* Jison generated parser */
13678
15027
  var handlebars = (function () {
@@ -14343,6 +15692,7 @@ enifed('htmlbars-syntax/handlebars/compiler/parser', ['exports'], function (expo
14343
15692
  }Parser.prototype = parser;parser.Parser = Parser;
14344
15693
  return new Parser();
14345
15694
  })();exports['default'] = handlebars;
15695
+ /* jshint ignore:end */
14346
15696
 
14347
15697
  });
14348
15698
  enifed('htmlbars-syntax/handlebars/compiler/visitor', ['exports', '../exception', './ast'], function (exports, Exception, AST) {
@@ -14784,7 +16134,9 @@ enifed('htmlbars-syntax/handlebars/utils', ['exports'], function (exports) {
14784
16134
  var isFunction;
14785
16135
  var isArray = Array.isArray || function (value) {
14786
16136
  return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
14787
- };function indexOf(array, value) {
16137
+ };
16138
+
16139
+ function indexOf(array, value) {
14788
16140
  for (var i = 0, len = array.length; i < len; i++) {
14789
16141
  if (array[i] === value) {
14790
16142
  return i;
@@ -15103,19 +16455,10 @@ enifed('htmlbars-syntax/parser', ['exports', './handlebars/compiler/base', './to
15103
16455
  };
15104
16456
 
15105
16457
  });
15106
- enifed('htmlbars-syntax/token-handlers', ['exports', '../htmlbars-util/array-utils', './builders', './utils'], function (exports, array_utils, builders, utils) {
16458
+ enifed('htmlbars-syntax/token-handlers', ['exports', './builders', './utils', '../htmlbars-util/void-tag-names'], function (exports, builders, utils, voidMap) {
15107
16459
 
15108
16460
  'use strict';
15109
16461
 
15110
- var voidTagNames = "area base br col command embed hr img input keygen link meta param source track wbr";
15111
- var voidMap = {};
15112
-
15113
- array_utils.forEach(voidTagNames.split(" "), function (tagName) {
15114
- voidMap[tagName] = true;
15115
- });
15116
-
15117
- // Except for `mustache`, all tokens are only allowed outside of
15118
- // a start or end tag.
15119
16462
  var tokenHandlers = {
15120
16463
  Comment: function (token) {
15121
16464
  var current = this.currentElement();
@@ -15137,7 +16480,7 @@ enifed('htmlbars-syntax/token-handlers', ['exports', '../htmlbars-util/array-uti
15137
16480
  };
15138
16481
 
15139
16482
  this.elementStack.push(element);
15140
- if (voidMap.hasOwnProperty(tag.tagName) || tag.selfClosing) {
16483
+ if (voidMap['default'].hasOwnProperty(tag.tagName) || tag.selfClosing) {
15141
16484
  tokenHandlers.EndTag.call(this, tag, true);
15142
16485
  }
15143
16486
  },
@@ -15214,7 +16557,7 @@ enifed('htmlbars-syntax/token-handlers', ['exports', '../htmlbars-util/array-uti
15214
16557
  function validateEndTag(tag, element, selfClosing) {
15215
16558
  var error;
15216
16559
 
15217
- if (voidMap[tag.tagName] && !selfClosing) {
16560
+ if (voidMap['default'][tag.tagName] && !selfClosing) {
15218
16561
  // EngTag is also called by StartTag for void and self-closing tags (i.e.
15219
16562
  // <input> or <br />, so we need to check for that here. Otherwise, we would
15220
16563
  // throw an error for those cases.
@@ -15344,11 +16687,12 @@ enifed('htmlbars-syntax/utils', ['exports', '../htmlbars-util/array-utils'], fun
15344
16687
  exports.isHelper = isHelper;
15345
16688
  exports.unwrapMustache = unwrapMustache;
15346
16689
 
16690
+ var ID_INVERSE_PATTERN = /[!"#%-,\.\/;->@\[-\^`\{-~]/;
16691
+
15347
16692
  // Checks the component's attributes to see if it uses block params.
15348
16693
  // If it does, registers the block params with the program and
15349
16694
  // removes the corresponding attributes from the element.
15350
16695
 
15351
- var ID_INVERSE_PATTERN = /[!"#%-,\.\/;->@\[-\^`\{-~]/;
15352
16696
  function parseComponentBlockParams(element, program) {
15353
16697
  var l = element.attributes.length;
15354
16698
  var attrNames = [];
@@ -15637,6 +16981,9 @@ enifed('htmlbars-test-helpers', ['exports', '../simple-html-tokenizer', '../html
15637
16981
  }
15638
16982
  }
15639
16983
 
16984
+ // IE8 does not have Object.create, so use a polyfill if needed.
16985
+ // Polyfill based on Mozilla's (MDN)
16986
+
15640
16987
  function createObject(obj) {
15641
16988
  if (typeof Object.create === "function") {
15642
16989
  return Object.create(obj);
@@ -15788,7 +17135,9 @@ enifed('htmlbars-util/handlebars/utils', ['exports'], function (exports) {
15788
17135
  var isFunction;
15789
17136
  var isArray = Array.isArray || function (value) {
15790
17137
  return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
15791
- };function indexOf(array, value) {
17138
+ };
17139
+
17140
+ function indexOf(array, value) {
15792
17141
  for (var i = 0, len = array.length; i < len; i++) {
15793
17142
  if (array[i] === value) {
15794
17143
  return i;
@@ -15853,8 +17202,6 @@ enifed('htmlbars-util/morph-utils', ['exports'], function (exports) {
15853
17202
  exports.linkParams = linkParams;
15854
17203
  exports.dump = dump;
15855
17204
 
15856
- /*globals console*/
15857
-
15858
17205
  function visitChildren(nodes, callback) {
15859
17206
  if (!nodes || nodes.length === 0) {
15860
17207
  return;
@@ -15984,6 +17331,9 @@ enifed('htmlbars-util/object-utils', ['exports'], function (exports) {
15984
17331
  return options;
15985
17332
  }
15986
17333
 
17334
+ // IE8 does not have Object.create, so use a polyfill if needed.
17335
+ // Polyfill based on Mozilla's (MDN)
17336
+
15987
17337
  function createObject(obj) {
15988
17338
  if (typeof Object.create === 'function') {
15989
17339
  return Object.create(obj);
@@ -16210,6 +17560,20 @@ enifed('htmlbars-util/template-utils', ['exports', '../htmlbars-util/morph-utils
16210
17560
  morph.childNodes = null;
16211
17561
  }
16212
17562
 
17563
+ });
17564
+ enifed('htmlbars-util/void-tag-names', ['exports', './array-utils'], function (exports, array_utils) {
17565
+
17566
+ 'use strict';
17567
+
17568
+ var voidTagNames = "area base br col command embed hr img input keygen link meta param source track wbr";
17569
+ var voidMap = {};
17570
+
17571
+ array_utils.forEach(voidTagNames.split(" "), function (tagName) {
17572
+ voidMap[tagName] = true;
17573
+ });
17574
+
17575
+ exports['default'] = voidMap;
17576
+
16213
17577
  });
16214
17578
  enifed('morph-range', ['exports', './morph-range/utils'], function (exports, utils) {
16215
17579
 
@@ -16594,7 +17958,6 @@ enifed('morph-range/utils', ['exports'], function (exports) {
16594
17958
  exports.clear = clear;
16595
17959
  exports.insertBefore = insertBefore;
16596
17960
 
16597
- // inclusive of both nodes
16598
17961
  function clear(parentNode, firstNode, lastNode) {
16599
17962
  if (!parentNode) {
16600
17963
  return;