Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ahmedelwerdany/invoke-before-after

Tell your methods when to invoke by just naming them that way.
https://github.com/ahmedelwerdany/invoke-before-after

call class function hooks javascript nodejs npm object proxy

Last synced: 16 days ago
JSON representation

Tell your methods when to invoke by just naming them that way.

Awesome Lists containing this project

README

        

![Codecov Coverage](https://img.shields.io/codecov/c/github/AhmedElwerdany/invoke-before-after)
![npm](https://img.shields.io/npm/v/invoke-before-after)
![GitHub Repo stars](https://img.shields.io/github/stars/AhmedElwerdany/invoke-before-after?style=social)

# invoke-before-after
Tell your methods when to invoke by just naming them that way.

## why?
- You want your methods to do only one thing.
- Small bundle size (1.4kB MINIFIED) - (648B MINIFIED + GZIPPED).

## Installing
Using npm:

```bash
npm install invoke-before-after
```

## Usage

```js
// CommonJS
const invokeWrapper = require('invoke-before-after')

// ES modules
import invokeWrapper from 'invoke-before-after'
```

## API
### invokeWrapper(target, [options])

Wraps a target (class/object) with a special proxy/wrapper and provides it back to you as a class/object. the method inside your object or class can invoke dynamically (without you calling them).

#### target :
A class or object that its methods should be proxied.

#### options :

- `invokeAfterName`

- Type: `string`
- Default: `invokeAfter`

A prefix for methods' name that should invoke **after** the targeted method.

Assuming the targeted method is `getUsers`, and the **prefix** is `invokeAfter`.
Then a method called `invokeAfterGetUsers` will invoke automatically after `getUsers` get invoked.

- `invokeBeforeName`

- Type: `string`
- Default: `invokeBefore`

A prefix for methods' name that should invoke **before** the targeted method.

Assuming the targeted method is `getUsers`, and the **prefix** is `invokeBefore`.
Then a method called `invokeBeforeGetUsers` will invoke automatically before `getUsers` get invoked.

- `disableCamelCase`

- Type: `boolean`
- Default: `false`

By default, the letter after the prefix should be uppercase.
Set this to `true` will add the name of the targeted method as it is after the prefix.

Assuming the targeted method is `getUsers`, and the **prefix** of `invokeAfterName` is `invokeAfter`.
Set `disableCamelCase` to true will make `invokeAftergetUsers` the right function to invoke after `getUsers` instead of `invokeAfterGetUsers`.

## Example
With classes :
```javascript
class User {
constructor(name) {
this.name = name;
this.updatedAt = new Date().toLocaleDateString()
}

updateName(name) {
this.name = name;
console.log('"name" updated')
}

// this method will be invoked after "updateName" method,
// since it has "invokeAfter" then the name of the method
// as the first letter of that method is uppercased
invokeAfterUpdateName(){
this.updatedAt = new Date().toLocaleDateString()
console.log('"updatedAt" updated')
}
}

const UserWrapper = invokeWrapper(User)
const newUser = new UserWrapper('Mark')

newUser.updateName()
// output :
// "name" updated
// "updatedAt" updated

```

With objects :

```javascript
const developer = invokeWrapper({
sleep: function () {
console.log('**sleeping**')
},

// this method will be invoked after "sleep" method,
// since it has "invokeBefore" then the name of the method
// as the first letter of that method is uppercased
invokeBeforeSleep: function() {
console.log('**yawning**')
}
})

developer.sleep()

// output :
// **yawning**
// **sleeping**
```

### with options

custom names :
```javascript
class User {
constructor(name) {
this.name = name
this.updatedAt = new Date().toLocaleDateString()
}

updateName(name) {
this.name = name
console.log('"name" Updated')
}

// should invoke before 'updateName' method,
// since we chose '$' for 'invokeBeforeName'
$UpdateName(name) {
console.log(`new name : ${name}`)
}

// should invoke after 'updateName' method,
// since we chose '_' for 'invokeAfterName'
_UpdateName(name) {
this.updatedAt = new Date().toLocaleDateString()
console.log('"updatedAt" updated')
}

}

const UserWrapper = invokeWrapper(User, {
invokeAfterName: '_',
invokeBeforeName: '$',
})

const dev = new UserWrapper('Peter')
dev.updateName('Mark')

// output:
// new name : Peter
// "name" Updated
// "updatedAt" updated
```

Disable camelCase :
```javascript

class User {
sayHi() {
console.log('saying hi')
}

// should invoke before 'sayHi' method,
// since we chose '_' for 'invokeAfterName'
// and disable the camelcase naming convention
_sayHi(){
console.log('I said hi :)')
}
}

User = invokeWrapper(User, {
invokeAfterName: '_',
disableCamelCase: true
})

const dev = new User()
dev.sayHi()

// output:
// I'm gonna say hi
// saying hi
// I said hi :)
```

## License

[MIT](LICENSE)
## Contributors ✨

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):



Ahmed Elwerdany

💻 🐛 🚧 👀 ⚠️

EnigmaDamn

📖

Hritik R

🤔

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!