ember-source 4.3.0-alpha.1 → 4.3.0-beta.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 (71) hide show
  1. package/CHANGELOG.md +6 -2
  2. package/blueprints/component-addon/index.js +2 -3
  3. package/blueprints/component-class-addon/index.js +2 -3
  4. package/blueprints/controller/files/__root__/__path__/__name__.js +2 -2
  5. package/blueprints/controller/index.js +2 -4
  6. package/blueprints/route/files/__root__/__path__/__name__.js +3 -3
  7. package/blueprints/route/index.js +2 -3
  8. package/blueprints/service/files/__root__/__path__/__name__.js +2 -2
  9. package/blueprints/service/index.js +2 -4
  10. package/build-metadata.json +3 -3
  11. package/dist/dependencies/router_js.js +66 -31
  12. package/dist/ember-template-compiler.js +1250 -861
  13. package/dist/ember-template-compiler.map +1 -1
  14. package/dist/ember-testing.js +88 -56
  15. package/dist/ember-testing.map +1 -1
  16. package/dist/ember.debug.js +3712 -3159
  17. package/dist/ember.debug.map +1 -1
  18. package/dist/header/license.js +1 -1
  19. package/dist/header/loader.js +0 -1
  20. package/dist/packages/@ember/-internals/bootstrap/index.js +0 -2
  21. package/dist/packages/@ember/-internals/container/index.js +16 -11
  22. package/dist/packages/@ember/-internals/extension-support/lib/container_debug_adapter.js +3 -3
  23. package/dist/packages/@ember/-internals/extension-support/lib/data_adapter.js +52 -52
  24. package/dist/packages/@ember/-internals/glimmer/index.js +161 -125
  25. package/dist/packages/@ember/-internals/meta/lib/meta.js +67 -11
  26. package/dist/packages/@ember/-internals/metal/index.js +95 -121
  27. package/dist/packages/@ember/-internals/routing/lib/ext/controller.js +24 -12
  28. package/dist/packages/@ember/-internals/routing/lib/location/api.js +1 -0
  29. package/dist/packages/@ember/-internals/routing/lib/location/auto_location.js +3 -1
  30. package/dist/packages/@ember/-internals/routing/lib/services/router.js +117 -197
  31. package/dist/packages/@ember/-internals/routing/lib/services/routing.js +3 -1
  32. package/dist/packages/@ember/-internals/routing/lib/system/route-info.js +2 -2
  33. package/dist/packages/@ember/-internals/routing/lib/system/route.js +147 -402
  34. package/dist/packages/@ember/-internals/routing/lib/system/router.js +82 -40
  35. package/dist/packages/@ember/-internals/routing/lib/utils.js +48 -25
  36. package/dist/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +1 -1
  37. package/dist/packages/@ember/-internals/runtime/lib/mixins/array.js +1 -0
  38. package/dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js +4 -4
  39. package/dist/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js +29 -29
  40. package/dist/packages/@ember/-internals/runtime/lib/mixins/promise_proxy.js +16 -16
  41. package/dist/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js +48 -48
  42. package/dist/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +8 -8
  43. package/dist/packages/@ember/-internals/runtime/lib/system/namespace.js +1 -2
  44. package/dist/packages/@ember/-internals/runtime/lib/type-of.js +1 -1
  45. package/dist/packages/@ember/-internals/utils/index.js +11 -9
  46. package/dist/packages/@ember/-internals/views/lib/mixins/view_support.js +2 -4
  47. package/dist/packages/@ember/-internals/views/lib/system/utils.js +2 -0
  48. package/dist/packages/@ember/application/lib/application.js +0 -2
  49. package/dist/packages/@ember/array/index.js +1 -1
  50. package/dist/packages/@ember/canary-features/index.js +2 -2
  51. package/dist/packages/@ember/controller/index.js +3 -54
  52. package/dist/packages/@ember/debug/index.js +1 -1
  53. package/dist/packages/@ember/debug/lib/deprecate.js +12 -10
  54. package/dist/packages/@ember/instrumentation/index.js +9 -13
  55. package/dist/packages/@ember/object/compat.js +16 -7
  56. package/dist/packages/@ember/polyfills/lib/assign.js +1 -0
  57. package/dist/packages/@ember/routing/router-service.js +1 -0
  58. package/dist/packages/@ember/runloop/index.js +9 -9
  59. package/dist/packages/@ember/service/index.js +6 -73
  60. package/dist/packages/@ember/string/index.js +1 -0
  61. package/dist/packages/ember/index.js +1 -2
  62. package/dist/packages/ember/version.js +1 -1
  63. package/docs/data.json +2588 -1839
  64. package/package.json +27 -27
  65. package/blueprints/component-addon/native-files/__root__/__path__/__name__.js +0 -1
  66. package/blueprints/component-class-addon/native-files/__root__/__path__/__name__.js +0 -1
  67. package/blueprints/controller/native-files/__root__/__path__/__name__.js +0 -4
  68. package/blueprints/edition-detector.js +0 -13
  69. package/blueprints/route/native-files/__root__/__path__/__name__.js +0 -11
  70. package/blueprints/route/native-files/__root__/__templatepath__/__templatename__.hbs +0 -2
  71. package/blueprints/service/native-files/__root__/__path__/__name__.js +0 -4
