ember-source 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ae311b4fdb4db0837f043ca199f2befaf32f88d
4
- data.tar.gz: f29351bb8601f8615afe5cbd57b2e95886070f7f
3
+ metadata.gz: 9cc64c5dd2c8c7843ab6d7d8b26cf818d499752c
4
+ data.tar.gz: 50db81852adbd9ad364dc2d644de0feae27f67c8
5
5
  SHA512:
6
- metadata.gz: 71ed8de829de203fe90dcfd1eb65557dafa934eb7194c6e79b50c8d422a6e1bbc523cfefbf58186fcb904ed1a30ae0d2a4062736b9f79f2d83f0181c700abe07
7
- data.tar.gz: 615a9c94d139bb4e6e6fad2d0901eb3d015cc68db2e29a4fc2f4097148ea4ff72e66bbbdcb480869c357bbe4d52e980e985a32b6d40f7280cf34efc17561a700
6
+ metadata.gz: 302cd2eceb635088d49d7154886a0e851a3b4de8acc936e712cd950756d6a86909602803eb3cc0574a1bac2949716fbee1a80eb37b7b55d63ce63ce3c3ce558d
7
+ data.tar.gz: cb3314d8d16dba6c167d827dde4aeae20503024b2c039e5d9faf069dc459777f9269f0355a874af34f0d664d461fffcd79f62c2d71bad6d57c379e9706ce71b9
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.0
1
+ 2.3.1
@@ -6,7 +6,7 @@
6
6
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
7
7
  * @license Licensed under MIT license
8
8
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
9
- * @version 2.3.0
9
+ * @version 2.3.1
10
10
  */
11
11
 
12
12
  var enifed, requireModule, require, requirejs, Ember;
@@ -3690,7 +3690,6 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/debug', 'ember-metal/pro
3690
3690
  var args;
3691
3691
 
3692
3692
  var addArg = function (property) {
3693
- _emberMetalDebug.assert('Depending on arrays using a dependent key ending with `@each` is no longer supported. ' + ('Please refactor from `Ember.computed(\'' + property + '\', function() {});` to `Ember.computed(\'' + property.slice(0, -6) + '.[]\', function() {})`.'), property.slice(-5) !== '@each');
3694
3693
  args.push(property);
3695
3694
  };
3696
3695
 
@@ -4794,7 +4793,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4794
4793
 
4795
4794
  @class Ember
4796
4795
  @static
4797
- @version 2.3.0
4796
+ @version 2.3.1
4798
4797
  @public
4799
4798
  */
4800
4799
 
@@ -4838,11 +4837,11 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4838
4837
 
4839
4838
  @property VERSION
4840
4839
  @type String
4841
- @default '2.3.0'
4840
+ @default '2.3.1'
4842
4841
  @static
4843
4842
  @public
4844
4843
  */
4845
- Ember.VERSION = '2.3.0';
4844
+ Ember.VERSION = '2.3.1';
4846
4845
 
