1
|
# depd
|
2
|
|
3
|
[![NPM Version][npm-version-image]][npm-url]
|
4
|
[![NPM Downloads][npm-downloads-image]][npm-url]
|
5
|
[![Node.js Version][node-image]][node-url]
|
6
|
[![Linux Build][travis-image]][travis-url]
|
7
|
[![Windows Build][appveyor-image]][appveyor-url]
|
8
|
[![Coverage Status][coveralls-image]][coveralls-url]
|
9
|
|
10
|
Deprecate all the things
|
11
|
|
12
|
> With great modules comes great responsibility; mark things deprecated!
|
13
|
|
14
|
## Install
|
15
|
|
16
|
This module is installed directly using `npm`:
|
17
|
|
18
|
```sh
|
19
|
$ npm install depd
|
20
|
```
|
21
|
|
22
|
This module can also be bundled with systems like
|
23
|
[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/),
|
24
|
though by default this module will alter it's API to no longer display or
|
25
|
track deprecations.
|
26
|
|
27
|
## API
|
28
|
|
29
|
<!-- eslint-disable no-unused-vars -->
|
30
|
|
31
|
```js
|
32
|
var deprecate = require('depd')('my-module')
|
33
|
```
|
34
|
|
35
|
This library allows you to display deprecation messages to your users.
|
36
|
This library goes above and beyond with deprecation warnings by
|
37
|
introspection of the call stack (but only the bits that it is interested
|
38
|
in).
|
39
|
|
40
|
Instead of just warning on the first invocation of a deprecated
|
41
|
function and never again, this module will warn on the first invocation
|
42
|
of a deprecated function per unique call site, making it ideal to alert
|
43
|
users of all deprecated uses across the code base, rather than just
|
44
|
whatever happens to execute first.
|
45
|
|
46
|
The deprecation warnings from this module also include the file and line
|
47
|
information for the call into the module that the deprecated function was
|
48
|
in.
|
49
|
|
50
|
**NOTE** this library has a similar interface to the `debug` module, and
|
51
|
this module uses the calling file to get the boundary for the call stacks,
|
52
|
so you should always create a new `deprecate` object in each file and not
|
53
|
within some central file.
|
54
|
|
55
|
### depd(namespace)
|
56
|
|
57
|
Create a new deprecate function that uses the given namespace name in the
|
58
|
messages and will display the call site prior to the stack entering the
|
59
|
file this function was called from. It is highly suggested you use the
|
60
|
name of your module as the namespace.
|
61
|
|
62
|
### deprecate(message)
|
63
|
|
64
|
Call this function from deprecated code to display a deprecation message.
|
65
|
This message will appear once per unique caller site. Caller site is the
|
66
|
first call site in the stack in a different file from the caller of this
|
67
|
function.
|
68
|
|
69
|
If the message is omitted, a message is generated for you based on the site
|
70
|
of the `deprecate()` call and will display the name of the function called,
|
71
|
similar to the name displayed in a stack trace.
|
72
|
|
73
|
### deprecate.function(fn, message)
|
74
|
|
75
|
Call this function to wrap a given function in a deprecation message on any
|
76
|
call to the function. An optional message can be supplied to provide a custom
|
77
|
message.
|
78
|
|
79
|
### deprecate.property(obj, prop, message)
|
80
|
|
81
|
Call this function to wrap a given property on object in a deprecation message
|
82
|
on any accessing or setting of the property. An optional message can be supplied
|
83
|
to provide a custom message.
|
84
|
|
85
|
The method must be called on the object where the property belongs (not
|
86
|
inherited from the prototype).
|
87
|
|
88
|
If the property is a data descriptor, it will be converted to an accessor
|
89
|
descriptor in order to display the deprecation message.
|
90
|
|
91
|
### process.on('deprecation', fn)
|
92
|
|
93
|
This module will allow easy capturing of deprecation errors by emitting the
|
94
|
errors as the type "deprecation" on the global `process`. If there are no
|
95
|
listeners for this type, the errors are written to STDERR as normal, but if
|
96
|
there are any listeners, nothing will be written to STDERR and instead only
|
97
|
emitted. From there, you can write the errors in a different format or to a
|
98
|
logging source.
|
99
|
|
100
|
The error represents the deprecation and is emitted only once with the same
|
101
|
rules as writing to STDERR. The error has the following properties:
|
102
|
|
103
|
- `message` - This is the message given by the library
|
104
|
- `name` - This is always `'DeprecationError'`
|
105
|
- `namespace` - This is the namespace the deprecation came from
|
106
|
- `stack` - This is the stack of the call to the deprecated thing
|
107
|
|
108
|
Example `error.stack` output:
|
109
|
|
110
|
```
|
111
|
DeprecationError: my-cool-module deprecated oldfunction
|
112
|
at Object.<anonymous> ([eval]-wrapper:6:22)
|
113
|
at Module._compile (module.js:456:26)
|
114
|
at evalScript (node.js:532:25)
|
115
|
at startup (node.js:80:7)
|
116
|
at node.js:902:3
|
117
|
```
|
118
|
|
119
|
### process.env.NO_DEPRECATION
|
120
|
|
121
|
As a user of modules that are deprecated, the environment variable `NO_DEPRECATION`
|
122
|
is provided as a quick solution to silencing deprecation warnings from being
|
123
|
output. The format of this is similar to that of `DEBUG`:
|
124
|
|
125
|
```sh
|
126
|
$ NO_DEPRECATION=my-module,othermod node app.js
|
127
|
```
|
128
|
|
129
|
This will suppress deprecations from being output for "my-module" and "othermod".
|
130
|
The value is a list of comma-separated namespaces. To suppress every warning
|
131
|
across all namespaces, use the value `*` for a namespace.
|
132
|
|
133
|
Providing the argument `--no-deprecation` to the `node` executable will suppress
|
134
|
all deprecations (only available in Node.js 0.8 or higher).
|
135
|
|
136
|
**NOTE** This will not suppress the deperecations given to any "deprecation"
|
137
|
event listeners, just the output to STDERR.
|
138
|
|
139
|
### process.env.TRACE_DEPRECATION
|
140
|
|
141
|
As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION`
|
142
|
is provided as a solution to getting more detailed location information in deprecation
|
143
|
warnings by including the entire stack trace. The format of this is the same as
|
144
|
`NO_DEPRECATION`:
|
145
|
|
146
|
```sh
|
147
|
$ TRACE_DEPRECATION=my-module,othermod node app.js
|
148
|
```
|
149
|
|
150
|
This will include stack traces for deprecations being output for "my-module" and
|
151
|
"othermod". The value is a list of comma-separated namespaces. To trace every
|
152
|
warning across all namespaces, use the value `*` for a namespace.
|
153
|
|
154
|
Providing the argument `--trace-deprecation` to the `node` executable will trace
|
155
|
all deprecations (only available in Node.js 0.8 or higher).
|
156
|
|
157
|
**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`.
|
158
|
|
159
|
## Display
|
160
|
|
161
|
![message](files/message.png)
|
162
|
|
163
|
When a user calls a function in your library that you mark deprecated, they
|
164
|
will see the following written to STDERR (in the given colors, similar colors
|
165
|
and layout to the `debug` module):
|
166
|
|
167
|
```
|
168
|
bright cyan bright yellow
|
169
|
| | reset cyan
|
170
|
| | | |
|
171
|
▼ ▼ ▼ ▼
|
172
|
my-cool-module deprecated oldfunction [eval]-wrapper:6:22
|
173
|
▲ ▲ ▲ ▲
|
174
|
| | | |
|
175
|
namespace | | location of mycoolmod.oldfunction() call
|
176
|
| deprecation message
|
177
|
the word "deprecated"
|
178
|
```
|
179
|
|
180
|
If the user redirects their STDERR to a file or somewhere that does not support
|
181
|
colors, they see (similar layout to the `debug` module):
|
182
|
|
183
|
```
|
184
|
Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22
|
185
|
▲ ▲ ▲ ▲ ▲
|
186
|
| | | | |
|
187
|
timestamp of message namespace | | location of mycoolmod.oldfunction() call
|
188
|
| deprecation message
|
189
|
the word "deprecated"
|
190
|
```
|
191
|
|
192
|
## Examples
|
193
|
|
194
|
### Deprecating all calls to a function
|
195
|
|
196
|
This will display a deprecated message about "oldfunction" being deprecated
|
197
|
from "my-module" on STDERR.
|
198
|
|
199
|
```js
|
200
|
var deprecate = require('depd')('my-cool-module')
|
201
|
|
202
|
// message automatically derived from function name
|
203
|
// Object.oldfunction
|
204
|
exports.oldfunction = deprecate.function(function oldfunction () {
|
205
|
// all calls to function are deprecated
|
206
|
})
|
207
|
|
208
|
// specific message
|
209
|
exports.oldfunction = deprecate.function(function () {
|
210
|
// all calls to function are deprecated
|
211
|
}, 'oldfunction')
|
212
|
```
|
213
|
|
214
|
### Conditionally deprecating a function call
|
215
|
|
216
|
This will display a deprecated message about "weirdfunction" being deprecated
|
217
|
from "my-module" on STDERR when called with less than 2 arguments.
|
218
|
|
219
|
```js
|
220
|
var deprecate = require('depd')('my-cool-module')
|
221
|
|
222
|
exports.weirdfunction = function () {
|
223
|
if (arguments.length < 2) {
|
224
|
// calls with 0 or 1 args are deprecated
|
225
|
deprecate('weirdfunction args < 2')
|
226
|
}
|
227
|
}
|
228
|
```
|
229
|
|
230
|
When calling `deprecate` as a function, the warning is counted per call site
|
231
|
within your own module, so you can display different deprecations depending
|
232
|
on different situations and the users will still get all the warnings:
|
233
|
|
234
|
```js
|
235
|
var deprecate = require('depd')('my-cool-module')
|
236
|
|
237
|
exports.weirdfunction = function () {
|
238
|
if (arguments.length < 2) {
|
239
|
// calls with 0 or 1 args are deprecated
|
240
|
deprecate('weirdfunction args < 2')
|
241
|
} else if (typeof arguments[0] !== 'string') {
|
242
|
// calls with non-string first argument are deprecated
|
243
|
deprecate('weirdfunction non-string first arg')
|
244
|
}
|
245
|
}
|
246
|
```
|
247
|
|
248
|
### Deprecating property access
|
249
|
|
250
|
This will display a deprecated message about "oldprop" being deprecated
|
251
|
from "my-module" on STDERR when accessed. A deprecation will be displayed
|
252
|
when setting the value and when getting the value.
|
253
|
|
254
|
```js
|
255
|
var deprecate = require('depd')('my-cool-module')
|
256
|
|
257
|
exports.oldprop = 'something'
|
258
|
|
259
|
// message automatically derives from property name
|
260
|
deprecate.property(exports, 'oldprop')
|
261
|
|
262
|
// explicit message
|
263
|
deprecate.property(exports, 'oldprop', 'oldprop >= 0.10')
|
264
|
```
|
265
|
|
266
|
## License
|
267
|
|
268
|
[MIT](LICENSE)
|
269
|
|
270
|
[npm-version-image]: https://img.shields.io/npm/v/depd.svg
|
271
|
[npm-downloads-image]: https://img.shields.io/npm/dm/depd.svg
|
272
|
[npm-url]: https://npmjs.org/package/depd
|
273
|
[travis-image]: https://img.shields.io/travis/dougwilson/nodejs-depd/master.svg?label=linux
|
274
|
[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd
|
275
|
[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/nodejs-depd/master.svg?label=windows
|
276
|
[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd
|
277
|
[coveralls-image]: https://img.shields.io/coveralls/dougwilson/nodejs-depd/master.svg
|
278
|
[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master
|
279
|
[node-image]: https://img.shields.io/node/v/depd.svg
|
280
|
[node-url]: https://nodejs.org/en/download/
|