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