This is a absolutely tiny library to help decorate functions or classes in a prettier way in the ugly messy pre-standardized decorator spec era of Javascript.
Features:
- Natural composition with
decorate(...).with(fn)
- Decorator style composition with
apply(...).to(fn)
- Functional
pipe(...)(fn)
andcompose(...)(fn)
included.
If you're here, you already know.
yarn add decoration-helper
To achieve this
@inject('app', 'auth')
@withRouter
@observer
function tomato() {
console.log("tomato");
}
export default tomato;
you write this:
import { apply } from 'decoration-helper';
function tomato() {
console.log("tomato");
}
export default apply(
inject('app', 'auth'),
withRouter,
observer
).to(tomato);
or alternatively this, if you prefer:
import { decorate } from 'decoration-helper';
function tomato() {
console.log("tomato");
}
export default decorate(tomato).with(
observer,
withRouter,
inject('app', 'auth')
);
Note: The order is not reversed when using decorate(obj).with(...decorators)
The proper functional approach would be to use pipe()
and compose()
as described by
Eric Elliot.
This post has
more details about it.
// Analogous to decorate(fn).with(...);
import { pipe } from 'decoration-helper';
function tomato() {
console.log("tomato");
}
export default pipe(
observer,
withRouter,
inject('app', 'auth')
)(tomato);
// Analogous to apply(...).to(fn);
import { compose } from 'decoration-helper';
function tomato() {
console.log("tomato");
}
export default compose(
inject('app', 'auth'),
withRouter,
observer
)(tomato);
MIT