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