Skip to content

Commit 6a955a2

Browse files
committed
Deprecate Evented and related
1 parent 4713f36 commit 6a955a2

File tree

18 files changed

+456
-46
lines changed

18 files changed

+456
-46
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
"@ember/-internals/runtime/lib/mixins/action_handler.js": "ember-source/@ember/-internals/runtime/lib/mixins/action_handler.js",
214214
"@ember/-internals/runtime/lib/mixins/comparable.js": "ember-source/@ember/-internals/runtime/lib/mixins/comparable.js",
215215
"@ember/-internals/runtime/lib/mixins/container_proxy.js": "ember-source/@ember/-internals/runtime/lib/mixins/container_proxy.js",
216+
"@ember/-internals/runtime/lib/mixins/evented.js": "ember-source/@ember/-internals/runtime/lib/mixins/evented.js",
216217
"@ember/-internals/runtime/lib/mixins/registry_proxy.js": "ember-source/@ember/-internals/runtime/lib/mixins/registry_proxy.js",
217218
"@ember/-internals/runtime/lib/mixins/target_action_support.js": "ember-source/@ember/-internals/runtime/lib/mixins/target_action_support.js",
218219
"@ember/-internals/string/index.js": "ember-source/@ember/-internals/string/index.js",
@@ -226,6 +227,7 @@
226227
"@ember/-internals/views/lib/system/action_manager.js": "ember-source/@ember/-internals/views/lib/system/action_manager.js",
227228
"@ember/-internals/views/lib/system/event_dispatcher.js": "ember-source/@ember/-internals/views/lib/system/event_dispatcher.js",
228229
"@ember/-internals/views/lib/system/utils.js": "ember-source/@ember/-internals/views/lib/system/utils.js",
230+
"@ember/-internals/views/lib/views/core-view-utils.js": "ember-source/@ember/-internals/views/lib/views/core-view-utils.js",
229231
"@ember/-internals/views/lib/views/core_view.js": "ember-source/@ember/-internals/views/lib/views/core_view.js",
230232
"@ember/-internals/views/lib/views/states.js": "ember-source/@ember/-internals/views/lib/views/states.js",
231233
"@ember/application/index.js": "ember-source/@ember/application/index.js",

packages/@ember/-internals/glimmer/lib/component-managers/curly.ts

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import {
55
setOwner,
66
} from '@ember/-internals/owner';
77
import { enumerableSymbol, guidFor } from '@ember/-internals/utils';
8-
import { addChildView, setElementView, setViewElement } from '@ember/-internals/views';
8+
import {
9+
addChildView,
10+
sendCoreViewEvent,
11+
setElementView,
12+
setViewElement,
13+
} from '@ember/-internals/views';
914
import type { Nullable } from '@ember/-internals/utility-types';
1015
import { assert, debugFreeze } from '@ember/debug';
1116
import { _instrumentStart } from '@ember/instrumentation';
@@ -305,20 +310,20 @@ export default class CurlyComponentManager
305310
addChildView(parentView, component);
306311
}
307312

308-
component.trigger('didReceiveAttrs');
313+
sendCoreViewEvent(component, 'didReceiveAttrs');
309314

310315
let hasWrappedElement = component.tagName !== '';
311316

312317
// We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components
313318
if (!hasWrappedElement) {
314319
if (isInteractive) {
315-
component.trigger('willRender');
320+
sendCoreViewEvent(component, 'willRender');
316321
}
317322

318323
component._transitionTo('hasElement');
319324

320325
if (isInteractive) {
321-
component.trigger('willInsertElement');
326+
sendCoreViewEvent(component, 'willInsertElement');
322327
}
323328
}
324329

@@ -342,7 +347,7 @@ export default class CurlyComponentManager
342347
}
343348

344349
if (isInteractive && hasWrappedElement) {
345-
component.trigger('willRender');
350+
sendCoreViewEvent(component, 'willRender');
346351
}
347352

348353
endUntrackFrame();
@@ -407,7 +412,7 @@ export default class CurlyComponentManager
407412

