ember-source 2.8.0.beta.2 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.8.0-beta.2
9
+ * @version 2.8.0
10
10
  */
11
11
 
12
12
  var enifed, requireModule, require, Ember;
@@ -4040,18 +4040,9 @@ enifed('ember-application/system/application-instance', ['exports', 'ember-metal
4040
4040
  var options = arguments.length <= 1 || arguments[1] === undefined ? new BootOptions() : arguments[1];
4041
4041
 
4042
4042
  registry.register('-environment:main', options.toEnvironment(), { instantiate: false });
4043
- registry.injection('view', '_environment', '-environment:main');
4044
- registry.injection('route', '_environment', '-environment:main');
4045
-
4046
4043
  registry.register('service:-document', options.document, { instantiate: false });
4047
4044
 
4048
- if (options.isInteractive) {
4049
- registry.injection('view', 'renderer', 'renderer:-dom');
4050
- registry.injection('component', 'renderer', 'renderer:-dom');
4051
- } else {
4052
- registry.injection('view', 'renderer', 'renderer:-inert');
4053
- registry.injection('component', 'renderer', 'renderer:-inert');
4054
- }
4045
+ this._super(registry, options);
4055
4046
  }
4056
4047
  });
4057
4048
 
@@ -4225,6 +4216,7 @@ enifed('ember-application/system/application-instance', ['exports', 'ember-metal
4225
4216
  var env = _emberMetalAssign.default({}, _emberEnvironment.environment);
4226
4217
  // For compatibility with existing code
4227
4218
  env.hasDOM = this.isBrowser;
4219
+ env.isInteractive = this.isInteractive;
4228
4220
  env.options = this;
4229
4221
  return env;
4230
4222
  };
@@ -4257,7 +4249,7 @@ enifed('ember-application/system/application-instance', ['exports', 'ember-metal
4257
4249
 
4258
4250
  exports.default = ApplicationInstance;
4259
4251
  });
4260
- enifed('ember-application/system/application', ['exports', 'ember-environment', 'ember-metal/debug', 'ember-metal/libraries', 'ember-metal/testing', 'ember-metal/property_get', 'ember-runtime/system/namespace', 'ember-runtime/system/lazy_load', 'ember-metal/run_loop', 'ember-views/system/event_dispatcher', 'ember-views/system/jquery', 'ember-routing/system/route', 'ember-routing/system/router', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/location/none_location', 'ember-routing/system/cache', 'ember-application/system/application-instance', 'ember-runtime/mixins/registry_proxy', 'container/registry', 'ember-runtime/ext/rsvp', 'ember-application/system/engine', 'require'], function (exports, _emberEnvironment, _emberMetalDebug, _emberMetalLibraries, _emberMetalTesting, _emberMetalProperty_get, _emberRuntimeSystemNamespace, _emberRuntimeSystemLazy_load, _emberMetalRun_loop, _emberViewsSystemEvent_dispatcher, _emberViewsSystemJquery, _emberRoutingSystemRoute, _emberRoutingSystemRouter, _emberRoutingLocationHash_location, _emberRoutingLocationHistory_location, _emberRoutingLocationAuto_location, _emberRoutingLocationNone_location, _emberRoutingSystemCache, _emberApplicationSystemApplicationInstance, _emberRuntimeMixinsRegistry_proxy, _containerRegistry, _emberRuntimeExtRsvp, _emberApplicationSystemEngine, _require) {
4252
+ enifed('ember-application/system/application', ['exports', 'ember-environment', 'ember-metal/debug', 'ember-metal/dictionary', 'ember-metal/libraries', 'ember-metal/testing', 'ember-metal/property_get', 'ember-runtime/system/namespace', 'ember-runtime/system/lazy_load', 'ember-metal/run_loop', 'ember-views/system/event_dispatcher', 'ember-views/system/jquery', 'ember-routing/system/route', 'ember-routing/system/router', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/location/none_location', 'ember-routing/system/cache', 'ember-application/system/application-instance', 'ember-runtime/mixins/registry_proxy', 'container/registry', 'ember-runtime/ext/rsvp', 'ember-application/system/engine', 'require'], function (exports, _emberEnvironment, _emberMetalDebug, _emberMetalDictionary, _emberMetalLibraries, _emberMetalTesting, _emberMetalProperty_get, _emberRuntimeSystemNamespace, _emberRuntimeSystemLazy_load, _emberMetalRun_loop, _emberViewsSystemEvent_dispatcher, _emberViewsSystemJquery, _emberRoutingSystemRoute, _emberRoutingSystemRouter, _emberRoutingLocationHash_location, _emberRoutingLocationHistory_location, _emberRoutingLocationAuto_location, _emberRoutingLocationNone_location, _emberRoutingSystemCache, _emberApplicationSystemApplicationInstance, _emberRuntimeMixinsRegistry_proxy, _containerRegistry, _emberRuntimeExtRsvp, _emberApplicationSystemEngine, _require) {
4261
4253
  /**
4262
4254
  @module ember
4263
4255
  @submodule ember-application
@@ -5167,7 +5159,7 @@ enifed('ember-application/system/application', ['exports', 'ember-environment',
5167
5159
 
5168
5160
  function commonSetupRegistry(registry) {
5169
5161
  registry.register('-view-registry:main', { create: function () {
5170
- return {};
5162
+ return _emberMetalDictionary.default(null);
5171
5163
  } });
5172
5164
 
5173
5165
  registry.register('route:basic', _emberRoutingSystemRoute.default);
@@ -5281,11 +5273,9 @@ enifed('ember-application/system/engine-instance', ['exports', 'ember-runtime/sy
5281
5273
  @param options {Object}
5282
5274
  @return {Promise<Ember.EngineInstance,Error>}
5283
5275
  */
5284
- boot: function () {
5276
+ boot: function (options) {
5285
5277
  var _this = this;
5286
5278
 
5287
- var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
5288
-
5289
5279
  if (this._bootPromise) {
5290
5280
  return this._bootPromise;
5291
5281
  }
@@ -5320,6 +5310,8 @@ enifed('ember-application/system/engine-instance', ['exports', 'ember-runtime/sy
5320
5310
  this.cloneParentDependencies();
5321
5311
  }
5322
5312
 
5313
+ this.setupRegistry(options);
5314
+
5323
5315
  this.base.runInstanceInitializers(this);
5324
5316
 
5325
5317
  this._booted = true;
@@ -5327,6 +5319,12 @@ enifed('ember-application/system/engine-instance', ['exports', 'ember-runtime/sy
5327
5319
  return this;
5328
5320
  },
5329
5321
 
5322
+ setupRegistry: function () {
5323
+ var options = arguments.length <= 0 || arguments[0] === undefined ? this.__container__.lookup('-environment:main') : arguments[0];
5324
+
5325
+ this.constructor.setupRegistry(this.__registry__, options);
5326
+ },
5327
+
5330
5328
  /**
5331
5329
  Unregister a factory.
5332
5330
  Overrides `RegistryProxy#unregister` in order to clear any cached instances
@@ -5349,6 +5347,32 @@ enifed('ember-application/system/engine-instance', ['exports', 'ember-runtime/sy
5349
5347
  }
5350
5348
  });
5351
5349
 
5350
+ EngineInstance.reopenClass({
5351
+ /**
5352
+ @private
5353
+ @method setupRegistry
5354
+ @param {Registry} registry
5355
+ @param {BootOptions} options
5356
+ */
5357
+ setupRegistry: function (registry, options) {
5358
+ // when no options/environment is present, do nothing
5359
+ if (!options) {
5360
+ return;
5361
+ }
5362
+
5363
+ registry.injection('view', '_environment', '-environment:main');
5364
+ registry.injection('route', '_environment', '-environment:main');
5365
+
5366
+ if (options.isInteractive) {
5367
+ registry.injection('view', 'renderer', 'renderer:-dom');
5368
+ registry.injection('component', 'renderer', 'renderer:-dom');
5369
+ } else {
5370
+ registry.injection('view', 'renderer', 'renderer:-inert');
5371
+ registry.injection('component', 'renderer', 'renderer:-inert');
5372
+ }
5373
+ }
5374
+ });
5375
+
5352
5376
  if (true) {
5353
5377
  EngineInstance.reopen({
5354
5378
  /**
@@ -5387,13 +5411,27 @@ enifed('ember-application/system/engine-instance', ['exports', 'ember-runtime/sy
5387
5411
 
5388
5412
  var parent = _emberApplicationSystemEngineParent.getEngineParent(this);
5389
5413
 
5390
- ['route:basic', 'event_dispatcher:main', 'service:-routing'].forEach(function (key) {
5414
+ var registrations = ['route:basic', 'event_dispatcher:main', 'service:-routing'];
5415
+
5416
+ if (false) {
5417
+ registrations.push('service:-glimmer-environment');
5418
+ }
5419
+
5420
+ registrations.forEach(function (key) {
5391
5421
  return _this2.register(key, parent.resolveRegistration(key));
5392
5422
  });
5393
5423
 
5394
- ['router:main', _containerRegistry.privatize(_templateObject), '-view-registry:main'].forEach(function (key) {
5424
+ var env = parent.lookup('-environment:main');
5425
+ this.register('-environment:main', env, { instantiate: false });
5426
+
5427
+ var singletons = ['router:main', _containerRegistry.privatize(_templateObject), '-view-registry:main', 'renderer:-' + (env.isInteractive ? 'dom' : 'inert')];
5428
+
5429
+ singletons.forEach(function (key) {
5395
5430
  return _this2.register(key, parent.lookup(key), { instantiate: false });
5396
5431
  });
5432
+
5433
+ this.inject('view', '_environment', '-environment:main');
5434
+ this.inject('route', '_environment', '-environment:main');
5397
5435
  }
5398
5436
  });
5399
5437
  }
@@ -6624,13 +6662,16 @@ enifed('ember-debug/deprecate', ['exports', 'ember-metal/error', 'ember-console'
6624
6662
 
6625
6663
  @method deprecate
6626
6664
  @param {String} message A description of the deprecation.
6627
- @param {Boolean} test A boolean. If falsy, the deprecation
6628
- will be displayed.
6629
- @param {Object} options An object that can be used to pass
6630
- in a `url` to the transition guide on the emberjs.com website, and a unique
6631
- `id` for this deprecation. The `id` can be used by Ember debugging tools
6632
- to change the behavior (raise, log or silence) for that specific deprecation.
6633
- The `id` should be namespaced by dots, e.g. "view.helper.select".
6665
+ @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.
6666
+ @param {Object} options
6667
+ @param {String} options.id A unique id for this deprecation. The id can be
6668
+ used by Ember debugging tools to change the behavior (raise, log or silence)
6669
+ for that specific deprecation. The id should be namespaced by dots, e.g.
6670
+ "view.helper.select".
6671
+ @param {string} options.until The version of Ember when this deprecation
6672
+ warning will be removed.
6673
+ @param {String} [options.url] An optional url to the transition guide on the
6674
+ emberjs.com website.
6634
6675
  @for Ember
6635
6676
  @public
6636
6677
  */
@@ -9107,7 +9148,7 @@ enifed('ember-htmlbars/components/link-to', ['exports', 'ember-console', 'ember-
9107
9148
  if (lastParam && lastParam.isQueryParams) {
9108
9149
  queryParams = params.pop();
9109
9150
  } else {
9110
- queryParams = {};
9151
+ queryParams = { values: {} };
9111
9152
  }
9112
9153
  this.set('queryParams', queryParams);
9113
9154
 
@@ -10258,17 +10299,37 @@ enifed('ember-htmlbars/hooks/classify', ['exports', 'ember-htmlbars/utils/is-com
10258
10299
  return null;
10259
10300
  }
10260
10301
  });
10261
- enifed("ember-htmlbars/hooks/cleanup-render-node", ["exports"], function (exports) {
10302
+ enifed('ember-htmlbars/hooks/cleanup-render-node', ['exports'], function (exports) {
10262
10303
  /**
10263
10304
  @module ember
10264
10305
  @submodule ember-htmlbars
10265
10306
  */
10266
10307
 
10267
- "use strict";
10308
+ 'use strict';
10268
10309
 
10269
10310
  exports.default = cleanupRenderNode;
10270
10311
 
10271
10312
  function cleanupRenderNode(renderNode) {
10313
+ var view = renderNode.emberView;
10314
+ if (view) {
10315
+ view.renderer.willDestroyElement(view);
10316
+ view.ownerView._destroyingSubtreeForView.push(function (env) {
10317
+ view._transitionTo('destroying'); // unregisters view
10318
+ // prevents rerender and scheduling
10319
+ view._renderNode = null;
10320
+ renderNode.emberView = null;
10321
+
10322
+ view.renderer.didDestroyElement(view);
10323
+
10324
+ if (view.parentView && view.parentView === env.view) {
10325
+ view.parentView.removeChild(view);
10326
+ }
10327
+ view.parentView = null;
10328
+
10329
+ view._transitionTo('preRender');
10330
+ });
10331
+ }
10332
+
10272
10333
  if (renderNode.cleanup) {
10273
10334
  renderNode.cleanup();
10274
10335
  }
@@ -10313,24 +10374,15 @@ enifed('ember-htmlbars/hooks/component', ['exports', 'ember-metal/debug', 'ember
10313
10374
  // Determine if this is an initial render or a re-render.
10314
10375
  if (state.manager) {
10315
10376
  var sm = state.manager;
10316
- var templateMeta = null;
10317
- if (sm.block) {
10318
- templateMeta = sm.block.template.meta;
10319
- } else if (sm.scope && sm.scope._view && sm.scope._view.template) {
10320
- templateMeta = sm.scope._view.template.meta;
10321
- }
10322
- env.meta.moduleName = templateMeta && templateMeta.moduleName || env.meta && env.meta.moduleName;
10323
10377
  _emberHtmlbarsUtilsExtractPositionalParams.default(renderNode, sm.component.constructor, params, attrs, false);
10324
10378
  state.manager.rerender(env, attrs, visitor);
10325
10379
  return;
10326
10380
  }
10327
10381
 
10328
10382
  var parentView = env.view;
10329
- var options = {};
10383
+
10330
10384
  var moduleName = env.meta && env.meta.moduleName;
10331
- if (moduleName) {
10332
- options.source = 'template:' + moduleName;
10333
- }
10385
+ var options = { source: moduleName && 'template:' + moduleName };
10334
10386
 
10335
10387
  var _lookupComponent = _emberViewsUtilsLookupComponent.default(env.owner, tagName, options);
10336
10388
 
@@ -10600,15 +10652,17 @@ enifed("ember-htmlbars/hooks/destroy-render-node", ["exports"], function (export
10600
10652
  function destroyRenderNode(renderNode) {
10601
10653
  var view = renderNode.emberView;
10602
10654
  if (view) {
10603
- view.renderer.remove(view, true);
10655
+ view.ownerView._destroyingSubtreeForView.push(function () {
10656
+ view.destroy();
10657
+ });
10604
10658
  }
10605
-
10606
10659
  var streamUnsubscribers = renderNode.streamUnsubscribers;
10607
10660
  if (streamUnsubscribers) {
10608
10661
  for (var i = 0; i < streamUnsubscribers.length; i++) {
10609
10662
  streamUnsubscribers[i]();
10610
10663
  }
10611
10664
  }
10665
+ renderNode.streamUnsubscribers = null;
10612
10666
  }
10613
10667
  });
10614
10668
  enifed("ember-htmlbars/hooks/did-cleanup-tree", ["exports"], function (exports) {
@@ -10619,6 +10673,10 @@ enifed("ember-htmlbars/hooks/did-cleanup-tree", ["exports"], function (exports)
10619
10673
  function didCleanupTree(env) {
10620
10674
  // Once we have finsihed cleaning up the render node and sub-nodes, reset
10621
10675
  // state tracking which view those render nodes belonged to.
10676
+ var queue = env.view.ownerView._destroyingSubtreeForView;
10677
+ for (var i = 0; i < queue.length; i++) {
10678
+ queue[i](env);
10679
+ }
10622
10680
  env.view.ownerView._destroyingSubtreeForView = null;
10623
10681
  }
10624
10682
  });
@@ -11105,7 +11163,7 @@ enifed("ember-htmlbars/hooks/will-cleanup-tree", ["exports"], function (exports)
11105
11163
  // the `childViews` array. Other parent/child view relationships are
11106
11164
  // untouched. This view is then cleared once cleanup is complete in
11107
11165
  // `didCleanupTree`.
11108
- view.ownerView._destroyingSubtreeForView = view;
11166
+ view.ownerView._destroyingSubtreeForView = [];
11109
11167
  }
11110
11168
  });
11111
11169
  enifed('ember-htmlbars/index', ['exports', 'ember-metal/core', 'ember-htmlbars/helpers', 'ember-htmlbars/helpers/if_unless', 'ember-htmlbars/helpers/with', 'ember-htmlbars/helpers/loc', 'ember-htmlbars/helpers/log', 'ember-htmlbars/helpers/each', 'ember-htmlbars/helpers/each-in', 'ember-htmlbars/helpers/-normalize-class', 'ember-htmlbars/helpers/concat', 'ember-htmlbars/helpers/-join-classes', 'ember-htmlbars/helpers/-html-safe', 'ember-htmlbars/helpers/hash', 'ember-htmlbars/helpers/query-params', 'ember-htmlbars/system/dom-helper', 'ember-htmlbars/system/template'], function (exports, _emberMetalCore, _emberHtmlbarsHelpers, _emberHtmlbarsHelpersIf_unless, _emberHtmlbarsHelpersWith, _emberHtmlbarsHelpersLoc, _emberHtmlbarsHelpersLog, _emberHtmlbarsHelpersEach, _emberHtmlbarsHelpersEachIn, _emberHtmlbarsHelpersNormalizeClass, _emberHtmlbarsHelpersConcat, _emberHtmlbarsHelpersJoinClasses, _emberHtmlbarsHelpersHtmlSafe, _emberHtmlbarsHelpersHash, _emberHtmlbarsHelpersQueryParams, _emberHtmlbarsSystemDomHelper, _emberHtmlbarsSystemTemplate) {
@@ -12181,11 +12239,7 @@ enifed('ember-htmlbars/keywords/element-component', ['exports', 'ember-metal/ass
12181
12239
  // but the `{{component}}` helper can.
12182
12240
  state.manager = null;
12183
12241
 
12184
- for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
12185
- rest[_key - 1] = arguments[_key];
12186
- }
12187
-
12188
- render.apply(undefined, [morph].concat(rest));
12242
+ render.apply(undefined, arguments);
12189
12243
  },
12190
12244
 
12191
12245
  rerender: render
@@ -13084,12 +13138,12 @@ enifed('ember-htmlbars/keywords/partial', ['exports', 'ember-views/system/lookup
13084
13138
  ```
13085
13139
 
13086
13140
  The above example template will render a template named
13087
- "_nav", which has the same context as the parent template
13088
- it's rendered into, so if the "_nav" template also referenced
13141
+ "-nav", which has the same context as the parent template
13142
+ it's rendered into, so if the "-nav" template also referenced
13089
13143
  `{{foo}}`, it would print the same thing as the `{{foo}}`
13090
13144
  in the above example.
13091
13145
 
13092
- If a "_nav" template isn't found, the `partial` helper will
13146
+ If a "-nav" template isn't found, the `partial` helper will
13093
13147
  fall back to a template named "nav".
13094
13148
 
13095
13149
  ### Bound template names
@@ -14000,7 +14054,8 @@ enifed('ember-htmlbars/node-managers/component-node-manager', ['exports', 'ember
14000
14054
  var component = this.component;
14001
14055
 
14002
14056
  return _emberHtmlbarsSystemInstrumentationSupport.instrument(component, function ComponentNodeManager_rerender_instrument() {
14003
- var env = _env.childWithView(component);
14057
+ var meta = this.block && this.block.template.meta;
14058
+ var env = _env.childWithView(component, meta);
14004
14059
 
14005
14060
  var snapshot = takeSnapshot(attrs);
14006
14061
 
@@ -14030,13 +14085,10 @@ enifed('ember-htmlbars/node-managers/component-node-manager', ['exports', 'ember
14030
14085
  };
14031
14086
 
14032
14087
  ComponentNodeManager.prototype.destroy = function ComponentNodeManager_destroy() {
14033
- var component = this.component;
14034
-
14035
14088
  // Clear component's render node. Normally this gets cleared
14036
14089
  // during view destruction, but in this case we're re-assigning the
14037
14090
  // node to a different view and it will get cleaned up automatically.
14038
- component._renderNode = null;
14039
- component.destroy();
14091
+ this.component.destroy();
14040
14092
  };
14041
14093
 
14042
14094
  function createComponent(_component, props, renderNode, env) {
@@ -14406,7 +14458,7 @@ enifed('ember-htmlbars/renderer', ['exports', 'ember-metal/run_loop', 'ember-met
14406
14458
 
14407
14459
  Renderer.prototype.revalidateTopLevelView = function Renderer_revalidateTopLevelView(view) {
14408
14460
  // This guard prevents revalidation on an already-destroyed view.
14409
- if (view._renderNode.lastResult) {
14461
+ if (view._renderNode && view._renderNode.lastResult) {
14410
14462
  view._renderNode.lastResult.revalidate(view._env);
14411
14463
  this.dispatchLifecycleHooks(view._env);
14412
14464
  this.clearRenderedViews(view._env);
@@ -14578,33 +14630,13 @@ enifed('ember-htmlbars/renderer', ['exports', 'ember-metal/run_loop', 'ember-met
14578
14630
  renderNode.ownerNode.emberView.scheduleRevalidate(renderNode, view.toString(), 'rerendering');
14579
14631
  };
14580
14632
 
14581
- Renderer.prototype.remove = function (view, shouldDestroy) {
14582
- var renderNode = view._renderNode;
14583
- view._renderNode = null;
14584
- if (renderNode) {
14585
- renderNode.emberView = null;
14586
- this.willDestroyElement(view);
14587
- view._transitionTo('destroying');
14588
-
14589
- view._renderNode = null;
14590
- var _lastResult = renderNode.lastResult;
14591
- if (_lastResult) {
14592
- _htmlbarsRuntime.internal.clearMorph(renderNode, _lastResult.env, shouldDestroy !== false);
14593
- }
14594
- if (!shouldDestroy) {
14595
- view._transitionTo('preRender');
14596
- }
14597
- this.didDestroyElement(view);
14598
- }
14599
-
14600
- // toplevel view removed, remove insertion point
14633
+ Renderer.prototype.remove = function (view) {
14601
14634
  var lastResult = view.lastResult;
14602
14635
  if (lastResult) {
14636
+ // toplevel only.
14603
14637
  view.lastResult = null;
14604
14638
  lastResult.destroy();
14605
- }
14606
-
14607
- if (shouldDestroy && !view.isDestroying) {
14639
+ } else {
14608
14640
  view.destroy();
14609
14641
  }
14610
14642
  };
@@ -14653,12 +14685,16 @@ enifed('ember-htmlbars/renderer', ['exports', 'ember-metal/run_loop', 'ember-met
14653
14685
  };
14654
14686
  exports.InteractiveRenderer = InteractiveRenderer;
14655
14687
  });
14656
- enifed('ember-htmlbars/setup-registry', ['exports', 'ember-htmlbars/renderer', 'ember-htmlbars/system/dom-helper', 'ember-htmlbars/templates/top-level-view', 'ember-htmlbars/views/outlet', 'ember-views/views/view', 'ember-htmlbars/components/text_field', 'ember-htmlbars/components/text_area', 'ember-htmlbars/components/checkbox', 'ember-htmlbars/components/link-to', 'ember-views/mixins/template_support'], function (exports, _emberHtmlbarsRenderer, _emberHtmlbarsSystemDomHelper, _emberHtmlbarsTemplatesTopLevelView, _emberHtmlbarsViewsOutlet, _emberViewsViewsView, _emberHtmlbarsComponentsText_field, _emberHtmlbarsComponentsText_area, _emberHtmlbarsComponentsCheckbox, _emberHtmlbarsComponentsLinkTo, _emberViewsMixinsTemplate_support) {
14688
+ enifed('ember-htmlbars/setup-registry', ['exports', 'container/registry', 'ember-htmlbars/renderer', 'ember-htmlbars/system/dom-helper', 'ember-htmlbars/templates/top-level-view', 'ember-htmlbars/views/outlet', 'ember-views/views/view', 'ember-htmlbars/component', 'ember-htmlbars/components/text_field', 'ember-htmlbars/components/text_area', 'ember-htmlbars/components/checkbox', 'ember-htmlbars/components/link-to', 'ember-views/mixins/template_support'], function (exports, _containerRegistry, _emberHtmlbarsRenderer, _emberHtmlbarsSystemDomHelper, _emberHtmlbarsTemplatesTopLevelView, _emberHtmlbarsViewsOutlet, _emberViewsViewsView, _emberHtmlbarsComponent, _emberHtmlbarsComponentsText_field, _emberHtmlbarsComponentsText_area, _emberHtmlbarsComponentsCheckbox, _emberHtmlbarsComponentsLinkTo, _emberViewsMixinsTemplate_support) {
14657
14689
  'use strict';
14658
14690
 
14659
14691
  exports.setupApplicationRegistry = setupApplicationRegistry;
14660
14692
  exports.setupEngineRegistry = setupEngineRegistry;
14661
14693
 
14694
+ var _templateObject = _taggedTemplateLiteralLoose(['component:-default'], ['component:-default']);
14695
+
14696
+ function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
14697
+
14662
14698
  function setupApplicationRegistry(registry) {
14663
14699
  registry.register('renderer:-dom', _emberHtmlbarsRenderer.InteractiveRenderer);
14664
14700
  registry.register('renderer:-inert', _emberHtmlbarsRenderer.InertRenderer);
@@ -14682,6 +14718,8 @@ enifed('ember-htmlbars/setup-registry', ['exports', 'ember-htmlbars/renderer', '
14682
14718
  registry.register('component:-text-area', _emberHtmlbarsComponentsText_area.default);
14683
14719
  registry.register('component:-checkbox', _emberHtmlbarsComponentsCheckbox.default);
14684
14720
  registry.register('component:link-to', _emberHtmlbarsComponentsLinkTo.default);
14721
+
14722
+ registry.register(_containerRegistry.privatize(_templateObject), _emberHtmlbarsComponent.default);
14685
14723
  }
14686
14724
  });
14687
14725
  enifed('ember-htmlbars/streams/built-in-helper', ['exports', 'ember-htmlbars/streams/stream', 'ember-htmlbars/streams/utils'], function (exports, _emberHtmlbarsStreamsStream, _emberHtmlbarsStreamsUtils) {
@@ -16050,7 +16088,7 @@ enifed('ember-htmlbars/system/build-component-template', ['exports', 'ember-meta
16050
16088
  var _component2 = component;
16051
16089
  var elementId = _component2.elementId;
16052
16090
 
16053
- return tagName !== '' || !elementId && elementId !== '';
16091
+ return tagName !== '' || attrs.id === elementId || !elementId && elementId !== '';
16054
16092
  })());
16055
16093
 
16056
16094
  _emberMetalDebug.assert('You cannot use `attributeBindings` on a tag-less component: ' + component.toString(), (function () {
@@ -16196,7 +16234,7 @@ enifed('ember-htmlbars/system/build-component-template', ['exports', 'ember-meta
16196
16234
  }
16197
16235
  }
16198
16236
 
16199
- normalized.role = _htmlbarsUtilTemplateUtils.buildStatement('get', 'ariaRole');
16237
+ normalized.role = normalized.role || _htmlbarsUtilTemplateUtils.buildStatement('get', 'ariaRole');
16200
16238
 
16201
16239
  if (attrs.tagName) {
16202
16240
  component.tagName = attrs.tagName;
@@ -17076,7 +17114,14 @@ enifed('ember-htmlbars/utils/subscribe', ['exports', 'ember-htmlbars/streams/uti
17076
17114
  node.shouldReceiveAttrs = true;
17077
17115
  }
17078
17116
 
17079
- node.ownerNode.emberView.scheduleRevalidate(node, _emberHtmlbarsStreamsUtils.labelFor(stream));
17117
+ // When the toplevelView (aka ownerView) is being torn
17118
+ // down (generally in tests), `ownerNode.emberView` will be
17119
+ // set to `null` (to prevent further work while tearing down)
17120
+ // so we need to guard against that case here
17121
+ var ownerView = node.ownerNode.emberView;
17122
+ if (ownerView) {
17123
+ ownerView.scheduleRevalidate(node, _emberHtmlbarsStreamsUtils.labelFor(stream));
17124
+ }
17080
17125
  }));
17081
17126
  }
17082
17127
  });
@@ -25817,9 +25862,9 @@ enifed('ember-routing/location/auto_location', ['exports', 'ember-metal/debug',
25817
25862
  The user agent's global variable. In browsers, this will be `window`.
25818
25863
  @since 1.11
25819
25864
  @property global
25820
- @default environment.global
25865
+ @default window
25821
25866
  */
25822
- global: _emberEnvironment.environment.global,
25867
+ global: _emberEnvironment.environment.window,
25823
25868
 
25824
25869
  /**
25825
25870
  @private
@@ -26844,7 +26889,7 @@ enifed('ember-routing/system/dsl', ['exports', 'ember-metal/debug', 'ember-metal
26844
26889
 
26845
26890
  if (this.enableLoadingSubstates) {
26846
26891
  createRoute(this, name + '_loading', { resetNamespace: options.resetNamespace });
26847
- createRoute(this, name + '_error', { path: dummyErrorRoute });
26892
+ createRoute(this, name + '_error', { resetNamespace: options.resetNamespace, path: dummyErrorRoute });
26848
26893
  }
26849
26894
 
26850
26895
  if (callback) {
@@ -27000,7 +27045,7 @@ enifed('ember-routing/system/dsl', ['exports', 'ember-metal/debug', 'ember-metal
27000
27045
  if (this.enableLoadingSubstates) {
27001
27046
  var dummyErrorRoute = '/_unused_dummy_error_path_route_' + name + '/:error';
27002
27047
  createRoute(this, name + '_loading', { resetNamespace: options.resetNamespace });
27003
- createRoute(this, name + '_error', { path: dummyErrorRoute });
27048
+ createRoute(this, name + '_error', { resetNamespace: options.resetNamespace, path: dummyErrorRoute });
27004
27049
  }
27005
27050
 
27006
27051
  var localFullName = 'application';
@@ -27775,7 +27820,7 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/debug', 'ember-met
27775
27820
  This action is called when one or more query params have changed. Bubbles.
27776
27821
  @method queryParamsDidChange
27777
27822
  @param changed {Object} Keys are names of query params that have changed.
27778
- @param totalPresent {Number}
27823
+ @param totalPresent {Object} Keys are names of query params that are currently set.
27779
27824
  @param removed {Object} Keys are names of query params that have been removed.
27780
27825
  @returns {boolean}
27781
27826
  @private
@@ -28788,7 +28833,8 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/debug', 'ember-met
28788
28833
  The string values provided for the template name, and controller
28789
28834
  will eventually pass through to the resolver for lookup. See
28790
28835
  Ember.Resolver for how these are mapped to JavaScript objects in your
28791
- application.
28836
+ application. The template to render into needs to be related to either the
28837
+ current route or one of its ancestors.
28792
28838
  Not all options need to be passed to `render`. Default values will be used
28793
28839
  based on the name of the route specified in the router or the Route's
28794
28840
  `controllerName` and `templateName` properties.
@@ -29168,13 +29214,9 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/debug', 'ember-met
29168
29214
 
29169
29215
  @private
29170
29216
  */
29171
- function prefixRouteNameArg() {
29172
- for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
29173
- args[_key2] = arguments[_key2];
29174
- }
29175
-
29217
+ function prefixRouteNameArg(route, args) {
29176
29218
  var routeName = args[0];
29177
- var owner = _containerOwner.getOwner(this);
29219
+ var owner = _containerOwner.getOwner(route);
29178
29220
  var prefix = owner.mountPoint;
29179
29221
 
29180
29222
  // only alter the routeName if it's actually referencing a route.
@@ -29202,19 +29244,19 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/debug', 'ember-met
29202
29244
  if (true) {
29203
29245
  Route.reopen({
29204
29246
  replaceWith: function () {
29205
- for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
29206
- args[_key3] = arguments[_key3];
29247
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
29248
+ args[_key2] = arguments[_key2];
29207
29249
  }
29208
29250
 
29209
- return this._super.apply(this, prefixRouteNameArg.call.apply(prefixRouteNameArg, [this].concat(args)));
29251
+ return this._super.apply(this, prefixRouteNameArg(this, args));
29210
29252
  },
29211
29253
 
29212
29254
  transitionTo: function () {
29213
- for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
29214
- args[_key4] = arguments[_key4];
29255
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
29256
+ args[_key3] = arguments[_key3];
29215
29257
  }
29216
29258
 
29217
- return this._super.apply(this, prefixRouteNameArg.call.apply(prefixRouteNameArg, [this].concat(args)));
29259
+ return this._super.apply(this, prefixRouteNameArg(this, args));
29218
29260
  },
29219
29261
 
29220
29262
  modelFor: function (_routeName) {
@@ -29229,8 +29271,8 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/debug', 'ember-met
29229
29271
  routeName = _routeName;
29230
29272
  }
29231
29273
 
29232
- for (var _len5 = arguments.length, args = Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
29233
- args[_key5 - 1] = arguments[_key5];
29274
+ for (var _len4 = arguments.length, args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
29275
+ args[_key4 - 1] = arguments[_key4];
29234
29276
  }
29235
29277
 
29236
29278
  return this._super.apply(this, [routeName].concat(args));
@@ -29366,6 +29408,10 @@ enifed('ember-routing/system/router', ['exports', 'ember-console', 'ember-metal/
29366
29408
  this._engineInstances = new _emberMetalEmpty_object.default();
29367
29409
  this._engineInfoByRoute = new _emberMetalEmpty_object.default();
29368
29410
  }
29411
+
29412
+ // avoid shaping issues with checks during `_setOutlets`
29413
+ this.isDestroyed = false;
29414
+ this.isDestroying = false;
29369
29415
  },
29370
29416
 
29371
29417
  /*
@@ -29489,6 +29535,13 @@ enifed('ember-routing/system/router', ['exports', 'ember-console', 'ember-metal/
29489
29535
  },
29490
29536
 
29491
29537
  _setOutlets: function () {
29538
+ // This is triggered async during Ember.Route#willDestroy.
29539
+ // If the router is also being destroyed we do not want to
29540
+ // to create another this._toplevelView (and leak the renderer)
29541
+ if (this.isDestroying || this.isDestroyed) {
29542
+ return;
29543
+ }
29544
+
29492
29545
  var handlerInfos = this.router.currentHandlerInfos;
29493
29546
  var route = undefined;
29494
29547
  var defaultParentState = undefined;
@@ -29672,12 +29725,6 @@ enifed('ember-routing/system/router', ['exports', 'ember-console', 'ember-metal/
29672
29725
  },
29673
29726
 
29674
29727
  willDestroy: function () {
29675
- if (this._toplevelView) {
29676
- this._toplevelView.destroy();
29677
- this._toplevelView = null;
29678
- }
29679
- this._super.apply(this, arguments);
29680
-
29681
29728
  if (true) {
29682
29729
  var instances = this._engineInstances;
29683
29730
  for (var _name in instances) {
@@ -29687,6 +29734,12 @@ enifed('ember-routing/system/router', ['exports', 'ember-console', 'ember-metal/
29687
29734
  }
29688
29735
  }
29689
29736
 
29737
+ if (this._toplevelView) {
29738
+ this._toplevelView.destroy();
29739
+ this._toplevelView = null;
29740
+ }
29741
+ this._super.apply(this, arguments);
29742
+
29690
29743
  this.reset();
29691
29744
  },
29692
29745
 
@@ -30250,16 +30303,24 @@ enifed('ember-routing/system/router', ['exports', 'ember-console', 'ember-metal/
30250
30303
  }
30251
30304
  }
30252
30305
 
30253
- var targetChildRouteName = originatingChildRouteName.split('.').pop();
30254
- var namespace = parentRoute.routeName === 'application' ? '' : parentRoute.routeName + '.';
30255
-
30256
- // First, try a named loading state, e.g. 'foo_loading'
30257
- childName = namespace + targetChildRouteName + '_' + name;
30306
+ // First, try a named loading state of the route, e.g. 'foo_loading'
30307
+ childName = originatingChildRouteName + '_' + name;
30258
30308
  if (routeHasBeenDefined(router, childName)) {
30259
30309
  return childName;
30260
30310
  }
30261
30311
 
30262
- // Second, try general loading state, e.g. 'loading'
30312
+ // Second, try general loading state of the parent, e.g. 'loading'
30313
+ var originatingChildRouteParts = originatingChildRouteName.split('.').slice(0, -1);
30314
+ var namespace = undefined;
30315
+
30316
+ // If there is a namespace on the route, then we use that, otherwise we use
30317
+ // the parent route as the namespace.
30318
+ if (originatingChildRouteParts.length) {
30319
+ namespace = originatingChildRouteParts.join('.') + '.';
30320
+ } else {
30321
+ namespace = parentRoute.routeName === 'application' ? '' : parentRoute.routeName + '.';
30322
+ }
30323
+
30263
30324
  childName = namespace + name;
30264
30325
  if (routeHasBeenDefined(router, childName)) {
30265
30326
  return childName;
@@ -30289,7 +30350,7 @@ enifed('ember-routing/system/router', ['exports', 'ember-console', 'ember-metal/
30289
30350
  handlerInfo = handlerInfos[i];
30290
30351
  handler = handlerInfo.handler;
30291
30352
 
30292
- if (handler.actions && handler.actions[name]) {
30353
+ if (handler && handler.actions && handler.actions[name]) {
30293
30354
  if (handler.actions[name].apply(handler, args) === true) {
30294
30355
  eventWasHandled = true;
30295
30356
  } else {
@@ -33854,7 +33915,7 @@ enifed('ember-runtime/mixins/array', ['exports', 'ember-metal/core', 'ember-meta
33854
33915
  If no `startAt` argument is given, the starting location to
33855
33916
  search is 0. If it's negative, searches from the index of
33856
33917
  `this.length + startAt` by asc.
33857
- ```javascript
33918
+ ```javascript
33858
33919
  [1, 2, 3].includes(2); // true
33859
33920
  [1, 2, 3].includes(4); // false
33860
33921
  [1, 2, 3].includes(3, 2); // true
@@ -33864,7 +33925,7 @@ enifed('ember-runtime/mixins/array', ['exports', 'ember-metal/core', 'ember-meta
33864
33925
  [1, 2, 3].includes(1, -4); // true
33865
33926
  [1, 2, NaN].includes(NaN); // true
33866
33927
  ```
33867
- @method includes
33928
+ @method includes
33868
33929
  @param {Object} obj The object to search for.
33869
33930
  @param {Number} startAt optional starting location to search, default 0
33870
33931
  @return {Boolean} `true` if object is found in the array.
@@ -34701,7 +34762,7 @@ enifed('ember-runtime/mixins/enumerable', ['exports', 'ember-metal/property_get'
34701
34762
 
34702
34763
  /**
34703
34764
  Sets the value on the named property for each member. This is more
34704
- efficient than using other methods defined on this helper. If the object
34765
+ ergonomic than using other methods defined on this helper. If the object
34705
34766
  implements Ember.Observable, the value will be changed to `set(),` otherwise
34706
34767
  it will be set directly. `null` objects are skipped.
34707
34768
  @method setEach
@@ -35456,14 +35517,14 @@ enifed('ember-runtime/mixins/enumerable', ['exports', 'ember-metal/property_get'
35456
35517
  Enumerable.reopen({
35457
35518
  /**
35458
35519
  Returns `true` if the passed object can be found in the enumerable.
35459
- ```javascript
35520
+ ```javascript
35460
35521
  [1, 2, 3].includes(2); // true
35461
35522
  [1, 2, 3].includes(4); // false
35462
35523
  [1, 2, undefined].includes(undefined); // true
35463
35524
  [1, 2, null].includes(null); // true
35464
35525
  [1, 2, NaN].includes(NaN); // true
35465
35526
  ```
35466
- @method includes
35527
+ @method includes
35467
35528
  @param {Object} obj The object to search for.
35468
35529
  @return {Boolean} `true` if object is found in the enumerable.
35469
35530
  @public
@@ -37662,11 +37723,11 @@ enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal/debug', 'emb
37662
37723
  },
37663
37724
 
37664
37725
  arrangedContentArrayWillChange: function (item, idx, removedCnt, addedCnt) {
37665
- _emberRuntimeMixinsArray.arrayContentWillChange(this, idx, removedCnt, addedCnt);
37726
+ this.arrayContentWillChange(idx, removedCnt, addedCnt);
37666
37727
  },
37667
37728
 
37668
37729
  arrangedContentArrayDidChange: function (item, idx, removedCnt, addedCnt) {
37669
- _emberRuntimeMixinsArray.arrayContentDidChange(this, idx, removedCnt, addedCnt);
37730
+ this.arrayContentDidChange(idx, removedCnt, addedCnt);
37670
37731
  },
37671
37732
 
37672
37733
  init: function () {
@@ -37813,19 +37874,7 @@ enifed('ember-runtime/system/core_object', ['exports', 'ember-metal/debug', 'emb
37813
37874
 
37814
37875
  finishPartial(this, m);
37815
37876
 
37816
- if (arguments.length === 0) {
37817
- this.init();
37818
- } else if (arguments.length === 1) {
37819
- this.init(arguments[0]);
37820
- } else {
37821
- // v8 bug potentially incorrectly deopts this function: https://code.google.com/p/v8/issues/detail?id=3709
37822
- // we may want to keep this around till this ages out on mobile
37823
- var args = new Array(arguments.length);
37824
- for (var x = 0; x < arguments.length; x++) {
37825
- args[x] = arguments[x];
37826
- }
37827
- this.init.apply(this, args);
37828
- }
37877
+ this.init.apply(this, arguments);
37829
37878
 
37830
37879
  this[POST_INIT]();
37831
37880
 
@@ -40379,6 +40428,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-testing/test/helpers', 'ember
40379
40428
 
40380
40429
  @method click
40381
40430
  @param {String} selector jQuery selector for finding element on the DOM
40431
+ @param {Object} context A DOM Element, Document, or jQuery to use as context
40382
40432
  @return {RSVP.Promise}
40383
40433
  @public
40384
40434
  */
@@ -40624,7 +40674,7 @@ enifed('ember-testing/helpers/fill_in', ['exports', 'ember-testing/events'], fun
40624
40674
  el = $el[0];
40625
40675
  _emberTestingEvents.focus(el);
40626
40676
 
40627
- $el.val(text);
40677
+ $el.eq(0).val(text);
40628
40678
  _emberTestingEvents.fireEvent(el, 'input');
40629
40679
  _emberTestingEvents.fireEvent(el, 'change');
40630
40680
 
@@ -42838,7 +42888,7 @@ enifed('ember-views/mixins/view_support', ['exports', 'ember-metal/debug', 'embe
42838
42888
  }
42839
42889
 
42840
42890
  }, _Mixin$create[_emberRuntimeSystemCore_object.POST_INIT] = function () {
42841
- this._super.apply(this, arguments);
42891
+ this._super();
42842
42892
 
42843
42893
  _emberMetalDebug.assert('You must call `this._super(...arguments);` when implementing `init` in a component. Please update ' + this + ' to call `this._super` from `init`.', this[INIT_WAS_CALLED]);
42844
42894
 
@@ -43445,23 +43495,6 @@ enifed('ember-views/system/lookup_partial', ['exports', 'ember-metal/debug', 'em
43445
43495
  return env.owner.lookup('template:' + underscored) || env.owner.lookup('template:' + name);
43446
43496
  }
43447
43497
  });
43448
- enifed('ember-views/system/platform', ['exports', 'ember-environment'], function (exports, _emberEnvironment) {
43449
- 'use strict';
43450
-
43451
- // IE 6/7 have bugs around setting names on inputs during creation.
43452
- // From http://msdn.microsoft.com/en-us/library/ie/ms536389(v=vs.85).aspx:
43453
- // "To include the NAME attribute at run time on objects created with the createElement method, use the eTag."
43454
- var canSetNameOnInputs = _emberEnvironment.environment.hasDOM && (function () {
43455
- var div = document.createElement('div');
43456
- var el = document.createElement('input');
43457
-
43458
- el.setAttribute('name', 'foo');
43459
- div.appendChild(el);
43460
-
43461
- return !!div.innerHTML.match('foo');
43462
- })();
43463
- exports.canSetNameOnInputs = canSetNameOnInputs;
43464
- });
43465
43498
  enifed('ember-views/system/utils', ['exports'], function (exports) {
43466
43499
  /**
43467
43500
  @module ember
@@ -43530,17 +43563,26 @@ enifed('ember-views/system/utils', ['exports'], function (exports) {
43530
43563
  return range.getBoundingClientRect();
43531
43564
  }
43532
43565
  });
43533
- enifed('ember-views/utils/lookup-component', ['exports'], function (exports) {
43566
+ enifed('ember-views/utils/lookup-component', ['exports', 'container/registry'], function (exports, _containerRegistry) {
43534
43567
  'use strict';
43535
43568
 
43536
43569
  exports.default = lookupComponent;
43570
+
43571
+ var _templateObject = _taggedTemplateLiteralLoose(['component:-default'], ['component:-default']);
43572
+
43573
+ function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
43574
+
43537
43575
  function lookupComponentPair(componentLookup, owner, name, options) {
43538
43576
  var component = componentLookup.componentFor(name, owner, options);
43539
43577
  var layout = componentLookup.layoutFor(name, owner, options);
43540
- return {
43541
- component: component,
43542
- layout: layout
43543
- };
43578
+
43579
+ var result = { layout: layout, component: component };
43580
+
43581
+ if (layout && !component) {
43582
+ result.component = owner._lookupFactory(_containerRegistry.privatize(_templateObject));
43583
+ }
43584
+
43585
+ return result;
43544
43586
  }
43545
43587
 
43546
43588
  function lookupComponent(owner, name, options) {
@@ -43805,7 +43847,7 @@ enifed('ember-views/views/states/has_element', ['exports', 'ember-views/views/st
43805
43847
  },
43806
43848
 
43807
43849
  destroy: function (view) {
43808
- view.renderer.remove(view, true);
43850
+ view.renderer.remove(view);
43809
43851
  },
43810
43852
 
43811
43853
  // Handle events from `Ember.EventDispatcher`
@@ -44128,7 +44170,7 @@ enifed('ember-views/views/view', ['exports', 'ember-views/system/ext', 'ember-vi
44128
44170
  ```
44129
44171
 
44130
44172
  If the return value of an `attributeBindings` monitored property is a boolean
44131
- the property's value will be set as a coerced string:
44173
+ the attribute will be present or absent depending on the value:
44132
44174
 
44133
44175
  ```javascript
44134
44176
  MyTextInput = Ember.View.extend({
@@ -44141,7 +44183,7 @@ enifed('ember-views/views/view', ['exports', 'ember-views/system/ext', 'ember-vi
44141
44183
  Will result in a view instance with an HTML representation of:
44142
44184
 
44143
44185
  ```html
44144
- <input id="ember1" class="ember-view" disabled="false" />
44186
+ <input id="ember1" class="ember-view" />
44145
44187
  ```
44146
44188
 
44147
44189
  `attributeBindings` can refer to computed properties:
@@ -44450,7 +44492,7 @@ enifed('ember/index', ['exports', 'require', 'ember-metal', 'ember-runtime', 'em
44450
44492
  enifed("ember/version", ["exports"], function (exports) {
44451
44493
  "use strict";
44452
44494
 
44453
- exports.default = "2.8.0-beta.2";
44495
+ exports.default = "2.8.0";
44454
44496
  });
44455
44497
  enifed('htmlbars-runtime', ['exports', 'htmlbars-runtime/hooks', 'htmlbars-runtime/render', 'htmlbars-util/morph-utils', 'htmlbars-util/template-utils'], function (exports, _htmlbarsRuntimeHooks, _htmlbarsRuntimeRender, _htmlbarsUtilMorphUtils, _htmlbarsUtilTemplateUtils) {
44456
44498
  'use strict';
@@ -47659,11 +47701,145 @@ enifed("morph-range/utils", ["exports"], function (exports) {
47659
47701
  } while (node);
47660
47702
  }
47661
47703
  });
47662
- enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer/normalizer'], function (exports, _routeRecognizerDsl, _routeRecognizerNormalizer) {
47663
- 'use strict';
47704
+ enifed("route-recognizer", ["exports"], function (exports) {
47705
+ "use strict";
47706
+
47707
+ function Target(path, matcher, delegate) {
47708
+ this.path = path;
47709
+ this.matcher = matcher;
47710
+ this.delegate = delegate;
47711
+ }
47712
+
47713
+ Target.prototype = {
47714
+ to: function (target, callback) {
47715
+ var delegate = this.delegate;
47716
+
47717
+ if (delegate && delegate.willAddRoute) {
47718
+ target = delegate.willAddRoute(this.matcher.target, target);
47719
+ }
47720
+
47721
+ this.matcher.add(this.path, target);
47722
+
47723
+ if (callback) {
47724
+ if (callback.length === 0) {
47725
+ throw new Error("You must have an argument in the function passed to `to`");
47726
+ }
47727
+ this.matcher.addChild(this.path, target, callback, this.delegate);
47728
+ }
47729
+ return this;
47730
+ }
47731
+ };
47732
+
47733
+ function Matcher(target) {
47734
+ this.routes = {};
47735
+ this.children = {};
47736
+ this.target = target;
47737
+ }
47738
+
47739
+ Matcher.prototype = {
47740
+ add: function (path, handler) {
47741
+ this.routes[path] = handler;
47742
+ },
47743
+
47744
+ addChild: function (path, target, callback, delegate) {
47745
+ var matcher = new Matcher(target);
47746
+ this.children[path] = matcher;
47747
+
47748
+ var match = generateMatch(path, matcher, delegate);
47749
+
47750
+ if (delegate && delegate.contextEntered) {
47751
+ delegate.contextEntered(target, match);
47752
+ }
47753
+
47754
+ callback(match);
47755
+ }
47756
+ };
47757
+
47758
+ function generateMatch(startingPath, matcher, delegate) {
47759
+ return function (path, nestedCallback) {
47760
+ var fullPath = startingPath + path;
47761
+
47762
+ if (nestedCallback) {
47763
+ nestedCallback(generateMatch(fullPath, matcher, delegate));
47764
+ } else {
47765
+ return new Target(startingPath + path, matcher, delegate);
47766
+ }
47767
+ };
47768
+ }
47769
+
47770
+ function addRoute(routeArray, path, handler) {
47771
+ var len = 0;
47772
+ for (var i = 0; i < routeArray.length; i++) {
47773
+ len += routeArray[i].path.length;
47774
+ }
47775
+
47776
+ path = path.substr(len);
47777
+ var route = { path: path, handler: handler };
47778
+ routeArray.push(route);
47779
+ }
47780
+
47781
+ function eachRoute(baseRoute, matcher, callback, binding) {
47782
+ var routes = matcher.routes;
47783
+
47784
+ for (var path in routes) {
47785
+ if (routes.hasOwnProperty(path)) {
47786
+ var routeArray = baseRoute.slice();
47787
+ addRoute(routeArray, path, routes[path]);
47788
+
47789
+ if (matcher.children[path]) {
47790
+ eachRoute(routeArray, matcher.children[path], callback, binding);
47791
+ } else {
47792
+ callback.call(binding, routeArray);
47793
+ }
47794
+ }
47795
+ }
47796
+ }
47797
+
47798
+ function map(callback, addRouteCallback) {
47799
+ var matcher = new Matcher();
47664
47800
 
47665
- var normalizePath = _routeRecognizerNormalizer.default.normalizePath;
47666
- var normalizeSegment = _routeRecognizerNormalizer.default.normalizeSegment;
47801
+ callback(generateMatch("", matcher, this.delegate));
47802
+
47803
+ eachRoute([], matcher, function (route) {
47804
+ if (addRouteCallback) {
47805
+ addRouteCallback(this, route);
47806
+ } else {
47807
+ this.add(route);
47808
+ }
47809
+ }, this);
47810
+ }
47811
+
47812
+ // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded
47813
+ // values that are not reserved (i.e., unicode characters, emoji, etc). The reserved
47814
+ // chars are "/" and "%".
47815
+ // Safe to call multiple times on the same path.
47816
+ function normalizePath(path) {
47817
+ return path.split('/').map(normalizeSegment).join('/');
47818
+ }
47819
+
47820
+ // We want to ensure the characters "%" and "/" remain in percent-encoded
47821
+ // form when normalizing paths, so replace them with their encoded form after
47822
+ // decoding the rest of the path
47823
+ var SEGMENT_RESERVED_CHARS = /%|\//g;
47824
+ function normalizeSegment(segment) {
47825
+ return decodeURIComponent(segment).replace(SEGMENT_RESERVED_CHARS, encodeURIComponent);
47826
+ }
47827
+
47828
+ // We do not want to encode these characters when generating dynamic path segments
47829
+ // See https://tools.ietf.org/html/rfc3986#section-3.3
47830
+ // sub-delims: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "="
47831
+ // others allowed by RFC 3986: ":", "@"
47832
+ //
47833
+ // First encode the entire path segment, then decode any of the encoded special chars.
47834
+ //
47835
+ // The chars "!", "'", "(", ")", "*" do not get changed by `encodeURIComponent`,
47836
+ // so the possible encoded chars are:
47837
+ // ['%24', '%26', '%2B', '%2C', '%3B', '%3D', '%3A', '%40'].
47838
+ var PATH_SEGMENT_ENCODINGS = /%(?:24|26|2B|2C|3B|3D|3A|40)/g;
47839
+
47840
+ function encodePathSegment(str) {
47841
+ return encodeURIComponent(str).replace(PATH_SEGMENT_ENCODINGS, decodeURIComponent);
47842
+ }
47667
47843
 
47668
47844
  var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
47669
47845
 
@@ -47729,7 +47905,7 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
47729
47905
 
47730
47906
  generate: function (params) {
47731
47907
  if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {
47732
- return encodeURIComponent(params[this.name]);
47908
+ return encodePathSegment(params[this.name]);
47733
47909
  } else {
47734
47910
  return params[this.name];
47735
47911
  }
@@ -47769,7 +47945,7 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
47769
47945
  // The `names` will be populated with the paramter name for each dynamic/star
47770
47946
  // segment. `shouldDecodes` will be populated with a boolean for each dyanamic/star
47771
47947
  // segment, indicating whether it should be decoded during recognition.
47772
- function parse(route, names, specificity, shouldDecodes) {
47948
+ function parse(route, names, types, shouldDecodes) {
47773
47949
  // normalize route as not starting with a "/". Recognition will
47774
47950
  // also normalize.
47775
47951
  if (route.charAt(0) === "/") {
@@ -47779,27 +47955,6 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
47779
47955
  var segments = route.split("/");
47780
47956
  var results = new Array(segments.length);
47781
47957
 
47782
- // A routes has specificity determined by the order that its different segments
47783
- // appear in. This system mirrors how the magnitude of numbers written as strings
47784
- // works.
47785
- // Consider a number written as: "abc". An example would be "200". Any other number written
47786
- // "xyz" will be smaller than "abc" so long as `a > x`. For instance, "199" is smaller
47787
- // then "200", even though "y" and "z" (which are both 9) are larger than "0" (the value
47788
- // of (`b` and `c`). This is because the leading symbol, "2", is larger than the other
47789
- // leading symbol, "1".
47790
- // The rule is that symbols to the left carry more weight than symbols to the right
47791
- // when a number is written out as a string. In the above strings, the leading digit
47792
- // represents how many 100's are in the number, and it carries more weight than the middle
47793
- // number which represents how many 10's are in the number.
47794
- // This system of number magnitude works well for route specificity, too. A route written as
47795
- // `a/b/c` will be more specific than `x/y/z` as long as `a` is more specific than
47796
- // `x`, irrespective of the other parts.
47797
- // Because of this similarity, we assign each type of segment a number value written as a
47798
- // string. We can find the specificity of compound routes by concatenating these strings
47799
- // together, from left to right. After we have looped through all of the segments,
47800
- // we convert the string to a number.
47801
- specificity.val = '';
47802
-
47803
47958
  for (var i = 0; i < segments.length; i++) {
47804
47959
  var segment = segments[i],
47805
47960
  match;
@@ -47808,26 +47963,27 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
47808
47963
  results[i] = new DynamicSegment(match[1]);
47809
47964
  names.push(match[1]);
47810
47965
  shouldDecodes.push(true);
47811
- specificity.val += '3';
47966
+ types.dynamics++;
47812
47967
  } else if (match = segment.match(/^\*([^\/]+)$/)) {
47813
47968
  results[i] = new StarSegment(match[1]);
47814
47969
  names.push(match[1]);
47815
47970
  shouldDecodes.push(false);
47816
- specificity.val += '1';
47971
+ types.stars++;
47817
47972
  } else if (segment === "") {
47818
47973
  results[i] = new EpsilonSegment();
47819
- specificity.val += '2';
47820
47974
  } else {
47821
47975
  results[i] = new StaticSegment(segment);
47822
- specificity.val += '4';
47976
+ types.statics++;
47823
47977
  }
47824
47978
  }
47825
47979
 
47826
- specificity.val = +specificity.val;
47827
-
47828
47980
  return results;
47829
47981
  }
47830
47982
 
47983
+ function isEqualCharSpec(specA, specB) {
47984
+ return specA.validChars === specB.validChars && specA.invalidChars === specB.invalidChars;
47985
+ }
47986
+
47831
47987
  // A State has a character specification and (`charSpec`) and a list of possible
47832
47988
  // subsequent states (`nextStates`).
47833
47989
  //
@@ -47848,7 +48004,6 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
47848
48004
  function State(charSpec) {
47849
48005
  this.charSpec = charSpec;
47850
48006
  this.nextStates = [];
47851
- this.charSpecs = {};
47852
48007
  this.regex = undefined;
47853
48008
  this.handlers = undefined;
47854
48009
  this.specificity = undefined;
@@ -47856,20 +48011,12 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
47856
48011
 
47857
48012
  State.prototype = {
47858
48013
  get: function (charSpec) {
47859
- if (this.charSpecs[charSpec.validChars]) {
47860
- return this.charSpecs[charSpec.validChars];
47861
- }
47862
-
47863
48014
  var nextStates = this.nextStates;
47864
48015
 
47865
48016
  for (var i = 0; i < nextStates.length; i++) {
47866
48017
  var child = nextStates[i];
47867
48018
 
47868
- var isEqual = child.charSpec.validChars === charSpec.validChars;
47869
- isEqual = isEqual && child.charSpec.invalidChars === charSpec.invalidChars;
47870
-
47871
- if (isEqual) {
47872
- this.charSpecs[charSpec.validChars] = child;
48019
+ if (isEqualCharSpec(child.charSpec, charSpec)) {
47873
48020
  return child;
47874
48021
  }
47875
48022
  }
@@ -47930,10 +48077,39 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
47930
48077
  }
47931
48078
  };
47932
48079
 
47933
- // Sort the routes by specificity
48080
+ // This is a somewhat naive strategy, but should work in a lot of cases
48081
+ // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.
48082
+ //
48083
+ // This strategy generally prefers more static and less dynamic matching.
48084
+ // Specifically, it
48085
+ //
48086
+ // * prefers fewer stars to more, then
48087
+ // * prefers using stars for less of the match to more, then
48088
+ // * prefers fewer dynamic segments to more, then
48089
+ // * prefers more static segments to more
47934
48090
  function sortSolutions(states) {
47935
48091
  return states.sort(function (a, b) {
47936
- return b.specificity.val - a.specificity.val;
48092
+ if (a.types.stars !== b.types.stars) {
48093
+ return a.types.stars - b.types.stars;
48094
+ }
48095
+
48096
+ if (a.types.stars) {
48097
+ if (a.types.statics !== b.types.statics) {
48098
+ return b.types.statics - a.types.statics;
48099
+ }
48100
+ if (a.types.dynamics !== b.types.dynamics) {
48101
+ return b.types.dynamics - a.types.dynamics;
48102
+ }
48103
+ }
48104
+
48105
+ if (a.types.dynamics !== b.types.dynamics) {
48106
+ return a.types.dynamics - b.types.dynamics;
48107
+ }
48108
+ if (a.types.statics !== b.types.statics) {
48109
+ return b.types.statics - a.types.statics;
48110
+ }
48111
+
48112
+ return 0;
47937
48113
  });
47938
48114
  }
47939
48115
 
@@ -48027,7 +48203,7 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
48027
48203
  add: function (routes, options) {
48028
48204
  var currentState = this.rootState,
48029
48205
  regex = "^",
48030
- specificity = {},
48206
+ types = { statics: 0, dynamics: 0, stars: 0 },
48031
48207
  handlers = new Array(routes.length),
48032
48208
  allSegments = [],
48033
48209
  name;
@@ -48039,7 +48215,7 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
48039
48215
  names = [],
48040
48216
  shouldDecodes = [];
48041
48217
 
48042
- var segments = parse(route.path, names, specificity, shouldDecodes);
48218
+ var segments = parse(route.path, names, types, shouldDecodes);
48043
48219
 
48044
48220
  allSegments = allSegments.concat(segments);
48045
48221
 
@@ -48071,7 +48247,7 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
48071
48247
 
48072
48248
  currentState.handlers = handlers;
48073
48249
  currentState.regex = new RegExp(regex + "$");
48074
- currentState.specificity = specificity;
48250
+ currentState.types = types;
48075
48251
 
48076
48252
  if (name = options && options.as) {
48077
48253
  this.names[name] = {
@@ -48132,7 +48308,7 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
48132
48308
  return output;
48133
48309
  },
48134
48310
 
48135
- generateQueryString: function (params, handlers) {
48311
+ generateQueryString: function (params) {
48136
48312
  var pairs = [];
48137
48313
  var keys = [];
48138
48314
  for (var key in params) {
@@ -48201,7 +48377,6 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
48201
48377
  var states = [this.rootState],
48202
48378
  pathLen,
48203
48379
  i,
48204
- l,
48205
48380
  queryStart,
48206
48381
  queryParams = {},
48207
48382
  hashStart,
@@ -48267,213 +48442,21 @@ enifed('route-recognizer', ['exports', 'route-recognizer/dsl', 'route-recognizer
48267
48442
  }
48268
48443
  };
48269
48444
 
48270
- RouteRecognizer.prototype.map = _routeRecognizerDsl.default;
48445
+ RouteRecognizer.prototype.map = map;
48271
48446
 
48272
- RouteRecognizer.VERSION = '0.2.0';
48447
+ RouteRecognizer.VERSION = '0.2.6';
48273
48448
 
48274
48449
  // Set to false to opt-out of encoding and decoding path segments.
48275
48450
  // See https://github.com/tildeio/route-recognizer/pull/55
48276
48451
  RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS = true;
48277
48452
 
48278
- RouteRecognizer.Normalizer = _routeRecognizerNormalizer.default;
48279
-
48280
- exports.default = RouteRecognizer;
48281
- });
48282
- enifed("route-recognizer/dsl", ["exports"], function (exports) {
48283
- "use strict";
48284
-
48285
- function Target(path, matcher, delegate) {
48286
- this.path = path;
48287
- this.matcher = matcher;
48288
- this.delegate = delegate;
48289
- }
48290
-
48291
- Target.prototype = {
48292
- to: function (target, callback) {
48293
- var delegate = this.delegate;
48294
-
48295
- if (delegate && delegate.willAddRoute) {
48296
- target = delegate.willAddRoute(this.matcher.target, target);
48297
- }
48298
-
48299
- this.matcher.add(this.path, target);
48300
-
48301
- if (callback) {
48302
- if (callback.length === 0) {
48303
- throw new Error("You must have an argument in the function passed to `to`");
48304
- }
48305
- this.matcher.addChild(this.path, target, callback, this.delegate);
48306
- }
48307
- return this;
48308
- }
48309
- };
48310
-
48311
- function Matcher(target) {
48312
- this.routes = {};
48313
- this.children = {};
48314
- this.target = target;
48315
- }
48316
-
48317
- Matcher.prototype = {
48318
- add: function (path, handler) {
48319
- this.routes[path] = handler;
48320
- },
48321
-
48322
- addChild: function (path, target, callback, delegate) {
48323
- var matcher = new Matcher(target);
48324
- this.children[path] = matcher;
48325
-
48326
- var match = generateMatch(path, matcher, delegate);
48327
-
48328
- if (delegate && delegate.contextEntered) {
48329
- delegate.contextEntered(target, match);
48330
- }
48331
-
48332
- callback(match);
48333
- }
48334
- };
48335
-
48336
- function generateMatch(startingPath, matcher, delegate) {
48337
- return function (path, nestedCallback) {
48338
- var fullPath = startingPath + path;
48339
-
48340
- if (nestedCallback) {
48341
- nestedCallback(generateMatch(fullPath, matcher, delegate));
48342
- } else {
48343
- return new Target(startingPath + path, matcher, delegate);
48344
- }
48345
- };
48346
- }
48347
-
48348
- function addRoute(routeArray, path, handler) {
48349
- var len = 0;
48350
- for (var i = 0; i < routeArray.length; i++) {
48351
- len += routeArray[i].path.length;
48352
- }
48353
-
48354
- path = path.substr(len);
48355
- var route = { path: path, handler: handler };
48356
- routeArray.push(route);
48357
- }
48358
-
48359
- function eachRoute(baseRoute, matcher, callback, binding) {
48360
- var routes = matcher.routes;
48361
-
48362
- for (var path in routes) {
48363
- if (routes.hasOwnProperty(path)) {
48364
- var routeArray = baseRoute.slice();
48365
- addRoute(routeArray, path, routes[path]);
48366
-
48367
- if (matcher.children[path]) {
48368
- eachRoute(routeArray, matcher.children[path], callback, binding);
48369
- } else {
48370
- callback.call(binding, routeArray);
48371
- }
48372
- }
48373
- }
48374
- }
48375
-
48376
- exports.default = function (callback, addRouteCallback) {
48377
- var matcher = new Matcher();
48378
-
48379
- callback(generateMatch("", matcher, this.delegate));
48380
-
48381
- eachRoute([], matcher, function (route) {
48382
- if (addRouteCallback) {
48383
- addRouteCallback(this, route);
48384
- } else {
48385
- this.add(route);
48386
- }
48387
- }, this);
48388
- };
48389
- });
48390
- enifed('route-recognizer/normalizer', ['exports'], function (exports) {
48391
- // Match percent-encoded values (e.g. %3a, %3A, %25)
48392
- 'use strict';
48393
-
48394
- var PERCENT_ENCODED_VALUES = /%[a-fA-F0-9]{2}/g;
48395
-
48396
- function toUpper(str) {
48397
- return str.toUpperCase();
48398
- }
48399
-
48400
- // Turn percent-encoded values to upper case ("%3a" -> "%3A")
48401
- function percentEncodedValuesToUpper(string) {
48402
- return string.replace(PERCENT_ENCODED_VALUES, toUpper);
48403
- }
48404
-
48405
- // Normalizes percent-encoded values to upper-case and decodes percent-encoded
48406
- // values that are not reserved (like unicode characters).
48407
- // Safe to call multiple times on the same path.
48408
- function normalizePath(path) {
48409
- return path.split('/').map(normalizeSegment).join('/');
48410
- }
48411
-
48412
- function percentEncode(char) {
48413
- return '%' + charToHex(char);
48414
- }
48415
-
48416
- function charToHex(char) {
48417
- return char.charCodeAt(0).toString(16).toUpperCase();
48418
- }
48419
-
48420
- // Decodes percent-encoded values in the string except those
48421
- // characters in `reservedHex`, where `reservedHex` is an array of 2-character
48422
- // percent-encodings
48423
- function decodeURIComponentExcept(string, reservedHex) {
48424
- if (string.indexOf('%') === -1) {
48425
- // If there is no percent char, there is no decoding that needs to
48426
- // be done and we exit early
48427
- return string;
48428
- }
48429
- string = percentEncodedValuesToUpper(string);
48430
-
48431
- var result = '';
48432
- var buffer = '';
48433
- var idx = 0;
48434
- while (idx < string.length) {
48435
- var pIdx = string.indexOf('%', idx);
48436
-
48437
- if (pIdx === -1) {
48438
- // no percent char
48439
- buffer += string.slice(idx);
48440
- break;
48441
- } else {
48442
- // found percent char
48443
- buffer += string.slice(idx, pIdx);
48444
- idx = pIdx + 3;
48445
-
48446
- var hex = string.slice(pIdx + 1, pIdx + 3);
48447
- var encoded = '%' + hex;
48448
-
48449
- if (reservedHex.indexOf(hex) === -1) {
48450
- // encoded is not in reserved set, add to buffer
48451
- buffer += encoded;
48452
- } else {
48453
- result += decodeURIComponent(buffer);
48454
- buffer = '';
48455
- result += encoded;
48456
- }
48457
- }
48458
- }
48459
- result += decodeURIComponent(buffer);
48460
- return result;
48461
- }
48462
-
48463
- // Leave these characters in encoded state in segments
48464
- var reservedSegmentChars = ['%', '/'];
48465
- var reservedHex = reservedSegmentChars.map(charToHex);
48466
-
48467
- function normalizeSegment(segment) {
48468
- return decodeURIComponentExcept(segment, reservedHex);
48469
- }
48470
-
48471
- var Normalizer = {
48453
+ RouteRecognizer.Normalizer = {
48472
48454
  normalizeSegment: normalizeSegment,
48473
- normalizePath: normalizePath
48455
+ normalizePath: normalizePath,
48456
+ encodePathSegment: encodePathSegment
48474
48457
  };
48475
48458
 
48476
- exports.default = Normalizer;
48459
+ exports.default = RouteRecognizer;
48477
48460
  });
48478
48461
  enifed('router', ['exports', 'router/router'], function (exports, _routerRouter) {
48479
48462
  'use strict';
@@ -48483,21 +48466,29 @@ enifed('router', ['exports', 'router/router'], function (exports, _routerRouter)
48483
48466
  enifed('router/handler-info', ['exports', 'router/utils', 'rsvp/promise'], function (exports, _routerUtils, _rsvpPromise) {
48484
48467
  'use strict';
48485
48468
 
48469
+ var DEFAULT_HANDLER = Object.freeze({});
48470
+
48486
48471
  function HandlerInfo(_props) {
48487
48472
  var props = _props || {};
48488
- var name = props.name;
48489
48473
 
48490
- // Setup a handlerPromise so that we can wait for asynchronously loaded handlers
48491
- this.handlerPromise = _rsvpPromise.default.resolve(props.handler);
48474
+ // Set a default handler to ensure consistent object shape
48475
+ this._handler = DEFAULT_HANDLER;
48492
48476
 
48493
- // Wait until the 'handler' property has been updated when chaining to a handler
48494
- // that is a promise
48495
- if (_routerUtils.isPromise(props.handler)) {
48496
- this.handlerPromise = this.handlerPromise.then(_routerUtils.bind(this, this.updateHandler));
48497
- props.handler = undefined;
48498
- } else if (props.handler) {
48499
- // Store the name of the handler on the handler for easy checks later
48500
- props.handler._handlerName = name;
48477
+ if (props.handler) {
48478
+ var name = props.name;
48479
+
48480
+ // Setup a handlerPromise so that we can wait for asynchronously loaded handlers
48481
+ this.handlerPromise = _rsvpPromise.default.resolve(props.handler);
48482
+
48483
+ // Wait until the 'handler' property has been updated when chaining to a handler
48484
+ // that is a promise
48485
+ if (_routerUtils.isPromise(props.handler)) {
48486
+ this.handlerPromise = this.handlerPromise.then(_routerUtils.bind(this, this.updateHandler));
48487
+ props.handler = undefined;
48488
+ } else if (props.handler) {
48489
+ // Store the name of the handler on the handler for easy checks later
48490
+ props.handler._handlerName = name;
48491
+ }
48501
48492
  }
48502
48493
 
48503
48494
  _routerUtils.merge(this, props);
@@ -48506,7 +48497,30 @@ enifed('router/handler-info', ['exports', 'router/utils', 'rsvp/promise'], funct
48506
48497
 
48507
48498
  HandlerInfo.prototype = {
48508
48499
  name: null,
48509
- handler: null,
48500
+
48501
+ getHandler: function () {},
48502
+
48503
+ fetchHandler: function () {
48504
+ var handler = this.getHandler(this.name);
48505
+
48506
+ // Setup a handlerPromise so that we can wait for asynchronously loaded handlers
48507
+ this.handlerPromise = _rsvpPromise.default.resolve(handler);
48508
+
48509
+ // Wait until the 'handler' property has been updated when chaining to a handler
48510
+ // that is a promise
48511
+ if (_routerUtils.isPromise(handler)) {
48512
+ this.handlerPromise = this.handlerPromise.then(_routerUtils.bind(this, this.updateHandler));
48513
+ } else if (handler) {
48514
+ // Store the name of the handler on the handler for easy checks later
48515
+ handler._handlerName = this.name;
48516
+ return this.handler = handler;
48517
+ }
48518
+
48519
+ return this.handler = undefined;
48520
+ },
48521
+
48522
+ _handlerPromise: undefined,
48523
+
48510
48524
  params: null,
48511
48525
  context: null,
48512
48526
 
@@ -48644,6 +48658,38 @@ enifed('router/handler-info', ['exports', 'router/utils', 'rsvp/promise'], funct
48644
48658
  }
48645
48659
  };
48646
48660
 
48661
+ Object.defineProperty(HandlerInfo.prototype, 'handler', {
48662
+ get: function () {
48663
+ // _handler could be set to either a handler object or undefined, so we
48664
+ // compare against a default reference to know when it's been set
48665
+ if (this._handler !== DEFAULT_HANDLER) {
48666
+ return this._handler;
48667
+ }
48668
+
48669
+ return this.fetchHandler();
48670
+ },
48671
+
48672
+ set: function (handler) {
48673
+ return this._handler = handler;
48674
+ }
48675
+ });
48676
+
48677
+ Object.defineProperty(HandlerInfo.prototype, 'handlerPromise', {
48678
+ get: function () {
48679
+ if (this._handlerPromise) {
48680
+ return this._handlerPromise;
48681
+ }
48682
+
48683
+ this.fetchHandler();
48684
+
48685
+ return this._handlerPromise;
48686
+ },
48687
+
48688
+ set: function (handlerPromise) {
48689
+ return this._handlerPromise = handlerPromise;
48690
+ }
48691
+ });
48692
+
48647
48693
  function paramsMatch(a, b) {
48648
48694
  if (!a ^ !b) {
48649
48695
  // Only one is null.
@@ -48735,8 +48781,7 @@ enifed('router/handler-info/unresolved-handler-info-by-object', ['exports', 'rou
48735
48781
  serialize: function (_model) {
48736
48782
  var model = _model || this.context,
48737
48783
  names = this.names,
48738
- handler = this.handler,
48739
- serializer = this.serializer || handler && handler.serialize;
48784
+ serializer = this.serializer || this.handler && this.handler.serialize;
48740
48785
 
48741
48786
  var object = {};
48742
48787
  if (_routerUtils.isParam(model)) {
@@ -48808,6 +48853,13 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
48808
48853
  this.delegate = options.delegate || this.delegate;
48809
48854
  this.triggerEvent = options.triggerEvent || this.triggerEvent;
48810
48855
  this.log = options.log || this.log;
48856
+ this.dslCallBacks = []; // NOTE: set by Ember
48857
+ this.state = undefined;
48858
+ this.activeTransition = undefined;
48859
+ this._changedQueryParams = undefined;
48860
+ this.oldState = undefined;
48861
+ this.currentHandlerInfos = undefined;
48862
+ this.state = undefined;
48811
48863
 
48812
48864
  this.recognizer = new _routeRecognizer.default();
48813
48865
  this.reset();
@@ -48930,7 +48982,7 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
48930
48982
  // NOTE: this doesn't really belong here, but here
48931
48983
  // it shall remain until our ES6 transpiler can
48932
48984
  // handle cyclical deps.
48933
- transitionByIntent: function (intent, isIntermediate) {
48985
+ transitionByIntent: function (intent /*, isIntermediate*/) {
48934
48986
  try {
48935
48987
  return getTransitionByIntent.apply(this, arguments);
48936
48988
  } catch (e) {
@@ -49001,11 +49053,11 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49001
49053
  that are no longer represented by the target route.
49002
49054
  @param {String} name the name of the route
49003
49055
  */
49004
- transitionTo: function (name) {
49056
+ transitionTo: function () /*name*/{
49005
49057
  return doTransition(this, arguments);
49006
49058
  },
49007
49059
 
49008
- intermediateTransitionTo: function (name) {
49060
+ intermediateTransitionTo: function () /*name*/{
49009
49061
  return doTransition(this, arguments, true);
49010
49062
  },
49011
49063
 
@@ -49035,7 +49087,7 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49035
49087
  This method is intended primarily for use with `replaceState`.
49036
49088
  @param {String} name the name of the route
49037
49089
  */
49038
- replaceWith: function (name) {
49090
+ replaceWith: function () /*name*/{
49039
49091
  return doTransition(this, arguments).method('replace');
49040
49092
  },
49041
49093
 
@@ -49082,12 +49134,7 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49082
49134
  isActiveIntent: function (handlerName, contexts, queryParams, _state) {
49083
49135
  var state = _state || this.state,
49084
49136
  targetHandlerInfos = state.handlerInfos,
49085
- found = false,
49086
- names,
49087
- object,
49088
49137
  handlerInfo,
49089
- handlerObj,
49090
- i,
49091
49138
  len;
49092
49139
 
49093
49140
  if (!targetHandlerInfos.length) {
@@ -49145,7 +49192,7 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49145
49192
  return this.isActiveIntent(handlerName, partitionedArgs[0], partitionedArgs[1]);
49146
49193
  },
49147
49194
 
49148
- trigger: function (name) {
49195
+ trigger: function () /*name*/{
49149
49196
  var args = _routerUtils.slice.call(arguments);
49150
49197
  _routerUtils.trigger(this, this.currentHandlerInfos, false, args);
49151
49198
  },
@@ -49343,7 +49390,8 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49343
49390
  updatedContext: [],
49344
49391
  exited: [],
49345
49392
  entered: [],
49346
- unchanged: []
49393
+ unchanged: [],
49394
+ reset: undefined
49347
49395
  };
49348
49396
 
49349
49397
  var handlerChanged,
@@ -49382,7 +49430,7 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49382
49430
  return handlers;
49383
49431
  }
49384
49432
 
49385
- function updateURL(transition, state, inputUrl) {
49433
+ function updateURL(transition, state /*, inputUrl*/) {
49386
49434
  var urlMethod = transition.urlMethod;
49387
49435
 
49388
49436
  if (!urlMethod) {
@@ -49426,8 +49474,7 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49426
49474
  _routerUtils.log(transition.router, transition.sequence, "Resolved all models on destination route; finalizing transition.");
49427
49475
 
49428
49476
  var router = transition.router,
49429
- handlerInfos = newState.handlerInfos,
49430
- seq = transition.sequence;
49477
+ handlerInfos = newState.handlerInfos;
49431
49478
 
49432
49479
  // Run all the necessary enter/setup/exit hooks
49433
49480
  setupContexts(router, newState, transition);
@@ -49610,8 +49657,8 @@ enifed('router/router', ['exports', 'route-recognizer', 'rsvp/promise', 'router/
49610
49657
 
49611
49658
  exports.default = Router;
49612
49659
  });
49613
- enifed('router/transition-intent', ['exports', 'router/utils'], function (exports, _routerUtils) {
49614
- 'use strict';
49660
+ enifed("router/transition-intent", ["exports"], function (exports) {
49661
+ "use strict";
49615
49662
 
49616
49663
  function TransitionIntent(props) {
49617
49664
  this.initialize(props);
@@ -49647,7 +49694,6 @@ enifed('router/transition-intent/named-transition-intent', ['exports', 'router/t
49647
49694
 
49648
49695
  var partitionedArgs = _routerUtils.extractQueryParams([this.name].concat(this.contexts)),
49649
49696
  pureArgs = partitionedArgs[0],
49650
- queryParams = partitionedArgs[1],
49651
49697
  handlers = recognizer.handlersFor(pureArgs[0]);
49652
49698
 
49653
49699
  var targetRouteName = handlers[handlers.length - 1].handler;
@@ -49673,29 +49719,26 @@ enifed('router/transition-intent/named-transition-intent', ['exports', 'router/t
49673
49719
  }
49674
49720
  }
49675
49721
 
49676
- var pivotHandlerFound = !this.pivotHandler;
49677
-
49678
49722
  for (i = handlers.length - 1; i >= 0; --i) {
49679
49723
  var result = handlers[i];
49680
49724
  var name = result.handler;
49681
- var handler = getHandler(name);
49682
49725
 
49683
49726
  var oldHandlerInfo = oldState.handlerInfos[i];
49684
49727
  var newHandlerInfo = null;
49685
49728
 
49686
49729
  if (result.names.length > 0) {
49687
49730
  if (i >= invalidateIndex) {
49688
- newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);
49731
+ newHandlerInfo = this.createParamHandlerInfo(name, getHandler, result.names, objects, oldHandlerInfo);
49689
49732
  } else {
49690
49733
  var serializer = getSerializer(name);
49691
- newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, handler, result.names, objects, oldHandlerInfo, targetRouteName, i, serializer);
49734
+ newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, getHandler, result.names, objects, oldHandlerInfo, targetRouteName, i, serializer);
49692
49735
  }
49693
49736
  } else {
49694
49737
  // This route has no dynamic segment.
49695
49738
  // Therefore treat as a param-based handlerInfo
49696
49739
  // with empty params. This will cause the `model`
49697
49740
  // hook to be called with empty params, which is desirable.
49698
- newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);
49741
+ newHandlerInfo = this.createParamHandlerInfo(name, getHandler, result.names, objects, oldHandlerInfo);
49699
49742
  }
49700
49743
 
49701
49744
  if (checkingIfActive) {
@@ -49742,20 +49785,18 @@ enifed('router/transition-intent/named-transition-intent', ['exports', 'router/t
49742
49785
  invalidateChildren: function (handlerInfos, invalidateIndex) {
49743
49786
  for (var i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {
49744
49787
  var handlerInfo = handlerInfos[i];
49745
- handlerInfos[i] = handlerInfos[i].getUnresolved();
49788
+ handlerInfos[i] = handlerInfo.getUnresolved();
49746
49789
  }
49747
49790
  },
49748
49791
 
49749
- getHandlerInfoForDynamicSegment: function (name, handler, names, objects, oldHandlerInfo, targetRouteName, i, serializer) {
49750
-
49751
- var numNames = names.length;
49792
+ getHandlerInfoForDynamicSegment: function (name, getHandler, names, objects, oldHandlerInfo, targetRouteName, i, serializer) {
49752
49793
  var objectToUse;
49753
49794
  if (objects.length > 0) {
49754
49795
 
49755
49796
  // Use the objects provided for this transition.
49756
49797
  objectToUse = objects[objects.length - 1];
49757
49798
  if (_routerUtils.isParam(objectToUse)) {
49758
- return this.createParamHandlerInfo(name, handler, names, objects, oldHandlerInfo);
49799
+ return this.createParamHandlerInfo(name, getHandler, names, objects, oldHandlerInfo);
49759
49800
  } else {
49760
49801
  objects.pop();
49761
49802
  }
@@ -49780,14 +49821,14 @@ enifed('router/transition-intent/named-transition-intent', ['exports', 'router/t
49780
49821
 
49781
49822
  return _routerHandlerInfoFactory.default('object', {
49782
49823
  name: name,
49783
- handler: handler,
49824
+ getHandler: getHandler,
49784
49825
  serializer: serializer,
49785
49826
  context: objectToUse,
49786
49827
  names: names
49787
49828
  });
49788
49829
  },
49789
49830
 
49790
- createParamHandlerInfo: function (name, handler, names, objects, oldHandlerInfo) {
49831
+ createParamHandlerInfo: function (name, getHandler, names, objects, oldHandlerInfo) {
49791
49832
  var params = {};
49792
49833
 
49793
49834
  // Soak up all the provided string/numbers
@@ -49815,7 +49856,7 @@ enifed('router/transition-intent/named-transition-intent', ['exports', 'router/t
49815
49856
 
49816
49857
  return _routerHandlerInfoFactory.default('param', {
49817
49858
  name: name,
49818
- handler: handler,
49859
+ getHandler: getHandler,
49819
49860
  params: params
49820
49861
  });
49821
49862
  }
@@ -49835,7 +49876,6 @@ enifed('router/transition-intent/url-transition-intent', ['exports', 'router/tra
49835
49876
  var newState = new _routerTransitionState.default();
49836
49877
 
49837
49878
  var results = recognizer.recognize(this.url),
49838
- queryParams = {},
49839
49879
  i,
49840
49880
  len;
49841
49881
 
@@ -49850,7 +49890,7 @@ enifed('router/transition-intent/url-transition-intent', ['exports', 'router/tra
49850
49890
  // For the case where the handler is loaded asynchronously, the error will be
49851
49891
  // thrown once it is loaded.
49852
49892
  function checkHandlerAccessibility(handler) {
49853
- if (handler.inaccessibleByURL) {
49893
+ if (handler && handler.inaccessibleByURL) {
49854
49894
  throw new _routerUnrecognizedUrlError.default(url);
49855
49895
  }
49856
49896
 
@@ -49860,19 +49900,18 @@ enifed('router/transition-intent/url-transition-intent', ['exports', 'router/tra
49860
49900
  for (i = 0, len = results.length; i < len; ++i) {
49861
49901
  var result = results[i];
49862
49902
  var name = result.handler;
49863
- var handler = getHandler(name);
49864
-
49865
- checkHandlerAccessibility(handler);
49866
-
49867
49903
  var newHandlerInfo = _routerHandlerInfoFactory.default('param', {
49868
49904
  name: name,
49869
- handler: handler,
49905
+ getHandler: getHandler,
49870
49906
  params: result.params
49871
49907
  });
49908
+ var handler = newHandlerInfo.handler;
49872
49909
 
49873
- // If the hanlder is being loaded asynchronously, check again if we can
49874
- // access it after it has resolved
49875
- if (_routerUtils.isPromise(handler)) {
49910
+ if (handler) {
49911
+ checkHandlerAccessibility(handler);
49912
+ } else {
49913
+ // If the hanlder is being loaded asynchronously, check if we can
49914
+ // access it after it has resolved
49876
49915
  newHandlerInfo.handlerPromise = newHandlerInfo.handlerPromise.then(checkHandlerAccessibility);
49877
49916
  }
49878
49917
 
@@ -49891,20 +49930,16 @@ enifed('router/transition-intent/url-transition-intent', ['exports', 'router/tra
49891
49930
  }
49892
49931
  });
49893
49932
  });
49894
- enifed('router/transition-state', ['exports', 'router/handler-info', 'router/utils', 'rsvp/promise'], function (exports, _routerHandlerInfo, _routerUtils, _rsvpPromise) {
49933
+ enifed('router/transition-state', ['exports', 'router/utils', 'rsvp/promise'], function (exports, _routerUtils, _rsvpPromise) {
49895
49934
  'use strict';
49896
49935
 
49897
- function TransitionState(other) {
49936
+ function TransitionState() {
49898
49937
  this.handlerInfos = [];
49899
49938
  this.queryParams = {};
49900
49939
  this.params = {};
49901
49940
  }
49902
49941
 
49903
49942
  TransitionState.prototype = {
49904
- handlerInfos: null,
49905
- queryParams: null,
49906
- params: null,
49907
-
49908
49943
  promiseLabel: function (label) {
49909
49944
  var targetName = '';
49910
49945
  _routerUtils.forEach(this.handlerInfos, function (handlerInfo) {
@@ -49917,7 +49952,6 @@ enifed('router/transition-state', ['exports', 'router/handler-info', 'router/uti
49917
49952
  },
49918
49953
 
49919
49954
  resolve: function (shouldContinue, payload) {
49920
- var self = this;
49921
49955
  // First, calculate params for this state. This is useful
49922
49956
  // information to provide to the various route hooks.
49923
49957
  var params = this.params;
@@ -49997,7 +50031,7 @@ enifed('router/transition-state', ['exports', 'router/handler-info', 'router/uti
49997
50031
 
49998
50032
  exports.default = TransitionState;
49999
50033
  });
50000
- enifed('router/transition', ['exports', 'rsvp/promise', 'router/handler-info', 'router/utils'], function (exports, _rsvpPromise, _routerHandlerInfo, _routerUtils) {
50034
+ enifed('router/transition', ['exports', 'rsvp/promise', 'router/utils'], function (exports, _rsvpPromise, _routerUtils) {
50001
50035
  'use strict';
50002
50036
 
50003
50037
  /**
@@ -50023,6 +50057,15 @@ enifed('router/transition', ['exports', 'rsvp/promise', 'router/handler-info', '
50023
50057
  this.data = this.intent && this.intent.data || {};
50024
50058
  this.resolvedModels = {};
50025
50059
  this.queryParams = {};
50060
+ this.promise = undefined;
50061
+ this.error = undefined;
50062
+ this.params = undefined;
50063
+ this.handlerInfos = undefined;
50064
+ this.targetName = undefined;
50065
+ this.pivotHandler = undefined;
50066
+ this.sequence = undefined;
50067
+ this.isAborted = undefined;
50068
+ this.isActive = undefined;
50026
50069
 
50027
50070
  if (error) {
50028
50071
  this.promise = _rsvpPromise.default.reject(error);
@@ -50078,10 +50121,8 @@ enifed('router/transition', ['exports', 'rsvp/promise', 'router/handler-info', '
50078
50121
  targetName: null,
50079
50122
  urlMethod: 'update',
50080
50123
  intent: null,
50081
- params: null,
50082
50124
  pivotHandler: null,
50083
50125
  resolveIndex: 0,
50084
- handlerInfos: null,
50085
50126
  resolvedModels: null,
50086
50127
  isActive: true,
50087
50128
  state: null,