Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 295d1ea

Browse filesBrowse files
vdeturckheimcjihrig
authored andcommitted
util: support classes in util.deprecate()
Classes cannot be instantiated without new, but util.deprecate() uses Function.prototype.apply(). This commit uses new.target to detect constructor calls, allowing classes to be deprecated. PR-URL: #7690 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Michaël Zasso <mic.besace@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent df35ae6 commit 295d1ea
Copy full SHA for 295d1ea

File tree

Expand file treeCollapse file tree

5 files changed

+62
-4
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

5 files changed

+62
-4
lines changed
Open diff view settings
Collapse file

‎doc/api/util.md‎

Copy file name to clipboardExpand all lines: doc/api/util.md
+1-1Lines changed: 1 addition & 1 deletion
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ environment variable. For example: `NODE_DEBUG=fs,net,tls`.
4646

4747
## util.deprecate(function, string)
4848

49-
The `util.deprecate()` method wraps the given `function` in such a way that
49+
The `util.deprecate()` method wraps the given `function` or class in such a way that
5050
it is marked as deprecated.
5151

5252
```js
Collapse file

‎lib/internal/util.js‎

Copy file name to clipboardExpand all lines: lib/internal/util.js
+9Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,18 @@ exports._deprecate = function(fn, msg) {
5757
var warned = false;
5858
function deprecated() {
5959
warned = exports.printDeprecationMessage(msg, warned, deprecated);
60+
if (new.target) {
61+
return Reflect.construct(fn, arguments, new.target);
62+
}
6063
return fn.apply(this, arguments);
6164
}
6265

66+
// The wrapper will keep the same prototype as fn to maintain prototype chain
67+
Object.setPrototypeOf(deprecated, fn);
68+
if (fn.prototype) {
69+
Object.setPrototypeOf(deprecated.prototype, fn.prototype);
70+
}
71+
6372
return deprecated;
6473
};
6574

Collapse file
+12Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const util = require('util');
2+
const assert = require('assert');
3+
4+
class deprecatedClass {
5+
}
6+
7+
const deprecated = util.deprecate(deprecatedClass, 'deprecatedClass is deprecated.');
8+
9+
const instance = new deprecated();
10+
11+
assert(instance instanceof deprecated);
12+
assert(instance instanceof deprecatedClass);
Collapse file
+19Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const util = require('util');
2+
const assert = require('assert');
3+
4+
class deprecatedClass {
5+
}
6+
7+
const deprecated = util.deprecate(deprecatedClass, 'deprecatedClass is deprecated.');
8+
9+
class subclass extends deprecated {
10+
constructor() {
11+
super();
12+
}
13+
}
14+
15+
const instance = new subclass();
16+
17+
assert(instance instanceof subclass);
18+
assert(instance instanceof deprecated);
19+
assert(instance instanceof deprecatedClass);
Collapse file

‎test/sequential/test-deprecation-flags.js‎

Copy file name to clipboardExpand all lines: test/sequential/test-deprecation-flags.js
+21-3Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@ const execFile = require('child_process').execFile;
55
const depmod = require.resolve(common.fixturesDir + '/deprecated.js');
66
const node = process.execPath;
77

8-
const depUserland =
9-
require.resolve(common.fixturesDir + '/deprecated-userland-function.js');
8+
const depUserlandFunction =
9+
require.resolve(common.fixturesDir + '/deprecated-userland-function.js');
10+
11+
const depUserlandClass =
12+
require.resolve(common.fixturesDir + '/deprecated-userland-class.js');
13+
14+
const depUserlandSubClass =
15+
require.resolve(common.fixturesDir + '/deprecated-userland-subclass.js');
1016

1117
const normal = [depmod];
1218
const noDep = ['--no-deprecation', depmod];
@@ -39,10 +45,22 @@ execFile(node, traceDep, function(er, stdout, stderr) {
3945
console.log('trace ok');
4046
});
4147

42-
execFile(node, [depUserland], function(er, stdout, stderr) {
48+
execFile(node, [depUserlandFunction], function(er, stdout, stderr) {
4349
console.error('normal: testing deprecated userland function');
4450
assert.equal(er, null);
4551
assert.equal(stdout, '');
4652
assert(/deprecatedFunction is deprecated/.test(stderr));
4753
console.error('normal: ok');
4854
});
55+
56+
execFile(node, [depUserlandClass], function(er, stdout, stderr) {
57+
assert.strictEqual(er, null);
58+
assert.strictEqual(stdout, '');
59+
assert(/deprecatedClass is deprecated/.test(stderr));
60+
});
61+
62+
execFile(node, [depUserlandSubClass], function(er, stdout, stderr) {
63+
assert.strictEqual(er, null);
64+
assert.strictEqual(stdout, '');
65+
assert(/deprecatedClass is deprecated/.test(stderr));
66+
});

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.