@@ -2,11 +2,11 @@ import { templateFactory, programCompilationContext } from '@glimmer/opcode-comp
2
2
  export { templateFactory as template, templateCacheCounters } from '@glimmer/opcode-compiler';
3
3
  import { setOwner, getOwner } from '@ember/-internals/owner';
4
4
  import { guidFor, symbol, enumerableSymbol, getDebugName, isProxy, isEmberArray, isObject, uuid } from '@ember/-internals/utils';
5
- import { assert, warn, debugFreeze, deprecate } from '@ember/debug';
5
+ import { assert, warn, debugFreeze, inspect, deprecate } from '@ember/debug';
6
6
  import { setComponentTemplate, setInternalComponentManager, setInternalHelperManager, getInternalHelperManager, helperCapabilities, setHelperManager, capabilityFlagsFrom, setInternalModifierManager, getComponentTemplate, getInternalComponentManager, componentCapabilities, modifierCapabilities, setComponentManager } from '@glimmer/manager';
7
7
  import { createConstRef, isConstRef, valueForRef, isUpdatableRef, updateRef, childRefFor, childRefFromParts, createComputeRef, createPrimitiveRef, createUnboundRef, isInvokableRef, createInvokableRef, createReadOnlyRef, createDebugAliasRef, UNDEFINED_REFERENCE } from '@glimmer/reference';
8
8
  import { untrack, consumeTag, createCache, getValue, tagFor, beginUntrackFrame, endUntrackFrame, valueForTag, beginTrackFrame, endTrackFrame, validateTag, createTag, dirtyTag, CONSTANT_TAG, isTracking, setTrackingTransactionEnv, createUpdatableTag, CURRENT_TAG } from '@glimmer/validator';
9
- import { tracked, get, PROPERTY_DID_CHANGE, tagForObject, objectAt, tagForProperty, _getProp, _setProp, set } from '@ember/-internals/metal';
9
+ import { tracked, get, PROPERTY_DID_CHANGE, tagForObject, objectAt, tagForProperty, set, _getProp, _setProp } from '@ember/-internals/metal';
10
10
  import { action } from '@ember/object';
11
11
  import { hasDOM } from '@ember/-internals/browser-environment';
12
12
  import { isSimpleClick, clearElementView, clearViewElement, getViewElement, MUTABLE_CELL, addChildView, setElementView, setViewElement, ActionSupport, ChildViewsSupport, ClassNamesSupport, CoreView, ViewMixin, ViewStateSupport, constructStyleDeprecationMessage, ActionManager, getViewId } from '@ember/-internals/views';
@@ -16,9 +16,9 @@ import { service } from '@ember/service';
16
16
  import { DEBUG } from '@glimmer/env';
17
17
  import { dasherize } from '@ember/string';
18
18
  import { registerDestructor, associateDestroyableChild, destroy } from '@glimmer/destroyable';
19
- import { join, _backburner, schedule, _getCurrentRunLoop } from '@ember/runloop';
19
+ import { join, schedule, _backburner, _getCurrentRunLoop } from '@ember/runloop';
20
20
  import { _WeakSet, EMPTY_ARRAY, unwrapTemplate, dict } from '@glimmer/util';
