ember-source 4.5.0-alpha.4 → 4.5.0-beta.2

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 (126) hide show
  1. package/CHANGELOG.md +13 -4
  2. package/blueprints-js/-addon-import.js +48 -0
  3. package/blueprints-js/acceptance-test/mocha-files/tests/acceptance/__name__-test.js +24 -0
  4. package/blueprints-js/acceptance-test/mocha-rfc-232-files/tests/acceptance/__name__-test.js +13 -0
  5. package/blueprints-js/acceptance-test/qunit-files/tests/acceptance/__name__-test.js +12 -0
  6. package/blueprints-js/acceptance-test/qunit-rfc-232-files/tests/acceptance/__name__-test.js +13 -0
  7. package/blueprints-js/component/files/__root__/__path__/__name__.js +3 -0
  8. package/blueprints-js/component/files/__root__/__templatepath__/__templatename__.hbs +1 -0
  9. package/blueprints-js/component-addon/files/__root__/__path__/__name__.js +1 -0
  10. package/blueprints-js/component-class/files/__root__/__path__/__name__.js +3 -0
  11. package/blueprints-js/component-class-addon/files/__root__/__path__/__name__.js +1 -0
  12. package/blueprints-js/component-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +34 -0
  13. package/blueprints-js/component-test/mocha-files/__root__/__testType__/__path__/__test__.js +36 -0
  14. package/blueprints-js/component-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +38 -0
  15. package/blueprints-js/component-test/qunit-files/__root__/__testType__/__path__/__test__.js +31 -0
  16. package/blueprints-js/component-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +36 -0
  17. package/blueprints-js/controller/files/__root__/__path__/__name__.js +3 -0
  18. package/blueprints-js/controller-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +16 -0
  19. package/blueprints-js/controller-test/mocha-files/__root__/__testType__/__path__/__test__.js +18 -0
  20. package/blueprints-js/controller-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +13 -0
  21. package/blueprints-js/controller-test/qunit-files/__root__/__testType__/__path__/__test__.js +12 -0
  22. package/blueprints-js/controller-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +12 -0
  23. package/blueprints-js/helper/files/__root__/__collection__/__name__.js +5 -0
  24. package/blueprints-js/helper/mu-files/__root__/__collection__/__name__.js +7 -0
  25. package/blueprints-js/helper-addon/files/__root__/__path__/__name__.js +1 -0
  26. package/blueprints-js/helper-test/mocha-0.12-files/__root__/__testType__/__collection__/__name__-test.js +26 -0
  27. package/blueprints-js/helper-test/mocha-files/__root__/__testType__/__collection__/__name__-test.js +28 -0
  28. package/blueprints-js/helper-test/mocha-rfc-232-files/__root__/__testType__/__collection__/__name__-test.js +18 -0
  29. package/blueprints-js/helper-test/qunit-files/__root__/__testType__/__collection__/__name__-test.js +15 -0
  30. package/blueprints-js/helper-test/qunit-rfc-232-files/__root__/__testType__/__collection__/__name__-test.js +17 -0
  31. package/blueprints-js/initializer/files/__root__/initializers/__name__.js +5 -0
  32. package/blueprints-js/initializer-addon/files/__root__/__path__/__name__.js +1 -0
  33. package/blueprints-js/initializer-test/mocha-files/__root__/__testType__/__path__/__name__-test.js +28 -0
  34. package/blueprints-js/initializer-test/mocha-rfc-232-files/__root__/__testType__/__path__/__name__-test.js +31 -0
  35. package/blueprints-js/initializer-test/qunit-files/__root__/__testType__/__path__/__name__-test.js +25 -0
  36. package/blueprints-js/initializer-test/qunit-rfc-232-files/__root__/__testType__/__path__/__name__-test.js +37 -0
  37. package/blueprints-js/instance-initializer/files/__root__/instance-initializers/__name__.js +5 -0
  38. package/blueprints-js/instance-initializer-addon/files/__root__/__path__/__name__.js +1 -0
  39. package/blueprints-js/instance-initializer-test/mocha-files/__root__/__testType__/__path__/__name__-test.js +30 -0
  40. package/blueprints-js/instance-initializer-test/mocha-rfc-232-files/__root__/__testType__/__path__/__name__-test.js +32 -0
  41. package/blueprints-js/instance-initializer-test/qunit-files/__root__/__testType__/__path__/__name__-test.js +26 -0
  42. package/blueprints-js/instance-initializer-test/qunit-rfc-232-files/__root__/__testType__/__path__/__name__-test.js +39 -0
  43. package/blueprints-js/mixin/files/__root__/mixins/__name__.js +3 -0
  44. package/blueprints-js/mixin-test/mocha-files/__root__/__testType__/__name__-test.js +13 -0
  45. package/blueprints-js/mixin-test/mocha-rfc-232-files/__root__/__testType__/__name__-test.js +13 -0
  46. package/blueprints-js/mixin-test/qunit-files/__root__/__testType__/__name__-test.js +12 -0
  47. package/blueprints-js/mixin-test/qunit-rfc-232-files/__root__/__testType__/__name__-test.js +12 -0
  48. package/blueprints-js/route/files/__root__/__path__/__name__.js +9 -0
  49. package/blueprints-js/route/files/__root__/__templatepath__/__templatename__.hbs +2 -0
  50. package/blueprints-js/route-addon/files/__root__/__path__/__name__.js +1 -0
  51. package/blueprints-js/route-addon/files/__root__/__templatepath__/__templatename__.js +1 -0
  52. package/blueprints-js/route-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +15 -0
  53. package/blueprints-js/route-test/mocha-files/__root__/__testType__/__path__/__test__.js +17 -0
  54. package/blueprints-js/route-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +12 -0
  55. package/blueprints-js/route-test/qunit-files/__root__/__testType__/__path__/__test__.js +11 -0
  56. package/blueprints-js/route-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +11 -0
  57. package/blueprints-js/service/files/__root__/__path__/__name__.js +3 -0
  58. package/blueprints-js/service-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +16 -0
  59. package/blueprints-js/service-test/mocha-files/__root__/__testType__/__path__/__test__.js +18 -0
  60. package/blueprints-js/service-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +13 -0
  61. package/blueprints-js/service-test/qunit-files/__root__/__testType__/__path__/__test__.js +12 -0
  62. package/blueprints-js/service-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +12 -0
  63. package/blueprints-js/template/files/__root__/__path__/__name__.hbs +0 -0
  64. package/blueprints-js/test-framework-detector.js +60 -0
  65. package/blueprints-js/util/files/__root__/utils/__name__.js +3 -0
  66. package/blueprints-js/util-test/mocha-files/__root__/__testType__/__name__-test.js +11 -0
  67. package/blueprints-js/util-test/mocha-rfc-232-files/__root__/__testType__/__name__-test.js +11 -0
  68. package/blueprints-js/util-test/qunit-files/__root__/__testType__/__name__-test.js +10 -0
  69. package/blueprints-js/util-test/qunit-rfc-232-files/__root__/__testType__/__name__-test.js +10 -0
  70. package/build-metadata.json +3 -3
  71. package/dist/ember-template-compiler.js +12 -5
  72. package/dist/ember-template-compiler.map +1 -1
  73. package/dist/ember-testing.js +1 -1
  74. package/dist/ember-testing.map +1 -1
  75. package/dist/ember.debug.js +722 -1001
  76. package/dist/ember.debug.map +1 -1
  77. package/dist/header/license.js +1 -1
  78. package/dist/packages/@ember/-internals/container/index.js +2 -2
  79. package/dist/packages/@ember/-internals/glimmer/index.js +33 -23
  80. package/dist/packages/@ember/-internals/metal/index.js +19 -7
  81. package/dist/packages/@ember/-internals/routing/lib/location/api.js +3 -3
  82. package/dist/packages/@ember/-internals/routing/lib/location/auto_location.js +5 -1
  83. package/dist/packages/@ember/-internals/routing/lib/services/router.js +7 -6
  84. package/dist/packages/@ember/-internals/routing/lib/services/routing.js +9 -6
  85. package/dist/packages/@ember/-internals/routing/lib/system/route.js +6 -9
  86. package/dist/packages/@ember/-internals/routing/lib/system/router.js +4 -2
  87. package/dist/packages/@ember/-internals/routing/lib/utils.js +15 -25
  88. package/dist/packages/@ember/-internals/runtime/lib/compare.js +4 -1
  89. package/dist/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +14 -15
  90. package/dist/packages/@ember/-internals/runtime/lib/mixins/action_handler.js +32 -44
  91. package/dist/packages/@ember/-internals/runtime/lib/mixins/array.js +1 -1
  92. package/dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js +7 -22
  93. package/dist/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js +34 -46
  94. package/dist/packages/@ember/-internals/runtime/lib/mixins/enumerable.js +2 -15
  95. package/dist/packages/@ember/-internals/runtime/lib/mixins/evented.js +13 -57
  96. package/dist/packages/@ember/-internals/runtime/lib/mixins/mutable_enumerable.js +2 -16
  97. package/dist/packages/@ember/-internals/runtime/lib/mixins/observable.js +64 -134
  98. package/dist/packages/@ember/-internals/runtime/lib/mixins/promise_proxy.js +28 -86
  99. package/dist/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js +59 -61
  100. package/dist/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +17 -24
  101. package/dist/packages/@ember/-internals/runtime/lib/system/array_proxy.js +59 -85
  102. package/dist/packages/@ember/-internals/runtime/lib/system/object.js +9 -2
  103. package/dist/packages/@ember/-internals/runtime/lib/system/object_proxy.js +3 -77
  104. package/dist/packages/@ember/-internals/utils/index.js +1 -1
  105. package/dist/packages/@ember/-internals/utils/types.js +1 -0
  106. package/dist/packages/@ember/-internals/views/lib/compat/attrs.js +1 -2
  107. package/dist/packages/@ember/-internals/views/lib/component_lookup.js +2 -2
  108. package/dist/packages/@ember/-internals/views/lib/mixins/action_support.js +3 -9
  109. package/dist/packages/@ember/-internals/views/lib/mixins/child_views_support.js +4 -6
  110. package/dist/packages/@ember/-internals/views/lib/mixins/class_names_support.js +13 -18
  111. package/dist/packages/@ember/-internals/views/lib/mixins/view_state_support.js +3 -2
  112. package/dist/packages/@ember/-internals/views/lib/mixins/view_support.js +57 -58
  113. package/dist/packages/@ember/-internals/views/lib/system/event_dispatcher.js +142 -120
  114. package/dist/packages/@ember/-internals/views/lib/system/utils.js +1 -1
  115. package/dist/packages/@ember/-internals/views/lib/views/states/destroying.js +1 -1
  116. package/dist/packages/@ember/-internals/views/lib/views/states/has_element.js +2 -2
  117. package/dist/packages/@ember/-internals/views/lib/views/states/in_dom.js +3 -1
  118. package/dist/packages/@ember/application/instance.js +1 -0
  119. package/dist/packages/@ember/application/lib/application.js +8 -1
  120. package/dist/packages/@ember/canary-features/index.js +2 -2
  121. package/dist/packages/@ember/engine/instance.js +1 -1
  122. package/dist/packages/@ember/engine/lib/engine-parent.js +1 -5
  123. package/dist/packages/@ember/renderer/index.js +28 -0
  124. package/dist/packages/ember/version.js +1 -1
  125. package/docs/data.json +838 -712
  126. package/package.json +4 -3
