feat(decorators): adds decorators to be used by TS and Babel transpiled apps.

This commit is contained in:
Rado Kirov
2015-04-28 18:17:00 -07:00
parent 648c514c28
commit fb67e37339
116 changed files with 2995 additions and 1805 deletions

View File

@ -0,0 +1,8 @@
/**
* This indirection is needed for TS compilation path.
* See comment in annotations.es6.
*/
library angular2.core.annotations.annotations;
export "../annotations_impl/annotations.dart";

View File

@ -0,0 +1,13 @@
/**
* This indirection is needed to free up Component, etc symbols in the public API
* to be used by the decorator versions of these annotations.
*/
export {
Component as ComponentAnnotation,
Decorator as DecoratorAnnotation,
Directive as DirectiveAnnotation,
DynamicComponent as DynamicComponentAnnotation,
Viewport as ViewportAnnotation,
onDestroy, onChange, onAllChangesDone
} from '../annotations_impl/annotations';

View File

@ -0,0 +1,3 @@
library angular2.core.annotations.di;
export "../annotations_impl/di.dart";

View File

@ -0,0 +1,4 @@
export {
Query as QueryAnnotation,
Attribute as AttributeAnnotation,
} from '../annotations_impl/di';

View File

@ -0,0 +1,3 @@
library angular2.core.annotations.view;
export "../annotations_impl/view.dart";

View File

@ -0,0 +1,3 @@
export {
View as ViewAnnotation,
} from '../annotations_impl/view';

View File

@ -0,0 +1,3 @@
library angular2.core.annotations.visibility;
export "../annotations_impl/visibility.dart";

View File

@ -0,0 +1,4 @@
export {
Ancestor as AncestorAnnotation,
Parent as ParentAnnotation,
} from '../annotations_impl/visibility';

View File

