diff --git a/broccoli/amd-compat-entrypoints/ember.debug.js b/broccoli/amd-compat-entrypoints/ember.debug.js index 79a5532ccd9..bff6dbceb67 100644 --- a/broccoli/amd-compat-entrypoints/ember.debug.js +++ b/broccoli/amd-compat-entrypoints/ember.debug.js @@ -263,9 +263,6 @@ d('@ember/object/computed', emberObjectComputed); import * as emberObjectCore from '@ember/object/core'; d('@ember/object/core', emberObjectCore); -import * as emberObjectEvented from '@ember/object/evented'; -d('@ember/object/evented', emberObjectEvented); - import * as emberObjectEvents from '@ember/object/events'; d('@ember/object/events', emberObjectEvents); diff --git a/package.json b/package.json index b0cd29f520e..8a4945e7559 100644 --- a/package.json +++ b/package.json @@ -267,7 +267,6 @@ "@ember/object/compat.js": "ember-source/@ember/object/compat.js", "@ember/object/computed.js": "ember-source/@ember/object/computed.js", "@ember/object/core.js": "ember-source/@ember/object/core.js", - "@ember/object/evented.js": "ember-source/@ember/object/evented.js", "@ember/object/events.js": "ember-source/@ember/object/events.js", "@ember/object/index.js": "ember-source/@ember/object/index.js", "@ember/object/internals.js": "ember-source/@ember/object/internals.js", diff --git a/packages/@ember/-internals/glimmer/lib/component.ts b/packages/@ember/-internals/glimmer/lib/component.ts index aff814ee6ce..fc306716ab5 100644 --- a/packages/@ember/-internals/glimmer/lib/component.ts +++ b/packages/@ember/-internals/glimmer/lib/component.ts @@ -894,20 +894,6 @@ class Component return this.__dispatcher; } - on( - name: string, - target: Target, - method: string | ((this: Target, ...args: any[]) => void) - ): this; - on(name: string, method: ((...args: any[]) => void) | string): this; - on(name: string, target: any, method?: any) { - this._dispatcher?.setupHandlerForEmberEvent(name); - // The `on` method here comes from the Evented mixin. Since this mixin - // is applied to the parent of this class, however, we are still able - // to use `super`. - return super.on(name, target, method); - } - // Changed to `rerender` on init _rerender() { dirtyTag(this[DIRTY_TAG]); diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/append-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/append-test.js index 3e89c2297a3..281dc29003e 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/append-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/append-test.js @@ -56,7 +56,6 @@ class AbstractAppendTest extends RenderingTestCase { } componentsByName[name] = this; pushHook('init'); - this.on('init', () => pushHook('on(init)')); } didReceiveAttrs() { @@ -148,12 +147,10 @@ class AbstractAppendTest extends RenderingTestCase { hooks, [ ['x-parent', 'init'], - ['x-parent', 'on(init)'], ['x-parent', 'didReceiveAttrs'], ['x-parent', 'willRender'], ['x-parent', 'willInsertElement'], ['x-child', 'init'], - ['x-child', 'on(init)'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willRender'], ['x-child', 'willInsertElement'], @@ -299,7 +296,6 @@ class AbstractAppendTest extends RenderingTestCase { } componentsByName[name] = this; pushHook('init'); - this.on('init', () => pushHook('on(init)')); } didReceiveAttrs() { @@ -380,14 +376,7 @@ class AbstractAppendTest extends RenderingTestCase { this.component = XParent.create({ foo: 'zomg' }); - assert.deepEqual( - hooks, - [ - ['x-parent', 'init'], - ['x-parent', 'on(init)'], - ], - 'creation of x-parent' - ); + assert.deepEqual(hooks, [['x-parent', 'init']], 'creation of x-parent'); hooks.length = 0; @@ -399,7 +388,6 @@ class AbstractAppendTest extends RenderingTestCase { ['x-parent', 'willInsertElement'], ['x-child', 'init'], - ['x-child', 'on(init)'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willRender'], ['x-child', 'willInsertElement'], diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js index 2bf955d092e..c871a9b5f89 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/curly-components-test.js @@ -14,7 +14,6 @@ import { run } from '@ember/runloop'; import { DEBUG } from '@glimmer/env'; import { tracked } from '@ember/-internals/metal'; import { alias } from '@ember/object/computed'; -import { on } from '@ember/object/evented'; import Service, { service } from '@ember/service'; import EmberObject, { set, get, computed, observer } from '@ember/object'; import { A as emberA } from '@ember/array'; @@ -3159,52 +3158,6 @@ moduleFor( runTask(() => set(this.context, 'foo', 5)); } - ['@test triggering an event only attempts to invoke an identically named method, if it actually is a function (GH#15228)']( - assert - ) { - assert.expect(3); - - let payload = ['arbitrary', 'event', 'data']; - - this.registerComponent('evented-component', { - ComponentClass: Component.extend({ - someTruthyProperty: true, - - init() { - this._super(...arguments); - this.trigger('someMethod', ...payload); - this.trigger('someTruthyProperty', ...payload); - }, - - someMethod(...data) { - assert.deepEqual( - data, - payload, - 'the method `someMethod` should be called, when `someMethod` is triggered' - ); - }, - - listenerForSomeMethod: on('someMethod', function (...data) { - assert.deepEqual( - data, - payload, - 'the listener `listenerForSomeMethod` should be called, when `someMethod` is triggered' - ); - }), - - listenerForSomeTruthyProperty: on('someTruthyProperty', function (...data) { - assert.deepEqual( - data, - payload, - 'the listener `listenerForSomeTruthyProperty` should be called, when `someTruthyProperty` is triggered' - ); - }), - }), - }); - - this.render(`{{evented-component}}`); - } - ['@test component yielding in an {{#each}} has correct block values after rerendering (GH#14284)']() { this.registerComponent('list-items', { template: `{{#each this.items as |item|}}{{yield item}}{{/each}}`, diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/life-cycle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/life-cycle-test.js index 1c4f3bed6c0..b866b711475 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/life-cycle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/life-cycle-test.js @@ -174,8 +174,6 @@ class LifeCycleHooksTest extends RenderingTestCase { assertNoElement('init', this); assertState('init', 'preRender', this); - this.on('init', () => pushHook('on(init)')); - schedule('afterRender', () => { this.isInitialRender = false; }); @@ -336,19 +334,16 @@ class LifeCycleHooksTest extends RenderingTestCase { // Sync hooks ['the-top', 'init'], - ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willRender'], ['the-top', 'willInsertElement'], ['the-middle', 'init'], - ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willRender'], ['the-middle', 'willInsertElement'], ['the-bottom', 'init'], - ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willRender'], ['the-bottom', 'willInsertElement'], @@ -368,15 +363,12 @@ class LifeCycleHooksTest extends RenderingTestCase { nonInteractive: [ // Sync hooks ['the-top', 'init'], - ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'init'], - ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'init'], - ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ], }); @@ -576,25 +568,21 @@ class LifeCycleHooksTest extends RenderingTestCase { // Sync hooks ['the-parent', 'init'], - ['the-parent', 'on(init)'], ['the-parent', 'didReceiveAttrs'], ['the-parent', 'willRender'], ['the-parent', 'willInsertElement'], ['the-first-child', 'init'], - ['the-first-child', 'on(init)'], ['the-first-child', 'didReceiveAttrs'], ['the-first-child', 'willRender'], ['the-first-child', 'willInsertElement'], ['the-second-child', 'init'], - ['the-second-child', 'on(init)'], ['the-second-child', 'didReceiveAttrs'], ['the-second-child', 'willRender'], ['the-second-child', 'willInsertElement'], ['the-last-child', 'init'], - ['the-last-child', 'on(init)'], ['the-last-child', 'didReceiveAttrs'], ['the-last-child', 'willRender'], ['the-last-child', 'willInsertElement'], @@ -618,19 +606,15 @@ class LifeCycleHooksTest extends RenderingTestCase { // Sync hooks ['the-parent', 'init'], - ['the-parent', 'on(init)'], ['the-parent', 'didReceiveAttrs'], ['the-first-child', 'init'], - ['the-first-child', 'on(init)'], ['the-first-child', 'didReceiveAttrs'], ['the-second-child', 'init'], - ['the-second-child', 'on(init)'], ['the-second-child', 'didReceiveAttrs'], ['the-last-child', 'init'], - ['the-last-child', 'on(init)'], ['the-last-child', 'didReceiveAttrs'], ], }); @@ -890,19 +874,16 @@ class LifeCycleHooksTest extends RenderingTestCase { // Sync hooks ['the-top', 'init'], - ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willRender'], ['the-top', 'willInsertElement'], ['the-middle', 'init'], - ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willRender'], ['the-middle', 'willInsertElement'], ['the-bottom', 'init'], - ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willRender'], ['the-bottom', 'willInsertElement'], @@ -923,15 +904,12 @@ class LifeCycleHooksTest extends RenderingTestCase { // Sync hooks ['the-top', 'init'], - ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'init'], - ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'init'], - ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ], }); @@ -1071,17 +1049,12 @@ class LifeCycleHooksTest extends RenderingTestCase { let initialHooks = () => { let ret = [ ['an-item', 'init'], - ['an-item', 'on(init)'], ['an-item', 'didReceiveAttrs'], ]; if (this.isInteractive) { ret.push(['an-item', 'willRender'], ['an-item', 'willInsertElement']); } - ret.push( - ['nested-item', 'init'], - ['nested-item', 'on(init)'], - ['nested-item', 'didReceiveAttrs'] - ); + ret.push(['nested-item', 'init'], ['nested-item', 'didReceiveAttrs']); if (this.isInteractive) { ret.push(['nested-item', 'willRender'], ['nested-item', 'willInsertElement']); } @@ -1177,13 +1150,11 @@ class LifeCycleHooksTest extends RenderingTestCase { ['nested-item', 'willClearRender'], ['no-items', 'init'], - ['no-items', 'on(init)'], ['no-items', 'didReceiveAttrs'], ['no-items', 'willRender'], ['no-items', 'willInsertElement'], ['nested-item', 'init'], - ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs'], ['nested-item', 'willRender'], ['nested-item', 'willInsertElement'], @@ -1218,11 +1189,9 @@ class LifeCycleHooksTest extends RenderingTestCase { nonInteractive: [ ['no-items', 'init'], - ['no-items', 'on(init)'], ['no-items', 'didReceiveAttrs'], ['nested-item', 'init'], - ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs'], ['an-item', 'willDestroy'], diff --git a/packages/@ember/-internals/glimmer/tests/integration/event-dispatcher-test.js b/packages/@ember/-internals/glimmer/tests/integration/event-dispatcher-test.js index 60c37711e7d..2d1be1ef98f 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/event-dispatcher-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/event-dispatcher-test.js @@ -149,35 +149,6 @@ moduleFor( } } - ['@test event listeners are called when event is triggered'](assert) { - let receivedEvent; - let browserEvent; - - this.registerComponent('x-button', { - ComponentClass: class extends Component { - tagName = 'button'; - init() { - super.init(); - Object.keys(SUPPORTED_EMBER_EVENTS).forEach((browserEvent) => { - this.on(SUPPORTED_EMBER_EVENTS[browserEvent], (event) => (receivedEvent = event)); - }); - } - }, - }); - - this.render(`{{x-button}}`); - - let elementNode = this.$('button'); - let element = elementNode[0]; - - for (browserEvent in SUPPORTED_EMBER_EVENTS) { - receivedEvent = null; - runTask(() => triggerEvent(elementNode, browserEvent)); - assert.ok(receivedEvent, `${browserEvent} event was triggered`); - assert.strictEqual(receivedEvent.target, element); - } - } - ['@test events bubble view hierarchy for form elements'](assert) { let receivedEvent; diff --git a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js index e4ed8e69213..8753cb255d5 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js @@ -1,6 +1,6 @@ import { moduleFor, RenderingTestCase, applyMixins, strip, runTask } from 'internal-test-helpers'; -import { notifyPropertyChange, on } from '@ember/-internals/metal'; +import { notifyPropertyChange } from '@ember/-internals/metal'; import { get, set, computed } from '@ember/object'; import { A as emberA } from '@ember/array'; import ArrayProxy from '@ember/array/proxy'; @@ -1116,22 +1116,6 @@ moduleFor( } ); -moduleFor( - 'Syntax test: {{#each}} with array proxies, content is updated after init', - class extends EachTest { - createList(items) { - let wrapped = emberA(items); - let proxy = ArrayProxy.extend({ - setup: on('init', function () { - this.set('content', emberA(wrapped)); - }), - }).create(); - - return { list: proxy, delegate: wrapped }; - } - } -); - moduleFor( 'Syntax test: {{#each as}} undefined path', class extends RenderingTestCase { diff --git a/packages/@ember/-internals/metal/index.ts b/packages/@ember/-internals/metal/index.ts index 608bfa75037..620da57e3e6 100644 --- a/packages/@ember/-internals/metal/index.ts +++ b/packages/@ember/-internals/metal/index.ts @@ -30,7 +30,7 @@ export { } from './lib/array'; export { arrayContentWillChange, arrayContentDidChange } from './lib/array_events'; export { eachProxyArrayWillChange, eachProxyArrayDidChange } from './lib/each_proxy_events'; -export { addListener, hasListeners, on, removeListener, sendEvent } from './lib/events'; +export { addListener, hasListeners, removeListener, sendEvent } from './lib/events'; export { beginPropertyChanges, diff --git a/packages/@ember/-internals/metal/lib/events.ts b/packages/@ember/-internals/metal/lib/events.ts index ab77fb52c86..aaf1489147f 100644 --- a/packages/@ember/-internals/metal/lib/events.ts +++ b/packages/@ember/-internals/metal/lib/events.ts @@ -3,8 +3,6 @@ */ import type { Meta } from '@ember/-internals/meta'; import { meta as metaFor, peekMeta } from '@ember/-internals/meta'; -import { setListeners } from '@ember/-internals/utils'; -import type { AnyFn } from '@ember/-internals/utility-types'; import { assert } from '@ember/debug'; /* @@ -176,45 +174,3 @@ export function hasListeners(obj: object, eventName: string): boolean { let matched = meta.matchingListeners(eventName); return matched !== undefined && matched.length > 0; } - -/** - Define a property as a function that should be executed when - a specified event or events are triggered. - - ``` javascript - import EmberObject from '@ember/object'; - import { on } from '@ember/object/evented'; - import { sendEvent } from '@ember/object/events'; - - let Job = EmberObject.extend({ - logCompleted: on('completed', function() { - console.log('Job completed!'); - }) - }); - - let job = Job.create(); - - sendEvent(job, 'completed'); // Logs 'Job completed!' - ``` - - @method on - @static - @for @ember/object/evented - @param {String} eventNames* - @param {Function} func - @return {Function} the listener function, passed as last argument to on(...) - @public -*/ -export function on(...args: [...eventNames: string[], func: T]): T { - let func = args.pop(); - let events = args as string[]; - - assert('on expects function as last argument', typeof func === 'function'); - assert( - 'on called without valid event names', - events.length > 0 && events.every((p) => typeof p === 'string' && p.length > 0) - ); - - setListeners(func, events); - return func; -} diff --git a/packages/@ember/-internals/metal/tests/events_test.js b/packages/@ember/-internals/metal/tests/events_test.js index 109792c39b7..fdc395aaa70 100644 --- a/packages/@ember/-internals/metal/tests/events_test.js +++ b/packages/@ember/-internals/metal/tests/events_test.js @@ -1,5 +1,4 @@ -import { on, addListener, removeListener, sendEvent, hasListeners } from '..'; -import Mixin from '@ember/object/mixin'; +import { addListener, removeListener, sendEvent, hasListeners } from '..'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; moduleFor( @@ -138,62 +137,5 @@ moduleFor( addListener(obj, 'event!', F); assert.equal(hasListeners(obj, 'event!'), true, 'has listeners'); } - - ['@test a listener can be added as part of a mixin'](assert) { - let triggered = 0; - let MyMixin = Mixin.create({ - foo1: on('bar', function () { - triggered++; - }), - - foo2: on('bar', function () { - triggered++; - }), - }); - - let obj = {}; - MyMixin.apply(obj); - - sendEvent(obj, 'bar'); - assert.equal(triggered, 2, 'should invoke listeners'); - } - - [`@test 'on' asserts for invalid arguments`]() { - expectAssertion(() => { - Mixin.create({ - foo1: on('bar'), - }); - }, 'on expects function as last argument'); - - expectAssertion(() => { - Mixin.create({ - foo1: on(function () {}), - }); - }, 'on called without valid event names'); - } - - ['@test a listener added as part of a mixin may be overridden'](assert) { - let triggered = 0; - let FirstMixin = Mixin.create({ - foo: on('bar', function () { - triggered++; - }), - }); - let SecondMixin = Mixin.create({ - foo: on('baz', function () { - triggered++; - }), - }); - - let obj = {}; - FirstMixin.apply(obj); - SecondMixin.apply(obj); - - sendEvent(obj, 'bar'); - assert.equal(triggered, 0, 'should not invoke from overridden property'); - - sendEvent(obj, 'baz'); - assert.equal(triggered, 1, 'should invoke from subclass property'); - } } ); diff --git a/packages/@ember/-internals/views/lib/views/core_view.ts b/packages/@ember/-internals/views/lib/views/core_view.ts index c6a7529cf44..671bb20b2ce 100644 --- a/packages/@ember/-internals/views/lib/views/core_view.ts +++ b/packages/@ember/-internals/views/lib/views/core_view.ts @@ -1,7 +1,6 @@ import type { Renderer, View } from '@ember/-internals/glimmer/lib/renderer'; import { inject } from '@ember/-internals/metal'; import { ActionHandler } from '@ember/-internals/runtime'; -import Evented from '@ember/object/evented'; import { FrameworkObject } from '@ember/object/-internals'; import type { ViewState } from './states'; import states from './states'; @@ -18,13 +17,12 @@ import states from './states'; @namespace Ember @extends EmberObject @deprecated Use `Component` instead. - @uses Evented @uses Ember.ActionHandler @private */ -interface CoreView extends Evented, ActionHandler, View {} -class CoreView extends FrameworkObject.extend(Evented, ActionHandler) { +interface CoreView extends ActionHandler, View {} +class CoreView extends FrameworkObject.extend(ActionHandler) { isView = true; declare _states: typeof states; @@ -32,9 +30,6 @@ class CoreView extends FrameworkObject.extend(Evented, ActionHandler) { declare _state: keyof typeof states; declare _currentState: ViewState; - _superTrigger?: Evented['trigger']; - _superHas?: Evented['has']; - /** If the view is currently inserted into the DOM of a parent view, this property will point to the parent of the view. @@ -49,15 +44,6 @@ class CoreView extends FrameworkObject.extend(Evented, ActionHandler) { init(properties: object | undefined) { super.init(properties); - // Handle methods from Evented - // The native class inheritance will not work for mixins. To work around this, - // we copy the existing trigger and has methods provided by the mixin and swap in the - // new ones from our class. - this._superTrigger = this.trigger; - this.trigger = this._trigger; - this._superHas = this.has; - this.has = this._has; - this.parentView ??= null; this._state = 'preRender'; @@ -82,20 +68,13 @@ class CoreView extends FrameworkObject.extend(Evented, ActionHandler) { @param name {String} @private */ - // Changed to `trigger` on init - _trigger(name: string, ...args: any[]) { - this._superTrigger!(name, ...args); + trigger(name: string, ...args: any[]) { let method = (this as any)[name]; if (typeof method === 'function') { return method.apply(this, args); } } - // Changed to `has` on init - _has(name: string) { - return typeof (this as any)[name] === 'function' || this._superHas!(name); - } - static isViewFactory = true; } diff --git a/packages/@ember/-internals/views/lib/views/states.ts b/packages/@ember/-internals/views/lib/views/states.ts index c9480ffbdf4..0efa46055e9 100644 --- a/packages/@ember/-internals/views/lib/views/states.ts +++ b/packages/@ember/-internals/views/lib/views/states.ts @@ -45,7 +45,7 @@ const HAS_ELEMENT: Readonly = Object.freeze({ // Handle events from `Ember.EventDispatcher` handleEvent(view: Component, eventName: string, event: Event) { - if (view.has(eventName)) { + if (eventName in view) { // Handler should be able to re-dispatch events, so we don't // preventDefault or stopPropagation. return flaggedInstrument(`interaction.${eventName}`, { event, view }, () => { diff --git a/packages/@ember/object/evented.ts b/packages/@ember/object/evented.ts deleted file mode 100644 index 2134d344206..00000000000 --- a/packages/@ember/object/evented.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { addListener, removeListener, hasListeners, sendEvent } from '@ember/-internals/metal'; -import Mixin from '@ember/object/mixin'; - -export { on } from '@ember/-internals/metal'; - -/** -@module @ember/object/evented -*/ - -/** - This mixin allows for Ember objects to subscribe to and emit events. - - ```app/utils/person.js - import EmberObject from '@ember/object'; - import Evented from '@ember/object/evented'; - - export default class Person extends EmberObject.extend(Evented) { - greet() { - // ... - this.trigger('greet'); - } - } - ``` - - ```javascript - var person = Person.create(); - - person.on('greet', function() { - console.log('Our person has greeted'); - }); - - person.greet(); - - // outputs: 'Our person has greeted' - ``` - - You can also chain multiple event subscriptions: - - ```javascript - person.on('greet', function() { - console.log('Our person has greeted'); - }).one('greet', function() { - console.log('Offer one-time special'); - }).off('event', this, forgetThis); - ``` - - @class Evented - @public - */ -interface Evented { - /** - Subscribes to a named event with given function. - - ```javascript - person.on('didLoad', function() { - // fired once the person has loaded - }); - ``` - - An optional target can be passed in as the 2nd argument that will - be set as the "this" for the callback. This is a good way to give your - function access to the object triggering the event. When the target - parameter is used the callback method becomes the third argument. - - @method on - @param {String} name The name of the event - @param {Object} [target] The "this" binding for the callback - @param {Function|String} method A function or the name of a function to be called on `target` - @return this - @public - */ - on( - name: string, - target: Target, - method: string | ((this: Target, ...args: any[]) => void) - ): this; - on(name: string, method: ((...args: any[]) => void) | string): this; - /** - Subscribes a function to a named event and then cancels the subscription - after the first time the event is triggered. It is good to use ``one`` when - you only care about the first time an event has taken place. - - This function takes an optional 2nd argument that will become the "this" - value for the callback. When the target parameter is used the callback method - becomes the third argument. - - @method one - @param {String} name The name of the event - @param {Object} [target] The "this" binding for the callback - @param {Function|String} method A function or the name of a function to be called on `target` - @return this - @public - */ - one( - name: string, - target: Target, - method: string | ((this: Target, ...args: any[]) => void) - ): this; - one(name: string, method: string | ((...args: any[]) => void)): this; - /** - Triggers a named event for the object. Any additional arguments - will be passed as parameters to the functions that are subscribed to the - event. - - ```javascript - person.on('didEat', function(food) { - console.log('person ate some ' + food); - }); - - person.trigger('didEat', 'broccoli'); - - // outputs: person ate some broccoli - ``` - - @method trigger - @param {String} name The name of the event - @param {Object...} args Optional arguments to pass on - @public - */ - trigger(name: string, ...args: any[]): any; - /** - Cancels subscription for given name, target, and method. - - @method off - @param {String} name The name of the event - @param {Object} target The target of the subscription - @param {Function|String} method The function or the name of a function of the subscription - @return this - @public - */ - off( - name: string, - target: Target, - method: string | ((this: Target, ...args: any[]) => void) - ): this; - off(name: string, method: string | ((...args: any[]) => void)): this; - /** - Checks to see if object has any subscriptions for named event. - - @method has - @param {String} name The name of the event - @return {Boolean} does the object have a subscription for event - @public - */ - has(name: string): boolean; -} -const Evented = Mixin.create({ - on(name: string, target: object, method?: string | Function) { - addListener(this, name, target, method); - return this; - }, - - one(name: string, target: object, method?: string | Function) { - addListener(this, name, target, method, true); - return this; - }, - - trigger(name: string, ...args: any[]) { - sendEvent(this, name, args); - }, - - off(name: string, target: object, method?: string | Function) { - removeListener(this, name, target, method); - return this; - }, - - has(name: string) { - return hasListeners(this, name); - }, -}); - -export default Evented; diff --git a/packages/@ember/object/tests/es-compatibility-test.js b/packages/@ember/object/tests/es-compatibility-test.js index 33cff30a067..164ab8e1e1f 100644 --- a/packages/@ember/object/tests/es-compatibility-test.js +++ b/packages/@ember/object/tests/es-compatibility-test.js @@ -1,7 +1,6 @@ import EmberObject, { computed, observer } from '@ember/object'; import { defineProperty, - on, addObserver, removeObserver, addListener, @@ -276,6 +275,7 @@ moduleFor( SubEmberObject.metaForProperty('foo'); } + // TODO: Revisit this '@test observes / removeObserver on / removeListener interop'(assert) { let fooDidChangeBase = 0; let fooDidChangeA = 0; @@ -288,9 +288,9 @@ moduleFor( fooDidChangeBase++; }), - onSomeEvent: on('someEvent', function () { + onSomeEvent() { someEventBase++; - }), + }, }) { init() { super.init(); @@ -340,11 +340,6 @@ moduleFor( assert.equal(fooDidChangeA, 1); assert.equal(fooDidChangeB, 0); - sendEvent(a, 'someEvent'); - assert.equal(someEventBase, 1); - assert.equal(someEventA, 1); - assert.equal(someEventB, 0); - let b = B.create(); b.set('foo', 'something'); await runLoopSettled(); @@ -353,11 +348,6 @@ moduleFor( assert.equal(fooDidChangeA, 1); assert.equal(fooDidChangeB, 0); - sendEvent(b, 'someEvent'); - assert.equal(someEventBase, 1); - assert.equal(someEventA, 1); - assert.equal(someEventB, 0); - a.destroy(); b.destroy(); }); diff --git a/packages/@ember/object/tests/evented_test.js b/packages/@ember/object/tests/evented_test.js deleted file mode 100644 index 03c65149b8a..00000000000 --- a/packages/@ember/object/tests/evented_test.js +++ /dev/null @@ -1,23 +0,0 @@ -import CoreObject from '@ember/object/core'; -import EventedMixin from '@ember/object/evented'; -import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; - -moduleFor( - 'Ember.Evented', - class extends AbstractTestCase { - ['@test works properly on proxy-ish objects'](assert) { - let eventedProxyObj = class extends CoreObject.extend(EventedMixin) { - unknownProperty() { - return true; - } - }.create(); - - let noop = function () {}; - - eventedProxyObj.on('foo', noop); - eventedProxyObj.off('foo', noop); - - assert.ok(true, 'An assertion was triggered'); - } - } -); diff --git a/packages/@ember/object/tests/events_test.js b/packages/@ember/object/tests/events_test.js deleted file mode 100644 index fee30bd5bdb..00000000000 --- a/packages/@ember/object/tests/events_test.js +++ /dev/null @@ -1,156 +0,0 @@ -import EmberObject from '@ember/object'; -import Evented from '@ember/object/evented'; -import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; - -moduleFor( - 'Object events', - class extends AbstractTestCase { - ['@test a listener can be added to an object'](assert) { - let count = 0; - let F = function () { - count++; - }; - - let obj = EmberObject.extend(Evented).create(); - - obj.on('event!', F); - obj.trigger('event!'); - - assert.equal(count, 1, 'the event was triggered'); - - obj.trigger('event!'); - - assert.equal(count, 2, 'the event was triggered'); - } - - ['@test a listener can be added and removed automatically the first time it is triggered']( - assert - ) { - let count = 0; - let F = function () { - count++; - }; - - let obj = EmberObject.extend(Evented).create(); - - obj.one('event!', F); - obj.trigger('event!'); - - assert.equal(count, 1, 'the event was triggered'); - - obj.trigger('event!'); - - assert.equal(count, 1, 'the event was not triggered again'); - } - - ['@test triggering an event can have arguments'](assert) { - let self, args; - - let obj = EmberObject.extend(Evented).create(); - - obj.on('event!', function () { - args = [].slice.call(arguments); - self = this; - }); - - obj.trigger('event!', 'foo', 'bar'); - - assert.deepEqual(args, ['foo', 'bar']); - assert.equal(self, obj); - } - - ['@test a listener can be added and removed automatically and have arguments'](assert) { - let self, args; - let count = 0; - - let obj = EmberObject.extend(Evented).create(); - - obj.one('event!', function () { - args = [].slice.call(arguments); - self = this; - count++; - }); - - obj.trigger('event!', 'foo', 'bar'); - - assert.deepEqual(args, ['foo', 'bar']); - assert.equal(self, obj); - assert.equal(count, 1, 'the event is triggered once'); - - obj.trigger('event!', 'baz', 'bat'); - - assert.deepEqual(args, ['foo', 'bar']); - assert.equal(count, 1, 'the event was not triggered again'); - assert.equal(self, obj); - } - - ['@test binding an event can specify a different target'](assert) { - let self, args; - - let obj = EmberObject.extend(Evented).create(); - let target = {}; - - obj.on('event!', target, function () { - args = [].slice.call(arguments); - self = this; - }); - - obj.trigger('event!', 'foo', 'bar'); - - assert.deepEqual(args, ['foo', 'bar']); - assert.equal(self, target); - } - - ['@test a listener registered with one can take method as string and can be added with different target']( - assert - ) { - let count = 0; - let target = {}; - target.fn = function () { - count++; - }; - - let obj = EmberObject.extend(Evented).create(); - - obj.one('event!', target, 'fn'); - obj.trigger('event!'); - - assert.equal(count, 1, 'the event was triggered'); - - obj.trigger('event!'); - - assert.equal(count, 1, 'the event was not triggered again'); - } - - ['@test a listener registered with one can be removed with off'](assert) { - let obj = class extends EmberObject.extend(Evented) { - F() {} - }.create(); - let F = function () {}; - - obj.one('event!', F); - obj.one('event!', obj, 'F'); - - assert.equal(obj.has('event!'), true, 'has events'); - - obj.off('event!', F); - obj.off('event!', obj, 'F'); - - assert.equal(obj.has('event!'), false, 'has no more events'); - } - - ['@test adding and removing listeners should be chainable'](assert) { - let obj = EmberObject.extend(Evented).create(); - let F = function () {}; - - let ret = obj.on('event!', F); - assert.equal(ret, obj, '#on returns self'); - - ret = obj.off('event!', F); - assert.equal(ret, obj, '#off returns self'); - - ret = obj.one('event!', F); - assert.equal(ret, obj, '#one returns self'); - } - } -); diff --git a/packages/@ember/object/type-tests/evented/index.test.ts b/packages/@ember/object/type-tests/evented/index.test.ts deleted file mode 100644 index 7add337dfe6..00000000000 --- a/packages/@ember/object/type-tests/evented/index.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { expectTypeOf } from 'expect-type'; - -import type Mixin from '@ember/object/mixin'; -import type Evented from '@ember/object/evented'; - -// A very naive test that at least makes sure we can import this -expectTypeOf().toMatchTypeOf(); diff --git a/packages/@ember/object/type-tests/evented/on.test.ts b/packages/@ember/object/type-tests/evented/on.test.ts deleted file mode 100644 index e5073d9d06d..00000000000 --- a/packages/@ember/object/type-tests/evented/on.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { on } from '@ember/object/evented'; -import { sendEvent } from '@ember/object/events'; -import { expectTypeOf } from 'expect-type'; - -class Job { - logCompleted = on('completed', function () { - // eslint-disable-next-line no-console - console.log('Job completed!'); - }); -} - -const job = new Job(); - -sendEvent(job, 'completed'); // Logs 'Job completed!' - -expectTypeOf(job.logCompleted).toEqualTypeOf<() => void>(); diff --git a/packages/@ember/object/type-tests/events/index.test.ts b/packages/@ember/object/type-tests/events/index.test.ts deleted file mode 100644 index ba1b3e8ffd2..00000000000 --- a/packages/@ember/object/type-tests/events/index.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { addListener, removeListener, sendEvent } from '@ember/object/events'; - -import EmberObject from '@ember/object'; -import { on } from '@ember/object/evented'; -import type Owner from '@ember/owner'; - -class Job extends EmberObject { - logStartOrUpdate = on('started', 'updated', () => { - // eslint-disable-next-line no-console - console.log('Job updated!'); - }); - - logCompleted = on('completed', () => { - // eslint-disable-next-line no-console - console.log('Job completed!'); - }); -} - -const job = Job.create(); - -sendEvent(job, 'started'); // Logs 'Job started!' -sendEvent(job, 'updated'); // Logs 'Job updated!' -sendEvent(job, 'completed'); // Logs 'Job completed!' - -class MyClass extends EmberObject { - constructor(owner: Owner) { - super(owner); - addListener(this, 'willDestroy', this, 'willDestroyListener'); - addListener(this, 'willDestroy', this, 'willDestroyListener', true); - - addListener(this, 'willDestroy', this, this.willDestroyListener); - - addListener(this, 'willDestroy', this, this.willDestroyListener, true); - removeListener(this, 'willDestroy', this, 'willDestroyListener'); - - removeListener(this, 'willDestroy', this, this.willDestroyListener); - } - - willDestroyListener() {} -} - -MyClass.create(); diff --git a/packages/@ember/routing/route.ts b/packages/@ember/routing/route.ts index 7b4a8f24eac..8a0df029ac7 100644 --- a/packages/@ember/routing/route.ts +++ b/packages/@ember/routing/route.ts @@ -9,7 +9,6 @@ import type Owner from '@ember/owner'; import { getOwner } from '@ember/-internals/owner'; import type { default as BucketCache } from './lib/cache'; import EmberObject, { computed, get, set, getProperties, setProperties } from '@ember/object'; -import Evented from '@ember/object/evented'; import { A as emberA } from '@ember/array'; import { ActionHandler } from '@ember/-internals/runtime'; import { typeOf } from '@ember/utils'; @@ -74,11 +73,10 @@ const RENDER_STATE = Symbol('render-state'); @class Route @extends EmberObject @uses ActionHandler - @uses Evented @since 1.0.0 @public */ -interface Route extends IRoute, ActionHandler, Evented { +interface Route extends IRoute, ActionHandler { /** The `willTransition` action is fired at the beginning of any attempted transition with a `Transition` object as the sole @@ -252,7 +250,7 @@ interface Route extends IRoute, ActionHandler, Evented { error?(error: Error, transition: Transition): boolean | void; } -class Route extends EmberObject.extend(ActionHandler, Evented) implements IRoute { +class Route extends EmberObject.extend(ActionHandler) implements IRoute { static isRouteFactory = true; // These properties will end up appearing in the public interface because we @@ -769,7 +767,6 @@ class Route extends EmberObject.extend(ActionHandler, Evented) */ exit(transition?: Transition) { this.deactivate(transition); - this.trigger('deactivate', transition); this.teardownViews(); } @@ -795,49 +792,8 @@ class Route extends EmberObject.extend(ActionHandler, Evented) enter(transition: Transition) { this[RENDER_STATE] = undefined; this.activate(transition); - this.trigger('activate', transition); } - /** - This event is triggered when the router enters the route. It is - not executed when the model for the route changes. - - ```app/routes/application.js - import { on } from '@ember/object/evented'; - import Route from '@ember/routing/route'; - - export default Route.extend({ - collectAnalytics: on('activate', function(){ - collectAnalytics(); - }) - }); - ``` - - @event activate - @since 1.9.0 - @public - */ - - /** - This event is triggered when the router completely exits this - route. It is not executed when the model for the route changes. - - ```app/routes/index.js - import { on } from '@ember/object/evented'; - import Route from '@ember/routing/route'; - - export default Route.extend({ - trackPageLeaveAnalytics: on('deactivate', function(){ - trackPageLeaveAnalytics(); - }) - }); - ``` - - @event deactivate - @since 1.9.0 - @public - */ - /** This hook is executed when the router completely exits this route. It is not executed when the model for the route changes. @@ -1488,6 +1444,7 @@ class Route extends EmberObject.extend(ActionHandler, Evented) } } + // TODO: Revisit the docs /** Allows you to produce custom metadata for the route. The return value of this method will be attached to diff --git a/packages/@ember/routing/router-service.ts b/packages/@ember/routing/router-service.ts index f99166ae6b7..d345c7f5c05 100644 --- a/packages/@ember/routing/router-service.ts +++ b/packages/@ember/routing/router-service.ts @@ -1,8 +1,8 @@ /** * @module @ember/routing/router-service */ +import { addListener, removeListener, hasListeners, sendEvent } from '@ember/-internals/metal'; import { getOwner } from '@ember/-internals/owner'; -import Evented from '@ember/object/evented'; import { assert } from '@ember/debug'; import { readOnly } from '@ember/object/computed'; import Service from '@ember/service'; @@ -55,15 +55,42 @@ function cleanURL(url: string, rootURL: string) { @extends Service @class RouterService */ -interface RouterService extends Evented { +interface RouterService { on( eventName: 'routeWillChange' | 'routeDidChange', callback: (transition: Transition) => void ): this; } -class RouterService extends Service.extend(Evented) { +class RouterService extends Service { [ROUTER]?: EmberRouter; + // Start Evented Functionality + + on(name: string, target: object, method?: string | Function) { + addListener(this, name, target, method); + return this; + } + + one(name: string, target: object, method?: string | Function) { + addListener(this, name, target, method, true); + return this; + } + + trigger(name: string, ...args: any[]) { + sendEvent(this, name, args); + } + + off(name: string, target: object, method?: string | Function) { + removeListener(this, name, target, method); + return this; + } + + has(name: string) { + return hasListeners(this, name); + } + + // End Evented Functionality + get _router(): EmberRouter { let router = this[ROUTER]; if (router !== undefined) { diff --git a/packages/@ember/routing/router.ts b/packages/@ember/routing/router.ts index a52b28f0a32..4957cffd9c6 100644 --- a/packages/@ember/routing/router.ts +++ b/packages/@ember/routing/router.ts @@ -22,7 +22,6 @@ import type RouterService from '@ember/routing/router-service'; import EmberObject from '@ember/object'; import { A as emberA } from '@ember/array'; import { typeOf } from '@ember/utils'; -import Evented from '@ember/object/evented'; import { assert, info } from '@ember/debug'; import { cancel, once, run, scheduleOnce } from '@ember/runloop'; import { DEBUG } from '@glimmer/env'; @@ -50,6 +49,7 @@ import type { QueryParams } from 'route-recognizer'; import type { AnyFn, MethodNamesOf, OmitFirst } from '@ember/-internals/utility-types'; import type { Template } from '@glimmer/interfaces'; import type ApplicationInstance from '@ember/application/instance'; +import { sendEvent } from '@ember/-internals/metal'; /** @module @ember/routing/router @@ -132,10 +132,9 @@ const { slice } = Array.prototype; @class EmberRouter @extends EmberObject - @uses Evented @public */ -class EmberRouter extends EmberObject.extend(Evented) implements Evented { +class EmberRouter extends EmberObject { /** Represents the URL of the root of the application, often '/'. This prefix is assumed on all routes defined on this router. @@ -194,14 +193,6 @@ class EmberRouter extends EmberObject.extend(Evented) implements Evented { private namespace: any; - // Begin Evented - declare on: (name: string, method: ((...args: any[]) => void) | string) => this; - declare one: (name: string, method: string | ((...args: any[]) => void)) => this; - declare trigger: (name: string, ...args: any[]) => unknown; - declare off: (name: string, method: string | ((...args: any[]) => void)) => this; - declare has: (name: string) => boolean; - // End Evented - // Set with reopenClass private static dslCallbacks?: DSLCallback[]; @@ -415,12 +406,12 @@ class EmberRouter extends EmberObject.extend(Evented) implements Evented { } routeWillChange(transition: Transition) { - router.trigger('routeWillChange', transition); + sendEvent(router, 'routeWillChange', [transition]); if (DEBUG) { freezeRouteInfo(transition); } - router._routerService.trigger('routeWillChange', transition); + sendEvent(router._routerService, 'routeWillChange', [transition]); // in case of intermediate transition we update the current route // to make router.currentRoute.name consistent with router.currentRouteName @@ -433,12 +424,12 @@ class EmberRouter extends EmberObject.extend(Evented) implements Evented { routeDidChange(transition: Transition) { router.set('currentRoute', transition.to); once(() => { - router.trigger('routeDidChange', transition); + sendEvent(router, 'routeDidChange', [transition]); if (DEBUG) { freezeRouteInfo(transition); } - router._routerService.trigger('routeDidChange', transition); + sendEvent(router._routerService, 'routeDidChange', [transition]); }); } diff --git a/packages/@ember/routing/type-tests/router/index.test.ts b/packages/@ember/routing/type-tests/router/index.test.ts index 1d1f0d954d6..cfcc089dfdb 100644 --- a/packages/@ember/routing/type-tests/router/index.test.ts +++ b/packages/@ember/routing/type-tests/router/index.test.ts @@ -1,13 +1,11 @@ import type Owner from '@ember/owner'; import type EmberObject from '@ember/object'; -import type Evented from '@ember/object/evented'; import { default as Location, Registry as LocationRegistry } from '@ember/routing/location'; import Router from '@ember/routing/router'; import { expectTypeOf } from 'expect-type'; import type { Transition } from 'router_js'; expectTypeOf().toMatchTypeOf(); -expectTypeOf().toMatchTypeOf(); // NOTE: This is invalid, but acceptable for type tests let owner = {} as Owner; diff --git a/packages/@ember/runloop/index.ts b/packages/@ember/runloop/index.ts index bac83b17287..6d38adadc02 100644 --- a/packages/@ember/runloop/index.ts +++ b/packages/@ember/runloop/index.ts @@ -227,16 +227,9 @@ export function join(methodOrTarget: any, methodOrArg?: any, ...additionalArgs: ```app/components/rich-text-editor.js import Component from '@ember/component'; - import { on } from '@ember/object/evented'; import { bind } from '@ember/runloop'; export default Component.extend({ - initializeTinyMCE: on('didInsertElement', function() { - tinymce.init({ - selector: '#' + this.$().prop('id'), - setup: bind(this, this.setupEditor) - }); - }), didInsertElement() { tinymce.init({ diff --git a/packages/ember/barrel.ts b/packages/ember/barrel.ts index 3bf85c404c3..857a5d758fa 100644 --- a/packages/ember/barrel.ts +++ b/packages/ember/barrel.ts @@ -91,7 +91,6 @@ import EmberEngineInstance from '@ember/engine/instance'; import EmberEnumerable from '@ember/enumerable'; import EmberMutableEnumerable from '@ember/enumerable/mutable'; import EmberCoreObject from '@ember/object/core'; -import EmberEvented, { on as emberOn } from '@ember/object/evented'; import EmberMixin, { mixin as emberMixin } from '@ember/object/mixin'; import EmberObservable from '@ember/object/observable'; import { @@ -350,11 +349,6 @@ namespace Ember { export const CoreObject = EmberCoreObject; export type CoreObject = EmberCoreObject; - // ****@ember/object/evented**** - export const Evented = EmberEvented; - export type Evented = EmberEvented; - export const on = emberOn; - // ****@ember/object/events**** export const addListener = emberAddListener; export const removeListener = emberRemoveListener; diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index 124ec7265b5..444ae2c3364 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -80,7 +80,6 @@ import * as test21 from '@ember/object'; import * as test22 from '@ember/object/compat'; import * as test23 from '@ember/object/computed'; import * as test24 from '@ember/object/core'; -import * as test25 from '@ember/object/evented'; import * as test26 from '@ember/object/events'; import * as test27 from '@ember/object/internals'; import * as test28 from '@ember/object/mixin'; @@ -213,8 +212,6 @@ let allExports = [ ['ComputedProperty', '@ember/object/computed', 'default', test23], ['expandProperties', '@ember/object/computed', 'expandProperties', test23], ['CoreObject', '@ember/object/core', 'default', test24], - ['Evented', '@ember/object/evented', 'default', test25], - ['on', '@ember/object/evented', 'on', test25], ['addListener', '@ember/object/events', 'addListener', test26], ['removeListener', '@ember/object/events', 'removeListener', test26], ['sendEvent', '@ember/object/events', 'sendEvent', test26], diff --git a/packages/ember/tests/routing/decoupled_basic_test.js b/packages/ember/tests/routing/decoupled_basic_test.js index a71b245d919..06dcaa0f9b2 100644 --- a/packages/ember/tests/routing/decoupled_basic_test.js +++ b/packages/ember/tests/routing/decoupled_basic_test.js @@ -879,9 +879,7 @@ moduleFor( } ['@test `activate` event fires on the route'](assert) { - assert.expect(4); - - let eventFired = 0; + assert.expect(2); this.router.map(function () { this.route('nork'); @@ -890,15 +888,6 @@ moduleFor( this.add( 'route:nork', class extends Route { - init() { - super.init(...arguments); - - this.on('activate', function (transition) { - assert.equal(++eventFired, 1, 'activate event is fired once'); - assert.ok(transition, 'transition is passed to activate event'); - }); - } - activate(transition) { assert.ok(true, 'activate hook is called'); assert.ok(transition, 'transition is passed to activate hook'); @@ -910,9 +899,7 @@ moduleFor( } ['@test `deactivate` event fires on the route'](assert) { - assert.expect(4); - - let eventFired = 0; + assert.expect(2); this.router.map(function () { this.route('nork'); @@ -922,15 +909,6 @@ moduleFor( this.add( 'route:nork', class extends Route { - init() { - super.init(...arguments); - - this.on('deactivate', function (transition) { - assert.equal(++eventFired, 1, 'deactivate event is fired once'); - assert.ok(transition, 'transition is passed'); - }); - } - deactivate(transition) { assert.ok(true, 'deactivate hook is called'); assert.ok(transition, 'transition is passed'); diff --git a/tests/docs/expected.js b/tests/docs/expected.js index 028f7f84eb1..fe8facb1739 100644 --- a/tests/docs/expected.js +++ b/tests/docs/expected.js @@ -355,7 +355,6 @@ module.exports = { 'off', 'on', 'once', - 'one', 'oneWay', 'onInjectHelpers', 'onLoad', @@ -570,7 +569,6 @@ module.exports = { 'Engine', 'EngineInstance', 'EventTarget', - 'Evented', 'FEATURES', 'Factory', 'FactoryManager', @@ -618,7 +616,6 @@ module.exports = { '@ember/helper', '@ember/object', '@ember/object/core', - '@ember/object/evented', '@ember/object/mixin', '@ember/object/observable', '@ember/object/promise-proxy-mixin', diff --git a/tests/node/app-boot-test.js b/tests/node/app-boot-test.js index 6f16236bc3c..45fb1036afe 100644 --- a/tests/node/app-boot-test.js +++ b/tests/node/app-boot-test.js @@ -108,30 +108,4 @@ QUnit.module('App Boot', function (hooks) { return this.all(promises); }); - - QUnit.test('lifecycle hooks disabled', function (assert) { - assert.expect(1); - - this.template('application', "{{my-component foo='bar'}}{{outlet}}"); - - this.component('my-component', { - didReceiveAttrs() { - assert.ok(true, 'should trigger didReceiveAttrs hook'); - }, - willRender() { - assert.ok(false, 'should not trigger willRender hook'); - }, - didRender() { - assert.ok(false, 'should not trigger didRender hook'); - }, - willInsertElement() { - assert.ok(false, 'should not trigger willInsertElement hook'); - }, - didInsertElement() { - assert.ok(false, 'should not trigger didInsertElement hook'); - }, - }); - - return this.renderToHTML('/'); - }); }); diff --git a/type-tests/@ember/object-test/event.ts b/type-tests/@ember/object-test/event.ts deleted file mode 100644 index f2968910809..00000000000 --- a/type-tests/@ember/object-test/event.ts +++ /dev/null @@ -1,87 +0,0 @@ -import EmberObject from '@ember/object'; -import { sendEvent, addListener, removeListener } from '@ember/object/events'; -import Evented, { on } from '@ember/object/evented'; - -function testOn() { - const Job = EmberObject.extend({ - logStartOrUpdate: on('started', 'updated', () => { - console.log('Job updated!'); - }), - logCompleted: on('completed', () => { - console.log('Job completed!'); - }), - }); - - const job = Job.create(); - - sendEvent(job, 'started'); // Logs 'Job started!' - sendEvent(job, 'updated'); // Logs 'Job updated!' - sendEvent(job, 'completed'); // Logs 'Job completed!' -} - -function testEvented() { - interface Person extends Evented {} - class Person extends EmberObject { - greet() { - this.trigger('greet'); - } - } - - const person = Person.create(); - - person.on('potato', 'greet'); - - const target = { - hi() { - console.log('Hello!'); - }, - }; - - person.on('greet', () => { - console.log('Our person has greeted'); - }); - - person - .on('greet', () => { - console.log('Our person has greeted'); - }) - .one('greet', () => { - console.log('Offer one-time special'); - }) - .off('event', {}, () => {}); - - person.on('greet', target, 'hi').one('greet', target, 'hi').off('event', target, 'hi'); - - person - .on('greet', target, target.hi) - .one('greet', target, target.hi) - .off('event', target, target.hi); - - person.greet(); -} - -function testListener() { - function willDestroyListener() {} - - class Destroy extends EmberObject { - init() { - addListener(this, 'willDestroy', this, 'willDestroyListener'); - addListener(this, 'willDestroy', this, 'willDestroyListener', true); - addListener(this, 'willDestroy', this, willDestroyListener); - addListener(this, 'willDestroy', this, willDestroyListener, true); - removeListener(this, 'willDestroy', this, 'willDestroyListener'); - removeListener(this, 'willDestroy', this, willDestroyListener); - - addListener(this, 'willDestroy', null, 'willDestroyListener'); - addListener(this, 'willDestroy', null, 'willDestroyListener', true); - addListener(this, 'willDestroy', null, willDestroyListener); - addListener(this, 'willDestroy', null, willDestroyListener, true); - removeListener(this, 'willDestroy', null, 'willDestroyListener'); - removeListener(this, 'willDestroy', null, willDestroyListener); - } - - willDestroyListener() { - willDestroyListener(); - } - } -} diff --git a/type-tests/@ember/routing-test/router-service.ts b/type-tests/@ember/routing-test/router-service.ts index 2b6083b8a34..5cc2030bbcb 100644 --- a/type-tests/@ember/routing-test/router-service.ts +++ b/type-tests/@ember/routing-test/router-service.ts @@ -17,13 +17,6 @@ router.transitionTo( { queryParams: {} } ); -const routeWillChangeHandler = () => {}; -expectTypeOf(router.on('routeWillChange', routeWillChangeHandler)).toEqualTypeOf(); -expectTypeOf(router.has('routeWillChange')).toEqualTypeOf(); -expectTypeOf(router.off('routeWillChange', routeWillChangeHandler)).toEqualTypeOf(); -expectTypeOf(router.one('routeWillChange', routeWillChangeHandler)).toEqualTypeOf(); -expectTypeOf(router.trigger('routeWillChange', 'boo')).toBeAny(); - const transition = router.transitionTo('someRoute'); expectTypeOf(transition.abort()).toEqualTypeOf(); diff --git a/type-tests/ember/ember-module-tests.ts b/type-tests/ember/ember-module-tests.ts index d96579fefc2..7a6f1105452 100644 --- a/type-tests/ember/ember-module-tests.ts +++ b/type-tests/ember/ember-module-tests.ts @@ -80,13 +80,6 @@ const o2 = O2.create({ name: 'foo', age: 3, }); -// on -class O3 extends Ember.Object { - name = 'foo'; - nameWatcher = Ember.on('init', () => {}); - nameWatcher2 = Ember.on('destroy', () => {}); -} -const o3 = O3.create(); // removeListener Ember.removeListener(O2, 'create', null, () => {}); Ember.removeListener(O2, 'create', null, 'create'); @@ -187,13 +180,6 @@ e1.register('data:foo', {}, { instantiate: false }); // Ember.EngineInstance const ei1 = new Ember.EngineInstance(); ei1.lookup('data:foo'); -// Ember.Evented -interface OE1 extends Ember.Evented {} -class OE1 extends Ember.Object.extend(Ember.Evented) {} -const oe1 = OE1.create(); -oe1.trigger('foo'); -oe1.on('bar', () => {}); -oe1.on('bar', { foo() {} }, () => {}); // Ember.HashLocation const hl = new Ember.HashLocation(); expectTypeOf(hl).toEqualTypeOf(); diff --git a/type-tests/ember/event.ts b/type-tests/ember/event.ts index 90580d8ba9a..e34eb37e0c6 100755 --- a/type-tests/ember/event.ts +++ b/type-tests/ember/event.ts @@ -1,43 +1,5 @@ import Ember from 'ember'; -function testOn() { - const Job = Ember.Object.extend({ - logCompleted: Ember.on('completed', () => { - console.log('Job completed!'); - }), - }); - - const job = Job.create(); - - Ember.sendEvent(job, 'completed'); // Logs 'Job completed!' -} - -function testEvented() { - interface Person extends Ember.Evented {} - class Person extends Ember.Object { - greet() { - this.trigger('greet'); - } - } - - const person = Person.create(); - - person.on('greet', () => { - console.log('Our person has greeted'); - }); - - person - .on('greet', () => { - console.log('Our person has greeted'); - }) - .one('greet', () => { - console.log('Offer one-time special'); - }) - .off('event', {}, () => {}); - - person.greet(); -} - function testObserver() { Ember.Object.extend({ valueObserver: Ember.observer('value', () => { diff --git a/type-tests/ember/route.ts b/type-tests/ember/route.ts index 67b5fa54ef8..5e76d4e016e 100755 --- a/type-tests/ember/route.ts +++ b/type-tests/ember/route.ts @@ -89,14 +89,6 @@ class WithBadReturningBeforeAndModelHooks extends Route { } } -class HasEvented extends Route { - methodUsingEvented() { - this.on('some-event', this, 'aMethod'); - } - - aMethod() {} -} - class HasActionHandler extends Route { methodUsingActionHandler() { expectTypeOf(this.actions).toEqualTypeOf any>>();