Skip to content

Commit

Permalink
Deprecate @ember/error per RFC 889
Browse files Browse the repository at this point in the history
  • Loading branch information
wagenet committed Jan 3, 2023
1 parent 78b3590 commit c5d7108
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 7 deletions.
41 changes: 40 additions & 1 deletion packages/@ember/error/index.ts
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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_ember-polyfills-deprecate-assign',
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;
34 changes: 33 additions & 1 deletion packages/@ember/error/tests/index_test.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,50 @@
import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers';
import EmberError from '@ember/error';

moduleFor(
'Ember Error Throwing',
class extends TestCase {
['@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';
},
'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.');
}
}
);
3 changes: 2 additions & 1 deletion packages/@ember/error/type-tests/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import EmberError from '@ember/error';
import { expectTypeOf } from 'expect-type';

expectTypeOf(EmberError).toEqualTypeOf<ErrorConstructor>();
expectTypeOf(EmberError("Blah")).toEqualTypeOf<Error>();
expectTypeOf(new EmberError("Blah")).toEqualTypeOf<Error>();
7 changes: 3 additions & 4 deletions packages/@ember/runloop/tests/unwind_test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { run, schedule, _getCurrentRunLoop } from '..';
import EmberError from '@ember/error';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';

moduleFor(
Expand All @@ -12,7 +11,7 @@ moduleFor(
() => {
run(() => {
schedule('actions', function () {
throw new EmberError('boom!');
throw new Error('boom!');
});
});
},
Expand All @@ -37,10 +36,10 @@ moduleFor(
assert.throws(
() => {
run(function () {
throw new EmberError('boom!');
throw new Error('boom!');
});
},
EmberError,
Error,
'boom!'
);

Expand Down

0 comments on commit c5d7108

Please sign in to comment.