4847
4846
  /**
4848
4847
  The hash of environment variables used to control various configuration
@@ -5579,6 +5578,8 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error'], functi
5579
5578
 
5580
5579
  var SPLIT_REGEX = /\{|\}/;
5581
5580
 
5581
+ var END_WITH_EACH_REGEX = /\.@each$/;
5582
+
5582
5583
  /**
5583
5584
  Expands `pattern`, invoking `callback` for each expansion.
5584
5585
 
@@ -5623,10 +5624,10 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error'], functi
5623
5624
  });
5624
5625
 
5625
5626
  properties.forEach(function (property) {
5626
- callback(property.join(''));
5627
+ callback(property.join('').replace(END_WITH_EACH_REGEX, '.[]'));
5627
5628
  });
5628
5629
  } else {
5629
- callback(pattern);
5630
+ callback(pattern.replace(END_WITH_EACH_REGEX, '.[]'));
5630
5631
  }
5631
5632
  }
5632
5633
 
@@ -7514,6 +7515,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
7514
7515
  exports.aliasMethod = aliasMethod;
7515
7516
  exports.observer = observer;
7516
7517
  exports._immediateObserver = _immediateObserver;
7518
+ exports._beforeObserver = _beforeObserver;
7517
7519
 
7518
7520
  function ROOT() {}
7519
7521
  ROOT.__hasSuper = false;
@@ -7837,11 +7839,13 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
7837
7839
  var prev = obj[key];
7838
7840
 
7839
7841
  if ('function' === typeof prev) {
7842
+ updateObserversAndListeners(obj, key, prev, '__ember_observesBefore__', _emberMetalObserver._removeBeforeObserver);
7840
7843
  updateObserversAndListeners(obj, key, prev, '__ember_observes__', _emberMetalObserver.removeObserver);
7841
7844
  updateObserversAndListeners(obj, key, prev, '__ember_listens__', _emberMetalEvents.removeListener);
7842
7845
  }
7843
7846
 
7844
7847
  if ('function' === typeof observerOrListener) {
7848
+ updateObserversAndListeners(obj, key, observerOrListener, '__ember_observesBefore__', _emberMetalObserver._addBeforeObserver);
7845
7849
  updateObserversAndListeners(obj, key, observerOrListener, '__ember_observes__', _emberMetalObserver.addObserver);
7846
7850
  updateObserversAndListeners(obj, key, observerOrListener, '__ember_listens__', _emberMetalEvents.addListener);
7847
7851
  }
@@ -8280,8 +8284,6 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
8280
8284
  var paths;
8281
8285
 
8282
8286
  var addWatchedProperty = function (path) {
8283
- _emberMetalDebug.assert('Depending on arrays using a dependent key ending with `@each` is no longer supported. ' + ('Please refactor from `Ember.observer(\'' + path + '\', function() {});` to `Ember.observer(\'' + path.slice(0, -6) + '.[]\', function() {})`.'), path.slice(-5) !== '@each');
8284
-
8285
8287
  paths.push(path);
8286
8288
  };
8287
8289
  var _paths = args.slice(0, -1);
@@ -8345,6 +8347,82 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
8345
8347
  return observer.apply(this, arguments);
8346
8348
  }
8347
8349
 
8350
+ /**
8351
+ When observers fire, they are called with the arguments `obj`, `keyName`.
8352
+
8353
+ Note, `@each.property` observer is called per each add or replace of an element
8354
+ and it's not called with a specific enumeration item.
8355
+
8356
+ A `_beforeObserver` fires before a property changes.
8357
+
8358
+ A `_beforeObserver` is an alternative form of `.observesBefore()`.
8359
+
8360
+ ```javascript
8361
+ App.PersonView = Ember.View.extend({
8362
+ friends: [{ name: 'Tom' }, { name: 'Stefan' }, { name: 'Kris' }],
8363
+
8364
+ valueDidChange: Ember.observer('content.value', function(obj, keyName) {
8365
+ // only run if updating a value already in the DOM
8366
+ if (this.get('state') === 'inDOM') {
8367
+ var color = obj.get(keyName) > this.changingFrom ? 'green' : 'red';
8368
+ // logic
8369
+ }
8370
+ }),
8371
+
8372
+ friendsDidChange: Ember.observer('friends.@each.name', function(obj, keyName) {
8373
+ // some logic
8374
+ // obj.get(keyName) returns friends array
8375
+ })
8376
+ });
8377
+ ```
8378
+
8379
+ Also available as `Function.prototype.observesBefore` if prototype extensions are
8380
+ enabled.
8381
+
8382
+ @method beforeObserver
8383
+ @for Ember
8384
+ @param {String} propertyNames*
8385
+ @param {Function} func
8386
+ @return func
8387
+ @deprecated
8388
+ @private
8389
+ */
8390
+
8391
+ function _beforeObserver() {
8392
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
8393
+ args[_key5] = arguments[_key5];
8394
+ }
8395
+
8396
+ var func = args.slice(-1)[0];
8397
+ var paths;
8398
+
8399
+ var addWatchedProperty = function (path) {
8400
+ paths.push(path);
8401
+ };
8402
+
8403
+ var _paths = args.slice(0, -1);
8404
+
8405
+ if (typeof func !== 'function') {
8406
+ // revert to old, soft-deprecated argument ordering
8407
+
8408
+ func = args[0];
8409
+ _paths = args.slice(1);
8410
+ }
8411
+
8412
+ paths = [];
8413
+
8414
+ for (var i = 0; i < _paths.length; ++i) {
8415
+ _emberMetalExpand_properties.default(_paths[i], addWatchedProperty);
8416
+ }
8417
+
8418
+ if (typeof func !== 'function') {
8419
+ throw new _emberMetalCore.default.Error('Ember.beforeObserver called without a function');
8420
+ }
8421
+
8422
+ func.__ember_observesBefore__ = paths;
8423
+ return func;
8424
+ }
8425
+
8348
8426
  exports.IS_BINDING = IS_BINDING;
