ember-source 4.8.0-alpha.5 → 4.8.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 (244) hide show
  1. package/CHANGELOG.md +11 -2
  2. package/blueprints/helper/files/__root__/{__collection__ → helpers}/__name__.ts +0 -0
  3. package/blueprints/helper/index.js +0 -15
  4. package/blueprints/helper-test/index.js +0 -3
  5. package/blueprints/helper-test/mocha-0.12-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  6. package/blueprints/helper-test/mocha-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  7. package/blueprints/helper-test/mocha-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.ts +0 -0
  8. package/blueprints/helper-test/qunit-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  9. package/blueprints/helper-test/qunit-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.ts +0 -0
  10. package/blueprints-js/helper/files/__root__/{__collection__ → helpers}/__name__.js +0 -0
  11. package/blueprints-js/helper-test/mocha-0.12-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  12. package/blueprints-js/helper-test/mocha-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  13. package/blueprints-js/helper-test/mocha-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  14. package/blueprints-js/helper-test/qunit-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  15. package/blueprints-js/helper-test/qunit-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
  16. package/build-metadata.json +3 -3
  17. package/dist/dependencies/router_js.js +1 -1
  18. package/dist/ember-template-compiler.js +675 -18
  19. package/dist/ember-template-compiler.map +1 -1
  20. package/dist/ember-testing.js +11 -11
  21. package/dist/ember-testing.map +1 -1
  22. package/dist/ember.debug.js +19576 -20510
  23. package/dist/ember.debug.map +1 -1
  24. package/dist/header/license.js +1 -1
  25. package/dist/packages/@ember/-internals/glimmer/index.js +4 -2
  26. package/dist/packages/@ember/-internals/metal/index.js +214 -1094
  27. package/dist/packages/@ember/-internals/routing/index.js +1 -17
  28. package/dist/packages/@ember/-internals/runtime/index.js +3 -16
  29. package/dist/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +2 -1
  30. package/dist/packages/@ember/-internals/runtime/lib/mixins/action_handler.js +4 -3
  31. package/dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js +1 -1
  32. package/dist/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js +1 -1
  33. package/dist/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js +1 -8
  34. package/dist/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +2 -1
  35. package/dist/packages/@ember/-internals/utils/index.js +3 -3
  36. package/dist/packages/@ember/-internals/views/lib/component_lookup.js +1 -1
  37. package/dist/packages/@ember/-internals/views/lib/mixins/action_support.js +2 -1
  38. package/dist/packages/@ember/-internals/views/lib/mixins/child_views_support.js +2 -1
  39. package/dist/packages/@ember/-internals/views/lib/mixins/class_names_support.js +2 -1
  40. package/dist/packages/@ember/-internals/views/lib/mixins/view_state_support.js +1 -1
  41. package/dist/packages/@ember/-internals/views/lib/mixins/view_support.js +2 -1
  42. package/dist/packages/@ember/-internals/views/lib/system/event_dispatcher.js +1 -1
  43. package/dist/packages/@ember/-internals/views/lib/views/core_view.js +3 -1
  44. package/dist/packages/@ember/application/index.js +876 -2
  45. package/dist/packages/@ember/application/instance.js +2 -2
  46. package/dist/packages/@ember/application/namespace.js +70 -1
  47. package/dist/packages/@ember/array/index.js +1503 -2
  48. package/dist/packages/@ember/array/mutable.js +1 -1
  49. package/dist/packages/@ember/array/proxy.js +307 -1
  50. package/dist/packages/@ember/canary-features/index.js +2 -2
  51. package/dist/packages/@ember/controller/index.js +260 -3
  52. package/dist/packages/@ember/debug/container-debug-adapter.js +99 -1
  53. package/dist/packages/@ember/debug/data-adapter.js +574 -1
  54. package/dist/packages/@ember/engine/index.js +5 -5
  55. package/dist/packages/@ember/engine/instance.js +4 -4
  56. package/dist/packages/@ember/enumerable/index.js +3 -1
  57. package/dist/packages/@ember/enumerable/mutable.js +4 -0
  58. package/dist/packages/@ember/{-internals/runtime/lib/system/object.js → object/-internals.js} +4 -17
  59. package/dist/packages/@ember/object/core.js +731 -1
  60. package/dist/packages/@ember/object/evented.js +93 -2
  61. package/dist/packages/@ember/object/index.js +76 -4
  62. package/dist/packages/@ember/object/internals.js +3 -2
  63. package/dist/packages/@ember/object/lib/computed/computed_macros.js +3 -1
  64. package/dist/packages/@ember/object/lib/computed/reduce_computed_macros.js +4 -3
  65. package/dist/packages/@ember/object/mixin.js +659 -1
  66. package/dist/packages/@ember/object/observable.js +341 -1
  67. package/dist/packages/@ember/object/promise-proxy-mixin.js +150 -1
  68. package/dist/packages/@ember/object/proxy.js +10 -1
  69. package/dist/packages/@ember/routing/-internals.js +7 -0
  70. package/dist/packages/@ember/routing/auto-location.js +249 -1
  71. package/dist/packages/@ember/routing/hash-location.js +169 -1
  72. package/dist/packages/@ember/routing/history-location.js +289 -1
  73. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/cache.js +0 -0
  74. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/controller_for.js +0 -0
  75. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/dsl.js +0 -0
  76. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/engines.js +0 -0
  77. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/generate_controller.js +0 -0
  78. package/dist/packages/@ember/{-internals/routing/lib/location/util.js → routing/lib/location-utils.js} +0 -0
  79. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/query_params.js +0 -0
  80. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/route-info.js +0 -0
  81. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/router_state.js +1 -1
  82. package/dist/packages/@ember/{-internals/routing/lib/services/routing.js → routing/lib/routing-service.js} +2 -2
  83. package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/transition.js +0 -0
  84. package/dist/packages/@ember/{-internals/routing → routing}/lib/utils.js +0 -0
  85. package/dist/packages/@ember/routing/location.js +104 -1
  86. package/dist/packages/@ember/routing/none-location.js +123 -1
  87. package/dist/packages/@ember/routing/route.js +1700 -1
  88. package/dist/packages/@ember/routing/router-service.js +510 -1
  89. package/dist/packages/@ember/routing/router.js +1666 -1
  90. package/dist/packages/@ember/service/index.js +1 -1
  91. package/dist/packages/@ember/utils/index.js +7 -2
  92. package/dist/packages/@ember/{-internals/runtime → utils}/lib/compare.js +2 -2
  93. package/dist/packages/@ember/{-internals/runtime → utils}/lib/is-equal.js +0 -0
  94. package/dist/packages/@ember/utils/lib/is_blank.js +35 -0
  95. package/dist/packages/@ember/utils/lib/is_empty.js +68 -0
  96. package/dist/packages/@ember/utils/lib/is_none.js +27 -0
  97. package/dist/packages/@ember/utils/lib/is_present.js +38 -0
  98. package/dist/packages/@ember/{-internals/runtime → utils}/lib/type-of.js +2 -2
  99. package/dist/packages/ember/index.js +47 -28
  100. package/dist/packages/ember/version.js +1 -1
  101. package/dist/packages/ember-testing/lib/adapters/adapter.js +1 -1
  102. package/dist/packages/ember-testing/lib/helpers/current_path.js +2 -2
  103. package/dist/packages/ember-testing/lib/helpers/current_route_name.js +2 -2
  104. package/dist/packages/ember-testing/lib/helpers/current_url.js +1 -1
  105. package/docs/data.json +9428 -9189
  106. package/package.json +23 -8
  107. package/types/preview/@ember/-internals/resolver.d.ts +35 -0
  108. package/types/preview/@ember/application/-private/event-dispatcher.d.ts +18 -0
  109. package/types/preview/@ember/application/-private/registry.d.ts +15 -0
  110. package/types/preview/@ember/application/deprecations.d.ts +24 -0
  111. package/types/preview/@ember/application/index.d.ts +153 -0
  112. package/types/preview/@ember/application/instance.d.ts +9 -0
  113. package/types/preview/@ember/application/tsconfig.json +3 -0
  114. package/types/preview/@ember/application/types.d.ts +29 -0
  115. package/types/preview/@ember/array/-private/enumerable.d.ts +13 -0
  116. package/types/preview/@ember/array/-private/mutable-enumerable.d.ts +13 -0
  117. package/types/preview/@ember/array/-private/native-array.d.ts +23 -0
  118. package/types/preview/@ember/array/index.d.ts +243 -0
  119. package/types/preview/@ember/array/mutable.d.ts +94 -0
  120. package/types/preview/@ember/array/proxy.d.ts +29 -0
  121. package/types/preview/@ember/array/tsconfig.json +3 -0
  122. package/types/preview/@ember/component/-private/class-names-support.d.ts +27 -0
  123. package/types/preview/@ember/component/-private/core-view.d.ts +14 -0
  124. package/types/preview/@ember/component/-private/glimmer-interfaces.d.ts +45 -0
  125. package/types/preview/@ember/component/-private/signature-utils.d.ts +107 -0
  126. package/types/preview/@ember/component/-private/view-mixin.d.ts +59 -0
  127. package/types/preview/@ember/component/helper.d.ts +122 -0
  128. package/types/preview/@ember/component/index.d.ts +132 -0
  129. package/types/preview/@ember/component/template-only.d.ts +47 -0
  130. package/types/preview/@ember/component/tsconfig.json +3 -0
  131. package/types/preview/@ember/controller/index.d.ts +48 -0
  132. package/types/preview/@ember/controller/tsconfig.json +3 -0
  133. package/types/preview/@ember/debug/container-debug-adapter.d.ts +13 -0
  134. package/types/preview/@ember/debug/data-adapter.d.ts +64 -0
  135. package/types/preview/@ember/debug/index.d.ts +98 -0
  136. package/types/preview/@ember/debug/tsconfig.json +3 -0
  137. package/types/preview/@ember/destroyable/index.d.ts +23 -0
  138. package/types/preview/@ember/destroyable/tsconfig.json +3 -0
  139. package/types/preview/@ember/engine/-private/container-proxy-mixin.d.ts +17 -0
  140. package/types/preview/@ember/engine/-private/registry-proxy-mixin.d.ts +54 -0
  141. package/types/preview/@ember/engine/-private/types/initializer.d.ts +8 -0
  142. package/types/preview/@ember/engine/index.d.ts +45 -0
  143. package/types/preview/@ember/engine/instance.d.ts +24 -0
  144. package/types/preview/@ember/engine/tsconfig.json +3 -0
  145. package/types/preview/@ember/error/index.d.ts +6 -0
  146. package/types/preview/@ember/error/tsconfig.json +3 -0
  147. package/types/preview/@ember/helper/index.d.ts +49 -0
  148. package/types/preview/@ember/helper/tsconfig.json +3 -0
  149. package/types/preview/@ember/modifier/index.d.ts +33 -0
  150. package/types/preview/@ember/modifier/tsconfig.json +3 -0
  151. package/types/preview/@ember/object/-private/action-handler.d.ts +31 -0
  152. package/types/preview/@ember/object/-private/types.d.ts +63 -0
  153. package/types/preview/@ember/object/compat.d.ts +9 -0
  154. package/types/preview/@ember/object/computed.d.ts +263 -0
  155. package/types/preview/@ember/object/core.d.ts +89 -0
  156. package/types/preview/@ember/object/evented.d.ts +45 -0
  157. package/types/preview/@ember/object/events.d.ts +47 -0
  158. package/types/preview/@ember/object/index.d.ts +126 -0
  159. package/types/preview/@ember/object/internals.d.ts +17 -0
  160. package/types/preview/@ember/object/mixin.d.ts +19 -0
  161. package/types/preview/@ember/object/observable.d.ts +89 -0
  162. package/types/preview/@ember/object/observers.d.ts +34 -0
  163. package/types/preview/@ember/object/promise-proxy-mixin.d.ts +37 -0
  164. package/types/preview/@ember/object/proxy.d.ts +27 -0
  165. package/types/preview/@ember/object/tsconfig.json +3 -0
  166. package/types/preview/@ember/owner/index.d.ts +102 -0
  167. package/types/preview/@ember/owner/tsconfig.json +3 -0
  168. package/types/preview/@ember/polyfills/index.d.ts +23 -0
  169. package/types/preview/@ember/polyfills/tsconfig.json +3 -0
  170. package/types/preview/@ember/polyfills/types.d.ts +6 -0
  171. package/types/preview/@ember/routing/-private/router-dsl.d.ts +20 -0
  172. package/types/preview/@ember/routing/auto-location.d.ts +8 -0
  173. package/types/preview/@ember/routing/hash-location.d.ts +10 -0
  174. package/types/preview/@ember/routing/history-location.d.ts +9 -0
  175. package/types/preview/@ember/routing/index.d.ts +20 -0
  176. package/types/preview/@ember/routing/none-location.d.ts +11 -0
  177. package/types/preview/@ember/routing/route-info.d.ts +74 -0
  178. package/types/preview/@ember/routing/route.d.ts +533 -0
  179. package/types/preview/@ember/routing/router-service.d.ts +351 -0
  180. package/types/preview/@ember/routing/router.d.ts +49 -0
  181. package/types/preview/@ember/routing/transition.d.ts +126 -0
  182. package/types/preview/@ember/routing/tsconfig.json +3 -0
  183. package/types/preview/@ember/routing/types.d.ts +15 -0
  184. package/types/preview/@ember/runloop/-private/backburner.d.ts +43 -0
  185. package/types/preview/@ember/runloop/-private/types.d.ts +9 -0
  186. package/types/preview/@ember/runloop/index.d.ts +175 -0
  187. package/types/preview/@ember/runloop/tsconfig.json +3 -0
  188. package/types/preview/@ember/runloop/types.d.ts +5 -0
  189. package/types/preview/@ember/service/index.d.ts +25 -0
  190. package/types/preview/@ember/service/tsconfig.json +3 -0
  191. package/types/preview/@ember/string/index.d.ts +9 -0
  192. package/types/preview/@ember/string/tsconfig.json +3 -0
  193. package/types/preview/@ember/template/-private/handlebars.d.ts +7 -0
  194. package/types/preview/@ember/template/index.d.ts +5 -0
  195. package/types/preview/@ember/template/tsconfig.json +3 -0
  196. package/types/preview/@ember/test/adapter.d.ts +22 -0
  197. package/types/preview/@ember/test/index.d.ts +49 -0
  198. package/types/preview/@ember/test/tsconfig.json +3 -0
  199. package/types/preview/@ember/utils/-private/types.d.ts +39 -0
  200. package/types/preview/@ember/utils/index.d.ts +42 -0
  201. package/types/preview/@ember/utils/tsconfig.json +3 -0
  202. package/types/preview/ember/-private/type-utils.d.ts +54 -0
  203. package/types/preview/ember/index.d.ts +381 -0
  204. package/types/preview/ember/tsconfig.json +3 -0
  205. package/types/preview/index.d.ts +120 -0
  206. package/types/preview/tsconfig.json +6 -0
  207. package/blueprints/helper/mu-files/__root__/__collection__/__name__.js +0 -7
  208. package/blueprints-js/helper/mu-files/__root__/__collection__/__name__.js +0 -7
  209. package/dist/packages/@ember/-internals/extension-support/index.js +0 -2
  210. package/dist/packages/@ember/-internals/extension-support/lib/container_debug_adapter.js +0 -96
  211. package/dist/packages/@ember/-internals/extension-support/lib/data_adapter.js +0 -576
  212. package/dist/packages/@ember/-internals/routing/lib/ext/controller.js +0 -224
  213. package/dist/packages/@ember/-internals/routing/lib/location/api.js +0 -104
  214. package/dist/packages/@ember/-internals/routing/lib/location/auto_location.js +0 -250
  215. package/dist/packages/@ember/-internals/routing/lib/location/hash_location.js +0 -170
  216. package/dist/packages/@ember/-internals/routing/lib/location/history_location.js +0 -290
  217. package/dist/packages/@ember/-internals/routing/lib/location/none_location.js +0 -124
  218. package/dist/packages/@ember/-internals/routing/lib/services/router.js +0 -506
  219. package/dist/packages/@ember/-internals/routing/lib/system/route.js +0 -1696
  220. package/dist/packages/@ember/-internals/routing/lib/system/router.js +0 -1662
  221. package/dist/packages/@ember/-internals/runtime/lib/mixins/array.js +0 -1501
  222. package/dist/packages/@ember/-internals/runtime/lib/mixins/enumerable.js +0 -3
  223. package/dist/packages/@ember/-internals/runtime/lib/mixins/evented.js +0 -91
  224. package/dist/packages/@ember/-internals/runtime/lib/mixins/mutable_enumerable.js +0 -4
  225. package/dist/packages/@ember/-internals/runtime/lib/mixins/observable.js +0 -339
  226. package/dist/packages/@ember/-internals/runtime/lib/mixins/promise_proxy.js +0 -149
  227. package/dist/packages/@ember/-internals/runtime/lib/system/array_proxy.js +0 -305
  228. package/dist/packages/@ember/-internals/runtime/lib/system/core_object.js +0 -730
  229. package/dist/packages/@ember/-internals/runtime/lib/system/namespace.js +0 -69
  230. package/dist/packages/@ember/-internals/runtime/lib/system/object_proxy.js +0 -7
  231. package/dist/packages/@ember/application/lib/application.js +0 -870
  232. package/dist/packages/@ember/controller/lib/controller_mixin.js +0 -42
  233. package/dist/packages/@ember/runloop/type-tests.ts/begin-end.test.js +0 -5
  234. package/dist/packages/@ember/runloop/type-tests.ts/bind.test.js +0 -59
  235. package/dist/packages/@ember/runloop/type-tests.ts/cancel.test.js +0 -5
  236. package/dist/packages/@ember/runloop/type-tests.ts/debounce.test.js +0 -77
  237. package/dist/packages/@ember/runloop/type-tests.ts/join.test.js +0 -38
  238. package/dist/packages/@ember/runloop/type-tests.ts/later.test.js +0 -38
  239. package/dist/packages/@ember/runloop/type-tests.ts/next.test.js +0 -38
  240. package/dist/packages/@ember/runloop/type-tests.ts/once.test.js +0 -38
  241. package/dist/packages/@ember/runloop/type-tests.ts/run.test.js +0 -38
  242. package/dist/packages/@ember/runloop/type-tests.ts/schedule-once.test.js +0 -39
  243. package/dist/packages/@ember/runloop/type-tests.ts/schedule.test.js +0 -39
  244. package/dist/packages/@ember/runloop/type-tests.ts/throttle.test.js +0 -77
