@kaokei/di 1.0.21 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/README.md +20 -103
  3. package/dist/index.cjs.js +450 -233
  4. package/dist/index.cjs.js.map +1 -1
  5. package/dist/index.cjs.min.js +3 -3
  6. package/dist/index.cjs.min.js.map +1 -1
  7. package/dist/index.cjs.runtime.js +444 -229
  8. package/dist/index.cjs.runtime.js.map +1 -1
  9. package/dist/index.cjs.runtime.min.js +3 -3
  10. package/dist/index.cjs.runtime.min.js.map +1 -1
  11. package/dist/index.esm.js +451 -219
  12. package/dist/index.esm.js.map +1 -1
  13. package/dist/index.esm.min.js +4 -4
  14. package/dist/index.esm.min.js.map +1 -1
  15. package/dist/index.esm.runtime.js +439 -214
  16. package/dist/index.esm.runtime.js.map +1 -1
  17. package/dist/index.esm.runtime.min.js +4 -4
  18. package/dist/index.esm.runtime.min.js.map +1 -1
  19. package/dist/index.iife.js +457 -237
  20. package/dist/index.iife.js.map +1 -1
  21. package/dist/index.iife.min.js +4 -4
  22. package/dist/index.iife.min.js.map +1 -1
  23. package/dist/src/Injector.d.ts +67 -32
  24. package/dist/src/Injector.d.ts.map +1 -1
  25. package/dist/src/constants.d.ts +5 -11
  26. package/dist/src/constants.d.ts.map +1 -1
  27. package/dist/src/decorator.d.ts +13 -1
  28. package/dist/src/decorator.d.ts.map +1 -1
  29. package/dist/src/errors/CircularDependencyError.d.ts +6 -0
  30. package/dist/src/errors/CircularDependencyError.d.ts.map +1 -0
  31. package/dist/src/errors/InjectFailedError.d.ts +6 -0
  32. package/dist/src/errors/InjectFailedError.d.ts.map +1 -0
  33. package/dist/src/errors/ProviderNotValidError.d.ts +6 -0
  34. package/dist/src/errors/ProviderNotValidError.d.ts.map +1 -0
  35. package/dist/src/errors/TokenNotFoundError.d.ts +6 -0
  36. package/dist/src/errors/TokenNotFoundError.d.ts.map +1 -0
  37. package/dist/src/errors/index.d.ts +5 -0
  38. package/dist/src/errors/index.d.ts.map +1 -0
  39. package/dist/src/index.d.ts +1 -1
  40. package/dist/src/index.d.ts.map +1 -1
  41. package/package.json +5 -7
  42. package/dist/.DS_Store +0 -0
@@ -1,8 +1,4 @@
1
- function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
2
-
3
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
4
-
5
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
1
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
6
2
 
7
3
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
8
4
 
@@ -16,63 +12,80 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
16
12
 
17
13
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
14
 
19
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
15
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
16
+
17
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
20
18
 
21
19
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
22
20
 
23
21
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
24
22
 
25
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
23
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
26
24
 
27
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
25
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
26
+
27
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
28
+
29
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
30
+
31
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
32
+
33
+ function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
34
+
35
+ function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
36
+
37
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
38
+
39
+ function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
40
+
41
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
42
+
43
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
44
+
45
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
28
46
 
29
47
  /**
30
48
  * @kaokei/di
31
- * jsbridge for iframes or windows by window.postMessage
49
+ * Tiny di library depend on typescript and reflect-metadata
32
50
  *
33
- * @version 1.0.21
51
+ * @version 1.0.25
34
52
  * @author kaokei
35
53
  * @license MIT
36
54
  * @link https://github.com/kaokei/di
37
55
  */
