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