@ -1,6 +1,6 @@
library angular2.src.core.compiler.base_query_list;
import 'package:angular2/src/core/annotations/annotations.dart';
import 'package:angular2/src/core/annotations_impl/annotations.dart';
import 'dart:collection';
/**

View File

@ -1,5 +1,5 @@
import {List, MapWrapper, ListWrapper} from 'angular2/src/facade/collection';
import {Directive} from 'angular2/src/core/annotations/annotations';
import {Directive} from 'angular2/src/core/annotations_impl/annotations';
/**
* Injectable Objects that contains a live list of child directives in the light Dom of a directive.

View File

@ -4,12 +4,12 @@ import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
import {List, ListWrapper, Map, MapWrapper} from 'angular2/src/facade/collection';
import {DirectiveMetadataReader} from './directive_metadata_reader';
import {Component, Viewport, DynamicComponent, Decorator} from '../annotations/annotations';
import {Component, Viewport, DynamicComponent, Decorator} from '../annotations_impl/annotations';
import {AppProtoView} from './view';
import {ProtoViewRef} from './view_ref';
import {DirectiveBinding} from './element_injector';
import {TemplateResolver} from './template_resolver';
import {View} from '../annotations/view';
import {View} from '../annotations_impl/view';
import {ComponentUrlMapper} from './component_url_mapper';
import {ProtoViewFactory} from './proto_view_factory';
import {UrlResolver} from 'angular2/src/services/url_resolver';

View File

@ -1,6 +1,6 @@
import {Type} from 'angular2/src/facade/lang';
import {List} from 'angular2/src/facade/collection';
import {Directive} from 'angular2/src/core/annotations/annotations'
import {Directive} from 'angular2/src/core/annotations_impl/annotations'
import {ResolvedBinding} from 'angular2/di';
/**

View File

@ -1,6 +1,6 @@
import {Injectable, Injector} from 'angular2/di';
import {Type, isPresent, BaseException, stringify} from 'angular2/src/facade/lang';
import {Directive, Component} from '../annotations/annotations';
import {Directive, Component} from '../annotations_impl/annotations';
import {DirectiveMetadata} from './directive_metadata';
import {reflector} from 'angular2/src/reflection/reflection';

View File

@ -4,14 +4,14 @@ import {Math} from 'angular2/src/facade/math';
import {List, ListWrapper, MapWrapper} from 'angular2/src/facade/collection';
import {Injector, Key, Dependency, bind, Binding, ResolvedBinding, NoBindingError,
AbstractBindingError, CyclicDependencyError} from 'angular2/di';
import {Parent, Ancestor} from 'angular2/src/core/annotations/visibility';
import {Attribute, Query} from 'angular2/src/core/annotations/di';
import {Parent, Ancestor} from 'angular2/src/core/annotations_impl/visibility';
import {Attribute, Query} from 'angular2/src/core/annotations_impl/di';
import * as viewModule from './view';
import * as avmModule from './view_manager';
import {ViewContainerRef} from './view_container_ref';
import {ElementRef} from './element_ref';
import {ProtoViewRef, ViewRef} from './view_ref';
import {Directive, Component, onChange, onDestroy, onAllChangesDone} from 'angular2/src/core/annotations/annotations';
import {Directive, Component, onChange, onDestroy, onAllChangesDone} from 'angular2/src/core/annotations_impl/annotations';
import {ChangeDetector, ChangeDetectorRef} from 'angular2/change_detection';
import {QueryList} from './query_list';
import {reflector} from 'angular2/src/reflection/reflection';

View File

@ -4,7 +4,7 @@ import {isPresent, isBlank} from 'angular2/src/facade/lang';
import {reflector} from 'angular2/src/reflection/reflection';
import {ChangeDetection, DirectiveIndex} from 'angular2/change_detection';
import {Component, Viewport, DynamicComponent} from '../annotations/annotations';
import {Component, Viewport, DynamicComponent} from '../annotations_impl/annotations';
import * as renderApi from 'angular2/src/render/api';
import {AppProtoView} from './view';

View File

@ -1,5 +1,5 @@
import {Injectable} from 'angular2/di';
import {View} from 'angular2/src/core/annotations/view';
import {View} from 'angular2/src/core/annotations_impl/view';
import {Type, stringify, isBlank, BaseException} from 'angular2/src/facade/lang';
import {Map, MapWrapper, List, ListWrapper} from 'angular2/src/facade/collection';

View File

@ -0,0 +1,3 @@
library angular2.core.decorators;
/* This file is empty because, Dart does not have decorators. */

View File

@ -0,0 +1,40 @@
import {
ComponentAnnotation,
DecoratorAnnotation,
DynamicComponentAnnotation,
ViewportAnnotation} from '../annotations/annotations';
import {ViewAnnotation} from '../annotations/view';
import {AncestorAnnotation, ParentAnnotation} from '../annotations/visibility';
import {AttributeAnnotation, QueryAnnotation} from '../annotations/di';
function makeDecorator(annotationCls) {
return function(...args) {
if (!(window.Reflect && !window.Reflect.getMetadata)) throw 'reflect-metadata shim is required';
var annotationInstance = new annotationCls(...args);
var Reflect = window.Reflect;
return function(cls) {
var annotations = Reflect.getMetadata('annotations', cls);
annotations = annotations || [];
annotations.push(annotationInstance);
Reflect.defineMetadata('annotations', annotations, cls);
return cls;
}
}
}
/* from annotations */
export var Component = makeDecorator(ComponentAnnotation);
export var Decorator = makeDecorator(DecoratorAnnotation);
export var DynamicComponent = makeDecorator(DynamicComponentAnnotation);
export var Viewport = makeDecorator(ViewportAnnotation);
/* from di */
export var Attribute = makeDecorator(AttributeAnnotation);
export var Query = makeDecorator(QueryAnnotation);
/* from view */
export var View = makeDecorator(ViewAnnotation);
/* from visiblity */
export var Ancestor = makeDecorator(AncestorAnnotation);
export var Parent = makeDecorator(ParentAnnotation);