@@ -1 +1,659 @@
1
- export { Mixin as default } from '@ember/-internals/metal';
1
+ /**
2
+ @module @ember/object/mixin
3
+ */
4
+ import { INIT_FACTORY } from '@ember/-internals/container';
5
+ import { meta as metaFor, peekMeta } from '@ember/-internals/meta';
6
+ import { guidFor, makeArray, observerListenerMetaFor, ROOT, wrap } from '@ember/-internals/utils';
7
+ import { assert } from '@ember/debug';
8
+ import { DEBUG } from '@glimmer/env';
9
+ import { _WeakSet } from '@glimmer/util';
10
+ import { ComputedProperty, descriptorForDecorator, makeComputedDecorator, nativeDescDecorator, setUnprocessedMixins, addObserver, removeObserver, revalidateObservers, defineDecorator, defineValue } from '@ember/-internals/metal';
11
+ import { addListener, removeListener } from '@ember/object/events';
12
+ const a_concat = Array.prototype.concat;
13
+ const {
14
+ isArray
15
+ } = Array;
16
+
17
+ function extractAccessors(properties) {
18
+ if (properties !== undefined) {
19
+ for (let key of Object.keys(properties)) {
20
+ let desc = Object.getOwnPropertyDescriptor(properties, key);
21
+
22
+ if (desc.get !== undefined || desc.set !== undefined) {
23
+ Object.defineProperty(properties, key, {
24
+ value: nativeDescDecorator(desc)
25
+ });
26
+ }
27
+ }
28
+ }
29
+
30
+ return properties;
31
+ }
32
+
33
+ function concatenatedMixinProperties(concatProp, props, values, base) {
34
+ // reset before adding each new mixin to pickup concats from previous
35
+ let concats = values[concatProp] || base[concatProp];
36
+
37
+ if (props[concatProp]) {
38
+ concats = concats ? a_concat.call(concats, props[concatProp]) : props[concatProp];
39
+ }
40
+
41
+ return concats;
42
+ }
43
+
44
+ function giveDecoratorSuper(key, decorator, property, descs) {
45
+ if (property === true) {
46
+ return decorator;
47
+ }
48
+
49
+ let originalGetter = property._getter;
50
+
51
+ if (originalGetter === undefined) {
52
+ return decorator;
53
+ }
54
+
55
+ let superDesc = descs[key]; // Check to see if the super property is a decorator first, if so load its descriptor
56
+
57
+ let superProperty = typeof superDesc === 'function' ? descriptorForDecorator(superDesc) : superDesc;
58
+
59
+ if (superProperty === undefined || superProperty === true) {
60
+ return decorator;
61
+ }
62
+
63
+ let superGetter = superProperty._getter;
64
+
65
+ if (superGetter === undefined) {
66
+ return decorator;
67
+ }
68
+
69
+ let get = wrap(originalGetter, superGetter);
70
+ let set;
71
+ let originalSetter = property._setter;
72
+ let superSetter = superProperty._setter;
73
+
74
+ if (superSetter !== undefined) {
75
+ if (originalSetter !== undefined) {
76
+ set = wrap(originalSetter, superSetter);
77
+ } else {
78
+ // If the super property has a setter, we default to using it no matter what.
79
+ // This is clearly very broken and weird, but it's what was here so we have
80
+ // to keep it until the next major at least.
81
+ //
82
+ // TODO: Add a deprecation here.
83
+ set = superSetter;
84
+ }
85
+ } else {
86
+ set = originalSetter;
87
+ } // only create a new CP if we must
88
+
89
+
90
+ if (get !== originalGetter || set !== originalSetter) {
91
+ // Since multiple mixins may inherit from the same parent, we need
92
+ // to clone the computed property so that other mixins do not receive
93
+ // the wrapped version.
94
+ let dependentKeys = property._dependentKeys || [];
95
+ let newProperty = new ComputedProperty([...dependentKeys, {
96
+ get,
97
+ set
98
+ }]);
99
+ newProperty._readOnly = property._readOnly;
100
+ newProperty._meta = property._meta;
101
+ newProperty.enumerable = property.enumerable; // SAFETY: We passed in the impl for this class
102
+
103
+ return makeComputedDecorator(newProperty, ComputedProperty);
104
+ }
105
+
106
+ return decorator;
107
+ }
108
+
109
+ function giveMethodSuper(key, method, values, descs) {
110
+ // Methods overwrite computed properties, and do not call super to them.
111
+ if (descs[key] !== undefined) {
112
+ return method;
113
+ } // Find the original method in a parent mixin
114
+
115
+
116
+ let superMethod = values[key]; // Only wrap the new method if the original method was a function
117
+
118
+ if (typeof superMethod === 'function') {
119
+ return wrap(method, superMethod);
120
+ }
121
+
122
+ return method;
123
+ }
124
+
125
+ function applyConcatenatedProperties(key, value, values) {
126
+ let baseValue = values[key];
127
+ let ret = makeArray(baseValue).concat(makeArray(value));
128
+
129
+ if (DEBUG) {
130
+ // it is possible to use concatenatedProperties with strings (which cannot be frozen)
131
+ // only freeze objects...
132
+ if (typeof ret === 'object' && ret !== null) {
133
+ // prevent mutating `concatenatedProperties` array after it is applied
134
+ Object.freeze(ret);
135
+ }
136
+ }
137
+
138
+ return ret;
139
+ }
140
+
141
+ function applyMergedProperties(key, value, values) {
142
+ let baseValue = values[key];
143
+ assert(`You passed in \`${JSON.stringify(value)}\` as the value for \`${key}\` but \`${key}\` cannot be an Array`, !isArray(value));
144
+
145
+ if (!baseValue) {
146
+ return value;
147
+ }
148
+
149
+ let newBase = Object.assign({}, baseValue);
150
+ let hasFunction = false;
151
+ let props = Object.keys(value);
152
+
153
+ for (let prop of props) {
154
+ let propValue = value[prop];
155
+
156
+ if (typeof propValue === 'function') {
157
+ hasFunction = true;
158
+ newBase[prop] = giveMethodSuper(prop, propValue, baseValue, {});
159
+ } else {
160
+ newBase[prop] = propValue;
161
+ }
162
+ }
163
+
164
+ if (hasFunction) {
165
+ newBase._super = ROOT;
166
+ }
167
+
168
+ return newBase;
169
+ }
170
+
171
+ function mergeMixins(mixins, meta, descs, values, base, keys, keysWithSuper) {
172
+ let currentMixin;
173
+
174
+ for (let i = 0; i < mixins.length; i++) {
175
+ currentMixin = mixins[i];
176
+ assert(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(currentMixin)}`, typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]');
177
+
178
+ if (MIXINS.has(currentMixin)) {
179
+ if (meta.hasMixin(currentMixin)) {
180
+ continue;
181
+ }
182
+
183
+ meta.addMixin(currentMixin);
184
+ let {
185
+ properties,
186
+ mixins
187
+ } = currentMixin;
188
+
189
+ if (properties !== undefined) {
190
+ mergeProps(meta, properties, descs, values, base, keys, keysWithSuper);
191
+ } else if (mixins !== undefined) {
192
+ mergeMixins(mixins, meta, descs, values, base, keys, keysWithSuper);
193
+
194
+ if (currentMixin instanceof Mixin && currentMixin._without !== undefined) {
195
+ currentMixin._without.forEach(keyName => {
196
+ // deleting the key means we won't process the value
197
+ let index = keys.indexOf(keyName);
198
+
199
+ if (index !== -1) {
200
+ keys.splice(index, 1);
201
+ }
202
+ });
203
+ }
204
+ }
205
+ } else {
206
+ mergeProps(meta, currentMixin, descs, values, base, keys, keysWithSuper);
207
+ }
208
+ }
209
+ }
210
+
211
+ function mergeProps(meta, props, descs, values, base, keys, keysWithSuper) {
212
+ let concats = concatenatedMixinProperties('concatenatedProperties', props, values, base);
213
+ let mergings = concatenatedMixinProperties('mergedProperties', props, values, base);
214
+ let propKeys = Object.keys(props);
215
+
216
+ for (let key of propKeys) {
217
+ let value = props[key];
218
+ if (value === undefined) continue;
219
+
220
+ if (keys.indexOf(key) === -1) {
221
+ keys.push(key);
222
+ let desc = meta.peekDescriptors(key);
223
+
224
+ if (desc === undefined) {
225
+ // The superclass did not have a CP, which means it may have
226
+ // observers or listeners on that property.
227
+ let prev = values[key] = base[key];
228
+
229
+ if (typeof prev === 'function') {
230
+ updateObserversAndListeners(base, key, prev, false);
231
+ }
232
+ } else {
233
+ descs[key] = desc; // The super desc will be overwritten on descs, so save off the fact that
234
+ // there was a super so we know to Object.defineProperty when writing
235
+ // the value
236
+
237
+ keysWithSuper.push(key);
238
+ desc.teardown(base, key, meta);
239
+ }
240
+ }
241
+
242
+ let isFunction = typeof value === 'function';
243
+
244
+ if (isFunction) {
245
+ let desc = descriptorForDecorator(value);
246
+
247
+ if (desc !== undefined) {
248
+ // Wrap descriptor function to implement _super() if needed
249
+ descs[key] = giveDecoratorSuper(key, value, desc, descs);
250
+ values[key] = undefined;
251
+ continue;
252
+ }
253
+ }
254
+
255
+ if (concats && concats.indexOf(key) >= 0 || key === 'concatenatedProperties' || key === 'mergedProperties') {
256
+ value = applyConcatenatedProperties(key, value, values);
257
+ } else if (mergings && mergings.indexOf(key) > -1) {
258
+ value = applyMergedProperties(key, value, values);
259
+ } else if (isFunction) {
260
+ value = giveMethodSuper(key, value, values, descs);
261
+ }
262
+
263
+ values[key] = value;
264
+ descs[key] = undefined;
265
+ }
266
+ }
267
+
268
+ function updateObserversAndListeners(obj, key, fn, add) {
269
+ let meta = observerListenerMetaFor(fn);
270
+ if (meta === undefined) return;
271
+ let {
272
+ observers,
273
+ listeners
274
+ } = meta;
275
+
276
+ if (observers !== undefined) {
277
+ let updateObserver = add ? addObserver : removeObserver;
278
+
279
+ for (let path of observers.paths) {
280
+ updateObserver(obj, path, null, key, observers.sync);
281
+ }
282
+ }
283
+
284
+ if (listeners !== undefined) {
285
+ let updateListener = add ? addListener : removeListener;
286
+
287
+ for (let listener of listeners) {
288
+ updateListener(obj, listener, null, key);
289
+ }
290
+ }
291
+ }
292
+
293
+ export function applyMixin(obj, mixins, _hideKeys = false) {
294
+ let descs = Object.create(null);
295
+ let values = Object.create(null);
296
+ let meta = metaFor(obj);
297
+ let keys = [];
298
+ let keysWithSuper = [];
299
+ obj._super = ROOT; // Go through all mixins and hashes passed in, and:
300
+ //
301
+ // * Handle concatenated properties
302
+ // * Handle merged properties
303
+ // * Set up _super wrapping if necessary
304
+ // * Set up computed property descriptors
305
+ // * Copying `toString` in broken browsers
306
+
307
+ mergeMixins(mixins, meta, descs, values, obj, keys, keysWithSuper);
308
+
309
+ for (let key of keys) {
310
+ let value = values[key];
311
+ let desc = descs[key];
312
+
313
+ if (value !== undefined) {
314
+ if (typeof value === 'function') {
315
+ updateObserversAndListeners(obj, key, value, true);
316
+ }
317
+
318
+ defineValue(obj, key, value, keysWithSuper.indexOf(key) !== -1, !_hideKeys);
319
+ } else if (desc !== undefined) {
320
+ defineDecorator(obj, key, desc, meta);
321
+ }
322
+ }
323
+
324
+ if (!meta.isPrototypeMeta(obj)) {
325
+ revalidateObservers(obj);
326
+ }
327
+
328
+ return obj;
329
+ }
330
+ /**
331
+ @method mixin
332
+ @param obj
333
+ @param mixins*
334
+ @return obj
335
+ @private
336
+ */
337
+
338
+ export function mixin(obj, ...args) {
339
+ applyMixin(obj, args);
340
+ return obj;
341
+ }
342
+ const MIXINS = new _WeakSet();
343
+ /**
344
+ The `Mixin` class allows you to create mixins, whose properties can be
345
+ added to other classes. For instance,
346
+
347
+ ```javascript
348
+ import Mixin from '@ember/object/mixin';
349
+
350
+ const EditableMixin = Mixin.create({
351
+ edit() {
352
+ console.log('starting to edit');
353
+ this.set('isEditing', true);
354
+ },
355
+ isEditing: false
356
+ });
357
+ ```
358
+
359
+ ```javascript
360
+ import EmberObject from '@ember/object';
361
+ import EditableMixin from '../mixins/editable';
362
+
363
+ // Mix mixins into classes by passing them as the first arguments to
364
+ // `.extend.`
365
+ const Comment = EmberObject.extend(EditableMixin, {
366
+ post: null
367
+ });
368
+
369
+ let comment = Comment.create({
370
+ post: somePost
371
+ });
372
+
373
+ comment.edit(); // outputs 'starting to edit'
374
+ ```
375
+
376
+ Note that Mixins are created with `Mixin.create`, not
377
+ `Mixin.extend`.
378
+
379
+ Note that mixins extend a constructor's prototype so arrays and object literals
380
+ defined as properties will be shared amongst objects that implement the mixin.
381
+ If you want to define a property in a mixin that is not shared, you can define
382
+ it either as a computed property or have it be created on initialization of the object.
383
+
384
+ ```javascript
385
+ // filters array will be shared amongst any object implementing mixin
386
+ import Mixin from '@ember/object/mixin';
387
+ import { A } from '@ember/array';
388
+
389
+ const FilterableMixin = Mixin.create({
390
+ filters: A()
391
+ });
392
+ ```
393
+
394
+ ```javascript
395
+ import Mixin from '@ember/object/mixin';
396
+ import { A } from '@ember/array';
397
+ import { computed } from '@ember/object';
398
+
399
+ // filters will be a separate array for every object implementing the mixin
400
+ const FilterableMixin = Mixin.create({
401
+ filters: computed(function() {
402
+ return A();
403
+ })
404
+ });
405
+ ```
406
+
407
+ ```javascript
408
+ import Mixin from '@ember/object/mixin';
409
+ import { A } from '@ember/array';
410
+
411
+ // filters will be created as a separate array during the object's initialization
412
+ const Filterable = Mixin.create({
413
+ filters: null,
414
+
415
+ init() {
416
+ this._super(...arguments);
417
+ this.set("filters", A());
418
+ }
419
+ });
420
+ ```
421
+
422
+ @class Mixin
423
+ @public
424
+ */
425
+
426
+ export default class Mixin {
427
+ /** @internal */
428
+ constructor(mixins, properties) {
429
+ MIXINS.add(this);
430
+ this.properties = extractAccessors(properties);
431
+ this.mixins = buildMixinsArray(mixins);
432
+ this.ownerConstructor = undefined;
433
+ this._without = undefined;
434
+
435
+ if (DEBUG) {
436
+ // Eagerly add INIT_FACTORY to avoid issues in DEBUG as a result of Object.seal(mixin)
437
+ this[INIT_FACTORY] = null;
438
+ /*
439
+ In debug builds, we seal mixins to help avoid performance pitfalls.
440
+ In IE11 there is a quirk that prevents sealed objects from being added
441
+ to a WeakMap. Unfortunately, the mixin system currently relies on
442
+ weak maps in `guidFor`, so we need to prime the guid cache weak map.
443
+ */
444
+
445
+ guidFor(this);
446
+
447
+ if (Mixin._disableDebugSeal !== true) {
448
+ Object.seal(this);
449
+ }
450
+ }
451
+ }
452
+ /**
453
+ @method create
454
+ @for @ember/object/mixin
455
+ @static
456
+ @param arguments*
457
+ @public
458
+ */
459
+
460
+
461
+ static create(...args) {
462
+ setUnprocessedMixins();
463
+ let M = this;
464
+ return new M(args, undefined);
465
+ } // returns the mixins currently applied to the specified object
466
+ // TODO: Make `mixin`
467
+
468
+ /** @internal */
469
+
470
+
471
+ static mixins(obj) {
472
+ let meta = peekMeta(obj);
473
+ let ret = [];
474
+
475
+ if (meta === null) {
476
+ return ret;
477
+ }
478
+
479
+ meta.forEachMixins(currentMixin => {
480
+ // skip primitive mixins since these are always anonymous
481
+ if (!currentMixin.properties) {
482
+ ret.push(currentMixin);
483
+ }
484
+ });
485
+ return ret;
486
+ }
487
+ /**
488
+ @method reopen
489
+ @param arguments*
490
+ @private
491
+ @internal
492
+ */
493
+
494
+
495
+ reopen(...args) {
496
+ if (args.length === 0) {
497
+ return;
498
+ }
499
+
500
+ if (this.properties) {
501
+ let currentMixin = new Mixin(undefined, this.properties);
502
+ this.properties = undefined;
503
+ this.mixins = [currentMixin];
504
+ } else if (!this.mixins) {
505
+ this.mixins = [];
506
+ }
507
+
508
+ this.mixins = this.mixins.concat(buildMixinsArray(args));
509
+ return this;
510
+ }
511
+ /**
512
+ @method apply
513
+ @param obj
514
+ @return applied object
515
+ @private
516
+ @internal
517
+ */
518
+
519
+
520
+ apply(obj, _hideKeys = false) {
521
+ // Ember.NativeArray is a normal Ember.Mixin that we mix into `Array.prototype` when prototype extensions are enabled
522
+ // mutating a native object prototype like this should _not_ result in enumerable properties being added (or we have significant
523
+ // issues with things like deep equality checks from test frameworks, or things like jQuery.extend(true, [], [])).
524
+ //
525
+ // _hideKeys disables enumerablity when applying the mixin. This is a hack, and we should stop mutating the array prototype by default 😫
526
+ return applyMixin(obj, [this], _hideKeys);
527
+ }
528
+ /** @internal */
529
+
530
+
531
+ applyPartial(obj) {
532
+ return applyMixin(obj, [this]);
533
+ }
534
+ /**
535
+ @method detect
536
+ @param obj
537
+ @return {Boolean}
538
+ @private
539
+ @internal
540
+ */
541
+
542
+
543
+ detect(obj) {
544
+ if (typeof obj !== 'object' || obj === null) {
545
+ return false;
546
+ }
547
+
548
+ if (MIXINS.has(obj)) {
549
+ return _detect(obj, this);
550
+ }
551
+
552
+ let meta = peekMeta(obj);
553
+
554
+ if (meta === null) {
555
+ return false;
556
+ }
557
+
558
+ return meta.hasMixin(this);
559
+ }
560
+ /** @internal */
561
+
562
+
563
+ without(...args) {
564
+ let ret = new Mixin([this]);
565
+ ret._without = args;
566
+ return ret;
567
+ }
568
+ /** @internal */
569
+
570
+
571
+ keys() {
572
+ let keys = _keys(this);
573
+
574
+ assert('[BUG] Missing keys for mixin!', keys);
575
+ return keys;
576
+ }
577
+ /** @internal */
578
+
579
+
580
+ toString() {
581
+ return '(unknown mixin)';
582
+ }
583
+
584
+ }
585
+
586
+ if (DEBUG) {
587
+ Object.defineProperty(Mixin, '_disableDebugSeal', {
588
+ configurable: true,
589
+ enumerable: false,
590
+ writable: true,
591
+ value: false
592
+ });
593
+ }
594
+
595
+ function buildMixinsArray(mixins) {
596
+ let length = mixins && mixins.length || 0;
597
+ let m = undefined;
598
+
599
+ if (length > 0) {
600
+ m = new Array(length);
601
+
602
+ for (let i = 0; i < length; i++) {
603
+ let x = mixins[i];
604
+ assert(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(x)}`, typeof x === 'object' && x !== null && Object.prototype.toString.call(x) !== '[object Array]');
605
+
606
+ if (MIXINS.has(x)) {
607
+ m[i] = x;
608
+ } else {
609
+ m[i] = new Mixin(undefined, x);
610
+ }
611
+ }
612
+ }
613
+
614
+ return m;
615
+ }
616
+
617
+ if (DEBUG) {
618
+ Object.seal(Mixin.prototype);
619
+ }
620
+
621
+ function _detect(curMixin, targetMixin, seen = new Set()) {
622
+ if (seen.has(curMixin)) {
623
+ return false;
624
+ }
625
+
626
+ seen.add(curMixin);
627
+
628
+ if (curMixin === targetMixin) {
629
+ return true;
630
+ }
631
+
632
+ let mixins = curMixin.mixins;
633
+
634
+ if (mixins) {
635
+ return mixins.some(mixin => _detect(mixin, targetMixin, seen));
636
+ }
637
+
638
+ return false;
639
+ }
640
+
641
+ function _keys(mixin, ret = new Set(), seen = new Set()) {
642
+ if (seen.has(mixin)) {
643
+ return;
644
+ }
645
+
646
+ seen.add(mixin);
647
+
648
+ if (mixin.properties) {
649
+ let props = Object.keys(mixin.properties);
650
+
651
+ for (let prop of props) {
652
+ ret.add(prop);
653
+ }
654
+ } else if (mixin.mixins) {
655
+ mixin.mixins.forEach(x => _keys(x, ret, seen));
656
+ }
657
+
658
+ return ret;
659
+ }