@@ -5,5 +5,5 @@
5
5
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
6
  * @license Licensed under MIT license
7
7
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- * @version 4.5.0-alpha.4
8
+ * @version 4.5.0-beta.2
9
9
  */
@@ -1,5 +1,5 @@
1
1
  import { setOwner } from '@ember/-internals/owner';
2
- import { dictionary, symbol, intern } from '@ember/-internals/utils';
2
+ import { dictionary, intern } from '@ember/-internals/utils';
3
3
  import { assert, deprecate } from '@ember/debug';
4
4
  import { DEBUG } from '@glimmer/env';
5
5
 
@@ -377,7 +377,7 @@ function resetMember(container, fullName) {
377
377
  }
378
378
  }
379
379
 
380
- const INIT_FACTORY = symbol('INIT_FACTORY');
380
+ const INIT_FACTORY = Symbol('INIT_FACTORY');
381
381
  function getFactoryFor(obj) {
382
382
  return obj[INIT_FACTORY];
383
383
  }
@@ -1,7 +1,7 @@
1
1
  import { templateFactory, programCompilationContext } from '@glimmer/opcode-compiler';
2
2
  export { templateFactory as template, templateCacheCounters } from '@glimmer/opcode-compiler';
3
3
  import { setOwner, getOwner, isFactory } from '@ember/-internals/owner';