408413
if (isInteractive) {
409414
beginUntrackFrame();
410-
component.trigger('willInsertElement');
415+
sendCoreViewEvent(component, 'willInsertElement');
411416
endUntrackFrame();
412417
}
413418
}
@@ -420,8 +425,8 @@ export default class CurlyComponentManager
420425
didCreate({ component, isInteractive }: ComponentStateBucket): void {
421426
if (isInteractive) {
422427
component._transitionTo('inDOM');
423-
component.trigger('didInsertElement');
424-
component.trigger('didRender');
428+
sendCoreViewEvent(component, 'didInsertElement');
429+
sendCoreViewEvent(component, 'didRender');
425430
}
426431
}
427432

@@ -443,13 +448,13 @@ export default class CurlyComponentManager
443448
component.setProperties(props);
444449
component[IS_DISPATCHING_ATTRS] = false;
445450

446-
component.trigger('didUpdateAttrs');
447-
component.trigger('didReceiveAttrs');
451+
sendCoreViewEvent(component, 'didUpdateAttrs');
452+
sendCoreViewEvent(component, 'didReceiveAttrs');
448453
}
449454

450455
if (isInteractive) {
451-
component.trigger('willUpdate');
452-
component.trigger('willRender');
456+
sendCoreViewEvent(component, 'willUpdate');
457+
sendCoreViewEvent(component, 'willRender');
453458
}
454459

455460
endUntrackFrame();
@@ -464,8 +469,8 @@ export default class CurlyComponentManager
464469

465470
didUpdate({ component, isInteractive }: ComponentStateBucket): void {
466471
if (isInteractive) {
467-
component.trigger('didUpdate');
468-
component.trigger('didRender');
472+
sendCoreViewEvent(component, 'didUpdate');
473+
sendCoreViewEvent(component, 'didRender');
469474
}
470475
}
471476

packages/@ember/-internals/glimmer/lib/component-managers/root.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import CurlyComponentManager, {
2020
initialRenderInstrumentDetails,
2121
processComponentInitializationAssertions,
2222
} from './curly';
23+
import { sendCoreViewEvent } from '@ember/-internals/views';
2324

