@kaokei/di 2.0.0 → 2.0.2

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.
@@ -27,7 +27,7 @@ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input ==
27
27
  * @kaokei/di
28
28
  * Tiny di library depend on typescript and reflect-metadata
29
29
  *
30
- * @version 2.0.0
30
+ * @version 2.0.2
31
31
  * @author kaokei
32
32
  * @license MIT
33
33
  * @link https://github.com/kaokei/di
@@ -61,7 +61,111 @@ var DI = function (exports) {
61
61
  CONSTRUCTED: Symbol('constructed'),
62
62
  MERGED: Symbol('merged')
63
63
  };
64
-
64
+ var CircularDependencyError = /*#__PURE__*/function (_Error) {
65
+ _inherits(CircularDependencyError, _Error);
66
+ var _super = _createSuper(CircularDependencyError);
67
+ function CircularDependencyError(provider, options) {
68
+ var _this;
69
+ _classCallCheck(this, CircularDependencyError);
70
+ _this = _super.call(this);
71
+ _defineProperty(_assertThisInitialized(_this), "name", 'CIRCULAR_DEPENDENCY_ERROR');
72
+ _defineProperty(_assertThisInitialized(_this), "message", _this.name);
73
+ var tokenArr = [provider.provide];
74
+ var currentProvider = options === null || options === void 0 ? void 0 : options.provider;
75
+ while (currentProvider && currentProvider.provide) {
76
+ tokenArr.push(currentProvider.provide);
77
+ currentProvider = currentProvider.parent;
78
+ }
79
+ var tokenListText = tokenArr.join(' <-- ');
80
+ _this.message = "CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \n ".concat(tokenListText);
81
+ return _this;
82
+ }
83
+ return _createClass(CircularDependencyError);
84
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
85
+ var InjectFailedError = /*#__PURE__*/function (_Error2) {
86
+ _inherits(InjectFailedError, _Error2);
87
+ var _super2 = _createSuper(InjectFailedError);
88
+ function InjectFailedError(injectMeta, ClassName, key, paramType) {
89
+ var _this2;
90
+ _classCallCheck(this, InjectFailedError);
91
+ _this2 = _super2.call(this);
92
+ _defineProperty(_assertThisInitialized(_this2), "name", 'INJECT_FAILED_ERROR');
93
+ _defineProperty(_assertThisInitialized(_this2), "message", _this2.name);
94
+ if (paramType) {
95
+ // 是构造函数的参数装饰器
96
+ if (injectMeta && injectMeta.value === Object) {
97
+ _this2.message = "CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ".concat(key, " OF CLASS ").concat(ClassName, ".");
98
+ } else if (paramType === Object) {
99
+ _this2.message = "CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ".concat(key, " OF CLASS ").concat(ClassName, ".");
100
+ }
101
+ } else {
102
+ // 是属性装饰器
103
+ if (!injectMeta) {
104
+ _this2.message = "INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ".concat(key, " OF CLASS ").concat(ClassName, ".");
105
+ } else if (injectMeta.value === Object) {
106
+ _this2.message = "CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ".concat(key, " OF CLASS ").concat(ClassName, ".");
107
+ }
108
+ }
109
+ return _this2;
110
+ }
111
+ return _createClass(InjectFailedError);
112
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
113
+ var ProviderNotValidError = /*#__PURE__*/function (_Error3) {
114
+ _inherits(ProviderNotValidError, _Error3);
115
+ var _super3 = _createSuper(ProviderNotValidError);
116
+ function ProviderNotValidError(provider) {
117
+ var _this3;
118
+ _classCallCheck(this, ProviderNotValidError);
119
+ _this3 = _super3.call(this);
120
+ _defineProperty(_assertThisInitialized(_this3), "name", 'PROVIDER_NOT_VALID_ERROR');
121
+ _defineProperty(_assertThisInitialized(_this3), "message", _this3.name);
122
+ _this3.message = "PROVIDER NOT VALID. ".concat(provider);
123
+ return _this3;
124
+ }
125
+ return _createClass(ProviderNotValidError);
126
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
127
+ var TokenNotFoundError = /*#__PURE__*/function (_Error4) {
128
+ _inherits(TokenNotFoundError, _Error4);
129
+ var _super4 = _createSuper(TokenNotFoundError);
130
+ function TokenNotFoundError(token) {
131
+ var _this4;
132
+ _classCallCheck(this, TokenNotFoundError);
133
+ _this4 = _super4.call(this);
134
+ _defineProperty(_assertThisInitialized(_this4), "name", 'TOKEN_NOT_FOUND_ERROR');
135
+ _defineProperty(_assertThisInitialized(_this4), "message", _this4.name);
136
+ _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);
137
+ return _this4;
138
+ }
139
+ return _createClass(TokenNotFoundError);
140
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
141
+ var ConstructorInjectMissTokenError = /*#__PURE__*/function (_Error5) {
142
+ _inherits(ConstructorInjectMissTokenError, _Error5);
143
+ var _super5 = _createSuper(ConstructorInjectMissTokenError);
144
+ function ConstructorInjectMissTokenError(target) {
145
+ var _this5;
146
+ _classCallCheck(this, ConstructorInjectMissTokenError);
147
+ _this5 = _super5.call(this);
148
+ _defineProperty(_assertThisInitialized(_this5), "name", 'CONSTRUCTOR_INJECT_MISS_TOKEN_ERROR');
149
+ _defineProperty(_assertThisInitialized(_this5), "message", _this5.name);
150
+ _this5.message = "For the constructor of class ".concat(target, ", every parameter must specify a @Inject.");
151
+ return _this5;
152
+ }
153
+ return _createClass(ConstructorInjectMissTokenError);
154
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
155
+ var PropertyInjectMissTokenError = /*#__PURE__*/function (_Error6) {
156
+ _inherits(PropertyInjectMissTokenError, _Error6);
157
+ var _super6 = _createSuper(PropertyInjectMissTokenError);
158
+ function PropertyInjectMissTokenError(target, targetKey) {
159
+ var _this6;
160
+ _classCallCheck(this, PropertyInjectMissTokenError);
161
+ _this6 = _super6.call(this);
162
+ _defineProperty(_assertThisInitialized(_this6), "name", 'PROPERTY_INJECT_MISS_TOKEN_ERROR');
163
+ _defineProperty(_assertThisInitialized(_this6), "message", _this6.name);
164
+ _this6.message = "For the property ".concat(targetKey, " of class ").concat(target, ", @Inject must specify a token.");
165
+ return _this6;
166
+ }
167
+ return _createClass(PropertyInjectMissTokenError);
168
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
65
169
  /**
66
170
  * 这里记录不同的装饰器的参数的含义
67
171
  *
@@ -123,12 +227,24 @@ var DI = function (exports) {
123
227
  // 很多装饰器具有默认值,可以不提供实参,而是使用默认值
124
228
  value: decoratorValue === void 0 ? defaultValue : decoratorValue
125
229
  };
230
+ // 当项目使用esbuild不支持emitDecoratorMetadata时
231
+ // 这里检查了@Inject装饰器在实例属性中需要指定参数
232
+ // 如果是构造函数理论上也需要使用@inject装饰器,并且需要指定参数
233
+ // 只不过没有在这里做判断,而是在getContructorParametersMetas中判断的
126
234
  if (!isParameterDecorator) {
235
+ // 实例属性装饰器
127
236
  if (decoratorKey === DECORATOR_KEYS.INJECT) {
237
+ // 是@Inject装饰器
128
238
  if (decoratorValue === void 0) {
129
- // 是实例属性装饰器,且是Inject装饰器,且没有指定参数
130
- // 需要获取默认的类型数据
131
- metadata.value = Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PROPERTY_TYPE, target, targetKey);
239
+ // 装饰器没有指定参数
240
+ // 所以需要通过Reflect获取默认的类型数据
241
+ var metadataValue = Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PROPERTY_TYPE, target, targetKey);
242
+ {
243
+ if (metadataValue === void 0) {
244
+ throw new PropertyInjectMissTokenError(target, targetKey);
245
+ }
246
+ }
247
+ metadata.value = metadataValue;
132
248
  }
133
249
  }
134
250
  }
@@ -188,83 +304,6 @@ var DI = function (exports) {
188
304
  function resolveForwardRef(type) {
189
305
  return isForwardRef(type) ? type() : type;
190
306
  }
191
- var CircularDependencyError = /*#__PURE__*/function (_Error) {
192
- _inherits(CircularDependencyError, _Error);
193
- var _super = _createSuper(CircularDependencyError);
194
- function CircularDependencyError(provider, options) {
195
- var _this;
196
- _classCallCheck(this, CircularDependencyError);
197
- _this = _super.call(this);
198
- _defineProperty(_assertThisInitialized(_this), "name", 'CIRCULAR_DEPENDENCY_ERROR');
199
- _defineProperty(_assertThisInitialized(_this), "message", _this.name);
200
- var tokenArr = [provider.provide];
201
- var currentProvider = options === null || options === void 0 ? void 0 : options.provider;
202
- while (currentProvider && currentProvider.provide) {
203
- tokenArr.push(currentProvider.provide);
204
- currentProvider = currentProvider.parent;
205
- }
206
- var tokenListText = tokenArr.join(' <-- ');
207
- _this.message = "CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \n ".concat(tokenListText);
208
- return _this;
209
- }
210
- return _createClass(CircularDependencyError);
211
- }( /*#__PURE__*/_wrapNativeSuper(Error));
212
- var InjectFailedError = /*#__PURE__*/function (_Error2) {
213
- _inherits(InjectFailedError, _Error2);
214
- var _super2 = _createSuper(InjectFailedError);
215
- function InjectFailedError(injectMeta, ClassName, key, paramType) {
216
- var _this2;
217
- _classCallCheck(this, InjectFailedError);
218
- _this2 = _super2.call(this);
219
- _defineProperty(_assertThisInitialized(_this2), "name", 'INJECT_FAILED_ERROR');
220
- _defineProperty(_assertThisInitialized(_this2), "message", _this2.name);
221
- if (paramType) {
222
- // 是构造函数的参数装饰器
223
- if (injectMeta && injectMeta.value === Object) {
224
- _this2.message = "CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ".concat(key, " OF CLASS ").concat(ClassName, ".");
225
- } else if (paramType === Object) {
226
- _this2.message = "CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ".concat(key, " OF CLASS ").concat(ClassName, ".");
227
- }
228
- } else {
229
- // 是属性装饰器
230
- if (!injectMeta) {
231
- _this2.message = "INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ".concat(key, " OF CLASS ").concat(ClassName, ".");
232
- } else if (injectMeta.value === Object) {
233
- _this2.message = "CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ".concat(key, " OF CLASS ").concat(ClassName, ".");
234
- }
235
- }
236
- return _this2;
237
- }
238
- return _createClass(InjectFailedError);
239
- }( /*#__PURE__*/_wrapNativeSuper(Error));
240
- var ProviderNotValidError = /*#__PURE__*/function (_Error3) {
241
- _inherits(ProviderNotValidError, _Error3);
242
- var _super3 = _createSuper(ProviderNotValidError);
243
- function ProviderNotValidError(provider) {
244
- var _this3;
245
- _classCallCheck(this, ProviderNotValidError);
246
- _this3 = _super3.call(this);
247
- _defineProperty(_assertThisInitialized(_this3), "name", 'PROVIDER_NOT_VALID_ERROR');
248
- _defineProperty(_assertThisInitialized(_this3), "message", _this3.name);
249
- _this3.message = "PROVIDER NOT VALID. ".concat(provider);
250
- return _this3;
251
- }
252
- return _createClass(ProviderNotValidError);
253
- }( /*#__PURE__*/_wrapNativeSuper(Error));
254
- var TokenNotFoundError = /*#__PURE__*/function (_Error4) {
255
- _inherits(TokenNotFoundError, _Error4);
256
- var _super4 = _createSuper(TokenNotFoundError);
257
- function TokenNotFoundError(token) {
258
- var _this4;
259
- _classCallCheck(this, TokenNotFoundError);
260
- _this4 = _super4.call(this);
261
- _defineProperty(_assertThisInitialized(_this4), "name", 'TOKEN_NOT_FOUND_ERROR');
262
- _defineProperty(_assertThisInitialized(_this4), "message", _this4.name);
263
- _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);
264
- return _this4;
265
- }
266
- return _createClass(TokenNotFoundError);
267
- }( /*#__PURE__*/_wrapNativeSuper(Error));
268
307
  var NOOP = function NOOP(n) {
269
308
  return n;
270
309
  };
@@ -474,12 +513,12 @@ var DI = function (exports) {
474
513
  }, {
475
514
  key: "getServiceUseFactoryWithProvider",
476
515
  value: function getServiceUseFactoryWithProvider(provider, options) {
477
- var _this5 = this;
516
+ var _this7 = this;
478
517
  provider.status = SERVICE_STATUS.INITING;
479
518
  provider.parent = options.provider;
480
519
  var deps = provider.deps || [];
481
520
  var args = deps.map(function (dep) {
482
- return _this5.get(dep, {
521
+ return _this7.get(dep, {
483
522
  provider: provider
484
523
  });
485
524
  });
@@ -501,10 +540,10 @@ var DI = function (exports) {
501
540
  }, {
502
541
  key: "getContructorParameters",
503
542
  value: function getContructorParameters(ClassName, provider) {
504
- var _this6 = this;
543
+ var _this8 = this;
505
544
  var params = this.getContructorParametersMetas(ClassName);
506
545
  var result = params.map(function (meta) {
507
- return _this6.get(meta.provide, _objectSpread(_objectSpread({}, meta.value), {}, {
546
+ return _this8.get(meta.provide, _objectSpread(_objectSpread({}, meta.value), {}, {
508
547
  provider: provider
509
548
  }));
510
549
  });
@@ -521,10 +560,23 @@ var DI = function (exports) {
521
560
  key: "getContructorParametersMetas",
522
561
  value: function getContructorParametersMetas(ClassName) {
523
562
  // 构造函数的参数的类型数据-原始数据-是一个数组
524
- var params = Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, ClassName) || [];
563
+ var params = Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, ClassName);
525
564
  // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据
526
565
  var propertiesMetadatas = Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) || {};
527
- return params.map(function (paramType, index) {
566
+ // 获取当前构造函数的形参个数
567
+ var classParamsLength = ClassName.length;
568
+ {
569
+ if (!params) {
570
+ // params不存在说明当前环境不支持emitDecoratorMetadata
571
+ var propertiesMetadatasLength = Object.keys(propertiesMetadatas);
572
+ if (propertiesMetadatasLength < classParamsLength) {
573
+ throw new ConstructorInjectMissTokenError(ClassName);
574
+ }
575
+ }
576
+ }
577
+ // 如果params不存在需要创建符合形参数量的数组
578
+ var newParams = params || _toConsumableArray(Array(classParamsLength));
579
+ return newParams.map(function (paramType, index) {
528
580
  // 查找当前index对应的参数有没有使用装饰器
529
581
  var propertyMetadatas = propertiesMetadatas[index] || [];
530
582
  // 查找装饰器列表中有没有@Inject装饰器的数据
@@ -560,12 +612,12 @@ var DI = function (exports) {
560
612
  }, {
561
613
  key: "getInjectProperties",
562
614
  value: function getInjectProperties(ClassName, provider) {
563
- var _this7 = this;
615
+ var _this9 = this;
564
616
  var metas = this.getInjectPropertiesMetas(ClassName);
565
617
  var properties = {};
566
618
  metas.forEach(function (meta) {
567
619
  var _meta$value;
568
- var property = _this7.get(meta.provide, _objectSpread(_objectSpread({}, meta.value), {}, {
620
+ var property = _this9.get(meta.provide, _objectSpread(_objectSpread({}, meta.value), {}, {
569
621
  provider: provider
570
622
  }));
571
623
  if (!(property === void 0 && (_meta$value = meta.value) !== null && _meta$value !== void 0 && _meta$value.optional)) {
@@ -623,9 +675,9 @@ var DI = function (exports) {
623
675
  }, {
624
676
  key: "addProviders",
625
677
  value: function addProviders(providers) {
626
- var _this8 = this;
678
+ var _this10 = this;
627
679
  providers.forEach(function (provider) {
628
- _this8.addProvider(provider);
680
+ _this10.addProvider(provider);
629
681
  });
630
682
  }
631
683
  /**
@@ -670,12 +722,14 @@ var DI = function (exports) {
670
722
  return Injector;
671
723
  }();
672
724
  exports.CircularDependencyError = CircularDependencyError;
725
+ exports.ConstructorInjectMissTokenError = ConstructorInjectMissTokenError;
673
726
  exports.DECORATOR_KEYS = DECORATOR_KEYS;
674
727
  exports.Inject = Inject;
675
728
  exports.InjectFailedError = InjectFailedError;
676
729
  exports.Injectable = Injectable;
677
730
  exports.Injector = Injector;
678
731
  exports.Optional = Optional;
732
+ exports.PropertyInjectMissTokenError = PropertyInjectMissTokenError;
679
733
  exports.ProviderNotValidError = ProviderNotValidError;
680
734
  exports.SERVICE_STATUS = SERVICE_STATUS;
681
735
  exports.Self = Self;
@@ -1 +1 @@
1
- {"version":3,"file":"index.iife.js","sources":["../src/constants.ts","../src/decorator.ts","../src/utils.ts","../src/forwardRef.ts","../src/errors/CircularDependencyError.ts","../src/errors/InjectFailedError.ts","../src/errors/ProviderNotValidError.ts","../src/errors/TokenNotFoundError.ts","../src/Injector.ts"],"sourcesContent":["export const DECORATOR_KEYS = {\n // ts自带的类的实例属性的类型的key\n DESIGN_PROPERTY_TYPE: 'design:type',\n // ts自带的类的构造函数的参数的类型信息的key\n DESIGN_PARAM_TYPES: 'design:paramtypes',\n // 记录构造函数参数装饰器对应的数据的key\n SERVICE_INJECTED_PARAMS: 'service:injected:params',\n // 记录实例属性装饰器对应的数据的key\n SERVICE_INJECTED_PROPS: 'service:injected:props',\n // Inject装饰器的key\n INJECT: Symbol('inject'),\n // Injectable装饰器的key\n INJECTABLE: Symbol('injectable'),\n // Self装饰器的key\n SELF: 'self',\n // Skip装饰器的key\n SKIP_SELF: 'skip',\n // Optional装饰器的key\n OPTIONAL: 'optional',\n};\n\nexport const SERVICE_STATUS = {\n INITING: Symbol('initing'),\n CONSTRUCTED: Symbol('constructed'),\n MERGED: Symbol('merged'),\n};\n","/**\n * 这里记录不同的装饰器的参数的含义\n *\n * class decorator:\n * 只有一个参数:构造函数\n * property decorator:\n * 静态属性:构造函数, 属性名\n * 实例属性:原型, 属性名\n * parameter decorator:\n * 构造函数参数:构造函数, undefined, 0\n * 普通函数参数:原型, 方法名, 0\n * 静态函数参数:构造函数, 方法名, 0\n * method decorator:\n * 静态方法:构造函数, 方法名, 属性描述符\n * 实例方法:原型, 方法名, 属性描述符\n * accessor decorator:\n * 静态访问器:构造函数, 方法名, 属性描述符\n * 实例访问器:原型, 方法名, 属性描述符\n */\n\nimport { DECORATOR_KEYS } from './constants';\n\n/**\n * 创建装饰器的高阶函数\n * 装饰器的通用逻辑就是通过Reflect记录到全局的Map中\n * 所以可以抽象出一个通用逻辑,这里需要注意对Inject装饰器有特殊判断\n *\n * @param {(string | symbol)} decoratorKey 代表某个装饰器的名称\n * @param {*} [defaultValue] 该装饰器函数的默认参数\n * @return {*} 一个装饰器\n */\nexport function createDecorator(\n decoratorKey: string | symbol,\n defaultValue?: any\n) {\n // 因为装饰器本身作为一个函数是有参数的,此处的decoratorValue就是实际使用装饰器的实参\n return function (decoratorValue?: any): any {\n // 目前的装饰器只支持类的构造函数参数装饰器和类的实例属性装饰器\n // target可能是构造函数或者类的原型\n // 如果target是构造函数,targetKey是undefined,index是参数的位置下标\n // 如果target是原型,targetKey是属姓名,index是undefined\n return function (target: any, targetKey: string, index?: number): void {\n // 如果index是number,那么代表是构造函数的参数的装饰器\n const isParameterDecorator = typeof index === 'number';\n // 统一把装饰器数据绑定到构造函数上,后续获取数据比较方便\n const Ctor = isParameterDecorator ? target : target.constructor;\n // 如果是构造函数的参数装饰器,取参数位置下标,否则取实例属性的属性名\n const key = isParameterDecorator ? index : targetKey;\n\n // 区分构造函数的参数装饰器和实例属性的装饰器\n // 分别记录到全局Map的不同位置,metadataKey不一样\n const metadataKey = isParameterDecorator\n ? DECORATOR_KEYS.SERVICE_INJECTED_PARAMS\n : DECORATOR_KEYS.SERVICE_INJECTED_PROPS;\n\n // 这里是一个大对象,对应的key是metadataKey\n // 所以全局Map中有两个不同的metadataKey,以及对应的数据对象\n // 如果是构造函数参数装饰器,这个对象中的key是参数位置下标\n // 如果是实例属性装饰器,这个对象中的key是属性名\n const paramsOrPropertiesMetadata =\n Reflect.getMetadata(metadataKey, Ctor) || {};\n\n // 每个参数或者实例属性都可以有多个装饰器\n // 所以paramsOrPropertiesMetadata这个大对象的每个key对应的value都是一个数组\n // 该数组中的每一个元素是一个对象,保存着每一个装饰器的数据\n const paramOrPropertyMetadata = paramsOrPropertiesMetadata[key] || [];\n\n const metadata = {\n // 装饰器的名称\n key: decoratorKey,\n // 装饰器的值,即装饰器函数的实参\n // 很多装饰器具有默认值,可以不提供实参,而是使用默认值\n value: decoratorValue === void 0 ? defaultValue : decoratorValue,\n };\n\n if (!isParameterDecorator) {\n if (decoratorKey === DECORATOR_KEYS.INJECT) {\n if (decoratorValue === void 0) {\n // 是实例属性装饰器,且是Inject装饰器,且没有指定参数\n // 需要获取默认的类型数据\n metadata.value = Reflect.getMetadata(\n DECORATOR_KEYS.DESIGN_PROPERTY_TYPE,\n target,\n targetKey\n );\n }\n }\n }\n\n // 把当前装饰器的数据对象放到数组中\n paramOrPropertyMetadata.push(metadata);\n // 关联这个数组和对应的key\n paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;\n // 再把整个大对象放到全局Map中\n Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, Ctor);\n };\n };\n}\n\n// 可以使用在类构造函数的参数中和类的实例属性中\nexport const Inject = createDecorator(DECORATOR_KEYS.INJECT);\n\n// 指定只在当前injector中寻找服务\nexport const Self = createDecorator(DECORATOR_KEYS.SELF, true);\n\n// 指定跳过当前injector寻找服务\nexport const Skip = createDecorator(DECORATOR_KEYS.SKIP_SELF, true);\n\n// 指定服务是可选的,找不到服务时返回undefined,否则抛出异常\n// 其实应该说是默认情况下找不到服务时,会抛出异常,除非明确指定是optional的\nexport const Optional = createDecorator(DECORATOR_KEYS.OPTIONAL, true);\n\n/**\n * 表明服务可注入\n * 主要工作就是收集构造函数的参数类型信息\n *\n * @export\n * @return {*}\n */\nexport function Injectable() {\n return function (target: any) {\n // 标记这个类可以注入\n Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target);\n\n return target;\n };\n}\n","import { DECORATOR_KEYS } from './constants';\n\nexport function has(obj: any, key: string) {\n return obj && Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function merge(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = source[key];\n }\n }\n return target;\n}\n\nexport function isInjectableToken(token: any) {\n return (\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n );\n}\n","import { has } from './utils';\n\nexport interface ForwardRefFn {\n (): any;\n}\n\nexport function forwardRef(fn: ForwardRefFn) {\n (<any>fn).__forward_ref__ = forwardRef;\n return fn;\n}\n\nexport function isForwardRef(fn: any): fn is () => any {\n return (\n typeof fn === 'function' &&\n has(fn, '__forward_ref__') &&\n fn.__forward_ref__ === forwardRef\n );\n}\n\nexport function resolveForwardRef<T>(type: T): T {\n return isForwardRef(type) ? type() : type;\n}\n","export class CircularDependencyError extends Error {\n public name = 'CIRCULAR_DEPENDENCY_ERROR';\n\n public message = this.name;\n\n constructor(provider: any, options: any) {\n super();\n\n const tokenArr = [provider.provide];\n let currentProvider = options?.provider;\n while (currentProvider && currentProvider.provide) {\n tokenArr.push(currentProvider.provide);\n currentProvider = currentProvider.parent;\n }\n const tokenListText = tokenArr.join(' <-- ');\n\n this.message = `CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \\n ${tokenListText}`;\n }\n}\n","export class InjectFailedError extends Error {\n public name = 'INJECT_FAILED_ERROR';\n public message = this.name;\n\n constructor(\n injectMeta: any,\n ClassName: any,\n key: string | number,\n paramType?: any\n ) {\n super();\n\n if (paramType) {\n // 是构造函数的参数装饰器\n if (injectMeta && injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n } else if (paramType === Object) {\n this.message = `CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n }\n } else {\n // 是属性装饰器\n if (!injectMeta) {\n this.message = `INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ${key} OF CLASS ${ClassName}.`;\n } else if (injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ${key} OF CLASS ${ClassName}.`;\n }\n }\n }\n}\n","export class ProviderNotValidError extends Error {\n public name = 'PROVIDER_NOT_VALID_ERROR';\n public message = this.name;\n\n constructor(provider: any) {\n super();\n\n this.message = `PROVIDER NOT VALID. ${provider}`;\n }\n}\n","export class TokenNotFoundError extends Error {\n public name = 'TOKEN_NOT_FOUND_ERROR';\n public message = this.name;\n\n constructor(token: any) {\n super();\n\n this.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. ${token}`;\n }\n}\n","// eslint-disable-next-line @typescript-eslint/ban-types\nexport interface InjectionKey<T> extends Symbol {}\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nimport { SERVICE_STATUS, DECORATOR_KEYS } from './constants';\nimport { merge, has, isInjectableToken } from './utils';\nimport { resolveForwardRef } from './forwardRef';\n\nimport {\n CircularDependencyError,\n TokenNotFoundError,\n InjectFailedError,\n ProviderNotValidError,\n} from './errors';\n\nconst NOOP = (n: any) => n;\n\n// 第一步:准备构造函数的依赖对象\n// 第二步:通过构造函数来获取服务的实例对象\n// 第三步:补充@Inject注入的实例属性\n// 第四步:执行constructed方法\n\nexport class Injector {\n public parent?: Injector;\n\n public providerMap = new Map<any, any>(); // <token, provider>\n\n public beforeCacheHook?: any;\n\n public mergePropertyHook?: any;\n\n constructor(providers: any[] = [], parent?: Injector, options: any = {}) {\n // 引用父级Injector\n this.parent = parent;\n\n // 在把服务实例放到缓存中之前,可以调用这个钩子让服务响应化\n this.beforeCacheHook = options.beforeCacheHook || NOOP;\n\n // 在注入实例属性时,需要把属性merge到服务实例对象上,合并过程需要保持响应式\n this.mergePropertyHook = options.mergePropertyHook || merge;\n\n this.addProviders(providers);\n }\n\n /**\n * 如果没有parent则是root injector\n */\n isRootInjector() {\n return !this.parent;\n }\n\n /**\n * 如果没有指定当前token是可选的,则抛出异常\n * @param token\n * @param options\n */\n checkTokenNotFoundError(token: any, options: any) {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n\n /**\n * 对外暴露的接口 - 获取服务对象\n *\n * @param {*} token\n * @param {*} options\n * @return {*} {*}\n * @memberof Injector\n */\n get<T>(token: InjectionKey<T>, options?: any): T;\n get<R, T = unknown>(token: T, options?: any): T extends R ? Ret<T> : Ret<R>;\n get(token: any, options: any = {}): any {\n if (options.skip) {\n // 优先判断skip,是因为可以实现三种不同的组合\n // 1. 只有skip\n // 1. 只有self\n // 1. 同时有skip和self\n if (this.parent) {\n // 最多只能跳过一次,虽然也可以将skip设为number类型,从而可以控制跳过的次数,但是没有必要\n return this.parent.get(token, { ...options, skip: false });\n } else {\n this.checkTokenNotFoundError(token, options);\n }\n } else if (options.self) {\n if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n return this.getServiceByProvider(provider, options);\n } else if (this.isRootInjector() && isInjectableToken(token)) {\n // 这里的场景是 useRootService(Token, {self: true})\n // 应该不会有人这样写代码,这里只是为了代码逻辑的完整性\n // 正常业务代码只需要写 useRootService(Token) 即可\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n this.checkTokenNotFoundError(token, options);\n }\n } else if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n return this.getServiceByProvider(provider, options);\n } else if (this.parent) {\n return this.parent.get(token, options);\n } else if (isInjectableToken(token)) {\n // 这里代表是root injector\n // 这里的意思代表所有Injectable Class都可以自动在root injector中实例化\n // 不再需要手动调用declareRootProviders这个方法\n // 当然declareRootProviders这个方法有其他使用场景,比如不是以Class作为token\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n this.checkTokenNotFoundError(token, options);\n }\n }\n\n /**\n * 如果token对应的provider不存在\n * 那么就创建一个\n * 目前来看这个方法只是针对root injector使用,属于兜底策略\n * 调用该方法之前需要保证token对应的provider已经存在或者token本身是一个可注入的类\n *\n * @param {*} token\n * @return {*}\n * @memberof Injector\n */\n getProviderByToken(token: any) {\n if (!this.providerMap.has(token)) {\n this.addProvider(token);\n }\n return this.providerMap.get(token);\n }\n\n /**\n * 通过provider直接获取service实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceByProvider(provider: any, options: any) {\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n\n if ('useCacheValue' in provider) {\n return provider.useCacheValue;\n } else if ('useValue' in provider) {\n return this.getServiceUseValueWithProvider(provider);\n } else if (provider.useClass) {\n return this.getServiceUseClassWithProvider(provider, options);\n } else if (provider.useExisting) {\n return this.getServiceUseExistingWithProvider(provider, options);\n } else if (provider.useFactory) {\n return this.getServiceUseFactoryWithProvider(provider, options);\n } else {\n throw new ProviderNotValidError(provider);\n }\n }\n\n /**\n * 通过useValue获取服务实例\n *\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getServiceUseValueWithProvider(provider: any) {\n const cacheValue = this.beforeCacheHook(provider.useValue);\n provider.useCacheValue = cacheValue;\n return cacheValue;\n }\n\n /**\n * 通过useClass获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseClassWithProvider(provider: any, options: any) {\n provider.status = SERVICE_STATUS.INITING;\n provider.parent = options.provider;\n\n const ClassName = provider.useClass;\n const params = this.getContructorParameters(ClassName, provider);\n const cacheValue = this.beforeCacheHook(new ClassName(...params));\n\n // 实例化成功,此时不会再有死循环问题\n provider.useCacheValue = cacheValue;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n const properties = this.getInjectProperties(ClassName, provider);\n this.mergePropertyHook(cacheValue, properties);\n\n provider.parent = void 0;\n provider.status = SERVICE_STATUS.MERGED;\n\n return cacheValue;\n }\n\n /**\n * 通过useExisting获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseExistingWithProvider(provider: any, options: any) {\n provider.status = SERVICE_STATUS.INITING;\n provider.parent = options.provider;\n\n const cacheValue = this.get(provider.useExisting, { ...options, provider });\n provider.useCacheValue = cacheValue;\n\n provider.parent = void 0;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n return cacheValue;\n }\n\n /**\n * 通过useFactory获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseFactoryWithProvider(provider: any, options: any) {\n provider.status = SERVICE_STATUS.INITING;\n provider.parent = options.provider;\n\n const deps = provider.deps || [];\n const args = deps.map((dep: any) => this.get(dep, { provider }));\n const serviceValue = provider.useFactory(...args);\n const cacheValue = this.beforeCacheHook(serviceValue);\n provider.useCacheValue = cacheValue;\n\n provider.parent = void 0;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n return cacheValue;\n }\n\n /**\n * 获取构造函数的参数-返回数组\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getContructorParameters(ClassName: any, provider: any) {\n const params = this.getContructorParametersMetas(ClassName);\n const result = params.map((meta: any) =>\n this.get(meta.provide, { ...meta.value, provider })\n );\n return result;\n }\n\n /**\n * 获取构造函数的参数的装饰器元数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParametersMetas(ClassName: any) {\n // 构造函数的参数的类型数据-原始数据-是一个数组\n const params =\n Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, ClassName) || [];\n // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) ||\n {};\n return params.map((paramType: any, index: any) => {\n // 查找当前index对应的参数有没有使用装饰器\n const propertyMetadatas: any[] = propertiesMetadatas[index] || [];\n // 查找装饰器列表中有没有@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n meta => meta.key === DECORATOR_KEYS.INJECT\n );\n if (\n (injectMeta && injectMeta.value === Object) ||\n (!injectMeta && paramType === Object)\n ) {\n // 构造函数的参数可以不使用@Inject,但是一定不能是interface\n throw new InjectFailedError(injectMeta, ClassName, index, paramType);\n }\n // 把装饰器列表收集为对象,并且排除掉@Inject\n const options = propertyMetadatas.reduce((acc, meta) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n return {\n key: index,\n provide: resolveForwardRef(injectMeta && injectMeta.value) || paramType,\n value: options,\n };\n });\n }\n\n /**\n * 获取注入的实例属性-返回对象\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getInjectProperties(ClassName: any, provider: any) {\n const metas = this.getInjectPropertiesMetas(ClassName);\n\n const properties = {} as any;\n\n metas.forEach((meta: any) => {\n const property = this.get(meta.provide, { ...meta.value, provider });\n if (!(property === void 0 && meta.value?.optional)) {\n properties[meta.key] = property;\n }\n });\n\n return properties;\n }\n\n /**\n * 获取注入属性的装饰器数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectPropertiesMetas(ClassName: any) {\n // 获取注入属性的metas-类型是Recors<string, Array>\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PROPS, ClassName) ||\n {};\n const propertiesMetas: any = [];\n for (const key in propertiesMetadatas) {\n if (has(propertiesMetadatas, key)) {\n // 当前key属性对应的所有的装饰器\n const propertyMetadatas = propertiesMetadatas[key];\n // 当前key属性对应的@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n (meta: any) => meta.key === DECORATOR_KEYS.INJECT\n );\n if (!injectMeta || injectMeta.value === Object) {\n // 属性一定要手动指定@Inject\n throw new InjectFailedError(injectMeta, ClassName, key);\n }\n const options = propertyMetadatas.reduce((acc: any, meta: any) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n\n propertiesMetas.push({\n key,\n provide: resolveForwardRef(injectMeta.value),\n value: options,\n });\n }\n }\n return propertiesMetas;\n }\n\n /**\n * 把providers数组转换成map,避免后续的遍历\n *\n * @param {any[]} providers\n * @memberof Injector\n */\n addProviders(providers: any[]) {\n providers.forEach(provider => {\n this.addProvider(provider);\n });\n }\n\n /**\n * 添加新的provider\n *\n * @param {*} provider\n * @memberof Injector\n */\n addProvider(provider: any) {\n if (provider.provide) {\n this.providerMap.set(provider.provide, provider);\n } else {\n this.providerMap.set(provider, {\n provide: provider,\n useClass: provider,\n });\n }\n }\n\n /**\n * 释放当前Injector中的所有服务实例\n *\n * @memberof Injector\n */\n dispose() {\n this.providerMap.forEach(value => {\n if (value && value.useCacheValue && value.useCacheValue.dispose) {\n try {\n value.useCacheValue.dispose();\n } catch (error) {\n console.error(error);\n }\n }\n });\n this.providerMap = null as any;\n this.parent = null as any;\n }\n}\n"],"names":["DECORATOR_KEYS","DESIGN_PROPERTY_TYPE","DESIGN_PARAM_TYPES","SERVICE_INJECTED_PARAMS","SERVICE_INJECTED_PROPS","INJECT","Symbol","INJECTABLE","SELF","SKIP_SELF","OPTIONAL","SERVICE_STATUS","INITING","CONSTRUCTED","MERGED","createDecorator","decoratorKey","defaultValue","decoratorValue","target","targetKey","index","isParameterDecorator","Ctor","constructor","key","metadataKey","paramsOrPropertiesMetadata","Reflect","getMetadata","paramOrPropertyMetadata","metadata","value","push","defineMetadata","Inject","Self","Skip","Optional","Injectable","has","obj","Object","prototype","hasOwnProperty","call","merge","source","isInjectableToken","token","forwardRef","fn","__forward_ref__","isForwardRef","resolveForwardRef","type","CircularDependencyError","_Error","_inherits","_super","_createSuper","provider","options","_this","_classCallCheck","_defineProperty","_assertThisInitialized","name","tokenArr","provide","currentProvider","parent","tokenListText","join","message","concat","_createClass","_wrapNativeSuper","Error","InjectFailedError","_Error2","_super2","injectMeta","ClassName","paramType","_this2","ProviderNotValidError","_Error3","_super3","_this3","TokenNotFoundError","_Error4","_super4","_this4","NOOP","n","Injector","providers","arguments","length","undefined","Map","beforeCacheHook","mergePropertyHook","addProviders","isRootInjector","checkTokenNotFoundError","optional","get","skip","_objectSpread","self","providerMap","getServiceByProvider","getProviderByToken","addProvider","status","useCacheValue","getServiceUseValueWithProvider","useClass","getServiceUseClassWithProvider","useExisting","getServiceUseExistingWithProvider","useFactory","getServiceUseFactoryWithProvider","cacheValue","useValue","params","getContructorParameters","_construct","_toConsumableArray","properties","getInjectProperties","_this5","deps","args","map","dep","serviceValue","apply","_this6","getContructorParametersMetas","result","meta","propertiesMetadatas","propertyMetadatas","find","reduce","acc","_this7","metas","getInjectPropertiesMetas","forEach","_meta$value","property","propertiesMetas","_this8","set","dispose","error","console"],"mappings":"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"}
1
+ {"version":3,"file":"index.iife.js","sources":["../src/constants.ts","../src/errors/CircularDependencyError.ts","../src/errors/InjectFailedError.ts","../src/errors/ProviderNotValidError.ts","../src/errors/TokenNotFoundError.ts","../src/errors/ConstructorInjectMissTokenError.ts","../src/errors/PropertyInjectMissTokenError.ts","../src/decorator.ts","../src/utils.ts","../src/forwardRef.ts","../src/Injector.ts"],"sourcesContent":["export const DECORATOR_KEYS = {\n // ts自带的类的实例属性的类型的key\n DESIGN_PROPERTY_TYPE: 'design:type',\n // ts自带的类的构造函数的参数的类型信息的key\n DESIGN_PARAM_TYPES: 'design:paramtypes',\n // 记录构造函数参数装饰器对应的数据的key\n SERVICE_INJECTED_PARAMS: 'service:injected:params',\n // 记录实例属性装饰器对应的数据的key\n SERVICE_INJECTED_PROPS: 'service:injected:props',\n // Inject装饰器的key\n INJECT: Symbol('inject'),\n // Injectable装饰器的key\n INJECTABLE: Symbol('injectable'),\n // Self装饰器的key\n SELF: 'self',\n // Skip装饰器的key\n SKIP_SELF: 'skip',\n // Optional装饰器的key\n OPTIONAL: 'optional',\n};\n\nexport const SERVICE_STATUS = {\n INITING: Symbol('initing'),\n CONSTRUCTED: Symbol('constructed'),\n MERGED: Symbol('merged'),\n};\n","export class CircularDependencyError extends Error {\n public name = 'CIRCULAR_DEPENDENCY_ERROR';\n\n public message = this.name;\n\n constructor(provider: any, options: any) {\n super();\n\n const tokenArr = [provider.provide];\n let currentProvider = options?.provider;\n while (currentProvider && currentProvider.provide) {\n tokenArr.push(currentProvider.provide);\n currentProvider = currentProvider.parent;\n }\n const tokenListText = tokenArr.join(' <-- ');\n\n this.message = `CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \\n ${tokenListText}`;\n }\n}\n","export class InjectFailedError extends Error {\n public name = 'INJECT_FAILED_ERROR';\n public message = this.name;\n\n constructor(\n injectMeta: any,\n ClassName: any,\n key: string | number,\n paramType?: any\n ) {\n super();\n\n if (paramType) {\n // 是构造函数的参数装饰器\n if (injectMeta && injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n } else if (paramType === Object) {\n this.message = `CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n }\n } else {\n // 是属性装饰器\n if (!injectMeta) {\n this.message = `INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ${key} OF CLASS ${ClassName}.`;\n } else if (injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ${key} OF CLASS ${ClassName}.`;\n }\n }\n }\n}\n","export class ProviderNotValidError extends Error {\n public name = 'PROVIDER_NOT_VALID_ERROR';\n public message = this.name;\n\n constructor(provider: any) {\n super();\n\n this.message = `PROVIDER NOT VALID. ${provider}`;\n }\n}\n","export class TokenNotFoundError extends Error {\n public name = 'TOKEN_NOT_FOUND_ERROR';\n public message = this.name;\n\n constructor(token: any) {\n super();\n\n this.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. ${token}`;\n }\n}\n","export class ConstructorInjectMissTokenError extends Error {\n public name = 'CONSTRUCTOR_INJECT_MISS_TOKEN_ERROR';\n public message = this.name;\n\n constructor(target: any) {\n super();\n\n this.message = `For the constructor of class ${target}, every parameter must specify a @Inject.`;\n }\n}\n","export class PropertyInjectMissTokenError extends Error {\n public name = 'PROPERTY_INJECT_MISS_TOKEN_ERROR';\n public message = this.name;\n\n constructor(target: any, targetKey: string) {\n super();\n\n this.message = `For the property ${targetKey} of class ${target}, @Inject must specify a token.`;\n }\n}\n","/**\n * 这里记录不同的装饰器的参数的含义\n *\n * class decorator:\n * 只有一个参数:构造函数\n * property decorator:\n * 静态属性:构造函数, 属性名\n * 实例属性:原型, 属性名\n * parameter decorator:\n * 构造函数参数:构造函数, undefined, 0\n * 普通函数参数:原型, 方法名, 0\n * 静态函数参数:构造函数, 方法名, 0\n * method decorator:\n * 静态方法:构造函数, 方法名, 属性描述符\n * 实例方法:原型, 方法名, 属性描述符\n * accessor decorator:\n * 静态访问器:构造函数, 方法名, 属性描述符\n * 实例访问器:原型, 方法名, 属性描述符\n */\n\nimport { DECORATOR_KEYS } from './constants';\nimport { PropertyInjectMissTokenError } from './errors';\n\n/**\n * 创建装饰器的高阶函数\n * 装饰器的通用逻辑就是通过Reflect记录到全局的Map中\n * 所以可以抽象出一个通用逻辑,这里需要注意对Inject装饰器有特殊判断\n *\n * @param {(string | symbol)} decoratorKey 代表某个装饰器的名称\n * @param {*} [defaultValue] 该装饰器函数的默认参数\n * @return {*} 一个装饰器\n */\nexport function createDecorator(\n decoratorKey: string | symbol,\n defaultValue?: any\n) {\n // 因为装饰器本身作为一个函数是有参数的,此处的decoratorValue就是实际使用装饰器的实参\n return function (decoratorValue?: any): any {\n // 目前的装饰器只支持类的构造函数参数装饰器和类的实例属性装饰器\n // target可能是构造函数或者类的原型\n // 如果target是构造函数,targetKey是undefined,index是参数的位置下标\n // 如果target是原型,targetKey是属姓名,index是undefined\n return function (target: any, targetKey: string, index?: number): void {\n // 如果index是number,那么代表是构造函数的参数的装饰器\n const isParameterDecorator = typeof index === 'number';\n // 统一把装饰器数据绑定到构造函数上,后续获取数据比较方便\n const Ctor = isParameterDecorator ? target : target.constructor;\n // 如果是构造函数的参数装饰器,取参数位置下标,否则取实例属性的属性名\n const key = isParameterDecorator ? index : targetKey;\n\n // 区分构造函数的参数装饰器和实例属性的装饰器\n // 分别记录到全局Map的不同位置,metadataKey不一样\n const metadataKey = isParameterDecorator\n ? DECORATOR_KEYS.SERVICE_INJECTED_PARAMS\n : DECORATOR_KEYS.SERVICE_INJECTED_PROPS;\n\n // 这里是一个大对象,对应的key是metadataKey\n // 所以全局Map中有两个不同的metadataKey,以及对应的数据对象\n // 如果是构造函数参数装饰器,这个对象中的key是参数位置下标\n // 如果是实例属性装饰器,这个对象中的key是属性名\n const paramsOrPropertiesMetadata =\n Reflect.getMetadata(metadataKey, Ctor) || {};\n\n // 每个参数或者实例属性都可以有多个装饰器\n // 所以paramsOrPropertiesMetadata这个大对象的每个key对应的value都是一个数组\n // 该数组中的每一个元素是一个对象,保存着每一个装饰器的数据\n const paramOrPropertyMetadata = paramsOrPropertiesMetadata[key] || [];\n\n const metadata = {\n // 装饰器的名称\n key: decoratorKey,\n // 装饰器的值,即装饰器函数的实参\n // 很多装饰器具有默认值,可以不提供实参,而是使用默认值\n value: decoratorValue === void 0 ? defaultValue : decoratorValue,\n };\n\n // 当项目使用esbuild不支持emitDecoratorMetadata时\n // 这里检查了@Inject装饰器在实例属性中需要指定参数\n // 如果是构造函数理论上也需要使用@inject装饰器,并且需要指定参数\n // 只不过没有在这里做判断,而是在getContructorParametersMetas中判断的\n if (!isParameterDecorator) {\n // 实例属性装饰器\n if (decoratorKey === DECORATOR_KEYS.INJECT) {\n // 是@Inject装饰器\n if (decoratorValue === void 0) {\n // 装饰器没有指定参数\n // 所以需要通过Reflect获取默认的类型数据\n const metadataValue = Reflect.getMetadata(\n DECORATOR_KEYS.DESIGN_PROPERTY_TYPE,\n target,\n targetKey\n );\n\n if (__DEV__) {\n if (metadataValue === void 0) {\n throw new PropertyInjectMissTokenError(target, targetKey);\n }\n }\n\n metadata.value = metadataValue;\n }\n }\n }\n\n // 把当前装饰器的数据对象放到数组中\n paramOrPropertyMetadata.push(metadata);\n // 关联这个数组和对应的key\n paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;\n // 再把整个大对象放到全局Map中\n Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, Ctor);\n };\n };\n}\n\n// 可以使用在类构造函数的参数中和类的实例属性中\nexport const Inject = createDecorator(DECORATOR_KEYS.INJECT);\n\n// 指定只在当前injector中寻找服务\nexport const Self = createDecorator(DECORATOR_KEYS.SELF, true);\n\n// 指定跳过当前injector寻找服务\nexport const Skip = createDecorator(DECORATOR_KEYS.SKIP_SELF, true);\n\n// 指定服务是可选的,找不到服务时返回undefined,否则抛出异常\n// 其实应该说是默认情况下找不到服务时,会抛出异常,除非明确指定是optional的\nexport const Optional = createDecorator(DECORATOR_KEYS.OPTIONAL, true);\n\n/**\n * 表明服务可注入\n * 主要工作就是收集构造函数的参数类型信息\n *\n * @export\n * @return {*}\n */\nexport function Injectable() {\n return function (target: any) {\n // 标记这个类可以注入\n Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target);\n\n return target;\n };\n}\n","import { DECORATOR_KEYS } from './constants';\n\nexport function has(obj: any, key: string) {\n return obj && Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function merge(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = source[key];\n }\n }\n return target;\n}\n\nexport function isInjectableToken(token: any) {\n return (\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n );\n}\n","import { has } from './utils';\n\nexport interface ForwardRefFn {\n (): any;\n}\n\nexport function forwardRef(fn: ForwardRefFn) {\n (<any>fn).__forward_ref__ = forwardRef;\n return fn;\n}\n\nexport function isForwardRef(fn: any): fn is () => any {\n return (\n typeof fn === 'function' &&\n has(fn, '__forward_ref__') &&\n fn.__forward_ref__ === forwardRef\n );\n}\n\nexport function resolveForwardRef<T>(type: T): T {\n return isForwardRef(type) ? type() : type;\n}\n","// eslint-disable-next-line @typescript-eslint/ban-types\nexport interface InjectionKey<T> extends Symbol {}\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nimport { SERVICE_STATUS, DECORATOR_KEYS } from './constants';\nimport { merge, has, isInjectableToken } from './utils';\nimport { resolveForwardRef } from './forwardRef';\n\nimport {\n CircularDependencyError,\n TokenNotFoundError,\n InjectFailedError,\n ProviderNotValidError,\n ConstructorInjectMissTokenError,\n} from './errors';\n\nconst NOOP = (n: any) => n;\n\n// 第一步:准备构造函数的依赖对象\n// 第二步:通过构造函数来获取服务的实例对象\n// 第三步:补充@Inject注入的实例属性\n// 第四步:执行constructed方法\n\nexport class Injector {\n public parent?: Injector;\n\n public providerMap = new Map<any, any>(); // <token, provider>\n\n public beforeCacheHook?: any;\n\n public mergePropertyHook?: any;\n\n constructor(providers: any[] = [], parent?: Injector, options: any = {}) {\n // 引用父级Injector\n this.parent = parent;\n\n // 在把服务实例放到缓存中之前,可以调用这个钩子让服务响应化\n this.beforeCacheHook = options.beforeCacheHook || NOOP;\n\n // 在注入实例属性时,需要把属性merge到服务实例对象上,合并过程需要保持响应式\n this.mergePropertyHook = options.mergePropertyHook || merge;\n\n this.addProviders(providers);\n }\n\n /**\n * 如果没有parent则是root injector\n */\n isRootInjector() {\n return !this.parent;\n }\n\n /**\n * 如果没有指定当前token是可选的,则抛出异常\n * @param token\n * @param options\n */\n checkTokenNotFoundError(token: any, options: any) {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n\n /**\n * 对外暴露的接口 - 获取服务对象\n *\n * @param {*} token\n * @param {*} options\n * @return {*} {*}\n * @memberof Injector\n */\n get<T>(token: InjectionKey<T>, options?: any): T;\n get<R, T = unknown>(token: T, options?: any): T extends R ? Ret<T> : Ret<R>;\n get(token: any, options: any = {}): any {\n if (options.skip) {\n // 优先判断skip,是因为可以实现三种不同的组合\n // 1. 只有skip\n // 1. 只有self\n // 1. 同时有skip和self\n if (this.parent) {\n // 最多只能跳过一次,虽然也可以将skip设为number类型,从而可以控制跳过的次数,但是没有必要\n return this.parent.get(token, { ...options, skip: false });\n } else {\n this.checkTokenNotFoundError(token, options);\n }\n } else if (options.self) {\n if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n return this.getServiceByProvider(provider, options);\n } else if (this.isRootInjector() && isInjectableToken(token)) {\n // 这里的场景是 useRootService(Token, {self: true})\n // 应该不会有人这样写代码,这里只是为了代码逻辑的完整性\n // 正常业务代码只需要写 useRootService(Token) 即可\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n this.checkTokenNotFoundError(token, options);\n }\n } else if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n return this.getServiceByProvider(provider, options);\n } else if (this.parent) {\n return this.parent.get(token, options);\n } else if (isInjectableToken(token)) {\n // 这里代表是root injector\n // 这里的意思代表所有Injectable Class都可以自动在root injector中实例化\n // 不再需要手动调用declareRootProviders这个方法\n // 当然declareRootProviders这个方法有其他使用场景,比如不是以Class作为token\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n this.checkTokenNotFoundError(token, options);\n }\n }\n\n /**\n * 如果token对应的provider不存在\n * 那么就创建一个\n * 目前来看这个方法只是针对root injector使用,属于兜底策略\n * 调用该方法之前需要保证token对应的provider已经存在或者token本身是一个可注入的类\n *\n * @param {*} token\n * @return {*}\n * @memberof Injector\n */\n getProviderByToken(token: any) {\n if (!this.providerMap.has(token)) {\n this.addProvider(token);\n }\n return this.providerMap.get(token);\n }\n\n /**\n * 通过provider直接获取service实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceByProvider(provider: any, options: any) {\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n\n if ('useCacheValue' in provider) {\n return provider.useCacheValue;\n } else if ('useValue' in provider) {\n return this.getServiceUseValueWithProvider(provider);\n } else if (provider.useClass) {\n return this.getServiceUseClassWithProvider(provider, options);\n } else if (provider.useExisting) {\n return this.getServiceUseExistingWithProvider(provider, options);\n } else if (provider.useFactory) {\n return this.getServiceUseFactoryWithProvider(provider, options);\n } else {\n throw new ProviderNotValidError(provider);\n }\n }\n\n /**\n * 通过useValue获取服务实例\n *\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getServiceUseValueWithProvider(provider: any) {\n const cacheValue = this.beforeCacheHook(provider.useValue);\n provider.useCacheValue = cacheValue;\n return cacheValue;\n }\n\n /**\n * 通过useClass获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseClassWithProvider(provider: any, options: any) {\n provider.status = SERVICE_STATUS.INITING;\n provider.parent = options.provider;\n\n const ClassName = provider.useClass;\n const params = this.getContructorParameters(ClassName, provider);\n const cacheValue = this.beforeCacheHook(new ClassName(...params));\n\n // 实例化成功,此时不会再有死循环问题\n provider.useCacheValue = cacheValue;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n const properties = this.getInjectProperties(ClassName, provider);\n this.mergePropertyHook(cacheValue, properties);\n\n provider.parent = void 0;\n provider.status = SERVICE_STATUS.MERGED;\n\n return cacheValue;\n }\n\n /**\n * 通过useExisting获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseExistingWithProvider(provider: any, options: any) {\n provider.status = SERVICE_STATUS.INITING;\n provider.parent = options.provider;\n\n const cacheValue = this.get(provider.useExisting, { ...options, provider });\n provider.useCacheValue = cacheValue;\n\n provider.parent = void 0;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n return cacheValue;\n }\n\n /**\n * 通过useFactory获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseFactoryWithProvider(provider: any, options: any) {\n provider.status = SERVICE_STATUS.INITING;\n provider.parent = options.provider;\n\n const deps = provider.deps || [];\n const args = deps.map((dep: any) => this.get(dep, { provider }));\n const serviceValue = provider.useFactory(...args);\n const cacheValue = this.beforeCacheHook(serviceValue);\n provider.useCacheValue = cacheValue;\n\n provider.parent = void 0;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n return cacheValue;\n }\n\n /**\n * 获取构造函数的参数-返回数组\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getContructorParameters(ClassName: any, provider: any) {\n const params = this.getContructorParametersMetas(ClassName);\n const result = params.map((meta: any) =>\n this.get(meta.provide, { ...meta.value, provider })\n );\n return result;\n }\n\n /**\n * 获取构造函数的参数的装饰器元数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParametersMetas(ClassName: any) {\n // 构造函数的参数的类型数据-原始数据-是一个数组\n const params = Reflect.getMetadata(\n DECORATOR_KEYS.DESIGN_PARAM_TYPES,\n ClassName\n );\n // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) ||\n {};\n\n // 获取当前构造函数的形参个数\n const classParamsLength = ClassName.length;\n\n if (__DEV__) {\n if (!params) {\n // params不存在说明当前环境不支持emitDecoratorMetadata\n const propertiesMetadatasLength = Object.keys(propertiesMetadatas);\n if (propertiesMetadatasLength < classParamsLength) {\n throw new ConstructorInjectMissTokenError(ClassName);\n }\n }\n }\n\n // 如果params不存在需要创建符合形参数量的数组\n const newParams = params || [...Array(classParamsLength)];\n\n return newParams.map((paramType: any, index: any) => {\n // 查找当前index对应的参数有没有使用装饰器\n const propertyMetadatas: any[] = propertiesMetadatas[index] || [];\n // 查找装饰器列表中有没有@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n meta => meta.key === DECORATOR_KEYS.INJECT\n );\n if (\n (injectMeta && injectMeta.value === Object) ||\n (!injectMeta && paramType === Object)\n ) {\n // 构造函数的参数可以不使用@Inject,但是一定不能是interface\n throw new InjectFailedError(injectMeta, ClassName, index, paramType);\n }\n // 把装饰器列表收集为对象,并且排除掉@Inject\n const options = propertyMetadatas.reduce((acc, meta) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n return {\n key: index,\n provide: resolveForwardRef(injectMeta && injectMeta.value) || paramType,\n value: options,\n };\n });\n }\n\n /**\n * 获取注入的实例属性-返回对象\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getInjectProperties(ClassName: any, provider: any) {\n const metas = this.getInjectPropertiesMetas(ClassName);\n\n const properties = {} as any;\n\n metas.forEach((meta: any) => {\n const property = this.get(meta.provide, { ...meta.value, provider });\n if (!(property === void 0 && meta.value?.optional)) {\n properties[meta.key] = property;\n }\n });\n\n return properties;\n }\n\n /**\n * 获取注入属性的装饰器数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectPropertiesMetas(ClassName: any) {\n // 获取注入属性的metas-类型是Recors<string, Array>\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PROPS, ClassName) ||\n {};\n const propertiesMetas: any = [];\n for (const key in propertiesMetadatas) {\n if (has(propertiesMetadatas, key)) {\n // 当前key属性对应的所有的装饰器\n const propertyMetadatas = propertiesMetadatas[key];\n // 当前key属性对应的@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n (meta: any) => meta.key === DECORATOR_KEYS.INJECT\n );\n if (!injectMeta || injectMeta.value === Object) {\n // 属性一定要手动指定@Inject\n throw new InjectFailedError(injectMeta, ClassName, key);\n }\n const options = propertyMetadatas.reduce((acc: any, meta: any) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n\n propertiesMetas.push({\n key,\n provide: resolveForwardRef(injectMeta.value),\n value: options,\n });\n }\n }\n return propertiesMetas;\n }\n\n /**\n * 把providers数组转换成map,避免后续的遍历\n *\n * @param {any[]} providers\n * @memberof Injector\n */\n addProviders(providers: any[]) {\n providers.forEach(provider => {\n this.addProvider(provider);\n });\n }\n\n /**\n * 添加新的provider\n *\n * @param {*} provider\n * @memberof Injector\n */\n addProvider(provider: any) {\n if (provider.provide) {\n this.providerMap.set(provider.provide, provider);\n } else {\n this.providerMap.set(provider, {\n provide: provider,\n useClass: provider,\n });\n }\n }\n\n /**\n * 释放当前Injector中的所有服务实例\n *\n * @memberof Injector\n */\n dispose() {\n this.providerMap.forEach(value => {\n if (value && value.useCacheValue && value.useCacheValue.dispose) {\n try {\n value.useCacheValue.dispose();\n } catch (error) {\n console.error(error);\n }\n }\n });\n this.providerMap = null as any;\n this.parent = null as any;\n }\n}\n"],"names":["DECORATOR_KEYS","DESIGN_PROPERTY_TYPE","DESIGN_PARAM_TYPES","SERVICE_INJECTED_PARAMS","SERVICE_INJECTED_PROPS","INJECT","Symbol","INJECTABLE","SELF","SKIP_SELF","OPTIONAL","SERVICE_STATUS","INITING","CONSTRUCTED","MERGED","CircularDependencyError","_Error","_inherits","_super","_createSuper","provider","options","_this","_classCallCheck","call","_defineProperty","_assertThisInitialized","name","tokenArr","provide","currentProvider","push","parent","tokenListText","join","message","concat","_createClass","_wrapNativeSuper","Error","InjectFailedError","_Error2","_super2","injectMeta","ClassName","key","paramType","_this2","value","Object","ProviderNotValidError","_Error3","_super3","_this3","TokenNotFoundError","_Error4","_super4","token","_this4","ConstructorInjectMissTokenError","_Error5","_super5","target","_this5","PropertyInjectMissTokenError","_Error6","_super6","targetKey","_this6","createDecorator","decoratorKey","defaultValue","decoratorValue","index","isParameterDecorator","Ctor","constructor","metadataKey","paramsOrPropertiesMetadata","Reflect","getMetadata","paramOrPropertyMetadata","metadata","metadataValue","defineMetadata","Inject","Self","Skip","Optional","Injectable","has","obj","prototype","hasOwnProperty","merge","source","isInjectableToken","forwardRef","fn","__forward_ref__","isForwardRef","resolveForwardRef","type","NOOP","n","Injector","providers","arguments","length","undefined","Map","beforeCacheHook","mergePropertyHook","addProviders","isRootInjector","checkTokenNotFoundError","optional","get","skip","_objectSpread","self","providerMap","getServiceByProvider","getProviderByToken","addProvider","status","useCacheValue","getServiceUseValueWithProvider","useClass","getServiceUseClassWithProvider","useExisting","getServiceUseExistingWithProvider","useFactory","getServiceUseFactoryWithProvider","cacheValue","useValue","params","getContructorParameters","_construct","_toConsumableArray","properties","getInjectProperties","_this7","deps","args","map","dep","serviceValue","apply","_this8","getContructorParametersMetas","result","meta","propertiesMetadatas","classParamsLength","propertiesMetadatasLength","keys","newParams","Array","propertyMetadatas","find","reduce","acc","_this9","metas","getInjectPropertiesMetas","forEach","_meta$value","property","propertiesMetas","_this10","set","dispose","error","console"],"mappings":"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"}