assemblerjs 0.8.3 → 0.8.5
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/index.d.ts +5 -33
- package/dist/index.js +1 -1
- package/dist/index.mjs +75 -160
- package/package.json +4 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
prototype: T;
|
|
6
|
-
}
|
|
1
|
+
import { Abstract } from '@assemblerjs/core';
|
|
2
|
+
import { Class } from '@assemblerjs/core';
|
|
3
|
+
import { Concrete } from '@assemblerjs/core';
|
|
4
|
+
import { Tuple } from '@assemblerjs/core';
|
|
7
5
|
|
|
8
6
|
/**
|
|
9
7
|
* Base abstract class to implement an assemblage.
|
|
@@ -102,16 +100,6 @@ export declare abstract class AbstractListenerCollection {
|
|
|
102
100
|
abstract [Symbol.iterator](): Iterator<EventChannel>;
|
|
103
101
|
}
|
|
104
102
|
|
|
105
|
-
/**
|
|
106
|
-
* Generic `Array` items.
|
|
107
|
-
*/
|
|
108
|
-
declare type ArrayItems<T extends Array<any>> = T extends Array<infer TItems> ? TItems : never;
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Methods or keys that mutate an `Array`.
|
|
112
|
-
*/
|
|
113
|
-
declare type ArrayLengthMutationKeys = 'splice' | 'push' | 'pop' | 'shift' | 'unshift' | number;
|
|
114
|
-
|
|
115
103
|
/**
|
|
116
104
|
* Mark a class as `Assemblage` and cache its definition.
|
|
117
105
|
*
|
|
@@ -297,13 +285,6 @@ export declare class Assembler extends EventManager implements AbstractAssembler
|
|
|
297
285
|
configuration: Record<string, any>;
|
|
298
286
|
}
|
|
299
287
|
|
|
300
|
-
/**
|
|
301
|
-
* A concrete (newable) class.
|
|
302
|
-
*/
|
|
303
|
-
declare interface Concrete<T> extends Function {
|
|
304
|
-
new (...args: any[]): T;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
288
|
/**
|
|
308
289
|
* Injection binds a concrete class to itself as identifier
|
|
309
290
|
* and provides a configuration object that will be passed to context.
|
|
@@ -409,7 +390,7 @@ export declare class Assembler extends EventManager implements AbstractAssembler
|
|
|
409
390
|
/**
|
|
410
391
|
* An identifier can be an abstract or a concrete class.
|
|
411
392
|
*/
|
|
412
|
-
declare type Identifier<T> =
|
|
393
|
+
declare type Identifier<T> = Class<T>;
|
|
413
394
|
|
|
414
395
|
declare class Injectable<T> implements AbstractInjectable<T> {
|
|
415
396
|
readonly privateContext: AssemblerPrivateContext;
|
|
@@ -604,15 +585,6 @@ export declare class Assembler extends EventManager implements AbstractAssembler
|
|
|
604
585
|
UseIdentifier = "assemblage:use.param.value"
|
|
605
586
|
}
|
|
606
587
|
|
|
607
|
-
/**
|
|
608
|
-
* An array of fixed length typed values.
|
|
609
|
-
*
|
|
610
|
-
* @see https://stackoverflow.com/a/59906630/1060921
|
|
611
|
-
*/
|
|
612
|
-
declare type Tuple<T extends any[]> = Pick<T, Exclude<keyof T, ArrayLengthMutationKeys>> & {
|
|
613
|
-
[Symbol.iterator]: () => IterableIterator<ArrayItems<T>>;
|
|
614
|
-
};
|
|
615
|
-
|
|
616
588
|
/**
|
|
617
589
|
* Injects an object passed with `string` or `symbol` identifier.
|
|
618
590
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="design:paramtypes";var t,n;(t||(t={})).IsAssemblage="is_assemblage",(n||(n={})).AssemblageDefinition="assemblage:definition.value";const s=(...e)=>{},i=(...e)=>t=>{if(e.includes(typeof t))return typeof t},r=e=>!(e=>void 0===e)(e)&&!(e=>null===e)(e),o=e=>e&&"function"==typeof e&&void 0!==e.constructor,a=e=>"function"==typeof e&&"AsyncFunction"===e.constructor.name,c=(e,...t)=>{t.map(((e,n)=>{const s=/\S/.test(e);return s&&(t[n]=t[n].trim()),s?-1:n})).filter((e=>e>=0)).every((e=>{t[e]=" ",((e,t,n)=>{const s=e[t];e.splice(t,1),e.splice(n,0,s)})(t,e,t.length-1)})),t=(e=>Array.from(new Set(e)))(t);const n=new RegExp(`[^A-Za-zÀ-ÖØ-öø-ÿ0-9${t.join("")}]`,"gi");return e.replace(n,"")},l=(...e)=>t=>e.reduce(((e,t)=>t(e)),t),h=e=>t=>e.if(t)?e.then(t):e.else?e.else(t):void 0,f=e=>t=>{const n=Array.isArray(e)?e=>parseInt(e):s;for(const[s,i]of Object.entries(e))t(i,n(s))},u=(e,t)=>{const n=new Proxy(e,{get:function(n,s){return s===Symbol.iterator?n[Symbol.iterator].bind(n):((e,t)=>[...Object.getOwnPropertyNames(t.prototype),...Object.getOwnPropertyNames(Object.getPrototypeOf(e)),...Object.getOwnPropertyNames(e)])(e,t).includes(s)?n[s]:n.collection[s]},set:function(e,t,n){return Reflect.set(e,t,n)}});return n},p=(e,t)=>{const n=e;for(const s of((e,t)=>[...Object.getOwnPropertyNames(t.prototype),...Object.getOwnPropertyNames(Object.getPrototypeOf(e)),...Object.getOwnPropertyNames(e)])(e,t))delete n[s]},d=(e,t,n)=>{Reflect.defineMetadata(`__${e}__`,t,n)},g=(e,t)=>Reflect.getOwnMetadata(`__${e}__`,t),m=t=>Reflect.getMetadata(e,t)||[],x=e=>g(t.IsAssemblage,e)||!1,b={singleton:{test:e=>"boolean"==typeof e||void 0===e,throw:()=>{throw new Error("'singleton' property must be of type 'boolean' or 'undefined'.")},transform:e=>void 0===e||!!e},events:{test:e=>void 0===e||Array.isArray(e)&&e.every((e=>"string"==typeof e)),throw:()=>{throw new Error("'events' property must be an array of strings or 'undefined'.")},transform:e=>e},inject:{test:e=>void 0===e||Array.isArray(e)&&e.every((e=>Array.isArray(e)&&e.length>=1&&e.length<=3)),throw:()=>{throw new Error("'inject' property must be an array of tuples of length 1, 2 or 3.")},transform:e=>e},use:{test:e=>void 0===e||Array.isArray(e)&&e.every((e=>Array.isArray(e)&&2==e.length)),throw:()=>{throw new Error("'use' property must be an array of tuples of length 2.")},transform:e=>e},tags:{test:e=>void 0===e||"string"==typeof e||Array.isArray(e)&&e.every((e=>"string"==typeof e)),throw:()=>{throw new Error("'tags' property must be a string or an array of strings.")},transform:e=>"string"==typeof e?[e]:e},metadata:{test:e=>("object"==typeof e||void 0===e)&&!Array.isArray(e),throw:()=>{throw new Error("'metadata' property must be of type 'object' or 'undefined'.")},transform:e=>e}},y=e=>{const t={...e};for(const n in t)if(!Object.keys(b).includes(n))throw new Error(`Property '${n}' is not a valid assemblage definition property.`);for(const n in b){const e=b[n].test,s=b[n].throw,i=b[n].transform;e(t[n])||s(),t[n]=i(t[n])}return t},C=e=>{if(!x(e))throw new Error(`Class '${e.name}' is not an assemblage.`);return g(n.AssemblageDefinition,e)},v=(e,t)=>C(t)[e],w=e=>{const t=()=>o(e[0])&&(e=>"object"==typeof e&&!Array.isArray(e)&&!o(e))(e[1]);return l(h({if:()=>o(e[0])&&o(e[1]),then:()=>({identifier:e[0],concrete:e[1],configuration:{}})}),h({if:()=>t(),then:()=>({identifier:e[0],concrete:e[0],configuration:e[1]}),else:e=>e}))()},I=(e,s)=>{const i=y(s||{});return d(t.IsAssemblage,!0,e),d(n.AssemblageDefinition,i,e),e};class j{dispose(){p(this,j)}add(...e){const t=e=>this.collection[e.channel].push(e.listener),n=h({if:()=>2===e.length,then:()=>({channel:e[0],listener:e[1]}),else:()=>{const t=e[0];return{channel:t[0],listener:t[1]}}}),s=h({if:e=>!r(this.collection[e.channel]),then:e=>{this.collection[e.channel]=[],t(e)},else:e=>{t(e)}});return l(n,s)(),this}remove(e,t){const n=t=>this.collection[e].splice(t,1),s=h({if:()=>this.collection[e]&&0===this.collection[e].length,then:()=>delete this.collection[e]}),i=h({if:()=>r(t),then:()=>n(this.collection[e].indexOf(t)),else:()=>delete this.collection[e]}),o=h({if:e=>this.has(e),then:e=>this.collection[e]});return l(o,i,s)(),this}has(...e){return i("string")(e[0])?Object.keys(this.collection).includes(e[0]):!!i("function")(e[0])&&Object.values(this.collection).flat().includes(e[0])}get(...e){return i("string")(e[0])?this.collection[e[0]]:i("function")(e[0])?Object.values(this.collection).flat().filter((t=>t===e[0])):[]}clear(){const e=(e=>t=>{const n=Array.isArray(e)?e=>parseInt(e):e=>e;for(const s in e)t(n(s))})(this.collection),t=e=>f(this.collection[e])((t=>this.remove(e,t)));return e((e=>t(e))),this}get listeners(){return Object.values(this.collection).flat()}get channels(){return Object.keys(this.collection)}get length(){return Object.values(this.collection).flat().length}[Symbol.iterator](){let e=-1;const t=this.collection?Object.keys(this.collection):[];return{next:()=>({value:t[++e],done:!(e in t)})}}constructor(){this.collection={};return u(this,j)}}class A{}class P{dispose(){this.listeners.dispose(),this.channels.clear(),p(this,P)}addChannels(...e){return f(e)((e=>{const t=this.cleanChannel(e);if(this.channels.has(t))throw new Error(`Channel '${t}' already exists.`);this.channels.add(t)})),this}removeChannels(...e){return f(e)((e=>{const t=this.cleanChannel(e);"*"!==t&&this.channels.has(t)&&(this.channels.delete(t),this.listeners.remove(t),this.onceListeners.remove(t))})),this}on(e,t){const n=this.cleanChannel(e);if(!this.channels.has(n))throw new Error(`Channel '${n}' was not registered.`);return this.listeners.add(n,t),this}once(e,t){const n=this.cleanChannel(e);if(!this.channels.has(n))throw new Error(`Channel '${n}' was not registered.`);return this.onceListeners.add(n,t),this}off(e,t){const n=this.cleanChannel(e);return this.listeners.remove(n,t),this}emit(e,...t){const n=this.cleanChannel(e);if(this.channels.has(n)){const e=this.onceListeners.get("*")||[],s=this.listeners.get("*")||[],i=this.onceListeners.get(n)||[],r=this.listeners.get(n)||[],o=f(e),a=f(s),c=f(i),l=f(r);o((e=>{this.run(e,...t),this.onceListeners.remove("*",e)})),a((e=>{this.run(e,...t)})),c((e=>{this.run(e,...t),this.onceListeners.remove(n,e)})),l((e=>{this.run(e,...t)}))}return this}run(e,...t){if(a(e)){return e(...t).then((()=>Promise.resolve()))}e(...t)}cleanChannel(e){return c(e,"*")}constructor(...e){this.listeners=new j,this.onceListeners=new j,this.channels=new Set(["*"]),this.addChannels(...e)}}exports.ReflectParamValue=void 0,(exports.ReflectParamValue||(exports.ReflectParamValue={})).UseIdentifier="assemblage:use.param.value",exports.ReflectParamIndex=void 0,function(e){e.Context="assembler:context.param.index",e.Dispose="assembler:dispose.param.index",e.Definition="assemblage:definition.param.index",e.Configuration="assemblage:configuration.param.index",e.Use="assemblage:use.param.index"}(exports.ReflectParamIndex||(exports.ReflectParamIndex={}));const R=e=>()=>(t,n,s)=>{const i=g(e,t)||[];i.push(s),d(e,i,t)},O=R(exports.ReflectParamIndex.Context),D=R(exports.ReflectParamIndex.Configuration),E=R(exports.ReflectParamIndex.Definition),U=R(exports.ReflectParamIndex.Dispose),S=(e,t,n)=>{const s=g(exports.ReflectParamIndex.Use,t)||[];s.push(n),d(exports.ReflectParamIndex.Use,s,t);const i=g(exports.ReflectParamValue.UseIdentifier,t)||{};i[n]=e,d(exports.ReflectParamValue.UseIdentifier,i,t)},$=e=>{const t=(e=>g(exports.ReflectParamIndex.Context,e)||[])(e)||[],n=(e=>g(exports.ReflectParamIndex.Definition,e)||[])(e)||[],s=(e=>g(exports.ReflectParamIndex.Configuration,e)||[])(e)||[],i=(e=>g(exports.ReflectParamIndex.Dispose,e)||[])(e)||[],r=(e=>g(exports.ReflectParamIndex.Use,e)||[])(e)||[];return{Context:t,Definition:n,Configuration:s,Dispose:i,Use:r}},L=(t,s=!0)=>i=>{const r=class extends i{constructor(...e){super(...e),t&&t.call(this)}};if(Object.defineProperty(r,"name",{value:i.name}),!s)return r;const o=Reflect.getOwnMetadata(e,i)||[],a=$(i),c=[];for(let e=0;e<o.length;e++)if(a.Context.includes(e)){const t=g(exports.ReflectParamIndex.Context,i)||[];t.push(e),d(exports.ReflectParamIndex.Context,t,r)}else if(a.Definition.includes(e)){const t=g(exports.ReflectParamIndex.Definition,i)||[];t.push(e),d(exports.ReflectParamIndex.Definition,t,r)}else if(a.Configuration.includes(e)){const t=g(exports.ReflectParamIndex.Configuration,i)||[];t.push(e),d(exports.ReflectParamIndex.Configuration,t,r)}else if(a.Dispose.includes(e)){const t=g(exports.ReflectParamIndex.Dispose,i)||[];t.push(e),d(exports.ReflectParamIndex.Dispose,t,r),c.push(o[e])}else if(a.Use.includes(e)){const t=g(exports.ReflectParamValue.UseIdentifier,i);S(t[e],r,e)}else;return s?I(r,g(n.AssemblageDefinition,i)):r};class M{static of(e,t,n){return new M(e,t,n)}dispose(){this.singletonInstance&&(((e,t)=>{if(e.concrete.prototype instanceof P){const n=t;for(const t of e.events)n.off(t);n.removeChannels(...e.events),e.privateContext.removeChannels(...e.events)}})(this,this.singletonInstance),_(this.singletonInstance,"onDispose",this.publicContext,this.configuration),p(this.singletonInstance,this.concrete)),p(this,M)}build(){if(this.singletonInstance)return this.singletonInstance;const e=(e=>{const t=[],n=m(e.concrete),s=$(e.concrete);let i=0;for(const r of n)if(s.Context.includes(i))t.push(e.publicContext),i++;else if(s.Configuration.includes(i))t.push(e.configuration),i++;else if(s.Definition.includes(i))t.push(e.definition),i++;else if(s.Dispose.includes(i))t.push(e.privateContext.dispose),i++;else if(s.Use.includes(i)){const n=g(exports.ReflectParamValue.UseIdentifier,e.concrete)[i];t.push(e.privateContext.require(n)),i++}else t.push(e.privateContext.require(r)),i++;return t})(this),t=new this.concrete(...e);return((e,t)=>{if(e.concrete.prototype instanceof P){const n=t,s=n.channels;for(const t of e.events)s.has(t)||n.addChannels(t),e.privateContext.events.has(t)||e.privateContext.addChannels(t);for(const i of e.events)t.on(i,((...t)=>{e.privateContext.emit(i,...t)}))}})(this,t),this.isSingleton?(this.singletonInstance=t,this.privateContext.prepareInitHook(t,this.configuration),this.singletonInstance):(_(t,"onInit",this.publicContext),t)}get dependencies(){return this.dependenciesIds}get definition(){return C(this.concrete)||{}}get isSingleton(){return v("singleton",this.concrete)}get singleton(){return this.singletonInstance}get injections(){return v("inject",this.concrete)||[]}get objects(){return v("use",this.concrete)||[]}get tags(){return v("tags",this.concrete)||[]}get events(){return v("events",this.concrete)||[]}constructor(e,t,n){if(this.privateContext=t,this.publicContext=n,this.dependenciesIds=[],this.identifier=e.identifier,this.concrete=e.concrete,this.configuration=e.configuration,!x(this.concrete))throw new Error(`Class '${this.concrete.name}' is not an Assemblage.`);const s=f(this.injections),i=f(this.objects);s((e=>this.privateContext.register(e))),i((e=>{"string"==typeof e[0]||"symbol"==typeof e[0]?this.privateContext.use(e[0],e[1]):this.privateContext.register(e,!0)})),this.dependenciesIds=(e=>{const t=[],n=m(e),s=$(e);let i=0;for(const r of n)s.Context.includes(i)||s.Configuration.includes(i)||s.Definition.includes(i)||s.Dispose.includes(i)||s.Use.includes(i)||t.push(r),i++;return t})(this.concrete),e.instance?this.singletonInstance=e.instance:this.isSingleton}}const _=(e,t,n,s)=>new Promise((i=>{const r=e[t];if(r){if(a(r))return void r.bind(e)(n,s).then((()=>{i()}));i(r.bind(e)(n,s))}}));class k extends P{static build(e){const t=new k;((e,t,s)=>{const i=C(s);i[e]=t;const r=y(i);d(n.AssemblageDefinition,r,s)})("singleton",!0,e);const s=t.register([e]),i=t.require(s.identifier),r=t.initCache.find((e=>e.instance===i));if(!r)throw new Error("Root instance not found in assemblages cache.");const o=t.initCache.indexOf(r);t.initCache.splice(o,1);for(const n of t.initCache)_(n.instance,"onInit",t.publicContext,n.configuration);return _(i,"onInit",t.publicContext,s.configuration),t.initCache.length=0,i}dispose(){for(const[e,t]of this.injectables)t.dispose();p(this,k)}register(e,t=!1){const n=!0===t?(e=>({identifier:e[0],concrete:e[0],instance:e[1],configuration:{}}))(e):(e=>((e,t)=>(n,...s)=>e[n]?e[n](...s):t?t(n,...s):void 0)({1:()=>(e=>({identifier:e[0],concrete:e[0],configuration:{}}))(e),2:()=>w(e),3:()=>(e=>({identifier:e[0],concrete:e[1],configuration:e[2]}))(e)},(()=>{throw new Error("Injection tuple must be of length 1, 2 or 3.")}))(e.length))(e);if(this.has(n.identifier))throw new Error(`An assemblage is already registered with identifier '${n.identifier.name}'.`);const s=M.of(n,this.privateContext,this.publicContext);return this.injectables.set(s.identifier,s),_(s.concrete,"onRegister",this.publicContext,s.configuration),s}use(e,t){if(this.has(e))throw new Error(`A value is already registered with identifier '${String(e)}'.`);return this.objects.set(e,t),t}prepareInitHook(e,t){return this.initCache.push({instance:e,configuration:t}),this.initCache}has(e){return"string"==typeof e||"symbol"==typeof e?this.objects.has(e):this.injectables.has(e)}require(e){switch(typeof e){case"string":case"symbol":if(!this.objects.has(e))throw new Error(`Injected object with identifier '${String(e)}' has not been registered.`);return this.objects.get(e);default:if(!this.injectables.has(e))throw new Error(`Class with identifier '${e.name}' has not been registered or is a circular dependency.`);return this.injectables.get(e).build()}}concrete(e){const t=this.injectables.get(e);if(t)return t.concrete}tagged(...e){const t=[];for(const n of e)for(const[e,s]of this.injectables)s.tags.includes(n)&&t.push(s.build());return t}get size(){return this.injectables.size}constructor(){super(),this.injectables=new Map,this.objects=new Map,this.initCache=[],this.publicContext={has:this.has.bind(this),require:this.require.bind(this),concrete:this.concrete.bind(this),tagged:this.tagged.bind(this),dispose:this.dispose.bind(this),on:this.on.bind(this),once:this.once.bind(this),off:this.off.bind(this),events:this.channels},this.privateContext={...this.publicContext,register:this.register.bind(this),use:this.use.bind(this),prepareInitHook:this.prepareInitHook.bind(this),emit:this.emit.bind(this),addChannels:this.addChannels.bind(this),removeChannels:this.removeChannels.bind(this)}}}exports.AbstractAssemblage=class{static onRegister(e,t){}},exports.AbstractAssembler=class extends A{},exports.AbstractEventManager=A,exports.AbstractListenerCollection=class{},exports.Assemblage=e=>t=>I(t,e),exports.Assembler=k,exports.Await=(e,t=25)=>(n,s,i)=>{const r=i.value;i.value=async function(){return new Promise((n=>{if(this[e])r.apply(this),n();else{const s=setInterval((()=>{this[e]&&(clearInterval(s),r.apply(this),n())}),t)}}))}},exports.Configuration=D,exports.ConstructorDecorator=L,exports.Context=O,exports.Definition=E,exports.Dispose=U,exports.EventManager=P,exports.ListenerCollection=j,exports.Use=e=>(t,n,s)=>{S(e,t,s)},exports.createConstructorDecorator=e=>(t=!0)=>L(e,t),exports.decorateAssemblage=I,exports.decorateUse=S,exports.getDecoratedParametersIndexes=$,exports.isAssemblage=x;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@assemblerjs/core");const t="design:paramtypes";var n,s;(n||(n={})).IsAssemblage="is_assemblage",(s||(s={})).AssemblageDefinition="assemblage:definition.value";const i=(e,t,n)=>{Reflect.defineMetadata(`__${e}__`,t,n)},r=(e,t)=>Reflect.getOwnMetadata(`__${e}__`,t),o=e=>Reflect.getMetadata(t,e)||[],a=e=>r(n.IsAssemblage,e)||!1,c={singleton:{test:e=>"boolean"==typeof e||void 0===e,throw:()=>{throw new Error("'singleton' property must be of type 'boolean' or 'undefined'.")},transform:e=>void 0===e||!!e},events:{test:e=>void 0===e||Array.isArray(e)&&e.every((e=>"string"==typeof e)),throw:()=>{throw new Error("'events' property must be an array of strings or 'undefined'.")},transform:e=>e},inject:{test:e=>void 0===e||Array.isArray(e)&&e.every((e=>Array.isArray(e)&&e.length>=1&&e.length<=3)),throw:()=>{throw new Error("'inject' property must be an array of tuples of length 1, 2 or 3.")},transform:e=>e},use:{test:e=>void 0===e||Array.isArray(e)&&e.every((e=>Array.isArray(e)&&2==e.length)),throw:()=>{throw new Error("'use' property must be an array of tuples of length 2.")},transform:e=>e},tags:{test:e=>void 0===e||"string"==typeof e||Array.isArray(e)&&e.every((e=>"string"==typeof e)),throw:()=>{throw new Error("'tags' property must be a string or an array of strings.")},transform:e=>"string"==typeof e?[e]:e},metadata:{test:e=>("object"==typeof e||void 0===e)&&!Array.isArray(e),throw:()=>{throw new Error("'metadata' property must be of type 'object' or 'undefined'.")},transform:e=>e}},l=e=>{const t={...e};for(const n in t)if(!Object.keys(c).includes(n))throw new Error(`Property '${n}' is not a valid assemblage definition property.`);for(const n in c){const e=c[n].test,s=c[n].throw,i=c[n].transform;e(t[n])||s(),t[n]=i(t[n])}return t},h=e=>{if(!a(e))throw new Error(`Class '${e.name}' is not an assemblage.`);return r(s.AssemblageDefinition,e)},f=(e,t)=>h(t)[e],d=t=>e.pipe(e.conditionally({if:()=>e.isClass(t[0])&&e.isClass(t[1]),then:()=>({identifier:t[0],concrete:t[1],configuration:{}})}),e.conditionally({if:()=>e.isClass(t[0])&&e.isObject(t[1]),then:()=>({identifier:t[0],concrete:t[0],configuration:t[1]}),else:e=>e}))(),u=(e,t)=>{const r=l(t||{});return i(n.IsAssemblage,!0,e),i(s.AssemblageDefinition,r,e),e};class p{dispose(){e.clearInstance(this,p)}add(...t){const n=e=>this.collection[e.channel].push(e.listener),s=e.conditionally({if:()=>2===t.length,then:()=>({channel:t[0],listener:t[1]}),else:()=>{const e=t[0];return{channel:e[0],listener:e[1]}}}),i=e.conditionally({if:t=>!e.isDefined(this.collection[t.channel]),then:e=>{this.collection[e.channel]=[],n(e)},else:e=>{n(e)}});return e.pipe(s,i)(),this}remove(t,n){const s=e=>this.collection[t].splice(e,1),i=e.conditionally({if:()=>this.collection[t]&&0===this.collection[t].length,then:()=>delete this.collection[t]}),r=e.conditionally({if:()=>e.isDefined(n),then:()=>s(this.collection[t].indexOf(n)),else:()=>delete this.collection[t]}),o=e.conditionally({if:e=>this.has(e),then:e=>this.collection[e]});return e.pipe(o,r,i)(),this}has(...t){return e.isOfType("string")(t[0])?Object.keys(this.collection).includes(t[0]):!!e.isOfType("function")(t[0])&&Object.values(this.collection).flat().includes(t[0])}get(...t){return e.isOfType("string")(t[0])?this.collection[t[0]]:e.isOfType("function")(t[0])?Object.values(this.collection).flat().filter((e=>e===t[0])):[]}clear(){const t=e.forIn(this.collection),n=t=>e.forOf(this.collection[t])((e=>this.remove(t,e)));return t((e=>n(e))),this}get listeners(){return Object.values(this.collection).flat()}get channels(){return Object.keys(this.collection)}get length(){return Object.values(this.collection).flat().length}[Symbol.iterator](){let e=-1;const t=this.collection?Object.keys(this.collection):[];return{next:()=>({value:t[++e],done:!(e in t)})}}constructor(){this.collection={};return e.proxifyIterable(this,p)}}class g{}class x{dispose(){this.listeners.dispose(),this.channels.clear(),e.clearInstance(this,x)}addChannels(...t){return e.forOf(t)((e=>{const t=this.cleanChannel(e);if(this.channels.has(t))throw new Error(`Channel '${t}' already exists.`);this.channels.add(t)})),this}removeChannels(...t){return e.forOf(t)((e=>{const t=this.cleanChannel(e);"*"!==t&&this.channels.has(t)&&(this.channels.delete(t),this.listeners.remove(t),this.onceListeners.remove(t))})),this}on(e,t){const n=this.cleanChannel(e);if(!this.channels.has(n))throw new Error(`Channel '${n}' was not registered.`);return this.listeners.add(n,t),this}once(e,t){const n=this.cleanChannel(e);if(!this.channels.has(n))throw new Error(`Channel '${n}' was not registered.`);return this.onceListeners.add(n,t),this}off(e,t){const n=this.cleanChannel(e);return this.listeners.remove(n,t),this}emit(t,...n){const s=this.cleanChannel(t);if(this.channels.has(s)){const t=this.onceListeners.get("*")||[],i=this.listeners.get("*")||[],r=this.onceListeners.get(s)||[],o=this.listeners.get(s)||[],a=e.forOf(t),c=e.forOf(i),l=e.forOf(r),h=e.forOf(o);a((e=>{this.run(e,...n),this.onceListeners.remove("*",e)})),c((e=>{this.run(e,...n)})),l((e=>{this.run(e,...n),this.onceListeners.remove(s,e)})),h((e=>{this.run(e,...n)}))}return this}run(t,...n){if(e.isAsync(t)){return t(...n).then((()=>Promise.resolve()))}t(...n)}cleanChannel(t){return e.onlyAlphanumeric(t,"*")}constructor(...e){this.listeners=new p,this.onceListeners=new p,this.channels=new Set(["*"]),this.addChannels(...e)}}exports.ReflectParamValue=void 0,(exports.ReflectParamValue||(exports.ReflectParamValue={})).UseIdentifier="assemblage:use.param.value",exports.ReflectParamIndex=void 0,function(e){e.Context="assembler:context.param.index",e.Dispose="assembler:dispose.param.index",e.Definition="assemblage:definition.param.index",e.Configuration="assemblage:configuration.param.index",e.Use="assemblage:use.param.index"}(exports.ReflectParamIndex||(exports.ReflectParamIndex={}));const m=e=>()=>(t,n,s)=>{const o=r(e,t)||[];o.push(s),i(e,o,t)},b=m(exports.ReflectParamIndex.Context),C=m(exports.ReflectParamIndex.Configuration),y=m(exports.ReflectParamIndex.Definition),v=m(exports.ReflectParamIndex.Dispose),w=(e,t,n)=>{const s=r(exports.ReflectParamIndex.Use,t)||[];s.push(n),i(exports.ReflectParamIndex.Use,s,t);const o=r(exports.ReflectParamValue.UseIdentifier,t)||{};o[n]=e,i(exports.ReflectParamValue.UseIdentifier,o,t)},I=e=>{const t=(e=>r(exports.ReflectParamIndex.Context,e)||[])(e)||[],n=(e=>r(exports.ReflectParamIndex.Definition,e)||[])(e)||[],s=(e=>r(exports.ReflectParamIndex.Configuration,e)||[])(e)||[],i=(e=>r(exports.ReflectParamIndex.Dispose,e)||[])(e)||[],o=(e=>r(exports.ReflectParamIndex.Use,e)||[])(e)||[];return{Context:t,Definition:n,Configuration:s,Dispose:i,Use:o}},A=(e,n=!0)=>o=>{const a=class extends o{constructor(...t){super(...t),e&&e.call(this)}};if(Object.defineProperty(a,"name",{value:o.name}),!n)return a;const c=Reflect.getOwnMetadata(t,o)||[],l=I(o),h=[];for(let e=0;e<c.length;e++)if(l.Context.includes(e)){const t=r(exports.ReflectParamIndex.Context,o)||[];t.push(e),i(exports.ReflectParamIndex.Context,t,a)}else if(l.Definition.includes(e)){const t=r(exports.ReflectParamIndex.Definition,o)||[];t.push(e),i(exports.ReflectParamIndex.Definition,t,a)}else if(l.Configuration.includes(e)){const t=r(exports.ReflectParamIndex.Configuration,o)||[];t.push(e),i(exports.ReflectParamIndex.Configuration,t,a)}else if(l.Dispose.includes(e)){const t=r(exports.ReflectParamIndex.Dispose,o)||[];t.push(e),i(exports.ReflectParamIndex.Dispose,t,a),h.push(c[e])}else if(l.Use.includes(e)){const t=r(exports.ReflectParamValue.UseIdentifier,o);w(t[e],a,e)}else;return n?u(a,r(s.AssemblageDefinition,o)):a};class j{static of(e,t,n){return new j(e,t,n)}dispose(){this.singletonInstance&&(((e,t)=>{if(e.concrete.prototype instanceof x){const n=t;for(const t of e.events)n.off(t);n.removeChannels(...e.events),e.privateContext.removeChannels(...e.events)}})(this,this.singletonInstance),P(this.singletonInstance,"onDispose",this.publicContext,this.configuration),e.clearInstance(this.singletonInstance,this.concrete)),e.clearInstance(this,j)}build(){if(this.singletonInstance)return this.singletonInstance;const e=(e=>{const t=[],n=o(e.concrete),s=I(e.concrete);let i=0;for(const o of n)if(s.Context.includes(i))t.push(e.publicContext),i++;else if(s.Configuration.includes(i))t.push(e.configuration),i++;else if(s.Definition.includes(i))t.push(e.definition),i++;else if(s.Dispose.includes(i))t.push(e.privateContext.dispose),i++;else if(s.Use.includes(i)){const n=r(exports.ReflectParamValue.UseIdentifier,e.concrete)[i];t.push(e.privateContext.require(n)),i++}else t.push(e.privateContext.require(o)),i++;return t})(this),t=new this.concrete(...e);return((e,t)=>{if(e.concrete.prototype instanceof x){const n=t,s=n.channels;for(const t of e.events)s.has(t)||n.addChannels(t),e.privateContext.events.has(t)||e.privateContext.addChannels(t);for(const i of e.events)t.on(i,((...t)=>{e.privateContext.emit(i,...t)}))}})(this,t),this.isSingleton?(this.singletonInstance=t,this.privateContext.prepareInitHook(t,this.configuration),this.singletonInstance):(P(t,"onInit",this.publicContext),t)}get dependencies(){return this.dependenciesIds}get definition(){return h(this.concrete)||{}}get isSingleton(){return f("singleton",this.concrete)}get singleton(){return this.singletonInstance}get injections(){return f("inject",this.concrete)||[]}get objects(){return f("use",this.concrete)||[]}get tags(){return f("tags",this.concrete)||[]}get events(){return f("events",this.concrete)||[]}constructor(t,n,s){if(this.privateContext=n,this.publicContext=s,this.dependenciesIds=[],this.identifier=t.identifier,this.concrete=t.concrete,this.configuration=t.configuration,!a(this.concrete))throw new Error(`Class '${this.concrete.name}' is not an Assemblage.`);const i=e.forOf(this.injections),r=e.forOf(this.objects);i((e=>this.privateContext.register(e))),r((e=>{"string"==typeof e[0]||"symbol"==typeof e[0]?this.privateContext.use(e[0],e[1]):this.privateContext.register(e,!0)})),this.dependenciesIds=(e=>{const t=[],n=o(e),s=I(e);let i=0;for(const r of n)s.Context.includes(i)||s.Configuration.includes(i)||s.Definition.includes(i)||s.Dispose.includes(i)||s.Use.includes(i)||t.push(r),i++;return t})(this.concrete),t.instance?this.singletonInstance=t.instance:this.isSingleton}}const P=(t,n,s,i)=>new Promise((r=>{const o=t[n];if(o){if(e.isAsync(o))return void o.bind(t)(s,i).then((()=>{r()}));r(o.bind(t)(s,i))}}));class R extends x{static build(e){const t=new R;((e,t,n)=>{const r=h(n);r[e]=t;const o=l(r);i(s.AssemblageDefinition,o,n)})("singleton",!0,e);const n=t.register([e]),r=t.require(n.identifier),o=t.initCache.find((e=>e.instance===r));if(!o)throw new Error("Root instance not found in assemblages cache.");const a=t.initCache.indexOf(o);t.initCache.splice(a,1);for(const s of t.initCache)P(s.instance,"onInit",t.publicContext,s.configuration);return P(r,"onInit",t.publicContext,n.configuration),t.initCache.length=0,r}dispose(){for(const[e,t]of this.injectables)t.dispose();e.clearInstance(this,R)}register(t,n=!1){const s=!0===n?(e=>({identifier:e[0],concrete:e[0],instance:e[1],configuration:{}}))(t):(t=>e.switchCase({1:()=>(e=>({identifier:e[0],concrete:e[0],configuration:{}}))(t),2:()=>d(t),3:()=>(e=>({identifier:e[0],concrete:e[1],configuration:e[2]}))(t)},(()=>{throw new Error("Injection tuple must be of length 1, 2 or 3.")}))(t.length))(t);if(this.has(s.identifier))throw new Error(`An assemblage is already registered with identifier '${s.identifier.name}'.`);const i=j.of(s,this.privateContext,this.publicContext);return this.injectables.set(i.identifier,i),P(i.concrete,"onRegister",this.publicContext,i.configuration),i}use(e,t){if(this.has(e))throw new Error(`A value is already registered with identifier '${String(e)}'.`);return this.objects.set(e,t),t}prepareInitHook(e,t){return this.initCache.push({instance:e,configuration:t}),this.initCache}has(e){return"string"==typeof e||"symbol"==typeof e?this.objects.has(e):this.injectables.has(e)}require(e){switch(typeof e){case"string":case"symbol":if(!this.objects.has(e))throw new Error(`Injected object with identifier '${String(e)}' has not been registered.`);return this.objects.get(e);default:if(!this.injectables.has(e))throw new Error(`Class with identifier '${e.name}' has not been registered or is a circular dependency.`);return this.injectables.get(e).build()}}concrete(e){const t=this.injectables.get(e);if(t)return t.concrete}tagged(...e){const t=[];for(const n of e)for(const[e,s]of this.injectables)s.tags.includes(n)&&t.push(s.build());return t}get size(){return this.injectables.size}constructor(){super(),this.injectables=new Map,this.objects=new Map,this.initCache=[],this.publicContext={has:this.has.bind(this),require:this.require.bind(this),concrete:this.concrete.bind(this),tagged:this.tagged.bind(this),dispose:this.dispose.bind(this),on:this.on.bind(this),once:this.once.bind(this),off:this.off.bind(this),events:this.channels},this.privateContext={...this.publicContext,register:this.register.bind(this),use:this.use.bind(this),prepareInitHook:this.prepareInitHook.bind(this),emit:this.emit.bind(this),addChannels:this.addChannels.bind(this),removeChannels:this.removeChannels.bind(this)}}}exports.AbstractAssemblage=class{static onRegister(e,t){}},exports.AbstractAssembler=class extends g{},exports.AbstractEventManager=g,exports.AbstractListenerCollection=class{},exports.Assemblage=e=>t=>u(t,e),exports.Assembler=R,exports.Await=(e,t=25)=>(n,s,i)=>{const r=i.value;i.value=async function(){return new Promise((n=>{if(this[e])r.apply(this),n();else{const s=setInterval((()=>{this[e]&&(clearInterval(s),r.apply(this),n())}),t)}}))}},exports.Configuration=C,exports.ConstructorDecorator=A,exports.Context=b,exports.Definition=y,exports.Dispose=v,exports.EventManager=x,exports.ListenerCollection=p,exports.Use=e=>(t,n,s)=>{w(e,t,s)},exports.createConstructorDecorator=e=>(t=!0)=>A(e,t),exports.decorateAssemblage=u,exports.decorateUse=w,exports.getDecoratedParametersIndexes=I,exports.isAssemblage=a;
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { switchCase, pipe, conditionally, isClass, isObject, clearInstance, isDefined, isOfType, forIn, forOf, proxifyIterable, isAsync, onlyAlphanumeric } from '@assemblerjs/core';
|
|
2
|
+
|
|
1
3
|
class AbstractAssemblage {
|
|
2
4
|
static onRegister(s, t) {}
|
|
3
5
|
}
|
|
@@ -14,93 +16,6 @@ var ReflectValue;
|
|
|
14
16
|
e["AssemblageDefinition"] = "assemblage:definition.value";
|
|
15
17
|
})(ReflectValue || (ReflectValue = {}));
|
|
16
18
|
|
|
17
|
-
const NoOp = (...e)=>{};
|
|
18
|
-
const isOfType = (...e)=>(t)=>{
|
|
19
|
-
if (!e.includes(typeof t)) return undefined;
|
|
20
|
-
return typeof t;
|
|
21
|
-
};
|
|
22
|
-
const isUndefined = (e)=>typeof e === 'undefined';
|
|
23
|
-
const isNull = (e)=>e === null;
|
|
24
|
-
const isDefined = (e)=>!isUndefined(e) && !isNull(e);
|
|
25
|
-
const isClass = (e)=>{
|
|
26
|
-
return e && typeof e === 'function' && typeof e.constructor !== 'undefined';
|
|
27
|
-
};
|
|
28
|
-
const isObject = (e)=>typeof e === 'object' && !Array.isArray(e) && !isClass(e);
|
|
29
|
-
const isAsync = (e)=>typeof e === 'function' && e.constructor.name === 'AsyncFunction';
|
|
30
|
-
const moveArrayItem = (e, t, r)=>{
|
|
31
|
-
const o = e[t];
|
|
32
|
-
e.splice(t, 1);
|
|
33
|
-
e.splice(r, 0, o);
|
|
34
|
-
return e;
|
|
35
|
-
};
|
|
36
|
-
const dedupeArray = (e)=>Array.from(new Set(e));
|
|
37
|
-
const onlyAlphanumeric = (e, ...t)=>{
|
|
38
|
-
t.map((e, r)=>{
|
|
39
|
-
const o = /\S/.test(e);
|
|
40
|
-
if (o) t[r] = t[r].trim();
|
|
41
|
-
return !o ? r : -1;
|
|
42
|
-
}).filter((e)=>e >= 0).every((e)=>{
|
|
43
|
-
t[e] = ' ';
|
|
44
|
-
moveArrayItem(t, e, t.length - 1);
|
|
45
|
-
});
|
|
46
|
-
t = dedupeArray(t);
|
|
47
|
-
const r = new RegExp(`[^A-Za-zÀ-ÖØ-öø-ÿ0-9${t.join('')}]`, 'gi');
|
|
48
|
-
return e.replace(r, '');
|
|
49
|
-
};
|
|
50
|
-
const switchCase = (e, t)=>(r, ...o)=>e[r] ? e[r](...o) : t ? t(r, ...o) : NoOp();
|
|
51
|
-
const pipe = (...e)=>(t)=>e.reduce((e, t)=>t(e), t);
|
|
52
|
-
const conditionally = (e)=>(t)=>{
|
|
53
|
-
return e.if(t) ? e.then(t) : e.else ? e.else(t) : undefined;
|
|
54
|
-
};
|
|
55
|
-
const forOf = (e)=>(t)=>{
|
|
56
|
-
const r = Array.isArray(e) ? (e)=>parseInt(e) : NoOp;
|
|
57
|
-
for (const [o, n] of Object.entries(e)){
|
|
58
|
-
t(n, r(o));
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
const forIn = (e)=>(t)=>{
|
|
62
|
-
const r = Array.isArray(e) ? (e)=>parseInt(e) : (e)=>e;
|
|
63
|
-
for(const o in e){
|
|
64
|
-
t(r(o));
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
const e$2 = (e, t)=>{
|
|
68
|
-
return [
|
|
69
|
-
...Object.getOwnPropertyNames(t.prototype),
|
|
70
|
-
...Object.getOwnPropertyNames(Object.getPrototypeOf(e)),
|
|
71
|
-
...Object.getOwnPropertyNames(e)
|
|
72
|
-
];
|
|
73
|
-
};
|
|
74
|
-
const proxifyIterable = (t, r)=>{
|
|
75
|
-
const o = new Proxy(t, {
|
|
76
|
-
get: function(o, n) {
|
|
77
|
-
if (n === Symbol.iterator) {
|
|
78
|
-
return o[Symbol.iterator].bind(o);
|
|
79
|
-
} else if (!e$2(t, r).includes(n)) {
|
|
80
|
-
return o.collection[n];
|
|
81
|
-
}
|
|
82
|
-
return o[n];
|
|
83
|
-
},
|
|
84
|
-
set: function(e, t, r) {
|
|
85
|
-
return Reflect.set(e, t, r);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
return o;
|
|
89
|
-
};
|
|
90
|
-
const clearInstance = (e, t)=>{
|
|
91
|
-
const r = (e, t)=>{
|
|
92
|
-
return [
|
|
93
|
-
...Object.getOwnPropertyNames(t.prototype),
|
|
94
|
-
...Object.getOwnPropertyNames(Object.getPrototypeOf(e)),
|
|
95
|
-
...Object.getOwnPropertyNames(e)
|
|
96
|
-
];
|
|
97
|
-
};
|
|
98
|
-
const o = e;
|
|
99
|
-
for (const n of r(e, t)){
|
|
100
|
-
delete o[n];
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
19
|
const defineCustomMetadata = (t, o, n)=>{
|
|
105
20
|
Reflect.defineMetadata(`${ReflectPrefix}${t}${ReflectSuffix}`, o, n);
|
|
106
21
|
};
|
|
@@ -201,22 +116,22 @@ const setDefinitionValue = (e, o, n)=>{
|
|
|
201
116
|
return i;
|
|
202
117
|
};
|
|
203
118
|
|
|
204
|
-
const i$1 = (
|
|
119
|
+
const i$1 = (e)=>{
|
|
205
120
|
return {
|
|
206
|
-
identifier:
|
|
207
|
-
concrete:
|
|
121
|
+
identifier: e[0],
|
|
122
|
+
concrete: e[0],
|
|
208
123
|
configuration: {}
|
|
209
124
|
};
|
|
210
125
|
};
|
|
211
|
-
const c$2 = (
|
|
212
|
-
const i = ()=>isClass(
|
|
213
|
-
const c = ()=>isClass(
|
|
214
|
-
const
|
|
126
|
+
const c$2 = (o)=>{
|
|
127
|
+
const i = ()=>isClass(o[0]) && isClass(o[1]);
|
|
128
|
+
const c = ()=>isClass(o[0]) && isObject(o[1]);
|
|
129
|
+
const s = ()=>pipe(conditionally({
|
|
215
130
|
if: ()=>i(),
|
|
216
131
|
then: ()=>{
|
|
217
132
|
return {
|
|
218
|
-
identifier:
|
|
219
|
-
concrete:
|
|
133
|
+
identifier: o[0],
|
|
134
|
+
concrete: o[1],
|
|
220
135
|
configuration: {}
|
|
221
136
|
};
|
|
222
137
|
}
|
|
@@ -224,29 +139,29 @@ const c$2 = (r)=>{
|
|
|
224
139
|
if: ()=>c(),
|
|
225
140
|
then: ()=>{
|
|
226
141
|
return {
|
|
227
|
-
identifier:
|
|
228
|
-
concrete:
|
|
229
|
-
configuration:
|
|
142
|
+
identifier: o[0],
|
|
143
|
+
concrete: o[0],
|
|
144
|
+
configuration: o[1]
|
|
230
145
|
};
|
|
231
146
|
},
|
|
232
|
-
else: (
|
|
147
|
+
else: (e)=>e
|
|
233
148
|
}))();
|
|
234
|
-
return
|
|
149
|
+
return s();
|
|
235
150
|
};
|
|
236
|
-
const
|
|
151
|
+
const s$2 = (e)=>{
|
|
237
152
|
return {
|
|
238
|
-
identifier:
|
|
239
|
-
concrete:
|
|
240
|
-
configuration:
|
|
153
|
+
identifier: e[0],
|
|
154
|
+
concrete: e[1],
|
|
155
|
+
configuration: e[2]
|
|
241
156
|
};
|
|
242
157
|
};
|
|
243
|
-
const resolveInjectionTuple = (
|
|
244
|
-
1: ()=>i$1(
|
|
245
|
-
2: ()=>c$2(
|
|
246
|
-
3: ()=>
|
|
158
|
+
const resolveInjectionTuple = (e)=>switchCase({
|
|
159
|
+
1: ()=>i$1(e),
|
|
160
|
+
2: ()=>c$2(e),
|
|
161
|
+
3: ()=>s$2(e)
|
|
247
162
|
}, ()=>{
|
|
248
163
|
throw new Error(`Injection tuple must be of length 1, 2 or 3.`);
|
|
249
|
-
})(
|
|
164
|
+
})(e.length);
|
|
250
165
|
|
|
251
166
|
const resolveInstanceInjectionTuple = (e)=>{
|
|
252
167
|
return {
|
|
@@ -313,7 +228,7 @@ class ListenerCollection {
|
|
|
313
228
|
if: ()=>this.collection[t] && this.collection[t].length === 0,
|
|
314
229
|
then: ()=>delete this.collection[t]
|
|
315
230
|
});
|
|
316
|
-
const
|
|
231
|
+
const o = conditionally({
|
|
317
232
|
if: ()=>isDefined(n),
|
|
318
233
|
then: ()=>l(this.collection[t].indexOf(n)),
|
|
319
234
|
else: ()=>delete this.collection[t]
|
|
@@ -322,7 +237,7 @@ class ListenerCollection {
|
|
|
322
237
|
if: (t)=>this.has(t),
|
|
323
238
|
then: (t)=>this.collection[t]
|
|
324
239
|
});
|
|
325
|
-
pipe(r,
|
|
240
|
+
pipe(r, o, c)();
|
|
326
241
|
return this;
|
|
327
242
|
}
|
|
328
243
|
has(...t) {
|
|
@@ -383,83 +298,83 @@ class EventManager {
|
|
|
383
298
|
clearInstance(this, EventManager);
|
|
384
299
|
}
|
|
385
300
|
addChannels(...e) {
|
|
386
|
-
const
|
|
387
|
-
|
|
388
|
-
const
|
|
389
|
-
if (this.channels.has(
|
|
390
|
-
throw new Error(`Channel '${
|
|
301
|
+
const n = forOf(e);
|
|
302
|
+
n((e)=>{
|
|
303
|
+
const s = this.cleanChannel(e);
|
|
304
|
+
if (this.channels.has(s)) {
|
|
305
|
+
throw new Error(`Channel '${s}' already exists.`);
|
|
391
306
|
}
|
|
392
|
-
this.channels.add(
|
|
307
|
+
this.channels.add(s);
|
|
393
308
|
});
|
|
394
309
|
return this;
|
|
395
310
|
}
|
|
396
311
|
removeChannels(...e) {
|
|
397
|
-
const
|
|
398
|
-
|
|
399
|
-
const
|
|
400
|
-
if (
|
|
401
|
-
this.channels.delete(
|
|
402
|
-
this.listeners.remove(
|
|
403
|
-
this.onceListeners.remove(
|
|
312
|
+
const n = forOf(e);
|
|
313
|
+
n((e)=>{
|
|
314
|
+
const s = this.cleanChannel(e);
|
|
315
|
+
if (s !== '*' && this.channels.has(s)) {
|
|
316
|
+
this.channels.delete(s);
|
|
317
|
+
this.listeners.remove(s);
|
|
318
|
+
this.onceListeners.remove(s);
|
|
404
319
|
}
|
|
405
320
|
});
|
|
406
321
|
return this;
|
|
407
322
|
}
|
|
408
|
-
on(e,
|
|
409
|
-
const
|
|
410
|
-
if (!this.channels.has(
|
|
411
|
-
throw new Error(`Channel '${
|
|
323
|
+
on(e, s) {
|
|
324
|
+
const n = this.cleanChannel(e);
|
|
325
|
+
if (!this.channels.has(n)) {
|
|
326
|
+
throw new Error(`Channel '${n}' was not registered.`);
|
|
412
327
|
}
|
|
413
|
-
this.listeners.add(
|
|
328
|
+
this.listeners.add(n, s);
|
|
414
329
|
return this;
|
|
415
330
|
}
|
|
416
|
-
once(e,
|
|
417
|
-
const
|
|
418
|
-
if (!this.channels.has(
|
|
419
|
-
throw new Error(`Channel '${
|
|
331
|
+
once(e, s) {
|
|
332
|
+
const n = this.cleanChannel(e);
|
|
333
|
+
if (!this.channels.has(n)) {
|
|
334
|
+
throw new Error(`Channel '${n}' was not registered.`);
|
|
420
335
|
}
|
|
421
|
-
this.onceListeners.add(
|
|
336
|
+
this.onceListeners.add(n, s);
|
|
422
337
|
return this;
|
|
423
338
|
}
|
|
424
|
-
off(e,
|
|
425
|
-
const
|
|
426
|
-
this.listeners.remove(
|
|
339
|
+
off(e, s) {
|
|
340
|
+
const n = this.cleanChannel(e);
|
|
341
|
+
this.listeners.remove(n, s);
|
|
427
342
|
return this;
|
|
428
343
|
}
|
|
429
|
-
emit(e, ...
|
|
344
|
+
emit(e, ...n) {
|
|
430
345
|
const t = this.cleanChannel(e);
|
|
431
346
|
if (this.channels.has(t)) {
|
|
432
347
|
const e = this.onceListeners.get('*') || [];
|
|
433
348
|
const i = this.listeners.get('*') || [];
|
|
434
|
-
const
|
|
435
|
-
const
|
|
349
|
+
const r = this.onceListeners.get(t) || [];
|
|
350
|
+
const h = this.listeners.get(t) || [];
|
|
436
351
|
const o = forOf(e);
|
|
437
|
-
const
|
|
438
|
-
const
|
|
439
|
-
const l = forOf(
|
|
352
|
+
const a = forOf(i);
|
|
353
|
+
const c = forOf(r);
|
|
354
|
+
const l = forOf(h);
|
|
440
355
|
o((e)=>{
|
|
441
|
-
this.run(e, ...
|
|
356
|
+
this.run(e, ...n);
|
|
442
357
|
this.onceListeners.remove('*', e);
|
|
443
358
|
});
|
|
444
|
-
c((e)=>{
|
|
445
|
-
this.run(e, ...s);
|
|
446
|
-
});
|
|
447
359
|
a((e)=>{
|
|
448
|
-
this.run(e, ...
|
|
360
|
+
this.run(e, ...n);
|
|
361
|
+
});
|
|
362
|
+
c((e)=>{
|
|
363
|
+
this.run(e, ...n);
|
|
449
364
|
this.onceListeners.remove(t, e);
|
|
450
365
|
});
|
|
451
366
|
l((e)=>{
|
|
452
|
-
this.run(e, ...
|
|
367
|
+
this.run(e, ...n);
|
|
453
368
|
});
|
|
454
369
|
}
|
|
455
370
|
return this;
|
|
456
371
|
}
|
|
457
|
-
run(e, ...
|
|
372
|
+
run(e, ...s) {
|
|
458
373
|
if (isAsync(e)) {
|
|
459
|
-
const
|
|
460
|
-
return
|
|
374
|
+
const n = e;
|
|
375
|
+
return n(...s).then(()=>Promise.resolve());
|
|
461
376
|
}
|
|
462
|
-
e(...
|
|
377
|
+
e(...s);
|
|
463
378
|
}
|
|
464
379
|
cleanChannel(e) {
|
|
465
380
|
return onlyAlphanumeric(e, '*');
|
|
@@ -778,17 +693,17 @@ class Injectable {
|
|
|
778
693
|
}
|
|
779
694
|
}
|
|
780
695
|
|
|
781
|
-
const callHook = (
|
|
696
|
+
const callHook = (e, o, n, t)=>{
|
|
782
697
|
return new Promise((i)=>{
|
|
783
|
-
const
|
|
784
|
-
if (
|
|
785
|
-
if (isAsync(
|
|
786
|
-
|
|
698
|
+
const s = e[o];
|
|
699
|
+
if (s) {
|
|
700
|
+
if (isAsync(s)) {
|
|
701
|
+
s.bind(e)(n, t).then(()=>{
|
|
787
702
|
i();
|
|
788
703
|
});
|
|
789
704
|
return;
|
|
790
705
|
}
|
|
791
|
-
i(
|
|
706
|
+
i(s.bind(e)(n, t));
|
|
792
707
|
}
|
|
793
708
|
});
|
|
794
709
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "assemblerjs",
|
|
3
3
|
"description": "A general purpose and zero-dependency Dependency Injection library for node and browser.",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.5",
|
|
5
5
|
"author": "Benoît LAHOZ <info@benoitlahoz.io>",
|
|
6
6
|
"bugs": "https://github.com/benoitlahoz/assemblerjs/issues",
|
|
7
7
|
"homepage": "https://github.com/benoitlahoz/assemblerjs#README",
|
|
@@ -50,5 +50,7 @@
|
|
|
50
50
|
"test": "vitest --coverage --passWithNoTests",
|
|
51
51
|
"coverage": "vitest run --coverage --passWithNoTests && istanbul-badges-readme"
|
|
52
52
|
},
|
|
53
|
-
"dependencies": {
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@assemblerjs/core": "^0.8.4"
|
|
55
|
+
}
|
|
54
56
|
}
|