@asaidimu/utils-artifacts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.mjs ADDED
@@ -0,0 +1 @@
1
+ var e,t,n=Object.create,i=Object.defineProperty,r=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,c=(e={"src/store/node_modules/@asaidimu/events/index.js"(e,t){var n,i=Object.defineProperty,r=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,o={};((e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})})(o,{createEventBus:()=>c}),t.exports=(n=o,((e,t,n,o)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let c of s(t))a.call(e,c)||c===n||i(e,c,{get:()=>t[c],enumerable:!(o=r(t,c))||o.enumerable});return e})(i({},"__esModule",{value:!0}),n));var c=(e={async:!1,batchSize:1e3,batchDelay:16,errorHandler:e=>console.error("EventBus Error:",e),crossTab:!1,channelName:"event-bus-channel"})=>{const t=new Map;let n=[],i=0,r=0;const s=new Map,a=new Map;let o=null;e.crossTab&&"undefined"!=typeof BroadcastChannel?o=new BroadcastChannel(e.channelName):e.crossTab&&console.warn("BroadcastChannel is not supported in this browser. Cross-tab notifications are disabled.");const c=(e,t)=>{i++,r+=t,s.set(e,(s.get(e)||0)+1)},l=()=>{const t=n;n=[],t.forEach((({name:t,payload:n})=>{const i=performance.now();try{(a.get(t)||[]).forEach((e=>e(n)))}catch(i){e.errorHandler({...i,eventName:t,payload:n})}c(t,performance.now()-i)}))},d=(()=>{let t;return()=>{clearTimeout(t),t=setTimeout(l,e.batchDelay)}})(),u=e=>{const n=t.get(e);n?a.set(e,Array.from(n)):a.delete(e)};return o&&(o.onmessage=e=>{const{name:t,payload:n}=e.data;(a.get(t)||[]).forEach((e=>e(n)))}),{subscribe:(e,n)=>{t.has(e)||t.set(e,new Set);const i=t.get(e);return i.add(n),u(e),()=>{i.delete(n),0===i.size?(t.delete(e),a.delete(e)):u(e)}},emit:({name:t,payload:i})=>{if(e.async)return n.push({name:t,payload:i}),n.length>=e.batchSize?l():d(),void(o&&o.postMessage({name:t,payload:i}));const r=performance.now();try{(a.get(t)||[]).forEach((e=>e(i))),o&&o.postMessage({name:t,payload:i})}catch(n){e.errorHandler({...n,eventName:t,payload:i})}c(t,performance.now()-r)},getMetrics:()=>({totalEvents:i,activeSubscriptions:Array.from(t.values()).reduce(((e,t)=>e+t.size),0),eventCounts:s,averageEmitDuration:i>0?r/i:0}),clear:()=>{t.clear(),a.clear(),n=[],i=0,r=0,s.clear(),o&&(o.close(),o=null)}}}}},function(){return t||(0,e[s(e)[0]])((t={exports:{}}).exports,t),t.exports});((e,t,c)=>{c=null!=e?n(a(e)):{},((e,t,n,a)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let c of s(t))o.call(e,c)||c===n||i(e,c,{get:()=>t[c],enumerable:!(a=r(t,c))||a.enumerable})})(e&&e.__esModule?c:i(c,"default",{value:e,enumerable:!0}),e)})(c());var l=class e extends Error{category;constructor(t,n,i){super(t,{cause:i}),this.name="ArtifactError",this.category=n,Object.setPrototypeOf(this,e.prototype)}},d=class extends l{constructor(e){super(`[ArtifactContainer] Cycle detected: ${e.join(" -> ")}`,"system")}},u=class extends l{constructor(e){super(`[ArtifactContainer] Artifact "${e}" not found.`,"system")}},h=class extends l{constructor(e){super(`[ArtifactContainer] ${e}`,"system")}},p=class extends l{constructor(e){super(`[ArtifactContainer] Artifact ${e} has already been disposed`,"system")}},f=(e=>(e.Singleton="singleton",e.Transient="transient",e))(f||{}),y=class e{artifacts=new Map;resolvingStack=[];listeners=new Map;watcherCache=new Map;props;parent;isDisposed=!1;resolvedArtifacts=new Map;constructor(e,t){this.props={watch:(...t)=>e.watch(...t),get:()=>e.get(!0)},this.parent=t}createChild(){return new e(this.props,this)}getDebugInfo(){const e=[];return this.artifacts.forEach(((t,n)=>{e.push({id:n,scope:t.scope,status:t.initializationPromise||t.rebuildPromise?"pending":t.error?"error":t.instance?"active":"idle",dependencies:Array.from(t.artifactDependencies).map((e=>e.key)),dependents:Array.from(t.dependents).map((e=>e.key)),stateDependencies:Array.from(t.stateDependencies),renderCount:t.buildCount})})),e}register({key:e,factory:t,...n}){const i=e;this.artifacts.has(i)&&(console.warn(`[ArtifactContainer] Overwriting "${i}".`),this.disposeArtifact(i));const r={key:e,factory:t,scope:n.scope??"singleton",lazy:n.lazy??!0,timeoutMs:n.timeoutMs,retries:n.retries??0,baseDebounceMs:n.debounce??0,activeDebounceMs:n.debounce??0,isInvalidationScheduled:!1,cleanupFunctions:[],disposeFunctions:[],stateDependencies:new Set,artifactDependencies:new Set,dependents:new Set,buildCount:0};return this.artifacts.set(i,r),r.lazy||"singleton"!==r.scope||this.resolve(e).catch((e=>{console.error(`[ArtifactContainer] Eager load failed for "${i}":`,e)})),()=>this.unregister(e)}async unregister(e){const t=e;this.artifacts.has(t)&&(await this.disposeArtifact(t),this.artifacts.delete(t))}async resolve(e){const t=e,{def:n,container:i}=this.findDefinition(t)||{};if(!n||!i){if(this.parent)return this.parent.resolve(e);throw new u(t)}if("singleton"===n.scope&&n.initializationPromise){try{await n.initializationPromise}catch(e){}finally{n.initializationPromise=void 0}return this.packageArtifact(n)}if(this.resolvingStack.includes(t))throw new d([...this.resolvingStack,t]);if(i!==this)return i.resolve(e);const r="transient"===n.scope?(new Date).toISOString():e;this.resolvingStack.push(r);try{if("transient"===n.scope){const e=await this.createArtifactInstance(n,new Set,new Set);return{instance:e.instance,cleanup:e.cleanup,error:e.error,ready:!0,invalidate:async()=>console.warn(`[ArtifactContainer] Cannot invalidate transient "${t}"`)}}if(void 0!==n.instance||void 0!==n.error)return this.packageArtifact(n);const e=(async()=>{try{const e=new Set,t=new Set,i=await this.createArtifactInstance(n,e,t);this.updateGraph(n,e,t),i.error?n.error=i.error:n.instance=i.instance}catch(e){if(e instanceof l)throw e;n.error=e}finally{n.initializationPromise=void 0}})();return n.initializationPromise=e,await e,this.packageArtifact(n)}finally{this.resolvingStack.pop()}}watch(e){const t=e,n=this.findDefinition(t);if(!n){if(this.parent)return this.parent.watch(e);throw new u(t)}const{def:i,container:r}=n;if(r!==this)return r.watch(e);let s=t;if("transient"===i.scope&&(s=`${t}__watched`),this.watcherCache.has(s)){const e=this.watcherCache.get(s);return e.count++,e}"transient"!==i.scope||this.findDefinition(s)||this.register({key:s,factory:i.factory,scope:"singleton",lazy:i.lazy,timeoutMs:i.timeoutMs,retries:i.retries,debounce:i.baseDebounceMs});let a=!1;const o={id:t,count:1,get:()=>{const e=this.artifacts.get(s);if(!e)throw new u(s);const n=this.packageArtifact(e);return a&&(n.ready=!1,n.instance=void 0,n.invalidate=e=>Promise.resolve(),n.cleanup=()=>{},n.error=new p(t)),n},subscribe:e=>this.isDisposed?()=>{}:(this.listeners.has(s)||this.listeners.set(s,new Set),this.listeners.get(s).add(e),this.resolve(s).catch((e=>{console.error(`[ArtifactContainer] Background resolution failed for "${s}":`,e)})).then((()=>e())),()=>this.listeners.get(s)?.delete(e)),dispose:async()=>{o.count--,o.count<=0&&(this.watcherCache.delete(s),"transient"===i.scope&&await this.unregister(s),a=!0,this.notifyListeners(s),this.listeners.delete(s))}};return this.watcherCache.set(s,o),o}peek(e){return this.artifacts.get(e)?.instance??this.parent?.peek(e)}findDefinition(e){return this.artifacts.has(e)?{def:this.artifacts.get(e),container:this}:this.parent?this.parent.findDefinition(e):null}packageArtifact(e){const t=this.resolvedArtifacts.get(e.key),n=(t,n=!1)=>(t.instance=e.instance,t.cleanup=this.createCompositeCleanup(e.cleanupFunctions),t.error=e.error,t.ready=void 0===e.initializationPromise,t.invalidate=async t=>this.invalidate(e.key,t),n&&this.resolvedArtifacts.set(e.key,t),t);return t?n(t):n({},"singleton"===e.scope)}async createArtifactInstance(e,t,n){e.buildCount++;const i=[],r=[];let s=!0;e.activeDebounceMs=e.baseDebounceMs,i.push((()=>{s=!1}));const a={state:(...e)=>this.props.get(...e),current:e.instance,onCleanup:e=>i.push(e),onDispose:e=>r.push(e),use:async(i,r)=>(r?.debounce&&r.debounce>e.activeDebounceMs&&(e.activeDebounceMs=r.debounce),i({resolve:async n=>{if(n===e.key)throw new l(`Artifact "${String(e.key)}" depends on itself.`,"system");const i=this.findDefinition(n);return i&&(t.add({key:n,container:i.container}),i.container.registerDependent(n,e.key,this)),this.resolve(n)},select:e=>(function(e,t="."){const n=new Set,i=(e=[])=>new Proxy({},{get:(r,s)=>{if("symbol"==typeof s)return;const a=[...e,s],o=a.join(t);return n.add(o),i(a)}});try{e(i())}catch(e){throw new Error(`Selector failed during path analysis. This usually means the selector is too complex. Selectors must be simple property accessors only. Error: ${e instanceof Error?e.message:String(e)}`)}const r=Array.from(n);return r.filter((e=>!r.some((n=>n!==e&&n.startsWith(e+t)))))}(e).forEach((e=>n.add(e))),e(this.props.get()))})),yield:t=>{queueMicrotask((()=>{s&&("transient"!==e.scope?(e.instance=t,e.error=void 0,this.processYieldPropagation(e.key)):console.error(`[ArtifactContainer] Illegal yield on transient artifact "${String(e.key)}"`))}))}};let o,c,d=0;const u=(e.retries||0)+1;for(;d<u;)try{const t=e.factory(a);if(e.timeoutMs){const n=new Promise(((t,n)=>setTimeout((()=>n(new Error(`Timeout: ${e.timeoutMs}ms`))),e.timeoutMs)));o=await Promise.race([t,n])}else o=await t;break}catch(e){if(e instanceof l)throw e;d++,d>=u&&(c=e)}return"singleton"===e.scope&&(e.cleanupFunctions=i,e.disposeFunctions=r),{instance:o,cleanup:this.createCompositeCleanup(i),error:c}}async processYieldPropagation(e){const t=this.artifacts.get(e);if(t)try{await Promise.all(Array.from(t.dependents).map((e=>e.container.invalidate(e.key,!1).catch((t=>{console.error(`[ArtifactContainer] Failed to invalidate dependent "${e.key}":`,t)}))))),this.notifyListeners(e)}catch(t){console.error(`[ArtifactContainer] Yield propagation error "${e}":`,t)}}registerDependent(e,t,n){const i=this.artifacts.get(e);i&&i.dependents.add({key:t,container:n})}removeDependent(e,t,n){const i=this.artifacts.get(e);if(i)for(const e of i.dependents)if(e.key===t&&e.container===n){i.dependents.delete(e);break}}async invalidate(e,t=!1){const n=e,i=this.artifacts.get(n);if(i){if(i.debounceTimer&&(clearTimeout(i.debounceTimer),i.debounceTimer=void 0,i.isInvalidationScheduled=!1),!t&&i.activeDebounceMs>0&&!i.isInvalidationScheduled){i.isInvalidationScheduled=!0;const n=new Promise((n=>{i.debounceTimer=setTimeout((()=>{i.debounceTimer=void 0,i.isInvalidationScheduled=!1,this.executeInvalidation(e,t).then(n).catch(n)}),i.activeDebounceMs)}));return i.rebuildPromise=n,n}return t&&i.isInvalidationScheduled&&(i.isInvalidationScheduled=!1),this.executeInvalidation(e,t)}}async executeInvalidation(e,t){const n=e,i=this.artifacts.get(n);if(!i)return;if(i.initializationPromise)try{await i.initializationPromise}catch{}if(i.rebuildPromise&&!i.debounceTimer&&!t)return i.rebuildPromise;const r=(async()=>{try{await Promise.all(Array.from(i.dependents).map((e=>e.container.invalidate(e.key,t).catch((t=>{console.error(`[ArtifactContainer] Cascade failed for "${e.key}":`,t)}))))),await this.disposeInstance(i,!1),(t||!i.lazy||this.watcherCache.has(n))&&(await this.resolve(e),this.notifyListeners(n))}finally{i.rebuildPromise=void 0}})();return i.rebuildPromise=r,r}async disposeInstance(e,t=!0){e.stateSubscriptionCleanup&&(e.stateSubscriptionCleanup(),e.stateSubscriptionCleanup=void 0),e.debounceTimer&&(clearTimeout(e.debounceTimer),e.debounceTimer=void 0);for(let t=e.disposeFunctions.length-1;t>=0;t--)try{await e.disposeFunctions[t]()}catch(e){console.error(e)}for(let t=e.cleanupFunctions.length-1;t>=0;t--)try{await e.cleanupFunctions[t]()}catch(e){console.error(e)}e.instance=void 0,e.error=void 0,e.cleanupFunctions=[],e.disposeFunctions=[],e.initializationPromise=void 0,this.resolvedArtifacts.get(e.key)&&this.resolvedArtifacts.delete(e.key),t&&this.notifyListeners(e.key)}async disposeArtifact(e){const t=this.artifacts.get(e);t&&(this.watcherCache.delete(e),t.rebuildPromise&&await t.rebuildPromise,await this.disposeInstance(t),t.artifactDependencies.forEach((t=>{t.container.removeDependent(t.key,e,this)})))}updateGraph(e,t,n){e.artifactDependencies.forEach((n=>{let i=!1;for(const e of t)if(e.key===n.key&&e.container===n.container){i=!0;break}i||n.container.removeDependent(n.key,e.key,this)})),t.forEach((t=>{t.container.registerDependent(t.key,e.key,this)})),e.artifactDependencies=t,e.stateSubscriptionCleanup&&e.stateSubscriptionCleanup(),e.stateDependencies=n,n.size>0?e.stateSubscriptionCleanup=this.props.watch(Array.from(n),(()=>this.invalidate(e.key,!1))):e.stateSubscriptionCleanup=void 0,this.notifyListeners(e.key)}createCompositeCleanup(e){if(e.length)return async()=>{for(let t=e.length-1;t>=0;t--)try{await e[t]()}catch(e){console.error(e)}}}notifyListeners(e){const t=this.listeners.get(e);t&&t.forEach((t=>{try{t()}catch(t){console.error(`[ArtifactContainer] Listener error for "${e}":`,t)}}))}dispose(){this.isDisposed=!0,this.artifacts.forEach(((e,t)=>this.disposeArtifact(t))),this.artifacts.clear(),this.watcherCache.clear(),this.listeners.clear()}};export{y as ArtifactContainer,l as ArtifactError,u as ArtifactNotFoundError,f as ArtifactScopes,d as CircularDependencyError,h as IllegalScopeError,p as WatcherDisposedError};
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@asaidimu/utils-artifacts",
3
+ "version": "1.0.0",
4
+ "description": "A powerful, reactive dependency injection container for managing application artifacts and their lifecycles.",
5
+ "main": "index.js",
6
+ "module": "index.mjs",
7
+ "types": "index.d.ts",
8
+ "files": [
9
+ "./*"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "import": {
14
+ "types": "./index.d.ts",
15
+ "default": "./index.mjs"
16
+ },
17
+ "require": {
18
+ "types": "./index.d.ts",
19
+ "default": "./index.js"
20
+ }
21
+ }
22
+ },
23
+ "dependencies": {
24
+ "@asaidimu/utils-store": "2.3.3"
25
+ },
26
+ "publishConfig": {
27
+ "registry": "https://registry.npmjs.org/",
28
+ "access": "public"
29
+ },
30
+ "release": {
31
+ "plugins": [
32
+ [
33
+ "@semantic-release/npm",
34
+ {
35
+ "pkgRoot": "./dist"
36
+ }
37
+ ],
38
+ [
39
+ "@semantic-release/git",
40
+ {
41
+ "assets": [
42
+ "CHANGELOG.md",
43
+ "package.json"
44
+ ],
45
+ "message": "chore(release): Release @asaidimu/utils-artifacts v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
46
+ }
47
+ ]
48
+ ]
49
+ }
50
+ }