@kaokei/di 5.0.7 → 5.0.8
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/dist/cachemap.d.cts +11 -29
- package/dist/cachemap.d.ts +11 -29
- package/dist/container.d.cts +2 -1
- package/dist/container.d.ts +2 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +130 -125
- package/package.json +1 -1
package/dist/cachemap.d.cts
CHANGED
|
@@ -1,40 +1,22 @@
|
|
|
1
|
-
import { CommonToken
|
|
1
|
+
import { CommonToken } from './interfaces';
|
|
2
2
|
/**
|
|
3
|
-
* 关联 target 和 metadata
|
|
4
|
-
*
|
|
3
|
+
* 关联 target 和 metadata 对象(由 @Injectable / decorate() 调用)
|
|
4
|
+
* 存储 context.metadata 引用,后续读取均通过此映射完成。
|
|
5
5
|
*/
|
|
6
6
|
export declare function defineMetadata(target: CommonToken, metadata: Record<string, unknown>): void;
|
|
7
7
|
/**
|
|
8
|
-
* 获取
|
|
9
|
-
*
|
|
10
|
-
* 如果 target 在 map 中注册了(使用了 @Injectable),
|
|
11
|
-
* 直接读取 metadata[key],原型链自动处理继承。
|
|
12
|
-
* 如果 target 未注册但有父类,递归向上查找。
|
|
8
|
+
* 获取 target 自身的元数据值(不沿继承链查找)
|
|
9
|
+
* 对应 Reflect.getOwnMetadata(key, target)
|
|
13
10
|
*/
|
|
14
|
-
export declare function
|
|
15
|
-
key: string;
|
|
16
|
-
value?: PostConstructParam;
|
|
17
|
-
} | undefined;
|
|
11
|
+
export declare function getOwnMetadata(key: string, target: CommonToken): unknown;
|
|
18
12
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* 与 getPostConstruct 同理。
|
|
13
|
+
* 获取元数据值,沿继承链向上查找直到找到为止
|
|
14
|
+
* 对应 Reflect.getMetadata(key, target)
|
|
22
15
|
*/
|
|
23
|
-
export declare function
|
|
24
|
-
key: string;
|
|
25
|
-
} | undefined;
|
|
16
|
+
export declare function getMetadata(key: string, target: CommonToken): unknown;
|
|
26
17
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* context.metadata 的原型链继承只对第一层属性有效。
|
|
30
|
-
* INJECTED_PROPS 对应的值是一个嵌套对象 { propName: { inject, self, ... } },
|
|
31
|
-
* 原型链无法自动合并嵌套属性。
|
|
32
|
-
*
|
|
33
|
-
* 例如:父类有 { a: {...}, b: {...} },子类有 { a: {...} }
|
|
34
|
-
* 通过原型链读取子类的 INJECTED_PROPS 只能拿到子类自己的 { a: {...} },
|
|
35
|
-
* 无法自动合并父类的 b 属性。
|
|
18
|
+
* 获取属性注入元数据,手动合并继承链(原型链无法自动合并嵌套对象)
|
|
36
19
|
*
|
|
37
|
-
*
|
|
38
|
-
* 子类同名属性覆盖父类。
|
|
20
|
+
* 父类 { a, b } + 子类 { a } → 合并结果 { a(子类覆盖), b(继承) }
|
|
39
21
|
*/
|
|
40
22
|
export declare function getInjectedProps(target: CommonToken): Record<string, Record<string, unknown>> | undefined;
|
package/dist/cachemap.d.ts
CHANGED
|
@@ -1,40 +1,22 @@
|
|
|
1
|
-
import { CommonToken
|
|
1
|
+
import { CommonToken } from './interfaces';
|
|
2
2
|
/**
|
|
3
|
-
* 关联 target 和 metadata
|
|
4
|
-
*
|
|
3
|
+
* 关联 target 和 metadata 对象(由 @Injectable / decorate() 调用)
|
|
4
|
+
* 存储 context.metadata 引用,后续读取均通过此映射完成。
|
|
5
5
|
*/
|
|
6
6
|
export declare function defineMetadata(target: CommonToken, metadata: Record<string, unknown>): void;
|
|
7
7
|
/**
|
|
8
|
-
* 获取
|
|
9
|
-
*
|
|
10
|
-
* 如果 target 在 map 中注册了(使用了 @Injectable),
|
|
11
|
-
* 直接读取 metadata[key],原型链自动处理继承。
|
|
12
|
-
* 如果 target 未注册但有父类,递归向上查找。
|
|
8
|
+
* 获取 target 自身的元数据值(不沿继承链查找)
|
|
9
|
+
* 对应 Reflect.getOwnMetadata(key, target)
|
|
13
10
|
*/
|
|
14
|
-
export declare function
|
|
15
|
-
key: string;
|
|
16
|
-
value?: PostConstructParam;
|
|
17
|
-
} | undefined;
|
|
11
|
+
export declare function getOwnMetadata(key: string, target: CommonToken): unknown;
|
|
18
12
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* 与 getPostConstruct 同理。
|
|
13
|
+
* 获取元数据值,沿继承链向上查找直到找到为止
|
|
14
|
+
* 对应 Reflect.getMetadata(key, target)
|
|
22
15
|
*/
|
|
23
|
-
export declare function
|
|
24
|
-
key: string;
|
|
25
|
-
} | undefined;
|
|
16
|
+
export declare function getMetadata(key: string, target: CommonToken): unknown;
|
|
26
17
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* context.metadata 的原型链继承只对第一层属性有效。
|
|
30
|
-
* INJECTED_PROPS 对应的值是一个嵌套对象 { propName: { inject, self, ... } },
|
|
31
|
-
* 原型链无法自动合并嵌套属性。
|
|
32
|
-
*
|
|
33
|
-
* 例如:父类有 { a: {...}, b: {...} },子类有 { a: {...} }
|
|
34
|
-
* 通过原型链读取子类的 INJECTED_PROPS 只能拿到子类自己的 { a: {...} },
|
|
35
|
-
* 无法自动合并父类的 b 属性。
|
|
18
|
+
* 获取属性注入元数据,手动合并继承链(原型链无法自动合并嵌套对象)
|
|
36
19
|
*
|
|
37
|
-
*
|
|
38
|
-
* 子类同名属性覆盖父类。
|
|
20
|
+
* 父类 { a, b } + 子类 { a } → 合并结果 { a(子类覆盖), b(继承) }
|
|
39
21
|
*/
|
|
40
22
|
export declare function getInjectedProps(target: CommonToken): Record<string, Record<string, unknown>> | undefined;
|
package/dist/container.d.cts
CHANGED
|
@@ -4,7 +4,7 @@ export declare class Container {
|
|
|
4
4
|
static _instanceContainerMap: WeakMap<object, Container>;
|
|
5
5
|
static getContainerOf(instance: object): Container | undefined;
|
|
6
6
|
parent?: Container;
|
|
7
|
-
|
|
7
|
+
_children?: Set<Container>;
|
|
8
8
|
_bindings: Map<CommonToken, Binding>;
|
|
9
9
|
_destroyed: boolean;
|
|
10
10
|
_onActivationHandler?: ActivationHandler;
|
|
@@ -17,6 +17,7 @@ export declare class Container {
|
|
|
17
17
|
isCurrentBound<T>(token: CommonToken<T>): boolean;
|
|
18
18
|
isBound<T>(token: CommonToken<T>): boolean;
|
|
19
19
|
createChild(): Container;
|
|
20
|
+
getChildren(): Set<Container> | undefined;
|
|
20
21
|
destroy(): void;
|
|
21
22
|
get<T>(token: CommonToken<T>, options: GetOptions & {
|
|
22
23
|
optional: true;
|
package/dist/container.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare class Container {
|
|
|
4
4
|
static _instanceContainerMap: WeakMap<object, Container>;
|
|
5
5
|
static getContainerOf(instance: object): Container | undefined;
|
|
6
6
|
parent?: Container;
|
|
7
|
-
|
|
7
|
+
_children?: Set<Container>;
|
|
8
8
|
_bindings: Map<CommonToken, Binding>;
|
|
9
9
|
_destroyed: boolean;
|
|
10
10
|
_onActivationHandler?: ActivationHandler;
|
|
@@ -17,6 +17,7 @@ export declare class Container {
|
|
|
17
17
|
isCurrentBound<T>(token: CommonToken<T>): boolean;
|
|
18
18
|
isBound<T>(token: CommonToken<T>): boolean;
|
|
19
19
|
createChild(): Container;
|
|
20
|
+
getChildren(): Set<Container> | undefined;
|
|
20
21
|
destroy(): void;
|
|
21
22
|
get<T>(token: CommonToken<T>, options: GetOptions & {
|
|
22
23
|
optional: true;
|
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`+i.map(
|
|
3
|
-
`))}}}class
|
|
1
|
+
"use strict";var U=Object.defineProperty;var W=(n,t,e)=>t in n?U(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var s=(n,t,e)=>W(n,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l={INJECTED_PROPS:"injected:props",INJECT:"inject",SELF:"self",SKIP_SELF:"skipSelf",OPTIONAL:"optional",POST_CONSTRUCT:"postConstruct",PRE_DESTROY:"preDestroy"},d={DEFAULT:"default",INITING:"initing",ACTIVATED:"activated"},f={INVALID:"Invalid",INSTANCE:"Instance",CONSTANT:"ConstantValue",DYNAMIC:"DynamicValue"},I={POST_CONSTRUCT:"Multiple @PostConstruct decorators are not allowed in a single class.",PRE_DESTROY:"Multiple @PreDestroy decorators are not allowed in a single class.",INVALID_TOKEN:"@Inject requires a valid token, but received null or undefined.",LAZY_INJECT_INVALID_TOKEN:"@LazyInject requires a valid token, but received null or undefined.",DECORATE_NOT_SUPPORT_INITIALIZER:"decorate does not support decorators that rely on context.addInitializer (e.g. @LazyInject, @autobind)."},b=Symbol("UNINITIALIZED");function C(n,t){return Object.prototype.hasOwnProperty.call(n,t)}function Y(n){return n!==null&&typeof n=="object"}const y=new WeakMap;function P(n){return typeof n=="function"&&Object.getPrototypeOf(n)!==Function.prototype}function A(n,t){y.set(n,{metadata:t})}function j(n,t){const e=y.get(t);if(e)return C(e.metadata,n)?e.metadata[n]:void 0}function T(n,t){const e=y.get(t);if(e&&C(e.metadata,n))return e.metadata[n];if(P(t))return T(n,Object.getPrototypeOf(t))}function w(n){const t=y.get(n);if(t&&t.injectedPropsCache!==void 0){const i=t.injectedPropsCache;return i?Object.assign({},i):void 0}const e=J(n);return t&&(t.injectedPropsCache=e??null),e&&Object.assign({},e)}function J(n){const t=j(l.INJECTED_PROPS,n);if(!P(n))return t;const e=w(Object.getPrototypeOf(n));if(e||t)return Object.assign({},e,t)}class G{constructor(t){s(this,"name");this.name=t}}class V{constructor(t){s(this,"_callback");this._callback=t}resolve(){return this._callback()}}function S(n){if(!n)throw new Error(I.INVALID_TOKEN);return n instanceof V?n.resolve():n}class p extends Error{constructor(e,i){const r=(i==null?void 0:i.name)||"<unknown token>";super(`${e}${r}`);s(this,"token");this.name=this.constructor.name,this.token=i}}function R(n){const t=[];let e=n;for(;e&&e.token;)t.push(e.token.name||"<anonymous>"),e=e.parent;return t.reverse()}class m extends p{constructor(t){super(""),this.message="Circular dependency found: "+R(t).join(" --> ")}}class L extends p{constructor(t){super(`Binding is incomplete: container.bind(${t==null?void 0:t.name}) was called but missing to/toSelf/toConstantValue/toDynamicValue method. `,t)}}class B extends m{constructor(t){super(t),this.name="CircularDependencyError inside @PostConstruct"}}const N=class N{constructor(t,e){s(this,"container");s(this,"context");s(this,"token");s(this,"type",f.INVALID);s(this,"status",d.DEFAULT);s(this,"classValue");s(this,"constantValue");s(this,"dynamicValue");s(this,"cache");s(this,"postConstructResult",b);s(this,"transient",!1);s(this,"onActivationHandler");s(this,"onDeactivationHandler");this.container=e,this.context={container:this.container},this.token=t}onActivation(t){this.onActivationHandler=t}onDeactivation(t){this.onDeactivationHandler=t}activate(t){const e=this.onActivationHandler?this.onActivationHandler(this.context,t):t;return this.container.activate(e,this.token)}deactivate(){this.onDeactivationHandler&&this.onDeactivationHandler(this.cache)}to(t){return this.type=f.INSTANCE,this.classValue=t,this}toSelf(){return this.to(this.token)}toConstantValue(t){return this.type=f.CONSTANT,this.constantValue=t,this}toDynamicValue(t){return this.type=f.DYNAMIC,this.dynamicValue=t,this}inTransientScope(){return this.transient=!0,this}toService(t){return this.toDynamicValue(e=>e.container._resolveWithInternalOpts(t,{parent:{token:this.token}}))}get(t){if(d.INITING===this.status)throw new m(t);if(d.ACTIVATED===this.status)if(this.transient)this.status=d.DEFAULT;else return this.cache;const e=N._resolvers.get(this.type);if(e)return e.call(this,t);throw new L(this.token)}_getAwaitBindings(t,e){return e===!0?t:Array.isArray(e)?t.filter(i=>e.includes(i.token)):typeof e=="function"?t.filter(e):[]}_postConstruct(t,e){if(f.INSTANCE===this.type){const{key:i,value:r}=T(l.POST_CONSTRUCT,this.classValue)||{};if(i)if(r){const a=e.filter(c=>f.INSTANCE===(c==null?void 0:c.type)),o=this._getAwaitBindings(a,r);for(const c of o)if(c&&c.postConstructResult===b)throw new B({token:c.token,parent:t});const u=o.map(c=>c.postConstructResult);this.postConstructResult=Promise.all(u).then(()=>this._execute(i))}else this.postConstructResult=this._execute(i);else this.postConstructResult=void 0}}preDestroy(){if(f.INSTANCE===this.type&&this.cache!==void 0){const{key:t}=T(l.PRE_DESTROY,this.classValue)||{};t&&this._execute(t)}this.container&&!this.container._destroyed&&_._instanceContainerMap.delete(this.cache),this.container=void 0,this.context=void 0,this.classValue=void 0,this.constantValue=void 0,this.dynamicValue=void 0,this.cache=void 0,this.postConstructResult=b,this.onActivationHandler=void 0,this.onDeactivationHandler=void 0}_execute(t){const e=this.cache[t];return e==null?void 0:e.call(this.cache)}_resolveInstanceValue(t){this.status=d.INITING;const e=this._createInstance();this.cache=this.activate(e),this.status=d.ACTIVATED,this._registerInstance();const{properties:i,bindings:r}=this._getInjectProperties(t);return this._injectProperties(i),this._postConstruct(t,r),this.cache}_createInstance(){const t=this.classValue;return new t}_registerInstance(){_._instanceContainerMap.set(this.cache,this.container)}_injectProperties(t){Object.assign(this.cache,t)}_resolveConstantValue(){return this.status=d.INITING,this.cache=this.activate(this.constantValue),this.status=d.ACTIVATED,this.cache}_resolveDynamicValue(){this.status=d.INITING;const t=this.dynamicValue(this.context);return this.cache=this.activate(t),this.status=d.ACTIVATED,this.cache}_getInjectProperties(t){const e=w(this.classValue)||{},i=Object.keys(e),r=Object.create(null),a=[];for(let o=0;o<i.length;o++){const u=i[o],c=e[u],h=Object.assign({},c);h.parent=t;const v=this.container._resolveWithInternalOpts(S(h.inject),h);v===void 0&&h.optional||(r[u]=v),a.push(h.binding)}return{properties:r,bindings:a}}};s(N,"_resolvers",new Map([[f.INSTANCE,function(t){return this._resolveInstanceValue(t)}],[f.CONSTANT,function(t){return this._resolveConstantValue()}],[f.DYNAMIC,function(t){return this._resolveDynamicValue()}]]));let E=N;class M extends p{constructor(t,e){if(super("No matching binding found for token: ",t),e!=null&&e.parent){const i=R(e.parent);i.length>0&&(this.message+=`
|
|
2
|
+
`+i.map(r=>" required by: "+r).join(`
|
|
3
|
+
`))}}}class H extends p{constructor(t){super("Cannot bind token multiple times: ",t)}}class F extends p{constructor(t){super("Container has been destroyed. Cannot call get() for token: ",t)}}const g=class g{constructor(){s(this,"parent");s(this,"_children");s(this,"_bindings",new Map);s(this,"_destroyed",!1);s(this,"_onActivationHandler");s(this,"_onDeactivationHandler")}static getContainerOf(t){return g._instanceContainerMap.get(t)}bind(t){if(this._bindings.has(t))throw new H(t);const e=this._buildBinding(t);return this._bindings.set(t,e),e}unbind(t){if(this._bindings.has(t)){const e=this._getBinding(t);this.deactivate(e),e.deactivate(),e.preDestroy(),this._bindings.delete(t)}}tryGet(t){return this.get(t,{optional:!0})}rebind(t){return this._bindings.has(t)&&this.unbind(t),this.bind(t)}unbindAll(){const t=Array.from(this._bindings.keys());for(const e of t)this.unbind(e)}isCurrentBound(t){return this._bindings.has(t)}isBound(t){return this.isCurrentBound(t)||!!this.parent&&this.parent.isBound(t)}createChild(){const t=new g;return t.parent=this,this._children||(this._children=new Set),this._children.add(t),t}getChildren(){return this._children}destroy(){var t,e;if(this._destroyed=!0,this._children){const i=Array.from(this._children);for(const r of i)r.destroy()}this.unbindAll(),this._bindings.clear(),(e=(t=this.parent)==null?void 0:t._children)==null||e.delete(this),this.parent=void 0,this._children=void 0,this._onActivationHandler=void 0,this._onDeactivationHandler=void 0}get(t,e={}){const i=Object.assign({},e);return this._resolveWithInternalOpts(t,i)}getAsync(t,e={}){const i=Object.assign({},e);let r;try{r=this._resolveWithInternalOpts(t,i)}catch(o){return Promise.reject(o)}const a=i.binding;return(a==null?void 0:a.postConstructResult)instanceof Promise?a.postConstructResult.then(()=>r):Promise.resolve(r)}_resolveWithInternalOpts(t,e){if(this._destroyed)throw new F(t);return e.skipSelf?this._resolveSkipSelf(t,e):e.self?this._resolveSelf(t,e):this._resolveDefault(t,e)}_resolveSkipSelf(t,e){if(this.parent){const i=Object.assign({},e,{skipSelf:!1});return this.parent._resolveWithInternalOpts(t,i)}return this._checkBindingNotFoundError(t,e)}_resolveSelf(t,e){const i=this._getBinding(t);return i?(e.token=t,e.binding=i,i.get(e)):this._checkBindingNotFoundError(t,e)}_resolveDefault(t,e){const i=this._getBinding(t);return i?(e.token=t,e.binding=i,i.get(e)):this.parent?this.parent._resolveWithInternalOpts(t,e):this._checkBindingNotFoundError(t,e)}onActivation(t){this._onActivationHandler=t}onDeactivation(t){this._onDeactivationHandler=t}activate(t,e){return this._onActivationHandler?this._onActivationHandler({container:this},t,e):t}deactivate(t){this._onDeactivationHandler&&this._onDeactivationHandler(t.cache,t.token)}_buildBinding(t){return new E(t,this)}_getBinding(t){return this._bindings.get(t)}_checkBindingNotFoundError(t,e){if(!e.optional)throw new M(t,e)}};s(g,"_instanceContainerMap",new WeakMap);let _=g;class k extends p{constructor(t,e){super(`@LazyInject(${t==null?void 0:t.name}) in class ${e.name} requires a registered container but none was found. Token: `,t)}}function O(n,t){return function(e){return function(i,r){const a=r.name,o=r.metadata;C(o,l.INJECTED_PROPS)||(o[l.INJECTED_PROPS]={});const u=o[l.INJECTED_PROPS];u[a]||(u[a]={}),u[a][n]=e===void 0?t:e}}}function x(n,t){return e=>(i,r)=>{const a=r.name,o=r.metadata;if(C(o,n))throw new Error(t);o[n]={key:a,value:e}}}const K=O(l.INJECT),Z=O(l.SELF,!0),$=O(l.SKIP_SELF,!0),q=O(l.OPTIONAL,!0),Q=x(l.POST_CONSTRUCT,I.POST_CONSTRUCT),X=x(l.PRE_DESTROY,I.PRE_DESTROY);function tt(){return function(n,t){const e=t.metadata;A(n,e)}}function et(n,t,e,i){if(e==null)throw new Error(I.LAZY_INJECT_INVALID_TOKEN);let r,a=!1;Object.defineProperty(n,t,{configurable:!0,enumerable:!0,get(){if(!a){const o=i||_.getContainerOf(n),u=n.constructor;if(!o)throw new k(S(e),u);r=o._resolveWithInternalOpts(S(e),{parent:{token:u}}),a=!0}return r},set(o){r=o,a=!0}})}function z(n,t){return function(e,i){const r=i.name;i.addInitializer(function(){et(this,r,n,t)})}}function nt(n){return function(t){return z(t,n)}}function it(n,t){const e=t.name;t.addInitializer(function(){this[e]=n.bind(this)})}const D=new WeakMap;function rt(n,t,e){const i=Array.isArray(n)?n:[n],r=t.prototype,a=typeof r[e]=="function";D.has(t)||D.set(t,{});const o=D.get(t),u={kind:a?"method":"field",name:e,static:!1,private:!1,addInitializer(h){throw new Error(I.DECORATE_NOT_SUPPORT_INITIALIZER)},metadata:o};let c=a?r[e]:void 0;for(let h=i.length-1;h>=0;h--){const v=i[h](c,u);a&&typeof v=="function"&&(c=v)}a&&c!==r[e]&&(r[e]=c),A(t,o)}exports.BaseError=p;exports.Binding=E;exports.BindingNotFoundError=M;exports.BindingNotValidError=L;exports.CircularDependencyError=m;exports.Container=_;exports.ContainerDestroyedError=F;exports.ContainerNotFoundError=k;exports.DuplicateBindingError=H;exports.ERRORS=I;exports.Inject=K;exports.Injectable=tt;exports.LazyInject=z;exports.LazyToken=V;exports.Optional=q;exports.PostConstruct=Q;exports.PostConstructError=B;exports.PreDestroy=X;exports.Self=Z;exports.SkipSelf=$;exports.Token=G;exports.autobind=it;exports.createLazyInject=nt;exports.decorate=rt;exports.defineMetadata=A;exports.getMetadata=T;exports.getOwnMetadata=j;exports.hasOwn=C;exports.isObject=Y;
|
package/dist/index.d.cts
CHANGED
|
@@ -12,3 +12,4 @@ export { PostConstructError } from './errors/PostConstructError';
|
|
|
12
12
|
export { ContainerNotFoundError } from './errors/ContainerNotFoundError';
|
|
13
13
|
export { ContainerDestroyedError } from './errors/ContainerDestroyedError';
|
|
14
14
|
export { hasOwn, isObject, ERRORS } from './constants';
|
|
15
|
+
export { defineMetadata, getOwnMetadata, getMetadata } from './cachemap';
|
package/dist/index.d.ts
CHANGED
|
@@ -12,3 +12,4 @@ export { PostConstructError } from './errors/PostConstructError';
|
|
|
12
12
|
export { ContainerNotFoundError } from './errors/ContainerNotFoundError';
|
|
13
13
|
export { ContainerDestroyedError } from './errors/ContainerDestroyedError';
|
|
14
14
|
export { hasOwn, isObject, ERRORS } from './constants';
|
|
15
|
+
export { defineMetadata, getOwnMetadata, getMetadata } from './cachemap';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var r = (n, t, e) =>
|
|
1
|
+
var R = Object.defineProperty;
|
|
2
|
+
var L = (n, t, e) => t in n ? R(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
3
|
+
var r = (n, t, e) => L(n, typeof t != "symbol" ? t + "" : t, e);
|
|
4
4
|
const l = {
|
|
5
5
|
// 记录实例属性装饰器对应的数据的键
|
|
6
6
|
INJECTED_PROPS: "injected:props",
|
|
@@ -36,57 +36,56 @@ const l = {
|
|
|
36
36
|
// 用于 decorator.ts 的 decorate —— 不支持 addInitializer 的装饰器
|
|
37
37
|
DECORATE_NOT_SUPPORT_INITIALIZER: "decorate does not support decorators that rely on context.addInitializer (e.g. @LazyInject, @autobind)."
|
|
38
38
|
}, O = Symbol("UNINITIALIZED");
|
|
39
|
-
function
|
|
39
|
+
function g(n, t) {
|
|
40
40
|
return Object.prototype.hasOwnProperty.call(n, t);
|
|
41
41
|
}
|
|
42
|
-
function
|
|
42
|
+
function K(n) {
|
|
43
43
|
return n !== null && typeof n == "object";
|
|
44
44
|
}
|
|
45
|
-
const
|
|
46
|
-
function
|
|
45
|
+
const N = /* @__PURE__ */ new WeakMap();
|
|
46
|
+
function D(n) {
|
|
47
47
|
return typeof n == "function" && Object.getPrototypeOf(n) !== Function.prototype;
|
|
48
48
|
}
|
|
49
49
|
function S(n, t) {
|
|
50
|
-
|
|
50
|
+
N.set(n, { metadata: t });
|
|
51
51
|
}
|
|
52
|
-
function
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
55
|
-
return
|
|
56
|
-
if (m(n))
|
|
57
|
-
return P(Object.getPrototypeOf(n));
|
|
52
|
+
function M(n, t) {
|
|
53
|
+
const e = N.get(t);
|
|
54
|
+
if (e)
|
|
55
|
+
return g(e.metadata, n) ? e.metadata[n] : void 0;
|
|
58
56
|
}
|
|
59
|
-
function
|
|
60
|
-
const
|
|
61
|
-
if (
|
|
62
|
-
return
|
|
63
|
-
if (
|
|
64
|
-
return
|
|
57
|
+
function b(n, t) {
|
|
58
|
+
const e = N.get(t);
|
|
59
|
+
if (e && g(e.metadata, n))
|
|
60
|
+
return e.metadata[n];
|
|
61
|
+
if (D(t))
|
|
62
|
+
return b(n, Object.getPrototypeOf(t));
|
|
65
63
|
}
|
|
66
|
-
function
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
function P(n) {
|
|
65
|
+
const t = N.get(n);
|
|
66
|
+
if (t && t.injectedPropsCache !== void 0) {
|
|
67
|
+
const i = t.injectedPropsCache;
|
|
68
|
+
return i ? Object.assign({}, i) : void 0;
|
|
70
69
|
}
|
|
71
|
-
const
|
|
72
|
-
return
|
|
70
|
+
const e = B(n);
|
|
71
|
+
return t && (t.injectedPropsCache = e ?? null), e && Object.assign({}, e);
|
|
73
72
|
}
|
|
74
|
-
function
|
|
75
|
-
const t =
|
|
76
|
-
if (!
|
|
77
|
-
return
|
|
78
|
-
const
|
|
79
|
-
if (
|
|
80
|
-
return Object.assign({},
|
|
73
|
+
function B(n) {
|
|
74
|
+
const t = M(l.INJECTED_PROPS, n);
|
|
75
|
+
if (!D(n))
|
|
76
|
+
return t;
|
|
77
|
+
const e = P(Object.getPrototypeOf(n));
|
|
78
|
+
if (e || t)
|
|
79
|
+
return Object.assign({}, e, t);
|
|
81
80
|
}
|
|
82
|
-
class
|
|
81
|
+
class Z {
|
|
83
82
|
constructor(t) {
|
|
84
83
|
// 仅类型层面存在,无运行时开销
|
|
85
84
|
r(this, "name");
|
|
86
85
|
this.name = t;
|
|
87
86
|
}
|
|
88
87
|
}
|
|
89
|
-
class
|
|
88
|
+
class H {
|
|
90
89
|
constructor(t) {
|
|
91
90
|
r(this, "_callback");
|
|
92
91
|
this._callback = t;
|
|
@@ -95,10 +94,10 @@ class k {
|
|
|
95
94
|
return this._callback();
|
|
96
95
|
}
|
|
97
96
|
}
|
|
98
|
-
function
|
|
97
|
+
function A(n) {
|
|
99
98
|
if (!n)
|
|
100
99
|
throw new Error(T.INVALID_TOKEN);
|
|
101
|
-
return n instanceof
|
|
100
|
+
return n instanceof H ? n.resolve() : n;
|
|
102
101
|
}
|
|
103
102
|
class p extends Error {
|
|
104
103
|
constructor(e, i) {
|
|
@@ -108,16 +107,16 @@ class p extends Error {
|
|
|
108
107
|
this.name = this.constructor.name, this.token = i;
|
|
109
108
|
}
|
|
110
109
|
}
|
|
111
|
-
function
|
|
110
|
+
function w(n) {
|
|
112
111
|
const t = [];
|
|
113
112
|
let e = n;
|
|
114
113
|
for (; e && e.token; )
|
|
115
114
|
t.push(e.token.name || "<anonymous>"), e = e.parent;
|
|
116
115
|
return t.reverse();
|
|
117
116
|
}
|
|
118
|
-
class
|
|
117
|
+
class V extends p {
|
|
119
118
|
constructor(t) {
|
|
120
|
-
super(""), this.message = "Circular dependency found: " +
|
|
119
|
+
super(""), this.message = "Circular dependency found: " + w(t).join(" --> ");
|
|
121
120
|
}
|
|
122
121
|
}
|
|
123
122
|
class x extends p {
|
|
@@ -128,12 +127,12 @@ class x extends p {
|
|
|
128
127
|
);
|
|
129
128
|
}
|
|
130
129
|
}
|
|
131
|
-
class F extends
|
|
130
|
+
class F extends V {
|
|
132
131
|
constructor(t) {
|
|
133
132
|
super(t), this.name = "CircularDependencyError inside @PostConstruct";
|
|
134
133
|
}
|
|
135
134
|
}
|
|
136
|
-
const
|
|
135
|
+
const C = class C {
|
|
137
136
|
constructor(t, e) {
|
|
138
137
|
r(this, "container");
|
|
139
138
|
r(this, "context");
|
|
@@ -186,13 +185,13 @@ const N = class N {
|
|
|
186
185
|
}
|
|
187
186
|
get(t) {
|
|
188
187
|
if (d.INITING === this.status)
|
|
189
|
-
throw new
|
|
188
|
+
throw new V(t);
|
|
190
189
|
if (d.ACTIVATED === this.status)
|
|
191
190
|
if (this.transient)
|
|
192
191
|
this.status = d.DEFAULT;
|
|
193
192
|
else
|
|
194
193
|
return this.cache;
|
|
195
|
-
const e =
|
|
194
|
+
const e = C._resolvers.get(this.type);
|
|
196
195
|
if (e)
|
|
197
196
|
return e.call(this, t);
|
|
198
197
|
throw new x(this.token);
|
|
@@ -215,19 +214,19 @@ const N = class N {
|
|
|
215
214
|
*/
|
|
216
215
|
_postConstruct(t, e) {
|
|
217
216
|
if (f.INSTANCE === this.type) {
|
|
218
|
-
const { key: i, value: s } =
|
|
217
|
+
const { key: i, value: s } = b(l.POST_CONSTRUCT, this.classValue) || {};
|
|
219
218
|
if (i)
|
|
220
219
|
if (s) {
|
|
221
|
-
const
|
|
220
|
+
const a = e.filter(
|
|
222
221
|
(c) => f.INSTANCE === (c == null ? void 0 : c.type)
|
|
223
|
-
),
|
|
224
|
-
for (const c of
|
|
222
|
+
), o = this._getAwaitBindings(a, s);
|
|
223
|
+
for (const c of o)
|
|
225
224
|
if (c && c.postConstructResult === O)
|
|
226
225
|
throw new F({
|
|
227
226
|
token: c.token,
|
|
228
227
|
parent: t
|
|
229
228
|
});
|
|
230
|
-
const u =
|
|
229
|
+
const u = o.map((c) => c.postConstructResult);
|
|
231
230
|
this.postConstructResult = Promise.all(u).then(
|
|
232
231
|
() => this._execute(i)
|
|
233
232
|
);
|
|
@@ -239,7 +238,7 @@ const N = class N {
|
|
|
239
238
|
}
|
|
240
239
|
preDestroy() {
|
|
241
240
|
if (f.INSTANCE === this.type && this.cache !== void 0) {
|
|
242
|
-
const { key: t } =
|
|
241
|
+
const { key: t } = b(l.PRE_DESTROY, this.classValue) || {};
|
|
243
242
|
t && this._execute(t);
|
|
244
243
|
}
|
|
245
244
|
this.container && !this.container._destroyed && v._instanceContainerMap.delete(this.cache), this.container = void 0, this.context = void 0, this.classValue = void 0, this.constantValue = void 0, this.dynamicValue = void 0, this.cache = void 0, this.postConstructResult = O, this.onActivationHandler = void 0, this.onDeactivationHandler = void 0;
|
|
@@ -277,21 +276,21 @@ const N = class N {
|
|
|
277
276
|
return this.cache = this.activate(t), this.status = d.ACTIVATED, this.cache;
|
|
278
277
|
}
|
|
279
278
|
_getInjectProperties(t) {
|
|
280
|
-
const e =
|
|
281
|
-
for (let
|
|
282
|
-
const u = i[
|
|
279
|
+
const e = P(this.classValue) || {}, i = Object.keys(e), s = /* @__PURE__ */ Object.create(null), a = [];
|
|
280
|
+
for (let o = 0; o < i.length; o++) {
|
|
281
|
+
const u = i[o], c = e[u], h = Object.assign({}, c);
|
|
283
282
|
h.parent = t;
|
|
284
283
|
const _ = this.container._resolveWithInternalOpts(
|
|
285
|
-
|
|
284
|
+
A(h.inject),
|
|
286
285
|
h
|
|
287
286
|
);
|
|
288
|
-
_ === void 0 && h.optional || (s[u] = _),
|
|
287
|
+
_ === void 0 && h.optional || (s[u] = _), a.push(h.binding);
|
|
289
288
|
}
|
|
290
|
-
return { properties: s, bindings:
|
|
289
|
+
return { properties: s, bindings: a };
|
|
291
290
|
}
|
|
292
291
|
};
|
|
293
292
|
// 类型到解析函数的静态映射表,直接存储函数引用,消除字符串查表和 as any 间接调用
|
|
294
|
-
r(
|
|
293
|
+
r(C, "_resolvers", /* @__PURE__ */ new Map([
|
|
295
294
|
[f.INSTANCE, function(t) {
|
|
296
295
|
return this._resolveInstanceValue(t);
|
|
297
296
|
}],
|
|
@@ -302,18 +301,18 @@ r(N, "_resolvers", /* @__PURE__ */ new Map([
|
|
|
302
301
|
return this._resolveDynamicValue();
|
|
303
302
|
}]
|
|
304
303
|
]));
|
|
305
|
-
let
|
|
304
|
+
let m = C;
|
|
306
305
|
class U extends p {
|
|
307
306
|
constructor(t, e) {
|
|
308
307
|
if (super("No matching binding found for token: ", t), e != null && e.parent) {
|
|
309
|
-
const i =
|
|
308
|
+
const i = w(e.parent);
|
|
310
309
|
i.length > 0 && (this.message += `
|
|
311
310
|
` + i.map((s) => " required by: " + s).join(`
|
|
312
311
|
`));
|
|
313
312
|
}
|
|
314
313
|
}
|
|
315
314
|
}
|
|
316
|
-
class
|
|
315
|
+
class k extends p {
|
|
317
316
|
constructor(t) {
|
|
318
317
|
super("Cannot bind token multiple times: ", t);
|
|
319
318
|
}
|
|
@@ -326,7 +325,7 @@ class z extends p {
|
|
|
326
325
|
const I = class I {
|
|
327
326
|
constructor() {
|
|
328
327
|
r(this, "parent");
|
|
329
|
-
r(this, "
|
|
328
|
+
r(this, "_children");
|
|
330
329
|
r(this, "_bindings", /* @__PURE__ */ new Map());
|
|
331
330
|
r(this, "_destroyed", !1);
|
|
332
331
|
r(this, "_onActivationHandler");
|
|
@@ -338,7 +337,7 @@ const I = class I {
|
|
|
338
337
|
}
|
|
339
338
|
bind(t) {
|
|
340
339
|
if (this._bindings.has(t))
|
|
341
|
-
throw new
|
|
340
|
+
throw new k(t);
|
|
342
341
|
const e = this._buildBinding(t);
|
|
343
342
|
return this._bindings.set(t, e), e;
|
|
344
343
|
}
|
|
@@ -367,16 +366,19 @@ const I = class I {
|
|
|
367
366
|
}
|
|
368
367
|
createChild() {
|
|
369
368
|
const t = new I();
|
|
370
|
-
return t.parent = this, this.
|
|
369
|
+
return t.parent = this, this._children || (this._children = /* @__PURE__ */ new Set()), this._children.add(t), t;
|
|
370
|
+
}
|
|
371
|
+
getChildren() {
|
|
372
|
+
return this._children;
|
|
371
373
|
}
|
|
372
374
|
destroy() {
|
|
373
375
|
var t, e;
|
|
374
|
-
if (this._destroyed = !0, this.
|
|
375
|
-
const i = Array.from(this.
|
|
376
|
+
if (this._destroyed = !0, this._children) {
|
|
377
|
+
const i = Array.from(this._children);
|
|
376
378
|
for (const s of i)
|
|
377
379
|
s.destroy();
|
|
378
380
|
}
|
|
379
|
-
this.unbindAll(), this._bindings.clear(), (e = (t = this.parent) == null ? void 0 : t.
|
|
381
|
+
this.unbindAll(), this._bindings.clear(), (e = (t = this.parent) == null ? void 0 : t._children) == null || e.delete(this), this.parent = void 0, this._children = void 0, this._onActivationHandler = void 0, this._onDeactivationHandler = void 0;
|
|
380
382
|
}
|
|
381
383
|
get(t, e = {}) {
|
|
382
384
|
const i = Object.assign({}, e);
|
|
@@ -387,11 +389,11 @@ const I = class I {
|
|
|
387
389
|
let s;
|
|
388
390
|
try {
|
|
389
391
|
s = this._resolveWithInternalOpts(t, i);
|
|
390
|
-
} catch (
|
|
391
|
-
return Promise.reject(
|
|
392
|
+
} catch (o) {
|
|
393
|
+
return Promise.reject(o);
|
|
392
394
|
}
|
|
393
|
-
const
|
|
394
|
-
return (
|
|
395
|
+
const a = i.binding;
|
|
396
|
+
return (a == null ? void 0 : a.postConstructResult) instanceof Promise ? a.postConstructResult.then(() => s) : Promise.resolve(s);
|
|
395
397
|
}
|
|
396
398
|
// 内部解析入口,接受完整 Options;被 getAsync、toService、_getInjectProperties 等内部路径调用
|
|
397
399
|
_resolveWithInternalOpts(t, e) {
|
|
@@ -430,7 +432,7 @@ const I = class I {
|
|
|
430
432
|
this._onDeactivationHandler && this._onDeactivationHandler(t.cache, t.token);
|
|
431
433
|
}
|
|
432
434
|
_buildBinding(t) {
|
|
433
|
-
return new
|
|
435
|
+
return new m(t, this);
|
|
434
436
|
}
|
|
435
437
|
_getBinding(t) {
|
|
436
438
|
return this._bindings.get(t);
|
|
@@ -448,7 +450,7 @@ const I = class I {
|
|
|
448
450
|
// 由于 Instance 类型每次都通过 new ClassName() 创建新实例,不存在同一实例被多个容器注册的覆盖风险
|
|
449
451
|
r(I, "_instanceContainerMap", /* @__PURE__ */ new WeakMap());
|
|
450
452
|
let v = I;
|
|
451
|
-
class
|
|
453
|
+
class W extends p {
|
|
452
454
|
constructor(t, e) {
|
|
453
455
|
super(
|
|
454
456
|
`@LazyInject(${t == null ? void 0 : t.name}) in class ${e.name} requires a registered container but none was found. Token: `,
|
|
@@ -459,122 +461,125 @@ class Y extends p {
|
|
|
459
461
|
function E(n, t) {
|
|
460
462
|
return function(e) {
|
|
461
463
|
return function(i, s) {
|
|
462
|
-
const
|
|
463
|
-
|
|
464
|
-
const u =
|
|
465
|
-
u[
|
|
464
|
+
const a = s.name, o = s.metadata;
|
|
465
|
+
g(o, l.INJECTED_PROPS) || (o[l.INJECTED_PROPS] = {});
|
|
466
|
+
const u = o[l.INJECTED_PROPS];
|
|
467
|
+
u[a] || (u[a] = {}), u[a][n] = e === void 0 ? t : e;
|
|
466
468
|
};
|
|
467
469
|
};
|
|
468
470
|
}
|
|
469
|
-
function
|
|
471
|
+
function j(n, t) {
|
|
470
472
|
return (e) => (i, s) => {
|
|
471
|
-
const
|
|
472
|
-
if (
|
|
473
|
+
const a = s.name, o = s.metadata;
|
|
474
|
+
if (g(o, n))
|
|
473
475
|
throw new Error(t);
|
|
474
|
-
|
|
476
|
+
o[n] = { key: a, value: e };
|
|
475
477
|
};
|
|
476
478
|
}
|
|
477
|
-
const
|
|
479
|
+
const $ = E(l.INJECT), q = E(l.SELF, !0), Q = E(l.SKIP_SELF, !0), X = E(l.OPTIONAL, !0), tt = j(
|
|
478
480
|
l.POST_CONSTRUCT,
|
|
479
481
|
T.POST_CONSTRUCT
|
|
480
|
-
),
|
|
482
|
+
), et = j(
|
|
481
483
|
l.PRE_DESTROY,
|
|
482
484
|
T.PRE_DESTROY
|
|
483
485
|
);
|
|
484
|
-
function
|
|
486
|
+
function nt() {
|
|
485
487
|
return function(n, t) {
|
|
486
488
|
const e = t.metadata;
|
|
487
489
|
S(n, e);
|
|
488
490
|
};
|
|
489
491
|
}
|
|
490
|
-
function
|
|
492
|
+
function Y(n, t, e, i) {
|
|
491
493
|
if (e == null)
|
|
492
494
|
throw new Error(T.LAZY_INJECT_INVALID_TOKEN);
|
|
493
|
-
let s,
|
|
495
|
+
let s, a = !1;
|
|
494
496
|
Object.defineProperty(n, t, {
|
|
495
497
|
configurable: !0,
|
|
496
498
|
enumerable: !0,
|
|
497
499
|
get() {
|
|
498
|
-
if (!
|
|
499
|
-
const
|
|
500
|
-
if (!
|
|
501
|
-
throw new
|
|
502
|
-
s =
|
|
500
|
+
if (!a) {
|
|
501
|
+
const o = i || v.getContainerOf(n), u = n.constructor;
|
|
502
|
+
if (!o)
|
|
503
|
+
throw new W(A(e), u);
|
|
504
|
+
s = o._resolveWithInternalOpts(A(e), {
|
|
503
505
|
parent: { token: u }
|
|
504
|
-
}),
|
|
506
|
+
}), a = !0;
|
|
505
507
|
}
|
|
506
508
|
return s;
|
|
507
509
|
},
|
|
508
|
-
set(
|
|
509
|
-
s =
|
|
510
|
+
set(o) {
|
|
511
|
+
s = o, a = !0;
|
|
510
512
|
}
|
|
511
513
|
});
|
|
512
514
|
}
|
|
513
|
-
function
|
|
515
|
+
function J(n, t) {
|
|
514
516
|
return function(e, i) {
|
|
515
517
|
const s = i.name;
|
|
516
518
|
i.addInitializer(function() {
|
|
517
|
-
|
|
519
|
+
Y(this, s, n, t);
|
|
518
520
|
});
|
|
519
521
|
};
|
|
520
522
|
}
|
|
521
|
-
function
|
|
523
|
+
function it(n) {
|
|
522
524
|
return function(t) {
|
|
523
|
-
return
|
|
525
|
+
return J(t, n);
|
|
524
526
|
};
|
|
525
527
|
}
|
|
526
|
-
function
|
|
528
|
+
function st(n, t) {
|
|
527
529
|
const e = t.name;
|
|
528
530
|
t.addInitializer(function() {
|
|
529
531
|
this[e] = n.bind(this);
|
|
530
532
|
});
|
|
531
533
|
}
|
|
532
534
|
const y = /* @__PURE__ */ new WeakMap();
|
|
533
|
-
function
|
|
534
|
-
const i = Array.isArray(n) ? n : [n], s = t.prototype,
|
|
535
|
+
function rt(n, t, e) {
|
|
536
|
+
const i = Array.isArray(n) ? n : [n], s = t.prototype, a = typeof s[e] == "function";
|
|
535
537
|
y.has(t) || y.set(t, {});
|
|
536
|
-
const
|
|
537
|
-
kind:
|
|
538
|
+
const o = y.get(t), u = {
|
|
539
|
+
kind: a ? "method" : "field",
|
|
538
540
|
name: e,
|
|
539
541
|
static: !1,
|
|
540
542
|
private: !1,
|
|
541
543
|
addInitializer(h) {
|
|
542
544
|
throw new Error(T.DECORATE_NOT_SUPPORT_INITIALIZER);
|
|
543
545
|
},
|
|
544
|
-
metadata:
|
|
546
|
+
metadata: o
|
|
545
547
|
};
|
|
546
|
-
let c =
|
|
548
|
+
let c = a ? s[e] : void 0;
|
|
547
549
|
for (let h = i.length - 1; h >= 0; h--) {
|
|
548
550
|
const _ = i[h](c, u);
|
|
549
|
-
|
|
551
|
+
a && typeof _ == "function" && (c = _);
|
|
550
552
|
}
|
|
551
|
-
|
|
553
|
+
a && c !== s[e] && (s[e] = c), S(t, o);
|
|
552
554
|
}
|
|
553
555
|
export {
|
|
554
556
|
p as BaseError,
|
|
555
|
-
|
|
557
|
+
m as Binding,
|
|
556
558
|
U as BindingNotFoundError,
|
|
557
559
|
x as BindingNotValidError,
|
|
558
|
-
|
|
560
|
+
V as CircularDependencyError,
|
|
559
561
|
v as Container,
|
|
560
562
|
z as ContainerDestroyedError,
|
|
561
|
-
|
|
562
|
-
|
|
563
|
+
W as ContainerNotFoundError,
|
|
564
|
+
k as DuplicateBindingError,
|
|
563
565
|
T as ERRORS,
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
566
|
+
$ as Inject,
|
|
567
|
+
nt as Injectable,
|
|
568
|
+
J as LazyInject,
|
|
569
|
+
H as LazyToken,
|
|
570
|
+
X as Optional,
|
|
571
|
+
tt as PostConstruct,
|
|
570
572
|
F as PostConstructError,
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
573
|
+
et as PreDestroy,
|
|
574
|
+
q as Self,
|
|
575
|
+
Q as SkipSelf,
|
|
576
|
+
Z as Token,
|
|
577
|
+
st as autobind,
|
|
578
|
+
it as createLazyInject,
|
|
579
|
+
rt as decorate,
|
|
580
|
+
S as defineMetadata,
|
|
581
|
+
b as getMetadata,
|
|
582
|
+
M as getOwnMetadata,
|
|
583
|
+
g as hasOwn,
|
|
584
|
+
K as isObject
|
|
580
585
|
};
|