refactor(core): cleanup decorators

This commit is contained in:
Victor Berchet 2016-10-11 19:07:18 -07:00 committed by Igor Minar
parent f7db0668d1
commit bf1e2613b2
2 changed files with 16 additions and 14 deletions

View File

@ -240,7 +240,7 @@ export function Class(clsDef: ClassDefinition): Type<any> {
for (let key in clsDef) { for (let key in clsDef) {
if (key !== 'extends' && key !== 'prototype' && clsDef.hasOwnProperty(key)) { if (key !== 'extends' && key !== 'prototype' && clsDef.hasOwnProperty(key)) {
proto[key] = applyParams(<any>clsDef[key], key); proto[key] = applyParams(clsDef[key], key);
} }
} }

View File

@ -17,28 +17,28 @@ class DecoratedParent {}
class DecoratedChild extends DecoratedParent {} class DecoratedChild extends DecoratedParent {}
export function main() { export function main() {
var Reflect = global.Reflect; const Reflect = global.Reflect;
var TerminalDecorator = makeDecorator('TerminalDecorator', {terminal: true}); const TerminalDecorator = makeDecorator('TerminalDecorator', {terminal: true});
var TestDecorator = makeDecorator( const TestDecorator = makeDecorator(
'TestDecorator', {marker: undefined}, Object, (fn: any) => fn.Terminal = TerminalDecorator); 'TestDecorator', {marker: undefined}, Object, (fn: any) => fn.Terminal = TerminalDecorator);
describe('decorators', () => { describe('decorators', () => {
it('should invoke as decorator', () => { it('should invoke as decorator', () => {
function Type() {} function Type() {}
TestDecorator({marker: 'WORKS'})(Type); TestDecorator({marker: 'WORKS'})(Type);
var annotations = Reflect.getMetadata('annotations', Type); const annotations = Reflect.getMetadata('annotations', Type);
expect(annotations[0].marker).toEqual('WORKS'); expect(annotations[0].marker).toEqual('WORKS');
}); });
it('should invoke as new', () => { it('should invoke as new', () => {
var annotation = new (<any>TestDecorator)({marker: 'WORKS'}); const annotation = new (<any>TestDecorator)({marker: 'WORKS'});
expect(annotation instanceof TestDecorator).toEqual(true); expect(annotation instanceof TestDecorator).toEqual(true);
expect(annotation.marker).toEqual('WORKS'); expect(annotation.marker).toEqual('WORKS');
}); });
it('should invoke as chain', () => { it('should invoke as chain', () => {
var chain: any = TestDecorator({marker: 'WORKS'}); let chain: any = TestDecorator({marker: 'WORKS'});
expect(typeof chain.Terminal).toEqual('function'); expect(typeof chain.Terminal).toEqual('function');
chain = chain.Terminal(); chain = chain.Terminal();
expect(chain.annotations[0] instanceof TestDecorator).toEqual(true); expect(chain.annotations[0] instanceof TestDecorator).toEqual(true);
@ -50,15 +50,16 @@ export function main() {
TestDecorator({marker: 'parent'})(DecoratedParent); TestDecorator({marker: 'parent'})(DecoratedParent);
TestDecorator({marker: 'child'})(DecoratedChild); TestDecorator({marker: 'child'})(DecoratedChild);
var annotations = Reflect.getOwnMetadata('annotations', DecoratedChild); const annotations = Reflect.getOwnMetadata('annotations', DecoratedChild);
expect(annotations.length).toBe(1); expect(annotations.length).toBe(1);
expect(annotations[0].marker).toEqual('child'); expect(annotations[0].marker).toEqual('child');
}); });
describe('Class', () => { describe('Class', () => {
it('should create a class', () => { it('should create a class', () => {
var i0: any /** TODO #9100 */, i1: any /** TODO #9100 */; let i0: any;
var MyClass = (<any>TestDecorator({marker: 'test-works'})).Class(<any>{ let i1: any;
const MyClass = (<any>TestDecorator({marker: 'test-works'})).Class(<any>{
extends: Class(<any>{ extends: Class(<any>{
constructor: function() {}, constructor: function() {},
extendWorks: function() { return 'extend ' + this.arg; } extendWorks: function() { return 'extend ' + this.arg; }
@ -71,14 +72,15 @@ export function main() {
works: function() { return this.arg; }, works: function() { return this.arg; },
prototype: 'IGNORE' prototype: 'IGNORE'
}); });
var obj: any = new MyClass('WORKS');
const obj: any = new MyClass('WORKS');
expect(obj.arg).toEqual('WORKS'); expect(obj.arg).toEqual('WORKS');
expect(obj.works()).toEqual('WORKS'); expect(obj.works()).toEqual('WORKS');
expect(obj.extendWorks()).toEqual('extend WORKS'); expect(obj.extendWorks()).toEqual('extend WORKS');
expect(reflector.parameters(MyClass)).toEqual([[String]]); expect(reflector.parameters(MyClass)).toEqual([[String]]);
expect(reflector.parameters(obj.methodA)).toEqual([[i0], [i1.annotation, Number]]); expect(reflector.parameters(obj.methodA)).toEqual([[i0], [i1.annotation, Number]]);
var proto = (<Function>MyClass).prototype; const proto = (<Function>MyClass).prototype;
expect(proto.extends).toEqual(undefined); expect(proto.extends).toEqual(undefined);
expect(proto.prototype).toEqual(undefined); expect(proto.prototype).toEqual(undefined);
@ -115,13 +117,13 @@ export function main() {
}); });
it('should ensure that only Function|Arrays are supported', () => { it('should ensure that only Function|Arrays are supported', () => {
expect(() => { Class(<any>{constructor: function() {}, method: 'non_function'}); }) expect(() => { Class({constructor: function() {}, method: <any>'non_function'}); })
.toThrowError( .toThrowError(
'Only Function or Array is supported in Class definition for key \'method\' is \'non_function\''); 'Only Function or Array is supported in Class definition for key \'method\' is \'non_function\'');
}); });
it('should ensure that extends is a Function', () => { it('should ensure that extends is a Function', () => {
expect(() => { (<Function>Class)({extends: 'non_type', constructor: function() {}}); }) expect(() => { Class({extends: <any>'non_type', constructor: function() {}}); })
.toThrowError( .toThrowError(
'Class definition \'extends\' property must be a constructor function was: non_type'); 'Class definition \'extends\' property must be a constructor function was: non_type');
}); });