traits-decorator

Apply traits with decorators

Usage no npm install needed!

<script type="module">
  import traitsDecorator from 'https://cdn.skypack.dev/traits-decorator';
</script>

README

traits-decorator

npm version Build Status bitHound Score

Experimental library to apply Traits with ES7 decorators.

Install

using npm

npm i -S traits-decorator

using git repository

npm i -S git://github.com/cocktailjs/traits-decorator

API

Decorators

@traits(Trait1, ...TraitN)

Applicable to class definition. It will apply all the given Traits to the class.

@traits(TExample) class MyClass {}

@requires(description1, ...descriptionN)

Applicable to a method defined in a Trait. The decorator does nothing but it serves as a documentation to reflect what method / property the method needs access to.

class TFoo {

    @requires('bar: {String}')
    fooBar() {
        console.log('foo,' + this.bar);
    }
}

Bindings

excludes(Method1, ...MethodN)

Applicable to Trait definition in '@traits'. It will exclude the given method names from the Trait.

@traits(TExample::excludes('foo', 'bar')) 
class MyClass {}

alias(aliases: {})

Applicable to Trait definition in '@traits'. It will alias the method defined in the Trait with the key as the value .

@traits(TExample::alias({baz: 'parentBaz'}))
class MyClass {}

as({alias: {}, excludes: []})

Applicable to Trait definition in '@traits'. It will apply aliases and excluded methods from the Trait

@traits( TExample:as({alias: {baz: 'parentBaz'}, excludes:['foo', 'bar'] }) )
class MyClass {}

Usage

Basically, we have a few Traits (classes) TFirst, TLast and we combine and apply them by using traits decorator:

example.js

'use strict';

import { traits, excludes, alias, requires }  from 'traits-decorator'

class TFirst {

    @requires('collection:[]')
    first() {
        return this.collection[0];
    }

}

class TLast {
    
    @requires('collection:[]')
    last() {
        let collection = this.collection;
        let l = collection.length;
        return collection[l-1];
    }

    justAnother() {}

    foo() {
        console.log('from TLast\'s foo');
    }
}

//composing a Trait with others
@traits( TFirst, TLast::excludes('foo', 'justAnother') )
class TEnum {

    foo() {
        console.log('enum foo')
    }
}

//apply trait TEnum
@traits(TEnum::alias({ foo: 'enumFoo' }) )
class MyClass {

    constructor (collection: []) {
        this.collection = collection
    }
}

let obj = new MyClass([1,2,3])

console.log(obj.first()) // 1

obj.enumFoo() // enum foo

In order to run the example.js we need babel and since we are using some experimental functionality, decorators (@traits) and bindOperator (::) we need to use the --stage 0.

babel-node --stage 0 example.js

Update

@mixins decorator has been removed. If you want to use mixins please use mixins-decorator package.