assemblerjs 0.4.0 → 0.4.2
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 +18 -10
- package/dist/index.js +1 -1
- package/dist/index.mjs +150 -150
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -115,6 +115,13 @@ declare interface AssemblageDefinition {
|
|
|
115
115
|
* `assembler.js` dependency injection container and handler.
|
|
116
116
|
*/
|
|
117
117
|
export declare class Assembler extends EventManager implements AbstractAssembler {
|
|
118
|
+
/**
|
|
119
|
+
* Build the dependencies tree from an assemblage as entry point.
|
|
120
|
+
*
|
|
121
|
+
* @param { Concrete<T> } entry An assemblage concrete class.
|
|
122
|
+
* @returns { T } An instance of `entry` marked as singleton.
|
|
123
|
+
*/
|
|
124
|
+
static build<T>(entry: Concrete<T>): T;
|
|
118
125
|
protected injectables: Map<Identifier<unknown>, Injectable<unknown>>;
|
|
119
126
|
protected objects: Map<string | Symbol, unknown>;
|
|
120
127
|
private initCache;
|
|
@@ -126,13 +133,6 @@ export declare class Assembler extends EventManager implements AbstractAssembler
|
|
|
126
133
|
* Context passed to assemblages.
|
|
127
134
|
*/
|
|
128
135
|
readonly publicContext: AssemblerContext;
|
|
129
|
-
/**
|
|
130
|
-
* Build the dependencies tree from an assemblage as entry point.
|
|
131
|
-
*
|
|
132
|
-
* @param { Concrete<T> } entry An assemblage concrete class.
|
|
133
|
-
* @returns { T } An instance of `entry` marked as singleton.
|
|
134
|
-
*/
|
|
135
|
-
static build<T>(entry: Concrete<T>): T;
|
|
136
136
|
private constructor();
|
|
137
137
|
/**
|
|
138
138
|
* Dispose assembler and all its injectables.
|
|
@@ -186,8 +186,8 @@ export declare class Assembler extends EventManager implements AbstractAssembler
|
|
|
186
186
|
/**
|
|
187
187
|
* Check if `Assembler` has given identifier registered.
|
|
188
188
|
*
|
|
189
|
-
* @param { Identifier<T> | string | symbol } identifier An abstract or concrete class
|
|
190
|
-
*
|
|
189
|
+
* @param { Identifier<T> | string | symbol } identifier An abstract or concrete class,
|
|
190
|
+
* or a string or Symbol as identifier.
|
|
191
191
|
* @returns { boolean } `true` if dependency has been registered.
|
|
192
192
|
*/
|
|
193
193
|
has<T>(identifier: Identifier<T> | string | Symbol): boolean;
|
|
@@ -201,7 +201,7 @@ export declare class Assembler extends EventManager implements AbstractAssembler
|
|
|
201
201
|
/**
|
|
202
202
|
* Require dependencies by tag passed in assemblage's definition.
|
|
203
203
|
*
|
|
204
|
-
* @param { string
|
|
204
|
+
* @param { string[] } tags The tags to get dependencies.
|
|
205
205
|
* @returns { unknown[] } An array of instances for the given tags. If registered
|
|
206
206
|
* identifier is not marked as 'singleton', will resolve in a new instance.
|
|
207
207
|
*/
|
|
@@ -415,6 +415,14 @@ export declare class Assembler extends EventManager implements AbstractAssembler
|
|
|
415
415
|
*/
|
|
416
416
|
declare type InstanceInjection<T> = Tuple<[Identifier<T> | string | Symbol, T]>;
|
|
417
417
|
|
|
418
|
+
/**
|
|
419
|
+
* Check if a given class is an `Assemblage`.
|
|
420
|
+
*
|
|
421
|
+
* @param { Concrete<T> } target The class to test.
|
|
422
|
+
* @returns `true` if the class is an assemblage.
|
|
423
|
+
*/
|
|
424
|
+
export declare const isAssemblage: <T>(target: Concrete<T>) => boolean;
|
|
425
|
+
|
|
418
426
|
/**
|
|
419
427
|
* Describes a listener type as a function taking any number of arguments and returning `void`.
|
|
420
428
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e=function(e){return e.IsAssemblage="is_assemblage",e}({}),t=function(e){return e.AssemblageDefinition="assemblage:definition.value",e}({});const n=(...e)=>{},s=(...e)=>t=>{if(e.includes(typeof t))return typeof t},i=e=>!(e=>void 0===e)(e)&&!(e=>null===e)(e),r=e=>e&&"function"==typeof e&&void 0!==e.constructor,o=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,"")},a=(...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,l=e=>t=>{const s=Array.isArray(e)?e=>parseInt(e):n;for(const[n,i]of Object.entries(e))t(i,s(n))},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},f=(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)},p=(e,t)=>Reflect.getOwnMetadata(`__${e}__`,t),g=e=>Reflect.getMetadata("design:paramtypes",e)||[],b=t=>p(e.IsAssemblage,t)||!1,m={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},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(m).includes(n))throw new Error(`Property '${n}' is not a valid assemblage definition property.`);const e=m[n].test,s=m[n].throw,i=m[n].transform;e(t[n])||s(),t[n]=i(t[n])}return t},v=e=>{if(!b(e))throw new Error(`Class '${e.name}' is not an assemblage.`);return p(t.AssemblageDefinition,e)},w=(e,t)=>v(t)[e],x=e=>{const t=()=>r(e[0])&&(e=>"object"==typeof e&&!Array.isArray(e)&&!r(e))(e[1]);return a(h({if:()=>r(e[0])&&r(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}))()};var C=function(e){return e.UseIdentifier="assemblage:use.param.value",e}({}),j=function(e){return 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",e}({});const A=e=>()=>(t,n,s)=>{const i=p(e,t)||[];i.push(s),d(e,i,t)},I=A(j.Context),O=A(j.Configuration),P=A(j.Definition),E=A(j.Dispose),D=e=>{const t=(e=>p(j.Context,e)||[])(e),n=(e=>p(j.Definition,e)||[])(e),s=(e=>p(j.Configuration,e)||[])(e),i=(e=>p(j.Dispose,e)||[])(e),r=(e=>p(j.Use,e)||[])(e);return{context:t,definition:n,configuration:s,dispose:i,use:r}};let $=Symbol.iterator;class S{dispose(){f(this,S)}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=>!i(this.collection[e.channel]),then:e=>{this.collection[e.channel]=[],t(e)},else:e=>{t(e)}});return a(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]}),r=h({if:()=>i(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 a(o,r,s)(),this}has(...e){return s("string")(e[0])?Object.keys(this.collection).includes(e[0]):!!s("function")(e[0])&&Object.values(this.collection).flat().includes(e[0])}get(...e){return s("string")(e[0])?this.collection[e[0]]:s("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=>l(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}[$](){let e=-1;const t=this.collection?Object.keys(this.collection):[];return{next:()=>({value:t[++e],done:!(e in t)})}}constructor(){!function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"collection",{});return u(this,S)}}class R{}function U(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class _{dispose(){this.listeners.dispose(),this.channels.clear(),f(this,_)}addChannels(...e){return l(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 l(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=l(e),c=l(s),a=l(i),h=l(r);o((e=>{this.run(e,...t),this.onceListeners.remove("*",e)})),c((e=>{this.run(e,...t)})),a((e=>{this.run(e,...t),this.onceListeners.remove(n,e)})),h((e=>{this.run(e,...t)}))}return this}run(e,...t){if(o(e)){return e(...t).then((()=>Promise.resolve()))}e(...t)}cleanChannel(e){return c(e,"*")}constructor(...e){U(this,"listeners",new S),U(this,"onceListeners",new S),U(this,"channels",new Set(["*"])),this.addChannels(...e)}}function k(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class M{static of(e,t,n){return new M(e,t,n)}dispose(){this.singletonInstance&&(((e,t)=>{if(e.concrete.prototype instanceof _){const n=t;for(const t of e.events)n.off(t);n.removeChannels(...e.events),e.privateContext.removeChannels(...e.events)}})(this,this.singletonInstance),L(this.singletonInstance,"onDispose",this.publicContext),f(this.singletonInstance,this.concrete)),f(this,M)}build(){if(this.singletonInstance)return this.singletonInstance;const e=(e=>{const t=[],n=g(e.concrete),s=D(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=p(C.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 _){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.singletonInstance):(L(t,"onInit",this.publicContext),t)}get dependencies(){return this.dependenciesIds}get definition(){return v(this.concrete)||{}}get isSingleton(){return w("singleton",this.concrete)||!0}get singleton(){return this.singletonInstance}get injections(){return w("inject",this.concrete)||[]}get objects(){return w("use",this.concrete)||[]}get tags(){return w("tags",this.concrete)||[]}get events(){return w("events",this.concrete)||[]}constructor(e,t,n){if(k(this,"privateContext",void 0),k(this,"publicContext",void 0),k(this,"identifier",void 0),k(this,"concrete",void 0),k(this,"configuration",void 0),k(this,"dependenciesIds",void 0),k(this,"singletonInstance",void 0),this.privateContext=t,this.publicContext=n,this.dependenciesIds=[],this.identifier=e.identifier,this.concrete=e.concrete,this.configuration=e.configuration,!b(this.concrete))throw new Error(`Class '${this.concrete.name}' is not an Assemblage.`);const s=l(this.injections),i=l(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=g(e),s=D(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)}}const L=(e,t,n)=>new Promise((s=>{const i=e[t];if(i){if(o(i))return void i.bind(e)(n).then((()=>{s()}));s(i.bind(e)(n))}}));function q(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class N extends _{static build(e){const n=new N;((e,n,s)=>{const i=v(s);i[e]=n;const r=y(i);d(t.AssemblageDefinition,r,s)})("singleton",!0,e);const s=n.register([e]),i=n.require(s.identifier),r=n.initCache.indexOf(i);n.initCache.splice(r,1);for(const t of n.initCache)L(t,"onInit",n.publicContext);return L(i,"onInit",n.publicContext),n.initCache.length=0,i}dispose(){for(const[e,t]of this.injectables)t.dispose();f(this,N)}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:()=>x(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),L(s.concrete,"onRegister",this.publicContext),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){return this.initCache.push(e),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(`Assemblage with identifier '${e.name}' has not been registered.`);return this.injectables.get(e).build()}}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(),q(this,"injectables",new Map),q(this,"objects",new Map),q(this,"initCache",[]),q(this,"privateContext",void 0),q(this,"publicContext",void 0),this.publicContext={has:this.has.bind(this),require:this.require.bind(this),tagged:this.tagged.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),dispose:this.dispose.bind(this)}}}exports.AbstractAssemblage=class{static onRegister(e){}},exports.AbstractAssembler=class extends R{},exports.AbstractEventManager=R,exports.Assemblage=n=>{const s=n?y(n):{};return n=>(d(e.IsAssemblage,!0,n),d(t.AssemblageDefinition,s,n),n)},exports.Assembler=N,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=O,exports.Context=I,exports.Definition=P,exports.Dispose=E,exports.EventManager=_,exports.ReflectParamIndex=j,exports.ReflectParamValue=C,exports.Use=e=>(t,n,s)=>{const i=p(j.Use,t)||[];i.push(s),d(j.Use,i,t);const r=p(C.UseIdentifier,t)||{};r[s]=e,d(C.UseIdentifier,r,t)},exports.getDecoratedParametersIndexes=D;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e=function(e){return e.IsAssemblage="is_assemblage",e}({}),t=function(e){return e.AssemblageDefinition="assemblage:definition.value",e}({});const n=(...e)=>{},s=(...e)=>t=>{if(e.includes(typeof t))return typeof t},i=e=>!(e=>void 0===e)(e)&&!(e=>null===e)(e),r=e=>e&&"function"==typeof e&&void 0!==e.constructor,o=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,"")},a=(...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,l=e=>t=>{const s=Array.isArray(e)?e=>parseInt(e):n;for(const[n,i]of Object.entries(e))t(i,s(n))},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},f=(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)},p=(e,t)=>Reflect.getOwnMetadata(`__${e}__`,t),g=e=>Reflect.getMetadata("design:paramtypes",e)||[],b=t=>p(e.IsAssemblage,t)||!1,m={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},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(m).includes(n))throw new Error(`Property '${n}' is not a valid assemblage definition property.`);const e=m[n].test,s=m[n].throw,i=m[n].transform;e(t[n])||s(),t[n]=i(t[n])}return t},v=e=>{if(!b(e))throw new Error(`Class '${e.name}' is not an assemblage.`);return p(t.AssemblageDefinition,e)},w=(e,t)=>v(t)[e],x=e=>{const t=()=>r(e[0])&&(e=>"object"==typeof e&&!Array.isArray(e)&&!r(e))(e[1]);return a(h({if:()=>r(e[0])&&r(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}))()};let C=Symbol.iterator;class j{dispose(){f(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=>!i(this.collection[e.channel]),then:e=>{this.collection[e.channel]=[],t(e)},else:e=>{t(e)}});return a(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]}),r=h({if:()=>i(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 a(o,r,s)(),this}has(...e){return s("string")(e[0])?Object.keys(this.collection).includes(e[0]):!!s("function")(e[0])&&Object.values(this.collection).flat().includes(e[0])}get(...e){return s("string")(e[0])?this.collection[e[0]]:s("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=>l(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}[C](){let e=-1;const t=this.collection?Object.keys(this.collection):[];return{next:()=>({value:t[++e],done:!(e in t)})}}constructor(){!function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"collection",{});return u(this,j)}}class A{}function I(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class O{dispose(){this.listeners.dispose(),this.channels.clear(),f(this,O)}addChannels(...e){return l(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 l(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=l(e),c=l(s),a=l(i),h=l(r);o((e=>{this.run(e,...t),this.onceListeners.remove("*",e)})),c((e=>{this.run(e,...t)})),a((e=>{this.run(e,...t),this.onceListeners.remove(n,e)})),h((e=>{this.run(e,...t)}))}return this}run(e,...t){if(o(e)){return e(...t).then((()=>Promise.resolve()))}e(...t)}cleanChannel(e){return c(e,"*")}constructor(...e){I(this,"listeners",new j),I(this,"onceListeners",new j),I(this,"channels",new Set(["*"])),this.addChannels(...e)}}var P=function(e){return e.UseIdentifier="assemblage:use.param.value",e}({}),E=function(e){return 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",e}({});const D=e=>()=>(t,n,s)=>{const i=p(e,t)||[];i.push(s),d(e,i,t)},$=D(E.Context),S=D(E.Configuration),R=D(E.Definition),U=D(E.Dispose),_=e=>{const t=(e=>p(E.Context,e)||[])(e),n=(e=>p(E.Definition,e)||[])(e),s=(e=>p(E.Configuration,e)||[])(e),i=(e=>p(E.Dispose,e)||[])(e),r=(e=>p(E.Use,e)||[])(e);return{context:t,definition:n,configuration:s,dispose:i,use:r}};function k(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class M{static of(e,t,n){return new M(e,t,n)}dispose(){this.singletonInstance&&(((e,t)=>{if(e.concrete.prototype instanceof O){const n=t;for(const t of e.events)n.off(t);n.removeChannels(...e.events),e.privateContext.removeChannels(...e.events)}})(this,this.singletonInstance),L(this.singletonInstance,"onDispose",this.publicContext),f(this.singletonInstance,this.concrete)),f(this,M)}build(){if(this.singletonInstance)return this.singletonInstance;const e=(e=>{const t=[],n=g(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=p(P.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 O){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.singletonInstance):(L(t,"onInit",this.publicContext),t)}get dependencies(){return this.dependenciesIds}get definition(){return v(this.concrete)||{}}get isSingleton(){return w("singleton",this.concrete)||!0}get singleton(){return this.singletonInstance}get injections(){return w("inject",this.concrete)||[]}get objects(){return w("use",this.concrete)||[]}get tags(){return w("tags",this.concrete)||[]}get events(){return w("events",this.concrete)||[]}constructor(e,t,n){if(k(this,"privateContext",void 0),k(this,"publicContext",void 0),k(this,"identifier",void 0),k(this,"concrete",void 0),k(this,"configuration",void 0),k(this,"dependenciesIds",void 0),k(this,"singletonInstance",void 0),this.privateContext=t,this.publicContext=n,this.dependenciesIds=[],this.identifier=e.identifier,this.concrete=e.concrete,this.configuration=e.configuration,!b(this.concrete))throw new Error(`Class '${this.concrete.name}' is not an Assemblage.`);const s=l(this.injections),i=l(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=g(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)}}const L=(e,t,n)=>new Promise((s=>{const i=e[t];if(i){if(o(i))return void i.bind(e)(n).then((()=>{s()}));s(i.bind(e)(n))}}));function q(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class N extends O{static build(e){const n=new N;((e,n,s)=>{const i=v(s);i[e]=n;const r=y(i);d(t.AssemblageDefinition,r,s)})("singleton",!0,e);const s=n.register([e]),i=n.require(s.identifier),r=n.initCache.indexOf(i);n.initCache.splice(r,1);for(const t of n.initCache)L(t,"onInit",n.publicContext);return L(i,"onInit",n.publicContext),n.initCache.length=0,i}dispose(){for(const[e,t]of this.injectables)t.dispose();f(this,N)}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:()=>x(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),L(s.concrete,"onRegister",this.publicContext),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){return this.initCache.push(e),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()}}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(),q(this,"injectables",new Map),q(this,"objects",new Map),q(this,"initCache",[]),q(this,"privateContext",void 0),q(this,"publicContext",void 0),this.publicContext={has:this.has.bind(this),require:this.require.bind(this),tagged:this.tagged.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),dispose:this.dispose.bind(this)}}}exports.AbstractAssemblage=class{static onRegister(e){}},exports.AbstractAssembler=class extends A{},exports.AbstractEventManager=A,exports.Assemblage=n=>{const s=n?y(n):{};return n=>(d(e.IsAssemblage,!0,n),d(t.AssemblageDefinition,s,n),n)},exports.Assembler=N,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=S,exports.Context=$,exports.Definition=R,exports.Dispose=U,exports.EventManager=O,exports.ReflectParamIndex=E,exports.ReflectParamValue=P,exports.Use=e=>(t,n,s)=>{const i=p(E.Use,t)||[];i.push(s),d(E.Use,i,t);const r=p(P.UseIdentifier,t)||{};r[s]=e,d(P.UseIdentifier,r,t)},exports.getDecoratedParametersIndexes=_,exports.isAssemblage=b;
|
package/dist/index.mjs
CHANGED
|
@@ -262,149 +262,7 @@ const Assemblage = (m)=>{
|
|
|
262
262
|
};
|
|
263
263
|
};
|
|
264
264
|
|
|
265
|
-
|
|
266
|
-
return (n, s, a)=>{
|
|
267
|
-
const i = a.value;
|
|
268
|
-
a.value = async function() {
|
|
269
|
-
return new Promise((n)=>{
|
|
270
|
-
if (this[t]) {
|
|
271
|
-
i.apply(this);
|
|
272
|
-
n();
|
|
273
|
-
} else {
|
|
274
|
-
const s = setInterval(()=>{
|
|
275
|
-
if (this[t]) {
|
|
276
|
-
clearInterval(s);
|
|
277
|
-
i.apply(this);
|
|
278
|
-
n();
|
|
279
|
-
}
|
|
280
|
-
}, e);
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
};
|
|
284
|
-
};
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
var ReflectParamValue = /*#__PURE__*/ function(e) {
|
|
288
|
-
e["UseIdentifier"] = "assemblage:use.param.value";
|
|
289
|
-
return e;
|
|
290
|
-
}({});
|
|
291
|
-
var ReflectParamIndex = /*#__PURE__*/ function(e) {
|
|
292
|
-
e["Context"] = "assembler:context.param.index";
|
|
293
|
-
e["Dispose"] = "assembler:dispose.param.index";
|
|
294
|
-
e["Definition"] = "assemblage:definition.param.index";
|
|
295
|
-
e["Configuration"] = "assemblage:configuration.param.index";
|
|
296
|
-
e["Use"] = "assemblage:use.param.index";
|
|
297
|
-
return e;
|
|
298
|
-
}({});
|
|
299
|
-
|
|
300
|
-
const i = (t)=>()=>{
|
|
301
|
-
return (i, s, r)=>{
|
|
302
|
-
const c = getOwnCustomMetadata(t, i) || [];
|
|
303
|
-
c.push(r);
|
|
304
|
-
defineCustomMetadata(t, c, i);
|
|
305
|
-
};
|
|
306
|
-
};
|
|
307
|
-
const s$1 = i(ReflectParamIndex.Context);
|
|
308
|
-
const r$1 = i(ReflectParamIndex.Configuration);
|
|
309
|
-
const c$1 = i(ReflectParamIndex.Definition);
|
|
310
|
-
const e$4 = i(ReflectParamIndex.Dispose);
|
|
311
|
-
|
|
312
|
-
const Use = (n)=>{
|
|
313
|
-
return (r, i, m)=>{
|
|
314
|
-
const c = getOwnCustomMetadata(ReflectParamIndex.Use, r) || [];
|
|
315
|
-
c.push(m);
|
|
316
|
-
defineCustomMetadata(ReflectParamIndex.Use, c, r);
|
|
317
|
-
const U = getOwnCustomMetadata(ReflectParamValue.UseIdentifier, r) || {};
|
|
318
|
-
U[m] = n;
|
|
319
|
-
defineCustomMetadata(ReflectParamValue.UseIdentifier, U, r);
|
|
320
|
-
};
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
const o = (o)=>{
|
|
324
|
-
return getOwnCustomMetadata(ReflectParamIndex.Context, o) || [];
|
|
325
|
-
};
|
|
326
|
-
const r = (o)=>{
|
|
327
|
-
return getOwnCustomMetadata(ReflectParamIndex.Configuration, o) || [];
|
|
328
|
-
};
|
|
329
|
-
const e$3 = (o)=>{
|
|
330
|
-
return getOwnCustomMetadata(ReflectParamIndex.Definition, o) || [];
|
|
331
|
-
};
|
|
332
|
-
const s = (o)=>{
|
|
333
|
-
return getOwnCustomMetadata(ReflectParamIndex.Dispose, o) || [];
|
|
334
|
-
};
|
|
335
|
-
const c = (o)=>{
|
|
336
|
-
return getOwnCustomMetadata(ReflectParamIndex.Use, o) || [];
|
|
337
|
-
};
|
|
338
|
-
const getDecoratedParametersIndexes = (t)=>{
|
|
339
|
-
const n = o(t);
|
|
340
|
-
const i = e$3(t);
|
|
341
|
-
const a = r(t);
|
|
342
|
-
const u = s(t);
|
|
343
|
-
const m = c(t);
|
|
344
|
-
return {
|
|
345
|
-
context: n,
|
|
346
|
-
definition: i,
|
|
347
|
-
configuration: a,
|
|
348
|
-
dispose: u,
|
|
349
|
-
use: m
|
|
350
|
-
};
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
const resolveParameters = (i)=>{
|
|
354
|
-
const c = [];
|
|
355
|
-
const s = getParamTypes(i.concrete);
|
|
356
|
-
const u = getDecoratedParametersIndexes(i.concrete);
|
|
357
|
-
let r = 0;
|
|
358
|
-
for (const n of s){
|
|
359
|
-
if (u.context.includes(r)) {
|
|
360
|
-
c.push(i.publicContext);
|
|
361
|
-
r++;
|
|
362
|
-
continue;
|
|
363
|
-
}
|
|
364
|
-
if (u.configuration.includes(r)) {
|
|
365
|
-
c.push(i.configuration);
|
|
366
|
-
r++;
|
|
367
|
-
continue;
|
|
368
|
-
}
|
|
369
|
-
if (u.definition.includes(r)) {
|
|
370
|
-
c.push(i.definition);
|
|
371
|
-
r++;
|
|
372
|
-
continue;
|
|
373
|
-
}
|
|
374
|
-
if (u.dispose.includes(r)) {
|
|
375
|
-
c.push(i.privateContext.dispose);
|
|
376
|
-
r++;
|
|
377
|
-
continue;
|
|
378
|
-
}
|
|
379
|
-
if (u.use.includes(r)) {
|
|
380
|
-
const n = getOwnCustomMetadata(ReflectParamValue.UseIdentifier, i.concrete);
|
|
381
|
-
const t = n[r];
|
|
382
|
-
c.push(i.privateContext.require(t));
|
|
383
|
-
r++;
|
|
384
|
-
continue;
|
|
385
|
-
}
|
|
386
|
-
c.push(i.privateContext.require(n));
|
|
387
|
-
r++;
|
|
388
|
-
}
|
|
389
|
-
return c;
|
|
390
|
-
};
|
|
391
|
-
const resolveDependencies = (e)=>{
|
|
392
|
-
const o = [];
|
|
393
|
-
const i = getParamTypes(e);
|
|
394
|
-
const c = getDecoratedParametersIndexes(e);
|
|
395
|
-
let s = 0;
|
|
396
|
-
for (const e of i){
|
|
397
|
-
if (c.context.includes(s) || c.configuration.includes(s) || c.definition.includes(s) || c.dispose.includes(s) || c.use.includes(s)) {
|
|
398
|
-
s++;
|
|
399
|
-
continue;
|
|
400
|
-
}
|
|
401
|
-
o.push(e);
|
|
402
|
-
s++;
|
|
403
|
-
}
|
|
404
|
-
return o;
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
function e$2(e, t, n) {
|
|
265
|
+
function e$4(e, t, n) {
|
|
408
266
|
if (t in e) {
|
|
409
267
|
Object.defineProperty(e, t, {
|
|
410
268
|
value: n,
|
|
@@ -513,7 +371,7 @@ class ListenerCollection {
|
|
|
513
371
|
};
|
|
514
372
|
}
|
|
515
373
|
constructor(){
|
|
516
|
-
e$
|
|
374
|
+
e$4(this, "collection", {});
|
|
517
375
|
const t = proxifyIterable(this, ListenerCollection);
|
|
518
376
|
return t;
|
|
519
377
|
}
|
|
@@ -522,7 +380,7 @@ class ListenerCollection {
|
|
|
522
380
|
class AbstractEventManager {
|
|
523
381
|
}
|
|
524
382
|
|
|
525
|
-
function e$
|
|
383
|
+
function e$3(e, n, s) {
|
|
526
384
|
if (n in e) {
|
|
527
385
|
Object.defineProperty(e, n, {
|
|
528
386
|
value: s,
|
|
@@ -624,9 +482,9 @@ class EventManager {
|
|
|
624
482
|
return onlyAlphanumeric(e, '*');
|
|
625
483
|
}
|
|
626
484
|
constructor(...n){
|
|
627
|
-
e$
|
|
628
|
-
e$
|
|
629
|
-
e$
|
|
485
|
+
e$3(this, "listeners", new ListenerCollection());
|
|
486
|
+
e$3(this, "onceListeners", new ListenerCollection());
|
|
487
|
+
e$3(this, "channels", new Set([
|
|
630
488
|
'*'
|
|
631
489
|
]));
|
|
632
490
|
this.addChannels(...n);
|
|
@@ -661,6 +519,148 @@ const unregisterEvents = (t, n)=>{
|
|
|
661
519
|
}
|
|
662
520
|
};
|
|
663
521
|
|
|
522
|
+
const Await = (t, e = 25)=>{
|
|
523
|
+
return (n, s, a)=>{
|
|
524
|
+
const i = a.value;
|
|
525
|
+
a.value = async function() {
|
|
526
|
+
return new Promise((n)=>{
|
|
527
|
+
if (this[t]) {
|
|
528
|
+
i.apply(this);
|
|
529
|
+
n();
|
|
530
|
+
} else {
|
|
531
|
+
const s = setInterval(()=>{
|
|
532
|
+
if (this[t]) {
|
|
533
|
+
clearInterval(s);
|
|
534
|
+
i.apply(this);
|
|
535
|
+
n();
|
|
536
|
+
}
|
|
537
|
+
}, e);
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
};
|
|
541
|
+
};
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
var ReflectParamValue = /*#__PURE__*/ function(e) {
|
|
545
|
+
e["UseIdentifier"] = "assemblage:use.param.value";
|
|
546
|
+
return e;
|
|
547
|
+
}({});
|
|
548
|
+
var ReflectParamIndex = /*#__PURE__*/ function(e) {
|
|
549
|
+
e["Context"] = "assembler:context.param.index";
|
|
550
|
+
e["Dispose"] = "assembler:dispose.param.index";
|
|
551
|
+
e["Definition"] = "assemblage:definition.param.index";
|
|
552
|
+
e["Configuration"] = "assemblage:configuration.param.index";
|
|
553
|
+
e["Use"] = "assemblage:use.param.index";
|
|
554
|
+
return e;
|
|
555
|
+
}({});
|
|
556
|
+
|
|
557
|
+
const i = (t)=>()=>{
|
|
558
|
+
return (i, s, r)=>{
|
|
559
|
+
const c = getOwnCustomMetadata(t, i) || [];
|
|
560
|
+
c.push(r);
|
|
561
|
+
defineCustomMetadata(t, c, i);
|
|
562
|
+
};
|
|
563
|
+
};
|
|
564
|
+
const s$1 = i(ReflectParamIndex.Context);
|
|
565
|
+
const r$1 = i(ReflectParamIndex.Configuration);
|
|
566
|
+
const c$1 = i(ReflectParamIndex.Definition);
|
|
567
|
+
const e$2 = i(ReflectParamIndex.Dispose);
|
|
568
|
+
|
|
569
|
+
const Use = (n)=>{
|
|
570
|
+
return (r, i, m)=>{
|
|
571
|
+
const c = getOwnCustomMetadata(ReflectParamIndex.Use, r) || [];
|
|
572
|
+
c.push(m);
|
|
573
|
+
defineCustomMetadata(ReflectParamIndex.Use, c, r);
|
|
574
|
+
const U = getOwnCustomMetadata(ReflectParamValue.UseIdentifier, r) || {};
|
|
575
|
+
U[m] = n;
|
|
576
|
+
defineCustomMetadata(ReflectParamValue.UseIdentifier, U, r);
|
|
577
|
+
};
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
const o = (o)=>{
|
|
581
|
+
return getOwnCustomMetadata(ReflectParamIndex.Context, o) || [];
|
|
582
|
+
};
|
|
583
|
+
const r = (o)=>{
|
|
584
|
+
return getOwnCustomMetadata(ReflectParamIndex.Configuration, o) || [];
|
|
585
|
+
};
|
|
586
|
+
const e$1 = (o)=>{
|
|
587
|
+
return getOwnCustomMetadata(ReflectParamIndex.Definition, o) || [];
|
|
588
|
+
};
|
|
589
|
+
const s = (o)=>{
|
|
590
|
+
return getOwnCustomMetadata(ReflectParamIndex.Dispose, o) || [];
|
|
591
|
+
};
|
|
592
|
+
const c = (o)=>{
|
|
593
|
+
return getOwnCustomMetadata(ReflectParamIndex.Use, o) || [];
|
|
594
|
+
};
|
|
595
|
+
const getDecoratedParametersIndexes = (t)=>{
|
|
596
|
+
const n = o(t);
|
|
597
|
+
const i = e$1(t);
|
|
598
|
+
const m = r(t);
|
|
599
|
+
const u = s(t);
|
|
600
|
+
const a = c(t);
|
|
601
|
+
return {
|
|
602
|
+
context: n,
|
|
603
|
+
definition: i,
|
|
604
|
+
configuration: m,
|
|
605
|
+
dispose: u,
|
|
606
|
+
use: a
|
|
607
|
+
};
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
const resolveParameters = (i)=>{
|
|
611
|
+
const c = [];
|
|
612
|
+
const s = getParamTypes(i.concrete);
|
|
613
|
+
const u = getDecoratedParametersIndexes(i.concrete);
|
|
614
|
+
let r = 0;
|
|
615
|
+
for (const n of s){
|
|
616
|
+
if (u.context.includes(r)) {
|
|
617
|
+
c.push(i.publicContext);
|
|
618
|
+
r++;
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
if (u.configuration.includes(r)) {
|
|
622
|
+
c.push(i.configuration);
|
|
623
|
+
r++;
|
|
624
|
+
continue;
|
|
625
|
+
}
|
|
626
|
+
if (u.definition.includes(r)) {
|
|
627
|
+
c.push(i.definition);
|
|
628
|
+
r++;
|
|
629
|
+
continue;
|
|
630
|
+
}
|
|
631
|
+
if (u.dispose.includes(r)) {
|
|
632
|
+
c.push(i.privateContext.dispose);
|
|
633
|
+
r++;
|
|
634
|
+
continue;
|
|
635
|
+
}
|
|
636
|
+
if (u.use.includes(r)) {
|
|
637
|
+
const n = getOwnCustomMetadata(ReflectParamValue.UseIdentifier, i.concrete);
|
|
638
|
+
const t = n[r];
|
|
639
|
+
c.push(i.privateContext.require(t));
|
|
640
|
+
r++;
|
|
641
|
+
continue;
|
|
642
|
+
}
|
|
643
|
+
c.push(i.privateContext.require(n));
|
|
644
|
+
r++;
|
|
645
|
+
}
|
|
646
|
+
return c;
|
|
647
|
+
};
|
|
648
|
+
const resolveDependencies = (e)=>{
|
|
649
|
+
const o = [];
|
|
650
|
+
const i = getParamTypes(e);
|
|
651
|
+
const c = getDecoratedParametersIndexes(e);
|
|
652
|
+
let s = 0;
|
|
653
|
+
for (const e of i){
|
|
654
|
+
if (c.context.includes(s) || c.configuration.includes(s) || c.definition.includes(s) || c.dispose.includes(s) || c.use.includes(s)) {
|
|
655
|
+
s++;
|
|
656
|
+
continue;
|
|
657
|
+
}
|
|
658
|
+
o.push(e);
|
|
659
|
+
s++;
|
|
660
|
+
}
|
|
661
|
+
return o;
|
|
662
|
+
};
|
|
663
|
+
|
|
664
664
|
function t(t, e, n) {
|
|
665
665
|
if (e in t) {
|
|
666
666
|
Object.defineProperty(t, e, {
|
|
@@ -848,7 +848,7 @@ class Assembler extends EventManager {
|
|
|
848
848
|
default:
|
|
849
849
|
{
|
|
850
850
|
if (!this.injectables.has(e)) {
|
|
851
|
-
throw new Error(`
|
|
851
|
+
throw new Error(`Class with identifier '${e.name}' has not been registered or is a circular dependency.`);
|
|
852
852
|
}
|
|
853
853
|
const t = this.injectables.get(e);
|
|
854
854
|
return t.build();
|
|
@@ -894,4 +894,4 @@ class Assembler extends EventManager {
|
|
|
894
894
|
class AbstractAssembler extends AbstractEventManager {
|
|
895
895
|
}
|
|
896
896
|
|
|
897
|
-
export { AbstractAssemblage, AbstractAssembler, AbstractEventManager, Assemblage, Assembler, Await, r$1 as Configuration, s$1 as Context, c$1 as Definition, e$
|
|
897
|
+
export { AbstractAssemblage, AbstractAssembler, AbstractEventManager, Assemblage, Assembler, Await, r$1 as Configuration, s$1 as Context, c$1 as Definition, e$2 as Dispose, EventManager, ReflectParamIndex, ReflectParamValue, Use, getDecoratedParametersIndexes, isAssemblage };
|
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.4.
|
|
4
|
+
"version": "0.4.2",
|
|
5
5
|
"author": "Benoît LAHOZ <info@benoitlahoz.io>",
|
|
6
6
|
"bugs": "https://github.com/benoitlahoz/assemblerjs/issues",
|
|
7
7
|
"devDependencies": {
|