281 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# depd
 | 
						|
 | 
						|
[![NPM Version][npm-version-image]][npm-url]
 | 
						|
[![NPM Downloads][npm-downloads-image]][npm-url]
 | 
						|
[![Node.js Version][node-image]][node-url]
 | 
						|
[![Linux Build][travis-image]][travis-url]
 | 
						|
[![Windows Build][appveyor-image]][appveyor-url]
 | 
						|
[![Coverage Status][coveralls-image]][coveralls-url]
 | 
						|
 | 
						|
Deprecate all the things
 | 
						|
 | 
						|
> With great modules comes great responsibility; mark things deprecated!
 | 
						|
 | 
						|
## Install
 | 
						|
 | 
						|
This module is installed directly using `npm`:
 | 
						|
 | 
						|
```sh
 | 
						|
$ npm install depd
 | 
						|
```
 | 
						|
 | 
						|
This module can also be bundled with systems like
 | 
						|
[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/),
 | 
						|
though by default this module will alter it's API to no longer display or
 | 
						|
track deprecations.
 | 
						|
 | 
						|
## API
 | 
						|
 | 
						|
<!-- eslint-disable no-unused-vars -->
 | 
						|
 | 
						|
```js
 | 
						|
var deprecate = require('depd')('my-module')
 | 
						|
```
 | 
						|
 | 
						|
This library allows you to display deprecation messages to your users.
 | 
						|
This library goes above and beyond with deprecation warnings by
 | 
						|
introspection of the call stack (but only the bits that it is interested
 | 
						|
in).
 | 
						|
 | 
						|
Instead of just warning on the first invocation of a deprecated
 | 
						|
function and never again, this module will warn on the first invocation
 | 
						|
of a deprecated function per unique call site, making it ideal to alert
 | 
						|
users of all deprecated uses across the code base, rather than just
 | 
						|
whatever happens to execute first.
 | 
						|
 | 
						|
The deprecation warnings from this module also include the file and line
 | 
						|
information for the call into the module that the deprecated function was
 | 
						|
in.
 | 
						|
 | 
						|
**NOTE** this library has a similar interface to the `debug` module, and
 | 
						|
this module uses the calling file to get the boundary for the call stacks,
 | 
						|
so you should always create a new `deprecate` object in each file and not
 | 
						|
within some central file.
 | 
						|
 | 
						|
### depd(namespace)
 | 
						|
 | 
						|
Create a new deprecate function that uses the given namespace name in the
 | 
						|
messages and will display the call site prior to the stack entering the
 | 
						|
file this function was called from. It is highly suggested you use the
 | 
						|
name of your module as the namespace.
 | 
						|
 | 
						|
### deprecate(message)
 | 
						|
 | 
						|
Call this function from deprecated code to display a deprecation message.
 | 
						|
This message will appear once per unique caller site. Caller site is the
 | 
						|
first call site in the stack in a different file from the caller of this
 | 
						|
function.
 | 
						|
 | 
						|
If the message is omitted, a message is generated for you based on the site
 | 
						|
of the `deprecate()` call and will display the name of the function called,
 | 
						|
similar to the name displayed in a stack trace.
 | 
						|
 | 
						|
### deprecate.function(fn, message)
 | 
						|
 | 
						|
Call this function to wrap a given function in a deprecation message on any
 | 
						|
call to the function. An optional message can be supplied to provide a custom
 | 
						|
message.
 | 
						|
 | 
						|
### deprecate.property(obj, prop, message)
 | 
						|
 | 
						|
Call this function to wrap a given property on object in a deprecation message
 | 
						|
on any accessing or setting of the property. An optional message can be supplied
 | 
						|
to provide a custom message.
 | 
						|
 | 
						|
The method must be called on the object where the property belongs (not
 | 
						|
inherited from the prototype).
 | 
						|
 | 
						|
If the property is a data descriptor, it will be converted to an accessor
 | 
						|
descriptor in order to display the deprecation message.
 | 
						|
 | 
						|
### process.on('deprecation', fn)
 | 
						|
 | 
						|
This module will allow easy capturing of deprecation errors by emitting the
 | 
						|
errors as the type "deprecation" on the global `process`. If there are no
 | 
						|
listeners for this type, the errors are written to STDERR as normal, but if
 | 
						|
