@kaokei/di 1.0.22 → 1.0.23

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