@kaokei/di 1.0.23 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [1.0.24](https://github.com/kaokei/di/compare/v1.0.23...v1.0.24) (2021-12-11)
6
+
5
7
  ### [1.0.23](https://github.com/kaokei/di/compare/v1.0.22...v1.0.23) (2021-12-10)
6
8
 
7
9
 
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  <h1 align="center">di</h1>
2
2
  <div align="center">
3
3
 
4
- [![Build Status](https://github.com/kaokei/di/actions/workflows/build.yml/badge.svg)](https://github.com/kaokei/di/actions/workflows/build.yml) [![Coverage Status](https://coveralls.io/repos/github/kaokei/di/badge.svg?branch=main)](https://coveralls.io/github/kaokei/di?branch=main)
4
+ [![Build Status](https://github.com/kaokei/di/actions/workflows/build.yml/badge.svg)](https://github.com/kaokei/di/actions/workflows/build.yml)
5
+ [![Coverage Status](https://coveralls.io/repos/github/kaokei/di/badge.svg?branch=main)](https://coveralls.io/github/kaokei/di?branch=main)
5
6
 
6
7
  </div>
7
8
 
@@ -13,37 +14,35 @@
13
14
 
14
15
  基于 typescript 实现依赖注入能力。类似的目前比较流行的 library 是`InversifyJS`。
15
16
 
16
- 其他类似的 library 可以[参考这里](https://github.com/topics/ioc?l=typescript)
17
+ 其他类似的 library 可以[参考这里](https://github.com/topics/ioc?l=typescript)和[参考这里](https://github.com/topics/dependency-injection?l=typescript)
18
+
19
+ ### playground
20
+
21
+ https://codesandbox.io/s/di-playground-zjnyv
17
22
 
18
23
  ### 已经支持的特性
19
24
 
20
25
  - 支持类,Symbol,字符串等作为服务的 token
21
26
  - 支持类,值,工厂函数等作为服务
22
- - Injector 作为 DI 容器,易于测试
23
27
  - 支持@Inject、@Skip、@Self、@Optional 以及 forwardRef 控制获取服务
28
+ - 支持@Optional 配置可选注入以及类属性的初始值作为默认值
29
+ - Injector 作为 DI 容器,易于测试
24
30
  - 同一个服务在同一个 Injector 中一定是单例的
25
31
  - 支持分层 DI 系统
26
- - 支持属性注入
32
+ - 支持属性注入和构造函数注入
27
33
  - 支持部分循环依赖,对于不支持的循环依赖会有相应的提示
28
34
  - 支持类型提示,以及 InjectionKey 的类型提示
29
- - 支持@Optional 以及初始值作为默认值
35
+ - 支持 dispose 生命周期钩子
30
36
 
31
37
  ### 不支持的特性
32
38
 
33
39
  - 不支持 multi-injection
34
40
  - 不支持不能自己 new 的注入,比如 react 类组件的实例化过程我们干预不了,因为 Injector 容器内部非常重要的一个工作就是 new 一个对象。
35
- - 对于类的继承没有过多的支持,[参考这里](https://docs.typestack.community/typedi/v/develop/02-basic-usage-guide/07-inheritance)
36
- - 没有 InversifyJS 中复杂的 binding 的 API,尽量采用`new Injector([providers])`,也就是一次性声明所有的`providers`
41
+ - 对于类的继承没有过多的支持,[参考这里](https://docs.typestack.community/typedi/v/develop/02-basic-usage-guide/07-inheritance)以及[参考这里](https://github.com/inversify/InversifyJS/blob/master/wiki/inheritance.md)
37
42
  - 暂时不实现 providers 中使用 forwardRef,主要是不了解使用场景,目前只支持在@Inject 中使用 forwardRef
38
43
  - 不支持异步实例化,即该实例对象的状态和数据依赖服务器端数据,需要异步获取,等待获取数据成功之后才实例化对象。对于这种场景建议在实例对象中维护类似 loading/ready/inited 这种字段来表明数据是否准备完毕。
39
44
  - 不支持 LazyInject
40
- - 原来是导出了 autobind,后续删除了该导出,有业务需要可以自己 npm install 即可
41
- - 不支持中间件,后续可以考虑完善中间件
42
- - 不支持自定义装饰器,比如@Prev、@Post 等装饰器,类似 autobind,应该独立维护
43
45
  - 不支持 onInit 生命周期钩子,虽然 Spring 中时支持的,但是实际场景中并不常用,[参考这里](https://github.com/angular/angular/issues/23235)
44
-
45
- ### todo
46
-
47
- 多次 Injectable 不需要报错
48
-
49
- https://github.com/topics/dependency-injection?l=typescript
46
+ - 不支持自定义装饰器,比如@Prev、@Post 等装饰器,类似 autobind,应该独立维护
47
+ - 原来确实导出了 autobind,后续删除了该导出,有业务需要可以自己 `npm install autobind-decorator` 即可
48
+ - 不支持中间件
package/dist/index.cjs.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @kaokei/di
3
3
  * Tiny di library depend on typescript and reflect-metadata
4
4
  *
5
- * @version 1.0.23
5
+ * @version 1.0.24
6
6
  * @author kaokei
7
7
  * @license MIT
8
8
  * @link https://github.com/kaokei/di
@@ -253,7 +253,7 @@ var CircularDependencyError = /*#__PURE__*/function (_Error) {
253
253
  }
254
254
 
255
255
  var tokenListText = tokenArr.join(' <-- ');
256
- _this.message = "CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. ".concat(tokenListText);
256
+ _this.message = "CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \n ".concat(tokenListText);
257
257
  return _this;
258
258
  }
259
259
 
@@ -453,7 +453,7 @@ var Injector = /*#__PURE__*/function () {
453
453
  }
454
454
  /**
455
455
  * 通过provider直接获取service实例
456
- * @done
456
+ *
457
457
  * @param {*} provider
458
458
  * @param {*} options
459
459
  * @return {*}
@@ -466,7 +466,7 @@ var Injector = /*#__PURE__*/function () {
466
466
  if ('useCacheValue' in provider) {
467
467
  return provider.useCacheValue;
468
468
  } else if ('useValue' in provider) {
469
- return this.getServiceUseValueWithProvider(provider, options);
469
+ return this.getServiceUseValueWithProvider(provider);
470
470
  } else if (provider.useClass) {
471
471
  return this.getServiceUseClassWithProvider(provider, options);
472
472
  } else if (provider.useExisting) {
@@ -487,16 +487,15 @@ var Injector = /*#__PURE__*/function () {
487
487
 
488
488
  }, {
489
489
  key: "getServiceUseValueWithProvider",
490
- value: function getServiceUseValueWithProvider(provider, options) {
490
+ value: function getServiceUseValueWithProvider(provider) {
491
491
  var cacheValue = this.beforeCacheHook(provider.useValue);
492
492
  provider.useCacheValue = cacheValue;
493
493
  return cacheValue;
494
494
  }
495
495
  /**
496
496
  * 通过useClass获取服务实例
497
- * @done
498
- * @template T
499
- * @param {new (...args: any[]) => T} ClassName
497
+ *
498
+ * @param {*} provider
500
499
  * @param {*} options
501
500
  * @return {*}
502
501
  * @memberof Injector
@@ -571,8 +570,9 @@ var Injector = /*#__PURE__*/function () {
571
570
  }
572
571
  /**
573
572
  * 获取构造函数的参数-返回数组
574
- * @done
573
+ *
575
574
  * @param {*} ClassName
575
+ * @param {*} provider
576
576
  * @return {*}
577
577
  * @memberof Injector
578
578
  */
@@ -592,7 +592,7 @@ var Injector = /*#__PURE__*/function () {
592
592
  }
593
593
  /**
594
594
  * 获取构造函数的参数的装饰器元数据
595
- * @done
595
+ *
596
596
  * @param {*} ClassName
597
597
  * @return {*}
598
598
  * @memberof Injector
@@ -634,8 +634,9 @@ var Injector = /*#__PURE__*/function () {
634
634
  }
635
635
  /**
636
636
  * 获取注入的实例属性-返回对象
637
- * @done
637
+ *
638
638
  * @param {*} ClassName
639
+ * @param {*} provider
639
640
  * @return {*}
640
641
  * @memberof Injector
641
642
  */
@@ -662,7 +663,7 @@ var Injector = /*#__PURE__*/function () {
662
663
  }
663
664
  /**
664
665
  * 获取注入属性的装饰器数据
665
- * @done
666
+ *
666
667
  * @param {*} ClassName
667
668
  * @return {*}
668
669
  * @memberof Injector
@@ -708,7 +709,7 @@ var Injector = /*#__PURE__*/function () {
708
709
  }
709
710
  /**
710
711
  * 把providers数组转换成map,避免后续的遍历
711
- * @done
712
+ *
712
713
  * @param {any[]} providers
713
714
  * @memberof Injector
714
715
  */
@@ -724,7 +725,7 @@ var Injector = /*#__PURE__*/function () {
724
725
  }
725
726
  /**
726
727
  * 添加新的provider
727
- * @done
728
+ *
728
729
  * @param {*} provider
729
730
  * @memberof Injector
730
731
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/constants.ts","../src/decorator.ts","../src/utils.ts","../src/forwardRef.ts","../src/errors/CircularDependencyError.ts","../src/errors/InjectFailedError.ts","../src/errors/ProviderNotValidError.ts","../src/errors/TokenNotFoundError.ts","../src/Injector.ts"],"sourcesContent":["export const DECORATOR_KEYS = {\n // ts自带的类的实例属性的类型的key\n DESIGN_PROPERTY_TYPE: 'design:type',\n // ts自带的类的构造函数的参数的类型信息的key\n DESIGN_PARAM_TYPES: 'design:paramtypes',\n // 记录构造函数原始的类型数据的key,其实就是转存了DESIGN_PARAM_TYPES对应的数据\n SERVICE_PARAM_TYPES: 'service:paramtypes',\n // 记录构造函数参数装饰器对应的数据的key\n SERVICE_INJECTED_PARAMS: 'service:injected:params',\n // 记录实例属性装饰器对应的数据的key\n SERVICE_INJECTED_PROPS: 'service:injected:props',\n // Inject装饰器的key\n INJECT: Symbol('inject'),\n // Injectable装饰器的key\n INJECTABLE: Symbol('injectable'),\n // Self装饰器的key\n SELF: 'self',\n // Skip装饰器的key\n SKIP_SELF: 'skip',\n // Optional装饰器的key\n OPTIONAL: 'optional',\n};\n\nexport const SERVICE_STATUS = {\n INITING: Symbol('initing'),\n CONSTRUCTED: Symbol('constructed'),\n MERGED: Symbol('merged'),\n};\n","/**\n * 这里记录不同的装饰器的参数的含义\n *\n * class decorator:\n * 只有一个参数:构造函数\n * property decorator:\n * 静态属性:构造函数, 属性名\n * 实例属性:原型, 属性名\n * parameter decorator:\n * 构造函数参数:构造函数, undefined, 0\n * 普通函数参数:原型, 方法名, 0\n * 静态函数参数:构造函数, 方法名, 0\n * method decorator:\n * 静态方法:构造函数, 方法名, 属性描述符\n * 实例方法:原型, 方法名, 属性描述符\n * accessor decorator:\n * 静态访问器:构造函数, 方法名, 属性描述符\n * 实例访问器:原型, 方法名, 属性描述符\n */\n\nimport { DECORATOR_KEYS } from './constants';\n\n/**\n * 创建装饰器的高阶函数\n * 装饰器的通用逻辑就是通过Reflect记录到全局的Map中\n * 所以可以抽象出一个通用逻辑,这里需要注意对Inject装饰器有特殊判断\n *\n * @param {(string | symbol)} decoratorKey 代表某个装饰器的名称\n * @param {*} [defaultValue] 该装饰器函数的默认参数\n * @return {*} 一个装饰器\n */\nexport function createDecorator(\n decoratorKey: string | symbol,\n defaultValue?: any\n) {\n // 因为装饰器本身作为一个函数是有参数的,此处的decoratorValue就是实际使用装饰器的实参\n return function (decoratorValue?: any) {\n // 目前的装饰器只支持类的构造函数参数装饰器和类的实例属性装饰器\n // target可能是构造函数或者类的原型\n // 如果target是构造函数,targetKey是undefined,index是参数的位置下标\n // 如果target是原型,targetKey是属姓名,index是undefined\n return function (target: any, targetKey: string, index?: number): void {\n // 如果index是number,那么代表是构造函数的参数的装饰器\n const isParameterDecorator = typeof index === 'number';\n // 统一把装饰器数据绑定到构造函数上,后续获取数据比较方便\n const Ctor = isParameterDecorator ? target : target.constructor;\n // 如果是构造函数的参数装饰器,取参数位置下标,否则取实例属性的属性名\n const key = isParameterDecorator ? index : targetKey;\n\n // 区分构造函数的参数装饰器和实例属性的装饰器\n // 分别记录到全局Map的不同位置,metadataKey不一样\n const metadataKey = isParameterDecorator\n ? DECORATOR_KEYS.SERVICE_INJECTED_PARAMS\n : DECORATOR_KEYS.SERVICE_INJECTED_PROPS;\n\n // 这里是一个大对象,对应的key是metadataKey\n // 所以全局Map中有两个不同的metadataKey,以及对应的数据对象\n // 如果是构造函数参数装饰器,这个对象中的key是参数位置下标\n // 如果是实例属性装饰器,这个对象中的key是属性名\n const paramsOrPropertiesMetadata =\n Reflect.getMetadata(metadataKey, Ctor) || {};\n\n // 每个参数或者实例属性都可以有多个装饰器\n // 所以paramsOrPropertiesMetadata这个大对象的每个key对应的value都是一个数组\n // 该数组中的每一个元素是一个对象,保存着每一个装饰器的数据\n const paramOrPropertyMetadata = paramsOrPropertiesMetadata[key] || [];\n\n const metadata = {\n // 装饰器的名称\n key: decoratorKey,\n // 装饰器的值,即装饰器函数的实参\n // 很多装饰器具有默认值,可以不提供实参,而是使用默认值\n value: decoratorValue === void 0 ? defaultValue : decoratorValue,\n };\n\n if (!isParameterDecorator) {\n if (decoratorKey === DECORATOR_KEYS.INJECT) {\n if (decoratorValue === void 0) {\n // 是实例属性装饰器,且是Inject装饰器,且没有指定参数\n // 需要获取默认的类型数据\n metadata.value = Reflect.getMetadata(\n DECORATOR_KEYS.DESIGN_PROPERTY_TYPE,\n target,\n targetKey\n );\n }\n }\n }\n\n // 把当前装饰器的数据对象放到数组中\n paramOrPropertyMetadata.push(metadata);\n // 关联这个数组和对应的key\n paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;\n // 再把整个大对象放到全局Map中\n Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, Ctor);\n };\n };\n}\n\n// 可以使用在类构造函数的参数中和类的实例属性中\nexport const Inject = createDecorator(DECORATOR_KEYS.INJECT);\n\n// 指定只在当前injector中寻找服务\nexport const Self = createDecorator(DECORATOR_KEYS.SELF, true);\n\n// 指定跳过当前injector寻找服务\nexport const Skip = createDecorator(DECORATOR_KEYS.SKIP_SELF, true);\n\n// 指定服务是可选的,找不到服务时返回undefined,否则抛出异常\n// 其实应该说是默认情况下找不到服务时,会抛出异常,除非明确指定是optional的\nexport const Optional = createDecorator(DECORATOR_KEYS.OPTIONAL, true);\n\n/**\n * 表明服务可注入\n * 主要工作就是收集构造函数的参数类型信息\n *\n * @export\n * @return {*}\n */\nexport function Injectable() {\n return function (target: any) {\n // 标记这个类可以注入\n Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target);\n\n // 获取ts编译器默认的类型数据\n // 经过测试,如果是基本类型string、number、boolean,那么会变成相对应的构造函数String,Number,Boolean\n // 如果只是指定了interface类型,那么会变成Object构造函数\n const types =\n Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, target) || [];\n\n // 存储构造函数的类型信息\n // 这里只是转存了一下数据,并没有特殊逻辑\n Reflect.defineMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, types, target);\n\n return target;\n };\n}\n","export function has(obj: any, key: string) {\n return obj && Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function merge(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = source[key];\n }\n }\n return target;\n}\n","import { has } from './utils';\n\nexport interface ForwardRefFn {\n (): any;\n}\n\nexport function forwardRef(fn: ForwardRefFn) {\n (<any>fn).__forward_ref__ = forwardRef;\n return fn;\n}\n\nexport function isForwardRef(fn: any): fn is () => any {\n return (\n typeof fn === 'function' &&\n has(fn, '__forward_ref__') &&\n fn.__forward_ref__ === forwardRef\n );\n}\n\nexport function resolveForwardRef<T>(type: T): T {\n return isForwardRef(type) ? type() : type;\n}\n","export class CircularDependencyError extends Error {\n public name = 'CIRCULAR_DEPENDENCY_ERROR';\n\n public message = this.name;\n\n constructor(provider: any, options: any) {\n super();\n\n const tokenArr = [provider.provide];\n let currentProvider = options?.provider;\n while (currentProvider && currentProvider.provide) {\n tokenArr.push(currentProvider.provide);\n currentProvider = currentProvider.parent;\n }\n const tokenListText = tokenArr.join(' <-- ');\n\n this.message = `CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. ${tokenListText}`;\n }\n}\n","export class InjectFailedError extends Error {\n public name = 'INJECT_FAILED_ERROR';\n public message = this.name;\n\n constructor(\n injectMeta: any,\n ClassName: any,\n key: string | number,\n paramType?: any\n ) {\n super();\n\n if (paramType) {\n // 是构造函数的参数装饰器\n if (injectMeta && injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n } else if (paramType === Object) {\n this.message = `CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n }\n } else {\n // 是属性装饰器\n if (!injectMeta) {\n this.message = `INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ${key} OF CLASS ${ClassName}.`;\n } else if (injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ${key} OF CLASS ${ClassName}.`;\n }\n }\n }\n}\n","export class ProviderNotValidError extends Error {\n public name = 'PROVIDER_NOT_VALID_ERROR';\n public message = this.name;\n\n constructor(provider: any) {\n super();\n\n this.message = `PROVIDER NOT VALID. ${provider}`;\n }\n}\n","export class TokenNotFoundError extends Error {\n public name = 'TOKEN_NOT_FOUND_ERROR';\n public message = this.name;\n\n constructor(token: any) {\n super();\n\n this.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. ${token}`;\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface InjectionKey<T> extends Symbol {}\n\ninterface Meta {\n key: any;\n value: any;\n}\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nimport { SERVICE_STATUS, DECORATOR_KEYS } from './constants';\nimport { merge, has } from './utils';\nimport { resolveForwardRef } from './forwardRef';\n\nimport {\n CircularDependencyError,\n TokenNotFoundError,\n InjectFailedError,\n ProviderNotValidError,\n} from './errors';\n\nconst NOOP = (n: any) => n;\n\n// 第一步:准备构造函数的依赖对象\n// 第二步:通过构造函数来获取服务的实例对象\n// 第三步:补充@Inject注入的实例属性\n// 第四步:执行constructed方法\n\nexport class Injector {\n public parent?: Injector;\n\n public providerMap = new Map<any, any>();\n\n public beforeCacheHook?: any;\n public mergePropertyHook?: any;\n\n constructor(providers: any[] = [], parent?: Injector, options: any = {}) {\n // 引用父级Injector\n this.parent = parent;\n\n // 在把服务实例放到缓存中之前,可以调用这个钩子让服务响应化\n this.beforeCacheHook = options.beforeCacheHook || NOOP;\n\n // 在注入实例属性时,需要把属性merge到服务实例对象上,合并过程需要保持响应式\n this.mergePropertyHook = options.mergePropertyHook || merge;\n\n this.addProviders(providers);\n }\n\n /**\n * 对外暴露的接口 - 获取服务对象\n * @done\n * @param {*} token\n * @param {*} options\n * @return {*} {*}\n * @memberof Injector\n */\n get<T>(token: InjectionKey<T>, options?: any): T;\n get<R, T = unknown>(token: T, options?: any): T extends R ? Ret<T> : Ret<R>;\n get(token: any, options: any = {}): any {\n if (options.skip) {\n if (this.parent) {\n return this.parent.get(token, { ...options, skip: false });\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (options.self) {\n if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (\n !this.parent &&\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n // 如果当前Injector已经是根Injector\n // 就必须要考虑self的限制\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (this.parent) {\n return this.parent.get(token, options);\n } else if (\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n }\n\n /**\n * 如果token对应的provider不存在\n * 那么就创建一个\n * 调用该方法之前需要保证token对应的provider已经存在或者token本身是一个可注入的类\n *\n * @param {*} token\n * @return {*}\n * @memberof Injector\n */\n getProviderByToken(token: any) {\n if (!this.providerMap.has(token)) {\n this.addProvider(token);\n }\n return this.providerMap.get(token);\n }\n\n /**\n * 通过provider直接获取service实例\n * @done\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceByProvider(provider: any, options: any) {\n if ('useCacheValue' in provider) {\n return provider.useCacheValue;\n } else if ('useValue' in provider) {\n return this.getServiceUseValueWithProvider(provider, options);\n } else if (provider.useClass) {\n return this.getServiceUseClassWithProvider(provider, options);\n } else if (provider.useExisting) {\n return this.getServiceUseExistingWithProvider(provider, options);\n } else if (provider.useFactory) {\n return this.getServiceUseFactoryWithProvider(provider, options);\n } else {\n throw new ProviderNotValidError(provider);\n }\n }\n\n /**\n * 通过useValue获取服务实例\n *\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getServiceUseValueWithProvider(provider: any, options: any) {\n const cacheValue = this.beforeCacheHook(provider.useValue);\n provider.useCacheValue = cacheValue;\n return cacheValue;\n }\n\n /**\n * 通过useClass获取服务实例\n * @done\n * @template T\n * @param {new (...args: any[]) => T} ClassName\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseClassWithProvider<T>(provider: any, options: any) {\n provider.parent = options.provider;\n\n provider.status = SERVICE_STATUS.INITING;\n const ClassName = provider.useClass;\n\n const params = this.getContructorParameters(ClassName, provider);\n const cacheValue = this.beforeCacheHook(new ClassName(...params));\n\n provider.useCacheValue = cacheValue;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n const properties = this.getInjectProperties(ClassName, provider);\n this.mergePropertyHook(cacheValue, properties);\n\n provider.status = SERVICE_STATUS.MERGED;\n\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useExisting获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseExistingWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const cacheValue = this.get(provider.useExisting, { ...options, provider });\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useFactory获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseFactoryWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const deps = provider.deps || [];\n const args = deps.map((dep: any) => this.get(dep, { provider }));\n const serviceValue = provider.useFactory(...args);\n const cacheValue = this.beforeCacheHook(serviceValue);\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 获取构造函数的参数-返回数组\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParameters(ClassName: any, provider: any) {\n const params = this.getContructorParametersMetas(ClassName);\n const result = params.map((meta: any) =>\n this.get(meta.key, { ...meta.value, provider })\n );\n return result;\n }\n\n /**\n * 获取构造函数的参数的装饰器元数据\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParametersMetas(ClassName: any) {\n // 构造函数的参数的类型数据-原始数据-是一个数组\n const params =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, ClassName) || [];\n // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) ||\n {};\n return params.map((paramType: any, index: any) => {\n // 查找当前index对应的参数有没有使用装饰器\n const propertyMetadatas: any[] = propertiesMetadatas[index] || [];\n // 查找装饰器列表中有没有@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n meta => meta.key === DECORATOR_KEYS.INJECT\n );\n if (\n (injectMeta && injectMeta.value === Object) ||\n (!injectMeta && paramType === Object)\n ) {\n // 构造函数的参数可以不使用@Inject,但是一定不能是interface\n throw new InjectFailedError(injectMeta, ClassName, index, paramType);\n }\n // 把装饰器列表收集为对象,并且排除掉@Inject\n const options = propertyMetadatas.reduce((acc, meta) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n return {\n key: resolveForwardRef(injectMeta && injectMeta.value) || paramType,\n value: options,\n };\n });\n }\n\n /**\n * 获取注入的实例属性-返回对象\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectProperties(ClassName: any, provider: any) {\n const metas = this.getInjectPropertiesMetas(ClassName);\n\n const properties = {} as any;\n\n metas.forEach((meta: any) => {\n const property = this.get(meta.provide, { ...meta.value, provider });\n if (!(property === void 0 && meta.value?.optional)) {\n properties[meta.key] = property;\n }\n });\n\n return properties;\n }\n\n /**\n * 获取注入属性的装饰器数据\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectPropertiesMetas(ClassName: any) {\n // 获取注入属性的metas-类型是Recors<string, Array>\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PROPS, ClassName) ||\n {};\n const propertiesMetas: any = [];\n for (const key in propertiesMetadatas) {\n if (has(propertiesMetadatas, key)) {\n // 当前key属性对应的所有的装饰器\n const propertyMetadatas = propertiesMetadatas[key] || [];\n // 当前key属性对应的@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n (meta: any) => meta.key === DECORATOR_KEYS.INJECT\n );\n if (!injectMeta || injectMeta.value === Object) {\n // 属性一定要手动指定@Inject\n throw new InjectFailedError(injectMeta, ClassName, key);\n }\n const options = propertyMetadatas.reduce((acc: any, meta: any) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n\n propertiesMetas.push({\n key,\n provide: resolveForwardRef(injectMeta.value),\n value: options,\n });\n }\n }\n return propertiesMetas;\n }\n\n /**\n * 把providers数组转换成map,避免后续的遍历\n * @done\n * @param {any[]} providers\n * @memberof Injector\n */\n addProviders(providers: any[]) {\n providers.forEach(provider => {\n this.addProvider(provider);\n });\n }\n\n /**\n * 添加新的provider\n * @done\n * @param {*} provider\n * @memberof Injector\n */\n addProvider(provider: any) {\n if (provider.provide) {\n this.providerMap.set(provider.provide, provider);\n } else {\n this.providerMap.set(provider, {\n provide: provider,\n useClass: provider,\n });\n }\n }\n\n /**\n * 释放当前Injector中的所有服务实例\n *\n * @memberof Injector\n */\n dispose() {\n this.providerMap.forEach(value => {\n if (value && value.useCacheValue && value.useCacheValue.dispose) {\n try {\n value.useCacheValue.dispose();\n } catch (error) {\n console.error(error);\n }\n }\n });\n this.providerMap = null as any;\n this.parent = null as any;\n }\n}\n"],"names":["DECORATOR_KEYS","DESIGN_PROPERTY_TYPE","DESIGN_PARAM_TYPES","SERVICE_PARAM_TYPES","SERVICE_INJECTED_PARAMS","SERVICE_INJECTED_PROPS","INJECT","Symbol","INJECTABLE","SELF","SKIP_SELF","OPTIONAL","SERVICE_STATUS","INITING","CONSTRUCTED","MERGED","createDecorator","decoratorKey","defaultValue","decoratorValue","target","targetKey","index","isParameterDecorator","Ctor","constructor","key","metadataKey","paramsOrPropertiesMetadata","Reflect","getMetadata","paramOrPropertyMetadata","metadata","value","push","defineMetadata","Inject","Self","Skip","Optional","Injectable","types","has","obj","Object","prototype","hasOwnProperty","call","merge","source","forwardRef","fn","__forward_ref__","isForwardRef","resolveForwardRef","type","CircularDependencyError","provider","options","name","tokenArr","provide","currentProvider","parent","tokenListText","join","message","Error","InjectFailedError","injectMeta","ClassName","paramType","ProviderNotValidError","TokenNotFoundError","token","NOOP","n","Injector","providers","Map","beforeCacheHook","mergePropertyHook","addProviders","skip","get","optional","self","providerMap","status","getServiceByProvider","getProviderByToken","addProvider","useCacheValue","getServiceUseValueWithProvider","useClass","getServiceUseClassWithProvider","useExisting","getServiceUseExistingWithProvider","useFactory","getServiceUseFactoryWithProvider","cacheValue","useValue","params","getContructorParameters","properties","getInjectProperties","deps","args","map","dep","serviceValue","getContructorParametersMetas","result","meta","propertiesMetadatas","propertyMetadatas","find","reduce","acc","metas","getInjectPropertiesMetas","forEach","property","propertiesMetas","set","dispose","error","console"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/constants.ts","../src/decorator.ts","../src/utils.ts","../src/forwardRef.ts","../src/errors/CircularDependencyError.ts","../src/errors/InjectFailedError.ts","../src/errors/ProviderNotValidError.ts","../src/errors/TokenNotFoundError.ts","../src/Injector.ts"],"sourcesContent":["export const DECORATOR_KEYS = {\n // ts自带的类的实例属性的类型的key\n DESIGN_PROPERTY_TYPE: 'design:type',\n // ts自带的类的构造函数的参数的类型信息的key\n DESIGN_PARAM_TYPES: 'design:paramtypes',\n // 记录构造函数原始的类型数据的key,其实就是转存了DESIGN_PARAM_TYPES对应的数据\n SERVICE_PARAM_TYPES: 'service:paramtypes',\n // 记录构造函数参数装饰器对应的数据的key\n SERVICE_INJECTED_PARAMS: 'service:injected:params',\n // 记录实例属性装饰器对应的数据的key\n SERVICE_INJECTED_PROPS: 'service:injected:props',\n // Inject装饰器的key\n INJECT: Symbol('inject'),\n // Injectable装饰器的key\n INJECTABLE: Symbol('injectable'),\n // Self装饰器的key\n SELF: 'self',\n // Skip装饰器的key\n SKIP_SELF: 'skip',\n // Optional装饰器的key\n OPTIONAL: 'optional',\n};\n\nexport const SERVICE_STATUS = {\n INITING: Symbol('initing'),\n CONSTRUCTED: Symbol('constructed'),\n MERGED: Symbol('merged'),\n};\n","/**\n * 这里记录不同的装饰器的参数的含义\n *\n * class decorator:\n * 只有一个参数:构造函数\n * property decorator:\n * 静态属性:构造函数, 属性名\n * 实例属性:原型, 属性名\n * parameter decorator:\n * 构造函数参数:构造函数, undefined, 0\n * 普通函数参数:原型, 方法名, 0\n * 静态函数参数:构造函数, 方法名, 0\n * method decorator:\n * 静态方法:构造函数, 方法名, 属性描述符\n * 实例方法:原型, 方法名, 属性描述符\n * accessor decorator:\n * 静态访问器:构造函数, 方法名, 属性描述符\n * 实例访问器:原型, 方法名, 属性描述符\n */\n\nimport { DECORATOR_KEYS } from './constants';\n\n/**\n * 创建装饰器的高阶函数\n * 装饰器的通用逻辑就是通过Reflect记录到全局的Map中\n * 所以可以抽象出一个通用逻辑,这里需要注意对Inject装饰器有特殊判断\n *\n * @param {(string | symbol)} decoratorKey 代表某个装饰器的名称\n * @param {*} [defaultValue] 该装饰器函数的默认参数\n * @return {*} 一个装饰器\n */\nexport function createDecorator(\n decoratorKey: string | symbol,\n defaultValue?: any\n) {\n // 因为装饰器本身作为一个函数是有参数的,此处的decoratorValue就是实际使用装饰器的实参\n return function (decoratorValue?: any) {\n // 目前的装饰器只支持类的构造函数参数装饰器和类的实例属性装饰器\n // target可能是构造函数或者类的原型\n // 如果target是构造函数,targetKey是undefined,index是参数的位置下标\n // 如果target是原型,targetKey是属姓名,index是undefined\n return function (target: any, targetKey: string, index?: number): void {\n // 如果index是number,那么代表是构造函数的参数的装饰器\n const isParameterDecorator = typeof index === 'number';\n // 统一把装饰器数据绑定到构造函数上,后续获取数据比较方便\n const Ctor = isParameterDecorator ? target : target.constructor;\n // 如果是构造函数的参数装饰器,取参数位置下标,否则取实例属性的属性名\n const key = isParameterDecorator ? index : targetKey;\n\n // 区分构造函数的参数装饰器和实例属性的装饰器\n // 分别记录到全局Map的不同位置,metadataKey不一样\n const metadataKey = isParameterDecorator\n ? DECORATOR_KEYS.SERVICE_INJECTED_PARAMS\n : DECORATOR_KEYS.SERVICE_INJECTED_PROPS;\n\n // 这里是一个大对象,对应的key是metadataKey\n // 所以全局Map中有两个不同的metadataKey,以及对应的数据对象\n // 如果是构造函数参数装饰器,这个对象中的key是参数位置下标\n // 如果是实例属性装饰器,这个对象中的key是属性名\n const paramsOrPropertiesMetadata =\n Reflect.getMetadata(metadataKey, Ctor) || {};\n\n // 每个参数或者实例属性都可以有多个装饰器\n // 所以paramsOrPropertiesMetadata这个大对象的每个key对应的value都是一个数组\n // 该数组中的每一个元素是一个对象,保存着每一个装饰器的数据\n const paramOrPropertyMetadata = paramsOrPropertiesMetadata[key] || [];\n\n const metadata = {\n // 装饰器的名称\n key: decoratorKey,\n // 装饰器的值,即装饰器函数的实参\n // 很多装饰器具有默认值,可以不提供实参,而是使用默认值\n value: decoratorValue === void 0 ? defaultValue : decoratorValue,\n };\n\n if (!isParameterDecorator) {\n if (decoratorKey === DECORATOR_KEYS.INJECT) {\n if (decoratorValue === void 0) {\n // 是实例属性装饰器,且是Inject装饰器,且没有指定参数\n // 需要获取默认的类型数据\n metadata.value = Reflect.getMetadata(\n DECORATOR_KEYS.DESIGN_PROPERTY_TYPE,\n target,\n targetKey\n );\n }\n }\n }\n\n // 把当前装饰器的数据对象放到数组中\n paramOrPropertyMetadata.push(metadata);\n // 关联这个数组和对应的key\n paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;\n // 再把整个大对象放到全局Map中\n Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, Ctor);\n };\n };\n}\n\n// 可以使用在类构造函数的参数中和类的实例属性中\nexport const Inject = createDecorator(DECORATOR_KEYS.INJECT);\n\n// 指定只在当前injector中寻找服务\nexport const Self = createDecorator(DECORATOR_KEYS.SELF, true);\n\n// 指定跳过当前injector寻找服务\nexport const Skip = createDecorator(DECORATOR_KEYS.SKIP_SELF, true);\n\n// 指定服务是可选的,找不到服务时返回undefined,否则抛出异常\n// 其实应该说是默认情况下找不到服务时,会抛出异常,除非明确指定是optional的\nexport const Optional = createDecorator(DECORATOR_KEYS.OPTIONAL, true);\n\n/**\n * 表明服务可注入\n * 主要工作就是收集构造函数的参数类型信息\n *\n * @export\n * @return {*}\n */\nexport function Injectable() {\n return function (target: any) {\n // 标记这个类可以注入\n Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target);\n\n // 获取ts编译器默认的类型数据\n // 经过测试,如果是基本类型string、number、boolean,那么会变成相对应的构造函数String,Number,Boolean\n // 如果只是指定了interface类型,那么会变成Object构造函数\n const types =\n Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, target) || [];\n\n // 存储构造函数的类型信息\n // 这里只是转存了一下数据,并没有特殊逻辑\n Reflect.defineMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, types, target);\n\n return target;\n };\n}\n","export function has(obj: any, key: string) {\n return obj && Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function merge(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = source[key];\n }\n }\n return target;\n}\n","import { has } from './utils';\n\nexport interface ForwardRefFn {\n (): any;\n}\n\nexport function forwardRef(fn: ForwardRefFn) {\n (<any>fn).__forward_ref__ = forwardRef;\n return fn;\n}\n\nexport function isForwardRef(fn: any): fn is () => any {\n return (\n typeof fn === 'function' &&\n has(fn, '__forward_ref__') &&\n fn.__forward_ref__ === forwardRef\n );\n}\n\nexport function resolveForwardRef<T>(type: T): T {\n return isForwardRef(type) ? type() : type;\n}\n","export class CircularDependencyError extends Error {\n public name = 'CIRCULAR_DEPENDENCY_ERROR';\n\n public message = this.name;\n\n constructor(provider: any, options: any) {\n super();\n\n const tokenArr = [provider.provide];\n let currentProvider = options?.provider;\n while (currentProvider && currentProvider.provide) {\n tokenArr.push(currentProvider.provide);\n currentProvider = currentProvider.parent;\n }\n const tokenListText = tokenArr.join(' <-- ');\n\n this.message = `CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \\n ${tokenListText}`;\n }\n}\n","export class InjectFailedError extends Error {\n public name = 'INJECT_FAILED_ERROR';\n public message = this.name;\n\n constructor(\n injectMeta: any,\n ClassName: any,\n key: string | number,\n paramType?: any\n ) {\n super();\n\n if (paramType) {\n // 是构造函数的参数装饰器\n if (injectMeta && injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n } else if (paramType === Object) {\n this.message = `CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n }\n } else {\n // 是属性装饰器\n if (!injectMeta) {\n this.message = `INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ${key} OF CLASS ${ClassName}.`;\n } else if (injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ${key} OF CLASS ${ClassName}.`;\n }\n }\n }\n}\n","export class ProviderNotValidError extends Error {\n public name = 'PROVIDER_NOT_VALID_ERROR';\n public message = this.name;\n\n constructor(provider: any) {\n super();\n\n this.message = `PROVIDER NOT VALID. ${provider}`;\n }\n}\n","export class TokenNotFoundError extends Error {\n public name = 'TOKEN_NOT_FOUND_ERROR';\n public message = this.name;\n\n constructor(token: any) {\n super();\n\n this.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. ${token}`;\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface InjectionKey<T> extends Symbol {}\n\ninterface Meta {\n key: any;\n value: any;\n}\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nimport { SERVICE_STATUS, DECORATOR_KEYS } from './constants';\nimport { merge, has } from './utils';\nimport { resolveForwardRef } from './forwardRef';\n\nimport {\n CircularDependencyError,\n TokenNotFoundError,\n InjectFailedError,\n ProviderNotValidError,\n} from './errors';\n\nconst NOOP = (n: any) => n;\n\n// 第一步:准备构造函数的依赖对象\n// 第二步:通过构造函数来获取服务的实例对象\n// 第三步:补充@Inject注入的实例属性\n// 第四步:执行constructed方法\n\nexport class Injector {\n public parent?: Injector;\n\n public providerMap = new Map<any, any>();\n\n public beforeCacheHook?: any;\n public mergePropertyHook?: any;\n\n constructor(providers: any[] = [], parent?: Injector, options: any = {}) {\n // 引用父级Injector\n this.parent = parent;\n\n // 在把服务实例放到缓存中之前,可以调用这个钩子让服务响应化\n this.beforeCacheHook = options.beforeCacheHook || NOOP;\n\n // 在注入实例属性时,需要把属性merge到服务实例对象上,合并过程需要保持响应式\n this.mergePropertyHook = options.mergePropertyHook || merge;\n\n this.addProviders(providers);\n }\n\n /**\n * 对外暴露的接口 - 获取服务对象\n *\n * @param {*} token\n * @param {*} options\n * @return {*} {*}\n * @memberof Injector\n */\n get<T>(token: InjectionKey<T>, options?: any): T;\n get<R, T = unknown>(token: T, options?: any): T extends R ? Ret<T> : Ret<R>;\n get(token: any, options: any = {}): any {\n if (options.skip) {\n if (this.parent) {\n return this.parent.get(token, { ...options, skip: false });\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (options.self) {\n if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (\n !this.parent &&\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n // 如果当前Injector已经是根Injector\n // 就必须要考虑self的限制\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (this.parent) {\n return this.parent.get(token, options);\n } else if (\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n }\n\n /**\n * 如果token对应的provider不存在\n * 那么就创建一个\n * 调用该方法之前需要保证token对应的provider已经存在或者token本身是一个可注入的类\n *\n * @param {*} token\n * @return {*}\n * @memberof Injector\n */\n getProviderByToken(token: any) {\n if (!this.providerMap.has(token)) {\n this.addProvider(token);\n }\n return this.providerMap.get(token);\n }\n\n /**\n * 通过provider直接获取service实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceByProvider(provider: any, options: any) {\n if ('useCacheValue' in provider) {\n return provider.useCacheValue;\n } else if ('useValue' in provider) {\n return this.getServiceUseValueWithProvider(provider);\n } else if (provider.useClass) {\n return this.getServiceUseClassWithProvider(provider, options);\n } else if (provider.useExisting) {\n return this.getServiceUseExistingWithProvider(provider, options);\n } else if (provider.useFactory) {\n return this.getServiceUseFactoryWithProvider(provider, options);\n } else {\n throw new ProviderNotValidError(provider);\n }\n }\n\n /**\n * 通过useValue获取服务实例\n *\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getServiceUseValueWithProvider(provider: any) {\n const cacheValue = this.beforeCacheHook(provider.useValue);\n provider.useCacheValue = cacheValue;\n return cacheValue;\n }\n\n /**\n * 通过useClass获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseClassWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n\n provider.status = SERVICE_STATUS.INITING;\n const ClassName = provider.useClass;\n\n const params = this.getContructorParameters(ClassName, provider);\n const cacheValue = this.beforeCacheHook(new ClassName(...params));\n\n provider.useCacheValue = cacheValue;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n const properties = this.getInjectProperties(ClassName, provider);\n this.mergePropertyHook(cacheValue, properties);\n\n provider.status = SERVICE_STATUS.MERGED;\n\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useExisting获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseExistingWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const cacheValue = this.get(provider.useExisting, { ...options, provider });\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useFactory获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseFactoryWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const deps = provider.deps || [];\n const args = deps.map((dep: any) => this.get(dep, { provider }));\n const serviceValue = provider.useFactory(...args);\n const cacheValue = this.beforeCacheHook(serviceValue);\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 获取构造函数的参数-返回数组\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getContructorParameters(ClassName: any, provider: any) {\n const params = this.getContructorParametersMetas(ClassName);\n const result = params.map((meta: any) =>\n this.get(meta.key, { ...meta.value, provider })\n );\n return result;\n }\n\n /**\n * 获取构造函数的参数的装饰器元数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParametersMetas(ClassName: any) {\n // 构造函数的参数的类型数据-原始数据-是一个数组\n const params =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, ClassName) || [];\n // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) ||\n {};\n return params.map((paramType: any, index: any) => {\n // 查找当前index对应的参数有没有使用装饰器\n const propertyMetadatas: any[] = propertiesMetadatas[index] || [];\n // 查找装饰器列表中有没有@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n meta => meta.key === DECORATOR_KEYS.INJECT\n );\n if (\n (injectMeta && injectMeta.value === Object) ||\n (!injectMeta && paramType === Object)\n ) {\n // 构造函数的参数可以不使用@Inject,但是一定不能是interface\n throw new InjectFailedError(injectMeta, ClassName, index, paramType);\n }\n // 把装饰器列表收集为对象,并且排除掉@Inject\n const options = propertyMetadatas.reduce((acc, meta) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n return {\n key: resolveForwardRef(injectMeta && injectMeta.value) || paramType,\n value: options,\n };\n });\n }\n\n /**\n * 获取注入的实例属性-返回对象\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getInjectProperties(ClassName: any, provider: any) {\n const metas = this.getInjectPropertiesMetas(ClassName);\n\n const properties = {} as any;\n\n metas.forEach((meta: any) => {\n const property = this.get(meta.provide, { ...meta.value, provider });\n if (!(property === void 0 && meta.value?.optional)) {\n properties[meta.key] = property;\n }\n });\n\n return properties;\n }\n\n /**\n * 获取注入属性的装饰器数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectPropertiesMetas(ClassName: any) {\n // 获取注入属性的metas-类型是Recors<string, Array>\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PROPS, ClassName) ||\n {};\n const propertiesMetas: any = [];\n for (const key in propertiesMetadatas) {\n if (has(propertiesMetadatas, key)) {\n // 当前key属性对应的所有的装饰器\n const propertyMetadatas = propertiesMetadatas[key] || [];\n // 当前key属性对应的@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n (meta: any) => meta.key === DECORATOR_KEYS.INJECT\n );\n if (!injectMeta || injectMeta.value === Object) {\n // 属性一定要手动指定@Inject\n throw new InjectFailedError(injectMeta, ClassName, key);\n }\n const options = propertyMetadatas.reduce((acc: any, meta: any) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n\n propertiesMetas.push({\n key,\n provide: resolveForwardRef(injectMeta.value),\n value: options,\n });\n }\n }\n return propertiesMetas;\n }\n\n /**\n * 把providers数组转换成map,避免后续的遍历\n *\n * @param {any[]} providers\n * @memberof Injector\n */\n addProviders(providers: any[]) {\n providers.forEach(provider => {\n this.addProvider(provider);\n });\n }\n\n /**\n * 添加新的provider\n *\n * @param {*} provider\n * @memberof Injector\n */\n addProvider(provider: any) {\n if (provider.provide) {\n this.providerMap.set(provider.provide, provider);\n } else {\n this.providerMap.set(provider, {\n provide: provider,\n useClass: provider,\n });\n }\n }\n\n /**\n * 释放当前Injector中的所有服务实例\n *\n * @memberof Injector\n */\n dispose() {\n this.providerMap.forEach(value => {\n if (value && value.useCacheValue && value.useCacheValue.dispose) {\n try {\n value.useCacheValue.dispose();\n } catch (error) {\n console.error(error);\n }\n }\n });\n this.providerMap = null as any;\n this.parent = null as any;\n }\n}\n"],"names":["DECORATOR_KEYS","DESIGN_PROPERTY_TYPE","DESIGN_PARAM_TYPES","SERVICE_PARAM_TYPES","SERVICE_INJECTED_PARAMS","SERVICE_INJECTED_PROPS","INJECT","Symbol","INJECTABLE","SELF","SKIP_SELF","OPTIONAL","SERVICE_STATUS","INITING","CONSTRUCTED","MERGED","createDecorator","decoratorKey","defaultValue","decoratorValue","target","targetKey","index","isParameterDecorator","Ctor","constructor","key","metadataKey","paramsOrPropertiesMetadata","Reflect","getMetadata","paramOrPropertyMetadata","metadata","value","push","defineMetadata","Inject","Self","Skip","Optional","Injectable","types","has","obj","Object","prototype","hasOwnProperty","call","merge","source","forwardRef","fn","__forward_ref__","isForwardRef","resolveForwardRef","type","CircularDependencyError","provider","options","name","tokenArr","provide","currentProvider","parent","tokenListText","join","message","Error","InjectFailedError","injectMeta","ClassName","paramType","ProviderNotValidError","TokenNotFoundError","token","NOOP","n","Injector","providers","Map","beforeCacheHook","mergePropertyHook","addProviders","skip","get","optional","self","providerMap","status","getServiceByProvider","getProviderByToken","addProvider","useCacheValue","getServiceUseValueWithProvider","useClass","getServiceUseClassWithProvider","useExisting","getServiceUseExistingWithProvider","useFactory","getServiceUseFactoryWithProvider","cacheValue","useValue","params","getContructorParameters","properties","getInjectProperties","deps","args","map","dep","serviceValue","getContructorParametersMetas","result","meta","propertiesMetadatas","propertyMetadatas","find","reduce","acc","metas","getInjectPropertiesMetas","forEach","property","propertiesMetas","set","dispose","error","console"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAaA,cAAc,GAAG;;AAE5BC,EAAAA,oBAAoB,EAAE,aAFM;;AAI5BC,EAAAA,kBAAkB,EAAE,mBAJQ;;AAM5BC,EAAAA,mBAAmB,EAAE,oBANO;;AAQ5BC,EAAAA,uBAAuB,EAAE,yBARG;;AAU5BC,EAAAA,sBAAsB,EAAE,wBAVI;;AAY5BC,EAAAA,MAAM,EAAEC,MAAM,CAAC,QAAD,CAZc;;AAc5BC,EAAAA,UAAU,EAAED,MAAM,CAAC,YAAD,CAdU;;AAgB5BE,EAAAA,IAAI,EAAE,MAhBsB;;AAkB5BC,EAAAA,SAAS,EAAE,MAlBiB;;AAoB5BC,EAAAA,QAAQ,EAAE;AApBkB;IAuBjBC,cAAc,GAAG;AAC5BC,EAAAA,OAAO,EAAEN,MAAM,CAAC,SAAD,CADa;AAE5BO,EAAAA,WAAW,EAAEP,MAAM,CAAC,aAAD,CAFS;AAG5BQ,EAAAA,MAAM,EAAER,MAAM,CAAC,QAAD;AAHc;ACvB9B;;;;;;;;;;;;;;;;;;;;AAsBA;;;;;;;;;;SASgBS,gBACdC,cACAC;;AAGA,SAAO,UAAUC,cAAV;;;;;AAKL,WAAO,UAAUC,MAAV,EAAuBC,SAAvB,EAA0CC,KAA1C;;AAEL,UAAMC,oBAAoB,GAAG,OAAOD,KAAP,KAAiB,QAA9C;;AAEA,UAAME,IAAI,GAAGD,oBAAoB,GAAGH,MAAH,GAAYA,MAAM,CAACK,WAApD;;AAEA,UAAMC,GAAG,GAAGH,oBAAoB,GAAGD,KAAH,GAAWD,SAA3C;;;AAIA,UAAMM,WAAW,GAAGJ,oBAAoB,GACpCvB,cAAc,CAACI,uBADqB,GAEpCJ,cAAc,CAACK,sBAFnB;;;;;AAQA,UAAMuB,0BAA0B,GAC9BC,OAAO,CAACC,WAAR,CAAoBH,WAApB,EAAiCH,IAAjC,KAA0C,EAD5C;;;;AAMA,UAAMO,uBAAuB,GAAGH,0BAA0B,CAACF,GAAD,CAA1B,IAAmC,EAAnE;AAEA,UAAMM,QAAQ,GAAG;;AAEfN,QAAAA,GAAG,EAAET,YAFU;;;AAKfgB,QAAAA,KAAK,EAAEd,cAAc,KAAK,KAAK,CAAxB,GAA4BD,YAA5B,GAA2CC;AALnC,OAAjB;;AAQA,UAAI,CAACI,oBAAL,EAA2B;AACzB,YAAIN,YAAY,KAAKjB,cAAc,CAACM,MAApC,EAA4C;AAC1C,cAAIa,cAAc,KAAK,KAAK,CAA5B,EAA+B;;;AAG7Ba,YAAAA,QAAQ,CAACC,KAAT,GAAiBJ,OAAO,CAACC,WAAR,CACf9B,cAAc,CAACC,oBADA,EAEfmB,MAFe,EAGfC,SAHe,CAAjB;AAKD;AACF;AACF;;;AAGDU,MAAAA,uBAAuB,CAACG,IAAxB,CAA6BF,QAA7B;;AAEAJ,MAAAA,0BAA0B,CAACF,GAAD,CAA1B,GAAkCK,uBAAlC;;AAEAF,MAAAA,OAAO,CAACM,cAAR,CAAuBR,WAAvB,EAAoCC,0BAApC,EAAgEJ,IAAhE;AACD,KAtDD;AAuDD,GA5DD;AA6DD,EAED;;;IACaY,MAAM,GAAGpB,eAAe,CAAChB,cAAc,CAACM,MAAhB,GAErC;;IACa+B,IAAI,GAAGrB,eAAe,CAAChB,cAAc,CAACS,IAAhB,EAAsB,IAAtB,GAEnC;;IACa6B,IAAI,GAAGtB,eAAe,CAAChB,cAAc,CAACU,SAAhB,EAA2B,IAA3B,GAEnC;AACA;;IACa6B,QAAQ,GAAGvB,eAAe,CAAChB,cAAc,CAACW,QAAhB,EAA0B,IAA1B;AAEvC;;;;;;;;SAOgB6B;AACd,SAAO,UAAUpB,MAAV;;AAELS,IAAAA,OAAO,CAACM,cAAR,CAAuBnC,cAAc,CAACQ,UAAtC,EAAkD,IAAlD,EAAwDY,MAAxD;;;;AAKA,QAAMqB,KAAK,GACTZ,OAAO,CAACC,WAAR,CAAoB9B,cAAc,CAACE,kBAAnC,EAAuDkB,MAAvD,KAAkE,EADpE;;;AAKAS,IAAAA,OAAO,CAACM,cAAR,CAAuBnC,cAAc,CAACG,mBAAtC,EAA2DsC,KAA3D,EAAkErB,MAAlE;AAEA,WAAOA,MAAP;AACD,GAfD;;;SCxHcsB,IAAIC,KAAUjB;AAC5B,SAAOiB,GAAG,IAAIC,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCJ,GAArC,EAA0CjB,GAA1C,CAAd;AACD;;SAEesB,MAAM5B,QAAa6B;AACjC,OAAK,IAAMvB,GAAX,IAAkBuB,MAAlB,EAA0B;AACxB,QAAIP,GAAG,CAACO,MAAD,EAASvB,GAAT,CAAP,EAAsB;AACpBN,MAAAA,MAAM,CAACM,GAAD,CAAN,GAAcuB,MAAM,CAACvB,GAAD,CAApB;AACD;AACF;;AACD,SAAON,MAAP;;;SCJc8B,WAAWC;AACnBA,EAAAA,EAAG,CAACC,eAAJ,GAAsBF,UAAtB;AACN,SAAOC,EAAP;AACD;;SAEeE,aAAaF;AAC3B,SACE,OAAOA,EAAP,KAAc,UAAd,IACAT,GAAG,CAACS,EAAD,EAAK,iBAAL,CADH,IAEAA,EAAE,CAACC,eAAH,KAAuBF,UAHzB;AAKD;;SAEeI,kBAAqBC;AACnC,SAAOF,YAAY,CAACE,IAAD,CAAZ,GAAqBA,IAAI,EAAzB,GAA8BA,IAArC;;;ICpBWC;;;;;AAKX,mCAAYC,QAAZ,EAA2BC,OAA3B;;;;;AACE;;2DALY;;8DAEG,MAAKC;;AAKpB,QAAMC,QAAQ,GAAG,CAACH,QAAQ,CAACI,OAAV,CAAjB;AACA,QAAIC,eAAe,GAAGJ,OAAH,aAAGA,OAAH,uBAAGA,OAAO,CAAED,QAA/B;;AACA,WAAOK,eAAe,IAAIA,eAAe,CAACD,OAA1C,EAAmD;AACjDD,MAAAA,QAAQ,CAAC1B,IAAT,CAAc4B,eAAe,CAACD,OAA9B;AACAC,MAAAA,eAAe,GAAGA,eAAe,CAACC,MAAlC;AACD;;AACD,QAAMC,aAAa,GAAGJ,QAAQ,CAACK,IAAT,CAAc,OAAd,CAAtB;AAEA,UAAKC,OAAL,sEAA2EF,aAA3E;;AACD;;;iCAjB0CG;;ICAhCC;;;;;AAIX,6BACEC,UADF,EAEEC,SAFF,EAGE5C,GAHF,EAIE6C,SAJF;;;;;AAME;;4DATY;;+DACG,OAAKZ;;AAUpB,QAAIY,SAAJ,EAAe;;AAEb,UAAIF,UAAU,IAAIA,UAAU,CAACpC,KAAX,KAAqBW,MAAvC,EAA+C;AAC7C,eAAKsB,OAAL,8DAAmExC,GAAnE,uBAAmF4C,SAAnF;AACD,OAFD,MAEO,IAAIC,SAAS,KAAK3B,MAAlB,EAA0B;AAC/B,eAAKsB,OAAL,uHAA4HxC,GAA5H,uBAA4I4C,SAA5I;AACD;AACF,KAPD,MAOO;;AAEL,UAAI,CAACD,UAAL,EAAiB;AACf,eAAKH,OAAL,mEAAwExC,GAAxE,uBAAwF4C,SAAxF;AACD,OAFD,MAEO,IAAID,UAAU,CAACpC,KAAX,KAAqBW,MAAzB,EAAiC;AACtC,eAAKsB,OAAL,6DAAkExC,GAAlE,uBAAkF4C,SAAlF;AACD;AACF;;;AACF;;;iCA3BoCH;;ICA1BK;;;;;AAIX,iCAAYf,QAAZ;;;;;AACE;;4DAJY;;+DACG,OAAKE;;AAKpB,WAAKO,OAAL,iCAAsCT,QAAtC;;AACD;;;iCARwCU;;ICA9BM;;;;;AAIX,8BAAYC,KAAZ;;;;;AACE;;4DAJY;;+DACG,OAAKf;;AAKpB,WAAKO,OAAL,6JAAkKQ,KAAlK;;AACD;;;iCARqCP;;ACyBxC,IAAMQ,IAAI,GAAG,SAAPA,IAAO,CAACC,CAAD;AAAA,SAAYA,CAAZ;AAAA,CAAb,EAEA;AACA;AACA;AACA;;;IAEaC;AAQX;QAAYC,gFAAmB;QAAIf;QAAmBL,8EAAe;;;;;;yCALhD,IAAIqB,GAAJ;;;;;;;AAOnB,SAAKhB,MAAL,GAAcA,MAAd;;AAGA,SAAKiB,eAAL,GAAuBtB,OAAO,CAACsB,eAAR,IAA2BL,IAAlD;;AAGA,SAAKM,iBAAL,GAAyBvB,OAAO,CAACuB,iBAAR,IAA6BjC,KAAtD;AAEA,SAAKkC,YAAL,CAAkBJ,SAAlB;AACD;;;;WAYD,aAAIJ,KAAJ;UAAgBhB,8EAAe;;AAC7B,UAAIA,OAAO,CAACyB,IAAZ,EAAkB;AAChB,YAAI,KAAKpB,MAAT,EAAiB;AACf,iBAAO,KAAKA,MAAL,CAAYqB,GAAZ,CAAgBV,KAAhB,kCAA4BhB,OAA5B;AAAqCyB,YAAAA,IAAI,EAAE;AAA3C,aAAP;AACD,SAFD,MAEO;AACL,cAAI,CAACzB,OAAO,CAAC2B,QAAb,EAAuB;AACrB,kBAAM,IAAIZ,kBAAJ,CAAuBC,KAAvB,CAAN;AACD;AACF;AACF,OARD,MAQO,IAAIhB,OAAO,CAAC4B,IAAZ,EAAkB;AACvB,YAAI,KAAKC,WAAL,CAAiB7C,GAAjB,CAAqBgC,KAArB,CAAJ,EAAiC;AAC/B,cAAMjB,QAAQ,GAAG,KAAK8B,WAAL,CAAiBH,GAAjB,CAAqBV,KAArB,CAAjB;;AACA,cAAIjB,QAAQ,CAAC+B,MAAT,KAAoB5E,cAAc,CAACC,OAAvC,EAAgD;AAC9C,kBAAM,IAAI2C,uBAAJ,CAA4BC,QAA5B,EAAsCC,OAAtC,CAAN;AACD;;AACD,iBAAO,KAAK+B,oBAAL,CAA0BhC,QAA1B,EAAoCC,OAApC,CAAP;AACD,SAND,MAMO,IACL,CAAC,KAAKK,MAAN,IACA,OAAOW,KAAP,KAAiB,UADjB,IAEA7C,OAAO,CAACC,WAAR,CAAoB9B,cAAc,CAACQ,UAAnC,EAA+CkE,KAA/C,CAHK,EAIL;;;AAGA,cAAMjB,SAAQ,GAAG,KAAKiC,kBAAL,CAAwBhB,KAAxB,CAAjB;;AACA,iBAAO,KAAKe,oBAAL,CAA0BhC,SAA1B,EAAoCC,OAApC,CAAP;AACD,SATM,MASA;AACL,cAAI,CAACA,OAAO,CAAC2B,QAAb,EAAuB;AACrB,kBAAM,IAAIZ,kBAAJ,CAAuBC,KAAvB,CAAN;AACD;AACF;AACF,OArBM,MAqBA,IAAI,KAAKa,WAAL,CAAiB7C,GAAjB,CAAqBgC,KAArB,CAAJ,EAAiC;AACtC,YAAMjB,UAAQ,GAAG,KAAK8B,WAAL,CAAiBH,GAAjB,CAAqBV,KAArB,CAAjB;;AACA,YAAIjB,UAAQ,CAAC+B,MAAT,KAAoB5E,cAAc,CAACC,OAAvC,EAAgD;AAC9C,gBAAM,IAAI2C,uBAAJ,CAA4BC,UAA5B,EAAsCC,OAAtC,CAAN;AACD;;AACD,eAAO,KAAK+B,oBAAL,CAA0BhC,UAA1B,EAAoCC,OAApC,CAAP;AACD,OANM,MAMA,IAAI,KAAKK,MAAT,EAAiB;AACtB,eAAO,KAAKA,MAAL,CAAYqB,GAAZ,CAAgBV,KAAhB,EAAuBhB,OAAvB,CAAP;AACD,OAFM,MAEA,IACL,OAAOgB,KAAP,KAAiB,UAAjB,IACA7C,OAAO,CAACC,WAAR,CAAoB9B,cAAc,CAACQ,UAAnC,EAA+CkE,KAA/C,CAFK,EAGL;AACA,YAAMjB,UAAQ,GAAG,KAAKiC,kBAAL,CAAwBhB,KAAxB,CAAjB;;AACA,eAAO,KAAKe,oBAAL,CAA0BhC,UAA1B,EAAoCC,OAApC,CAAP;AACD,OANM,MAMA;AACL,YAAI,CAACA,OAAO,CAAC2B,QAAb,EAAuB;AACrB,gBAAM,IAAIZ,kBAAJ,CAAuBC,KAAvB,CAAN;AACD;AACF;AACF;;;;;;;;;;;;;WAWD,4BAAmBA,KAAnB;AACE,UAAI,CAAC,KAAKa,WAAL,CAAiB7C,GAAjB,CAAqBgC,KAArB,CAAL,EAAkC;AAChC,aAAKiB,WAAL,CAAiBjB,KAAjB;AACD;;AACD,aAAO,KAAKa,WAAL,CAAiBH,GAAjB,CAAqBV,KAArB,CAAP;AACD;;;;;;;;;;;;WAUD,8BAAqBjB,QAArB,EAAoCC,OAApC;AACE,UAAI,mBAAmBD,QAAvB,EAAiC;AAC/B,eAAOA,QAAQ,CAACmC,aAAhB;AACD,OAFD,MAEO,IAAI,cAAcnC,QAAlB,EAA4B;AACjC,eAAO,KAAKoC,8BAAL,CAAoCpC,QAApC,CAAP;AACD,OAFM,MAEA,IAAIA,QAAQ,CAACqC,QAAb,EAAuB;AAC5B,eAAO,KAAKC,8BAAL,CAAoCtC,QAApC,EAA8CC,OAA9C,CAAP;AACD,OAFM,MAEA,IAAID,QAAQ,CAACuC,WAAb,EAA0B;AAC/B,eAAO,KAAKC,iCAAL,CAAuCxC,QAAvC,EAAiDC,OAAjD,CAAP;AACD,OAFM,MAEA,IAAID,QAAQ,CAACyC,UAAb,EAAyB;AAC9B,eAAO,KAAKC,gCAAL,CAAsC1C,QAAtC,EAAgDC,OAAhD,CAAP;AACD,OAFM,MAEA;AACL,cAAM,IAAIc,qBAAJ,CAA0Bf,QAA1B,CAAN;AACD;AACF;;;;;;;;;;;WASD,wCAA+BA,QAA/B;AACE,UAAM2C,UAAU,GAAG,KAAKpB,eAAL,CAAqBvB,QAAQ,CAAC4C,QAA9B,CAAnB;AACA5C,MAAAA,QAAQ,CAACmC,aAAT,GAAyBQ,UAAzB;AACA,aAAOA,UAAP;AACD;;;;;;;;;;;;WAUD,wCAA+B3C,QAA/B,EAA8CC,OAA9C;AACED,MAAAA,QAAQ,CAACM,MAAT,GAAkBL,OAAO,CAACD,QAA1B;AAEAA,MAAAA,QAAQ,CAAC+B,MAAT,GAAkB5E,cAAc,CAACC,OAAjC;AACA,UAAMyD,SAAS,GAAGb,QAAQ,CAACqC,QAA3B;AAEA,UAAMQ,MAAM,GAAG,KAAKC,uBAAL,CAA6BjC,SAA7B,EAAwCb,QAAxC,CAAf;AACA,UAAM2C,UAAU,GAAG,KAAKpB,eAAL,YAAyBV,SAAzB,qBAAsCgC,MAAtC,GAAnB;AAEA7C,MAAAA,QAAQ,CAACmC,aAAT,GAAyBQ,UAAzB;AACA3C,MAAAA,QAAQ,CAAC+B,MAAT,GAAkB5E,cAAc,CAACE,WAAjC;AAEA,UAAM0F,UAAU,GAAG,KAAKC,mBAAL,CAAyBnC,SAAzB,EAAoCb,QAApC,CAAnB;AACA,WAAKwB,iBAAL,CAAuBmB,UAAvB,EAAmCI,UAAnC;AAEA/C,MAAAA,QAAQ,CAAC+B,MAAT,GAAkB5E,cAAc,CAACG,MAAjC;AAEA0C,MAAAA,QAAQ,CAACM,MAAT,GAAkB,KAAK,CAAvB;AAEA,aAAOqC,UAAP;AACD;;;;;;;;;;;;WAUD,2CAAkC3C,QAAlC,EAAiDC,OAAjD;AACED,MAAAA,QAAQ,CAACM,MAAT,GAAkBL,OAAO,CAACD,QAA1B;AACAA,MAAAA,QAAQ,CAAC+B,MAAT,GAAkB5E,cAAc,CAACC,OAAjC;AAEA,UAAMuF,UAAU,GAAG,KAAKhB,GAAL,CAAS3B,QAAQ,CAACuC,WAAlB,kCAAoCtC,OAApC;AAA6CD,QAAAA,QAAQ,EAARA;AAA7C,SAAnB;AACAA,MAAAA,QAAQ,CAACmC,aAAT,GAAyBQ,UAAzB;AAEA3C,MAAAA,QAAQ,CAAC+B,MAAT,GAAkB5E,cAAc,CAACE,WAAjC;AACA2C,MAAAA,QAAQ,CAACM,MAAT,GAAkB,KAAK,CAAvB;AAEA,aAAOqC,UAAP;AACD;;;;;;;;;;;;WAUD,0CAAiC3C,QAAjC,EAAgDC,OAAhD;;;AACED,MAAAA,QAAQ,CAACM,MAAT,GAAkBL,OAAO,CAACD,QAA1B;AACAA,MAAAA,QAAQ,CAAC+B,MAAT,GAAkB5E,cAAc,CAACC,OAAjC;AAEA,UAAM6F,IAAI,GAAGjD,QAAQ,CAACiD,IAAT,IAAiB,EAA9B;AACA,UAAMC,IAAI,GAAGD,IAAI,CAACE,GAAL,CAAS,UAACC,GAAD;AAAA,eAAc,MAAI,CAACzB,GAAL,CAASyB,GAAT,EAAc;AAAEpD,UAAAA,QAAQ,EAARA;AAAF,SAAd,CAAd;AAAA,OAAT,CAAb;AACA,UAAMqD,YAAY,GAAGrD,QAAQ,CAACyC,UAAT,OAAAzC,QAAQ,qBAAekD,IAAf,EAA7B;AACA,UAAMP,UAAU,GAAG,KAAKpB,eAAL,CAAqB8B,YAArB,CAAnB;AACArD,MAAAA,QAAQ,CAACmC,aAAT,GAAyBQ,UAAzB;AAEA3C,MAAAA,QAAQ,CAAC+B,MAAT,GAAkB5E,cAAc,CAACE,WAAjC;AACA2C,MAAAA,QAAQ,CAACM,MAAT,GAAkB,KAAK,CAAvB;AAEA,aAAOqC,UAAP;AACD;;;;;;;;;;;;WAUD,iCAAwB9B,SAAxB,EAAwCb,QAAxC;;;AACE,UAAM6C,MAAM,GAAG,KAAKS,4BAAL,CAAkCzC,SAAlC,CAAf;AACA,UAAM0C,MAAM,GAAGV,MAAM,CAACM,GAAP,CAAW,UAACK,IAAD;AAAA,eACxB,MAAI,CAAC7B,GAAL,CAAS6B,IAAI,CAACvF,GAAd,kCAAwBuF,IAAI,CAAChF,KAA7B;AAAoCwB,UAAAA,QAAQ,EAARA;AAApC,WADwB;AAAA,OAAX,CAAf;AAGA,aAAOuD,MAAP;AACD;;;;;;;;;;;WASD,sCAA6B1C,SAA7B;;AAEE,UAAMgC,MAAM,GACVzE,OAAO,CAACC,WAAR,CAAoB9B,cAAc,CAACG,mBAAnC,EAAwDmE,SAAxD,KAAsE,EADxE;;AAGA,UAAM4C,mBAAmB,GACvBrF,OAAO,CAACC,WAAR,CAAoB9B,cAAc,CAACI,uBAAnC,EAA4DkE,SAA5D,KACA,EAFF;AAGA,aAAOgC,MAAM,CAACM,GAAP,CAAW,UAACrC,SAAD,EAAiBjD,KAAjB;;AAEhB,YAAM6F,iBAAiB,GAAUD,mBAAmB,CAAC5F,KAAD,CAAnB,IAA8B,EAA/D;;AAEA,YAAM+C,UAAU,GAAG8C,iBAAiB,CAACC,IAAlB,CACjB,UAAAH,IAAI;AAAA,iBAAIA,IAAI,CAACvF,GAAL,KAAa1B,cAAc,CAACM,MAAhC;AAAA,SADa,CAAnB;;AAGA,YACG+D,UAAU,IAAIA,UAAU,CAACpC,KAAX,KAAqBW,MAApC,IACC,CAACyB,UAAD,IAAeE,SAAS,KAAK3B,MAFhC,EAGE;;AAEA,gBAAM,IAAIwB,iBAAJ,CAAsBC,UAAtB,EAAkCC,SAAlC,EAA6ChD,KAA7C,EAAoDiD,SAApD,CAAN;AACD;;;AAED,YAAMb,OAAO,GAAGyD,iBAAiB,CAACE,MAAlB,CAAyB,UAACC,GAAD,EAAML,IAAN;AACvC,cAAIA,IAAI,CAACvF,GAAL,KAAa1B,cAAc,CAACM,MAAhC,EAAwC;AACtCgH,YAAAA,GAAG,CAACL,IAAI,CAACvF,GAAN,CAAH,GAAgBuF,IAAI,CAAChF,KAArB;AACD;;AACD,iBAAOqF,GAAP;AACD,SALe,EAKb,EALa,CAAhB;AAMA,eAAO;AACL5F,UAAAA,GAAG,EAAE4B,iBAAiB,CAACe,UAAU,IAAIA,UAAU,CAACpC,KAA1B,CAAjB,IAAqDsC,SADrD;AAELtC,UAAAA,KAAK,EAAEyB;AAFF,SAAP;AAID,OAzBM,CAAP;AA0BD;;;;;;;;;;;;WAUD,6BAAoBY,SAApB,EAAoCb,QAApC;;;AACE,UAAM8D,KAAK,GAAG,KAAKC,wBAAL,CAA8BlD,SAA9B,CAAd;AAEA,UAAMkC,UAAU,GAAG,EAAnB;AAEAe,MAAAA,KAAK,CAACE,OAAN,CAAc,UAACR,IAAD;;;AACZ,YAAMS,QAAQ,GAAG,MAAI,CAACtC,GAAL,CAAS6B,IAAI,CAACpD,OAAd,kCAA4BoD,IAAI,CAAChF,KAAjC;AAAwCwB,UAAAA,QAAQ,EAARA;AAAxC,WAAjB;;AACA,YAAI,EAAEiE,QAAQ,KAAK,KAAK,CAAlB,mBAAuBT,IAAI,CAAChF,KAA5B,wCAAuB,YAAYoD,QAArC,CAAJ,EAAoD;AAClDmB,UAAAA,UAAU,CAACS,IAAI,CAACvF,GAAN,CAAV,GAAuBgG,QAAvB;AACD;AACF,OALD;AAOA,aAAOlB,UAAP;AACD;;;;;;;;;;;WASD,kCAAyBlC,SAAzB;;AAEE,UAAM4C,mBAAmB,GACvBrF,OAAO,CAACC,WAAR,CAAoB9B,cAAc,CAACK,sBAAnC,EAA2DiE,SAA3D,KACA,EAFF;AAGA,UAAMqD,eAAe,GAAQ,EAA7B;;AACA,WAAK,IAAMjG,GAAX,IAAkBwF,mBAAlB,EAAuC;AACrC,YAAIxE,GAAG,CAACwE,mBAAD,EAAsBxF,GAAtB,CAAP,EAAmC;;AAEjC,cAAMyF,iBAAiB,GAAGD,mBAAmB,CAACxF,GAAD,CAAnB,IAA4B,EAAtD,CAFiC;;AAIjC,cAAM2C,UAAU,GAAG8C,iBAAiB,CAACC,IAAlB,CACjB,UAACH,IAAD;AAAA,mBAAeA,IAAI,CAACvF,GAAL,KAAa1B,cAAc,CAACM,MAA3C;AAAA,WADiB,CAAnB;;AAGA,cAAI,CAAC+D,UAAD,IAAeA,UAAU,CAACpC,KAAX,KAAqBW,MAAxC,EAAgD;;AAE9C,kBAAM,IAAIwB,iBAAJ,CAAsBC,UAAtB,EAAkCC,SAAlC,EAA6C5C,GAA7C,CAAN;AACD;;AACD,cAAMgC,OAAO,GAAGyD,iBAAiB,CAACE,MAAlB,CAAyB,UAACC,GAAD,EAAWL,IAAX;AACvC,gBAAIA,IAAI,CAACvF,GAAL,KAAa1B,cAAc,CAACM,MAAhC,EAAwC;AACtCgH,cAAAA,GAAG,CAACL,IAAI,CAACvF,GAAN,CAAH,GAAgBuF,IAAI,CAAChF,KAArB;AACD;;AACD,mBAAOqF,GAAP;AACD,WALe,EAKb,EALa,CAAhB;AAOAK,UAAAA,eAAe,CAACzF,IAAhB,CAAqB;AACnBR,YAAAA,GAAG,EAAHA,GADmB;AAEnBmC,YAAAA,OAAO,EAAEP,iBAAiB,CAACe,UAAU,CAACpC,KAAZ,CAFP;AAGnBA,YAAAA,KAAK,EAAEyB;AAHY,WAArB;AAKD;AACF;;AACD,aAAOiE,eAAP;AACD;;;;;;;;;;WAQD,sBAAa7C,SAAb;;;AACEA,MAAAA,SAAS,CAAC2C,OAAV,CAAkB,UAAAhE,QAAQ;AACxB,QAAA,MAAI,CAACkC,WAAL,CAAiBlC,QAAjB;AACD,OAFD;AAGD;;;;;;;;;;WAQD,qBAAYA,QAAZ;AACE,UAAIA,QAAQ,CAACI,OAAb,EAAsB;AACpB,aAAK0B,WAAL,CAAiBqC,GAAjB,CAAqBnE,QAAQ,CAACI,OAA9B,EAAuCJ,QAAvC;AACD,OAFD,MAEO;AACL,aAAK8B,WAAL,CAAiBqC,GAAjB,CAAqBnE,QAArB,EAA+B;AAC7BI,UAAAA,OAAO,EAAEJ,QADoB;AAE7BqC,UAAAA,QAAQ,EAAErC;AAFmB,SAA/B;AAID;AACF;;;;;;;;;WAOD;AACE,WAAK8B,WAAL,CAAiBkC,OAAjB,CAAyB,UAAAxF,KAAK;AAC5B,YAAIA,KAAK,IAAIA,KAAK,CAAC2D,aAAf,IAAgC3D,KAAK,CAAC2D,aAAN,CAAoBiC,OAAxD,EAAiE;AAC/D,cAAI;AACF5F,YAAAA,KAAK,CAAC2D,aAAN,CAAoBiC,OAApB;AACD,WAFD,CAEE,OAAOC,KAAP,EAAc;AACdC,YAAAA,OAAO,CAACD,KAAR,CAAcA,KAAd;AACD;AACF;AACF,OARD;AASA,WAAKvC,WAAL,GAAmB,IAAnB;AACA,WAAKxB,MAAL,GAAc,IAAd;AACD;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,10 +2,10 @@
2
2
  * @kaokei/di
3
3
  * Tiny di library depend on typescript and reflect-metadata
4
4
  *
5
- * @version 1.0.23
5
+ * @version 1.0.24
6
6
  * @author kaokei
7
7
  * @license MIT
8
8
  * @link https://github.com/kaokei/di
9
9
  */
10
- "use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){h(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&E(e,t)}function c(e){var t=v();return function(){var r,n=d(e);if(t){var o=d(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return s(this,r)}}function s(t,r){if(r&&("object"===e(r)||"function"==typeof r))return r;if(void 0!==r)throw new TypeError("Derived constructors may only return object or undefined");return f(t)}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){var t="function"==typeof Map?new Map:void 0;return p=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return l(e,arguments,d(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),E(r,e)},p(e)}function l(e,t,r){return l=v()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&E(o,r.prototype),o},l.apply(null,arguments)}function v(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function E(e,t){return E=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},E(e,t)}function d(e){return d=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},d(e)}function h(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}Object.defineProperty(exports,"__esModule",{value:!0});var y={DESIGN_PROPERTY_TYPE:"design:type",DESIGN_PARAM_TYPES:"design:paramtypes",SERVICE_PARAM_TYPES:"service:paramtypes",SERVICE_INJECTED_PARAMS:"service:injected:params",SERVICE_INJECTED_PROPS:"service:injected:props",INJECT:Symbol("inject"),INJECTABLE:Symbol("injectable"),SELF:"self",SKIP_SELF:"skip",OPTIONAL:"optional"},O={INITING:Symbol("initing"),CONSTRUCTED:Symbol("constructed"),MERGED:Symbol("merged")};function R(e,t){return function(r){return function(n,o,i){var a="number"==typeof i,u=a?n:n.constructor,c=a?i:o,s=a?y.SERVICE_INJECTED_PARAMS:y.SERVICE_INJECTED_PROPS,f=Reflect.getMetadata(s,u)||{},p=f[c]||[],l={key:e,value:void 0===r?t:r};a||e===y.INJECT&&void 0===r&&(l.value=Reflect.getMetadata(y.DESIGN_PROPERTY_TYPE,n,o)),p.push(l),f[c]=p,Reflect.defineMetadata(s,f,u)}}}var S=R(y.INJECT),T=R(y.SELF,!0),I=R(y.SKIP_SELF,!0),P=R(y.OPTIONAL,!0);function C(e,t){return e&&Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){for(var r in t)C(t,r)&&(e[r]=t[r]);return e}function b(e){return e.__forward_ref__=b,e}function N(e){return"function"==typeof e&&C(e,"__forward_ref__")&&e.__forward_ref__===b}function m(e){return N(e)?e():e}var _=function(e){u(r,p(Error));var t=c(r);function r(e,n){var o;a(this,r),h(f(o=t.call(this)),"name","CIRCULAR_DEPENDENCY_ERROR"),h(f(o),"message",o.name);for(var i=[e.provide],u=null==n?void 0:n.provider;u&&u.provide;)i.push(u.provide),u=u.parent;var c=i.join(" <-- ");return o.message="CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. ".concat(c),o}return r}(),A=function(e){u(r,p(Error));var t=c(r);function r(e,n,o,i){var u;return a(this,r),h(f(u=t.call(this)),"name","INJECT_FAILED_ERROR"),h(f(u),"message",u.name),i?e&&e.value===Object?u.message="CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ".concat(o," OF CLASS ").concat(n,"."):i===Object&&(u.message="CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ".concat(o," OF CLASS ").concat(n,".")):e?e.value===Object&&(u.message="CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ".concat(o," OF CLASS ").concat(n,".")):u.message="INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ".concat(o," OF CLASS ").concat(n,"."),u}return r}(),w=function(e){u(r,p(Error));var t=c(r);function r(e){var n;return a(this,r),h(f(n=t.call(this)),"name","PROVIDER_NOT_VALID_ERROR"),h(f(n),"message",n.name),n.message="PROVIDER NOT VALID. ".concat(e),n}return r}(),M=function(e){u(r,p(Error));var t=c(r);function r(e){var n;return a(this,r),h(f(n=t.call(this)),"name","TOKEN_NOT_FOUND_ERROR"),h(f(n),"message",n.name),n.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(e),n}return r}(),j=function(e){return e},k=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1?arguments[1]:void 0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};a(this,e),h(this,"parent",void 0),h(this,"providerMap",new Map),h(this,"beforeCacheHook",void 0),h(this,"mergePropertyHook",void 0),this.parent=r,this.beforeCacheHook=n.beforeCacheHook||j,this.mergePropertyHook=n.mergePropertyHook||g,this.addProviders(t)}var r,n,u;return r=e,n=[{key:"get",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t.skip){if(this.parent)return this.parent.get(e,o(o({},t),{},{skip:!1}));if(!t.optional)throw new M(e)}else if(t.self){if(this.providerMap.has(e)){var r=this.providerMap.get(e);if(r.status===O.INITING)throw new _(r,t);return this.getServiceByProvider(r,t)}if(!this.parent&&"function"==typeof e&&Reflect.getMetadata(y.INJECTABLE,e)){var n=this.getProviderByToken(e);return this.getServiceByProvider(n,t)}if(!t.optional)throw new M(e)}else{if(this.providerMap.has(e)){var i=this.providerMap.get(e);if(i.status===O.INITING)throw new _(i,t);return this.getServiceByProvider(i,t)}if(this.parent)return this.parent.get(e,t);if("function"==typeof e&&Reflect.getMetadata(y.INJECTABLE,e)){var a=this.getProviderByToken(e);return this.getServiceByProvider(a,t)}if(!t.optional)throw new M(e)}}},{key:"getProviderByToken",value:function(e){return this.providerMap.has(e)||this.addProvider(e),this.providerMap.get(e)}},{key:"getServiceByProvider",value:function(e,t){if("useCacheValue"in e)return e.useCacheValue;if("useValue"in e)return this.getServiceUseValueWithProvider(e,t);if(e.useClass)return this.getServiceUseClassWithProvider(e,t);if(e.useExisting)return this.getServiceUseExistingWithProvider(e,t);if(e.useFactory)return this.getServiceUseFactoryWithProvider(e,t);throw new w(e)}},{key:"getServiceUseValueWithProvider",value:function(e,t){var r=this.beforeCacheHook(e.useValue);return e.useCacheValue=r,r}},{key:"getServiceUseClassWithProvider",value:function(e,r){e.parent=r.provider,e.status=O.INITING;var n=e.useClass,o=this.getContructorParameters(n,e),i=this.beforeCacheHook(l(n,t(o)));e.useCacheValue=i,e.status=O.CONSTRUCTED;var a=this.getInjectProperties(n,e);return this.mergePropertyHook(i,a),e.status=O.MERGED,e.parent=void 0,i}},{key:"getServiceUseExistingWithProvider",value:function(e,t){e.parent=t.provider,e.status=O.INITING;var r=this.get(e.useExisting,o(o({},t),{},{provider:e}));return e.useCacheValue=r,e.status=O.CONSTRUCTED,e.parent=void 0,r}},{key:"getServiceUseFactoryWithProvider",value:function(e,r){var n=this;e.parent=r.provider,e.status=O.INITING;var o=(e.deps||[]).map((function(t){return n.get(t,{provider:e})})),i=e.useFactory.apply(e,t(o)),a=this.beforeCacheHook(i);return e.useCacheValue=a,e.status=O.CONSTRUCTED,e.parent=void 0,a}},{key:"getContructorParameters",value:function(e,t){var r=this;return this.getContructorParametersMetas(e).map((function(e){return r.get(e.key,o(o({},e.value),{},{provider:t}))}))}},{key:"getContructorParametersMetas",value:function(e){var t=Reflect.getMetadata(y.SERVICE_PARAM_TYPES,e)||[],r=Reflect.getMetadata(y.SERVICE_INJECTED_PARAMS,e)||{};return t.map((function(t,n){var o=r[n]||[],i=o.find((function(e){return e.key===y.INJECT}));if(i&&i.value===Object||!i&&t===Object)throw new A(i,e,n,t);var a=o.reduce((function(e,t){return t.key!==y.INJECT&&(e[t.key]=t.value),e}),{});return{key:m(i&&i.value)||t,value:a}}))}},{key:"getInjectProperties",value:function(e,t){var r=this,n=this.getInjectPropertiesMetas(e),i={};return n.forEach((function(e){var n,a=r.get(e.provide,o(o({},e.value),{},{provider:t}));void 0===a&&null!==(n=e.value)&&void 0!==n&&n.optional||(i[e.key]=a)})),i}},{key:"getInjectPropertiesMetas",value:function(e){var t=Reflect.getMetadata(y.SERVICE_INJECTED_PROPS,e)||{},r=[];for(var n in t)if(C(t,n)){var o=t[n]||[],i=o.find((function(e){return e.key===y.INJECT}));if(!i||i.value===Object)throw new A(i,e,n);var a=o.reduce((function(e,t){return t.key!==y.INJECT&&(e[t.key]=t.value),e}),{});r.push({key:n,provide:m(i.value),value:a})}return r}},{key:"addProviders",value:function(e){var t=this;e.forEach((function(e){t.addProvider(e)}))}},{key:"addProvider",value:function(e){e.provide?this.providerMap.set(e.provide,e):this.providerMap.set(e,{provide:e,useClass:e})}},{key:"dispose",value:function(){this.providerMap.forEach((function(e){if(e&&e.useCacheValue&&e.useCacheValue.dispose)try{e.useCacheValue.dispose()}catch(t){console.error(t)}})),this.providerMap=null,this.parent=null}}],n&&i(r.prototype,n),u&&i(r,u),e}();exports.CircularDependencyError=_,exports.DECORATOR_KEYS=y,exports.Inject=S,exports.InjectFailedError=A,exports.Injectable=function(){return function(e){Reflect.defineMetadata(y.INJECTABLE,!0,e);var t=Reflect.getMetadata(y.DESIGN_PARAM_TYPES,e)||[];return Reflect.defineMetadata(y.SERVICE_PARAM_TYPES,t,e),e}},exports.Injector=k,exports.Optional=P,exports.ProviderNotValidError=w,exports.SERVICE_STATUS=O,exports.Self=T,exports.Skip=I,exports.TokenNotFoundError=M,exports.createDecorator=R,exports.forwardRef=b,exports.has=C,exports.isForwardRef=N,exports.merge=g,exports.resolveForwardRef=m;
10
+ "use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){h(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&E(e,t)}function c(e){var t=v();return function(){var r,n=d(e);if(t){var o=d(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return s(this,r)}}function s(t,r){if(r&&("object"===e(r)||"function"==typeof r))return r;if(void 0!==r)throw new TypeError("Derived constructors may only return object or undefined");return f(t)}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e){var t="function"==typeof Map?new Map:void 0;return p=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return l(e,arguments,d(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),E(r,e)},p(e)}function l(e,t,r){return l=v()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&E(o,r.prototype),o},l.apply(null,arguments)}function v(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function E(e,t){return E=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},E(e,t)}function d(e){return d=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},d(e)}function h(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}Object.defineProperty(exports,"__esModule",{value:!0});var y={DESIGN_PROPERTY_TYPE:"design:type",DESIGN_PARAM_TYPES:"design:paramtypes",SERVICE_PARAM_TYPES:"service:paramtypes",SERVICE_INJECTED_PARAMS:"service:injected:params",SERVICE_INJECTED_PROPS:"service:injected:props",INJECT:Symbol("inject"),INJECTABLE:Symbol("injectable"),SELF:"self",SKIP_SELF:"skip",OPTIONAL:"optional"},O={INITING:Symbol("initing"),CONSTRUCTED:Symbol("constructed"),MERGED:Symbol("merged")};function R(e,t){return function(r){return function(n,o,i){var a="number"==typeof i,u=a?n:n.constructor,c=a?i:o,s=a?y.SERVICE_INJECTED_PARAMS:y.SERVICE_INJECTED_PROPS,f=Reflect.getMetadata(s,u)||{},p=f[c]||[],l={key:e,value:void 0===r?t:r};a||e===y.INJECT&&void 0===r&&(l.value=Reflect.getMetadata(y.DESIGN_PROPERTY_TYPE,n,o)),p.push(l),f[c]=p,Reflect.defineMetadata(s,f,u)}}}var S=R(y.INJECT),T=R(y.SELF,!0),I=R(y.SKIP_SELF,!0),P=R(y.OPTIONAL,!0);function C(e,t){return e&&Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){for(var r in t)C(t,r)&&(e[r]=t[r]);return e}function b(e){return e.__forward_ref__=b,e}function N(e){return"function"==typeof e&&C(e,"__forward_ref__")&&e.__forward_ref__===b}function m(e){return N(e)?e():e}var _=function(e){u(r,p(Error));var t=c(r);function r(e,n){var o;a(this,r),h(f(o=t.call(this)),"name","CIRCULAR_DEPENDENCY_ERROR"),h(f(o),"message",o.name);for(var i=[e.provide],u=null==n?void 0:n.provider;u&&u.provide;)i.push(u.provide),u=u.parent;var c=i.join(" <-- ");return o.message="CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \n ".concat(c),o}return r}(),A=function(e){u(r,p(Error));var t=c(r);function r(e,n,o,i){var u;return a(this,r),h(f(u=t.call(this)),"name","INJECT_FAILED_ERROR"),h(f(u),"message",u.name),i?e&&e.value===Object?u.message="CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ".concat(o," OF CLASS ").concat(n,"."):i===Object&&(u.message="CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ".concat(o," OF CLASS ").concat(n,".")):e?e.value===Object&&(u.message="CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ".concat(o," OF CLASS ").concat(n,".")):u.message="INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ".concat(o," OF CLASS ").concat(n,"."),u}return r}(),w=function(e){u(r,p(Error));var t=c(r);function r(e){var n;return a(this,r),h(f(n=t.call(this)),"name","PROVIDER_NOT_VALID_ERROR"),h(f(n),"message",n.name),n.message="PROVIDER NOT VALID. ".concat(e),n}return r}(),M=function(e){u(r,p(Error));var t=c(r);function r(e){var n;return a(this,r),h(f(n=t.call(this)),"name","TOKEN_NOT_FOUND_ERROR"),h(f(n),"message",n.name),n.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(e),n}return r}(),j=function(e){return e},k=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1?arguments[1]:void 0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};a(this,e),h(this,"parent",void 0),h(this,"providerMap",new Map),h(this,"beforeCacheHook",void 0),h(this,"mergePropertyHook",void 0),this.parent=r,this.beforeCacheHook=n.beforeCacheHook||j,this.mergePropertyHook=n.mergePropertyHook||g,this.addProviders(t)}var r,n,u;return r=e,n=[{key:"get",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t.skip){if(this.parent)return this.parent.get(e,o(o({},t),{},{skip:!1}));if(!t.optional)throw new M(e)}else if(t.self){if(this.providerMap.has(e)){var r=this.providerMap.get(e);if(r.status===O.INITING)throw new _(r,t);return this.getServiceByProvider(r,t)}if(!this.parent&&"function"==typeof e&&Reflect.getMetadata(y.INJECTABLE,e)){var n=this.getProviderByToken(e);return this.getServiceByProvider(n,t)}if(!t.optional)throw new M(e)}else{if(this.providerMap.has(e)){var i=this.providerMap.get(e);if(i.status===O.INITING)throw new _(i,t);return this.getServiceByProvider(i,t)}if(this.parent)return this.parent.get(e,t);if("function"==typeof e&&Reflect.getMetadata(y.INJECTABLE,e)){var a=this.getProviderByToken(e);return this.getServiceByProvider(a,t)}if(!t.optional)throw new M(e)}}},{key:"getProviderByToken",value:function(e){return this.providerMap.has(e)||this.addProvider(e),this.providerMap.get(e)}},{key:"getServiceByProvider",value:function(e,t){if("useCacheValue"in e)return e.useCacheValue;if("useValue"in e)return this.getServiceUseValueWithProvider(e);if(e.useClass)return this.getServiceUseClassWithProvider(e,t);if(e.useExisting)return this.getServiceUseExistingWithProvider(e,t);if(e.useFactory)return this.getServiceUseFactoryWithProvider(e,t);throw new w(e)}},{key:"getServiceUseValueWithProvider",value:function(e){var t=this.beforeCacheHook(e.useValue);return e.useCacheValue=t,t}},{key:"getServiceUseClassWithProvider",value:function(e,r){e.parent=r.provider,e.status=O.INITING;var n=e.useClass,o=this.getContructorParameters(n,e),i=this.beforeCacheHook(l(n,t(o)));e.useCacheValue=i,e.status=O.CONSTRUCTED;var a=this.getInjectProperties(n,e);return this.mergePropertyHook(i,a),e.status=O.MERGED,e.parent=void 0,i}},{key:"getServiceUseExistingWithProvider",value:function(e,t){e.parent=t.provider,e.status=O.INITING;var r=this.get(e.useExisting,o(o({},t),{},{provider:e}));return e.useCacheValue=r,e.status=O.CONSTRUCTED,e.parent=void 0,r}},{key:"getServiceUseFactoryWithProvider",value:function(e,r){var n=this;e.parent=r.provider,e.status=O.INITING;var o=(e.deps||[]).map((function(t){return n.get(t,{provider:e})})),i=e.useFactory.apply(e,t(o)),a=this.beforeCacheHook(i);return e.useCacheValue=a,e.status=O.CONSTRUCTED,e.parent=void 0,a}},{key:"getContructorParameters",value:function(e,t){var r=this;return this.getContructorParametersMetas(e).map((function(e){return r.get(e.key,o(o({},e.value),{},{provider:t}))}))}},{key:"getContructorParametersMetas",value:function(e){var t=Reflect.getMetadata(y.SERVICE_PARAM_TYPES,e)||[],r=Reflect.getMetadata(y.SERVICE_INJECTED_PARAMS,e)||{};return t.map((function(t,n){var o=r[n]||[],i=o.find((function(e){return e.key===y.INJECT}));if(i&&i.value===Object||!i&&t===Object)throw new A(i,e,n,t);var a=o.reduce((function(e,t){return t.key!==y.INJECT&&(e[t.key]=t.value),e}),{});return{key:m(i&&i.value)||t,value:a}}))}},{key:"getInjectProperties",value:function(e,t){var r=this,n=this.getInjectPropertiesMetas(e),i={};return n.forEach((function(e){var n,a=r.get(e.provide,o(o({},e.value),{},{provider:t}));void 0===a&&null!==(n=e.value)&&void 0!==n&&n.optional||(i[e.key]=a)})),i}},{key:"getInjectPropertiesMetas",value:function(e){var t=Reflect.getMetadata(y.SERVICE_INJECTED_PROPS,e)||{},r=[];for(var n in t)if(C(t,n)){var o=t[n]||[],i=o.find((function(e){return e.key===y.INJECT}));if(!i||i.value===Object)throw new A(i,e,n);var a=o.reduce((function(e,t){return t.key!==y.INJECT&&(e[t.key]=t.value),e}),{});r.push({key:n,provide:m(i.value),value:a})}return r}},{key:"addProviders",value:function(e){var t=this;e.forEach((function(e){t.addProvider(e)}))}},{key:"addProvider",value:function(e){e.provide?this.providerMap.set(e.provide,e):this.providerMap.set(e,{provide:e,useClass:e})}},{key:"dispose",value:function(){this.providerMap.forEach((function(e){if(e&&e.useCacheValue&&e.useCacheValue.dispose)try{e.useCacheValue.dispose()}catch(t){console.error(t)}})),this.providerMap=null,this.parent=null}}],n&&i(r.prototype,n),u&&i(r,u),e}();exports.CircularDependencyError=_,exports.DECORATOR_KEYS=y,exports.Inject=S,exports.InjectFailedError=A,exports.Injectable=function(){return function(e){Reflect.defineMetadata(y.INJECTABLE,!0,e);var t=Reflect.getMetadata(y.DESIGN_PARAM_TYPES,e)||[];return Reflect.defineMetadata(y.SERVICE_PARAM_TYPES,t,e),e}},exports.Injector=k,exports.Optional=P,exports.ProviderNotValidError=w,exports.SERVICE_STATUS=O,exports.Self=T,exports.Skip=I,exports.TokenNotFoundError=M,exports.createDecorator=R,exports.forwardRef=b,exports.has=C,exports.isForwardRef=N,exports.merge=g,exports.resolveForwardRef=m;
11
11
  //# sourceMappingURL=index.cjs.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.min.js","sources":["../src/constants.ts","../src/decorator.ts","../src/utils.ts","../src/forwardRef.ts","../src/errors/CircularDependencyError.ts","../src/errors/InjectFailedError.ts","../src/errors/ProviderNotValidError.ts","../src/errors/TokenNotFoundError.ts","../src/Injector.ts"],"sourcesContent":["export const DECORATOR_KEYS = {\n // ts自带的类的实例属性的类型的key\n DESIGN_PROPERTY_TYPE: 'design:type',\n // ts自带的类的构造函数的参数的类型信息的key\n DESIGN_PARAM_TYPES: 'design:paramtypes',\n // 记录构造函数原始的类型数据的key,其实就是转存了DESIGN_PARAM_TYPES对应的数据\n SERVICE_PARAM_TYPES: 'service:paramtypes',\n // 记录构造函数参数装饰器对应的数据的key\n SERVICE_INJECTED_PARAMS: 'service:injected:params',\n // 记录实例属性装饰器对应的数据的key\n SERVICE_INJECTED_PROPS: 'service:injected:props',\n // Inject装饰器的key\n INJECT: Symbol('inject'),\n // Injectable装饰器的key\n INJECTABLE: Symbol('injectable'),\n // Self装饰器的key\n SELF: 'self',\n // Skip装饰器的key\n SKIP_SELF: 'skip',\n // Optional装饰器的key\n OPTIONAL: 'optional',\n};\n\nexport const SERVICE_STATUS = {\n INITING: Symbol('initing'),\n CONSTRUCTED: Symbol('constructed'),\n MERGED: Symbol('merged'),\n};\n","/**\n * 这里记录不同的装饰器的参数的含义\n *\n * class decorator:\n * 只有一个参数:构造函数\n * property decorator:\n * 静态属性:构造函数, 属性名\n * 实例属性:原型, 属性名\n * parameter decorator:\n * 构造函数参数:构造函数, undefined, 0\n * 普通函数参数:原型, 方法名, 0\n * 静态函数参数:构造函数, 方法名, 0\n * method decorator:\n * 静态方法:构造函数, 方法名, 属性描述符\n * 实例方法:原型, 方法名, 属性描述符\n * accessor decorator:\n * 静态访问器:构造函数, 方法名, 属性描述符\n * 实例访问器:原型, 方法名, 属性描述符\n */\n\nimport { DECORATOR_KEYS } from './constants';\n\n/**\n * 创建装饰器的高阶函数\n * 装饰器的通用逻辑就是通过Reflect记录到全局的Map中\n * 所以可以抽象出一个通用逻辑,这里需要注意对Inject装饰器有特殊判断\n *\n * @param {(string | symbol)} decoratorKey 代表某个装饰器的名称\n * @param {*} [defaultValue] 该装饰器函数的默认参数\n * @return {*} 一个装饰器\n */\nexport function createDecorator(\n decoratorKey: string | symbol,\n defaultValue?: any\n) {\n // 因为装饰器本身作为一个函数是有参数的,此处的decoratorValue就是实际使用装饰器的实参\n return function (decoratorValue?: any) {\n // 目前的装饰器只支持类的构造函数参数装饰器和类的实例属性装饰器\n // target可能是构造函数或者类的原型\n // 如果target是构造函数,targetKey是undefined,index是参数的位置下标\n // 如果target是原型,targetKey是属姓名,index是undefined\n return function (target: any, targetKey: string, index?: number): void {\n // 如果index是number,那么代表是构造函数的参数的装饰器\n const isParameterDecorator = typeof index === 'number';\n // 统一把装饰器数据绑定到构造函数上,后续获取数据比较方便\n const Ctor = isParameterDecorator ? target : target.constructor;\n // 如果是构造函数的参数装饰器,取参数位置下标,否则取实例属性的属性名\n const key = isParameterDecorator ? index : targetKey;\n\n // 区分构造函数的参数装饰器和实例属性的装饰器\n // 分别记录到全局Map的不同位置,metadataKey不一样\n const metadataKey = isParameterDecorator\n ? DECORATOR_KEYS.SERVICE_INJECTED_PARAMS\n : DECORATOR_KEYS.SERVICE_INJECTED_PROPS;\n\n // 这里是一个大对象,对应的key是metadataKey\n // 所以全局Map中有两个不同的metadataKey,以及对应的数据对象\n // 如果是构造函数参数装饰器,这个对象中的key是参数位置下标\n // 如果是实例属性装饰器,这个对象中的key是属性名\n const paramsOrPropertiesMetadata =\n Reflect.getMetadata(metadataKey, Ctor) || {};\n\n // 每个参数或者实例属性都可以有多个装饰器\n // 所以paramsOrPropertiesMetadata这个大对象的每个key对应的value都是一个数组\n // 该数组中的每一个元素是一个对象,保存着每一个装饰器的数据\n const paramOrPropertyMetadata = paramsOrPropertiesMetadata[key] || [];\n\n const metadata = {\n // 装饰器的名称\n key: decoratorKey,\n // 装饰器的值,即装饰器函数的实参\n // 很多装饰器具有默认值,可以不提供实参,而是使用默认值\n value: decoratorValue === void 0 ? defaultValue : decoratorValue,\n };\n\n if (!isParameterDecorator) {\n if (decoratorKey === DECORATOR_KEYS.INJECT) {\n if (decoratorValue === void 0) {\n // 是实例属性装饰器,且是Inject装饰器,且没有指定参数\n // 需要获取默认的类型数据\n metadata.value = Reflect.getMetadata(\n DECORATOR_KEYS.DESIGN_PROPERTY_TYPE,\n target,\n targetKey\n );\n }\n }\n }\n\n // 把当前装饰器的数据对象放到数组中\n paramOrPropertyMetadata.push(metadata);\n // 关联这个数组和对应的key\n paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;\n // 再把整个大对象放到全局Map中\n Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, Ctor);\n };\n };\n}\n\n// 可以使用在类构造函数的参数中和类的实例属性中\nexport const Inject = createDecorator(DECORATOR_KEYS.INJECT);\n\n// 指定只在当前injector中寻找服务\nexport const Self = createDecorator(DECORATOR_KEYS.SELF, true);\n\n// 指定跳过当前injector寻找服务\nexport const Skip = createDecorator(DECORATOR_KEYS.SKIP_SELF, true);\n\n// 指定服务是可选的,找不到服务时返回undefined,否则抛出异常\n// 其实应该说是默认情况下找不到服务时,会抛出异常,除非明确指定是optional的\nexport const Optional = createDecorator(DECORATOR_KEYS.OPTIONAL, true);\n\n/**\n * 表明服务可注入\n * 主要工作就是收集构造函数的参数类型信息\n *\n * @export\n * @return {*}\n */\nexport function Injectable() {\n return function (target: any) {\n // 标记这个类可以注入\n Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target);\n\n // 获取ts编译器默认的类型数据\n // 经过测试,如果是基本类型string、number、boolean,那么会变成相对应的构造函数String,Number,Boolean\n // 如果只是指定了interface类型,那么会变成Object构造函数\n const types =\n Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, target) || [];\n\n // 存储构造函数的类型信息\n // 这里只是转存了一下数据,并没有特殊逻辑\n Reflect.defineMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, types, target);\n\n return target;\n };\n}\n","export function has(obj: any, key: string) {\n return obj && Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function merge(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = source[key];\n }\n }\n return target;\n}\n","import { has } from './utils';\n\nexport interface ForwardRefFn {\n (): any;\n}\n\nexport function forwardRef(fn: ForwardRefFn) {\n (<any>fn).__forward_ref__ = forwardRef;\n return fn;\n}\n\nexport function isForwardRef(fn: any): fn is () => any {\n return (\n typeof fn === 'function' &&\n has(fn, '__forward_ref__') &&\n fn.__forward_ref__ === forwardRef\n );\n}\n\nexport function resolveForwardRef<T>(type: T): T {\n return isForwardRef(type) ? type() : type;\n}\n","export class CircularDependencyError extends Error {\n public name = 'CIRCULAR_DEPENDENCY_ERROR';\n\n public message = this.name;\n\n constructor(provider: any, options: any) {\n super();\n\n const tokenArr = [provider.provide];\n let currentProvider = options?.provider;\n while (currentProvider && currentProvider.provide) {\n tokenArr.push(currentProvider.provide);\n currentProvider = currentProvider.parent;\n }\n const tokenListText = tokenArr.join(' <-- ');\n\n this.message = `CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. ${tokenListText}`;\n }\n}\n","export class InjectFailedError extends Error {\n public name = 'INJECT_FAILED_ERROR';\n public message = this.name;\n\n constructor(\n injectMeta: any,\n ClassName: any,\n key: string | number,\n paramType?: any\n ) {\n super();\n\n if (paramType) {\n // 是构造函数的参数装饰器\n if (injectMeta && injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n } else if (paramType === Object) {\n this.message = `CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n }\n } else {\n // 是属性装饰器\n if (!injectMeta) {\n this.message = `INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ${key} OF CLASS ${ClassName}.`;\n } else if (injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ${key} OF CLASS ${ClassName}.`;\n }\n }\n }\n}\n","export class ProviderNotValidError extends Error {\n public name = 'PROVIDER_NOT_VALID_ERROR';\n public message = this.name;\n\n constructor(provider: any) {\n super();\n\n this.message = `PROVIDER NOT VALID. ${provider}`;\n }\n}\n","export class TokenNotFoundError extends Error {\n public name = 'TOKEN_NOT_FOUND_ERROR';\n public message = this.name;\n\n constructor(token: any) {\n super();\n\n this.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. ${token}`;\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface InjectionKey<T> extends Symbol {}\n\ninterface Meta {\n key: any;\n value: any;\n}\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nimport { SERVICE_STATUS, DECORATOR_KEYS } from './constants';\nimport { merge, has } from './utils';\nimport { resolveForwardRef } from './forwardRef';\n\nimport {\n CircularDependencyError,\n TokenNotFoundError,\n InjectFailedError,\n ProviderNotValidError,\n} from './errors';\n\nconst NOOP = (n: any) => n;\n\n// 第一步:准备构造函数的依赖对象\n// 第二步:通过构造函数来获取服务的实例对象\n// 第三步:补充@Inject注入的实例属性\n// 第四步:执行constructed方法\n\nexport class Injector {\n public parent?: Injector;\n\n public providerMap = new Map<any, any>();\n\n public beforeCacheHook?: any;\n public mergePropertyHook?: any;\n\n constructor(providers: any[] = [], parent?: Injector, options: any = {}) {\n // 引用父级Injector\n this.parent = parent;\n\n // 在把服务实例放到缓存中之前,可以调用这个钩子让服务响应化\n this.beforeCacheHook = options.beforeCacheHook || NOOP;\n\n // 在注入实例属性时,需要把属性merge到服务实例对象上,合并过程需要保持响应式\n this.mergePropertyHook = options.mergePropertyHook || merge;\n\n this.addProviders(providers);\n }\n\n /**\n * 对外暴露的接口 - 获取服务对象\n * @done\n * @param {*} token\n * @param {*} options\n * @return {*} {*}\n * @memberof Injector\n */\n get<T>(token: InjectionKey<T>, options?: any): T;\n get<R, T = unknown>(token: T, options?: any): T extends R ? Ret<T> : Ret<R>;\n get(token: any, options: any = {}): any {\n if (options.skip) {\n if (this.parent) {\n return this.parent.get(token, { ...options, skip: false });\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (options.self) {\n if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (\n !this.parent &&\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n // 如果当前Injector已经是根Injector\n // 就必须要考虑self的限制\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (this.parent) {\n return this.parent.get(token, options);\n } else if (\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n }\n\n /**\n * 如果token对应的provider不存在\n * 那么就创建一个\n * 调用该方法之前需要保证token对应的provider已经存在或者token本身是一个可注入的类\n *\n * @param {*} token\n * @return {*}\n * @memberof Injector\n */\n getProviderByToken(token: any) {\n if (!this.providerMap.has(token)) {\n this.addProvider(token);\n }\n return this.providerMap.get(token);\n }\n\n /**\n * 通过provider直接获取service实例\n * @done\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceByProvider(provider: any, options: any) {\n if ('useCacheValue' in provider) {\n return provider.useCacheValue;\n } else if ('useValue' in provider) {\n return this.getServiceUseValueWithProvider(provider, options);\n } else if (provider.useClass) {\n return this.getServiceUseClassWithProvider(provider, options);\n } else if (provider.useExisting) {\n return this.getServiceUseExistingWithProvider(provider, options);\n } else if (provider.useFactory) {\n return this.getServiceUseFactoryWithProvider(provider, options);\n } else {\n throw new ProviderNotValidError(provider);\n }\n }\n\n /**\n * 通过useValue获取服务实例\n *\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getServiceUseValueWithProvider(provider: any, options: any) {\n const cacheValue = this.beforeCacheHook(provider.useValue);\n provider.useCacheValue = cacheValue;\n return cacheValue;\n }\n\n /**\n * 通过useClass获取服务实例\n * @done\n * @template T\n * @param {new (...args: any[]) => T} ClassName\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseClassWithProvider<T>(provider: any, options: any) {\n provider.parent = options.provider;\n\n provider.status = SERVICE_STATUS.INITING;\n const ClassName = provider.useClass;\n\n const params = this.getContructorParameters(ClassName, provider);\n const cacheValue = this.beforeCacheHook(new ClassName(...params));\n\n provider.useCacheValue = cacheValue;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n const properties = this.getInjectProperties(ClassName, provider);\n this.mergePropertyHook(cacheValue, properties);\n\n provider.status = SERVICE_STATUS.MERGED;\n\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useExisting获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseExistingWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const cacheValue = this.get(provider.useExisting, { ...options, provider });\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useFactory获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseFactoryWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const deps = provider.deps || [];\n const args = deps.map((dep: any) => this.get(dep, { provider }));\n const serviceValue = provider.useFactory(...args);\n const cacheValue = this.beforeCacheHook(serviceValue);\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 获取构造函数的参数-返回数组\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParameters(ClassName: any, provider: any) {\n const params = this.getContructorParametersMetas(ClassName);\n const result = params.map((meta: any) =>\n this.get(meta.key, { ...meta.value, provider })\n );\n return result;\n }\n\n /**\n * 获取构造函数的参数的装饰器元数据\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParametersMetas(ClassName: any) {\n // 构造函数的参数的类型数据-原始数据-是一个数组\n const params =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, ClassName) || [];\n // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) ||\n {};\n return params.map((paramType: any, index: any) => {\n // 查找当前index对应的参数有没有使用装饰器\n const propertyMetadatas: any[] = propertiesMetadatas[index] || [];\n // 查找装饰器列表中有没有@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n meta => meta.key === DECORATOR_KEYS.INJECT\n );\n if (\n (injectMeta && injectMeta.value === Object) ||\n (!injectMeta && paramType === Object)\n ) {\n // 构造函数的参数可以不使用@Inject,但是一定不能是interface\n throw new InjectFailedError(injectMeta, ClassName, index, paramType);\n }\n // 把装饰器列表收集为对象,并且排除掉@Inject\n const options = propertyMetadatas.reduce((acc, meta) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n return {\n key: resolveForwardRef(injectMeta && injectMeta.value) || paramType,\n value: options,\n };\n });\n }\n\n /**\n * 获取注入的实例属性-返回对象\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectProperties(ClassName: any, provider: any) {\n const metas = this.getInjectPropertiesMetas(ClassName);\n\n const properties = {} as any;\n\n metas.forEach((meta: any) => {\n const property = this.get(meta.provide, { ...meta.value, provider });\n if (!(property === void 0 && meta.value?.optional)) {\n properties[meta.key] = property;\n }\n });\n\n return properties;\n }\n\n /**\n * 获取注入属性的装饰器数据\n * @done\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectPropertiesMetas(ClassName: any) {\n // 获取注入属性的metas-类型是Recors<string, Array>\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PROPS, ClassName) ||\n {};\n const propertiesMetas: any = [];\n for (const key in propertiesMetadatas) {\n if (has(propertiesMetadatas, key)) {\n // 当前key属性对应的所有的装饰器\n const propertyMetadatas = propertiesMetadatas[key] || [];\n // 当前key属性对应的@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n (meta: any) => meta.key === DECORATOR_KEYS.INJECT\n );\n if (!injectMeta || injectMeta.value === Object) {\n // 属性一定要手动指定@Inject\n throw new InjectFailedError(injectMeta, ClassName, key);\n }\n const options = propertyMetadatas.reduce((acc: any, meta: any) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n\n propertiesMetas.push({\n key,\n provide: resolveForwardRef(injectMeta.value),\n value: options,\n });\n }\n }\n return propertiesMetas;\n }\n\n /**\n * 把providers数组转换成map,避免后续的遍历\n * @done\n * @param {any[]} providers\n * @memberof Injector\n */\n addProviders(providers: any[]) {\n providers.forEach(provider => {\n this.addProvider(provider);\n });\n }\n\n /**\n * 添加新的provider\n * @done\n * @param {*} provider\n * @memberof Injector\n */\n addProvider(provider: any) {\n if (provider.provide) {\n this.providerMap.set(provider.provide, provider);\n } else {\n this.providerMap.set(provider, {\n provide: provider,\n useClass: provider,\n });\n }\n }\n\n /**\n * 释放当前Injector中的所有服务实例\n *\n * @memberof Injector\n */\n dispose() {\n this.providerMap.forEach(value => {\n if (value && value.useCacheValue && value.useCacheValue.dispose) {\n try {\n value.useCacheValue.dispose();\n } catch (error) {\n console.error(error);\n }\n }\n });\n this.providerMap = null as any;\n this.parent = null as any;\n }\n}\n"],"names":["DECORATOR_KEYS","DESIGN_PROPERTY_TYPE","DESIGN_PARAM_TYPES","SERVICE_PARAM_TYPES","SERVICE_INJECTED_PARAMS","SERVICE_INJECTED_PROPS","INJECT","Symbol","INJECTABLE","SELF","SKIP_SELF","OPTIONAL","SERVICE_STATUS","INITING","CONSTRUCTED","MERGED","createDecorator","decoratorKey","defaultValue","decoratorValue","target","targetKey","index","isParameterDecorator","Ctor","constructor","key","metadataKey","paramsOrPropertiesMetadata","Reflect","getMetadata","paramOrPropertyMetadata","metadata","value","push","defineMetadata","Inject","Self","Skip","Optional","has","obj","Object","prototype","hasOwnProperty","call","merge","source","forwardRef","fn","__forward_ref__","isForwardRef","resolveForwardRef","type","CircularDependencyError","Error","provider","options","_this","name","tokenArr","provide","currentProvider","parent","tokenListText","join","message","InjectFailedError","injectMeta","ClassName","paramType","_this2","ProviderNotValidError","_this3","TokenNotFoundError","token","_this4","NOOP","n","Injector","providers","Map","beforeCacheHook","mergePropertyHook","addProviders","skip","this","get","optional","self","providerMap","status","getServiceByProvider","getProviderByToken","addProvider","useCacheValue","getServiceUseValueWithProvider","useClass","getServiceUseClassWithProvider","useExisting","getServiceUseExistingWithProvider","useFactory","getServiceUseFactoryWithProvider","cacheValue","useValue","params","getContructorParameters","properties","getInjectProperties","args","deps","map","dep","_this5","serviceValue","getContructorParametersMetas","meta","_this6","propertiesMetadatas","propertyMetadatas","find","reduce","acc","metas","getInjectPropertiesMetas","forEach","property","_this7","_meta$value","propertiesMetas","_this8","set","dispose","error","console","types"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.min.js","sources":["../src/constants.ts","../src/decorator.ts","../src/utils.ts","../src/forwardRef.ts","../src/errors/CircularDependencyError.ts","../src/errors/InjectFailedError.ts","../src/errors/ProviderNotValidError.ts","../src/errors/TokenNotFoundError.ts","../src/Injector.ts"],"sourcesContent":["export const DECORATOR_KEYS = {\n // ts自带的类的实例属性的类型的key\n DESIGN_PROPERTY_TYPE: 'design:type',\n // ts自带的类的构造函数的参数的类型信息的key\n DESIGN_PARAM_TYPES: 'design:paramtypes',\n // 记录构造函数原始的类型数据的key,其实就是转存了DESIGN_PARAM_TYPES对应的数据\n SERVICE_PARAM_TYPES: 'service:paramtypes',\n // 记录构造函数参数装饰器对应的数据的key\n SERVICE_INJECTED_PARAMS: 'service:injected:params',\n // 记录实例属性装饰器对应的数据的key\n SERVICE_INJECTED_PROPS: 'service:injected:props',\n // Inject装饰器的key\n INJECT: Symbol('inject'),\n // Injectable装饰器的key\n INJECTABLE: Symbol('injectable'),\n // Self装饰器的key\n SELF: 'self',\n // Skip装饰器的key\n SKIP_SELF: 'skip',\n // Optional装饰器的key\n OPTIONAL: 'optional',\n};\n\nexport const SERVICE_STATUS = {\n INITING: Symbol('initing'),\n CONSTRUCTED: Symbol('constructed'),\n MERGED: Symbol('merged'),\n};\n","/**\n * 这里记录不同的装饰器的参数的含义\n *\n * class decorator:\n * 只有一个参数:构造函数\n * property decorator:\n * 静态属性:构造函数, 属性名\n * 实例属性:原型, 属性名\n * parameter decorator:\n * 构造函数参数:构造函数, undefined, 0\n * 普通函数参数:原型, 方法名, 0\n * 静态函数参数:构造函数, 方法名, 0\n * method decorator:\n * 静态方法:构造函数, 方法名, 属性描述符\n * 实例方法:原型, 方法名, 属性描述符\n * accessor decorator:\n * 静态访问器:构造函数, 方法名, 属性描述符\n * 实例访问器:原型, 方法名, 属性描述符\n */\n\nimport { DECORATOR_KEYS } from './constants';\n\n/**\n * 创建装饰器的高阶函数\n * 装饰器的通用逻辑就是通过Reflect记录到全局的Map中\n * 所以可以抽象出一个通用逻辑,这里需要注意对Inject装饰器有特殊判断\n *\n * @param {(string | symbol)} decoratorKey 代表某个装饰器的名称\n * @param {*} [defaultValue] 该装饰器函数的默认参数\n * @return {*} 一个装饰器\n */\nexport function createDecorator(\n decoratorKey: string | symbol,\n defaultValue?: any\n) {\n // 因为装饰器本身作为一个函数是有参数的,此处的decoratorValue就是实际使用装饰器的实参\n return function (decoratorValue?: any) {\n // 目前的装饰器只支持类的构造函数参数装饰器和类的实例属性装饰器\n // target可能是构造函数或者类的原型\n // 如果target是构造函数,targetKey是undefined,index是参数的位置下标\n // 如果target是原型,targetKey是属姓名,index是undefined\n return function (target: any, targetKey: string, index?: number): void {\n // 如果index是number,那么代表是构造函数的参数的装饰器\n const isParameterDecorator = typeof index === 'number';\n // 统一把装饰器数据绑定到构造函数上,后续获取数据比较方便\n const Ctor = isParameterDecorator ? target : target.constructor;\n // 如果是构造函数的参数装饰器,取参数位置下标,否则取实例属性的属性名\n const key = isParameterDecorator ? index : targetKey;\n\n // 区分构造函数的参数装饰器和实例属性的装饰器\n // 分别记录到全局Map的不同位置,metadataKey不一样\n const metadataKey = isParameterDecorator\n ? DECORATOR_KEYS.SERVICE_INJECTED_PARAMS\n : DECORATOR_KEYS.SERVICE_INJECTED_PROPS;\n\n // 这里是一个大对象,对应的key是metadataKey\n // 所以全局Map中有两个不同的metadataKey,以及对应的数据对象\n // 如果是构造函数参数装饰器,这个对象中的key是参数位置下标\n // 如果是实例属性装饰器,这个对象中的key是属性名\n const paramsOrPropertiesMetadata =\n Reflect.getMetadata(metadataKey, Ctor) || {};\n\n // 每个参数或者实例属性都可以有多个装饰器\n // 所以paramsOrPropertiesMetadata这个大对象的每个key对应的value都是一个数组\n // 该数组中的每一个元素是一个对象,保存着每一个装饰器的数据\n const paramOrPropertyMetadata = paramsOrPropertiesMetadata[key] || [];\n\n const metadata = {\n // 装饰器的名称\n key: decoratorKey,\n // 装饰器的值,即装饰器函数的实参\n // 很多装饰器具有默认值,可以不提供实参,而是使用默认值\n value: decoratorValue === void 0 ? defaultValue : decoratorValue,\n };\n\n if (!isParameterDecorator) {\n if (decoratorKey === DECORATOR_KEYS.INJECT) {\n if (decoratorValue === void 0) {\n // 是实例属性装饰器,且是Inject装饰器,且没有指定参数\n // 需要获取默认的类型数据\n metadata.value = Reflect.getMetadata(\n DECORATOR_KEYS.DESIGN_PROPERTY_TYPE,\n target,\n targetKey\n );\n }\n }\n }\n\n // 把当前装饰器的数据对象放到数组中\n paramOrPropertyMetadata.push(metadata);\n // 关联这个数组和对应的key\n paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;\n // 再把整个大对象放到全局Map中\n Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, Ctor);\n };\n };\n}\n\n// 可以使用在类构造函数的参数中和类的实例属性中\nexport const Inject = createDecorator(DECORATOR_KEYS.INJECT);\n\n// 指定只在当前injector中寻找服务\nexport const Self = createDecorator(DECORATOR_KEYS.SELF, true);\n\n// 指定跳过当前injector寻找服务\nexport const Skip = createDecorator(DECORATOR_KEYS.SKIP_SELF, true);\n\n// 指定服务是可选的,找不到服务时返回undefined,否则抛出异常\n// 其实应该说是默认情况下找不到服务时,会抛出异常,除非明确指定是optional的\nexport const Optional = createDecorator(DECORATOR_KEYS.OPTIONAL, true);\n\n/**\n * 表明服务可注入\n * 主要工作就是收集构造函数的参数类型信息\n *\n * @export\n * @return {*}\n */\nexport function Injectable() {\n return function (target: any) {\n // 标记这个类可以注入\n Reflect.defineMetadata(DECORATOR_KEYS.INJECTABLE, true, target);\n\n // 获取ts编译器默认的类型数据\n // 经过测试,如果是基本类型string、number、boolean,那么会变成相对应的构造函数String,Number,Boolean\n // 如果只是指定了interface类型,那么会变成Object构造函数\n const types =\n Reflect.getMetadata(DECORATOR_KEYS.DESIGN_PARAM_TYPES, target) || [];\n\n // 存储构造函数的类型信息\n // 这里只是转存了一下数据,并没有特殊逻辑\n Reflect.defineMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, types, target);\n\n return target;\n };\n}\n","export function has(obj: any, key: string) {\n return obj && Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function merge(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = source[key];\n }\n }\n return target;\n}\n","import { has } from './utils';\n\nexport interface ForwardRefFn {\n (): any;\n}\n\nexport function forwardRef(fn: ForwardRefFn) {\n (<any>fn).__forward_ref__ = forwardRef;\n return fn;\n}\n\nexport function isForwardRef(fn: any): fn is () => any {\n return (\n typeof fn === 'function' &&\n has(fn, '__forward_ref__') &&\n fn.__forward_ref__ === forwardRef\n );\n}\n\nexport function resolveForwardRef<T>(type: T): T {\n return isForwardRef(type) ? type() : type;\n}\n","export class CircularDependencyError extends Error {\n public name = 'CIRCULAR_DEPENDENCY_ERROR';\n\n public message = this.name;\n\n constructor(provider: any, options: any) {\n super();\n\n const tokenArr = [provider.provide];\n let currentProvider = options?.provider;\n while (currentProvider && currentProvider.provide) {\n tokenArr.push(currentProvider.provide);\n currentProvider = currentProvider.parent;\n }\n const tokenListText = tokenArr.join(' <-- ');\n\n this.message = `CIRCULAR DEPENDENCY DETECTED. PLEASE FIX IT MANUALLY. \\n ${tokenListText}`;\n }\n}\n","export class InjectFailedError extends Error {\n public name = 'INJECT_FAILED_ERROR';\n public message = this.name;\n\n constructor(\n injectMeta: any,\n ClassName: any,\n key: string | number,\n paramType?: any\n ) {\n super();\n\n if (paramType) {\n // 是构造函数的参数装饰器\n if (injectMeta && injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n } else if (paramType === Object) {\n this.message = `CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`;\n }\n } else {\n // 是属性装饰器\n if (!injectMeta) {\n this.message = `INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ${key} OF CLASS ${ClassName}.`;\n } else if (injectMeta.value === Object) {\n this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ${key} OF CLASS ${ClassName}.`;\n }\n }\n }\n}\n","export class ProviderNotValidError extends Error {\n public name = 'PROVIDER_NOT_VALID_ERROR';\n public message = this.name;\n\n constructor(provider: any) {\n super();\n\n this.message = `PROVIDER NOT VALID. ${provider}`;\n }\n}\n","export class TokenNotFoundError extends Error {\n public name = 'TOKEN_NOT_FOUND_ERROR';\n public message = this.name;\n\n constructor(token: any) {\n super();\n\n this.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. ${token}`;\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface InjectionKey<T> extends Symbol {}\n\ninterface Meta {\n key: any;\n value: any;\n}\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nimport { SERVICE_STATUS, DECORATOR_KEYS } from './constants';\nimport { merge, has } from './utils';\nimport { resolveForwardRef } from './forwardRef';\n\nimport {\n CircularDependencyError,\n TokenNotFoundError,\n InjectFailedError,\n ProviderNotValidError,\n} from './errors';\n\nconst NOOP = (n: any) => n;\n\n// 第一步:准备构造函数的依赖对象\n// 第二步:通过构造函数来获取服务的实例对象\n// 第三步:补充@Inject注入的实例属性\n// 第四步:执行constructed方法\n\nexport class Injector {\n public parent?: Injector;\n\n public providerMap = new Map<any, any>();\n\n public beforeCacheHook?: any;\n public mergePropertyHook?: any;\n\n constructor(providers: any[] = [], parent?: Injector, options: any = {}) {\n // 引用父级Injector\n this.parent = parent;\n\n // 在把服务实例放到缓存中之前,可以调用这个钩子让服务响应化\n this.beforeCacheHook = options.beforeCacheHook || NOOP;\n\n // 在注入实例属性时,需要把属性merge到服务实例对象上,合并过程需要保持响应式\n this.mergePropertyHook = options.mergePropertyHook || merge;\n\n this.addProviders(providers);\n }\n\n /**\n * 对外暴露的接口 - 获取服务对象\n *\n * @param {*} token\n * @param {*} options\n * @return {*} {*}\n * @memberof Injector\n */\n get<T>(token: InjectionKey<T>, options?: any): T;\n get<R, T = unknown>(token: T, options?: any): T extends R ? Ret<T> : Ret<R>;\n get(token: any, options: any = {}): any {\n if (options.skip) {\n if (this.parent) {\n return this.parent.get(token, { ...options, skip: false });\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (options.self) {\n if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (\n !this.parent &&\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n // 如果当前Injector已经是根Injector\n // 就必须要考虑self的限制\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n } else if (this.providerMap.has(token)) {\n const provider = this.providerMap.get(token);\n if (provider.status === SERVICE_STATUS.INITING) {\n throw new CircularDependencyError(provider, options);\n }\n return this.getServiceByProvider(provider, options);\n } else if (this.parent) {\n return this.parent.get(token, options);\n } else if (\n typeof token === 'function' &&\n Reflect.getMetadata(DECORATOR_KEYS.INJECTABLE, token)\n ) {\n const provider = this.getProviderByToken(token);\n return this.getServiceByProvider(provider, options);\n } else {\n if (!options.optional) {\n throw new TokenNotFoundError(token);\n }\n }\n }\n\n /**\n * 如果token对应的provider不存在\n * 那么就创建一个\n * 调用该方法之前需要保证token对应的provider已经存在或者token本身是一个可注入的类\n *\n * @param {*} token\n * @return {*}\n * @memberof Injector\n */\n getProviderByToken(token: any) {\n if (!this.providerMap.has(token)) {\n this.addProvider(token);\n }\n return this.providerMap.get(token);\n }\n\n /**\n * 通过provider直接获取service实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceByProvider(provider: any, options: any) {\n if ('useCacheValue' in provider) {\n return provider.useCacheValue;\n } else if ('useValue' in provider) {\n return this.getServiceUseValueWithProvider(provider);\n } else if (provider.useClass) {\n return this.getServiceUseClassWithProvider(provider, options);\n } else if (provider.useExisting) {\n return this.getServiceUseExistingWithProvider(provider, options);\n } else if (provider.useFactory) {\n return this.getServiceUseFactoryWithProvider(provider, options);\n } else {\n throw new ProviderNotValidError(provider);\n }\n }\n\n /**\n * 通过useValue获取服务实例\n *\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getServiceUseValueWithProvider(provider: any) {\n const cacheValue = this.beforeCacheHook(provider.useValue);\n provider.useCacheValue = cacheValue;\n return cacheValue;\n }\n\n /**\n * 通过useClass获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseClassWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n\n provider.status = SERVICE_STATUS.INITING;\n const ClassName = provider.useClass;\n\n const params = this.getContructorParameters(ClassName, provider);\n const cacheValue = this.beforeCacheHook(new ClassName(...params));\n\n provider.useCacheValue = cacheValue;\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n\n const properties = this.getInjectProperties(ClassName, provider);\n this.mergePropertyHook(cacheValue, properties);\n\n provider.status = SERVICE_STATUS.MERGED;\n\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useExisting获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseExistingWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const cacheValue = this.get(provider.useExisting, { ...options, provider });\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 通过useFactory获取服务实例\n *\n * @param {*} provider\n * @param {*} options\n * @return {*}\n * @memberof Injector\n */\n getServiceUseFactoryWithProvider(provider: any, options: any) {\n provider.parent = options.provider;\n provider.status = SERVICE_STATUS.INITING;\n\n const deps = provider.deps || [];\n const args = deps.map((dep: any) => this.get(dep, { provider }));\n const serviceValue = provider.useFactory(...args);\n const cacheValue = this.beforeCacheHook(serviceValue);\n provider.useCacheValue = cacheValue;\n\n provider.status = SERVICE_STATUS.CONSTRUCTED;\n provider.parent = void 0;\n\n return cacheValue;\n }\n\n /**\n * 获取构造函数的参数-返回数组\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getContructorParameters(ClassName: any, provider: any) {\n const params = this.getContructorParametersMetas(ClassName);\n const result = params.map((meta: any) =>\n this.get(meta.key, { ...meta.value, provider })\n );\n return result;\n }\n\n /**\n * 获取构造函数的参数的装饰器元数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getContructorParametersMetas(ClassName: any) {\n // 构造函数的参数的类型数据-原始数据-是一个数组\n const params =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_PARAM_TYPES, ClassName) || [];\n // 构造函数的参数的类型数据-通过@Inject等装饰器实现-是一个对象-key是数字-对应第几个参数的类型数据\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PARAMS, ClassName) ||\n {};\n return params.map((paramType: any, index: any) => {\n // 查找当前index对应的参数有没有使用装饰器\n const propertyMetadatas: any[] = propertiesMetadatas[index] || [];\n // 查找装饰器列表中有没有@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n meta => meta.key === DECORATOR_KEYS.INJECT\n );\n if (\n (injectMeta && injectMeta.value === Object) ||\n (!injectMeta && paramType === Object)\n ) {\n // 构造函数的参数可以不使用@Inject,但是一定不能是interface\n throw new InjectFailedError(injectMeta, ClassName, index, paramType);\n }\n // 把装饰器列表收集为对象,并且排除掉@Inject\n const options = propertyMetadatas.reduce((acc, meta) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n return {\n key: resolveForwardRef(injectMeta && injectMeta.value) || paramType,\n value: options,\n };\n });\n }\n\n /**\n * 获取注入的实例属性-返回对象\n *\n * @param {*} ClassName\n * @param {*} provider\n * @return {*}\n * @memberof Injector\n */\n getInjectProperties(ClassName: any, provider: any) {\n const metas = this.getInjectPropertiesMetas(ClassName);\n\n const properties = {} as any;\n\n metas.forEach((meta: any) => {\n const property = this.get(meta.provide, { ...meta.value, provider });\n if (!(property === void 0 && meta.value?.optional)) {\n properties[meta.key] = property;\n }\n });\n\n return properties;\n }\n\n /**\n * 获取注入属性的装饰器数据\n *\n * @param {*} ClassName\n * @return {*}\n * @memberof Injector\n */\n getInjectPropertiesMetas(ClassName: any) {\n // 获取注入属性的metas-类型是Recors<string, Array>\n const propertiesMetadatas =\n Reflect.getMetadata(DECORATOR_KEYS.SERVICE_INJECTED_PROPS, ClassName) ||\n {};\n const propertiesMetas: any = [];\n for (const key in propertiesMetadatas) {\n if (has(propertiesMetadatas, key)) {\n // 当前key属性对应的所有的装饰器\n const propertyMetadatas = propertiesMetadatas[key] || [];\n // 当前key属性对应的@Inject装饰器的数据\n const injectMeta = propertyMetadatas.find(\n (meta: any) => meta.key === DECORATOR_KEYS.INJECT\n );\n if (!injectMeta || injectMeta.value === Object) {\n // 属性一定要手动指定@Inject\n throw new InjectFailedError(injectMeta, ClassName, key);\n }\n const options = propertyMetadatas.reduce((acc: any, meta: any) => {\n if (meta.key !== DECORATOR_KEYS.INJECT) {\n acc[meta.key] = meta.value;\n }\n return acc;\n }, {} as any);\n\n propertiesMetas.push({\n key,\n provide: resolveForwardRef(injectMeta.value),\n value: options,\n });\n }\n }\n return propertiesMetas;\n }\n\n /**\n * 把providers数组转换成map,避免后续的遍历\n *\n * @param {any[]} providers\n * @memberof Injector\n */\n addProviders(providers: any[]) {\n providers.forEach(provider => {\n this.addProvider(provider);\n });\n }\n\n /**\n * 添加新的provider\n *\n * @param {*} provider\n * @memberof Injector\n */\n addProvider(provider: any) {\n if (provider.provide) {\n this.providerMap.set(provider.provide, provider);\n } else {\n this.providerMap.set(provider, {\n provide: provider,\n useClass: provider,\n });\n }\n }\n\n /**\n * 释放当前Injector中的所有服务实例\n *\n * @memberof Injector\n */\n dispose() {\n this.providerMap.forEach(value => {\n if (value && value.useCacheValue && value.useCacheValue.dispose) {\n try {\n value.useCacheValue.dispose();\n } catch (error) {\n console.error(error);\n }\n }\n });\n this.providerMap = null as any;\n this.parent = null as any;\n }\n}\n"],"names":["DECORATOR_KEYS","DESIGN_PROPERTY_TYPE","DESIGN_PARAM_TYPES","SERVICE_PARAM_TYPES","SERVICE_INJECTED_PARAMS","SERVICE_INJECTED_PROPS","INJECT","Symbol","INJECTABLE","SELF","SKIP_SELF","OPTIONAL","SERVICE_STATUS","INITING","CONSTRUCTED","MERGED","createDecorator","decoratorKey","defaultValue","decoratorValue","target","targetKey","index","isParameterDecorator","Ctor","constructor","key","metadataKey","paramsOrPropertiesMetadata","Reflect","getMetadata","paramOrPropertyMetadata","metadata","value","push","defineMetadata","Inject","Self","Skip","Optional","has","obj","Object","prototype","hasOwnProperty","call","merge","source","forwardRef","fn","__forward_ref__","isForwardRef","resolveForwardRef","type","CircularDependencyError","Error","provider","options","_this","name","tokenArr","provide","currentProvider","parent","tokenListText","join","message","InjectFailedError","injectMeta","ClassName","paramType","_this2","ProviderNotValidError","_this3","TokenNotFoundError","token","_this4","NOOP","n","Injector","providers","Map","beforeCacheHook","mergePropertyHook","addProviders","skip","this","get","optional","self","providerMap","status","getServiceByProvider","getProviderByToken","addProvider","useCacheValue","getServiceUseValueWithProvider","useClass","getServiceUseClassWithProvider","useExisting","getServiceUseExistingWithProvider","useFactory","getServiceUseFactoryWithProvider","cacheValue","useValue","params","getContructorParameters","properties","getInjectProperties","args","deps","map","dep","_this5","serviceValue","getContructorParametersMetas","meta","_this6","propertiesMetadatas","propertyMetadatas","find","reduce","acc","metas","getInjectPropertiesMetas","forEach","property","_this7","_meta$value","propertiesMetas","_this8","set","dispose","error","console","types"],"mappings":"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"}