diff --git a/packages/@ember/error/index.ts b/packages/@ember/error/index.ts index 17154b1b671..cee6dede8e3 100644 --- a/packages/@ember/error/index.ts +++ b/packages/@ember/error/index.ts @@ -1,7 +1,17 @@ +import { deprecate } from '@ember/debug'; +import { DEBUG } from '@glimmer/env'; + /** @module @ember/error */ +/** ErrorConstructor without node extensions */ +interface BrowserErrorConstructor { + new (message?: string): Error; + (message?: string): Error; + readonly prototype: Error; +} + /** The JavaScript Error object used by Ember.assert. @@ -10,5 +20,34 @@ @extends Error @constructor @public + @deprecated */ -export default Error; +let EmberError: BrowserErrorConstructor; +if (DEBUG) { + // eslint-disable-next-line no-inner-declarations + function EmberDebugConstructor(message?: string) { + deprecate( + 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.', + false, + { + id: 'deprecate-ember-error', + until: '5.0.0', + url: 'https://deprecations.emberjs.com/v4.x/#toc_deprecate-ember-error', + for: 'ember-source', + since: { + available: '4.10.0', + enabled: '4.10.0', + }, + } + ); + return new Error(message); + } + EmberDebugConstructor.prototype = Error.prototype; + + // SAFETY: We need this cast since our EmberDebugConstructor doesn't define a type for `new` even though it will work with `new`. + EmberError = EmberDebugConstructor as BrowserErrorConstructor; +} else { + EmberError = Error; +} + +export default EmberError; diff --git a/packages/@ember/error/tests/index_test.js b/packages/@ember/error/tests/index_test.js index 6af1a84329a..f2b37f069fe 100644 --- a/packages/@ember/error/tests/index_test.js +++ b/packages/@ember/error/tests/index_test.js @@ -1,4 +1,5 @@ import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; +import EmberError from '@ember/error'; moduleFor( 'Ember Error Throwing', @@ -6,7 +7,9 @@ moduleFor( ['@test new EmberError displays provided message'](assert) { assert.throws( () => { - throw new Error('A Message'); + expectDeprecation(() => { + throw new EmberError('A Message'); + }, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.'); }, function (e) { return e.message === 'A Message'; @@ -14,5 +17,34 @@ moduleFor( 'the assigned message was displayed' ); } + ['@test new EmberError is instanceof EmberError'](assert) { + expectDeprecation(() => { + assert.ok( + new EmberError('A Message') instanceof EmberError, + 'new EmberError is instanceof EmberError' + ); + }, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.'); + } + ['@test EmberError(...) displays provided message'](assert) { + assert.throws( + () => { + expectDeprecation(() => { + throw EmberError('A Message'); + }, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.'); + }, + function (e) { + return e.message === 'A Message'; + }, + 'the assigned message was displayed' + ); + } + ['@test EmberError(...) is instanceof EmberError'](assert) { + expectDeprecation(() => { + assert.ok( + EmberError('A Message') instanceof EmberError, + 'new EmberError is instanceof EmberError' + ); + }, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.'); + } } ); diff --git a/packages/@ember/error/type-tests/index.test.ts b/packages/@ember/error/type-tests/index.test.ts index a0120bdacc5..b13ea57ca98 100644 --- a/packages/@ember/error/type-tests/index.test.ts +++ b/packages/@ember/error/type-tests/index.test.ts @@ -1,4 +1,5 @@ import EmberError from '@ember/error'; import { expectTypeOf } from 'expect-type'; -expectTypeOf(EmberError).toEqualTypeOf(); +expectTypeOf(EmberError("Blah")).toEqualTypeOf(); +expectTypeOf(new EmberError("Blah")).toEqualTypeOf(); diff --git a/packages/@ember/runloop/tests/unwind_test.js b/packages/@ember/runloop/tests/unwind_test.js index 06a7f87da42..8a01ce128d9 100644 --- a/packages/@ember/runloop/tests/unwind_test.js +++ b/packages/@ember/runloop/tests/unwind_test.js @@ -1,5 +1,4 @@ import { run, schedule, _getCurrentRunLoop } from '..'; -import EmberError from '@ember/error'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; moduleFor( @@ -12,7 +11,7 @@ moduleFor( () => { run(() => { schedule('actions', function () { - throw new EmberError('boom!'); + throw new Error('boom!'); }); }); }, @@ -37,10 +36,10 @@ moduleFor( assert.throws( () => { run(function () { - throw new EmberError('boom!'); + throw new Error('boom!'); }); }, - EmberError, + Error, 'boom!' );