there are any listeners, nothing will be written to STDERR and instead only
 | 
						|
emitted. From there, you can write the errors in a different format or to a
 | 
						|
logging source.
 | 
						|
 | 
						|
The error represents the deprecation and is emitted only once with the same
 | 
						|
rules as writing to STDERR. The error has the following properties:
 | 
						|
 | 
						|
  - `message` - This is the message given by the library
 | 
						|
  - `name` - This is always `'DeprecationError'`
 | 
						|
  - `namespace` - This is the namespace the deprecation came from
 | 
						|
  - `stack` - This is the stack of the call to the deprecated thing
 | 
						|
 | 
						|
Example `error.stack` output:
 | 
						|
 | 
						|
```
 | 
						|
DeprecationError: my-cool-module deprecated oldfunction
 | 
						|
    at Object.<anonymous> ([eval]-wrapper:6:22)
 | 
						|
    at Module._compile (module.js:456:26)
 | 
						|
    at evalScript (node.js:532:25)
 | 
						|
    at startup (node.js:80:7)
 | 
						|
    at node.js:902:3
 | 
						|
```
 | 
						|
 | 
						|
### process.env.NO_DEPRECATION
 | 
						|
 | 
						|
As a user of modules that are deprecated, the environment variable `NO_DEPRECATION`
 | 
						|
is provided as a quick solution to silencing deprecation warnings from being
 | 
						|
output. The format of this is similar to that of `DEBUG`:
 | 
						|
 | 
						|
```sh
 | 
						|
$ NO_DEPRECATION=my-module,othermod node app.js
 | 
						|
```
 | 
						|
 | 
						|
This will suppress deprecations from being output for "my-module" and "othermod".
 | 
						|
The value is a list of comma-separated namespaces. To suppress every warning
 | 
						|
across all namespaces, use the value `*` for a namespace.
 | 
						|
 | 
						|
Providing the argument `--no-deprecation` to the `node` executable will suppress
 | 
						|
all deprecations (only available in Node.js 0.8 or higher).
 | 
						|
 | 
						|
**NOTE** This will not suppress the deperecations given to any "deprecation"
 | 
						|
event listeners, just the output to STDERR.
 | 
						|
 | 
						|
### process.env.TRACE_DEPRECATION
 | 
						|
 | 
						|
As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION`
 | 
						|
is provided as a solution to getting more detailed location information in deprecation
 | 
						|
warnings by including the entire stack trace. The format of this is the same as
 | 
						|
`NO_DEPRECATION`:
 | 
						|
 | 
						|
```sh
 | 
						|
$ TRACE_DEPRECATION=my-module,othermod node app.js
 | 
						|
```
 | 
						|
 | 
						|
This will include stack traces for deprecations being output for "my-module" and
 | 
						|
"othermod". The value is a list of comma-separated namespaces. To trace every
 | 
						|
warning across all namespaces, use the value `*` for a namespace.
 | 
						|
 | 
						|
Providing the argument `--trace-deprecation` to the `node` executable will trace
 | 
						|
all deprecations (only available in Node.js 0.8 or higher).
 | 
						|
 | 
						|
**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`.
 | 
						|
 | 
						|
## Display
 | 
						|
 | 
						|

 | 
						|
 | 
						|
When a user calls a function in your library that you mark deprecated, they
 | 
						|
will see the following written to STDERR (in the given colors, similar colors
 | 
						|
and layout to the `debug` module):
 | 
						|
 | 
						|
```
 | 
						|
bright cyan    bright yellow
 | 
						|
|              |          reset       cyan
 | 
						|
|              |          |           |
 | 
						|
▼              ▼          ▼           ▼
 | 
						|
my-cool-module deprecated oldfunction [eval]-wrapper:6:22
 | 
						|
▲              ▲          ▲           ▲
 | 
						|
|              |          |           |
 | 
						|
namespace      |          |           location of mycoolmod.oldfunction() call
 | 
						|
               |          deprecation message
 | 
						|
               the word "deprecated"
 | 
						|
```
 | 
						|
 | 
						|
If the user redirects their STDERR to a file or somewhere that does not support
 | 
						|
colors, they see (similar layout to the `debug` module):
 | 
						|
 | 
						|
