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

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

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 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;