21
- import { reifyPositional, normalizeProperty, EMPTY_ARGS, createCapturedArgs, curry, EMPTY_POSITIONAL, array, concat, fn, get as get$1, hash, on, TEMPLATE_ONLY_COMPONENT_MANAGER, templateOnlyComponent, clientBuilder, DOMChanges, DOMTreeConstruction, inTransaction, renderMain, runtimeContext, rehydrationBuilder } from '@glimmer/runtime';
21
+ import { reifyPositional, normalizeProperty, EMPTY_ARGS, createCapturedArgs, curry, EMPTY_POSITIONAL, array, concat, fn, get as get$1, hash, on, templateOnlyComponent, TEMPLATE_ONLY_COMPONENT_MANAGER, clientBuilder, DOMChanges, DOMTreeConstruction, inTransaction, renderMain, runtimeContext, rehydrationBuilder } from '@glimmer/runtime';
22
22
  export { DOMChanges, DOMTreeConstruction, isSerializationFirstNode } from '@glimmer/runtime';
23
23
  import { TargetActionSupport, FrameworkObject, _contentFor, isArray } from '@ember/-internals/runtime';
24
24
  import { ENV } from '@ember/-internals/environment';
@@ -975,9 +975,15 @@ class LinkTo extends InternalComponent {
975
975
  try {
976
976
  return routing.generateURL(route, models, query);
977
977
  } catch (e) {
978
- // tslint:disable-next-line:max-line-length
979
- e.message = `While generating link to route "${route}": ${e.message}`;
980
- throw e;
978
+ let details = e instanceof Error ? e.message : inspect(e);
979
+ let message = `While generating link to route "${route}": ${details}`;
980
+
981
+ if (e instanceof Error) {
982
+ e.message = message;
983
+ throw e;
984
+ } else {
985
+ throw message;
986
+ }
981
987
  }
982
988
  } else {
983
989
  return routing.generateURL(route, models, query);
@@ -1023,8 +1029,7 @@ class LinkTo extends InternalComponent {
1023
1029
  transition: undefined
1024
1030
  };
1025
1031
  flaggedInstrument('interaction.link-to', payload, () => {
1026
- assert('[BUG] route can only be missing if isLoading is true', isPresent(route)); // TODO: is the signature wrong? this.query is definitely NOT a QueryParam!
1027
-
1032
+ assert('[BUG] route can only be missing if isLoading is true', isPresent(route));
1028
1033
  payload.transition = routing.transitionTo(route, models, query, replace);
1029
1034
  });
1030
1035
  }
@@ -1054,8 +1059,7 @@ class LinkTo extends InternalComponent {
1054
1059
  } else {
1055
1060
  return EMPTY_ARRAY$1;
1056
1061
  }
1057
- } // TODO: this should probably be Record<string, unknown> or something
1058
-
1062
+ }
1059
1063
 
1060
1064
  get query() {
1061
1065
  if ('query' in this.args.named) {
@@ -1155,8 +1159,7 @@ class LinkTo extends InternalComponent {
1155
1159
  query,
1156
1160
  routing
1157
1161
  } = this;
1158
- assert('[BUG] route can only be missing if isLoading is true', isPresent(route)); // TODO: is the signature wrong? this.query is definitely NOT a QueryParam!
1159
-
1162
+ assert('[BUG] route can only be missing if isLoading is true', isPresent(route));
1160
1163
  return routing.isActiveForRoute(models, query, route, state);
1161
1164
  }
1162
1165
  }
@@ -1491,8 +1494,8 @@ function installAttributeBinding(component, rootRef, parsed, operations) {
1491
1494
  elementId = component.elementId;
1492
1495
  }
1493
1496
 
1494
- elementId = createPrimitiveRef(elementId);
1495
- operations.setAttribute('id', elementId, true, null);
1497
+ let elementIdRef = createPrimitiveRef(elementId);
1498
+ operations.setAttribute('id', elementIdRef, true, null);
1496
1499
  return;
1497
1500
  }
1498
1501
 
@@ -1502,7 +1505,11 @@ function installAttributeBinding(component, rootRef, parsed, operations) {
1502
1505
  operations.setAttribute(attribute, reference, false, null);
1503
1506
  }
