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