4
- import { guidFor, symbol, enumerableSymbol, getDebugName, isProxy, isEmberArray, isObject, uuid } from '@ember/-internals/utils';
4
+ import { guidFor, enumerableSymbol, getDebugName, isProxy, isEmberArray, isObject, uuid } from '@ember/-internals/utils';
5
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';
@@ -2024,7 +2024,7 @@ function processComponentArgs(namedArgs) {
2024
2024
  props.attrs = attrs;
2025
2025
  return props;
2026
2026
  }
2027
- const REF = symbol('REF');
2027
+ const REF = Symbol('REF');
2028
2028
 
2029
2029
  class MutableCell {
2030
2030
  constructor(ref, value) {
@@ -2051,9 +2051,9 @@ var __rest = undefined && undefined.__rest || function (s, e) {
2051
2051
  };
2052
2052
  const ARGS = enumerableSymbol('ARGS');
2053
2053
  const HAS_BLOCK = enumerableSymbol('HAS_BLOCK');
2054
- const DIRTY_TAG = symbol('DIRTY_TAG');
2055
- const IS_DISPATCHING_ATTRS = symbol('IS_DISPATCHING_ATTRS');
2056
- const BOUNDS = symbol('BOUNDS');
2054
+ const DIRTY_TAG = Symbol('DIRTY_TAG');
2055
+ const IS_DISPATCHING_ATTRS = Symbol('IS_DISPATCHING_ATTRS');
2056
+ const BOUNDS = Symbol('BOUNDS');
2057
2057
  const EMBER_VIEW_REF = createPrimitiveRef('ember-view');
2058
2058
 
2059
2059
  function aliasIdToElementId(args, props) {
@@ -2726,7 +2726,7 @@ setInternalComponentManager(CURLY_COMPONENT_MANAGER, Component);
2726
2726
  @module @ember/component
2727
2727
  */
2728
2728
  var _a;
2729
- const RECOMPUTE_TAG = symbol('RECOMPUTE_TAG');
2729
+ const RECOMPUTE_TAG = Symbol('RECOMPUTE_TAG');
2730
2730
  const IS_CLASSIC_HELPER = Symbol('IS_CLASSIC_HELPER');
2731
2731
 
2732
2732
  class Helper extends FrameworkObject {
@@ -2957,14 +2957,25 @@ function escapeExpression(string) {
2957
2957
  return string.replace(badChars, escapeChar);
2958
2958
  }
2959
2959
  /**
2960
- Mark a string as safe for unescaped output with Ember templates. If you
2961
- return HTML from a helper, use this function to
2962
- ensure Ember's rendering layer does not escape the HTML.
2960
+ Use this method to indicate that a string should be rendered as HTML
2961
+ when the string is used in a template. To say this another way,
2962
+ strings marked with `htmlSafe` will not be HTML escaped.
2963
+
2964
+ A word of warning - The `htmlSafe` method does not make the string safe;
2965
+ it only tells the framework to treat the string as if it is safe to render
2966
+ as HTML. If a string contains user inputs or other untrusted
2967
+ data, you must sanitize the string before using the `htmlSafe` method.
2968
+ Otherwise your code is vulnerable to
2969
+ [Cross-Site Scripting](https://owasp.org/www-community/attacks/DOM_Based_XSS).
2970
+ There are many open source sanitization libraries to choose from,
2971
+ both for front end and server-side sanitization.
2963
2972
 
2964
2973
  ```javascript
2965
2974
  import { htmlSafe } from '@ember/template';
2966
2975
 
2967
- htmlSafe('<div>someString</div>')
2976
+ const someTrustedOrSanitizedString = "<div>Hello!</div>"
2977
+
2978
+ htmlSafe(someTrustedorSanitizedString)
2968
2979
  ```
2969
2980
 
2970
2981
  @method htmlSafe
@@ -3683,11 +3694,11 @@ class MapLikeNativeIterator extends NativeIterator {
3683
3694
  }
3684
3695
 
3685
3696
  function hasForEach(value) {
3686
- return typeof value['forEach'] === 'function';
3697
+ return value != null && typeof value['forEach'] === 'function';
3687
3698
  }
3688
3699
 
3689
3700
  function isNativeIterable(value) {
3690
- return typeof value[Symbol.iterator] === 'function';
3701
+ return value != null && typeof value[Symbol.iterator] === 'function';
3691
3702
  }
3692
3703
 
3693
3704
  function isIndexable(value) {
@@ -4869,9 +4880,16 @@ const BUILTIN_KEYWORD_HELPERS = {
4869
4880
  '-outlet': outletHelper,
4870
4881
  '-in-el-null': inElementNullCheckHelper
4871
4882
  };
4883
+ const BUILTIN_HELPERS = Object.assign(Object.assign({}, BUILTIN_KEYWORD_HELPERS), {
4884
+ array,
4885
+ concat,
4886
+ fn,
4887
+ get: get$1,
4888
+ hash
4889
+ });
4872
4890
 
4873
4891
  if (DEBUG) {
4874
- BUILTIN_KEYWORD_HELPERS['-disallow-dynamic-resolution'] = disallowDynamicResolution;
4892
+ BUILTIN_HELPERS['-disallow-dynamic-resolution'] = disallowDynamicResolution;
4875
4893
  } else {
4876
4894
  // Bug: this may be a quirk of our test setup?
4877
4895
  // In prod builds, this is a no-op helper and is unused in practice. We shouldn't need
@@ -4881,17 +4899,9 @@ if (DEBUG) {
4881
4899
  // not really harm anything, since it's just a no-op pass-through helper and the bytes
4882
4900
  // has to be included anyway. In the future, perhaps we can avoid the latter by using
4883
4901
  // `import(...)`?
4884
- BUILTIN_KEYWORD_HELPERS['-disallow-dynamic-resolution'] = disallowDynamicResolution;
4902
+ BUILTIN_HELPERS['-disallow-dynamic-resolution'] = disallowDynamicResolution;
4885
4903
  }
4886
4904
 
4887
- const BUILTIN_HELPERS = Object.assign(Object.assign({}, BUILTIN_KEYWORD_HELPERS), {
4888
- array,
4889
- concat,
4890
- fn,
4891
- get: get$1,
4892
- hash
4893
- });
4894
-
4895
4905
  {
4896
4906
  BUILTIN_HELPERS['unique-id'] = uniqueId;
4897
4907
  }
@@ -5469,7 +5479,7 @@ class Renderer {
5469
5479
 
5470
5480
  getBounds(view) {
5471
5481
  let bounds = view[BOUNDS];
5472
- assert('object passed to getBounds must have the BOUNDS symbol as a property', Boolean(bounds));
5482
+ assert('object passed to getBounds must have the BOUNDS symbol as a property', bounds);
5473
5483
  let parentElement = bounds.parentElement();
5474
5484
  let firstNode = bounds.firstNode();
5475
5485
  let lastNode = bounds.lastNode();
@@ -1,5 +1,5 @@
1
1
  import { meta, peekMeta } from '@ember/-internals/meta';
2
- import { setListeners, isObject, setupMandatorySetter, symbol, toString, enumerableSymbol, inspect, setWithMandatorySetter, Cache, isEmberArray, setProxy, lookupDescriptor, getName, setName, guidFor, makeArray, observerListenerMetaFor, ROOT, setObservers, wrap } from '@ember/-internals/utils';
2
+ import { setListeners, isObject, setupMandatorySetter, symbol, toString, inspect, setWithMandatorySetter, Cache, isEmberArray, setProxy, lookupDescriptor, getName, setName, guidFor, makeArray, observerListenerMetaFor, ROOT, setObservers, wrap } from '@ember/-internals/utils';
3
3
  import { assert, deprecate, debug, warn } from '@ember/debug';
4
4
  import { ENV, context } from '@ember/-internals/environment';
5
5
  import { schedule } from '@ember/runloop';
@@ -449,7 +449,10 @@ function markObjectAsDirty(obj, propertyKey) {
449
449
  @private
450
450
  */
451
451
 
452
- const PROPERTY_DID_CHANGE = enumerableSymbol('PROPERTY_DID_CHANGE');
452
+ const PROPERTY_DID_CHANGE = Symbol('PROPERTY_DID_CHANGE');
453
+ function hasPropertyDidChange(obj) {
454
+ return obj != null && typeof obj === 'object' && typeof obj[PROPERTY_DID_CHANGE] === 'function';
455
+ }
453
456
  let deferred = 0;
454
457
  /**
455
458
  This function is called just after an object property has changed.
@@ -484,9 +487,11 @@ function notifyPropertyChange(obj, keyName, _meta, value) {
484
487
  }
485
488
 
486
489
  if (PROPERTY_DID_CHANGE in obj) {
487
- // we need to check the arguments length here; there's a check in `PROPERTY_DID_CHANGE`
490
+ // It's redundant to do this here, but we don't want to check above so we can avoid an extra function call in prod.
491
+ assert('property did change hook is invalid', hasPropertyDidChange(obj)); // we need to check the arguments length here; there's a check in Component's `PROPERTY_DID_CHANGE`
488
492
  // that checks its arguments length, so we have to explicitly not call this with `value`
489
493
  // if it is not passed to `notifyPropertyChange`
494
+
490
495
  if (arguments.length === 4) {
491
496
  obj[PROPERTY_DID_CHANGE](keyName, value);
492
497
  } else {
@@ -1377,8 +1382,9 @@ class ComputedProperty extends ComputedDescriptor {
1377
1382
  // See GH#18147 / GH#19028 for details.
1378
1383
 
1379
1384
  if ( // ensure that we only run this once, while the component is being instantiated
1380
- meta$$1.isInitializing() && this._dependentKeys !== undefined && this._dependentKeys.length > 0 && // These two properties are set on Ember.Component
1381
- typeof obj[PROPERTY_DID_CHANGE] === 'function' && obj.isComponent) {
1385
+ meta$$1.isInitializing() && this._dependentKeys !== undefined && this._dependentKeys.length > 0 && typeof obj[PROPERTY_DID_CHANGE] === 'function' && obj.isComponent) {
1386
+ // It's redundant to do this here, but we don't want to check above so we can avoid an extra function call in prod.
1387
+ assert('property did change hook is invalid', hasPropertyDidChange(obj));
1382
1388
  addObserver(obj, keyName, () => {
1383
1389
  obj[PROPERTY_DID_CHANGE](keyName);
1384
1390
  }, undefined, true);
@@ -2374,12 +2380,14 @@ LIBRARIES.registerCoreLibrary('Ember', VERSION);
2374
2380
 
2375
2381
  function getProperties(obj, keys) {
2376
2382
  let ret = {};
2377
- let propertyNames = arguments;
2383
+ let propertyNames;
2378
2384
  let i = 1;
2379
2385
 
2380
2386
  if (arguments.length === 2 && Array.isArray(keys)) {
2381
2387
  i = 0;
2382
2388
  propertyNames = arguments[1];
2389
+ } else {
2390
+ propertyNames = Array.from(arguments);
2383
2391
  }
2384
2392
 
2385
2393
  for (; i < propertyNames.length; i++) {
@@ -2546,7 +2554,7 @@ function _processNamespace(paths, root, seen) {
2546
2554
  if (obj && getName(obj) === void 0) {
2547
2555
  // Replace the class' `toString` with the dot-separated path
2548
2556
  setName(obj, paths.join('.')); // Support nested namespaces
2549
- } else if (obj && obj.isNamespace) {
2557
+ } else if (obj && isNamespace(obj)) {
2550
2558
  // Skip aliased namespaces
2551
2559
  if (seen.has(obj)) {
2552
2560
  continue;
@@ -2561,6 +2569,10 @@ function _processNamespace(paths, root, seen) {
2561
2569
  paths.length = idx; // cut out last item
2562
2570
  }
2563
2571
 
2572
+ function isNamespace(obj) {
2573
+ return obj != null && typeof obj === 'object' && obj.isNamespace;
2574
+ }
2575
+
2564
2576
  function isUppercase(code) {
2565
2577
  return code >= 65 && code <= 90 // A
2566
2578
  ; // Z
@@ -83,10 +83,10 @@ export default {
83
83
  @private
84
84
  */
85
85
  create(options) {
86
- let implementation = options && options.implementation;
87
- assert("Location.create: you must specify a 'implementation' option", Boolean(implementation));
86
+ let implementation = options === null || options === void 0 ? void 0 : options.implementation;
87
+ assert("Location.create: you must specify a 'implementation' option", implementation);
88
88
  let implementationClass = this.implementations[implementation];
89
- assert(`Location.create: ${implementation} is not a valid implementation`, Boolean(implementationClass));
89
+ assert(`Location.create: ${implementation} is not a valid implementation`, implementationClass);
90
90
  deprecate("Calling `create` on Location class is deprecated. Instead, use `container.lookup('location:my-location')` to lookup the location you need.", false, {
91
91
  id: 'deprecate-auto-location',
92
92
  until: '5.0.0',
@@ -123,7 +123,11 @@ function delegateToConcreteImplementation(methodName) {
123
123
  let {
124
124
  concreteImplementation
125
125
  } = this;
126
- assert("AutoLocation's detect() method should be called before calling any other hooks.", concreteImplementation);
126
+ assert("AutoLocation's detect() method should be called before calling any other hooks.", concreteImplementation); // We need this cast because `Parameters` is deferred so that it is not
127
+ // possible for TS to see it will always produce the right type. However,
128
+ // since `AnyFn` has a rest type, it is allowed. See discussion on [this
129
+ // issue](https://github.com/microsoft/TypeScript/issues/47615).
130
+
127
131
  return (_a = concreteImplementation[methodName]) === null || _a === void 0 ? void 0 : _a.call(concreteImplementation, ...args);
128
132
  };
129
133
  }
@@ -8,14 +8,13 @@ var __decorate = this && this.__decorate || function (decorators, target, key, d
8
8
 
9
9
  import { getOwner } from '@ember/-internals/owner';
10
10
  import { Evented } from '@ember/-internals/runtime';
11
- import { symbol } from '@ember/-internals/utils';
12
11
  import { assert } from '@ember/debug';
13
12
  import { readOnly } from '@ember/object/computed';
14
13
  import Service from '@ember/service';
15
14
  import { consumeTag, tagFor } from '@glimmer/validator';
16
15
  import EmberRouter from '../system/router';
17
16
  import { extractRouteArgs, resemblesURL, shallowEqual } from '../utils';
18
- const ROUTER = symbol('ROUTER');
17
+ export const ROUTER = Symbol('ROUTER');
19
18
 
20
19
  function cleanURL(url, rootURL) {
21
20
  if (rootURL === '/') {
@@ -35,14 +34,16 @@ class RouterService extends Service.extend(Evented) {
35
34
 
36
35
  let owner = getOwner(this);
37
36
  assert('RouterService is unexpectedly missing an owner', owner);
38
- router = owner.lookup('router:main');
39
- assert('ROUTER SERVICE BUG: Expected router to be an instance of EmberRouter', router instanceof EmberRouter);
40
- return this[ROUTER] = router;
37
+
38
+ let _router = owner.lookup('router:main');
39
+
40
+ assert('ROUTER SERVICE BUG: Expected router to be an instance of EmberRouter', _router instanceof EmberRouter);
41
+ return this[ROUTER] = _router;
41
42
  }
42
43
 
43
44
  willDestroy() {
44
45
  super.willDestroy();
45
- this[ROUTER] = null;
46
+ this[ROUTER] = undefined;
46
47
  }
47
48
  /**
48
49
  Transition the application into another route. The route may
@@ -2,12 +2,11 @@
2
2
  @module ember
3
3
  */
4
4
  import { getOwner } from '@ember/-internals/owner';
5
- import { symbol } from '@ember/-internals/utils';
6
5
  import { assert } from '@ember/debug';
7
6
  import { readOnly } from '@ember/object/computed';
8
7
  import Service from '@ember/service';
9
8
  import EmberRouter from '../system/router';
10
- const ROUTER = symbol('ROUTER');
9
+ import { ROUTER } from './router';
11
10
  /**
12
11
  The Routing service is used by LinkTo, and provides facilities for
13
12
  the component/view layer to interact with the router.
@@ -29,10 +28,14 @@ export default class RoutingService extends Service {
29
28
 
30
29
  let owner = getOwner(this);
31
30
  assert('RoutingService is unexpectedly missing an owner', owner);
32
- router = owner.lookup('router:main');
33
- assert('ROUTING SERVICE BUG: Expected router to be an instance of EmberRouter', router instanceof EmberRouter);
34
- router.setupRouter();
35
- return this[ROUTER] = router;
31
+
32
+ let _router = owner.lookup('router:main');
33
+
34
+ assert('ROUTING SERVICE BUG: Expected router to be an instance of EmberRouter', _router instanceof EmberRouter);
35
+
36
+ _router.setupRouter();
37
+
38
+ return this[ROUTER] = _router;
36
39
  }
37
40
 
38
41
  hasRoute(routeName) {
@@ -11,7 +11,7 @@ import { addObserver, computed, defineProperty, descriptorForProperty, flushAsyn
11
11
  import { getOwner } from '@ember/-internals/owner';
12
12
  import { BucketCache } from '@ember/-internals/routing';
13
13
  import { A as emberA, ActionHandler, Evented, Object as EmberObject, typeOf } from '@ember/-internals/runtime';
14
- import { isProxy, lookupDescriptor, symbol } from '@ember/-internals/utils';
14
+ import { isProxy, lookupDescriptor } from '@ember/-internals/utils';
15
15
  import Controller from '@ember/controller';
16
16
  import { assert, info, isTesting } from '@ember/debug';
17
17
  import EngineInstance from '@ember/engine/instance';
@@ -23,7 +23,7 @@ import { calculateCacheKey, deprecateTransitionMethods, normalizeControllerQuery
23
23
  import generateController from './generate_controller';
24
24
  import EmberRouter from './router';
25
25
  export const ROUTE_CONNECTIONS = new WeakMap();
26
- const RENDER = symbol('render');
26
+ const RENDER = Symbol('render');
27
27
 
28
28
  class Route extends EmberObject.extend(ActionHandler, Evented) {
29
29
  constructor(owner) {
@@ -1131,7 +1131,7 @@ class Route extends EmberObject.extend(ActionHandler, Evented) {
1131
1131
 
1132
1132
 
1133
1133
  get _qp() {
1134
- let combinedQueryParameterConfiguration;
1134
+ let combinedQueryParameterConfiguration = {};
1135
1135
  let controllerName = this.controllerName || this.routeName;
1136
1136
  let owner = getOwner(this);
1137
1137
  assert('Route is unexpectedly missing an owner', owner);
@@ -1172,6 +1172,7 @@ class Route extends EmberObject.extend(ActionHandler, Evented) {
1172
1172
  }
1173
1173
 
1174
1174
  let desc = combinedQueryParameterConfiguration[propName];
1175
+ assert(`[BUG] missing query parameter configuration for ${propName}`, desc);
1175
1176
  let scope = desc.scope || 'model';
1176
1177
  let parts = undefined;
1177
1178
 
@@ -1451,9 +1452,7 @@ function mergeEachQueryParams(controllerQP, routeQP) {
1451
1452
  continue;
1452
1453
  }
1453
1454
 
1454
- let newControllerParameterConfiguration = {};
1455
- Object.assign(newControllerParameterConfiguration, controllerQP[cqpName], routeQP[cqpName]);
1456
- qps[cqpName] = newControllerParameterConfiguration; // allows us to skip this QP when we check route QPs.
1455
+ qps[cqpName] = Object.assign(Object.assign({}, controllerQP[cqpName]), routeQP[cqpName]); // allows us to skip this QP when we check route QPs.
1457
1456
 
1458
1457
  keysAlreadyMergedOrSkippable[cqpName] = true;
1459
1458
  } // loop over all route qps, skipping those that were merged in the first pass
@@ -1465,9 +1464,7 @@ function mergeEachQueryParams(controllerQP, routeQP) {
1465
1464
  continue;
1466
1465
  }
1467
1466
 
1468
- let newRouteParameterConfiguration = {};
1469
- Object.assign(newRouteParameterConfiguration, routeQP[rqpName], controllerQP[rqpName]);
1470
- qps[rqpName] = newRouteParameterConfiguration;
1467
+ qps[rqpName] = Object.assign(Object.assign({}, routeQP[rqpName]), controllerQP[rqpName]);
1471
1468
  }
1472
1469
 
1473
1470
  return qps;
@@ -1468,7 +1468,7 @@ export function triggerEvent(routeInfos, ignoreFailure, name, args) {
1468
1468
 
1469
1469
  for (let i = routeInfos.length - 1; i >= 0; i--) {
1470
1470
  routeInfo = routeInfos[i];
1471
- assert('has routeInfo', routeInfo);
1471
+ assert('[BUG] Missing routeInfo', routeInfo);
1472
1472
  handler = routeInfo.route;
1473
1473
  actionHandler = handler && handler.actions && handler.actions[name];
1474
1474
 
@@ -1478,6 +1478,8 @@ export function triggerEvent(routeInfos, ignoreFailure, name, args) {
1478
1478
  } else {
1479
1479
  // Should only hit here if a non-bubbling error action is triggered on a route.
1480
1480
  if (name === 'error') {
1481
+ assert('[BUG] Missing handler', handler);
1482
+
1481
1483
  handler._router._markErrorAsHandled(args[0]);
1482
1484
  }
1483
1485
 
@@ -1489,7 +1491,7 @@ export function triggerEvent(routeInfos, ignoreFailure, name, args) {
1489
1491
  let defaultHandler = defaultActionHandlers[name];
1490
1492
 
1491
1493
  if (defaultHandler) {
1492
- defaultHandler.apply(this, [routeInfos, ...args]);
1494
+ defaultHandler.call(this, routeInfos, ...args);
1493
1495
  return;
1494
1496
  }
1495
1497
 
@@ -169,35 +169,26 @@ export function normalizeControllerQueryParams(queryParams) {
169
169
  }
170
170
 
171
171
  function accumulateQueryParamDescriptors(_desc, accum) {
172
- let desc = _desc;
173
- let tmp;
174
-
175
- if (typeof desc === 'string') {
176
- tmp = {};
177
- tmp[desc] = {
172
+ let desc = typeof _desc === 'string' ? {
173
+ [_desc]: {
178
174
  as: null
179
- };
180
- desc = tmp;
181
- }
175
+ }
176
+ } : _desc;
182
177
 
183
178
  for (let key in desc) {
184
179
  if (!Object.prototype.hasOwnProperty.call(desc, key)) {
185
180
  return;
186
181
  }
187
182
 
188
- let singleDesc = desc[key];
189
-
190
- if (typeof singleDesc === 'string') {
191
- singleDesc = {
192
- as: singleDesc
193
- };
194
- }
195
-
196
- let val = accum[key] || {
183
+ let _singleDesc = desc[key];
184
+ let singleDesc = typeof _singleDesc === 'string' ? {
185
+ as: _singleDesc
186
+ } : _singleDesc;
187
+ let partialVal = accum[key] || {
197
188
  as: null,
198
189
  scope: 'model'
199
190
  };
200
- Object.assign(val, singleDesc);
191
+ let val = Object.assign(Object.assign({}, partialVal), singleDesc);
201
192
  accum[key] = val;
202
193
  }
203
194
  }
@@ -237,13 +228,12 @@ export function prefixRouteNameArg(route, args) {
237
228
  return args;
238
229
  }
239
230
  export function shallowEqual(a, b) {
240
- let k;
241
231
  let aCount = 0;
242
232
  let bCount = 0;
243
233
 
244
- for (k in a) {
245
- if (Object.prototype.hasOwnProperty.call(a, k)) {
246
- if (a[k] !== b[k]) {
234
+ for (let kA in a) {
235
+ if (Object.prototype.hasOwnProperty.call(a, kA)) {
236
+ if (a[kA] !== b[kA]) {
247
237
  return false;
248
238
  }
249
239
 
@@ -251,8 +241,8 @@ export function shallowEqual(a, b) {
251
241
  }
252
242
  }
253
243
 
254
- for (k in b) {
255
- if (Object.prototype.hasOwnProperty.call(b, k)) {
244
+ for (let kB in b) {
245
+ if (Object.prototype.hasOwnProperty.call(b, kB)) {
256
246
  bCount++;
257
247
  }
258
248
  }
@@ -12,7 +12,10 @@ const TYPE_ORDER = {
12
12
  instance: 7,
13
13
  function: 8,
14
14
  class: 9,
15
- date: 10
15
+ date: 10,
16
+ regexp: 11,
17
+ filelist: 12,
18
+ error: 13
16
19
  }; //
17
20
  // the spaceship operator
18
21
  //
@@ -3,28 +3,34 @@
3
3
  */
4
4
  import { meta } from '@ember/-internals/meta';
5
5
  import { get, set, defineProperty, Mixin, tagForObject, computed, tagForProperty } from '@ember/-internals/metal';
6
- import { setProxy, setupMandatorySetter, isObject } from '@ember/-internals/utils';
6
+ import { setProxy, setupMandatorySetter, isObject, isProxy } from '@ember/-internals/utils';
7
7
  import { assert } from '@ember/debug';
8
8
  import { DEBUG } from '@glimmer/env';
9
9
  import { setCustomTagFor } from '@glimmer/manager';
10
10
  import { combine, updateTag, tagFor, tagMetaFor } from '@glimmer/validator';
11
11
  export function contentFor(proxy) {
12
- let content = get(proxy, 'content');
12
+ let content = get(proxy, 'content'); // SAFETY: Ideally we'd assert instead of casting, but @glimmer/validator doesn't give us
13
+ // sufficient public types for this. Previously this code was .js and worked correctly so
14
+ // hopefully this is sufficiently reliable.
15
+
13
16
  updateTag(tagForObject(proxy), tagForObject(content));
14
17
  return content;
15
18
  }
16
19
 
17
20
  function customTagForProxy(proxy, key, addMandatorySetter) {
21
+ assert('Expected a proxy', isProxy(proxy));
18
22
  let meta = tagMetaFor(proxy);
19
23
  let tag = tagFor(proxy, key, meta);
20
24
 
21
25
  if (DEBUG) {
22
26
  // TODO: Replace this with something more first class for tracking tags in DEBUG
27
+ // SAFETY: This is not an officially supported property but setting shouldn't cause issues.
23
28
  tag._propertyKey = key;
24
29
  }
25
30
 
26
31
  if (key in proxy) {
27
32
  if (DEBUG && addMandatorySetter) {
33
+ assert('[BUG] setupMandatorySetter should be set when debugging', setupMandatorySetter);
28
34
  setupMandatorySetter(tag, proxy, key);
29
35
  }
30
36
 
@@ -40,20 +46,11 @@ function customTagForProxy(proxy, key, addMandatorySetter) {
40
46
  return combine(tags);
41
47
  }
42
48
  }
43
- /**
44
- `Ember.ProxyMixin` forwards all properties not defined by the proxy itself
45
- to a proxied `content` object. See ObjectProxy for more details.
46
-
47
- @class ProxyMixin
48
- @namespace Ember
49
- @private
50
- */
51
-
52
49
 
53
- export default Mixin.create({
50
+ const ProxyMixin = Mixin.create({
54
51
  /**
55
52
  The object whose properties will be forwarded.
56
- @property content
53
+ @property content
57
54
  @type {unknown}
58
55
  @default null
59
56
  @public
@@ -97,8 +94,10 @@ export default Mixin.create({
97
94
  }
98
95
 
99
96
  let content = contentFor(this);
100
- assert(`Cannot delegate set('${key}', ${value}) to the 'content' property of object proxy ${this}: its 'content' is undefined.`, content);
97
+ assert(`Cannot delegate set('${key}', ${value}) to the 'content' property of object proxy ${this}: its 'content' is undefined.`, content); // SAFETY: We don't actually guarantee that this is an object, so this isn't necessarily safe :(
98
+
101
99
  return set(content, key, value);
102
100
  }
103
101
 
104
- });
102
+ });
103
+ export default ProxyMixin;