UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

278 lines (277 loc) 10.3 kB
'use strict';var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var collection_1 = require('angular2/src/facade/collection'); var lang_1 = require('angular2/src/facade/lang'); var exceptions_1 = require('angular2/src/facade/exceptions'); function findFirstClosedCycle(keys) { var res = []; for (var i = 0; i < keys.length; ++i) { if (collection_1.ListWrapper.contains(res, keys[i])) { res.push(keys[i]); return res; } else { res.push(keys[i]); } } return res; } function constructResolvingPath(keys) { if (keys.length > 1) { var reversed = findFirstClosedCycle(collection_1.ListWrapper.reversed(keys)); var tokenStrs = reversed.map(function (k) { return lang_1.stringify(k.token); }); return " (" + tokenStrs.join(' -> ') + ")"; } else { return ""; } } /** * Base class for all errors arising from misconfigured providers. */ var AbstractProviderError = (function (_super) { __extends(AbstractProviderError, _super); function AbstractProviderError(injector, key, constructResolvingMessage) { _super.call(this, "DI Exception"); this.keys = [key]; this.injectors = [injector]; this.constructResolvingMessage = constructResolvingMessage; this.message = this.constructResolvingMessage(this.keys); } AbstractProviderError.prototype.addKey = function (injector, key) { this.injectors.push(injector); this.keys.push(key); this.message = this.constructResolvingMessage(this.keys); }; Object.defineProperty(AbstractProviderError.prototype, "context", { get: function () { return this.injectors[this.injectors.length - 1].debugContext(); }, enumerable: true, configurable: true }); return AbstractProviderError; })(exceptions_1.BaseException); exports.AbstractProviderError = AbstractProviderError; /** * Thrown when trying to retrieve a dependency by `Key` from {@link Injector}, but the * {@link Injector} does not have a {@link Provider} for {@link Key}. * * ### Example ([live demo](http://plnkr.co/edit/vq8D3FRB9aGbnWJqtEPE?p=preview)) * * ```typescript * class A { * constructor(b:B) {} * } * * expect(() => Injector.resolveAndCreate([A])).toThrowError(); * ``` */ var NoProviderError = (function (_super) { __extends(NoProviderError, _super); function NoProviderError(injector, key) { _super.call(this, injector, key, function (keys) { var first = lang_1.stringify(collection_1.ListWrapper.first(keys).token); return "No provider for " + first + "!" + constructResolvingPath(keys); }); } return NoProviderError; })(AbstractProviderError); exports.NoProviderError = NoProviderError; /** * Thrown when dependencies form a cycle. * * ### Example ([live demo](http://plnkr.co/edit/wYQdNos0Tzql3ei1EV9j?p=info)) * * ```typescript * var injector = Injector.resolveAndCreate([ * provide("one", {useFactory: (two) => "two", deps: [[new Inject("two")]]}), * provide("two", {useFactory: (one) => "one", deps: [[new Inject("one")]]}) * ]); * * expect(() => injector.get("one")).toThrowError(); * ``` * * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed. */ var CyclicDependencyError = (function (_super) { __extends(CyclicDependencyError, _super); function CyclicDependencyError(injector, key) { _super.call(this, injector, key, function (keys) { return "Cannot instantiate cyclic dependency!" + constructResolvingPath(keys); }); } return CyclicDependencyError; })(AbstractProviderError); exports.CyclicDependencyError = CyclicDependencyError; /** * Thrown when a constructing type returns with an Error. * * The `InstantiationError` class contains the original error plus the dependency graph which caused * this object to be instantiated. * * ### Example ([live demo](http://plnkr.co/edit/7aWYdcqTQsP0eNqEdUAf?p=preview)) * * ```typescript * class A { * constructor() { * throw new Error('message'); * } * } * * var injector = Injector.resolveAndCreate([A]); * try { * injector.get(A); * } catch (e) { * expect(e instanceof InstantiationError).toBe(true); * expect(e.originalException.message).toEqual("message"); * expect(e.originalStack).toBeDefined(); * } * ``` */ var InstantiationError = (function (_super) { __extends(InstantiationError, _super); function InstantiationError(injector, originalException, originalStack, key) { _super.call(this, "DI Exception", originalException, originalStack, null); this.keys = [key]; this.injectors = [injector]; } InstantiationError.prototype.addKey = function (injector, key) { this.injectors.push(injector); this.keys.push(key); }; Object.defineProperty(InstantiationError.prototype, "wrapperMessage", { get: function () { var first = lang_1.stringify(collection_1.ListWrapper.first(this.keys).token); return "Error during instantiation of " + first + "!" + constructResolvingPath(this.keys) + "."; }, enumerable: true, configurable: true }); Object.defineProperty(InstantiationError.prototype, "causeKey", { get: function () { return this.keys[0]; }, enumerable: true, configurable: true }); Object.defineProperty(InstantiationError.prototype, "context", { get: function () { return this.injectors[this.injectors.length - 1].debugContext(); }, enumerable: true, configurable: true }); return InstantiationError; })(exceptions_1.WrappedException); exports.InstantiationError = InstantiationError; /** * Thrown when an object other then {@link Provider} (or `Type`) is passed to {@link Injector} * creation. * * ### Example ([live demo](http://plnkr.co/edit/YatCFbPAMCL0JSSQ4mvH?p=preview)) * * ```typescript * expect(() => Injector.resolveAndCreate(["not a type"])).toThrowError(); * ``` */ var InvalidProviderError = (function (_super) { __extends(InvalidProviderError, _super); function InvalidProviderError(provider) { _super.call(this, "Invalid provider - only instances of Provider and Type are allowed, got: " + provider.toString()); } return InvalidProviderError; })(exceptions_1.BaseException); exports.InvalidProviderError = InvalidProviderError; /** * Thrown when the class has no annotation information. * * Lack of annotation information prevents the {@link Injector} from determining which dependencies * need to be injected into the constructor. * * ### Example ([live demo](http://plnkr.co/edit/rHnZtlNS7vJOPQ6pcVkm?p=preview)) * * ```typescript * class A { * constructor(b) {} * } * * expect(() => Injector.resolveAndCreate([A])).toThrowError(); * ``` * * This error is also thrown when the class not marked with {@link Injectable} has parameter types. * * ```typescript * class B {} * * class A { * constructor(b:B) {} // no information about the parameter types of A is available at runtime. * } * * expect(() => Injector.resolveAndCreate([A,B])).toThrowError(); * ``` */ var NoAnnotationError = (function (_super) { __extends(NoAnnotationError, _super); function NoAnnotationError(typeOrFunc, params) { _super.call(this, NoAnnotationError._genMessage(typeOrFunc, params)); } NoAnnotationError._genMessage = function (typeOrFunc, params) { var signature = []; for (var i = 0, ii = params.length; i < ii; i++) { var parameter = params[i]; if (lang_1.isBlank(parameter) || parameter.length == 0) { signature.push('?'); } else { signature.push(parameter.map(lang_1.stringify).join(' ')); } } return "Cannot resolve all parameters for " + lang_1.stringify(typeOrFunc) + "(" + signature.join(', ') + "). " + 'Make sure they all have valid type or annotations.'; }; return NoAnnotationError; })(exceptions_1.BaseException); exports.NoAnnotationError = NoAnnotationError; /** * Thrown when getting an object by index. * * ### Example ([live demo](http://plnkr.co/edit/bRs0SX2OTQiJzqvjgl8P?p=preview)) * * ```typescript * class A {} * * var injector = Injector.resolveAndCreate([A]); * * expect(() => injector.getAt(100)).toThrowError(); * ``` */ var OutOfBoundsError = (function (_super) { __extends(OutOfBoundsError, _super); function OutOfBoundsError(index) { _super.call(this, "Index " + index + " is out-of-bounds."); } return OutOfBoundsError; })(exceptions_1.BaseException); exports.OutOfBoundsError = OutOfBoundsError; // TODO: add a working example after alpha38 is released /** * Thrown when a multi provider and a regular provider are bound to the same token. * * ### Example * * ```typescript * expect(() => Injector.resolveAndCreate([ * new Provider("Strings", {useValue: "string1", multi: true}), * new Provider("Strings", {useValue: "string2", multi: false}) * ])).toThrowError(); * ``` */ var MixingMultiProvidersWithRegularProvidersError = (function (_super) { __extends(MixingMultiProvidersWithRegularProvidersError, _super); function MixingMultiProvidersWithRegularProvidersError(provider1, provider2) { _super.call(this, "Cannot mix multi providers and regular providers, got: " + provider1.toString() + " " + provider2.toString()); } return MixingMultiProvidersWithRegularProvidersError; })(exceptions_1.BaseException); exports.MixingMultiProvidersWithRegularProvidersError = MixingMultiProvidersWithRegularProvidersError; //# sourceMappingURL=exceptions.js.map