@kaokei/di 1.1.0 → 2.0.1

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