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