38
- var DI = function (exports, autobindDecorator) {
56
+ var DI = function (exports) {
39
57
  'use strict';
40
58
 
41
- function _interopDefaultLegacy(e) {
42
- return e && _typeof(e) === 'object' && 'default' in e ? e['default'] : e;
43
- }
44
-
45
- var autobindDecorator__default = /*#__PURE__*/_interopDefaultLegacy(autobindDecorator);
46
-
47
- var DESIGN_PARAM_TYPES = 'design:paramtypes'; // ts自带的类的构造函数的参数的类型信息的key
48
-
49
- var SERVICE_PARAM_TYPES = 'service:paramtypes'; // 构造函数原始的类型数据,可能会被@Inject等覆盖
50
-
51
- var SERVICE_INJECTED_PARAMS = 'service:injected:params'; // 构造函数使用@Inject注入的数据
52
-
53
- var SERVICE_INJECTED_PROPS = 'service:injected:props'; // @Inject注入的properties
54
-
55
59
  var DECORATOR_KEYS = {
60
+ // ts自带的类的实例属性的类型的key
61
+ DESIGN_PROPERTY_TYPE: 'design:type',
62
+ // ts自带的类的构造函数的参数的类型信息的key
63
+ DESIGN_PARAM_TYPES: 'design:paramtypes',
64
+ // 记录构造函数原始的类型数据的key,其实就是转存了DESIGN_PARAM_TYPES对应的数据
65
+ SERVICE_PARAM_TYPES: 'service:paramtypes',
66
+ // 记录构造函数参数装饰器对应的数据的key
67
+ SERVICE_INJECTED_PARAMS: 'service:injected:params',
68
+ // 记录实例属性装饰器对应的数据的key
69
+ SERVICE_INJECTED_PROPS: 'service:injected:props',
70
+ // Inject装饰器的key
56
71
  INJECT: Symbol('inject'),
72
+ // Injectable装饰器的key
57
73
  INJECTABLE: Symbol('injectable'),
74
+ // Self装饰器的key
58
75
  SELF: 'self',
76
+ // Skip装饰器的key
59
77
  SKIP_SELF: 'skip',
60
- OPTIONAL: 'optional',
61
- DEFAULT_VALUE: 'defaultValue'
78
+ // Optional装饰器的key
79
+ OPTIONAL: 'optional'
62
80
  };
63
81
  var SERVICE_STATUS = {
64
82
  INITING: Symbol('initing'),
65
83
  CONSTRUCTED: Symbol('constructed'),
66
- MERGED: Symbol('merged'),
67
- INITED: Symbol('inited')
68
- }; // 以下是error message常量
69
-
70
- var ERROR_CIRCULAR_DEPENDENCY = 'CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY.';
71
- var ERROR_DISABLE_MULTIPLE_INJECTABLE = 'Use multiple @Injectable on same class is not valid.';
72
- var ERROR_TOKEN_NOT_FOUND = 'Token not found.';
73
- var ERROR_INJECT_NOT_VALID = "You may forget to use @Inject on class property or @Injects's parameter is undefined.";
74
- var ERROR_PROVIDER_NOT_VALID = "Provider is not valid.";
84
+ MERGED: Symbol('merged')
85
+ };
75
86
  /**
87
+ * 这里记录不同的装饰器的参数的含义
88
+ *
76
89
  * class decorator:
77
90
  * 只有一个参数:构造函数
78
91
  * property decorator:
@@ -90,42 +103,79 @@ var DI = function (exports, autobindDecorator) {
90
103
  * 实例访问器:原型, 方法名, 属性描述符
91
104
  */
92
105
 
93
- function createPropertyDecorator(decoratorKey, defaultValue) {
106
+ /**
107
+ * 创建装饰器的高阶函数
108
+ * 装饰器的通用逻辑就是通过Reflect记录到全局的Map中
109
+ * 所以可以抽象出一个通用逻辑,这里需要注意对Inject装饰器有特殊判断
110
+ *
111
+ * @param {(string | symbol)} decoratorKey 代表某个装饰器的名称
112
+ * @param {*} [defaultValue] 该装饰器函数的默认参数
113
+ * @return {*} 一个装饰器
114
+ */
115
+
116
+ function createDecorator(decoratorKey, defaultValue) {
117
+ // 因为装饰器本身作为一个函数是有参数的,此处的decoratorValue就是实际使用装饰器的实参
94
118
  return function (decoratorValue) {
119
+ // 目前的装饰器只支持类的构造函数参数装饰器和类的实例属性装饰器
120
+ // target可能是构造函数或者类的原型
121
+ // 如果target是构造函数,targetKey是undefined,index是参数的位置下标
122
+ // 如果target是原型,targetKey是属姓名,index是undefined
95
123
  return function (target, targetKey, index) {
96
- var isParameterDecorator = typeof index === 'number';
97
- var Ctor = isParameterDecorator ? target : target.constructor;
98
- var key = index !== undefined && isParameterDecorator ? index : targetKey;
99
- var metadataKey = isParameterDecorator ? SERVICE_INJECTED_PARAMS : SERVICE_INJECTED_PROPS;
124
+ // 如果indexnumber,那么代表是构造函数的参数的装饰器
125
+ var isParameterDecorator = typeof index === 'number'; // 统一把装饰器数据绑定到构造函数上,后续获取数据比较方便
126
+
127
+ var Ctor = isParameterDecorator ? target : target.constructor; // 如果是构造函数的参数装饰器,取参数位置下标,否则取实例属性的属性名
128
+
129
+ var key = isParameterDecorator ? index : targetKey; // 区分构造函数的参数装饰器和实例属性的装饰器
130
+ // 分别记录到全局Map的不同位置,metadataKey不一样
131
+
132
+ var metadataKey = isParameterDecorator ? DECORATOR_KEYS.SERVICE_INJECTED_PARAMS : DECORATOR_KEYS.SERVICE_INJECTED_PROPS; // 这里是一个大对象,对应的key是metadataKey
133
+ // 所以全局Map中有两个不同的metadataKey,以及对应的数据对象
134
+ // 如果是构造函数参数装饰器,这个对象中的key是参数位置下标
135
+ // 如果是实例属性装饰器,这个对象中的key是属性名
136
+
100
137
  var paramsOrPropertiesMetadata = Reflect.getMetadata(metadataKey, Ctor) || {}; // 每个参数或者实例属性都可以有多个装饰器
138
+ // 所以paramsOrPropertiesMetadata这个大对象的每个key对应的value都是一个数组
139
+ // 该数组中的每一个元素是一个对象,保存着每一个装饰器的数据
101
140
 
102
141
  var paramOrPropertyMetadata = paramsOrPropertiesMetadata[key] || [];
103
142
  var metadata = {
143
+ // 装饰器的名称
104
144
  key: decoratorKey,
105
- value: decoratorValue || defaultValue
145
+ // 装饰器的值,即装饰器函数的实参
146
+ // 很多装饰器具有默认值,可以不提供实参,而是使用默认值
147
+ value: decoratorValue === void 0 ? defaultValue : decoratorValue
106
148
  };
107
149
 
108
- if (decoratorKey === DECORATOR_KEYS.INJECT) {
109
- if (!decoratorValue) {
110
- throw new Error('没有提供Inject Key');
150
+ if (!isParameterDecorator) {
151
+ if (decoratorKey === DECORATOR_KEYS.INJECT) {
152
+ if (decoratorValue === void 0) {
153
+ // 是实例属性装饰器,且是Inject装饰器,且没有指定参数
154
+ // 需要获取默认的类型数据
155
+ metadata.value = Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PROPERTY_TYPE, target, targetKey);
156
+ }
111
157
  }
112
- }
158
+ } // 把当前装饰器的数据对象放到数组中
159
+
160
+
161
+ paramOrPropertyMetadata.push(metadata); // 关联这个数组和对应的key
162
+
163
+ paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata; // 再把整个大对象放到全局Map中
113
164
 
114
- paramOrPropertyMetadata.push(metadata);
115
- paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;
116
165
  Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, Ctor);
117
166
  };
118
167
  };
119
168
  } // 可以使用在类构造函数的参数中和类的实例属性中
120
169
 
121
170
 
122
- var Inject = createPropertyDecorator(DECORATOR_KEYS.INJECT); // 指定只在当前injector中寻找服务
171
+ var Inject = createDecorator(DECORATOR_KEYS.INJECT); // 指定只在当前injector中寻找服务
123
172
 
124
- var Self = createPropertyDecorator(DECORATOR_KEYS.SELF, true); // 指定跳过当前injector寻找服务
173
+ var Self = createDecorator(DECORATOR_KEYS.SELF, true); // 指定跳过当前injector寻找服务
125
174
 
126
- var Skip = createPropertyDecorator(DECORATOR_KEYS.SKIP_SELF, true); // 指定服务是可选的,找不到服务时返回undefined,否则抛出异常
175
+ var Skip = createDecorator(DECORATOR_KEYS.SKIP_SELF, true); // 指定服务是可选的,找不到服务时返回undefined,否则抛出异常
176
+ // 其实应该说是默认情况下找不到服务时,会抛出异常,除非明确指定是optional的
127
177
 
128
- var Optional = createPropertyDecorator(DECORATOR_KEYS.OPTIONAL, true);
178
+ var Optional = createDecorator(DECORATOR_KEYS.OPTIONAL, true);
129
179
  /**
130
180
  * 表明服务可注入
131
181
  * 主要工作就是收集构造函数的参数类型信息
@@ -136,15 +186,15 @@ var DI = function (exports, autobindDecorator) {
136
186
 
137
187
  function Injectable() {
138
188
  return function (target) {
139
- if (Reflect.hasOwnMetadata(SERVICE_PARAM_TYPES, target)) {
140
- throw new Error(ERROR_DISABLE_MULTIPLE_INJECTABLE);
141
- }
142
-
143
- var types = Reflect.getMetadata(DESIGN_PARAM_TYPES, target) || []; // 存储构造函数的类型信息
189
+ // 标记这个类可以注入
190
+ Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target); // 获取ts编译器默认的类型数据
191
+ // 经过测试,如果是基本类型string、number、boolean,那么会变成相对应的构造函数String,Number,Boolean
192
+ // 如果只是指定了interface类型,那么会变成Object构造函数
144
193
 
145
- Reflect.defineMetadata(SERVICE_PARAM_TYPES, types, target); // 标记这个类可以注入
194
+ var types = Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, target) || []; // 存储构造函数的类型信息
195
+ // 这里只是转存了一下数据,并没有特殊逻辑
146
196
 
147
- Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target);
197
+ Reflect.defineMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, types, target);
148
198
  return target;
149
199
  };
150
200
  }
@@ -176,6 +226,122 @@ var DI = function (exports, autobindDecorator) {
176
226
  return isForwardRef(type) ? type() : type;
177
227
  }
178
228
 
229
+ var CircularDependencyError = /*#__PURE__*/function (_Error) {
230
+ _inherits(CircularDependencyError, _Error);
231
+
232
+ var _super = _createSuper(CircularDependencyError);
233
+
234
+ function CircularDependencyError(provider, options) {
235
+ var _this;
236
+
237
+ _classCallCheck(this, CircularDependencyError);
238
+
239
+ _this = _super.call(this);
240
+
241
+ _defineProperty(_assertThisInitialized(_this), "name", 'CIRCULAR_DEPENDENCY_ERROR');
242
+
243
+ _defineProperty(_assertThisInitialized(_this), "message", _this.name);
244
+
245
+ var tokenArr = [provider.provide];
246
+ var currentProvider = options === null || options === void 0 ? void 0 : options.provider;
247
+
248
+ while (currentProvider && currentProvider.provide) {
249
+ tokenArr.push(currentProvider.provide);
250
+ currentProvider = currentProvider.parent;
251
+ }
252
+
253
+ var tokenListText = tokenArr.join(' <-- ');
254
+ _this.message = "CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \n ".concat(tokenListText);
255
+ return _this;
256
+ }
257
+
258
+ return CircularDependencyError;
259
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
260
+
261
+ var InjectFailedError = /*#__PURE__*/function (_Error2) {
262
+ _inherits(InjectFailedError, _Error2);
263
+
264
+ var _super2 = _createSuper(InjectFailedError);
265
+
266
+ function InjectFailedError(injectMeta, ClassName, key, paramType) {
267
+ var _this2;
268
+
269
+ _classCallCheck(this, InjectFailedError);
270
+
271
+ _this2 = _super2.call(this);
272
+
273
+ _defineProperty(_assertThisInitialized(_this2), "name", 'INJECT_FAILED_ERROR');
274
+
275
+ _defineProperty(_assertThisInitialized(_this2), "message", _this2.name);
276
+
277
+ if (paramType) {
278
+ // 是构造函数的参数装饰器
279
+ if (injectMeta && injectMeta.value === Object) {
280
+ _this2.message = "CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ".concat(key, " OF CLASS ").concat(ClassName, ".");
281
+ } else if (paramType === Object) {
282
+ _this2.message = "CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ".concat(key, " OF CLASS ").concat(ClassName, ".");
283
+ }
284
+ } else {
285
+ // 是属性装饰器
286
+ if (!injectMeta) {
287
+ _this2.message = "INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ".concat(key, " OF CLASS ").concat(ClassName, ".");
288
+ } else if (injectMeta.value === Object) {
289
+ _this2.message = "CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ".concat(key, " OF CLASS ").concat(ClassName, ".");
290
+ }
291
+ }
292
+
293
+ return _this2;
294
+ }
295
+
296
+ return InjectFailedError;
297
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
298
+
299
+ var ProviderNotValidError = /*#__PURE__*/function (_Error3) {
300
+ _inherits(ProviderNotValidError, _Error3);
301
+
302
+ var _super3 = _createSuper(ProviderNotValidError);
303
+
304
+ function ProviderNotValidError(provider) {
305
+ var _this3;
306
+
307
+ _classCallCheck(this, ProviderNotValidError);
308
+
309
+ _this3 = _super3.call(this);
310
+
311
+ _defineProperty(_assertThisInitialized(_this3), "name", 'PROVIDER_NOT_VALID_ERROR');
312
+
313
+ _defineProperty(_assertThisInitialized(_this3), "message", _this3.name);
314
+
315
+ _this3.message = "PROVIDER NOT VALID. ".concat(provider);
316
+ return _this3;
317
+ }
318
+
319
+ return ProviderNotValidError;
320
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
321
+
322
+ var TokenNotFoundError = /*#__PURE__*/function (_Error4) {
323
+ _inherits(TokenNotFoundError, _Error4);
324
+
325
+ var _super4 = _createSuper(TokenNotFoundError);
326
+
327
+ function TokenNotFoundError(token) {
328
+ var _this4;
329
+
330
+ _classCallCheck(this, TokenNotFoundError);
331
+
332
+ _this4 = _super4.call(this);
333
+
334
+ _defineProperty(_assertThisInitialized(_this4), "name", 'TOKEN_NOT_FOUND_ERROR');
335
+
336
+ _defineProperty(_assertThisInitialized(_this4), "message", _this4.name);
337
+
338
+ _this4.message = "TOKEN IS NOT A INJECTABLE CLASS OR SKIP OUT OF ROOT INJECTOR. YOU CAN USE @Optional DECORATOR TO IGNORE THIS ERROR IF THIS SERVICE IS OPTIONAL. ".concat(token);
339
+ return _this4;
340
+ }
341
+
342
+ return TokenNotFoundError;
343
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
344
+
179
345
  var NOOP = function NOOP(n) {
180
346
  return n;
181
347
  }; // 第一步:准备构造函数的依赖对象
@@ -192,24 +358,21 @@ var DI = function (exports, autobindDecorator) {
192
358
 
193
359
  _classCallCheck(this, Injector);
194
360
 
195
- _defineProperty(this, "providerMap", new Map());
196
-
197
- _defineProperty(this, "parentToken", null);
198
-
199
361
  _defineProperty(this, "parent", void 0);
200
362
 
201
- _defineProperty(this, "options", void 0);
363
+ _defineProperty(this, "providerMap", new Map());
364
+
365
+ _defineProperty(this, "beforeCacheHook", void 0);
202
366
 
203
- _defineProperty(this, "postHook", void 0);
367
+ _defineProperty(this, "mergePropertyHook", void 0);
204
368
 
205
- _defineProperty(this, "mergeHook", void 0);
369
+ // 引用父级Injector
370
+ this.parent = parent; // 在把服务实例放到缓存中之前,可以调用这个钩子让服务响应化
206
371
 
207
- this.parent = parent;
208
- this.options = options; // 在获取服务实例之后,在更新provider.useValue之前,使服务响应化
372
+ this.beforeCacheHook = options.beforeCacheHook || NOOP; // 在注入实例属性时,需要把属性merge到服务实例对象上,合并过程需要保持响应式
209
373
 
210
- this.postHook = options.postHook || NOOP;
211
- this.mergeHook = options.mergeHook || merge;
212
- this.resolveProviders(providers);
374
+ this.mergePropertyHook = options.mergePropertyHook || merge;
375
+ this.addProviders(providers);
213
376
  }
214
377
 
215
378
  _createClass(Injector, [{
@@ -217,102 +380,242 @@ var DI = function (exports, autobindDecorator) {
217
380
  value: function get(token) {
218
381
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
219
382
 
220
- if (options.self) {
383
+ if (options.skip) {
384
+ if (this.parent) {
385
+ return this.parent.get(token, _objectSpread(_objectSpread({}, options), {}, {
386
+ skip: false
387
+ }));
388
+ } else {
389
+ if (!options.optional) {
390
+ throw new TokenNotFoundError(token);
391
+ }
392
+ }
393
+ } else if (options.self) {
221
394
  if (this.providerMap.has(token)) {
222
395
  var provider = this.providerMap.get(token);
223
396
 
224
397
  if (provider.status === SERVICE_STATUS.INITING) {
225
- throw new Error("".concat(ERROR_CIRCULAR_DEPENDENCY, " ").concat(token, " and ").concat(this.parentToken, " depent on each other."));
398
+ throw new CircularDependencyError(provider, options);
226
399
  }
227
400
 
228
401
  return this.getServiceByProvider(provider, options);
229
402
  } else if (!this.parent && typeof token === 'function' && Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)) {
230
403
  // 如果当前Injector已经是根Injector
231
404
  // 就必须要考虑self的限制
232
- return this.getServiceByClass(token, token);
233
- } else {
234
- if (DECORATOR_KEYS.OPTIONAL in options || DECORATOR_KEYS.DEFAULT_VALUE in options) {
235
- return options.defaultValue;
236
- } else {
237
- throw new Error("".concat(token, " ").concat(ERROR_TOKEN_NOT_FOUND));
238
- }
239
- }
240
- } else if (options.skip) {
241
- options.skip = false;
405
+ var _provider = this.getProviderByToken(token);
242
406
 
243
- if (this.parent) {
244
- return this.parent.get(token, options);
407
+ return this.getServiceByProvider(_provider, options);
245
408
  } else {
246
- if (DECORATOR_KEYS.OPTIONAL in options || DECORATOR_KEYS.DEFAULT_VALUE in options) {
247
- return options.defaultValue;
248
- } else {
249
- throw new Error("".concat(token, " ").concat(ERROR_TOKEN_NOT_FOUND));
409
+ if (!options.optional) {
410
+ throw new TokenNotFoundError(token);
250
411
  }
251
412
  }
252
413
  } else if (this.providerMap.has(token)) {
253
- var _provider = this.providerMap.get(token);
414
+ var _provider2 = this.providerMap.get(token);
254
415
 
255
- if (_provider.status === SERVICE_STATUS.INITING) {
256
- throw new Error("".concat(ERROR_CIRCULAR_DEPENDENCY, " ").concat(token, " and ").concat(this.parentToken, " depent on each other."));
416
+ if (_provider2.status === SERVICE_STATUS.INITING) {
417
+ throw new CircularDependencyError(_provider2, options);
257
418
  }
258
419
 
259
- return this.getServiceByProvider(_provider, options);
420
+ return this.getServiceByProvider(_provider2, options);
260
421
  } else if (this.parent) {
261
422
  return this.parent.get(token, options);
262
423
  } else if (typeof token === 'function' && Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)) {
263
- return this.getServiceByClass(token, token);
424
+ var _provider3 = this.getProviderByToken(token);
425
+
426
+ return this.getServiceByProvider(_provider3, options);
264
427
  } else {
265
- if (DECORATOR_KEYS.OPTIONAL in options || DECORATOR_KEYS.DEFAULT_VALUE in options) {
266
- return options.defaultValue;
267
- } else {
268
- throw new Error("".concat(token, " ").concat(ERROR_TOKEN_NOT_FOUND));
428
+ if (!options.optional) {
429
+ throw new TokenNotFoundError(token);
269
430
  }
270
431
  }
271
432
  }
272
433
  /**
273
- * 获取构造函数的参数-返回数组
274
- * @done
434
+ * 如果token对应的provider不存在
435
+ * 那么就创建一个
436
+ * 调用该方法之前需要保证token对应的provider已经存在或者token本身是一个可注入的类
437
+ *
275
438
  * @param {*} token
276
439
  * @return {*}
277
440
  * @memberof Injector
278
441
  */
279
442
 
443
+ }, {
444
+ key: "getProviderByToken",
445
+ value: function getProviderByToken(token) {
446
+ if (!this.providerMap.has(token)) {
447
+ this.addProvider(token);
448
+ }
449
+
450
+ return this.providerMap.get(token);
451
+ }
452
+ /**
453
+ * 通过provider直接获取service实例
454
+ *
455
+ * @param {*} provider
456
+ * @param {*} options
457
+ * @return {*}
458
+ * @memberof Injector
459
+ */
460
+
461
+ }, {
462
+ key: "getServiceByProvider",
463
+ value: function getServiceByProvider(provider, options) {
464
+ if ('useCacheValue' in provider) {
465
+ return provider.useCacheValue;
466
+ } else if ('useValue' in provider) {
467
+ return this.getServiceUseValueWithProvider(provider);
468
+ } else if (provider.useClass) {
469
+ return this.getServiceUseClassWithProvider(provider, options);
470
+ } else if (provider.useExisting) {
471
+ return this.getServiceUseExistingWithProvider(provider, options);
472
+ } else if (provider.useFactory) {
473
+ return this.getServiceUseFactoryWithProvider(provider, options);
474
+ } else {
475
+ throw new ProviderNotValidError(provider);
476
+ }
477
+ }
478
+ /**
479
+ * 通过useValue获取服务实例
480
+ *
481
+ * @param {*} provider
482
+ * @return {*}
483
+ * @memberof Injector
484
+ */
485
+
486
+ }, {
487
+ key: "getServiceUseValueWithProvider",
488
+ value: function getServiceUseValueWithProvider(provider) {
489
+ var cacheValue = this.beforeCacheHook(provider.useValue);
490
+ provider.useCacheValue = cacheValue;
491
+ return cacheValue;
492
+ }
493
+ /**
494
+ * 通过useClass获取服务实例
495
+ *
496
+ * @param {*} provider
497
+ * @param {*} options
498
+ * @return {*}
499
+ * @memberof Injector
500
+ */
501
+
502
+ }, {
503
+ key: "getServiceUseClassWithProvider",
504
+ value: function getServiceUseClassWithProvider(provider, options) {
505
+ provider.parent = options.provider;
506
+ provider.status = SERVICE_STATUS.INITING;
507
+ var ClassName = provider.useClass;
508
+ var params = this.getContructorParameters(ClassName, provider);
509
+ var cacheValue = this.beforeCacheHook(_construct(ClassName, _toConsumableArray(params)));
510
+ provider.useCacheValue = cacheValue;
511
+ provider.status = SERVICE_STATUS.CONSTRUCTED;
512
+ var properties = this.getInjectProperties(ClassName, provider);
513
+ this.mergePropertyHook(cacheValue, properties);
514
+ provider.status = SERVICE_STATUS.MERGED;
515
+ provider.parent = void 0;
516
+ return cacheValue;
517
+ }
518
+ /**
519
+ * 通过useExisting获取服务实例
520
+ *
521
+ * @param {*} provider
522
+ * @param {*} options
523
+ * @return {*}
524
+ * @memberof Injector
525
+ */
526
+
527
+ }, {
528
+ key: "getServiceUseExistingWithProvider",
529
+ value: function getServiceUseExistingWithProvider(provider, options) {
530
+ provider.parent = options.provider;
531
+ provider.status = SERVICE_STATUS.INITING;
532
+ var cacheValue = this.get(provider.useExisting, _objectSpread(_objectSpread({}, options), {}, {
533
+ provider: provider
534
+ }));
535
+ provider.useCacheValue = cacheValue;
536
+ provider.status = SERVICE_STATUS.CONSTRUCTED;
537
+ provider.parent = void 0;
538
+ return cacheValue;
539
+ }
540
+ /**
541
+ * 通过useFactory获取服务实例
542
+ *
543
+ * @param {*} provider
544
+ * @param {*} options
545
+ * @return {*}
546
+ * @memberof Injector
547
+ */
548
+
549
+ }, {
550
+ key: "getServiceUseFactoryWithProvider",
551
+ value: function getServiceUseFactoryWithProvider(provider, options) {
552
+ var _this5 = this;
553
+
554
+ provider.parent = options.provider;
555
+ provider.status = SERVICE_STATUS.INITING;
556
+ var deps = provider.deps || [];
557
+ var args = deps.map(function (dep) {
558
+ return _this5.get(dep, {
559
+ provider: provider
560
+ });
561
+ });
562
+ var serviceValue = provider.useFactory.apply(provider, _toConsumableArray(args));
563
+ var cacheValue = this.beforeCacheHook(serviceValue);
564
+ provider.useCacheValue = cacheValue;
565
+ provider.status = SERVICE_STATUS.CONSTRUCTED;
566
+ provider.parent = void 0;
567
+ return cacheValue;
568
+ }
569
+ /**
570
+ * 获取构造函数的参数-返回数组
571
+ *
572
+ * @param {*} ClassName
573
+ * @param {*} provider
574
+ * @return {*}
575
+ * @memberof Injector
576
+ */
577
+
280
578
  }, {
281
579
  key: "getContructorParameters",
282
- value: function getContructorParameters(token) {
283
- var _this = this;
580
+ value: function getContructorParameters(ClassName, provider) {
581
+ var _this6 = this;
284
582
 
285
- var currentParentToken = this.parentToken;
286
- this.parentToken = token;
287
- var params = this.getContructorParametersMetas(token);
583
+ var params = this.getContructorParametersMetas(ClassName);
288
584
  var result = params.map(function (meta) {
289
- return _this.get(meta.key, meta.value);
585
+ return _this6.get(meta.key, _objectSpread(_objectSpread({}, meta.value), {}, {
586
+ provider: provider
587
+ }));
290
588
  });
291
- this.parentToken = currentParentToken;
292
589
  return result;
293
590
  }
294
591
  /**
295
592
  * 获取构造函数的参数的装饰器元数据
296
- * @done
297
- * @param {*} token
593
+ *
594
+ * @param {*} ClassName
298
595
  * @return {*}
299
596
  * @memberof Injector
300
597
  */
301
598
 
302
599
  }, {
303
600
  key: "getContructorParametersMetas",
304
- value: function getContructorParametersMetas(token) {
601
+ value: function getContructorParametersMetas(ClassName) {
305
602
  // 构造函数的参数的类型数据-原始数据-是一个数组
306
- var params = Reflect.getMetadata(SERVICE_PARAM_TYPES, token) || []; // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据
603
+ var params = Reflect.getMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, ClassName) || []; // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据
307
604
 
308
- var propertiesMetadatas = Reflect.getMetadata(SERVICE_INJECTED_PARAMS, token) || {};
605
+ var propertiesMetadatas = Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) || {};
309
606
  return params.map(function (paramType, index) {
310
607
  // 查找当前index对应的参数有没有使用装饰器
311
- var propertyMetadatas = propertiesMetadatas[index] || []; // 查找装饰器列表中有没有@Inject
608
+ var propertyMetadatas = propertiesMetadatas[index] || []; // 查找装饰器列表中有没有@Inject装饰器的数据
312
609
 
313
- var ctor = propertyMetadatas.find(function (meta) {
610
+ var injectMeta = propertyMetadatas.find(function (meta) {
314
611
  return meta.key === DECORATOR_KEYS.INJECT;
315
- }); // 把装饰器列表收集为对象,并且排除掉@Inject
612
+ });
613
+
614
+ if (injectMeta && injectMeta.value === Object || !injectMeta && paramType === Object) {
615
+ // 构造函数的参数可以不使用@Inject,但是一定不能是interface
616
+ throw new InjectFailedError(injectMeta, ClassName, index, paramType);
617
+ } // 把装饰器列表收集为对象,并且排除掉@Inject
618
+
316
619
 
317
620
  var options = propertyMetadatas.reduce(function (acc, meta) {
318
621
  if (meta.key !== DECORATOR_KEYS.INJECT) {
@@ -322,67 +625,67 @@ var DI = function (exports, autobindDecorator) {
322
625
  return acc;
323
626
  }, {});
324
627
  return {
325
- key: resolveForwardRef(ctor && ctor.value) || paramType,
628
+ key: resolveForwardRef(injectMeta && injectMeta.value) || paramType,
326
629
  value: options
327
630
  };
328
631
  });
329
632
  }
330
633
  /**
331
634
  * 获取注入的实例属性-返回对象
332
- * @done
333
- * @param {*} token
635
+ *
636
+ * @param {*} ClassName
637
+ * @param {*} provider
334
638
  * @return {*}
335
639
  * @memberof Injector
336
640
  */
337
641
 
338
642
  }, {
339
643
  key: "getInjectProperties",
340
- value: function getInjectProperties(token) {
341
- var _this2 = this;
644
+ value: function getInjectProperties(ClassName, provider) {
645
+ var _this7 = this;
342
646
 
343
- var currentParentToken = this.parentToken;
344
- this.parentToken = token;
345
- var metas = this.getInjectPropertiesMetas(token);
647
+ var metas = this.getInjectPropertiesMetas(ClassName);
346
648
  var properties = {};
347
649
  metas.forEach(function (meta) {
348
650
  var _meta$value;
349
651
 
350
- var property = _this2.get(meta.provide, meta.value);
652
+ var property = _this7.get(meta.provide, _objectSpread(_objectSpread({}, meta.value), {}, {
653
+ provider: provider
654
+ }));
351
655
 
352
- if (!(property === undefined && (_meta$value = meta.value) !== null && _meta$value !== void 0 && _meta$value.optional)) {
353
- properties[meta.key] = _this2.get(meta.provide, meta.value);
656
+ if (!(property === void 0 && (_meta$value = meta.value) !== null && _meta$value !== void 0 && _meta$value.optional)) {
657
+ properties[meta.key] = property;
354
658
  }
355
659
  });
356
- this.parentToken = currentParentToken;
357
660
  return properties;
358
661
  }
359
662
  /**
360
663
  * 获取注入属性的装饰器数据
361
- * @done
362
- * @param {*} token
664
+ *
665
+ * @param {*} ClassName
363
666
  * @return {*}
364
667
  * @memberof Injector
365
668
  */
366
669
 
367
670
  }, {
368
671
  key: "getInjectPropertiesMetas",
369
- value: function getInjectPropertiesMetas(token) {
672
+ value: function getInjectPropertiesMetas(ClassName) {
370
673
  // 获取注入属性的metas-类型是Recors<string, Array>
371
- var propertiesMetadatas = Reflect.getMetadata(SERVICE_INJECTED_PROPS, token) || {};
674
+ var propertiesMetadatas = Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PROPS, ClassName) || {};
372
675
  var propertiesMetas = [];
373
676
 
374
677
  for (var key in propertiesMetadatas) {
375
678
  if (has(propertiesMetadatas, key)) {
376
679
  // 当前key属性对应的所有的装饰器
377
- var propertyMetadatas = propertiesMetadatas[key] || []; // 当前key属性对应的@Inject
680
+ var propertyMetadatas = propertiesMetadatas[key]; // 当前key属性对应的@Inject装饰器的数据
378
681
 
379
- var ctor = propertyMetadatas.find(function (meta) {
682
+ var injectMeta = propertyMetadatas.find(function (meta) {
380
683
  return meta.key === DECORATOR_KEYS.INJECT;
381
684
  });
382
685
 
383
- if (!ctor) {
686
+ if (!injectMeta || injectMeta.value === Object) {
384
687
  // 属性一定要手动指定@Inject
385
- throw new Error(ERROR_INJECT_NOT_VALID);
688
+ throw new InjectFailedError(injectMeta, ClassName, key);
386
689
  }
387
690
 
388
691
  var options = propertyMetadatas.reduce(function (acc, meta) {
@@ -394,7 +697,7 @@ var DI = function (exports, autobindDecorator) {
394
697
  }, {});
395
698
  propertiesMetas.push({
396
699
  key: key,
397
- provide: resolveForwardRef(ctor.value),
700
+ provide: resolveForwardRef(injectMeta.value),
398
701
  value: options
399
702
  });
400
703
  }
@@ -402,103 +705,25 @@ var DI = function (exports, autobindDecorator) {
402
705
 
403
706
  return propertiesMetas;
404
707
  }
405
- /**
406
- * 通过provider直接获取service实例
407
- * @done
408
- * @param {*} provider
409
- * @param {*} options
410
- * @return {*}
411
- * @memberof Injector
412
- */
413
-
414
- }, {
415
- key: "getServiceByProvider",
416
- value: function getServiceByProvider(provider, options) {
417
- var _this3 = this;
418
-
419
- if ('useValue' in provider) {
420
- return provider.useValue;
421
- } else if (provider.useClass) {
422
- var serviceValue = this.getServiceByClass(provider.useClass, provider.provide);
423
- provider.useValue = this.postHook(serviceValue);
424
- return provider.useValue;
425
- } else if (provider.useExisting) {
426
- var _serviceValue = this.get(provider.useExisting, options);
427
-
428
- provider.useValue = this.postHook(_serviceValue);
429
- return provider.useValue;
430
- } else if (provider.useFactory) {
431
- var deps = provider.deps || [];
432
- var args = deps.map(function (dep) {
433
- return _this3.get(dep);
434
- });
435
-
436
- var _serviceValue2 = provider.useFactory.apply(provider, _toConsumableArray(args));
437
-
438
- provider.useValue = this.postHook(_serviceValue2);
439
- return provider.useValue;
440
- } else {
441
- throw new Error(ERROR_PROVIDER_NOT_VALID);
442
- }
443
- }
444
- /**
445
- * 通过类名获取服务实例
446
- * @done
447
- * @template T
448
- * @param {new (...args: any[]) => T} ClassName
449
- * @param {*} options
450
- * @return {*}
451
- * @memberof Injector
452
- */
453
-
454
- }, {
455
- key: "getServiceByClass",
456
- value: function getServiceByClass(ClassName, provide) {
457
- var provider = this.providerMap.get(provide);
458
-
459
- if (!provider) {
460
- this.addProvider({
461
- provide: provide,
462
- useClass: ClassName
463
- });
464
- provider = this.providerMap.get(provide);
465
- }
466
-
467
- provider.status = SERVICE_STATUS.INITING;
468
- var params = this.getContructorParameters(ClassName);
469
- var service = this.postHook(_construct(ClassName, _toConsumableArray(params)));
470
- provider.useValue = service;
471
- provider.status = SERVICE_STATUS.CONSTRUCTED;
472
- var properties = this.getInjectProperties(ClassName);
473
- this.mergeHook(service, properties);
474
- provider.status = SERVICE_STATUS.MERGED;
475
-
476
- if (service.onInit && typeof service.onInit === 'function') {
477
- service.onInit();
478
- }
479
-
480
- provider.status = SERVICE_STATUS.INITED;
481
- return service;
482
- }
483
708
  /**
484
709
  * 把providers数组转换成map,避免后续的遍历
485
- * @done
710
+ *
486
711
  * @param {any[]} providers
487
712
  * @memberof Injector
488
713
  */
489
714
 
490
715
  }, {
491
- key: "resolveProviders",
492
- value: function resolveProviders(providers) {
493
- var _this4 = this;
716
+ key: "addProviders",
717
+ value: function addProviders(providers) {
718
+ var _this8 = this;
494
719
 
495
720
  providers.forEach(function (provider) {
496
- _this4.addProvider(provider);
721
+ _this8.addProvider(provider);
497
722
  });
498
723
  }
499
724
  /**
500
725
  * 添加新的provider
501
- * @done
726
+ *
502
727
  * @param {*} provider
503
728
  * @memberof Injector
504
729
  */
@@ -507,10 +732,6 @@ var DI = function (exports, autobindDecorator) {
507
732
  key: "addProvider",
508
733
  value: function addProvider(provider) {
509
734
  if (provider.provide) {
510
- if ('useValue' in provider) {
511
- provider.useValue = this.postHook(provider.useValue);
512
- }
513
-
514
735
  this.providerMap.set(provider.provide, provider);
515
736
  } else {
516
737
  this.providerMap.set(provider, {
@@ -529,8 +750,12 @@ var DI = function (exports, autobindDecorator) {
529
750
  key: "dispose",
530
751
  value: function dispose() {
531
752
  this.providerMap.forEach(function (value) {
532
- if (value && value.dispose) {
533
- value.dispose();
753
+ if (value && value.useCacheValue && value.useCacheValue.dispose) {
754
+ try {
755
+ value.useCacheValue.dispose();
756
+ } catch (error) {
757
+ console.error(error);
758
+ }
534
759
  }
535
760
  });
536
761
  this.providerMap = null;
@@ -541,24 +766,19 @@ var DI = function (exports, autobindDecorator) {
541
766
  return Injector;
542
767
  }();
543
768
 
544
- exports.autobind = autobindDecorator__default;
769
+ exports.CircularDependencyError = CircularDependencyError;
545
770
  exports.DECORATOR_KEYS = DECORATOR_KEYS;
546
- exports.DESIGN_PARAM_TYPES = DESIGN_PARAM_TYPES;
547
- exports.ERROR_CIRCULAR_DEPENDENCY = ERROR_CIRCULAR_DEPENDENCY;
548
- exports.ERROR_DISABLE_MULTIPLE_INJECTABLE = ERROR_DISABLE_MULTIPLE_INJECTABLE;
549
- exports.ERROR_INJECT_NOT_VALID = ERROR_INJECT_NOT_VALID;
550
- exports.ERROR_PROVIDER_NOT_VALID = ERROR_PROVIDER_NOT_VALID;
551
- exports.ERROR_TOKEN_NOT_FOUND = ERROR_TOKEN_NOT_FOUND;
552
771
  exports.Inject = Inject;
772
+ exports.InjectFailedError = InjectFailedError;
553
773
  exports.Injectable = Injectable;
554
774
  exports.Injector = Injector;
555
775
  exports.Optional = Optional;
556
- exports.SERVICE_INJECTED_PARAMS = SERVICE_INJECTED_PARAMS;
557
- exports.SERVICE_INJECTED_PROPS = SERVICE_INJECTED_PROPS;
558
- exports.SERVICE_PARAM_TYPES = SERVICE_PARAM_TYPES;
776
+ exports.ProviderNotValidError = ProviderNotValidError;
559
777
  exports.SERVICE_STATUS = SERVICE_STATUS;
560
778
  exports.Self = Self;
561
779
  exports.Skip = Skip;
780
+ exports.TokenNotFoundError = TokenNotFoundError;
781
+ exports.createDecorator = createDecorator;
562
782
  exports.forwardRef = forwardRef;
563
783
  exports.has = has;
564
784
  exports.isForwardRef = isForwardRef;
@@ -568,5 +788,5 @@ var DI = function (exports, autobindDecorator) {
568
788
  value: true
569
789
  });
570
790
  return exports;
571
- }({}, AutoBindDecorator);
791
+ }({});
572
792
  //# sourceMappingURL=index.iife.js.map