8349
8427
  exports.Mixin = Mixin;
8350
8428
  exports.required = required;
@@ -11514,6 +11592,7 @@ enifed('ember-metal/utils', ['exports'], function (exports) {
11514
11592
 
11515
11593
  superWrapper.wrappedFunction = func;
11516
11594
  superWrapper.__ember_observes__ = func.__ember_observes__;
11595
+ superWrapper.__ember_observesBefore__ = func.__ember_observesBefore__;
11517
11596
  superWrapper.__ember_listens__ = func.__ember_listens__;
11518
11597
 
11519
11598
  return superWrapper;
@@ -11899,6 +11978,7 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
11899
11978
  'use strict';
11900
11979
 
11901
11980
  exports.isWatching = isWatching;
11981
+ exports.watcherCount = watcherCount;
11902
11982
  exports.unwatch = unwatch;
11903
11983
  exports.destroy = destroy;
11904
11984
 
@@ -11935,6 +12015,11 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
11935
12015
  return (meta && meta.peekWatching(key)) > 0;
11936
12016
  }
11937
12017
 
12018
+ function watcherCount(obj, key) {
12019
+ var meta = _emberMetalMeta.peekMeta(obj);
12020
+ return meta && meta.peekWatching(key) || 0;
12021
+ }
12022
+
11938
12023
  watch.flushPending = _emberMetalChains.flushPendingChains;
11939
12024
 
11940
12025
  function unwatch(obj, _keyPath, m) {
@@ -13374,8 +13459,6 @@ enifed('ember-runtime/ext/function', ['exports', 'ember-metal/core', 'ember-meta
13374
13459
  });
13375
13460
  // Ember.EXTEND_PROTOTYPES
13376
13461
  enifed('ember-runtime/ext/rsvp', ['exports', 'ember-metal/core', 'ember-metal/debug', 'ember-metal/logger', 'ember-metal/run_loop', 'rsvp'], function (exports, _emberMetalCore, _emberMetalDebug, _emberMetalLogger, _emberMetalRun_loop, _rsvp) {
13377
- /* globals RSVP:true */
13378
-
13379
13462
  'use strict';
13380
13463
 
13381
13464
  exports.onerrorDefault = onerrorDefault;
@@ -14652,13 +14735,10 @@ enifed('ember-runtime/mixins/controller', ['exports', 'ember-metal/mixin', 'embe
14652
14735
  For example, when a Handlebars template uses the `{{action}}` helper,
14653
14736
  it will attempt to send the action to the view's controller's `target`.
14654
14737
  By default, the value of the target property is set to the router, and
14655
- is injected when a controller is instantiated. This injection is defined
14656
- in Ember.Application#buildContainer, and is applied as part of the
14657
- applications initialization process. It can also be set after a controller
14658
- has been instantiated, for instance when using the render helper in a
14659
- template, or when a controller is used as an `itemController`. In most
14660
- cases the `target` property will automatically be set to the logical
14661
- consumer of actions for the controller.
14738
+ is injected when a controller is instantiated. This injection is applied
14739
+ as part of the application's initialization process. In most cases the
14740
+ `target` property will automatically be set to the logical consumer of
14741
+ actions for the controller.
14662
14742
  @property target
14663
14743
  @default null
14664
14744
  @public
@@ -17601,21 +17681,7 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17601
17681
  @type Ember.Array
17602
17682
  @private
17603
17683
  */
17604
- content: _emberMetalComputed.computed({
17605
- get: function () {
17606
- return this._content;
17607
- },
17608
- set: function (k, v) {
17609
- if (this._didInitArrayProxy) {
17610
- var oldContent = this._content;
17611
- var len = oldContent ? _emberMetalProperty_get.get(oldContent, 'length') : 0;
17612
- this.arrangedContentArrayWillChange(this, 0, len, undefined);
17613
- this.arrangedContentWillChange(this);
17614
- }
17615
- this._content = v;
17616
- return v;
17617
- }
17618
- }),
17684
+ content: null,
17619
17685
 
17620
17686
  /**
17621
17687
  The array that the proxy pretends to be. In the default `ArrayProxy`
@@ -17623,7 +17689,7 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17623
17689
  can override this property to provide things like sorting and filtering.
17624
17690
  @property arrangedContent
17625
17691
  @private
17626
- */
17692
+ */
17627
17693
  arrangedContent: _emberMetalAlias.default('content'),
17628
17694
 
17629
17695
  /**
@@ -17657,7 +17723,19 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17657
17723
  _emberMetalProperty_get.get(this, 'content').replace(idx, amt, objects);
17658
17724
  },
17659
17725
 
17660
- _teardownContent: function (content) {
17726
+ /**
17727
+ Invoked when the content property is about to change. Notifies observers that the
17728
+ entire array content will change.
17729
+ @private
17730
+ @method _contentWillChange
17731
+ */
17732
+ _contentWillChange: _emberMetalMixin._beforeObserver('content', function () {
17733
+ this._teardownContent();
17734
+ }),
17735
+
17736
+ _teardownContent: function () {
17737
+ var content = _emberMetalProperty_get.get(this, 'content');
17738
+
17661
17739
  if (content) {
17662
17740
  content.removeArrayObserver(this, {
17663
17741
  willChange: 'contentArrayWillChange',
@@ -17695,7 +17773,6 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17695
17773
  */
17696
17774
  _contentDidChange: _emberMetalMixin.observer('content', function () {
17697
17775
  var content = _emberMetalProperty_get.get(this, 'content');
17698
- this._teardownContent(this._prevContent);
17699
17776
 
17700
17777
  _emberMetalDebug.assert('Can\'t set ArrayProxy\'s content to itself', content !== this);
17701
17778
 
@@ -17704,7 +17781,6 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17704
17781
 
17705
17782
  _setupContent: function () {
17706
17783
  var content = _emberMetalProperty_get.get(this, 'content');
17707
- this._prevContent = content;
17708
17784
 
17709
17785
  if (content) {
17710
17786
  _emberMetalDebug.assert('ArrayProxy expects an Array or Ember.ArrayProxy, but you passed ' + typeof content, _emberRuntimeUtils.isArray(content) || content.isDestroyed);
@@ -17716,8 +17792,17 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17716
17792
  }
17717
17793
  },
17718
17794
 
17795
+ _arrangedContentWillChange: _emberMetalMixin._beforeObserver('arrangedContent', function () {
17796
+ var arrangedContent = _emberMetalProperty_get.get(this, 'arrangedContent');
17797
+ var len = arrangedContent ? _emberMetalProperty_get.get(arrangedContent, 'length') : 0;
17798
+
17799
+ this.arrangedContentArrayWillChange(this, 0, len, undefined);
17800
+ this.arrangedContentWillChange(this);
17801
+
17802
+ this._teardownArrangedContent(arrangedContent);
17803
+ }),
17804
+
17719
17805
  _arrangedContentDidChange: _emberMetalMixin.observer('arrangedContent', function () {
17720
- this._teardownArrangedContent(this._prevArrangedContent);
17721
17806
  var arrangedContent = _emberMetalProperty_get.get(this, 'arrangedContent');
17722
17807
  var len = arrangedContent ? _emberMetalProperty_get.get(arrangedContent, 'length') : 0;
17723
17808
 
@@ -17731,7 +17816,6 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17731
17816
 
17732
17817
  _setupArrangedContent: function () {
17733
17818
  var arrangedContent = _emberMetalProperty_get.get(this, 'arrangedContent');
17734
- this._prevArrangedContent = arrangedContent;
17735
17819
 
17736
17820
  if (arrangedContent) {
17737
17821
  _emberMetalDebug.assert('ArrayProxy expects an Array or Ember.ArrayProxy, but you passed ' + typeof arrangedContent, _emberRuntimeUtils.isArray(arrangedContent) || arrangedContent.isDestroyed);
@@ -17885,7 +17969,6 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17885
17969
  },
17886
17970
 
17887
17971
  init: function () {
17888
- this._didInitArrayProxy = true;
17889
17972
  this._super.apply(this, arguments);
17890
17973
  this._setupContent();
17891
17974
  this._setupArrangedContent();
@@ -17893,7 +17976,7 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
17893
17976
 
17894
17977
  willDestroy: function () {
17895
17978
  this._teardownArrangedContent();
17896
- this._teardownContent(this.get('content'));
17979
+ this._teardownContent();
17897
17980
  }
17898
17981
  });
17899
17982
 
@@ -6,7 +6,7 @@
6
6
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
7
7
  * @license Licensed under MIT license
8
8
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
9
- * @version 2.3.0
9
+ * @version 2.3.1
10
10
  */
11
11
 
12
12
  var enifed, requireModule, require, requirejs, Ember;
@@ -3026,7 +3026,6 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/debug', 'ember-metal/pro
3026
3026
  var args;
3027
3027
 
3028
3028
  var addArg = function (property) {
3029
- _emberMetalDebug.assert('Depending on arrays using a dependent key ending with `@each` is no longer supported. ' + ('Please refactor from `Ember.computed(\'' + property + '\', function() {});` to `Ember.computed(\'' + property.slice(0, -6) + '.[]\', function() {})`.'), property.slice(-5) !== '@each');
3030
3029
  args.push(property);
3031
3030
  };
3032
3031
 
@@ -4130,7 +4129,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4130
4129
 
4131
4130
  @class Ember
4132
4131
  @static
4133
- @version 2.3.0
4132
+ @version 2.3.1
4134
4133
  @public
4135
4134
  */
4136
4135
 
@@ -4174,11 +4173,11 @@ enifed('ember-metal/core', ['exports'], function (exports) {
4174
4173
 
4175
4174
  @property VERSION
4176
4175
  @type String
4177
- @default '2.3.0'
4176
+ @default '2.3.1'
4178
4177
  @static
4179
4178
  @public
4180
4179
  */
4181
- Ember.VERSION = '2.3.0';
4180
+ Ember.VERSION = '2.3.1';
4182
4181
 
4183
4182
  /**
4184
4183
  The hash of environment variables used to control various configuration
@@ -4915,6 +4914,8 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error'], functi
4915
4914
 
4916
4915
  var SPLIT_REGEX = /\{|\}/;
4917
4916
 
4917
+ var END_WITH_EACH_REGEX = /\.@each$/;
4918
+
4918
4919
  /**
4919
4920
  Expands `pattern`, invoking `callback` for each expansion.
4920
4921
 
@@ -4959,10 +4960,10 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-metal/error'], functi
4959
4960
  });
4960
4961
 
4961
4962
  properties.forEach(function (property) {
4962
- callback(property.join(''));
4963
+ callback(property.join('').replace(END_WITH_EACH_REGEX, '.[]'));
4963
4964
  });
4964
4965
  } else {
4965
- callback(pattern);
4966
+ callback(pattern.replace(END_WITH_EACH_REGEX, '.[]'));
4966
4967
  }
4967
4968
  }
4968
4969
 
@@ -6841,6 +6842,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
6841
6842
  exports.aliasMethod = aliasMethod;
6842
6843
  exports.observer = observer;
6843
6844
  exports._immediateObserver = _immediateObserver;
6845
+ exports._beforeObserver = _beforeObserver;
6844
6846
 
6845
6847
  function ROOT() {}
6846
6848
  ROOT.__hasSuper = false;
@@ -7164,11 +7166,13 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
7164
7166
  var prev = obj[key];
7165
7167
 
7166
7168
  if ('function' === typeof prev) {
7169
+ updateObserversAndListeners(obj, key, prev, '__ember_observesBefore__', _emberMetalObserver._removeBeforeObserver);
7167
7170
  updateObserversAndListeners(obj, key, prev, '__ember_observes__', _emberMetalObserver.removeObserver);
7168
7171
  updateObserversAndListeners(obj, key, prev, '__ember_listens__', _emberMetalEvents.removeListener);
7169
7172
  }
7170
7173
 
7171
7174
  if ('function' === typeof observerOrListener) {
7175
+ updateObserversAndListeners(obj, key, observerOrListener, '__ember_observesBefore__', _emberMetalObserver._addBeforeObserver);
7172
7176
  updateObserversAndListeners(obj, key, observerOrListener, '__ember_observes__', _emberMetalObserver.addObserver);
7173
7177
  updateObserversAndListeners(obj, key, observerOrListener, '__ember_listens__', _emberMetalEvents.addListener);
7174
7178
  }
@@ -7607,8 +7611,6 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
7607
7611
  var paths;
7608
7612
 
7609
7613
  var addWatchedProperty = function (path) {
7610
- _emberMetalDebug.assert('Depending on arrays using a dependent key ending with `@each` is no longer supported. ' + ('Please refactor from `Ember.observer(\'' + path + '\', function() {});` to `Ember.observer(\'' + path.slice(0, -6) + '.[]\', function() {})`.'), path.slice(-5) !== '@each');
7611
-
7612
7614
  paths.push(path);
7613
7615
  };
7614
7616
  var _paths = args.slice(0, -1);
@@ -7672,6 +7674,82 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/error',
7672
7674
  return observer.apply(this, arguments);
7673
7675
  }
7674
7676
 
7677
+ /**
7678
+ When observers fire, they are called with the arguments `obj`, `keyName`.
7679
+
7680
+ Note, `@each.property` observer is called per each add or replace of an element
7681
+ and it's not called with a specific enumeration item.
7682
+
7683
+ A `_beforeObserver` fires before a property changes.
7684
+
7685
+ A `_beforeObserver` is an alternative form of `.observesBefore()`.
7686
+
7687
+ ```javascript
7688
+ App.PersonView = Ember.View.extend({
7689
+ friends: [{ name: 'Tom' }, { name: 'Stefan' }, { name: 'Kris' }],
7690
+
7691
+ valueDidChange: Ember.observer('content.value', function(obj, keyName) {
7692
+ // only run if updating a value already in the DOM
7693
+ if (this.get('state') === 'inDOM') {
7694
+ var color = obj.get(keyName) > this.changingFrom ? 'green' : 'red';
7695
+ // logic
7696
+ }
7697
+ }),
7698
+
7699
+ friendsDidChange: Ember.observer('friends.@each.name', function(obj, keyName) {
7700
+ // some logic
7701
+ // obj.get(keyName) returns friends array
7702
+ })
7703
+ });
7704
+ ```
7705
+
7706
+ Also available as `Function.prototype.observesBefore` if prototype extensions are
7707
+ enabled.
7708
+
7709
+ @method beforeObserver
7710
+ @for Ember
7711
+ @param {String} propertyNames*
7712
+ @param {Function} func
7713
+ @return func
7714
+ @deprecated
7715
+ @private
7716
+ */
7717
+
7718
+ function _beforeObserver() {
7719
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
7720
+ args[_key5] = arguments[_key5];
7721
+ }
7722
+
7723
+ var func = args.slice(-1)[0];
7724
+ var paths;
7725
+
7726
+ var addWatchedProperty = function (path) {
7727
+ paths.push(path);
7728
+ };
7729
+
7730
+ var _paths = args.slice(0, -1);
7731
+
7732
+ if (typeof func !== 'function') {
7733
+ // revert to old, soft-deprecated argument ordering
7734
+
7735
+ func = args[0];
7736
+ _paths = args.slice(1);
7737
+ }
7738
+
7739
+ paths = [];
7740
+
7741
+ for (var i = 0; i < _paths.length; ++i) {
7742
+ _emberMetalExpand_properties.default(_paths[i], addWatchedProperty);
7743
+ }
7744
+
7745
+ if (typeof func !== 'function') {
7746
+ throw new _emberMetalCore.default.Error('Ember.beforeObserver called without a function');
7747
+ }
7748
+
7749
+ func.__ember_observesBefore__ = paths;
7750
+ return func;
7751
+ }
7752
+
7675
7753
  exports.IS_BINDING = IS_BINDING;
7676
7754
  exports.Mixin = Mixin;
7677
7755
  exports.required = required;
@@ -10825,6 +10903,7 @@ enifed('ember-metal/utils', ['exports'], function (exports) {
10825
10903
 
10826
10904
  superWrapper.wrappedFunction = func;
10827
10905
  superWrapper.__ember_observes__ = func.__ember_observes__;
10906
+ superWrapper.__ember_observesBefore__ = func.__ember_observesBefore__;
10828
10907
  superWrapper.__ember_listens__ = func.__ember_listens__;
10829
10908
 
10830
10909
  return superWrapper;
@@ -11204,6 +11283,7 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
11204
11283
  'use strict';
11205
11284
 
11206
11285
  exports.isWatching = isWatching;
11286
+ exports.watcherCount = watcherCount;
11207
11287
  exports.unwatch = unwatch;
11208
11288
  exports.destroy = destroy;
11209
11289
 
@@ -11240,6 +11320,11 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
11240
11320
  return (meta && meta.peekWatching(key)) > 0;
11241
11321
  }
11242
11322
 
11323
+ function watcherCount(obj, key) {
11324
+ var meta = _emberMetalMeta.peekMeta(obj);
11325
+ return meta && meta.peekWatching(key) || 0;
11326
+ }
11327
+
11243
11328
  watch.flushPending = _emberMetalChains.flushPendingChains;
11244
11329
 
11245
11330
  function unwatch(obj, _keyPath, m) {
@@ -12568,7 +12653,7 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
12568
12653
  options.buildMeta = function buildMeta(program) {
12569
12654
  return {
12570
12655
  fragmentReason: fragmentReason(program),
12571
- revision: 'Ember@2.3.0',
12656
+ revision: 'Ember@2.3.1',
12572
12657
  loc: program.loc,
12573
12658
  moduleName: options.moduleName
12574
12659
  };
@@ -18195,10 +18280,10 @@ enifed("htmlbars-syntax/parser/tokenizer-event-handlers", ["exports", "htmlbars-
18195
18280
  if (isQuoted) {
18196
18281
  return assembleConcatenatedValue(parts);
18197
18282
  } else {
18198
- if (parts.length === 1) {
18283
+ if (parts.length === 1 || parts.length === 2 && parts[1] === '/') {
18199
18284
  return parts[0];
18200
18285
  } else {
18201
- throw new Error("An unquoted attribute value must be a string or a mustache, " + "preceeded by whitespace or a '=' character, and " + ("followed by whitespace or a '>' character (on line " + line + ")"));
18286
+ throw new Error("An unquoted attribute value must be a string or a mustache, " + "preceeded by whitespace or a '=' character, and " + ("followed by whitespace, a '>' character or a '/>' (on line " + line + ")"));
18202
18287
  }
18203
18288
  }
18204
18289
  } else {