Library of ES7 decorators inspired by languages that come with built-ins like @override, @deprecated, etc
Library of ES2016 (ES7) decorators inspired by languages that come with built-ins like @override, @deprecate, etc, similar to pre-defined Annotations in Java. Note that unlike Java annotations, decorators are functions which are applied at runtime.
A version compiled to ES5 in CJS format is published to npm as core-decorators
npm install core-decorators --save
This form could be consumed by any ES2016 (ES7) transpiler that supports decorators like babel.js with babel --optional es7.decorators,es7.objectRestSpread
or babel --stage 1
or using the recent iterations of TypeScript.
*note that the compiled code is intentionally not checked into this repo
Forces invocations of this function to always have this
refer to the class instance, even if the function is passed around or would otherwise lose its this
context. e.g. var fn = context.method;
import autobind from 'core-decorators'; class Person @autobind getPerson return this; let person = ;let getPerson = persongetPerson; getPerson === person;// true
Marks a property or method as not being writable.
import readonly from 'core-decorators'; class Meal @readonly entree = 'steak'; var dinner = ;dinnerentree = 'salmon';// Cannot assign to read only property 'entree' of [object Object]
Checks that the marked method indeed overrides a function with the same signature somewhere on the prototype chain.
Works with methods and getters/setters. Will ensure name, parameter count, as well as descriptor type (accessor/data). Provides a suggestion if it finds a method with a similar signature, including slight misspellings.
import override from 'core-decorators'; class Parent speakfirst second {} class Child extends Parent @override speak {} // SyntaxError: Child#speak() does not properly override Parent#speak(first, second) // or class Child extends Parent @override speaks {} // SyntaxError: No descriptor matching Child#speaks() was found on the prototype chain. // // Did you mean "speak"?
Calls console.warn()
with a deprecation message. Provide a custom message to override the default one. You can also provide an options hash with a url
, for further reading.
import deprecate from 'core-decorators'; class Person @deprecate facepalm {} @deprecate'We stopped facepalming' facepalmHard {} @deprecate'We stopped facepalming' url: 'http://knowyourmeme.com/memes/facepalm' facepalmHarder {} let person = ; personfacepalm;// DEPRECATION Person#facepalm: This function will be removed in future versions. personfacepalmHard;// DEPRECATION Person#facepalmHard: We stopped facepalming personfacepalmHarder;// DEPRECATION Person#facepalmHarder: We stopped facepalming // // See http://knowyourmeme.com/memes/facepalm for more details. //
Creates a new debounced function which will be invoked after wait
milliseconds since the time it was invoked. Default timeout is 300 ms.
Optional boolean second argument allows to trigger function on the leading instead of the trailing edge of the wait interval. Implementation is insired by similar method from UnderscoreJS.
import debounce from 'core-decorators'; class Editor content = ''; @debounce500 updateContentcontent thiscontent = content;
Suppresses any JavaScript console.warn()
call while the decorated function is called. (i.e. on the stack)
Will not suppress warnings triggered in any async code within.
import suppressWarnings from 'core-decorators'; class Person @deprecated facepalm {} @suppressWarnings facepalmWithoutWarning thisfacepalm; let person = ; personfacepalmWithoutWarning;// no warning is logged
Marks a property or method as not being enumerable.
import nonenumerable from 'core-decorators'; class Meal entree = 'steak'; @nonenumerable cost = 20.99; var dinner = ;for var key in dinner key; // "entree" only, not "cost" Objectkeysdinner;// ["entree"]
Marks a property or method as not being writable.
import nonconfigurable from 'core-decorators'; class Meal @nonconfigurable entree = 'steak'; var dinner = ; ObjectdefinePropertydinner 'entree' enumerable: false;// Cannot redefine property: entree
Initial implementation included, likely slow. WIP.