@kaokei/di 1.1.0 → 2.0.0

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