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