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.
- package/CHANGELOG.md +11 -2
- package/blueprints/helper/files/__root__/{__collection__ → helpers}/__name__.ts +0 -0
- package/blueprints/helper/index.js +0 -15
- package/blueprints/helper-test/index.js +0 -3
- package/blueprints/helper-test/mocha-0.12-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/blueprints/helper-test/mocha-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/blueprints/helper-test/mocha-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.ts +0 -0
- package/blueprints/helper-test/qunit-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/blueprints/helper-test/qunit-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.ts +0 -0
- package/blueprints-js/helper/files/__root__/{__collection__ → helpers}/__name__.js +0 -0
- package/blueprints-js/helper-test/mocha-0.12-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/blueprints-js/helper-test/mocha-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/blueprints-js/helper-test/mocha-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/blueprints-js/helper-test/qunit-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/blueprints-js/helper-test/qunit-rfc-232-files/__root__/__testType__/{__collection__ → helpers}/__name__-test.js +0 -0
- package/build-metadata.json +3 -3
- package/dist/dependencies/router_js.js +1 -1
- package/dist/ember-template-compiler.js +675 -18
- package/dist/ember-template-compiler.map +1 -1
- package/dist/ember-testing.js +11 -11
- package/dist/ember-testing.map +1 -1
- package/dist/ember.debug.js +19576 -20510
- package/dist/ember.debug.map +1 -1
- package/dist/header/license.js +1 -1
- package/dist/packages/@ember/-internals/glimmer/index.js +4 -2
- package/dist/packages/@ember/-internals/metal/index.js +214 -1094
- package/dist/packages/@ember/-internals/routing/index.js +1 -17
- package/dist/packages/@ember/-internals/runtime/index.js +3 -16
- package/dist/packages/@ember/-internals/runtime/lib/mixins/-proxy.js +2 -1
- package/dist/packages/@ember/-internals/runtime/lib/mixins/action_handler.js +4 -3
- package/dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js +1 -1
- package/dist/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js +1 -1
- package/dist/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js +1 -8
- package/dist/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +2 -1
- package/dist/packages/@ember/-internals/utils/index.js +3 -3
- package/dist/packages/@ember/-internals/views/lib/component_lookup.js +1 -1
- package/dist/packages/@ember/-internals/views/lib/mixins/action_support.js +2 -1
- package/dist/packages/@ember/-internals/views/lib/mixins/child_views_support.js +2 -1
- package/dist/packages/@ember/-internals/views/lib/mixins/class_names_support.js +2 -1
- package/dist/packages/@ember/-internals/views/lib/mixins/view_state_support.js +1 -1
- package/dist/packages/@ember/-internals/views/lib/mixins/view_support.js +2 -1
- package/dist/packages/@ember/-internals/views/lib/system/event_dispatcher.js +1 -1
- package/dist/packages/@ember/-internals/views/lib/views/core_view.js +3 -1
- package/dist/packages/@ember/application/index.js +876 -2
- package/dist/packages/@ember/application/instance.js +2 -2
- package/dist/packages/@ember/application/namespace.js +70 -1
- package/dist/packages/@ember/array/index.js +1503 -2
- package/dist/packages/@ember/array/mutable.js +1 -1
- package/dist/packages/@ember/array/proxy.js +307 -1
- package/dist/packages/@ember/canary-features/index.js +2 -2
- package/dist/packages/@ember/controller/index.js +260 -3
- package/dist/packages/@ember/debug/container-debug-adapter.js +99 -1
- package/dist/packages/@ember/debug/data-adapter.js +574 -1
- package/dist/packages/@ember/engine/index.js +5 -5
- package/dist/packages/@ember/engine/instance.js +4 -4
- package/dist/packages/@ember/enumerable/index.js +3 -1
- package/dist/packages/@ember/enumerable/mutable.js +4 -0
- package/dist/packages/@ember/{-internals/runtime/lib/system/object.js → object/-internals.js} +4 -17
- package/dist/packages/@ember/object/core.js +731 -1
- package/dist/packages/@ember/object/evented.js +93 -2
- package/dist/packages/@ember/object/index.js +76 -4
- package/dist/packages/@ember/object/internals.js +3 -2
- package/dist/packages/@ember/object/lib/computed/computed_macros.js +3 -1
- package/dist/packages/@ember/object/lib/computed/reduce_computed_macros.js +4 -3
- package/dist/packages/@ember/object/mixin.js +659 -1
- package/dist/packages/@ember/object/observable.js +341 -1
- package/dist/packages/@ember/object/promise-proxy-mixin.js +150 -1
- package/dist/packages/@ember/object/proxy.js +10 -1
- package/dist/packages/@ember/routing/-internals.js +7 -0
- package/dist/packages/@ember/routing/auto-location.js +249 -1
- package/dist/packages/@ember/routing/hash-location.js +169 -1
- package/dist/packages/@ember/routing/history-location.js +289 -1
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/cache.js +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/controller_for.js +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/dsl.js +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/engines.js +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/generate_controller.js +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/location/util.js → routing/lib/location-utils.js} +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/query_params.js +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/route-info.js +0 -0
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/router_state.js +1 -1
- package/dist/packages/@ember/{-internals/routing/lib/services/routing.js → routing/lib/routing-service.js} +2 -2
- package/dist/packages/@ember/{-internals/routing/lib/system → routing/lib}/transition.js +0 -0
- package/dist/packages/@ember/{-internals/routing → routing}/lib/utils.js +0 -0
- package/dist/packages/@ember/routing/location.js +104 -1
- package/dist/packages/@ember/routing/none-location.js +123 -1
- package/dist/packages/@ember/routing/route.js +1700 -1
- package/dist/packages/@ember/routing/router-service.js +510 -1
- package/dist/packages/@ember/routing/router.js +1666 -1
- package/dist/packages/@ember/service/index.js +1 -1
- package/dist/packages/@ember/utils/index.js +7 -2
- package/dist/packages/@ember/{-internals/runtime → utils}/lib/compare.js +2 -2
- package/dist/packages/@ember/{-internals/runtime → utils}/lib/is-equal.js +0 -0
- package/dist/packages/@ember/utils/lib/is_blank.js +35 -0
- package/dist/packages/@ember/utils/lib/is_empty.js +68 -0
- package/dist/packages/@ember/utils/lib/is_none.js +27 -0
- package/dist/packages/@ember/utils/lib/is_present.js +38 -0
- package/dist/packages/@ember/{-internals/runtime → utils}/lib/type-of.js +2 -2
- package/dist/packages/ember/index.js +47 -28
- package/dist/packages/ember/version.js +1 -1
- package/dist/packages/ember-testing/lib/adapters/adapter.js +1 -1
- package/dist/packages/ember-testing/lib/helpers/current_path.js +2 -2
- package/dist/packages/ember-testing/lib/helpers/current_route_name.js +2 -2
- package/dist/packages/ember-testing/lib/helpers/current_url.js +1 -1
- package/docs/data.json +9428 -9189
- package/package.json +23 -8
- package/types/preview/@ember/-internals/resolver.d.ts +35 -0
- package/types/preview/@ember/application/-private/event-dispatcher.d.ts +18 -0
- package/types/preview/@ember/application/-private/registry.d.ts +15 -0
- package/types/preview/@ember/application/deprecations.d.ts +24 -0
- package/types/preview/@ember/application/index.d.ts +153 -0
- package/types/preview/@ember/application/instance.d.ts +9 -0
- package/types/preview/@ember/application/tsconfig.json +3 -0
- package/types/preview/@ember/application/types.d.ts +29 -0
- package/types/preview/@ember/array/-private/enumerable.d.ts +13 -0
- package/types/preview/@ember/array/-private/mutable-enumerable.d.ts +13 -0
- package/types/preview/@ember/array/-private/native-array.d.ts +23 -0
- package/types/preview/@ember/array/index.d.ts +243 -0
- package/types/preview/@ember/array/mutable.d.ts +94 -0
- package/types/preview/@ember/array/proxy.d.ts +29 -0
- package/types/preview/@ember/array/tsconfig.json +3 -0
- package/types/preview/@ember/component/-private/class-names-support.d.ts +27 -0
- package/types/preview/@ember/component/-private/core-view.d.ts +14 -0
- package/types/preview/@ember/component/-private/glimmer-interfaces.d.ts +45 -0
- package/types/preview/@ember/component/-private/signature-utils.d.ts +107 -0
- package/types/preview/@ember/component/-private/view-mixin.d.ts +59 -0
- package/types/preview/@ember/component/helper.d.ts +122 -0
- package/types/preview/@ember/component/index.d.ts +132 -0
- package/types/preview/@ember/component/template-only.d.ts +47 -0
- package/types/preview/@ember/component/tsconfig.json +3 -0
- package/types/preview/@ember/controller/index.d.ts +48 -0
- package/types/preview/@ember/controller/tsconfig.json +3 -0
- package/types/preview/@ember/debug/container-debug-adapter.d.ts +13 -0
- package/types/preview/@ember/debug/data-adapter.d.ts +64 -0
- package/types/preview/@ember/debug/index.d.ts +98 -0
- package/types/preview/@ember/debug/tsconfig.json +3 -0
- package/types/preview/@ember/destroyable/index.d.ts +23 -0
- package/types/preview/@ember/destroyable/tsconfig.json +3 -0
- package/types/preview/@ember/engine/-private/container-proxy-mixin.d.ts +17 -0
- package/types/preview/@ember/engine/-private/registry-proxy-mixin.d.ts +54 -0
- package/types/preview/@ember/engine/-private/types/initializer.d.ts +8 -0
- package/types/preview/@ember/engine/index.d.ts +45 -0
- package/types/preview/@ember/engine/instance.d.ts +24 -0
- package/types/preview/@ember/engine/tsconfig.json +3 -0
- package/types/preview/@ember/error/index.d.ts +6 -0
- package/types/preview/@ember/error/tsconfig.json +3 -0
- package/types/preview/@ember/helper/index.d.ts +49 -0
- package/types/preview/@ember/helper/tsconfig.json +3 -0
- package/types/preview/@ember/modifier/index.d.ts +33 -0
- package/types/preview/@ember/modifier/tsconfig.json +3 -0
- package/types/preview/@ember/object/-private/action-handler.d.ts +31 -0
- package/types/preview/@ember/object/-private/types.d.ts +63 -0
- package/types/preview/@ember/object/compat.d.ts +9 -0
- package/types/preview/@ember/object/computed.d.ts +263 -0
- package/types/preview/@ember/object/core.d.ts +89 -0
- package/types/preview/@ember/object/evented.d.ts +45 -0
- package/types/preview/@ember/object/events.d.ts +47 -0
- package/types/preview/@ember/object/index.d.ts +126 -0
- package/types/preview/@ember/object/internals.d.ts +17 -0
- package/types/preview/@ember/object/mixin.d.ts +19 -0
- package/types/preview/@ember/object/observable.d.ts +89 -0
- package/types/preview/@ember/object/observers.d.ts +34 -0
- package/types/preview/@ember/object/promise-proxy-mixin.d.ts +37 -0
- package/types/preview/@ember/object/proxy.d.ts +27 -0
- package/types/preview/@ember/object/tsconfig.json +3 -0
- package/types/preview/@ember/owner/index.d.ts +102 -0
- package/types/preview/@ember/owner/tsconfig.json +3 -0
- package/types/preview/@ember/polyfills/index.d.ts +23 -0
- package/types/preview/@ember/polyfills/tsconfig.json +3 -0
- package/types/preview/@ember/polyfills/types.d.ts +6 -0
- package/types/preview/@ember/routing/-private/router-dsl.d.ts +20 -0
- package/types/preview/@ember/routing/auto-location.d.ts +8 -0
- package/types/preview/@ember/routing/hash-location.d.ts +10 -0
- package/types/preview/@ember/routing/history-location.d.ts +9 -0
- package/types/preview/@ember/routing/index.d.ts +20 -0
- package/types/preview/@ember/routing/none-location.d.ts +11 -0
- package/types/preview/@ember/routing/route-info.d.ts +74 -0
- package/types/preview/@ember/routing/route.d.ts +533 -0
- package/types/preview/@ember/routing/router-service.d.ts +351 -0
- package/types/preview/@ember/routing/router.d.ts +49 -0
- package/types/preview/@ember/routing/transition.d.ts +126 -0
- package/types/preview/@ember/routing/tsconfig.json +3 -0
- package/types/preview/@ember/routing/types.d.ts +15 -0
- package/types/preview/@ember/runloop/-private/backburner.d.ts +43 -0
- package/types/preview/@ember/runloop/-private/types.d.ts +9 -0
- package/types/preview/@ember/runloop/index.d.ts +175 -0
- package/types/preview/@ember/runloop/tsconfig.json +3 -0
- package/types/preview/@ember/runloop/types.d.ts +5 -0
- package/types/preview/@ember/service/index.d.ts +25 -0
- package/types/preview/@ember/service/tsconfig.json +3 -0
- package/types/preview/@ember/string/index.d.ts +9 -0
- package/types/preview/@ember/string/tsconfig.json +3 -0
- package/types/preview/@ember/template/-private/handlebars.d.ts +7 -0
- package/types/preview/@ember/template/index.d.ts +5 -0
- package/types/preview/@ember/template/tsconfig.json +3 -0
- package/types/preview/@ember/test/adapter.d.ts +22 -0
- package/types/preview/@ember/test/index.d.ts +49 -0
- package/types/preview/@ember/test/tsconfig.json +3 -0
- package/types/preview/@ember/utils/-private/types.d.ts +39 -0
- package/types/preview/@ember/utils/index.d.ts +42 -0
- package/types/preview/@ember/utils/tsconfig.json +3 -0
- package/types/preview/ember/-private/type-utils.d.ts +54 -0
- package/types/preview/ember/index.d.ts +381 -0
- package/types/preview/ember/tsconfig.json +3 -0
- package/types/preview/index.d.ts +120 -0
- package/types/preview/tsconfig.json +6 -0
- package/blueprints/helper/mu-files/__root__/__collection__/__name__.js +0 -7
- package/blueprints-js/helper/mu-files/__root__/__collection__/__name__.js +0 -7
- package/dist/packages/@ember/-internals/extension-support/index.js +0 -2
- package/dist/packages/@ember/-internals/extension-support/lib/container_debug_adapter.js +0 -96
- package/dist/packages/@ember/-internals/extension-support/lib/data_adapter.js +0 -576
- package/dist/packages/@ember/-internals/routing/lib/ext/controller.js +0 -224
- package/dist/packages/@ember/-internals/routing/lib/location/api.js +0 -104
- package/dist/packages/@ember/-internals/routing/lib/location/auto_location.js +0 -250
- package/dist/packages/@ember/-internals/routing/lib/location/hash_location.js +0 -170
- package/dist/packages/@ember/-internals/routing/lib/location/history_location.js +0 -290
- package/dist/packages/@ember/-internals/routing/lib/location/none_location.js +0 -124
- package/dist/packages/@ember/-internals/routing/lib/services/router.js +0 -506
- package/dist/packages/@ember/-internals/routing/lib/system/route.js +0 -1696
- package/dist/packages/@ember/-internals/routing/lib/system/router.js +0 -1662
- package/dist/packages/@ember/-internals/runtime/lib/mixins/array.js +0 -1501
- package/dist/packages/@ember/-internals/runtime/lib/mixins/enumerable.js +0 -3
- package/dist/packages/@ember/-internals/runtime/lib/mixins/evented.js +0 -91
- package/dist/packages/@ember/-internals/runtime/lib/mixins/mutable_enumerable.js +0 -4
- package/dist/packages/@ember/-internals/runtime/lib/mixins/observable.js +0 -339
- package/dist/packages/@ember/-internals/runtime/lib/mixins/promise_proxy.js +0 -149
- package/dist/packages/@ember/-internals/runtime/lib/system/array_proxy.js +0 -305
- package/dist/packages/@ember/-internals/runtime/lib/system/core_object.js +0 -730
- package/dist/packages/@ember/-internals/runtime/lib/system/namespace.js +0 -69
- package/dist/packages/@ember/-internals/runtime/lib/system/object_proxy.js +0 -7
- package/dist/packages/@ember/application/lib/application.js +0 -870
- package/dist/packages/@ember/controller/lib/controller_mixin.js +0 -42
- package/dist/packages/@ember/runloop/type-tests.ts/begin-end.test.js +0 -5
- package/dist/packages/@ember/runloop/type-tests.ts/bind.test.js +0 -59
- package/dist/packages/@ember/runloop/type-tests.ts/cancel.test.js +0 -5
- package/dist/packages/@ember/runloop/type-tests.ts/debounce.test.js +0 -77
- package/dist/packages/@ember/runloop/type-tests.ts/join.test.js +0 -38
- package/dist/packages/@ember/runloop/type-tests.ts/later.test.js +0 -38
- package/dist/packages/@ember/runloop/type-tests.ts/next.test.js +0 -38
- package/dist/packages/@ember/runloop/type-tests.ts/once.test.js +0 -38
- package/dist/packages/@ember/runloop/type-tests.ts/run.test.js +0 -38
- package/dist/packages/@ember/runloop/type-tests.ts/schedule-once.test.js +0 -39
- package/dist/packages/@ember/runloop/type-tests.ts/schedule.test.js +0 -39
- package/dist/packages/@ember/runloop/type-tests.ts/throttle.test.js +0 -77
|
@@ -1 +1,659 @@
|
|
|
1
|
-
|
|
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
|
+
}
|