2425
class RootComponentManager extends CurlyComponentManager {
2526
component: Component;
@@ -47,13 +48,13 @@ class RootComponentManager extends CurlyComponentManager {
4748
// We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components
4849
if (!hasWrappedElement) {
4950
if (isInteractive) {
50-
component.trigger('willRender');
51+
sendCoreViewEvent(component, 'willRender');
5152
}
5253

5354
component._transitionTo('hasElement');
5455

5556
if (isInteractive) {
56-
component.trigger('willInsertElement');
57+
sendCoreViewEvent(component, 'willInsertElement');
5758
}
5859
}
5960

packages/@ember/-internals/glimmer/lib/renderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ENV } from '@ember/-internals/environment';
33
import type { InternalOwner } from '@ember/-internals/owner';
44
import { getOwner } from '@ember/-internals/owner';
55
import { guidFor } from '@ember/-internals/utils';
6-
import { getViewElement, getViewId } from '@ember/-internals/views';
6+
import { getViewElement, getViewId, sendCoreViewEvent } from '@ember/-internals/views';
77
import { assert } from '@ember/debug';
88
import { _backburner, _getCurrentRunLoop } from '@ember/runloop';
99
import {
@@ -893,7 +893,7 @@ export class Renderer extends BaseRenderer {
893893
this.cleanupRootFor(view);
894894

895895
if (this.state.isInteractive) {
896-
view.trigger('didDestroyElement');
896+
sendCoreViewEvent(view, 'didDestroyElement');
897897
}
898898
}
899899

packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { clearElementView, clearViewElement, getViewElement } from '@ember/-internals/views';
1+
import {
2+
clearElementView,
3+
clearViewElement,
4+
getViewElement,
5+
sendCoreViewEvent,
6+
} from '@ember/-internals/views';
27
import { registerDestructor } from '@glimmer/destroyable';
38
import type { CapturedNamedArguments } from '@glimmer/interfaces';
49
import type { Reference } from '@glimmer/reference';
@@ -46,8 +51,8 @@ export default class ComponentStateBucket {
4651

4752
if (isInteractive) {
4853
beginUntrackFrame();
49-
component.trigger('willDestroyElement');
50-
component.trigger('willClearRender');
54+
sendCoreViewEvent(component, 'willDestroyElement');
55+
sendCoreViewEvent(component, 'willClearRender');
5156
endUntrackFrame();
5257

5358
let element = getViewElement(component);

packages/@ember/-internals/meta/lib/meta.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ export class Meta {
355355
addToListeners(
356356
eventName: string,
357357
target: object | null,
358-
method: Function | PropertyKey,
358+
method: ((...args: any[]) => void) | PropertyKey,
359359
once: boolean,
360360
sync: boolean
361361
) {

packages/@ember/-internals/metal/lib/events.ts

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { Meta } from '@ember/-internals/meta';
55
import { meta as metaFor, peekMeta } from '@ember/-internals/meta';
66
import { setListeners } from '@ember/-internals/utils';
77
import type { AnyFn } from '@ember/-internals/utility-types';
8-
import { assert } from '@ember/debug';
8+
import { assert, deprecate } from '@ember/debug';
99

1010
/*
1111
The event system uses a series of nested hashes to store listeners on an
@@ -38,11 +38,24 @@ import { assert } from '@ember/debug';
3838
@param {Boolean} once A flag whether a function should only be called once
3939
@public
4040
*/
41+
export function addListener<Target>(
42+
obj: object,
43+
eventName: string,
44+
target: Target,
45+
method: PropertyKey | ((this: Target, ...args: any[]) => void),
46+
once?: boolean,
47+
sync?: boolean
48+
): void;
49+
export function addListener(
50+
obj: object,
51+
eventName: string,
52+
method: PropertyKey | ((...args: any[]) => void)
53+
): void;
4154
export function addListener(
4255
obj: object,
4356
eventName: string,
44-
target: object | Function | null,
45-
method?: Function | PropertyKey,
57+
target: object | PropertyKey | ((...args: any[]) => void) | null,
58+
method?: PropertyKey | ((...args: any[]) => void),
4659
once?: boolean,
4760
sync = true
4861
): void {
@@ -52,10 +65,13 @@ export function addListener(
5265
);
5366

5467
if (!method && 'function' === typeof target) {
55-
method = target;
68+
// SAFETY: This should be correct. It may be possible to get TS to infer it.
69+
method = target as (...args: any[]) => void;
5670
target = null;
5771
}
5872

73+
assert('target should be object or null', target === null || typeof target === 'object');
74+
5975
metaFor(obj).addToListeners(eventName, target, method!, once === true, sync);
6076
}
6177

@@ -76,8 +92,19 @@ export function addListener(
7692
export function removeListener(
7793
obj: object,
7894
eventName: string,
79-
targetOrFunction: object | Function | null,
80-
functionOrName?: string | Function
95+
target: object | null,
96+
methodOrName: string | ((...args: any[]) => void)
97+
): void;
98+
export function removeListener(
99+
obj: object,
100+
eventName: string,
101+
method: (...args: any[]) => void
102+
): void;
103+
export function removeListener(
104+
obj: object,
105+
eventName: string,
106+
targetOrFunction: object | ((...args: any[]) => void) | null,
107+
functionOrName?: string | ((...args: any[]) => void)
81108
): void {
82109
assert(
83110
'You must pass at least an object, event name, and method or target and method/method name to removeListener',
@@ -199,13 +226,25 @@ export function hasListeners(obj: object, eventName: string): boolean {
199226
200227
@method on
201228
@static
229+
@deprecated Use native JavaScript events or a dedicated event library instead.
202230
@for @ember/object/evented
203231
@param {String} eventNames*
204232
@param {Function} func
205233
@return {Function} the listener function, passed as last argument to on(...)
206234
@public
207235
*/
208236
export function on<T extends AnyFn>(...args: [...eventNames: string[], func: T]): T {
237+
deprecate(
238+
'`on` is deprecated. Use native JavaScript events or a dedicated event library instead.',
239+
false,
240+
{
241+
for: 'ember-source',
242+
id: 'ember-evented',
243+
since: { available: '6.8.0' },
244+
until: '7.0.0',
245+
}
246+
);
247+
209248
let func = args.pop();
210249
let events = args as string[];
211250

packages/@ember/-internals/runtime/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ export { default as ActionHandler } from './lib/mixins/action_handler';
55
export { default as _ProxyMixin, contentFor as _contentFor } from './lib/mixins/-proxy';
66
export { default as MutableEnumerable } from '@ember/enumerable/mutable';
77
export { default as TargetActionSupport } from './lib/mixins/target_action_support';
8+
export { default as Evented, on } from './lib/mixins/evented';
89

910
export { default as RSVP, onerrorDefault } from './lib/ext/rsvp'; // just for side effect of extending Ember.RSVP

0 commit comments

Comments
 (0)