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