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