UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

149 lines (148 loc) 6.69 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { resolveForwardRef, Injectable } from 'angular2/src/core/di'; import { isPresent, stringify } from 'angular2/src/facade/lang'; import { BaseException } from 'angular2/src/facade/exceptions'; import { ListWrapper, StringMapWrapper } from 'angular2/src/facade/collection'; import { DirectiveMetadata, ComponentMetadata, InputMetadata, OutputMetadata, HostBindingMetadata, HostListenerMetadata, ContentChildrenMetadata, ViewChildrenMetadata, ContentChildMetadata, ViewChildMetadata } from 'angular2/src/core/metadata'; import { reflector } from 'angular2/src/core/reflection/reflection'; import { ReflectorReader } from 'angular2/src/core/reflection/reflector_reader'; function _isDirectiveMetadata(type) { return type instanceof DirectiveMetadata; } /* * Resolve a `Type` for {@link DirectiveMetadata}. * * This interface can be overridden by the application developer to create custom behavior. * * See {@link Compiler} */ export let DirectiveResolver = class DirectiveResolver { constructor(_reflector) { if (isPresent(_reflector)) { this._reflector = _reflector; } else { this._reflector = reflector; } } /** * Return {@link DirectiveMetadata} for a given `Type`. */ resolve(type) { var typeMetadata = this._reflector.annotations(resolveForwardRef(type)); if (isPresent(typeMetadata)) { var metadata = typeMetadata.find(_isDirectiveMetadata); if (isPresent(metadata)) { var propertyMetadata = this._reflector.propMetadata(type); return this._mergeWithPropertyMetadata(metadata, propertyMetadata, type); } } throw new BaseException(`No Directive annotation found on ${stringify(type)}`); } _mergeWithPropertyMetadata(dm, propertyMetadata, directiveType) { var inputs = []; var outputs = []; var host = {}; var queries = {}; StringMapWrapper.forEach(propertyMetadata, (metadata, propName) => { metadata.forEach(a => { if (a instanceof InputMetadata) { if (isPresent(a.bindingPropertyName)) { inputs.push(`${propName}: ${a.bindingPropertyName}`); } else { inputs.push(propName); } } if (a instanceof OutputMetadata) { if (isPresent(a.bindingPropertyName)) { outputs.push(`${propName}: ${a.bindingPropertyName}`); } else { outputs.push(propName); } } if (a instanceof HostBindingMetadata) { if (isPresent(a.hostPropertyName)) { host[`[${a.hostPropertyName}]`] = propName; } else { host[`[${propName}]`] = propName; } } if (a instanceof HostListenerMetadata) { var args = isPresent(a.args) ? a.args.join(', ') : ''; host[`(${a.eventName})`] = `${propName}(${args})`; } if (a instanceof ContentChildrenMetadata) { queries[propName] = a; } if (a instanceof ViewChildrenMetadata) { queries[propName] = a; } if (a instanceof ContentChildMetadata) { queries[propName] = a; } if (a instanceof ViewChildMetadata) { queries[propName] = a; } }); }); return this._merge(dm, inputs, outputs, host, queries, directiveType); } _merge(dm, inputs, outputs, host, queries, directiveType) { var mergedInputs = isPresent(dm.inputs) ? ListWrapper.concat(dm.inputs, inputs) : inputs; var mergedOutputs; if (isPresent(dm.outputs)) { dm.outputs.forEach((propName) => { if (ListWrapper.contains(outputs, propName)) { throw new BaseException(`Output event '${propName}' defined multiple times in '${stringify(directiveType)}'`); } }); mergedOutputs = ListWrapper.concat(dm.outputs, outputs); } else { mergedOutputs = outputs; } var mergedHost = isPresent(dm.host) ? StringMapWrapper.merge(dm.host, host) : host; var mergedQueries = isPresent(dm.queries) ? StringMapWrapper.merge(dm.queries, queries) : queries; if (dm instanceof ComponentMetadata) { return new ComponentMetadata({ selector: dm.selector, inputs: mergedInputs, outputs: mergedOutputs, host: mergedHost, exportAs: dm.exportAs, moduleId: dm.moduleId, queries: mergedQueries, changeDetection: dm.changeDetection, providers: dm.providers, viewProviders: dm.viewProviders }); } else { return new DirectiveMetadata({ selector: dm.selector, inputs: mergedInputs, outputs: mergedOutputs, host: mergedHost, exportAs: dm.exportAs, queries: mergedQueries, providers: dm.providers }); } } }; DirectiveResolver = __decorate([ Injectable(), __metadata('design:paramtypes', [ReflectorReader]) ], DirectiveResolver); export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver(reflector);