feat(decorators): adds decorator versions of DI annotations.
In 'angular2/di' the symbol: - Inject is a decorator - InjectAnnotation is an annotation Internally one an get a hold of annotations without *Annotations appened (to make ts2dart work without workarounds) by importing from 'angular2/src/di/annotations_impl' instead of 'angular2/di'. This is needed only for users that transpile through TS and through ts2dart.
This commit is contained in:
23
modules/angular2/src/core/annotations/decorators.es6
Normal file
23
modules/angular2/src/core/annotations/decorators.es6
Normal file
@ -0,0 +1,23 @@
|
||||
import {
|
||||
ComponentAnnotation,
|
||||
DirectiveAnnotation
|
||||
} from './annotations';
|
||||
import {ViewAnnotation} from './view';
|
||||
import {AncestorAnnotation, ParentAnnotation} from './visibility';
|
||||
import {AttributeAnnotation, QueryAnnotation} from './di';
|
||||
import {makeDecorator, makeParamDecorator} from '../../util/decorators';
|
||||
|
||||
/* from annotations */
|
||||
export var Component = makeDecorator(ComponentAnnotation);
|
||||
export var Decorator = makeDecorator(DirectiveAnnotation);
|
||||
|
||||
/* from view */
|
||||
export var View = makeDecorator(ViewAnnotation);
|
||||
|
||||
/* from visibility */
|
||||
export var Ancestor = makeParamDecorator(AncestorAnnotation);
|
||||
export var Parent = makeParamDecorator(ParentAnnotation);
|
||||
|
||||
/* from di */
|
||||
export var Attribute = makeParamDecorator(AttributeAnnotation);
|
||||
export var Query = makeParamDecorator(QueryAnnotation);
|
@ -1,6 +1,6 @@
|
||||
import {CONST, normalizeBlank, isPresent} from 'angular2/src/facade/lang';
|
||||
import {ListWrapper, List} from 'angular2/src/facade/collection';
|
||||
import {Injectable} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {DEFAULT} from 'angular2/change_detection';
|
||||
|
||||
// type StringMap = {[idx: string]: string};
|
||||
|
@ -1,5 +1,5 @@
|
||||
import {CONST} from 'angular2/src/facade/lang';
|
||||
import {DependencyAnnotation} from 'angular2/di';
|
||||
import {DependencyAnnotation} from 'angular2/src/di/annotations_impl';
|
||||
|
||||
/**
|
||||
* Specifies that a constant attribute value should be injected.
|
||||
|
@ -1,5 +1,5 @@
|
||||
import {CONST} from 'angular2/src/facade/lang';
|
||||
import {DependencyAnnotation} from 'angular2/di';
|
||||
import {DependencyAnnotation} from 'angular2/src/di/annotations_impl';
|
||||
|
||||
/**
|
||||
* Specifies that an injector should retrieve a dependency from the direct parent.
|
||||
|
2
modules/angular2/src/core/application.js
vendored
2
modules/angular2/src/core/application.js
vendored
@ -1,4 +1,4 @@
|
||||
import {Injector, bind, OpaqueToken, Optional} from 'angular2/di';
|
||||
import {Injector, bind, OpaqueToken} from 'angular2/di';
|
||||
import {NumberWrapper, Type, isBlank, isPresent, BaseException,
|
||||
assertionsEnabled, print, stringify} from 'angular2/src/facade/lang';
|
||||
import {BrowserDomAdapter} from 'angular2/src/dom/browser_adapter';
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {Injectable, Binding} from 'angular2/di';
|
||||
import {Binding} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {Type, isBlank, isPresent, BaseException, normalizeBlank, stringify} from 'angular2/src/facade/lang';
|
||||
import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
|
||||
import {List, ListWrapper, Map, MapWrapper} from 'angular2/src/facade/collection';
|
||||
|
@ -1,4 +1,4 @@
|
||||
import {Injectable} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {Type, isPresent} from 'angular2/src/facade/lang';
|
||||
import {Map, MapWrapper} from 'angular2/src/facade/collection';
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {Injectable, Injector} from 'angular2/di';
|
||||
import {Injector} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {Type, isPresent, BaseException, stringify} from 'angular2/src/facade/lang';
|
||||
import {Directive, Component} from '../annotations_impl/annotations';
|
||||
import {DirectiveMetadata} from './directive_metadata';
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {Key, Injector, Injectable, ResolvedBinding, Binding, bind} from 'angular2/di'
|
||||
import {Key, Injector, ResolvedBinding, Binding, bind} from 'angular2/di'
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {Compiler} from './compiler';
|
||||
import {Type, BaseException, stringify, isPresent} from 'angular2/src/facade/lang';
|
||||
import {Promise} from 'angular2/src/facade/async';
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {Injectable} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
|
||||
import {List, ListWrapper, MapWrapper} from 'angular2/src/facade/collection';
|
||||
import {isPresent, isBlank} from 'angular2/src/facade/lang';
|
||||
import {reflector} from 'angular2/src/reflection/reflection';
|
||||
@ -29,7 +30,7 @@ class BindingRecordsCreator {
|
||||
bindings = ListWrapper.concat(bindings, this._createElementPropertyRecords(boundElementIndex, renderElementBinder));
|
||||
bindings = ListWrapper.concat(bindings, this._createDirectiveRecords(boundElementIndex, sortedDirectives[boundElementIndex]));
|
||||
}
|
||||
|
||||
|
||||
return bindings;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import {Injectable} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {View} from 'angular2/src/core/annotations_impl/view';
|
||||
|
||||
import {Type, stringify, isBlank, BaseException} from 'angular2/src/facade/lang';
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {Injector, Injectable, Binding} from 'angular2/di';
|
||||
import {Injector, Binding} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {ListWrapper, MapWrapper, Map, StringMapWrapper, List} from 'angular2/src/facade/collection';
|
||||
import {isPresent, isBlank, BaseException} from 'angular2/src/facade/lang';
|
||||
import * as viewModule from './view';
|
||||
@ -216,4 +217,4 @@ export class AppViewManager {
|
||||
}
|
||||
view.render = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {Injectable, Injector, Binding} from 'angular2/di';
|
||||
import {Injector, Binding} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {ListWrapper, MapWrapper, Map, StringMapWrapper, List} from 'angular2/src/facade/collection';
|
||||
import * as eli from './element_injector';
|
||||
import {isPresent, isBlank, BaseException} from 'angular2/src/facade/lang';
|
||||
@ -241,4 +242,4 @@ export class AppViewManagerUtils {
|
||||
view.changeDetector.dehydrate();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {Inject, OpaqueToken} from 'angular2/di';
|
||||
import {Inject} from 'angular2/src/di/annotations_impl';
|
||||
|
||||
import {ListWrapper, MapWrapper, Map, List} from 'angular2/src/facade/collection';
|
||||
import {isPresent, isBlank} from 'angular2/src/facade/lang';
|
||||
|
||||
@ -37,4 +38,4 @@ export class AppViewPool {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,62 +0,0 @@
|
||||
import {
|
||||
ComponentAnnotation,
|
||||
DirectiveAnnotation
|
||||
} from '../annotations/annotations';
|
||||
import {ViewAnnotation} from '../annotations/view';
|
||||
import {AncestorAnnotation, ParentAnnotation} from '../annotations/visibility';
|
||||
import {AttributeAnnotation, QueryAnnotation} from '../annotations/di';
|
||||
import {global} from 'angular2/src/facade/lang';
|
||||
|
||||
function makeDecorator(annotationCls) {
|
||||
return function(...args) {
|
||||
var Reflect = global.Reflect;
|
||||
if (!(Reflect && Reflect.getMetadata)) {
|
||||
throw 'reflect-metadata shim is required when using class decorators';
|
||||
}
|
||||
var annotationInstance = new annotationCls(...args);
|
||||
return function(cls) {
|
||||
var annotations = Reflect.getMetadata('annotations', cls);
|
||||
annotations = annotations || [];
|
||||
annotations.push(annotationInstance);
|
||||
Reflect.defineMetadata('annotations', annotations, cls);
|
||||
return cls;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function makeParamDecorator(annotationCls) {
|
||||
return function(...args) {
|
||||
var Reflect = global.Reflect;
|
||||
if (!(Reflect && Reflect.getMetadata)) {
|
||||
throw 'reflect-metadata shim is required when using parameter decorators';
|
||||
}
|
||||
var annotationInstance = new annotationCls(...args);
|
||||
return function(cls, unusedKey, index) {
|
||||
var parameters = Reflect.getMetadata('parameters', cls);
|
||||
parameters = parameters || [];
|
||||
// there might be gaps if some in between parameters do not have annotations.
|
||||
// we pad with nulls.
|
||||
while (parameters.length <= index) {
|
||||
parameters.push(null);
|
||||
}
|
||||
parameters[index] = annotationInstance;
|
||||
Reflect.defineMetadata('parameters', parameters, cls);
|
||||
return cls;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* from annotations */
|
||||
export var Component = makeDecorator(ComponentAnnotation);
|
||||
export var Decorator = makeDecorator(DirectiveAnnotation);
|
||||
|
||||
/* from view */
|
||||
export var View = makeDecorator(ViewAnnotation);
|
||||
|
||||
/* from visibility */
|
||||
export var Ancestor = makeParamDecorator(AncestorAnnotation);
|
||||
export var Parent = makeParamDecorator(ParentAnnotation);
|
||||
|
||||
/* from di */
|
||||
export var Attribute = makeParamDecorator(AttributeAnnotation);
|
||||
export var Query = makeParamDecorator(QueryAnnotation);
|
@ -1,4 +1,4 @@
|
||||
import {Injectable} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {isPresent, print} from 'angular2/src/facade/lang';
|
||||
import {ListWrapper, isListLikeIterable} from 'angular2/src/facade/collection';
|
||||
import {DOM} from 'angular2/src/dom/dom_adapter';
|
||||
|
@ -1,4 +1,4 @@
|
||||
import {Injectable} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {ChangeDetector} from 'angular2/change_detection';
|
||||
import {VmTurnZone} from 'angular2/src/core/zone/vm_turn_zone';
|
||||
import {ExceptionHandler} from 'angular2/src/core/exception_handler';
|
||||
|
@ -1,4 +1,4 @@
|
||||
import {Injectable} from 'angular2/di';
|
||||
import {Injectable} from 'angular2/src/di/annotations_impl';
|
||||
import {DOM} from 'angular2/src/dom/dom_adapter';
|
||||
import {Map, MapWrapper, List, ListWrapper} from 'angular2/src/facade/collection';
|
||||
import {StringWrapper, isBlank, BaseException} from 'angular2/src/facade/lang';
|
||||
|
Reference in New Issue
Block a user