1504
1507
  function createClassNameBindingRef(rootRef, microsyntax, operations) {
1505
- 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
+
1506
1513
  let isStatic = prop === '';
1507
1514
 
1508
1515
  if (isStatic) {
@@ -1886,9 +1893,10 @@ var action$1 = internalHelper(args => {
1886
1893
  // Anything else is an action argument.
1887
1894
 
1888
1895
  let [context, action$$1, ...restArgs] = positional;
1896
+ assert('hash position arguments', context && action$$1);
1889
1897
  let debugKey = action$$1.debugLabel;
1890
- let target = 'target' in named ? named.target : context;
1891
- 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);
1892
1900
  let fn$$1;
1893
1901
 
1894
1902
  if (isInvokableRef(action$$1)) {
@@ -1962,7 +1970,6 @@ function makeClosureAction(context, target, action$$1, processArgs, debugKey) {
1962
1970
  self = context;
1963
1971
  fn$$1 = action$$1;
1964
1972
  } else {
1965
- // tslint:disable-next-line:max-line-length
1966
1973
  assert(`An action could not be made for \`${debugKey || action$$1}\` in ${target}. Please confirm that you are using either a quoted action name (i.e. \`(action '${debugKey || 'myAction'}')\`) or a function available in ${target}.`, false);
1967
1974
  }
1968
1975
 
@@ -1999,6 +2006,7 @@ function processComponentArgs(namedArgs) {
1999
2006
 
2000
2007
  for (let name in namedArgs) {
2001
2008
  let ref = namedArgs[name];
2009
+ assert('expected ref', ref);
2002
2010
  let value = valueForRef(ref);
2003
2011
  let isAction = typeof value === 'function' && ACTIONS.has(value);
2004
2012
 
@@ -2048,7 +2056,6 @@ const EMBER_VIEW_REF = createPrimitiveRef('ember-view');
2048
2056
 
2049
2057
  function aliasIdToElementId(args, props) {
2050
2058
  if (args.named.has('id')) {
2051
- // tslint:disable-next-line:max-line-length
2052
2059
  assert(`You cannot invoke a component with both 'id' and 'elementId' at the same time.`, !args.named.has('elementId'));
2053
2060
  props.elementId = props.id;
2054
2061
  }
@@ -2063,6 +2070,7 @@ function applyAttributeBindings(attributeBindings, component, rootRef, operation
2063
2070
 
2064
2071
  while (i !== -1) {
2065
2072
  let binding = attributeBindings[i];
2073
+ assert('has binding', binding);
2066
2074
  let parsed = parseAttributeBinding(binding);
2067
2075
  let attribute = parsed[1];
2068
2076
 
@@ -2089,6 +2097,7 @@ class CurlyComponentManager {
2089
2097
  layoutName
2090
2098
  } = component;
2091
2099
  let owner = getOwner(component);
2100
+ assert('Component is unexpectedly missing an owner', owner);
2092
2101
  let factory;
2093
2102
 
2094
2103
  if (layout === undefined) {
@@ -2141,8 +2150,9 @@ class CurlyComponentManager {
2141
2150
  {
2142
2151
  __ARGS__
2143
2152
  } = _b,
2144
- rest = __rest(_b, ["__ARGS__"]); // does this need to be untracked?
2153
+ rest = __rest(_b, ["__ARGS__"]);
2145
2154
 
2155
+ assert('[BUG] unexpectedly missing __ARGS__ after check', __ARGS__); // does this need to be untracked?
2146
2156
 
2147
2157
  let __args__ = valueForRef(__ARGS__);
2148
2158
 
@@ -2176,14 +2186,8 @@ class CurlyComponentManager {
2176
2186
  Object.assign(named, args.named.capture());
2177
2187
 
2178
2188
  for (let i = 0; i < count; i++) {
2179
- // As of TS 3.7, tsc is giving us the following error on this line without the type annotation
2180
- //
2181
- // TS7022: 'name' implicitly has type 'any' because it does not have a type annotation and is
2182
- // referenced directly or indirectly in its own initializer.
2183
- //
2184
- // This is almost certainly a TypeScript bug, feel free to try and remove the annotation after
2185
- // upgrading if it is not needed anymore.
2186
- const name = positionalParams[i];
2189
+ let name = positionalParams[i];
2190
+ assert('Expected at least one positional param', name);
2187
2191
  assert(`You cannot specify both a positional param (at position ${i}) and the hash argument \`${name}\`.`, !args.named.has(name));
2188
2192
  named[name] = args.positional.at(i);
2189
2193
  }
@@ -2443,9 +2447,7 @@ function processComponentInitializationAssertions(component, props) {
2443
2447
  classNameBindings
2444
2448
  } = component;
2445
2449
 
2446
- for (let i = 0; i < classNameBindings.length; i++) {
2447
- let binding = classNameBindings[i];
2448
-
2450
+ for (let binding of classNameBindings) {
2449
2451
  if (binding.split(' ').length > 1) {
2450
2452
  return false;
2451
2453
  }
@@ -3141,7 +3143,7 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
3141
3143
 
3142
3144
  if (DEBUG && eventDispatcher && this.renderer._isInteractive && this.tagName === '') {
3143
3145
  let eventNames = [];
3144
- let events = eventDispatcher.finalEventNameMapping; // tslint:disable-next-line:forin
3146
+ let events = eventDispatcher.finalEventNameMapping;
3145
3147
 
3146
3148
  for (let key in events) {
3147
3149
  let methodName = events[key];
@@ -3152,14 +3154,14 @@ const Component = CoreView.extend(ChildViewsSupport, ViewStateSupport, ClassName
3152
3154
  } // If in a tagless component, assert that no event handlers are defined
3153
3155
 
3154
3156
 
3155
- assert( // tslint:disable-next-line:max-line-length
3156
- `You can not define \`${eventNames}\` function(s) to handle DOM event in the \`${this}\` tagless component since it doesn't have any DOM element.`, !eventNames.length);
3157
+ assert(`You can not define \`${eventNames}\` function(s) to handle DOM event in the \`${this}\` tagless component since it doesn't have any DOM element.`, !eventNames.length);
3157
3158
  }
3158
3159
  },
3159
3160
 
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
- ```
3478
+ const IS_CLASSIC_HELPER = Symbol('IS_CLASSIC_HELPER');
3429
3479
 
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.
3437
-
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
 
@@ -4516,6 +4530,7 @@ const VM_DEPRECATION_OVERRIDES = [{
4516
4530
  until: '4.4.0',
4517
4531
  for: 'ember-source',
4518
4532
  since: {
4533
+ available: '3.28.0',
4519
4534
  enabled: '3.28.0'
4520
4535
  }
4521
4536
  }];
@@ -4540,14 +4555,14 @@ var disallowDynamicResolution = internalHelper(({
4540
4555
  positional,
4541
4556
  named
4542
4557
  }) => {
4543
- assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1);
4544
- let nameOrValueRef = positional[0];
4545
- assert(`[BUG] expecting \`type\` named argument`, 'type' in named);
4546
- assert(`[BUG] expecting \`loc\` named argument`, 'loc' in named);
4547
- 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);
4548
4560
  let typeRef = named.type;
4549
4561
  let locRef = named.loc;
4550
- 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?
4551
4566
  // assert('[BUG] expecting a string literal for the `type` argument', isConstRef(typeRef));
4552
4567
  // assert('[BUG] expecting a string literal for the `loc` argument', isConstRef(locRef));
4553
4568
  // assert('[BUG] expecting a string literal for the `original` argument', isConstRef(originalRef));
@@ -4569,7 +4584,8 @@ let helper$1;
4569
4584
 
4570
4585
  if (DEBUG) {
4571
4586
  helper$1 = args => {
4572
- let inner = args.positional[0];
4587
+ const inner = args.positional[0];
4588
+ assert('expected at least one positional arg', inner);
4573
4589
  return createComputeRef(() => {
4574
4590
  let value = valueForRef(inner);
4575
4591
  assert('You cannot pass a null or undefined destination element to in-element', value !== null && value !== undefined);
@@ -4577,7 +4593,11 @@ if (DEBUG) {
4577
4593
  });
4578
4594
  };
4579
4595
  } else {
4580
- 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
+ };
4581
4601
  }
4582
4602
 
4583
4603
  var inElementNullCheckHelper = internalHelper(helper$1);
@@ -4586,9 +4606,14 @@ var normalizeClassHelper = internalHelper(({
4586
4606
  positional
4587
4607
  }) => {
4588
4608
  return createComputeRef(() => {
4589
- 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('.');
4590
4613
  let className = classNameParts[classNameParts.length - 1];
4591
- let value = valueForRef(positional[1]);
4614
+ assert('has className', className); // Always at least one split result
4615
+
4616
+ let value = valueForRef(valueArg);
4592
4617
 
4593
4618
  if (value === true) {
4594
4619
  return dasherize(className);
@@ -4609,7 +4634,7 @@ var resolve = internalHelper(({
4609
4634
  assert('[BUG] missing owner', owner);
4610
4635
  assert(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1);
4611
4636
  let fullNameRef = positional[0];
4612
- assert('[BUG] expecting a string literal as argument', isConstRef(fullNameRef));
4637
+ assert('[BUG] expecting a string literal as argument', fullNameRef && isConstRef(fullNameRef));
4613
4638
  let fullName = valueForRef(fullNameRef);
4614
4639
  assert('[BUG] expecting a string literal as argument', typeof fullName === 'string');
4615
4640
  assert('[BUG] expecting a valid full name', fullName.split(':').length === 2);
@@ -4634,7 +4659,8 @@ var resolve = internalHelper(({
4634
4659
  var trackArray = internalHelper(({
4635
4660
  positional
4636
4661
  }) => {
4637
- let inner = positional[0];
4662
+ const inner = positional[0];
4663
+ assert('expected at least one positional arg', inner);
4638
4664
  return createComputeRef(() => {
4639
4665
  let iterable = valueForRef(inner);
4640
4666
 
@@ -4726,7 +4752,8 @@ var trackArray = internalHelper(({
4726
4752
  var mut = internalHelper(({
4727
4753
  positional
4728
4754
  }) => {
4729
- 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
4730
4757
  // cases:
4731
4758
  //
4732
4759
  // 1. (mut "not a path") – passing a literal, result from a helper
@@ -4862,7 +4889,9 @@ var mut = internalHelper(({
4862
4889
  var readonly = internalHelper(({
4863
4890
  positional
4864
4891
  }) => {
4865
- return createReadOnlyRef(positional[0]);
4892
+ let firstArg = positional[0];
4893
+ assert('has first arg', firstArg);
4894
+ return createReadOnlyRef(firstArg);
4866
4895
  });
4867
4896
 
4868
4897
  /**
@@ -4901,7 +4930,7 @@ var unbound = internalHelper(({
4901
4930
  named
4902
4931
  }) => {
4903
4932
  assert('unbound helper cannot be called with multiple params or hash params', positional.length === 1 && Object.keys(named).length === 0);
4904
- return createUnboundRef(valueForRef(positional[0]), '(resurt of an `unbound` helper)');
4933
+ return createUnboundRef(valueForRef(positional[0]), '(result of an `unbound` helper)');
4905
4934
  });
4906
4935
 
4907
4936
  const MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];
@@ -5120,6 +5149,7 @@ class ActionModifierManager {
5120
5149
  positional
5121
5150
  } = actionState;
5122
5151
  let actionNameRef = positional[1];
5152
+ assert('Expected at least one positional arg', actionNameRef);
5123
5153
 
5124
5154
  if (!isInvokableRef(actionNameRef)) {
5125
5155
  actionState.actionName = valueForRef(actionNameRef);
@@ -5413,7 +5443,9 @@ const outletHelper = internalHelper((args, owner, scope) => {
5413
5443
  if (args.positional.length === 0) {
5414
5444
  nameRef = createPrimitiveRef('main');
5415
5445
  } else {
5416
- nameRef = args.positional[0];
5446
+ let maybeNameRef = args.positional[0];
5447
+ assert('Expected at least one positional arg', maybeNameRef);
5448
+ nameRef = maybeNameRef;
5417
5449
  }
5418
5450
 
5419
5451
  let outletRef = createComputeRef(() => {
@@ -5744,13 +5776,11 @@ class DynamicScope {
5744
5776
  }
5745
5777
 
5746
5778
  get(key) {
5747
- // tslint:disable-next-line:max-line-length
5748
5779
  assert(`Using \`-get-dynamic-scope\` is only supported for \`outletState\` (you used \`${key}\`).`, key === 'outletState');
5749
5780
  return this.outletState;
5750
5781
  }
5751
5782
 
5752
5783
  set(key, value) {
5753
- // tslint:disable-next-line:max-line-length
5754
5784
  assert(`Using \`-with-dynamic-scope\` is only supported for \`outletState\` (you used \`${key}\`).`, key === 'outletState');
5755
5785
  this.outletState = value;
5756
5786
  return value;
@@ -5773,6 +5803,7 @@ function errorLoopTransaction(fn$$1) {
5773
5803
  // Noop the function so that we won't keep calling it and causing
5774
5804
  // infinite looping failures;
5775
5805
  fn$$1 = () => {
5806
+ // eslint-disable-next-line no-console
5776
5807
  console.warn('Attempted to rerender, but the Ember application has had an unrecoverable error occur during render. You should reload the application after fixing the cause of the error.');
5777
5808
  };
5778
5809
  }
@@ -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':