ember-source 4.3.0-alpha.2 → 4.4.0-alpha.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +6 -2
  2. package/build-metadata.json +3 -3
  3. package/dist/dependencies/router_js.js +66 -31
  4. package/dist/ember-template-compiler.js +1169 -779
  5. package/dist/ember-template-compiler.map +1 -1
  6. package/dist/ember-testing.js +74 -43
  7. package/dist/ember-testing.map +1 -1
  8. package/dist/ember.debug.js +3290 -2760
  9. package/dist/ember.debug.map +1 -1
  10. package/dist/header/license.js +1 -1
  11. package/dist/packages/@ember/-internals/container/index.js +15 -11
  12. package/dist/packages/@ember/-internals/extension-support/lib/container_debug_adapter.js +3 -3
  13. package/dist/packages/@ember/-internals/extension-support/lib/data_adapter.js +52 -52
  14. package/dist/packages/@ember/-internals/glimmer/index.js +139 -103
  15. package/dist/packages/@ember/-internals/meta/lib/meta.js +8 -9
  16. package/dist/packages/@ember/-internals/metal/index.js +44 -45
  17. package/dist/packages/@ember/-internals/routing/lib/ext/controller.js +10 -8
  18. package/dist/packages/@ember/-internals/routing/lib/location/auto_location.js +3 -1
  19. package/dist/packages/@ember/-internals/routing/lib/services/router.js +155 -190
  20. package/dist/packages/@ember/-internals/routing/lib/services/routing.js +3 -1
  21. package/dist/packages/@ember/-internals/routing/lib/system/route-info.js +2 -2
  22. package/dist/packages/@ember/-internals/routing/lib/system/route.js +110 -378
  23. package/dist/packages/@ember/-internals/routing/lib/system/router.js +74 -36
  24. package/dist/packages/@ember/-internals/routing/lib/utils.js +33 -21
  25. package/dist/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +1 -1
  26. package/dist/packages/@ember/-internals/runtime/lib/mixins/array.js +1 -0
  27. package/dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js +4 -4
  28. package/dist/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js +29 -29
  29. package/dist/packages/@ember/-internals/runtime/lib/mixins/promise_proxy.js +16 -16
  30. package/dist/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js +48 -48
  31. package/dist/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +8 -8
  32. package/dist/packages/@ember/-internals/runtime/lib/system/namespace.js +1 -2
  33. package/dist/packages/@ember/-internals/runtime/lib/type-of.js +1 -1
  34. package/dist/packages/@ember/-internals/utils/index.js +10 -8
  35. package/dist/packages/@ember/-internals/views/lib/system/utils.js +2 -0
  36. package/dist/packages/@ember/array/index.js +1 -1
  37. package/dist/packages/@ember/controller/index.js +3 -54
  38. package/dist/packages/@ember/instrumentation/index.js +9 -13
  39. package/dist/packages/@ember/object/compat.js +16 -7
  40. package/dist/packages/@ember/routing/router-service.js +1 -0
  41. package/dist/packages/@ember/service/index.js +6 -73
  42. package/dist/packages/ember/version.js +1 -1
  43. package/docs/data.json +571 -521
  44. package/package.json +13 -13
@@ -1505,7 +1505,11 @@ function installAttributeBinding(component, rootRef, parsed, operations) {
1505
1505
  operations.setAttribute(attribute, reference, false, null);
1506
1506
  }
