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,5 +1,5 @@
|
|
|
1
1
|
import { meta, peekMeta } from '@ember/-internals/meta';
|
|
2
|
-
import { setListeners, isObject, setupMandatorySetter, symbol, toString, inspect, setWithMandatorySetter, Cache, isEmberArray, setProxy, lookupDescriptor, getName, setName
|
|
2
|
+
import { setListeners, isObject, setupMandatorySetter, symbol, toString, inspect, setWithMandatorySetter, Cache, isEmberArray, setProxy, lookupDescriptor, getName, setName } 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';
|
|
@@ -11,7 +11,6 @@ import { getCustomTagFor } from '@glimmer/manager';
|
|
|
11
11
|
import { _WeakSet } from '@glimmer/util';
|
|
12
12
|
import EmberError from '@ember/error';
|
|
13
13
|
import VERSION from 'ember/version';
|
|
14
|
-
import { INIT_FACTORY } from '@ember/-internals/container';
|
|
15
14
|
import { getOwner } from '@ember/-internals/owner';
|
|
16
15
|
|
|
17
16
|
/*
|
|
@@ -2125,174 +2124,6 @@ function eachProxyArrayDidChange(array, idx, removedCnt, addedCnt) {
|
|
|
2125
2124
|
}
|
|
2126
2125
|
}
|
|
2127
2126
|
|
|
2128
|
-
/**
|
|
2129
|
-
@module @ember/utils
|
|
2130
|
-
*/
|
|
2131
|
-
|
|
2132
|
-
/**
|
|
2133
|
-
Returns true if the passed value is null or undefined. This avoids errors
|
|
2134
|
-
from JSLint complaining about use of ==, which can be technically
|
|
2135
|
-
confusing.
|
|
2136
|
-
|
|
2137
|
-
```javascript
|
|
2138
|
-
isNone(null); // true
|
|
2139
|
-
isNone(undefined); // true
|
|
2140
|
-
isNone(''); // false
|
|
2141
|
-
isNone([]); // false
|
|
2142
|
-
isNone(function() {}); // false
|
|
2143
|
-
```
|
|
2144
|
-
|
|
2145
|
-
@method isNone
|
|
2146
|
-
@static
|
|
2147
|
-
@for @ember/utils
|
|
2148
|
-
@param {Object} obj Value to test
|
|
2149
|
-
@return {Boolean}
|
|
2150
|
-
@public
|
|
2151
|
-
*/
|
|
2152
|
-
function isNone(obj) {
|
|
2153
|
-
return obj === null || obj === undefined;
|
|
2154
|
-
}
|
|
2155
|
-
|
|
2156
|
-
/**
|
|
2157
|
-
@module @ember/utils
|
|
2158
|
-
*/
|
|
2159
|
-
|
|
2160
|
-
/**
|
|
2161
|
-
Verifies that a value is `null` or `undefined`, an empty string, or an empty
|
|
2162
|
-
array.
|
|
2163
|
-
|
|
2164
|
-
Constrains the rules on `isNone` by returning true for empty strings and
|
|
2165
|
-
empty arrays.
|
|
2166
|
-
|
|
2167
|
-
If the value is an object with a `size` property of type number, it is used
|
|
2168
|
-
to check emptiness.
|
|
2169
|
-
|
|
2170
|
-
```javascript
|
|
2171
|
-
isEmpty(null); // true
|
|
2172
|
-
isEmpty(undefined); // true
|
|
2173
|
-
isEmpty(''); // true
|
|
2174
|
-
isEmpty([]); // true
|
|
2175
|
-
isEmpty({ size: 0}); // true
|
|
2176
|
-
isEmpty({}); // false
|
|
2177
|
-
isEmpty('Adam Hawkins'); // false
|
|
2178
|
-
isEmpty([0,1,2]); // false
|
|
2179
|
-
isEmpty('\n\t'); // false
|
|
2180
|
-
isEmpty(' '); // false
|
|
2181
|
-
isEmpty({ size: 1 }) // false
|
|
2182
|
-
isEmpty({ size: () => 0 }) // false
|
|
2183
|
-
```
|
|
2184
|
-
|
|
2185
|
-
@method isEmpty
|
|
2186
|
-
@static
|
|
2187
|
-
@for @ember/utils
|
|
2188
|
-
@param {Object} obj Value to test
|
|
2189
|
-
@return {Boolean}
|
|
2190
|
-
@public
|
|
2191
|
-
*/
|
|
2192
|
-
|
|
2193
|
-
function isEmpty(obj) {
|
|
2194
|
-
if (obj === null || obj === undefined) {
|
|
2195
|
-
return true;
|
|
2196
|
-
}
|
|
2197
|
-
|
|
2198
|
-
if (!hasUnknownProperty(obj) && typeof obj.size === 'number') {
|
|
2199
|
-
return !obj.size;
|
|
2200
|
-
}
|
|
2201
|
-
|
|
2202
|
-
if (typeof obj === 'object') {
|
|
2203
|
-
let size = get(obj, 'size');
|
|
2204
|
-
|
|
2205
|
-
if (typeof size === 'number') {
|
|
2206
|
-
return !size;
|
|
2207
|
-
}
|
|
2208
|
-
|
|
2209
|
-
let length = get(obj, 'length');
|
|
2210
|
-
|
|
2211
|
-
if (typeof length === 'number') {
|
|
2212
|
-
return !length;
|
|
2213
|
-
}
|
|
2214
|
-
}
|
|
2215
|
-
|
|
2216
|
-
if (typeof obj.length === 'number' && typeof obj !== 'function') {
|
|
2217
|
-
return !obj.length;
|
|
2218
|
-
}
|
|
2219
|
-
|
|
2220
|
-
return false;
|
|
2221
|
-
}
|
|
2222
|
-
|
|
2223
|
-
/**
|
|
2224
|
-
@module @ember/utils
|
|
2225
|
-
*/
|
|
2226
|
-
|
|
2227
|
-
/**
|
|
2228
|
-
A value is blank if it is empty or a whitespace string.
|
|
2229
|
-
|
|
2230
|
-
```javascript
|
|
2231
|
-
import { isBlank } from '@ember/utils';
|
|
2232
|
-
|
|
2233
|
-
isBlank(null); // true
|
|
2234
|
-
isBlank(undefined); // true
|
|
2235
|
-
isBlank(''); // true
|
|
2236
|
-
isBlank([]); // true
|
|
2237
|
-
isBlank('\n\t'); // true
|
|
2238
|
-
isBlank(' '); // true
|
|
2239
|
-
isBlank({}); // false
|
|
2240
|
-
isBlank('\n\t Hello'); // false
|
|
2241
|
-
isBlank('Hello world'); // false
|
|
2242
|
-
isBlank([1,2,3]); // false
|
|
2243
|
-
```
|
|
2244
|
-
|
|
2245
|
-
@method isBlank
|
|
2246
|
-
@static
|
|
2247
|
-
@for @ember/utils
|
|
2248
|
-
@param {Object} obj Value to test
|
|
2249
|
-
@return {Boolean}
|
|
2250
|
-
@since 1.5.0
|
|
2251
|
-
@public
|
|
2252
|
-
*/
|
|
2253
|
-
|
|
2254
|
-
function isBlank(obj) {
|
|
2255
|
-
return isEmpty(obj) || typeof obj === 'string' && /\S/.test(obj) === false;
|
|
2256
|
-
}
|
|
2257
|
-
|
|
2258
|
-
/**
|
|
2259
|
-
@module @ember/utils
|
|
2260
|
-
*/
|
|
2261
|
-
|
|
2262
|
-
/**
|
|
2263
|
-
A value is present if it not `isBlank`.
|
|
2264
|
-
|
|
2265
|
-
```javascript
|
|
2266
|
-
isPresent(null); // false
|
|
2267
|
-
isPresent(undefined); // false
|
|
2268
|
-
isPresent(''); // false
|
|
2269
|
-
isPresent(' '); // false
|
|
2270
|
-
isPresent('\n\t'); // false
|
|
2271
|
-
isPresent([]); // false
|
|
2272
|
-
isPresent({ length: 0 }); // false
|
|
2273
|
-
isPresent(false); // true
|
|
2274
|
-
isPresent(true); // true
|
|
2275
|
-
isPresent('string'); // true
|
|
2276
|
-
isPresent(0); // true
|
|
2277
|
-
isPresent(function() {}); // true
|
|
2278
|
-
isPresent({}); // true
|
|
2279
|
-
isPresent('\n\t Hello'); // true
|
|
2280
|
-
isPresent([1, 2, 3]); // true
|
|
2281
|
-
```
|
|
2282
|
-
|
|
2283
|
-
@method isPresent
|
|
2284
|
-
@static
|
|
2285
|
-
@for @ember/utils
|
|
2286
|
-
@param {Object} obj Value to test
|
|
2287
|
-
@return {Boolean}
|
|
2288
|
-
@since 1.8.0
|
|
2289
|
-
@public
|
|
2290
|
-
*/
|
|
2291
|
-
|
|
2292
|
-
function isPresent(obj) {
|
|
2293
|
-
return !isBlank(obj);
|
|
2294
|
-
}
|
|
2295
|
-
|
|
2296
2127
|
/**
|
|
2297
2128
|
@module ember
|
|
2298
2129
|
*/
|
|
@@ -2333,972 +2164,116 @@ class Libraries {
|
|
|
2333
2164
|
index = this._coreLibIndex++;
|
|
2334
2165
|
}
|
|
2335
2166
|
|
|
2336
|
-
this._registry.splice(index, 0, {
|
|
2337
|
-
name,
|
|
2338
|
-
version
|
|
2339
|
-
});
|
|
2340
|
-
} else {
|
|
2341
|
-
warn(`Library "${name}" is already registered with Ember.`, false, {
|
|
2342
|
-
id: 'ember-metal.libraries-register'
|
|
2343
|
-
});
|
|
2344
|
-
}
|
|
2345
|
-
}
|
|
2346
|
-
|
|
2347
|
-
registerCoreLibrary(name, version) {
|
|
2348
|
-
this.register(name, version, true);
|
|
2349
|
-
}
|
|
2350
|
-
|
|
2351
|
-
deRegister(name) {
|
|
2352
|
-
let lib = this._getLibraryByName(name);
|
|
2353
|
-
|
|
2354
|
-
let index;
|
|
2355
|
-
|
|
2356
|
-
if (lib) {
|
|
2357
|
-
index = this._registry.indexOf(lib);
|
|
2358
|
-
|
|
2359
|
-
this._registry.splice(index, 1);
|
|
2360
|
-
}
|
|
2361
|
-
}
|
|
2362
|
-
|
|
2363
|
-
}
|
|
2364
|
-
|
|
2365
|
-
if (DEBUG) {
|
|
2366
|
-
Libraries.prototype.logVersions = function () {
|
|
2367
|
-
let libs = this._registry;
|
|
2368
|
-
let nameLengths = libs.map(item => get(item, 'name.length'));
|
|
2369
|
-
assert('nameLengths is number array', nameLengths instanceof Array && nameLengths.every(n => typeof n === 'number'));
|
|
2370
|
-
let maxNameLength = Math.max.apply(null, nameLengths);
|
|
2371
|
-
debug('-------------------------------');
|
|
2372
|
-
|
|
2373
|
-
for (let lib of libs) {
|
|
2374
|
-
let spaces = new Array(maxNameLength - lib.name.length + 1).join(' ');
|
|
2375
|
-
debug([lib.name, spaces, ' : ', lib.version].join(''));
|
|
2376
|
-
}
|
|
2377
|
-
|
|
2378
|
-
debug('-------------------------------');
|
|
2379
|
-
};
|
|
2380
|
-
}
|
|
2381
|
-
|
|
2382
|
-
const LIBRARIES = new Libraries();
|
|
2383
|
-
LIBRARIES.registerCoreLibrary('Ember', VERSION);
|
|
2384
|
-
|
|
2385
|
-
function getProperties(obj, keys) {
|
|
2386
|
-
let ret = {};
|
|
2387
|
-
let propertyNames;
|
|
2388
|
-
let i = 1;
|
|
2389
|
-
|
|
2390
|
-
if (arguments.length === 2 && Array.isArray(keys)) {
|
|
2391
|
-
i = 0;
|
|
2392
|
-
propertyNames = arguments[1];
|
|
2393
|
-
} else {
|
|
2394
|
-
propertyNames = Array.from(arguments);
|
|
2395
|
-
}
|
|
2396
|
-
|
|
2397
|
-
for (; i < propertyNames.length; i++) {
|
|
2398
|
-
ret[propertyNames[i]] = get(obj, propertyNames[i]);
|
|
2399
|
-
}
|
|
2400
|
-
|
|
2401
|
-
return ret;
|
|
2402
|
-
}
|
|
2403
|
-
|
|
2404
|
-
/**
|
|
2405
|
-
@module @ember/object
|
|
2406
|
-
*/
|
|
2407
|
-
|
|
2408
|
-
/**
|
|
2409
|
-
Set a list of properties on an object. These properties are set inside
|
|
2410
|
-
a single `beginPropertyChanges` and `endPropertyChanges` batch, so
|
|
2411
|
-
observers will be buffered.
|
|
2412
|
-
|
|
2413
|
-
```javascript
|
|
2414
|
-
import EmberObject from '@ember/object';
|
|
2415
|
-
let anObject = EmberObject.create();
|
|
2416
|
-
|
|
2417
|
-
anObject.setProperties({
|
|
2418
|
-
firstName: 'Stanley',
|
|
2419
|
-
lastName: 'Stuart',
|
|
2420
|
-
age: 21
|
|
2421
|
-
});
|
|
2422
|
-
```
|
|
2423
|
-
|
|
2424
|
-
@method setProperties
|
|
2425
|
-
@static
|
|
2426
|
-
@for @ember/object
|
|
2427
|
-
@param obj
|
|
2428
|
-
@param {Object} properties
|
|
2429
|
-
@return properties
|
|
2430
|
-
@public
|
|
2431
|
-
*/
|
|
2432
|
-
|
|
2433
|
-
function setProperties(obj, properties) {
|
|
2434
|
-
if (properties === null || typeof properties !== 'object') {
|
|
2435
|
-
return properties;
|
|
2436
|
-
}
|
|
2437
|
-
|
|
2438
|
-
changeProperties(() => {
|
|
2439
|
-
let props = Object.keys(properties);
|
|
2440
|
-
|
|
2441
|
-
for (let propertyName of props) {
|
|
2442
|
-
set(obj, propertyName, properties[propertyName]);
|
|
2443
|
-
}
|
|
2444
|
-
});
|
|
2445
|
-
return properties;
|
|
2446
|
-
}
|
|
2447
|
-
|
|
2448
|
-
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
2449
|
-
let searchDisabled = false;
|
|
2450
|
-
const flags = {
|
|
2451
|
-
_set: 0,
|
|
2452
|
-
_unprocessedNamespaces: false,
|
|
2453
|
-
|
|
2454
|
-
get unprocessedNamespaces() {
|
|
2455
|
-
return this._unprocessedNamespaces;
|
|
2456
|
-
},
|
|
2457
|
-
|
|
2458
|
-
set unprocessedNamespaces(v) {
|
|
2459
|
-
this._set++;
|
|
2460
|
-
this._unprocessedNamespaces = v;
|
|
2461
|
-
}
|
|
2462
|
-
|
|
2463
|
-
};
|
|
2464
|
-
let unprocessedMixins = false;
|
|
2465
|
-
const NAMESPACES = [];
|
|
2466
|
-
const NAMESPACES_BY_ID = Object.create(null);
|
|
2467
|
-
function addNamespace(namespace) {
|
|
2468
|
-
flags.unprocessedNamespaces = true;
|
|
2469
|
-
NAMESPACES.push(namespace);
|
|
2470
|
-
}
|
|
2471
|
-
function removeNamespace(namespace) {
|
|
2472
|
-
let name = getName(namespace);
|
|
2473
|
-
delete NAMESPACES_BY_ID[name];
|
|
2474
|
-
NAMESPACES.splice(NAMESPACES.indexOf(namespace), 1);
|
|
2475
|
-
|
|
2476
|
-
if (name in context.lookup && namespace === context.lookup[name]) {
|
|
2477
|
-
context.lookup[name] = undefined;
|
|
2478
|
-
}
|
|
2479
|
-
}
|
|
2480
|
-
function findNamespaces() {
|
|
2481
|
-
if (!flags.unprocessedNamespaces) {
|
|
2482
|
-
return;
|
|
2483
|
-
}
|
|
2484
|
-
|
|
2485
|
-
let lookup = context.lookup;
|
|
2486
|
-
let keys = Object.keys(lookup);
|
|
2487
|
-
|
|
2488
|
-
for (let key of keys) {
|
|
2489
|
-
// Only process entities that start with uppercase A-Z
|
|
2490
|
-
if (!isUppercase(key.charCodeAt(0))) {
|
|
2491
|
-
continue;
|
|
2492
|
-
}
|
|
2493
|
-
|
|
2494
|
-
let obj = tryIsNamespace(lookup, key);
|
|
2495
|
-
|
|
2496
|
-
if (obj) {
|
|
2497
|
-
setName(obj, key);
|
|
2498
|
-
}
|
|
2499
|
-
}
|
|
2500
|
-
}
|
|
2501
|
-
function findNamespace(name) {
|
|
2502
|
-
if (!searchDisabled) {
|
|
2503
|
-
processAllNamespaces();
|
|
2504
|
-
}
|
|
2505
|
-
|
|
2506
|
-
return NAMESPACES_BY_ID[name];
|
|
2507
|
-
}
|
|
2508
|
-
function processNamespace(namespace) {
|
|
2509
|
-
_processNamespace([namespace.toString()], namespace, new Set());
|
|
2510
|
-
}
|
|
2511
|
-
function processAllNamespaces() {
|
|
2512
|
-
let unprocessedNamespaces = flags.unprocessedNamespaces;
|
|
2513
|
-
|
|
2514
|
-
if (unprocessedNamespaces) {
|
|
2515
|
-
findNamespaces();
|
|
2516
|
-
flags.unprocessedNamespaces = false;
|
|
2517
|
-
}
|
|
2518
|
-
|
|
2519
|
-
if (unprocessedNamespaces || unprocessedMixins) {
|
|
2520
|
-
let namespaces = NAMESPACES;
|
|
2521
|
-
|
|
2522
|
-
for (let namespace of namespaces) {
|
|
2523
|
-
processNamespace(namespace);
|
|
2524
|
-
}
|
|
2525
|
-
|
|
2526
|
-
unprocessedMixins = false;
|
|
2527
|
-
}
|
|
2528
|
-
}
|
|
2529
|
-
function isSearchDisabled() {
|
|
2530
|
-
return searchDisabled;
|
|
2531
|
-
}
|
|
2532
|
-
function setSearchDisabled(flag) {
|
|
2533
|
-
searchDisabled = Boolean(flag);
|
|
2534
|
-
}
|
|
2535
|
-
function setUnprocessedMixins() {
|
|
2536
|
-
unprocessedMixins = true;
|
|
2537
|
-
}
|
|
2538
|
-
|
|
2539
|
-
function _processNamespace(paths, root, seen) {
|
|
2540
|
-
let idx = paths.length;
|
|
2541
|
-
let id = paths.join('.');
|
|
2542
|
-
NAMESPACES_BY_ID[id] = root;
|
|
2543
|
-
setName(root, id); // Loop over all of the keys in the namespace, looking for classes
|
|
2544
|
-
|
|
2545
|
-
for (let key in root) {
|
|
2546
|
-
if (!hasOwnProperty.call(root, key)) {
|
|
2547
|
-
continue;
|
|
2548
|
-
}
|
|
2549
|
-
|
|
2550
|
-
let obj = root[key]; // If we are processing the `Ember` namespace, for example, the
|
|
2551
|
-
// `paths` will start with `["Ember"]`. Every iteration through
|
|
2552
|
-
// the loop will update the **second** element of this list with
|
|
2553
|
-
// the key, so processing `Ember.View` will make the Array
|
|
2554
|
-
// `['Ember', 'View']`.
|
|
2555
|
-
|
|
2556
|
-
paths[idx] = key; // If we have found an unprocessed class
|
|
2557
|
-
|
|
2558
|
-
if (obj && getName(obj) === void 0) {
|
|
2559
|
-
// Replace the class' `toString` with the dot-separated path
|
|
2560
|
-
setName(obj, paths.join('.')); // Support nested namespaces
|
|
2561
|
-
} else if (obj && isNamespace(obj)) {
|
|
2562
|
-
// Skip aliased namespaces
|
|
2563
|
-
if (seen.has(obj)) {
|
|
2564
|
-
continue;
|
|
2565
|
-
}
|
|
2566
|
-
|
|
2567
|
-
seen.add(obj); // Process the child namespace
|
|
2568
|
-
|
|
2569
|
-
_processNamespace(paths, obj, seen);
|
|
2570
|
-
}
|
|
2571
|
-
}
|
|
2572
|
-
|
|
2573
|
-
paths.length = idx; // cut out last item
|
|
2574
|
-
}
|
|
2575
|
-
|
|
2576
|
-
function isNamespace(obj) {
|
|
2577
|
-
return obj != null && typeof obj === 'object' && obj.isNamespace;
|
|
2578
|
-
}
|
|
2579
|
-
|
|
2580
|
-
function isUppercase(code) {
|
|
2581
|
-
return code >= 65 && code <= 90 // A
|
|
2582
|
-
; // Z
|
|
2583
|
-
}
|
|
2584
|
-
|
|
2585
|
-
function tryIsNamespace(lookup, prop) {
|
|
2586
|
-
try {
|
|
2587
|
-
let obj = lookup[prop];
|
|
2588
|
-
return (obj !== null && typeof obj === 'object' || typeof obj === 'function') && obj.isNamespace && obj;
|
|
2589
|
-
} catch (e) {// continue
|
|
2590
|
-
}
|
|
2591
|
-
}
|
|
2592
|
-
|
|
2593
|
-
/**
|
|
2594
|
-
@module @ember/object
|
|
2595
|
-
*/
|
|
2596
|
-
const a_concat = Array.prototype.concat;
|
|
2597
|
-
const {
|
|
2598
|
-
isArray
|
|
2599
|
-
} = Array;
|
|
2600
|
-
|
|
2601
|
-
function extractAccessors(properties) {
|
|
2602
|
-
if (properties !== undefined) {
|
|
2603
|
-
for (let key of Object.keys(properties)) {
|
|
2604
|
-
let desc = Object.getOwnPropertyDescriptor(properties, key);
|
|
2605
|
-
|
|
2606
|
-
if (desc.get !== undefined || desc.set !== undefined) {
|
|
2607
|
-
Object.defineProperty(properties, key, {
|
|
2608
|
-
value: nativeDescDecorator(desc)
|
|
2609
|
-
});
|
|
2610
|
-
}
|
|
2611
|
-
}
|
|
2612
|
-
}
|
|
2613
|
-
|
|
2614
|
-
return properties;
|
|
2615
|
-
}
|
|
2616
|
-
|
|
2617
|
-
function concatenatedMixinProperties(concatProp, props, values, base) {
|
|
2618
|
-
// reset before adding each new mixin to pickup concats from previous
|
|
2619
|
-
let concats = values[concatProp] || base[concatProp];
|
|
2620
|
-
|
|
2621
|
-
if (props[concatProp]) {
|
|
2622
|
-
concats = concats ? a_concat.call(concats, props[concatProp]) : props[concatProp];
|
|
2623
|
-
}
|
|
2624
|
-
|
|
2625
|
-
return concats;
|
|
2626
|
-
}
|
|
2627
|
-
|
|
2628
|
-
function giveDecoratorSuper(key, decorator, property, descs) {
|
|
2629
|
-
if (property === true) {
|
|
2630
|
-
return decorator;
|
|
2631
|
-
}
|
|
2632
|
-
|
|
2633
|
-
let originalGetter = property._getter;
|
|
2634
|
-
|
|
2635
|
-
if (originalGetter === undefined) {
|
|
2636
|
-
return decorator;
|
|
2637
|
-
}
|
|
2638
|
-
|
|
2639
|
-
let superDesc = descs[key]; // Check to see if the super property is a decorator first, if so load its descriptor
|
|
2640
|
-
|
|
2641
|
-
let superProperty = typeof superDesc === 'function' ? descriptorForDecorator(superDesc) : superDesc;
|
|
2642
|
-
|
|
2643
|
-
if (superProperty === undefined || superProperty === true) {
|
|
2644
|
-
return decorator;
|
|
2645
|
-
}
|
|
2646
|
-
|
|
2647
|
-
let superGetter = superProperty._getter;
|
|
2648
|
-
|
|
2649
|
-
if (superGetter === undefined) {
|
|
2650
|
-
return decorator;
|
|
2651
|
-
}
|
|
2652
|
-
|
|
2653
|
-
let get = wrap(originalGetter, superGetter);
|
|
2654
|
-
let set;
|
|
2655
|
-
let originalSetter = property._setter;
|
|
2656
|
-
let superSetter = superProperty._setter;
|
|
2657
|
-
|
|
2658
|
-
if (superSetter !== undefined) {
|
|
2659
|
-
if (originalSetter !== undefined) {
|
|
2660
|
-
set = wrap(originalSetter, superSetter);
|
|
2661
|
-
} else {
|
|
2662
|
-
// If the super property has a setter, we default to using it no matter what.
|
|
2663
|
-
// This is clearly very broken and weird, but it's what was here so we have
|
|
2664
|
-
// to keep it until the next major at least.
|
|
2665
|
-
//
|
|
2666
|
-
// TODO: Add a deprecation here.
|
|
2667
|
-
set = superSetter;
|
|
2668
|
-
}
|
|
2669
|
-
} else {
|
|
2670
|
-
set = originalSetter;
|
|
2671
|
-
} // only create a new CP if we must
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
if (get !== originalGetter || set !== originalSetter) {
|
|
2675
|
-
// Since multiple mixins may inherit from the same parent, we need
|
|
2676
|
-
// to clone the computed property so that other mixins do not receive
|
|
2677
|
-
// the wrapped version.
|
|
2678
|
-
let dependentKeys = property._dependentKeys || [];
|
|
2679
|
-
let newProperty = new ComputedProperty([...dependentKeys, {
|
|
2680
|
-
get,
|
|
2681
|
-
set
|
|
2682
|
-
}]);
|
|
2683
|
-
newProperty._readOnly = property._readOnly;
|
|
2684
|
-
newProperty._meta = property._meta;
|
|
2685
|
-
newProperty.enumerable = property.enumerable; // SAFETY: We passed in the impl for this class
|
|
2686
|
-
|
|
2687
|
-
return makeComputedDecorator(newProperty, ComputedProperty);
|
|
2688
|
-
}
|
|
2689
|
-
|
|
2690
|
-
return decorator;
|
|
2691
|
-
}
|
|
2692
|
-
|
|
2693
|
-
function giveMethodSuper(key, method, values, descs) {
|
|
2694
|
-
// Methods overwrite computed properties, and do not call super to them.
|
|
2695
|
-
if (descs[key] !== undefined) {
|
|
2696
|
-
return method;
|
|
2697
|
-
} // Find the original method in a parent mixin
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
let superMethod = values[key]; // Only wrap the new method if the original method was a function
|
|
2701
|
-
|
|
2702
|
-
if (typeof superMethod === 'function') {
|
|
2703
|
-
return wrap(method, superMethod);
|
|
2704
|
-
}
|
|
2705
|
-
|
|
2706
|
-
return method;
|
|
2707
|
-
}
|
|
2708
|
-
|
|
2709
|
-
function applyConcatenatedProperties(key, value, values) {
|
|
2710
|
-
let baseValue = values[key];
|
|
2711
|
-
let ret = makeArray(baseValue).concat(makeArray(value));
|
|
2712
|
-
|
|
2713
|
-
if (DEBUG) {
|
|
2714
|
-
// it is possible to use concatenatedProperties with strings (which cannot be frozen)
|
|
2715
|
-
// only freeze objects...
|
|
2716
|
-
if (typeof ret === 'object' && ret !== null) {
|
|
2717
|
-
// prevent mutating `concatenatedProperties` array after it is applied
|
|
2718
|
-
Object.freeze(ret);
|
|
2719
|
-
}
|
|
2720
|
-
}
|
|
2721
|
-
|
|
2722
|
-
return ret;
|
|
2723
|
-
}
|
|
2724
|
-
|
|
2725
|
-
function applyMergedProperties(key, value, values) {
|
|
2726
|
-
let baseValue = values[key];
|
|
2727
|
-
assert(`You passed in \`${JSON.stringify(value)}\` as the value for \`${key}\` but \`${key}\` cannot be an Array`, !isArray(value));
|
|
2728
|
-
|
|
2729
|
-
if (!baseValue) {
|
|
2730
|
-
return value;
|
|
2731
|
-
}
|
|
2732
|
-
|
|
2733
|
-
let newBase = Object.assign({}, baseValue);
|
|
2734
|
-
let hasFunction = false;
|
|
2735
|
-
let props = Object.keys(value);
|
|
2736
|
-
|
|
2737
|
-
for (let prop of props) {
|
|
2738
|
-
let propValue = value[prop];
|
|
2739
|
-
|
|
2740
|
-
if (typeof propValue === 'function') {
|
|
2741
|
-
hasFunction = true;
|
|
2742
|
-
newBase[prop] = giveMethodSuper(prop, propValue, baseValue, {});
|
|
2743
|
-
} else {
|
|
2744
|
-
newBase[prop] = propValue;
|
|
2745
|
-
}
|
|
2746
|
-
}
|
|
2747
|
-
|
|
2748
|
-
if (hasFunction) {
|
|
2749
|
-
newBase._super = ROOT;
|
|
2750
|
-
}
|
|
2751
|
-
|
|
2752
|
-
return newBase;
|
|
2753
|
-
}
|
|
2754
|
-
|
|
2755
|
-
function mergeMixins(mixins, meta$$1, descs, values, base, keys, keysWithSuper) {
|
|
2756
|
-
let currentMixin;
|
|
2757
|
-
|
|
2758
|
-
for (let i = 0; i < mixins.length; i++) {
|
|
2759
|
-
currentMixin = mixins[i];
|
|
2760
|
-
assert(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(currentMixin)}`, typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]');
|
|
2761
|
-
|
|
2762
|
-
if (MIXINS.has(currentMixin)) {
|
|
2763
|
-
if (meta$$1.hasMixin(currentMixin)) {
|
|
2764
|
-
continue;
|
|
2765
|
-
}
|
|
2766
|
-
|
|
2767
|
-
meta$$1.addMixin(currentMixin);
|
|
2768
|
-
let {
|
|
2769
|
-
properties,
|
|
2770
|
-
mixins
|
|
2771
|
-
} = currentMixin;
|
|
2772
|
-
|
|
2773
|
-
if (properties !== undefined) {
|
|
2774
|
-
mergeProps(meta$$1, properties, descs, values, base, keys, keysWithSuper);
|
|
2775
|
-
} else if (mixins !== undefined) {
|
|
2776
|
-
mergeMixins(mixins, meta$$1, descs, values, base, keys, keysWithSuper);
|
|
2777
|
-
|
|
2778
|
-
if (currentMixin instanceof Mixin && currentMixin._without !== undefined) {
|
|
2779
|
-
currentMixin._without.forEach(keyName => {
|
|
2780
|
-
// deleting the key means we won't process the value
|
|
2781
|
-
let index = keys.indexOf(keyName);
|
|
2782
|
-
|
|
2783
|
-
if (index !== -1) {
|
|
2784
|
-
keys.splice(index, 1);
|
|
2785
|
-
}
|
|
2786
|
-
});
|
|
2787
|
-
}
|
|
2788
|
-
}
|
|
2789
|
-
} else {
|
|
2790
|
-
mergeProps(meta$$1, currentMixin, descs, values, base, keys, keysWithSuper);
|
|
2791
|
-
}
|
|
2792
|
-
}
|
|
2793
|
-
}
|
|
2794
|
-
|
|
2795
|
-
function mergeProps(meta$$1, props, descs, values, base, keys, keysWithSuper) {
|
|
2796
|
-
let concats = concatenatedMixinProperties('concatenatedProperties', props, values, base);
|
|
2797
|
-
let mergings = concatenatedMixinProperties('mergedProperties', props, values, base);
|
|
2798
|
-
let propKeys = Object.keys(props);
|
|
2799
|
-
|
|
2800
|
-
for (let key of propKeys) {
|
|
2801
|
-
let value = props[key];
|
|
2802
|
-
if (value === undefined) continue;
|
|
2803
|
-
|
|
2804
|
-
if (keys.indexOf(key) === -1) {
|
|
2805
|
-
keys.push(key);
|
|
2806
|
-
let desc = meta$$1.peekDescriptors(key);
|
|
2807
|
-
|
|
2808
|
-
if (desc === undefined) {
|
|
2809
|
-
// The superclass did not have a CP, which means it may have
|
|
2810
|
-
// observers or listeners on that property.
|
|
2811
|
-
let prev = values[key] = base[key];
|
|
2812
|
-
|
|
2813
|
-
if (typeof prev === 'function') {
|
|
2814
|
-
updateObserversAndListeners(base, key, prev, false);
|
|
2815
|
-
}
|
|
2816
|
-
} else {
|
|
2817
|
-
descs[key] = desc; // The super desc will be overwritten on descs, so save off the fact that
|
|
2818
|
-
// there was a super so we know to Object.defineProperty when writing
|
|
2819
|
-
// the value
|
|
2820
|
-
|
|
2821
|
-
keysWithSuper.push(key);
|
|
2822
|
-
desc.teardown(base, key, meta$$1);
|
|
2823
|
-
}
|
|
2824
|
-
}
|
|
2825
|
-
|
|
2826
|
-
let isFunction = typeof value === 'function';
|
|
2827
|
-
|
|
2828
|
-
if (isFunction) {
|
|
2829
|
-
let desc = descriptorForDecorator(value);
|
|
2830
|
-
|
|
2831
|
-
if (desc !== undefined) {
|
|
2832
|
-
// Wrap descriptor function to implement _super() if needed
|
|
2833
|
-
descs[key] = giveDecoratorSuper(key, value, desc, descs);
|
|
2834
|
-
values[key] = undefined;
|
|
2835
|
-
continue;
|
|
2836
|
-
}
|
|
2837
|
-
}
|
|
2838
|
-
|
|
2839
|
-
if (concats && concats.indexOf(key) >= 0 || key === 'concatenatedProperties' || key === 'mergedProperties') {
|
|
2840
|
-
value = applyConcatenatedProperties(key, value, values);
|
|
2841
|
-
} else if (mergings && mergings.indexOf(key) > -1) {
|
|
2842
|
-
value = applyMergedProperties(key, value, values);
|
|
2843
|
-
} else if (isFunction) {
|
|
2844
|
-
value = giveMethodSuper(key, value, values, descs);
|
|
2845
|
-
}
|
|
2846
|
-
|
|
2847
|
-
values[key] = value;
|
|
2848
|
-
descs[key] = undefined;
|
|
2849
|
-
}
|
|
2850
|
-
}
|
|
2851
|
-
|
|
2852
|
-
function updateObserversAndListeners(obj, key, fn, add) {
|
|
2853
|
-
let meta$$1 = observerListenerMetaFor(fn);
|
|
2854
|
-
if (meta$$1 === undefined) return;
|
|
2855
|
-
let {
|
|
2856
|
-
observers,
|
|
2857
|
-
listeners
|
|
2858
|
-
} = meta$$1;
|
|
2859
|
-
|
|
2860
|
-
if (observers !== undefined) {
|
|
2861
|
-
let updateObserver = add ? addObserver : removeObserver;
|
|
2862
|
-
|
|
2863
|
-
for (let path of observers.paths) {
|
|
2864
|
-
updateObserver(obj, path, null, key, observers.sync);
|
|
2865
|
-
}
|
|
2866
|
-
}
|
|
2867
|
-
|
|
2868
|
-
if (listeners !== undefined) {
|
|
2869
|
-
let updateListener = add ? addListener : removeListener;
|
|
2870
|
-
|
|
2871
|
-
for (let listener of listeners) {
|
|
2872
|
-
updateListener(obj, listener, null, key);
|
|
2873
|
-
}
|
|
2874
|
-
}
|
|
2875
|
-
}
|
|
2876
|
-
|
|
2877
|
-
function applyMixin(obj, mixins, _hideKeys = false) {
|
|
2878
|
-
let descs = Object.create(null);
|
|
2879
|
-
let values = Object.create(null);
|
|
2880
|
-
let meta$$1 = meta(obj);
|
|
2881
|
-
let keys = [];
|
|
2882
|
-
let keysWithSuper = [];
|
|
2883
|
-
obj._super = ROOT; // Go through all mixins and hashes passed in, and:
|
|
2884
|
-
//
|
|
2885
|
-
// * Handle concatenated properties
|
|
2886
|
-
// * Handle merged properties
|
|
2887
|
-
// * Set up _super wrapping if necessary
|
|
2888
|
-
// * Set up computed property descriptors
|
|
2889
|
-
// * Copying `toString` in broken browsers
|
|
2890
|
-
|
|
2891
|
-
mergeMixins(mixins, meta$$1, descs, values, obj, keys, keysWithSuper);
|
|
2892
|
-
|
|
2893
|
-
for (let key of keys) {
|
|
2894
|
-
let value = values[key];
|
|
2895
|
-
let desc = descs[key];
|
|
2896
|
-
|
|
2897
|
-
if (value !== undefined) {
|
|
2898
|
-
if (typeof value === 'function') {
|
|
2899
|
-
updateObserversAndListeners(obj, key, value, true);
|
|
2900
|
-
}
|
|
2901
|
-
|
|
2902
|
-
defineValue(obj, key, value, keysWithSuper.indexOf(key) !== -1, !_hideKeys);
|
|
2903
|
-
} else if (desc !== undefined) {
|
|
2904
|
-
defineDecorator(obj, key, desc, meta$$1);
|
|
2905
|
-
}
|
|
2906
|
-
}
|
|
2907
|
-
|
|
2908
|
-
if (!meta$$1.isPrototypeMeta(obj)) {
|
|
2909
|
-
revalidateObservers(obj);
|
|
2910
|
-
}
|
|
2911
|
-
|
|
2912
|
-
return obj;
|
|
2913
|
-
}
|
|
2914
|
-
/**
|
|
2915
|
-
@method mixin
|
|
2916
|
-
@param obj
|
|
2917
|
-
@param mixins*
|
|
2918
|
-
@return obj
|
|
2919
|
-
@private
|
|
2920
|
-
*/
|
|
2921
|
-
|
|
2922
|
-
function mixin(obj, ...args) {
|
|
2923
|
-
applyMixin(obj, args);
|
|
2924
|
-
return obj;
|
|
2925
|
-
}
|
|
2926
|
-
const MIXINS = new _WeakSet();
|
|
2927
|
-
/**
|
|
2928
|
-
The `Mixin` class allows you to create mixins, whose properties can be
|
|
2929
|
-
added to other classes. For instance,
|
|
2930
|
-
|
|
2931
|
-
```javascript
|
|
2932
|
-
import Mixin from '@ember/object/mixin';
|
|
2933
|
-
|
|
2934
|
-
const EditableMixin = Mixin.create({
|
|
2935
|
-
edit() {
|
|
2936
|
-
console.log('starting to edit');
|
|
2937
|
-
this.set('isEditing', true);
|
|
2938
|
-
},
|
|
2939
|
-
isEditing: false
|
|
2940
|
-
});
|
|
2941
|
-
```
|
|
2942
|
-
|
|
2943
|
-
```javascript
|
|
2944
|
-
import EmberObject from '@ember/object';
|
|
2945
|
-
import EditableMixin from '../mixins/editable';
|
|
2946
|
-
|
|
2947
|
-
// Mix mixins into classes by passing them as the first arguments to
|
|
2948
|
-
// `.extend.`
|
|
2949
|
-
const Comment = EmberObject.extend(EditableMixin, {
|
|
2950
|
-
post: null
|
|
2951
|
-
});
|
|
2952
|
-
|
|
2953
|
-
let comment = Comment.create({
|
|
2954
|
-
post: somePost
|
|
2955
|
-
});
|
|
2956
|
-
|
|
2957
|
-
comment.edit(); // outputs 'starting to edit'
|
|
2958
|
-
```
|
|
2959
|
-
|
|
2960
|
-
Note that Mixins are created with `Mixin.create`, not
|
|
2961
|
-
`Mixin.extend`.
|
|
2962
|
-
|
|
2963
|
-
Note that mixins extend a constructor's prototype so arrays and object literals
|
|
2964
|
-
defined as properties will be shared amongst objects that implement the mixin.
|
|
2965
|
-
If you want to define a property in a mixin that is not shared, you can define
|
|
2966
|
-
it either as a computed property or have it be created on initialization of the object.
|
|
2967
|
-
|
|
2968
|
-
```javascript
|
|
2969
|
-
// filters array will be shared amongst any object implementing mixin
|
|
2970
|
-
import Mixin from '@ember/object/mixin';
|
|
2971
|
-
import { A } from '@ember/array';
|
|
2972
|
-
|
|
2973
|
-
const FilterableMixin = Mixin.create({
|
|
2974
|
-
filters: A()
|
|
2975
|
-
});
|
|
2976
|
-
```
|
|
2977
|
-
|
|
2978
|
-
```javascript
|
|
2979
|
-
import Mixin from '@ember/object/mixin';
|
|
2980
|
-
import { A } from '@ember/array';
|
|
2981
|
-
import { computed } from '@ember/object';
|
|
2982
|
-
|
|
2983
|
-
// filters will be a separate array for every object implementing the mixin
|
|
2984
|
-
const FilterableMixin = Mixin.create({
|
|
2985
|
-
filters: computed(function() {
|
|
2986
|
-
return A();
|
|
2987
|
-
})
|
|
2988
|
-
});
|
|
2989
|
-
```
|
|
2990
|
-
|
|
2991
|
-
```javascript
|
|
2992
|
-
import Mixin from '@ember/object/mixin';
|
|
2993
|
-
import { A } from '@ember/array';
|
|
2994
|
-
|
|
2995
|
-
// filters will be created as a separate array during the object's initialization
|
|
2996
|
-
const Filterable = Mixin.create({
|
|
2997
|
-
filters: null,
|
|
2998
|
-
|
|
2999
|
-
init() {
|
|
3000
|
-
this._super(...arguments);
|
|
3001
|
-
this.set("filters", A());
|
|
3002
|
-
}
|
|
3003
|
-
});
|
|
3004
|
-
```
|
|
3005
|
-
|
|
3006
|
-
@class Mixin
|
|
3007
|
-
@public
|
|
3008
|
-
*/
|
|
3009
|
-
|
|
3010
|
-
class Mixin {
|
|
3011
|
-
/** @internal */
|
|
3012
|
-
constructor(mixins, properties) {
|
|
3013
|
-
MIXINS.add(this);
|
|
3014
|
-
this.properties = extractAccessors(properties);
|
|
3015
|
-
this.mixins = buildMixinsArray(mixins);
|
|
3016
|
-
this.ownerConstructor = undefined;
|
|
3017
|
-
this._without = undefined;
|
|
3018
|
-
|
|
3019
|
-
if (DEBUG) {
|
|
3020
|
-
// Eagerly add INIT_FACTORY to avoid issues in DEBUG as a result of Object.seal(mixin)
|
|
3021
|
-
this[INIT_FACTORY] = null;
|
|
3022
|
-
/*
|
|
3023
|
-
In debug builds, we seal mixins to help avoid performance pitfalls.
|
|
3024
|
-
In IE11 there is a quirk that prevents sealed objects from being added
|
|
3025
|
-
to a WeakMap. Unfortunately, the mixin system currently relies on
|
|
3026
|
-
weak maps in `guidFor`, so we need to prime the guid cache weak map.
|
|
3027
|
-
*/
|
|
3028
|
-
|
|
3029
|
-
guidFor(this);
|
|
3030
|
-
|
|
3031
|
-
if (Mixin._disableDebugSeal !== true) {
|
|
3032
|
-
Object.seal(this);
|
|
3033
|
-
}
|
|
3034
|
-
}
|
|
3035
|
-
}
|
|
3036
|
-
/**
|
|
3037
|
-
@method create
|
|
3038
|
-
@for @ember/object/mixin
|
|
3039
|
-
@static
|
|
3040
|
-
@param arguments*
|
|
3041
|
-
@public
|
|
3042
|
-
*/
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
static create(...args) {
|
|
3046
|
-
setUnprocessedMixins();
|
|
3047
|
-
let M = this;
|
|
3048
|
-
return new M(args, undefined);
|
|
3049
|
-
} // returns the mixins currently applied to the specified object
|
|
3050
|
-
// TODO: Make `mixin`
|
|
3051
|
-
|
|
3052
|
-
/** @internal */
|
|
3053
|
-
|
|
3054
|
-
|
|
3055
|
-
static mixins(obj) {
|
|
3056
|
-
let meta$$1 = peekMeta(obj);
|
|
3057
|
-
let ret = [];
|
|
3058
|
-
|
|
3059
|
-
if (meta$$1 === null) {
|
|
3060
|
-
return ret;
|
|
3061
|
-
}
|
|
3062
|
-
|
|
3063
|
-
meta$$1.forEachMixins(currentMixin => {
|
|
3064
|
-
// skip primitive mixins since these are always anonymous
|
|
3065
|
-
if (!currentMixin.properties) {
|
|
3066
|
-
ret.push(currentMixin);
|
|
3067
|
-
}
|
|
3068
|
-
});
|
|
3069
|
-
return ret;
|
|
3070
|
-
}
|
|
3071
|
-
/**
|
|
3072
|
-
@method reopen
|
|
3073
|
-
@param arguments*
|
|
3074
|
-
@private
|
|
3075
|
-
@internal
|
|
3076
|
-
*/
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
reopen(...args) {
|
|
3080
|
-
if (args.length === 0) {
|
|
3081
|
-
return;
|
|
3082
|
-
}
|
|
3083
|
-
|
|
3084
|
-
if (this.properties) {
|
|
3085
|
-
let currentMixin = new Mixin(undefined, this.properties);
|
|
3086
|
-
this.properties = undefined;
|
|
3087
|
-
this.mixins = [currentMixin];
|
|
3088
|
-
} else if (!this.mixins) {
|
|
3089
|
-
this.mixins = [];
|
|
3090
|
-
}
|
|
3091
|
-
|
|
3092
|
-
this.mixins = this.mixins.concat(buildMixinsArray(args));
|
|
3093
|
-
return this;
|
|
3094
|
-
}
|
|
3095
|
-
/**
|
|
3096
|
-
@method apply
|
|
3097
|
-
@param obj
|
|
3098
|
-
@return applied object
|
|
3099
|
-
@private
|
|
3100
|
-
@internal
|
|
3101
|
-
*/
|
|
3102
|
-
|
|
3103
|
-
|
|
3104
|
-
apply(obj, _hideKeys = false) {
|
|
3105
|
-
// Ember.NativeArray is a normal Ember.Mixin that we mix into `Array.prototype` when prototype extensions are enabled
|
|
3106
|
-
// mutating a native object prototype like this should _not_ result in enumerable properties being added (or we have significant
|
|
3107
|
-
// issues with things like deep equality checks from test frameworks, or things like jQuery.extend(true, [], [])).
|
|
3108
|
-
//
|
|
3109
|
-
// _hideKeys disables enumerablity when applying the mixin. This is a hack, and we should stop mutating the array prototype by default 😫
|
|
3110
|
-
return applyMixin(obj, [this], _hideKeys);
|
|
3111
|
-
}
|
|
3112
|
-
/** @internal */
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
applyPartial(obj) {
|
|
3116
|
-
return applyMixin(obj, [this]);
|
|
3117
|
-
}
|
|
3118
|
-
/**
|
|
3119
|
-
@method detect
|
|
3120
|
-
@param obj
|
|
3121
|
-
@return {Boolean}
|
|
3122
|
-
@private
|
|
3123
|
-
@internal
|
|
3124
|
-
*/
|
|
3125
|
-
|
|
3126
|
-
|
|
3127
|
-
detect(obj) {
|
|
3128
|
-
if (typeof obj !== 'object' || obj === null) {
|
|
3129
|
-
return false;
|
|
3130
|
-
}
|
|
3131
|
-
|
|
3132
|
-
if (MIXINS.has(obj)) {
|
|
3133
|
-
return _detect(obj, this);
|
|
3134
|
-
}
|
|
3135
|
-
|
|
3136
|
-
let meta$$1 = peekMeta(obj);
|
|
3137
|
-
|
|
3138
|
-
if (meta$$1 === null) {
|
|
3139
|
-
return false;
|
|
2167
|
+
this._registry.splice(index, 0, {
|
|
2168
|
+
name,
|
|
2169
|
+
version
|
|
2170
|
+
});
|
|
2171
|
+
} else {
|
|
2172
|
+
warn(`Library "${name}" is already registered with Ember.`, false, {
|
|
2173
|
+
id: 'ember-metal.libraries-register'
|
|
2174
|
+
});
|
|
3140
2175
|
}
|
|
3141
|
-
|
|
3142
|
-
return meta$$1.hasMixin(this);
|
|
3143
2176
|
}
|
|
3144
|
-
/** @internal */
|
|
3145
2177
|
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
let ret = new Mixin([this]);
|
|
3149
|
-
ret._without = args;
|
|
3150
|
-
return ret;
|
|
2178
|
+
registerCoreLibrary(name, version) {
|
|
2179
|
+
this.register(name, version, true);
|
|
3151
2180
|
}
|
|
3152
|
-
/** @internal */
|
|
3153
|
-
|
|
3154
2181
|
|
|
3155
|
-
|
|
3156
|
-
let
|
|
2182
|
+
deRegister(name) {
|
|
2183
|
+
let lib = this._getLibraryByName(name);
|
|
3157
2184
|
|
|
3158
|
-
|
|
3159
|
-
return keys;
|
|
3160
|
-
}
|
|
3161
|
-
/** @internal */
|
|
2185
|
+
let index;
|
|
3162
2186
|
|
|
2187
|
+
if (lib) {
|
|
2188
|
+
index = this._registry.indexOf(lib);
|
|
3163
2189
|
|
|
3164
|
-
|
|
3165
|
-
|
|
2190
|
+
this._registry.splice(index, 1);
|
|
2191
|
+
}
|
|
3166
2192
|
}
|
|
3167
2193
|
|
|
3168
2194
|
}
|
|
3169
2195
|
|
|
3170
2196
|
if (DEBUG) {
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
}
|
|
3178
|
-
|
|
3179
|
-
function buildMixinsArray(mixins) {
|
|
3180
|
-
let length = mixins && mixins.length || 0;
|
|
3181
|
-
let m = undefined;
|
|
3182
|
-
|
|
3183
|
-
if (length > 0) {
|
|
3184
|
-
m = new Array(length);
|
|
3185
|
-
|
|
3186
|
-
for (let i = 0; i < length; i++) {
|
|
3187
|
-
let x = mixins[i];
|
|
3188
|
-
assert(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(x)}`, typeof x === 'object' && x !== null && Object.prototype.toString.call(x) !== '[object Array]');
|
|
2197
|
+
Libraries.prototype.logVersions = function () {
|
|
2198
|
+
let libs = this._registry;
|
|
2199
|
+
let nameLengths = libs.map(item => get(item, 'name.length'));
|
|
2200
|
+
assert('nameLengths is number array', nameLengths instanceof Array && nameLengths.every(n => typeof n === 'number'));
|
|
2201
|
+
let maxNameLength = Math.max.apply(null, nameLengths);
|
|
2202
|
+
debug('-------------------------------');
|
|
3189
2203
|
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
m[i] = new Mixin(undefined, x);
|
|
3194
|
-
}
|
|
2204
|
+
for (let lib of libs) {
|
|
2205
|
+
let spaces = new Array(maxNameLength - lib.name.length + 1).join(' ');
|
|
2206
|
+
debug([lib.name, spaces, ' : ', lib.version].join(''));
|
|
3195
2207
|
}
|
|
3196
|
-
}
|
|
3197
|
-
|
|
3198
|
-
return m;
|
|
3199
|
-
}
|
|
3200
2208
|
|
|
3201
|
-
|
|
3202
|
-
|
|
2209
|
+
debug('-------------------------------');
|
|
2210
|
+
};
|
|
3203
2211
|
}
|
|
3204
2212
|
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
return false;
|
|
3208
|
-
}
|
|
2213
|
+
const LIBRARIES = new Libraries();
|
|
2214
|
+
LIBRARIES.registerCoreLibrary('Ember', VERSION);
|
|
3209
2215
|
|
|
3210
|
-
|
|
2216
|
+
function getProperties(obj, keys) {
|
|
2217
|
+
let ret = {};
|
|
2218
|
+
let propertyNames;
|
|
2219
|
+
let i = 1;
|
|
3211
2220
|
|
|
3212
|
-
if (
|
|
3213
|
-
|
|
2221
|
+
if (arguments.length === 2 && Array.isArray(keys)) {
|
|
2222
|
+
i = 0;
|
|
2223
|
+
propertyNames = arguments[1];
|
|
2224
|
+
} else {
|
|
2225
|
+
propertyNames = Array.from(arguments);
|
|
3214
2226
|
}
|
|
3215
2227
|
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
if (mixins) {
|
|
3219
|
-
return mixins.some(mixin => _detect(mixin, targetMixin, seen));
|
|
2228
|
+
for (; i < propertyNames.length; i++) {
|
|
2229
|
+
ret[propertyNames[i]] = get(obj, propertyNames[i]);
|
|
3220
2230
|
}
|
|
3221
2231
|
|
|
3222
|
-
return
|
|
2232
|
+
return ret;
|
|
3223
2233
|
}
|
|
3224
2234
|
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
}
|
|
3229
|
-
|
|
3230
|
-
seen.add(mixin);
|
|
3231
|
-
|
|
3232
|
-
if (mixin.properties) {
|
|
3233
|
-
let props = Object.keys(mixin.properties);
|
|
3234
|
-
|
|
3235
|
-
for (let prop of props) {
|
|
3236
|
-
ret.add(prop);
|
|
3237
|
-
}
|
|
3238
|
-
} else if (mixin.mixins) {
|
|
3239
|
-
mixin.mixins.forEach(x => _keys(x, ret, seen));
|
|
3240
|
-
}
|
|
2235
|
+
/**
|
|
2236
|
+
@module @ember/object
|
|
2237
|
+
*/
|
|
3241
2238
|
|
|
3242
|
-
return ret;
|
|
3243
|
-
}
|
|
3244
2239
|
/**
|
|
3245
|
-
|
|
2240
|
+
Set a list of properties on an object. These properties are set inside
|
|
2241
|
+
a single `beginPropertyChanges` and `endPropertyChanges` batch, so
|
|
2242
|
+
observers will be buffered.
|
|
3246
2243
|
|
|
3247
2244
|
```javascript
|
|
3248
2245
|
import EmberObject from '@ember/object';
|
|
3249
|
-
|
|
2246
|
+
let anObject = EmberObject.create();
|
|
3250
2247
|
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
2248
|
+
anObject.setProperties({
|
|
2249
|
+
firstName: 'Stanley',
|
|
2250
|
+
lastName: 'Stuart',
|
|
2251
|
+
age: 21
|
|
3255
2252
|
});
|
|
3256
2253
|
```
|
|
3257
2254
|
|
|
3258
|
-
|
|
3259
|
-
|
|
3260
|
-
|
|
3261
|
-
@method observer
|
|
2255
|
+
@method setProperties
|
|
2256
|
+
@static
|
|
3262
2257
|
@for @ember/object
|
|
3263
|
-
@param
|
|
3264
|
-
@param {
|
|
3265
|
-
@return
|
|
2258
|
+
@param obj
|
|
2259
|
+
@param {Object} properties
|
|
2260
|
+
@return properties
|
|
3266
2261
|
@public
|
|
3267
|
-
@static
|
|
3268
2262
|
*/
|
|
3269
2263
|
|
|
3270
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
assert('observer must be provided a function or an observer definition', typeof funcOrDef === 'function' || typeof funcOrDef === 'object' && funcOrDef !== null);
|
|
3274
|
-
let func;
|
|
3275
|
-
let dependentKeys;
|
|
3276
|
-
let sync;
|
|
3277
|
-
|
|
3278
|
-
if (typeof funcOrDef === 'function') {
|
|
3279
|
-
func = funcOrDef;
|
|
3280
|
-
dependentKeys = args;
|
|
3281
|
-
sync = !ENV._DEFAULT_ASYNC_OBSERVERS;
|
|
3282
|
-
} else {
|
|
3283
|
-
func = funcOrDef.fn;
|
|
3284
|
-
dependentKeys = funcOrDef.dependentKeys;
|
|
3285
|
-
sync = funcOrDef.sync;
|
|
2264
|
+
function setProperties(obj, properties) {
|
|
2265
|
+
if (properties === null || typeof properties !== 'object') {
|
|
2266
|
+
return properties;
|
|
3286
2267
|
}
|
|
3287
2268
|
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
assert('observer called without sync', typeof sync === 'boolean');
|
|
3291
|
-
let paths = [];
|
|
3292
|
-
|
|
3293
|
-
for (let dependentKey of dependentKeys) {
|
|
3294
|
-
expandProperties(dependentKey, path => paths.push(path));
|
|
3295
|
-
}
|
|
2269
|
+
changeProperties(() => {
|
|
2270
|
+
let props = Object.keys(properties);
|
|
3296
2271
|
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
2272
|
+
for (let propertyName of props) {
|
|
2273
|
+
set(obj, propertyName, properties[propertyName]);
|
|
2274
|
+
}
|
|
3300
2275
|
});
|
|
3301
|
-
return
|
|
2276
|
+
return properties;
|
|
3302
2277
|
}
|
|
3303
2278
|
|
|
3304
2279
|
let DEBUG_INJECTION_FUNCTIONS;
|
|
@@ -3598,4 +2573,149 @@ function throwCachedInvalidArgsError(args = []) {
|
|
|
3598
2573
|
@public
|
|
3599
2574
|
*/
|
|
3600
2575
|
|
|
3601
|
-
|
|
2576
|
+
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
2577
|
+
let searchDisabled = false;
|
|
2578
|
+
const flags = {
|
|
2579
|
+
_set: 0,
|
|
2580
|
+
_unprocessedNamespaces: false,
|
|
2581
|
+
|
|
2582
|
+
get unprocessedNamespaces() {
|
|
2583
|
+
return this._unprocessedNamespaces;
|
|
2584
|
+
},
|
|
2585
|
+
|
|
2586
|
+
set unprocessedNamespaces(v) {
|
|
2587
|
+
this._set++;
|
|
2588
|
+
this._unprocessedNamespaces = v;
|
|
2589
|
+
}
|
|
2590
|
+
|
|
2591
|
+
};
|
|
2592
|
+
let unprocessedMixins = false;
|
|
2593
|
+
const NAMESPACES = [];
|
|
2594
|
+
const NAMESPACES_BY_ID = Object.create(null);
|
|
2595
|
+
function addNamespace(namespace) {
|
|
2596
|
+
flags.unprocessedNamespaces = true;
|
|
2597
|
+
NAMESPACES.push(namespace);
|
|
2598
|
+
}
|
|
2599
|
+
function removeNamespace(namespace) {
|
|
2600
|
+
let name = getName(namespace);
|
|
2601
|
+
delete NAMESPACES_BY_ID[name];
|
|
2602
|
+
NAMESPACES.splice(NAMESPACES.indexOf(namespace), 1);
|
|
2603
|
+
|
|
2604
|
+
if (name in context.lookup && namespace === context.lookup[name]) {
|
|
2605
|
+
context.lookup[name] = undefined;
|
|
2606
|
+
}
|
|
2607
|
+
}
|
|
2608
|
+
function findNamespaces() {
|
|
2609
|
+
if (!flags.unprocessedNamespaces) {
|
|
2610
|
+
return;
|
|
2611
|
+
}
|
|
2612
|
+
|
|
2613
|
+
let lookup = context.lookup;
|
|
2614
|
+
let keys = Object.keys(lookup);
|
|
2615
|
+
|
|
2616
|
+
for (let key of keys) {
|
|
2617
|
+
// Only process entities that start with uppercase A-Z
|
|
2618
|
+
if (!isUppercase(key.charCodeAt(0))) {
|
|
2619
|
+
continue;
|
|
2620
|
+
}
|
|
2621
|
+
|
|
2622
|
+
let obj = tryIsNamespace(lookup, key);
|
|
2623
|
+
|
|
2624
|
+
if (obj) {
|
|
2625
|
+
setName(obj, key);
|
|
2626
|
+
}
|
|
2627
|
+
}
|
|
2628
|
+
}
|
|
2629
|
+
function findNamespace(name) {
|
|
2630
|
+
if (!searchDisabled) {
|
|
2631
|
+
processAllNamespaces();
|
|
2632
|
+
}
|
|
2633
|
+
|
|
2634
|
+
return NAMESPACES_BY_ID[name];
|
|
2635
|
+
}
|
|
2636
|
+
function processNamespace(namespace) {
|
|
2637
|
+
_processNamespace([namespace.toString()], namespace, new Set());
|
|
2638
|
+
}
|
|
2639
|
+
function processAllNamespaces() {
|
|
2640
|
+
let unprocessedNamespaces = flags.unprocessedNamespaces;
|
|
2641
|
+
|
|
2642
|
+
if (unprocessedNamespaces) {
|
|
2643
|
+
findNamespaces();
|
|
2644
|
+
flags.unprocessedNamespaces = false;
|
|
2645
|
+
}
|
|
2646
|
+
|
|
2647
|
+
if (unprocessedNamespaces || unprocessedMixins) {
|
|
2648
|
+
let namespaces = NAMESPACES;
|
|
2649
|
+
|
|
2650
|
+
for (let namespace of namespaces) {
|
|
2651
|
+
processNamespace(namespace);
|
|
2652
|
+
}
|
|
2653
|
+
|
|
2654
|
+
unprocessedMixins = false;
|
|
2655
|
+
}
|
|
2656
|
+
}
|
|
2657
|
+
function isSearchDisabled() {
|
|
2658
|
+
return searchDisabled;
|
|
2659
|
+
}
|
|
2660
|
+
function setSearchDisabled(flag) {
|
|
2661
|
+
searchDisabled = Boolean(flag);
|
|
2662
|
+
}
|
|
2663
|
+
function setUnprocessedMixins() {
|
|
2664
|
+
unprocessedMixins = true;
|
|
2665
|
+
}
|
|
2666
|
+
|
|
2667
|
+
function _processNamespace(paths, root, seen) {
|
|
2668
|
+
let idx = paths.length;
|
|
2669
|
+
let id = paths.join('.');
|
|
2670
|
+
NAMESPACES_BY_ID[id] = root;
|
|
2671
|
+
setName(root, id); // Loop over all of the keys in the namespace, looking for classes
|
|
2672
|
+
|
|
2673
|
+
for (let key in root) {
|
|
2674
|
+
if (!hasOwnProperty.call(root, key)) {
|
|
2675
|
+
continue;
|
|
2676
|
+
}
|
|
2677
|
+
|
|
2678
|
+
let obj = root[key]; // If we are processing the `Ember` namespace, for example, the
|
|
2679
|
+
// `paths` will start with `["Ember"]`. Every iteration through
|
|
2680
|
+
// the loop will update the **second** element of this list with
|
|
2681
|
+
// the key, so processing `Ember.View` will make the Array
|
|
2682
|
+
// `['Ember', 'View']`.
|
|
2683
|
+
|
|
2684
|
+
paths[idx] = key; // If we have found an unprocessed class
|
|
2685
|
+
|
|
2686
|
+
if (obj && getName(obj) === void 0) {
|
|
2687
|
+
// Replace the class' `toString` with the dot-separated path
|
|
2688
|
+
setName(obj, paths.join('.')); // Support nested namespaces
|
|
2689
|
+
} else if (obj && isNamespace(obj)) {
|
|
2690
|
+
// Skip aliased namespaces
|
|
2691
|
+
if (seen.has(obj)) {
|
|
2692
|
+
continue;
|
|
2693
|
+
}
|
|
2694
|
+
|
|
2695
|
+
seen.add(obj); // Process the child namespace
|
|
2696
|
+
|
|
2697
|
+
_processNamespace(paths, obj, seen);
|
|
2698
|
+
}
|
|
2699
|
+
}
|
|
2700
|
+
|
|
2701
|
+
paths.length = idx; // cut out last item
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
function isNamespace(obj) {
|
|
2705
|
+
return obj != null && typeof obj === 'object' && obj.isNamespace;
|
|
2706
|
+
}
|
|
2707
|
+
|
|
2708
|
+
function isUppercase(code) {
|
|
2709
|
+
return code >= 65 && code <= 90 // A
|
|
2710
|
+
; // Z
|
|
2711
|
+
}
|
|
2712
|
+
|
|
2713
|
+
function tryIsNamespace(lookup, prop) {
|
|
2714
|
+
try {
|
|
2715
|
+
let obj = lookup[prop];
|
|
2716
|
+
return (obj !== null && typeof obj === 'object' || typeof obj === 'function') && obj.isNamespace && obj;
|
|
2717
|
+
} catch (e) {// continue
|
|
2718
|
+
}
|
|
2719
|
+
}
|
|
2720
|
+
|
|
2721
|
+
export { computed, autoComputed, isComputed, ComputedProperty, getCachedValueFor, alias, deprecateProperty, PROXY_CONTENT, _getPath, get, _getProp, hasUnknownProperty, set, _setProp, trySet, objectAt, replace, replaceInNativeArray, addArrayObserver, removeArrayObserver, arrayContentWillChange, arrayContentDidChange, eachProxyArrayWillChange, eachProxyArrayDidChange, addListener, hasListeners, on, removeListener, sendEvent, beginPropertyChanges, changeProperties, endPropertyChanges, notifyPropertyChange, PROPERTY_DID_CHANGE, defineProperty, defineDecorator, defineValue, ComputedDescriptor, isElementDescriptor, nativeDescDecorator, descriptorForDecorator, descriptorForProperty, isClassicDecorator, setClassicDecorator, makeComputedDecorator, LIBRARIES as libraries, Libraries, getProperties, setProperties, expandProperties, ASYNC_OBSERVERS, SYNC_OBSERVERS, addObserver, activateObserver, removeObserver, flushAsyncObservers, revalidateObservers, inject, DEBUG_INJECTION_FUNCTIONS, tagForProperty, tagForObject, markObjectAsDirty, tracked, TrackedDescriptor, cached, NAMESPACES, NAMESPACES_BY_ID, addNamespace, findNamespace, findNamespaces, processNamespace, processAllNamespaces, removeNamespace, isSearchDisabled as isNamespaceSearchDisabled, setSearchDisabled as setNamespaceSearchDisabled, setUnprocessedMixins };
|