ember-source 4.3.0-beta.1 → 4.4.0-alpha.3
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/blueprints/acceptance-test/mocha-files/tests/acceptance/__name__-test.js +4 -4
- package/blueprints/acceptance-test/mocha-rfc-232-files/tests/acceptance/__name__-test.js +2 -2
- package/blueprints/acceptance-test/qunit-files/tests/acceptance/__name__-test.js +2 -2
- package/blueprints/acceptance-test/qunit-rfc-232-files/tests/acceptance/__name__-test.js +2 -2
- package/blueprints/component/index.js +2 -2
- package/blueprints/component-class/index.js +2 -2
- package/blueprints/component-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +4 -4
- package/blueprints/component-test/mocha-files/__root__/__testType__/__path__/__test__.js +7 -5
- package/blueprints/component-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +4 -4
- package/blueprints/component-test/qunit-files/__root__/__testType__/__path__/__test__.js +4 -4
- package/blueprints/component-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +4 -4
- package/blueprints/controller/files/__root__/__path__/__name__.js +1 -2
- package/blueprints/controller-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/controller-test/mocha-files/__root__/__testType__/__path__/__test__.js +5 -3
- package/blueprints/controller-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/controller-test/qunit-files/__root__/__testType__/__path__/__test__.js +1 -1
- package/blueprints/controller-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/helper/files/__root__/__collection__/__name__.js +1 -1
- package/blueprints/helper/mu-files/__root__/__collection__/__name__.js +1 -1
- package/blueprints/helper-test/mocha-0.12-files/__root__/__testType__/__collection__/__name__-test.js +3 -3
- package/blueprints/helper-test/mocha-files/__root__/__testType__/__collection__/__name__-test.js +6 -4
- package/blueprints/helper-test/mocha-rfc-232-files/__root__/__testType__/__collection__/__name__-test.js +2 -2
- package/blueprints/helper-test/qunit-files/__root__/__testType__/__collection__/__name__-test.js +2 -2
- package/blueprints/helper-test/qunit-rfc-232-files/__root__/__testType__/__collection__/__name__-test.js +2 -2
- package/blueprints/initializer/files/__root__/initializers/__name__.js +2 -3
- package/blueprints/initializer-test/mocha-files/__root__/__testType__/__path__/__name__-test.js +6 -7
- package/blueprints/initializer-test/mocha-rfc-232-files/__root__/__testType__/__path__/__name__-test.js +5 -5
- package/blueprints/initializer-test/qunit-files/__root__/__testType__/__path__/__name__-test.js +3 -4
- package/blueprints/instance-initializer/files/__root__/instance-initializers/__name__.js +2 -3
- package/blueprints/instance-initializer-test/mocha-files/__root__/__testType__/__path__/__name__-test.js +5 -5
- package/blueprints/instance-initializer-test/mocha-rfc-232-files/__root__/__testType__/__path__/__name__-test.js +5 -5
- package/blueprints/instance-initializer-test/qunit-files/__root__/__testType__/__path__/__name__-test.js +2 -2
- package/blueprints/mixin/files/__root__/mixins/__name__.js +1 -2
- package/blueprints/mixin-test/mocha-files/__root__/__testType__/__name__-test.js +2 -2
- package/blueprints/mixin-test/mocha-rfc-232-files/__root__/__testType__/__name__-test.js +2 -2
- package/blueprints/mixin-test/qunit-files/__root__/__testType__/__name__-test.js +1 -1
- package/blueprints/mixin-test/qunit-rfc-232-files/__root__/__testType__/__name__-test.js +1 -1
- package/blueprints/route/files/__root__/__path__/__name__.js +2 -2
- package/blueprints/route-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/route-test/mocha-files/__root__/__testType__/__path__/__test__.js +5 -3
- package/blueprints/route-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/route-test/qunit-files/__root__/__testType__/__path__/__test__.js +1 -1
- package/blueprints/route-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/service/files/__root__/__path__/__name__.js +1 -2
- package/blueprints/service-test/mocha-0.12-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/service-test/mocha-files/__root__/__testType__/__path__/__test__.js +5 -3
- package/blueprints/service-test/mocha-rfc-232-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/service-test/qunit-files/__root__/__testType__/__path__/__test__.js +1 -1
- package/blueprints/service-test/qunit-rfc-232-files/__root__/__testType__/__path__/__test__.js +2 -2
- package/blueprints/util-test/mocha-files/__root__/__testType__/__name__-test.js +2 -2
- package/blueprints/util-test/mocha-rfc-232-files/__root__/__testType__/__name__-test.js +2 -2
- package/blueprints/util-test/qunit-files/__root__/__testType__/__name__-test.js +1 -1
- package/blueprints/util-test/qunit-rfc-232-files/__root__/__testType__/__name__-test.js +2 -3
- package/build-metadata.json +3 -3
- package/dist/dependencies/router_js.js +1 -1
- package/dist/ember-template-compiler.js +17 -144
- package/dist/ember-template-compiler.map +1 -1
- package/dist/ember-testing.js +4 -2
- package/dist/ember-testing.map +1 -1
- package/dist/ember.debug.js +843 -772
- package/dist/ember.debug.map +1 -1
- package/dist/header/license.js +1 -1
- package/dist/packages/@ember/-internals/container/index.js +3 -3
- package/dist/packages/@ember/-internals/glimmer/index.js +55 -29
- package/dist/packages/@ember/-internals/metal/index.js +18 -28
- package/dist/packages/@ember/-internals/routing/lib/location/hash_location.js +1 -1
- package/dist/packages/@ember/-internals/routing/lib/services/router.js +67 -12
- package/dist/packages/@ember/-internals/routing/lib/services/routing.js +2 -0
- package/dist/packages/@ember/-internals/routing/lib/system/generate_controller.js +3 -1
- package/dist/packages/@ember/-internals/routing/lib/system/route.js +16 -9
- package/dist/packages/@ember/-internals/routing/lib/system/router.js +15 -20
- package/dist/packages/@ember/-internals/routing/lib/utils.js +2 -1
- package/dist/packages/@ember/-internals/runtime/lib/compare.js +19 -5
- package/dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js +4 -4
- package/dist/packages/@ember/-internals/runtime/lib/mixins/container_proxy.js +29 -29
- package/dist/packages/@ember/-internals/runtime/lib/mixins/registry_proxy.js +51 -50
- package/dist/packages/@ember/-internals/utils/index.js +1 -1
- package/dist/packages/@ember/application/instance.js +3 -3
- package/dist/packages/@ember/canary-features/index.js +6 -14
- package/dist/packages/@ember/debug/lib/capture-render-tree.js +2 -0
- package/dist/packages/@ember/debug/lib/handlers.js +1 -1
- package/dist/packages/@ember/runloop/index.js +31 -528
- package/dist/packages/@ember/runloop/type-tests.ts/begin-end.test.js +5 -0
- package/dist/packages/@ember/runloop/type-tests.ts/bind.test.js +59 -0
- package/dist/packages/@ember/runloop/type-tests.ts/cancel.test.js +5 -0
- package/dist/packages/@ember/runloop/type-tests.ts/debounce.test.js +77 -0
- package/dist/packages/@ember/runloop/type-tests.ts/join.test.js +38 -0
- package/dist/packages/@ember/runloop/type-tests.ts/later.test.js +38 -0
- package/dist/packages/@ember/runloop/type-tests.ts/next.test.js +38 -0
- package/dist/packages/@ember/runloop/type-tests.ts/once.test.js +38 -0
- package/dist/packages/@ember/runloop/type-tests.ts/run.test.js +38 -0
- package/dist/packages/@ember/runloop/type-tests.ts/schedule-once.test.js +39 -0
- package/dist/packages/@ember/runloop/type-tests.ts/schedule.test.js +39 -0
- package/dist/packages/@ember/runloop/type-tests.ts/throttle.test.js +77 -0
- package/dist/packages/ember/index.js +4 -14
- package/dist/packages/ember/version.js +1 -1
- package/docs/data.json +330 -245
- package/package.json +4 -4
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { privatize as P } from '@ember/-internals/container';
|
|
2
2
|
import { computed, get, set } from '@ember/-internals/metal';
|
|
3
3
|
import { getOwner } from '@ember/-internals/owner';
|
|
4
|
+
import { BucketCache } from '@ember/-internals/routing';
|
|
4
5
|
import { A as emberA, Evented, Object as EmberObject, typeOf } from '@ember/-internals/runtime';
|
|
5
6
|
import { assert, deprecate, info } from '@ember/debug';
|
|
6
7
|
import EmberError from '@ember/error';
|
|
@@ -16,6 +17,7 @@ import RouterState from './router_state';
|
|
|
16
17
|
*/
|
|
17
18
|
|
|
18
19
|
import Router, { logAbort, STATE_SYMBOL } from 'router_js';
|
|
20
|
+
import EngineInstance from '@ember/engine/instance';
|
|
19
21
|
|
|
20
22
|
function defaultDidTransition(infos) {
|
|
21
23
|
updatePaths(this);
|
|
@@ -77,7 +79,7 @@ const {
|
|
|
77
79
|
|
|
78
80
|
class EmberRouter extends EmberObject.extend(Evented) {
|
|
79
81
|
constructor(owner) {
|
|
80
|
-
super(
|
|
82
|
+
super(owner);
|
|
81
83
|
this._didSetupRouter = false;
|
|
82
84
|
this._initialTransitionStarted = false;
|
|
83
85
|
this.currentURL = null;
|
|
@@ -92,6 +94,7 @@ class EmberRouter extends EmberObject.extend(Evented) {
|
|
|
92
94
|
this._handledErrors = new Set();
|
|
93
95
|
this._engineInstances = Object.create(null);
|
|
94
96
|
this._engineInfoByRoute = Object.create(null);
|
|
97
|
+
this._slowTransitionTimer = null;
|
|
95
98
|
this.currentState = null;
|
|
96
99
|
this.targetState = null;
|
|
97
100
|
|
|
@@ -99,7 +102,7 @@ class EmberRouter extends EmberObject.extend(Evented) {
|
|
|
99
102
|
|
|
100
103
|
this.namespace = owner.lookup('application:main');
|
|
101
104
|
let bucketCache = owner.lookup(P`-bucket-cache:main`);
|
|
102
|
-
assert('BUG: BucketCache should always be present', bucketCache
|
|
105
|
+
assert('BUG: BucketCache should always be present', bucketCache instanceof BucketCache);
|
|
103
106
|
this._bucketCache = bucketCache;
|
|
104
107
|
let routerService = owner.lookup('service:router');
|
|
105
108
|
assert('BUG: RouterService should always be present', routerService !== undefined);
|
|
@@ -699,11 +702,13 @@ class EmberRouter extends EmberObject.extend(Evented) {
|
|
|
699
702
|
let instances = this._engineInstances;
|
|
700
703
|
|
|
701
704
|
for (let name in instances) {
|
|
702
|
-
let
|
|
703
|
-
assert('has
|
|
705
|
+
let instanceMap = instances[name];
|
|
706
|
+
assert('has instanceMap', instanceMap);
|
|
704
707
|
|
|
705
|
-
for (let id in
|
|
706
|
-
|
|
708
|
+
for (let id in instanceMap) {
|
|
709
|
+
let instance = instanceMap[id];
|
|
710
|
+
assert('has instance', instance);
|
|
711
|
+
run(instance, 'destroy');
|
|
707
712
|
}
|
|
708
713
|
}
|
|
709
714
|
}
|
|
@@ -916,7 +921,7 @@ class EmberRouter extends EmberObject.extend(Evented) {
|
|
|
916
921
|
}
|
|
917
922
|
}
|
|
918
923
|
|
|
919
|
-
_doTransition(_targetRouteName, models, _queryParams,
|
|
924
|
+
_doTransition(_targetRouteName, models, _queryParams, _fromRouterService) {
|
|
920
925
|
let targetRouteName = _targetRouteName || getActiveTargetName(this._routerMicrolib);
|
|
921
926
|
|
|
922
927
|
assert(`The route ${targetRouteName} was not found`, Boolean(targetRouteName) && this._routerMicrolib.hasRoute(targetRouteName));
|
|
@@ -927,7 +932,7 @@ class EmberRouter extends EmberObject.extend(Evented) {
|
|
|
927
932
|
|
|
928
933
|
Object.assign(queryParams, _queryParams);
|
|
929
934
|
|
|
930
|
-
this._prepareQueryParams(targetRouteName, models, queryParams, Boolean(
|
|
935
|
+
this._prepareQueryParams(targetRouteName, models, queryParams, Boolean(_fromRouterService));
|
|
931
936
|
|
|
932
937
|
let transition = this._routerMicrolib.transitionTo(targetRouteName, ...models, {
|
|
933
938
|
queryParams
|
|
@@ -1165,7 +1170,7 @@ class EmberRouter extends EmberObject.extend(Evented) {
|
|
|
1165
1170
|
_scheduleLoadingEvent(transition, originRoute) {
|
|
1166
1171
|
this._cancelSlowTransitionTimer();
|
|
1167
1172
|
|
|
1168
|
-
this._slowTransitionTimer = scheduleOnce('routerTransitions', this,
|
|
1173
|
+
this._slowTransitionTimer = scheduleOnce('routerTransitions', this, this._handleSlowTransition, transition, originRoute);
|
|
1169
1174
|
}
|
|
1170
1175
|
|
|
1171
1176
|
_handleSlowTransition(transition, originRoute) {
|
|
@@ -1221,7 +1226,7 @@ class EmberRouter extends EmberObject.extend(Evented) {
|
|
|
1221
1226
|
|
|
1222
1227
|
if (!engineInstance) {
|
|
1223
1228
|
let owner = getOwner(this);
|
|
1224
|
-
assert('
|
|
1229
|
+
assert('Expected router to have EngineInstance as owner', owner instanceof EngineInstance);
|
|
1225
1230
|
assert(`You attempted to mount the engine '${name}' in your router map, but the engine can not be found.`, owner.hasRegistration(`engine:${name}`));
|
|
1226
1231
|
engineInstance = owner.buildChildEngineInstance(name, {
|
|
1227
1232
|
routable: true,
|
|
@@ -1526,16 +1531,6 @@ function updatePaths(router) {
|
|
|
1526
1531
|
set(router, 'currentPath', path);
|
|
1527
1532
|
set(router, 'currentRouteName', currentRouteName);
|
|
1528
1533
|
set(router, 'currentURL', currentURL);
|
|
1529
|
-
let owner = getOwner(router);
|
|
1530
|
-
assert('Router is unexpectedly missing an owner', owner);
|
|
1531
|
-
let appController = owner.lookup('controller:application');
|
|
1532
|
-
|
|
1533
|
-
if (!appController) {
|
|
1534
|
-
// appController might not exist when top-level loading/error
|
|
1535
|
-
// substates have been entered since ApplicationRoute hasn't
|
|
1536
|
-
// actually been entered at that point.
|
|
1537
|
-
return;
|
|
1538
|
-
}
|
|
1539
1534
|
}
|
|
1540
1535
|
|
|
1541
1536
|
function didBeginTransition(transition, router) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { get } from '@ember/-internals/metal';
|
|
2
2
|
import { getOwner } from '@ember/-internals/owner';
|
|
3
3
|
import { assert, deprecate } from '@ember/debug';
|
|
4
|
+
import EngineInstance from '@ember/engine/instance';
|
|
4
5
|
import EmberError from '@ember/error';
|
|
5
6
|
import { STATE_SYMBOL } from 'router_js';
|
|
6
7
|
const ALL_PERIODS_REGEX = /\./g;
|
|
@@ -219,7 +220,7 @@ export function resemblesURL(str) {
|
|
|
219
220
|
export function prefixRouteNameArg(route, args) {
|
|
220
221
|
let routeName;
|
|
221
222
|
let owner = getOwner(route);
|
|
222
|
-
assert('
|
|
223
|
+
assert('Expected route to have EngineInstance as owner', owner instanceof EngineInstance);
|
|
223
224
|
let prefix = owner.mountPoint; // only alter the routeName if it's actually referencing a route.
|
|
224
225
|
|
|
225
226
|
if (owner.routable && typeof args[0] === 'string') {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { typeOf } from './type-of';
|
|
2
2
|
import Comparable from './mixins/comparable';
|
|
3
|
+
import { assert } from '@ember/debug';
|
|
3
4
|
const TYPE_ORDER = {
|
|
4
5
|
undefined: 0,
|
|
5
6
|
null: 1,
|
|
@@ -31,8 +32,9 @@ const TYPE_ORDER = {
|
|
|
31
32
|
// SSt `------'`
|
|
32
33
|
|
|
33
34
|
function spaceship(a, b) {
|
|
34
|
-
let diff = a - b;
|
|
35
|
-
|
|
35
|
+
let diff = a - b; // SAFETY: Number casts true into 1 and false into 0. Therefore, this must end up as one of the Compare values.
|
|
36
|
+
|
|
37
|
+
return Number(diff > 0) - Number(diff < 0);
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
@module @ember/utils
|
|
@@ -94,11 +96,12 @@ export default function compare(v, w) {
|
|
|
94
96
|
let type1 = typeOf(v);
|
|
95
97
|
let type2 = typeOf(w);
|
|
96
98
|
|
|
97
|
-
if (type1 === 'instance' &&
|
|
99
|
+
if (type1 === 'instance' && isComparable(v) && v.constructor.compare) {
|
|
98
100
|
return v.constructor.compare(v, w);
|
|
99
101
|
}
|
|
100
102
|
|
|
101
|
-
if (type2 === 'instance' &&
|
|
103
|
+
if (type2 === 'instance' && isComparable(w) && w.constructor.compare) {
|
|
104
|
+
// SAFETY: Multiplying by a negative just changes the sign
|
|
102
105
|
return w.constructor.compare(w, v) * -1;
|
|
103
106
|
}
|
|
104
107
|
|
|
@@ -111,14 +114,20 @@ export default function compare(v, w) {
|
|
|
111
114
|
|
|
112
115
|
switch (type1) {
|
|
113
116
|
case 'boolean':
|
|
117
|
+
assert('both are boolean', typeof v === 'boolean' && typeof w === 'boolean');
|
|
118
|
+
return spaceship(Number(v), Number(w));
|
|
119
|
+
|
|
114
120
|
case 'number':
|
|
121
|
+
assert('both are numbers', typeof v === 'number' && typeof w === 'number');
|
|
115
122
|
return spaceship(v, w);
|
|
116
123
|
|
|
117
124
|
case 'string':
|
|
125
|
+
assert('both are strings', typeof v === 'string' && typeof w === 'string');
|
|
118
126
|
return spaceship(v.localeCompare(w), 0);
|
|
119
127
|
|
|
120
128
|
case 'array':
|
|
121
129
|
{
|
|
130
|
+
assert('both are arrays', Array.isArray(v) && Array.isArray(w));
|
|
122
131
|
let vLen = v.length;
|
|
123
132
|
let wLen = w.length;
|
|
124
133
|
let len = Math.min(vLen, wLen);
|
|
@@ -137,16 +146,21 @@ export default function compare(v, w) {
|
|
|
137
146
|
}
|
|
138
147
|
|
|
139
148
|
case 'instance':
|
|
140
|
-
if (
|
|
149
|
+
if (isComparable(v) && v.compare) {
|
|
141
150
|
return v.compare(v, w);
|
|
142
151
|
}
|
|
143
152
|
|
|
144
153
|
return 0;
|
|
145
154
|
|
|
146
155
|
case 'date':
|
|
156
|
+
assert('both are dates', v instanceof Date && w instanceof Date);
|
|
147
157
|
return spaceship(v.getTime(), w.getTime());
|
|
148
158
|
|
|
149
159
|
default:
|
|
150
160
|
return 0;
|
|
151
161
|
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function isComparable(value) {
|
|
165
|
+
return Comparable.detect(value);
|
|
152
166
|
}
|
|
@@ -18,13 +18,13 @@ import { Mixin } from '@ember/-internals/metal';
|
|
|
18
18
|
export default Mixin.create({
|
|
19
19
|
/**
|
|
20
20
|
__Required.__ You must implement this method to apply this mixin.
|
|
21
|
-
|
|
21
|
+
Override to return the result of the comparison of the two parameters. The
|
|
22
22
|
compare method should return:
|
|
23
|
-
|
|
23
|
+
- `-1` if `a < b`
|
|
24
24
|
- `0` if `a == b`
|
|
25
25
|
- `1` if `a > b`
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
Default implementation raises an exception.
|
|
27
|
+
@method compare
|
|
28
28
|
@param a {Object} the first object to compare
|
|
29
29
|
@param b {Object} the second object to compare
|
|
30
30
|
@return {Number} the result of the comparison
|
|
@@ -15,7 +15,7 @@ import { Mixin } from '@ember/-internals/metal';
|
|
|
15
15
|
let containerProxyMixin = {
|
|
16
16
|
/**
|
|
17
17
|
The container stores state.
|
|
18
|
-
|
|
18
|
+
@private
|
|
19
19
|
@property {Ember.Container} __container__
|
|
20
20
|
*/
|
|
21
21
|
__container__: null,
|
|
@@ -23,16 +23,16 @@ let containerProxyMixin = {
|
|
|
23
23
|
/**
|
|
24
24
|
Returns an object that can be used to provide an owner to a
|
|
25
25
|
manually created instance.
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
Example:
|
|
27
|
+
```
|
|
28
28
|
import { getOwner } from '@ember/application';
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
let owner = getOwner(this);
|
|
30
|
+
User.create(
|
|
31
31
|
owner.ownerInjection(),
|
|
32
32
|
{ username: 'rwjblue' }
|
|
33
33
|
)
|
|
34
34
|
```
|
|
35
|
-
|
|
35
|
+
@public
|
|
36
36
|
@method ownerInjection
|
|
37
37
|
@since 2.3.0
|
|
38
38
|
@return {Object}
|
|
@@ -43,30 +43,30 @@ let containerProxyMixin = {
|
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
Given a fullName return a corresponding instance.
|
|
46
|
-
|
|
46
|
+
The default behavior is for lookup to return a singleton instance.
|
|
47
47
|
The singleton is scoped to the container, allowing multiple containers
|
|
48
48
|
to all have their own locally scoped singletons.
|
|
49
|
-
|
|
49
|
+
```javascript
|
|
50
50
|
let registry = new Registry();
|
|
51
51
|
let container = registry.container();
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
registry.register('api:twitter', Twitter);
|
|
53
|
+
let twitter = container.lookup('api:twitter');
|
|
54
|
+
twitter instanceof Twitter; // => true
|
|
55
|
+
// by default the container will return singletons
|
|
56
56
|
let twitter2 = container.lookup('api:twitter');
|
|
57
57
|
twitter2 instanceof Twitter; // => true
|
|
58
|
-
|
|
58
|
+
twitter === twitter2; //=> true
|
|
59
59
|
```
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
If singletons are not wanted an optional flag can be provided at lookup.
|
|
61
|
+
```javascript
|
|
62
62
|
let registry = new Registry();
|
|
63
63
|
let container = registry.container();
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
registry.register('api:twitter', Twitter);
|
|
65
|
+
let twitter = container.lookup('api:twitter', { singleton: false });
|
|
66
66
|
let twitter2 = container.lookup('api:twitter', { singleton: false });
|
|
67
|
-
|
|
67
|
+
twitter === twitter2; //=> false
|
|
68
68
|
```
|
|
69
|
-
|
|
69
|
+
@public
|
|
70
70
|
@method lookup
|
|
71
71
|
@param {String} fullName
|
|
72
72
|
@param {Object} options
|
|
@@ -91,32 +91,32 @@ let containerProxyMixin = {
|
|
|
91
91
|
|
|
92
92
|
/**
|
|
93
93
|
Given a fullName return a factory manager.
|
|
94
|
-
|
|
94
|
+
This method returns a manager which can be used for introspection of the
|
|
95
95
|
factory's class or for the creation of factory instances with initial
|
|
96
96
|
properties. The manager is an object with the following properties:
|
|
97
|
-
|
|
97
|
+
* `class` - The registered or resolved class.
|
|
98
98
|
* `create` - A function that will create an instance of the class with
|
|
99
99
|
any dependencies injected.
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
For example:
|
|
101
|
+
```javascript
|
|
102
102
|
import { getOwner } from '@ember/application';
|
|
103
|
-
|
|
103
|
+
let owner = getOwner(otherInstance);
|
|
104
104
|
// the owner is commonly the `applicationInstance`, and can be accessed via
|
|
105
105
|
// an instance initializer.
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
let factory = owner.factoryFor('service:bespoke');
|
|
107
|
+
factory.class;
|
|
108
108
|
// The registered or resolved class. For example when used with an Ember-CLI
|
|
109
109
|
// app, this would be the default export from `app/services/bespoke.js`.
|
|
110
|
-
|
|
110
|
+
let instance = factory.create({
|
|
111
111
|
someProperty: 'an initial property value'
|
|
112
112
|
});
|
|
113
113
|
// Create an instance with any injections and the passed options as
|
|
114
114
|
// initial properties.
|
|
115
115
|
```
|
|
116
|
-
|
|
116
|
+
Any instances created via the factory's `.create()` method *must* be destroyed
|
|
117
117
|
manually by the caller of `.create()`. Typically, this is done during the creating
|
|
118
118
|
objects own `destroy` or `willDestroy` methods.
|
|
119
|
-
|
|
119
|
+
@public
|
|
120
120
|
@method factoryFor
|
|
121
121
|
@param {String} fullName
|
|
122
122
|
@param {Object} options
|
|
@@ -16,62 +16,62 @@ export default Mixin.create({
|
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
Given a fullName return the corresponding factory.
|
|
19
|
-
|
|
19
|
+
@public
|
|
20
20
|
@method resolveRegistration
|
|
21
21
|
@param {String} fullName
|
|
22
22
|
@return {Function} fullName's factory
|
|
23
23
|
*/
|
|
24
|
-
resolveRegistration(fullName
|
|
24
|
+
resolveRegistration(fullName) {
|
|
25
25
|
assert('fullName must be a proper full name', this.__registry__.isValidFullName(fullName));
|
|
26
|
-
return this.__registry__.resolve(fullName
|
|
26
|
+
return this.__registry__.resolve(fullName);
|
|
27
27
|
},
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
Registers a factory that can be used for dependency injection (with
|
|
31
31
|
`inject`) or for service lookup. Each factory is registered with
|
|
32
32
|
a full name including two parts: `type:name`.
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
A simple example:
|
|
34
|
+
```javascript
|
|
35
35
|
import Application from '@ember/application';
|
|
36
36
|
import EmberObject from '@ember/object';
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
let App = Application.create();
|
|
38
|
+
App.Orange = EmberObject.extend();
|
|
39
39
|
App.register('fruit:favorite', App.Orange);
|
|
40
40
|
```
|
|
41
|
-
|
|
41
|
+
Ember will resolve factories from the `App` namespace automatically.
|
|
42
42
|
For example `App.CarsController` will be discovered and returned if
|
|
43
43
|
an application requests `controller:cars`.
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
An example of registering a controller with a non-standard name:
|
|
45
|
+
```javascript
|
|
46
46
|
import Application from '@ember/application';
|
|
47
47
|
import Controller from '@ember/controller';
|
|
48
|
-
|
|
48
|
+
let App = Application.create();
|
|
49
49
|
let Session = Controller.extend();
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
App.register('controller:session', Session);
|
|
51
|
+
// The Session controller can now be treated like a normal controller,
|
|
52
52
|
// despite its non-standard name.
|
|
53
53
|
App.ApplicationController = Controller.extend({
|
|
54
54
|
needs: ['session']
|
|
55
55
|
});
|
|
56
56
|
```
|
|
57
|
-
|
|
57
|
+
Registered factories are **instantiated** by having `create`
|
|
58
58
|
called on them. Additionally they are **singletons**, each time
|
|
59
59
|
they are looked up they return the same instance.
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
Some examples modifying that default behavior:
|
|
61
|
+
```javascript
|
|
62
62
|
import Application from '@ember/application';
|
|
63
63
|
import EmberObject from '@ember/object';
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
let App = Application.create();
|
|
65
|
+
App.Person = EmberObject.extend();
|
|
66
66
|
App.Orange = EmberObject.extend();
|
|
67
67
|
App.Email = EmberObject.extend();
|
|
68
68
|
App.session = EmberObject.create();
|
|
69
|
-
|
|
69
|
+
App.register('model:user', App.Person, { singleton: false });
|
|
70
70
|
App.register('fruit:favorite', App.Orange);
|
|
71
71
|
App.register('communication:main', App.Email, { singleton: false });
|
|
72
72
|
App.register('session', App.session, { instantiate: false });
|
|
73
73
|
```
|
|
74
|
-
|
|
74
|
+
@method register
|
|
75
75
|
@param fullName {String} type:name (e.g., 'model:user')
|
|
76
76
|
@param factory {any} (e.g., App.Person)
|
|
77
77
|
@param options {Object} (optional) disable instantiation or singleton usage
|
|
@@ -81,17 +81,17 @@ export default Mixin.create({
|
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
83
|
Unregister a factory.
|
|
84
|
-
|
|
84
|
+
```javascript
|
|
85
85
|
import Application from '@ember/application';
|
|
86
86
|
import EmberObject from '@ember/object';
|
|
87
|
-
|
|
87
|
+
let App = Application.create();
|
|
88
88
|
let User = EmberObject.extend();
|
|
89
89
|
App.register('model:user', User);
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
App.resolveRegistration('model:user').create() instanceof User //=> true
|
|
91
|
+
App.unregister('model:user')
|
|
92
92
|
App.resolveRegistration('model:user') === undefined //=> true
|
|
93
93
|
```
|
|
94
|
-
|
|
94
|
+
@public
|
|
95
95
|
@method unregister
|
|
96
96
|
@param {String} fullName
|
|
97
97
|
*/
|
|
@@ -99,7 +99,7 @@ export default Mixin.create({
|
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
101
|
Check if a factory is registered.
|
|
102
|
-
|
|
102
|
+
@public
|
|
103
103
|
@method hasRegistration
|
|
104
104
|
@param {String} fullName
|
|
105
105
|
@return {Boolean}
|
|
@@ -108,7 +108,7 @@ export default Mixin.create({
|
|
|
108
108
|
|
|
109
109
|
/**
|
|
110
110
|
Return a specific registered option for a particular factory.
|
|
111
|
-
|
|
111
|
+
@public
|
|
112
112
|
@method registeredOption
|
|
113
113
|
@param {String} fullName
|
|
114
114
|
@param {String} optionName
|
|
@@ -118,7 +118,7 @@ export default Mixin.create({
|
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
120
|
Register options for a particular factory.
|
|
121
|
-
|
|
121
|
+
@public
|
|
122
122
|
@method registerOptions
|
|
123
123
|
@param {String} fullName
|
|
124
124
|
@param {Object} options
|
|
@@ -127,7 +127,7 @@ export default Mixin.create({
|
|
|
127
127
|
|
|
128
128
|
/**
|
|
129
129
|
Return registered options for a particular factory.
|
|
130
|
-
|
|
130
|
+
@public
|
|
131
131
|
@method registeredOptions
|
|
132
132
|
@param {String} fullName
|
|
133
133
|
@return {Object} options
|
|
@@ -136,22 +136,22 @@ export default Mixin.create({
|
|
|
136
136
|
|
|
137
137
|
/**
|
|
138
138
|
Allow registering options for all factories of a type.
|
|
139
|
-
|
|
139
|
+
```javascript
|
|
140
140
|
import Application from '@ember/application';
|
|
141
|
-
|
|
141
|
+
let App = Application.create();
|
|
142
142
|
let appInstance = App.buildInstance();
|
|
143
|
-
|
|
143
|
+
// if all of type `connection` must not be singletons
|
|
144
144
|
appInstance.registerOptionsForType('connection', { singleton: false });
|
|
145
|
-
|
|
145
|
+
appInstance.register('connection:twitter', TwitterConnection);
|
|
146
146
|
appInstance.register('connection:facebook', FacebookConnection);
|
|
147
|
-
|
|
147
|
+
let twitter = appInstance.lookup('connection:twitter');
|
|
148
148
|
let twitter2 = appInstance.lookup('connection:twitter');
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
twitter === twitter2; // => false
|
|
150
|
+
let facebook = appInstance.lookup('connection:facebook');
|
|
151
151
|
let facebook2 = appInstance.lookup('connection:facebook');
|
|
152
|
-
|
|
152
|
+
facebook === facebook2; // => false
|
|
153
153
|
```
|
|
154
|
-
|
|
154
|
+
@public
|
|
155
155
|
@method registerOptionsForType
|
|
156
156
|
@param {String} type
|
|
157
157
|
@param {Object} options
|
|
@@ -160,7 +160,7 @@ export default Mixin.create({
|
|
|
160
160
|
|
|
161
161
|
/**
|
|
162
162
|
Return the registered options for all factories of a type.
|
|
163
|
-
|
|
163
|
+
@public
|
|
164
164
|
@method registeredOptionsForType
|
|
165
165
|
@param {String} type
|
|
166
166
|
@return {Object} options
|
|
@@ -170,41 +170,42 @@ export default Mixin.create({
|
|
|
170
170
|
/**
|
|
171
171
|
Define a dependency injection onto a specific factory or all factories
|
|
172
172
|
of a type.
|
|
173
|
-
|
|
173
|
+
When Ember instantiates a controller, view, or other framework component
|
|
174
174
|
it can attach a dependency to that component. This is often used to
|
|
175
175
|
provide services to a set of framework components.
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
An example of providing a session object to all controllers:
|
|
177
|
+
```javascript
|
|
178
178
|
import { alias } from '@ember/object/computed';
|
|
179
179
|
import Application from '@ember/application';
|
|
180
180
|
import Controller from '@ember/controller';
|
|
181
181
|
import EmberObject from '@ember/object';
|
|
182
|
-
|
|
182
|
+
let App = Application.create();
|
|
183
183
|
let Session = EmberObject.extend({ isAuthenticated: false });
|
|
184
|
-
|
|
184
|
+
// A factory must be registered before it can be injected
|
|
185
185
|
App.register('session:main', Session);
|
|
186
|
-
|
|
186
|
+
// Inject 'session:main' onto all factories of the type 'controller'
|
|
187
187
|
// with the name 'session'
|
|
188
188
|
App.inject('controller', 'session', 'session:main');
|
|
189
|
-
|
|
189
|
+
App.IndexController = Controller.extend({
|
|
190
190
|
isLoggedIn: alias('session.isAuthenticated')
|
|
191
191
|
});
|
|
192
192
|
```
|
|
193
|
-
|
|
194
|
-
|
|
193
|
+
Injections can also be performed on specific factories.
|
|
194
|
+
```javascript
|
|
195
195
|
App.inject(<full_name or type>, <property name>, <full_name>)
|
|
196
196
|
App.inject('route', 'source', 'source:main')
|
|
197
197
|
App.inject('route:application', 'email', 'model:email')
|
|
198
198
|
```
|
|
199
|
-
|
|
199
|
+
It is important to note that injections can only be performed on
|
|
200
200
|
classes that are instantiated by Ember itself. Instantiating a class
|
|
201
201
|
directly (via `create` or `new`) bypasses the dependency injection
|
|
202
202
|
system.
|
|
203
|
-
|
|
203
|
+
@public
|
|
204
204
|
@method inject
|
|
205
205
|
@param factoryNameOrType {String}
|
|
206
206
|
@param property {String}
|
|
207
207
|
@param injectionName {String}
|
|
208
|
+
@deprecated
|
|
208
209
|
**/
|
|
209
210
|
inject: registryAlias('injection')
|
|
210
211
|
});
|
|
@@ -573,7 +573,7 @@ function lookupDescriptor(obj, keyName) {
|
|
|
573
573
|
@private
|
|
574
574
|
*/
|
|
575
575
|
function canInvoke(obj, methodName) {
|
|
576
|
-
return obj
|
|
576
|
+
return obj != null && typeof obj[methodName] === 'function';
|
|
577
577
|
}
|
|
578
578
|
/**
|
|
579
579
|
@module @ember/utils
|
|
@@ -308,12 +308,12 @@ class BootOptions {
|
|
|
308
308
|
@default auto-detected
|
|
309
309
|
@private
|
|
310
310
|
*/
|
|
311
|
-
this.isInteractive = environment.hasDOM; // This default is overridable below
|
|
311
|
+
this.isInteractive = Boolean(environment.hasDOM); // This default is overridable below
|
|
312
312
|
|
|
313
313
|
/**
|
|
314
314
|
@property _renderMode
|
|
315
315
|
@type string
|
|
316
|
-
@default
|
|
316
|
+
@default undefined
|
|
317
317
|
@private
|
|
318
318
|
*/
|
|
319
319
|
|
|
@@ -340,7 +340,7 @@ class BootOptions {
|
|
|
340
340
|
if (options.isBrowser !== undefined) {
|
|
341
341
|
this.isBrowser = Boolean(options.isBrowser);
|
|
342
342
|
} else {
|
|
343
|
-
this.isBrowser = environment.hasDOM;
|
|
343
|
+
this.isBrowser = Boolean(environment.hasDOM);
|
|
344
344
|
}
|
|
345
345
|
|
|
346
346
|
if (!this.isBrowser) {
|
|
@@ -11,15 +11,11 @@ import { ENV } from '@ember/-internals/environment';
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
export const DEFAULT_FEATURES = {
|
|
14
|
-
EMBER_LIBRARIES_ISREGISTERED:
|
|
15
|
-
EMBER_IMPROVED_INSTRUMENTATION:
|
|
16
|
-
EMBER_NAMED_BLOCKS: true,
|
|
17
|
-
EMBER_GLIMMER_HELPER_MANAGER: true,
|
|
18
|
-
EMBER_GLIMMER_INVOKE_HELPER: true,
|
|
19
|
-
EMBER_STRICT_MODE: true,
|
|
20
|
-
EMBER_DYNAMIC_HELPERS_AND_MODIFIERS: true,
|
|
14
|
+
EMBER_LIBRARIES_ISREGISTERED: null,
|
|
15
|
+
EMBER_IMPROVED_INSTRUMENTATION: null,
|
|
21
16
|
EMBER_ROUTING_ROUTER_SERVICE_REFRESH: true,
|
|
22
|
-
EMBER_CACHED: true
|
|
17
|
+
EMBER_CACHED: true,
|
|
18
|
+
EMBER_UNIQUE_ID_HELPER: null
|
|
23
19
|
};
|
|
24
20
|
/**
|
|
25
21
|
The hash of enabled Canary features. Add to this, any canary features
|
|
@@ -70,10 +66,6 @@ function featureValue(value) {
|
|
|
70
66
|
|
|
71
67
|
export const EMBER_LIBRARIES_ISREGISTERED = featureValue(FEATURES.EMBER_LIBRARIES_ISREGISTERED);
|
|
72
68
|
export const EMBER_IMPROVED_INSTRUMENTATION = featureValue(FEATURES.EMBER_IMPROVED_INSTRUMENTATION);
|
|
73
|
-
export const EMBER_NAMED_BLOCKS = featureValue(FEATURES.EMBER_NAMED_BLOCKS);
|
|
74
|
-
export const EMBER_GLIMMER_HELPER_MANAGER = featureValue(FEATURES.EMBER_GLIMMER_HELPER_MANAGER);
|
|
75
|
-
export const EMBER_GLIMMER_INVOKE_HELPER = featureValue(FEATURES.EMBER_GLIMMER_INVOKE_HELPER);
|
|
76
|
-
export const EMBER_STRICT_MODE = featureValue(FEATURES.EMBER_STRICT_MODE);
|
|
77
|
-
export const EMBER_DYNAMIC_HELPERS_AND_MODIFIERS = featureValue(FEATURES.EMBER_DYNAMIC_HELPERS_AND_MODIFIERS);
|
|
78
69
|
export const EMBER_ROUTING_ROUTER_SERVICE_REFRESH = featureValue(FEATURES.EMBER_ROUTING_ROUTER_SERVICE_REFRESH);
|
|
79
|
-
export const EMBER_CACHED = featureValue(FEATURES.EMBER_CACHED);
|
|
70
|
+
export const EMBER_CACHED = featureValue(FEATURES.EMBER_CACHED);
|
|
71
|
+
export const EMBER_UNIQUE_ID_HELPER = featureValue(FEATURES.EMBER_UNIQUE_ID_HELPER);
|
|
@@ -18,6 +18,8 @@ import { expect } from '@glimmer/util';
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
export default function captureRenderTree(app) {
|
|
21
|
+
// SAFETY: Ideally we'd assert here but that causes awkward circular requires since this is also in @ember/debug.
|
|
22
|
+
// This is only for debug stuff so not very risky.
|
|
21
23
|
let renderer = expect(app.lookup('renderer:-dom'), `BUG: owner is missing renderer`);
|
|
22
24
|
return renderer.debugRenderTree.capture();
|
|
23
25
|
}
|