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 @@
|
|
|
1
|
-
export { MutableArray as default } from '@ember
|
|
1
|
+
export { MutableArray as default } from '@ember/array';
|
|
@@ -1 +1,307 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
@module @ember/array/proxy
|
|
3
|
+
*/
|
|
4
|
+
import { objectAt, alias, PROPERTY_DID_CHANGE, addArrayObserver, removeArrayObserver, replace, arrayContentDidChange, arrayContentWillChange, tagForProperty } from '@ember/-internals/metal';
|
|
5
|
+
import { get } from '@ember/object';
|
|
6
|
+
import { isObject } from '@ember/-internals/utils';
|
|
7
|
+
import EmberObject from '@ember/object';
|
|
8
|
+
import EmberArray from '@ember/array';
|
|
9
|
+
import MutableArray from '@ember/array/mutable';
|
|
10
|
+
import { assert } from '@ember/debug';
|
|
11
|
+
import { setCustomTagFor } from '@glimmer/manager';
|
|
12
|
+
import { combine, consumeTag, validateTag, valueForTag, tagFor } from '@glimmer/validator';
|
|
13
|
+
|
|
14
|
+
function isMutable(obj) {
|
|
15
|
+
return Array.isArray(obj) || typeof obj.replace === 'function';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const ARRAY_OBSERVER_MAPPING = {
|
|
19
|
+
willChange: '_arrangedContentArrayWillChange',
|
|
20
|
+
didChange: '_arrangedContentArrayDidChange'
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
function customTagForArrayProxy(proxy, key) {
|
|
24
|
+
assert('[BUG] Expected a proxy', proxy instanceof ArrayProxy);
|
|
25
|
+
|
|
26
|
+
if (key === '[]') {
|
|
27
|
+
proxy._revalidate();
|
|
28
|
+
|
|
29
|
+
return proxy._arrTag;
|
|
30
|
+
} else if (key === 'length') {
|
|
31
|
+
proxy._revalidate();
|
|
32
|
+
|
|
33
|
+
return proxy._lengthTag;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return tagFor(proxy, key);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
class ArrayProxy extends EmberObject {
|
|
40
|
+
constructor() {
|
|
41
|
+
super(...arguments);
|
|
42
|
+
/*
|
|
43
|
+
`this._objectsDirtyIndex` determines which indexes in the `this._objects`
|
|
44
|
+
cache are dirty.
|
|
45
|
+
If `this._objectsDirtyIndex === -1` then no indexes are dirty.
|
|
46
|
+
Otherwise, an index `i` is dirty if `i >= this._objectsDirtyIndex`.
|
|
47
|
+
Calling `objectAt` with a dirty index will cause the `this._objects`
|
|
48
|
+
cache to be recomputed.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
/** @internal */
|
|
52
|
+
|
|
53
|
+
this._objectsDirtyIndex = 0;
|
|
54
|
+
/** @internal */
|
|
55
|
+
|
|
56
|
+
this._objects = null;
|
|
57
|
+
/** @internal */
|
|
58
|
+
|
|
59
|
+
this._lengthDirty = true;
|
|
60
|
+
/** @internal */
|
|
61
|
+
|
|
62
|
+
this._length = 0;
|
|
63
|
+
/** @internal */
|
|
64
|
+
|
|
65
|
+
this._arrangedContent = null;
|
|
66
|
+
/** @internal */
|
|
67
|
+
|
|
68
|
+
this._arrangedContentIsUpdating = false;
|
|
69
|
+
/** @internal */
|
|
70
|
+
|
|
71
|
+
this._arrangedContentTag = null;
|
|
72
|
+
/** @internal */
|
|
73
|
+
|
|
74
|
+
this._arrangedContentRevision = null;
|
|
75
|
+
/** @internal */
|
|
76
|
+
|
|
77
|
+
this._lengthTag = null;
|
|
78
|
+
/** @internal */
|
|
79
|
+
|
|
80
|
+
this._arrTag = null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
init(props) {
|
|
84
|
+
super.init(props);
|
|
85
|
+
setCustomTagFor(this, customTagForArrayProxy);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
[PROPERTY_DID_CHANGE]() {
|
|
89
|
+
this._revalidate();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
willDestroy() {
|
|
93
|
+
this._removeArrangedContentArrayObserver();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
Should actually retrieve the object at the specified index from the
|
|
97
|
+
content. You can override this method in subclasses to transform the
|
|
98
|
+
content item to something new.
|
|
99
|
+
This method will only be called if content is non-`null`.
|
|
100
|
+
@method objectAtContent
|
|
101
|
+
@param {Number} idx The index to retrieve.
|
|
102
|
+
@return {Object} the value or undefined if none found
|
|
103
|
+
@public
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
objectAtContent(idx) {
|
|
108
|
+
let arrangedContent = get(this, 'arrangedContent');
|
|
109
|
+
assert('[BUG] Called objectAtContent without content', arrangedContent);
|
|
110
|
+
return objectAt(arrangedContent, idx);
|
|
111
|
+
} // See additional docs for `replace` from `MutableArray`:
|
|
112
|
+
// https://api.emberjs.com/ember/release/classes/MutableArray/methods/replace?anchor=replace
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
replace(idx, amt, objects) {
|
|
116
|
+
assert('Mutating an arranged ArrayProxy is not allowed', get(this, 'arrangedContent') === get(this, 'content'));
|
|
117
|
+
this.replaceContent(idx, amt, objects);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
Should actually replace the specified objects on the content array.
|
|
121
|
+
You can override this method in subclasses to transform the content item
|
|
122
|
+
into something new.
|
|
123
|
+
This method will only be called if content is non-`null`.
|
|
124
|
+
@method replaceContent
|
|
125
|
+
@param {Number} idx The starting index
|
|
126
|
+
@param {Number} amt The number of items to remove from the content.
|
|
127
|
+
@param {Array} objects Optional array of objects to insert.
|
|
128
|
+
@return {void}
|
|
129
|
+
@public
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
replaceContent(idx, amt, objects) {
|
|
134
|
+
let content = get(this, 'content');
|
|
135
|
+
assert('[BUG] Called replaceContent without content', content);
|
|
136
|
+
assert('Mutating a non-mutable array is not allowed', isMutable(content));
|
|
137
|
+
replace(content, idx, amt, objects);
|
|
138
|
+
} // Overriding objectAt is not supported.
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
objectAt(idx) {
|
|
142
|
+
this._revalidate();
|
|
143
|
+
|
|
144
|
+
if (this._objects === null) {
|
|
145
|
+
this._objects = [];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (this._objectsDirtyIndex !== -1 && idx >= this._objectsDirtyIndex) {
|
|
149
|
+
let arrangedContent = get(this, 'arrangedContent');
|
|
150
|
+
|
|
151
|
+
if (arrangedContent) {
|
|
152
|
+
let length = this._objects.length = get(arrangedContent, 'length');
|
|
153
|
+
|
|
154
|
+
for (let i = this._objectsDirtyIndex; i < length; i++) {
|
|
155
|
+
// SAFETY: This is expected to only ever return an instance of T. In other words, there should
|
|
156
|
+
// be no gaps in the array. Unfortunately, we can't actually assert for it since T could include
|
|
157
|
+
// any types, including null or undefined.
|
|
158
|
+
this._objects[i] = this.objectAtContent(i);
|
|
159
|
+
}
|
|
160
|
+
} else {
|
|
161
|
+
this._objects.length = 0;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
this._objectsDirtyIndex = -1;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return this._objects[idx];
|
|
168
|
+
} // Overriding length is not supported.
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
get length() {
|
|
172
|
+
this._revalidate();
|
|
173
|
+
|
|
174
|
+
if (this._lengthDirty) {
|
|
175
|
+
let arrangedContent = get(this, 'arrangedContent');
|
|
176
|
+
this._length = arrangedContent ? get(arrangedContent, 'length') : 0;
|
|
177
|
+
this._lengthDirty = false;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
assert('[BUG] _lengthTag is not set', this._lengthTag);
|
|
181
|
+
consumeTag(this._lengthTag);
|
|
182
|
+
return this._length;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
set length(value) {
|
|
186
|
+
let length = this.length;
|
|
187
|
+
let removedCount = length - value;
|
|
188
|
+
let added;
|
|
189
|
+
|
|
190
|
+
if (removedCount === 0) {
|
|
191
|
+
return;
|
|
192
|
+
} else if (removedCount < 0) {
|
|
193
|
+
added = new Array(-removedCount);
|
|
194
|
+
removedCount = 0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
let content = get(this, 'content');
|
|
198
|
+
|
|
199
|
+
if (content) {
|
|
200
|
+
assert('Mutating a non-mutable array is not allowed', isMutable(content));
|
|
201
|
+
replace(content, value, removedCount, added);
|
|
202
|
+
|
|
203
|
+
this._invalidate();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
_updateArrangedContentArray(arrangedContent) {
|
|
208
|
+
let oldLength = this._objects === null ? 0 : this._objects.length;
|
|
209
|
+
let newLength = arrangedContent ? get(arrangedContent, 'length') : 0;
|
|
210
|
+
|
|
211
|
+
this._removeArrangedContentArrayObserver();
|
|
212
|
+
|
|
213
|
+
arrayContentWillChange(this, 0, oldLength, newLength);
|
|
214
|
+
|
|
215
|
+
this._invalidate();
|
|
216
|
+
|
|
217
|
+
arrayContentDidChange(this, 0, oldLength, newLength, false);
|
|
218
|
+
|
|
219
|
+
this._addArrangedContentArrayObserver(arrangedContent);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
_addArrangedContentArrayObserver(arrangedContent) {
|
|
223
|
+
if (arrangedContent && !arrangedContent.isDestroyed) {
|
|
224
|
+
// @ts-expect-error This check is still good for ensuring correctness
|
|
225
|
+
assert("Can't set ArrayProxy's content to itself", arrangedContent !== this);
|
|
226
|
+
assert(`ArrayProxy expects a native Array, EmberArray, or ArrayProxy, but you passed ${typeof arrangedContent}`, function (arr) {
|
|
227
|
+
return Array.isArray(arr) || EmberArray.detect(arr);
|
|
228
|
+
}(arrangedContent));
|
|
229
|
+
assert('ArrayProxy expected its contents to not be destroyed', !arrangedContent.isDestroyed);
|
|
230
|
+
addArrayObserver(arrangedContent, this, ARRAY_OBSERVER_MAPPING);
|
|
231
|
+
this._arrangedContent = arrangedContent;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
_removeArrangedContentArrayObserver() {
|
|
236
|
+
if (this._arrangedContent) {
|
|
237
|
+
removeArrayObserver(this._arrangedContent, this, ARRAY_OBSERVER_MAPPING);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
_arrangedContentArrayWillChange() {}
|
|
242
|
+
|
|
243
|
+
_arrangedContentArrayDidChange(_proxy, idx, removedCnt, addedCnt) {
|
|
244
|
+
arrayContentWillChange(this, idx, removedCnt, addedCnt);
|
|
245
|
+
let dirtyIndex = idx;
|
|
246
|
+
|
|
247
|
+
if (dirtyIndex < 0) {
|
|
248
|
+
let length = get(this._arrangedContent, 'length');
|
|
249
|
+
dirtyIndex += length + removedCnt - addedCnt;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (this._objectsDirtyIndex === -1 || this._objectsDirtyIndex > dirtyIndex) {
|
|
253
|
+
this._objectsDirtyIndex = dirtyIndex;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
this._lengthDirty = true;
|
|
257
|
+
arrayContentDidChange(this, idx, removedCnt, addedCnt, false);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
_invalidate() {
|
|
261
|
+
this._objectsDirtyIndex = 0;
|
|
262
|
+
this._lengthDirty = true;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
_revalidate() {
|
|
266
|
+
if (this._arrangedContentIsUpdating === true) return;
|
|
267
|
+
|
|
268
|
+
if (this._arrangedContentTag === null || !validateTag(this._arrangedContentTag, this._arrangedContentRevision)) {
|
|
269
|
+
let arrangedContent = this.get('arrangedContent');
|
|
270
|
+
|
|
271
|
+
if (this._arrangedContentTag === null) {
|
|
272
|
+
// This is the first time the proxy has been setup, only add the observer
|
|
273
|
+
// don't trigger any events
|
|
274
|
+
this._addArrangedContentArrayObserver(arrangedContent);
|
|
275
|
+
} else {
|
|
276
|
+
this._arrangedContentIsUpdating = true;
|
|
277
|
+
|
|
278
|
+
this._updateArrangedContentArray(arrangedContent);
|
|
279
|
+
|
|
280
|
+
this._arrangedContentIsUpdating = false;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
let arrangedContentTag = this._arrangedContentTag = tagFor(this, 'arrangedContent');
|
|
284
|
+
this._arrangedContentRevision = valueForTag(this._arrangedContentTag);
|
|
285
|
+
|
|
286
|
+
if (isObject(arrangedContent)) {
|
|
287
|
+
this._lengthTag = combine([arrangedContentTag, tagForProperty(arrangedContent, 'length')]);
|
|
288
|
+
this._arrTag = combine([arrangedContentTag, tagForProperty(arrangedContent, '[]')]);
|
|
289
|
+
} else {
|
|
290
|
+
this._lengthTag = this._arrTag = arrangedContentTag;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
ArrayProxy.reopen(MutableArray, {
|
|
298
|
+
/**
|
|
299
|
+
The array that the proxy pretends to be. In the default `ArrayProxy`
|
|
300
|
+
implementation, this and `content` are the same. Subclasses of `ArrayProxy`
|
|
301
|
+
can override this property to provide things like sorting and filtering.
|
|
302
|
+
@property arrangedContent
|
|
303
|
+
@public
|
|
304
|
+
*/
|
|
305
|
+
arrangedContent: alias('content')
|
|
306
|
+
});
|
|
307
|
+
export default ArrayProxy;
|
|
@@ -11,8 +11,8 @@ import { ENV } from '@ember/-internals/environment';
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
export const DEFAULT_FEATURES = {
|
|
14
|
-
EMBER_LIBRARIES_ISREGISTERED:
|
|
15
|
-
EMBER_IMPROVED_INSTRUMENTATION:
|
|
14
|
+
EMBER_LIBRARIES_ISREGISTERED: false,
|
|
15
|
+
EMBER_IMPROVED_INSTRUMENTATION: false,
|
|
16
16
|
EMBER_UNIQUE_ID_HELPER: true,
|
|
17
17
|
EMBER_DEFAULT_HELPER_MANAGER: true
|
|
18
18
|
};
|
|
@@ -1,10 +1,267 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getOwner } from '@ember/-internals/owner'; // This is imported from -internals to avoid circularity
|
|
2
|
+
|
|
3
|
+
import { computed, get } from '@ember/object';
|
|
4
|
+
import { FrameworkObject } from '@ember/object/-internals';
|
|
2
5
|
import { inject as metalInject } from '@ember/-internals/metal';
|
|
3
|
-
import
|
|
6
|
+
import Mixin from '@ember/object/mixin';
|
|
7
|
+
import { deprecateTransitionMethods, prefixRouteNameArg } from '@ember/routing/-internals';
|
|
8
|
+
import { ActionHandler } from '@ember/-internals/runtime';
|
|
9
|
+
import { symbol } from '@ember/-internals/utils';
|
|
10
|
+
const MODEL = symbol('MODEL');
|
|
11
|
+
const ControllerMixin = Mixin.create(ActionHandler, {
|
|
12
|
+
/* ducktype as a controller */
|
|
13
|
+
isController: true,
|
|
14
|
+
concatenatedProperties: ['queryParams'],
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
The object to which actions from the view should be sent.
|
|
18
|
+
For example, when a Handlebars template uses the `{{action}}` helper,
|
|
19
|
+
it will attempt to send the action to the view's controller's `target`.
|
|
20
|
+
By default, the value of the target property is set to the router, and
|
|
21
|
+
is injected when a controller is instantiated. This injection is applied
|
|
22
|
+
as part of the application's initialization process. In most cases the
|
|
23
|
+
`target` property will automatically be set to the logical consumer of
|
|
24
|
+
actions for the controller.
|
|
25
|
+
@property target
|
|
26
|
+
@default null
|
|
27
|
+
@public
|
|
28
|
+
*/
|
|
29
|
+
target: null,
|
|
30
|
+
store: null,
|
|
31
|
+
|
|
32
|
+
init() {
|
|
33
|
+
this._super(...arguments);
|
|
34
|
+
|
|
35
|
+
let owner = getOwner(this);
|
|
36
|
+
|
|
37
|
+
if (owner) {
|
|
38
|
+
this.namespace = owner.lookup('application:main');
|
|
39
|
+
this.target = owner.lookup('router:main');
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
The controller's current model. When retrieving or modifying a controller's
|
|
45
|
+
model, this property should be used instead of the `content` property.
|
|
46
|
+
@property model
|
|
47
|
+
@public
|
|
48
|
+
*/
|
|
49
|
+
model: computed({
|
|
50
|
+
get() {
|
|
51
|
+
return this[MODEL];
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
set(_key, value) {
|
|
55
|
+
return this[MODEL] = value;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
}),
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
Defines which query parameters the controller accepts.
|
|
62
|
+
If you give the names `['category','page']` it will bind
|
|
63
|
+
the values of these query parameters to the variables
|
|
64
|
+
`this.category` and `this.page`.
|
|
65
|
+
By default, query parameters are parsed as strings. This
|
|
66
|
+
may cause unexpected behavior if a query parameter is used with `toggleProperty`,
|
|
67
|
+
because the initial value set for `param=false` will be the string `"false"`, which is truthy.
|
|
68
|
+
To avoid this, you may specify that the query parameter should be parsed as a boolean
|
|
69
|
+
by using the following verbose form with a `type` property:
|
|
70
|
+
```javascript
|
|
71
|
+
queryParams: [{
|
|
72
|
+
category: {
|
|
73
|
+
type: 'boolean'
|
|
74
|
+
}
|
|
75
|
+
}]
|
|
76
|
+
```
|
|
77
|
+
Available values for the `type` parameter are `'boolean'`, `'number'`, `'array'`, and `'string'`.
|
|
78
|
+
If query param type is not specified, it will default to `'string'`.
|
|
79
|
+
@for Ember.ControllerMixin
|
|
80
|
+
@property queryParams
|
|
81
|
+
@public
|
|
82
|
+
*/
|
|
83
|
+
queryParams: null,
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
This property is updated to various different callback functions depending on
|
|
87
|
+
the current "state" of the backing route. It is used by
|
|
88
|
+
`Controller.prototype._qpChanged`.
|
|
89
|
+
The methods backing each state can be found in the `Route.prototype._qp` computed
|
|
90
|
+
property return value (the `.states` property). The current values are listed here for
|
|
91
|
+
the sanity of future travelers:
|
|
92
|
+
* `inactive` - This state is used when this controller instance is not part of the active
|
|
93
|
+
route hierarchy. Set in `Route.prototype._reset` (a `router.js` microlib hook) and
|
|
94
|
+
`Route.prototype.actions.finalizeQueryParamChange`.
|
|
95
|
+
* `active` - This state is used when this controller instance is part of the active
|
|
96
|
+
route hierarchy. Set in `Route.prototype.actions.finalizeQueryParamChange`.
|
|
97
|
+
* `allowOverrides` - This state is used in `Route.prototype.setup` (`route.js` microlib hook).
|
|
98
|
+
@method _qpDelegate
|
|
99
|
+
@private
|
|
100
|
+
*/
|
|
101
|
+
_qpDelegate: null,
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
During `Route#setup` observers are created to invoke this method
|
|
105
|
+
when any of the query params declared in `Controller#queryParams` property
|
|
106
|
+
are changed.
|
|
107
|
+
When invoked this method uses the currently active query param update delegate
|
|
108
|
+
(see `Controller.prototype._qpDelegate` for details) and invokes it with
|
|
109
|
+
the QP key/value being changed.
|
|
110
|
+
@method _qpChanged
|
|
111
|
+
@private
|
|
112
|
+
*/
|
|
113
|
+
_qpChanged(controller, _prop) {
|
|
114
|
+
let dotIndex = _prop.indexOf('.[]');
|
|
115
|
+
|
|
116
|
+
let prop = dotIndex === -1 ? _prop : _prop.slice(0, dotIndex);
|
|
117
|
+
let delegate = controller._qpDelegate;
|
|
118
|
+
let value = get(controller, prop);
|
|
119
|
+
delegate(prop, value);
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
Transition the application into another route. The route may
|
|
124
|
+
be either a single route or route path:
|
|
125
|
+
```javascript
|
|
126
|
+
aController.transitionToRoute('blogPosts');
|
|
127
|
+
aController.transitionToRoute('blogPosts.recentEntries');
|
|
128
|
+
```
|
|
129
|
+
Optionally supply a model for the route in question. The model
|
|
130
|
+
will be serialized into the URL using the `serialize` hook of
|
|
131
|
+
the route:
|
|
132
|
+
```javascript
|
|
133
|
+
aController.transitionToRoute('blogPost', aPost);
|
|
134
|
+
```
|
|
135
|
+
If a literal is passed (such as a number or a string), it will
|
|
136
|
+
be treated as an identifier instead. In this case, the `model`
|
|
137
|
+
hook of the route will be triggered:
|
|
138
|
+
```javascript
|
|
139
|
+
aController.transitionToRoute('blogPost', 1);
|
|
140
|
+
```
|
|
141
|
+
Multiple models will be applied last to first recursively up the
|
|
142
|
+
route tree.
|
|
143
|
+
```app/router.js
|
|
144
|
+
Router.map(function() {
|
|
145
|
+
this.route('blogPost', { path: ':blogPostId' }, function() {
|
|
146
|
+
this.route('blogComment', { path: ':blogCommentId', resetNamespace: true });
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
```javascript
|
|
151
|
+
aController.transitionToRoute('blogComment', aPost, aComment);
|
|
152
|
+
aController.transitionToRoute('blogComment', 1, 13);
|
|
153
|
+
```
|
|
154
|
+
It is also possible to pass a URL (a string that starts with a
|
|
155
|
+
`/`).
|
|
156
|
+
```javascript
|
|
157
|
+
aController.transitionToRoute('/');
|
|
158
|
+
aController.transitionToRoute('/blog/post/1/comment/13');
|
|
159
|
+
aController.transitionToRoute('/blog/posts?sort=title');
|
|
160
|
+
```
|
|
161
|
+
An options hash with a `queryParams` property may be provided as
|
|
162
|
+
the final argument to add query parameters to the destination URL.
|
|
163
|
+
```javascript
|
|
164
|
+
aController.transitionToRoute('blogPost', 1, {
|
|
165
|
+
queryParams: { showComments: 'true' }
|
|
166
|
+
});
|
|
167
|
+
// if you just want to transition the query parameters without changing the route
|
|
168
|
+
aController.transitionToRoute({ queryParams: { sort: 'date' } });
|
|
169
|
+
```
|
|
170
|
+
See also [replaceRoute](/ember/release/classes/Ember.ControllerMixin/methods/replaceRoute?anchor=replaceRoute).
|
|
171
|
+
@for Ember.ControllerMixin
|
|
172
|
+
@method transitionToRoute
|
|
173
|
+
@deprecated Use transitionTo from the Router service instead.
|
|
174
|
+
@param {String} [name] the name of the route or a URL
|
|
175
|
+
@param {...Object} models the model(s) or identifier(s) to be used
|
|
176
|
+
while transitioning to the route.
|
|
177
|
+
@param {Object} [options] optional hash with a queryParams property
|
|
178
|
+
containing a mapping of query parameters
|
|
179
|
+
@return {Transition} the transition object associated with this
|
|
180
|
+
attempted transition
|
|
181
|
+
@public
|
|
182
|
+
*/
|
|
183
|
+
transitionToRoute(...args) {
|
|
184
|
+
var _a;
|
|
185
|
+
|
|
186
|
+
deprecateTransitionMethods('controller', 'transitionToRoute'); // target may be either another controller or a router
|
|
187
|
+
|
|
188
|
+
let target = get(this, 'target'); // SAFETY: We can't actually assert that this is a full Controller or Router since some tests
|
|
189
|
+
// mock out an object that only has the single method. Since this is deprecated, I think it's
|
|
190
|
+
// ok to be a little less than proper here.
|
|
191
|
+
|
|
192
|
+
let method = (_a = target.transitionToRoute) !== null && _a !== void 0 ? _a : target.transitionTo;
|
|
193
|
+
return method.apply(target, prefixRouteNameArg(this, args));
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
Transition into another route while replacing the current URL, if possible.
|
|
198
|
+
This will replace the current history entry instead of adding a new one.
|
|
199
|
+
Beside that, it is identical to `transitionToRoute` in all other respects.
|
|
200
|
+
```javascript
|
|
201
|
+
aController.replaceRoute('blogPosts');
|
|
202
|
+
aController.replaceRoute('blogPosts.recentEntries');
|
|
203
|
+
```
|
|
204
|
+
Optionally supply a model for the route in question. The model
|
|
205
|
+
will be serialized into the URL using the `serialize` hook of
|
|
206
|
+
the route:
|
|
207
|
+
```javascript
|
|
208
|
+
aController.replaceRoute('blogPost', aPost);
|
|
209
|
+
```
|
|
210
|
+
If a literal is passed (such as a number or a string), it will
|
|
211
|
+
be treated as an identifier instead. In this case, the `model`
|
|
212
|
+
hook of the route will be triggered:
|
|
213
|
+
```javascript
|
|
214
|
+
aController.replaceRoute('blogPost', 1);
|
|
215
|
+
```
|
|
216
|
+
Multiple models will be applied last to first recursively up the
|
|
217
|
+
route tree.
|
|
218
|
+
```app/router.js
|
|
219
|
+
Router.map(function() {
|
|
220
|
+
this.route('blogPost', { path: ':blogPostId' }, function() {
|
|
221
|
+
this.route('blogComment', { path: ':blogCommentId', resetNamespace: true });
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
```
|
|
226
|
+
aController.replaceRoute('blogComment', aPost, aComment);
|
|
227
|
+
aController.replaceRoute('blogComment', 1, 13);
|
|
228
|
+
```
|
|
229
|
+
It is also possible to pass a URL (a string that starts with a
|
|
230
|
+
`/`).
|
|
231
|
+
```javascript
|
|
232
|
+
aController.replaceRoute('/');
|
|
233
|
+
aController.replaceRoute('/blog/post/1/comment/13');
|
|
234
|
+
```
|
|
235
|
+
@for Ember.ControllerMixin
|
|
236
|
+
@method replaceRoute
|
|
237
|
+
@deprecated Use replaceWith from the Router service instead.
|
|
238
|
+
@param {String} [name] the name of the route or a URL
|
|
239
|
+
@param {...Object} models the model(s) or identifier(s) to be used
|
|
240
|
+
while transitioning to the route.
|
|
241
|
+
@param {Object} [options] optional hash with a queryParams property
|
|
242
|
+
containing a mapping of query parameters
|
|
243
|
+
@return {Transition} the transition object associated with this
|
|
244
|
+
attempted transition
|
|
245
|
+
@public
|
|
246
|
+
*/
|
|
247
|
+
replaceRoute(...args) {
|
|
248
|
+
var _a;
|
|
249
|
+
|
|
250
|
+
deprecateTransitionMethods('controller', 'replaceRoute'); // target may be either another controller or a router
|
|
251
|
+
|
|
252
|
+
let target = get(this, 'target'); // SAFETY: We can't actually assert that this is a full Controller or Router since some tests
|
|
253
|
+
// mock out an object that only has the single method. Since this is deprecated, I think it's
|
|
254
|
+
// ok to be a little less than proper here.
|
|
255
|
+
|
|
256
|
+
let method = (_a = target.replaceRoute) !== null && _a !== void 0 ? _a : target.replaceWith;
|
|
257
|
+
return method.apply(target, prefixRouteNameArg(this, args));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
});
|
|
4
261
|
|
|
5
262
|
class Controller extends FrameworkObject.extend(ControllerMixin) {}
|
|
6
263
|
|
|
7
264
|
export function inject(...args) {
|
|
8
265
|
return metalInject('controller', ...args);
|
|
9
266
|
}
|
|
10
|
-
export default
|
|
267
|
+
export { Controller as default, ControllerMixin };
|
|
@@ -1 +1,99 @@
|
|
|
1
|
-
|
|
1
|
+
import { classify, dasherize } from '@ember/string';
|
|
2
|
+
import EmberObject from '@ember/object';
|
|
3
|
+
import { A as emberA } from '@ember/array';
|
|
4
|
+
import { typeOf } from '@ember/utils';
|
|
5
|
+
import { getOwner } from '@ember/-internals/owner';
|
|
6
|
+
import Namespace from '@ember/application/namespace';
|
|
7
|
+
/**
|
|
8
|
+
@module @ember/debug/container-debug-adapter
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
The `ContainerDebugAdapter` helps the container and resolver interface
|
|
13
|
+
with tools that debug Ember such as the
|
|
14
|
+
[Ember Inspector](https://github.com/emberjs/ember-inspector)
|
|
15
|
+
for Chrome and Firefox.
|
|
16
|
+
|
|
17
|
+
This class can be extended by a custom resolver implementer
|
|
18
|
+
to override some of the methods with library-specific code.
|
|
19
|
+
|
|
20
|
+
The methods likely to be overridden are:
|
|
21
|
+
|
|
22
|
+
* `canCatalogEntriesByType`
|
|
23
|
+
* `catalogEntriesByType`
|
|
24
|
+
|
|
25
|
+
The adapter will need to be registered
|
|
26
|
+
in the application's container as `container-debug-adapter:main`.
|
|
27
|
+
|
|
28
|
+
Example:
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
Application.initializer({
|
|
32
|
+
name: "containerDebugAdapter",
|
|
33
|
+
|
|
34
|
+
initialize(application) {
|
|
35
|
+
application.register('container-debug-adapter:main', require('app/container-debug-adapter'));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
@class ContainerDebugAdapter
|
|
41
|
+
@extends EmberObject
|
|
42
|
+
@since 1.5.0
|
|
43
|
+
@public
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
export default class ContainerDebugAdapter extends EmberObject {
|
|
47
|
+
constructor(owner) {
|
|
48
|
+
super(owner);
|
|
49
|
+
this.resolver = getOwner(this).lookup('resolver-for-debugging:main');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
Returns true if it is possible to catalog a list of available
|
|
53
|
+
classes in the resolver for a given type.
|
|
54
|
+
@method canCatalogEntriesByType
|
|
55
|
+
@param {String} type The type. e.g. "model", "controller", "route".
|
|
56
|
+
@return {boolean} whether a list is available for this type.
|
|
57
|
+
@public
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
canCatalogEntriesByType(type) {
|
|
62
|
+
if (type === 'model' || type === 'template') {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
Returns the available classes a given type.
|
|
70
|
+
@method catalogEntriesByType
|
|
71
|
+
@param {String} type The type. e.g. "model", "controller", "route".
|
|
72
|
+
@return {Array} An array of strings.
|
|
73
|
+
@public
|
|
74
|
+
*/
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
catalogEntriesByType(type) {
|
|
78
|
+
let namespaces = emberA(Namespace.NAMESPACES);
|
|
79
|
+
let types = emberA();
|
|
80
|
+
let typeSuffixRegex = new RegExp(`${classify(type)}$`);
|
|
81
|
+
namespaces.forEach(namespace => {
|
|
82
|
+
for (let key in namespace) {
|
|
83
|
+
if (!Object.prototype.hasOwnProperty.call(namespace, key)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (typeSuffixRegex.test(key)) {
|
|
88
|
+
let klass = namespace[key];
|
|
89
|
+
|
|
90
|
+
if (typeOf(klass) === 'class') {
|
|
91
|
+
types.push(dasherize(key.replace(typeSuffixRegex, '')));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return types;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
}
|