Skip to content

Commit 7736b91

Browse files
authored
Merge pull request #20342 from emberjs/deprecate-ember-error
Deprecate @ember/error per RFC 889
2 parents 2fc74e0 + 045f46f commit 7736b91

File tree

4 files changed

+78
-7
lines changed

4 files changed

+78
-7
lines changed

packages/@ember/error/index.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1+
import { deprecate } from '@ember/debug';
2+
import { DEBUG } from '@glimmer/env';
3+
14
/**
25
@module @ember/error
36
*/
47

8+
/** ErrorConstructor without node extensions */
9+
interface BrowserErrorConstructor {
10+
new (message?: string): Error;
11+
(message?: string): Error;
12+
readonly prototype: Error;
13+
}
14+
515
/**
616
The JavaScript Error object used by Ember.assert.
717
@@ -10,5 +20,34 @@
1020
@extends Error
1121
@constructor
1222
@public
23+
@deprecated
1324
*/
14-
export default Error;
25+
let EmberError: BrowserErrorConstructor;
26+
if (DEBUG) {
27+
// eslint-disable-next-line no-inner-declarations
28+
function EmberDebugConstructor(message?: string) {
29+
deprecate(
30+
'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.',
31+
false,
32+
{
33+
id: 'deprecate-ember-error',
34+
until: '5.0.0',
35+
url: 'https://deprecations.emberjs.com/v4.x/#toc_deprecate-ember-error',
36+
for: 'ember-source',
37+
since: {
38+
available: '4.10.0',
39+
enabled: '4.10.0',
40+
},
41+
}
42+
);
43+
return new Error(message);
44+
}
45+
EmberDebugConstructor.prototype = Error.prototype;
46+
47+
// SAFETY: We need this cast since our EmberDebugConstructor doesn't define a type for `new` even though it will work with `new`.
48+
EmberError = EmberDebugConstructor as BrowserErrorConstructor;
49+
} else {
50+
EmberError = Error;
51+
}
52+
53+
export default EmberError;
Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,50 @@
11
import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers';
2+
import EmberError from '@ember/error';
23

34
moduleFor(
45
'Ember Error Throwing',
56
class extends TestCase {
67
['@test new EmberError displays provided message'](assert) {
78
assert.throws(
89
() => {
9-
throw new Error('A Message');
10+
expectDeprecation(() => {
11+
throw new EmberError('A Message');
12+
}, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.');
1013
},
1114
function (e) {
1215
return e.message === 'A Message';
1316
},
1417
'the assigned message was displayed'
1518
);
1619
}
20+
['@test new EmberError is instanceof EmberError'](assert) {
21+
expectDeprecation(() => {
22+
assert.ok(
23+
new EmberError('A Message') instanceof EmberError,
24+
'new EmberError is instanceof EmberError'
25+
);
26+
}, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.');
27+
}
28+
['@test EmberError(...) displays provided message'](assert) {
29+
assert.throws(
30+
() => {
31+
expectDeprecation(() => {
32+
throw EmberError('A Message');
33+
}, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.');
34+
},
35+
function (e) {
36+
return e.message === 'A Message';
37+
},
38+
'the assigned message was displayed'
39+
);
40+
}
41+
['@test EmberError(...) is instanceof EmberError'](assert) {
42+
expectDeprecation(() => {
43+
assert.ok(
44+
EmberError('A Message') instanceof EmberError,
45+
'new EmberError is instanceof EmberError'
46+
);
47+
}, 'The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.');
48+
}
1749
}
1850
);
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import EmberError from '@ember/error';
22
import { expectTypeOf } from 'expect-type';
33

4-
expectTypeOf(EmberError).toEqualTypeOf<ErrorConstructor>();
4+
expectTypeOf(EmberError("Blah")).toEqualTypeOf<Error>();
5+
expectTypeOf(new EmberError("Blah")).toEqualTypeOf<Error>();

packages/@ember/runloop/tests/unwind_test.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { run, schedule, _getCurrentRunLoop } from '..';
2-
import EmberError from '@ember/error';
32
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
43

54
moduleFor(
@@ -12,7 +11,7 @@ moduleFor(
1211
() => {
1312
run(() => {
1413
schedule('actions', function () {
15-
throw new EmberError('boom!');
14+
throw new Error('boom!');
1615
});
1716
});
1817
},
@@ -37,10 +36,10 @@ moduleFor(
3736
assert.throws(
3837
() => {
3938
run(function () {
40-
throw new EmberError('boom!');
39+
throw new Error('boom!');
4140
});
4241
},
43-
EmberError,
42+
Error,
4443
'boom!'
4544
);
4645

0 commit comments

Comments
 (0)