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