View File

@ -1,4 +1,4 @@
import {Decorator} from 'angular2/src/core/annotations/annotations';
import {Decorator} from 'angular2/src/core/annotations_impl/annotations';
import {isPresent} from 'angular2/src/facade/lang';
import {DOM} from 'angular2/src/dom/dom_adapter';
import {ElementRef} from 'angular2/src/core/compiler/element_ref';

View File

@ -1,4 +1,4 @@
import {Viewport} from 'angular2/src/core/annotations/annotations';
import {Viewport} from 'angular2/src/core/annotations_impl/annotations';
import {ViewContainerRef} from 'angular2/src/core/compiler/view_container_ref';
import {ViewRef} from 'angular2/src/core/compiler/view_ref';
import {isPresent, isBlank} from 'angular2/src/facade/lang';

View File

@ -1,4 +1,4 @@
import {Viewport} from 'angular2/src/core/annotations/annotations';
import {Viewport} from 'angular2/src/core/annotations_impl/annotations';
import {ViewContainerRef} from 'angular2/src/core/compiler/view_container_ref';
import {isBlank} from 'angular2/src/facade/lang';

View File

@ -1,4 +1,4 @@
import {Decorator} from 'angular2/src/core/annotations/annotations';
import {Decorator} from 'angular2/src/core/annotations_impl/annotations';
/**
* The `NonBindable` directive tells Angular not to compile or bind the contents of the current

View File

@ -1,8 +1,8 @@
import {Decorator, Viewport} from 'angular2/src/core/annotations/annotations';
import {Decorator, Viewport} from 'angular2/src/core/annotations_impl/annotations';
import {ViewContainerRef} from 'angular2/src/core/compiler/view_container_ref';
import {isPresent, isBlank, normalizeBlank} from 'angular2/src/facade/lang';
import {ListWrapper, List, MapWrapper, Map} from 'angular2/src/facade/collection';
import {Parent} from 'angular2/src/core/annotations/visibility';
import {Parent} from 'angular2/src/core/annotations_impl/visibility';
/**
* The `Switch` directive is used to conditionally swap DOM structure on your template based on a

View File

@ -1,5 +1,5 @@
import {Decorator, onChange} from 'angular2/src/core/annotations/annotations';
import {Ancestor} from 'angular2/src/core/annotations/visibility';
import {Decorator, onChange} from 'angular2/src/core/annotations_impl/annotations';
import {Ancestor} from 'angular2/src/core/annotations_impl/visibility';
import {ElementRef} from 'angular2/src/core/compiler/element_ref';
import {Optional} from 'angular2/di';
import {Renderer} from 'angular2/src/render/api';

View File

@ -1,4 +1,5 @@
import {Decorator} from 'angular2/src/core/annotations/annotations';
import {Decorator} from 'angular2/src/core/annotations_impl/annotations';
import {Validators} from './validators';
import {ControlDirective} from './directives';
@ -9,4 +10,4 @@ export class RequiredValidatorDirective {
constructor(c:ControlDirective) {
c.validator = Validators.compose([c.validator, Validators.required]);
}
}
}

View File

@ -1,7 +1,7 @@
import {Map, MapWrapper, ListWrapper} from 'angular2/src/facade/collection';
import {Type, isPresent, BaseException, stringify, isBlank} from 'angular2/src/facade/lang';
import {View} from 'angular2/src/core/annotations/view';
import {View} from 'angular2/src/core/annotations_impl/view';
import {TemplateResolver} from 'angular2/src/core/compiler/template_resolver';
export class MockTemplateResolver extends TemplateResolver {

View File

@ -33,13 +33,30 @@ export class ReflectionCapabilities {
}
parameters(typeOfFunc):List<List> {
return isPresent(typeOfFunc.parameters) ?
typeOfFunc.parameters :
ListWrapper.createFixedSize(typeOfFunc.length);
// Prefer the direct API.
if (isPresent(typeOfFunc.parameters)) {
return typeOfFunc.parameters;
}
if (isPresent(window.Reflect) && isPresent(window.Reflect.getMetadata)) {
var paramtypes = window.Reflect.getMetadata('design:paramtypes', typeOfFunc);
if (isPresent(paramtypes)) {
// TODO(rado): add parameter annotations here.
return paramtypes.map((p) => [p]);
}
}
return ListWrapper.createFixedSize(typeOfFunc.length);
}
annotations(typeOfFunc):List {
return isPresent(typeOfFunc.annotations) ? typeOfFunc.annotations : [];
// Prefer the direct API.
if (isPresent(typeOfFunc.annotations)) {
return typeOfFunc.annotations;
}
if (isPresent(window.Reflect) && isPresent(window.Reflect.getMetadata)) {
var annotations = window.Reflect.getMetadata('annotations', typeOfFunc);
if (isPresent(annotations)) return annotations;
}
return [];
}
getter(name:string):GetterFn {
@ -56,4 +73,4 @@ export class ReflectionCapabilities {
`if (!${method}) throw new Error('"${name}" is undefined');` +
`return ${method}.apply(o, args);`);
}
}
}

View File

@ -1,4 +1,4 @@
import {Type, isPresent} from 'angular2/src/facade/lang';
import {Type, isPresent, global} from 'angular2/src/facade/lang';
import {List, ListWrapper} from 'angular2/src/facade/collection';
import {GetterFn, SetterFn, MethodFn} from './types';
@ -46,12 +46,30 @@ export class ReflectionCapabilities {
}
parameters(typeOfFunc): List<List<any>> {
return isPresent(typeOfFunc.parameters) ? typeOfFunc.parameters :
ListWrapper.createFixedSize(typeOfFunc.length);
// Prefer the direct API.
if (isPresent(typeOfFunc.parameters)) {
return typeOfFunc.parameters;
}
if (isPresent(global.Reflect) && isPresent(global.Reflect.getMetadata)) {
var paramtypes = global.Reflect.getMetadata('design:paramtypes', typeOfFunc);
if (isPresent(paramtypes)) {
// TODO(rado): add parameter annotations here.
return paramtypes.map((p) => [p]);
}
}
return ListWrapper.createFixedSize(typeOfFunc.length);
}
annotations(typeOfFunc): List<any> {
return isPresent(typeOfFunc.annotations) ? typeOfFunc.annotations : [];
// Prefer the direct API.
if (isPresent(typeOfFunc.annotations)) {
return typeOfFunc.annotations;
}
if (isPresent(global.Reflect) && isPresent(global.Reflect.getMetadata)) {
var annotations = global.Reflect.getMetadata('annotations', typeOfFunc);
if (isPresent(annotations)) return annotations;
}
return [];
}
getter(name: string): GetterFn { return new Function('o', 'return o.' + name + ';'); }

View File

@ -1,4 +1,4 @@
import {Decorator} from 'angular2/annotations';
import {Decorator} from 'angular2/src/core/annotations_impl/annotations';
import {ElementRef} from 'angular2/core';
import {isPresent} from 'angular2/src/facade/lang';

View File

@ -1,6 +1,6 @@
import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
import {Decorator} from 'angular2/annotations';
import {Decorator} from 'angular2/src/core/annotations_impl/annotations';
import {Compiler, ViewContainerRef} from 'angular2/core';
import {Injector, bind} from 'angular2/di';

View File

@ -5,7 +5,7 @@ import {Promise} from 'angular2/src/facade/async';
import {isBlank} from 'angular2/src/facade/lang';
import {List} from 'angular2/src/facade/collection';
import {View} from 'angular2/src/core/annotations/view';
import {View} from 'angular2/src/core/annotations_impl/view';
import {TemplateResolver} from 'angular2/src/core/compiler/template_resolver';
import {AppView} from 'angular2/src/core/compiler/view';