1507
1507
  function createClassNameBindingRef(rootRef, microsyntax, operations) {
1508
- let [prop, truthy, falsy] = microsyntax.split(':');
1508
+ let parts = microsyntax.split(':');
1509
+ let [prop, truthy, falsy] = parts; // NOTE: This could be an empty string
1510
+
1511
+ assert('has prop', prop !== undefined); // Will always have at least one part
1512
+
1509
1513
  let isStatic = prop === '';
1510
1514
 
1511
1515
  if (isStatic) {
@@ -1889,9 +1893,10 @@ var action$1 = internalHelper(args => {
1889
1893
  // Anything else is an action argument.
1890
1894
 
1891
1895
  let [context, action$$1, ...restArgs] = positional;
1896
+ assert('hash position arguments', context && action$$1);
1892
1897
  let debugKey = action$$1.debugLabel;
1893
- let target = 'target' in named ? named.target : context;
1894
- let processArgs = makeArgsProcessor('value' in named && named.value, restArgs);
1898
+ let target = 'target' in named && named.target ? named.target : context;
1899
+ let processArgs = makeArgsProcessor('value' in named && named.value || false, restArgs);
1895
1900
  let fn$$1;
1896
1901
 
1897
1902
  if (isInvokableRef(action$$1)) {
@@ -2001,6 +2006,7 @@ function processComponentArgs(namedArgs) {
2001
2006
 
2002
2007
  for (let name in namedArgs) {
2003
2008
  let ref = namedArgs[name];
2009
+ assert('expected ref', ref);
2004
2010
  let value = valueForRef(ref);
2005
2011
  let isAction = typeof value === 'function' && ACTIONS.has(value);
2006
2012
 
@@ -2064,6 +2070,7 @@ function applyAttributeBindings(attributeBindings, component, rootRef, operation
2064
2070
 
2065
2071
  while (i !== -1) {
2066
2072
  let binding = attributeBindings[i];
2073
+ assert('has binding', binding);
2067
2074
  let parsed = parseAttributeBinding(binding);
2068
2075
  let attribute = parsed[1];
2069
2076
 
@@ -2090,6 +2097,7 @@ class CurlyComponentManager {
2090
2097
  layoutName
2091
2098
  } = component;
2092
2099
  let owner = getOwner(component);
2100
+ assert('Component is unexpectedly missing an owner', owner);
2093
2101
  let factory;
2094
2102
 
2095
2103
  if (layout === undefined) {
@@ -2142,8 +2150,9 @@ class CurlyComponentManager {
2142
2150
  {
2143
2151
  __ARGS__
2144
2152
  } = _b,
2145
- rest = __rest(_b, ["__ARGS__"]); // does this need to be untracked?
2153
+ rest = __rest(_b, ["__ARGS__"]);
2146
2154
 
2155
+ assert('[BUG] unexpectedly missing __ARGS__ after check', __ARGS__); // does this need to be untracked?
2147
2156
 
2148
2157
  let __args__ = valueForRef(__ARGS__);
2149
2158
 
@@ -2177,14 +2186,8 @@ class CurlyComponentManager {
2177
2186
  Object.assign(named, args.named.capture());
2178
2187
 
2179
2188
  for (let i = 0; i < count; i++) {
2180
- // As of TS 3.7, tsc is giving us the following error on this line without the type annotation
2181
- //
2182
- // TS7022: 'name' implicitly has type 'any' because it does not have a type annotation and is
2183
- // referenced directly or indirectly in its own initializer.
2184
- //
2185
- // This is almost certainly a TypeScript bug, feel free to try and remove the annotation after
2186
- // upgrading if it is not needed anymore.
2187
- const name = positionalParams[i];
2189
+ let name = positionalParams[i];
2190
+ assert('Expected at least one positional param', name);
2188
2191
  assert(`You cannot specify both a positional param (at position ${i}) and the hash argument \`${name}\`.`, !args.named.has(name));
2189
2192
  named[name] = args.positional.at(i);
2190
2193
  }
@@ -2444,9 +2447,7 @@ function processComponentInitializationAssertions(component, props) {
2444
2447
  classNameBindings
2445
2448
  } = component;
2446
2449
 
2447
- for (let i = 0; i < classNameBindings.length; i++) {
2448
- let binding = classNameBindings[i];
2449
-
2450
+ for (let binding of classNameBindings) {
2450
2451
  if (binding.split(' ').length > 1) {
2451
2452
  return false;
2452
2453
  }
@@ -3160,6 +3161,7 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
3160
3161
  get _dispatcher() {
3161
3162
  if (this.__dispatcher === undefined) {
3162
3163
  let owner = getOwner(this);
3164
+ assert('Component is unexpectedly missing an owner', owner);
3163
3165
 
3164
3166
  if (owner.lookup('-environment:main').isInteractive) {
3165
3167
  this.__dispatcher = owner.lookup('event_dispatcher:main');
@@ -3404,6 +3406,59 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
3404
3406
  @since 1.13.0
3405
3407
  */
3406
3408
  didUpdate() {}
3409
+ /**
3410
+ Called when the component has updated and rerendered itself.
3411
+ Called only during a rerender, not during an initial render.
3412
+ @event didUpdate
3413
+ @public
3414
+ @since 1.13.0
3415
+ */
3416
+
3417
+ /**
3418
+ Layout can be used to wrap content in a component.
3419
+ @property layout
3420
+ @type Function
3421
+ @public
3422
+ */
3423
+
3424
+ /**
3425
+ The name of the layout to lookup if no layout is provided.
3426
+ By default `Component` will lookup a template with this name in
3427
+ `Ember.TEMPLATES` (a shared global object).
3428
+ @property layoutName
3429
+ @type String
3430
+ @default null
3431
+ @private
3432
+ */
3433
+
3434
+ /**
3435
+ The HTML `id` of the component's element in the DOM. You can provide this
3436
+ value yourself but it must be unique (just as in HTML):
3437
+ ```handlebars
3438
+ {{my-component elementId="a-really-cool-id"}}
3439
+ ```
3440
+ ```handlebars
3441
+ <MyComponent @elementId="a-really-cool-id" />
3442
+ ```
3443
+ If not manually set a default value will be provided by the framework.
3444
+ Once rendered an element's `elementId` is considered immutable and you
3445
+ should never change it. If you need to compute a dynamic value for the
3446
+ `elementId`, you should do this when the component or element is being
3447
+ instantiated:
3448
+ ```javascript
3449
+ export default Component.extend({
3450
+ init() {
3451
+ this._super(...arguments);
3452
+ var index = this.get('index');
3453
+ this.set('elementId', `component-id${index}`);
3454
+ }
3455
+ });
3456
+ ```
3457
+ @property elementId
3458
+ @type String
3459
+ @public
3460
+ */
3461
+
3407
3462
 
3408
3463
  });
3409
3464
 
@@ -3418,60 +3473,15 @@ setInternalComponentManager(CURLY_COMPONENT_MANAGER, Component);
3418
3473
  /**
3419
3474
  @module @ember/component
3420
3475
  */
3476
+ var _a;
3421
3477
  const RECOMPUTE_TAG = symbol('RECOMPUTE_TAG');
3422
- /**
3423
- Ember Helpers are functions that can compute values, and are used in templates.
3424
- For example, this code calls a helper named `format-currency`:
3425
-
3426
- ```app/templates/application.hbs
3427
- <Cost @cents={{230}} />
3428
- ```
3429
-
3430
- ```app/components/cost.hbs
3431
- <div>{{format-currency @cents currency="$"}}</div>
3432
- ```
3433
-
3434
- Additionally a helper can be called as a nested helper.
3435
- In this example, we show the formatted currency value if the `showMoney`
3436
- named argument is truthy.
3478
+ const IS_CLASSIC_HELPER = Symbol('IS_CLASSIC_HELPER');
3437
3479
 
3438
- ```handlebars
3439
- {{if @showMoney (format-currency @cents currency="$")}}
3440
- ```
3441
-
3442
- Helpers defined using a class must provide a `compute` function. For example:
3443
-
3444
- ```app/helpers/format-currency.js
3445
- import Helper from '@ember/component/helper';
3446
-
3447
- export default class extends Helper {
3448
- compute([cents], { currency }) {
3449
- return `${currency}${cents * 0.01}`;
3450
- }
3451
- }
3452
- ```
3453
-
3454
- Each time the input to a helper changes, the `compute` function will be
3455
- called again.
3456
-
3457
- As instances, these helpers also have access to the container and will accept
3458
- injected dependencies.
3459
-
3460
- Additionally, class helpers can call `recompute` to force a new computation.
3461
-
3462
- @class Helper
3463
- @extends CoreObject
3464
- @public
3465
- @since 1.13.0
3466
- */
3467
-
3468
- let Helper = FrameworkObject.extend({
3480
+ class Helper extends FrameworkObject {
3469
3481
  init() {
3470
- this._super(...arguments);
3471
-
3482
+ super.init();
3472
3483
  this[RECOMPUTE_TAG] = createTag();
3473
- },
3474
-
3484
+ }
3475
3485
  /**
3476
3486
  On a class-based helper, it may be useful to force a recomputation of that
3477
3487
  helpers value. This is akin to `rerender` on a component.
@@ -3495,14 +3505,17 @@ let Helper = FrameworkObject.extend({
3495
3505
  @public
3496
3506
  @since 1.13.0
3497
3507
  */
3508
+
3509
+
3498
3510
  recompute() {
3499
3511
  join(() => dirtyTag(this[RECOMPUTE_TAG]));
3500
3512
  }
3501
3513
 
3502
- });
3503
- const IS_CLASSIC_HELPER = symbol('IS_CLASSIC_HELPER');
3514
+ }
3515
+
3516
+ _a = IS_CLASSIC_HELPER;
3504
3517
  Helper.isHelperFactory = true;
3505
- Helper[IS_CLASSIC_HELPER] = true;
3518
+ Helper[_a] = true;
3506
3519
  function isClassicHelper(obj) {
3507
3520
  return obj[IS_CLASSIC_HELPER] === true;
3508
3521
  }
@@ -3519,7 +3532,7 @@ class ClassicHelperManager {
3519
3532
  }
3520
3533
 
3521
3534
  createHelper(definition, args) {
3522
- let instance = definition.class === undefined ? definition.create(this.ownerInjection) : definition.create();
3535
+ let instance = isFactoryManager(definition) ? definition.create() : definition.create(this.ownerInjection);
3523
3536
  return {
3524
3537
  instance,
3525
3538
  args
@@ -3551,6 +3564,10 @@ class ClassicHelperManager {
3551
3564
 
3552
3565
  }
3553
3566
 
3567
+ function isFactoryManager(obj) {
3568
+ return obj != null && 'class' in obj;
3569
+ }
3570
+
3554
3571
  setHelperManager(owner => {
3555
3572
  return new ClassicHelperManager(owner);
3556
3573
  }, Helper);
@@ -4131,7 +4148,8 @@ class EachInWrapper {
4131
4148
  var eachIn = internalHelper(({
4132
4149
  positional
4133
4150
  }) => {
4134
- let inner = positional[0];
4151
+ const inner = positional[0];
4152
+ assert('expected at least one positional arg', inner);
4135
4153
  return createComputeRef(() => {
4136
4154
  let iterable = valueForRef(inner);
4137
4155
  consumeTag(tagForObject(iterable));
@@ -4270,18 +4288,14 @@ class ObjectIterator extends BoundedIterator {
4270
4288
 
4271
4289
  static fromIndexable(obj) {
4272
4290
  let keys = Object.keys(obj);
4273
- let {
4274
- length
4275
- } = keys;
4276
4291
 
4277
- if (length === 0) {
4292
+ if (keys.length === 0) {
4278
4293
  return null;
4279
4294
  } else {
4280
4295
  let values = [];
4281
4296
 
4282
- for (let i = 0; i < length; i++) {
4297
+ for (let key of keys) {
4283
4298
  let value;
4284
- let key = keys[i];
4285
4299
  value = obj[key]; // Add the tag of the returned value if it is an array, since arrays
4286
4300
  // should always cause updates if they are consumed and then changed
4287
4301
 
@@ -4541,14 +4555,14 @@ var disallowDynamicResolution = internalHelper(({
4541
4555
  positional,
4542
4556
  named
4543
4557
  }) => {
4544
- assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1);
4545
- let nameOrValueRef = positional[0];
4546
- assert(`[BUG] expecting \`type\` named argument`, 'type' in named);
4547
- assert(`[BUG] expecting \`loc\` named argument`, 'loc' in named);
4548
- assert(`[BUG] expecting \`original\` named argument`, 'original' in named);
4558
+ const nameOrValueRef = positional[0];
4559
+ assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1 && nameOrValueRef);
4549
4560
  let typeRef = named.type;
4550
4561
  let locRef = named.loc;
4551
- let originalRef = named.original; // Bug: why do these fail?
4562
+ let originalRef = named.original;
4563
+ assert(`[BUG] expecting \`type\` named argument`, typeRef);
4564
+ assert(`[BUG] expecting \`loc\` named argument`, locRef);
4565
+ assert(`[BUG] expecting \`original\` named argument`, originalRef); // Bug: why do these fail?
4552
4566
  // assert('[BUG] expecting a string literal for the `type` argument', isConstRef(typeRef));
4553
4567
  // assert('[BUG] expecting a string literal for the `loc` argument', isConstRef(locRef));
4554
4568
  // assert('[BUG] expecting a string literal for the `original` argument', isConstRef(originalRef));
@@ -4570,7 +4584,8 @@ let helper$1;
4570
4584
 
4571
4585
  if (DEBUG) {
4572
4586
  helper$1 = args => {
4573
- let inner = args.positional[0];
4587
+ const inner = args.positional[0];
4588
+ assert('expected at least one positional arg', inner);
4574
4589
  return createComputeRef(() => {
4575
4590
  let value = valueForRef(inner);
4576
4591
  assert('You cannot pass a null or undefined destination element to in-element', value !== null && value !== undefined);
@@ -4578,7 +4593,11 @@ if (DEBUG) {
4578
4593
  });
4579
4594
  };
4580
4595
  } else {
4581
- helper$1 = args => args.positional[0];
4596
+ helper$1 = args => {
4597
+ let arg = args.positional[0];
4598
+ assert('expected at least one positional arg', arg);
4599
+ return arg;
4600
+ };
4582
4601
  }
4583
4602
 
4584
4603
  var inElementNullCheckHelper = internalHelper(helper$1);
@@ -4587,9 +4606,14 @@ var normalizeClassHelper = internalHelper(({
4587
4606
  positional
4588
4607
  }) => {
4589
4608
  return createComputeRef(() => {
4590
- let classNameParts = valueForRef(positional[0]).split('.');
4609
+ let classNameArg = positional[0];
4610
+ let valueArg = positional[1];
4611
+ assert('expected at least two positional args', classNameArg && valueArg);
4612
+ let classNameParts = valueForRef(classNameArg).split('.');
4591
4613
  let className = classNameParts[classNameParts.length - 1];
4592
- let value = valueForRef(positional[1]);
4614
+ assert('has className', className); // Always at least one split result
4615
+
4616
+ let value = valueForRef(valueArg);
4593
4617
 
4594
4618
  if (value === true) {
4595
4619
  return dasherize(className);
@@ -4610,7 +4634,7 @@ var resolve = internalHelper(({
4610
4634
  assert('[BUG] missing owner', owner);
4611
4635
  assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1);
4612
4636
  let fullNameRef = positional[0];
4613
- assert('[BUG] expecting a string literal as argument', isConstRef(fullNameRef));
4637
+ assert('[BUG] expecting a string literal as argument', fullNameRef && isConstRef(fullNameRef));
4614
4638
  let fullName = valueForRef(fullNameRef);
4615
4639
  assert('[BUG] expecting a string literal as argument', typeof fullName === 'string');
4616
4640
  assert('[BUG] expecting a valid full name', fullName.split(':').length === 2);
@@ -4635,7 +4659,8 @@ var resolve = internalHelper(({
4635
4659
  var trackArray = internalHelper(({
4636
4660
  positional
4637
4661
  }) => {
4638
- let inner = positional[0];
4662
+ const inner = positional[0];
4663
+ assert('expected at least one positional arg', inner);
4639
4664
  return createComputeRef(() => {
4640
4665
  let iterable = valueForRef(inner);
4641
4666
 
@@ -4727,7 +4752,8 @@ var trackArray = internalHelper(({
4727
4752
  var mut = internalHelper(({
4728
4753
  positional
4729
4754
  }) => {
4730
- let ref = positional[0]; // TODO: Improve this error message. This covers at least two distinct
4755
+ let ref = positional[0];
4756
+ assert('expected at least one positional arg', ref); // TODO: Improve this error message. This covers at least two distinct
4731
4757
  // cases:
4732
4758
  //
4733
4759
  // 1. (mut "not a path") – passing a literal, result from a helper
@@ -4863,7 +4889,9 @@ var mut = internalHelper(({
4863
4889
  var readonly = internalHelper(({
4864
4890
  positional
4865
4891
  }) => {
4866
- return createReadOnlyRef(positional[0]);
4892
+ let firstArg = positional[0];
4893
+ assert('has first arg', firstArg);
4894
+ return createReadOnlyRef(firstArg);
4867
4895
  });
4868
4896
 
4869
4897
  /**
@@ -4902,7 +4930,7 @@ var unbound = internalHelper(({
4902
4930
  named
4903
4931
  }) => {
4904
4932
  assert('unbound helper cannot be called with multiple params or hash params', positional.length === 1 && Object.keys(named).length === 0);
4905
- return createUnboundRef(valueForRef(positional[0]), '(resurt of an `unbound` helper)');
4933
+ return createUnboundRef(valueForRef(positional[0]), '(result of an `unbound` helper)');
4906
4934
  });
4907
4935
 
4908
4936
  const MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];
@@ -5121,6 +5149,7 @@ class ActionModifierManager {
5121
5149
  positional
5122
5150
  } = actionState;
5123
5151
  let actionNameRef = positional[1];
5152
+ assert('Expected at least one positional arg', actionNameRef);
5124
5153
 
5125
5154
  if (!isInvokableRef(actionNameRef)) {
5126
5155
  actionState.actionName = valueForRef(actionNameRef);
@@ -5414,7 +5443,9 @@ const outletHelper = internalHelper((args, owner, scope) => {
5414
5443
  if (args.positional.length === 0) {
5415
5444
  nameRef = createPrimitiveRef('main');
5416
5445
  } else {
5417
- nameRef = args.positional[0];
5446
+ let maybeNameRef = args.positional[0];
5447
+ assert('Expected at least one positional arg', maybeNameRef);
5448
+ nameRef = maybeNameRef;
5418
5449
  }
5419
5450
 
5420
5451
  let outletRef = createComputeRef(() => {
@@ -5854,8 +5885,8 @@ function deregister(renderer) {
5854
5885
  }
5855
5886
 
5856
5887
  function loopBegin() {
5857
- for (let i = 0; i < renderers.length; i++) {
5858
- renderers[i]._scheduleRevalidate();
5888
+ for (let renderer of renderers) {
5889
+ renderer._scheduleRevalidate();
5859
5890
  }
5860
5891
  }
5861
5892
 
@@ -5900,12 +5931,12 @@ function resolveRenderPromise() {
5900
5931
  let loops = 0;
5901
5932
 
5902
5933
  function loopEnd() {
5903
- for (let i = 0; i < renderers.length; i++) {
5904
- if (!renderers[i]._isValid()) {
5934
+ for (let renderer of renderers) {
5935
+ if (!renderer._isValid()) {
5905
5936
  if (loops > ENV._RERENDER_LOOP_LIMIT) {
5906
5937
  loops = 0; // TODO: do something better
5907
5938
 
5908
- renderers[i].destroy();
5939
+ renderer.destroy();
5909
5940
  throw new Error('infinite rendering invalidation detected');
5910
5941
  }
5911
5942
 
@@ -5949,12 +5980,13 @@ class Renderer {
5949
5980
  let {
5950
5981
  _viewRegistry
5951
5982
  } = props;
5952
- let document = getOwner(props).lookup('service:-document');
5953
- let env = getOwner(props).lookup('-environment:main');
5954
5983
  let owner = getOwner(props);
5984
+ assert('Renderer is unexpectedly missing an owner', owner);
5985
+ let document = owner.lookup('service:-document');
5986
+ let env = owner.lookup('-environment:main');
5955
5987
  let rootTemplate = owner.lookup(privatize`template:-root`);
5956
5988
  let builder = owner.lookup('service:-dom-builder');
5957
- return new this(getOwner(props), document, env, rootTemplate, _viewRegistry, builder);
5989
+ return new this(owner, document, env, rootTemplate, _viewRegistry, builder);
5958
5990
  }
5959
5991
 
5960
5992
  get debugRenderTree() {
@@ -6027,6 +6059,7 @@ class Renderer {
6027
6059
 
6028
6060
  while (i--) {
6029
6061
  let root = roots[i];
6062
+ assert('has root', root);
6030
6063
 
6031
6064
  if (root.isFor(view)) {
6032
6065
  root.destroy();
@@ -6098,6 +6131,7 @@ class Renderer {
6098
6131
  // each root is processed
6099
6132
  for (let i = 0; i < roots.length; i++) {
6100
6133
  let root = roots[i];
6134
+ assert('has root', root);
6101
6135
 
6102
6136
  if (root.destroyed) {
6103
6137
  // add to the list of roots to be removed
@@ -6160,8 +6194,7 @@ class Renderer {
6160
6194
  _clearAllRoots() {
6161
6195
  let roots = this._roots;
6162
6196
 
6163
- for (let i = 0; i < roots.length; i++) {
6164
- let root = roots[i];
6197
+ for (let root of roots) {
6165
6198
  root.destroy();
6166
6199
  }
6167
6200
 
@@ -6282,6 +6315,7 @@ class OutletView {
6282
6315
  template: templateFactory$$1
6283
6316
  } = options;
6284
6317
  let owner = getOwner(options);
6318
+ assert('OutletView is unexpectedly missing an owner', owner);
6285
6319
  let template = templateFactory$$1(owner);
6286
6320
  return new OutletView(_environment, owner, template, namespace);
6287
6321
  }
@@ -6319,7 +6353,9 @@ function setupApplicationRegistry(registry) {
6319
6353
  // association won't leak
6320
6354
  registry.register('service:-dom-builder', {
6321
6355
  create(props) {
6322
- let env = getOwner(props).lookup('-environment:main');
6356
+ let owner = getOwner(props);
6357
+ assert('DomBuilderService is unexpectedly missing an owner', owner);
6358
+ let env = owner.lookup('-environment:main');
6323
6359
 
6324
6360
  switch (env._renderMode) {
6325
6361
  case 'serialize':
@@ -356,7 +356,8 @@ export class Meta {
356
356
  sync
357
357
  });
358
358
  } else {
359
- let listener = listeners[i]; // If the listener is our own listener and we are trying to remove it, we
359
+ let listener = listeners[i];
360
+ assert('has listener', listener); // If the listener is our own listener and we are trying to remove it, we
360
361
  // want to splice it out entirely so we don't hold onto a reference.
361
362
 
362
363
  if (kind === 2
@@ -447,8 +448,7 @@ export class Meta {
447
448
  this._inheritedEnd = 0;
448
449
  }
449
450
 
450
- for (let i = 0; i < parentListeners.length; i++) {
451
- let listener = parentListeners[i];
451
+ for (let listener of parentListeners) {
452
452
  let index = indexOfListener(listeners, listener.event, listener.target, listener.method);
453
453
 
454
454
  if (index === -1) {
@@ -481,10 +481,9 @@ export class Meta {
481
481
  }
482
482
 
483
483
  if (listeners !== undefined) {
484
- for (let index = 0; index < listeners.length; index++) {
485
- let listener = listeners[index]; // REMOVE listeners are placeholders that tell us not to
484
+ for (let listener of listeners) {
485
+ // REMOVE listeners are placeholders that tell us not to
486
486
  // inherit, so they never match. Only ADD and ONCE can match.
487
-
488
487
  if (listener.event === eventName && (listener.kind === 0
489
488
  /* ADD */
490
489
  || listener.kind === 1
@@ -517,10 +516,9 @@ export class Meta {
517
516
  }
518
517
 
519
518
  if (listeners !== undefined) {
520
- for (let index = 0; index < listeners.length; index++) {
521
- let listener = listeners[index]; // REMOVE listeners are placeholders that tell us not to
519
+ for (let listener of listeners) {
520
+ // REMOVE listeners are placeholders that tell us not to
522
521
  // inherit, so they never match. Only ADD and ONCE can match.
523
-
524
522
  if ((listener.kind === 0
525
523
  /* ADD */
526
524
  || listener.kind === 1
@@ -642,6 +640,7 @@ export { counters };
642
640
  function indexOfListener(listeners, event, target, method) {
643
641
  for (let i = listeners.length - 1; i >= 0; i--) {
644
642
  let listener = listeners[i];
643
+ assert('has listener', listener);
645
644
 
646
645
  if (listener.event === event && listener.target === target && listener.method === method) {
647
646
  return i;