UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

136 lines (135 loc) 5.45 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 } from 'angular2/src/core/di'; import { Injectable } from 'angular2/src/core/di'; import { Map } from 'angular2/src/facade/collection'; import { isPresent, isArray, stringify, isBlank } from 'angular2/src/facade/lang'; import { BaseException } from 'angular2/src/facade/exceptions'; import { ViewMetadata } from '../core/metadata'; import { ViewResolver } from 'angular2/src/compiler/view_resolver'; export let MockViewResolver = class MockViewResolver extends ViewResolver { constructor() { super(); /** @internal */ this._views = new Map(); /** @internal */ this._inlineTemplates = new Map(); /** @internal */ this._viewCache = new Map(); /** @internal */ this._directiveOverrides = new Map(); } /** * Overrides the {@link ViewMetadata} for a component. * * @param {Type} component * @param {ViewDefinition} view */ setView(component, view) { this._checkOverrideable(component); this._views.set(component, view); } /** * Overrides the inline template for a component - other configuration remains unchanged. * * @param {Type} component * @param {string} template */ setInlineTemplate(component, template) { this._checkOverrideable(component); this._inlineTemplates.set(component, template); } /** * Overrides a directive from the component {@link ViewMetadata}. * * @param {Type} component * @param {Type} from * @param {Type} to */ overrideViewDirective(component, from, to) { this._checkOverrideable(component); var overrides = this._directiveOverrides.get(component); if (isBlank(overrides)) { overrides = new Map(); this._directiveOverrides.set(component, overrides); } overrides.set(from, to); } /** * Returns the {@link ViewMetadata} for a component: * - Set the {@link ViewMetadata} to the overridden view when it exists or fallback to the default * `ViewResolver`, * see `setView`. * - Override the directives, see `overrideViewDirective`. * - Override the @View definition, see `setInlineTemplate`. * * @param component * @returns {ViewDefinition} */ resolve(component) { var view = this._viewCache.get(component); if (isPresent(view)) return view; view = this._views.get(component); if (isBlank(view)) { view = super.resolve(component); } var directives = []; var overrides = this._directiveOverrides.get(component); if (isPresent(overrides) && isPresent(view.directives)) { flattenArray(view.directives, directives); overrides.forEach((to, from) => { var srcIndex = directives.indexOf(from); if (srcIndex == -1) { throw new BaseException(`Overriden directive ${stringify(from)} not found in the template of ${stringify(component)}`); } directives[srcIndex] = to; }); view = new ViewMetadata({ template: view.template, templateUrl: view.templateUrl, directives: directives }); } var inlineTemplate = this._inlineTemplates.get(component); if (isPresent(inlineTemplate)) { view = new ViewMetadata({ template: inlineTemplate, templateUrl: null, directives: view.directives }); } this._viewCache.set(component, view); return view; } /** * @internal * * Once a component has been compiled, the AppProtoView is stored in the compiler cache. * * Then it should not be possible to override the component configuration after the component * has been compiled. * * @param {Type} component */ _checkOverrideable(component) { var cached = this._viewCache.get(component); if (isPresent(cached)) { throw new BaseException(`The component ${stringify(component)} has already been compiled, its configuration can not be changed`); } } }; MockViewResolver = __decorate([ Injectable(), __metadata('design:paramtypes', []) ], MockViewResolver); function flattenArray(tree, out) { for (var i = 0; i < tree.length; i++) { var item = resolveForwardRef(tree[i]); if (isArray(item)) { flattenArray(item, out); } else { out.push(item); } } }