```
 | 
						|
Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22
 | 
						|
▲                             ▲              ▲          ▲              ▲
 | 
						|
|                             |              |          |              |
 | 
						|
timestamp of message          namespace      |          |             location of mycoolmod.oldfunction() call
 | 
						|
                                             |          deprecation message
 | 
						|
                                             the word "deprecated"
 | 
						|
```
 | 
						|
 | 
						|
## Examples
 | 
						|
 | 
						|
### Deprecating all calls to a function
 | 
						|
 | 
						|
This will display a deprecated message about "oldfunction" being deprecated
 | 
						|
from "my-module" on STDERR.
 | 
						|
 | 
						|
```js
 | 
						|
var deprecate = require('depd')('my-cool-module')
 | 
						|
 | 
						|
// message automatically derived from function name
 | 
						|
// Object.oldfunction
 | 
						|
exports.oldfunction = deprecate.function(function oldfunction () {
 | 
						|
  // all calls to function are deprecated
 | 
						|
})
 | 
						|
 | 
						|
// specific message
 | 
						|
exports.oldfunction = deprecate.function(function () {
 | 
						|
  // all calls to function are deprecated
 | 
						|
}, 'oldfunction')
 | 
						|
```
 | 
						|
 | 
						|
### Conditionally deprecating a function call
 | 
						|
 | 
						|
This will display a deprecated message about "weirdfunction" being deprecated
 | 
						|
from "my-module" on STDERR when called with less than 2 arguments.
 | 
						|
 | 
						|
```js
 | 
						|
var deprecate = require('depd')('my-cool-module')
 | 
						|
 | 
						|
exports.weirdfunction = function () {
 | 
						|
  if (arguments.length < 2) {
 | 
						|
    // calls with 0 or 1 args are deprecated
 | 
						|
    deprecate('weirdfunction args < 2')
 | 
						|
  }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
When calling `deprecate` as a function, the warning is counted per call site
 | 
						|
within your own module, so you can display different deprecations depending
 | 
						|
on different situations and the users will still get all the warnings:
 | 
						|
 | 
						|
```js
 | 
						|
var deprecate = require('depd')('my-cool-module')
 | 
						|
 | 
						|
exports.weirdfunction = function () {
 | 
						|
  if (arguments.length < 2) {
 | 
						|
    // calls with 0 or 1 args are deprecated
 | 
						|
    deprecate('weirdfunction args < 2')
 | 
						|
  } else if (typeof arguments[0] !== 'string') {
 | 
						|
    // calls with non-string first argument are deprecated
 | 
						|
    deprecate('weirdfunction non-string first arg')
 | 
						|
  }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
### Deprecating property access
 | 
						|
 | 
						|
This will display a deprecated message about "oldprop" being deprecated
 | 
						|
from "my-module" on STDERR when accessed. A deprecation will be displayed
 | 
						|
when setting the value and when getting the value.
 | 
						|
 | 
						|
```js
 | 
						|
var deprecate = require('depd')('my-cool-module')
 | 
						|
 | 
						|
exports.oldprop = 'something'
 | 
						|
 | 
						|
// message automatically derives from property name
 | 
						|
deprecate.property(exports, 'oldprop')
 | 
						|
 | 
						|
// explicit message
 | 
						|
deprecate.property(exports, 'oldprop', 'oldprop >= 0.10')
 | 
						|
```
 | 
						|
 | 
						|
## License
 | 
						|
 | 
						|
[MIT](LICENSE)
 | 
						|
 | 
						|
[npm-version-image]: https://img.shields.io/npm/v/depd.svg
 | 
						|
[npm-downloads-image]: https://img.shields.io/npm/dm/depd.svg
 | 
						|
[npm-url]: https://npmjs.org/package/depd
 | 
						|
[travis-image]: https://img.shields.io/travis/dougwilson/nodejs-depd/master.svg?label=linux
 | 
						|
[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd
 | 
						|
[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/nodejs-depd/master.svg?label=windows
 | 
						|
[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd
 | 
						|
[coveralls-image]: https://img.shields.io/coveralls/dougwilson/nodejs-depd/master.svg
 | 
						|
[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master
 | 
						|
[node-image]: https://img.shields.io/node/v/depd.svg
 | 
						|
[node-url]: https://nodejs.org/en/download/
 |