Rename a given function. Tries to be cross-platform and guaranteed. Useful when you want to preserve name of bound function. In bonus, allows passing context to the renamed function.

Install
npm i rename-function --save
How it works? Strategy. Name priority.
There's a couple of things that you should be aware off and make your attention, few scenarios - you can do few things with package like this - rename function, binding function with context and both together.
- Just rename given
fn to have name instead of original name.
- Throw
TypeError if given fn not a function.
- If only
fn is given, it is returned without modifications - nothing done.
- If
fn is given and falsey name (meaning non-string) - just returns the fn - nothing done.
- If
fn is given and name is same as original name - just returns the fn - nothing done.
- If
fn, name and ctx is given, and name is as original - returns function with ctx and same name.
- If
fn and ctx is given, then function remains the same - only ctx is bound.
Meaning, this package try to follow native behaviours. Because you can't do such thing
function zooparks () { return this }
var boundOne = renameFunction(zooparks, {foo: 'one'})
var boundTwo = renameFunction(boundOne, {foo: 'two'})
var boundZzz = renameFunction(boundTwo, {foo: 'zzz'})
console.log(boundZzz())
and expect boundZzz() to return {foo: 'zzz'}, it would be {foo: 'one'} always. It's still a bit strange even to me, because of use the thing that I call "smart binding" with which I tried to solve this problem and will continue. Kinda strange, when debugging it seems it shows expected results. But in other hand that's the native behaviour, see this one:
function zooparks () { return this }
var boundOne = zooparks.bind({foo: 'one'})
var boundTwo = boundOne.bind({foo: 'two'})
var boundZzz = boundTwo.bind({foo: 'zzz'})
console.log(boundZzz())
Usage
For more use-cases see the tests
const renameFunction = require('rename-function')
Rename given fn with name. If given name is same as old, then the fn is just returned earlier, nothing more is done.
Params
fn {Function}
name {String|Object}
ctx {Object}
returns {Function}: or throws TypeError if fn not a function
Example
var rename = require('rename-function')
var getName = require('get-fn-name')
var fn = rename(fixture () {}, 'abc')
console.log(getName(fn))
console.log(fn.name)
var bound = rename(fixture foo () { return this }, 'zoo', {a: 'b'})
console.log(bound())
console.log(bound.name)
console.log(getName(bound))
Related
Contributing
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
But before doing anything, please read the CONTRIBUTING.md guidelines.
